From 2654dc2eff8a397ed1dd21d0f073bae553acbb61 Mon Sep 17 00:00:00 2001 From: batt Date: Mon, 30 Aug 2010 16:27:38 +0000 Subject: [PATCH] Release version 2.5.1. git-svn-id: https://src.develer.com/svnoss/bertos/tags/2.5.1@4203 38d2e660-2303-0410-9eaa-f027e97ec537 --- 2.5/.gdbinit | 3 + 2.5/Doxyfile | 38 + 2.5/Doxyfile-common | 1507 ++ 2.5/Doxyfile-offline | 40 + 2.5/Doxyfile-snapshot | 38 + 2.5/LICENSE.GPL | 340 + 2.5/Makefile | 20 + 2.5/Makefile.test | 10 + 2.5/VERSION | 1 + 2.5/bertos/algo/crc.c | 93 + 2.5/bertos/algo/crc.h | 115 + 2.5/bertos/algo/crc_ccitt.c | 84 + 2.5/bertos/algo/crc_ccitt.h | 83 + 2.5/bertos/algo/crc_test.c | 76 + 2.5/bertos/algo/md2.c | 337 + 2.5/bertos/algo/md2.h | 75 + 2.5/bertos/algo/mean.h | 41 + 2.5/bertos/algo/pid_control.c | 116 + 2.5/bertos/algo/pid_control.h | 116 + 2.5/bertos/algo/ramp.c | 201 + 2.5/bertos/algo/ramp.h | 167 + 2.5/bertos/algo/ramp_test.c | 187 + 2.5/bertos/algo/rand.c | 53 + 2.5/bertos/algo/rand.h | 45 + 2.5/bertos/algo/randpool.c | 258 + 2.5/bertos/algo/randpool.h | 76 + 2.5/bertos/algo/reverse_test.c | 88 + 2.5/bertos/algo/rle.c | 151 + 2.5/bertos/algo/rle.h | 47 + 2.5/bertos/algo/rotating_hash.h | 84 + 2.5/bertos/algo/tea.c | 132 + 2.5/bertos/algo/tea.h | 59 + 2.5/bertos/benchmark/context_switch.c | 136 + 2.5/bertos/benchmark/context_switch.h | 49 + 2.5/bertos/benchmark/kernel_footprint.c | 96 + 2.5/bertos/benchmark/kernel_footprint.h | 46 + 2.5/bertos/cfg/cfg_adc.h | 113 + 2.5/bertos/cfg/cfg_afsk.h | 113 + 2.5/bertos/cfg/cfg_arch.h | 53 + 2.5/bertos/cfg/cfg_attr.h | 47 + 2.5/bertos/cfg/cfg_ax25.h | 76 + 2.5/bertos/cfg/cfg_battfs.h | 68 + 2.5/bertos/cfg/cfg_boot.h | 46 + 2.5/bertos/cfg/cfg_buzzerled.h | 48 + 2.5/bertos/cfg/cfg_context_switch.h | 71 + 2.5/bertos/cfg/cfg_dataflash.h | 56 + 2.5/bertos/cfg/cfg_dc_motor.h | 111 + 2.5/bertos/cfg/cfg_debug.h | 55 + 2.5/bertos/cfg/cfg_fat.h | 140 + 2.5/bertos/cfg/cfg_flash25.h | 52 + 2.5/bertos/cfg/cfg_flash_at91.h | 46 + 2.5/bertos/cfg/cfg_flash_avr.h | 53 + 2.5/bertos/cfg/cfg_formatwr.h | 65 + 2.5/bertos/cfg/cfg_gfx.h | 67 + 2.5/bertos/cfg/cfg_hashtable.h | 51 + 2.5/bertos/cfg/cfg_heap.h | 51 + 2.5/bertos/cfg/cfg_i2c.h | 88 + 2.5/bertos/cfg/cfg_i2s.h | 75 + 2.5/bertos/cfg/cfg_ini_reader.h | 49 + 2.5/bertos/cfg/cfg_kbd.h | 59 + 2.5/bertos/cfg/cfg_kern.h | 55 + 2.5/bertos/cfg/cfg_keytag.h | 61 + 2.5/bertos/cfg/cfg_kfile.h | 61 + 2.5/bertos/cfg/cfg_lcd_32122a.h | 63 + 2.5/bertos/cfg/cfg_lcd_hd44.h | 69 + 2.5/bertos/cfg/cfg_lm75.h | 57 + 2.5/bertos/cfg/cfg_md2.h | 54 + 2.5/bertos/cfg/cfg_menu.h | 67 + 2.5/bertos/cfg/cfg_monitor.h | 48 + 2.5/bertos/cfg/cfg_nmea.h | 85 + 2.5/bertos/cfg/cfg_ntc.h | 54 + 2.5/bertos/cfg/cfg_parser.h | 46 + 2.5/bertos/cfg/cfg_phase.h | 56 + 2.5/bertos/cfg/cfg_pid.h | 57 + 2.5/bertos/cfg/cfg_pocketbus.h | 71 + 2.5/bertos/cfg/cfg_proc.h | 107 + 2.5/bertos/cfg/cfg_pwm.h | 57 + 2.5/bertos/cfg/cfg_ramp.h | 116 + 2.5/bertos/cfg/cfg_randpool.h | 56 + 2.5/bertos/cfg/cfg_sem.h | 48 + 2.5/bertos/cfg/cfg_ser.h | 222 + 2.5/bertos/cfg/cfg_signal.h | 48 + 2.5/bertos/cfg/cfg_spi_bitbang.h | 52 + 2.5/bertos/cfg/cfg_spi_dma.h | 68 + 2.5/bertos/cfg/cfg_stepper.h | 70 + 2.5/bertos/cfg/cfg_tas5706a.h | 51 + 2.5/bertos/cfg/cfg_thermo.h | 71 + 2.5/bertos/cfg/cfg_timer.h | 68 + 2.5/bertos/cfg/cfg_wdt.h | 48 + 2.5/bertos/cfg/cfg_xmodem.h | 79 + 2.5/bertos/cfg/compiler.h | 553 + 2.5/bertos/cfg/debug.h | 327 + 2.5/bertos/cfg/depend.h | 49 + 2.5/bertos/cfg/kfile_debug.c | 63 + 2.5/bertos/cfg/kfile_debug.h | 76 + 2.5/bertos/cfg/log.h | 170 + 2.5/bertos/cfg/macros.h | 359 + 2.5/bertos/cfg/module.h | 124 + 2.5/bertos/cfg/os.h | 220 + 2.5/bertos/cfg/test.h | 118 + 2.5/bertos/config.mk | 115 + 2.5/bertos/cpu/arm/drv/adc_arm.c | 57 + 2.5/bertos/cpu/arm/drv/adc_arm.h | 49 + 2.5/bertos/cpu/arm/drv/adc_at91.c | 211 + 2.5/bertos/cpu/arm/drv/adc_at91.h | 98 + 2.5/bertos/cpu/arm/drv/flash_arm.h | 46 + 2.5/bertos/cpu/arm/drv/flash_at91.c | 378 + 2.5/bertos/cpu/arm/drv/flash_at91.h | 105 + 2.5/bertos/cpu/arm/drv/i2s_at91.c | 175 + 2.5/bertos/cpu/arm/drv/i2s_at91.h | 117 + 2.5/bertos/cpu/arm/drv/kdebug_arm.c | 49 + 2.5/bertos/cpu/arm/drv/kdebug_at91.c | 94 + 2.5/bertos/cpu/arm/drv/kdebug_at91.h | 55 + 2.5/bertos/cpu/arm/drv/kdebug_lpc2.c | 92 + 2.5/bertos/cpu/arm/drv/pwm_arm.c | 57 + 2.5/bertos/cpu/arm/drv/pwm_arm.h | 48 + 2.5/bertos/cpu/arm/drv/pwm_at91.c | 251 + 2.5/bertos/cpu/arm/drv/pwm_at91.h | 84 + 2.5/bertos/cpu/arm/drv/ser_arm.c | 58 + 2.5/bertos/cpu/arm/drv/ser_arm.h | 50 + 2.5/bertos/cpu/arm/drv/ser_at91.c | 919 + 2.5/bertos/cpu/arm/drv/ser_at91.h | 83 + 2.5/bertos/cpu/arm/drv/ser_lpc2.c | 487 + 2.5/bertos/cpu/arm/drv/ser_lpc2.h | 73 + 2.5/bertos/cpu/arm/drv/spi_dma_at91.c | 249 + 2.5/bertos/cpu/arm/drv/spi_dma_at91.h | 73 + 2.5/bertos/cpu/arm/drv/stepper_arm.c | 55 + 2.5/bertos/cpu/arm/drv/stepper_arm.h | 48 + 2.5/bertos/cpu/arm/drv/stepper_at91.c | 418 + 2.5/bertos/cpu/arm/drv/stepper_at91.h | 186 + 2.5/bertos/cpu/arm/drv/stepper_at91_hwtest.c | 175 + 2.5/bertos/cpu/arm/drv/sysirq_at91.c | 177 + 2.5/bertos/cpu/arm/drv/sysirq_at91.h | 73 + 2.5/bertos/cpu/arm/drv/timer_arm.c | 57 + 2.5/bertos/cpu/arm/drv/timer_arm.h | 49 + 2.5/bertos/cpu/arm/drv/timer_at91.c | 80 + 2.5/bertos/cpu/arm/drv/timer_at91.h | 108 + 2.5/bertos/cpu/arm/drv/timer_lpc2.c | 81 + 2.5/bertos/cpu/arm/drv/timer_lpc2.h | 103 + 2.5/bertos/cpu/arm/drv/twi_arm.c | 56 + 2.5/bertos/cpu/arm/drv/twi_arm.h | 48 + 2.5/bertos/cpu/arm/drv/twi_at91.c | 268 + 2.5/bertos/cpu/arm/drv/twi_at91.h | 54 + 2.5/bertos/cpu/arm/drv/vic_lpc2.c | 51 + 2.5/bertos/cpu/arm/drv/vic_lpc2.h | 78 + 2.5/bertos/cpu/arm/drv/wdt_arm.h | 51 + 2.5/bertos/cpu/arm/hw/crt_arm7tdmi.S | 192 + 2.5/bertos/cpu/arm/hw/crtat91sam7_rom.S | 378 + 2.5/bertos/cpu/arm/hw/init_at91.c | 240 + 2.5/bertos/cpu/arm/hw/init_lpc2.c | 129 + 2.5/bertos/cpu/arm/hw/pll_at91.h | 153 + 2.5/bertos/cpu/arm/hw/switch_arm.S | 6 + 2.5/bertos/cpu/arm/hw/switch_ctx_arm.S | 99 + 2.5/bertos/cpu/arm/hw/vectors_at91.S | 79 + 2.5/bertos/cpu/arm/hw/vectors_lpc2.S | 85 + 2.5/bertos/cpu/arm/info/AT91SAM7S128.cdef | 53 + 2.5/bertos/cpu/arm/info/AT91SAM7S256.cdef | 54 + 2.5/bertos/cpu/arm/info/AT91SAM7S512.cdef | 53 + 2.5/bertos/cpu/arm/info/AT91SAM7S64.cdef | 53 + 2.5/bertos/cpu/arm/info/AT91SAM7X128.cdef | 53 + 2.5/bertos/cpu/arm/info/AT91SAM7X256.cdef | 53 + 2.5/bertos/cpu/arm/info/AT91SAM7X512.cdef | 53 + 2.5/bertos/cpu/arm/info/LPC2378.cdef | 56 + 2.5/bertos/cpu/arm/info/at91sam7.common | 87 + 2.5/bertos/cpu/arm/info/lpc2.common | 85 + 2.5/bertos/cpu/arm/io/arm.h | 56 + 2.5/bertos/cpu/arm/io/at91.h | 85 + 2.5/bertos/cpu/arm/io/at91_adc.h | 199 + 2.5/bertos/cpu/arm/io/at91_aic.h | 223 + 2.5/bertos/cpu/arm/io/at91_dbgu.h | 107 + 2.5/bertos/cpu/arm/io/at91_mc.h | 154 + 2.5/bertos/cpu/arm/io/at91_pio.h | 297 + 2.5/bertos/cpu/arm/io/at91_pit.h | 115 + 2.5/bertos/cpu/arm/io/at91_pmc.h | 195 + 2.5/bertos/cpu/arm/io/at91_pwm.h | 222 + 2.5/bertos/cpu/arm/io/at91_rstc.h | 112 + 2.5/bertos/cpu/arm/io/at91_spi.h | 282 + 2.5/bertos/cpu/arm/io/at91_ssc.h | 265 + 2.5/bertos/cpu/arm/io/at91_tc.h | 321 + 2.5/bertos/cpu/arm/io/at91_twi.h | 191 + 2.5/bertos/cpu/arm/io/at91_us.h | 344 + 2.5/bertos/cpu/arm/io/at91_wdt.h | 111 + 2.5/bertos/cpu/arm/io/at91sam7.h | 433 + 2.5/bertos/cpu/arm/io/lpc23xx.h | 1155 ++ 2.5/bertos/cpu/arm/scripts/arm7tdmi_ram.ld | 135 + 2.5/bertos/cpu/arm/scripts/arm7tdmi_rom.ld | 135 + .../cpu/arm/scripts/at91sam7_128_ram.ld | 52 + .../cpu/arm/scripts/at91sam7_128_rom.ld | 52 + .../cpu/arm/scripts/at91sam7_256_ram.ld | 52 + .../cpu/arm/scripts/at91sam7_256_rom.ld | 52 + .../cpu/arm/scripts/at91sam7_512_ram.ld | 52 + .../cpu/arm/scripts/at91sam7_512_rom.ld | 52 + 2.5/bertos/cpu/arm/scripts/at91sam7_64_ram.ld | 52 + 2.5/bertos/cpu/arm/scripts/at91sam7_64_rom.ld | 52 + 2.5/bertos/cpu/arm/scripts/lpc2378.ld | 58 + 2.5/bertos/cpu/attr.h | 272 + 2.5/bertos/cpu/avr/drv/adc_avr.c | 199 + 2.5/bertos/cpu/avr/drv/adc_avr.h | 49 + 2.5/bertos/cpu/avr/drv/flash_avr.c | 289 + 2.5/bertos/cpu/avr/drv/flash_avr.h | 107 + 2.5/bertos/cpu/avr/drv/i2c_avr.c | 253 + 2.5/bertos/cpu/avr/drv/kdebug_avr.c | 276 + 2.5/bertos/cpu/avr/drv/pwm_avr.c | 160 + 2.5/bertos/cpu/avr/drv/pwm_avr.h | 73 + 2.5/bertos/cpu/avr/drv/ser_avr.c | 939 + 2.5/bertos/cpu/avr/drv/ser_avr.h | 104 + 2.5/bertos/cpu/avr/drv/ser_simple_avr.c | 172 + 2.5/bertos/cpu/avr/drv/ser_simple_avr.h | 151 + 2.5/bertos/cpu/avr/drv/stepper_avr.c | 88 + 2.5/bertos/cpu/avr/drv/stepper_avr.h | 141 + 2.5/bertos/cpu/avr/drv/timer_avr.c | 259 + 2.5/bertos/cpu/avr/drv/timer_avr.h | 173 + 2.5/bertos/cpu/avr/drv/timer_simple_avr.c | 79 + 2.5/bertos/cpu/avr/drv/timer_simple_avr.h | 50 + 2.5/bertos/cpu/avr/drv/wdt_avr.h | 97 + 2.5/bertos/cpu/avr/hw/switch_avr.S | 6 + 2.5/bertos/cpu/avr/hw/switch_ctx_avr.S | 115 + 2.5/bertos/cpu/avr/info/ATmega103.cdef | 54 + 2.5/bertos/cpu/avr/info/ATmega128.cdef | 54 + 2.5/bertos/cpu/avr/info/ATmega1281.cdef | 55 + 2.5/bertos/cpu/avr/info/ATmega168.cdef | 54 + 2.5/bertos/cpu/avr/info/ATmega32.cdef | 54 + 2.5/bertos/cpu/avr/info/ATmega328P.cdef | 55 + 2.5/bertos/cpu/avr/info/ATmega64.cdef | 54 + 2.5/bertos/cpu/avr/info/ATmega8.cdef | 54 + 2.5/bertos/cpu/avr/info/avr.common | 69 + 2.5/bertos/cpu/avr/info/avr_post.common | 9 + 2.5/bertos/cpu/byteorder.h | 267 + 2.5/bertos/cpu/cortex-m3/drv/clock_lm3s.c | 175 + 2.5/bertos/cpu/cortex-m3/drv/clock_lm3s.h | 48 + 2.5/bertos/cpu/cortex-m3/drv/clock_stm32.c | 149 + 2.5/bertos/cpu/cortex-m3/drv/clock_stm32.h | 265 + 2.5/bertos/cpu/cortex-m3/drv/flash_cm3.h | 45 + 2.5/bertos/cpu/cortex-m3/drv/flash_lm3s.c | 274 + 2.5/bertos/cpu/cortex-m3/drv/flash_lm3s.h | 60 + 2.5/bertos/cpu/cortex-m3/drv/gpio_lm3s.c | 202 + 2.5/bertos/cpu/cortex-m3/drv/gpio_lm3s.h | 97 + 2.5/bertos/cpu/cortex-m3/drv/gpio_stm32.c | 107 + 2.5/bertos/cpu/cortex-m3/drv/gpio_stm32.h | 102 + 2.5/bertos/cpu/cortex-m3/drv/irq_cm3.c | 127 + 2.5/bertos/cpu/cortex-m3/drv/irq_cm3.h | 59 + 2.5/bertos/cpu/cortex-m3/drv/kdebug_cm3.c | 47 + 2.5/bertos/cpu/cortex-m3/drv/kdebug_lm3s.c | 118 + 2.5/bertos/cpu/cortex-m3/drv/kdebug_lm3s.h | 44 + 2.5/bertos/cpu/cortex-m3/drv/kdebug_stm32.c | 190 + 2.5/bertos/cpu/cortex-m3/drv/kdebug_stm32.h | 44 + 2.5/bertos/cpu/cortex-m3/drv/ser_cm3.h | 45 + 2.5/bertos/cpu/cortex-m3/drv/ser_lm3s.c | 369 + 2.5/bertos/cpu/cortex-m3/drv/ser_lm3s.h | 154 + 2.5/bertos/cpu/cortex-m3/drv/ssi_lm3s.c | 207 + 2.5/bertos/cpu/cortex-m3/drv/ssi_lm3s.h | 191 + 2.5/bertos/cpu/cortex-m3/drv/timer_cm3.c | 71 + 2.5/bertos/cpu/cortex-m3/drv/timer_cm3.h | 104 + 2.5/bertos/cpu/cortex-m3/hw/crt_cm3.S | 112 + 2.5/bertos/cpu/cortex-m3/hw/init_cm3.c | 115 + 2.5/bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c | 145 + 2.5/bertos/cpu/cortex-m3/hw/switch_ctx_cm3.h | 44 + 2.5/bertos/cpu/cortex-m3/hw/vectors_cm3.S | 61 + 2.5/bertos/cpu/cortex-m3/info/LM3S1968.cdef | 65 + 2.5/bertos/cpu/cortex-m3/info/LM3S8962.cdef | 65 + .../cpu/cortex-m3/info/STM32F103RB.cdef | 65 + 2.5/bertos/cpu/cortex-m3/info/cm3.common | 81 + 2.5/bertos/cpu/cortex-m3/io/cm3_types.h | 58 + 2.5/bertos/cpu/cortex-m3/io/lm3s.h | 56 + 2.5/bertos/cpu/cortex-m3/io/lm3s1968.h | 3765 ++++ 2.5/bertos/cpu/cortex-m3/io/lm3s_gpio.h | 603 + 2.5/bertos/cpu/cortex-m3/io/lm3s_ints.h | 130 + 2.5/bertos/cpu/cortex-m3/io/lm3s_memmap.h | 120 + 2.5/bertos/cpu/cortex-m3/io/lm3s_nvic.h | 1037 + 2.5/bertos/cpu/cortex-m3/io/lm3s_pwm.h | 543 + 2.5/bertos/cpu/cortex-m3/io/lm3s_ssi.h | 228 + 2.5/bertos/cpu/cortex-m3/io/lm3s_sysctl.h | 1685 ++ 2.5/bertos/cpu/cortex-m3/io/lm3s_types.h | 120 + 2.5/bertos/cpu/cortex-m3/io/lm3s_uart.h | 469 + 2.5/bertos/cpu/cortex-m3/io/stm32.h | 1120 ++ 2.5/bertos/cpu/cortex-m3/io/stm32_memmap.h | 102 + .../cpu/cortex-m3/scripts/lm3s1968_ram.ld | 143 + .../cpu/cortex-m3/scripts/lm3s1968_rom.ld | 118 + .../cpu/cortex-m3/scripts/lm3s8962_ram.ld | 38 + .../cpu/cortex-m3/scripts/lm3s8962_rom.ld | 38 + .../cpu/cortex-m3/scripts/stm32f103rb_rom.ld | 118 + 2.5/bertos/cpu/detect.h | 369 + 2.5/bertos/cpu/dsp56k/drv/buzzerled_dsp56k.h | 178 + 2.5/bertos/cpu/dsp56k/drv/kdebug_dsp56k.c | 54 + 2.5/bertos/cpu/dsp56k/drv/ser_dsp56k.c | 367 + 2.5/bertos/cpu/dsp56k/drv/ser_dsp56k.h | 72 + 2.5/bertos/cpu/dsp56k/drv/timer_dsp56k.h | 148 + 2.5/bertos/cpu/dsp56k/hw/switch_dsp56k.c | 101 + 2.5/bertos/cpu/frame.h | 282 + 2.5/bertos/cpu/i196/drv/kdebug_i196.c | 75 + 2.5/bertos/cpu/i196/drv/ser_i196.c | 134 + 2.5/bertos/cpu/i196/drv/timer_i196.h | 89 + 2.5/bertos/cpu/i196/hw/switch_i196.s32 | 92 + 2.5/bertos/cpu/irq.h | 586 + 2.5/bertos/cpu/newcore | 17 + 2.5/bertos/cpu/path.common | 46 + 2.5/bertos/cpu/pgm.h | 213 + 2.5/bertos/cpu/power.h | 116 + 2.5/bertos/cpu/types.h | 236 + 2.5/bertos/drv/adc.c | 76 + 2.5/bertos/drv/adc.h | 70 + 2.5/bertos/drv/buzzer.c | 158 + 2.5/bertos/drv/buzzer.h | 53 + 2.5/bertos/drv/buzzerled.c | 104 + 2.5/bertos/drv/buzzerled.h | 97 + 2.5/bertos/drv/dataflash.c | 590 + 2.5/bertos/drv/dataflash.h | 206 + 2.5/bertos/drv/dataflash_hwtest.c | 231 + 2.5/bertos/drv/dc_motor.c | 488 + 2.5/bertos/drv/dc_motor.h | 126 + 2.5/bertos/drv/dc_motor_hwtest.c | 178 + 2.5/bertos/drv/eeprom.c | 399 + 2.5/bertos/drv/eeprom.h | 134 + 2.5/bertos/drv/flash.h | 109 + 2.5/bertos/drv/flash25.c | 397 + 2.5/bertos/drv/flash25.h | 143 + 2.5/bertos/drv/flash25_hwtest.c | 84 + 2.5/bertos/drv/ft245rl.c | 120 + 2.5/bertos/drv/ft245rl.h | 76 + 2.5/bertos/drv/i2c.c | 90 + 2.5/bertos/drv/i2c.h | 117 + 2.5/bertos/drv/i2c_bitbang.c | 179 + 2.5/bertos/drv/kbd.c | 486 + 2.5/bertos/drv/kbd.h | 102 + 2.5/bertos/drv/kdebug.c | 284 + 2.5/bertos/drv/lcd_32122a.c | 334 + 2.5/bertos/drv/lcd_32122a.h | 61 + 2.5/bertos/drv/lcd_gfx_hwtest.c | 92 + 2.5/bertos/drv/lcd_gfx_qt.cpp | 187 + 2.5/bertos/drv/lcd_gfx_qt.h | 98 + 2.5/bertos/drv/lcd_hd44.c | 429 + 2.5/bertos/drv/lcd_hd44.h | 109 + 2.5/bertos/drv/lcd_hd44_hwtest.c | 96 + 2.5/bertos/drv/lcd_lm44_qt.cpp | 362 + 2.5/bertos/drv/lcd_lm44_qt.h | 102 + 2.5/bertos/drv/lcd_rit128x96.c | 211 + 2.5/bertos/drv/lcd_rit128x96.h | 56 + 2.5/bertos/drv/lcd_text.c | 458 + 2.5/bertos/drv/lcd_text.h | 122 + 2.5/bertos/drv/lcd_text_hwtest.c | 55 + 2.5/bertos/drv/lm75.c | 85 + 2.5/bertos/drv/lm75.h | 57 + 2.5/bertos/drv/mcp41.c | 80 + 2.5/bertos/drv/mcp41.h | 64 + 2.5/bertos/drv/mpxx6115a.h | 80 + 2.5/bertos/drv/ntc.c | 154 + 2.5/bertos/drv/ntc.h | 91 + 2.5/bertos/drv/pcf8574.c | 85 + 2.5/bertos/drv/pcf8574.h | 63 + 2.5/bertos/drv/phase.c | 192 + 2.5/bertos/drv/phase.h | 86 + 2.5/bertos/drv/pwm.c | 121 + 2.5/bertos/drv/pwm.h | 92 + 2.5/bertos/drv/pwm_hwtest.c | 239 + 2.5/bertos/drv/sd.c | 498 + 2.5/bertos/drv/sd.h | 118 + 2.5/bertos/drv/ser.c | 504 + 2.5/bertos/drv/ser.h | 218 + 2.5/bertos/drv/ser_p.h | 75 + 2.5/bertos/drv/sipo.c | 122 + 2.5/bertos/drv/sipo.h | 119 + 2.5/bertos/drv/spi_bitbang.c | 121 + 2.5/bertos/drv/spi_bitbang.h | 77 + 2.5/bertos/drv/stepper.c | 979 + 2.5/bertos/drv/stepper.h | 228 + 2.5/bertos/drv/tas5706a.c | 146 + 2.5/bertos/drv/tas5706a.h | 94 + 2.5/bertos/drv/tc520.c | 169 + 2.5/bertos/drv/tc520.h | 57 + 2.5/bertos/drv/thermo.c | 327 + 2.5/bertos/drv/thermo.h | 105 + 2.5/bertos/drv/timer.c | 402 + 2.5/bertos/drv/timer.h | 316 + 2.5/bertos/drv/timer_test.c | 210 + 2.5/bertos/drv/tlv5618.c | 104 + 2.5/bertos/drv/tlv5618.h | 59 + 2.5/bertos/drv/tmp123.c | 74 + 2.5/bertos/drv/tmp123.h | 56 + 2.5/bertos/drv/wdt.h | 126 + 2.5/bertos/dt/dnotifier.c | 163 + 2.5/bertos/dt/dnotifier.h | 151 + 2.5/bertos/dt/dtag.h | 113 + 2.5/bertos/dt/dwidget.c | 77 + 2.5/bertos/dt/dwidget.h | 66 + 2.5/bertos/dt/editbool.c | 99 + 2.5/bertos/dt/editbool.h | 58 + 2.5/bertos/dt/editint.c | 127 + 2.5/bertos/dt/editint.h | 94 + 2.5/bertos/emul/diskio_emul.c | 220 + 2.5/bertos/emul/emul.cpp | 105 + 2.5/bertos/emul/emul.h | 101 + 2.5/bertos/emul/emul.mk | 22 + 2.5/bertos/emul/emulkbd.cpp | 231 + 2.5/bertos/emul/emulkbd.h | 119 + 2.5/bertos/emul/emulwin.cpp | 130 + 2.5/bertos/emul/emulwin.h | 82 + 2.5/bertos/emul/kfile_posix.c | 104 + 2.5/bertos/emul/kfile_posix.h | 61 + 2.5/bertos/emul/ser_posix.c | 179 + 2.5/bertos/emul/switch.S | 2 + 2.5/bertos/emul/switch_ctx_emul.S | 10 + 2.5/bertos/emul/switch_i386.S | 70 + 2.5/bertos/emul/switch_ppc.S | 57 + 2.5/bertos/emul/switch_win32.s | 82 + 2.5/bertos/emul/switch_x86_64.s | 73 + 2.5/bertos/emul/timer_posix.c | 93 + 2.5/bertos/emul/timer_posix.h | 59 + 2.5/bertos/emul/timer_qt.c | 156 + 2.5/bertos/emul/timer_qt.h | 58 + 2.5/bertos/fonts/convbdf | 209 + 2.5/bertos/fonts/fixed6x8.c | 345 + 2.5/bertos/fonts/fonts.mk | 12 + 2.5/bertos/fonts/gohu.bdf | 2714 +++ 2.5/bertos/fonts/gohu.c | 792 + 2.5/bertos/fonts/helvB10.bdf | 3305 ++++ 2.5/bertos/fonts/helvB10.c | 1248 ++ 2.5/bertos/fonts/luBS14.bdf | 13542 +++++++++++++ 2.5/bertos/fonts/luBS14.c | 1316 ++ 2.5/bertos/fonts/ncenB18.bdf | 16273 ++++++++++++++++ 2.5/bertos/fonts/ncenB18.c | 1508 ++ 2.5/bertos/fs/battfs.c | 1052 + 2.5/bertos/fs/battfs.h | 291 + 2.5/bertos/fs/battfs_test.c | 1149 ++ 2.5/bertos/fs/fat.c | 144 + 2.5/bertos/fs/fat.h | 85 + 2.5/bertos/fs/fat_test.c | 129 + 2.5/bertos/fs/fatfs/00readme.txt | 96 + 2.5/bertos/fs/fatfs/diskio.c | 202 + 2.5/bertos/fs/fatfs/diskio.h | 70 + 2.5/bertos/fs/fatfs/ff.c | 2947 +++ 2.5/bertos/fs/fatfs/ff.h | 570 + 2.5/bertos/fs/fatfs/integer.h | 39 + 2.5/bertos/fs/fatfs/option/cc932.c | 3784 ++++ 2.5/bertos/fs/fatfs/option/cc936.c | 10960 +++++++++++ 2.5/bertos/fs/fatfs/option/cc949.c | 8588 ++++++++ 2.5/bertos/fs/fatfs/option/cc950.c | 6814 +++++++ 2.5/bertos/fs/fatfs/option/ccsbcs.c | 528 + 2.5/bertos/fs/fatfs/option/syncobj.c | 115 + 2.5/bertos/gfx/bitmap.c | 267 + 2.5/bertos/gfx/charts.c | 153 + 2.5/bertos/gfx/charts.h | 99 + 2.5/bertos/gfx/fillpoly.cpp | 405 + 2.5/bertos/gfx/font.h | 78 + 2.5/bertos/gfx/font_10x20.c | 5740 ++++++ 2.5/bertos/gfx/gfx.h | 237 + 2.5/bertos/gfx/gfx_p.h | 140 + 2.5/bertos/gfx/line.c | 409 + 2.5/bertos/gfx/text.c | 321 + 2.5/bertos/gfx/text.h | 122 + 2.5/bertos/gfx/text_format.c | 294 + 2.5/bertos/gfx/win.c | 232 + 2.5/bertos/gfx/win.h | 120 + 2.5/bertos/gui/levelbar.c | 106 + 2.5/bertos/gui/levelbar.h | 39 + 2.5/bertos/gui/leveledit.c | 321 + 2.5/bertos/gui/leveledit.h | 87 + 2.5/bertos/gui/menu.c | 584 + 2.5/bertos/gui/menu.h | 131 + 2.5/bertos/gui/menubar.c | 177 + 2.5/bertos/gui/menubar.h | 97 + 2.5/bertos/hw/hw_afsk.h | 85 + 2.5/bertos/hw/hw_blanker.h | 50 + 2.5/bertos/hw/hw_boot.h | 50 + 2.5/bertos/hw/hw_buzzer.h | 52 + 2.5/bertos/hw/hw_buzzerled.h | 47 + 2.5/bertos/hw/hw_cpufreq.h | 64 + 2.5/bertos/hw/hw_dataflash.c | 126 + 2.5/bertos/hw/hw_dataflash.h | 48 + 2.5/bertos/hw/hw_dc_motor.h | 71 + 2.5/bertos/hw/hw_ft245rl.h | 65 + 2.5/bertos/hw/hw_i2c_bitbang.h | 66 + 2.5/bertos/hw/hw_input.h | 46 + 2.5/bertos/hw/hw_kbd.h | 72 + 2.5/bertos/hw/hw_lcd_32122a.h | 155 + 2.5/bertos/hw/hw_lcd_hd44.h | 157 + 2.5/bertos/hw/hw_led.h | 48 + 2.5/bertos/hw/hw_lm75.h | 49 + 2.5/bertos/hw/hw_mcp41.c | 53 + 2.5/bertos/hw/hw_mcp41.h | 75 + 2.5/bertos/hw/hw_ntc.c | 46 + 2.5/bertos/hw/hw_ntc.h | 136 + 2.5/bertos/hw/hw_phase.c | 46 + 2.5/bertos/hw/hw_phase.h | 80 + 2.5/bertos/hw/hw_rit128x96.h | 78 + 2.5/bertos/hw/hw_sd.h | 53 + 2.5/bertos/hw/hw_sensor.h | 93 + 2.5/bertos/hw/hw_ser.h | 53 + 2.5/bertos/hw/hw_sipo.h | 109 + 2.5/bertos/hw/hw_spi.h | 115 + 2.5/bertos/hw/hw_spi_dma.h | 48 + 2.5/bertos/hw/hw_stepper.h | 309 + 2.5/bertos/hw/hw_tas5706a.h | 65 + 2.5/bertos/hw/hw_tc520.h | 71 + 2.5/bertos/hw/hw_thermo.h | 121 + 2.5/bertos/hw/hw_timer.h | 52 + 2.5/bertos/hw/hw_tlv5618.h | 69 + 2.5/bertos/hw/hw_tmp123.h | 52 + 2.5/bertos/hw/kbd_map.h | 71 + 2.5/bertos/hw/mcp41_map.h | 59 + 2.5/bertos/hw/ntc_map.h | 61 + 2.5/bertos/hw/phase_map.h | 58 + 2.5/bertos/hw/pwm_map.h | 61 + 2.5/bertos/hw/thermo_map.h | 56 + 2.5/bertos/icons/Makefile | 45 + 2.5/bertos/icons/flipimage.cpp | 125 + 2.5/bertos/icons/logo.c | 115 + 2.5/bertos/icons/logo.h | 3 + 2.5/bertos/icons/logo.png | Bin 0 -> 343 bytes 2.5/bertos/kern/coop.c | 32 + 2.5/bertos/kern/irq.c | 80 + 2.5/bertos/kern/irq.h | 44 + 2.5/bertos/kern/kfile.c | 284 + 2.5/bertos/kern/kfile.h | 289 + 2.5/bertos/kern/kfile_test.c | 323 + 2.5/bertos/kern/monitor.c | 167 + 2.5/bertos/kern/monitor.h | 78 + 2.5/bertos/kern/msg.h | 298 + 2.5/bertos/kern/msg_test.c | 292 + 2.5/bertos/kern/preempt.c | 32 + 2.5/bertos/kern/proc.c | 648 + 2.5/bertos/kern/proc.h | 400 + 2.5/bertos/kern/proc_p.h | 223 + 2.5/bertos/kern/proc_test.c | 406 + 2.5/bertos/kern/proc_test/coop_heap_test.c | 65 + 2.5/bertos/kern/proc_test/coop_msg_test.c | 49 + .../kern/proc_test/coop_pri_heap_test.c | 67 + 2.5/bertos/kern/proc_test/coop_pri_test.c | 63 + 2.5/bertos/kern/proc_test/coop_sem_test.c | 49 + 2.5/bertos/kern/proc_test/coop_signal_test.c | 49 + 2.5/bertos/kern/proc_test/coop_test.c | 60 + 2.5/bertos/kern/proc_test/preempt_heap_test.c | 66 + 2.5/bertos/kern/proc_test/preempt_msg_test.c | 51 + .../kern/proc_test/preempt_pri_heap_test.c | 68 + 2.5/bertos/kern/proc_test/preempt_pri_test.c | 64 + 2.5/bertos/kern/proc_test/preempt_sem_test.c | 51 + .../kern/proc_test/preempt_signal_test.c | 51 + 2.5/bertos/kern/proc_test/preempt_test.c | 62 + 2.5/bertos/kern/sem.c | 187 + 2.5/bertos/kern/sem.h | 78 + 2.5/bertos/kern/sem_test.c | 204 + 2.5/bertos/kern/signal.c | 303 + 2.5/bertos/kern/signal.h | 87 + 2.5/bertos/kern/signal_test.c | 190 + 2.5/bertos/mware/blanker.c | 222 + 2.5/bertos/mware/blanker.h | 46 + 2.5/bertos/mware/byteorder.h | 2 + 2.5/bertos/mware/cmd_hunk.h | 147 + 2.5/bertos/mware/event.c | 57 + 2.5/bertos/mware/event.h | 137 + 2.5/bertos/mware/except.h | 125 + 2.5/bertos/mware/formatwr.c | 979 + 2.5/bertos/mware/formatwr.h | 90 + 2.5/bertos/mware/hex.c | 42 + 2.5/bertos/mware/hex.h | 46 + 2.5/bertos/mware/ini_reader.c | 162 + 2.5/bertos/mware/ini_reader.h | 73 + 2.5/bertos/mware/ini_reader_test.c | 101 + 2.5/bertos/mware/messages.c | 67 + 2.5/bertos/mware/messages.h | 68 + 2.5/bertos/mware/observer.c | 81 + 2.5/bertos/mware/observer.h | 96 + 2.5/bertos/mware/parser.c | 396 + 2.5/bertos/mware/parser.h | 187 + 2.5/bertos/mware/pgm.h | 2 + 2.5/bertos/mware/readline.c | 497 + 2.5/bertos/mware/readline.h | 121 + 2.5/bertos/mware/resource.c | 113 + 2.5/bertos/mware/resource.h | 106 + 2.5/bertos/mware/rle.h | 2 + 2.5/bertos/mware/sprintf.c | 158 + 2.5/bertos/mware/sprintf_test.c | 115 + 2.5/bertos/mware/strtol10.c | 100 + 2.5/bertos/mware/strtol10.h | 66 + 2.5/bertos/net/afsk.c | 571 + 2.5/bertos/net/afsk.h | 224 + 2.5/bertos/net/afsk_test.c | 223 + 2.5/bertos/net/ax25.c | 308 + 2.5/bertos/net/ax25.h | 188 + 2.5/bertos/net/ax25_test.c | 113 + 2.5/bertos/net/keytag.c | 164 + 2.5/bertos/net/keytag.h | 68 + 2.5/bertos/net/nmea.c | 474 + 2.5/bertos/net/nmea.h | 151 + 2.5/bertos/net/nmea_test.c | 1034 + 2.5/bertos/net/nmeap/COPYING | 31 + 2.5/bertos/net/nmeap/Doxyfile | 1153 ++ 2.5/bertos/net/nmeap/Makefile | 23 + 2.5/bertos/net/nmeap/README | 24 + 2.5/bertos/net/nmeap/doc/tutorial.html | 151 + 2.5/bertos/net/nmeap/inc/nmeap.h | 227 + 2.5/bertos/net/nmeap/inc/nmeap_def.h | 72 + 2.5/bertos/net/nmeap/src/Makefile | 31 + 2.5/bertos/net/nmeap/src/nmeap.mak | 20 + 2.5/bertos/net/nmeap/src/nmeap01.c | 634 + 2.5/bertos/net/nmeap/tst/Makefile | 17 + 2.5/bertos/net/nmeap/tst/test1.c | 193 + 2.5/bertos/net/nmeap/tst/test2.c | 208 + 2.5/bertos/net/nmeap/tst/test3.c | 306 + 2.5/bertos/net/nmeap/tst/tst.mak | 29 + 2.5/bertos/net/nmeap/tst/wingps.c | 244 + 2.5/bertos/net/nmeap/win32.mak | 22 + 2.5/bertos/net/pocketbus.c | 291 + 2.5/bertos/net/pocketbus.h | 130 + 2.5/bertos/net/pocketcmd.c | 229 + 2.5/bertos/net/pocketcmd.h | 149 + 2.5/bertos/net/xmodem.c | 436 + 2.5/bertos/net/xmodem.h | 63 + 2.5/bertos/os/hptime.c | 79 + 2.5/bertos/os/hptime.h | 86 + 2.5/bertos/remote_merge | 48 + 2.5/bertos/rules.mk | 408 + 2.5/bertos/struct/fifobuf.h | 358 + 2.5/bertos/struct/hashtable.c | 287 + 2.5/bertos/struct/hashtable.h | 292 + 2.5/bertos/struct/hashtable_test.c | 120 + 2.5/bertos/struct/heap.c | 252 + 2.5/bertos/struct/heap.h | 115 + 2.5/bertos/struct/heap_test.c | 123 + 2.5/bertos/struct/kfile_fifo.c | 76 + 2.5/bertos/struct/kfile_fifo.h | 100 + 2.5/bertos/struct/kfile_fifo_test.c | 148 + 2.5/bertos/struct/kfile_mem.c | 83 + 2.5/bertos/struct/kfile_mem.h | 82 + 2.5/bertos/struct/list.h | 353 + 2.5/bertos/struct/pool.h | 74 + 2.5/bertos/verstag.c | 51 + 2.5/bertos/verstag.h | 106 + 2.5/boards/.spec | 0 2.5/boards/arduino/.image.png | Bin 0 -> 54482 bytes 2.5/boards/arduino/.spec | 31 + 2.5/boards/arduino/benchmark/.spec | 3 + .../arduino/benchmark/context_switch/.spec | 15 + .../benchmark/context_switch/cfg/cfg_adc.h | 110 + .../benchmark/context_switch/cfg/cfg_afsk.h | 113 + .../benchmark/context_switch/cfg/cfg_ax25.h | 76 + .../benchmark/context_switch/cfg/cfg_battfs.h | 68 + .../context_switch/cfg/cfg_context_switch.h | 71 + .../context_switch/cfg/cfg_dataflash.h | 56 + .../context_switch/cfg/cfg_dc_motor.h | 111 + .../benchmark/context_switch/cfg/cfg_debug.h | 55 + .../benchmark/context_switch/cfg/cfg_fat.h | 140 + .../context_switch/cfg/cfg_flash25.h | 52 + .../context_switch/cfg/cfg_formatwr.h | 65 + .../benchmark/context_switch/cfg/cfg_gfx.h | 67 + .../context_switch/cfg/cfg_hashtable.h | 51 + .../benchmark/context_switch/cfg/cfg_heap.h | 51 + .../benchmark/context_switch/cfg/cfg_i2c.h | 88 + .../benchmark/context_switch/cfg/cfg_i2s.h | 75 + .../context_switch/cfg/cfg_ini_reader.h | 49 + .../benchmark/context_switch/cfg/cfg_kbd.h | 59 + .../benchmark/context_switch/cfg/cfg_keytag.h | 61 + .../benchmark/context_switch/cfg/cfg_kfile.h | 61 + .../context_switch/cfg/cfg_lcd_32122a.h | 63 + .../context_switch/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/context_switch/cfg/cfg_lm75.h | 57 + .../benchmark/context_switch/cfg/cfg_md2.h | 54 + .../benchmark/context_switch/cfg/cfg_menu.h | 67 + .../context_switch/cfg/cfg_monitor.h | 48 + .../benchmark/context_switch/cfg/cfg_nmea.h | 85 + .../benchmark/context_switch/cfg/cfg_parser.h | 46 + .../benchmark/context_switch/cfg/cfg_phase.h | 56 + .../context_switch/cfg/cfg_pocketbus.h | 71 + .../benchmark/context_switch/cfg/cfg_proc.h | 107 + .../benchmark/context_switch/cfg/cfg_pwm.h | 57 + .../benchmark/context_switch/cfg/cfg_ramp.h | 116 + .../context_switch/cfg/cfg_randpool.h | 56 + .../benchmark/context_switch/cfg/cfg_sem.h | 48 + .../benchmark/context_switch/cfg/cfg_ser.h | 222 + .../benchmark/context_switch/cfg/cfg_signal.h | 48 + .../context_switch/cfg/cfg_spi_bitbang.h | 52 + .../context_switch/cfg/cfg_stepper.h | 70 + .../context_switch/cfg/cfg_tas5706a.h | 51 + .../benchmark/context_switch/cfg/cfg_thermo.h | 71 + .../benchmark/context_switch/cfg/cfg_timer.h | 68 + .../benchmark/context_switch/cfg/cfg_wdt.h | 48 + .../benchmark/context_switch/cfg/cfg_xmodem.h | 79 + .../context_switch/context_switch.mk | 89 + .../context_switch/context_switch_user.mk | 44 + .../arduino/benchmark/context_switch/main.c | 56 + .../benchmark/context_switch/project.bertos | 63 + .../arduino/benchmark/kernel_footprint/.spec | 14 + .../benchmark/kernel_footprint/cfg/cfg_adc.h | 110 + .../benchmark/kernel_footprint/cfg/cfg_afsk.h | 113 + .../benchmark/kernel_footprint/cfg/cfg_ax25.h | 76 + .../kernel_footprint/cfg/cfg_battfs.h | 68 + .../kernel_footprint/cfg/cfg_context_switch.h | 71 + .../kernel_footprint/cfg/cfg_dataflash.h | 56 + .../kernel_footprint/cfg/cfg_dc_motor.h | 111 + .../kernel_footprint/cfg/cfg_debug.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_fat.h | 140 + .../kernel_footprint/cfg/cfg_flash25.h | 52 + .../kernel_footprint/cfg/cfg_formatwr.h | 65 + .../benchmark/kernel_footprint/cfg/cfg_gfx.h | 67 + .../kernel_footprint/cfg/cfg_hashtable.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_heap.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_i2c.h | 88 + .../benchmark/kernel_footprint/cfg/cfg_i2s.h | 75 + .../kernel_footprint/cfg/cfg_ini_reader.h | 49 + .../benchmark/kernel_footprint/cfg/cfg_kbd.h | 59 + .../kernel_footprint/cfg/cfg_keytag.h | 61 + .../kernel_footprint/cfg/cfg_kfile.h | 61 + .../kernel_footprint/cfg/cfg_lcd_32122a.h | 63 + .../kernel_footprint/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_lm75.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_md2.h | 54 + .../kernel_footprint/cfg/cfg_monitor.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_nmea.h | 85 + .../kernel_footprint/cfg/cfg_parser.h | 46 + .../kernel_footprint/cfg/cfg_phase.h | 56 + .../kernel_footprint/cfg/cfg_pocketbus.h | 71 + .../benchmark/kernel_footprint/cfg/cfg_proc.h | 107 + .../benchmark/kernel_footprint/cfg/cfg_pwm.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_ramp.h | 116 + .../kernel_footprint/cfg/cfg_randpool.h | 56 + .../benchmark/kernel_footprint/cfg/cfg_sem.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_ser.h | 222 + .../kernel_footprint/cfg/cfg_signal.h | 48 + .../kernel_footprint/cfg/cfg_spi_bitbang.h | 52 + .../kernel_footprint/cfg/cfg_stepper.h | 70 + .../kernel_footprint/cfg/cfg_tas5706a.h | 51 + .../kernel_footprint/cfg/cfg_thermo.h | 71 + .../kernel_footprint/cfg/cfg_timer.h | 68 + .../benchmark/kernel_footprint/cfg/cfg_wdt.h | 48 + .../kernel_footprint/cfg/cfg_xmodem.h | 79 + .../kernel_footprint/kernel_footprint.mk | 88 + .../kernel_footprint/kernel_footprint_user.mk | 44 + .../arduino/benchmark/kernel_footprint/main.c | 57 + .../benchmark/kernel_footprint/project.bertos | 83 + 2.5/boards/arduino/examples/.spec | 3 + 2.5/boards/arduino/examples/aprs/.spec | 21 + 2.5/boards/arduino/examples/aprs/aprs.mk | 89 + 2.5/boards/arduino/examples/aprs/aprs_user.mk | 44 + .../arduino/examples/aprs/cfg/cfg_adc.h | 110 + .../arduino/examples/aprs/cfg/cfg_afsk.h | 114 + .../arduino/examples/aprs/cfg/cfg_ax25.h | 76 + .../arduino/examples/aprs/cfg/cfg_battfs.h | 68 + .../examples/aprs/cfg/cfg_context_switch.h | 71 + .../arduino/examples/aprs/cfg/cfg_dataflash.h | 56 + .../arduino/examples/aprs/cfg/cfg_dc_motor.h | 111 + .../arduino/examples/aprs/cfg/cfg_debug.h | 55 + .../arduino/examples/aprs/cfg/cfg_fat.h | 140 + .../arduino/examples/aprs/cfg/cfg_flash25.h | 52 + .../arduino/examples/aprs/cfg/cfg_formatwr.h | 65 + .../arduino/examples/aprs/cfg/cfg_gfx.h | 67 + .../arduino/examples/aprs/cfg/cfg_hashtable.h | 52 + .../arduino/examples/aprs/cfg/cfg_heap.h | 51 + .../arduino/examples/aprs/cfg/cfg_i2c.h | 90 + .../arduino/examples/aprs/cfg/cfg_i2s.h | 75 + .../examples/aprs/cfg/cfg_ini_reader.h | 49 + .../arduino/examples/aprs/cfg/cfg_kbd.h | 59 + .../arduino/examples/aprs/cfg/cfg_keytag.h | 61 + .../arduino/examples/aprs/cfg/cfg_kfile.h | 61 + .../examples/aprs/cfg/cfg_lcd_32122a.h | 63 + .../arduino/examples/aprs/cfg/cfg_lcd_hd44.h | 55 + .../arduino/examples/aprs/cfg/cfg_lm75.h | 57 + .../arduino/examples/aprs/cfg/cfg_md2.h | 54 + .../arduino/examples/aprs/cfg/cfg_menu.h | 67 + .../arduino/examples/aprs/cfg/cfg_monitor.h | 48 + .../arduino/examples/aprs/cfg/cfg_nmea.h | 85 + .../arduino/examples/aprs/cfg/cfg_parser.h | 46 + .../arduino/examples/aprs/cfg/cfg_phase.h | 56 + .../arduino/examples/aprs/cfg/cfg_pocketbus.h | 71 + .../arduino/examples/aprs/cfg/cfg_proc.h | 107 + .../arduino/examples/aprs/cfg/cfg_pwm.h | 57 + .../arduino/examples/aprs/cfg/cfg_ramp.h | 116 + .../arduino/examples/aprs/cfg/cfg_randpool.h | 56 + .../arduino/examples/aprs/cfg/cfg_sem.h | 48 + .../arduino/examples/aprs/cfg/cfg_ser.h | 222 + .../arduino/examples/aprs/cfg/cfg_signal.h | 48 + .../examples/aprs/cfg/cfg_spi_bitbang.h | 52 + .../arduino/examples/aprs/cfg/cfg_stepper.h | 70 + .../arduino/examples/aprs/cfg/cfg_tas5706a.h | 51 + .../arduino/examples/aprs/cfg/cfg_thermo.h | 71 + .../arduino/examples/aprs/cfg/cfg_timer.h | 68 + .../arduino/examples/aprs/cfg/cfg_wdt.h | 48 + .../arduino/examples/aprs/cfg/cfg_xmodem.h | 79 + 2.5/boards/arduino/examples/aprs/main.c | 130 + .../arduino/examples/aprs/project.bertos | 83 + 2.5/boards/arduino/hw/hw_afsk.c | 97 + 2.5/boards/arduino/hw/hw_afsk.h | 111 + 2.5/boards/arduino/hw/hw_buzzer.h | 52 + 2.5/boards/arduino/hw/hw_dataflash.c | 126 + 2.5/boards/arduino/hw/hw_dataflash.h | 48 + 2.5/boards/arduino/hw/hw_dc_motor.h | 85 + 2.5/boards/arduino/hw/hw_ft245rl.h | 65 + 2.5/boards/arduino/hw/hw_i2c_bitbang.h | 66 + 2.5/boards/arduino/hw/hw_kbd.h | 72 + 2.5/boards/arduino/hw/hw_lcd_32122a.h | 155 + 2.5/boards/arduino/hw/hw_lcd_hd44.h | 157 + 2.5/boards/arduino/hw/hw_led.h | 47 + 2.5/boards/arduino/hw/hw_lm75.h | 49 + 2.5/boards/arduino/hw/hw_mcp41.c | 53 + 2.5/boards/arduino/hw/hw_mcp41.h | 75 + 2.5/boards/arduino/hw/hw_ntc.c | 46 + 2.5/boards/arduino/hw/hw_ntc.h | 136 + 2.5/boards/arduino/hw/hw_phase.c | 46 + 2.5/boards/arduino/hw/hw_phase.h | 80 + 2.5/boards/arduino/hw/hw_rit128x96.h | 78 + 2.5/boards/arduino/hw/hw_sd.h | 53 + 2.5/boards/arduino/hw/hw_ser.h | 53 + 2.5/boards/arduino/hw/hw_sipo.h | 109 + 2.5/boards/arduino/hw/hw_spi.h | 115 + 2.5/boards/arduino/hw/hw_stepper.h | 309 + 2.5/boards/arduino/hw/hw_tas5706a.h | 65 + 2.5/boards/arduino/hw/hw_thermo.h | 182 + 2.5/boards/arduino/hw/hw_tlv5618.h | 69 + 2.5/boards/arduino/hw/hw_tmp123.h | 52 + 2.5/boards/arduino/hw/kbd_map.h | 71 + 2.5/boards/arduino/hw/mcp41_map.h | 59 + 2.5/boards/arduino/hw/ntc_map.h | 61 + 2.5/boards/arduino/hw/phase_map.h | 58 + 2.5/boards/arduino/hw/pwm_map.h | 61 + 2.5/boards/arduino/hw/thermo_map.h | 70 + 2.5/boards/arduino/templates/.spec | 3 + 2.5/boards/arduino/templates/empty/.spec | 8 + .../arduino/templates/empty/cfg/cfg_adc.h | 110 + .../arduino/templates/empty/cfg/cfg_afsk.h | 113 + .../arduino/templates/empty/cfg/cfg_ax25.h | 76 + .../arduino/templates/empty/cfg/cfg_battfs.h | 68 + .../templates/empty/cfg/cfg_context_switch.h | 71 + .../templates/empty/cfg/cfg_dataflash.h | 56 + .../templates/empty/cfg/cfg_dc_motor.h | 111 + .../arduino/templates/empty/cfg/cfg_debug.h | 55 + .../arduino/templates/empty/cfg/cfg_fat.h | 140 + .../arduino/templates/empty/cfg/cfg_flash25.h | 52 + .../templates/empty/cfg/cfg_formatwr.h | 65 + .../arduino/templates/empty/cfg/cfg_gfx.h | 67 + .../templates/empty/cfg/cfg_hashtable.h | 51 + .../arduino/templates/empty/cfg/cfg_heap.h | 51 + .../arduino/templates/empty/cfg/cfg_i2c.h | 88 + .../arduino/templates/empty/cfg/cfg_i2s.h | 75 + .../templates/empty/cfg/cfg_ini_reader.h | 49 + .../arduino/templates/empty/cfg/cfg_kbd.h | 59 + .../arduino/templates/empty/cfg/cfg_keytag.h | 61 + .../arduino/templates/empty/cfg/cfg_kfile.h | 61 + .../templates/empty/cfg/cfg_lcd_32122a.h | 63 + .../templates/empty/cfg/cfg_lcd_hd44.h | 55 + .../arduino/templates/empty/cfg/cfg_lm75.h | 57 + .../arduino/templates/empty/cfg/cfg_md2.h | 54 + .../arduino/templates/empty/cfg/cfg_monitor.h | 48 + .../arduino/templates/empty/cfg/cfg_nmea.h | 85 + .../arduino/templates/empty/cfg/cfg_parser.h | 46 + .../arduino/templates/empty/cfg/cfg_phase.h | 56 + .../templates/empty/cfg/cfg_pocketbus.h | 71 + .../arduino/templates/empty/cfg/cfg_proc.h | 107 + .../arduino/templates/empty/cfg/cfg_pwm.h | 57 + .../arduino/templates/empty/cfg/cfg_ramp.h | 116 + .../templates/empty/cfg/cfg_randpool.h | 56 + .../arduino/templates/empty/cfg/cfg_sem.h | 48 + .../arduino/templates/empty/cfg/cfg_ser.h | 222 + .../arduino/templates/empty/cfg/cfg_signal.h | 48 + .../templates/empty/cfg/cfg_spi_bitbang.h | 52 + .../arduino/templates/empty/cfg/cfg_stepper.h | 70 + .../templates/empty/cfg/cfg_tas5706a.h | 51 + .../arduino/templates/empty/cfg/cfg_thermo.h | 71 + .../arduino/templates/empty/cfg/cfg_timer.h | 68 + .../arduino/templates/empty/cfg/cfg_wdt.h | 48 + .../arduino/templates/empty/cfg/cfg_xmodem.h | 79 + 2.5/boards/arduino/templates/empty/empty.mk | 89 + .../arduino/templates/empty/empty_user.mk | 43 + 2.5/boards/arduino/templates/empty/main.c | 89 + .../arduino/templates/empty/project.bertos | 77 + 2.5/boards/arduino/templates/kernel/.spec | 9 + .../arduino/templates/kernel/cfg/cfg_adc.h | 110 + .../arduino/templates/kernel/cfg/cfg_afsk.h | 113 + .../arduino/templates/kernel/cfg/cfg_ax25.h | 76 + .../arduino/templates/kernel/cfg/cfg_battfs.h | 68 + .../templates/kernel/cfg/cfg_context_switch.h | 71 + .../templates/kernel/cfg/cfg_dataflash.h | 56 + .../templates/kernel/cfg/cfg_dc_motor.h | 111 + .../arduino/templates/kernel/cfg/cfg_debug.h | 55 + .../arduino/templates/kernel/cfg/cfg_fat.h | 140 + .../templates/kernel/cfg/cfg_flash25.h | 52 + .../templates/kernel/cfg/cfg_formatwr.h | 65 + .../arduino/templates/kernel/cfg/cfg_gfx.h | 67 + .../templates/kernel/cfg/cfg_hashtable.h | 51 + .../arduino/templates/kernel/cfg/cfg_heap.h | 51 + .../arduino/templates/kernel/cfg/cfg_i2c.h | 88 + .../arduino/templates/kernel/cfg/cfg_i2s.h | 75 + .../templates/kernel/cfg/cfg_ini_reader.h | 49 + .../arduino/templates/kernel/cfg/cfg_kbd.h | 59 + .../arduino/templates/kernel/cfg/cfg_keytag.h | 61 + .../arduino/templates/kernel/cfg/cfg_kfile.h | 61 + .../templates/kernel/cfg/cfg_lcd_32122a.h | 63 + .../templates/kernel/cfg/cfg_lcd_hd44.h | 55 + .../arduino/templates/kernel/cfg/cfg_lm75.h | 57 + .../arduino/templates/kernel/cfg/cfg_md2.h | 54 + .../templates/kernel/cfg/cfg_monitor.h | 48 + .../arduino/templates/kernel/cfg/cfg_nmea.h | 85 + .../arduino/templates/kernel/cfg/cfg_parser.h | 46 + .../arduino/templates/kernel/cfg/cfg_phase.h | 56 + .../templates/kernel/cfg/cfg_pocketbus.h | 71 + .../arduino/templates/kernel/cfg/cfg_proc.h | 107 + .../arduino/templates/kernel/cfg/cfg_pwm.h | 57 + .../arduino/templates/kernel/cfg/cfg_ramp.h | 116 + .../templates/kernel/cfg/cfg_randpool.h | 56 + .../arduino/templates/kernel/cfg/cfg_sem.h | 48 + .../arduino/templates/kernel/cfg/cfg_ser.h | 222 + .../arduino/templates/kernel/cfg/cfg_signal.h | 48 + .../templates/kernel/cfg/cfg_spi_bitbang.h | 52 + .../templates/kernel/cfg/cfg_stepper.h | 70 + .../templates/kernel/cfg/cfg_tas5706a.h | 51 + .../arduino/templates/kernel/cfg/cfg_thermo.h | 71 + .../arduino/templates/kernel/cfg/cfg_timer.h | 68 + .../arduino/templates/kernel/cfg/cfg_wdt.h | 48 + .../arduino/templates/kernel/cfg/cfg_xmodem.h | 79 + 2.5/boards/arduino/templates/kernel/kernel.mk | 90 + .../arduino/templates/kernel/kernel_user.mk | 43 + 2.5/boards/arduino/templates/kernel/main.c | 122 + .../arduino/templates/kernel/project.bertos | 85 + 2.5/boards/at91sam7s-ek/.image.png | Bin 0 -> 59017 bytes 2.5/boards/at91sam7s-ek/.spec | 32 + 2.5/boards/at91sam7s-ek/benchmark/.spec | 3 + .../benchmark/context_switch/.spec | 15 + .../benchmark/context_switch/cfg/cfg_adc.h | 110 + .../benchmark/context_switch/cfg/cfg_afsk.h | 113 + .../benchmark/context_switch/cfg/cfg_ax25.h | 76 + .../benchmark/context_switch/cfg/cfg_battfs.h | 68 + .../context_switch/cfg/cfg_context_switch.h | 71 + .../context_switch/cfg/cfg_dataflash.h | 56 + .../context_switch/cfg/cfg_dc_motor.h | 111 + .../benchmark/context_switch/cfg/cfg_debug.h | 55 + .../benchmark/context_switch/cfg/cfg_fat.h | 140 + .../context_switch/cfg/cfg_flash25.h | 52 + .../context_switch/cfg/cfg_formatwr.h | 65 + .../benchmark/context_switch/cfg/cfg_gfx.h | 67 + .../context_switch/cfg/cfg_hashtable.h | 51 + .../benchmark/context_switch/cfg/cfg_heap.h | 51 + .../benchmark/context_switch/cfg/cfg_i2c.h | 88 + .../benchmark/context_switch/cfg/cfg_i2s.h | 75 + .../context_switch/cfg/cfg_ini_reader.h | 49 + .../benchmark/context_switch/cfg/cfg_kbd.h | 59 + .../benchmark/context_switch/cfg/cfg_keytag.h | 61 + .../benchmark/context_switch/cfg/cfg_kfile.h | 61 + .../context_switch/cfg/cfg_lcd_32122a.h | 63 + .../context_switch/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/context_switch/cfg/cfg_lm75.h | 57 + .../benchmark/context_switch/cfg/cfg_md2.h | 54 + .../context_switch/cfg/cfg_monitor.h | 48 + .../benchmark/context_switch/cfg/cfg_nmea.h | 85 + .../benchmark/context_switch/cfg/cfg_parser.h | 46 + .../benchmark/context_switch/cfg/cfg_phase.h | 56 + .../context_switch/cfg/cfg_pocketbus.h | 71 + .../benchmark/context_switch/cfg/cfg_proc.h | 107 + .../benchmark/context_switch/cfg/cfg_pwm.h | 57 + .../benchmark/context_switch/cfg/cfg_ramp.h | 116 + .../context_switch/cfg/cfg_randpool.h | 56 + .../benchmark/context_switch/cfg/cfg_sem.h | 48 + .../benchmark/context_switch/cfg/cfg_ser.h | 222 + .../benchmark/context_switch/cfg/cfg_signal.h | 48 + .../context_switch/cfg/cfg_spi_bitbang.h | 52 + .../context_switch/cfg/cfg_stepper.h | 70 + .../context_switch/cfg/cfg_tas5706a.h | 51 + .../benchmark/context_switch/cfg/cfg_thermo.h | 71 + .../benchmark/context_switch/cfg/cfg_timer.h | 68 + .../benchmark/context_switch/cfg/cfg_wdt.h | 48 + .../benchmark/context_switch/cfg/cfg_xmodem.h | 79 + .../context_switch/context_switch.mk | 96 + .../context_switch/context_switch_user.mk | 44 + .../benchmark/context_switch/main.c | 56 + .../benchmark/context_switch/project.bertos | 81 + .../benchmark/kernel_footprint/.spec | 14 + .../benchmark/kernel_footprint/cfg/cfg_adc.h | 110 + .../benchmark/kernel_footprint/cfg/cfg_afsk.h | 113 + .../benchmark/kernel_footprint/cfg/cfg_ax25.h | 76 + .../kernel_footprint/cfg/cfg_battfs.h | 68 + .../kernel_footprint/cfg/cfg_context_switch.h | 71 + .../kernel_footprint/cfg/cfg_dataflash.h | 56 + .../kernel_footprint/cfg/cfg_dc_motor.h | 111 + .../kernel_footprint/cfg/cfg_debug.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_fat.h | 140 + .../kernel_footprint/cfg/cfg_flash25.h | 52 + .../kernel_footprint/cfg/cfg_formatwr.h | 65 + .../benchmark/kernel_footprint/cfg/cfg_gfx.h | 67 + .../kernel_footprint/cfg/cfg_hashtable.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_heap.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_i2c.h | 88 + .../benchmark/kernel_footprint/cfg/cfg_i2s.h | 75 + .../kernel_footprint/cfg/cfg_ini_reader.h | 49 + .../benchmark/kernel_footprint/cfg/cfg_kbd.h | 59 + .../kernel_footprint/cfg/cfg_keytag.h | 61 + .../kernel_footprint/cfg/cfg_kfile.h | 61 + .../kernel_footprint/cfg/cfg_lcd_32122a.h | 63 + .../kernel_footprint/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_lm75.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_md2.h | 54 + .../kernel_footprint/cfg/cfg_monitor.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_nmea.h | 85 + .../kernel_footprint/cfg/cfg_parser.h | 46 + .../kernel_footprint/cfg/cfg_phase.h | 56 + .../kernel_footprint/cfg/cfg_pocketbus.h | 71 + .../benchmark/kernel_footprint/cfg/cfg_proc.h | 107 + .../benchmark/kernel_footprint/cfg/cfg_pwm.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_ramp.h | 116 + .../kernel_footprint/cfg/cfg_randpool.h | 56 + .../benchmark/kernel_footprint/cfg/cfg_sem.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_ser.h | 222 + .../kernel_footprint/cfg/cfg_signal.h | 48 + .../kernel_footprint/cfg/cfg_spi_bitbang.h | 52 + .../kernel_footprint/cfg/cfg_stepper.h | 70 + .../kernel_footprint/cfg/cfg_tas5706a.h | 51 + .../kernel_footprint/cfg/cfg_thermo.h | 71 + .../kernel_footprint/cfg/cfg_timer.h | 68 + .../benchmark/kernel_footprint/cfg/cfg_wdt.h | 48 + .../kernel_footprint/cfg/cfg_xmodem.h | 79 + .../kernel_footprint/kernel_footprint.mk | 97 + .../kernel_footprint/kernel_footprint_user.mk | 44 + .../benchmark/kernel_footprint/main.c | 57 + .../benchmark/kernel_footprint/project.bertos | 85 + 2.5/boards/at91sam7s-ek/hw/hw_afsk.c | 128 + 2.5/boards/at91sam7s-ek/hw/hw_afsk.h | 122 + 2.5/boards/at91sam7s-ek/hw/hw_buzzer.h | 52 + 2.5/boards/at91sam7s-ek/hw/hw_dataflash.c | 126 + 2.5/boards/at91sam7s-ek/hw/hw_dataflash.h | 48 + 2.5/boards/at91sam7s-ek/hw/hw_dc_motor.h | 85 + 2.5/boards/at91sam7s-ek/hw/hw_ft245rl.h | 65 + 2.5/boards/at91sam7s-ek/hw/hw_i2c_bitbang.h | 66 + 2.5/boards/at91sam7s-ek/hw/hw_kbd.h | 72 + 2.5/boards/at91sam7s-ek/hw/hw_lcd.h | 156 + 2.5/boards/at91sam7s-ek/hw/hw_lcd_32122a.h | 155 + 2.5/boards/at91sam7s-ek/hw/hw_lcd_hd44.h | 157 + 2.5/boards/at91sam7s-ek/hw/hw_led.h | 60 + 2.5/boards/at91sam7s-ek/hw/hw_lm75.h | 49 + 2.5/boards/at91sam7s-ek/hw/hw_mcp41.c | 53 + 2.5/boards/at91sam7s-ek/hw/hw_mcp41.h | 75 + 2.5/boards/at91sam7s-ek/hw/hw_ntc.c | 46 + 2.5/boards/at91sam7s-ek/hw/hw_ntc.h | 136 + 2.5/boards/at91sam7s-ek/hw/hw_phase.c | 46 + 2.5/boards/at91sam7s-ek/hw/hw_phase.h | 80 + 2.5/boards/at91sam7s-ek/hw/hw_rit128x96.h | 78 + 2.5/boards/at91sam7s-ek/hw/hw_sd.h | 53 + 2.5/boards/at91sam7s-ek/hw/hw_ser.h | 53 + 2.5/boards/at91sam7s-ek/hw/hw_sipo.h | 109 + 2.5/boards/at91sam7s-ek/hw/hw_spi.h | 115 + 2.5/boards/at91sam7s-ek/hw/hw_stepper.h | 309 + 2.5/boards/at91sam7s-ek/hw/hw_tas5706a.h | 65 + 2.5/boards/at91sam7s-ek/hw/hw_thermo.h | 182 + 2.5/boards/at91sam7s-ek/hw/hw_tlv5618.h | 69 + 2.5/boards/at91sam7s-ek/hw/hw_tmp123.h | 52 + 2.5/boards/at91sam7s-ek/hw/kbd_map.h | 71 + 2.5/boards/at91sam7s-ek/hw/mcp41_map.h | 59 + 2.5/boards/at91sam7s-ek/hw/ntc_map.h | 61 + 2.5/boards/at91sam7s-ek/hw/phase_map.h | 58 + 2.5/boards/at91sam7s-ek/hw/pwm_map.h | 59 + 2.5/boards/at91sam7s-ek/hw/thermo_map.h | 70 + 2.5/boards/at91sam7s-ek/templates/.spec | 3 + 2.5/boards/at91sam7s-ek/templates/empty/.spec | 8 + .../templates/empty/cfg/cfg_adc.h | 110 + .../templates/empty/cfg/cfg_afsk.h | 113 + .../templates/empty/cfg/cfg_ax25.h | 76 + .../templates/empty/cfg/cfg_battfs.h | 68 + .../templates/empty/cfg/cfg_context_switch.h | 71 + .../templates/empty/cfg/cfg_dataflash.h | 56 + .../templates/empty/cfg/cfg_dc_motor.h | 111 + .../templates/empty/cfg/cfg_debug.h | 55 + .../templates/empty/cfg/cfg_fat.h | 140 + .../templates/empty/cfg/cfg_flash25.h | 52 + .../templates/empty/cfg/cfg_formatwr.h | 65 + .../templates/empty/cfg/cfg_gfx.h | 67 + .../templates/empty/cfg/cfg_hashtable.h | 51 + .../templates/empty/cfg/cfg_heap.h | 51 + .../templates/empty/cfg/cfg_i2c.h | 88 + .../templates/empty/cfg/cfg_i2s.h | 75 + .../templates/empty/cfg/cfg_ini_reader.h | 49 + .../templates/empty/cfg/cfg_kbd.h | 59 + .../templates/empty/cfg/cfg_keytag.h | 61 + .../templates/empty/cfg/cfg_kfile.h | 61 + .../templates/empty/cfg/cfg_lcd_32122a.h | 63 + .../templates/empty/cfg/cfg_lcd_hd44.h | 55 + .../templates/empty/cfg/cfg_lm75.h | 57 + .../templates/empty/cfg/cfg_md2.h | 54 + .../templates/empty/cfg/cfg_monitor.h | 48 + .../templates/empty/cfg/cfg_nmea.h | 85 + .../templates/empty/cfg/cfg_parser.h | 46 + .../templates/empty/cfg/cfg_phase.h | 56 + .../templates/empty/cfg/cfg_pocketbus.h | 71 + .../templates/empty/cfg/cfg_proc.h | 107 + .../templates/empty/cfg/cfg_pwm.h | 57 + .../templates/empty/cfg/cfg_ramp.h | 116 + .../templates/empty/cfg/cfg_randpool.h | 56 + .../templates/empty/cfg/cfg_sem.h | 48 + .../templates/empty/cfg/cfg_ser.h | 222 + .../templates/empty/cfg/cfg_signal.h | 48 + .../templates/empty/cfg/cfg_spi_bitbang.h | 52 + .../templates/empty/cfg/cfg_stepper.h | 70 + .../templates/empty/cfg/cfg_tas5706a.h | 51 + .../templates/empty/cfg/cfg_thermo.h | 71 + .../templates/empty/cfg/cfg_timer.h | 68 + .../templates/empty/cfg/cfg_wdt.h | 48 + .../templates/empty/cfg/cfg_xmodem.h | 79 + .../at91sam7s-ek/templates/empty/empty.mk | 96 + .../templates/empty/empty_user.mk | 43 + .../at91sam7s-ek/templates/empty/main.c | 77 + .../templates/empty/project.bertos | 77 + .../at91sam7s-ek/templates/kernel/.spec | 9 + .../templates/kernel/cfg/cfg_adc.h | 110 + .../templates/kernel/cfg/cfg_afsk.h | 113 + .../templates/kernel/cfg/cfg_ax25.h | 76 + .../templates/kernel/cfg/cfg_battfs.h | 68 + .../templates/kernel/cfg/cfg_context_switch.h | 71 + .../templates/kernel/cfg/cfg_dataflash.h | 56 + .../templates/kernel/cfg/cfg_dc_motor.h | 111 + .../templates/kernel/cfg/cfg_debug.h | 55 + .../templates/kernel/cfg/cfg_fat.h | 140 + .../templates/kernel/cfg/cfg_flash25.h | 52 + .../templates/kernel/cfg/cfg_formatwr.h | 65 + .../templates/kernel/cfg/cfg_gfx.h | 67 + .../templates/kernel/cfg/cfg_hashtable.h | 51 + .../templates/kernel/cfg/cfg_heap.h | 51 + .../templates/kernel/cfg/cfg_i2c.h | 88 + .../templates/kernel/cfg/cfg_i2s.h | 75 + .../templates/kernel/cfg/cfg_ini_reader.h | 49 + .../templates/kernel/cfg/cfg_kbd.h | 59 + .../templates/kernel/cfg/cfg_keytag.h | 61 + .../templates/kernel/cfg/cfg_kfile.h | 61 + .../templates/kernel/cfg/cfg_lcd_32122a.h | 63 + .../templates/kernel/cfg/cfg_lcd_hd44.h | 55 + .../templates/kernel/cfg/cfg_lm75.h | 57 + .../templates/kernel/cfg/cfg_md2.h | 54 + .../templates/kernel/cfg/cfg_monitor.h | 48 + .../templates/kernel/cfg/cfg_nmea.h | 85 + .../templates/kernel/cfg/cfg_parser.h | 46 + .../templates/kernel/cfg/cfg_phase.h | 56 + .../templates/kernel/cfg/cfg_pocketbus.h | 71 + .../templates/kernel/cfg/cfg_proc.h | 107 + .../templates/kernel/cfg/cfg_pwm.h | 57 + .../templates/kernel/cfg/cfg_ramp.h | 116 + .../templates/kernel/cfg/cfg_randpool.h | 56 + .../templates/kernel/cfg/cfg_sem.h | 48 + .../templates/kernel/cfg/cfg_ser.h | 222 + .../templates/kernel/cfg/cfg_signal.h | 48 + .../templates/kernel/cfg/cfg_spi_bitbang.h | 52 + .../templates/kernel/cfg/cfg_stepper.h | 70 + .../templates/kernel/cfg/cfg_tas5706a.h | 51 + .../templates/kernel/cfg/cfg_thermo.h | 71 + .../templates/kernel/cfg/cfg_timer.h | 68 + .../templates/kernel/cfg/cfg_wdt.h | 48 + .../templates/kernel/cfg/cfg_xmodem.h | 79 + .../at91sam7s-ek/templates/kernel/kernel.mk | 97 + .../templates/kernel/kernel_user.mk | 43 + .../at91sam7s-ek/templates/kernel/main.c | 115 + .../templates/kernel/project.bertos | 85 + 2.5/boards/at91sam7x-ek/.image.png | Bin 0 -> 59067 bytes 2.5/boards/at91sam7x-ek/.spec | 31 + 2.5/boards/at91sam7x-ek/benchmark/.spec | 3 + .../benchmark/context_switch/.spec | 15 + .../benchmark/context_switch/cfg/cfg_adc.h | 110 + .../benchmark/context_switch/cfg/cfg_afsk.h | 114 + .../benchmark/context_switch/cfg/cfg_ax25.h | 76 + .../benchmark/context_switch/cfg/cfg_battfs.h | 68 + .../context_switch/cfg/cfg_context_switch.h | 71 + .../context_switch/cfg/cfg_dataflash.h | 56 + .../context_switch/cfg/cfg_dc_motor.h | 111 + .../benchmark/context_switch/cfg/cfg_debug.h | 55 + .../benchmark/context_switch/cfg/cfg_fat.h | 140 + .../context_switch/cfg/cfg_flash25.h | 52 + .../context_switch/cfg/cfg_formatwr.h | 65 + .../benchmark/context_switch/cfg/cfg_gfx.h | 67 + .../context_switch/cfg/cfg_hashtable.h | 51 + .../benchmark/context_switch/cfg/cfg_heap.h | 51 + .../benchmark/context_switch/cfg/cfg_i2c.h | 90 + .../benchmark/context_switch/cfg/cfg_i2s.h | 75 + .../context_switch/cfg/cfg_ini_reader.h | 49 + .../benchmark/context_switch/cfg/cfg_kbd.h | 59 + .../benchmark/context_switch/cfg/cfg_keytag.h | 61 + .../benchmark/context_switch/cfg/cfg_kfile.h | 61 + .../context_switch/cfg/cfg_lcd_32122a.h | 63 + .../context_switch/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/context_switch/cfg/cfg_lm75.h | 57 + .../benchmark/context_switch/cfg/cfg_md2.h | 54 + .../benchmark/context_switch/cfg/cfg_menu.h | 67 + .../context_switch/cfg/cfg_monitor.h | 48 + .../benchmark/context_switch/cfg/cfg_nmea.h | 85 + .../benchmark/context_switch/cfg/cfg_parser.h | 46 + .../benchmark/context_switch/cfg/cfg_phase.h | 56 + .../context_switch/cfg/cfg_pocketbus.h | 71 + .../benchmark/context_switch/cfg/cfg_proc.h | 107 + .../benchmark/context_switch/cfg/cfg_pwm.h | 57 + .../benchmark/context_switch/cfg/cfg_ramp.h | 116 + .../context_switch/cfg/cfg_randpool.h | 56 + .../benchmark/context_switch/cfg/cfg_sem.h | 48 + .../benchmark/context_switch/cfg/cfg_ser.h | 222 + .../benchmark/context_switch/cfg/cfg_signal.h | 48 + .../context_switch/cfg/cfg_spi_bitbang.h | 52 + .../context_switch/cfg/cfg_stepper.h | 70 + .../context_switch/cfg/cfg_tas5706a.h | 51 + .../benchmark/context_switch/cfg/cfg_thermo.h | 71 + .../benchmark/context_switch/cfg/cfg_timer.h | 68 + .../benchmark/context_switch/cfg/cfg_wdt.h | 48 + .../benchmark/context_switch/cfg/cfg_xmodem.h | 79 + .../context_switch/context_switch.mk | 96 + .../context_switch/context_switch_user.mk | 44 + .../benchmark/context_switch/main.c | 56 + .../benchmark/context_switch/project.bertos | 81 + .../benchmark/kernel_footprint/.spec | 14 + .../benchmark/kernel_footprint/cfg/cfg_adc.h | 110 + .../benchmark/kernel_footprint/cfg/cfg_afsk.h | 114 + .../benchmark/kernel_footprint/cfg/cfg_ax25.h | 76 + .../kernel_footprint/cfg/cfg_battfs.h | 68 + .../kernel_footprint/cfg/cfg_context_switch.h | 71 + .../kernel_footprint/cfg/cfg_dataflash.h | 56 + .../kernel_footprint/cfg/cfg_dc_motor.h | 111 + .../kernel_footprint/cfg/cfg_debug.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_fat.h | 140 + .../kernel_footprint/cfg/cfg_flash25.h | 52 + .../kernel_footprint/cfg/cfg_formatwr.h | 65 + .../benchmark/kernel_footprint/cfg/cfg_gfx.h | 67 + .../kernel_footprint/cfg/cfg_hashtable.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_heap.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_i2c.h | 90 + .../benchmark/kernel_footprint/cfg/cfg_i2s.h | 75 + .../kernel_footprint/cfg/cfg_ini_reader.h | 49 + .../benchmark/kernel_footprint/cfg/cfg_kbd.h | 59 + .../kernel_footprint/cfg/cfg_keytag.h | 61 + .../kernel_footprint/cfg/cfg_kfile.h | 61 + .../kernel_footprint/cfg/cfg_lcd_32122a.h | 63 + .../kernel_footprint/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_lm75.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_md2.h | 54 + .../benchmark/kernel_footprint/cfg/cfg_menu.h | 67 + .../kernel_footprint/cfg/cfg_monitor.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_nmea.h | 85 + .../kernel_footprint/cfg/cfg_parser.h | 46 + .../kernel_footprint/cfg/cfg_phase.h | 56 + .../kernel_footprint/cfg/cfg_pocketbus.h | 71 + .../benchmark/kernel_footprint/cfg/cfg_proc.h | 107 + .../benchmark/kernel_footprint/cfg/cfg_pwm.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_ramp.h | 116 + .../kernel_footprint/cfg/cfg_randpool.h | 56 + .../benchmark/kernel_footprint/cfg/cfg_sem.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_ser.h | 222 + .../kernel_footprint/cfg/cfg_signal.h | 48 + .../kernel_footprint/cfg/cfg_spi_bitbang.h | 52 + .../kernel_footprint/cfg/cfg_stepper.h | 70 + .../kernel_footprint/cfg/cfg_tas5706a.h | 51 + .../kernel_footprint/cfg/cfg_thermo.h | 71 + .../kernel_footprint/cfg/cfg_timer.h | 68 + .../benchmark/kernel_footprint/cfg/cfg_wdt.h | 48 + .../kernel_footprint/cfg/cfg_xmodem.h | 79 + .../kernel_footprint/kernel_footprint.mk | 94 + .../kernel_footprint/kernel_footprint_user.mk | 44 + .../benchmark/kernel_footprint/main.c | 57 + .../benchmark/kernel_footprint/project.bertos | 85 + 2.5/boards/at91sam7x-ek/examples/.spec | 3 + 2.5/boards/at91sam7x-ek/examples/sd_fat/.spec | 28 + .../examples/sd_fat/cfg/cfg_adc.h | 110 + .../examples/sd_fat/cfg/cfg_afsk.h | 114 + .../examples/sd_fat/cfg/cfg_ax25.h | 76 + .../examples/sd_fat/cfg/cfg_battfs.h | 68 + .../examples/sd_fat/cfg/cfg_context_switch.h | 71 + .../examples/sd_fat/cfg/cfg_dataflash.h | 56 + .../examples/sd_fat/cfg/cfg_dc_motor.h | 111 + .../examples/sd_fat/cfg/cfg_debug.h | 55 + .../examples/sd_fat/cfg/cfg_fat.h | 140 + .../examples/sd_fat/cfg/cfg_flash25.h | 52 + .../examples/sd_fat/cfg/cfg_formatwr.h | 65 + .../examples/sd_fat/cfg/cfg_gfx.h | 67 + .../examples/sd_fat/cfg/cfg_heap.h | 51 + .../examples/sd_fat/cfg/cfg_i2c.h | 90 + .../examples/sd_fat/cfg/cfg_i2s.h | 75 + .../examples/sd_fat/cfg/cfg_ini_reader.h | 49 + .../examples/sd_fat/cfg/cfg_kbd.h | 59 + .../examples/sd_fat/cfg/cfg_kfile.h | 62 + .../examples/sd_fat/cfg/cfg_lcd_32122a.h | 63 + .../examples/sd_fat/cfg/cfg_lcd_hd44.h | 55 + .../examples/sd_fat/cfg/cfg_lm75.h | 57 + .../examples/sd_fat/cfg/cfg_md2.h | 54 + .../examples/sd_fat/cfg/cfg_menu.h | 67 + .../examples/sd_fat/cfg/cfg_monitor.h | 48 + .../examples/sd_fat/cfg/cfg_nmea.h | 85 + .../examples/sd_fat/cfg/cfg_phase.h | 56 + .../examples/sd_fat/cfg/cfg_pocketbus.h | 71 + .../examples/sd_fat/cfg/cfg_proc.h | 108 + .../examples/sd_fat/cfg/cfg_pwm.h | 57 + .../examples/sd_fat/cfg/cfg_ramp.h | 116 + .../examples/sd_fat/cfg/cfg_randpool.h | 56 + .../examples/sd_fat/cfg/cfg_sem.h | 48 + .../examples/sd_fat/cfg/cfg_ser.h | 222 + .../examples/sd_fat/cfg/cfg_signal.h | 48 + .../examples/sd_fat/cfg/cfg_spi_bitbang.h | 52 + .../examples/sd_fat/cfg/cfg_stepper.h | 70 + .../examples/sd_fat/cfg/cfg_tas5706a.h | 51 + .../examples/sd_fat/cfg/cfg_thermo.h | 71 + .../examples/sd_fat/cfg/cfg_timer.h | 68 + .../examples/sd_fat/cfg/cfg_wdt.h | 48 + .../examples/sd_fat/cfg/cfg_xmodem.h | 81 + .../at91sam7x-ek/examples/sd_fat/main.c | 413 + .../examples/sd_fat/project.bertos | 91 + .../at91sam7x-ek/examples/sd_fat/sd_fat.mk | 102 + .../examples/sd_fat/sd_fat_user.mk | 44 + 2.5/boards/at91sam7x-ek/hw/hw_afsk.c | 41 + 2.5/boards/at91sam7x-ek/hw/hw_afsk.h | 87 + 2.5/boards/at91sam7x-ek/hw/hw_buzzer.h | 52 + 2.5/boards/at91sam7x-ek/hw/hw_dataflash.c | 126 + 2.5/boards/at91sam7x-ek/hw/hw_dataflash.h | 48 + 2.5/boards/at91sam7x-ek/hw/hw_dc_motor.h | 71 + 2.5/boards/at91sam7x-ek/hw/hw_ft245rl.h | 65 + 2.5/boards/at91sam7x-ek/hw/hw_i2c_bitbang.h | 66 + 2.5/boards/at91sam7x-ek/hw/hw_kbd.h | 72 + 2.5/boards/at91sam7x-ek/hw/hw_lcd_32122a.h | 155 + 2.5/boards/at91sam7x-ek/hw/hw_lcd_hd44.h | 157 + 2.5/boards/at91sam7x-ek/hw/hw_led.h | 57 + 2.5/boards/at91sam7x-ek/hw/hw_lm75.h | 49 + 2.5/boards/at91sam7x-ek/hw/hw_mcp41.c | 53 + 2.5/boards/at91sam7x-ek/hw/hw_mcp41.h | 75 + 2.5/boards/at91sam7x-ek/hw/hw_ntc.c | 46 + 2.5/boards/at91sam7x-ek/hw/hw_ntc.h | 136 + 2.5/boards/at91sam7x-ek/hw/hw_phase.c | 46 + 2.5/boards/at91sam7x-ek/hw/hw_phase.h | 80 + 2.5/boards/at91sam7x-ek/hw/hw_rit128x96.h | 78 + 2.5/boards/at91sam7x-ek/hw/hw_sd.h | 59 + 2.5/boards/at91sam7x-ek/hw/hw_ser.h | 53 + 2.5/boards/at91sam7x-ek/hw/hw_sipo.h | 109 + 2.5/boards/at91sam7x-ek/hw/hw_spi.h | 115 + 2.5/boards/at91sam7x-ek/hw/hw_stepper.h | 309 + 2.5/boards/at91sam7x-ek/hw/hw_tas5706a.h | 65 + 2.5/boards/at91sam7x-ek/hw/hw_thermo.h | 121 + 2.5/boards/at91sam7x-ek/hw/hw_tlv5618.h | 69 + 2.5/boards/at91sam7x-ek/hw/hw_tmp123.h | 53 + 2.5/boards/at91sam7x-ek/hw/kbd_map.h | 71 + 2.5/boards/at91sam7x-ek/hw/mcp41_map.h | 59 + 2.5/boards/at91sam7x-ek/hw/ntc_map.h | 61 + 2.5/boards/at91sam7x-ek/hw/phase_map.h | 58 + 2.5/boards/at91sam7x-ek/hw/pwm_map.h | 61 + 2.5/boards/at91sam7x-ek/hw/thermo_map.h | 56 + 2.5/boards/at91sam7x-ek/templates/.spec | 3 + 2.5/boards/at91sam7x-ek/templates/empty/.spec | 8 + .../templates/empty/cfg/cfg_adc.h | 110 + .../templates/empty/cfg/cfg_afsk.h | 113 + .../templates/empty/cfg/cfg_ax25.h | 76 + .../templates/empty/cfg/cfg_battfs.h | 68 + .../templates/empty/cfg/cfg_context_switch.h | 71 + .../templates/empty/cfg/cfg_dataflash.h | 56 + .../templates/empty/cfg/cfg_dc_motor.h | 111 + .../templates/empty/cfg/cfg_debug.h | 55 + .../templates/empty/cfg/cfg_fat.h | 140 + .../templates/empty/cfg/cfg_flash25.h | 52 + .../templates/empty/cfg/cfg_formatwr.h | 65 + .../templates/empty/cfg/cfg_gfx.h | 67 + .../templates/empty/cfg/cfg_hashtable.h | 51 + .../templates/empty/cfg/cfg_heap.h | 51 + .../templates/empty/cfg/cfg_i2c.h | 88 + .../templates/empty/cfg/cfg_i2s.h | 75 + .../templates/empty/cfg/cfg_ini_reader.h | 49 + .../templates/empty/cfg/cfg_kbd.h | 59 + .../templates/empty/cfg/cfg_keytag.h | 61 + .../templates/empty/cfg/cfg_kfile.h | 61 + .../templates/empty/cfg/cfg_lcd_32122a.h | 63 + .../templates/empty/cfg/cfg_lcd_hd44.h | 55 + .../templates/empty/cfg/cfg_lm75.h | 57 + .../templates/empty/cfg/cfg_md2.h | 54 + .../templates/empty/cfg/cfg_monitor.h | 48 + .../templates/empty/cfg/cfg_nmea.h | 85 + .../templates/empty/cfg/cfg_parser.h | 46 + .../templates/empty/cfg/cfg_phase.h | 56 + .../templates/empty/cfg/cfg_pocketbus.h | 71 + .../templates/empty/cfg/cfg_proc.h | 107 + .../templates/empty/cfg/cfg_pwm.h | 57 + .../templates/empty/cfg/cfg_ramp.h | 116 + .../templates/empty/cfg/cfg_randpool.h | 56 + .../templates/empty/cfg/cfg_sem.h | 48 + .../templates/empty/cfg/cfg_ser.h | 222 + .../templates/empty/cfg/cfg_signal.h | 48 + .../templates/empty/cfg/cfg_spi_bitbang.h | 52 + .../templates/empty/cfg/cfg_stepper.h | 70 + .../templates/empty/cfg/cfg_tas5706a.h | 51 + .../templates/empty/cfg/cfg_thermo.h | 71 + .../templates/empty/cfg/cfg_timer.h | 68 + .../templates/empty/cfg/cfg_wdt.h | 48 + .../templates/empty/cfg/cfg_xmodem.h | 79 + .../at91sam7x-ek/templates/empty/empty.mk | 95 + .../templates/empty/empty_user.mk | 43 + .../at91sam7x-ek/templates/empty/main.c | 78 + .../templates/empty/project.bertos | 77 + .../at91sam7x-ek/templates/kernel/.spec | 9 + .../templates/kernel/cfg/cfg_adc.h | 110 + .../templates/kernel/cfg/cfg_afsk.h | 113 + .../templates/kernel/cfg/cfg_ax25.h | 76 + .../templates/kernel/cfg/cfg_battfs.h | 68 + .../templates/kernel/cfg/cfg_context_switch.h | 71 + .../templates/kernel/cfg/cfg_dataflash.h | 56 + .../templates/kernel/cfg/cfg_dc_motor.h | 111 + .../templates/kernel/cfg/cfg_debug.h | 55 + .../templates/kernel/cfg/cfg_fat.h | 140 + .../templates/kernel/cfg/cfg_flash25.h | 52 + .../templates/kernel/cfg/cfg_formatwr.h | 65 + .../templates/kernel/cfg/cfg_gfx.h | 67 + .../templates/kernel/cfg/cfg_hashtable.h | 51 + .../templates/kernel/cfg/cfg_heap.h | 51 + .../templates/kernel/cfg/cfg_i2c.h | 88 + .../templates/kernel/cfg/cfg_i2s.h | 75 + .../templates/kernel/cfg/cfg_ini_reader.h | 49 + .../templates/kernel/cfg/cfg_kbd.h | 59 + .../templates/kernel/cfg/cfg_keytag.h | 61 + .../templates/kernel/cfg/cfg_kfile.h | 61 + .../templates/kernel/cfg/cfg_lcd_32122a.h | 63 + .../templates/kernel/cfg/cfg_lcd_hd44.h | 55 + .../templates/kernel/cfg/cfg_lm75.h | 57 + .../templates/kernel/cfg/cfg_md2.h | 54 + .../templates/kernel/cfg/cfg_monitor.h | 48 + .../templates/kernel/cfg/cfg_nmea.h | 85 + .../templates/kernel/cfg/cfg_parser.h | 46 + .../templates/kernel/cfg/cfg_phase.h | 56 + .../templates/kernel/cfg/cfg_pocketbus.h | 71 + .../templates/kernel/cfg/cfg_proc.h | 107 + .../templates/kernel/cfg/cfg_pwm.h | 57 + .../templates/kernel/cfg/cfg_ramp.h | 116 + .../templates/kernel/cfg/cfg_randpool.h | 56 + .../templates/kernel/cfg/cfg_sem.h | 48 + .../templates/kernel/cfg/cfg_ser.h | 222 + .../templates/kernel/cfg/cfg_signal.h | 48 + .../templates/kernel/cfg/cfg_spi_bitbang.h | 52 + .../templates/kernel/cfg/cfg_stepper.h | 70 + .../templates/kernel/cfg/cfg_tas5706a.h | 51 + .../templates/kernel/cfg/cfg_thermo.h | 71 + .../templates/kernel/cfg/cfg_timer.h | 68 + .../templates/kernel/cfg/cfg_wdt.h | 48 + .../templates/kernel/cfg/cfg_xmodem.h | 79 + .../at91sam7x-ek/templates/kernel/kernel.mk | 97 + .../templates/kernel/kernel_user.mk | 43 + .../at91sam7x-ek/templates/kernel/main.c | 112 + .../templates/kernel/project.bertos | 85 + 2.5/boards/ek-lm3s1968/.image.png | Bin 0 -> 53490 bytes 2.5/boards/ek-lm3s1968/.spec | 32 + 2.5/boards/ek-lm3s1968/benchmark/.spec | 3 + .../benchmark/context_switch/.spec | 15 + .../benchmark/context_switch/cfg/cfg_adc.h | 110 + .../benchmark/context_switch/cfg/cfg_afsk.h | 114 + .../benchmark/context_switch/cfg/cfg_ax25.h | 76 + .../benchmark/context_switch/cfg/cfg_battfs.h | 68 + .../context_switch/cfg/cfg_context_switch.h | 71 + .../context_switch/cfg/cfg_dataflash.h | 56 + .../context_switch/cfg/cfg_dc_motor.h | 111 + .../benchmark/context_switch/cfg/cfg_debug.h | 55 + .../benchmark/context_switch/cfg/cfg_fat.h | 140 + .../context_switch/cfg/cfg_flash25.h | 52 + .../context_switch/cfg/cfg_formatwr.h | 65 + .../benchmark/context_switch/cfg/cfg_gfx.h | 67 + .../context_switch/cfg/cfg_hashtable.h | 51 + .../benchmark/context_switch/cfg/cfg_heap.h | 51 + .../benchmark/context_switch/cfg/cfg_i2c.h | 90 + .../benchmark/context_switch/cfg/cfg_i2s.h | 75 + .../context_switch/cfg/cfg_ini_reader.h | 49 + .../benchmark/context_switch/cfg/cfg_kbd.h | 59 + .../benchmark/context_switch/cfg/cfg_keytag.h | 61 + .../benchmark/context_switch/cfg/cfg_kfile.h | 61 + .../context_switch/cfg/cfg_lcd_32122a.h | 63 + .../context_switch/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/context_switch/cfg/cfg_lm75.h | 57 + .../benchmark/context_switch/cfg/cfg_md2.h | 54 + .../benchmark/context_switch/cfg/cfg_menu.h | 67 + .../context_switch/cfg/cfg_monitor.h | 48 + .../benchmark/context_switch/cfg/cfg_nmea.h | 85 + .../benchmark/context_switch/cfg/cfg_parser.h | 46 + .../benchmark/context_switch/cfg/cfg_phase.h | 56 + .../context_switch/cfg/cfg_pocketbus.h | 71 + .../benchmark/context_switch/cfg/cfg_proc.h | 107 + .../benchmark/context_switch/cfg/cfg_pwm.h | 57 + .../benchmark/context_switch/cfg/cfg_ramp.h | 116 + .../context_switch/cfg/cfg_randpool.h | 56 + .../benchmark/context_switch/cfg/cfg_sem.h | 48 + .../benchmark/context_switch/cfg/cfg_ser.h | 222 + .../benchmark/context_switch/cfg/cfg_signal.h | 48 + .../context_switch/cfg/cfg_spi_bitbang.h | 52 + .../context_switch/cfg/cfg_stepper.h | 70 + .../context_switch/cfg/cfg_tas5706a.h | 51 + .../benchmark/context_switch/cfg/cfg_thermo.h | 71 + .../benchmark/context_switch/cfg/cfg_timer.h | 68 + .../benchmark/context_switch/cfg/cfg_wdt.h | 48 + .../benchmark/context_switch/cfg/cfg_xmodem.h | 79 + .../context_switch/context_switch.mk | 93 + .../context_switch/context_switch_user.mk | 44 + .../benchmark/context_switch/main.c | 56 + .../benchmark/context_switch/project.bertos | 79 + .../benchmark/kernel_footprint/.spec | 14 + .../benchmark/kernel_footprint/cfg/cfg_adc.h | 110 + .../benchmark/kernel_footprint/cfg/cfg_afsk.h | 114 + .../benchmark/kernel_footprint/cfg/cfg_ax25.h | 76 + .../kernel_footprint/cfg/cfg_battfs.h | 68 + .../kernel_footprint/cfg/cfg_context_switch.h | 71 + .../kernel_footprint/cfg/cfg_dataflash.h | 56 + .../kernel_footprint/cfg/cfg_dc_motor.h | 111 + .../kernel_footprint/cfg/cfg_debug.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_fat.h | 140 + .../kernel_footprint/cfg/cfg_flash25.h | 52 + .../kernel_footprint/cfg/cfg_formatwr.h | 65 + .../benchmark/kernel_footprint/cfg/cfg_gfx.h | 67 + .../kernel_footprint/cfg/cfg_hashtable.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_heap.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_i2c.h | 90 + .../benchmark/kernel_footprint/cfg/cfg_i2s.h | 75 + .../kernel_footprint/cfg/cfg_ini_reader.h | 49 + .../benchmark/kernel_footprint/cfg/cfg_kbd.h | 59 + .../kernel_footprint/cfg/cfg_keytag.h | 61 + .../kernel_footprint/cfg/cfg_kfile.h | 61 + .../kernel_footprint/cfg/cfg_lcd_32122a.h | 63 + .../kernel_footprint/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_lm75.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_md2.h | 54 + .../benchmark/kernel_footprint/cfg/cfg_menu.h | 67 + .../kernel_footprint/cfg/cfg_monitor.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_nmea.h | 85 + .../kernel_footprint/cfg/cfg_parser.h | 46 + .../kernel_footprint/cfg/cfg_phase.h | 56 + .../kernel_footprint/cfg/cfg_pocketbus.h | 71 + .../benchmark/kernel_footprint/cfg/cfg_proc.h | 107 + .../benchmark/kernel_footprint/cfg/cfg_pwm.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_ramp.h | 116 + .../kernel_footprint/cfg/cfg_randpool.h | 56 + .../benchmark/kernel_footprint/cfg/cfg_sem.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_ser.h | 222 + .../kernel_footprint/cfg/cfg_signal.h | 48 + .../kernel_footprint/cfg/cfg_spi_bitbang.h | 52 + .../kernel_footprint/cfg/cfg_stepper.h | 70 + .../kernel_footprint/cfg/cfg_tas5706a.h | 51 + .../kernel_footprint/cfg/cfg_thermo.h | 71 + .../kernel_footprint/cfg/cfg_timer.h | 68 + .../benchmark/kernel_footprint/cfg/cfg_wdt.h | 48 + .../kernel_footprint/cfg/cfg_xmodem.h | 79 + .../kernel_footprint/kernel_footprint.mk | 93 + .../kernel_footprint/kernel_footprint_user.mk | 44 + .../benchmark/kernel_footprint/main.c | 57 + .../benchmark/kernel_footprint/project.bertos | 83 + 2.5/boards/ek-lm3s1968/examples/.spec | 3 + 2.5/boards/ek-lm3s1968/examples/gps/.spec | 19 + .../ek-lm3s1968/examples/gps/cfg/cfg_adc.h | 110 + .../ek-lm3s1968/examples/gps/cfg/cfg_afsk.h | 114 + .../ek-lm3s1968/examples/gps/cfg/cfg_ax25.h | 76 + .../ek-lm3s1968/examples/gps/cfg/cfg_battfs.h | 68 + .../examples/gps/cfg/cfg_context_switch.h | 71 + .../examples/gps/cfg/cfg_dataflash.h | 56 + .../examples/gps/cfg/cfg_dc_motor.h | 67 + .../ek-lm3s1968/examples/gps/cfg/cfg_debug.h | 55 + .../ek-lm3s1968/examples/gps/cfg/cfg_fat.h | 140 + .../examples/gps/cfg/cfg_flash25.h | 52 + .../examples/gps/cfg/cfg_formatwr.h | 67 + .../ek-lm3s1968/examples/gps/cfg/cfg_gfx.h | 67 + .../examples/gps/cfg/cfg_hashtable.h | 51 + .../ek-lm3s1968/examples/gps/cfg/cfg_heap.h | 51 + .../ek-lm3s1968/examples/gps/cfg/cfg_i2c.h | 90 + .../ek-lm3s1968/examples/gps/cfg/cfg_i2s.h | 75 + .../examples/gps/cfg/cfg_ini_reader.h | 49 + .../ek-lm3s1968/examples/gps/cfg/cfg_kbd.h | 59 + .../ek-lm3s1968/examples/gps/cfg/cfg_keytag.h | 61 + .../ek-lm3s1968/examples/gps/cfg/cfg_kfile.h | 62 + .../examples/gps/cfg/cfg_lcd_32122a.h | 63 + .../examples/gps/cfg/cfg_lcd_hd44.h | 55 + .../ek-lm3s1968/examples/gps/cfg/cfg_lm75.h | 57 + .../ek-lm3s1968/examples/gps/cfg/cfg_md2.h | 54 + .../ek-lm3s1968/examples/gps/cfg/cfg_menu.h | 67 + .../examples/gps/cfg/cfg_monitor.h | 48 + .../ek-lm3s1968/examples/gps/cfg/cfg_nmea.h | 85 + .../ek-lm3s1968/examples/gps/cfg/cfg_parser.h | 46 + .../ek-lm3s1968/examples/gps/cfg/cfg_phase.h | 56 + .../ek-lm3s1968/examples/gps/cfg/cfg_pid.h | 57 + .../examples/gps/cfg/cfg_pocketbus.h | 50 + .../ek-lm3s1968/examples/gps/cfg/cfg_proc.h | 108 + .../ek-lm3s1968/examples/gps/cfg/cfg_pwm.h | 57 + .../ek-lm3s1968/examples/gps/cfg/cfg_ramp.h | 116 + .../examples/gps/cfg/cfg_randpool.h | 56 + .../ek-lm3s1968/examples/gps/cfg/cfg_sem.h | 48 + .../ek-lm3s1968/examples/gps/cfg/cfg_ser.h | 222 + .../ek-lm3s1968/examples/gps/cfg/cfg_signal.h | 48 + .../examples/gps/cfg/cfg_spi_bitbang.h | 52 + .../examples/gps/cfg/cfg_spi_dma.h | 68 + .../examples/gps/cfg/cfg_stepper.h | 70 + .../examples/gps/cfg/cfg_tas5706a.h | 51 + .../ek-lm3s1968/examples/gps/cfg/cfg_thermo.h | 58 + .../ek-lm3s1968/examples/gps/cfg/cfg_timer.h | 68 + .../ek-lm3s1968/examples/gps/cfg/cfg_wdt.h | 48 + .../ek-lm3s1968/examples/gps/cfg/cfg_xmodem.h | 67 + 2.5/boards/ek-lm3s1968/examples/gps/cfg/log.h | 170 + 2.5/boards/ek-lm3s1968/examples/gps/compass.c | 62 + 2.5/boards/ek-lm3s1968/examples/gps/compass.h | 20 + 2.5/boards/ek-lm3s1968/examples/gps/gps.mk | 103 + .../ek-lm3s1968/examples/gps/gps_user.mk | 55 + 2.5/boards/ek-lm3s1968/examples/gps/logo.c | 547 + 2.5/boards/ek-lm3s1968/examples/gps/main.c | 567 + .../ek-lm3s1968/examples/gps/project.bertos | 94 + 2.5/boards/ek-lm3s1968/hw/hw_afsk.c | 41 + 2.5/boards/ek-lm3s1968/hw/hw_afsk.h | 87 + 2.5/boards/ek-lm3s1968/hw/hw_buzzer.h | 52 + 2.5/boards/ek-lm3s1968/hw/hw_dataflash.c | 126 + 2.5/boards/ek-lm3s1968/hw/hw_dataflash.h | 48 + 2.5/boards/ek-lm3s1968/hw/hw_dc_motor.h | 85 + 2.5/boards/ek-lm3s1968/hw/hw_ft245rl.h | 65 + 2.5/boards/ek-lm3s1968/hw/hw_i2c_bitbang.h | 66 + 2.5/boards/ek-lm3s1968/hw/hw_kbd.h | 66 + 2.5/boards/ek-lm3s1968/hw/hw_lcd_32122a.h | 155 + 2.5/boards/ek-lm3s1968/hw/hw_lcd_hd44.h | 157 + 2.5/boards/ek-lm3s1968/hw/hw_led.h | 56 + 2.5/boards/ek-lm3s1968/hw/hw_lm75.h | 49 + 2.5/boards/ek-lm3s1968/hw/hw_mcp41.c | 53 + 2.5/boards/ek-lm3s1968/hw/hw_mcp41.h | 75 + 2.5/boards/ek-lm3s1968/hw/hw_ntc.c | 46 + 2.5/boards/ek-lm3s1968/hw/hw_ntc.h | 136 + 2.5/boards/ek-lm3s1968/hw/hw_phase.c | 46 + 2.5/boards/ek-lm3s1968/hw/hw_phase.h | 80 + 2.5/boards/ek-lm3s1968/hw/hw_rit128x96.h | 127 + 2.5/boards/ek-lm3s1968/hw/hw_sd.h | 53 + 2.5/boards/ek-lm3s1968/hw/hw_ser.h | 53 + 2.5/boards/ek-lm3s1968/hw/hw_sipo.h | 109 + 2.5/boards/ek-lm3s1968/hw/hw_spi.h | 115 + 2.5/boards/ek-lm3s1968/hw/hw_stepper.h | 309 + 2.5/boards/ek-lm3s1968/hw/hw_tas5706a.h | 65 + 2.5/boards/ek-lm3s1968/hw/hw_thermo.h | 182 + 2.5/boards/ek-lm3s1968/hw/hw_tlv5618.h | 69 + 2.5/boards/ek-lm3s1968/hw/hw_tmp123.h | 52 + 2.5/boards/ek-lm3s1968/hw/kbd_map.h | 70 + 2.5/boards/ek-lm3s1968/hw/mcp41_map.h | 59 + 2.5/boards/ek-lm3s1968/hw/ntc_map.h | 61 + 2.5/boards/ek-lm3s1968/hw/phase_map.h | 58 + 2.5/boards/ek-lm3s1968/hw/pwm_map.h | 61 + 2.5/boards/ek-lm3s1968/hw/thermo_map.h | 70 + 2.5/boards/ek-lm3s1968/templates/.spec | 3 + 2.5/boards/ek-lm3s1968/templates/empty/.spec | 8 + .../ek-lm3s1968/templates/empty/cfg/cfg_adc.h | 110 + .../templates/empty/cfg/cfg_afsk.h | 113 + .../templates/empty/cfg/cfg_ax25.h | 76 + .../templates/empty/cfg/cfg_battfs.h | 68 + .../templates/empty/cfg/cfg_context_switch.h | 71 + .../templates/empty/cfg/cfg_dataflash.h | 56 + .../templates/empty/cfg/cfg_dc_motor.h | 111 + .../templates/empty/cfg/cfg_debug.h | 55 + .../ek-lm3s1968/templates/empty/cfg/cfg_fat.h | 140 + .../templates/empty/cfg/cfg_flash25.h | 52 + .../templates/empty/cfg/cfg_formatwr.h | 65 + .../ek-lm3s1968/templates/empty/cfg/cfg_gfx.h | 67 + .../templates/empty/cfg/cfg_hashtable.h | 51 + .../templates/empty/cfg/cfg_heap.h | 51 + .../ek-lm3s1968/templates/empty/cfg/cfg_i2c.h | 88 + .../ek-lm3s1968/templates/empty/cfg/cfg_i2s.h | 75 + .../templates/empty/cfg/cfg_ini_reader.h | 49 + .../ek-lm3s1968/templates/empty/cfg/cfg_kbd.h | 59 + .../templates/empty/cfg/cfg_keytag.h | 61 + .../templates/empty/cfg/cfg_kfile.h | 61 + .../templates/empty/cfg/cfg_lcd_32122a.h | 63 + .../templates/empty/cfg/cfg_lcd_hd44.h | 55 + .../templates/empty/cfg/cfg_lm75.h | 57 + .../ek-lm3s1968/templates/empty/cfg/cfg_md2.h | 54 + .../templates/empty/cfg/cfg_monitor.h | 48 + .../templates/empty/cfg/cfg_nmea.h | 85 + .../templates/empty/cfg/cfg_parser.h | 46 + .../templates/empty/cfg/cfg_phase.h | 56 + .../templates/empty/cfg/cfg_pocketbus.h | 71 + .../templates/empty/cfg/cfg_proc.h | 107 + .../ek-lm3s1968/templates/empty/cfg/cfg_pwm.h | 57 + .../templates/empty/cfg/cfg_ramp.h | 116 + .../templates/empty/cfg/cfg_randpool.h | 56 + .../ek-lm3s1968/templates/empty/cfg/cfg_sem.h | 48 + .../ek-lm3s1968/templates/empty/cfg/cfg_ser.h | 222 + .../templates/empty/cfg/cfg_signal.h | 48 + .../templates/empty/cfg/cfg_spi_bitbang.h | 52 + .../templates/empty/cfg/cfg_stepper.h | 70 + .../templates/empty/cfg/cfg_tas5706a.h | 51 + .../templates/empty/cfg/cfg_thermo.h | 71 + .../templates/empty/cfg/cfg_timer.h | 68 + .../ek-lm3s1968/templates/empty/cfg/cfg_wdt.h | 48 + .../templates/empty/cfg/cfg_xmodem.h | 79 + .../ek-lm3s1968/templates/empty/empty.mk | 100 + .../ek-lm3s1968/templates/empty/empty_user.mk | 44 + 2.5/boards/ek-lm3s1968/templates/empty/main.c | 97 + .../templates/empty/project.bertos | 87 + 2.5/boards/ek-lm3s1968/templates/kernel/.spec | 9 + .../templates/kernel/cfg/cfg_adc.h | 110 + .../templates/kernel/cfg/cfg_afsk.h | 113 + .../templates/kernel/cfg/cfg_ax25.h | 76 + .../templates/kernel/cfg/cfg_battfs.h | 68 + .../templates/kernel/cfg/cfg_context_switch.h | 71 + .../templates/kernel/cfg/cfg_dataflash.h | 56 + .../templates/kernel/cfg/cfg_dc_motor.h | 111 + .../templates/kernel/cfg/cfg_debug.h | 55 + .../templates/kernel/cfg/cfg_fat.h | 140 + .../templates/kernel/cfg/cfg_flash25.h | 52 + .../templates/kernel/cfg/cfg_formatwr.h | 65 + .../templates/kernel/cfg/cfg_gfx.h | 67 + .../templates/kernel/cfg/cfg_hashtable.h | 51 + .../templates/kernel/cfg/cfg_heap.h | 51 + .../templates/kernel/cfg/cfg_i2c.h | 88 + .../templates/kernel/cfg/cfg_i2s.h | 75 + .../templates/kernel/cfg/cfg_ini_reader.h | 49 + .../templates/kernel/cfg/cfg_kbd.h | 59 + .../templates/kernel/cfg/cfg_keytag.h | 61 + .../templates/kernel/cfg/cfg_kfile.h | 61 + .../templates/kernel/cfg/cfg_lcd_32122a.h | 63 + .../templates/kernel/cfg/cfg_lcd_hd44.h | 55 + .../templates/kernel/cfg/cfg_lm75.h | 57 + .../templates/kernel/cfg/cfg_md2.h | 54 + .../templates/kernel/cfg/cfg_monitor.h | 48 + .../templates/kernel/cfg/cfg_nmea.h | 85 + .../templates/kernel/cfg/cfg_parser.h | 46 + .../templates/kernel/cfg/cfg_phase.h | 56 + .../templates/kernel/cfg/cfg_pocketbus.h | 71 + .../templates/kernel/cfg/cfg_proc.h | 107 + .../templates/kernel/cfg/cfg_pwm.h | 57 + .../templates/kernel/cfg/cfg_ramp.h | 116 + .../templates/kernel/cfg/cfg_randpool.h | 56 + .../templates/kernel/cfg/cfg_sem.h | 48 + .../templates/kernel/cfg/cfg_ser.h | 222 + .../templates/kernel/cfg/cfg_signal.h | 48 + .../templates/kernel/cfg/cfg_spi_bitbang.h | 52 + .../templates/kernel/cfg/cfg_stepper.h | 70 + .../templates/kernel/cfg/cfg_tas5706a.h | 51 + .../templates/kernel/cfg/cfg_thermo.h | 71 + .../templates/kernel/cfg/cfg_timer.h | 68 + .../templates/kernel/cfg/cfg_wdt.h | 48 + .../templates/kernel/cfg/cfg_xmodem.h | 79 + .../ek-lm3s1968/templates/kernel/kernel.mk | 101 + .../templates/kernel/kernel_user.mk | 44 + .../ek-lm3s1968/templates/kernel/main.c | 131 + .../templates/kernel/project.bertos | 95 + 2.5/boards/lpc-p2378/.image.png | Bin 0 -> 51899 bytes 2.5/boards/lpc-p2378/.spec | 32 + 2.5/boards/lpc-p2378/benchmark/.spec | 3 + .../lpc-p2378/benchmark/context_switch/.spec | 15 + .../benchmark/context_switch/cfg/cfg_adc.h | 110 + .../benchmark/context_switch/cfg/cfg_afsk.h | 114 + .../benchmark/context_switch/cfg/cfg_ax25.h | 76 + .../benchmark/context_switch/cfg/cfg_battfs.h | 68 + .../context_switch/cfg/cfg_context_switch.h | 71 + .../context_switch/cfg/cfg_dataflash.h | 56 + .../context_switch/cfg/cfg_dc_motor.h | 111 + .../benchmark/context_switch/cfg/cfg_debug.h | 55 + .../benchmark/context_switch/cfg/cfg_fat.h | 140 + .../context_switch/cfg/cfg_flash25.h | 52 + .../context_switch/cfg/cfg_formatwr.h | 65 + .../benchmark/context_switch/cfg/cfg_gfx.h | 67 + .../context_switch/cfg/cfg_hashtable.h | 51 + .../benchmark/context_switch/cfg/cfg_heap.h | 51 + .../benchmark/context_switch/cfg/cfg_i2c.h | 90 + .../benchmark/context_switch/cfg/cfg_i2s.h | 75 + .../context_switch/cfg/cfg_ini_reader.h | 49 + .../benchmark/context_switch/cfg/cfg_kbd.h | 59 + .../benchmark/context_switch/cfg/cfg_keytag.h | 61 + .../benchmark/context_switch/cfg/cfg_kfile.h | 61 + .../context_switch/cfg/cfg_lcd_32122a.h | 63 + .../context_switch/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/context_switch/cfg/cfg_lm75.h | 57 + .../benchmark/context_switch/cfg/cfg_md2.h | 54 + .../benchmark/context_switch/cfg/cfg_menu.h | 67 + .../context_switch/cfg/cfg_monitor.h | 48 + .../benchmark/context_switch/cfg/cfg_nmea.h | 85 + .../benchmark/context_switch/cfg/cfg_parser.h | 46 + .../benchmark/context_switch/cfg/cfg_phase.h | 56 + .../context_switch/cfg/cfg_pocketbus.h | 71 + .../benchmark/context_switch/cfg/cfg_proc.h | 107 + .../benchmark/context_switch/cfg/cfg_pwm.h | 57 + .../benchmark/context_switch/cfg/cfg_ramp.h | 116 + .../context_switch/cfg/cfg_randpool.h | 56 + .../benchmark/context_switch/cfg/cfg_sem.h | 48 + .../benchmark/context_switch/cfg/cfg_ser.h | 222 + .../benchmark/context_switch/cfg/cfg_signal.h | 48 + .../context_switch/cfg/cfg_spi_bitbang.h | 52 + .../context_switch/cfg/cfg_stepper.h | 70 + .../context_switch/cfg/cfg_tas5706a.h | 51 + .../benchmark/context_switch/cfg/cfg_thermo.h | 71 + .../benchmark/context_switch/cfg/cfg_timer.h | 68 + .../benchmark/context_switch/cfg/cfg_wdt.h | 48 + .../benchmark/context_switch/cfg/cfg_xmodem.h | 79 + .../context_switch/context_switch.mk | 95 + .../context_switch/context_switch_user.mk | 44 + .../lpc-p2378/benchmark/context_switch/main.c | 56 + .../benchmark/context_switch/project.bertos | 81 + .../benchmark/kernel_footprint/.spec | 14 + .../benchmark/kernel_footprint/cfg/cfg_adc.h | 110 + .../benchmark/kernel_footprint/cfg/cfg_afsk.h | 113 + .../benchmark/kernel_footprint/cfg/cfg_ax25.h | 76 + .../kernel_footprint/cfg/cfg_battfs.h | 68 + .../kernel_footprint/cfg/cfg_context_switch.h | 71 + .../kernel_footprint/cfg/cfg_dataflash.h | 56 + .../kernel_footprint/cfg/cfg_dc_motor.h | 111 + .../kernel_footprint/cfg/cfg_debug.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_fat.h | 140 + .../kernel_footprint/cfg/cfg_flash25.h | 52 + .../kernel_footprint/cfg/cfg_formatwr.h | 65 + .../benchmark/kernel_footprint/cfg/cfg_gfx.h | 67 + .../kernel_footprint/cfg/cfg_hashtable.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_heap.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_i2c.h | 88 + .../benchmark/kernel_footprint/cfg/cfg_i2s.h | 75 + .../kernel_footprint/cfg/cfg_ini_reader.h | 49 + .../benchmark/kernel_footprint/cfg/cfg_kbd.h | 59 + .../kernel_footprint/cfg/cfg_keytag.h | 61 + .../kernel_footprint/cfg/cfg_kfile.h | 61 + .../kernel_footprint/cfg/cfg_lcd_32122a.h | 63 + .../kernel_footprint/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_lm75.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_md2.h | 54 + .../benchmark/kernel_footprint/cfg/cfg_menu.h | 67 + .../kernel_footprint/cfg/cfg_monitor.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_nmea.h | 85 + .../kernel_footprint/cfg/cfg_parser.h | 46 + .../kernel_footprint/cfg/cfg_phase.h | 56 + .../kernel_footprint/cfg/cfg_pocketbus.h | 71 + .../benchmark/kernel_footprint/cfg/cfg_proc.h | 107 + .../benchmark/kernel_footprint/cfg/cfg_pwm.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_ramp.h | 116 + .../kernel_footprint/cfg/cfg_randpool.h | 56 + .../benchmark/kernel_footprint/cfg/cfg_sem.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_ser.h | 222 + .../kernel_footprint/cfg/cfg_signal.h | 48 + .../kernel_footprint/cfg/cfg_spi_bitbang.h | 52 + .../kernel_footprint/cfg/cfg_stepper.h | 70 + .../kernel_footprint/cfg/cfg_tas5706a.h | 51 + .../kernel_footprint/cfg/cfg_thermo.h | 71 + .../kernel_footprint/cfg/cfg_timer.h | 68 + .../benchmark/kernel_footprint/cfg/cfg_wdt.h | 48 + .../kernel_footprint/cfg/cfg_xmodem.h | 79 + .../kernel_footprint/kernel_footprint.mk | 92 + .../kernel_footprint/kernel_footprint_user.mk | 44 + .../benchmark/kernel_footprint/main.c | 57 + .../benchmark/kernel_footprint/project.bertos | 83 + 2.5/boards/lpc-p2378/hw/hw_afsk.c | 41 + 2.5/boards/lpc-p2378/hw/hw_afsk.h | 87 + 2.5/boards/lpc-p2378/hw/hw_buzzer.h | 52 + 2.5/boards/lpc-p2378/hw/hw_dataflash.c | 126 + 2.5/boards/lpc-p2378/hw/hw_dataflash.h | 48 + 2.5/boards/lpc-p2378/hw/hw_dc_motor.h | 85 + 2.5/boards/lpc-p2378/hw/hw_ft245rl.h | 65 + 2.5/boards/lpc-p2378/hw/hw_i2c_bitbang.h | 66 + 2.5/boards/lpc-p2378/hw/hw_kbd.h | 72 + 2.5/boards/lpc-p2378/hw/hw_lcd_32122a.h | 155 + 2.5/boards/lpc-p2378/hw/hw_lcd_hd44.h | 157 + 2.5/boards/lpc-p2378/hw/hw_led.h | 49 + 2.5/boards/lpc-p2378/hw/hw_lm75.h | 49 + 2.5/boards/lpc-p2378/hw/hw_mcp41.c | 53 + 2.5/boards/lpc-p2378/hw/hw_mcp41.h | 75 + 2.5/boards/lpc-p2378/hw/hw_ntc.c | 46 + 2.5/boards/lpc-p2378/hw/hw_ntc.h | 136 + 2.5/boards/lpc-p2378/hw/hw_phase.c | 46 + 2.5/boards/lpc-p2378/hw/hw_phase.h | 80 + 2.5/boards/lpc-p2378/hw/hw_rit128x96.h | 128 + 2.5/boards/lpc-p2378/hw/hw_sd.h | 53 + 2.5/boards/lpc-p2378/hw/hw_ser.h | 53 + 2.5/boards/lpc-p2378/hw/hw_sipo.h | 109 + 2.5/boards/lpc-p2378/hw/hw_spi.h | 115 + 2.5/boards/lpc-p2378/hw/hw_stepper.h | 309 + 2.5/boards/lpc-p2378/hw/hw_tas5706a.h | 65 + 2.5/boards/lpc-p2378/hw/hw_thermo.h | 182 + 2.5/boards/lpc-p2378/hw/hw_tlv5618.h | 69 + 2.5/boards/lpc-p2378/hw/hw_tmp123.h | 52 + 2.5/boards/lpc-p2378/hw/kbd_map.h | 71 + 2.5/boards/lpc-p2378/hw/mcp41_map.h | 59 + 2.5/boards/lpc-p2378/hw/ntc_map.h | 61 + 2.5/boards/lpc-p2378/hw/phase_map.h | 58 + 2.5/boards/lpc-p2378/hw/pwm_map.h | 61 + 2.5/boards/lpc-p2378/hw/thermo_map.h | 70 + 2.5/boards/lpc-p2378/templates/.spec | 3 + 2.5/boards/lpc-p2378/templates/empty/.spec | 8 + .../lpc-p2378/templates/empty/cfg/cfg_adc.h | 110 + .../lpc-p2378/templates/empty/cfg/cfg_afsk.h | 113 + .../lpc-p2378/templates/empty/cfg/cfg_ax25.h | 76 + .../templates/empty/cfg/cfg_battfs.h | 68 + .../templates/empty/cfg/cfg_context_switch.h | 71 + .../templates/empty/cfg/cfg_dataflash.h | 56 + .../templates/empty/cfg/cfg_dc_motor.h | 111 + .../lpc-p2378/templates/empty/cfg/cfg_debug.h | 55 + .../lpc-p2378/templates/empty/cfg/cfg_fat.h | 140 + .../templates/empty/cfg/cfg_flash25.h | 52 + .../templates/empty/cfg/cfg_formatwr.h | 65 + .../lpc-p2378/templates/empty/cfg/cfg_gfx.h | 67 + .../templates/empty/cfg/cfg_hashtable.h | 51 + .../lpc-p2378/templates/empty/cfg/cfg_heap.h | 51 + .../lpc-p2378/templates/empty/cfg/cfg_i2c.h | 88 + .../lpc-p2378/templates/empty/cfg/cfg_i2s.h | 75 + .../templates/empty/cfg/cfg_ini_reader.h | 49 + .../lpc-p2378/templates/empty/cfg/cfg_kbd.h | 59 + .../templates/empty/cfg/cfg_keytag.h | 61 + .../lpc-p2378/templates/empty/cfg/cfg_kfile.h | 61 + .../templates/empty/cfg/cfg_lcd_32122a.h | 63 + .../templates/empty/cfg/cfg_lcd_hd44.h | 55 + .../lpc-p2378/templates/empty/cfg/cfg_lm75.h | 57 + .../lpc-p2378/templates/empty/cfg/cfg_md2.h | 54 + .../templates/empty/cfg/cfg_monitor.h | 48 + .../lpc-p2378/templates/empty/cfg/cfg_nmea.h | 85 + .../templates/empty/cfg/cfg_parser.h | 46 + .../lpc-p2378/templates/empty/cfg/cfg_phase.h | 56 + .../templates/empty/cfg/cfg_pocketbus.h | 71 + .../lpc-p2378/templates/empty/cfg/cfg_proc.h | 107 + .../lpc-p2378/templates/empty/cfg/cfg_pwm.h | 57 + .../lpc-p2378/templates/empty/cfg/cfg_ramp.h | 116 + .../templates/empty/cfg/cfg_randpool.h | 56 + .../lpc-p2378/templates/empty/cfg/cfg_sem.h | 48 + .../lpc-p2378/templates/empty/cfg/cfg_ser.h | 222 + .../templates/empty/cfg/cfg_signal.h | 48 + .../templates/empty/cfg/cfg_spi_bitbang.h | 52 + .../templates/empty/cfg/cfg_stepper.h | 70 + .../templates/empty/cfg/cfg_tas5706a.h | 51 + .../templates/empty/cfg/cfg_thermo.h | 71 + .../lpc-p2378/templates/empty/cfg/cfg_timer.h | 68 + .../lpc-p2378/templates/empty/cfg/cfg_wdt.h | 48 + .../templates/empty/cfg/cfg_xmodem.h | 79 + 2.5/boards/lpc-p2378/templates/empty/empty.mk | 95 + .../lpc-p2378/templates/empty/empty_user.mk | 43 + 2.5/boards/lpc-p2378/templates/empty/main.c | 79 + .../lpc-p2378/templates/empty/project.bertos | 77 + 2.5/boards/lpc-p2378/templates/kernel/.spec | 9 + .../lpc-p2378/templates/kernel/cfg/cfg_adc.h | 110 + .../lpc-p2378/templates/kernel/cfg/cfg_afsk.h | 113 + .../lpc-p2378/templates/kernel/cfg/cfg_ax25.h | 76 + .../templates/kernel/cfg/cfg_battfs.h | 68 + .../templates/kernel/cfg/cfg_context_switch.h | 71 + .../templates/kernel/cfg/cfg_dataflash.h | 56 + .../templates/kernel/cfg/cfg_dc_motor.h | 111 + .../templates/kernel/cfg/cfg_debug.h | 55 + .../lpc-p2378/templates/kernel/cfg/cfg_fat.h | 140 + .../templates/kernel/cfg/cfg_flash25.h | 52 + .../templates/kernel/cfg/cfg_formatwr.h | 65 + .../lpc-p2378/templates/kernel/cfg/cfg_gfx.h | 67 + .../templates/kernel/cfg/cfg_hashtable.h | 51 + .../lpc-p2378/templates/kernel/cfg/cfg_heap.h | 51 + .../lpc-p2378/templates/kernel/cfg/cfg_i2c.h | 88 + .../lpc-p2378/templates/kernel/cfg/cfg_i2s.h | 75 + .../templates/kernel/cfg/cfg_ini_reader.h | 49 + .../lpc-p2378/templates/kernel/cfg/cfg_kbd.h | 59 + .../templates/kernel/cfg/cfg_keytag.h | 61 + .../templates/kernel/cfg/cfg_kfile.h | 61 + .../templates/kernel/cfg/cfg_lcd_32122a.h | 63 + .../templates/kernel/cfg/cfg_lcd_hd44.h | 55 + .../lpc-p2378/templates/kernel/cfg/cfg_lm75.h | 57 + .../lpc-p2378/templates/kernel/cfg/cfg_md2.h | 54 + .../templates/kernel/cfg/cfg_monitor.h | 48 + .../lpc-p2378/templates/kernel/cfg/cfg_nmea.h | 85 + .../templates/kernel/cfg/cfg_parser.h | 46 + .../templates/kernel/cfg/cfg_phase.h | 56 + .../templates/kernel/cfg/cfg_pocketbus.h | 71 + .../lpc-p2378/templates/kernel/cfg/cfg_proc.h | 107 + .../lpc-p2378/templates/kernel/cfg/cfg_pwm.h | 57 + .../lpc-p2378/templates/kernel/cfg/cfg_ramp.h | 116 + .../templates/kernel/cfg/cfg_randpool.h | 56 + .../lpc-p2378/templates/kernel/cfg/cfg_sem.h | 48 + .../lpc-p2378/templates/kernel/cfg/cfg_ser.h | 222 + .../templates/kernel/cfg/cfg_signal.h | 48 + .../templates/kernel/cfg/cfg_spi_bitbang.h | 52 + .../templates/kernel/cfg/cfg_stepper.h | 70 + .../templates/kernel/cfg/cfg_tas5706a.h | 51 + .../templates/kernel/cfg/cfg_thermo.h | 71 + .../templates/kernel/cfg/cfg_timer.h | 68 + .../lpc-p2378/templates/kernel/cfg/cfg_wdt.h | 48 + .../templates/kernel/cfg/cfg_xmodem.h | 79 + .../lpc-p2378/templates/kernel/kernel.mk | 96 + .../lpc-p2378/templates/kernel/kernel_user.mk | 43 + 2.5/boards/lpc-p2378/templates/kernel/main.c | 112 + .../lpc-p2378/templates/kernel/project.bertos | 85 + 2.5/boards/stm32-p103/.image.png | Bin 0 -> 55020 bytes 2.5/boards/stm32-p103/.spec | 32 + 2.5/boards/stm32-p103/benchmark/.spec | 3 + .../stm32-p103/benchmark/context_switch/.spec | 15 + .../benchmark/context_switch/cfg/cfg_adc.h | 110 + .../benchmark/context_switch/cfg/cfg_afsk.h | 113 + .../benchmark/context_switch/cfg/cfg_ax25.h | 76 + .../benchmark/context_switch/cfg/cfg_battfs.h | 68 + .../context_switch/cfg/cfg_context_switch.h | 71 + .../context_switch/cfg/cfg_dataflash.h | 56 + .../context_switch/cfg/cfg_dc_motor.h | 111 + .../benchmark/context_switch/cfg/cfg_debug.h | 55 + .../benchmark/context_switch/cfg/cfg_fat.h | 140 + .../context_switch/cfg/cfg_flash25.h | 52 + .../context_switch/cfg/cfg_formatwr.h | 65 + .../benchmark/context_switch/cfg/cfg_gfx.h | 67 + .../context_switch/cfg/cfg_hashtable.h | 51 + .../benchmark/context_switch/cfg/cfg_heap.h | 51 + .../benchmark/context_switch/cfg/cfg_i2c.h | 88 + .../benchmark/context_switch/cfg/cfg_i2s.h | 75 + .../context_switch/cfg/cfg_ini_reader.h | 49 + .../benchmark/context_switch/cfg/cfg_kbd.h | 59 + .../benchmark/context_switch/cfg/cfg_keytag.h | 61 + .../benchmark/context_switch/cfg/cfg_kfile.h | 61 + .../context_switch/cfg/cfg_lcd_32122a.h | 63 + .../context_switch/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/context_switch/cfg/cfg_lm75.h | 57 + .../benchmark/context_switch/cfg/cfg_md2.h | 54 + .../benchmark/context_switch/cfg/cfg_menu.h | 67 + .../context_switch/cfg/cfg_monitor.h | 48 + .../benchmark/context_switch/cfg/cfg_nmea.h | 85 + .../benchmark/context_switch/cfg/cfg_parser.h | 46 + .../benchmark/context_switch/cfg/cfg_phase.h | 56 + .../context_switch/cfg/cfg_pocketbus.h | 71 + .../benchmark/context_switch/cfg/cfg_proc.h | 107 + .../benchmark/context_switch/cfg/cfg_pwm.h | 57 + .../benchmark/context_switch/cfg/cfg_ramp.h | 116 + .../context_switch/cfg/cfg_randpool.h | 56 + .../benchmark/context_switch/cfg/cfg_sem.h | 48 + .../benchmark/context_switch/cfg/cfg_ser.h | 222 + .../benchmark/context_switch/cfg/cfg_signal.h | 48 + .../context_switch/cfg/cfg_spi_bitbang.h | 52 + .../context_switch/cfg/cfg_stepper.h | 70 + .../context_switch/cfg/cfg_tas5706a.h | 51 + .../benchmark/context_switch/cfg/cfg_thermo.h | 71 + .../benchmark/context_switch/cfg/cfg_timer.h | 68 + .../benchmark/context_switch/cfg/cfg_wdt.h | 48 + .../benchmark/context_switch/cfg/cfg_xmodem.h | 79 + .../context_switch/context_switch.mk | 92 + .../context_switch/context_switch_user.mk | 44 + .../benchmark/context_switch/main.c | 55 + .../benchmark/context_switch/project.bertos | 79 + .../benchmark/kernel_footprint/.spec | 14 + .../benchmark/kernel_footprint/cfg/cfg_adc.h | 110 + .../benchmark/kernel_footprint/cfg/cfg_afsk.h | 113 + .../benchmark/kernel_footprint/cfg/cfg_ax25.h | 76 + .../kernel_footprint/cfg/cfg_battfs.h | 68 + .../kernel_footprint/cfg/cfg_context_switch.h | 71 + .../kernel_footprint/cfg/cfg_dataflash.h | 56 + .../kernel_footprint/cfg/cfg_dc_motor.h | 111 + .../kernel_footprint/cfg/cfg_debug.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_fat.h | 140 + .../kernel_footprint/cfg/cfg_flash25.h | 52 + .../kernel_footprint/cfg/cfg_formatwr.h | 65 + .../benchmark/kernel_footprint/cfg/cfg_gfx.h | 67 + .../kernel_footprint/cfg/cfg_hashtable.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_heap.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_i2c.h | 88 + .../benchmark/kernel_footprint/cfg/cfg_i2s.h | 75 + .../kernel_footprint/cfg/cfg_ini_reader.h | 49 + .../benchmark/kernel_footprint/cfg/cfg_kbd.h | 59 + .../kernel_footprint/cfg/cfg_keytag.h | 61 + .../kernel_footprint/cfg/cfg_kfile.h | 61 + .../kernel_footprint/cfg/cfg_lcd_32122a.h | 63 + .../kernel_footprint/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_lm75.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_md2.h | 54 + .../benchmark/kernel_footprint/cfg/cfg_menu.h | 67 + .../kernel_footprint/cfg/cfg_monitor.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_nmea.h | 85 + .../kernel_footprint/cfg/cfg_parser.h | 46 + .../kernel_footprint/cfg/cfg_phase.h | 56 + .../kernel_footprint/cfg/cfg_pocketbus.h | 71 + .../benchmark/kernel_footprint/cfg/cfg_proc.h | 107 + .../benchmark/kernel_footprint/cfg/cfg_pwm.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_ramp.h | 116 + .../kernel_footprint/cfg/cfg_randpool.h | 56 + .../benchmark/kernel_footprint/cfg/cfg_sem.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_ser.h | 222 + .../kernel_footprint/cfg/cfg_signal.h | 48 + .../kernel_footprint/cfg/cfg_spi_bitbang.h | 52 + .../kernel_footprint/cfg/cfg_stepper.h | 70 + .../kernel_footprint/cfg/cfg_tas5706a.h | 51 + .../kernel_footprint/cfg/cfg_thermo.h | 71 + .../kernel_footprint/cfg/cfg_timer.h | 68 + .../benchmark/kernel_footprint/cfg/cfg_wdt.h | 48 + .../kernel_footprint/cfg/cfg_xmodem.h | 79 + .../kernel_footprint/kernel_footprint.mk | 93 + .../kernel_footprint/kernel_footprint_user.mk | 43 + .../benchmark/kernel_footprint/main.c | 56 + .../benchmark/kernel_footprint/project.bertos | 83 + 2.5/boards/stm32-p103/hw/hw_afsk.c | 41 + 2.5/boards/stm32-p103/hw/hw_afsk.h | 85 + 2.5/boards/stm32-p103/hw/hw_blanker.h | 50 + 2.5/boards/stm32-p103/hw/hw_boot.h | 50 + 2.5/boards/stm32-p103/hw/hw_buzzer.h | 52 + 2.5/boards/stm32-p103/hw/hw_buzzerled.h | 47 + 2.5/boards/stm32-p103/hw/hw_cpufreq.h | 64 + 2.5/boards/stm32-p103/hw/hw_dataflash.c | 126 + 2.5/boards/stm32-p103/hw/hw_dataflash.h | 48 + 2.5/boards/stm32-p103/hw/hw_dc_motor.h | 71 + 2.5/boards/stm32-p103/hw/hw_ft245rl.h | 65 + 2.5/boards/stm32-p103/hw/hw_i2c_bitbang.h | 66 + 2.5/boards/stm32-p103/hw/hw_input.h | 46 + 2.5/boards/stm32-p103/hw/hw_kbd.h | 72 + 2.5/boards/stm32-p103/hw/hw_lcd_32122a.h | 155 + 2.5/boards/stm32-p103/hw/hw_lcd_hd44.h | 157 + 2.5/boards/stm32-p103/hw/hw_led.h | 68 + 2.5/boards/stm32-p103/hw/hw_lm75.h | 49 + 2.5/boards/stm32-p103/hw/hw_mcp41.c | 53 + 2.5/boards/stm32-p103/hw/hw_mcp41.h | 75 + 2.5/boards/stm32-p103/hw/hw_ntc.c | 46 + 2.5/boards/stm32-p103/hw/hw_ntc.h | 136 + 2.5/boards/stm32-p103/hw/hw_phase.c | 46 + 2.5/boards/stm32-p103/hw/hw_phase.h | 80 + 2.5/boards/stm32-p103/hw/hw_rit128x96.h | 78 + 2.5/boards/stm32-p103/hw/hw_sd.h | 53 + 2.5/boards/stm32-p103/hw/hw_sensor.h | 93 + 2.5/boards/stm32-p103/hw/hw_ser.h | 53 + 2.5/boards/stm32-p103/hw/hw_sipo.h | 109 + 2.5/boards/stm32-p103/hw/hw_spi.h | 115 + 2.5/boards/stm32-p103/hw/hw_spi_dma.h | 48 + 2.5/boards/stm32-p103/hw/hw_stepper.h | 309 + 2.5/boards/stm32-p103/hw/hw_tas5706a.h | 65 + 2.5/boards/stm32-p103/hw/hw_tc520.h | 71 + 2.5/boards/stm32-p103/hw/hw_thermo.h | 121 + 2.5/boards/stm32-p103/hw/hw_timer.h | 52 + 2.5/boards/stm32-p103/hw/hw_tlv5618.h | 69 + 2.5/boards/stm32-p103/hw/hw_tmp123.h | 52 + 2.5/boards/stm32-p103/hw/kbd_map.h | 71 + 2.5/boards/stm32-p103/hw/mcp41_map.h | 59 + 2.5/boards/stm32-p103/hw/ntc_map.h | 61 + 2.5/boards/stm32-p103/hw/phase_map.h | 58 + 2.5/boards/stm32-p103/hw/pwm_map.h | 61 + 2.5/boards/stm32-p103/hw/thermo_map.h | 56 + 2.5/boards/stm32-p103/templates/.spec | 3 + 2.5/boards/stm32-p103/templates/empty/.spec | 8 + .../stm32-p103/templates/empty/cfg/cfg_adc.h | 110 + .../stm32-p103/templates/empty/cfg/cfg_afsk.h | 113 + .../stm32-p103/templates/empty/cfg/cfg_ax25.h | 76 + .../templates/empty/cfg/cfg_battfs.h | 68 + .../templates/empty/cfg/cfg_context_switch.h | 71 + .../templates/empty/cfg/cfg_dataflash.h | 56 + .../templates/empty/cfg/cfg_dc_motor.h | 111 + .../templates/empty/cfg/cfg_debug.h | 55 + .../stm32-p103/templates/empty/cfg/cfg_fat.h | 140 + .../templates/empty/cfg/cfg_flash25.h | 52 + .../templates/empty/cfg/cfg_formatwr.h | 65 + .../stm32-p103/templates/empty/cfg/cfg_gfx.h | 67 + .../templates/empty/cfg/cfg_hashtable.h | 51 + .../stm32-p103/templates/empty/cfg/cfg_heap.h | 51 + .../stm32-p103/templates/empty/cfg/cfg_i2c.h | 88 + .../stm32-p103/templates/empty/cfg/cfg_i2s.h | 75 + .../templates/empty/cfg/cfg_ini_reader.h | 49 + .../stm32-p103/templates/empty/cfg/cfg_kbd.h | 59 + .../templates/empty/cfg/cfg_keytag.h | 61 + .../templates/empty/cfg/cfg_kfile.h | 61 + .../templates/empty/cfg/cfg_lcd_32122a.h | 63 + .../templates/empty/cfg/cfg_lcd_hd44.h | 55 + .../stm32-p103/templates/empty/cfg/cfg_lm75.h | 57 + .../stm32-p103/templates/empty/cfg/cfg_md2.h | 54 + .../templates/empty/cfg/cfg_monitor.h | 48 + .../stm32-p103/templates/empty/cfg/cfg_nmea.h | 85 + .../templates/empty/cfg/cfg_parser.h | 46 + .../templates/empty/cfg/cfg_phase.h | 56 + .../templates/empty/cfg/cfg_pocketbus.h | 71 + .../stm32-p103/templates/empty/cfg/cfg_proc.h | 107 + .../stm32-p103/templates/empty/cfg/cfg_pwm.h | 57 + .../stm32-p103/templates/empty/cfg/cfg_ramp.h | 116 + .../templates/empty/cfg/cfg_randpool.h | 56 + .../stm32-p103/templates/empty/cfg/cfg_sem.h | 48 + .../stm32-p103/templates/empty/cfg/cfg_ser.h | 222 + .../templates/empty/cfg/cfg_signal.h | 48 + .../templates/empty/cfg/cfg_spi_bitbang.h | 52 + .../templates/empty/cfg/cfg_stepper.h | 70 + .../templates/empty/cfg/cfg_tas5706a.h | 51 + .../templates/empty/cfg/cfg_thermo.h | 71 + .../templates/empty/cfg/cfg_timer.h | 68 + .../stm32-p103/templates/empty/cfg/cfg_wdt.h | 48 + .../templates/empty/cfg/cfg_xmodem.h | 79 + .../stm32-p103/templates/empty/empty.mk | 92 + .../stm32-p103/templates/empty/empty_user.mk | 43 + 2.5/boards/stm32-p103/templates/empty/main.c | 70 + .../stm32-p103/templates/empty/project.bertos | 75 + 2.5/boards/stm32-p103/templates/kernel/.spec | 9 + .../stm32-p103/templates/kernel/cfg/cfg_adc.h | 110 + .../templates/kernel/cfg/cfg_afsk.h | 113 + .../templates/kernel/cfg/cfg_ax25.h | 76 + .../templates/kernel/cfg/cfg_battfs.h | 68 + .../templates/kernel/cfg/cfg_context_switch.h | 71 + .../templates/kernel/cfg/cfg_dataflash.h | 56 + .../templates/kernel/cfg/cfg_dc_motor.h | 111 + .../templates/kernel/cfg/cfg_debug.h | 55 + .../stm32-p103/templates/kernel/cfg/cfg_fat.h | 140 + .../templates/kernel/cfg/cfg_flash25.h | 52 + .../templates/kernel/cfg/cfg_formatwr.h | 65 + .../stm32-p103/templates/kernel/cfg/cfg_gfx.h | 67 + .../templates/kernel/cfg/cfg_hashtable.h | 51 + .../templates/kernel/cfg/cfg_heap.h | 51 + .../stm32-p103/templates/kernel/cfg/cfg_i2c.h | 88 + .../stm32-p103/templates/kernel/cfg/cfg_i2s.h | 75 + .../templates/kernel/cfg/cfg_ini_reader.h | 49 + .../stm32-p103/templates/kernel/cfg/cfg_kbd.h | 59 + .../templates/kernel/cfg/cfg_keytag.h | 61 + .../templates/kernel/cfg/cfg_kfile.h | 61 + .../templates/kernel/cfg/cfg_lcd_32122a.h | 63 + .../templates/kernel/cfg/cfg_lcd_hd44.h | 55 + .../templates/kernel/cfg/cfg_lm75.h | 57 + .../stm32-p103/templates/kernel/cfg/cfg_md2.h | 54 + .../templates/kernel/cfg/cfg_monitor.h | 48 + .../templates/kernel/cfg/cfg_nmea.h | 85 + .../templates/kernel/cfg/cfg_parser.h | 46 + .../templates/kernel/cfg/cfg_phase.h | 56 + .../templates/kernel/cfg/cfg_pocketbus.h | 71 + .../templates/kernel/cfg/cfg_proc.h | 107 + .../stm32-p103/templates/kernel/cfg/cfg_pwm.h | 57 + .../templates/kernel/cfg/cfg_ramp.h | 116 + .../templates/kernel/cfg/cfg_randpool.h | 56 + .../stm32-p103/templates/kernel/cfg/cfg_sem.h | 48 + .../stm32-p103/templates/kernel/cfg/cfg_ser.h | 222 + .../templates/kernel/cfg/cfg_signal.h | 48 + .../templates/kernel/cfg/cfg_spi_bitbang.h | 52 + .../templates/kernel/cfg/cfg_stepper.h | 70 + .../templates/kernel/cfg/cfg_tas5706a.h | 51 + .../templates/kernel/cfg/cfg_thermo.h | 71 + .../templates/kernel/cfg/cfg_timer.h | 68 + .../stm32-p103/templates/kernel/cfg/cfg_wdt.h | 48 + .../templates/kernel/cfg/cfg_xmodem.h | 79 + .../stm32-p103/templates/kernel/kernel.mk | 93 + .../templates/kernel/kernel_user.mk | 43 + 2.5/boards/stm32-p103/templates/kernel/main.c | 104 + .../templates/kernel/project.bertos | 83 + 2.5/boards/triface/.image.png | Bin 0 -> 49658 bytes 2.5/boards/triface/.spec | 31 + 2.5/boards/triface/benchmark/.spec | 3 + .../triface/benchmark/context_switch/.spec | 15 + .../benchmark/context_switch/cfg/cfg_adc.h | 110 + .../benchmark/context_switch/cfg/cfg_afsk.h | 114 + .../benchmark/context_switch/cfg/cfg_ax25.h | 76 + .../benchmark/context_switch/cfg/cfg_battfs.h | 68 + .../context_switch/cfg/cfg_context_switch.h | 71 + .../context_switch/cfg/cfg_dataflash.h | 56 + .../context_switch/cfg/cfg_dc_motor.h | 111 + .../benchmark/context_switch/cfg/cfg_debug.h | 55 + .../benchmark/context_switch/cfg/cfg_fat.h | 140 + .../context_switch/cfg/cfg_flash25.h | 52 + .../context_switch/cfg/cfg_formatwr.h | 65 + .../benchmark/context_switch/cfg/cfg_gfx.h | 67 + .../context_switch/cfg/cfg_hashtable.h | 51 + .../benchmark/context_switch/cfg/cfg_heap.h | 51 + .../benchmark/context_switch/cfg/cfg_i2c.h | 90 + .../benchmark/context_switch/cfg/cfg_i2s.h | 75 + .../context_switch/cfg/cfg_ini_reader.h | 49 + .../benchmark/context_switch/cfg/cfg_kbd.h | 59 + .../benchmark/context_switch/cfg/cfg_keytag.h | 61 + .../benchmark/context_switch/cfg/cfg_kfile.h | 61 + .../context_switch/cfg/cfg_lcd_32122a.h | 63 + .../context_switch/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/context_switch/cfg/cfg_lm75.h | 57 + .../benchmark/context_switch/cfg/cfg_md2.h | 54 + .../benchmark/context_switch/cfg/cfg_menu.h | 67 + .../context_switch/cfg/cfg_monitor.h | 48 + .../benchmark/context_switch/cfg/cfg_nmea.h | 85 + .../benchmark/context_switch/cfg/cfg_parser.h | 46 + .../benchmark/context_switch/cfg/cfg_phase.h | 56 + .../context_switch/cfg/cfg_pocketbus.h | 71 + .../benchmark/context_switch/cfg/cfg_proc.h | 107 + .../benchmark/context_switch/cfg/cfg_pwm.h | 57 + .../benchmark/context_switch/cfg/cfg_ramp.h | 116 + .../context_switch/cfg/cfg_randpool.h | 56 + .../benchmark/context_switch/cfg/cfg_sem.h | 48 + .../benchmark/context_switch/cfg/cfg_ser.h | 222 + .../benchmark/context_switch/cfg/cfg_signal.h | 48 + .../context_switch/cfg/cfg_spi_bitbang.h | 52 + .../context_switch/cfg/cfg_stepper.h | 70 + .../context_switch/cfg/cfg_tas5706a.h | 51 + .../benchmark/context_switch/cfg/cfg_thermo.h | 71 + .../benchmark/context_switch/cfg/cfg_timer.h | 68 + .../benchmark/context_switch/cfg/cfg_wdt.h | 48 + .../benchmark/context_switch/cfg/cfg_xmodem.h | 79 + .../context_switch/context_switch.mk | 89 + .../context_switch/context_switch_user.mk | 44 + .../benchmark/context_switch/flash.log | 31 + .../triface/benchmark/context_switch/main.c | 55 + .../benchmark/context_switch/project.bertos | 81 + .../triface/benchmark/kernel_footprint/.spec | 14 + .../benchmark/kernel_footprint/cfg/cfg_adc.h | 110 + .../benchmark/kernel_footprint/cfg/cfg_afsk.h | 114 + .../benchmark/kernel_footprint/cfg/cfg_ax25.h | 76 + .../kernel_footprint/cfg/cfg_battfs.h | 68 + .../kernel_footprint/cfg/cfg_context_switch.h | 71 + .../kernel_footprint/cfg/cfg_dataflash.h | 56 + .../kernel_footprint/cfg/cfg_dc_motor.h | 111 + .../kernel_footprint/cfg/cfg_debug.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_fat.h | 140 + .../kernel_footprint/cfg/cfg_flash25.h | 52 + .../kernel_footprint/cfg/cfg_formatwr.h | 65 + .../benchmark/kernel_footprint/cfg/cfg_gfx.h | 67 + .../kernel_footprint/cfg/cfg_hashtable.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_heap.h | 51 + .../benchmark/kernel_footprint/cfg/cfg_i2c.h | 90 + .../benchmark/kernel_footprint/cfg/cfg_i2s.h | 75 + .../kernel_footprint/cfg/cfg_ini_reader.h | 49 + .../benchmark/kernel_footprint/cfg/cfg_kbd.h | 59 + .../kernel_footprint/cfg/cfg_keytag.h | 61 + .../kernel_footprint/cfg/cfg_kfile.h | 61 + .../kernel_footprint/cfg/cfg_lcd_32122a.h | 63 + .../kernel_footprint/cfg/cfg_lcd_hd44.h | 55 + .../benchmark/kernel_footprint/cfg/cfg_lm75.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_md2.h | 54 + .../benchmark/kernel_footprint/cfg/cfg_menu.h | 67 + .../kernel_footprint/cfg/cfg_monitor.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_nmea.h | 85 + .../kernel_footprint/cfg/cfg_parser.h | 46 + .../kernel_footprint/cfg/cfg_phase.h | 56 + .../kernel_footprint/cfg/cfg_pocketbus.h | 71 + .../benchmark/kernel_footprint/cfg/cfg_proc.h | 107 + .../benchmark/kernel_footprint/cfg/cfg_pwm.h | 57 + .../benchmark/kernel_footprint/cfg/cfg_ramp.h | 116 + .../kernel_footprint/cfg/cfg_randpool.h | 56 + .../benchmark/kernel_footprint/cfg/cfg_sem.h | 48 + .../benchmark/kernel_footprint/cfg/cfg_ser.h | 222 + .../kernel_footprint/cfg/cfg_signal.h | 48 + .../kernel_footprint/cfg/cfg_spi_bitbang.h | 52 + .../kernel_footprint/cfg/cfg_stepper.h | 70 + .../kernel_footprint/cfg/cfg_tas5706a.h | 51 + .../kernel_footprint/cfg/cfg_thermo.h | 71 + .../kernel_footprint/cfg/cfg_timer.h | 68 + .../benchmark/kernel_footprint/cfg/cfg_wdt.h | 48 + .../kernel_footprint/cfg/cfg_xmodem.h | 79 + .../kernel_footprint/kernel_footprint.mk | 88 + .../kernel_footprint/kernel_footprint_user.mk | 43 + .../triface/benchmark/kernel_footprint/main.c | 57 + .../benchmark/kernel_footprint/project.bertos | 83 + 2.5/boards/triface/examples/.spec | 3 + 2.5/boards/triface/examples/triface/.spec | 27 + .../triface/examples/triface/cfg/cfg_adc.h | 110 + .../triface/examples/triface/cfg/cfg_afsk.h | 114 + .../triface/examples/triface/cfg/cfg_ax25.h | 76 + .../triface/examples/triface/cfg/cfg_battfs.h | 68 + .../examples/triface/cfg/cfg_context_switch.h | 71 + .../examples/triface/cfg/cfg_dataflash.h | 56 + .../examples/triface/cfg/cfg_dc_motor.h | 111 + .../triface/examples/triface/cfg/cfg_debug.h | 53 + .../triface/examples/triface/cfg/cfg_fat.h | 140 + .../examples/triface/cfg/cfg_flash25.h | 52 + .../examples/triface/cfg/cfg_formatwr.h | 65 + .../triface/examples/triface/cfg/cfg_gfx.h | 67 + .../examples/triface/cfg/cfg_hashtable.h | 51 + .../triface/examples/triface/cfg/cfg_heap.h | 51 + .../triface/examples/triface/cfg/cfg_i2c.h | 90 + .../triface/examples/triface/cfg/cfg_i2s.h | 75 + .../examples/triface/cfg/cfg_ini_reader.h | 49 + .../triface/examples/triface/cfg/cfg_kbd.h | 59 + .../triface/examples/triface/cfg/cfg_keytag.h | 61 + .../triface/examples/triface/cfg/cfg_kfile.h | 61 + .../examples/triface/cfg/cfg_lcd_32122a.h | 63 + .../examples/triface/cfg/cfg_lcd_hd44.h | 55 + .../triface/examples/triface/cfg/cfg_lm75.h | 57 + .../triface/examples/triface/cfg/cfg_md2.h | 54 + .../triface/examples/triface/cfg/cfg_menu.h | 67 + .../examples/triface/cfg/cfg_monitor.h | 48 + .../triface/examples/triface/cfg/cfg_nmea.h | 85 + .../triface/examples/triface/cfg/cfg_parser.h | 46 + .../triface/examples/triface/cfg/cfg_phase.h | 56 + .../examples/triface/cfg/cfg_pocketbus.h | 71 + .../triface/examples/triface/cfg/cfg_proc.h | 108 + .../triface/examples/triface/cfg/cfg_pwm.h | 57 + .../triface/examples/triface/cfg/cfg_ramp.h | 116 + .../examples/triface/cfg/cfg_randpool.h | 56 + .../triface/examples/triface/cfg/cfg_sem.h | 48 + .../triface/examples/triface/cfg/cfg_ser.h | 222 + .../triface/examples/triface/cfg/cfg_signal.h | 48 + .../examples/triface/cfg/cfg_spi_bitbang.h | 52 + .../examples/triface/cfg/cfg_stepper.h | 70 + .../examples/triface/cfg/cfg_tas5706a.h | 51 + .../triface/examples/triface/cfg/cfg_thermo.h | 71 + .../triface/examples/triface/cfg/cfg_timer.h | 68 + .../triface/examples/triface/cfg/cfg_wdt.h | 48 + .../triface/examples/triface/cfg/cfg_xmodem.h | 79 + .../triface/examples/triface/cmd_ctor.h | 59 + 2.5/boards/triface/examples/triface/main.c | 116 + .../triface/examples/triface/project.bertos | 93 + .../triface/examples/triface/protocol.c | 383 + .../triface/examples/triface/protocol.h | 50 + .../triface/examples/triface/triface.mk | 108 + .../triface/examples/triface/triface_user.mk | 44 + 2.5/boards/triface/hw/hw_afsk.c | 41 + 2.5/boards/triface/hw/hw_afsk.h | 87 + 2.5/boards/triface/hw/hw_buzzer.h | 53 + 2.5/boards/triface/hw/hw_dataflash.c | 126 + 2.5/boards/triface/hw/hw_dataflash.h | 48 + 2.5/boards/triface/hw/hw_dc_motor.h | 71 + 2.5/boards/triface/hw/hw_ft245rl.h | 65 + 2.5/boards/triface/hw/hw_i2c_bitbang.h | 66 + 2.5/boards/triface/hw/hw_input.h | 76 + 2.5/boards/triface/hw/hw_kbd.h | 72 + 2.5/boards/triface/hw/hw_lcd_32122a.h | 155 + 2.5/boards/triface/hw/hw_lcd_hd44.h | 157 + 2.5/boards/triface/hw/hw_led.h | 47 + 2.5/boards/triface/hw/hw_lm75.h | 49 + 2.5/boards/triface/hw/hw_mcp41.c | 53 + 2.5/boards/triface/hw/hw_mcp41.h | 75 + 2.5/boards/triface/hw/hw_ntc.c | 46 + 2.5/boards/triface/hw/hw_ntc.h | 136 + 2.5/boards/triface/hw/hw_phase.c | 46 + 2.5/boards/triface/hw/hw_phase.h | 80 + 2.5/boards/triface/hw/hw_rit128x96.h | 78 + 2.5/boards/triface/hw/hw_sd.h | 53 + 2.5/boards/triface/hw/hw_ser.h | 53 + 2.5/boards/triface/hw/hw_sipo.h | 149 + 2.5/boards/triface/hw/hw_spi.h | 115 + 2.5/boards/triface/hw/hw_stepper.h | 309 + 2.5/boards/triface/hw/hw_tas5706a.h | 65 + 2.5/boards/triface/hw/hw_thermo.h | 121 + 2.5/boards/triface/hw/hw_tlv5618.h | 69 + 2.5/boards/triface/hw/hw_tmp123.h | 52 + 2.5/boards/triface/hw/kbd_map.h | 71 + 2.5/boards/triface/hw/mcp41_map.h | 59 + 2.5/boards/triface/hw/ntc_map.h | 61 + 2.5/boards/triface/hw/phase_map.h | 58 + 2.5/boards/triface/hw/pwm_map.h | 61 + 2.5/boards/triface/hw/thermo_map.h | 56 + 2.5/boards/triface/templates/.spec | 3 + 2.5/boards/triface/templates/empty/.spec | 8 + .../triface/templates/empty/cfg/cfg_adc.h | 110 + .../triface/templates/empty/cfg/cfg_afsk.h | 113 + .../triface/templates/empty/cfg/cfg_ax25.h | 76 + .../triface/templates/empty/cfg/cfg_battfs.h | 68 + .../templates/empty/cfg/cfg_context_switch.h | 71 + .../templates/empty/cfg/cfg_dataflash.h | 56 + .../templates/empty/cfg/cfg_dc_motor.h | 111 + .../triface/templates/empty/cfg/cfg_debug.h | 55 + .../triface/templates/empty/cfg/cfg_fat.h | 140 + .../triface/templates/empty/cfg/cfg_flash25.h | 52 + .../templates/empty/cfg/cfg_formatwr.h | 65 + .../triface/templates/empty/cfg/cfg_gfx.h | 67 + .../templates/empty/cfg/cfg_hashtable.h | 51 + .../triface/templates/empty/cfg/cfg_heap.h | 51 + .../triface/templates/empty/cfg/cfg_i2c.h | 88 + .../triface/templates/empty/cfg/cfg_i2s.h | 75 + .../templates/empty/cfg/cfg_ini_reader.h | 49 + .../triface/templates/empty/cfg/cfg_kbd.h | 59 + .../triface/templates/empty/cfg/cfg_keytag.h | 61 + .../triface/templates/empty/cfg/cfg_kfile.h | 61 + .../templates/empty/cfg/cfg_lcd_32122a.h | 63 + .../templates/empty/cfg/cfg_lcd_hd44.h | 55 + .../triface/templates/empty/cfg/cfg_lm75.h | 57 + .../triface/templates/empty/cfg/cfg_md2.h | 54 + .../triface/templates/empty/cfg/cfg_monitor.h | 48 + .../triface/templates/empty/cfg/cfg_nmea.h | 85 + .../triface/templates/empty/cfg/cfg_parser.h | 46 + .../triface/templates/empty/cfg/cfg_phase.h | 56 + .../templates/empty/cfg/cfg_pocketbus.h | 71 + .../triface/templates/empty/cfg/cfg_proc.h | 107 + .../triface/templates/empty/cfg/cfg_pwm.h | 57 + .../triface/templates/empty/cfg/cfg_ramp.h | 116 + .../templates/empty/cfg/cfg_randpool.h | 56 + .../triface/templates/empty/cfg/cfg_sem.h | 48 + .../triface/templates/empty/cfg/cfg_ser.h | 222 + .../triface/templates/empty/cfg/cfg_signal.h | 48 + .../templates/empty/cfg/cfg_spi_bitbang.h | 52 + .../triface/templates/empty/cfg/cfg_stepper.h | 70 + .../templates/empty/cfg/cfg_tas5706a.h | 51 + .../triface/templates/empty/cfg/cfg_thermo.h | 71 + .../triface/templates/empty/cfg/cfg_timer.h | 68 + .../triface/templates/empty/cfg/cfg_wdt.h | 48 + .../triface/templates/empty/cfg/cfg_xmodem.h | 79 + 2.5/boards/triface/templates/empty/empty.mk | 89 + .../triface/templates/empty/empty_user.mk | 43 + 2.5/boards/triface/templates/empty/main.c | 78 + .../triface/templates/empty/project.bertos | 77 + 2.5/boards/triface/templates/kernel/.spec | 9 + .../triface/templates/kernel/cfg/cfg_adc.h | 110 + .../triface/templates/kernel/cfg/cfg_afsk.h | 113 + .../triface/templates/kernel/cfg/cfg_ax25.h | 76 + .../triface/templates/kernel/cfg/cfg_battfs.h | 68 + .../templates/kernel/cfg/cfg_context_switch.h | 71 + .../templates/kernel/cfg/cfg_dataflash.h | 56 + .../templates/kernel/cfg/cfg_dc_motor.h | 111 + .../triface/templates/kernel/cfg/cfg_debug.h | 55 + .../triface/templates/kernel/cfg/cfg_fat.h | 140 + .../templates/kernel/cfg/cfg_flash25.h | 52 + .../templates/kernel/cfg/cfg_formatwr.h | 65 + .../triface/templates/kernel/cfg/cfg_gfx.h | 67 + .../templates/kernel/cfg/cfg_hashtable.h | 51 + .../triface/templates/kernel/cfg/cfg_heap.h | 51 + .../triface/templates/kernel/cfg/cfg_i2c.h | 88 + .../triface/templates/kernel/cfg/cfg_i2s.h | 75 + .../templates/kernel/cfg/cfg_ini_reader.h | 49 + .../triface/templates/kernel/cfg/cfg_kbd.h | 59 + .../triface/templates/kernel/cfg/cfg_keytag.h | 61 + .../triface/templates/kernel/cfg/cfg_kfile.h | 61 + .../templates/kernel/cfg/cfg_lcd_32122a.h | 63 + .../templates/kernel/cfg/cfg_lcd_hd44.h | 55 + .../triface/templates/kernel/cfg/cfg_lm75.h | 57 + .../triface/templates/kernel/cfg/cfg_md2.h | 54 + .../templates/kernel/cfg/cfg_monitor.h | 48 + .../triface/templates/kernel/cfg/cfg_nmea.h | 85 + .../triface/templates/kernel/cfg/cfg_parser.h | 46 + .../triface/templates/kernel/cfg/cfg_phase.h | 56 + .../templates/kernel/cfg/cfg_pocketbus.h | 71 + .../triface/templates/kernel/cfg/cfg_proc.h | 107 + .../triface/templates/kernel/cfg/cfg_pwm.h | 57 + .../triface/templates/kernel/cfg/cfg_ramp.h | 116 + .../templates/kernel/cfg/cfg_randpool.h | 56 + .../triface/templates/kernel/cfg/cfg_sem.h | 48 + .../triface/templates/kernel/cfg/cfg_ser.h | 222 + .../triface/templates/kernel/cfg/cfg_signal.h | 48 + .../templates/kernel/cfg/cfg_spi_bitbang.h | 52 + .../templates/kernel/cfg/cfg_stepper.h | 70 + .../templates/kernel/cfg/cfg_tas5706a.h | 51 + .../triface/templates/kernel/cfg/cfg_thermo.h | 71 + .../triface/templates/kernel/cfg/cfg_timer.h | 68 + .../triface/templates/kernel/cfg/cfg_wdt.h | 48 + .../triface/templates/kernel/cfg/cfg_xmodem.h | 79 + 2.5/boards/triface/templates/kernel/kernel.mk | 90 + .../triface/templates/kernel/kernel_user.mk | 43 + 2.5/boards/triface/templates/kernel/main.c | 112 + .../triface/templates/kernel/project.bertos | 85 + 2.5/doc/Mainpage.online | 100 + 2.5/doc/Mainpage.snapshot | 103 + 2.5/doc/README.bertos | 102 + 2.5/doc/STATUS | 321 + 2.5/doc/TracFooter.html | 2 + 2.5/doc/TracHeader.html | 2 + 2.5/doc/chm-builder.py | 40 + 2.5/doc/chm-toc-modifier.py | 44 + 2.5/doc/doxygen.css | 358 + 2.5/doc/tag-filter.py | 19 + 2.5/examples/demo/cfg/cfg_gfx.h | 67 + 2.5/examples/demo/cfg/cfg_kbd.h | 59 + 2.5/examples/demo/cfg/cfg_menu.h | 67 + 2.5/examples/demo/cfg/cfg_monitor.h | 48 + 2.5/examples/demo/cfg/cfg_proc.h | 108 + 2.5/examples/demo/cfg/cfg_sem.h | 48 + 2.5/examples/demo/cfg/cfg_signal.h | 48 + 2.5/examples/demo/cfg/cfg_timer.h | 68 + 2.5/examples/demo/demo.c | 317 + 2.5/examples/demo/demo.mk | 90 + 2.5/examples/demo/hw/hw_kbd.h | 68 + 2.5/examples/demo/hw/kbd_map.h | 67 + 2.5/examples/demo/verstag.h | 95 + 2.5/examples/lm3s8962/cfg/cfg_debug.h | 53 + 2.5/examples/lm3s8962/cfg/cfg_gfx.h | 74 + 2.5/examples/lm3s8962/cfg/cfg_heap.h | 49 + 2.5/examples/lm3s8962/cfg/cfg_kfile.h | 62 + 2.5/examples/lm3s8962/cfg/cfg_lcd.h | 68 + 2.5/examples/lm3s8962/cfg/cfg_monitor.h | 47 + 2.5/examples/lm3s8962/cfg/cfg_proc.h | 107 + 2.5/examples/lm3s8962/cfg/cfg_sem.h | 47 + 2.5/examples/lm3s8962/cfg/cfg_ser.h | 222 + 2.5/examples/lm3s8962/cfg/cfg_signal.h | 47 + 2.5/examples/lm3s8962/cfg/cfg_timer.h | 66 + 2.5/examples/lm3s8962/hw/hw_kbd.h | 78 + 2.5/examples/lm3s8962/hw/hw_rit128x96.h | 115 + 2.5/examples/lm3s8962/hw/kbd_map.h | 65 + 2.5/examples/lm3s8962/lm3s8962.c | 366 + 2.5/examples/lm3s8962/lm3s8962.mk | 79 + 2.5/examples/randpool/randpool_demo.c | 251 + 2.5/examples/randpool/randpool_demo.mk | 39 + 2.5/examples/test/armtest.mk | 32 + 2.5/examples/test/avrtest.mk | 32 + 2.5/examples/test/empty_main.c | 47 + 2.5/spec/at91sam7s-ek/at91sam7s-ek.bdef | 48 + 2.5/test/afsk_test.au | Bin 0 -> 167000 bytes 2.5/test/enablecfg.py | 87 + 2.5/test/gen_mk_src.sh | 60 + 2.5/test/get_source_list.sh | 95 + 2.5/test/ini_reader_file.ini | 16 + 2.5/test/log_nightly_test.sh | 83 + 2.5/test/nightly_test.sh | 90 + 2.5/test/parselog.py | 47 + 2.5/test/parsetest.py | 47 + 2.5/test/run_tests.sh | 109 + 2.5/wizard/BBoardPage.py | 146 + 2.5/wizard/BCpuPage.py | 186 + 2.5/wizard/BCreationPage.py | 130 + 2.5/wizard/BEditingDialog.py | 249 + 2.5/wizard/BFinalPage.py | 120 + 2.5/wizard/BFolderPage.py | 167 + 2.5/wizard/BIntroPage.py | 63 + 2.5/wizard/BModulePage.py | 594 + 2.5/wizard/BOpenPage.py | 72 + 2.5/wizard/BProject.py | 635 + 2.5/wizard/BProjectPresets.py | 218 + 2.5/wizard/BStartPage.py | 74 + 2.5/wizard/BToolchainPage.py | 281 + 2.5/wizard/BToolchainSearch.py | 134 + 2.5/wizard/BVersionPage.py | 259 + 2.5/wizard/BWizard.py | 99 + 2.5/wizard/BWizardPage.py | 211 + 2.5/wizard/DefineException.py | 68 + 2.5/wizard/LoadException.py | 42 + 2.5/wizard/_wizard_version.py | 50 + 2.5/wizard/bertos.py | 135 + 2.5/wizard/bertos.qrc | 18 + 2.5/wizard/bertos_utils.py | 666 + 2.5/wizard/build_resources.sh | 36 + 2.5/wizard/cltemplates/bertos.project | 66 + 2.5/wizard/cltemplates/bertos.workspace | 12 + 2.5/wizard/compatibility.py | 102 + 2.5/wizard/const.py | 112 + 2.5/wizard/copytree.py | 84 + 2.5/wizard/create_preset.py | 160 + 2.5/wizard/exception_handler.py | 69 + 2.5/wizard/images/appicon.png | Bin 0 -> 908 bytes 2.5/wizard/images/default_board_icon.png | Bin 0 -> 18806 bytes 2.5/wizard/images/default_board_image.png | Bin 0 -> 16069 bytes 2.5/wizard/images/default_dir_icon.png | Bin 0 -> 2424 bytes 2.5/wizard/images/default_project_icon.png | Bin 0 -> 16196 bytes 2.5/wizard/images/error.png | Bin 0 -> 9176 bytes 2.5/wizard/images/filenew.png | Bin 0 -> 9425 bytes 2.5/wizard/images/fileopen.png | Bin 0 -> 5956 bytes 2.5/wizard/images/folderopen.png | Bin 0 -> 3172 bytes 2.5/wizard/images/listadd.png | Bin 0 -> 11073 bytes 2.5/wizard/images/listremove.png | Bin 0 -> 5301 bytes 2.5/wizard/images/logo.png | Bin 0 -> 2872664 bytes 2.5/wizard/images/ok.png | Bin 0 -> 8854 bytes 2.5/wizard/images/warning.png | Bin 0 -> 8249 bytes 2.5/wizard/mktemplates/Makefile | 17 + 2.5/wizard/mktemplates/old/Makefile | 17 + 2.5/wizard/mktemplates/old/template.mk | 51 + 2.5/wizard/mktemplates/old/template_wiz.mk | 71 + 2.5/wizard/mktemplates/template.mk | 72 + 2.5/wizard/mktemplates/template_user.mk | 43 + 2.5/wizard/plugins/__init__.py | 39 + 2.5/wizard/plugins/codelite.py | 120 + 2.5/wizard/qvariant_converter.py | 48 + 2.5/wizard/qvariant_converter_4_4.py | 92 + 2.5/wizard/qvariant_converter_4_5.py | 105 + 2.5/wizard/qvariant_converter_4_6.py | 103 + 2.5/wizard/qvariant_converter_old.py | 108 + 2.5/wizard/relpath.py | 89 + 2.5/wizard/srctemplates/main.c | 20 + 2.5/wizard/test/testCpuTagsImport.py | 56 + 2.5/wizard/test/testLoadProjectPresets.py | 53 + 2.5/wizard/test/testModulePage.py | 63 + 2.5/wizard/toolchain_manager.py | 134 + 2.5/wizard/toolchain_validation.py | 62 + 2.5/wizard/ui/bertos_versions.ui | 137 + 2.5/wizard/ui/board_select.ui | 72 + 2.5/wizard/ui/cpu_select.ui | 119 + 2.5/wizard/ui/dir_select.ui | 175 + 2.5/wizard/ui/final_page.ui | 87 + 2.5/wizard/ui/intro_page.ui | 100 + 2.5/wizard/ui/module_select.ui | 133 + 2.5/wizard/ui/preset_page.ui | 55 + 2.5/wizard/ui/project_creation.ui | 33 + 2.5/wizard/ui/project_presets.ui | 28 + 2.5/wizard/ui/project_select.ui | 72 + 2.5/wizard/ui/start.ui | 131 + 2.5/wizard/ui/toolchain_search.ui | 149 + 2.5/wizard/ui/toolchain_select.ui | 135 + 2.5/wizard/vtemplates/VERSION | 1 + 2.5/wizard/winreg_importer.py | 87 + 2610 files changed, 326089 insertions(+) create mode 100644 2.5/.gdbinit create mode 100644 2.5/Doxyfile create mode 100644 2.5/Doxyfile-common create mode 100644 2.5/Doxyfile-offline create mode 100644 2.5/Doxyfile-snapshot create mode 100644 2.5/LICENSE.GPL create mode 100644 2.5/Makefile create mode 100644 2.5/Makefile.test create mode 100644 2.5/VERSION create mode 100644 2.5/bertos/algo/crc.c create mode 100644 2.5/bertos/algo/crc.h create mode 100644 2.5/bertos/algo/crc_ccitt.c create mode 100644 2.5/bertos/algo/crc_ccitt.h create mode 100644 2.5/bertos/algo/crc_test.c create mode 100644 2.5/bertos/algo/md2.c create mode 100644 2.5/bertos/algo/md2.h create mode 100644 2.5/bertos/algo/mean.h create mode 100644 2.5/bertos/algo/pid_control.c create mode 100644 2.5/bertos/algo/pid_control.h create mode 100644 2.5/bertos/algo/ramp.c create mode 100644 2.5/bertos/algo/ramp.h create mode 100644 2.5/bertos/algo/ramp_test.c create mode 100644 2.5/bertos/algo/rand.c create mode 100644 2.5/bertos/algo/rand.h create mode 100644 2.5/bertos/algo/randpool.c create mode 100644 2.5/bertos/algo/randpool.h create mode 100644 2.5/bertos/algo/reverse_test.c create mode 100644 2.5/bertos/algo/rle.c create mode 100644 2.5/bertos/algo/rle.h create mode 100644 2.5/bertos/algo/rotating_hash.h create mode 100644 2.5/bertos/algo/tea.c create mode 100644 2.5/bertos/algo/tea.h create mode 100644 2.5/bertos/benchmark/context_switch.c create mode 100644 2.5/bertos/benchmark/context_switch.h create mode 100644 2.5/bertos/benchmark/kernel_footprint.c create mode 100644 2.5/bertos/benchmark/kernel_footprint.h create mode 100644 2.5/bertos/cfg/cfg_adc.h create mode 100644 2.5/bertos/cfg/cfg_afsk.h create mode 100644 2.5/bertos/cfg/cfg_arch.h create mode 100644 2.5/bertos/cfg/cfg_attr.h create mode 100644 2.5/bertos/cfg/cfg_ax25.h create mode 100644 2.5/bertos/cfg/cfg_battfs.h create mode 100644 2.5/bertos/cfg/cfg_boot.h create mode 100644 2.5/bertos/cfg/cfg_buzzerled.h create mode 100644 2.5/bertos/cfg/cfg_context_switch.h create mode 100644 2.5/bertos/cfg/cfg_dataflash.h create mode 100644 2.5/bertos/cfg/cfg_dc_motor.h create mode 100644 2.5/bertos/cfg/cfg_debug.h create mode 100644 2.5/bertos/cfg/cfg_fat.h create mode 100644 2.5/bertos/cfg/cfg_flash25.h create mode 100644 2.5/bertos/cfg/cfg_flash_at91.h create mode 100644 2.5/bertos/cfg/cfg_flash_avr.h create mode 100644 2.5/bertos/cfg/cfg_formatwr.h create mode 100644 2.5/bertos/cfg/cfg_gfx.h create mode 100644 2.5/bertos/cfg/cfg_hashtable.h create mode 100644 2.5/bertos/cfg/cfg_heap.h create mode 100644 2.5/bertos/cfg/cfg_i2c.h create mode 100644 2.5/bertos/cfg/cfg_i2s.h create mode 100644 2.5/bertos/cfg/cfg_ini_reader.h create mode 100644 2.5/bertos/cfg/cfg_kbd.h create mode 100644 2.5/bertos/cfg/cfg_kern.h create mode 100644 2.5/bertos/cfg/cfg_keytag.h create mode 100644 2.5/bertos/cfg/cfg_kfile.h create mode 100644 2.5/bertos/cfg/cfg_lcd_32122a.h create mode 100644 2.5/bertos/cfg/cfg_lcd_hd44.h create mode 100644 2.5/bertos/cfg/cfg_lm75.h create mode 100644 2.5/bertos/cfg/cfg_md2.h create mode 100644 2.5/bertos/cfg/cfg_menu.h create mode 100644 2.5/bertos/cfg/cfg_monitor.h create mode 100644 2.5/bertos/cfg/cfg_nmea.h create mode 100644 2.5/bertos/cfg/cfg_ntc.h create mode 100644 2.5/bertos/cfg/cfg_parser.h create mode 100644 2.5/bertos/cfg/cfg_phase.h create mode 100644 2.5/bertos/cfg/cfg_pid.h create mode 100644 2.5/bertos/cfg/cfg_pocketbus.h create mode 100644 2.5/bertos/cfg/cfg_proc.h create mode 100644 2.5/bertos/cfg/cfg_pwm.h create mode 100644 2.5/bertos/cfg/cfg_ramp.h create mode 100644 2.5/bertos/cfg/cfg_randpool.h create mode 100644 2.5/bertos/cfg/cfg_sem.h create mode 100644 2.5/bertos/cfg/cfg_ser.h create mode 100644 2.5/bertos/cfg/cfg_signal.h create mode 100644 2.5/bertos/cfg/cfg_spi_bitbang.h create mode 100644 2.5/bertos/cfg/cfg_spi_dma.h create mode 100644 2.5/bertos/cfg/cfg_stepper.h create mode 100644 2.5/bertos/cfg/cfg_tas5706a.h create mode 100644 2.5/bertos/cfg/cfg_thermo.h create mode 100644 2.5/bertos/cfg/cfg_timer.h create mode 100644 2.5/bertos/cfg/cfg_wdt.h create mode 100644 2.5/bertos/cfg/cfg_xmodem.h create mode 100644 2.5/bertos/cfg/compiler.h create mode 100644 2.5/bertos/cfg/debug.h create mode 100644 2.5/bertos/cfg/depend.h create mode 100644 2.5/bertos/cfg/kfile_debug.c create mode 100644 2.5/bertos/cfg/kfile_debug.h create mode 100644 2.5/bertos/cfg/log.h create mode 100644 2.5/bertos/cfg/macros.h create mode 100644 2.5/bertos/cfg/module.h create mode 100644 2.5/bertos/cfg/os.h create mode 100644 2.5/bertos/cfg/test.h create mode 100644 2.5/bertos/config.mk create mode 100644 2.5/bertos/cpu/arm/drv/adc_arm.c create mode 100644 2.5/bertos/cpu/arm/drv/adc_arm.h create mode 100644 2.5/bertos/cpu/arm/drv/adc_at91.c create mode 100644 2.5/bertos/cpu/arm/drv/adc_at91.h create mode 100644 2.5/bertos/cpu/arm/drv/flash_arm.h create mode 100644 2.5/bertos/cpu/arm/drv/flash_at91.c create mode 100644 2.5/bertos/cpu/arm/drv/flash_at91.h create mode 100644 2.5/bertos/cpu/arm/drv/i2s_at91.c create mode 100644 2.5/bertos/cpu/arm/drv/i2s_at91.h create mode 100644 2.5/bertos/cpu/arm/drv/kdebug_arm.c create mode 100644 2.5/bertos/cpu/arm/drv/kdebug_at91.c create mode 100644 2.5/bertos/cpu/arm/drv/kdebug_at91.h create mode 100644 2.5/bertos/cpu/arm/drv/kdebug_lpc2.c create mode 100644 2.5/bertos/cpu/arm/drv/pwm_arm.c create mode 100644 2.5/bertos/cpu/arm/drv/pwm_arm.h create mode 100644 2.5/bertos/cpu/arm/drv/pwm_at91.c create mode 100644 2.5/bertos/cpu/arm/drv/pwm_at91.h create mode 100644 2.5/bertos/cpu/arm/drv/ser_arm.c create mode 100644 2.5/bertos/cpu/arm/drv/ser_arm.h create mode 100644 2.5/bertos/cpu/arm/drv/ser_at91.c create mode 100644 2.5/bertos/cpu/arm/drv/ser_at91.h create mode 100644 2.5/bertos/cpu/arm/drv/ser_lpc2.c create mode 100644 2.5/bertos/cpu/arm/drv/ser_lpc2.h create mode 100644 2.5/bertos/cpu/arm/drv/spi_dma_at91.c create mode 100644 2.5/bertos/cpu/arm/drv/spi_dma_at91.h create mode 100644 2.5/bertos/cpu/arm/drv/stepper_arm.c create mode 100644 2.5/bertos/cpu/arm/drv/stepper_arm.h create mode 100644 2.5/bertos/cpu/arm/drv/stepper_at91.c create mode 100644 2.5/bertos/cpu/arm/drv/stepper_at91.h create mode 100644 2.5/bertos/cpu/arm/drv/stepper_at91_hwtest.c create mode 100644 2.5/bertos/cpu/arm/drv/sysirq_at91.c create mode 100644 2.5/bertos/cpu/arm/drv/sysirq_at91.h create mode 100644 2.5/bertos/cpu/arm/drv/timer_arm.c create mode 100644 2.5/bertos/cpu/arm/drv/timer_arm.h create mode 100644 2.5/bertos/cpu/arm/drv/timer_at91.c create mode 100644 2.5/bertos/cpu/arm/drv/timer_at91.h create mode 100644 2.5/bertos/cpu/arm/drv/timer_lpc2.c create mode 100644 2.5/bertos/cpu/arm/drv/timer_lpc2.h create mode 100644 2.5/bertos/cpu/arm/drv/twi_arm.c create mode 100644 2.5/bertos/cpu/arm/drv/twi_arm.h create mode 100644 2.5/bertos/cpu/arm/drv/twi_at91.c create mode 100644 2.5/bertos/cpu/arm/drv/twi_at91.h create mode 100644 2.5/bertos/cpu/arm/drv/vic_lpc2.c create mode 100644 2.5/bertos/cpu/arm/drv/vic_lpc2.h create mode 100644 2.5/bertos/cpu/arm/drv/wdt_arm.h create mode 100644 2.5/bertos/cpu/arm/hw/crt_arm7tdmi.S create mode 100644 2.5/bertos/cpu/arm/hw/crtat91sam7_rom.S create mode 100644 2.5/bertos/cpu/arm/hw/init_at91.c create mode 100644 2.5/bertos/cpu/arm/hw/init_lpc2.c create mode 100644 2.5/bertos/cpu/arm/hw/pll_at91.h create mode 100644 2.5/bertos/cpu/arm/hw/switch_arm.S create mode 100644 2.5/bertos/cpu/arm/hw/switch_ctx_arm.S create mode 100644 2.5/bertos/cpu/arm/hw/vectors_at91.S create mode 100644 2.5/bertos/cpu/arm/hw/vectors_lpc2.S create mode 100644 2.5/bertos/cpu/arm/info/AT91SAM7S128.cdef create mode 100644 2.5/bertos/cpu/arm/info/AT91SAM7S256.cdef create mode 100644 2.5/bertos/cpu/arm/info/AT91SAM7S512.cdef create mode 100644 2.5/bertos/cpu/arm/info/AT91SAM7S64.cdef create mode 100644 2.5/bertos/cpu/arm/info/AT91SAM7X128.cdef create mode 100644 2.5/bertos/cpu/arm/info/AT91SAM7X256.cdef create mode 100644 2.5/bertos/cpu/arm/info/AT91SAM7X512.cdef create mode 100644 2.5/bertos/cpu/arm/info/LPC2378.cdef create mode 100644 2.5/bertos/cpu/arm/info/at91sam7.common create mode 100644 2.5/bertos/cpu/arm/info/lpc2.common create mode 100644 2.5/bertos/cpu/arm/io/arm.h create mode 100644 2.5/bertos/cpu/arm/io/at91.h create mode 100644 2.5/bertos/cpu/arm/io/at91_adc.h create mode 100644 2.5/bertos/cpu/arm/io/at91_aic.h create mode 100644 2.5/bertos/cpu/arm/io/at91_dbgu.h create mode 100644 2.5/bertos/cpu/arm/io/at91_mc.h create mode 100644 2.5/bertos/cpu/arm/io/at91_pio.h create mode 100644 2.5/bertos/cpu/arm/io/at91_pit.h create mode 100644 2.5/bertos/cpu/arm/io/at91_pmc.h create mode 100644 2.5/bertos/cpu/arm/io/at91_pwm.h create mode 100644 2.5/bertos/cpu/arm/io/at91_rstc.h create mode 100644 2.5/bertos/cpu/arm/io/at91_spi.h create mode 100644 2.5/bertos/cpu/arm/io/at91_ssc.h create mode 100644 2.5/bertos/cpu/arm/io/at91_tc.h create mode 100644 2.5/bertos/cpu/arm/io/at91_twi.h create mode 100644 2.5/bertos/cpu/arm/io/at91_us.h create mode 100644 2.5/bertos/cpu/arm/io/at91_wdt.h create mode 100644 2.5/bertos/cpu/arm/io/at91sam7.h create mode 100644 2.5/bertos/cpu/arm/io/lpc23xx.h create mode 100644 2.5/bertos/cpu/arm/scripts/arm7tdmi_ram.ld create mode 100644 2.5/bertos/cpu/arm/scripts/arm7tdmi_rom.ld create mode 100644 2.5/bertos/cpu/arm/scripts/at91sam7_128_ram.ld create mode 100644 2.5/bertos/cpu/arm/scripts/at91sam7_128_rom.ld create mode 100644 2.5/bertos/cpu/arm/scripts/at91sam7_256_ram.ld create mode 100644 2.5/bertos/cpu/arm/scripts/at91sam7_256_rom.ld create mode 100644 2.5/bertos/cpu/arm/scripts/at91sam7_512_ram.ld create mode 100644 2.5/bertos/cpu/arm/scripts/at91sam7_512_rom.ld create mode 100644 2.5/bertos/cpu/arm/scripts/at91sam7_64_ram.ld create mode 100644 2.5/bertos/cpu/arm/scripts/at91sam7_64_rom.ld create mode 100644 2.5/bertos/cpu/arm/scripts/lpc2378.ld create mode 100644 2.5/bertos/cpu/attr.h create mode 100644 2.5/bertos/cpu/avr/drv/adc_avr.c create mode 100644 2.5/bertos/cpu/avr/drv/adc_avr.h create mode 100644 2.5/bertos/cpu/avr/drv/flash_avr.c create mode 100644 2.5/bertos/cpu/avr/drv/flash_avr.h create mode 100644 2.5/bertos/cpu/avr/drv/i2c_avr.c create mode 100644 2.5/bertos/cpu/avr/drv/kdebug_avr.c create mode 100644 2.5/bertos/cpu/avr/drv/pwm_avr.c create mode 100644 2.5/bertos/cpu/avr/drv/pwm_avr.h create mode 100644 2.5/bertos/cpu/avr/drv/ser_avr.c create mode 100644 2.5/bertos/cpu/avr/drv/ser_avr.h create mode 100644 2.5/bertos/cpu/avr/drv/ser_simple_avr.c create mode 100644 2.5/bertos/cpu/avr/drv/ser_simple_avr.h create mode 100644 2.5/bertos/cpu/avr/drv/stepper_avr.c create mode 100644 2.5/bertos/cpu/avr/drv/stepper_avr.h create mode 100644 2.5/bertos/cpu/avr/drv/timer_avr.c create mode 100644 2.5/bertos/cpu/avr/drv/timer_avr.h create mode 100644 2.5/bertos/cpu/avr/drv/timer_simple_avr.c create mode 100644 2.5/bertos/cpu/avr/drv/timer_simple_avr.h create mode 100644 2.5/bertos/cpu/avr/drv/wdt_avr.h create mode 100644 2.5/bertos/cpu/avr/hw/switch_avr.S create mode 100644 2.5/bertos/cpu/avr/hw/switch_ctx_avr.S create mode 100644 2.5/bertos/cpu/avr/info/ATmega103.cdef create mode 100644 2.5/bertos/cpu/avr/info/ATmega128.cdef create mode 100644 2.5/bertos/cpu/avr/info/ATmega1281.cdef create mode 100644 2.5/bertos/cpu/avr/info/ATmega168.cdef create mode 100644 2.5/bertos/cpu/avr/info/ATmega32.cdef create mode 100644 2.5/bertos/cpu/avr/info/ATmega328P.cdef create mode 100644 2.5/bertos/cpu/avr/info/ATmega64.cdef create mode 100644 2.5/bertos/cpu/avr/info/ATmega8.cdef create mode 100644 2.5/bertos/cpu/avr/info/avr.common create mode 100644 2.5/bertos/cpu/avr/info/avr_post.common create mode 100644 2.5/bertos/cpu/byteorder.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/clock_lm3s.c create mode 100644 2.5/bertos/cpu/cortex-m3/drv/clock_lm3s.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/clock_stm32.c create mode 100644 2.5/bertos/cpu/cortex-m3/drv/clock_stm32.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/flash_cm3.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/flash_lm3s.c create mode 100644 2.5/bertos/cpu/cortex-m3/drv/flash_lm3s.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/gpio_lm3s.c create mode 100644 2.5/bertos/cpu/cortex-m3/drv/gpio_lm3s.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/gpio_stm32.c create mode 100644 2.5/bertos/cpu/cortex-m3/drv/gpio_stm32.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/irq_cm3.c create mode 100644 2.5/bertos/cpu/cortex-m3/drv/irq_cm3.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/kdebug_cm3.c create mode 100644 2.5/bertos/cpu/cortex-m3/drv/kdebug_lm3s.c create mode 100644 2.5/bertos/cpu/cortex-m3/drv/kdebug_lm3s.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/kdebug_stm32.c create mode 100644 2.5/bertos/cpu/cortex-m3/drv/kdebug_stm32.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/ser_cm3.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/ser_lm3s.c create mode 100644 2.5/bertos/cpu/cortex-m3/drv/ser_lm3s.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/ssi_lm3s.c create mode 100644 2.5/bertos/cpu/cortex-m3/drv/ssi_lm3s.h create mode 100644 2.5/bertos/cpu/cortex-m3/drv/timer_cm3.c create mode 100644 2.5/bertos/cpu/cortex-m3/drv/timer_cm3.h create mode 100644 2.5/bertos/cpu/cortex-m3/hw/crt_cm3.S create mode 100644 2.5/bertos/cpu/cortex-m3/hw/init_cm3.c create mode 100644 2.5/bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c create mode 100644 2.5/bertos/cpu/cortex-m3/hw/switch_ctx_cm3.h create mode 100644 2.5/bertos/cpu/cortex-m3/hw/vectors_cm3.S create mode 100644 2.5/bertos/cpu/cortex-m3/info/LM3S1968.cdef create mode 100644 2.5/bertos/cpu/cortex-m3/info/LM3S8962.cdef create mode 100644 2.5/bertos/cpu/cortex-m3/info/STM32F103RB.cdef create mode 100644 2.5/bertos/cpu/cortex-m3/info/cm3.common create mode 100644 2.5/bertos/cpu/cortex-m3/io/cm3_types.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/lm3s.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/lm3s1968.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/lm3s_gpio.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/lm3s_ints.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/lm3s_memmap.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/lm3s_nvic.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/lm3s_pwm.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/lm3s_ssi.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/lm3s_sysctl.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/lm3s_types.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/lm3s_uart.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/stm32.h create mode 100644 2.5/bertos/cpu/cortex-m3/io/stm32_memmap.h create mode 100644 2.5/bertos/cpu/cortex-m3/scripts/lm3s1968_ram.ld create mode 100644 2.5/bertos/cpu/cortex-m3/scripts/lm3s1968_rom.ld create mode 100644 2.5/bertos/cpu/cortex-m3/scripts/lm3s8962_ram.ld create mode 100644 2.5/bertos/cpu/cortex-m3/scripts/lm3s8962_rom.ld create mode 100644 2.5/bertos/cpu/cortex-m3/scripts/stm32f103rb_rom.ld create mode 100644 2.5/bertos/cpu/detect.h create mode 100644 2.5/bertos/cpu/dsp56k/drv/buzzerled_dsp56k.h create mode 100644 2.5/bertos/cpu/dsp56k/drv/kdebug_dsp56k.c create mode 100644 2.5/bertos/cpu/dsp56k/drv/ser_dsp56k.c create mode 100644 2.5/bertos/cpu/dsp56k/drv/ser_dsp56k.h create mode 100644 2.5/bertos/cpu/dsp56k/drv/timer_dsp56k.h create mode 100644 2.5/bertos/cpu/dsp56k/hw/switch_dsp56k.c create mode 100644 2.5/bertos/cpu/frame.h create mode 100644 2.5/bertos/cpu/i196/drv/kdebug_i196.c create mode 100644 2.5/bertos/cpu/i196/drv/ser_i196.c create mode 100644 2.5/bertos/cpu/i196/drv/timer_i196.h create mode 100644 2.5/bertos/cpu/i196/hw/switch_i196.s32 create mode 100644 2.5/bertos/cpu/irq.h create mode 100755 2.5/bertos/cpu/newcore create mode 100644 2.5/bertos/cpu/path.common create mode 100644 2.5/bertos/cpu/pgm.h create mode 100644 2.5/bertos/cpu/power.h create mode 100644 2.5/bertos/cpu/types.h create mode 100644 2.5/bertos/drv/adc.c create mode 100644 2.5/bertos/drv/adc.h create mode 100644 2.5/bertos/drv/buzzer.c create mode 100644 2.5/bertos/drv/buzzer.h create mode 100644 2.5/bertos/drv/buzzerled.c create mode 100644 2.5/bertos/drv/buzzerled.h create mode 100644 2.5/bertos/drv/dataflash.c create mode 100644 2.5/bertos/drv/dataflash.h create mode 100644 2.5/bertos/drv/dataflash_hwtest.c create mode 100644 2.5/bertos/drv/dc_motor.c create mode 100644 2.5/bertos/drv/dc_motor.h create mode 100644 2.5/bertos/drv/dc_motor_hwtest.c create mode 100644 2.5/bertos/drv/eeprom.c create mode 100644 2.5/bertos/drv/eeprom.h create mode 100644 2.5/bertos/drv/flash.h create mode 100644 2.5/bertos/drv/flash25.c create mode 100644 2.5/bertos/drv/flash25.h create mode 100644 2.5/bertos/drv/flash25_hwtest.c create mode 100644 2.5/bertos/drv/ft245rl.c create mode 100644 2.5/bertos/drv/ft245rl.h create mode 100644 2.5/bertos/drv/i2c.c create mode 100644 2.5/bertos/drv/i2c.h create mode 100644 2.5/bertos/drv/i2c_bitbang.c create mode 100644 2.5/bertos/drv/kbd.c create mode 100644 2.5/bertos/drv/kbd.h create mode 100644 2.5/bertos/drv/kdebug.c create mode 100644 2.5/bertos/drv/lcd_32122a.c create mode 100644 2.5/bertos/drv/lcd_32122a.h create mode 100644 2.5/bertos/drv/lcd_gfx_hwtest.c create mode 100644 2.5/bertos/drv/lcd_gfx_qt.cpp create mode 100644 2.5/bertos/drv/lcd_gfx_qt.h create mode 100644 2.5/bertos/drv/lcd_hd44.c create mode 100644 2.5/bertos/drv/lcd_hd44.h create mode 100644 2.5/bertos/drv/lcd_hd44_hwtest.c create mode 100644 2.5/bertos/drv/lcd_lm44_qt.cpp create mode 100644 2.5/bertos/drv/lcd_lm44_qt.h create mode 100644 2.5/bertos/drv/lcd_rit128x96.c create mode 100644 2.5/bertos/drv/lcd_rit128x96.h create mode 100644 2.5/bertos/drv/lcd_text.c create mode 100644 2.5/bertos/drv/lcd_text.h create mode 100644 2.5/bertos/drv/lcd_text_hwtest.c create mode 100644 2.5/bertos/drv/lm75.c create mode 100644 2.5/bertos/drv/lm75.h create mode 100644 2.5/bertos/drv/mcp41.c create mode 100644 2.5/bertos/drv/mcp41.h create mode 100644 2.5/bertos/drv/mpxx6115a.h create mode 100644 2.5/bertos/drv/ntc.c create mode 100644 2.5/bertos/drv/ntc.h create mode 100644 2.5/bertos/drv/pcf8574.c create mode 100644 2.5/bertos/drv/pcf8574.h create mode 100644 2.5/bertos/drv/phase.c create mode 100644 2.5/bertos/drv/phase.h create mode 100644 2.5/bertos/drv/pwm.c create mode 100644 2.5/bertos/drv/pwm.h create mode 100644 2.5/bertos/drv/pwm_hwtest.c create mode 100644 2.5/bertos/drv/sd.c create mode 100644 2.5/bertos/drv/sd.h create mode 100644 2.5/bertos/drv/ser.c create mode 100644 2.5/bertos/drv/ser.h create mode 100644 2.5/bertos/drv/ser_p.h create mode 100644 2.5/bertos/drv/sipo.c create mode 100644 2.5/bertos/drv/sipo.h create mode 100644 2.5/bertos/drv/spi_bitbang.c create mode 100644 2.5/bertos/drv/spi_bitbang.h create mode 100644 2.5/bertos/drv/stepper.c create mode 100644 2.5/bertos/drv/stepper.h create mode 100644 2.5/bertos/drv/tas5706a.c create mode 100644 2.5/bertos/drv/tas5706a.h create mode 100644 2.5/bertos/drv/tc520.c create mode 100644 2.5/bertos/drv/tc520.h create mode 100644 2.5/bertos/drv/thermo.c create mode 100644 2.5/bertos/drv/thermo.h create mode 100644 2.5/bertos/drv/timer.c create mode 100644 2.5/bertos/drv/timer.h create mode 100644 2.5/bertos/drv/timer_test.c create mode 100644 2.5/bertos/drv/tlv5618.c create mode 100644 2.5/bertos/drv/tlv5618.h create mode 100644 2.5/bertos/drv/tmp123.c create mode 100644 2.5/bertos/drv/tmp123.h create mode 100644 2.5/bertos/drv/wdt.h create mode 100644 2.5/bertos/dt/dnotifier.c create mode 100644 2.5/bertos/dt/dnotifier.h create mode 100644 2.5/bertos/dt/dtag.h create mode 100644 2.5/bertos/dt/dwidget.c create mode 100644 2.5/bertos/dt/dwidget.h create mode 100644 2.5/bertos/dt/editbool.c create mode 100644 2.5/bertos/dt/editbool.h create mode 100644 2.5/bertos/dt/editint.c create mode 100644 2.5/bertos/dt/editint.h create mode 100644 2.5/bertos/emul/diskio_emul.c create mode 100644 2.5/bertos/emul/emul.cpp create mode 100644 2.5/bertos/emul/emul.h create mode 100644 2.5/bertos/emul/emul.mk create mode 100644 2.5/bertos/emul/emulkbd.cpp create mode 100644 2.5/bertos/emul/emulkbd.h create mode 100644 2.5/bertos/emul/emulwin.cpp create mode 100644 2.5/bertos/emul/emulwin.h create mode 100644 2.5/bertos/emul/kfile_posix.c create mode 100644 2.5/bertos/emul/kfile_posix.h create mode 100644 2.5/bertos/emul/ser_posix.c create mode 100644 2.5/bertos/emul/switch.S create mode 100644 2.5/bertos/emul/switch_ctx_emul.S create mode 100644 2.5/bertos/emul/switch_i386.S create mode 100644 2.5/bertos/emul/switch_ppc.S create mode 100644 2.5/bertos/emul/switch_win32.s create mode 100644 2.5/bertos/emul/switch_x86_64.s create mode 100644 2.5/bertos/emul/timer_posix.c create mode 100644 2.5/bertos/emul/timer_posix.h create mode 100644 2.5/bertos/emul/timer_qt.c create mode 100644 2.5/bertos/emul/timer_qt.h create mode 100755 2.5/bertos/fonts/convbdf create mode 100644 2.5/bertos/fonts/fixed6x8.c create mode 100644 2.5/bertos/fonts/fonts.mk create mode 100644 2.5/bertos/fonts/gohu.bdf create mode 100644 2.5/bertos/fonts/gohu.c create mode 100644 2.5/bertos/fonts/helvB10.bdf create mode 100644 2.5/bertos/fonts/helvB10.c create mode 100644 2.5/bertos/fonts/luBS14.bdf create mode 100644 2.5/bertos/fonts/luBS14.c create mode 100644 2.5/bertos/fonts/ncenB18.bdf create mode 100644 2.5/bertos/fonts/ncenB18.c create mode 100644 2.5/bertos/fs/battfs.c create mode 100644 2.5/bertos/fs/battfs.h create mode 100644 2.5/bertos/fs/battfs_test.c create mode 100644 2.5/bertos/fs/fat.c create mode 100644 2.5/bertos/fs/fat.h create mode 100644 2.5/bertos/fs/fat_test.c create mode 100644 2.5/bertos/fs/fatfs/00readme.txt create mode 100644 2.5/bertos/fs/fatfs/diskio.c create mode 100644 2.5/bertos/fs/fatfs/diskio.h create mode 100644 2.5/bertos/fs/fatfs/ff.c create mode 100644 2.5/bertos/fs/fatfs/ff.h create mode 100644 2.5/bertos/fs/fatfs/integer.h create mode 100644 2.5/bertos/fs/fatfs/option/cc932.c create mode 100644 2.5/bertos/fs/fatfs/option/cc936.c create mode 100644 2.5/bertos/fs/fatfs/option/cc949.c create mode 100644 2.5/bertos/fs/fatfs/option/cc950.c create mode 100644 2.5/bertos/fs/fatfs/option/ccsbcs.c create mode 100644 2.5/bertos/fs/fatfs/option/syncobj.c create mode 100644 2.5/bertos/gfx/bitmap.c create mode 100644 2.5/bertos/gfx/charts.c create mode 100644 2.5/bertos/gfx/charts.h create mode 100644 2.5/bertos/gfx/fillpoly.cpp create mode 100644 2.5/bertos/gfx/font.h create mode 100644 2.5/bertos/gfx/font_10x20.c create mode 100644 2.5/bertos/gfx/gfx.h create mode 100644 2.5/bertos/gfx/gfx_p.h create mode 100644 2.5/bertos/gfx/line.c create mode 100644 2.5/bertos/gfx/text.c create mode 100644 2.5/bertos/gfx/text.h create mode 100644 2.5/bertos/gfx/text_format.c create mode 100644 2.5/bertos/gfx/win.c create mode 100644 2.5/bertos/gfx/win.h create mode 100644 2.5/bertos/gui/levelbar.c create mode 100644 2.5/bertos/gui/levelbar.h create mode 100644 2.5/bertos/gui/leveledit.c create mode 100644 2.5/bertos/gui/leveledit.h create mode 100644 2.5/bertos/gui/menu.c create mode 100644 2.5/bertos/gui/menu.h create mode 100644 2.5/bertos/gui/menubar.c create mode 100644 2.5/bertos/gui/menubar.h create mode 100644 2.5/bertos/hw/hw_afsk.h create mode 100644 2.5/bertos/hw/hw_blanker.h create mode 100644 2.5/bertos/hw/hw_boot.h create mode 100644 2.5/bertos/hw/hw_buzzer.h create mode 100644 2.5/bertos/hw/hw_buzzerled.h create mode 100644 2.5/bertos/hw/hw_cpufreq.h create mode 100644 2.5/bertos/hw/hw_dataflash.c create mode 100644 2.5/bertos/hw/hw_dataflash.h create mode 100644 2.5/bertos/hw/hw_dc_motor.h create mode 100644 2.5/bertos/hw/hw_ft245rl.h create mode 100644 2.5/bertos/hw/hw_i2c_bitbang.h create mode 100644 2.5/bertos/hw/hw_input.h create mode 100644 2.5/bertos/hw/hw_kbd.h create mode 100644 2.5/bertos/hw/hw_lcd_32122a.h create mode 100644 2.5/bertos/hw/hw_lcd_hd44.h create mode 100644 2.5/bertos/hw/hw_led.h create mode 100644 2.5/bertos/hw/hw_lm75.h create mode 100644 2.5/bertos/hw/hw_mcp41.c create mode 100644 2.5/bertos/hw/hw_mcp41.h create mode 100644 2.5/bertos/hw/hw_ntc.c create mode 100644 2.5/bertos/hw/hw_ntc.h create mode 100644 2.5/bertos/hw/hw_phase.c create mode 100644 2.5/bertos/hw/hw_phase.h create mode 100644 2.5/bertos/hw/hw_rit128x96.h create mode 100644 2.5/bertos/hw/hw_sd.h create mode 100644 2.5/bertos/hw/hw_sensor.h create mode 100644 2.5/bertos/hw/hw_ser.h create mode 100644 2.5/bertos/hw/hw_sipo.h create mode 100644 2.5/bertos/hw/hw_spi.h create mode 100644 2.5/bertos/hw/hw_spi_dma.h create mode 100644 2.5/bertos/hw/hw_stepper.h create mode 100644 2.5/bertos/hw/hw_tas5706a.h create mode 100644 2.5/bertos/hw/hw_tc520.h create mode 100644 2.5/bertos/hw/hw_thermo.h create mode 100644 2.5/bertos/hw/hw_timer.h create mode 100644 2.5/bertos/hw/hw_tlv5618.h create mode 100644 2.5/bertos/hw/hw_tmp123.h create mode 100644 2.5/bertos/hw/kbd_map.h create mode 100644 2.5/bertos/hw/mcp41_map.h create mode 100644 2.5/bertos/hw/ntc_map.h create mode 100644 2.5/bertos/hw/phase_map.h create mode 100644 2.5/bertos/hw/pwm_map.h create mode 100644 2.5/bertos/hw/thermo_map.h create mode 100644 2.5/bertos/icons/Makefile create mode 100644 2.5/bertos/icons/flipimage.cpp create mode 100644 2.5/bertos/icons/logo.c create mode 100644 2.5/bertos/icons/logo.h create mode 100755 2.5/bertos/icons/logo.png create mode 100644 2.5/bertos/kern/coop.c create mode 100644 2.5/bertos/kern/irq.c create mode 100644 2.5/bertos/kern/irq.h create mode 100644 2.5/bertos/kern/kfile.c create mode 100644 2.5/bertos/kern/kfile.h create mode 100644 2.5/bertos/kern/kfile_test.c create mode 100644 2.5/bertos/kern/monitor.c create mode 100644 2.5/bertos/kern/monitor.h create mode 100644 2.5/bertos/kern/msg.h create mode 100644 2.5/bertos/kern/msg_test.c create mode 100644 2.5/bertos/kern/preempt.c create mode 100644 2.5/bertos/kern/proc.c create mode 100644 2.5/bertos/kern/proc.h create mode 100644 2.5/bertos/kern/proc_p.h create mode 100644 2.5/bertos/kern/proc_test.c create mode 100644 2.5/bertos/kern/proc_test/coop_heap_test.c create mode 100644 2.5/bertos/kern/proc_test/coop_msg_test.c create mode 100644 2.5/bertos/kern/proc_test/coop_pri_heap_test.c create mode 100644 2.5/bertos/kern/proc_test/coop_pri_test.c create mode 100644 2.5/bertos/kern/proc_test/coop_sem_test.c create mode 100644 2.5/bertos/kern/proc_test/coop_signal_test.c create mode 100644 2.5/bertos/kern/proc_test/coop_test.c create mode 100644 2.5/bertos/kern/proc_test/preempt_heap_test.c create mode 100644 2.5/bertos/kern/proc_test/preempt_msg_test.c create mode 100644 2.5/bertos/kern/proc_test/preempt_pri_heap_test.c create mode 100644 2.5/bertos/kern/proc_test/preempt_pri_test.c create mode 100644 2.5/bertos/kern/proc_test/preempt_sem_test.c create mode 100644 2.5/bertos/kern/proc_test/preempt_signal_test.c create mode 100644 2.5/bertos/kern/proc_test/preempt_test.c create mode 100644 2.5/bertos/kern/sem.c create mode 100644 2.5/bertos/kern/sem.h create mode 100644 2.5/bertos/kern/sem_test.c create mode 100644 2.5/bertos/kern/signal.c create mode 100644 2.5/bertos/kern/signal.h create mode 100644 2.5/bertos/kern/signal_test.c create mode 100644 2.5/bertos/mware/blanker.c create mode 100644 2.5/bertos/mware/blanker.h create mode 100644 2.5/bertos/mware/byteorder.h create mode 100644 2.5/bertos/mware/cmd_hunk.h create mode 100644 2.5/bertos/mware/event.c create mode 100644 2.5/bertos/mware/event.h create mode 100644 2.5/bertos/mware/except.h create mode 100644 2.5/bertos/mware/formatwr.c create mode 100644 2.5/bertos/mware/formatwr.h create mode 100644 2.5/bertos/mware/hex.c create mode 100644 2.5/bertos/mware/hex.h create mode 100644 2.5/bertos/mware/ini_reader.c create mode 100644 2.5/bertos/mware/ini_reader.h create mode 100644 2.5/bertos/mware/ini_reader_test.c create mode 100644 2.5/bertos/mware/messages.c create mode 100644 2.5/bertos/mware/messages.h create mode 100644 2.5/bertos/mware/observer.c create mode 100644 2.5/bertos/mware/observer.h create mode 100644 2.5/bertos/mware/parser.c create mode 100644 2.5/bertos/mware/parser.h create mode 100644 2.5/bertos/mware/pgm.h create mode 100644 2.5/bertos/mware/readline.c create mode 100644 2.5/bertos/mware/readline.h create mode 100644 2.5/bertos/mware/resource.c create mode 100644 2.5/bertos/mware/resource.h create mode 100644 2.5/bertos/mware/rle.h create mode 100644 2.5/bertos/mware/sprintf.c create mode 100644 2.5/bertos/mware/sprintf_test.c create mode 100644 2.5/bertos/mware/strtol10.c create mode 100644 2.5/bertos/mware/strtol10.h create mode 100644 2.5/bertos/net/afsk.c create mode 100644 2.5/bertos/net/afsk.h create mode 100644 2.5/bertos/net/afsk_test.c create mode 100644 2.5/bertos/net/ax25.c create mode 100644 2.5/bertos/net/ax25.h create mode 100644 2.5/bertos/net/ax25_test.c create mode 100644 2.5/bertos/net/keytag.c create mode 100644 2.5/bertos/net/keytag.h create mode 100644 2.5/bertos/net/nmea.c create mode 100644 2.5/bertos/net/nmea.h create mode 100644 2.5/bertos/net/nmea_test.c create mode 100644 2.5/bertos/net/nmeap/COPYING create mode 100644 2.5/bertos/net/nmeap/Doxyfile create mode 100644 2.5/bertos/net/nmeap/Makefile create mode 100644 2.5/bertos/net/nmeap/README create mode 100644 2.5/bertos/net/nmeap/doc/tutorial.html create mode 100644 2.5/bertos/net/nmeap/inc/nmeap.h create mode 100644 2.5/bertos/net/nmeap/inc/nmeap_def.h create mode 100644 2.5/bertos/net/nmeap/src/Makefile create mode 100644 2.5/bertos/net/nmeap/src/nmeap.mak create mode 100644 2.5/bertos/net/nmeap/src/nmeap01.c create mode 100644 2.5/bertos/net/nmeap/tst/Makefile create mode 100644 2.5/bertos/net/nmeap/tst/test1.c create mode 100644 2.5/bertos/net/nmeap/tst/test2.c create mode 100644 2.5/bertos/net/nmeap/tst/test3.c create mode 100644 2.5/bertos/net/nmeap/tst/tst.mak create mode 100644 2.5/bertos/net/nmeap/tst/wingps.c create mode 100644 2.5/bertos/net/nmeap/win32.mak create mode 100644 2.5/bertos/net/pocketbus.c create mode 100644 2.5/bertos/net/pocketbus.h create mode 100644 2.5/bertos/net/pocketcmd.c create mode 100644 2.5/bertos/net/pocketcmd.h create mode 100644 2.5/bertos/net/xmodem.c create mode 100644 2.5/bertos/net/xmodem.h create mode 100644 2.5/bertos/os/hptime.c create mode 100644 2.5/bertos/os/hptime.h create mode 100755 2.5/bertos/remote_merge create mode 100644 2.5/bertos/rules.mk create mode 100644 2.5/bertos/struct/fifobuf.h create mode 100644 2.5/bertos/struct/hashtable.c create mode 100644 2.5/bertos/struct/hashtable.h create mode 100644 2.5/bertos/struct/hashtable_test.c create mode 100644 2.5/bertos/struct/heap.c create mode 100644 2.5/bertos/struct/heap.h create mode 100644 2.5/bertos/struct/heap_test.c create mode 100644 2.5/bertos/struct/kfile_fifo.c create mode 100644 2.5/bertos/struct/kfile_fifo.h create mode 100644 2.5/bertos/struct/kfile_fifo_test.c create mode 100644 2.5/bertos/struct/kfile_mem.c create mode 100644 2.5/bertos/struct/kfile_mem.h create mode 100644 2.5/bertos/struct/list.h create mode 100644 2.5/bertos/struct/pool.h create mode 100644 2.5/bertos/verstag.c create mode 100644 2.5/bertos/verstag.h create mode 100644 2.5/boards/.spec create mode 100644 2.5/boards/arduino/.image.png create mode 100644 2.5/boards/arduino/.spec create mode 100644 2.5/boards/arduino/benchmark/.spec create mode 100644 2.5/boards/arduino/benchmark/context_switch/.spec create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_adc.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_afsk.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ax25.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_battfs.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_context_switch.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_dataflash.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_debug.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_fat.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_flash25.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_formatwr.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_gfx.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_hashtable.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_heap.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_i2c.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_i2s.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_kbd.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_keytag.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_kfile.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_lm75.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_md2.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_menu.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_monitor.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_nmea.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_parser.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_phase.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_proc.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_pwm.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ramp.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_randpool.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_sem.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ser.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_signal.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_stepper.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_thermo.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_timer.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_wdt.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/cfg/cfg_xmodem.h create mode 100644 2.5/boards/arduino/benchmark/context_switch/context_switch.mk create mode 100644 2.5/boards/arduino/benchmark/context_switch/context_switch_user.mk create mode 100644 2.5/boards/arduino/benchmark/context_switch/main.c create mode 100644 2.5/boards/arduino/benchmark/context_switch/project.bertos create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/.spec create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_adc.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_afsk.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ax25.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_battfs.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_context_switch.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_dataflash.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_debug.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_fat.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_flash25.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_formatwr.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_gfx.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_hashtable.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_heap.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_i2c.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_i2s.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_kbd.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_keytag.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_kfile.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_lm75.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_md2.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_monitor.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_nmea.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_parser.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_phase.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_proc.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_pwm.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ramp.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_randpool.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_sem.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ser.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_signal.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_stepper.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_thermo.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_timer.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_wdt.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_xmodem.h create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/kernel_footprint.mk create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/kernel_footprint_user.mk create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/main.c create mode 100644 2.5/boards/arduino/benchmark/kernel_footprint/project.bertos create mode 100644 2.5/boards/arduino/examples/.spec create mode 100644 2.5/boards/arduino/examples/aprs/.spec create mode 100644 2.5/boards/arduino/examples/aprs/aprs.mk create mode 100644 2.5/boards/arduino/examples/aprs/aprs_user.mk create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_adc.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_afsk.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_ax25.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_battfs.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_context_switch.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_dataflash.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_debug.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_fat.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_flash25.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_formatwr.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_gfx.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_hashtable.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_heap.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_i2c.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_i2s.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_kbd.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_keytag.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_kfile.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_lm75.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_md2.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_menu.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_monitor.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_nmea.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_parser.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_phase.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_proc.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_pwm.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_ramp.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_randpool.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_sem.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_ser.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_signal.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_stepper.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_thermo.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_timer.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_wdt.h create mode 100644 2.5/boards/arduino/examples/aprs/cfg/cfg_xmodem.h create mode 100644 2.5/boards/arduino/examples/aprs/main.c create mode 100644 2.5/boards/arduino/examples/aprs/project.bertos create mode 100644 2.5/boards/arduino/hw/hw_afsk.c create mode 100644 2.5/boards/arduino/hw/hw_afsk.h create mode 100644 2.5/boards/arduino/hw/hw_buzzer.h create mode 100644 2.5/boards/arduino/hw/hw_dataflash.c create mode 100644 2.5/boards/arduino/hw/hw_dataflash.h create mode 100644 2.5/boards/arduino/hw/hw_dc_motor.h create mode 100644 2.5/boards/arduino/hw/hw_ft245rl.h create mode 100644 2.5/boards/arduino/hw/hw_i2c_bitbang.h create mode 100644 2.5/boards/arduino/hw/hw_kbd.h create mode 100644 2.5/boards/arduino/hw/hw_lcd_32122a.h create mode 100644 2.5/boards/arduino/hw/hw_lcd_hd44.h create mode 100644 2.5/boards/arduino/hw/hw_led.h create mode 100644 2.5/boards/arduino/hw/hw_lm75.h create mode 100644 2.5/boards/arduino/hw/hw_mcp41.c create mode 100644 2.5/boards/arduino/hw/hw_mcp41.h create mode 100644 2.5/boards/arduino/hw/hw_ntc.c create mode 100644 2.5/boards/arduino/hw/hw_ntc.h create mode 100644 2.5/boards/arduino/hw/hw_phase.c create mode 100644 2.5/boards/arduino/hw/hw_phase.h create mode 100644 2.5/boards/arduino/hw/hw_rit128x96.h create mode 100644 2.5/boards/arduino/hw/hw_sd.h create mode 100644 2.5/boards/arduino/hw/hw_ser.h create mode 100644 2.5/boards/arduino/hw/hw_sipo.h create mode 100644 2.5/boards/arduino/hw/hw_spi.h create mode 100644 2.5/boards/arduino/hw/hw_stepper.h create mode 100644 2.5/boards/arduino/hw/hw_tas5706a.h create mode 100644 2.5/boards/arduino/hw/hw_thermo.h create mode 100644 2.5/boards/arduino/hw/hw_tlv5618.h create mode 100644 2.5/boards/arduino/hw/hw_tmp123.h create mode 100644 2.5/boards/arduino/hw/kbd_map.h create mode 100644 2.5/boards/arduino/hw/mcp41_map.h create mode 100644 2.5/boards/arduino/hw/ntc_map.h create mode 100644 2.5/boards/arduino/hw/phase_map.h create mode 100644 2.5/boards/arduino/hw/pwm_map.h create mode 100644 2.5/boards/arduino/hw/thermo_map.h create mode 100644 2.5/boards/arduino/templates/.spec create mode 100644 2.5/boards/arduino/templates/empty/.spec create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_adc.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_afsk.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_ax25.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_battfs.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_context_switch.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_dataflash.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_debug.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_fat.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_flash25.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_formatwr.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_gfx.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_hashtable.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_heap.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_i2c.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_i2s.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_kbd.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_keytag.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_kfile.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_lm75.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_md2.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_monitor.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_nmea.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_parser.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_phase.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_proc.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_pwm.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_ramp.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_randpool.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_sem.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_ser.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_signal.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_stepper.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_thermo.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_timer.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_wdt.h create mode 100644 2.5/boards/arduino/templates/empty/cfg/cfg_xmodem.h create mode 100644 2.5/boards/arduino/templates/empty/empty.mk create mode 100644 2.5/boards/arduino/templates/empty/empty_user.mk create mode 100644 2.5/boards/arduino/templates/empty/main.c create mode 100644 2.5/boards/arduino/templates/empty/project.bertos create mode 100644 2.5/boards/arduino/templates/kernel/.spec create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_adc.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_afsk.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_ax25.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_battfs.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_context_switch.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_dataflash.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_debug.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_fat.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_flash25.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_formatwr.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_gfx.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_hashtable.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_heap.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_i2c.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_i2s.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_kbd.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_keytag.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_kfile.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_lm75.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_md2.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_monitor.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_nmea.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_parser.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_phase.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_proc.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_pwm.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_ramp.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_randpool.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_sem.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_ser.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_signal.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_stepper.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_thermo.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_timer.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_wdt.h create mode 100644 2.5/boards/arduino/templates/kernel/cfg/cfg_xmodem.h create mode 100644 2.5/boards/arduino/templates/kernel/kernel.mk create mode 100644 2.5/boards/arduino/templates/kernel/kernel_user.mk create mode 100644 2.5/boards/arduino/templates/kernel/main.c create mode 100644 2.5/boards/arduino/templates/kernel/project.bertos create mode 100644 2.5/boards/at91sam7s-ek/.image.png create mode 100644 2.5/boards/at91sam7s-ek/.spec create mode 100644 2.5/boards/at91sam7s-ek/benchmark/.spec create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/.spec create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_adc.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_afsk.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ax25.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_battfs.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_context_switch.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_dataflash.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_debug.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_fat.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_flash25.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_formatwr.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_gfx.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_hashtable.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_heap.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_i2c.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_i2s.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_kbd.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_keytag.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_kfile.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_lm75.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_md2.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_monitor.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_nmea.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_parser.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_phase.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_proc.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_pwm.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ramp.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_randpool.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_sem.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ser.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_signal.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_stepper.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_thermo.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_timer.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_wdt.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_xmodem.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/context_switch.mk create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/context_switch_user.mk create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/main.c create mode 100644 2.5/boards/at91sam7s-ek/benchmark/context_switch/project.bertos create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/.spec create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_adc.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_afsk.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ax25.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_battfs.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_context_switch.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_dataflash.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_debug.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_fat.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_flash25.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_formatwr.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_gfx.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_hashtable.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_heap.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_i2c.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_i2s.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_kbd.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_keytag.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_kfile.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_lm75.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_md2.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_monitor.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_nmea.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_parser.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_phase.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_proc.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_pwm.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ramp.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_randpool.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_sem.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ser.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_signal.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_stepper.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_thermo.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_timer.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_wdt.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_xmodem.h create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/kernel_footprint.mk create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/kernel_footprint_user.mk create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/main.c create mode 100644 2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/project.bertos create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_afsk.c create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_afsk.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_buzzer.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_dataflash.c create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_dataflash.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_dc_motor.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_ft245rl.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_i2c_bitbang.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_kbd.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_lcd.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_lcd_32122a.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_lcd_hd44.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_led.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_lm75.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_mcp41.c create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_mcp41.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_ntc.c create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_ntc.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_phase.c create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_phase.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_rit128x96.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_sd.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_ser.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_sipo.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_spi.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_stepper.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_tas5706a.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_thermo.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_tlv5618.h create mode 100644 2.5/boards/at91sam7s-ek/hw/hw_tmp123.h create mode 100644 2.5/boards/at91sam7s-ek/hw/kbd_map.h create mode 100644 2.5/boards/at91sam7s-ek/hw/mcp41_map.h create mode 100644 2.5/boards/at91sam7s-ek/hw/ntc_map.h create mode 100644 2.5/boards/at91sam7s-ek/hw/phase_map.h create mode 100644 2.5/boards/at91sam7s-ek/hw/pwm_map.h create mode 100644 2.5/boards/at91sam7s-ek/hw/thermo_map.h create mode 100644 2.5/boards/at91sam7s-ek/templates/.spec create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/.spec create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_adc.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_afsk.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ax25.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_battfs.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_context_switch.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_dataflash.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_debug.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_fat.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_flash25.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_formatwr.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_gfx.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_hashtable.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_heap.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_i2c.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_i2s.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_kbd.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_keytag.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_kfile.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_lm75.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_md2.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_monitor.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_nmea.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_parser.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_phase.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_proc.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_pwm.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ramp.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_randpool.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_sem.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ser.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_signal.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_stepper.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_thermo.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_timer.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_wdt.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_xmodem.h create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/empty.mk create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/empty_user.mk create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/main.c create mode 100644 2.5/boards/at91sam7s-ek/templates/empty/project.bertos create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/.spec create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_adc.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_afsk.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ax25.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_battfs.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_context_switch.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_dataflash.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_debug.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_fat.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_flash25.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_formatwr.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_gfx.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_hashtable.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_heap.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_i2c.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_i2s.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_kbd.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_keytag.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_kfile.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_lm75.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_md2.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_monitor.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_nmea.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_parser.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_phase.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_proc.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_pwm.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ramp.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_randpool.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_sem.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ser.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_signal.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_stepper.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_thermo.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_timer.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_wdt.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_xmodem.h create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/kernel.mk create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/kernel_user.mk create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/main.c create mode 100644 2.5/boards/at91sam7s-ek/templates/kernel/project.bertos create mode 100644 2.5/boards/at91sam7x-ek/.image.png create mode 100644 2.5/boards/at91sam7x-ek/.spec create mode 100644 2.5/boards/at91sam7x-ek/benchmark/.spec create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/.spec create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_adc.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_afsk.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ax25.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_battfs.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_context_switch.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_dataflash.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_debug.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_fat.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_flash25.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_formatwr.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_gfx.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_hashtable.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_heap.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_i2c.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_i2s.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_kbd.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_keytag.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_kfile.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_lm75.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_md2.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_menu.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_monitor.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_nmea.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_parser.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_phase.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_proc.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_pwm.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ramp.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_randpool.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_sem.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ser.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_signal.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_stepper.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_thermo.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_timer.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_wdt.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_xmodem.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/context_switch.mk create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/context_switch_user.mk create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/main.c create mode 100644 2.5/boards/at91sam7x-ek/benchmark/context_switch/project.bertos create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/.spec create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_adc.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_afsk.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ax25.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_battfs.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_context_switch.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_dataflash.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_debug.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_fat.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_flash25.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_formatwr.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_gfx.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_hashtable.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_heap.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_i2c.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_i2s.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_kbd.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_keytag.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_kfile.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_lm75.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_md2.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_menu.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_monitor.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_nmea.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_parser.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_phase.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_proc.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_pwm.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ramp.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_randpool.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_sem.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ser.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_signal.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_stepper.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_thermo.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_timer.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_wdt.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_xmodem.h create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/kernel_footprint.mk create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/kernel_footprint_user.mk create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/main.c create mode 100644 2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/project.bertos create mode 100644 2.5/boards/at91sam7x-ek/examples/.spec create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/.spec create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_adc.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_afsk.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ax25.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_battfs.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_context_switch.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_dataflash.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_debug.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_fat.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_flash25.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_formatwr.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_gfx.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_heap.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_i2c.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_i2s.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_kbd.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_kfile.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_lm75.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_md2.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_menu.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_monitor.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_nmea.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_phase.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_proc.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_pwm.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ramp.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_randpool.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_sem.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ser.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_signal.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_stepper.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_thermo.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_timer.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_wdt.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_xmodem.h create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/main.c create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/project.bertos create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/sd_fat.mk create mode 100644 2.5/boards/at91sam7x-ek/examples/sd_fat/sd_fat_user.mk create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_afsk.c create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_afsk.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_buzzer.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_dataflash.c create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_dataflash.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_dc_motor.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_ft245rl.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_i2c_bitbang.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_kbd.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_lcd_32122a.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_lcd_hd44.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_led.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_lm75.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_mcp41.c create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_mcp41.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_ntc.c create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_ntc.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_phase.c create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_phase.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_rit128x96.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_sd.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_ser.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_sipo.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_spi.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_stepper.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_tas5706a.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_thermo.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_tlv5618.h create mode 100644 2.5/boards/at91sam7x-ek/hw/hw_tmp123.h create mode 100644 2.5/boards/at91sam7x-ek/hw/kbd_map.h create mode 100644 2.5/boards/at91sam7x-ek/hw/mcp41_map.h create mode 100644 2.5/boards/at91sam7x-ek/hw/ntc_map.h create mode 100644 2.5/boards/at91sam7x-ek/hw/phase_map.h create mode 100644 2.5/boards/at91sam7x-ek/hw/pwm_map.h create mode 100644 2.5/boards/at91sam7x-ek/hw/thermo_map.h create mode 100644 2.5/boards/at91sam7x-ek/templates/.spec create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/.spec create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_adc.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_afsk.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ax25.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_battfs.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_context_switch.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_dataflash.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_debug.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_fat.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_flash25.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_formatwr.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_gfx.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_hashtable.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_heap.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_i2c.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_i2s.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_kbd.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_keytag.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_kfile.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_lm75.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_md2.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_monitor.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_nmea.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_parser.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_phase.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_proc.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_pwm.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ramp.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_randpool.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_sem.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ser.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_signal.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_stepper.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_thermo.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_timer.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_wdt.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_xmodem.h create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/empty.mk create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/empty_user.mk create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/main.c create mode 100644 2.5/boards/at91sam7x-ek/templates/empty/project.bertos create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/.spec create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_adc.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_afsk.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ax25.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_battfs.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_context_switch.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_dataflash.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_debug.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_fat.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_flash25.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_formatwr.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_gfx.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_hashtable.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_heap.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_i2c.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_i2s.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_kbd.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_keytag.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_kfile.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_lm75.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_md2.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_monitor.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_nmea.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_parser.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_phase.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_proc.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_pwm.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ramp.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_randpool.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_sem.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ser.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_signal.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_stepper.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_thermo.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_timer.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_wdt.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_xmodem.h create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/kernel.mk create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/kernel_user.mk create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/main.c create mode 100644 2.5/boards/at91sam7x-ek/templates/kernel/project.bertos create mode 100644 2.5/boards/ek-lm3s1968/.image.png create mode 100644 2.5/boards/ek-lm3s1968/.spec create mode 100644 2.5/boards/ek-lm3s1968/benchmark/.spec create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/.spec create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_adc.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_afsk.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ax25.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_battfs.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_context_switch.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_dataflash.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_debug.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_fat.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_flash25.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_formatwr.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_gfx.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_hashtable.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_heap.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_i2c.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_i2s.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_kbd.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_keytag.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_kfile.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_lm75.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_md2.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_menu.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_monitor.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_nmea.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_parser.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_phase.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_proc.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_pwm.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ramp.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_randpool.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_sem.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ser.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_signal.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_stepper.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_thermo.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_timer.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_wdt.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_xmodem.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/context_switch.mk create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/context_switch_user.mk create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/main.c create mode 100644 2.5/boards/ek-lm3s1968/benchmark/context_switch/project.bertos create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/.spec create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_adc.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_afsk.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ax25.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_battfs.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_context_switch.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_dataflash.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_debug.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_fat.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_flash25.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_formatwr.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_gfx.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_hashtable.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_heap.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_i2c.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_i2s.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_kbd.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_keytag.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_kfile.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_lm75.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_md2.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_menu.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_monitor.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_nmea.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_parser.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_phase.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_proc.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_pwm.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ramp.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_randpool.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_sem.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ser.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_signal.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_stepper.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_thermo.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_timer.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_wdt.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_xmodem.h create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/kernel_footprint.mk create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/kernel_footprint_user.mk create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/main.c create mode 100644 2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/project.bertos create mode 100644 2.5/boards/ek-lm3s1968/examples/.spec create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/.spec create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_adc.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_afsk.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ax25.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_battfs.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_context_switch.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_dataflash.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_debug.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_fat.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_flash25.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_formatwr.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_gfx.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_hashtable.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_heap.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_i2c.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_i2s.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_kbd.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_keytag.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_kfile.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_lm75.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_md2.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_menu.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_monitor.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_nmea.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_parser.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_phase.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_pid.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_proc.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_pwm.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ramp.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_randpool.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_sem.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ser.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_signal.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_spi_dma.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_stepper.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_thermo.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_timer.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_wdt.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_xmodem.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/cfg/log.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/compass.c create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/compass.h create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/gps.mk create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/gps_user.mk create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/logo.c create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/main.c create mode 100644 2.5/boards/ek-lm3s1968/examples/gps/project.bertos create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_afsk.c create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_afsk.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_buzzer.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_dataflash.c create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_dataflash.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_dc_motor.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_ft245rl.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_i2c_bitbang.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_kbd.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_lcd_32122a.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_lcd_hd44.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_led.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_lm75.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_mcp41.c create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_mcp41.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_ntc.c create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_ntc.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_phase.c create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_phase.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_rit128x96.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_sd.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_ser.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_sipo.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_spi.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_stepper.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_tas5706a.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_thermo.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_tlv5618.h create mode 100644 2.5/boards/ek-lm3s1968/hw/hw_tmp123.h create mode 100644 2.5/boards/ek-lm3s1968/hw/kbd_map.h create mode 100644 2.5/boards/ek-lm3s1968/hw/mcp41_map.h create mode 100644 2.5/boards/ek-lm3s1968/hw/ntc_map.h create mode 100644 2.5/boards/ek-lm3s1968/hw/phase_map.h create mode 100644 2.5/boards/ek-lm3s1968/hw/pwm_map.h create mode 100644 2.5/boards/ek-lm3s1968/hw/thermo_map.h create mode 100644 2.5/boards/ek-lm3s1968/templates/.spec create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/.spec create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_adc.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_afsk.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ax25.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_battfs.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_context_switch.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_dataflash.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_debug.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_fat.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_flash25.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_formatwr.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_gfx.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_hashtable.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_heap.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_i2c.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_i2s.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_kbd.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_keytag.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_kfile.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_lm75.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_md2.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_monitor.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_nmea.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_parser.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_phase.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_proc.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_pwm.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ramp.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_randpool.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_sem.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ser.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_signal.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_stepper.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_thermo.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_timer.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_wdt.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_xmodem.h create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/empty.mk create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/empty_user.mk create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/main.c create mode 100644 2.5/boards/ek-lm3s1968/templates/empty/project.bertos create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/.spec create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_adc.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_afsk.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ax25.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_battfs.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_context_switch.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_dataflash.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_debug.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_fat.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_flash25.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_formatwr.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_gfx.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_hashtable.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_heap.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_i2c.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_i2s.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_kbd.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_keytag.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_kfile.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_lm75.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_md2.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_monitor.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_nmea.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_parser.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_phase.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_proc.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_pwm.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ramp.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_randpool.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_sem.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ser.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_signal.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_stepper.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_thermo.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_timer.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_wdt.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_xmodem.h create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/kernel.mk create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/kernel_user.mk create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/main.c create mode 100644 2.5/boards/ek-lm3s1968/templates/kernel/project.bertos create mode 100644 2.5/boards/lpc-p2378/.image.png create mode 100644 2.5/boards/lpc-p2378/.spec create mode 100644 2.5/boards/lpc-p2378/benchmark/.spec create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/.spec create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_adc.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_afsk.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ax25.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_battfs.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_context_switch.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_dataflash.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_debug.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_fat.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_flash25.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_formatwr.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_gfx.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_hashtable.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_heap.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_i2c.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_i2s.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_kbd.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_keytag.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_kfile.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_lm75.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_md2.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_menu.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_monitor.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_nmea.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_parser.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_phase.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_proc.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_pwm.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ramp.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_randpool.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_sem.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ser.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_signal.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_stepper.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_thermo.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_timer.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_wdt.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_xmodem.h create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/context_switch.mk create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/context_switch_user.mk create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/main.c create mode 100644 2.5/boards/lpc-p2378/benchmark/context_switch/project.bertos create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/.spec create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_adc.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_afsk.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ax25.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_battfs.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_context_switch.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_dataflash.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_debug.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_fat.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_flash25.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_formatwr.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_gfx.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_hashtable.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_heap.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_i2c.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_i2s.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_kbd.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_keytag.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_kfile.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_lm75.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_md2.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_menu.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_monitor.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_nmea.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_parser.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_phase.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_proc.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_pwm.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ramp.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_randpool.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_sem.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ser.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_signal.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_stepper.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_thermo.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_timer.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_wdt.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_xmodem.h create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/kernel_footprint.mk create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/kernel_footprint_user.mk create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/main.c create mode 100644 2.5/boards/lpc-p2378/benchmark/kernel_footprint/project.bertos create mode 100644 2.5/boards/lpc-p2378/hw/hw_afsk.c create mode 100644 2.5/boards/lpc-p2378/hw/hw_afsk.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_buzzer.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_dataflash.c create mode 100644 2.5/boards/lpc-p2378/hw/hw_dataflash.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_dc_motor.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_ft245rl.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_i2c_bitbang.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_kbd.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_lcd_32122a.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_lcd_hd44.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_led.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_lm75.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_mcp41.c create mode 100644 2.5/boards/lpc-p2378/hw/hw_mcp41.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_ntc.c create mode 100644 2.5/boards/lpc-p2378/hw/hw_ntc.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_phase.c create mode 100644 2.5/boards/lpc-p2378/hw/hw_phase.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_rit128x96.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_sd.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_ser.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_sipo.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_spi.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_stepper.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_tas5706a.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_thermo.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_tlv5618.h create mode 100644 2.5/boards/lpc-p2378/hw/hw_tmp123.h create mode 100644 2.5/boards/lpc-p2378/hw/kbd_map.h create mode 100644 2.5/boards/lpc-p2378/hw/mcp41_map.h create mode 100644 2.5/boards/lpc-p2378/hw/ntc_map.h create mode 100644 2.5/boards/lpc-p2378/hw/phase_map.h create mode 100644 2.5/boards/lpc-p2378/hw/pwm_map.h create mode 100644 2.5/boards/lpc-p2378/hw/thermo_map.h create mode 100644 2.5/boards/lpc-p2378/templates/.spec create mode 100644 2.5/boards/lpc-p2378/templates/empty/.spec create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_adc.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_afsk.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ax25.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_battfs.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_context_switch.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_dataflash.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_debug.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_fat.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_flash25.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_formatwr.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_gfx.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_hashtable.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_heap.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_i2c.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_i2s.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_kbd.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_keytag.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_kfile.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_lm75.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_md2.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_monitor.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_nmea.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_parser.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_phase.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_proc.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_pwm.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ramp.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_randpool.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_sem.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ser.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_signal.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_stepper.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_thermo.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_timer.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_wdt.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/cfg/cfg_xmodem.h create mode 100644 2.5/boards/lpc-p2378/templates/empty/empty.mk create mode 100644 2.5/boards/lpc-p2378/templates/empty/empty_user.mk create mode 100644 2.5/boards/lpc-p2378/templates/empty/main.c create mode 100644 2.5/boards/lpc-p2378/templates/empty/project.bertos create mode 100644 2.5/boards/lpc-p2378/templates/kernel/.spec create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_adc.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_afsk.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ax25.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_battfs.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_context_switch.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_dataflash.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_debug.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_fat.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_flash25.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_formatwr.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_gfx.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_hashtable.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_heap.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_i2c.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_i2s.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_kbd.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_keytag.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_kfile.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_lm75.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_md2.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_monitor.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_nmea.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_parser.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_phase.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_proc.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_pwm.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ramp.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_randpool.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_sem.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ser.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_signal.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_stepper.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_thermo.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_timer.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_wdt.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_xmodem.h create mode 100644 2.5/boards/lpc-p2378/templates/kernel/kernel.mk create mode 100644 2.5/boards/lpc-p2378/templates/kernel/kernel_user.mk create mode 100644 2.5/boards/lpc-p2378/templates/kernel/main.c create mode 100644 2.5/boards/lpc-p2378/templates/kernel/project.bertos create mode 100644 2.5/boards/stm32-p103/.image.png create mode 100644 2.5/boards/stm32-p103/.spec create mode 100644 2.5/boards/stm32-p103/benchmark/.spec create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/.spec create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_adc.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_afsk.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ax25.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_battfs.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_context_switch.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_dataflash.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_debug.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_fat.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_flash25.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_formatwr.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_gfx.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_hashtable.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_heap.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_i2c.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_i2s.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_kbd.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_keytag.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_kfile.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_lm75.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_md2.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_menu.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_monitor.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_nmea.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_parser.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_phase.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_proc.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_pwm.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ramp.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_randpool.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_sem.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ser.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_signal.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_stepper.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_thermo.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_timer.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_wdt.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_xmodem.h create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/context_switch.mk create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/context_switch_user.mk create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/main.c create mode 100644 2.5/boards/stm32-p103/benchmark/context_switch/project.bertos create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/.spec create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_adc.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_afsk.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ax25.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_battfs.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_context_switch.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_dataflash.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_debug.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_fat.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_flash25.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_formatwr.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_gfx.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_hashtable.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_heap.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_i2c.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_i2s.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_kbd.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_keytag.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_kfile.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_lm75.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_md2.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_menu.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_monitor.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_nmea.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_parser.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_phase.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_proc.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_pwm.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ramp.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_randpool.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_sem.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ser.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_signal.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_stepper.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_thermo.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_timer.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_wdt.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_xmodem.h create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/kernel_footprint.mk create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/kernel_footprint_user.mk create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/main.c create mode 100644 2.5/boards/stm32-p103/benchmark/kernel_footprint/project.bertos create mode 100644 2.5/boards/stm32-p103/hw/hw_afsk.c create mode 100644 2.5/boards/stm32-p103/hw/hw_afsk.h create mode 100644 2.5/boards/stm32-p103/hw/hw_blanker.h create mode 100644 2.5/boards/stm32-p103/hw/hw_boot.h create mode 100644 2.5/boards/stm32-p103/hw/hw_buzzer.h create mode 100644 2.5/boards/stm32-p103/hw/hw_buzzerled.h create mode 100644 2.5/boards/stm32-p103/hw/hw_cpufreq.h create mode 100644 2.5/boards/stm32-p103/hw/hw_dataflash.c create mode 100644 2.5/boards/stm32-p103/hw/hw_dataflash.h create mode 100644 2.5/boards/stm32-p103/hw/hw_dc_motor.h create mode 100644 2.5/boards/stm32-p103/hw/hw_ft245rl.h create mode 100644 2.5/boards/stm32-p103/hw/hw_i2c_bitbang.h create mode 100644 2.5/boards/stm32-p103/hw/hw_input.h create mode 100644 2.5/boards/stm32-p103/hw/hw_kbd.h create mode 100644 2.5/boards/stm32-p103/hw/hw_lcd_32122a.h create mode 100644 2.5/boards/stm32-p103/hw/hw_lcd_hd44.h create mode 100644 2.5/boards/stm32-p103/hw/hw_led.h create mode 100644 2.5/boards/stm32-p103/hw/hw_lm75.h create mode 100644 2.5/boards/stm32-p103/hw/hw_mcp41.c create mode 100644 2.5/boards/stm32-p103/hw/hw_mcp41.h create mode 100644 2.5/boards/stm32-p103/hw/hw_ntc.c create mode 100644 2.5/boards/stm32-p103/hw/hw_ntc.h create mode 100644 2.5/boards/stm32-p103/hw/hw_phase.c create mode 100644 2.5/boards/stm32-p103/hw/hw_phase.h create mode 100644 2.5/boards/stm32-p103/hw/hw_rit128x96.h create mode 100644 2.5/boards/stm32-p103/hw/hw_sd.h create mode 100644 2.5/boards/stm32-p103/hw/hw_sensor.h create mode 100644 2.5/boards/stm32-p103/hw/hw_ser.h create mode 100644 2.5/boards/stm32-p103/hw/hw_sipo.h create mode 100644 2.5/boards/stm32-p103/hw/hw_spi.h create mode 100644 2.5/boards/stm32-p103/hw/hw_spi_dma.h create mode 100644 2.5/boards/stm32-p103/hw/hw_stepper.h create mode 100644 2.5/boards/stm32-p103/hw/hw_tas5706a.h create mode 100644 2.5/boards/stm32-p103/hw/hw_tc520.h create mode 100644 2.5/boards/stm32-p103/hw/hw_thermo.h create mode 100644 2.5/boards/stm32-p103/hw/hw_timer.h create mode 100644 2.5/boards/stm32-p103/hw/hw_tlv5618.h create mode 100644 2.5/boards/stm32-p103/hw/hw_tmp123.h create mode 100644 2.5/boards/stm32-p103/hw/kbd_map.h create mode 100644 2.5/boards/stm32-p103/hw/mcp41_map.h create mode 100644 2.5/boards/stm32-p103/hw/ntc_map.h create mode 100644 2.5/boards/stm32-p103/hw/phase_map.h create mode 100644 2.5/boards/stm32-p103/hw/pwm_map.h create mode 100644 2.5/boards/stm32-p103/hw/thermo_map.h create mode 100644 2.5/boards/stm32-p103/templates/.spec create mode 100644 2.5/boards/stm32-p103/templates/empty/.spec create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_adc.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_afsk.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_ax25.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_battfs.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_context_switch.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_dataflash.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_debug.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_fat.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_flash25.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_formatwr.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_gfx.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_hashtable.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_heap.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_i2c.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_i2s.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_kbd.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_keytag.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_kfile.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_lm75.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_md2.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_monitor.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_nmea.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_parser.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_phase.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_proc.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_pwm.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_ramp.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_randpool.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_sem.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_ser.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_signal.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_stepper.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_thermo.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_timer.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_wdt.h create mode 100644 2.5/boards/stm32-p103/templates/empty/cfg/cfg_xmodem.h create mode 100644 2.5/boards/stm32-p103/templates/empty/empty.mk create mode 100644 2.5/boards/stm32-p103/templates/empty/empty_user.mk create mode 100644 2.5/boards/stm32-p103/templates/empty/main.c create mode 100644 2.5/boards/stm32-p103/templates/empty/project.bertos create mode 100644 2.5/boards/stm32-p103/templates/kernel/.spec create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_adc.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_afsk.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ax25.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_battfs.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_context_switch.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_dataflash.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_debug.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_fat.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_flash25.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_formatwr.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_gfx.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_hashtable.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_heap.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_i2c.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_i2s.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_kbd.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_keytag.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_kfile.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_lm75.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_md2.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_monitor.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_nmea.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_parser.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_phase.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_proc.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_pwm.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ramp.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_randpool.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_sem.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ser.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_signal.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_stepper.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_thermo.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_timer.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_wdt.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/cfg/cfg_xmodem.h create mode 100644 2.5/boards/stm32-p103/templates/kernel/kernel.mk create mode 100644 2.5/boards/stm32-p103/templates/kernel/kernel_user.mk create mode 100644 2.5/boards/stm32-p103/templates/kernel/main.c create mode 100644 2.5/boards/stm32-p103/templates/kernel/project.bertos create mode 100644 2.5/boards/triface/.image.png create mode 100644 2.5/boards/triface/.spec create mode 100644 2.5/boards/triface/benchmark/.spec create mode 100644 2.5/boards/triface/benchmark/context_switch/.spec create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_adc.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_afsk.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_ax25.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_battfs.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_context_switch.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_dataflash.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_debug.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_fat.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_flash25.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_formatwr.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_gfx.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_hashtable.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_heap.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_i2c.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_i2s.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_kbd.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_keytag.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_kfile.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_lm75.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_md2.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_menu.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_monitor.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_nmea.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_parser.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_phase.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_proc.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_pwm.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_ramp.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_randpool.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_sem.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_ser.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_signal.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_stepper.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_thermo.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_timer.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_wdt.h create mode 100644 2.5/boards/triface/benchmark/context_switch/cfg/cfg_xmodem.h create mode 100644 2.5/boards/triface/benchmark/context_switch/context_switch.mk create mode 100644 2.5/boards/triface/benchmark/context_switch/context_switch_user.mk create mode 100644 2.5/boards/triface/benchmark/context_switch/flash.log create mode 100644 2.5/boards/triface/benchmark/context_switch/main.c create mode 100644 2.5/boards/triface/benchmark/context_switch/project.bertos create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/.spec create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_adc.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_afsk.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ax25.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_battfs.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_context_switch.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_dataflash.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_debug.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_fat.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_flash25.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_formatwr.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_gfx.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_hashtable.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_heap.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_i2c.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_i2s.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_kbd.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_keytag.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_kfile.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_lm75.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_md2.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_menu.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_monitor.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_nmea.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_parser.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_phase.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_proc.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_pwm.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ramp.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_randpool.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_sem.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ser.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_signal.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_stepper.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_thermo.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_timer.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_wdt.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_xmodem.h create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/kernel_footprint.mk create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/kernel_footprint_user.mk create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/main.c create mode 100644 2.5/boards/triface/benchmark/kernel_footprint/project.bertos create mode 100644 2.5/boards/triface/examples/.spec create mode 100644 2.5/boards/triface/examples/triface/.spec create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_adc.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_afsk.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_ax25.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_battfs.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_context_switch.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_dataflash.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_debug.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_fat.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_flash25.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_formatwr.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_gfx.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_hashtable.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_heap.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_i2c.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_i2s.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_kbd.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_keytag.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_kfile.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_lm75.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_md2.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_menu.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_monitor.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_nmea.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_parser.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_phase.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_proc.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_pwm.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_ramp.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_randpool.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_sem.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_ser.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_signal.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_stepper.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_thermo.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_timer.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_wdt.h create mode 100644 2.5/boards/triface/examples/triface/cfg/cfg_xmodem.h create mode 100644 2.5/boards/triface/examples/triface/cmd_ctor.h create mode 100644 2.5/boards/triface/examples/triface/main.c create mode 100644 2.5/boards/triface/examples/triface/project.bertos create mode 100644 2.5/boards/triface/examples/triface/protocol.c create mode 100644 2.5/boards/triface/examples/triface/protocol.h create mode 100644 2.5/boards/triface/examples/triface/triface.mk create mode 100644 2.5/boards/triface/examples/triface/triface_user.mk create mode 100644 2.5/boards/triface/hw/hw_afsk.c create mode 100644 2.5/boards/triface/hw/hw_afsk.h create mode 100644 2.5/boards/triface/hw/hw_buzzer.h create mode 100644 2.5/boards/triface/hw/hw_dataflash.c create mode 100644 2.5/boards/triface/hw/hw_dataflash.h create mode 100644 2.5/boards/triface/hw/hw_dc_motor.h create mode 100644 2.5/boards/triface/hw/hw_ft245rl.h create mode 100644 2.5/boards/triface/hw/hw_i2c_bitbang.h create mode 100644 2.5/boards/triface/hw/hw_input.h create mode 100644 2.5/boards/triface/hw/hw_kbd.h create mode 100644 2.5/boards/triface/hw/hw_lcd_32122a.h create mode 100644 2.5/boards/triface/hw/hw_lcd_hd44.h create mode 100644 2.5/boards/triface/hw/hw_led.h create mode 100644 2.5/boards/triface/hw/hw_lm75.h create mode 100644 2.5/boards/triface/hw/hw_mcp41.c create mode 100644 2.5/boards/triface/hw/hw_mcp41.h create mode 100644 2.5/boards/triface/hw/hw_ntc.c create mode 100644 2.5/boards/triface/hw/hw_ntc.h create mode 100644 2.5/boards/triface/hw/hw_phase.c create mode 100644 2.5/boards/triface/hw/hw_phase.h create mode 100644 2.5/boards/triface/hw/hw_rit128x96.h create mode 100644 2.5/boards/triface/hw/hw_sd.h create mode 100644 2.5/boards/triface/hw/hw_ser.h create mode 100644 2.5/boards/triface/hw/hw_sipo.h create mode 100644 2.5/boards/triface/hw/hw_spi.h create mode 100644 2.5/boards/triface/hw/hw_stepper.h create mode 100644 2.5/boards/triface/hw/hw_tas5706a.h create mode 100644 2.5/boards/triface/hw/hw_thermo.h create mode 100644 2.5/boards/triface/hw/hw_tlv5618.h create mode 100644 2.5/boards/triface/hw/hw_tmp123.h create mode 100644 2.5/boards/triface/hw/kbd_map.h create mode 100644 2.5/boards/triface/hw/mcp41_map.h create mode 100644 2.5/boards/triface/hw/ntc_map.h create mode 100644 2.5/boards/triface/hw/phase_map.h create mode 100644 2.5/boards/triface/hw/pwm_map.h create mode 100644 2.5/boards/triface/hw/thermo_map.h create mode 100644 2.5/boards/triface/templates/.spec create mode 100644 2.5/boards/triface/templates/empty/.spec create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_adc.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_afsk.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_ax25.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_battfs.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_context_switch.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_dataflash.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_debug.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_fat.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_flash25.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_formatwr.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_gfx.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_hashtable.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_heap.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_i2c.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_i2s.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_kbd.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_keytag.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_kfile.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_lm75.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_md2.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_monitor.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_nmea.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_parser.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_phase.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_proc.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_pwm.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_ramp.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_randpool.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_sem.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_ser.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_signal.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_stepper.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_thermo.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_timer.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_wdt.h create mode 100644 2.5/boards/triface/templates/empty/cfg/cfg_xmodem.h create mode 100644 2.5/boards/triface/templates/empty/empty.mk create mode 100644 2.5/boards/triface/templates/empty/empty_user.mk create mode 100644 2.5/boards/triface/templates/empty/main.c create mode 100644 2.5/boards/triface/templates/empty/project.bertos create mode 100644 2.5/boards/triface/templates/kernel/.spec create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_adc.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_afsk.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_ax25.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_battfs.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_context_switch.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_dataflash.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_dc_motor.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_debug.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_fat.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_flash25.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_formatwr.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_gfx.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_hashtable.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_heap.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_i2c.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_i2s.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_ini_reader.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_kbd.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_keytag.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_kfile.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_lcd_32122a.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_lcd_hd44.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_lm75.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_md2.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_monitor.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_nmea.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_parser.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_phase.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_pocketbus.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_proc.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_pwm.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_ramp.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_randpool.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_sem.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_ser.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_signal.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_spi_bitbang.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_stepper.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_tas5706a.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_thermo.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_timer.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_wdt.h create mode 100644 2.5/boards/triface/templates/kernel/cfg/cfg_xmodem.h create mode 100644 2.5/boards/triface/templates/kernel/kernel.mk create mode 100644 2.5/boards/triface/templates/kernel/kernel_user.mk create mode 100644 2.5/boards/triface/templates/kernel/main.c create mode 100644 2.5/boards/triface/templates/kernel/project.bertos create mode 100644 2.5/doc/Mainpage.online create mode 100644 2.5/doc/Mainpage.snapshot create mode 100644 2.5/doc/README.bertos create mode 100644 2.5/doc/STATUS create mode 100644 2.5/doc/TracFooter.html create mode 100644 2.5/doc/TracHeader.html create mode 100644 2.5/doc/chm-builder.py create mode 100644 2.5/doc/chm-toc-modifier.py create mode 100644 2.5/doc/doxygen.css create mode 100644 2.5/doc/tag-filter.py create mode 100644 2.5/examples/demo/cfg/cfg_gfx.h create mode 100644 2.5/examples/demo/cfg/cfg_kbd.h create mode 100644 2.5/examples/demo/cfg/cfg_menu.h create mode 100644 2.5/examples/demo/cfg/cfg_monitor.h create mode 100644 2.5/examples/demo/cfg/cfg_proc.h create mode 100644 2.5/examples/demo/cfg/cfg_sem.h create mode 100644 2.5/examples/demo/cfg/cfg_signal.h create mode 100644 2.5/examples/demo/cfg/cfg_timer.h create mode 100644 2.5/examples/demo/demo.c create mode 100644 2.5/examples/demo/demo.mk create mode 100644 2.5/examples/demo/hw/hw_kbd.h create mode 100644 2.5/examples/demo/hw/kbd_map.h create mode 100644 2.5/examples/demo/verstag.h create mode 100644 2.5/examples/lm3s8962/cfg/cfg_debug.h create mode 100644 2.5/examples/lm3s8962/cfg/cfg_gfx.h create mode 100644 2.5/examples/lm3s8962/cfg/cfg_heap.h create mode 100644 2.5/examples/lm3s8962/cfg/cfg_kfile.h create mode 100644 2.5/examples/lm3s8962/cfg/cfg_lcd.h create mode 100644 2.5/examples/lm3s8962/cfg/cfg_monitor.h create mode 100644 2.5/examples/lm3s8962/cfg/cfg_proc.h create mode 100644 2.5/examples/lm3s8962/cfg/cfg_sem.h create mode 100644 2.5/examples/lm3s8962/cfg/cfg_ser.h create mode 100644 2.5/examples/lm3s8962/cfg/cfg_signal.h create mode 100644 2.5/examples/lm3s8962/cfg/cfg_timer.h create mode 100644 2.5/examples/lm3s8962/hw/hw_kbd.h create mode 100644 2.5/examples/lm3s8962/hw/hw_rit128x96.h create mode 100644 2.5/examples/lm3s8962/hw/kbd_map.h create mode 100644 2.5/examples/lm3s8962/lm3s8962.c create mode 100644 2.5/examples/lm3s8962/lm3s8962.mk create mode 100644 2.5/examples/randpool/randpool_demo.c create mode 100644 2.5/examples/randpool/randpool_demo.mk create mode 100644 2.5/examples/test/armtest.mk create mode 100644 2.5/examples/test/avrtest.mk create mode 100644 2.5/examples/test/empty_main.c create mode 100644 2.5/spec/at91sam7s-ek/at91sam7s-ek.bdef create mode 100644 2.5/test/afsk_test.au create mode 100755 2.5/test/enablecfg.py create mode 100755 2.5/test/gen_mk_src.sh create mode 100755 2.5/test/get_source_list.sh create mode 100644 2.5/test/ini_reader_file.ini create mode 100755 2.5/test/log_nightly_test.sh create mode 100755 2.5/test/nightly_test.sh create mode 100755 2.5/test/parselog.py create mode 100755 2.5/test/parsetest.py create mode 100755 2.5/test/run_tests.sh create mode 100644 2.5/wizard/BBoardPage.py create mode 100644 2.5/wizard/BCpuPage.py create mode 100644 2.5/wizard/BCreationPage.py create mode 100644 2.5/wizard/BEditingDialog.py create mode 100644 2.5/wizard/BFinalPage.py create mode 100644 2.5/wizard/BFolderPage.py create mode 100644 2.5/wizard/BIntroPage.py create mode 100644 2.5/wizard/BModulePage.py create mode 100644 2.5/wizard/BOpenPage.py create mode 100644 2.5/wizard/BProject.py create mode 100644 2.5/wizard/BProjectPresets.py create mode 100644 2.5/wizard/BStartPage.py create mode 100644 2.5/wizard/BToolchainPage.py create mode 100644 2.5/wizard/BToolchainSearch.py create mode 100644 2.5/wizard/BVersionPage.py create mode 100644 2.5/wizard/BWizard.py create mode 100644 2.5/wizard/BWizardPage.py create mode 100644 2.5/wizard/DefineException.py create mode 100644 2.5/wizard/LoadException.py create mode 100644 2.5/wizard/_wizard_version.py create mode 100755 2.5/wizard/bertos.py create mode 100644 2.5/wizard/bertos.qrc create mode 100644 2.5/wizard/bertos_utils.py create mode 100755 2.5/wizard/build_resources.sh create mode 100644 2.5/wizard/cltemplates/bertos.project create mode 100644 2.5/wizard/cltemplates/bertos.workspace create mode 100644 2.5/wizard/compatibility.py create mode 100644 2.5/wizard/const.py create mode 100644 2.5/wizard/copytree.py create mode 100755 2.5/wizard/create_preset.py create mode 100644 2.5/wizard/exception_handler.py create mode 100755 2.5/wizard/images/appicon.png create mode 100755 2.5/wizard/images/default_board_icon.png create mode 100755 2.5/wizard/images/default_board_image.png create mode 100755 2.5/wizard/images/default_dir_icon.png create mode 100755 2.5/wizard/images/default_project_icon.png create mode 100755 2.5/wizard/images/error.png create mode 100755 2.5/wizard/images/filenew.png create mode 100755 2.5/wizard/images/fileopen.png create mode 100755 2.5/wizard/images/folderopen.png create mode 100755 2.5/wizard/images/listadd.png create mode 100755 2.5/wizard/images/listremove.png create mode 100644 2.5/wizard/images/logo.png create mode 100755 2.5/wizard/images/ok.png create mode 100755 2.5/wizard/images/warning.png create mode 100644 2.5/wizard/mktemplates/Makefile create mode 100644 2.5/wizard/mktemplates/old/Makefile create mode 100644 2.5/wizard/mktemplates/old/template.mk create mode 100644 2.5/wizard/mktemplates/old/template_wiz.mk create mode 100644 2.5/wizard/mktemplates/template.mk create mode 100644 2.5/wizard/mktemplates/template_user.mk create mode 100644 2.5/wizard/plugins/__init__.py create mode 100644 2.5/wizard/plugins/codelite.py create mode 100644 2.5/wizard/qvariant_converter.py create mode 100644 2.5/wizard/qvariant_converter_4_4.py create mode 100644 2.5/wizard/qvariant_converter_4_5.py create mode 100644 2.5/wizard/qvariant_converter_4_6.py create mode 100644 2.5/wizard/qvariant_converter_old.py create mode 100644 2.5/wizard/relpath.py create mode 100644 2.5/wizard/srctemplates/main.c create mode 100644 2.5/wizard/test/testCpuTagsImport.py create mode 100644 2.5/wizard/test/testLoadProjectPresets.py create mode 100644 2.5/wizard/test/testModulePage.py create mode 100755 2.5/wizard/toolchain_manager.py create mode 100644 2.5/wizard/toolchain_validation.py create mode 100644 2.5/wizard/ui/bertos_versions.ui create mode 100644 2.5/wizard/ui/board_select.ui create mode 100644 2.5/wizard/ui/cpu_select.ui create mode 100644 2.5/wizard/ui/dir_select.ui create mode 100644 2.5/wizard/ui/final_page.ui create mode 100644 2.5/wizard/ui/intro_page.ui create mode 100644 2.5/wizard/ui/module_select.ui create mode 100644 2.5/wizard/ui/preset_page.ui create mode 100644 2.5/wizard/ui/project_creation.ui create mode 100644 2.5/wizard/ui/project_presets.ui create mode 100644 2.5/wizard/ui/project_select.ui create mode 100644 2.5/wizard/ui/start.ui create mode 100644 2.5/wizard/ui/toolchain_search.ui create mode 100644 2.5/wizard/ui/toolchain_select.ui create mode 100644 2.5/wizard/vtemplates/VERSION create mode 100644 2.5/wizard/winreg_importer.py diff --git a/2.5/.gdbinit b/2.5/.gdbinit new file mode 100644 index 00000000..6ed18db0 --- /dev/null +++ b/2.5/.gdbinit @@ -0,0 +1,3 @@ +# The preemptive task switching interferes with debugging +handle SIGUSR1 nostop noprint pass +handle SIGALRM nostop noprint pass diff --git a/2.5/Doxyfile b/2.5/Doxyfile new file mode 100644 index 00000000..2ba9bf1b --- /dev/null +++ b/2.5/Doxyfile @@ -0,0 +1,38 @@ +# Doxyfile 1.5.9 + +@INCLUDE = Doxyfile-common + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/reference + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT += doc/Mainpage.online + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = doc/TracHeader.html + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + diff --git a/2.5/Doxyfile-common b/2.5/Doxyfile-common new file mode 100644 index 00000000..1560e5c2 --- /dev/null +++ b/2.5/Doxyfile-common @@ -0,0 +1,1507 @@ +# Doxyfile 1.5.9 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = BeRTOS + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it parses. +# With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this tag. +# The format is ext=language, where ext is a file extension, and language is one of +# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, +# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. Note that for custom extensions you also need to set +# FILE_PATTERNS otherwise the files are not read by doxygen. + +# commented, generates warnings with old version of doxygen +#EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = YES + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = NO + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = NO + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = NO + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by +# doxygen. The layout file controls the global structure of the generated output files +# in an output format independent way. The create the layout file that represents +# doxygen's defaults, run doxygen with the -l option. You can optionally specify a +# file name after the option, if omitted DoxygenLayout.xml will be used as the name +# of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = NO + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT += bertos/ + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = *.h \ + *.c + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = doc \ + CVS \ + .svn \ + qtext/qextftp.cpp \ + wizard \ + testout \ + testout.old + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = *_test.* \ + *_moc.* + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = "python doc/tag-filter.py" + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 1 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = doc/TracFooter.html + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = doc/doxygen.css + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER +# are set, an additional index file will be generated that can be used as input for +# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated +# HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. +# For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +# commented, generates warnings with old version of doxygen +#QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see +# Qt Help Project / Custom Filters. + +# commented, generates warnings with old version of doxygen +#QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. +# Qt Help Project / Filter Attributes. + +# commented, generates warnings with old version of doxygen +#QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to FRAME, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. Other possible values +# for this tag are: HIERARCHIES, which will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list; +# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which +# disables this behavior completely. For backwards compatibility with previous +# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE +# respectively. + +GENERATE_TREEVIEW = NONE + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = YES + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = YES + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +# commented, generates warnings with old version of doxygen +#LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = YES + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = YES + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = __doxygen__ \ + __linux__ \ + __unix__ \ + __GNUC__ \ + __declspec(x) \ + _DEBUG=1 \ + FORMAT(x,y,z)= \ + PGM_FUNC(x)=x \ + INLINE=inline \ + CONFIG_FAT_DRIVES=1 \ + CONFIG_KERN_PRI=1 \ + CONFIG_TIMER_EVENTS=1 \ + CONFIG_TIMER_UDELAY=1 \ + CONFIG_KERN_SIGNALS=1 \ + CONFIG_PRINTF=4 \ + CONFIG_KFILE_GETS=1 \ + CONFIG_XMODEM_RECV=1 \ + CONFIG_XMODEM_SEND=1 \ + COMPILER_VARIADIC_MACROS=1 + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = NO + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = NO + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Options related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/2.5/Doxyfile-offline b/2.5/Doxyfile-offline new file mode 100644 index 00000000..80b361a8 --- /dev/null +++ b/2.5/Doxyfile-offline @@ -0,0 +1,40 @@ +# Doxyfile 1.5.9 + +@INCLUDE = Doxyfile-common + + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/offline-reference + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT += doc/README.bertos \ + doc/STATUS + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = YES + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = bertos-doc.chm + diff --git a/2.5/Doxyfile-snapshot b/2.5/Doxyfile-snapshot new file mode 100644 index 00000000..d4bbed28 --- /dev/null +++ b/2.5/Doxyfile-snapshot @@ -0,0 +1,38 @@ +# Doxyfile 1.5.9 + +@INCLUDE = Doxyfile-common + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/reference-snapshot + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT += doc/Mainpage.snapshot + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = doc/TracHeader.html + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + diff --git a/2.5/LICENSE.GPL b/2.5/LICENSE.GPL new file mode 100644 index 00000000..d60c31a9 --- /dev/null +++ b/2.5/LICENSE.GPL @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/2.5/Makefile b/2.5/Makefile new file mode 100644 index 00000000..4aee97b2 --- /dev/null +++ b/2.5/Makefile @@ -0,0 +1,20 @@ +# +# $Id$ +# Copyright 2002, 2003, 2004, 2006 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Author: Bernie Innocenti +# + +# Set to 1 for verbose build output, 0 for terse output +V := 0 + +default: all + +include bertos/config.mk + +#Include subtargets +include examples/demo/demo.mk +#include examples/lm3s8962/lm3s8962.mk + +include bertos/rules.mk diff --git a/2.5/Makefile.test b/2.5/Makefile.test new file mode 100644 index 00000000..5b485c11 --- /dev/null +++ b/2.5/Makefile.test @@ -0,0 +1,10 @@ +#Makefile for BeRTOS test. +#This makefile was generated automatically. + +V:= 0 +default: all + +include bertos/config.mk +include ./examples/test/avrtest.mk +include ./examples/test/armtest.mk +include bertos/rules.mk diff --git a/2.5/VERSION b/2.5/VERSION new file mode 100644 index 00000000..7f36a713 --- /dev/null +++ b/2.5/VERSION @@ -0,0 +1 @@ +BeRTOS 2.5.1 diff --git a/2.5/bertos/algo/crc.c b/2.5/bertos/algo/crc.c new file mode 100644 index 00000000..c7444740 --- /dev/null +++ b/2.5/bertos/algo/crc.c @@ -0,0 +1,93 @@ +/** + * \file + * + * + * \brief CRC table and support routines + * + * \author Bernie Innocenti + */ + +#include "crc.h" + +/** + * crctab calculated by Mark G. Mendel, Network Systems Corporation + */ +#if CPU_HARVARD && !(defined(ARCH_BOOT) && (ARCH & ARCH_BOOT)) + #define CRC_TABLE const uint16_t PROGMEM crc16tab[256] +#else + #define CRC_TABLE const uint16_t crc16tab[256] +#endif + +CRC_TABLE = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 +}; + +uint16_t crc16(uint16_t crc, const void *buffer, size_t len) +{ + const unsigned char *buf = (const unsigned char *)buffer; + while(len--) + crc = UPDCRC16(*buf++, crc); + + return crc; +} + diff --git a/2.5/bertos/algo/crc.h b/2.5/bertos/algo/crc.h new file mode 100644 index 00000000..c5c1eefd --- /dev/null +++ b/2.5/bertos/algo/crc.h @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \brief Cyclic Redundancy Check 16 (CRC). This algorithm is the one used by the XMODEM protocol. + * + * \note This algorithm is incompatible with the CCITT-CRC16. + * + * This code is based on the article Copyright 1986 Stephen Satchell. + * + * Programmers may incorporate any or all code into their programs, + * giving proper credit within the source. Publication of the + * source routines is permitted so long as proper credit is given + * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, + * Omen Technology. + * + * \author Bernie Innocenti + * + * $WIZ$ module_name = "crc16" + */ + +#ifndef ALGO_CRC_H +#define ALGO_CRC_H + +#include "cfg/cfg_arch.h" + +#include +#include + +EXTERN_C_BEGIN + +/* CRC table */ +extern const uint16_t crc16tab[256]; + + +/** + * \brief Compute the updated CRC16 value for one octet (macro version) + * + * \note This version is only intended for old/broken compilers. + * Use the inline function in new code. + * + * \param c New octet (range 0-255) + * \param oldcrc Previous CRC16 value (referenced twice, beware of side effects) + */ +#if CPU_HARVARD && !(defined(ARCH_BOOT) && (ARCH & ARCH_BOOT)) + #define UPDCRC16(c, oldcrc) (pgm_read_uint16_t(&crc16tab[((oldcrc) >> 8) ^ ((unsigned char)(c))]) ^ ((oldcrc) << 8)) +#else + #define UPDCRC16(c, oldcrc) ((crc16tab[((oldcrc) >> 8) ^ ((unsigned char)(c))]) ^ ((oldcrc) << 8)) +#endif + +/** CRC-16 init value */ +#define CRC16_INIT_VAL ((uint16_t)0) + +#ifdef INLINE +/** + * \brief Compute the updated CRC16 value for one octet (inline version) + */ +INLINE uint16_t updcrc16(uint8_t c, uint16_t oldcrc) +{ +#if CPU_HARVARD && !(defined(ARCH_BOOT) && (ARCH & ARCH_BOOT)) + return pgm_read_uint16_t(&crc16tab[(oldcrc >> 8) ^ c]) ^ (oldcrc << 8); +#else + return crc16tab[(oldcrc >> 8) ^ c] ^ (oldcrc << 8); +#endif +} +#endif // INLINE + + +/** + * This function implements the CRC 16 calculation on a buffer. + * + * \param crc Current CRC16 value. + * \param buf The buffer to perform CRC calculation on. + * \param len The length of the Buffer. + * + * \return The updated CRC16 value. + */ +extern uint16_t crc16(uint16_t crc, const void *buf, size_t len); + +int crc_testSetup(void); +int crc_testRun(void); +int crc_testTearDown(void); + +EXTERN_C_END + +#endif /* ALGO_CRC_H */ diff --git a/2.5/bertos/algo/crc_ccitt.c b/2.5/bertos/algo/crc_ccitt.c new file mode 100644 index 00000000..aed99147 --- /dev/null +++ b/2.5/bertos/algo/crc_ccitt.c @@ -0,0 +1,84 @@ +/** + * \file + * + * + * \brief CRC-CCITT table and support routines + * + * \version $Id: crc.c 2770 2009-08-05 07:57:59Z $ + * \author Francesco Sacchi + */ + +#include "crc_ccitt.h" + +const uint16_t PROGMEM crc_ccitt_tab[256] = { + 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, + 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, + 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, + 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, + 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, + 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, + 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, + 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, + 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, + 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, + 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, + 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, + 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, + 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, + 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, + 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, + 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, + 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, + 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, + 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, + 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, + 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, + 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, + 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, + 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, + 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, + 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, + 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, + 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, + 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, + 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, + 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78, +}; + +uint16_t crc_ccitt(uint16_t crc, const void *buffer, size_t len) +{ + const unsigned char *buf = (const unsigned char *)buffer; + while (len--) + crc = updcrc_ccitt(*buf++, crc); + + return crc; +} + diff --git a/2.5/bertos/algo/crc_ccitt.h b/2.5/bertos/algo/crc_ccitt.h new file mode 100644 index 00000000..40e4a81d --- /dev/null +++ b/2.5/bertos/algo/crc_ccitt.h @@ -0,0 +1,83 @@ +/** + * \file + * + * + * \brief CCITT Cyclic Redundancy Check (CRC-CCITT). + * + * \note This algorithm is incompatible with the CRC16. + * + * \version $Id: crc.h 2771 2009-08-06 07:01:06Z lottaviano $ + * \author Francesco Sacchi + * + * $WIZ$ module_name = "crc-ccitt" + */ + +#ifndef ALGO_CRC_CCITT_H +#define ALGO_CRC_CCITT_H + +#include +#include + +EXTERN_C_BEGIN + +/* CRC table */ +extern const uint16_t crc_ccitt_tab[256]; + +/** + * \brief Compute the updated CRC-CCITT value for one octet (inline version) + */ +INLINE uint16_t updcrc_ccitt(uint8_t c, uint16_t oldcrc) +{ +#if CPU_HARVARD + return (oldcrc >> 8) ^ pgm_read_uint16_t(&crc_ccitt_tab[(oldcrc ^ c) & 0xff]); +#else + return (oldcrc >> 8) ^ crc_ccitt_tab[(oldcrc ^ c) & 0xff]; +#endif +} + +/** CRC-CCITT init value */ +#define CRC_CCITT_INIT_VAL ((uint16_t)0xFFFF) + + +/** + * This function implements the CRC-CCITT calculation on a buffer. + * + * \param crc Current CRC-CCITT value. + * \param buf The buffer to perform CRC calculation on. + * \param len The length of the Buffer. + * + * \return The updated CRC-CCITT value. + */ +extern uint16_t crc_ccitt(uint16_t crc, const void *buf, size_t len); + +EXTERN_C_END + +#endif /* ALGO_CRC_CCITT_H */ diff --git a/2.5/bertos/algo/crc_test.c b/2.5/bertos/algo/crc_test.c new file mode 100644 index 00000000..7e2908d1 --- /dev/null +++ b/2.5/bertos/algo/crc_test.c @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief CRC-CCITT table and support routines + * + * \version $Id: crc.c 2770 2009-08-05 07:57:59Z $ + * \author Francesco Sacchi + */ + +#include "crc_ccitt.h" +#include "crc.h" + +#include +#include + + +int crc_testSetup(void) +{ + kdbg_init(); + return 0; +} + +int crc_testTearDown(void) +{ + return 0; +} + +int crc_testRun(void) +{ + char vector[9] = "123456789"; + + uint16_t crc = CRC_CCITT_INIT_VAL; + + crc = crc_ccitt(crc, vector, sizeof(vector)); + kprintf("crc_ccitt [%04X]\n", crc); + ASSERT(crc == 0x6F91); + + crc = CRC16_INIT_VAL; + crc = crc16(crc, vector, sizeof(vector)); + kprintf("crc16 [%04X]\n", crc); + ASSERT(crc == 0x31C3); + + return 0; +} + +TEST_MAIN(crc); diff --git a/2.5/bertos/algo/md2.c b/2.5/bertos/algo/md2.c new file mode 100644 index 00000000..a36cc763 --- /dev/null +++ b/2.5/bertos/algo/md2.c @@ -0,0 +1,337 @@ +/** + * \file + * + * + * \brief MD2 Message-Digest algorithm. + * + * The MD2 algorithm work with a constant array of 256 permutationt + * defined in RFC1319. If you don't want to use a standard array of + * permutatione you can use a md2_perm() function that generate an + * array of 256 "casual" permutation. To swich from a standard array + * to md2_perm function you must chanche CONFIG_MD2_STD_PERM defined in + * appconfig.h. + * If you need to store array in program memory you must define + * a macro _PROGMEM (for more info see cpu/pgm.h). + * + * + * \version $Id$ + * \author Daniele Basile + */ + +#include "md2.h" + +#include //memset(), memcpy(); +#include +#include //ASSERT() +#include //MIN(), countof(), ROTR(); +#include + + +#if CONFIG_MD2_STD_PERM + /* + * Official array of 256 byte pemutation contructed from digits of pi, defined + * in the RFC 1319. + */ + static const uint8_t PGM_ATTR md2_perm[256] = + { + 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, + 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, + 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, + 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, + 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, + 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, + 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, + 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, + 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, + 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, + 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, + 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, + 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, + 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, + 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, + 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, + 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, + 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 + }; + + #define MD2_PERM(x) PGM_READ_CHAR(&md2_perm[x]) +#else + /** + * Md2_perm() function generate an array of 256 "casual" permutation. + */ + + /** + * Costant define for computing an array of 256 "casual" permutation. + * \{ + */ + #define K1 5 + #define K2 3 + #define R 2 + #define X 172 + /*\}*/ + + static uint8_t md2_perm(uint8_t i) + { + + i = i * K1; + i = ROTR(i, R); + i ^= X; + i = i * K2; + + return i; + } + + #define MD2_PERM(x) md2_perm(x) + +#endif + + +/** + * Pad function. Put len_pad unsigned char in + * input block. + */ +static void md2_pad(void *_block, size_t len_pad) +{ + uint8_t *block; + + block = (uint8_t *)_block; + + ASSERT(len_pad <= CONFIG_MD2_BLOCK_LEN); + + /* + * Fill input block with len_pad char. + */ + memset(block, len_pad, len_pad); + +} + +static void md2_compute(void *_state, void *_checksum, void *_block) +{ + int i = 0; + uint16_t t = 0; + uint8_t compute_array[COMPUTE_ARRAY_LEN]; + uint8_t *state; + uint8_t *checksum; + uint8_t *block; + + state = (uint8_t *)_state; + checksum = (uint8_t *)_checksum; + block = (uint8_t *)_block; + + /* + * Copy state and checksum context in compute array. + */ + memcpy(compute_array, state, CONFIG_MD2_BLOCK_LEN); + memcpy(compute_array + CONFIG_MD2_BLOCK_LEN, block, CONFIG_MD2_BLOCK_LEN); + + /* + * Fill compute array with state XOR block + */ + for(i = 0; i < CONFIG_MD2_BLOCK_LEN; i++) + compute_array[i + (CONFIG_MD2_BLOCK_LEN * 2)] = state[i] ^ block[i]; + + /* + * Encryt block. + */ + for(i = 0; i < NUM_COMPUTE_ROUNDS; i++) + { + for(int j = 0; j < COMPUTE_ARRAY_LEN; j++) + { + compute_array[j] ^= MD2_PERM(t); + t = compute_array[j]; + } + + t = (t + i) & 0xff; //modulo 256. + } + /* + * Update checksum. + */ + t = checksum[CONFIG_MD2_BLOCK_LEN - 1]; + + for(i = 0; i < CONFIG_MD2_BLOCK_LEN; i++) + { + checksum[i] ^= MD2_PERM(block[i] ^ t); + t = checksum[i]; + } + + /* + * Update state and clean compute array. + */ + memcpy(state, compute_array, CONFIG_MD2_BLOCK_LEN); + memset(compute_array, 0, sizeof(compute_array)); +} + +/** + * Algorithm initialization. + * + * \param context empty context. + */ +void md2_init(Md2Context *context) +{ + + memset(context, 0, sizeof(Md2Context)); + +} + +/** + * Update block. + */ +void md2_update(Md2Context *context, const void *_block_in, size_t block_len) +{ + + const uint8_t *block_in; + size_t cpy_len; + + + block_in = (const uint8_t *)_block_in; + + while(block_len > 0) + { + /* + * Choose a number of block that fill input context buffer. + */ + cpy_len = MIN(block_len, CONFIG_MD2_BLOCK_LEN - context->counter); + + + /* + * Copy in the buffer input block. + */ + memcpy(&context->buffer[context->counter], block_in, cpy_len); + + /* + * Update a context counter, input block length and remaning + * context buffer block lenght. + */ + context->counter += cpy_len; + block_len -= cpy_len; + block_in += cpy_len; + + /* + * If buffer is full, compute it. + */ + if (context->counter >= CONFIG_MD2_BLOCK_LEN) + { + md2_compute(context->state, context->checksum, context->buffer); + context->counter = 0; + } + } + + +} +/** + * Ends an MD2 message digest operation. + * This fuction take an context and return a pointer + * to context state. + * + * \param context in input. + * \return a pointer to context state (message digest). + */ +uint8_t *md2_end(Md2Context *context) +{ + + uint8_t buf[CONFIG_MD2_BLOCK_LEN]; + + /* + * Fill remaning empty context buffer. + */ + md2_pad(buf, CONFIG_MD2_BLOCK_LEN - context->counter); + + /* + * Update context buffer and compute it. + */ + md2_update(context, buf, CONFIG_MD2_BLOCK_LEN - context->counter); + + /* + * Add context checksum to message input. + */ + md2_update(context, context->checksum, CONFIG_MD2_BLOCK_LEN); + + + return context->state; //return a pointer to message digest. +} +/** + * MD2 test fuction. + * This function test MD2 algorithm with a standard string specified + * in RFC 1319. + * + * \note This test work with official array of 256 byte pemutation + * contructed from digits of pi, defined in the RFC 1319. + * + */ +bool md2_test(void) +{ + + Md2Context context; + + const char *test[] = + { + "", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "12345678901234567890123456789012345678901234567890123456789012345678901234567890" + }; + + + const char *result[] = { + "\x83\x50\xe5\xa3\xe2\x4c\x15\x3d\xf2\x27\x5c\x9f\x80\x69\x27\x73", + "\xab\x4f\x49\x6b\xfb\x2a\x53\x0b\x21\x9f\xf3\x30\x31\xfe\x06\xb0", + "\x4e\x8d\xdf\xf3\x65\x02\x92\xab\x5a\x41\x08\xc3\xaa\x47\x94\x0b", + "\xd5\x97\x6f\x79\xd8\x3d\x3a\x0d\xc9\x80\x6c\x3c\x66\xf3\xef\xd8", + }; + + + for (size_t i = 0; i < countof(test); i++) + { + md2_init(&context); + md2_update(&context, test[i], strlen(test[i])); + + if(memcmp(result[i], md2_end(&context), MD2_DIGEST_LEN)) + return false; + } + + return true; +} + +#if 0 + +#include +int main(int argc, char * argv[]) +{ + + if(md2_test()) + printf("MD2 algorithm work well!\n"); + else + printf("MD2 algorithm doesn't work well.\n"); + +} + +#endif + diff --git a/2.5/bertos/algo/md2.h b/2.5/bertos/algo/md2.h new file mode 100644 index 00000000..6ddc9513 --- /dev/null +++ b/2.5/bertos/algo/md2.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief MD2 Message-Digest algorithm. + * + * The algorithm takes as input a message of arbitrary length and produces + * as output a 128-bit message digest of the input. + * It is conjectured that it is computationally infeasible to produce + * two messages having the same message digest, or to produce any + * message having a given prespecified target message digest. + * + * + * \version $Id$ + * \author Daniele Basile + * + * $WIZ$ module_name = "md2" + * $WIZ$ module_configuration = "bertos/cfg/cfg_md2.h" + */ + +#ifndef ALGO_MD2_H +#define ALGO_MD2_H + +#include "cfg/cfg_md2.h" +#include + +#define NUM_COMPUTE_ROUNDS 18 ///< Number of compute rounds. +#define COMPUTE_ARRAY_LEN CONFIG_MD2_BLOCK_LEN * 3 ///< Lenght of compute array. +#define MD2_DIGEST_LEN CONFIG_MD2_BLOCK_LEN +/** + * Context for MD2 computation. + */ +typedef struct Md2Context +{ + uint8_t buffer[CONFIG_MD2_BLOCK_LEN]; ///< Input buffer. + uint8_t state[CONFIG_MD2_BLOCK_LEN]; ///< Current state buffer. + uint8_t checksum[CONFIG_MD2_BLOCK_LEN]; ///< Checksum. + size_t counter; ///< Counter of remaining bytes. + +} Md2Context; + +void md2_init(Md2Context *context); +void md2_update(Md2Context *context, const void *block_in, size_t block_len); +uint8_t *md2_end(Md2Context *context); +bool md2_test(void); + +#endif /* ALGO_MD2_H */ diff --git a/2.5/bertos/algo/mean.h b/2.5/bertos/algo/mean.h new file mode 100644 index 00000000..893241e2 --- /dev/null +++ b/2.5/bertos/algo/mean.h @@ -0,0 +1,41 @@ +#warning revise me! + + +/** + * DECLARE_SMEAN(temperature, uint8_t, uint16_t); + * for (i = 0; i < TEMP_MEANS; ++i) + * SMEAN_ADD(temperature, adc_get(), TEMP_MEANS); + * printf("mean temperature = %d\n", SMEAN_GET(temperature)); + */ + +/** + * Instantiate a mean instance + */ +#define DECLARE_SMEAN(name, Type, SumType) \ + struct { \ + SumType sum; \ + Type result; \ + int count; \ + } name = { 0, 0, 0 } + +/** + * Insert a new sample into the mean. + * + * \note \a mean and \a max_samples are evaluated multiple times + */ +#define SMEAN_ADD(mean, sample, max_samples) \ + do { \ + (mean).sum += (sample); \ + if ((mean).count++ >= (max_samples)) \ + { \ + (mean).result = (mean).sum / (max_samples); \ + (mean).sum = 0; \ + (mean).count = 0; \ + } \ + } while (0) + +/** + * Return current mean value. + */ +#define SMEAN_GET(mean) ((mean).result) + diff --git a/2.5/bertos/algo/pid_control.c b/2.5/bertos/algo/pid_control.c new file mode 100644 index 00000000..df127e43 --- /dev/null +++ b/2.5/bertos/algo/pid_control.c @@ -0,0 +1,116 @@ +/** + * \file + * + * + * + * \brief Proportional, integral, derivative controller (PID controller) (implementation) + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#include "pid_control.h" + +#include "cfg/cfg_pid.h" + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL PID_LOG_LEVEL +#define LOG_VERBOSITY PID_LOG_FORMAT + +#include +#include + +/** + * Compute next value for reaching \a target point. + */ +piddata_t pid_control_update(PidContext *pid_ctx, piddata_t target, piddata_t curr_pos) +{ + piddata_t P; + piddata_t I; + piddata_t D; + piddata_t err; + + //Compute current error. + err = target - curr_pos; + + /* + * Compute Proportional contribute + */ + P = err * pid_ctx->cfg->kp; + + //Update integral state error + pid_ctx->i_state += err; + + //Clamp integral state between i_min and i_max + pid_ctx->i_state = MINMAX(pid_ctx->cfg->i_min, pid_ctx->i_state, pid_ctx->cfg->i_max); + + /* + * Compute Integral contribute + * + * note: for computing the integral contribute we use a sample period in seconds + * and so we divide sample_period in microsenconds for 1000. + */ + I = pid_ctx->i_state * pid_ctx->cfg->ki * ((piddata_t)pid_ctx->cfg->sample_period / 1000); + + + /* + * Compute derivative contribute + */ + D = (err - pid_ctx->prev_err) * pid_ctx->cfg->kd / ((piddata_t)pid_ctx->cfg->sample_period / 1000); + + + LOG_INFO("curr_pos[%lf],tgt[%lf],err[%f],P[%f],I[%f],D[%f]", curr_pos, target, err, P, I, D); + + + //Store the last error value + pid_ctx->prev_err = err; + piddata_t pid = MINMAX(pid_ctx->cfg->out_min, (P + I + D), pid_ctx->cfg->out_max); + + LOG_INFO("pid[%lf]",pid); + + //Clamp out between out_min and out_max + return pid; +} + +/** + * Init PID control. + */ +void pid_control_init(PidContext *pid_ctx, const PidCfg *pid_cfg) +{ + /* + * Init all values of pid control struct + */ + pid_ctx->cfg = pid_cfg; + + pid_control_reset(pid_ctx); + +} + diff --git a/2.5/bertos/algo/pid_control.h b/2.5/bertos/algo/pid_control.h new file mode 100644 index 00000000..ead5faa7 --- /dev/null +++ b/2.5/bertos/algo/pid_control.h @@ -0,0 +1,116 @@ +/** + * \file + * + * + * + * \brief Proportional, integral, derivative controller (PID controller). + * + * \version $Id$ + * + * \author Daniele Basile + * + * $WIZ$ module_name = "pid_control" + * $WIZ$ module_depends = "timer" + */ + +#ifndef ALGO_PID_CONTROL_H +#define ALGO_PID_CONTROL_H + +#include + +/** + * Data type for pid coefficient. + */ +typedef float pidk_t; +typedef float piddata_t; + +/** + * PID context structure. + */ +typedef struct PidCfg +{ + pidk_t kp; ///< Proportional term of PID control method (Gain). + pidk_t ki; ///< Integral term of PID control method (Integral Gain). + pidk_t kd; ///< Derivative of PID control method (Derivative Gain). + + piddata_t i_max; ///< Max value of integral term. + piddata_t i_min; ///< Min value of integral term. + + piddata_t out_max; ///< Man value of output. + piddata_t out_min; ///< Min value of output. + + mtime_t sample_period; ///< Sample period in milliseconds. + +} PidCfg; + + +/** + * PID context structure. + */ +typedef struct PidContext +{ + const PidCfg *cfg; + + piddata_t prev_err; ///< Previous error. + piddata_t i_state; ///< Integrator state (sum of all the preceding errors). + +} PidContext; + +/** + * Set Kp, Ki, Kd constants of PID control. + */ +INLINE void pid_control_setPid(PidCfg *pid_cfg, pidk_t kp, pidk_t ki, pidk_t kd) +{ + pid_cfg->kp = kp; + pid_cfg->ki = ki; + pid_cfg->kd = kd; +} + +/** + * Set sample period for PID control. + */ +INLINE void pid_control_setPeriod(PidCfg *pid_cfg, mtime_t sample_period) +{ + pid_cfg->sample_period = sample_period; +} + +/** + * Clear a pid control structure + */ +INLINE void pid_control_reset(PidContext *pid_ctx) +{ + pid_ctx->i_state = 0; + pid_ctx->prev_err = 0; +} + +piddata_t pid_control_update(PidContext *pid_ctx, piddata_t target, piddata_t curr_pos); +void pid_control_init(PidContext *pid_ctx, const PidCfg *pid_cfg); + +#endif /* ALGO_PID_CONTROL_H */ diff --git a/2.5/bertos/algo/ramp.c b/2.5/bertos/algo/ramp.c new file mode 100644 index 00000000..1b5dd9cd --- /dev/null +++ b/2.5/bertos/algo/ramp.c @@ -0,0 +1,201 @@ +/*! + * \file + * + * + * \brief Compute, save and load ramps for stepper motors (implementation) + * + * \version $Id$ + * + * \author Simone Zinanni + * \author Bernie Innocenti + * \author Giovanni Bajo + * \author Daniele Basile + * + * + * The formula used by the ramp is the following: + * + *
+ *            a * b
+ * f(t) = -------------
+ *         lerp(a,b,t)
+ * 
+ * + * Where a and b are the maximum and minimum speed + * respectively (minimum and maximum wavelength respectively), and lerp + * is a linear interpolation with a factor: + * + *
+ * lerp(a,b,t) =  a + t * (b - a)  =  (a * (1 - t)) + (b * t)
+ * 
+ * + * t must be in the [0,1] interval. It is easy to see that the + * following holds true: + * + *
+ * f(0) = b,   f(1) = a
+ * 
+ * + * And that the function is monotonic. So, the function effectively interpolates + * between the maximum and minimum speed through its domain ([0,1] -> [b,a]). + * + * The curve drawn by this function is similar to 1 / (sqrt(n)), so it is slower + * than a linear acceleration (which would be 1/n). + * + * The floating point version uses a slightly modified function which accepts + * the parameter in the domain [0, MT] (where MT is maxTime, the length of the + * ramp, which is a setup parameter for the ramp). This is done to reduce the + * number of operations per step. The formula looks like this: + * + *
+ *               a * b * MT
+ * g(t) = ----------------------------
+ *           (a * MT) + t * (b - a)
+ * 
+ * + * It can be shown that this g(t) = f(t * MT). The denominator + * is a linear interpolation in the range [b*MT, a*MT], as t moves in the + * interval [0, MT]. So the interpolation interval of the function is again + * [b, a]. The implementation caches the value of the numerator and parts + * of the denominator, so that the formula becomes: + * + *
+ * alpha = a * b * MT
+ * beta = a * MT
+ * gamma = b - a
+ *
+ *                alpha
+ * g(t) = ----------------------
+ *           beta + t * gamma
+ * 
+ * + * and t is exactly the parameter that ramp_evaluate() gets, + * that is the current time (in range [0, MT]). The operations performed + * for each step are just an addition, a multiplication and a division. + * + * The fixed point version of the formula instead transforms the original + * function as follows: + * + *
+ *                   a * b                         a
+ *  f(t) =  -------------------------  =  --------------------
+ *                 a                         a
+ *           b * ( - * (1 - t) + t )         - * (1 - t) + t
+ *                 b                         b
+ * 
+ * + * t must be computed by dividing the current time (24 bit integer) + * by the maximum time (24 bit integer). This is done by precomputing the + * reciprocal of the maximum time as a 0.32 fixed point number, and multiplying + * it to the current time. Multiplication is performed 8-bits a time by + * FIX_MULT32(), so that we end up with a 0.16 fixed point number for + * t (and 1-t is just its twos-complement negation). + * a/b is in the range [0,1] (because a is always less than b, + * being the minimum wavelength), so it is precomputed as a 0.16 fixed point. + * The final step is then computing the denominator and executing the division + * (32 cycles using the 1-step division instruction in the DSP). + * + * The assembly implementation is needed for efficiency, but a C version of it + * can be easily written, in case it is needed in the future. + * + */ + +#include "ramp.h" +#include + +#include // memcpy() + +void ramp_compute(struct Ramp *ramp, uint32_t clocksRamp, uint16_t clocksMinWL, uint16_t clocksMaxWL) +{ + ASSERT(clocksMaxWL >= clocksMinWL); + + // Save values in ramp struct + ramp->clocksRamp = clocksRamp; + ramp->clocksMinWL = clocksMinWL; + ramp->clocksMaxWL = clocksMaxWL; + +#if RAMP_USE_FLOATING_POINT + ramp->precalc.gamma = ramp->clocksMaxWL - ramp->clocksMinWL; + ramp->precalc.beta = (float)ramp->clocksMinWL * (float)ramp->clocksRamp; + ramp->precalc.alpha = ramp->precalc.beta * (float)ramp->clocksMaxWL; + +#else + ramp->precalc.max_div_min = ((uint32_t)clocksMinWL << 16) / (uint32_t)clocksMaxWL; + + /* Calcola 1/total_time in fixed point .32. Assumiamo che la rampa possa al + * massimo avere 25 bit (cioé valore in tick fino a 2^25, che con il + * prescaler=3 sono circa 7 secondi). Inoltre, togliamo qualche bit di precisione + * da destra (secondo quanto specificato in RAMP_CLOCK_SHIFT_PRECISION). + */ + ASSERT(ramp->clocksRamp < (1UL << (24 + RAMP_CLOCK_SHIFT_PRECISION))); + ramp->precalc.inv_total_time = 0xFFFFFFFFUL / (ramp->clocksRamp >> RAMP_CLOCK_SHIFT_PRECISION); + ASSERT(ramp->precalc.inv_total_time < 0x1000000UL); + +#endif +} + + +void ramp_setup(struct Ramp* ramp, uint32_t length, uint32_t minFreq, uint32_t maxFreq) +{ + uint32_t minWL, maxWL; + + minWL = TIME2CLOCKS(FREQ2MICROS(maxFreq)); + maxWL = TIME2CLOCKS(FREQ2MICROS(minFreq)); + + ASSERT2(minWL < 65536UL, "Maximum frequency too high"); + ASSERT2(maxWL < 65536UL, "Minimum frequency too high"); + ASSERT(maxFreq > minFreq); + + ramp_compute( + ramp, + TIME2CLOCKS(length), + TIME2CLOCKS(FREQ2MICROS(maxFreq)), + TIME2CLOCKS(FREQ2MICROS(minFreq)) + ); +} + +void ramp_default(struct Ramp *ramp) +{ + ramp_setup(ramp, RAMP_DEF_TIME, RAMP_DEF_MINFREQ, RAMP_DEF_MAXFREQ); +} + +#if RAMP_USE_FLOATING_POINT + +float ramp_evaluate(const struct Ramp* ramp, float curClock) +{ + return ramp->precalc.alpha / (curClock * ramp->precalc.gamma + ramp->precalc.beta); +} + +#else + +INLINE uint32_t fix_mult32(uint32_t m1, uint32_t m2) +{ + uint32_t accum = 0; + accum += m1 * ((m2 >> 0) & 0xFF); + accum >>= 8; + accum += m1 * ((m2 >> 8) & 0xFF); + accum >>= 8; + accum += m1 * ((m2 >> 16) & 0xFF); + return accum; +} + +// a*b >> 16 +INLINE uint16_t fix_mult16(uint16_t a, uint32_t b) +{ + return (b*(uint32_t)a) >> 16; +} + +uint16_t FAST_FUNC ramp_evaluate(const struct Ramp* ramp, uint32_t curClock) +{ + uint16_t t = FIX_MULT32(curClock >> RAMP_CLOCK_SHIFT_PRECISION, ramp->precalc.inv_total_time); + uint16_t denom = fix_mult16((uint16_t)~t + 1, ramp->precalc.max_div_min) + t; + uint16_t cur_delta = ((uint32_t)ramp->clocksMinWL << 16) / denom; + + return cur_delta; +} + +#endif + + diff --git a/2.5/bertos/algo/ramp.h b/2.5/bertos/algo/ramp.h new file mode 100644 index 00000000..6ec37c8c --- /dev/null +++ b/2.5/bertos/algo/ramp.h @@ -0,0 +1,167 @@ +/** + * \file + * + * + * \brief Compute, save and load ramps for stepper motors. + * + * The acceleration ramp is used to properly accelerate a stepper motor. The main + * entry point is the function ramp_evaluate(), which must be called at every step + * of the motor: it gets as input the time elapsed since the stepper started + * accelerating, and returns the time to wait before sending the next step. A pseudo + * usage pattern is as follows: + * + *
+ *  float time = 0;
+ *  while (1)
+ *  {
+ *      float delta = ramp_evaluate(&my_ramp, time);
+ *      sleep(delta);
+ *      do_motor_step();
+ *      time += delta;
+ *  }
+ * 
+ * + * A similar pattern can be used to decelerate (it is sufficient to move the total + * time backward, such as "time -= delta"). + * + * The ramp can be configured with ramp_setup(), providing it with the minimum and + * maximum operating frequency of the motor, and the total acceleration time in + * milliseconds (that is, the time that will be needed to accelerate from the + * minimum frequency to the maximum frequency). + * + * Both a very precise floating point and a very fast fixed point implementation + * of the ramp evaluation are provided. The fixed point is hand-optimized assembly + * for DSP56000 (but a portable C version of it can be easily written, see the + * comments in the code). + * + * \version $Id$ + * + * \author Simone Zinanni + * \author Giovanni Bajo + * \author Daniele Basile + * + * $WIZ$ module_name = "ramp" + * $WIZ$ module_configuration = "bertos/cfg/cfg_ramp.h" + */ + +#ifndef ALGO_RAMP_H +#define ALGO_RAMP_H + +#include "hw/hw_stepper.h" + +#include "cfg/cfg_ramp.h" + +#include + + +/** + * Convert microseconds to timer clock ticks + */ +#define TIME2CLOCKS(micros) ((uint32_t)(micros) * (STEPPER_CLOCK / 1000000)) + +/** + * Convert timer clock ticks back to microseconds + */ +#define CLOCKS2TIME(clocks) ((uint32_t)(clocks) / (STEPPER_CLOCK / 1000000)) + +/** + * Convert microseconds to Hz + */ +#define MICROS2FREQ(micros) (1000000UL / ((uint32_t)(micros))) + +/** + * Convert frequency (in Hz) to time (in microseconds) + */ +#define FREQ2MICROS(hz) (1000000UL / ((uint32_t)(hz))) + +/** + * Multiply \p a and \p b two integer at 32 bit and extract the high 16 bit word. + */ +#define FIX_MULT32(a,b) (((uint64_t)(a)*(uint32_t)(b)) >> 16) + +/** + * Structure holding pre-calculated data for speeding up real-time evaluation + * of the ramp. This structure is totally different between the fixed and the + * floating point version of the code. + * + * Consult the file-level documentation of ramp.c for more information about + * the values of this structure. + */ +struct RampPrecalc +{ +#if RAMP_USE_FLOATING_POINT + float beta; + float alpha; + float gamma; +#else + uint16_t max_div_min; + uint32_t inv_total_time; +#endif +}; + + +/** + * Ramp structure + */ +struct Ramp +{ + uint32_t clocksRamp; + uint16_t clocksMinWL; + uint16_t clocksMaxWL; + + struct RampPrecalc precalc; ///< pre-calculated values for speed +}; + + +/* + * Function prototypes + */ +void ramp_compute( + struct Ramp * ramp, + uint32_t clocksInRamp, + uint16_t clocksInMinWavelength, + uint16_t clocksInMaxWavelength); + + +/** Setup an acceleration ramp for a stepper motor + * + * \param ramp Ramp to fill + * \param length Length of the ramp (milliseconds) + * \param minFreq Minimum operating frequency of the motor (hertz) + * \param maxFreq Maximum operating frequency of the motor (hertz) + * + */ +void ramp_setup(struct Ramp* ramp, uint32_t length, uint32_t minFreq, uint32_t maxFreq); + + +/** + * Initialize a new ramp with default values + */ +void ramp_default(struct Ramp *ramp); + + +/** + * Evaluate the ramp at the given point. Given a \a ramp, and the current \a clock since + * the start of the acceleration, compute the next step, that is the interval at which + * send the signal to the motor. + * + * \note The fixed point version does not work when curClock is zero. Anyway, + * the first step is always clocksMaxWL, as stored within the ramp structure. + */ +#if RAMP_USE_FLOATING_POINT + float ramp_evaluate(const struct Ramp* ramp, float curClock); +#else + uint16_t ramp_evaluate(const struct Ramp* ramp, uint32_t curClock); +#endif + + +/** Self test */ +int ramp_testSetup(void); +int ramp_testRun(void); +int ramp_testTearDown(void); + +#endif /* ALGO_RAMP_H */ + diff --git a/2.5/bertos/algo/ramp_test.c b/2.5/bertos/algo/ramp_test.c new file mode 100644 index 00000000..7666662f --- /dev/null +++ b/2.5/bertos/algo/ramp_test.c @@ -0,0 +1,187 @@ +/*! + * \file + * + * + * \brief Test for compute, save and load ramps for stepper motors (implementation) + * + * \version $Id$ + * + * \author Simone Zinanni + * \author Bernie Innocenti + * \author Giovanni Bajo + * \author Daniele Basile + * + * + * The formula used by the ramp is the following: + * + *
+ *            a * b
+ * f(t) = -------------
+ *         lerp(a,b,t)
+ * 
+ * + * Where a and b are the maximum and minimum speed + * respectively (minimum and maximum wavelength respectively), and lerp + * is a linear interpolation with a factor: + * + *
+ * lerp(a,b,t) =  a + t * (b - a)  =  (a * (1 - t)) + (b * t)
+ * 
+ * + * t must be in the [0,1] interval. It is easy to see that the + * following holds true: + * + *
+ * f(0) = b,   f(1) = a
+ * 
+ * + * And that the function is monotonic. So, the function effectively interpolates + * between the maximum and minimum speed through its domain ([0,1] -> [b,a]). + * + * The curve drawn by this function is similar to 1 / (sqrt(n)), so it is slower + * than a linear acceleration (which would be 1/n). + * + * The floating point version uses a slightly modified function which accepts + * the parameter in the domain [0, MT] (where MT is maxTime, the length of the + * ramp, which is a setup parameter for the ramp). This is done to reduce the + * number of operations per step. The formula looks like this: + * + *
+ *               a * b * MT
+ * g(t) = ----------------------------
+ *           (a * MT) + t * (b - a)
+ * 
+ * + * It can be shown that this g(t) = f(t * MT). The denominator + * is a linear interpolation in the range [b*MT, a*MT], as t moves in the + * interval [0, MT]. So the interpolation interval of the function is again + * [b, a]. The implementation caches the value of the numerator and parts + * of the denominator, so that the formula becomes: + * + *
+ * alpha = a * b * MT
+ * beta = a * MT
+ * gamma = b - a
+ *
+ *                alpha
+ * g(t) = ----------------------
+ *           beta + t * gamma
+ * 
+ * + * and t is exactly the parameter that ramp_evaluate() gets, + * that is the current time (in range [0, MT]). The operations performed + * for each step are just an addition, a multiplication and a division. + * + * The fixed point version of the formula instead transforms the original + * function as follows: + * + *
+ *                   a * b                         a
+ *  f(t) =  -------------------------  =  --------------------
+ *                 a                         a
+ *           b * ( - * (1 - t) + t )         - * (1 - t) + t
+ *                 b                         b
+ * 
+ * + * t must be computed by dividing the current time (24 bit integer) + * by the maximum time (24 bit integer). This is done by precomputing the + * reciprocal of the maximum time as a 0.32 fixed point number, and multiplying + * it to the current time. Multiplication is performed 8-bits a time by + * FIX_MULT32(), so that we end up with a 0.16 fixed point number for + * t (and 1-t is just its twos-complement negation). + * a/b is in the range [0,1] (because a is always less than b, + * being the minimum wavelength), so it is precomputed as a 0.16 fixed point. + * The final step is then computing the denominator and executing the division + * (32 cycles using the 1-step division instruction in the DSP). + * + * The assembly implementation is needed for efficiency, but a C version of it + * can be easily written, in case it is needed in the future. + * + */ + +#include "ramp.h" +#include +#include + + +static bool ramp_test_single(uint32_t minFreq, uint32_t maxFreq, uint32_t length) +{ + struct Ramp r; + uint16_t cur, old; + uint32_t clock; + uint32_t oldclock; + + ramp_setup(&r, length, minFreq, maxFreq); + + cur = old = r.clocksMaxWL; + clock = 0; + oldclock = 0; + + kprintf("testing ramp: (length=%lu, min=%lu, max=%lu)\n", (unsigned long)length, (unsigned long)minFreq, (unsigned long)maxFreq); + kprintf(" [length=%lu, max=%04x, min=%04x]\n", (unsigned long)r.clocksRamp, r.clocksMaxWL, r.clocksMinWL); + + int i = 0; + int nonbyte = 0; + + while (clock + cur < r.clocksRamp) + { + oldclock = clock; + old = cur; + + clock += cur; + cur = ramp_evaluate(&r, clock); + + if (old < cur) + { + uint16_t t1 = FIX_MULT32(oldclock >> RAMP_CLOCK_SHIFT_PRECISION, r.precalc.inv_total_time); + uint16_t t2 = FIX_MULT32(clock >> RAMP_CLOCK_SHIFT_PRECISION, r.precalc.inv_total_time); + uint16_t denom1 = FIX_MULT32((uint16_t)((~t1) + 1), r.precalc.max_div_min) + t1; + uint16_t denom2 = FIX_MULT32((uint16_t)((~t2) + 1), r.precalc.max_div_min) + t2; + + kprintf(" Failed: %04x @ %lu --> %04x @ %lu\n", old, (unsigned long)oldclock, cur, (unsigned long)clock); + kprintf(" T: %04x -> %04x\n", t1, t2); + kprintf(" DENOM: %04x -> %04x\n", denom1, denom2); + + cur = ramp_evaluate(&r, clock); + return false; + } + i++; + if ((old-cur) >= 256) + nonbyte++; + } + + + + kprintf("Test finished: %04x @ %lu [min=%04x, totlen=%lu, numsteps:%d, nonbyte:%d]\n", cur, (unsigned long)clock, r.clocksMinWL, (unsigned long)r.clocksRamp, i, nonbyte); + + return true; +} + +int ramp_testSetup(void) +{ + kdbg_init(); + return 0; +} + +int ramp_testTearDown(void) +{ + return 0; +} + +int ramp_testRun(void) +{ + #define TEST_RAMP(min, max, len) do { \ + if (!ramp_test_single(min, max, len)) \ + return -1; \ + } while(0) + + TEST_RAMP(200, 5000, 3000000); + TEST_RAMP(1000, 2000, 1000000); + + return 0; +} + +TEST_MAIN(ramp); diff --git a/2.5/bertos/algo/rand.c b/2.5/bertos/algo/rand.c new file mode 100644 index 00000000..64785176 --- /dev/null +++ b/2.5/bertos/algo/rand.c @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Very simple rand() algorithm. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#include "rand.h" + +/** + * This would really belong to libc + */ +int rand(void) +{ + static unsigned long seed; + + /* Randomize seed */ + seed = (seed ^ 0x4BAD5A39UL) + 6513973UL; + + return (int)(seed>>16); +} diff --git a/2.5/bertos/algo/rand.h b/2.5/bertos/algo/rand.h new file mode 100644 index 00000000..b724c3db --- /dev/null +++ b/2.5/bertos/algo/rand.h @@ -0,0 +1,45 @@ +/** + * \file + * + * + * \brief Very simple rand() algorithm. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef RAND_H +#define RAND_H + +int rand(void); + +#endif diff --git a/2.5/bertos/algo/randpool.c b/2.5/bertos/algo/randpool.c new file mode 100644 index 00000000..e231c165 --- /dev/null +++ b/2.5/bertos/algo/randpool.c @@ -0,0 +1,258 @@ +/** + * \file + * + * + * \brief API function for to manage entropy pool. + * + * \version $Id$ + * \author Daniele Basile + */ + +#include "randpool.h" +#include "md2.h" + +#include +#include //ASSERT() +#include //MIN(), ROUND_UP(); + +#include //sprintf(); +#include //memset(), memcpy(); + +#if CONFIG_RANDPOOL_TIMER + #include //timer_clock(); +#endif + + + +/* + * Insert bytes in entropy pool, making a XOR of bytes present + * in entropy pool. + */ +static void randpool_push(EntropyPool *pool, void *_byte, size_t n_byte) +{ + size_t i = pool->pos_add; // Current number of byte insert in entropy pool. + uint8_t *byte; + + byte = (uint8_t *)_byte; + + /* + * Insert a bytes in entropy pool. + */ + for(size_t j = 0; j < n_byte; j++) + { + pool->pool_entropy[i] = pool->pool_entropy[i] ^ byte[j]; + i++; + i = i % CONFIG_SIZE_ENTROPY_POOL; + } + + pool->pos_add = i; // Update a insert bytes. +} + + +/* + * This function stir entropy pool with MD2 function hash. + * + */ +static void randpool_stir(EntropyPool *pool) +{ + size_t entropy = pool->entropy; //Save current calue of entropy. + Md2Context context; + uint8_t tmp_buf[((sizeof(size_t) * 2) + sizeof(int)) * 2 + 1]; //Temporary buffer. + + md2_init(&context); //Init MD2 algorithm. + + randpool_add(pool, NULL, 0); + + for (int i = 0; i < (CONFIG_SIZE_ENTROPY_POOL / MD2_DIGEST_LEN); i++) + { + sprintf((char *)tmp_buf, "%0x%0x%0x", pool->counter, i, pool->pos_add); + + /* + * Hash with MD2 algorithm the entropy pool. + */ + md2_update(&context, pool->pool_entropy, CONFIG_SIZE_ENTROPY_POOL); + + md2_update(&context, tmp_buf, sizeof(tmp_buf) - 1); + + /*Insert a message digest in entropy pool.*/ + randpool_push(pool, md2_end(&context), MD2_DIGEST_LEN); + + pool->counter = pool->counter + 1; + + } + + /*Insert in pool the difference between a two call of this function (see above).*/ + randpool_add(pool, NULL, 0); + + pool->entropy = entropy; //Restore old value of entropy. We haven't add entropy. +} + +/** + * Add \param entropy bits from \param data buffer to the entropy \param pool + */ +void randpool_add(EntropyPool *pool, void *data, size_t entropy) +{ + uint8_t sep[] = "\xaa\xaa\xaa\xaa"; // ?? + size_t data_len = ROUND_UP(entropy, 8) / 8; //Number of entropy byte in input. + + randpool_push(pool, data, data_len); //Insert data to entropy pool. + +#if CONFIG_RANDPOOL_TIMER + + ticks_t event = timer_clock(); + ticks_t delta; + + /*Difference of time between a two accese to entropy pool.*/ + delta = event - pool->last_counter; + + randpool_push(pool, &event, sizeof(ticks_t)); + randpool_push(pool, sep, sizeof(sep) - 1); // ?? + randpool_push(pool, &delta, sizeof(delta)); + + /* + * Count of number entropy bit add with delta. + */ + delta = delta & 0xff; + while(delta) + { + delta >>= 1; + entropy++; + } + + pool->last_counter = event; + +#endif + + pool->entropy += entropy; //Update a entropy of the pool. +} + +/** + * Randpool function initialization. + * The entropy pool can be initialize also with + * a previous entropy pool. + */ +void randpool_init(EntropyPool *pool, void *_data, size_t len) +{ + uint8_t *data; + + data = (uint8_t *)_data; + + memset(pool, 0, sizeof(EntropyPool)); + pool->pos_get = MD2_DIGEST_LEN; + +#if CONFIG_RANDPOOL_TIMER + pool->last_counter = timer_clock(); +#endif + + if(data) + { + /* + * Initialize a entropy pool with a + * previous pool, and assume all pool as + * entropy. + */ + len = MIN(len,(size_t)CONFIG_SIZE_ENTROPY_POOL); + memcpy(pool->pool_entropy, data, len); + pool->entropy = len; + } + +} + +/** + * Get the actual value of entropy. + */ +size_t randpool_size(EntropyPool *pool) +{ + return pool->entropy; +} + +/** + * Get \param n_byte from entropy pool. If n_byte is larger than number + * byte of entropy in entropy pool, randpool_get continue + * to generate pseudocasual value from previous state of + * pool. + * \param n_byte number fo bytes to read. + * \param pool is the pool entropy context. + * \param _data is the pointer to write the random data to. + */ +void randpool_get(EntropyPool *pool, void *_data, size_t n_byte) +{ + Md2Context context; + size_t i = pool->pos_get; + size_t n = n_byte; + size_t pos_write = 0; //Number of block has been written in data. + size_t len = MIN((size_t)MD2_DIGEST_LEN, n_byte); + uint8_t *data; + + data = (uint8_t *)_data; + + /* Test if i + CONFIG_MD2_BLOCK_LEN is inside of entropy pool.*/ + ASSERT((MD2_DIGEST_LEN + i) <= CONFIG_SIZE_ENTROPY_POOL); + + md2_init(&context); + + while(n > 0) + { + + /*Hash previous state of pool*/ + md2_update(&context, &pool->pool_entropy[i], MD2_DIGEST_LEN); + + memcpy(&data[pos_write], md2_end(&context), len); + + pos_write += len; //Update number of block has been written in data. + n -= len; //Number of byte copied in data. + + len = MIN(n,(size_t)MD2_DIGEST_LEN); + + i = (i + MD2_DIGEST_LEN) % CONFIG_SIZE_ENTROPY_POOL; + + /* If we haven't more entropy pool to hash, we stir it.*/ + if(i < MD2_DIGEST_LEN) + { + randpool_stir(pool); + i = pool->pos_get; + } + + } + + pool->pos_get = i; //Current number of byte we get from pool. + pool->entropy -= n_byte; //Update a entropy. + +} + +/** + * Return a pointer to entropy pool. + */ +uint8_t *randpool_pool(EntropyPool *pool) +{ + return pool->pool_entropy; +} + diff --git a/2.5/bertos/algo/randpool.h b/2.5/bertos/algo/randpool.h new file mode 100644 index 00000000..b3e678cb --- /dev/null +++ b/2.5/bertos/algo/randpool.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Collection of functions to manage entropy pool. + * + * + * \version $Id$ + * \author Daniele Basile + * + * $WIZ$ module_name = "randpool" + * $WIZ$ module_depends = "timer", "sprintf" + * $WIZ$ module_configuration = "bertos/cfg/cfg_randpool.h" + */ + +#ifndef ALGO_RANDPOOL_H +#define ALGO_RANDPOOL_H + +#include "cfg/cfg_randpool.h" +#include + + +/** + * Sturct data of entropy pool. + */ +typedef struct EntropyPool +{ + size_t entropy; ///< Actual value of entropy (byte). + size_t pos_add; ///< Number of byte added in entropy pool. + size_t pos_get; ///< Number of byte got in entropy pool. + size_t counter; ///< Counter. + +#if CONFIG_RANDPOOL_TIMER + size_t last_counter; ///< Last timer value. +#endif + + uint8_t pool_entropy[CONFIG_SIZE_ENTROPY_POOL]; ///< Entropy pool. + +} EntropyPool; + + +void randpool_add(EntropyPool *pool, void *data, size_t entropy); +void randpool_init(EntropyPool *pool, void *_data, size_t len); +size_t randpool_size(EntropyPool *pool); +void randpool_get(EntropyPool *pool, void *data, size_t n_byte); +uint8_t *randpool_pool(EntropyPool *pool); + +#endif /* ALGO_RANDPOOL_H */ diff --git a/2.5/bertos/algo/reverse_test.c b/2.5/bertos/algo/reverse_test.c new file mode 100644 index 00000000..d09de0e9 --- /dev/null +++ b/2.5/bertos/algo/reverse_test.c @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief REVERSE macro test. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include +#include +#include + + +/* Silent compiler warning */ +int reverse_testSetup(void); +int reverse_testRun(void); +int reverse_testTearDown(void); + + +int reverse_testSetup(void) +{ + kdbg_init(); + return 0; +} + +int reverse_testTearDown(void) +{ + return 0; +} + +/** + * Naive reverse implementation. + */ +static uint8_t reverse(uint8_t b) +{ + uint8_t r = 0; + + for (int i = 0; i < 8; i++) + { + r <<= 1; + r |= (b & BV(i)) ? 1 : 0; + } + + return r; +} + +int reverse_testRun(void) +{ + for (int i = 0; i < 256; i++) + { + kprintf("i [%02X], REVERSE(i) [%02X], reverse(i) [%02X]\n", i, REVERSE_UINT8(i), reverse(i)); + ASSERT(reverse(i) == REVERSE_UINT8(i)); + } + return 0; +} + +TEST_MAIN(reverse); diff --git a/2.5/bertos/algo/rle.c b/2.5/bertos/algo/rle.c new file mode 100644 index 00000000..66701e94 --- /dev/null +++ b/2.5/bertos/algo/rle.c @@ -0,0 +1,151 @@ +/** + * \file + * + * + * \brief General-purpose run-length {en,de}coding algorithm (implementation) + * + * Original source code from http://www.compuphase.com/compress.htm + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#include "rle.h" + + +/** + * Run-length encode \a len bytes from the \a input buffer + * to the \a output buffer. + */ +int rle(unsigned char *output, const unsigned char *input, int len) +{ + int count, index, i; + unsigned char first; + unsigned char *out; + + + out = output; + count = 0; + while (count < len) + { + index = count; + first = input[index++]; + + /* Scan for bytes identical to the first one */ + while ((index < len) && (index - count < 127) && (input[index] == first)) + index++; + + if (index - count == 1) + { + /* Failed to "replicate" the current byte. See how many to copy. + */ + while ((index < len) && (index - count < 127)) + { + /* Avoid a replicate run of only 2-bytes after a literal run. + * There is no gain in this, and there is a risc of loss if the + * run after the two identical bytes is another literal run. + * So search for 3 identical bytes. + */ + if ((input[index] == input[index - 1]) && + ((index > 1) && (input[index] == input[index - 2]))) + { + /* Reset the index so we can back up these three identical + * bytes in the next run. + */ + index -= 2; + break; + } + + index++; + } + + /* Output a run of uncompressed bytes: write length and values */ + *out++ = (unsigned char)(count - index); + for (i = count; i < index; i++) + *out++ = input[i]; + } + else + { + /* Output a compressed run: write length and value */ + *out++ = (unsigned char)(index - count); + *out++ = first; + } + + count = index; + } + + /* Output EOF marker */ + *out++ = 0; + + return (out - output); +} + + +/** + * Run-length decode from the \a input buffer to the \a output + * buffer. + * + * \note The output buffer must be large enough to accomodate + * all decoded output. + */ +int unrle(unsigned char *output, const unsigned char *input) +{ + signed char count; + unsigned char *out; + unsigned char value; + + + out = output; + + for (;;) + { + count = (signed char)*input++; + if (count > 0) + { + /* replicate run */ + value = *input++; + while (count--) + *out++ = value; + } + else if (count < 0) + { + /* literal run */ + while (count++) + *out++ = *input++; + } + else + /* EOF */ + break; + } + + return (out - output); +} diff --git a/2.5/bertos/algo/rle.h b/2.5/bertos/algo/rle.h new file mode 100644 index 00000000..7cb34b1b --- /dev/null +++ b/2.5/bertos/algo/rle.h @@ -0,0 +1,47 @@ +/** + * \file + * + * + * \brief General-purpose run-length {en,de}coding algorithm. + * + * \version $Id$ + * \author Bernie Innocenti + * + * $WIZ$ module_name = "rle" + */ +#ifndef RLE_H +#define RLE_H + +int rle(unsigned char *output, const unsigned char *input, int length); +int unrle(unsigned char *output, const unsigned char *input); + +#endif /* RLE_H */ diff --git a/2.5/bertos/algo/rotating_hash.h b/2.5/bertos/algo/rotating_hash.h new file mode 100644 index 00000000..abdde51a --- /dev/null +++ b/2.5/bertos/algo/rotating_hash.h @@ -0,0 +1,84 @@ +/** + * \file + * + * + * \brief Rotating Hash algorithm. + * + * This is a simple yet powerfull checksum algorithm. + * Instead of just xor-ing the data, rotating hash + * circular shift the checksum 4 place left before xoring. + * This is a bit more stronger than simply sum the data. + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * $WIZ$ module_name = "rotating_hash" + */ + + +#ifndef ALGO_ROTATING_H +#define ALGO_ROTATING_H + +#include + +typedef uint16_t rotating_t; + + +/** + * Init rotating checksum. + */ +INLINE void rotating_init(rotating_t *rot) +{ + *rot = 0; +} + +/** + * Update checksum pointed by \c rot with \c c data. + */ +INLINE void rotating_update1(uint8_t c, rotating_t *rot) +{ + *rot = (*rot << 4) ^ (*rot >> 12) ^ c; +} + +/** + * Update checksum pointed by \c rot with data supplied in \c buf. + */ +INLINE void rotating_update(const void *_buf, size_t len, rotating_t *rot) +{ + const uint8_t *buf = (const uint8_t *)_buf; + + while (len--) + rotating_update1(*buf++, rot); +} + + +#endif // ALGO_ROTATING_H diff --git a/2.5/bertos/algo/tea.c b/2.5/bertos/algo/tea.c new file mode 100644 index 00000000..b855cfbf --- /dev/null +++ b/2.5/bertos/algo/tea.c @@ -0,0 +1,132 @@ +/** + * \file + * + * + * \brief TEA Tiny Encription Algorith functions (implementation). + * + * \version $Id$ + * \author Francesco Sacchi + * + * The Tiny Encryption Algorithm (TEA) by David Wheeler and Roger Needham + * of the Cambridge Computer Laboratory + * + * Placed in the Public Domain by David Wheeler and Roger Needham. + * + * **** ANSI C VERSION **** + * + * Notes: + * + * TEA is a Feistel cipher with XOR and and addition as the non-linear + * mixing functions. + * + * Takes 64 bits of data in v[0] and v[1]. Returns 64 bits of data in w[0] + * and w[1]. Takes 128 bits of key in k[0] - k[3]. + * + * TEA can be operated in any of the modes of DES. Cipher Block Chaining is, + * for example, simple to implement. + * + * n is the number of iterations. 32 is ample, 16 is sufficient, as few + * as eight may be OK. The algorithm achieves good dispersion after six + * iterations. The iteration count can be made variable if required. + * + * Note this is optimised for 32-bit CPUs with fast shift capabilities. It + * can very easily be ported to assembly language on most CPUs. + * + * delta is chosen to be the real part of (the golden ratio Sqrt(5/4) - + * 1/2 ~ 0.618034 multiplied by 2^32). + */ + +#include "tea.h" +#include + +static uint32_t tea_func(uint32_t *in, uint32_t *sum, uint32_t *k) +{ + return ((*in << 4) + cpu_to_le32(k[0])) ^ (*in + *sum) ^ ((*in >> 5) + cpu_to_le32(k[1])); +} + +/** + * \brief TEA encryption function. + * This function encrypts v with k and returns the + * encrypted data in v. + * \param _v Array of two long values containing the data block. + * \param _k Array of four long values containing the key. + */ +void tea_enc(void *_v, void *_k) +{ + uint32_t y, z; + uint32_t sum = 0; + uint8_t n = ROUNDS; + uint32_t *v = (uint32_t *)_v; + uint32_t *k = (uint32_t *)_k; + + y=cpu_to_le32(v[0]); + z=cpu_to_le32(v[1]); + + while(n-- > 0) + { + sum += DELTA; + y += tea_func(&z, &sum, &(k[0])); + z += tea_func(&y, &sum, &(k[2])); + } + + v[0] = le32_to_cpu(y); + v[1] = le32_to_cpu(z); +} + +/** + * \brief TEA decryption function. + * This function decrypts v with k and returns the + * decrypted data in v. + * \param _v Array of two long values containing the data block. + * \param _k Array of four long values containing the key. + */ +void tea_dec(void *_v, void *_k) +{ + uint32_t y, z; + uint32_t sum = DELTA * ROUNDS; + uint8_t n = ROUNDS; + uint32_t *v = (uint32_t *)_v; + uint32_t *k = (uint32_t *)_k; + + y = cpu_to_le32(v[0]); + z = cpu_to_le32(v[1]); + + while(n-- > 0) + { + z -= tea_func(&y, &sum, &(k[2])); + y -= tea_func(&z, &sum, &(k[0])); + sum -= DELTA; + } + + v[0] = le32_to_cpu(y); + v[1] = le32_to_cpu(z); +} + diff --git a/2.5/bertos/algo/tea.h b/2.5/bertos/algo/tea.h new file mode 100644 index 00000000..712a4ea9 --- /dev/null +++ b/2.5/bertos/algo/tea.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief TEA Tiny Encription Algorith functions. + * + * Documentation for TEA is available at + * http://www.cl.cam.ac.uk/ftp/users/djw3/tea.ps. + * + * \version $Id$ + * \author Francesco Sacchi + * + * $WIZ$ module_name = "tea" + */ + +#ifndef ALGO_TEA_H +#define ALGO_TEA_H + +#include + +#define TEA_KEY_LEN 16 //!< TEA key size. +#define TEA_BLOCK_LEN 8 //!< TEA block length. + +#define DELTA 0x9E3779B9 //!< Magic value. (Golden number * 2^31) +#define ROUNDS 32 //!< Number of rounds. + +void tea_enc(void *_v, void *_k); +void tea_dec(void *_v, void *_k); + +#endif /* ALGO_TEA_H */ + diff --git a/2.5/bertos/benchmark/context_switch.c b/2.5/bertos/benchmark/context_switch.c new file mode 100644 index 00000000..12298892 --- /dev/null +++ b/2.5/bertos/benchmark/context_switch.c @@ -0,0 +1,136 @@ +/** + * \file + * + * + * \brief Context switch benchmark + * + * \author Andrea Righi + * \author Daniele Basiele + */ + +#include "context_switch.h" + +#include "hw/hw_led.h" + +#include "cfg/cfg_context_switch.h" +#include + +#include +#include + +#include +#if CONFIG_USE_HP_TIMER +#include +static Serial out; +#endif + +#include + +#define PROC_STACK_SIZE KERN_MINSTACKSIZE + +static PROC_DEFINE_STACK(hp_stack, PROC_STACK_SIZE); +static PROC_DEFINE_STACK(lp_stack, PROC_STACK_SIZE); + +static Process *hp_proc, *lp_proc, *main_proc; +#if CONFIG_USE_HP_TIMER +static hptime_t start, end; +#endif + +static void NORETURN hp_process(void) +{ + while (1) + { + sig_wait(SIG_USER0); + #if CONFIG_USE_LED + LED_ON(); + #endif + #if CONFIG_USE_HP_TIMER + end = timer_hw_hpread(); + #endif + sig_send(main_proc, SIG_USER0); + } +} + +static void NORETURN lp_process(void) +{ + while (1) + { + sig_wait(SIG_USER0); + #if CONFIG_USE_LED + LED_ON(); + LED_OFF(); + #endif + #if CONFIG_USE_HP_TIMER + start = timer_hw_hpread(); + #endif + sig_send(hp_proc, SIG_USER0); + } +} + + +void NORETURN context_switch(void) +{ + IRQ_ENABLE; + timer_init(); + proc_init(); + + #if CONFIG_USE_HP_TIMER + ser_init(&out, CONFIG_CTX_DEBUG_PORT); + ser_setbaudrate(&out, CONFIG_CTX_DEBUG_BAUDRATE); + #endif + + #if CONFIG_USE_LED + LED_INIT(); + #endif + + proc_forbid(); + hp_proc = proc_new(hp_process, NULL, PROC_STACK_SIZE, hp_stack); + lp_proc = proc_new(lp_process, NULL, PROC_STACK_SIZE, lp_stack); + main_proc = proc_current(); + proc_setPri(hp_proc, 2); + proc_setPri(lp_proc, 1); + proc_permit(); + + while (1) + { + timer_delay(100); + + sig_send(lp_proc, SIG_USER0); + sig_wait(SIG_USER0); + + #if CONFIG_USE_HP_TIMER + kfile_printf(&out.fd, + "Switch: %lu.%lu usec\n\r", + hptime_to_us((end - start)), + hptime_to_us((end - start) * 1000) % 1000); + #endif + } +} diff --git a/2.5/bertos/benchmark/context_switch.h b/2.5/bertos/benchmark/context_switch.h new file mode 100644 index 00000000..350a5312 --- /dev/null +++ b/2.5/bertos/benchmark/context_switch.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Context switch benchmark + * + * \author Andrea Righi + * \author Daniele Basiele + * + * $WIZ$ module_name = "context_switch" + * $WIZ$ module_depends = "kfile", "kern", "signal", "timer" + * $WIZ$ module_configuration = "bertos/cfg/cfg_context_switch.h" + * $WIZ$ module_hw = "bertos/hw/hw_led.h" + */ + +#ifndef BENCHMARK_CONTEXT_SWITCH_H +#define BENCHMARK_CONTEXT_SWITCH_H + +void context_switch(void); + +#endif /* BENCHMARK_CONTEXT_SWITCH_H */ diff --git a/2.5/bertos/benchmark/kernel_footprint.c b/2.5/bertos/benchmark/kernel_footprint.c new file mode 100644 index 00000000..b3cd0458 --- /dev/null +++ b/2.5/bertos/benchmark/kernel_footprint.c @@ -0,0 +1,96 @@ +/** + * \file + * + * + * \author Luca Ottaviano + * \author Andrea Righi + * \author Daniele Basile + * + * \brief Kernel footprint benchmark. + */ + +#include "kernel_footprint.h" + +#include + +#include +#include +#include +#include + +MsgPort in_port; + +static void init(void) +{ + IRQ_ENABLE; + proc_init(); +} + +static PROC_DEFINE_STACK(proc1_stack, KERN_MINSTACKSIZE); + +static NORETURN void proc1_main(void) +{ + int i; + for(;;) + { + i++; + } +} + +void kernel_footprint(void) +{ + init(); + + // generate code for process + struct Process *p = + proc_new(proc1_main, 0, sizeof(proc1_stack), proc1_stack); + proc_setPri(p, 5); + proc_yield(); + + // generate code for msg + Msg msg; + msg_initPort(&in_port, event_createSignal(p, SIG_USER1)); + msg_put(&in_port, &msg); + msg_peek(&in_port); + Msg *msg_re = msg_get(&in_port); + msg_reply(msg_re); + + // generate code for signals + sig_send(p, SIG_USER0); + + // generate code for msg + Semaphore sem; + sem_init(&sem); + sem_obtain(&sem); + sem_release(&sem); + + sig_wait(SIG_USER0); +} diff --git a/2.5/bertos/benchmark/kernel_footprint.h b/2.5/bertos/benchmark/kernel_footprint.h new file mode 100644 index 00000000..3df0a0c6 --- /dev/null +++ b/2.5/bertos/benchmark/kernel_footprint.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel footprint benchmark. + * + * $WIZ$ module_name = "kernel_footprint" + * $WIZ$ module_depends = "kfile", "kern", "signal", "msg", "semaphores", "event" + */ + +#ifndef BENCHMARK_KERNEL_FOOTPRINT_H +#define BENCHMARK_KERNEL_FOOTPRINT_H + +void kernel_footprint(void); + +#endif /* BENCHMARK_KERNEL_FOOTPRINT_H */ diff --git a/2.5/bertos/cfg/cfg_adc.h b/2.5/bertos/cfg/cfg_adc.h new file mode 100644 index 00000000..35e58661 --- /dev/null +++ b/2.5/bertos/cfg/cfg_adc.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * This frequency will be rounded down to an integer + * submultiple of CPU_FREQ. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + * $WIZ$ max = 5000000 + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 20 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [ns]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 600 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/bertos/cfg/cfg_afsk.h b/2.5/bertos/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/bertos/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/bertos/cfg/cfg_arch.h b/2.5/bertos/cfg/cfg_arch.h new file mode 100644 index 00000000..4b196a41 --- /dev/null +++ b/2.5/bertos/cfg/cfg_arch.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Set system configuration. + * + * \version $Id$ + * + * \author Bernie Innocenti + * + */ + + +#ifndef CFG_ARCH_CONFIG_H +#define CFG_ARCH_CONFIG_H + +#define ARCH_DEFAULT (1<<0) ///< Default architecture + +#define ARCH_EMUL (1<<2) ///< EMUL architecture +#define ARCH_QT (1<<3) ///< QT architecture +#define ARCH_UNITTEST (1<<4) ///< UNITTEST architecture +#define ARCH_NIGHTTEST (1<<5) ///< NIGHTTEST architecture + +#endif /* CFG_ARCH_CONFIG_H */ diff --git a/2.5/bertos/cfg/cfg_attr.h b/2.5/bertos/cfg/cfg_attr.h new file mode 100644 index 00000000..2bd23fbc --- /dev/null +++ b/2.5/bertos/cfg/cfg_attr.h @@ -0,0 +1,47 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_ATTR_H +#define CFG_ATTR_H + +/// Put a function or critical code in fast memory. +#define CONFIG_FAST_MEM 0 + + +#endif /* CFG_ATTR_H */ diff --git a/2.5/bertos/cfg/cfg_ax25.h b/2.5/bertos/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/bertos/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/bertos/cfg/cfg_battfs.h b/2.5/bertos/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/bertos/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/bertos/cfg/cfg_boot.h b/2.5/bertos/cfg/cfg_boot.h new file mode 100644 index 00000000..96319e1a --- /dev/null +++ b/2.5/bertos/cfg/cfg_boot.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Configuration file for bootloader module. + */ + +#ifndef CFG_BOOT_H +#define CFG_BOOT_H + +/// Bootloader log level +#define CONFIG_BOOT_LOG_LEVEL LOG_LVL_INFO + +/// Bootoloader log format +#define CONFIG_BOOT_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_FLASH_AT91_H */ diff --git a/2.5/bertos/cfg/cfg_buzzerled.h b/2.5/bertos/cfg/cfg_buzzerled.h new file mode 100644 index 00000000..e13b29b0 --- /dev/null +++ b/2.5/bertos/cfg/cfg_buzzerled.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for buzzerled module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_BUZZERLED_H +#define CFG_BUZZERLED_H + +/// TODO +#define CONFIG_NUM_BLDS 1 + + +#endif /* CFG_BUZZERLED_H */ + diff --git a/2.5/bertos/cfg/cfg_context_switch.h b/2.5/bertos/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/bertos/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/bertos/cfg/cfg_dataflash.h b/2.5/bertos/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/bertos/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/bertos/cfg/cfg_dc_motor.h b/2.5/bertos/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/bertos/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/bertos/cfg/cfg_debug.h b/2.5/bertos/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/bertos/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/bertos/cfg/cfg_fat.h b/2.5/bertos/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/bertos/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/bertos/cfg/cfg_flash25.h b/2.5/bertos/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/bertos/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/bertos/cfg/cfg_flash_at91.h b/2.5/bertos/cfg/cfg_flash_at91.h new file mode 100644 index 00000000..ef8e990e --- /dev/null +++ b/2.5/bertos/cfg/cfg_flash_at91.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Configuration file for flash_at91 module. + */ + +#ifndef CFG_FLASH_AT91_H +#define CFG_FLASH_AT91_H + +/// Bootloader log level +#define CONFIG_FLASH_AT91_LOG_LEVEL LOG_LVL_ERR + +/// Bootoloader log format +#define CONFIG_FLASH_AT91_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_FLASH_AT91_H */ diff --git a/2.5/bertos/cfg/cfg_flash_avr.h b/2.5/bertos/cfg/cfg_flash_avr.h new file mode 100644 index 00000000..a49b2f8b --- /dev/null +++ b/2.5/bertos/cfg/cfg_flash_avr.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \version $Id$ + * \author Manuele Fanelli + * + * \brief Configuration file for flash_avr module. + */ + +#ifndef CFG_FLASH_AVR_H +#define CFG_FLASH_AVR_H + +/** + * Bootloader section size. + * \note Remember to update this define when changing bootloader size fuses. + */ +#define CONFIG_FLASH_AVR_BOOTSIZE 8192 + +/// Bootloader log level +#define CONFIG_FLASH_AVR_LOG_LEVEL LOG_LVL_ERR + +/// Bootoloader log format +#define CONFIG_FLASH_AVR_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_BOOT_H */ diff --git a/2.5/bertos/cfg/cfg_formatwr.h b/2.5/bertos/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/bertos/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/bertos/cfg/cfg_gfx.h b/2.5/bertos/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/bertos/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/bertos/cfg/cfg_hashtable.h b/2.5/bertos/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/bertos/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/bertos/cfg/cfg_heap.h b/2.5/bertos/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/bertos/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/bertos/cfg/cfg_i2c.h b/2.5/bertos/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/bertos/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/bertos/cfg/cfg_i2s.h b/2.5/bertos/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/bertos/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/bertos/cfg/cfg_ini_reader.h b/2.5/bertos/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/bertos/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/bertos/cfg/cfg_kbd.h b/2.5/bertos/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/bertos/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/bertos/cfg/cfg_kern.h b/2.5/bertos/cfg/cfg_kern.h new file mode 100644 index 00000000..988e6de9 --- /dev/null +++ b/2.5/bertos/cfg/cfg_kern.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters (deprecated) + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_KERN_H +#define CFG_KERN_H + +#warning This file is deprecated, you should use the correct combination of cfg_proc.h, cfg_sem.h, cfg_signal.h and cfg_monitor.h +#include "cfg_proc.h" +#include "cfg_sem.h" +#include "cfg_signal.h" +#include "cfg_monitor.h" + + +/** + * Left for backwards compatibility. + * Do not use this anymore, will be deprecated soon. + */ +#define CONFIG_KERN_SCHED CONFIG_KERN + +#endif /* CFG_KERN_H */ diff --git a/2.5/bertos/cfg/cfg_keytag.h b/2.5/bertos/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/bertos/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/bertos/cfg/cfg_kfile.h b/2.5/bertos/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/bertos/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/bertos/cfg/cfg_lcd_32122a.h b/2.5/bertos/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/bertos/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/bertos/cfg/cfg_lcd_hd44.h b/2.5/bertos/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..7bea4376 --- /dev/null +++ b/2.5/bertos/cfg/cfg_lcd_hd44.h @@ -0,0 +1,69 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +/** + * Number of columns in LCD display. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "lcd_hd44_cols" + */ +#define CONFIG_LCD_COLS LCD_HD44_COLS_16 + +/** + * Number of rows in LCD display. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "lcd_hd44_rows" + */ +#define CONFIG_LCD_ROWS LCD_HD44_ROWS_2 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/bertos/cfg/cfg_lm75.h b/2.5/bertos/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/bertos/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/bertos/cfg/cfg_md2.h b/2.5/bertos/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/bertos/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/bertos/cfg/cfg_menu.h b/2.5/bertos/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/bertos/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/bertos/cfg/cfg_monitor.h b/2.5/bertos/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/bertos/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/bertos/cfg/cfg_nmea.h b/2.5/bertos/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/bertos/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/bertos/cfg/cfg_ntc.h b/2.5/bertos/cfg/cfg_ntc.h new file mode 100644 index 00000000..09b57e22 --- /dev/null +++ b/2.5/bertos/cfg/cfg_ntc.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for NTC module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NTC_H +#define CFG_NTC_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_NTC_LOG_LEVEL LOG_LVL_INFO +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_NTC_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_NTC_H */ diff --git a/2.5/bertos/cfg/cfg_parser.h b/2.5/bertos/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/bertos/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/bertos/cfg/cfg_phase.h b/2.5/bertos/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/bertos/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/bertos/cfg/cfg_pid.h b/2.5/bertos/cfg/cfg_pid.h new file mode 100644 index 00000000..5a8375bb --- /dev/null +++ b/2.5/bertos/cfg/cfg_pid.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PID_H +#define CFG_PID_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PID_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PID_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PID_H */ diff --git a/2.5/bertos/cfg/cfg_pocketbus.h b/2.5/bertos/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/bertos/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/bertos/cfg/cfg_proc.h b/2.5/bertos/cfg/cfg_proc.h new file mode 100644 index 00000000..3c9439fb --- /dev/null +++ b/2.5/bertos/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 0 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 0 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 0 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/bertos/cfg/cfg_pwm.h b/2.5/bertos/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/bertos/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/bertos/cfg/cfg_ramp.h b/2.5/bertos/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/bertos/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/bertos/cfg/cfg_randpool.h b/2.5/bertos/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/bertos/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/bertos/cfg/cfg_sem.h b/2.5/bertos/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/bertos/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/bertos/cfg/cfg_ser.h b/2.5/bertos/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/bertos/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/bertos/cfg/cfg_signal.h b/2.5/bertos/cfg/cfg_signal.h new file mode 100644 index 00000000..e78a4519 --- /dev/null +++ b/2.5/bertos/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 0 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/bertos/cfg/cfg_spi_bitbang.h b/2.5/bertos/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/bertos/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/bertos/cfg/cfg_spi_dma.h b/2.5/bertos/cfg/cfg_spi_dma.h new file mode 100644 index 00000000..0a69f757 --- /dev/null +++ b/2.5/bertos/cfg/cfg_spi_dma.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for spi dma module. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef CFG_SPI_DMA_H +#define CFG_SPI_DMA_H + +/** + * Size of the outbound FIFO buffer for SPI DMA [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_SPI_DMA_TXBUFSIZE 512 + + +/** + * Max size received for each DMA transfer [bytes]. + * Longer buffers will be split in two or more transfers of this size. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SPI_DMA_MAX_RX 512 + + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SPI_DMA_TX_TIMEOUT -1 + + +#endif /* CFG_SER_H */ diff --git a/2.5/bertos/cfg/cfg_stepper.h b/2.5/bertos/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/bertos/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/bertos/cfg/cfg_tas5706a.h b/2.5/bertos/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/bertos/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/bertos/cfg/cfg_thermo.h b/2.5/bertos/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/bertos/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/bertos/cfg/cfg_timer.h b/2.5/bertos/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/bertos/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/bertos/cfg/cfg_wdt.h b/2.5/bertos/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/bertos/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/bertos/cfg/cfg_xmodem.h b/2.5/bertos/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/bertos/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/bertos/cfg/compiler.h b/2.5/bertos/cfg/compiler.h new file mode 100644 index 00000000..a56ef870 --- /dev/null +++ b/2.5/bertos/cfg/compiler.h @@ -0,0 +1,553 @@ +/** + * \file + * + * + * \brief Additional support macros for compiler independance + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef BERTOS_COMPILER_H +#define BERTOS_COMPILER_H + +#include + + +#if defined __GNUC__ && defined __GNUC_MINOR__ + #define GNUC_PREREQ(maj, min) \ + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) +#else + #define GNUC_PREREQ(maj, min) 0 +#endif + +/* Some CW versions do not allow enabling C99 from the settings panel. */ +#if defined(__MWERKS__) + #pragma c99 on +#endif + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + #define COMPILER_C99 1 +#else + #define COMPILER_C99 0 +#endif + + +/** Concatenate two different preprocessor tokens (allowing macros to expand) */ +#define PP_CAT(x,y) PP_CAT__(x,y) +#define PP_CAT__(x,y) x ## y +#define PP_CAT3(x,y,z) PP_CAT(PP_CAT(x,y),z) +#define PP_CAT4(x,y,z,w) PP_CAT(PP_CAT3(x,y,z),w) +#define PP_CAT5(x,y,z,w,j) PP_CAT(PP_CAT4(x,y,z,w),j) + +/** String-ize a token (allowing macros to expand) */ +#define PP_STRINGIZE(x) PP_STRINGIZE__(x) +#define PP_STRINGIZE__(x) #x + + +#if defined(__IAR_SYSTEMS_ICC) || defined(__IAR_SYSTEMS_ICC__) + + #pragma language=extended + + #if CPU_ARM + + #define COMPILER_VARIADIC_MACROS 1 + + #define INTERRUPT(x) __irq __arm void x (void) + #define INLINE static inline + + /* Include some standard C89/C99 stuff */ + #include + #include + #include + + #elif CPU_I196 + + // IAR has size_t as built-in type, but does not define this symbol. + #define _SIZE_T_DEFINED + + #define INTERRUPT(x) interrupt [x] + #define REGISTER shortad + #define INLINE /* unsupported */ + + /* + * Imported from . Unfortunately, we can't just include + * this header because it typedefs jmp_buf to be an array of chars. + * This would allow the compiler to place the buffer on an odd address. + * The CPU _should_ be able to perform word accesses to + * unaligned data, but there are *BUGS* in the 80196KC with + * some combinations of opcodes and addressing modes. One of + * these, "ST SP,[?GR]+" is used in the longjmp() implementation + * provided by the IAR compiler ANSI C library. When ?GR contains + * an odd address, surprisingly the CPU will copy the high order + * byte of the source operand (SP) in the low order byte of the + * destination operand (the memory location pointed to by ?GR). + * + * We also need to replace the library setjmp()/longjmp() with + * our own versions because the IAR implementation "forgets" to + * save the contents of local registers (?LR). + */ + struct _JMP_BUF + { + void *sp; /* Stack pointer */ + void *return_addr; /* Return address */ + int lr[6]; /* 6 local registers */ + }; + + typedef struct _JMP_BUF jmp_buf[1]; + + int setjmp(jmp_buf env); + void longjmp(jmp_buf env, int val); + + /* Fake bool support */ + #define true (1==1) + #define false (1!=1) + typedef unsigned char bool; + + #else + #error Unsupported CPU + #endif + +#elif defined(_MSC_VER) /* Win32 emulation support */ + + /* MSVC doesn't provide . */ + #ifndef __cplusplus + #define true (1==1) + #define false (1!=1) + typedef int bool; + #endif /* !__cplusplus */ + + /* These C99 functions are oddly named in MSVCRT32.lib */ + #define snprintf _snprintf + #define vsnprintf _vsnprintf + + /* MSVC doesn't support C99's __func__, but has a similar extension. */ + #define __func__ __FUNCTION__ + + /* MSVC doesn't support C99's inline keyword */ + #ifndef __cplusplus + #define INLINE __inline + #endif + +#elif defined(__GNUC__) + + /* Compiler features */ + #define COMPILER_VARIADIC_MACROS 1 /* Even in C++ */ + #define COMPILER_TYPEOF 1 + #define COMPILER_STATEMENT_EXPRESSIONS 1 + + /* GCC attributes */ + #define FORMAT(type,fmt,first) __attribute__((__format__(type, fmt, first))) + #define NORETURN __attribute__((__noreturn__)) + #define UNUSED_ARG(type,arg) __attribute__((__unused__)) type arg + #define UNUSED_VAR(type,name) __attribute__((__unused__)) type name + #define USED_VAR(type,name) __attribute__((__used__)) type name + #define INLINE static inline __attribute__((__always_inline__)) + #define NOINLINE __attribute__((noinline)) + #define LIKELY(x) __builtin_expect(!!(x), 1) + #define UNLIKELY(x) __builtin_expect(!!(x), 0) + #define PURE_FUNC __attribute__((pure)) + #define CONST_FUNC __attribute__((const)) + #define UNUSED_FUNC __attribute__((unused)) + #define USED_FUNC __attribute__((__used__)) + #define RESTRICT __restrict__ + #define MUST_CHECK __attribute__((warn_unused_result)) + #define PACKED __attribute__((packed)) + #if CPU_ARM | CPU_CM3 + #define NAKED __attribute__((naked)) + #else + #define NAKED + #endif + + /** + * Force compiler to realod context variable. + */ + #define MEMORY_BARRIER asm volatile ("" : : : "memory") + + #if GNUC_PREREQ(3,1) + #define DEPRECATED __attribute__((__deprecated__)) + #endif + + #if GNUC_PREREQ(4,5) + #define UNREACHABLE() __builtin_unreachable() + #endif + + #ifndef __cplusplus + #define ASSERT_TYPE_EQUAL(var1, var2) \ + STATIC_ASSERT(__builtin_types_compatible_p(typeof(var1), typeof(var2))) + #define ASSERT_TYPE_IS(var, type) \ + STATIC_ASSERT(__builtin_types_compatible_p(typeof(var), type)) + #endif + + /* Include some standard C89/C99 stuff */ + #include + #include + #include + #if !CPU_AVR + #include /* for ssize_t */ + #endif + + #ifndef __cplusplus + /* + * Disallow some C++ keywords as identifiers in C programs, + * for improved portability. + */ + #pragma GCC poison new delete class template typename + #pragma GCC poison private protected public operator + #pragma GCC poison friend mutable using namespace + #pragma GCC poison cin cout cerr clog + #endif + + + +#elif defined(__MWERKS__) + + /* Compiler features */ + #define COMPILER_VARIADIC_MACROS 1 + #define COMPILER_TYPEOF 1 + #define COMPILER_STATEMENT_EXPRESSIONS 1 + + #define typeof __typeof__ + + #define UNUSED_ARG(type,arg) type + + #include + #include + #include + + // CodeWarrior has size_t as built-in type, but does not define this symbol. + #define _SIZE_T_DEFINED + +#else + #error unknown compiler +#endif + + +/* Defaults for compiler extensions. */ + +/** + * \def COMPILER_VARIADIC_MACROS + * Support for macros with variable arguments. + */ +#ifndef COMPILER_VARIADIC_MACROS +#define COMPILER_VARIADIC_MACROS (COMPILER_C99 != 0) +#endif + +/** + * \def COMPILER_TYPEOF + * Support for dynamic type identification. + */ +#ifndef COMPILER_TYPEOF +#define COMPILER_TYPEOF 0 +#endif + +/** + * \def COMPILER_STATEMENT_EXPRESSIONS + * Support for statement expressions. + */ +#ifndef COMPILER_STATEMENT_EXPRESSIONS +#define COMPILER_STATEMENT_EXPRESSIONS 0 +#endif + +/* A few defaults for missing compiler features. */ +#ifndef INLINE +#define INLINE static inline +#endif +#ifndef NOINLINE +#define NOINLINE /* nothing */ +#endif +#ifndef NORETURN +#define NORETURN /* nothing */ +#endif +#ifndef FORMAT +#define FORMAT(type,fmt,first) /* nothing */ +#endif +#ifndef DEPRECATED +#define DEPRECATED /* nothing */ +#endif +#ifndef UNUSED_ARG +#define UNUSED_ARG(type,arg) type arg +#endif +#ifndef UNUSED_VAR +#define UNUSED_VAR(type,name) type name +#endif +#ifndef USED_VAR +#define USED_VAR(type,name) type name +#endif +#ifndef REGISTER +#define REGISTER /* nothing */ +#endif +#ifndef LIKELY +#define LIKELY(x) x +#endif +#ifndef UNLIKELY +#define UNLIKELY(x) x +#endif +#ifndef PURE_FUNC +#define PURE_FUNC /* nothing */ +#endif +#ifndef CONST_FUNC +#define CONST_FUNC /* nothing */ +#endif +#ifndef UNUSED_FUNC +#define UNUSED_FUNC /* nothing */ +#endif +#ifndef USED_FUNC +#define USED_FUNC /* nothing */ +#endif +#ifndef RESTRICT +#define RESTRICT /* nothing */ +#endif +#ifndef MUST_CHECK +#define MUST_CHECK /* nothing */ +#endif +#ifndef PACKED +#define PACKED /* nothing */ +#endif +#ifndef MEMORY_BARRIER +#define MEMORY_BARRIER /* nothing */ +#warning No memory barrier defined for select compiler. If you use the kernel check it. +#endif +#ifndef UNREACHABLE +#define UNREACHABLE() for (;;) +#endif + + +/* Misc definitions */ +#ifndef NULL +#define NULL (void *)0 +#endif +#ifndef EOF +#define EOF (-1) +#endif + +/* Support for hybrid C/C++ applications. */ +#ifdef __cplusplus + #define EXTERN_C extern "C" + #define EXTERN_C_BEGIN extern "C" { + #define EXTERN_C_END } + #define EXTERN_CONST extern const + #define CONST_CAST(TYPE,EXPR) (const_cast(EXPR)) +#else + #define EXTERN_C extern + #define EXTERN_C_BEGIN /* nothing */ + #define EXTERN_C_END /* nothing */ + #define EXTERN_CONST const + #define CONST_CAST(TYPE,EXPR) ((TYPE)(EXPR)) /* FIXME: How can we suppress the warning in C? */ +#endif + + +#if defined(_MSC_VER) \ + || ((defined(__IAR_SYSTEMS_ICC) || defined(__IAR_SYSTEMS_ICC__)) && CPU_I196) + /** + * \name ISO C99 fixed-size types + * + * These should be in , but a few compilers lack them. + * \{ + */ + typedef signed char int8_t; + typedef unsigned char uint8_t; + typedef short int int16_t; + typedef unsigned short int uint16_t; + typedef long int int32_t; /* _WIN64 safe */ + typedef unsigned long int uint32_t; /* _WIN64 safe */ + + #ifdef _MSC_VER + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; + #else + typedef long long int64_t; + typedef unsigned long long uint64_t; + #endif + /* \} */ +#else + /* This is the standard location. */ + #include +#endif + +#if CPU_AVR_ATMEGA8 + /* + * The ATmega8 has a very small Flash, so we can't afford + * to link in support routines for 32bit integer arithmetic. + */ + typedef int16_t ticks_t; /**< Type for time expressed in ticks. */ + typedef int16_t mtime_t; /**< Type for time expressed in milliseconds. */ + typedef int16_t utime_t; /**< Type for time expressed in microseconds. */ + #define SIZEOF_MTIME_T (16 / CPU_BITS_PER_CHAR) + #define SIZEOF_UTIME_T (16 / CPU_BITS_PER_CHAR) + #define MTIME_INFINITE 0x7FFFL +#else + typedef int32_t ticks_t; /**< Type for time expressed in ticks. */ + + typedef int32_t utime_t; /**< Type for time expressed in microseconds. */ + #define SIZEOF_UTIME_T (32 / CPU_BITS_PER_CHAR) + + #ifndef DEVLIB_MTIME_DEFINED + #define DEVLIB_MTIME_DEFINED 1 /* Resolve conflict with */ + typedef int32_t mtime_t; /**< Type for time expressed in milliseconds. */ + #define SIZEOF_MTIME_T (32 / CPU_BITS_PER_CHAR) + #define MTIME_INFINITE 0x7FFFFFFFL + #endif +#endif + +/** Bulk storage large enough for both pointers or integers. */ +typedef void * iptr_t; + +/** Bulk storage large enough for both pointers to constants or integers. */ +typedef const void * const_iptr_t; + +typedef unsigned char sigbit_t; /**< Type for signal bits. */ +typedef unsigned char sigmask_t; /**< Type for signal masks. */ + + +/** + * \name Standard type definitions. + * + * These should be in or , but many compilers + * and C libraries lack them. + * + * We check for some common definitions to avoid redefinitions: + * + * glibc, avr-libc: _SIZE_T_DEFINED, __ssize_t_defined + * Darwin libc: _BSD_SIZE_T_DEFINED_, _SIZE_T + * IAR ARM: _SIZE_T + * + * \{ + */ +#if !(defined(size_t) || defined(_SIZE_T_DEFINED) || defined(_BSD_SIZE_T_DEFINED_) \ + || defined(_SIZE_T)) + #if CPU_X86 + /* 32bit or 64bit (32bit for _WIN64). */ + typedef unsigned long size_t; + #else + #error Unknown CPU + #endif +#endif + +#if !(defined(ssize_t) || defined(_SSIZE_T) || defined(__ssize_t_defined)) + #if CPU_X86 + /* 32bit or 64bit (32bit for _WIN64). */ + typedef long ssize_t; + #elif CPU_ARM || CPU_CM3 + typedef int ssize_t; + #elif CPU_AVR + /* 16bit (missing in avr-libc's sys/types.h). */ + typedef int ssize_t; + #else + #error Unknown CPU + #endif +#endif +/*\}*/ + + +/** + * \name Types for hardware registers. + * + * Only use these types for registers whose contents can + * be changed asynchronously by external hardware. + * + * \{ + */ +#if CPU_DSP56K + /* Registers can be accessed only through 16-bit pointers */ + typedef volatile uint16_t reg16_t; +#else + typedef volatile uint8_t reg8_t; + typedef volatile uint16_t reg16_t; + typedef volatile uint32_t reg32_t; +#endif +/*\}*/ + + +/* Quasi-ANSI macros */ +#ifndef offsetof + /** + * Return the byte offset of the member \a m in struct \a s. + * + * \note This macro should be defined in "stddef.h" and is sometimes + * compiler-specific (g++ has a builtin for it). + */ + #define offsetof(s,m) (size_t)&(((s *)0)->m) +#endif +#ifndef countof + /** + * Count the number of elements in the static array \a a. + * + * \note This macro is non-standard, but implements a very common idiom + */ + #define countof(a) (sizeof(a) / sizeof(*(a))) +#endif +#ifndef alignof + /** + * Return the alignment in memory of a generic data type. + * + * \note We need to worry about alignment when allocating memory that + * will be used later by unknown objects (e.g., malloc()) or, more + * generally, whenever creating generic container types. + */ + #define alignof(type) offsetof(struct { char c; type member; }, member) +#endif + +/** + * Cast a member of a structure out to the containing structure. + * + * \param ptr the pointer to the member. + * \param type the type of the container struct this is embedded in. + * \param member the name of the member within the struct. + */ +#if COMPILER_TYPEOF && COMPILER_STATEMENT_EXPRESSIONS + #define containerof(ptr, type, member) ({ \ + typeof( ((type *)0)->member ) *_mptr = (ptr); /* type check */ \ + (type *)(void *)((char *)_mptr - offsetof(type, member)); \ + }) +#else + #define containerof(ptr, type, member) \ + ( (type *)(void *)((char *)(ptr) - offsetof(type, member)) ) +#endif + +/** Issue a compilation error if the \a condition is false */ +#define STATIC_ASSERT(condition) \ + UNUSED_VAR(extern char, STATIC_ASSERTION_FAILED__[(condition) ? 1 : -1]) + +#ifndef ASSERT_TYPE_EQUAL + /** Ensure two variables have the same type. */ + #define ASSERT_TYPE_EQUAL(var1, var2) \ + do { (void)(&(var1) == &(var2)); } while(0) +#endif + +#ifndef ASSERT_TYPE_IS + /** Ensure variable is of specified type. */ + #define ASSERT_TYPE_IS(var, type) \ + do { (void)(&(var) == (type *)0); } while(0) +#endif + +#endif /* BERTOS_COMPILER_H */ diff --git a/2.5/bertos/cfg/debug.h b/2.5/bertos/cfg/debug.h new file mode 100644 index 00000000..cccaf8cc --- /dev/null +++ b/2.5/bertos/cfg/debug.h @@ -0,0 +1,327 @@ +/** + * \file + * + * + * \brief Simple debug facilities for hosted and embedded C/C++ applications. + * + * Debug output goes to stderr in hosted applications. + * Freestanding (AKA embedded) applications use \c drv/kdebug.c to output + * diagnostic messages to a serial terminal or a JTAG debugger. + * + * \author Bernie Innocenti + * + * $WIZ$ module_name = "debug" + * $WIZ$ module_configuration = "bertos/cfg/cfg_debug.h" + * $WIZ$ DEBUG = 1 + * $WIZ$ module_depends = "formatwr" + * $WIZ$ module_supports = "not atmega103" + */ + +#ifndef BERTOS_DEBUG_H +#define BERTOS_DEBUG_H + +#include +#include + + +/* + * Defaults for rarely used config stuff. + */ +#ifndef CONFIG_KDEBUG_DISABLE_TRACE +#define CONFIG_KDEBUG_DISABLE_TRACE 0 +#endif + +#ifndef CONFIG_KDEBUG_ASSERT_NO_TEXT +#define CONFIG_KDEBUG_ASSERT_NO_TEXT 0 +#endif + +#if defined(__doxygen__) + /** + * Preprocessor symbol defined only for debug builds. + * + * The build infrastructure must arrange for _DEBUG to + * be predefined for all the source files being compiled. + * + * This is compatible with the MSVC convention for the + * default Debug and Release project targets. + */ + #define _DEBUG 1 +#endif + +#ifdef _DEBUG + // STLport specific: enable extra checks + #define __STL_DEBUG 1 + + // MSVC specific: Enable memory allocation debug + #if defined(_MSC_VER) + #include + #endif + + /* + * On UNIX systems the extabilished practice is to define + * NDEBUG for release builds and nothing for debug builds. + */ + #ifdef NDEBUG + #undef NDEBUG + #endif + + /** + * This macro duplicates the old MSVC trick of redefining + * THIS_FILE locally to avoid the overhead of many duplicate + * strings in ASSERT(). + */ + #ifndef THIS_FILE + #define THIS_FILE __FILE__ + #endif + + /** + * This macro can be used to conditionally exclude one or more + * statements conditioned on \c _DEBUG, avoiding the clutter + * of ifdef/endif pairs. + * + * \code + * struct FooBar + * { + * int foo; + * bool bar; + * DB(int ref_count;) // Track number of users + * + * void release() + * { + * DB(--ref_count;) + * } + * }; + * \endcode + */ + #define DB(x) x + + #include "cfg/cfg_debug.h" /* CONFIG_KDEBUG_ASSERT_NO_TEXT */ + #include /* CPU_HARVARD */ + + /* These are implemented in drv/kdebug.c */ + void kdbg_init(void); + void kputchar(char c); + int kputnum(int num); + void kdump(const void *buf, size_t len); + void __init_wall(long *wall, int size); + + #if CPU_HARVARD + #include + void kputs_P(const char *PROGMEM str); + void kprintf_P(const char *PROGMEM fmt, ...) FORMAT(__printf__, 1, 2); + int __bassert_P(const char *PROGMEM cond, const char *PROGMEM file, int line); + void __trace_P(const char *func); + void __tracemsg_P(const char *func, const char *PROGMEM fmt, ...); + int __invalid_ptr_P(void *p, const char *PROGMEM name, const char *PROGMEM file, int line); + int __check_wall_P(long *wall, int size, const char * PGM_ATTR name, const char * PGM_ATTR file, int line); + #define kputs(str) kputs_P(PSTR(str)) + #define kprintf(fmt, ...) kprintf_P(PSTR(fmt) ,## __VA_ARGS__) + #define __bassert(cond, file, line) __bassert_P(PSTR(cond), PSTR(file), (line)) + #define __trace(func) __trace_P(func) + #define __tracemsg(func, fmt, ...) __tracemsg_P(func, PSTR(fmt), ## __VA_ARGS__) + #define __invalid_ptr(p, name, file, line) __invalid_ptr_P((p), PSTR(name), PSTR(file), (line)) + #define __check_wall(wall, size, name, file, line) __check_wall_P(wall, size, PSTR(name), PSTR(file), (line)) + #else /* !CPU_HARVARD */ + void kputs(const char *str); + void kprintf(const char *fmt, ...) FORMAT(__printf__, 1, 2); + int __bassert(const char *cond, const char *file, int line); + void __trace(const char *func); + void __tracemsg(const char *func, const char *fmt, ...) FORMAT(__printf__, 2, 3); + int __invalid_ptr(void *p, const char *name, const char *file, int line); + int __check_wall(long *wall, int size, const char *name, const char *file, int line); + #endif /* !CPU_HARVARD */ + + #if !CONFIG_KDEBUG_ASSERT_NO_TEXT + #define ASSERT(x) ((void)(LIKELY(x) ? 0 : __bassert(#x, THIS_FILE, __LINE__))) + #define ASSERT2(x, help) ((void)(LIKELY(x) ? 0 : __bassert(help " (" #x ")", THIS_FILE, __LINE__))) + #else + #define ASSERT(x) ((void)(LIKELY(x) ? 0 : __bassert("", THIS_FILE, __LINE__))) + #define ASSERT2(x, help) ((void)ASSERT(x)) + #endif + + /** + * Check that the given pointer is either NULL or pointing to valid memory. + * + * The assumption here is that valid pointers never point to low + * memory regions. This helps catching pointers taken from + * struct/class memebers when the struct pointer was NULL. + * + * \see ASSERT_VALID_PTR_OR_NULL() + */ + #define ASSERT_VALID_PTR(p) ((void)(LIKELY((void *)(p) >= (void *)CPU_RAM_START) \ + ? 0 : __invalid_ptr(p, #p, THIS_FILE, __LINE__))) + + /** + * Check that the given pointer is not pointing to invalid memory. + * + * \note The check for invalid memory is architecture specific and + * conservative. The current implementation only checks against + * a lower bound. + * + * \see ASSERT_VALID_PTR() + */ + #define ASSERT_VALID_PTR_OR_NULL(p) ((void)(LIKELY((p == NULL) \ + || ((void *)(p) >= (void *)CPU_RAM_START)) \ + ? 0 : __invalid_ptr((p), #p, THIS_FILE, __LINE__))) + + #if !CONFIG_KDEBUG_DISABLE_TRACE + #define TRACE __trace(__func__) + #define TRACEMSG(msg,...) __tracemsg(__func__, msg, ## __VA_ARGS__) + #else + #define TRACE do {} while(0) + #define TRACEMSG(...) do {} while(0) + #endif + + + /** + * \name Walls to detect data corruption + * \{ + */ + #define WALL_SIZE 8 + #define WALL_VALUE (long)0xABADCAFEL + #define DECLARE_WALL(name,size) long name[(size) / sizeof(long)]; + #define FWD_DECLARE_WALL(name,size) extern long name[(size) / sizeof(long)]; + #define INIT_WALL(name) __init_wall((name), countof(name)) + #define CHECK_WALL(name) __check_wall((name), countof(name), #name, THIS_FILE, __LINE__) + /*\}*/ + + /** + * Check that the given pointer actually points to an object + * of the specified type. + */ + #define ASSERT_VALID_OBJ(_t, _o) do { \ + ASSERT_VALID_PTR((_o)); \ + ASSERT(dynamic_cast<_t>((_o)) != NULL); \ + } + + /** + * \name Debug object creation and destruction. + * + * These macros help track some kinds of leaks in C++ programs. + * Usage is as follows: + * + * \code + * class Foo + * { + * DECLARE_INSTANCE_TRACKING(Foo) + * + * Foo() + * { + * NEW_INSTANCE(Foo); + * // ... + * } + * + * ~Foo() + * { + * DELETE_INSTANCE(Foo); + * // ... + * } + * }; + * + * // Put this in the implementation file of the class + * IMPLEMENT_INSTANCE_TRACKING(Foo) + * + * // Client code + * int main(void) + * { + * Foo *foo = new Foo; + * cout << GET_INSTANCE_COUNT(Foo) << endl; // prints "1" + * delete foo; + * ASSERT_ZERO_INSTANCES(Foo); // OK + * } + * \endcode + * \{ + */ + #define NEW_INSTANCE(CLASS) do { ++CLASS::__instances } while (0) + #define DELETE_INSTANCE(CLASS) do { --CLASS::__instances } while (0) + #define ASSERT_ZERO_INSTANCES(CLASS) ASSERT(CLASS::__instances == 0) + #define GET_INSTANCE_COUNT(CLASS) (CLASS::__instances) + #define DECLARE_INSTANCE_TRACKING(CLASS) static int __instances + #define IMPLEMENT_INSTANCE_TRACKING(CLASS) int CLASS::__instances = 0 + /*\}*/ + +#else /* !_DEBUG */ + + /* + * On UNIX systems the extabilished practice is to define + * NDEBUG for release builds and nothing for debug builds. + */ + #ifndef NDEBUG + #define NDEBUG 1 + #endif + + #define DB(x) /* nothing */ + #ifndef ASSERT + #define ASSERT(x) ((void)0) + #endif /* ASSERT */ + #define ASSERT2(x, help) ((void)0) + #define ASSERT_VALID_PTR(p) ((void)0) + #define ASSERT_VALID_PTR_OR_NULL(p) ((void)0) + #define ASSERT_VALID_OBJ(_t, _o) ((void)0) + #define TRACE do {} while (0) + #if COMPILER_VARIADIC_MACROS + #define TRACEMSG(x, ...) do {} while (0) + #else + INLINE void TRACEMSG(UNUSED_ARG(const char *, msg), ...) + { + /* NOP */ + } + #endif + + #define DECLARE_WALL(name, size) /* nothing */ + #define FWD_DECLARE_WALL(name, size) /* nothing */ + #define INIT_WALL(name) do {} while (0) + #define CHECK_WALL(name) do {} while (0) + + #define NEW_INSTANCE(CLASS) do {} while (0) + #define DELETE_INSTANCE(CLASS) do {} while (0) + #define ASSERT_ZERO_INSTANCES(CLASS) do {} while (0) + #define GET_INSTANCE_COUNT(CLASS) ERROR_ONLY_FOR_DEBUG + #define DECLARE_INSTANCE_TRACKING(CLASS) + #define IMPLEMENT_INSTANCE_TRACKING(CLASS) + + INLINE void kdbg_init(void) { /* nop */ } + INLINE void kputchar(UNUSED_ARG(char, c)) { /* nop */ } + INLINE int kputnum(UNUSED_ARG(int, num)) { return 0; } + INLINE void kputs(UNUSED_ARG(const char *, str)) { /* nop */ } + INLINE void kdump(UNUSED_ARG(const void *, buf), UNUSED_ARG(size_t, len)) { /* nop */ } + + #if defined(__cplusplus) && COMPILER_VARIADIC_MACROS + /* G++ can't inline functions with variable arguments... */ + #define kprintf(fmt,...) do { (void)(fmt); } while(0) + #else + /* ...but GCC can. */ + INLINE void kprintf(UNUSED_ARG(const char *, fmt), ...) { /* nop */ } + #endif + +#endif /* _DEBUG */ + +#endif /* BERTOS_DEBUG_H */ diff --git a/2.5/bertos/cfg/depend.h b/2.5/bertos/cfg/depend.h new file mode 100644 index 00000000..dcbbfac7 --- /dev/null +++ b/2.5/bertos/cfg/depend.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Depend module. + * + * \author Bernie Innocenti + * + */ + +#ifndef CFG_DEPEND_H +#define CFG_DEPEND_H + +#include // STATIC_ASSERT() + +/** + * Compile-time enforcement of dependencies between configuration options + */ +#define CONFIG_DEPEND(FEATURE, DEPS) STATIC_ASSERT(!(FEATURE) || !!(DEPS)) + +#endif // CFG_DEPEND_H diff --git a/2.5/bertos/cfg/kfile_debug.c b/2.5/bertos/cfg/kfile_debug.c new file mode 100644 index 00000000..e358c485 --- /dev/null +++ b/2.5/bertos/cfg/kfile_debug.c @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief KFile interface over debug. + * + * \author Francesco Sacchi + */ + +#include "kfile_debug.h" + +#include + +#include + + +static size_t kfiledebug_write(struct KFile *_fd, const void *buf, size_t size) +{ + KFILEDEBUG_CAST(_fd); + + kprintf("%.*s", size, (const char *)buf); + + return size; +} + +void kfiledebug_init(KFileDebug *kd) +{ + ASSERT(kd); + + memset(kd, 0, sizeof(*kd)); + + kfile_init(&kd->fd); + kd->fd.write = kfiledebug_write; + DB(kd->fd._type = KFT_KFILEDEBUG); +} diff --git a/2.5/bertos/cfg/kfile_debug.h b/2.5/bertos/cfg/kfile_debug.h new file mode 100644 index 00000000..4cd31ddf --- /dev/null +++ b/2.5/bertos/cfg/kfile_debug.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief KFile interface over a debug console. + * + * + * \author Francesco Sacchi + * + * $WIZ$ module_name = "kfiledebug" + * $WIZ$ module_depends = "kfile" + */ + +#ifndef CFG_KFILE_DEBUG +#define CFG_KFILE_DEBUG + +#include + +/** + * Context for KFile over debug console. + */ +typedef struct KFileDebug +{ + KFile fd; ///< KFile base class +} KFileDebug; + +/** + * ID for KFileDebug. + */ +#define KFT_KFILEDEBUG MAKE_ID('K', 'D', 'B', 'G') + +/** + * Convert + ASSERT from generic KFile to KFileDebug. + */ +INLINE KFileDebug * KFILEDEBUG_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_KFILEDEBUG); + return (KFileDebug *)fd; +} + +/** + * Initialize KFileMem struct. + * + * \param km Interface to initialize. + */ +void kfiledebug_init(KFileDebug *km); + +#endif /* CFG_KFILE_DEBUG */ diff --git a/2.5/bertos/cfg/log.h b/2.5/bertos/cfg/log.h new file mode 100644 index 00000000..e9e8f9f1 --- /dev/null +++ b/2.5/bertos/cfg/log.h @@ -0,0 +1,170 @@ +/** + * \file + * + * + * \brief Logging system module. + * + * This module implement a simple interface to use the multi level logging system. + * The log message have the priority order, like this: + * + * - error message (highest) + * - warning message + * - info message (lowest) + * + * With this priority system we can log only the message that have egual or major + * priority than log level that you has been configurate. Further you can have a + * differ log level for each module that you want. To do this you just need to + * define LOG_LEVEL in cfg of select module. + * When you set a log level, the system logs only the message that have priority + * egual or major that you have define, but the other logs function are not include + * at compile time, so all used logs function are linked, but the other no. + * + * To use logging system you should include this module in your drive and use + * a LOG_ERROR, LOG_WARNING and LOG_INFO macros to set the level log of the message. + * Then you should define a LOG_LEVEL and LOG_VERBOSE costant in your + * \c cfg/cfg_\.h using the follow policy: + * + * - in your file \c cfg/cfg_\.h, you define the logging + * level and verbosity mode for your specific module: + * + * \code + * /// Module logging level. + * #define _LOG_LEVEL LOG_LVL_INFO + * + * /// Module logging format. + * #define _LOG_FORMAT LOG_FMT_VERBOSE + * \endcode + * + * - then, in the module that you use a logging macros you should define + * a LOG_LEVEL and LOG_FORMAT using the previous value that you have define + * in cfg_.h header. After this you should include the cfg/log.h + * module: + * + * \code + * // Define log settings for cfg/log.h. + * #define LOG_LEVEL _LOG_LEVEL + * #define LOG_FORMAT _LOG_FORMAT + * #include + * \endcode + * + * if you include a log.h module without define the LOG_LEVEL and LOG_VERBOSE + * macros, the module use the default setting (see below). + * + * WARNING: when use the log.h module, and you want to set a your log level + * make sure to include this module after a \c cfg_.h, because the + * LOG_LEVEL and LOG_VERBOSE macros must be defined before to include log module, + * otherwise the log module use a default settings. + * + * \version $Id$ + * \author Daniele Basile + * + * $WIZ$ + */ + +#ifndef CFG_LOG_H +#define CFG_LOG_H + +#include + + +// Use a default setting if nobody defined a log level +#ifndef LOG_LEVEL +#define LOG_LEVEL LOG_LVL_ERR +#endif + +// Use a default setting if nobody defined a log format +#ifndef LOG_FORMAT +#define LOG_FORMAT LOG_FMT_TERSE +#endif + +/** + * \name Logging level definition + * + * When you choose a log level messages you choose + * also which print function are linked. + * If you choose a low level of log you link all log function (error, warning and info), + * but if choose a hight level you link only that have the priority egual or hight. + * The priority level go from error (highest) to info (lowest) (see cfg/debug.h + * for more detail). + * + * $WIZ$ log_level = "LOG_LVL_NONE", "LOG_LVL_ERR", "LOG_LVL_WARN", "LOG_LVL_INFO" + * } + */ +#define LOG_LVL_NONE 0 +#define LOG_LVL_ERR 1 +#define LOG_LVL_WARN 2 +#define LOG_LVL_INFO 3 + +/** + * \name Logging format + * + * There are two logging format: terse and verbose. The latter prepends + * function names and line number information to each log entry. + * + * $WIZ$ log_format = "LOG_FMT_VERBOSE", "LOG_FMT_TERSE" + */ +#define LOG_FMT_VERBOSE 1 +#define LOG_FMT_TERSE 0 + +#if LOG_FORMAT == LOG_FMT_VERBOSE + #define LOG_PRINT(str_level, str,...) kprintf("%s():%d:%s: " str, __func__, __LINE__, str_level, ## __VA_ARGS__) +#elif LOG_FORMAT == LOG_FMT_TERSE + #define LOG_PRINT(str_level, str,...) kprintf("%s: " str, str_level, ## __VA_ARGS__) +#else + #error No LOG_FORMAT defined +#endif + +#if LOG_LEVEL >= LOG_LVL_ERR + #define LOG_ERR(str,...) LOG_PRINT("ERR", str, ## __VA_ARGS__) + #define LOG_ERRB(x) x +#else + INLINE void LOG_ERR(UNUSED_ARG(const char *, fmt), ...) { /* nop */ } + #define LOG_ERRB(x) /* Nothing */ +#endif + +#if LOG_LEVEL >= LOG_LVL_WARN + #define LOG_WARN(str,...) LOG_PRINT("WARN", str, ## __VA_ARGS__) + #define LOG_WARNB(x) x +#else + INLINE void LOG_WARN(UNUSED_ARG(const char *, fmt), ...) { /* nop */ } + #define LOG_WARNB(x) /* Nothing */ +#endif + +#if LOG_LEVEL >= LOG_LVL_INFO + #define LOG_INFO(str,...) LOG_PRINT("INFO", str, ## __VA_ARGS__) + #define LOG_INFOB(x) x +#else + INLINE void LOG_INFO(UNUSED_ARG(const char *, fmt), ...) { /* nop */ } + #define LOG_INFOB(x) /* Nothing */ +#endif + + +#endif /* CFG_LOG_H */ diff --git a/2.5/bertos/cfg/macros.h b/2.5/bertos/cfg/macros.h new file mode 100644 index 00000000..caa2340f --- /dev/null +++ b/2.5/bertos/cfg/macros.h @@ -0,0 +1,359 @@ +/** + * \file + * + * + * \brief Common and handy function macros + * + * \version $Id$ + * \author Bernie Innocenti + * \author Giovanni Bajo + */ +#ifndef CFG_MACROS_H +#define CFG_MACROS_H + +#include + +/* avr-gcc does not seem to support libstdc++ */ +#if defined(__cplusplus) && !CPU_AVR + /* Type-generic macros implemented with template functions. */ + #include + + template inline T ABS(T n) { return n >= 0 ? n : -n; } + #define MIN(a,b) std::min(a, b) + #define MAX(a,b) std::max(a, b) + #define SWAP(a,b) std::swap(a, b) +#elif (COMPILER_STATEMENT_EXPRESSIONS && COMPILER_TYPEOF) + /* Type-generic macros implemented with statement expressions. */ + #define ABS(n) ({ \ + typeof(n) _n = (n); \ + (_n < 0) ? -_n : _n; \ + }) + #define MIN(a,b) ({ \ + typeof(a) _a = (a); \ + typeof(b) _b = (b); \ + ASSERT_TYPE_EQUAL(_a, _b); \ + /** \ + * The (typeof(_a)) cast in necessary: \ + * result type of conditional expressions is \ + * *NOT* the type of the value returned but \ + * the type that would be produced if _a and _b \ + * were mixed in an expression. \ + * Even in _a and _b are of the same type, \ + * if mixed in an expression the type will be \ + * (at least) promoted to int! \ + */ \ + ((typeof(_a))((_a < _b) ? _a : _b)); \ + }) + #define MAX(a,b) ({ \ + typeof(a) _a = (a); \ + typeof(b) _b = (b); \ + ASSERT_TYPE_EQUAL(_a, _b); \ + /** \ + * The (typeof(_a)) cast in necessary: \ + * result type of conditional expressions is \ + * *NOT* the type of the value returned but \ + * the type that would be produced if _a and _b \ + * were mixed in an expression. \ + * Even in _a and _b are of the same type, \ + * if mixed in an expression the type will be \ + * (at least) promoted to int! \ + */ \ + ((typeof(_a))((_a > _b) ? _a : _b)); \ + }) +#else /* !(COMPILER_STATEMENT_EXPRESSIONS && COMPILER_TYPEOF) */ + /* Buggy macros for inferior compilers. */ + #define ABS(a) (((a) < 0) ? -(a) : (a)) + #define MIN(a,b) (((a) < (b)) ? (a) : (b)) + #define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#endif /* !(COMPILER_STATEMENT_EXPRESSIONS && COMPILER_TYPEOF) */ + +/** Bound \a x between \a min and \a max. */ +#define MINMAX(min,x,max) (MIN(MAX(min, x), max)) + +#ifdef __cplusplus + /* Use standard implementation from */ + #define SWAP(a,b) std::swap(a, b) +#elif COMPILER_TYPEOF + /** + * Type-generic macro to swap \a a with \a b. + * + * \note Arguments are evaluated multiple times. + */ + #define SWAP(a, b) \ + do { \ + typeof(a) tmp; \ + ASSERT_TYPE_EQUAL(a, b); \ + tmp = (a); \ + (a) = (b); \ + (b) = tmp; \ + } while (0) +#else /* !COMPILER_TYPEOF */ + /* Sub-optimal implementation that only works with integral types. */ + #define SWAP(a, b) \ + do { \ + (a) ^= (b); \ + (b) ^= (a); \ + (a) ^= (b); \ + } while (0) + +#endif /* COMPILER_TYPEOF */ + +/** + * Shuffle the content of \a array that counts \a len elements. + */ +#define SHUFFLE(array, len) \ + do { \ + int i, j; \ + for (i = (len) - 1; i > 0; i--) \ + { \ + j = ((i + 1) * (rand() / (RAND_MAX + 1.0))); \ + SWAP((array)[i], (array)[j]); \ + } \ + } while (0) + +/** + * Macro to swap \a a with \a b, with explicit type \a T for dumb C89 compilers. + * + * \note Arguments are evaluated multiple times. + */ +#define SWAP_T(a, b, T) \ + do { \ + T tmp; \ + ASSERT_TYPE_IS(a, T); \ + ASSERT_TYPE_IS(b, T); \ + tmp = (a); \ + (a) = (b); \ + (b) = tmp; \ + } while (0) + +/** + * Reverse the bits contained in b (LSB becomes the MSB and so on). + * \note \a b is evaluated twice + */ +#define REVERSE_UINT8(b) \ + ((uint8_t)((((b) * 0x0802UL & 0x22110UL) | ((b) * 0x8020UL & 0x88440UL)) * 0x10101UL >> 16)) + +#ifndef BV + /** Convert a bit value to a binary flag. */ + #define BV(x) (1<<(x)) +#endif + +/** Same as BV() but with 32 bit result */ +#define BV32(x) ((uint32_t)1<<(x)) + +/** Same as BV() but with 16 bit result */ +#define BV16(x) ((uint16_t)1<<(x)) + +/** Same as BV() but with 8 bit result */ +#define BV8(x) ((uint8_t)1<<(x)) + +/** + * Perform an integer division rounding the result to the nearest int value. + * \note \a divisor should preferibly be a costant, otherwise this macro generates + * 2 division. Also divisor is evaluated twice. + */ +#define DIV_ROUND(dividend, divisor) (((dividend) + (divisor) / 2) / (divisor)) + +/** + * Perform an integer division rounding the result to the upper int value. + * \note \a divisor should preferibly be a costant, otherwise this macro generates + * 2 division. Also divisor is evaluated twice. + */ +#define DIV_ROUNDUP(dividend, divisor) (((dividend) + (divisor) - 1) / (divisor)) + +/** Round up \a x to an even multiple of the 2's power \a pad. */ +#define ROUND_UP2(x, pad) (((x) + ((pad) - 1)) & ~((pad) - 1)) + +/** + * \name Integer round macros. + * + * Round \a x to a multiple of \a base. + * \note If \a x is signed these macros generate a lot of code. + * \{ + */ +#define ROUND_DOWN(x, base) ( (x) - ((x) % (base)) ) +#define ROUND_UP(x, base) ( ((x) + (base) - 1) - (((x) + (base) - 1) % (base)) ) +#define ROUND_NEAREST(x, base) ( ((x) + (base) / 2) - (((x) + (base) / 2) % (base)) ) +/* \} */ + +/** Check if \a x is an integer power of 2. */ +#define IS_POW2(x) (!(bool)((x) & ((x)-1))) + +/** Calculate a compile-time log2 for a uint8_t */ +#define UINT8_LOG2(x) \ + ((x) < 2 ? 0 : \ + ((x) < 4 ? 1 : \ + ((x) < 8 ? 2 : \ + ((x) < 16 ? 3 : \ + ((x) < 32 ? 4 : \ + ((x) < 64 ? 5 : \ + ((x) < 128 ? 6 : 7))))))) + +/** Calculate a compile-time log2 for a uint16_t */ +#define UINT16_LOG2(x) \ + ((x < 256) ? UINT8_LOG2(x) : UINT8_LOG2((x) >> 8) + 8) + +/** Calculate a compile-time log2 for a uint32_t */ +#define UINT32_LOG2(x) \ + ((x < 65536UL) ? UINT16_LOG2(x) : UINT16_LOG2((x) >> 16) + 16) + +#if COMPILER_VARIADIC_MACROS + /** Count the number of arguments (up to 16). */ + #define PP_COUNT(...) \ + PP_COUNT__(__VA_ARGS__,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) + #define PP_COUNT__(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,count,...) \ + count +#endif + +#if COMPILER_VARIADIC_MACROS + /** + * \def BIT_CHANGE(reg, (mask, value), ...) + * + * This macro allows for efficient and compact bit toggling in a hardware + * register. It is meant to replace hand-coded cruft which toggles bits + * in sequence. + * + * It is possible to specify an unlimited pair of (mask, value) parameters. + * For instance: + * + * \code + * void set_timer(bool start) + * { + * BIT_CHANGE(REG_CTRL_TIMER, + * (TIMER_MODE, MODE_COUNT), + * (OVL_IRQ, 1), + * (CMP_IRQ, 1), + * (START, start) + * ); + * } + * \endcode + * + * The macro expansion will be roughly the following: + * + * \code + * REG_CTRL_TIMER = (REG_CTRL_TIMER & ~(TIMER_MODE|OVL_IRQ|CMP_IRQ|START) + * | (MODE_COUNT|OVL_IRQ|CMP_IRQ|(start ? START : 0)); + * \endcode + * + * It is up to the compiler to produce the optimal code. We checked that GCC produces + * the best code in most cases. We preferred this expansion over the use of a block + * with a local variable because CodeWarrior 6.1 was not able to remove completely the + * allocation of the local from the stack. + * + * \note This macro is available only in C99 because it makes use of variadic macros. + * It would be possible to make up an implementation with a slightly different syntax + * for use with C90 compilers, through Boost Preprocessor. + */ + + /** + * \def BIT_CHANGE_BV(reg, (bit, value), ...) + * + * Similar to BIT_CHANGE(), but get bits instead of masks (and applies BV() to convert + * them to masks). + */ + + #define BIT_EXTRACT_FLAG_0(bit, value) bit + #define BIT_EXTRACT_FLAG_1(bit, value) BV(bit) + #define BIT_EXTRACT_VALUE__(bit, value) value + + #define BIT_MASK_SINGLE__(use_bv, index, max, arg) \ + ((index < max) ? (PP_CAT(BIT_EXTRACT_FLAG_, use_bv) arg) : 0) \ + /* */ + + #define BIT_MASK_IF_SINGLE__(use_bv, index, max, arg) \ + (((index < max) && (BIT_EXTRACT_VALUE__ arg)) ? (PP_CAT(BIT_EXTRACT_FLAG_, use_bv) arg) : 0) \ + /* */ + + #define BIT_ITER__2(macro, use_bv, max, a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15, ...) \ + (macro(use_bv, 0, max, a0) | \ + macro(use_bv, 1, max, a1) | \ + macro(use_bv, 2, max, a2) | \ + macro(use_bv, 3, max, a3) | \ + macro(use_bv, 4, max, a4) | \ + macro(use_bv, 5, max, a5) | \ + macro(use_bv, 6, max, a6) | \ + macro(use_bv, 7, max, a7) | \ + macro(use_bv, 8, max, a8) | \ + macro(use_bv, 9, max, a9) | \ + macro(use_bv, 10, max, a10) | \ + macro(use_bv, 11, max, a11) | \ + macro(use_bv, 12, max, a12) | \ + macro(use_bv, 13, max, a13) | \ + macro(use_bv, 14, max, a14) | \ + macro(use_bv, 15, max, a15)) \ + /* */ + + #define BIT_ITER__(macro, use_bv, ...) \ + BIT_ITER__2(macro, use_bv, PP_COUNT(__VA_ARGS__), __VA_ARGS__, (0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1)) \ + /* */ + + #define BIT_MASKS__(use_bv, ...) \ + BIT_ITER__(BIT_MASK_SINGLE__, use_bv, __VA_ARGS__) + /* */ + + #define BIT_MASKS_CONDITIONAL__(use_bv, ...) \ + BIT_ITER__(BIT_MASK_IF_SINGLE__, use_bv, __VA_ARGS__) + /* */ + + #define BIT_CHANGE__(reg, use_bv, ...) \ + ((reg) = ((reg) & ~BIT_MASKS__(use_bv, __VA_ARGS__)) | BIT_MASKS_CONDITIONAL__(use_bv, __VA_ARGS__)) \ + /* */ + + #define BIT_CHANGE(reg, ...) BIT_CHANGE__(reg, 0, __VA_ARGS__) + #define BIT_CHANGE_BV(reg, ...) BIT_CHANGE__(reg, 1, __VA_ARGS__) + +#endif /* COMPILER_VARIADIC_MACROS */ + +/** + * Macro for rotating bit left or right. + * \{ + */ +#define ROTR(var, rot) (((var) >> (rot)) | ((var) << ((sizeof(var) * 8) - (rot)))) +#define ROTL(var, rot) (((var) << (rot)) | ((var) >> ((sizeof(var) * 8) - (rot)))) +/*\}*/ + +/** + * Make an id from 4 letters, useful for + * file formats and kfile ids. + */ +#define MAKE_ID(a,b,c,d) \ + ( ((uint32_t)(a) << 24) \ + | ((uint32_t)(b) << 16) \ + | ((uint32_t)(c) << 8) \ + | ((uint32_t)(d) << 0) ) + +/** + * Type for id generated by MAKE_ID(). + */ +typedef uint32_t id_t; + +#endif /* MACROS_H */ + diff --git a/2.5/bertos/cfg/module.h b/2.5/bertos/cfg/module.h new file mode 100644 index 00000000..15b6f215 --- /dev/null +++ b/2.5/bertos/cfg/module.h @@ -0,0 +1,124 @@ +/** + * \file + * + * + * \brief Debug macros for inter-module dependency checking. + * + * These macros expand to nothing in release builds. In debug + * builds, they perform run-time dependency checks for modules. + * + * The usage pattern looks like this: + * + * \code + * MOD_DEFINE(phaser) + * + * void phaser_init(void) + * { + * MOD_CHECK(computer); + * MOD_CHECK(warp_core); + * + * [...charge weapons...] + * + * MOD_INIT(phaser); + * } + * + * void phaser_cleanup(void) + * { + * MOD_CLEANUP(phaser); + * + * [...disarm phaser...] + * } + * \endcode + * + * \version $Id$ + * \author Bernie Innocenti + */ +#ifndef CFG_MODULE_H +#define CFG_MODULE_H + +#include + +/** + * Declare a global variable for module dependency check. + * + * \see MOD_INIT(), MOD_CHECK() + */ +#define MOD_DEFINE(module) DB(extern bool module ## _initialized; bool module ## _initialized;) + +/** + * Check that \a module was already initialized. + * + * Put this check just before accessing any facility + * provided by a module that requires prior initialization. + * + * \see MOD_INIT() + */ + +#define MOD_CHECK(module) \ +do { \ + DB(extern bool module ## _initialized;) \ + ASSERT(module ## _initialized); \ +} while (0) + +/** + * Mark module as initialized. + * + * Marking initialization requires the global data + * previously defined by MOD_DEFINE(). + * + * To prevent double initialization bugs, an initialized + * module must first be cleaned up with MOD_CLEANUP() before + * calling MOD_INIT() another time. + * + * \see MOD_CLEANUP(), MOD_CHECK(), MOD_DEFINE() + */ +#define MOD_INIT(module) \ +do { \ + ASSERT(!module ## _initialized); \ + DB(module ## _initialized = true;) \ +} while (0) + +/** + * Mark module as being no longer initialized. + * + * Marking initialization requires the global data + * previously defined by MOD_DEFINE(). + * + * \see MOD_INIT(), MOD_CHECK(), MOD_DEFINE() + */ +#define MOD_CLEANUP(module) \ +do { \ + ASSERT(module ## _initialized); \ + DB(module ## _initialized = false;) \ +} while (0) + +#endif /* CFG_MODULE_H */ + diff --git a/2.5/bertos/cfg/os.h b/2.5/bertos/cfg/os.h new file mode 100644 index 00000000..2e393599 --- /dev/null +++ b/2.5/bertos/cfg/os.h @@ -0,0 +1,220 @@ +/** + * \file + * + * + * \brief OS-specific definitions + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_OS_H +#define CFG_OS_H + +#include "cfg/cfg_proc.h" + +/* + * OS autodetection (Some systems trigger multiple OS definitions) + */ +#ifdef _WIN32 + #define OS_WIN32 1 + #define OS_ID win32 + + // FIXME: Maybe disable Win32 exceptions? + typedef int cpu_flags_t; + #define IRQ_DISABLE FIXME + #define IRQ_ENABLE FIXME + #define IRQ_SAVE_DISABLE(old_sigs) FIXME + #define IRQ_RESTORE(old_sigs) FIXME + +#else + #define OS_WIN32 0 +#endif + +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) + #define OS_UNIX 1 + #define OS_POSIX 1 /* Not strictly UNIX, but no way to autodetect it. */ + #define OS_ID posix + + /* + * The POSIX moral equivalent of disabling IRQs is disabling signals. + */ + #include + typedef sigset_t cpu_flags_t; + + #define SET_ALL_SIGNALS(sigs) \ + do { \ + sigfillset(&sigs); \ + sigdelset(&sigs, SIGINT); \ + sigdelset(&sigs, SIGSTOP); \ + sigdelset(&sigs, SIGCONT); \ + } while(0) + + #define IRQ_DISABLE \ + do { \ + sigset_t sigs; \ + SET_ALL_SIGNALS(sigs); \ + sigprocmask(SIG_BLOCK, &sigs, NULL); \ + } while (0) + + #define IRQ_ENABLE \ + do { \ + sigset_t sigs; \ + SET_ALL_SIGNALS(sigs); \ + sigprocmask(SIG_UNBLOCK, &sigs, NULL); \ + } while (0) + + #define IRQ_SAVE_DISABLE(old_sigs) \ + do { \ + sigset_t sigs; \ + SET_ALL_SIGNALS(sigs); \ + sigprocmask(SIG_BLOCK, &sigs, &old_sigs); \ + } while (0) + + #define IRQ_RESTORE(old_sigs) \ + do { \ + sigprocmask(SIG_SETMASK, &old_sigs, NULL); \ + } while (0) + + #define IRQ_ENABLED() \ + ({ \ + sigset_t sigs__; \ + sigprocmask(SIG_SETMASK, NULL, &sigs__); \ + sigismember(&sigs__, SIGALRM) ? false : true; \ + }) + + #if (CONFIG_KERN && CONFIG_KERN_PREEMPT) + #define DECLARE_ISR_CONTEXT_SWITCH(vect) \ + void vect(UNUSED_ARG(int, arg)); \ + INLINE void __isr_##vect(void); \ + void vect(UNUSED_ARG(int, arg)) \ + { \ + __isr_##vect(); \ + IRQ_PREEMPT_HANDLER(); \ + } \ + INLINE void __isr_##vect(void) + /** + * With task priorities enabled each ISR is used a point to + * check if we need to perform a context switch. + * + * Instead, without priorities a context switch can occur only + * when the running task expires its time quantum. In this last + * case, the context switch can only occur in the timer ISR, + * that must be always declared with the + * DECLARE_ISR_CONTEXT_SWITCH() macro. + */ + #if CONFIG_KERN_PRI + #define DECLARE_ISR(vect) \ + DECLARE_ISR_CONTEXT_SWITCH(vect) + #endif /* CONFIG_KERN_PRI */ + #endif + #ifndef DECLARE_ISR + #define DECLARE_ISR(vect) \ + void vect(UNUSED_ARG(int, arg)) + #endif + #ifndef DECLARE_ISR_CONTEXT_SWITCH + #define DECLARE_ISR_CONTEXT_SWITCH(vect) \ + void vect(UNUSED_ARG(int, arg)) + #endif + +#else + #define OS_UNIX 0 + #define OS_POSIX 0 +#endif + +#ifdef __linux__ + #define OS_LINUX 1 +#else + #define OS_LINUX 0 +#endif + +#if defined(__APPLE__) && defined(__MACH__) + #define OS_DARWIN 1 +#else + #define OS_DARWIN 0 +#endif + + +#include "cfg/cfg_arch.h" /* For ARCH_QT */ + +/* + * We want Qt and other frameworks to look like OSes because you would + * tipically want their portable abstractions if you're using one of these. + */ +#if defined(_QT) || (defined(ARCH_QT) && (ARCH & ARCH_QT)) + #define OS_QT 1 + #undef OS_ID + #define OS_ID qt +#else + #define OS_QT 0 +#endif + +/* + * Summarize hosted environments as OS_HOSTED and embedded + * environment with OS_EMBEDDED. + */ +#if OS_WIN32 || OS_UNIX || OS_DARWIN || OS_QT + #define OS_HOSTED 1 + #define OS_EMBEDDED 0 +#else + #define OS_HOSTED 0 + #define OS_EMBEDDED 1 + + /* Embedded environments fall back to CPU-specific code. */ + #define OS_ID CPU_ID +#endif + +/* Self-check for the detection */ +#if !defined(OS_ID) + #error OS_ID not defined +#endif +#if OS_HOSTED && OS_EMBEDDED + #error Both hosted and embedded OS environment +#endif +#if !OS_HOSTED && !OS_EMBEDDED + #error Neither hosted nor embedded OS environment +#endif + +#if OS_HOSTED + + /// Macro to include OS-specific headers. + #define OS_HEADER(module) PP_STRINGIZE(emul/PP_CAT3(module, _, OS_ID).h) + + /// Macro to include OS-specific source files. + #define OS_CSOURCE(module) PP_STRINGIZE(emul/PP_CAT3(module, _, OS_ID).c) + +#else + // Fallbacks for embedded systems + #define OS_HEADER(module) CPU_HEADER(module) + #define OS_CSOURCE(module) CPU_CSOURCE(module) +#endif + +#endif /* CFG_OS_H */ diff --git a/2.5/bertos/cfg/test.h b/2.5/bertos/cfg/test.h new file mode 100644 index 00000000..aacf7e15 --- /dev/null +++ b/2.5/bertos/cfg/test.h @@ -0,0 +1,118 @@ +/** + * \file + * + * + * \brief Utility for the test suite. + * + * \version $Id$ + * + * \author Daniele Basile + * \author Francesco Sacchi + * + * When you want to test a module that is emulable on hosted + * platforms, these macros come in handy. + * Your module_test should supply three basic functions: + * + * \code + * int module_testSetup(void) + * int module_testRun(void) + * int module_testTearDown(void) + * \endcode + * + * All of these should return 0 if ok or a value != 0 on errors. + * + * Then, at the end of your module_test you can write: + * \code + * #if UNIT_TEST + * #include + * #include + * #include <...> + * + * TEST_MAIN(module); + * #endif + * \endcode + * + * Including directly into your module the file.c you need to + * run the test allows you to build and run the test compiling + * only one file. + * + * To achieve this you also need a main() that is supplied by + * the TEST_MAIN macro. + * This will expand to a full main that calls, in sequence: + * Setup, Run and TearDown of your module. + */ + +#ifndef CFG_TEST_H +#define CFG_TEST_H + +#include "cfg/cfg_arch.h" + +#if defined(ARCH_UNITTEST) && (ARCH & ARCH_UNITTEST) + #define UNIT_TEST 1 + + /** + * Macro used to generate a main() for a test to be compiled + * on hosted platform. + */ + #define TEST_MAIN(module) \ + int main(void) \ + { \ + if (module##_testSetup() != 0) \ + return 1; \ + if (module##_testRun() != 0) \ + return 2; \ + if (module##_testTearDown() != 0) \ + return 3; \ + return 0; \ + } +#else /* !TEST */ + #define UNIT_TEST 0 + + #define TEST_MAIN(module) /* nothing */ +#endif /* TEST */ + + +/** + * Silent an assert in a test. + * + * This is useful when we run a test and we want to test + * an error condition. We know that an assert will fail but + * this is not really an error. To ignore that we mark it + * with this macro, where str is the message string of the assert + * that we want to drop. + * To use this macro copy the assert log message and paste as argument + * of this macro. In assert message log is reported also the line number + * of the code that have generated the assert. + * In this way you can trap only the selected assert message. + */ +#define SILENT_ASSERT(str) kputs("SILENT_ASSERT:$"str"$\n") + +#endif /* CFG_TEST_H */ diff --git a/2.5/bertos/config.mk b/2.5/bertos/config.mk new file mode 100644 index 00000000..752313a3 --- /dev/null +++ b/2.5/bertos/config.mk @@ -0,0 +1,115 @@ +# +# $Id$ +# Copyright 2002,2003, 2004, 2006 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Author: Bernie Innocenti +# Based on: GCC-AVR standard Makefile part 1, Volker Oth 1/2000 +# + +# +# Programmer type +# see local pgm_config.mk for programmer customization. + +OPTCFLAGS = -ffunction-sections -fdata-sections +#OPTCFLAGS = -funsafe-loop-optimizations + +# For AVRStudio +#DEBUGCFLAGS = -gdwarf-2 + +# For GDB +DEBUGCFLAGS = -ggdb + +# +# define some variables based on the AVR base path in $(AVR) +# +CC = gcc +CXX = g++ +AR = ar +AS = $(CC) -x assembler-with-cpp +LD = $(CC) +LDXX = $(CXX) +OBJCOPY = objcopy +STRIP = strip +INSTALL = cp -a +RM = rm -f +RM_R = rm -rf +RN = mv +MKDIR_P = mkdir -p +SHELL = /bin/sh +CHECKER = sparse +DOXYGEN = doxygen +AVRDUDE = avrdude +FLEXCAT = $(top_srcdir)/tools/flexcat/flexcat + +# For conversion from ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) \ + --debugging \ + --change-section-address .data-0x800000 \ + --change-section-address .bss-0x800000 \ + --change-section-address .noinit-0x800000 \ + --change-section-address .eeprom-0x810000 + +INCDIR = -I. -Ibertos +LIBDIR = lib +OBJDIR = obj +OUTDIR = images + +# output format can be srec, ihex (avrobj is always created) +FORMAT = srec +#FORMAT = ihex + +# Compiler flags for generating dependencies +DEP_FLAGS = -MMD -MP + +# Compiler flags for generating source listings +LIST_FLAGS = -Wa,-anhlmsd=$(@:.o=.lst) -dp + +# Linker flags for generating map files +# Only in embedded related projects generate map files +MAP_FLAGS_EMB = -Wl,-Map=$(@:%.elf=%.map),--cref +MAP_FLAGS_HOST = + +# Compiler warning flags for both C and C++ +WARNFLAGS = \ + -W -Wformat -Wall -Wundef -Wpointer-arith -Wcast-qual \ + -Wcast-align -Wwrite-strings -Wsign-compare \ + -Wmissing-noreturn \ + -Wextra -Wstrict-aliasing=2 \ +# -Wunsafe-loop-optimizations + +# Compiler warning flags for C only +C_WARNFLAGS = \ + -Wmissing-prototypes -Wstrict-prototypes + +# Default C preprocessor flags (for C, C++ and cpp+as) +CPPFLAGS = $(INCDIR) + +# Default C compiler flags +CFLAGS = $(OPTCFLAGS) $(DEBUGCFLAGS) $(WARNFLAGS) $(C_WARNFLAGS) \ + $(DEP_FLAGS) $(LIST_FLAGS) -std=gnu99 + +# Default C++ compiler flags +CXXFLAGS = $(OPTCFLAGS) $(DEBUGCFLAGS) $(WARNFLAGS) \ + $(DEP_FLAGS) $(LIST_FLAGS) + +# Default compiler assembly flags +CPPAFLAGS = $(DEBUGCFLAGS) -MMD + +# Default assembler flags +ASFLAGS = $(DEBUGCFLAGS) + +# Default linker flags +#LDFLAGS = $(MAP_FLAGS) + +#bernie: does not complain for missing symbols! +LDFLAGS = -Wl,--gc-sections + +# Flags for avrdude +AVRDUDEFLAGS = $(DPROG) + +# additional libs +LIB = -lm + +# Archiver flags +ARFLAGS = rcs diff --git a/2.5/bertos/cpu/arm/drv/adc_arm.c b/2.5/bertos/cpu/arm/drv/adc_arm.c new file mode 100644 index 00000000..f2906721 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/adc_arm.c @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Low-level ADC module for ARM (inplementation). + * + * + * \version $Id$ + * + * \author Daniele Basile + * + * This module is automatically included so no need to include + * in test list. + * notest: arm + * + */ + +#ifndef WIZ_AUTOGEN + #warning This file is deprecated, you should use adc_at91.c + + #include + + #if CPU_ARM_AT91 + #include "adc_at91.c" + /*#elif Add other ARM families here */ + #else + #error Unknown CPU + #endif +#endif /* WIZ_AUTOGEN */ diff --git a/2.5/bertos/cpu/arm/drv/adc_arm.h b/2.5/bertos/cpu/arm/drv/adc_arm.h new file mode 100644 index 00000000..63e7dafa --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/adc_arm.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Low-level ADC module for ARM (interface). + * + * + * \version $Id$ + * + * \author Daniele Basile + * + */ + +#include + +#if CPU_ARM_AT91 + #include "adc_at91.h" +/*#elif Add other ARM families here */ +#else + #error Unknown CPU +#endif diff --git a/2.5/bertos/cpu/arm/drv/adc_at91.c b/2.5/bertos/cpu/arm/drv/adc_at91.c new file mode 100644 index 00000000..4ac35861 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/adc_at91.c @@ -0,0 +1,211 @@ +/** + * \file + * + * + * \brief ADC hardware-specific implementation + * + * This ADC module should be use both whit kernel or none. + * If you are using a kernel, the adc drive does not wait the finish of + * conversion but use a singal every time a required conversion are + * ended. This signal wake up a process that return a result of + * conversion. Otherwise, if you not use a kernl, this module wait + * whit a loop the finishing of conversion. + * + * + * \version $Id$ + * \author Daniele Basile + */ + + +#include "adc_at91.h" + +#include + +#include "cfg/cfg_adc.h" +#include "cfg/cfg_proc.h" +#include "cfg/cfg_signal.h" +#include +#include + +// Define log settings for cfg/log.h. +#define LOG_LEVEL ADC_LOG_LEVEL +#define LOG_FORMAT ADC_LOG_FORMAT +#include + +#include + +#include + +#if CONFIG_KERN + #include + #include + #include + + + #if !CONFIG_KERN_SIGNALS + #error Signals must be active to use ADC with kernel + #endif + + /* Signal adc convertion end */ + #define SIG_ADC_COMPLETE SIG_USER0 + + /* ADC waiting process */ + static struct Process *adc_process; + + /** + * ADC ISR. + * Simply signal the adc process that convertion is complete. + */ + static DECLARE_ISR(adc_conversion_end_irq) + { + sig_post(adc_process, SIG_ADC_COMPLETE); + + /* Inform hw that we have served the IRQ */ + AIC_EOICR = 0; + } + + static void adc_enable_irq(void) + { + + // Disable all interrupt + ADC_IDR = 0xFFFFFFFF; + + //Register interrupt vector + AIC_SVR(ADC_ID) = adc_conversion_end_irq; + AIC_SMR(ADC_ID) = AIC_SRCTYPE_INT_EDGE_TRIGGERED; + AIC_IECR = BV(ADC_ID); + + //Enable data ready irq + ADC_IER = BV(ADC_DRDY); + } + +#endif /* CONFIG_KERN */ + + +/** + * Select mux channel \a ch. + * \todo only first 8 channels are selectable! + */ +void adc_hw_select_ch(uint8_t ch) +{ + //Disable all channels + ADC_CHDR = ADC_CH_MASK; + //Enable select channel + ADC_CHER = BV(ch); +} + + +/** + * Start an ADC convertion. + * If a kernel is present, preempt until convertion is complete, otherwise + * a busy wait on ADC_DRDY bit is done. + */ +uint16_t adc_hw_read(void) +{ + #if CONFIG_KERN + /* Ensure ADC is not already in use by another process */ + ASSERT(adc_process == NULL); + adc_process = proc_current(); + #endif + + // Start convertion + ADC_CR = BV(ADC_START); + + #if CONFIG_KERN + // Ensure IRQs enabled. + IRQ_ASSERT_ENABLED(); + sig_wait(SIG_ADC_COMPLETE); + + /* Prevent race condition in case of preemptive kernel */ + uint16_t ret = ADC_LCDR; + MEMORY_BARRIER; + adc_process = NULL; + return ret; + #else + //Wait in polling until is done + while (!(ADC_SR & BV(ADC_DRDY))); + + //Return the last converted data + return(ADC_LCDR); + #endif +} + +/** + * Init ADC hardware. + */ +void adc_hw_init(void) +{ + //Init ADC pins. + ADC_INIT_PINS(); + + /* + * Set adc mode register: + * - Disable hardware trigger and enable software trigger. + * - Select normal mode. + * - Set ADC_BITS bit convertion resolution. + * + * \{ + */ + ADC_MR = 0; + #if ADC_BITS == 10 + ADC_MR &= ~BV(ADC_LOWRES); + #elif ADC_BITS == 8 + ADC_MR |= BV(ADC_LOWRES); + #else + #error No select bit resolution is supported to this CPU + #endif + /* \} */ + + LOG_INFO("Computed ADC_CLOCK %ld\n", ADC_COMPUTED_CLOCK); + LOG_INFO("prescaler[%ld], stup[%ld], shtim[%ld]\n",ADC_COMPUTED_PRESCALER, ADC_COMPUTED_STARTUPTIME, ADC_COMPUTED_SHTIME); + + + //Apply computed prescaler value + ADC_MR &= ~ADC_PRESCALER_MASK; + ADC_MR |= ((ADC_COMPUTED_PRESCALER << ADC_PRESCALER_SHIFT) & ADC_PRESCALER_MASK); + LOG_INFO("prescaler[%ld]\n", (ADC_COMPUTED_PRESCALER << ADC_PRESCALER_SHIFT) & ADC_PRESCALER_MASK); + + //Apply computed start up time + ADC_MR &= ~ADC_STARTUP_MASK; + ADC_MR |= ((ADC_COMPUTED_STARTUPTIME << ADC_STARTUP_SHIFT) & ADC_STARTUP_MASK); + LOG_INFO("sttime[%ld]\n", (ADC_COMPUTED_STARTUPTIME << ADC_STARTUP_SHIFT) & ADC_STARTUP_MASK); + + //Apply computed sample and hold time + ADC_MR &= ~ADC_SHTIME_MASK; + ADC_MR |= ((ADC_COMPUTED_SHTIME << ADC_SHTIME_SHIFT) & ADC_SHTIME_MASK); + LOG_INFO("shtime[%ld]\n", (ADC_COMPUTED_SHTIME << ADC_SHTIME_SHIFT) & ADC_SHTIME_MASK); + + #if CONFIG_KERN + //Register and enable irq for adc. + adc_enable_irq(); + #endif + +} diff --git a/2.5/bertos/cpu/arm/drv/adc_at91.h b/2.5/bertos/cpu/arm/drv/adc_at91.h new file mode 100644 index 00000000..2ec0cdb5 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/adc_at91.h @@ -0,0 +1,98 @@ +/** + * \file + * + * + * \version $Id$ + * + * \brief ADC hardware-specific definition + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef DRV_ADC_AT91_H +#define DRV_ADC_AT91_H + +#include + +#include "cfg/cfg_adc.h" + +#include + +/** + * ADC config define. + */ +#define ADC_MUX_MAXCH 8 //Max number of channel for ADC. +#define ADC_BITS 10 //Bit resolution for ADC converter. + +/** + * Macro for computing correct value to write into ADC + * register. + */ +#define ADC_COMPUTED_PRESCALER (DIV_ROUNDUP(CPU_FREQ, 2 * CONFIG_ADC_CLOCK) - 1) +#define ADC_COMPUTED_CLOCK (CPU_FREQ / ((ADC_COMPUTED_PRESCALER + 1) * 2)) +#define ADC_COMPUTED_STARTUPTIME (((CONFIG_ADC_STARTUP_TIME * ADC_COMPUTED_CLOCK) / 8000000UL) - 1) +#define ADC_COMPUTED_SHTIME ((uint32_t)((CONFIG_ADC_SHTIME * (uint64_t)ADC_COMPUTED_CLOCK) / 1000000000UL) - 1) + +/** + * Init pins macro for adc. + */ + +/** + * Define PIO controller for enable ADC function. + * \{ + */ +#if CPU_ARM_SAM7X + #define ADC_PIO_DISABLE PIOB_PDR + #define ADC_PIO_EN_FUNC PIOB_ASR + +#elif CPU_ARM_SAM7S_LARGE + #define ADC_PIO_DISABLE PIOA_PDR + #define ADC_PIO_EN_FUNC PIOA_BSR + +#else + #error No ADC pins name definitions for selected ARM CPU +#endif +/*\}*/ + +/** + * Init the ADC pins. + * Implement it if necessary. + */ +#define ADC_INIT_PINS() \ + do { \ + } while (0) + +void adc_hw_select_ch(uint8_t ch); +uint16_t adc_hw_read(void); +void adc_hw_init(void); + +#endif /* DRV_ADC_AT91_H */ diff --git a/2.5/bertos/cpu/arm/drv/flash_arm.h b/2.5/bertos/cpu/arm/drv/flash_arm.h new file mode 100644 index 00000000..50b84b91 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/flash_arm.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Low-level flash module for ARM (interface). + * + * \author Daniele Basile + * + */ + +#include + +#if CPU_ARM_AT91 + #include "flash_at91.h" +/*#elif Add other ARM families here */ +#else + #error Unknown CPU +#endif diff --git a/2.5/bertos/cpu/arm/drv/flash_at91.c b/2.5/bertos/cpu/arm/drv/flash_at91.c new file mode 100644 index 00000000..06ff71e4 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/flash_at91.c @@ -0,0 +1,378 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief At91sam7 Internal flash read/write driver. + * + * + */ + +#include "flash_at91.h" + +#include "cfg/cfg_flash_at91.h" +#include + +#include "hw/hw_boot.h" + +// Define log settings for cfg/log.h +#define LOG_LEVEL CONFIG_FLASH_AT91_LOG_LEVEL +#define LOG_FORMAT CONFIG_FLASH_AT91_LOG_FORMAT +#include + + +#include +#include +#include + +#include + +#include + +#include +#include + +#include + +/* + * Check if flash memory is ready to accept other commands. + */ +RAM_FUNC static bool flash_at91_isReady(void) +{ + return (MC_FSR & BV(MC_FRDY)); +} + +/** + * Send write command. + * + * After WR command cpu write bufferd page into flash memory. + */ +RAM_FUNC static void flash_at91_sendWRcmd(uint32_t page) +{ + cpu_flags_t flags; + + // Wait for end of command + while(!flash_at91_isReady()) + { + cpu_relax(); + } + + IRQ_SAVE_DISABLE(flags); + + // Send the 'write page' command + MC_FCR = MC_KEY | MC_FCMD_WP | (MC_PAGEN_MASK & (page << 8)); + + // Wait for end of command + while(!flash_at91_isReady()) + { + cpu_relax(); + } + + IRQ_RESTORE(flags); +} + +/** + * Return 0 if no error are occurred after flash memory + * read or write operation, otherwise return error code. + */ +RAM_FUNC static int flash_at91_getStatus(struct KFile *_fd) +{ + (void)_fd; + + + /* + * This bit is set to one if we programming of at least one locked lock + * region. + */ + if(MC_FSR & BV(MC_LOCKE)) + return -1; + + /* + * This bit is set to one if an invalid command and/or a bad keywords was/were + * written in the Flash Command Register. + */ + if(MC_FSR & BV(MC_PROGE)) + return -2; + + return 0; +} + + +/** + * Write modified page on internal latch, and then send write command to + * flush page to internal flash. + */ +RAM_FUNC static void flash_at91_flush(Flash *fd) +{ + if (fd->page_dirty) + { + //Compute page address of current page. + page_addr_t *addr = (page_addr_t *)((fd->curr_page * FLASH_PAGE_SIZE_BYTES) + FLASH_BASE); + + //Copy modified page into internal latch. + for (page_addr_t page_addr = 0; page_addr < FLASH_PAGE_SIZE_BYTES; page_addr += 4) + { + uint32_t data; + memcpy(&data, &fd->page_buf[page_addr], sizeof(data)); + *addr = data; + addr++; + } + + // Send write command to transfer page from latch to internal flash memory. + flash_at91_sendWRcmd(fd->curr_page); + } +} + +/** + * Flush At91 flash function. + * + * Write current buffered page in flash memory (if modified). + * This function erase flash memory page before writing. + */ +static int flash_at91_kfileFlush(struct KFile *_fd) +{ + Flash *fd = FLASH_CAST(_fd); + flash_at91_flush(fd); + return 0; +} + + +/** + * Check current page and if \a page is different, load it in + * temporary buffer. + */ +static void flash_at91_loadPage(Flash *fd, page_t page) +{ + if (page != fd->curr_page) + { + flash_at91_flush(fd); + // Load page + memcpy(fd->page_buf, (const char *)((page * FLASH_PAGE_SIZE_BYTES) + FLASH_BASE), FLASH_PAGE_SIZE_BYTES); + fd->curr_page = page; + LOG_INFO("Loaded page %lu\n", fd->curr_page); + } +} + + +/** + * Write program memory. + * Write \a size bytes from buffer \a _buf to file \a fd + * \note Write operations are buffered. + */ +static size_t flash_at91_write(struct KFile *_fd, const void *_buf, size_t size) +{ + Flash *fd = FLASH_CAST(_fd); + const uint8_t *buf =(const uint8_t *)_buf; + + page_t page; + page_addr_t page_addr; + size_t total_write = 0; + + size = MIN((kfile_off_t)size, (kfile_off_t)(fd->fd.size - (fd->fd.seek_pos - FLASH_BASE))); + + LOG_INFO("Writing at pos[%lu]\n", fd->fd.seek_pos); + while (size) + { + page = (fd->fd.seek_pos - FLASH_BASE) / FLASH_PAGE_SIZE_BYTES; + page_addr = (fd->fd.seek_pos - FLASH_BASE) % FLASH_PAGE_SIZE_BYTES; + + flash_at91_loadPage(fd, page); + + size_t wr_len = MIN(size, (size_t)(FLASH_PAGE_SIZE_BYTES - page_addr)); + + memcpy(fd->page_buf + page_addr, buf, wr_len); + fd->page_dirty = true; + + buf += wr_len; + fd->fd.seek_pos += wr_len; + size -= wr_len; + total_write += wr_len; + } + LOG_INFO("written %u bytes\n", total_write); + return total_write; +} + +/** + * Close file \a fd + */ +static int flash_at91_close(struct KFile *_fd) +{ + Flash *fd = FLASH_CAST(_fd); + flash_at91_flush(fd); + LOG_INFO("Flash file closed\n"); + + return 0; +} + +/** + * Open flash file \a fd + * \a name and \a mode are unused, cause flash memory is + * threated like one file. + */ +static void flash_at91_open(struct Flash *fd) +{ + fd->fd.size = FLASH_BASE + FLASH_MEM_SIZE; + fd->fd.seek_pos = FLASH_BASE + FLASH_BOOT_SIZE; + fd->curr_page = (fd->fd.seek_pos - FLASH_BASE) / FLASH_PAGE_SIZE_BYTES; + + memcpy(fd->page_buf, (const char *)((fd->curr_page * FLASH_PAGE_SIZE_BYTES) + FLASH_BASE), FLASH_PAGE_SIZE_BYTES); + + fd->page_dirty = false; + LOG_INFO("Flash file opened\n"); +} + + +/** + * Move \a fd file seek position of \a offset bytes from \a whence. + * + */ +static kfile_off_t flash_at91_seek(struct KFile *_fd, kfile_off_t offset, KSeekMode whence) +{ + Flash *fd = FLASH_CAST(_fd); + kfile_off_t seek_pos; + + switch (whence) + { + + case KSM_SEEK_SET: + seek_pos = FLASH_BASE + FLASH_BOOT_SIZE; + break; + case KSM_SEEK_END: + seek_pos = fd->fd.size; + break; + case KSM_SEEK_CUR: + seek_pos = fd->fd.seek_pos; + break; + default: + ASSERT(0); + return EOF; + break; + } + + #if LOG_LEVEL >= LOG_LVL_INFO + /* Bound check */ + if (seek_pos + offset > fd->fd.size) + LOG_INFO("seek outside EOF\n"); + #endif + + fd->fd.seek_pos = seek_pos + offset; + + return fd->fd.seek_pos - (FLASH_BASE + FLASH_BOOT_SIZE); +} + +/** + * Reopen file \a fd + */ +static struct KFile *flash_at91_reopen(struct KFile *_fd) +{ + Flash *fd = FLASH_CAST(_fd); + flash_at91_close(_fd); + flash_at91_open(fd); + + return _fd; +} + +/** + * Read from file \a fd \a size bytes and put it in buffer \a buf + * \return the number of bytes read. + */ +static size_t flash_at91_read(struct KFile *_fd, void *_buf, size_t size) +{ + Flash *fd = FLASH_CAST(_fd); + uint8_t *buf =(uint8_t *)_buf; + + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); + + LOG_INFO("Reading at pos[%lu]\n", fd->fd.seek_pos); + + // Flush current buffered page (if modified). + flash_at91_flush(fd); + + uint32_t *addr = (uint32_t *)fd->fd.seek_pos; + memcpy(buf, (uint8_t *)addr, size); + + fd->fd.seek_pos += size; + + LOG_INFO("Read %u bytes\n", size); + return size; +} + + +/** + * Init module to perform write and read operation on internal + * flash memory. + */ +void flash_hw_init(struct Flash *fd) +{ + memset(fd, 0, sizeof(*fd)); + DB(fd->fd._type = KFT_FLASH); + + // Set up flash programming functions. + fd->fd.reopen = flash_at91_reopen; + fd->fd.close = flash_at91_close; + fd->fd.write = flash_at91_write; + fd->fd.read = flash_at91_read; + fd->fd.seek = flash_at91_seek; + fd->fd.error = flash_at91_getStatus; + fd->fd.flush = flash_at91_kfileFlush; + + flash_at91_open(fd); + + uint32_t fmcn; + uint32_t fws = 0; + + + /* + * Compute values to insert into mode register. + */ + + /* main clocks in 1.5uS */ + fmcn = (CPU_FREQ/1000000ul) + (CPU_FREQ/2000000ul) + 1; + + /* hard overclocking */ + if (fmcn > 0xFF) + fmcn = 0xFF; + + /* Only allow fmcn=0 if clock period is > 30 us = 33kHz. */ + if (CPU_FREQ <= 33333ul) + fmcn = 0; + + /* Only allow fws=0 if clock frequency is < 30 MHz. */ + if (CPU_FREQ > 30000000ul) + { + fws = 1; + } + + // Set wait states and number of MCK cycles in 1.5 usecs + MC_FMR = fmcn << 16 | fws << 8; + +} diff --git a/2.5/bertos/cpu/arm/drv/flash_at91.h b/2.5/bertos/cpu/arm/drv/flash_at91.h new file mode 100644 index 00000000..0b6c8d66 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/flash_at91.h @@ -0,0 +1,105 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief At91sam7 Internal flash read/write driver. + * + * + */ + +#ifndef FLASH_AT91_H +#define FLASH_AT91_H + +#include + +#include + +#include + + +#define FLASH_PAGE_SIZE FLASH_PAGE_SIZE_BYTES + +/** + * Define data type to manage page and memory address. + */ +typedef uint32_t page_t; +typedef uint32_t page_addr_t; + +struct Flash; + +/** + * FlashAt91 KFile context structure. + * + * DEPREACTED STRUCTURE! + * Use EmbFlash instead + * + * \{ + */ +typedef struct FlashAt91 +{ + /** + * File descriptor. + */ + KFile fd; + + /** + * Flag for checking if current page is modified. + */ + bool page_dirty; + + /** + * Current buffered page. + */ + page_t curr_page; + + /** + * Temporary buffer cointaing data block to + * write on flash. + */ + uint8_t page_buf[FLASH_PAGE_SIZE_BYTES]; +} FlashAt91; +/* \} */ + +void flash_hw_init(struct Flash *fd); + +/** + * WARNING! + * This function is DEPRECADED! + * use the emb_flash module instead. + */ +INLINE void flash_at91_init(struct FlashAt91 *fd) +{ + flash_hw_init((struct Flash *)fd); +} + +#endif /* DRV_FLASH_ARM_H */ diff --git a/2.5/bertos/cpu/arm/drv/i2s_at91.c b/2.5/bertos/cpu/arm/drv/i2s_at91.c new file mode 100644 index 00000000..edb8ba04 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/i2s_at91.c @@ -0,0 +1,175 @@ +/** + * \file + * + * + * \brief I2S driver implementation. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#include "i2s_at91.h" + +#include +#include +#include + +#define DATALEN (15 & SSC_DATLEN_MASK) +// FIXME: this is not correct for 16 <= DATALEN < 24 +#define PDC_DIV ((DATALEN / 8) + 1) +/* PDC_DIV must be 1, 2 or 4, which are the bytes that are transferred + * each time the PDC reads from memory. + */ +STATIC_ASSERT(PDC_DIV % 2 == 0); +#define PDC_COUNT (CONFIG_PLAY_BUF_LEN / PDC_DIV) + +static uint8_t play_buf1[CONFIG_PLAY_BUF_LEN]; +static uint8_t play_buf2[CONFIG_PLAY_BUF_LEN]; + +// the buffer in PDC next is play_buf2 +volatile bool is_second_buf_next; + +uint8_t *i2s_getBuffer(unsigned buf_num) +{ + LOG_INFO("getBuffer start\n"); + + if (i2s_isPlaying()) + { + ASSERT(0); + return 0; + } + + if (buf_num == I2S_SECOND_BUF) + return play_buf2; + else if (buf_num == I2S_FIRST_BUF) + return play_buf1; + else + return 0; +} + +uint8_t *i2s_getFreeBuffer(void) +{ + if (!i2s_isPlaying()) + { + ASSERT(0); + return 0; + } + + // wait PDC transmission end + if (!(SSC_SR & BV(SSC_ENDTX))) + return 0; + + uint8_t *ret_buf = 0; + // the last time we got called, the second buffer was in PDC next + if (is_second_buf_next) + { + is_second_buf_next = false; + ret_buf = play_buf1; + } + // the last time the first buffer was in PDC next + else + { + is_second_buf_next = true; + ret_buf = play_buf2; + } + + if (ret_buf) + { + SSC_TNPR = (reg32_t) ret_buf; + SSC_TNCR = PDC_COUNT; + } + return ret_buf; +} + +bool i2s_start(void) +{ + /* Some time must pass between disabling and enabling again the transmission + * on SSC. A good empirical value seems >15 us. We try to avoid putting an + * explicit delay, instead we disable the transmitter when a sound finishes + * and hope that the delay has passed before we enter here again. + */ + SSC_CR = BV(SSC_TXDIS); + timer_delay(10); + + SSC_PTCR = BV(PDC_TXTDIS); + SSC_TPR = (reg32_t)play_buf1; + SSC_TCR = PDC_COUNT; + SSC_TNPR = (reg32_t)play_buf2; + SSC_TNCR = PDC_COUNT; + is_second_buf_next = true; + + SSC_PTCR = BV(PDC_TXTEN); + + /* enable output */ + SSC_CR = BV(SSC_TXEN); + + return true; +} + +#define BITS_PER_CHANNEL 16 +#define N_OF_CHANNEL 2 +// TODO: check the computed value? +/* The last parameter (2) is due to the hadware on at91sam7s. */ +#define MCK_DIV (CPU_FREQ / CONFIG_SAMPLE_FREQ / BITS_PER_CHANNEL / N_OF_CHANNEL / 2) + +#define CONFIG_DELAY 1 +#define CONFIG_PERIOD 15 +#define CONFIG_DATNB 1 +#define CONFIG_FSLEN 15 + +#define DELAY ((CONFIG_DELAY << SSC_STTDLY_SHIFT) & SSC_STTDLY_MASK) +#define PERIOD ((CONFIG_PERIOD << (SSC_PERIOD_SHIFT)) & SSC_PERIOD_MASK) +#define DATNB ((CONFIG_DATNB << SSC_DATNB_SHIFT) & SSC_DATNB_MASK) +#define FSLEN ((CONFIG_FSLEN << SSC_FSLEN_SHIFT) & SSC_FSLEN_MASK) + +#define SSC_DMA_IRQ_PRIORITY 5 + +void i2s_init(void) +{ + PIOA_PDR = BV(SSC_TK) | BV(SSC_TF) | BV(SSC_TD); + /* reset device */ + SSC_CR = BV(SSC_SWRST); + + SSC_CMR = MCK_DIV & SSC_DIV_MASK; + SSC_TCMR = SSC_CKS_DIV | SSC_CKO_CONT | SSC_CKG_NONE | DELAY | PERIOD | SSC_START_FALL_F; + SSC_TFMR = DATALEN | DATNB | FSLEN | BV(SSC_MSBF) | SSC_FSOS_NEGATIVE; + + /* Disable all irqs */ + SSC_IDR = 0xFFFFFFFF; + + /* Enable the SSC IRQ */ + AIC_IECR = BV(SSC_ID); + + /* enable i2s */ + PMC_PCER = BV(SSC_ID); + + /* Enable SSC */ + SSC_CR = BV(SSC_TXEN); +} diff --git a/2.5/bertos/cpu/arm/drv/i2s_at91.h b/2.5/bertos/cpu/arm/drv/i2s_at91.h new file mode 100644 index 00000000..abdbdc28 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/i2s_at91.h @@ -0,0 +1,117 @@ +/** + * \file + * + * + * \brief I2S driver functions. + * + * This driver uses a double buffering technique to keep i2s bus busy. First fill in the two buffers + * using i2s_getBuffer(), then start audio playing with i2s_start(). Then call i2s_getFreeBuffer() + * until you have finished your samples. The reproduction will automatically stop if you don't + * call i2s_getFreeBuffer() frequently enough. + * + * Example: + * \code + * // fill in the buffers before start + * buf = i2s_getBuffer(I2S_FIRST_BUF); + * // ... + * buf = i2s_getBuffer(I2S_SECOND_BUF); + * // ... + * // here the driver will play only the first two buffers... + * i2s_start(); + * // ...call getFreeBuffer() to continue playing. + * while (!(buf = i2s_getFreeBuffer())) + * ; + * // now fill the buffer again + * \endcode + * + * \version $Id$ + * \author Luca Ottaviano + * + * $WIZ$ module_name = "i2s" + * $WIZ$ module_configuration = "bertos/cfg/cfg_i2s.h" + * $WIZ$ module_supports = "at91" + */ + +#ifndef I2S_H +#define I2S_H + +#include "cfg/cfg_i2s.h" + +#include +#include +#include + +/** + * First buffer. + */ +#define I2S_FIRST_BUF 0 +/** + * Second buffer. + */ +#define I2S_SECOND_BUF 1 + +/** + * Initializes the module and sets current buffer to I2S_FIRST_BUF. + */ +void i2s_init(void); + +/** + * Returns one of the two buffers or NULL if none is available. + * + * You can't call this function if you have already started the player. + * \param buf_num The number of the buffer, ie I2S_FIRST_BUF or I2S_SECOND_BUF. + * \return A pointer to the buffer if the buffer is available (not full), 0 on errors + */ +uint8_t *i2s_getBuffer(unsigned buf_num); + +/** + * Returns a buffer that will be played after the current one. + * + * You should fill it faster than your reproduction time. You can't call this function + * if the player is not running + * \return The next buffer to be played, 0 if both are busy. + */ +uint8_t *i2s_getFreeBuffer(void); + +/** + * Starts playing from I2S_FIRST_BUFFER. + * + * You must have filled both buffers before calling this function. Does nothing if already playing. + * \return false on errors, true otherwise. + */ +bool i2s_start(void); + +INLINE bool i2s_isPlaying(void) +{ + return !(SSC_SR & BV(SSC_TXEMPTY)); +} + +#endif /* I2S_H */ diff --git a/2.5/bertos/cpu/arm/drv/kdebug_arm.c b/2.5/bertos/cpu/arm/drv/kdebug_arm.c new file mode 100644 index 00000000..5ec3cded --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/kdebug_arm.c @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * \brief Low-level kdebug module for ARM (inplementation). + */ + +#include + +#if CPU_ARM_AT91 + #include "kdebug_at91.c" +#elif CPU_ARM_LPC2 + #include "kdebug_lpc2.c" +/*#elif Add other ARM families here */ +#else + #error Unknown CPU +#endif diff --git a/2.5/bertos/cpu/arm/drv/kdebug_at91.c b/2.5/bertos/cpu/arm/drv/kdebug_at91.c new file mode 100644 index 00000000..5f1b6023 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/kdebug_at91.c @@ -0,0 +1,94 @@ +/** + * \file + * + * + * \brief ARM debug support (implementation). + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "kdebug_at91.h" +#include /* for CPU_FREQ */ +#include "hw/hw_ser.h" /* Required for bus macros overrides */ + +#include "cfg/cfg_debug.h" +#include /* for BV(), DIV_ROUND */ + +#include + +#if CONFIG_KDEBUG_PORT == KDEBUG_PORT_DBGU + #define KDBG_WAIT_READY() while (!(DBGU_SR & BV(US_TXRDY))) {} + #define KDBG_WAIT_TXDONE() while (!(DBGU_SR & BV(US_TXEMPTY))) {} + + #define KDBG_WRITE_CHAR(c) do { DBGU_THR = (c); } while(0) + + /* Debug unit is used only for debug purposes so does not generate interrupts. */ + #define KDBG_MASK_IRQ(old) do { (void)old; } while(0) + + /* Debug unit is used only for debug purposes so does not generate interrupts. */ + #define KDBG_RESTORE_IRQ(old) do { (void)old; } while(0) + + typedef uint32_t kdbg_irqsave_t; + +#else + #error CONFIG_KDEBUG_PORT should be KDEBUG_PORT_DBGU +#endif + + +INLINE void kdbg_hw_init(void) +{ + #if CONFIG_KDEBUG_PORT == KDEBUG_PORT_DBGU + /* Disable all DBGU interrupts. */ + DBGU_IDR = 0xFFFFFFFF; + /* Reset DBGU */ + DBGU_CR = BV(US_RSTRX) | BV(US_RSTTX) | BV(US_RXDIS) | BV(US_TXDIS); + /* Set baudrate */ + DBGU_BRGR = DIV_ROUND(CPU_FREQ, 16 * CONFIG_KDEBUG_BAUDRATE); + /* Set DBGU mode to 8 data bits, no parity and 1 stop bit. */ + DBGU_MR = US_CHMODE_NORMAL | US_CHRL_8 | US_PAR_NO | US_NBSTOP_1; + /* Enable DBGU transmitter. */ + DBGU_CR = BV(US_TXEN); + /* Disable PIO on DGBU tx pin. */ + PIOA_PDR = BV(DTXD); + PIOA_ASR = BV(DTXD); + + #if 0 /* Disable Rx for now */ + /* Enable DBGU receiver. */ + DBGU_CR = BV(US_RXEN); + /* Disable PIO on DGBU rx pin. */ + PIOA_PDR = BV(DRXD); + PIOA_ASR = BV(DRXD); + #endif + #else + #error CONFIG_KDEBUG_PORT should be KDEBUG_PORT_DBGU + #endif /* CONFIG_KDEBUG_PORT == KDEBUG_PORT_DBGU */ +} diff --git a/2.5/bertos/cpu/arm/drv/kdebug_at91.h b/2.5/bertos/cpu/arm/drv/kdebug_at91.h new file mode 100644 index 00000000..165764e5 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/kdebug_at91.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * \brief ARM debug support (interface). + */ + +#ifndef DRV_KDEBUG_AT91_H +#define DRV_KDEBUG_AT91_H + +/** + * \name Values for CONFIG_KDEBUG_PORT. + * + * Select which hardware UART to use for system debug. + * + * \{ + */ +#define KDEBUG_PORT_DBGU 0 ///< Debug on Debug Unit. + +#define KDEBUG_PORT_DEFAULT KDEBUG_PORT_DBGU ///< Default debug port. +/* \} */ + +#endif /* DRV_KDEBUG_AT91_H */ diff --git a/2.5/bertos/cpu/arm/drv/kdebug_lpc2.c b/2.5/bertos/cpu/arm/drv/kdebug_lpc2.c new file mode 100644 index 00000000..0de6fb33 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/kdebug_lpc2.c @@ -0,0 +1,92 @@ +/** + * \file + * + * + * \brief ARM debug support (implementation). + * + * \author Francesco Sacchi + */ + +#include /* for CPU_FREQ */ +#include "hw/hw_ser.h" /* Required for bus macros overrides */ + +#include "cfg/cfg_debug.h" +#include /* for BV(), DIV_ROUND */ + +#include + +#if CONFIG_KDEBUG_PORT == 0 + #define KDBG_WAIT_READY() while (!(U0LSR & BV(5))) {} + #define KDBG_WAIT_TXDONE() while (!(U0LSR & BV(6))) {} + + #define KDBG_WRITE_CHAR(c) do { U0THR = (c); } while(0) + + #define KDBG_MASK_IRQ(old) do { \ + (old) = U0IER; \ + U0IER &= ~BV(1); \ + } while(0) + + #define KDBG_RESTORE_IRQ(old) do { \ + KDBG_WAIT_TXDONE(); \ + U0IER = (old); \ + } while(0) + + typedef uint32_t kdbg_irqsave_t; + +#else + #error CONFIG_KDEBUG_PORT should be 0 +#endif + + +INLINE void kdbg_hw_init(void) +{ + #if CONFIG_KDEBUG_PORT == 0 + /* Enable clock for UART0 */ + PCONP = BV(3); + /* Set UART0 clk to CPU_FREQ */ + PCLKSEL0 &= ~0xC0; + PCLKSEL0 |= 0x40; + /* Set 8bit, 1 stop bit, no parity, DLAB = 1 (enable divisor modify) */ + U0LCR = 0x83; + U0DLL = DIV_ROUND(CPU_FREQ, 16 * CONFIG_KDEBUG_BAUDRATE) & 0xFF; + U0DLM = (DIV_ROUND(CPU_FREQ, 16 * CONFIG_KDEBUG_BAUDRATE) >> 8) & 0xFF; + U0FDR = 0x10; + /* Assign TX pin to UART0*/ + PINSEL0 &= ~0x30; + PINSEL0 |= 0x10; + /* Set 8bit, 1 stop bit, no parity, DLAB = 0 (disable divisor modify) */ + U0LCR = 0x03; + /* Enable transmitter */ + U0TER = BV(7); + #else + #error CONFIG_KDEBUG_PORT should be 0 + #endif /* CONFIG_KDEBUG_PORT == 0 */ +} diff --git a/2.5/bertos/cpu/arm/drv/pwm_arm.c b/2.5/bertos/cpu/arm/drv/pwm_arm.c new file mode 100644 index 00000000..975d8db7 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/pwm_arm.c @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Low-level PWM module for ARM (inplementation). + * + * \version $Id$ + * + * \author Daniele Basile + * + * This module is automatically included so no need to include + * in test list. + * notest: arm + * + */ + +#ifndef WIZ_AUTOGEN + #warning This file is deprecated, you should use pwm_at91.c + + #include + + #if CPU_ARM_AT91 + #include "pwm_at91.c" + /*#elif Add other ARM families here */ + #else + #error Unknown CPU + #endif +#endif /* WIZ_AUTOGEN */ + diff --git a/2.5/bertos/cpu/arm/drv/pwm_arm.h b/2.5/bertos/cpu/arm/drv/pwm_arm.h new file mode 100644 index 00000000..f3e95e1c --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/pwm_arm.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Low-level PWM module for ARM (interface). + * + * \version $Id$ + * + * \author Daniele Basile + * + */ + +#include + +#if CPU_ARM_AT91 + #include "pwm_at91.h" +/*#elif Add other ARM families here */ +#else + #error Unknown CPU +#endif diff --git a/2.5/bertos/cpu/arm/drv/pwm_at91.c b/2.5/bertos/cpu/arm/drv/pwm_at91.c new file mode 100644 index 00000000..39fd4a66 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/pwm_at91.c @@ -0,0 +1,251 @@ +/** + * \file + * + * + * + * \brief PWM hardware-specific implementation + * + * \version $Id$ + * \author Daniele Basile + */ + +#include "pwm_at91.h" +#include "hw/pwm_map.h" +#include +#include "cfg/cfg_pwm.h" + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL PWM_LOG_LEVEL +#define LOG_FORMAT PWM_LOG_FORMAT +#include + +#include +#include + +#include + + +/** + * Register structure for pwm driver. + * This array content all data and register pointer + * to manage pwm peripheral device. + */ +static PwmChannel pwm_map[PWM_CNT] = +{ + {//PWM Channel 0 + .duty_zero = false, + .pol = false, + .pwm_pin = BV(PWM0), + .mode_reg = &PWM_CMR0, + .duty_reg = &PWM_CDTY0, + .period_reg = &PWM_CPRD0, + .update_reg = &PWM_CUPD0, + }, + {//PWM Channel 1 + .duty_zero = false, + .pol = false, + .pwm_pin = BV(PWM1), + .mode_reg = &PWM_CMR1, + .duty_reg = &PWM_CDTY1, + .period_reg = &PWM_CPRD1, + .update_reg = &PWM_CUPD1, + }, + {//PWM Channel 2 + .duty_zero = false, + .pol = false, + .pwm_pin = BV(PWM2), + .mode_reg = &PWM_CMR2, + .duty_reg = &PWM_CDTY2, + .period_reg = &PWM_CPRD2, + .update_reg = &PWM_CUPD2, + }, + {//PWM Channel 3 + .duty_zero = false, + .pol = false, + .pwm_pin = BV(PWM3), + .mode_reg = &PWM_CMR3, + .duty_reg = &PWM_CDTY3, + .period_reg = &PWM_CPRD3, + .update_reg = &PWM_CUPD3, + } +}; + + +/** + * Get preiod from select channel + * + * \a dev channel + */ +pwm_period_t pwm_hw_getPeriod(PwmDev dev) +{ + return *pwm_map[dev].period_reg; +} + +/** + * Set pwm waveform frequecy. + * + * \a freq in Hz + */ +void pwm_hw_setFrequency(PwmDev dev, uint32_t freq) +{ + uint32_t period = 0; + + for(int i = 0; i <= PWM_HW_MAX_PRESCALER_STEP; i++) + { + period = CPU_FREQ / (BV(i) * freq); + LOG_INFO("period[%ld], prescale[%d]\n", period, i); + if ((period < PWM_HW_MAX_PERIOD) && (period != 0)) + { + //Clean previous channel prescaler, and set new + *pwm_map[dev].mode_reg &= ~PWM_CPRE_MCK_MASK; + *pwm_map[dev].mode_reg |= i; + //Set pwm period + *pwm_map[dev].period_reg = period; + break; + } + } + + LOG_INFO("PWM ch[%d] period[%ld]\n", dev, period); +} + +/** + * Set pwm duty cycle. + * + * \a duty value 0 - 2^16 + */ +void pwm_hw_setDutyUnlock(PwmDev dev, uint16_t duty) +{ + ASSERT(duty <= (uint16_t)*pwm_map[dev].period_reg); + + + /* + * If polarity flag is true we must invert + * PWM polarity. + */ + if (pwm_map[dev].pol) + { + duty = (uint16_t)*pwm_map[dev].period_reg - duty; + LOG_INFO("Inverted duty[%d], pol[%d]\n", duty, pwm_map[dev].pol); + } + + /* + * WARNING: is forbidden to write 0 to duty cycle value, + * and so for duty = 0 we must enable PIO and clear output! + */ + if (!duty) + { + PWM_PIO_CODR = pwm_map[dev].pwm_pin; + PWM_PIO_PER = pwm_map[dev].pwm_pin; + pwm_map[dev].duty_zero = true; + } + else + { + PWM_PIO_PDR = pwm_map[dev].pwm_pin; + PWM_PIO_ABSR = pwm_map[dev].pwm_pin; + + *pwm_map[dev].update_reg = duty; + pwm_map[dev].duty_zero = false; + } + + PWM_ENA = BV(dev); + LOG_INFO("PWM ch[%d] duty[%d], period[%ld]\n", dev, duty, *pwm_map[dev].period_reg); +} + + +/** + * Enable select pwm channel + */ +void pwm_hw_enable(PwmDev dev) +{ + if (!pwm_map[dev].duty_zero) + { + PWM_PIO_PDR = pwm_map[dev].pwm_pin; + PWM_PIO_ABSR = pwm_map[dev].pwm_pin; + } +} + +/** + * Disable select pwm channel + */ +void pwm_hw_disable(PwmDev dev) +{ + PWM_PIO_PER = pwm_map[dev].pwm_pin; +} + +/** + * Set PWM polarity to select pwm channel + */ +void pwm_hw_setPolarity(PwmDev dev, bool pol) +{ + pwm_map[dev].pol = pol; + LOG_INFO("Set pol[%d]\n", pwm_map[dev].pol); +} + +/** + * Init pwm. + */ +void pwm_hw_init(void) +{ + + /* + * Init pwm: + * WARNING: is forbidden to write 0 to duty cycle value, + * and so for duty = 0 we must enable PIO and clear output! + * - clear PIO outputs + * - enable PIO outputs + * - Disable PIO and enable PWM functions + * - Power on PWM + */ + PWM_PIO_CODR = BV(PWM0) | BV(PWM1) | BV(PWM2) | BV(PWM3); + PWM_PIO_OER = BV(PWM0) | BV(PWM1) | BV(PWM2) | BV(PWM3); + PWM_PIO_PDR = BV(PWM0) | BV(PWM1) | BV(PWM2) | BV(PWM3); + PWM_PIO_ABSR = BV(PWM0) | BV(PWM1) | BV(PWM2) | BV(PWM3); + PMC_PCER |= BV(PWMC_ID); + + /* Disable all channels. */ + PWM_DIS = 0xFFFFFFFF; + /* Disable prescalers A and B */ + PWM_MR = 0; + + /* + * Set pwm mode: + * - set period alidned to left + * - set output waveform to start at high level + * - allow duty cycle modify at next period event + */ + for (int ch = 0; ch < PWM_CNT; ch++) + { + *pwm_map[ch].mode_reg = 0; + *pwm_map[ch].mode_reg = BV(PWM_CPOL); + } + +} + diff --git a/2.5/bertos/cpu/arm/drv/pwm_at91.h b/2.5/bertos/cpu/arm/drv/pwm_at91.h new file mode 100644 index 00000000..c8b0fd47 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/pwm_at91.h @@ -0,0 +1,84 @@ +/** + * \file + * + * + * + * \brief PWM hardware-specific definition + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef DRV_PWM_AT91_H +#define DRV_PWM_AT91_H + +#include "hw/pwm_map.h" + +#include +#include + +#include + + +#define PWM_HW_MAX_PRESCALER_STEP 10 +#define PWM_HW_MAX_PERIOD 0xFFFF + +/** + * Type definition for pwm period. + */ +typedef uint16_t pwm_period_t; + +/** + * Structur definition for pwm driver. + */ +typedef struct PwmChannel +{ + bool duty_zero; ///< True if duty cyle is zero, false otherwise. + bool pol; ///< PWM polarty flag. + int pwm_pin; ///< PWM pin. + reg32_t *mode_reg; ///< PWM mode register. + reg32_t *duty_reg; ///< PWM duty cycle register. + reg32_t *period_reg; ///< PWM periodic register. + reg32_t *update_reg; ///< Update setting register for PWM. + +} PwmChannel; + + +void pwm_hw_init(void); +void pwm_hw_setFrequency(PwmDev dev, uint32_t freq); +void pwm_hw_setDutyUnlock(PwmDev dev, uint16_t duty); +void pwm_hw_disable(PwmDev dev); +void pwm_hw_enable(PwmDev dev); +void pwm_hw_setPolarity(PwmDev dev, bool pol); +pwm_period_t pwm_hw_getPeriod(PwmDev dev); + +#endif /* DRV_ADC_AT91_H */ diff --git a/2.5/bertos/cpu/arm/drv/ser_arm.c b/2.5/bertos/cpu/arm/drv/ser_arm.c new file mode 100644 index 00000000..1fd0f6a5 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/ser_arm.c @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief Low-level serial module for ARM (inplementation). + * + * \version $Id$ + * + * \author Daniele Basile + * + * This module is automatically included so no need to include + * in test list. + * notest: arm + * + */ + +#ifndef WIZ_AUTOGEN + #warning This file is deprecated, you should use ser_at91.c + + #include + + #if CPU_ARM_AT91 + #include "ser_at91.c" + #elif CPU_ARM_LPC2378 + #include "ser_lpc2.c" + /*#elif Add other ARM families here */ + #else + #error Unknown CPU + #endif +#endif /* WIZ_AUTOGEN */ diff --git a/2.5/bertos/cpu/arm/drv/ser_arm.h b/2.5/bertos/cpu/arm/drv/ser_arm.h new file mode 100644 index 00000000..8c39fcf7 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/ser_arm.h @@ -0,0 +1,50 @@ +/** + * \file + * + * + * \brief Low-level serial module for ARM (interface). + * + * \version $Id$ + * + * \author Daniele Basile + * + */ + +#include + +#if CPU_ARM_AT91 + #include "ser_at91.h" +#elif CPU_ARM_LPC2378 + #include "ser_lpc2.h" +/*#elif Add other ARM families here */ +#else + #error Unknown CPU +#endif diff --git a/2.5/bertos/cpu/arm/drv/ser_at91.c b/2.5/bertos/cpu/arm/drv/ser_at91.c new file mode 100644 index 00000000..ffa5a440 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/ser_at91.c @@ -0,0 +1,919 @@ +/** + * \file + * + * + * \brief ARM UART and SPI I/O driver + * + * + * \version $Id$ + * \author Daniele Basile + */ + +#include "hw/hw_ser.h" /* Required for bus macros overrides */ +#include /* CPU_FREQ */ + +#include "cfg/cfg_ser.h" +#include + + +#include + +#include + +#include +#include + +#include + + +#define SERIRQ_PRIORITY 4 ///< default priority for serial irqs. + +/** + * \name Overridable serial bus hooks + * + * These can be redefined in hw.h to implement + * special bus policies such as half-duplex, 485, etc. + * + * + * \code + * TXBEGIN TXCHAR TXEND TXOFF + * | __________|__________ | | + * | | | | | | | | | + * v v v v v v v v v + * ______ __ __ __ __ __ __ ________________ + * \/ \/ \/ \/ \/ \/ \/ + * ______/\__/\__/\__/\__/\__/\__/ + * + * \endcode + * + * \{ + */ + +#ifndef SER_UART0_BUS_TXINIT + /** + * Default TXINIT macro - invoked in uart0_init() + * + * - Disable GPIO on USART0 tx/rx pins + */ + #if !CPU_ARM_SAM7S_LARGE && !CPU_ARM_SAM7X + #warning Check USART0 pins! + #endif + #define SER_UART0_BUS_TXINIT do { \ + PIOA_PDR = BV(RXD0) | BV(TXD0); \ + } while (0) + +#endif + +#ifndef SER_UART0_BUS_TXBEGIN + /** + * Invoked before starting a transmission + */ + #define SER_UART0_BUS_TXBEGIN +#endif + +#ifndef SER_UART0_BUS_TXCHAR + /** + * Invoked to send one character. + */ + #define SER_UART0_BUS_TXCHAR(c) do { \ + US0_THR = (c); \ + } while (0) +#endif + +#ifndef SER_UART0_BUS_TXEND + /** + * Invoked as soon as the txfifo becomes empty + */ + #define SER_UART0_BUS_TXEND +#endif + +/* End USART0 macros */ + +#ifndef SER_UART1_BUS_TXINIT + /** + * Default TXINIT macro - invoked in uart1_init() + * + * - Disable GPIO on USART1 tx/rx pins + */ + #if !CPU_ARM_SAM7S_LARGE && !CPU_ARM_SAM7X + #warning Check USART1 pins! + #endif + #define SER_UART1_BUS_TXINIT do { \ + PIOA_PDR = BV(RXD1) | BV(TXD1); \ + } while (0) + +#endif + +#ifndef SER_UART1_BUS_TXBEGIN + /** + * Invoked before starting a transmission + */ + #define SER_UART1_BUS_TXBEGIN +#endif + +#ifndef SER_UART1_BUS_TXCHAR + /** + * Invoked to send one character. + */ + #define SER_UART1_BUS_TXCHAR(c) do { \ + US1_THR = (c); \ + } while (0) +#endif + +#ifndef SER_UART1_BUS_TXEND + /** + * Invoked as soon as the txfifo becomes empty + */ + #define SER_UART1_BUS_TXEND +#endif + +/** +* \name Overridable SPI hooks +* +* These can be redefined in hw.h to implement +* special bus policies such as slave select pin handling, etc. +* +* \{ +*/ + +#ifndef SER_SPI0_BUS_TXINIT + /** + * Default TXINIT macro - invoked in spi_init() + * The default is no action. + */ + #define SER_SPI0_BUS_TXINIT +#endif + +#ifndef SER_SPI0_BUS_TXCLOSE + /** + * Invoked after the last character has been transmitted. + * The default is no action. + */ + #define SER_SPI0_BUS_TXCLOSE +#endif + +#if CPU_ARM_SAM7X + + #ifndef SER_SPI1_BUS_TXINIT + /** + * Default TXINIT macro - invoked in spi_init() + * The default is no action. + */ + #define SER_SPI1_BUS_TXINIT + #endif + + #ifndef SER_SPI1_BUS_TXCLOSE + /** + * Invoked after the last character has been transmitted. + * The default is no action. + */ + #define SER_SPI1_BUS_TXCLOSE + #endif +#endif +/*\}*/ + + + + +/* From the high-level serial driver */ +extern struct Serial *ser_handles[SER_CNT]; + +/* TX and RX buffers */ +static unsigned char uart0_txbuffer[CONFIG_UART0_TXBUFSIZE]; +static unsigned char uart0_rxbuffer[CONFIG_UART0_RXBUFSIZE]; + +static unsigned char uart1_txbuffer[CONFIG_UART1_TXBUFSIZE]; +static unsigned char uart1_rxbuffer[CONFIG_UART1_RXBUFSIZE]; + +static unsigned char spi0_txbuffer[CONFIG_SPI0_TXBUFSIZE]; +static unsigned char spi0_rxbuffer[CONFIG_SPI0_RXBUFSIZE]; +#if CPU_ARM_SAM7X +static unsigned char spi1_txbuffer[CONFIG_SPI1_TXBUFSIZE]; +static unsigned char spi1_rxbuffer[CONFIG_SPI1_RXBUFSIZE]; +#endif + +/** + * Internal hardware state structure + * + * The \a sending variable is true while the transmission + * interrupt is retriggering itself. + * + * For the USARTs the \a sending flag is useful for taking specific + * actions before sending a burst of data, at the start of a trasmission + * but not before every char sent. + * + * For the SPI, this flag is necessary because the SPI sends and receives + * bytes at the same time and the SPI IRQ is unique for send/receive. + * The only way to start transmission is to write data in SPDR (this + * is done by spi_starttx()). We do this *only* if a transfer is + * not already started. + */ +struct ArmSerial +{ + struct SerialHardware hw; + volatile bool sending; +}; + +static ISR_PROTO(uart0_irq_dispatcher); +static ISR_PROTO(uart1_irq_dispatcher); +static ISR_PROTO(spi0_irq_handler); +#if CPU_ARM_SAM7X +static ISR_PROTO(spi1_irq_handler); +#endif +/* + * Callbacks for USART0 + */ +static void uart0_init( + UNUSED_ARG(struct SerialHardware *, _hw), + UNUSED_ARG(struct Serial *, ser)) +{ + US0_IDR = 0xFFFFFFFF; + /* Set the vector. */ + AIC_SVR(US0_ID) = uart0_irq_dispatcher; + /* Initialize to level sensitive with defined priority. */ + AIC_SMR(US0_ID) = AIC_SRCTYPE_INT_LEVEL_SENSITIVE | SERIRQ_PRIORITY; + PMC_PCER = BV(US0_ID); + + /* + * - Reset USART0 + * - Set serial param: mode Normal, 8bit data, 1bit stop, parity none + * - Enable both the receiver and the transmitter + * - Enable only the RX complete interrupt + */ + US0_CR = BV(US_RSTRX) | BV(US_RSTTX); + US0_MR = US_CHMODE_NORMAL | US_CHRL_8 | US_NBSTOP_1 | US_PAR_NO; + US0_CR = BV(US_RXEN) | BV(US_TXEN); + US0_IER = BV(US_RXRDY); + + SER_UART0_BUS_TXINIT; + + /* Enable the USART IRQ */ + AIC_IECR = BV(US0_ID); + + SER_STROBE_INIT; +} + +static void uart0_cleanup(UNUSED_ARG(struct SerialHardware *, _hw)) +{ + US0_CR = BV(US_RSTRX) | BV(US_RSTTX) | BV(US_RXDIS) | BV(US_TXDIS) | BV(US_RSTSTA); +} + +static void uart0_enabletxirq(struct SerialHardware *_hw) +{ + struct ArmSerial *hw = (struct ArmSerial *)_hw; + + /* + * WARNING: racy code here! The tx interrupt sets hw->sending to false + * when it runs with an empty fifo. The order of statements in the + * if-block matters. + */ + if (!hw->sending) + { + hw->sending = true; + /* + * - Enable the transmitter + * - Enable TX empty interrupt + */ + SER_UART0_BUS_TXBEGIN; + US0_IER = BV(US_TXEMPTY); + } +} + +static void uart0_setbaudrate(UNUSED_ARG(struct SerialHardware *, _hw), unsigned long rate) +{ + /* Compute baud-rate period */ + US0_BRGR = CPU_FREQ / (16 * rate); + //DB(kprintf("uart0_setbaudrate(rate=%lu): period=%d\n", rate, period);) +} + +static void uart0_setparity(UNUSED_ARG(struct SerialHardware *, _hw), int parity) +{ + US0_MR &= ~US_PAR_MASK; + /* Set UART parity */ + switch(parity) + { + case SER_PARITY_NONE: + { + /* Parity none. */ + US0_MR |= US_PAR_NO; + break; + } + case SER_PARITY_EVEN: + { + /* Even parity. */ + US0_MR |= US_PAR_EVEN; + break; + } + case SER_PARITY_ODD: + { + /* Odd parity. */ + US0_MR |= US_PAR_ODD; + break; + } + default: + ASSERT(0); + } + +} +/* + * Callbacks for USART1 + */ +static void uart1_init( + UNUSED_ARG(struct SerialHardware *, _hw), + UNUSED_ARG(struct Serial *, ser)) +{ + US1_IDR = 0xFFFFFFFF; + /* Set the vector. */ + AIC_SVR(US1_ID) = uart1_irq_dispatcher; + /* Initialize to level sensitive with defined priority. */ + AIC_SMR(US1_ID) = AIC_SRCTYPE_INT_LEVEL_SENSITIVE | SERIRQ_PRIORITY; + PMC_PCER = BV(US1_ID); + + /* + * - Reset USART1 + * - Set serial param: mode Normal, 8bit data, 1bit stop, parity none + * - Enable both the receiver and the transmitter + * - Enable only the RX complete interrupt + */ + US1_CR = BV(US_RSTRX) | BV(US_RSTTX); + US1_MR = US_CHMODE_NORMAL | US_CHRL_8 | US_NBSTOP_1 | US_PAR_NO; + US1_CR = BV(US_RXEN) | BV(US_TXEN); + US1_IER = BV(US_RXRDY); + + SER_UART1_BUS_TXINIT; + + /* Enable the USART IRQ */ + AIC_IECR = BV(US1_ID); + + SER_STROBE_INIT; +} + +static void uart1_cleanup(UNUSED_ARG(struct SerialHardware *, _hw)) +{ + US1_CR = BV(US_RSTRX) | BV(US_RSTTX) | BV(US_RXDIS) | BV(US_TXDIS) | BV(US_RSTSTA); +} + +static void uart1_enabletxirq(struct SerialHardware *_hw) +{ + struct ArmSerial *hw = (struct ArmSerial *)_hw; + + /* + * WARNING: racy code here! The tx interrupt sets hw->sending to false + * when it runs with an empty fifo. The order of statements in the + * if-block matters. + */ + if (!hw->sending) + { + hw->sending = true; + /* + * - Enable the transmitter + * - Enable TX empty interrupt + */ + SER_UART1_BUS_TXBEGIN; + US1_IER = BV(US_TXEMPTY); + } +} + +static void uart1_setbaudrate(UNUSED_ARG(struct SerialHardware *, _hw), unsigned long rate) +{ + /* Compute baud-rate period */ + US1_BRGR = CPU_FREQ / (16 * rate); + //DB(kprintf("uart0_setbaudrate(rate=%lu): period=%d\n", rate, period);) +} + +static void uart1_setparity(UNUSED_ARG(struct SerialHardware *, _hw), int parity) +{ + US1_MR &= ~US_PAR_MASK; + /* Set UART parity */ + switch(parity) + { + case SER_PARITY_NONE: + { + /* Parity none. */ + US1_MR |= US_PAR_NO; + break; + } + case SER_PARITY_EVEN: + { + /* Even parity. */ + US1_MR |= US_PAR_EVEN; + break; + } + case SER_PARITY_ODD: + { + /* Odd parity. */ + US1_MR |= US_PAR_ODD; + break; + } + default: + ASSERT(0); + } + +} + +/* SPI driver */ +static void spi0_init(UNUSED_ARG(struct SerialHardware *, _hw), UNUSED_ARG(struct Serial *, ser)) +{ + /* Disable PIO on SPI pins */ + PIOA_PDR = BV(SPI0_SPCK) | BV(SPI0_MOSI) | BV(SPI0_MISO); + + /* Reset device */ + SPI0_CR = BV(SPI_SWRST); + + /* + * Set SPI to master mode, fixed peripheral select, chip select directly connected to a peripheral device, + * SPI clock set to MCK, mode fault detection disabled, loopback disable, NPCS0 active, Delay between CS = 0 + */ + SPI0_MR = BV(SPI_MSTR) | BV(SPI_MODFDIS); + + /* + * Set SPI mode. + * At reset clock division factor is set to 0, that is + * *forbidden*. Set SPI clock to minimum to keep it valid. + */ + SPI0_CSR0 = BV(SPI_NCPHA) | (255 << SPI_SCBR_SHIFT); + + /* Disable all irqs */ + SPI0_IDR = 0xFFFFFFFF; + /* Set the vector. */ + AIC_SVR(SPI0_ID) = spi0_irq_handler; + /* Initialize to edge triggered with defined priority. */ + AIC_SMR(SPI0_ID) = AIC_SRCTYPE_INT_EDGE_TRIGGERED | SERIRQ_PRIORITY; + /* Enable the USART IRQ */ + AIC_IECR = BV(SPI0_ID); + PMC_PCER = BV(SPI0_ID); + + /* Enable interrupt on tx buffer empty */ + SPI0_IER = BV(SPI_TXEMPTY); + + /* Enable SPI */ + SPI0_CR = BV(SPI_SPIEN); + + + SER_SPI0_BUS_TXINIT; + + SER_STROBE_INIT; +} + +static void spi0_cleanup(UNUSED_ARG(struct SerialHardware *, _hw)) +{ + /* Disable SPI */ + SPI0_CR = BV(SPI_SPIDIS); + + /* Disable all irqs */ + SPI0_IDR = 0xFFFFFFFF; + + SER_SPI0_BUS_TXCLOSE; + + /* Enable PIO on SPI pins */ + PIOA_PER = BV(SPI0_SPCK) | BV(SPI0_MOSI) | BV(SPI0_MISO); +} + +static void spi0_starttx(struct SerialHardware *_hw) +{ + struct ArmSerial *hw = (struct ArmSerial *)_hw; + + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* Send data only if the SPI is not already transmitting */ + if (!hw->sending && !fifo_isempty(&ser_handles[SER_SPI0]->txfifo)) + { + hw->sending = true; + SPI0_TDR = fifo_pop(&ser_handles[SER_SPI0]->txfifo); + } + + IRQ_RESTORE(flags); +} + +static void spi0_setbaudrate(UNUSED_ARG(struct SerialHardware *, _hw), unsigned long rate) +{ + SPI0_CSR0 &= ~SPI_SCBR; + + ASSERT((uint8_t)DIV_ROUND(CPU_FREQ, rate)); + SPI0_CSR0 |= DIV_ROUND(CPU_FREQ, rate) << SPI_SCBR_SHIFT; +} + +#if CPU_ARM_SAM7X +/* SPI driver */ +static void spi1_init(UNUSED_ARG(struct SerialHardware *, _hw), UNUSED_ARG(struct Serial *, ser)) +{ + /* Disable PIO on SPI pins */ + PIOA_PDR = BV(SPI1_SPCK) | BV(SPI1_MOSI) | BV(SPI1_MISO); + + /* SPI1 pins are on B peripheral function! */ + PIOA_BSR = BV(SPI1_SPCK) | BV(SPI1_MOSI) | BV(SPI1_MISO); + + /* Reset device */ + SPI1_CR = BV(SPI_SWRST); + + /* + * Set SPI to master mode, fixed peripheral select, chip select directly connected to a peripheral device, + * SPI clock set to MCK, mode fault detection disabled, loopback disable, NPCS0 active, Delay between CS = 0 + */ + SPI1_MR = BV(SPI_MSTR) | BV(SPI_MODFDIS); + + /* + * Set SPI mode. + * At reset clock division factor is set to 0, that is + * *forbidden*. Set SPI clock to minimum to keep it valid. + */ + SPI1_CSR0 = BV(SPI_NCPHA) | (255 << SPI_SCBR_SHIFT); + + /* Disable all irqs */ + SPI1_IDR = 0xFFFFFFFF; + /* Set the vector. */ + AIC_SVR(SPI1_ID) = spi1_irq_handler; + /* Initialize to edge triggered with defined priority. */ + AIC_SMR(SPI1_ID) = AIC_SRCTYPE_INT_EDGE_TRIGGERED | SERIRQ_PRIORITY; + /* Enable the USART IRQ */ + AIC_IECR = BV(SPI1_ID); + PMC_PCER = BV(SPI1_ID); + + /* Enable interrupt on tx buffer empty */ + SPI1_IER = BV(SPI_TXEMPTY); + + /* Enable SPI */ + SPI1_CR = BV(SPI_SPIEN); + + + SER_SPI1_BUS_TXINIT; + + SER_STROBE_INIT; +} + +static void spi1_cleanup(UNUSED_ARG(struct SerialHardware *, _hw)) +{ + /* Disable SPI */ + SPI1_CR = BV(SPI_SPIDIS); + + /* Disable all irqs */ + SPI1_IDR = 0xFFFFFFFF; + + SER_SPI1_BUS_TXCLOSE; + + /* Enable PIO on SPI pins */ + PIOA_PER = BV(SPI1_SPCK) | BV(SPI1_MOSI) | BV(SPI1_MISO); +} + +static void spi1_starttx(struct SerialHardware *_hw) +{ + struct ArmSerial *hw = (struct ArmSerial *)_hw; + + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* Send data only if the SPI is not already transmitting */ + if (!hw->sending && !fifo_isempty(&ser_handles[SER_SPI1]->txfifo)) + { + hw->sending = true; + SPI1_TDR = fifo_pop(&ser_handles[SER_SPI1]->txfifo); + } + + IRQ_RESTORE(flags); +} + +static void spi1_setbaudrate(UNUSED_ARG(struct SerialHardware *, _hw), unsigned long rate) +{ + SPI1_CSR0 &= ~SPI_SCBR; + + ASSERT((uint8_t)DIV_ROUND(CPU_FREQ, rate)); + SPI1_CSR0 |= DIV_ROUND(CPU_FREQ, rate) << SPI_SCBR_SHIFT; +} +#endif + +static void spi_setparity(UNUSED_ARG(struct SerialHardware *, _hw), UNUSED_ARG(int, parity)) +{ + // nop +} + + +static bool tx_sending(struct SerialHardware* _hw) +{ + struct ArmSerial *hw = (struct ArmSerial *)_hw; + return hw->sending; +} + +// FIXME: move into compiler.h? Ditch? +#if COMPILER_C99 + #define C99INIT(name,val) .name = val +#elif defined(__GNUC__) + #define C99INIT(name,val) name: val +#else + #warning No designated initializers, double check your code + #define C99INIT(name,val) (val) +#endif + +/* + * High-level interface data structures + */ +static const struct SerialHardwareVT UART0_VT = +{ + C99INIT(init, uart0_init), + C99INIT(cleanup, uart0_cleanup), + C99INIT(setBaudrate, uart0_setbaudrate), + C99INIT(setParity, uart0_setparity), + C99INIT(txStart, uart0_enabletxirq), + C99INIT(txSending, tx_sending), +}; + +static const struct SerialHardwareVT UART1_VT = +{ + C99INIT(init, uart1_init), + C99INIT(cleanup, uart1_cleanup), + C99INIT(setBaudrate, uart1_setbaudrate), + C99INIT(setParity, uart1_setparity), + C99INIT(txStart, uart1_enabletxirq), + C99INIT(txSending, tx_sending), +}; + +static const struct SerialHardwareVT SPI0_VT = +{ + C99INIT(init, spi0_init), + C99INIT(cleanup, spi0_cleanup), + C99INIT(setBaudrate, spi0_setbaudrate), + C99INIT(setParity, spi_setparity), + C99INIT(txStart, spi0_starttx), + C99INIT(txSending, tx_sending), +}; +#if CPU_ARM_SAM7X +static const struct SerialHardwareVT SPI1_VT = +{ + C99INIT(init, spi1_init), + C99INIT(cleanup, spi1_cleanup), + C99INIT(setBaudrate, spi1_setbaudrate), + C99INIT(setParity, spi_setparity), + C99INIT(txStart, spi1_starttx), + C99INIT(txSending, tx_sending), +}; +#endif + +static struct ArmSerial UARTDescs[SER_CNT] = +{ + { + C99INIT(hw, /**/) { + C99INIT(table, &UART0_VT), + C99INIT(txbuffer, uart0_txbuffer), + C99INIT(rxbuffer, uart0_rxbuffer), + C99INIT(txbuffer_size, sizeof(uart0_txbuffer)), + C99INIT(rxbuffer_size, sizeof(uart0_rxbuffer)), + }, + C99INIT(sending, false), + }, + { + C99INIT(hw, /**/) { + C99INIT(table, &UART1_VT), + C99INIT(txbuffer, uart1_txbuffer), + C99INIT(rxbuffer, uart1_rxbuffer), + C99INIT(txbuffer_size, sizeof(uart1_txbuffer)), + C99INIT(rxbuffer_size, sizeof(uart1_rxbuffer)), + }, + C99INIT(sending, false), + }, + + { + C99INIT(hw, /**/) { + C99INIT(table, &SPI0_VT), + C99INIT(txbuffer, spi0_txbuffer), + C99INIT(rxbuffer, spi0_rxbuffer), + C99INIT(txbuffer_size, sizeof(spi0_txbuffer)), + C99INIT(rxbuffer_size, sizeof(spi0_rxbuffer)), + }, + C99INIT(sending, false), + }, + #if CPU_ARM_SAM7X + { + C99INIT(hw, /**/) { + C99INIT(table, &SPI1_VT), + C99INIT(txbuffer, spi1_txbuffer), + C99INIT(rxbuffer, spi1_rxbuffer), + C99INIT(txbuffer_size, sizeof(spi1_txbuffer)), + C99INIT(rxbuffer_size, sizeof(spi1_rxbuffer)), + }, + C99INIT(sending, false), + } + + #endif +}; + +struct SerialHardware *ser_hw_getdesc(int unit) +{ + ASSERT(unit < SER_CNT); + return &UARTDescs[unit].hw; +} + +/** + * Serial 0 TX interrupt handler + */ +INLINE void uart0_irq_tx(void) +{ + SER_STROBE_ON; + + struct FIFOBuffer * const txfifo = &ser_handles[SER_UART0]->txfifo; + + if (fifo_isempty(txfifo)) + { + /* + * - Disable the TX empty interrupts + */ + US0_IDR = BV(US_TXEMPTY); + SER_UART0_BUS_TXEND; + UARTDescs[SER_UART0].sending = false; + } + else + { + char c = fifo_pop(txfifo); + SER_UART0_BUS_TXCHAR(c); + } + + SER_STROBE_OFF; +} + +/** + * Serial 0 RX complete interrupt handler. + */ +INLINE void uart0_irq_rx(void) +{ + SER_STROBE_ON; + + /* Should be read before US_CRS */ + ser_handles[SER_UART0]->status |= US0_CSR & (SERRF_RXSROVERRUN | SERRF_FRAMEERROR); + US0_CR = BV(US_RSTSTA); + + char c = US0_RHR; + struct FIFOBuffer * const rxfifo = &ser_handles[SER_UART0]->rxfifo; + + if (fifo_isfull(rxfifo)) + ser_handles[SER_UART0]->status |= SERRF_RXFIFOOVERRUN; + else + fifo_push(rxfifo, c); + + SER_STROBE_OFF; +} + +/** + * Serial IRQ dispatcher for USART0. + */ +static DECLARE_ISR(uart0_irq_dispatcher) +{ + if (US0_CSR & BV(US_RXRDY)) + uart0_irq_rx(); + + if (US0_CSR & BV(US_TXEMPTY)) + uart0_irq_tx(); + + /* Inform hw that we have served the IRQ */ + AIC_EOICR = 0; +} + +/** + * Serial 1 TX interrupt handler + */ +INLINE void uart1_irq_tx(void) +{ + SER_STROBE_ON; + + struct FIFOBuffer * const txfifo = &ser_handles[SER_UART1]->txfifo; + + if (fifo_isempty(txfifo)) + { + /* + * - Disable the TX empty interrupts + */ + US1_IDR = BV(US_TXEMPTY); + SER_UART1_BUS_TXEND; + UARTDescs[SER_UART1].sending = false; + } + else + { + char c = fifo_pop(txfifo); + SER_UART1_BUS_TXCHAR(c); + } + + SER_STROBE_OFF; +} + +/** + * Serial 1 RX complete interrupt handler. + */ +INLINE void uart1_irq_rx(void) +{ + SER_STROBE_ON; + + /* Should be read before US_CRS */ + ser_handles[SER_UART1]->status |= US1_CSR & (SERRF_RXSROVERRUN | SERRF_FRAMEERROR); + US1_CR = BV(US_RSTSTA); + + char c = US1_RHR; + struct FIFOBuffer * const rxfifo = &ser_handles[SER_UART1]->rxfifo; + + if (fifo_isfull(rxfifo)) + ser_handles[SER_UART1]->status |= SERRF_RXFIFOOVERRUN; + else + fifo_push(rxfifo, c); + + SER_STROBE_OFF; +} + +/** + * Serial IRQ dispatcher for USART1. + */ +static DECLARE_ISR(uart1_irq_dispatcher) +{ + if (US1_CSR & BV(US_RXRDY)) + uart1_irq_rx(); + + if (US1_CSR & BV(US_TXEMPTY)) + uart1_irq_tx(); + + /* Inform hw that we have served the IRQ */ + AIC_EOICR = 0; +} + +/** + * SPI0 interrupt handler + */ +static DECLARE_ISR(spi0_irq_handler) +{ + SER_STROBE_ON; + + char c = SPI0_RDR; + /* Read incoming byte. */ + if (!fifo_isfull(&ser_handles[SER_SPI0]->rxfifo)) + fifo_push(&ser_handles[SER_SPI0]->rxfifo, c); + /* + * FIXME + else + ser_handles[SER_SPI0]->status |= SERRF_RXFIFOOVERRUN; + */ + + /* Send */ + if (!fifo_isempty(&ser_handles[SER_SPI0]->txfifo)) + SPI0_TDR = fifo_pop(&ser_handles[SER_SPI0]->txfifo); + else + UARTDescs[SER_SPI0].sending = false; + + /* Inform hw that we have served the IRQ */ + AIC_EOICR = 0; + SER_STROBE_OFF; +} + + +#if CPU_ARM_SAM7X +/** + * SPI1 interrupt handler + */ +static DECLARE_ISR(spi1_irq_handler) +{ + SER_STROBE_ON; + + char c = SPI1_RDR; + /* Read incoming byte. */ + if (!fifo_isfull(&ser_handles[SER_SPI1]->rxfifo)) + fifo_push(&ser_handles[SER_SPI1]->rxfifo, c); + /* + * FIXME + else + ser_handles[SER_SPI1]->status |= SERRF_RXFIFOOVERRUN; + */ + + /* Send */ + if (!fifo_isempty(&ser_handles[SER_SPI1]->txfifo)) + SPI1_TDR = fifo_pop(&ser_handles[SER_SPI1]->txfifo); + else + UARTDescs[SER_SPI1].sending = false; + + /* Inform hw that we have served the IRQ */ + AIC_EOICR = 0; + SER_STROBE_OFF; +} +#endif diff --git a/2.5/bertos/cpu/arm/drv/ser_at91.h b/2.5/bertos/cpu/arm/drv/ser_at91.h new file mode 100644 index 00000000..d345a9e9 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/ser_at91.h @@ -0,0 +1,83 @@ +/** + * \file + * + * + * \brief High level serial I/O API + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef SER_AT91_H +#define SER_AT91_H + +#include /* BV() */ +#include /* uint32_t */ +#include /* CPU_* */ + +/** \name Serial Error/status flags. */ +/*\{*/ +typedef uint32_t serstatus_t; + +/* Software errors */ +#define SERRF_RXFIFOOVERRUN BV(0) /**< Rx FIFO buffer overrun */ +#define SERRF_RXTIMEOUT BV(1) /**< Receive timeout */ +#define SERRF_TXTIMEOUT BV(2) /**< Transmit timeout */ + +/* + * Hardware errors. + * These flags map directly to the ARM USART Channel Status Register (US_CSR). + */ +#define SERRF_RXSROVERRUN BV(5) /**< Rx shift register overrun */ +#define SERRF_FRAMEERROR BV(6) /**< Stop bit missing */ +#define SERRF_PARITYERROR BV(7) /**< Parity error */ +#define SERRF_NOISEERROR 0 /**< Unsupported */ +/*\}*/ + +/** + * \name Serial hw numbers + * + * \{ + */ +enum +{ +SER_UART0, +SER_UART1, +SER_SPI0, +#if CPU_ARM_SAM7X +SER_SPI1, +#endif +SER_CNT /**< Number of serial ports */ +}; +/*\}*/ + +#endif /* SER_AT91_H */ diff --git a/2.5/bertos/cpu/arm/drv/ser_lpc2.c b/2.5/bertos/cpu/arm/drv/ser_lpc2.c new file mode 100644 index 00000000..4c169571 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/ser_lpc2.c @@ -0,0 +1,487 @@ +/** + * \file + * + * + * \brief LPC23xx UART driver. + * + * \author Andrea Righi + * + * notest:arm + */ + +#include /* for BV() */ +#include /* cpu_relax() */ +#include +#include +#include /* vic_handler_t */ +#include +#include "cfg/cfg_ser.h" +#include "ser_lpc2.h" + +/* IRQ numbers */ +#define INT_UART0 6 +#define INT_UART1 7 +#define INT_UART2 28 +#define INT_UART3 29 + +/* Register offsets */ +#define RBR 0x00 +#define THR 0x00 +#define DLL 0x00 +#define DLM 0x04 +#define IER 0x04 +#define IIR 0x08 +#define FCR 0x08 +#define LCR 0x0c +#define LSR 0x14 +#define SCR 0x1c +#define ACR 0x20 +#define ICR 0x24 +#define FDR 0x28 +#define TER 0x30 + +/* From the high-level serial driver */ +extern struct Serial *ser_handles[SER_CNT]; + +struct LPC2Serial +{ + struct SerialHardware hw; + bool sending; + int irq; +}; + +/* Forward declaration */ +static struct LPC2Serial UARTDesc[SER_CNT]; + +struct uart_config +{ + uint32_t base; + uint32_t pconp; + uint32_t pclksel0; + uint32_t pclksel0_mask; + uint32_t pclksel1; + uint32_t pclksel1_mask; + uint32_t pinsel0; + uint32_t pinsel0_mask; + uint32_t pinsel4; + uint32_t pinsel4_mask; +}; + +/* UART registers configuration */ +static const struct uart_config uart_param[] = +{ + /* UART0 */ + { + .base = UART0_BASE_ADDR, + .pconp = BV(3), + + .pclksel0 = BV(6), + .pclksel0_mask = BV(7) | BV(6), + + .pclksel1 = 0, + .pclksel1_mask = 0, + + .pinsel0 = BV(6) | BV(4), + .pinsel0_mask = BV(7) | BV(6) | BV(5) | BV(4), + + .pinsel4 = 0, + .pinsel4_mask = 0, + }, + /* UART1 */ + { + .base = UART1_BASE_ADDR, + .pconp = BV(4), + + .pclksel0 = BV(8), + .pclksel0_mask = BV(9) | BV(8), + + .pclksel1 = 0, + .pclksel1_mask = 0, + + .pinsel0 = 0, + .pinsel0_mask = 0, + + .pinsel4 = BV(3) | BV(1), + .pinsel4_mask = BV(3) | BV(2) | BV(1) | BV(0), + }, + /* UART2 */ + { + .base = UART2_BASE_ADDR, + .pconp = BV(24), + + .pclksel0 = 0, + .pclksel0_mask = 0, + + .pclksel1 = BV(16), + .pclksel1_mask = BV(17) | BV(16), + + .pinsel0 = 0, + .pinsel0_mask = 0, + + .pinsel4 = BV(19) | BV(17), + .pinsel4_mask = BV(19) | BV(18) | BV(17) | BV(16), + }, + /* UART3 */ + { + .base = UART3_BASE_ADDR, + .pconp = BV(25), + + .pclksel0 = 0, + .pclksel0_mask = 0, + + .pclksel1 = BV(18), + .pclksel1_mask = BV(19) | BV(18), + + .pinsel0 = BV(3) | BV(1), + .pinsel0_mask = BV(3) | BV(2) | BV(1) | BV(0), + + .pinsel4 = 0, + .pinsel4_mask = 0, + }, +}; + +static void lpc2_uartSetBaudRate(int port, unsigned long baud) +{ + cpu_flags_t flags; + + IRQ_SAVE_DISABLE(flags); + + /* LCR: DLAB = 1 (enable divisor modify) */ + *(reg8_t *)(uart_param[port].base + LCR) |= 0x80; + /* DLL */ + *(reg8_t *)(uart_param[port].base + DLL) = + DIV_ROUND(CPU_FREQ, 16 * baud) & 0xFF; + /* DLM */ + *(reg8_t *)(uart_param[port].base + DLM) = + (DIV_ROUND(CPU_FREQ, 16 * baud) >> 8) & 0xFF; + *(reg32_t *)(uart_param[port].base + LCR) &= ~0x80; + /* LCR: DLAB = 0 (disable divisor modify) */ + *(reg8_t *)(uart_param[port].base + LCR) &= ~0x80; + + IRQ_RESTORE(flags); +} + +static void lpc2_uartSetParity(int port, int parity) +{ + /* Set 8-bit word, one stop bit by default */ + uint32_t config = BV(1) | BV(0); + + cpu_flags_t flags; + + IRQ_SAVE_DISABLE(flags); + + switch(parity) + { + case SER_PARITY_NONE: + break; + case SER_PARITY_ODD: + config |= BV(3); + break; + case SER_PARITY_EVEN: + config |= BV(4) | BV(3); + break; + default: + ASSERT(0); + IRQ_RESTORE(flags); + return; + } + /* LCR */ + *(reg8_t *)(uart_param[port].base + LCR) = config; + + IRQ_RESTORE(flags); +} + +static void lpc2_uartPutChar(uint32_t base, uint8_t c) +{ + reg8_t *lsr = (reg8_t *)base + LSR; + reg8_t *thr = (reg8_t *)base + THR; + + while (!(*lsr & BV(6))) + cpu_relax(); + *thr = c; +} + +void lpc2_uartInit(int port) +{ + cpu_flags_t flags; + + IRQ_SAVE_DISABLE(flags); + + /* Power-on the device */ + PCONP |= uart_param[port].pconp; + /* Set UART clk to CPU_FREQ */ + PCLKSEL0 &= ~uart_param[port].pclksel0_mask; + PCLKSEL0 |= uart_param[port].pclksel0; + PCLKSEL1 &= ~uart_param[port].pclksel1_mask; + PCLKSEL1 |= uart_param[port].pclksel1; + + /* LCR: 8bit, 1 stop bit, no parity, DLAB = 1 (enable divisor modify) */ + *(reg8_t *)(uart_param[port].base + LCR) = 0x83; + /* DLL */ + *(reg8_t *)(uart_param[port].base + DLL) = + DIV_ROUND(CPU_FREQ, 16 * CONFIG_KDEBUG_BAUDRATE) & 0xFF; + /* DLM */ + *(reg8_t *)(uart_param[port].base + DLM) = + (DIV_ROUND(CPU_FREQ, 16 * CONFIG_KDEBUG_BAUDRATE) >> 8) & 0xFF; + /* FDR */ + *(reg32_t *)(uart_param[port].base + FDR) = 0x10; + + /* Assign TX pin to UART0*/ + PINSEL0 &= ~uart_param[port].pinsel0_mask; + PINSEL0 |= uart_param[port].pinsel0; + PINSEL4 &= ~uart_param[port].pinsel4_mask; + PINSEL4 |= uart_param[port].pinsel4; + /* LCR: set 8bit, 1 stop bit, no parity, DLAB = 0 (disable divisor modify) */ + *(reg8_t *)(uart_param[port].base + LCR) = 0x03; + + /* TER: Enable transmitter */ + *(reg8_t *)(uart_param[port].base + TER) = BV(7); + /* IER: Enable RBR interrupt */ + *(reg8_t *)(uart_param[port].base + IER) = BV(0); + + IRQ_RESTORE(flags); +} + +static bool tx_sending(struct SerialHardware *_hw) +{ + struct LPC2Serial *hw = (struct LPC2Serial *)_hw; + return hw->sending; +} + +INLINE bool lpc2_uartRxReady(int port) +{ + /* LSR: check Receiver Data Ready (RDR) bit */ + return *(reg8_t *)(uart_param[port].base + LSR) & BV(0) ? true : false; +} + +static void uart_irq_rx(int port) +{ + struct FIFOBuffer *rxfifo = &ser_handles[port]->rxfifo; + char c; + + while (lpc2_uartRxReady(port)) + { + /* RBR: read a character from the Receiver Buffer Register */ + c = *(reg8_t *)(uart_param[port].base + RBR); + if (fifo_isfull(rxfifo)) + ser_handles[port]->status |= SERRF_RXFIFOOVERRUN; + else + fifo_push(rxfifo, c); + } +} + +INLINE bool lpc2_uartTxReady(int port) +{ + /* LSR: check Transmitter Holding Register Empty (THRE) bit */ + return *(reg8_t *)(uart_param[port].base + LSR) & BV(5) ? true : false; +} + +static void uart_irq_tx(int port) +{ + struct FIFOBuffer *txfifo = &ser_handles[port]->txfifo; + + while (lpc2_uartTxReady(port)) + { + /* + * Disable TX empty interrupts if there're no more + * characters to transmit. + */ + if (fifo_isempty(txfifo)) + { + /* IER: Disable THRE interrupt */ + *(reg8_t *)(uart_param[port].base + IER) &= ~BV(1); + UARTDesc[port].sending = false; + break; + } + /* THR: put a character to the Transmit Holding Register */ + *(reg8_t *)(uart_param[port].base + THR) = fifo_pop(txfifo); + } +} + +static void uart_common_irq_handler(int port) +{ + /* IIR: identify the interrupt source */ + uint32_t status = *(reg32_t *)(uart_param[port].base + IIR) >> 1 & 0x7; + + /* Receiver Data Ready (RDR) */ + if (status == 0x02) + uart_irq_rx(port); + /* Transmit Holding Register Empty (THRE) */ + else if (status == 0x01) + uart_irq_tx(port); + /* Signal the VIC we have completed the ISR */ + VICVectAddr = 0; +} + +static void lpc2_uartIRQEnable(int port, vic_handler_t handler) +{ + vic_setVector(UARTDesc[port].irq, handler); + vic_enable(UARTDesc[port].irq); +} + +static void lpc2_uartIRQDisable(int port) +{ + vic_disable(UARTDesc[port].irq); +} + +/* UART class definition */ +#define UART_PORT(port) \ + /* UART TX and RX buffers */ \ + static unsigned char \ + uart ## port ## _txbuffer[CONFIG_UART ## port ## _TXBUFSIZE]; \ + static unsigned char \ + uart ## port ## _rxbuffer[CONFIG_UART ## port ## _RXBUFSIZE]; \ + \ + /* UART interrupt handler */ \ + static DECLARE_ISR(uart ## port ## _irq_handler) \ + { \ + uart_common_irq_handler(port); \ + } \ + \ + /* UART public methods */ \ + static void \ + uart ## port ## _txStart(struct SerialHardware *_hw) \ + { \ + struct FIFOBuffer *txfifo = &ser_handles[port]->txfifo; \ + struct LPC2Serial *hw = (struct LPC2Serial *)_hw; \ + \ + if (hw->sending) \ + return; \ + lpc2_uartPutChar(UART ## port ## _BASE_ADDR, fifo_pop(txfifo)); \ + if (!fifo_isempty(txfifo)) \ + { \ + hw->sending = true; \ + /* IER: Enable THRE interrupt */ \ + *(reg8_t *)(uart_param[port].base + IER) |= BV(1); \ + } \ + } \ + \ + static void \ + uart ## port ## _setbaudrate(UNUSED_ARG(struct SerialHardware *, hw), \ + unsigned long baud) \ + { \ + lpc2_uartSetBaudRate(port, baud); \ + } \ + \ + static void \ + uart ## port ## _setparity(UNUSED_ARG(struct SerialHardware *, hw), \ + int parity) \ + { \ + lpc2_uartSetParity(port, parity); \ + } \ + \ + static void \ + uart ## port ## _cleanup(struct SerialHardware *_hw) \ + { \ + struct LPC2Serial *hw = (struct LPC2Serial *)_hw; \ + \ + hw->sending = false; \ + lpc2_uartIRQDisable(port); \ + } \ + \ + static void \ + uart ## port ## _init(UNUSED_ARG(struct SerialHardware *, hw), \ + UNUSED_ARG(struct Serial *, ser)) \ + { \ + lpc2_uartInit(port); \ + lpc2_uartIRQEnable(port, uart ## port ## _irq_handler); \ + } \ + \ + /* UART operations */ \ + static const struct SerialHardwareVT UART ## port ## _VT = \ + { \ + .init = uart ## port ## _init, \ + .cleanup = uart ## port ## _cleanup, \ + .setBaudrate = uart ## port ## _setbaudrate, \ + .setParity = uart ## port ## _setparity, \ + .txStart = uart ## port ## _txStart, \ + .txSending = tx_sending, \ + }; + +/* UART port instances */ +UART_PORT(0) +UART_PORT(1) +UART_PORT(2) +UART_PORT(3) + +static struct LPC2Serial UARTDesc[SER_CNT] = +{ + { + .hw = { + .table = &UART0_VT, + .txbuffer = uart0_txbuffer, + .rxbuffer = uart0_rxbuffer, + .txbuffer_size = sizeof(uart0_txbuffer), + .rxbuffer_size = sizeof(uart0_rxbuffer), + }, + .sending = false, + .irq = INT_UART0, + }, + { + .hw = { + .table = &UART1_VT, + .txbuffer = uart1_txbuffer, + .rxbuffer = uart1_rxbuffer, + .txbuffer_size = sizeof(uart1_txbuffer), + .rxbuffer_size = sizeof(uart1_rxbuffer), + }, + .sending = false, + .irq = INT_UART1, + }, + { + .hw = { + .table = &UART2_VT, + .txbuffer = uart2_txbuffer, + .rxbuffer = uart2_rxbuffer, + .txbuffer_size = sizeof(uart2_txbuffer), + .rxbuffer_size = sizeof(uart2_rxbuffer), + }, + .sending = false, + .irq = INT_UART2, + }, + { + .hw = { + .table = &UART3_VT, + .txbuffer = uart3_txbuffer, + .rxbuffer = uart3_rxbuffer, + .txbuffer_size = sizeof(uart3_txbuffer), + .rxbuffer_size = sizeof(uart3_rxbuffer), + }, + .sending = false, + .irq = INT_UART3, + }, +}; + +struct SerialHardware *ser_hw_getdesc(int port) +{ + ASSERT(port >= 0 && port < SER_CNT); + return &UARTDesc[port].hw; +} diff --git a/2.5/bertos/cpu/arm/drv/ser_lpc2.h b/2.5/bertos/cpu/arm/drv/ser_lpc2.h new file mode 100644 index 00000000..cd0669d0 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/ser_lpc2.h @@ -0,0 +1,73 @@ +/** + * \file + * + * + * \brief LPC23xx UART driver. + * + * \author Andrea Righi + */ + +#ifndef SER_LPC2_H +#define SER_LPC2_H + +#include +#include + +/* Serial hardware numbers */ +enum +{ + SER_UART0, + SER_UART1, + SER_UART2, + SER_UART3, + + SER_CNT //< Number of serial ports +}; + +/* Software errors */ +#define SERRF_RXFIFOOVERRUN BV(0) //< Rx FIFO buffer overrun +#define SERRF_RXTIMEOUT BV(1) //< Receive timeout +#define SERRF_TXTIMEOUT BV(2) //< Transmit timeout + +/* + * Hardware errors. + */ +#define SERRF_RXSROVERRUN 0 //< Input overrun +#define SERRF_FRAMEERROR 0 //< Stop bit missing +#define SERRF_PARITYERROR 0 //< Parity error +#define SERRF_NOISEERROR 0 //< Noise error + +/* Serial error/status flags */ +typedef uint32_t serstatus_t; + +void lpc2_uartInit(int port); + +#endif /* SER_LPC2_H */ diff --git a/2.5/bertos/cpu/arm/drv/spi_dma_at91.c b/2.5/bertos/cpu/arm/drv/spi_dma_at91.c new file mode 100644 index 00000000..8576fc07 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/spi_dma_at91.c @@ -0,0 +1,249 @@ +/** + * \file + * + * + * \brief SPI driver with DMA. + * + * \version $Id$ + * \author Francesco Sacchi + * \author Luca Ottaviano + */ + +#include "cfg/cfg_spi_dma.h" + +#include "spi_dma_at91.h" +#include "hw/hw_spi_dma.h" + +#include +#include +#include +#include + +#include +#include + +#include /* memset */ + +static uint8_t tx_fifo_buffer[CONFIG_SPI_DMA_TXBUFSIZE]; +static FIFOBuffer tx_fifo; +static KFileFifo kfifo; + + +INLINE void spi_dma_startTx(void) +{ + if (fifo_isempty(&tx_fifo)) + return; + + if (SPI0_SR & BV(SPI_TXBUFE)) + { + SPI0_PTCR = BV(PDC_TXTDIS); + SPI0_TPR = (reg32_t)tx_fifo.head; + if (tx_fifo.head < tx_fifo.tail) + SPI0_TCR = tx_fifo.tail - tx_fifo.head; + else + SPI0_TCR = tx_fifo.end - tx_fifo.head + 1; + + SPI0_PTCR = BV(PDC_TXTEN); + } +} + +static DECLARE_ISR(spi0_dma_write_irq_handler) +{ + SPI_DMA_STROBE_ON(); + /* Pop sent chars from FIFO */ + tx_fifo.head = (uint8_t *)SPI0_TPR; + if (tx_fifo.head > tx_fifo.end) + tx_fifo.head = tx_fifo.begin; + + spi_dma_startTx(); + + AIC_EOICR = 0; + SPI_DMA_STROBE_OFF(); +} + + +void spi_dma_setclock(uint32_t rate) +{ + SPI0_CSR0 &= ~SPI_SCBR; + + ASSERT((uint8_t)DIV_ROUND(CPU_FREQ, rate)); + SPI0_CSR0 |= DIV_ROUND(CPU_FREQ, rate) << SPI_SCBR_SHIFT; +} + +static size_t spi_dma_write(UNUSED_ARG(struct KFile *, fd), const void *_buf, size_t size) +{ + size_t count, total_wr = 0; + const uint8_t *buf = (const uint8_t *) _buf; + + // copy buffer to internal fifo + while (size) + { + #if CONFIG_SPI_DMA_TX_TIMEOUT != -1 + ticks_t start = timer_clock(); + while (fifo_isfull(&tx_fifo) && (timer_clock() - start < ms_to_ticks(CONFIG_SPI_DMA_TX_TIMEOUT))) + cpu_relax(); + + if (fifo_isfull(&tx_fifo)) + break; + #else + while (fifo_isfull(&tx_fifo)) + cpu_relax(); + #endif /* CONFIG_SPI_DMA_TX_TIMEOUT */ + + // FIXME: improve copy performance + count = kfile_write(&kfifo.fd, buf, size); + size -= count; + buf += count; + total_wr += count; + spi_dma_startTx(); + } + + return total_wr; +} + +static int spi_dma_flush(UNUSED_ARG(struct KFile *, fd)) +{ + /* Wait FIFO flush */ + while (!fifo_isempty(&tx_fifo)) + cpu_relax(); + + /* Wait until last bit has been shifted out */ + while (!(SPI0_SR & BV(SPI_TXEMPTY))) + cpu_relax(); + + return 0; +} + +static DECLARE_ISR(spi0_dma_read_irq_handler) +{ + /* do nothing */ + AIC_EOICR = 0; +} + +/* + * Dummy buffer used to transmit 0xff chars while receiving data. + * This buffer is completetly constant and the compiler should allocate it + * in flash memory. + */ +static const uint8_t tx_dummy_buf[CONFIG_SPI_DMA_MAX_RX] = { [0 ... (CONFIG_SPI_DMA_MAX_RX - 1)] = 0xFF }; + +static size_t spi_dma_read(struct KFile *fd, void *_buf, size_t size) +{ + size_t count, total_rx = 0; + uint8_t *buf = (uint8_t *)_buf; + + spi_dma_flush(fd); + + /* Dummy irq handler that do nothing */ + AIC_SVR(SPI0_ID) = spi0_dma_read_irq_handler; + + while (size) + { + count = MIN(size, (size_t)CONFIG_SPI_DMA_MAX_RX); + + SPI0_PTCR = BV(PDC_TXTDIS) | BV(PDC_RXTDIS); + + SPI0_RPR = (reg32_t)buf; + SPI0_RCR = count; + SPI0_TPR = (reg32_t)tx_dummy_buf; + SPI0_TCR = count; + + /* Avoid reading the previous sent char */ + *buf = SPI0_RDR; + + /* Start transfer */ + SPI0_PTCR = BV(PDC_RXTEN) | BV(PDC_TXTEN); + + /* wait for transfer to finish */ + while (!(SPI0_SR & BV(SPI_ENDRX))) + cpu_relax(); + + size -= count; + total_rx += count; + buf += count; + } + SPI0_PTCR = BV(PDC_RXTDIS) | BV(PDC_TXTDIS); + + /* set write irq handler back in place */ + AIC_SVR(SPI0_ID) = spi0_dma_write_irq_handler; + + return total_rx; +} + +#define SPI_DMA_IRQ_PRIORITY 4 + +void spi_dma_init(SpiDmaAt91 *spi) +{ + /* Disable PIO on SPI pins */ + PIOA_PDR = BV(SPI0_SPCK) | BV(SPI0_MOSI) | BV(SPI0_MISO); + + /* Reset device */ + SPI0_CR = BV(SPI_SWRST); + + /* + * Set SPI to master mode, fixed peripheral select, chip select directly connected to a peripheral device, + * SPI clock set to MCK, mode fault detection disabled, loopback disable, NPCS0 active, Delay between CS = 0 + */ + SPI0_MR = BV(SPI_MSTR) | BV(SPI_MODFDIS); + + /* + * Set SPI mode. + * At reset clock division factor is set to 0, that is + * *forbidden*. Set SPI clock to minimum to keep it valid. + */ + SPI0_CSR0 = BV(SPI_NCPHA) | (255 << SPI_SCBR_SHIFT); + + /* Disable all irqs */ + SPI0_IDR = 0xFFFFFFFF; + /* Set the vector. */ + AIC_SVR(SPI0_ID) = spi0_dma_write_irq_handler; + /* Initialize to edge triggered with defined priority. */ + AIC_SMR(SPI0_ID) = AIC_SRCTYPE_INT_EDGE_TRIGGERED | SPI_DMA_IRQ_PRIORITY; + /* Enable the USART IRQ */ + AIC_IECR = BV(SPI0_ID); + PMC_PCER = BV(SPI0_ID); + + /* Enable interrupt on tx buffer empty */ + SPI0_IER = BV(SPI_ENDTX); + + /* Enable SPI */ + SPI0_CR = BV(SPI_SPIEN); + + DB(spi->fd._type = KFT_SPIDMAAT91); + spi->fd.write = spi_dma_write; + spi->fd.read = spi_dma_read; + spi->fd.flush = spi_dma_flush; + + fifo_init(&tx_fifo, tx_fifo_buffer, sizeof(tx_fifo_buffer)); + kfilefifo_init(&kfifo, &tx_fifo); + + SPI_DMA_STROBE_INIT(); +} diff --git a/2.5/bertos/cpu/arm/drv/spi_dma_at91.h b/2.5/bertos/cpu/arm/drv/spi_dma_at91.h new file mode 100644 index 00000000..6ceef4aa --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/spi_dma_at91.h @@ -0,0 +1,73 @@ +/** + * \file + * + * + * \brief SPI driver with DMA. + * + * \note Only one copy of SpiDmaAt91 is allowed for each application. + * + * \version $Id$ + * \author Francesco Sacchi + * \author Luca Ottaviano + */ + +#ifndef DRV_SPI_DMA_AT91_H +#define DRV_SPI_DMA_AT91_H + +#include + +typedef struct SpiDmaAt91 +{ + KFile fd; +} SpiDmaAt91; + +#define KFT_SPIDMAAT91 MAKE_ID('S', 'P', 'I', 'A') + +INLINE SpiDmaAt91 * SPIDMAAT91_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_SPIDMAAT91); + return (SpiDmaAt91 *)fd; +} + +/** + * Init DMA SPI driver. + * \param spi A pointer to a SpiDmaAt91 structure. + */ +void spi_dma_init(SpiDmaAt91 *spi); + +/** + * Set the clock rate for SPI bus. + * + * \param rate The rate you want to set for SPI. + */ +void spi_dma_setclock(uint32_t rate); + +#endif /* DRV_SPI_DMA_AT91_H */ diff --git a/2.5/bertos/cpu/arm/drv/stepper_arm.c b/2.5/bertos/cpu/arm/drv/stepper_arm.c new file mode 100644 index 00000000..446ba1da --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/stepper_arm.c @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Low-level stepper timer module for ARM (inplementation). + * + * \version $Id$ + * + * \author Daniele Basile + * + * This module is automatically included so no need to include + * in test list. + * notest: arm + */ +#ifndef WIZ_AUTOGEN + #warning This file is deprecated, you should use stepper_at91.c + + #include + + #if CPU_ARM_AT91 + #include "stepper_at91.c" + /*#elif Add other ARM families here */ + #else + #error Unknown CPU + #endif +#endif /* WIZ_AUTOGEN */ + diff --git a/2.5/bertos/cpu/arm/drv/stepper_arm.h b/2.5/bertos/cpu/arm/drv/stepper_arm.h new file mode 100644 index 00000000..ab96e5d7 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/stepper_arm.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Low-level stepper timer module for ARM (inplementation). + * + * \version $Id$ + * + * \author Daniele Basile + * + */ + +#include + +#if CPU_ARM_AT91 + #include "stepper_at91.h" +/*#elif Add other ARM families here */ +#else + #error Unknown CPU +#endif diff --git a/2.5/bertos/cpu/arm/drv/stepper_at91.c b/2.5/bertos/cpu/arm/drv/stepper_at91.c new file mode 100644 index 00000000..2c2e193d --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/stepper_at91.c @@ -0,0 +1,418 @@ +/** + * \file + * + * + * \brief Stepper driver interface implementation. + * + * This module use the three timer on the at91 family, to generate a + * six periodic variable pwm waveform. The pulse width is fix, and could + * change by setting the STEPPER_DELAY_ON_COMPARE_C define, but you make + * an attention to do this, becouse the pulse width is not exactly + * STEPPER_DELAY_ON_COMPARE_C. The pulse width depend also to latency + * time of cpu to serve an interrupt, this generate an pwm waveform affect + * to noise. This noise not effect the period but only the pulse width, + * becouse the raising edge is generate by hardware comply with the our + * period settings. + * + * Note: is most important to set STEPPER_DELAY_ON_COMPARE_C value minor + * than a interrupt time service, becouse the falling edge must be happen + * inside to inerrupt service to guarantee a correct functionaly of pwm + * generator. + * + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#include "stepper_at91.h" + +#include "cfg/cfg_stepper.h" +#include +#include + +#include +#include + +#include + + +/* + * Delay to set C compare to clear output + * on select TIO output + */ +#define STEPPER_DELAY_ON_COMPARE_C 20 + +/* + * Forward declaration for interrupt handler + */ +static ISR_PROTO(stepper_tc0_irq); +static ISR_PROTO(stepper_tc1_irq); +static ISR_PROTO(stepper_tc2_irq); + +///< Static array of timer counter struct for stepper. +static struct TimerCounter stepper_timers[CONFIG_TC_STEPPER_MAX_NUM] = +{ + { //Timer Counter settings for TIOA0 output pin + .timer_id = TC0_ID, + .blk_ctrl_set = TC_NONEXC0, + .chl_mode_reg = &TC0_CMR, + .chl_ctrl_reg = &TC0_CCR, + .comp_effect_mask = TC_ACPA_MASK, + .comp_effect_set = TC_ACPA_SET_OUTPUT, + .comp_effect_clear = TC_ACPA_CLEAR_OUTPUT, + .comp_effect_c_mask = TC_ACPC_MASK, + .comp_effect_c_clear = TC_ACPC_CLEAR_OUTPUT, + .ext_event_set = TC_EEVT_XC0, + .comp_reg = &TC0_RA, + .comp_c_reg = &TC0_RC, + .count_val_reg = &TC0_CV, + .irq_enable_reg = &TC0_IER, + .irq_disable_reg = &TC0_IDR, + .irq_set_mask = BV(TC_CPAS), + .irq_mask_reg = &TC0_IMR, + .isr = stepper_tc0_irq, + .status_reg = &TC0_SR, + .tio_pin = TIOA0, + .callback = NULL, + .motor = NULL, + }, + { //Timer Counter settings for TIOB0 output pin + .timer_id = TC0_ID, + .blk_ctrl_set = TC_NONEXC0, + .chl_mode_reg = &TC0_CMR, + .chl_ctrl_reg = &TC0_CCR, + .comp_reg = &TC0_RB, + .comp_c_reg = &TC0_RC, + .count_val_reg = &TC0_CV, + .comp_effect_mask = TC_BCPB_MASK, + .comp_effect_set = TC_BCPB_SET_OUTPUT, + .comp_effect_clear = TC_BCPB_CLEAR_OUTPUT, + .comp_effect_c_mask = TC_BCPC_MASK, + .comp_effect_c_clear = TC_BCPC_CLEAR_OUTPUT, + .ext_event_set = TC_EEVT_XC0, + .irq_enable_reg = &TC0_IER, + .irq_disable_reg = &TC0_IDR, + .irq_set_mask = BV(TC_CPBS), + .irq_mask_reg = &TC0_IMR, + .isr = stepper_tc0_irq, + .status_reg = &TC0_SR, + .tio_pin = TIOB0, + .callback = NULL, + .motor = NULL, + }, + { //Timer Counter settings for TIOA1 output pin + .timer_id = TC1_ID, + .blk_ctrl_set = TC_NONEXC1, + .chl_mode_reg = &TC1_CMR, + .chl_ctrl_reg = &TC1_CCR, + .comp_reg = &TC1_RA, + .comp_c_reg = &TC1_RC, + .count_val_reg = &TC1_CV, + .comp_effect_mask = TC_ACPA_MASK, + .comp_effect_set = TC_ACPA_SET_OUTPUT, + .comp_effect_clear = TC_ACPA_CLEAR_OUTPUT, + .comp_effect_c_mask = TC_ACPC_MASK, + .comp_effect_c_clear = TC_ACPC_CLEAR_OUTPUT, + .ext_event_set = TC_EEVT_XC1, + .irq_enable_reg = &TC1_IER, + .irq_disable_reg = &TC1_IDR, + .irq_set_mask = BV(TC_CPAS), + .irq_mask_reg = &TC1_IMR, + .isr = stepper_tc1_irq, + .status_reg = &TC1_SR, + .tio_pin = TIOA1, + .callback = NULL, + .motor = NULL, + }, + { //Timer Counter settings for TIOB1 output pin + .timer_id = TC1_ID, + .blk_ctrl_set = TC_NONEXC1, + .chl_mode_reg = &TC1_CMR, + .chl_ctrl_reg = &TC1_CCR, + .comp_reg = &TC1_RB, + .comp_c_reg = &TC1_RC, + .count_val_reg = &TC1_CV, + .comp_effect_mask = TC_BCPB_MASK, + .comp_effect_set = TC_BCPB_SET_OUTPUT, + .comp_effect_clear = TC_BCPB_CLEAR_OUTPUT, + .comp_effect_c_mask = TC_BCPC_MASK, + .comp_effect_c_clear = TC_BCPC_CLEAR_OUTPUT, + .ext_event_set = TC_EEVT_XC1, + .irq_enable_reg = &TC1_IER, + .irq_disable_reg = &TC1_IDR, + .irq_set_mask = BV(TC_CPBS), + .irq_mask_reg = &TC1_IMR, + .isr = stepper_tc1_irq, + .status_reg = &TC1_SR, + .tio_pin = TIOB1, + .callback = NULL, + .motor = NULL, + }, + { //Timer Counter settings for TIOA2 output pin + .timer_id = TC2_ID, + .blk_ctrl_set = TC_NONEXC2, + .chl_mode_reg = &TC2_CMR, + .chl_ctrl_reg = &TC2_CCR, + .comp_reg = &TC2_RA, + .comp_c_reg = &TC2_RC, + .count_val_reg = &TC2_CV, + .comp_effect_mask = TC_ACPA_MASK, + .comp_effect_set = TC_ACPA_SET_OUTPUT, + .comp_effect_clear = TC_ACPA_CLEAR_OUTPUT, + .comp_effect_c_mask = TC_ACPC_MASK, + .comp_effect_c_clear = TC_ACPC_CLEAR_OUTPUT, + .ext_event_set = TC_EEVT_XC2, + .irq_enable_reg = &TC2_IER, + .irq_disable_reg = &TC2_IDR, + .irq_set_mask = BV(TC_CPAS), + .irq_mask_reg = &TC2_IMR, + .isr = stepper_tc2_irq, + .status_reg = &TC2_SR, + .tio_pin = TIOA2, + .callback = NULL, + .motor = NULL, + }, + { //Timer Counter settings for TIOB2 output pin + .timer_id = TC2_ID, + .blk_ctrl_set = TC_NONEXC2, + .chl_mode_reg = &TC2_CMR, + .chl_ctrl_reg = &TC2_CCR, + .comp_reg = &TC2_RB, + .comp_c_reg = &TC2_RC, + .count_val_reg = &TC2_CV, + .comp_effect_mask = TC_BCPB_MASK, + .comp_effect_set = TC_BCPB_SET_OUTPUT, + .comp_effect_clear = TC_BCPB_CLEAR_OUTPUT, + .comp_effect_c_mask = TC_BCPC_MASK, + .comp_effect_c_clear = TC_BCPC_CLEAR_OUTPUT, + .ext_event_set = TC_EEVT_XC2, + .irq_enable_reg = &TC2_IER, + .irq_disable_reg = &TC2_IDR, + .irq_set_mask = BV(TC_CPBS), + .irq_mask_reg = &TC2_IMR, + .isr = stepper_tc2_irq, + .status_reg = &TC2_SR, + .tio_pin = TIOB2, + .callback = NULL, + .motor = NULL, + } +}; + +/** + * Generic TIO interrupt handler. + */ +INLINE void stepper_tc_tio_irq(struct TimerCounter * t) +{ + // + *t->chl_mode_reg &= ~t->comp_effect_c_mask; + *t->chl_mode_reg |= t->comp_effect_c_clear; + + /* + * Cleat TIO output on c register compare. + * This generate an pulse with variable lenght, this + * depend to delay that interrupt is realy service. + */ + *t->comp_c_reg = *t->count_val_reg + STEPPER_DELAY_ON_COMPARE_C; + + //Call the associate callback + t->callback(t->motor); + + *t->chl_mode_reg &= ~t->comp_effect_c_mask; +} + + +/* + * Interrupt handler for timer counter TCKL0 + */ +DECLARE_ISR(stepper_tc0_irq) +{ + /* + * Warning: when we read the status_reg register, we reset it. + * That mean if is occur an interrupt event we can read only + * the last that has been occur. To not miss an interrupt event + * we save the status_reg register and then we read it. + */ + uint32_t status_reg = TC0_SR & TC0_IMR; + + if (status_reg & BV(TC_CPAS)) + stepper_tc_tio_irq(&stepper_timers[TC_TIOA0]); + + if (status_reg & BV(TC_CPBS)) + stepper_tc_tio_irq(&stepper_timers[TC_TIOB0]); + + /* Inform hw that we have served the IRQ */ + AIC_EOICR = 0; + +} + +/* + * Interrupt handler for timer counter TCKL1 + */ +DECLARE_ISR(stepper_tc1_irq) +{ + /* + * Warning: when we read the status_reg register, we reset it. + * That mean if is occur an interrupt event we can read only + * the last that has been occur. To not miss an interrupt event + * we save the status_reg register and then we read it. + */ + uint32_t status_reg = TC1_SR & TC1_IMR; + + if (status_reg & BV(TC_CPAS)) + stepper_tc_tio_irq(&stepper_timers[TC_TIOA1]); + + if (status_reg & BV(TC_CPBS)) + stepper_tc_tio_irq(&stepper_timers[TC_TIOB1]); + + + /* Inform hw that we have served the IRQ */ + AIC_EOICR = 0; +} + + +/* + * Interrupt handler for timer counter TCKL2 + */ +DECLARE_ISR(stepper_tc2_irq) +{ + + /* + * Warning: when we read the status_reg register, we reset it. + * That mean if is occur an interrupt event we can read only + * the last that has been occur. To not miss an interrupt event + * we save the status_reg register and then we read it. + */ + uint32_t status_reg = TC2_SR & TC2_IMR; + + if (status_reg & BV(TC_CPAS)) + stepper_tc_tio_irq(&stepper_timers[TC_TIOA2]); + + if (status_reg & BV(TC_CPBS)) + stepper_tc_tio_irq(&stepper_timers[TC_TIOB2]); + + /* Inform hw that we have served the IRQ */ + AIC_EOICR = 0; + +} + +/** + * Timer couter setup. + * + * This function apply to select timer couter all needed settings. + * Every settings are stored in stepper_timers[]. + */ +void stepper_tc_setup(int index, stepper_isr_t callback, struct Stepper *motor) +{ + ASSERT(index < CONFIG_TC_STEPPER_MAX_NUM); + + motor->timer = &stepper_timers[index]; + + //Disable PIO controller and enable TIO function + TIO_PIO_PDR = BV(motor->timer->tio_pin); + TIO_PIO_ABSR = BV(motor->timer->tio_pin); + + /* + * Sets timer counter in waveform mode. + * We set as default: + * - Waveform mode 00 (see datasheet for more detail.) + * - Master clock prescaler to STEPPER_MCK_PRESCALER + * - Set none external event + * - Clear pin output on comp_reg + * - None effect on reg C compare + */ + *motor->timer->chl_mode_reg = BV(TC_WAVE); + *motor->timer->chl_mode_reg |= motor->timer->ext_event_set; + *motor->timer->chl_mode_reg &= ~TC_WAVSEL_MASK; + *motor->timer->chl_mode_reg |= TC_WAVSEL_UP; + *motor->timer->chl_mode_reg |= STEPPER_MCK_PRESCALER; + *motor->timer->chl_mode_reg |= motor->timer->comp_effect_clear; + *motor->timer->chl_mode_reg &= ~motor->timer->comp_effect_c_mask; + + //Reset comp_reg and C compare register + *motor->timer->comp_reg = 0; + *motor->timer->comp_c_reg = 0; + + //Register interrupt vector + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Warning: To guarantee a correct management of interrupt event, we must + * trig the interrupt on level sensitive. This becouse, we have only a common + * line for interrupt request, and if we have at the same time two interrupt + * request could be that the is service normaly but the second will never + * been detected and interrupt will stay active but never serviced. + */ + AIC_SVR(motor->timer->timer_id) = motor->timer->isr; + AIC_SMR(motor->timer->timer_id) = AIC_SRCTYPE_INT_LEVEL_SENSITIVE; + AIC_IECR = BV(motor->timer->timer_id); + + // Disable interrupt on select timer counter + stepper_tc_irq_disable(motor->timer); + + IRQ_RESTORE(flags); + + //Register callback + motor->timer->callback = callback; + motor->timer->motor = motor; +} + +/** + * Timer counter init. + */ +void stepper_tc_init(void) +{ + STEPPER_STROBE_INIT; + + ASSERT(CONFIG_NUM_STEPPER_MOTORS <= CONFIG_TC_STEPPER_MAX_NUM); + + /* + * Enable timer counter: + * - power on all timer counter + * - disable all interrupt + * - disable all external event/timer source + */ + for (int i = 0; i < CONFIG_TC_STEPPER_MAX_NUM; i++) + { + PMC_PCER = BV(stepper_timers[i].timer_id); + *stepper_timers[i].irq_disable_reg = 0xFFFFFFFF; + TC_BMR = stepper_timers[i].blk_ctrl_set; + } + + /* + * Enable timer counter and start it. + */ + for (int i = 0; i < CONFIG_TC_STEPPER_MAX_NUM; i++) + *stepper_timers[i].chl_ctrl_reg = (BV(TC_CLKEN) | BV(TC_SWTRG)); + +} + diff --git a/2.5/bertos/cpu/arm/drv/stepper_at91.h b/2.5/bertos/cpu/arm/drv/stepper_at91.h new file mode 100644 index 00000000..7f1d4d41 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/stepper_at91.h @@ -0,0 +1,186 @@ +/** + * \file + * + * + * \brief Stepper hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + + +#include +#include +#include +#include + +/** + * Setting master clock prescaler for all timer couter + * + * You could choise one of these: + * - TC_CLKS_MCK2: Selects MCK / 2 + * - TC_CLKS_MCK8: Selects MCK / 8 + * - TC_CLKS_MCK32: Selects MCK / 32 + * - TC_CLKS_MCK128: Selects MCK / 128 + * - TC_CLKS_MCK1024: Selects MCK / 1024 + */ +#if STEPPER_PRESCALER_LOG2 == 1 + #define STEPPER_MCK_PRESCALER TC_CLKS_MCK2 +#elif STEPPER_PRESCALER_LOG2 == 3 + #define STEPPER_MCK_PRESCALER TC_CLKS_MCK8 +#elif STEPPER_PRESCALER_LOG2 == 5 + #define STEPPER_MCK_PRESCALER TC_CLKS_MCK32 +#elif STEPPER_PRESCALER_LOG2 == 7 + #define STEPPER_MCK_PRESCALER TC_CLKS_MCK128 +#elif STEPPER_PRESCALER_LOG2 == 10 + #define STEPPER_MCK_PRESCALER TC_CLKS_MCK1024 +#else + #error Unsupported stepper prescaler value. +#endif + +/** + * Timer counter hw enumeration. + */ +enum +{ + TC_TIOA0 = 0, + TC_TIOB0, + TC_TIOA1, + TC_TIOB1, + TC_TIOA2, + TC_TIOB2, + + TC_CNT +}; + +/** + * IRQ callback function type definition. + */ +typedef void (*irq_t)(void); + +/** + * Timer contex structure. + */ +typedef struct TimerCounter +{ + int timer_id; ///< Timer counter ID + uint32_t blk_ctrl_set; ///< Control block setting for this timer + reg32_t *chl_mode_reg; ///< Channel mode register + reg32_t *chl_ctrl_reg; ///< Channel control register + reg32_t *comp_reg; ///< Compare register + reg32_t *comp_c_reg; ///< C compare register + reg32_t *count_val_reg; ///< Current timer counter value + uint32_t comp_effect_mask; ///< Bit mask for TIO register compare effects + uint32_t comp_effect_set; ///< Set TIO on register compare event + uint32_t comp_effect_clear; ///< Clear TIO on register compare event + uint32_t comp_effect_c_mask; ///< Bit mask for TIO on C register compare effects + uint32_t comp_effect_c_clear; ///< Clear TIO on C register compare event + uint32_t ext_event_set; ///< Setting for extern event trigger for TIOB + reg32_t *irq_enable_reg; ///< Enable interrupt register + reg32_t *irq_disable_reg; ///< Disable interrupt register + uint32_t irq_set_mask; ///< IRQ flag bit for select TIO + reg32_t *irq_mask_reg; ///< IRQ mask register + irq_t isr; ///< IRQ handler + reg32_t *status_reg; ///< Timer status register + int tio_pin; ///< Timer I/O pin + stepper_isr_t callback; ///< Interrupt callback pointer + struct Stepper *motor; ///< Stepper context structure + +} TimerCounter; + +/** + * Enable interrupt for timer counter compare event. + */ +INLINE void stepper_tc_irq_enable(struct TimerCounter *timer) +{ + *timer->irq_enable_reg = timer->irq_set_mask; +} + +/** + * Disable interrupt for timer counter compare event. + */ +INLINE void stepper_tc_irq_disable(struct TimerCounter *timer) +{ + *timer->irq_disable_reg = timer->irq_set_mask; +} + +/** + * Set delay for next interrupt compare event. + */ +INLINE void stepper_tc_setDelay(struct TimerCounter *timer, stepper_time_t delay) +{ + *timer->comp_reg += delay; +} + + +/** + * Set delay for next interrupt compare event. + */ +INLINE void stepper_tc_resetTimer(struct TimerCounter *timer) +{ + *timer->comp_reg = 0; +} + +/** + * Programm timer counter to generate a pulse on select TIO output. + */ +INLINE void FAST_FUNC stepper_tc_doPulse(struct TimerCounter *timer) +{ + *timer->chl_mode_reg &= ~timer->comp_effect_mask; + *timer->chl_mode_reg |= timer->comp_effect_set; +} + +/** + * Programm timer counter to not generate a pulse on select TIO output. + */ +INLINE void FAST_FUNC stepper_tc_skipPulse(struct TimerCounter *timer) +{ + *timer->chl_mode_reg &= ~timer->comp_effect_mask; +} + +void stepper_tc_setup(int index, stepper_isr_t callback, struct Stepper *motor); +void stepper_tc_init(void); + +/* + * Test the hardware timer counter on board. + * This test generate a square waveform through irq, setting + * the timer register. + */ +void stepper_timer_test_brute(void); +/* + * Test the timer driver structure. + * This test generate a square waveform through irq. + * The irq callback is programmable, and all timer setting + * are save in one data structure. Every pulse is generate through + * a call of this irq callback. + */ +void stepper_timer_test_prestepper(struct Stepper *local_motor, struct StepperConfig *local_cfg, int index); diff --git a/2.5/bertos/cpu/arm/drv/stepper_at91_hwtest.c b/2.5/bertos/cpu/arm/drv/stepper_at91_hwtest.c new file mode 100644 index 00000000..d40da084 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/stepper_at91_hwtest.c @@ -0,0 +1,175 @@ +/** + * \file + * + * + * \brief Low level test for stepper driver interface implementation. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#include "stepper_at91.h" + +#include "cfg/cfg_stepper.h" +#include +#include + +#include +#include + +#include + + +#warning FIXME:This test is incomplete.. you MUST review.. + +#if 0 +static void stepper_test_irq_schedule(struct Stepper *motor, stepper_time_t delay) +{ + stepper_tc_doPulse(motor->timer); + stepper_tc_setDelay(motor->timer, delay); +} + +static void stepper_test_irq(struct Stepper *motor) +{ + + stepper_test_irq_schedule(motor, 300); +} +/* + * Test a timer couter driver + */ +void stepper_timer_test_prestepper(struct Stepper *local_motor, struct StepperConfig *local_cfg, int index) +{ + local_cfg->pulse = 300; + + local_motor->cfg = local_cfg; + stepper_tc_init(index, &stepper_test_irq, local_motor); + stepper_tc_irq_enable(local_motor->timer); +} + + +bool su = true; +bool sub = true; +uint16_t periodo_st0 = 100; +uint16_t periodo_st1 = 233; + +static void tc_irq(void) __attribute__ ((interrupt)); +static void tc_irq(void) +{ + uint32_t status_reg = TC2_SR & TC2_IMR; + + if (status_reg & BV(TC_CPAS)) + { + TC2_CMR &= ~TC_ACPA_MASK; + if (su) + { + TC2_CMR |= TC_ACPA_CLEAR_OUTPUT; + TC2_RA += periodo_st0; + } + else + { + TC2_CMR |= TC_ACPA_SET_OUTPUT; + TC2_RA += periodo_st1; + } + su = !su; + } + if (status_reg & BV(TC_CPBS)) + { + TC2_CMR &= ~TC_BCPB_MASK ; + if (sub) + { + TC2_CMR |= TC_BCPB_CLEAR_OUTPUT; + TC2_RB += periodo_st0; + } + else + { + TC2_CMR |= TC_BCPB_SET_OUTPUT; + TC2_RB += periodo_st1; + } + sub = !sub; + } + /* Inform hw that we have served the IRQ */ + AIC_EOICR = 0; +} + +/* + * Test a timer couter hardware + */ +void stepper_timer_test_brute(void) +{ + PIOA_PDR |= BV(26) | BV(27); + PIOA_BSR |= BV(26) | BV(27); + + // Power on TCLK0 + PMC_PCER |= BV(TC2_ID);// | BV(TC1_ID) | BV(TC2_ID); + + TC_BCR = 1; + TC_BMR |= TC_NONEXC2; + + // Select waveform mode + TC2_CMR = BV(TC_WAVE); + + TC2_CMR |= TC_EEVT_XC2; + TC2_CMR |= TC_WAVSEL_UP; + TC2_CMR |= TC_CLKS_MCK8; + + //Set waveform on TIOA and TIOB + TC2_CMR |= TC_ACPA_SET_OUTPUT; + TC2_CMR |= TC_BCPB_SET_OUTPUT; + + + //Reset all comp_reg register + TC2_RA = 0; + TC2_RB = 0; + + cpuflags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* Set the vector. */ + AIC_SVR(TC2_ID) = tc_irq; + /* Initialize to edge triggered with defined priority. */ + AIC_SMR(TC2_ID) = AIC_SRCTYPE_INT_EDGE_TRIGGERED; + /* Enable the USART IRQ */ + AIC_IECR = BV(TC2_ID); + + IRQ_RESTORE(flags); + + // Disable all interrupt + TC2_IDR = 0xFFFFFFFF; + + //Enable interrupt on RA, RB + TC2_IER = BV(TC_CPAS) | BV(TC_CPBS); + + //Enable timer and trig it + TC2_CCR = BV(TC_CLKEN) | BV(TC_SWTRG); +} +#endif + diff --git a/2.5/bertos/cpu/arm/drv/sysirq_at91.c b/2.5/bertos/cpu/arm/drv/sysirq_at91.c new file mode 100644 index 00000000..6de17602 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/sysirq_at91.c @@ -0,0 +1,177 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * \brief System IRQ handler for Atmel AT91 ARM7 processors. + * + * In Atmel AT91 ARM7TDMI processors, there are various + * peripheral interrupt sources. + * In general, every source has its own interrupt vector, so it + * is possible to assign a specific handler for each interrupt + * independently. + * However, there are a few sources called "system sources" that + * share a common IRQ line and vector, called "system IRQ". + * So a unique system IRQ dispatcher is implemented here. + * This module also contains an interface to manage every source + * independently. It is possible to assign to every system IRQ + * a specific IRQ handler. + * + * \see sysirq_setHandler + * \see sysirq_setEnable + */ + +#include "sysirq_at91.h" +#include +#include +#include +#include +#include + +/** + * Enable/disable the Periodic Interrupt Timer + * interrupt. + */ +INLINE void pit_setEnable(bool enable) +{ + if (enable) + PIT_MR |= BV(PITIEN); + else + PIT_MR &= ~BV(PITIEN); +} + +/** + * Table containing all system irqs. + */ +static SysIrq sysirq_tab[] = +{ + /* PIT, Periodic Interval Timer (System timer)*/ + { + .enabled = false, + .setEnable = pit_setEnable, + .handler = NULL, + }, + /* TODO: add other system sources here */ +}; + +STATIC_ASSERT(countof(sysirq_tab) == SYSIRQ_CNT); + +/** + * System IRQ dispatcher. + * This is the entry point for all system IRQs in AT91. + * This function checks for interrupt enable state of + * various sources (system timer, etc..) and calls + * the corresponding handler. + * + * \note On AT91SAM7, all system IRQs (timer included) are handled + * by the sysirq_dispatcher, so we can't differentiate between + * context-switch and non-context-switch ISR inside this + * class of IRQs. + */ +static DECLARE_ISR_CONTEXT_SWITCH(sysirq_dispatcher) +{ + unsigned int i; + + for (i = 0; i < countof(sysirq_tab); i++) + { + if (sysirq_tab[i].enabled + && sysirq_tab[i].handler) + sysirq_tab[i].handler(); + } + + /* Inform hw that we have served the IRQ */ + AIC_EOICR = 0; +} + +#define SYSIRQ_PRIORITY 0 ///< default priority for system irqs. + + +MOD_DEFINE(sysirq); + +/** + * Init system IRQ handling. + * \note all system interrupts are disabled. + */ +void sysirq_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* Disable all system interrupts */ + for (unsigned i = 0; i < countof(sysirq_tab); i++) + sysirq_tab[i].setEnable(false); + + /* Set the vector. */ + AIC_SVR(SYSC_ID) = sysirq_dispatcher; + /* Initialize to edge triggered with defined priority. */ + AIC_SMR(SYSC_ID) = AIC_SRCTYPE_INT_EDGE_TRIGGERED | SYSIRQ_PRIORITY; + /* Clear pending interrupt */ + AIC_ICCR = BV(SYSC_ID); + /* Enable the system IRQ */ + AIC_IECR = BV(SYSC_ID); + + IRQ_RESTORE(flags); + MOD_INIT(sysirq); +} + + +/** + * Helper function used to set handler for system IRQ \a irq. + */ +void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler) +{ + ASSERT(irq < SYSIRQ_CNT); + sysirq_tab[irq].handler = handler; +} + +/** + * Helper function used to enable/disable system IRQ \a irq. + */ +void sysirq_setEnable(sysirq_t irq, bool enable) +{ + ASSERT(irq < SYSIRQ_CNT); + + sysirq_tab[irq].setEnable(enable); + sysirq_tab[irq].enabled = enable; +} + +/** + * Helper function used to get system IRQ \a irq state. + */ +bool sysirq_enabled(sysirq_t irq) +{ + ASSERT(irq < SYSIRQ_CNT); + + return sysirq_tab[irq].enabled; +} diff --git a/2.5/bertos/cpu/arm/drv/sysirq_at91.h b/2.5/bertos/cpu/arm/drv/sysirq_at91.h new file mode 100644 index 00000000..ad094fca --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/sysirq_at91.h @@ -0,0 +1,73 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * \brief System irq handler for Atmel AT91 ARM7 processors (interface). + */ + +#ifndef DRV_AT91_SYSIRQ_H +#define DRV_AT91_SYSIRQ_H + +#include + +typedef void (* sysirq_handler_t)(void); ///< Type for system irq handler. +typedef void (* sysirq_setEnable_t)(bool); ///< Type for system irq enable/disable function. + +/** + * Structure used to define a system interrupt source. + */ +typedef struct SysIrq +{ + bool enabled; ///< Getter for irq enable/disable state. + sysirq_setEnable_t setEnable; ///< Setter for irq enable/disable state. + sysirq_handler_t handler; ///< IRQ handler. +} SysIrq; + +/** + * System IRQ ID list. + */ +typedef enum sysirq_t +{ + SYSIRQ_PIT, ///< Periodic Interval Timer + /* TODO: add all system irqs */ + SYSIRQ_CNT +} sysirq_t; + +void sysirq_init(void); +void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler); +void sysirq_setEnable(sysirq_t irq, bool enable); +bool sysirq_enabled(sysirq_t irq); + +#endif /* ARCH_ARM_SYSIRQ_H */ diff --git a/2.5/bertos/cpu/arm/drv/timer_arm.c b/2.5/bertos/cpu/arm/drv/timer_arm.c new file mode 100644 index 00000000..adeee6f6 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/timer_arm.c @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * \brief Low-level timer module for ARM (inplementation). + * + * This module is automatically included so no need to include + * in test list. + * notest: arm + */ + +#ifndef WIZ_AUTOGEN + #warning This file is deprecated, you should use timer_at91.c + + #include + #include + + #if CPU_ARM_AT91 + #include "timer_at91.c" + /*#elif Add other ARM families here */ + #else + #error Unknown CPU + #endif + +#endif /* WIZ_AUTOGEN */ diff --git a/2.5/bertos/cpu/arm/drv/timer_arm.h b/2.5/bertos/cpu/arm/drv/timer_arm.h new file mode 100644 index 00000000..2b4f2510 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/timer_arm.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * \brief Low-level timer module for ARM (interface). + */ + +#include + +#if CPU_ARM_AT91 + #include "timer_at91.h" +#elif CPU_ARM_LPC2 + #include "timer_lpc2.h" +/*#elif Add other ARM families here */ +#else + #error Unknown CPU +#endif diff --git a/2.5/bertos/cpu/arm/drv/timer_at91.c b/2.5/bertos/cpu/arm/drv/timer_at91.c new file mode 100644 index 00000000..beab00d6 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/timer_at91.c @@ -0,0 +1,80 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief Low-level timer module for Atmel AT91 (inplementation). + */ + +#include "timer_at91.h" +#include +#include "sysirq_at91.h" + +#include // BV() +#include +#include +#include + + +/** HW dependent timer initialization */ +#if (CONFIG_TIMER == TIMER_ON_PIT) + + ISR_PROTO_CONTEXT_SWITCH(timer_handler); + + void timer_hw_init(void) + { + sysirq_init(); + + cpu_flags_t flags; + + MOD_CHECK(sysirq); + + IRQ_SAVE_DISABLE(flags); + + PIT_MR = TIMER_HW_CNT; + /* Register system interrupt handler. */ + sysirq_setHandler(SYSIRQ_PIT, timer_handler); + + /* Enable interval timer and interval timer interrupts */ + PIT_MR |= BV(PITEN); + sysirq_setEnable(SYSIRQ_PIT, true); + + /* Reset counters, this is needed to start timer and interrupt flags */ + uint32_t dummy = PIVR; + (void) dummy; + + IRQ_RESTORE(flags); + } + +#else + #error Unimplemented value for CONFIG_TIMER +#endif /* CONFIG_TIMER */ diff --git a/2.5/bertos/cpu/arm/drv/timer_at91.h b/2.5/bertos/cpu/arm/drv/timer_at91.h new file mode 100644 index 00000000..0628d394 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/timer_at91.h @@ -0,0 +1,108 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief Low-level timer module for Atmel AT91 (interface). + */ + +#ifndef DRV_AT91_TIMER_H +#define DRV_AT91_TIMER_H + +#include /* CPU_FREQ */ + +#include "cfg/cfg_timer.h" /* CONFIG_TIMER */ +#include /* uint8_t */ +#include /* BV */ + +#include + +/** + * \name Values for CONFIG_TIMER. + * + * Select which hardware timer interrupt to use for system clock and softtimers. + * + * $WIZ$ timer_select = "TIMER_ON_PIT", "TIMER_DEFAULT" + */ +#define TIMER_ON_PIT 1 ///< System timer on Periodic interval timer + +#define TIMER_DEFAULT TIMER_ON_PIT ///< Default system timer + +/* + * Hardware dependent timer initialization. + */ +#if (CONFIG_TIMER == TIMER_ON_PIT) + + /* + * On ARM all system IRQs are handled by the sysirq_dispatcher, so the actual + * timer handler can be treated like any other normal routine. + */ + #define DEFINE_TIMER_ISR void timer_handler(void); \ + void timer_handler(void) + + #define TIMER_TICKS_PER_SEC 1000 + #define TIMER_HW_CNT (CPU_FREQ / (16 * TIMER_TICKS_PER_SEC) - 1) + + /** Frequency of the hardware high-precision timer. */ + #define TIMER_HW_HPTICKS_PER_SEC (CPU_FREQ / 16) + + /** Type of time expressed in ticks of the hardware high-precision timer */ + typedef uint32_t hptime_t; + #define SIZEOF_HPTIME_T 4 + + INLINE void timer_hw_irq(void) + { + /* Reset counters, this is needed to reset timer and interrupt flags */ + uint32_t dummy = PIVR; + (void) dummy; + } + + INLINE bool timer_hw_triggered(void) + { + return PIT_SR & BV(PITS); + } + + INLINE hptime_t timer_hw_hpread(void) + { + /* In the upper part of PIT_PIIR there is unused data */ + return PIIR & CPIV_MASK; + } + +#else + + #error Unimplemented value for CONFIG_TIMER +#endif /* CONFIG_TIMER */ + +void timer_hw_init(void); + + +#endif /* DRV_TIMER_AT91_H */ diff --git a/2.5/bertos/cpu/arm/drv/timer_lpc2.c b/2.5/bertos/cpu/arm/drv/timer_lpc2.c new file mode 100644 index 00000000..cd4ac56a --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/timer_lpc2.c @@ -0,0 +1,81 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief Low-level timer module for LPC2xxx (implementation). + * + * notest:arm + */ +#include "cfg/cfg_timer.h" +#include // BV() +#include // BV() + +#include +#include +#include "timer_lpc2.h" + +/** HW dependent timer initialization */ +#if (CONFIG_TIMER == TIMER0_COMPARE0) + #define TIMER0_ID 4 + void timer_hw_init(void) + { + /* Power on timer0 */ + PCONP |= BV(1); + + /* Set TIMER0 clk to CPU_FREQ */ + PCLKSEL0 &= ~0x0C; + PCLKSEL0 |= 0x04; + + /* reset prescaler counter */ + T0PR = 0; + + /* Set match register 0 */ + T0MR0 = TIMER_HW_CNT; + /* IRQ and reset counter on compare match 0 */ + T0MCR &= ~0x03; + T0MCR |= 0x03; + /* Reset timer0 counter and prescaler */ + T0TCR = 0x02; + + vic_setVector(TIMER0_ID, timer_handler); + vic_enable(TIMER0_ID); + + /* Start timer0 */ + T0TCR = 0x01; + } + + +#else + #error Unimplemented value for CONFIG_TIMER +#endif /* CONFIG_TIMER */ + diff --git a/2.5/bertos/cpu/arm/drv/timer_lpc2.h b/2.5/bertos/cpu/arm/drv/timer_lpc2.h new file mode 100644 index 00000000..7a796406 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/timer_lpc2.h @@ -0,0 +1,103 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief Low-level timer module for NXP LPC2xxx (interface). + */ + +#ifndef DRV_LPC2_TIMER_H +#define DRV_LPC2_TIMER_H + +#include /* CPU_FREQ */ + +#include "cfg/cfg_timer.h" /* CONFIG_TIMER */ +#include /* uint8_t */ +#include /* BV */ + +#include + +/** + * \name Values for CONFIG_TIMER. + * + * Select which hardware timer interrupt to use for system clock and softtimers. + * + * $WIZ$ timer_select = "TIMER0_COMPARE0", "TIMER_DEFAULT" + */ +#define TIMER0_COMPARE0 0 ///< System timer on Timer0 Compare match0 + +#define TIMER_DEFAULT TIMER0_COMPARE0 ///< Default system timer + +/* + * Hardware dependent timer initialization. + */ +#if (CONFIG_TIMER == TIMER0_COMPARE0) + ISR_PROTO_CONTEXT_SWITCH(timer_handler); + #define DEFINE_TIMER_ISR DECLARE_ISR_CONTEXT_SWITCH(timer_handler) + + #define TIMER_TICKS_PER_SEC 1000 + #define TIMER_HW_CNT (CPU_FREQ / TIMER_TICKS_PER_SEC - 1) + + /** Frequency of the hardware high-precision timer. */ + #define TIMER_HW_HPTICKS_PER_SEC (CPU_FREQ) + + /** Type of time expressed in ticks of the hardware high-precision timer */ + typedef uint32_t hptime_t; + #define SIZEOF_HPTIME_T 4 + + INLINE void timer_hw_irq(void) + { + /* Reset The match0 irq flag */ + T0IR = 0x01; + /* Signal the VIC we have completed the ISR */ + VICVectAddr = 0; + } + + INLINE bool timer_hw_triggered(void) + { + return true; + } + + INLINE hptime_t timer_hw_hpread(void) + { + return T0TC; + } + +#else + + #error Unimplemented value for CONFIG_TIMER +#endif /* CONFIG_TIMER */ + +void timer_hw_init(void); + + +#endif /* DRV_LPC2_TIMER_H */ diff --git a/2.5/bertos/cpu/arm/drv/twi_arm.c b/2.5/bertos/cpu/arm/drv/twi_arm.c new file mode 100644 index 00000000..8395f392 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/twi_arm.c @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Low-level TWI module for ARM (inplementation). + * + * \version $Id$ + * + * \author Daniele Basile + * + * This module is automatically included so no need to include + * in test list. + * notest: arm + * + */ + +#ifndef WIZ_AUTOGEN + #warning This file is deprecated, you should use twi_at91.c + + #include + + #if CPU_ARM_AT91 + #include "twi_at91.c" + /*#elif Add other ARM families here */ + #else + #error Unknown CPU + #endif +#endif /* WIZ_AUTOGEN */ diff --git a/2.5/bertos/cpu/arm/drv/twi_arm.h b/2.5/bertos/cpu/arm/drv/twi_arm.h new file mode 100644 index 00000000..4242956c --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/twi_arm.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Low-level TWI module for ARM (interface). + * + * \version $Id$ + * + * \author Daniele Basile + * + */ + +#include + +#if CPU_ARM_AT91 + #include "twi_at91.h" +/*#elif Add other ARM families here */ +#else + #error Unknown CPU +#endif diff --git a/2.5/bertos/cpu/arm/drv/twi_at91.c b/2.5/bertos/cpu/arm/drv/twi_at91.c new file mode 100644 index 00000000..cb2097ea --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/twi_at91.c @@ -0,0 +1,268 @@ +/** + * \file + * + * + * \brief Driver for the AT91 ARM TWI (implementation) + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#include "twi_at91.h" + +#include "cfg/cfg_i2c.h" +#include +#include +#include +#include + +#include + +#include + +/** + * Timeout for ACK slave waiting. + */ +#define TWI_TIMEOUT ms_to_ticks(50) + +/** + * Send \a size bytes over the twi line to slave \a id. + * If the device requires internal addressing before writing, \a byte1 \a byte2 and \a byte3 can + * be specified. Internal addressign bytes not used *must* be set to TWI_NO_IADDR. If 1 or 2 bytes + * are required for internal addressing you *must* first use \a byte1 and than \a byte2. + * \note Atmel TWI implementation is broken so it was not possible to supply a better + * interface. Additionally NACK handling is also broken, so if the i2c device reply nack + * this function will return after TWI_TIMEOUT. + * \return true if ok, false on slave timeout. + */ +bool twi_write(uint8_t id, twi_iaddr_t byte1, twi_iaddr_t byte2, twi_iaddr_t byte3, const void *_buf, size_t size) +{ + uint8_t addr_size = 0; + const uint8_t *buf = (const uint8_t *)_buf; + ticks_t start; + + /* At least 1 byte *must* be transmitted, thanks to crappy hw implementation */ + ASSERT(size >= 1); + + /* Check internal byte address presence */ + if (byte1 != TWI_NO_IADDR) + addr_size++; + + if (byte2 != TWI_NO_IADDR) + { + ASSERT(addr_size == 1); + addr_size++; + } + + if (byte3 != TWI_NO_IADDR) + { + ASSERT(addr_size == 2); + addr_size++; + } + + start = timer_clock(); + /* Wait tx buffer empty */ + while (!(TWI_SR & BV(TWI_TXRDY))) + { + if (timer_clock() - start > TWI_TIMEOUT) + return false; + } + + /* Set slave address and (optional) internal slave addresses */ + TWI_MMR = (uint32_t)id << TWI_DADR_SHIFT | (uint32_t)addr_size << TWI_IADRSZ_SHIFT; + + TWI_IADR = ((uint32_t)(byte3 & 0xff) << 16) | ((uint32_t)(byte2 & 0xff) << 8) | ((uint32_t)(byte1 & 0xff)); + + while (size--) + { + /* Send data */ + TWI_THR = *buf++; + + start = timer_clock(); + /* Wait tx buffer empty */ + while (!(TWI_SR & BV(TWI_TXRDY))) + { + if (timer_clock() - start > TWI_TIMEOUT) + return false; + } + } + + /* Wait transmit complete bit */ + start = timer_clock(); + while (!(TWI_SR & BV(TWI_TXCOMP))) + { + if (timer_clock() - start > TWI_TIMEOUT) + return false; + } + + return true; +} + + +/** + * Read \a size bytes from the twi line from slave \a id. + * If the device requires internal addressing before reading, \a byte1 \a byte2 and \a byte3 must + * be specified. Internal addressign bytes not used *must* be set to TWI_NO_IADDR. If 1 or 2 bytes + * are required for internal addressing you *must* first use \a byte1 and than \a byte2. + * \note Atmel TWI implementation is broken so it was not possible to supply a better + * interface. Additionally NACK handling is also broken, so if the i2c device reply nack + * this function will return after TWI_TIMEOUT. + * \return true if ok, false on slave timeout. + */ +bool twi_read(uint8_t id, twi_iaddr_t byte1, twi_iaddr_t byte2, twi_iaddr_t byte3, void *_buf, size_t size) +{ + uint8_t addr_size = 0; + uint8_t *buf = (uint8_t *)_buf; + bool stopped = false; + ticks_t start; + + /* At least 1 byte *must* be transmitted, thanks to crappy twi implementation */ + ASSERT(size >= 1); + + /* Check internal byte address presence */ + if (byte1 != TWI_NO_IADDR) + addr_size++; + + if (byte2 != TWI_NO_IADDR) + { + ASSERT(addr_size == 1); + addr_size++; + } + + if (byte3 != TWI_NO_IADDR) + { + ASSERT(addr_size == 2); + addr_size++; + } + + /* Wait tx buffer empty */ + start = timer_clock(); + while (!(TWI_SR & BV(TWI_TXRDY))) + { + if (timer_clock() - start > TWI_TIMEOUT) + return false; + } + + + /* Set slave address and (optional) internal slave addresses */ + TWI_MMR = ((uint32_t)id << TWI_DADR_SHIFT) | BV(TWI_MREAD) | ((uint32_t)addr_size << TWI_IADRSZ_SHIFT); + + TWI_IADR = ((uint32_t)(byte3 & 0xff) << 16) | ((uint32_t)(byte2 & 0xff) << 8) | ((uint32_t)(byte1 & 0xff)); + + /* + * Start reception. + * Kludge: if we want to receive only 1 byte, the stop but *must* be set here + * (thanks to crappy twi implementation again). + */ + if (size == 1) + { + TWI_CR = BV(TWI_START) | BV(TWI_STOP); + stopped = true; + } + else + TWI_CR = BV(TWI_START); + + while (size--) + { + /* If we are at the last byte, inform the crappy hw that we + want to stop the reception. */ + if (!size && !stopped) + TWI_CR = BV(TWI_STOP); + + /* Wait until a byte is received */ + start = timer_clock(); + while (!(TWI_SR & BV(TWI_RXRDY))) + { + if (timer_clock() - start > TWI_TIMEOUT) + { + TWI_CR = BV(TWI_STOP); + return false; + } + } + + + *buf++ = TWI_RHR; + } + + /* Wait transmit complete bit */ + start = timer_clock(); + while (!(TWI_SR & BV(TWI_TXCOMP))) + { + if (timer_clock() - start > TWI_TIMEOUT) + return false; + } + + return true; +} + +MOD_DEFINE(twi); + +/** + * Init the (broken) sam7 twi driver. + */ +void twi_init(void) +{ + /* Disable PIO on TWI pins */ + PIOA_PDR = BV(TWD) | BV(TWCK); + + /* Enable oper drain on TWI pins */ + PIOA_MDER = BV(TWD); + + /* Disable all irqs */ + TWI_IDR = 0xFFFFFFFF; + + TWI_CR = BV(TWI_SWRST); + + /* Enable master mode */ + TWI_CR = BV(TWI_MSEN); + + PMC_PCER = BV(TWI_ID); + + /* + * Compute twi clock. + * CLDIV = ((Tlow * 2^CKDIV) -3) * Tmck + * CHDIV = ((THigh * 2^CKDIV) -3) * Tmck + * Only CLDIV is computed since CLDIV = CHDIV (50% duty cycle) + */ + uint16_t cldiv, ckdiv = 0; + while ((cldiv = ((CPU_FREQ / (2 * CONFIG_I2C_FREQ)) - 3) / (1 << ckdiv)) > 255) + ckdiv++; + + /* Atmel errata states that ckdiv *must* be less than 5 for unknown reason */ + ASSERT(ckdiv < 5); + + TWI_CWGR = ((uint32_t)ckdiv << TWI_CKDIV_SHIFT) | (cldiv << TWI_CLDIV_SHIFT) | (cldiv << TWI_CHDIV_SHIFT); + TRACEMSG("TWI_CWGR [%08lx]", TWI_CWGR); + + MOD_INIT(twi); +} + diff --git a/2.5/bertos/cpu/arm/drv/twi_at91.h b/2.5/bertos/cpu/arm/drv/twi_at91.h new file mode 100644 index 00000000..ecf4974e --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/twi_at91.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Driver for the AT91 ARM TWI (implementation) + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + + +#ifndef DRV_AT91_TWI_H +#define DRV_AT91_TWI_H + +#include + +typedef int16_t twi_iaddr_t; + +#define TWI_NO_IADDR (-1) + +void twi_init(void); +bool twi_read(uint8_t id, twi_iaddr_t byte1, twi_iaddr_t byte2, twi_iaddr_t byte3, void *_buf, size_t len); +bool twi_write(uint8_t id, twi_iaddr_t byte1, twi_iaddr_t byte2, twi_iaddr_t byte3, const void *_buf, size_t len); + +#endif /* DRV_AT91_TWI_H */ diff --git a/2.5/bertos/cpu/arm/drv/vic_lpc2.c b/2.5/bertos/cpu/arm/drv/vic_lpc2.c new file mode 100644 index 00000000..066e7fee --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/vic_lpc2.c @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief Vectored Interrupt Controller VIC driver. + * + * notest:arm + */ +#include "vic_lpc2.h" +#include + + +void NORETURN vic_defaultHandler(void) +{ + IRQ_DISABLE; + LOG_ERR("Unhandled IRQ\n" + "VICIRQStatus %08lX\n" + "VICFIQStatus %08lX\n", VICIRQStatus, VICFIQStatus); + while (1) + PAUSE; +} diff --git a/2.5/bertos/cpu/arm/drv/vic_lpc2.h b/2.5/bertos/cpu/arm/drv/vic_lpc2.h new file mode 100644 index 00000000..22a2bda7 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/vic_lpc2.h @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief Vectored Interrupt Controller VIC driver. + */ + +#ifndef DRV_VIC_LPC2_H +#define DRV_VIC_LPC2_H + +#include +#include + +#if CPU_ARM_LPC2378 + #include + #define vic_vector(i) (*(&VICVectAddr0 + i)) + #define vic_priority(i) (*(&VICVectCntl0 + i)) + #define VIC_SRC_CNT 32 + #define vic_enable(i) do { ASSERT(i < VIC_SRC_CNT); VICIntEnable = BV(i); } while (0) + #define vic_disable(i) do { ASSERT(i < VIC_SRC_CNT); VICIntEnClr = BV(i); } while (0) + + typedef void vic_handler_t(void); + void vic_defaultHandler(void); + + INLINE void vic_init(void) + { + IRQ_DISABLE; + /* Assign all sources to IRQ (not to FIQ) */ + VICIntSelect = 0; + /* Disable all sw interrupts */ + VICSoftIntClr = 0xFFFFFFFF; + /* Disable all interrupts */ + VICIntEnClr = 0xFFFFFFFF; + + for (int i = 0; i < VIC_SRC_CNT; i++) + vic_vector(i) = (reg32_t)vic_defaultHandler; + } + + INLINE void vic_setVector(int id, vic_handler_t *handler) + { + ASSERT(id < VIC_SRC_CNT); + vic_vector(id) = (reg32_t)handler; + } +#else + #error Unknown CPU +#endif + +#endif /* DRV_VIC_LPC2_H */ diff --git a/2.5/bertos/cpu/arm/drv/wdt_arm.h b/2.5/bertos/cpu/arm/drv/wdt_arm.h new file mode 100644 index 00000000..02e49906 --- /dev/null +++ b/2.5/bertos/cpu/arm/drv/wdt_arm.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Watchdog interface for ARM architecture. + * + * \version $Id$ + * + * \author Luca Ottaviano + * + */ +#ifndef DRV_WDT_ARM_H +#define DRV_WDT_ARM_H + +#include // INLINE + +#warning TODO: This module is not implemented for at91 CPUs + +INLINE void wdt_start(uint32_t _timeout) { (void) _timeout; /* implement me */ } +INLINE void wdt_stop(void) { /*implement me */ } +INLINE void wdt_reset(void) { /* implement me */ } + +#endif //DRV_WDT_ARM_H diff --git a/2.5/bertos/cpu/arm/hw/crt_arm7tdmi.S b/2.5/bertos/cpu/arm/hw/crt_arm7tdmi.S new file mode 100644 index 00000000..bf80e7e3 --- /dev/null +++ b/2.5/bertos/cpu/arm/hw/crt_arm7tdmi.S @@ -0,0 +1,192 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief ARM7TDMI CRT. + */ + +#define ARM_MODE_USR 0x10 +#define ARM_MODE_FIQ 0x11 +#define ARM_MODE_IRQ 0x12 +#define ARM_MODE_SVC 0x13 +#define ARM_MODE_ABORT 0x17 +#define ARM_MODE_UNDEF 0x1B +#define ARM_MODE_SYS 0x1F + +#define IRQ_BIT 0x80 +#define FIQ_BIT 0x40 + + +/* + * Hardware initialization. + */ + .section .init, "ax", %progbits +__init0: + /* + * Set stack pointers + */ + ldr r0, =__stack_fiq_end + msr CPSR_c, #ARM_MODE_FIQ | IRQ_BIT | FIQ_BIT + mov r13, r0 + ldr r0, =__stack_irq_end + msr CPSR_c, #ARM_MODE_IRQ | IRQ_BIT | FIQ_BIT + mov r13, r0 + ldr r0, =__stack_abt_end + msr CPSR_c, #ARM_MODE_ABORT | IRQ_BIT | FIQ_BIT + mov r13, r0 + ldr r0, =__stack_und_end + msr CPSR_c, #ARM_MODE_UNDEF | IRQ_BIT | FIQ_BIT + mov r13, r0 + ldr r0, =__stack_svc_end + msr CPSR_c, #ARM_MODE_SVC | IRQ_BIT | FIQ_BIT + mov r13, r0 + + /* + * Early hw initialization #1. + * Called before clearing .bss and + * loading .data segments. + */ + bl __init1 + + /* + * Clear .bss + */ + ldr r1, =__bss_start + ldr r2, =__bss_end + ldr r3, =0 + +bss_loop: + cmp r1, r2 + strne r3, [r1], #+4 + bne bss_loop + + /* + * Relocate .data section (Copy from ROM to RAM). + */ + ldr r1, =__etext + ldr r2, =__data_start + ldr r3, =__data_end + +data_loop: + cmp r2, r3 + ldrlo r0, [r1], #4 + strlo r0, [r2], #4 + blo data_loop + + /* + * Early hw initialization #2. + * Called after setting up .bss and .data segments + * but before calling main(). + */ + bl __init2 + + /* + * Jump to main + */ + bl main + +end: + b end + +__dummy_init: + mov pc, lr + + /* + * Redefine your own __init() in order to supply + * a completely custom initialization routine. + */ + .weak __init + .set __init, __init0 + + /* + * Redefine your own __init1() in order to supply + * an hardware initialization routine. + * Remember that __init1() is called *before* + * clearing .bss and loading .data sections. + */ + .weak __init1 + .set __init1, __dummy_init + + /* + * Redefine your own __init2() in order to supply + * an hardware initialization routine. + * Remember that __init2() is called *after* + * clearing .bss and loading .data sections, just + * before calling main(). + */ + .weak __init2 + .set __init2, __dummy_init + + /* + * Redefine your own __undef() in order to supply + * a custom handler for undefined instruction exception. + */ + .weak __undef + .set __undef, __xcpt_dummy_undef + + /* + * Redefine your own __swi() in order to supply + * a custom handler for software interrupt exception. + */ + .weak __swi + .set __swi, __xcpt_dummy_swi + + /* + * Redefine your own __prefetch_abort() in order to supply + * a custom handler for prefetch abort exception. + */ + .weak __prefetch_abort + .set __prefetch_abort, __xcpt_dummy_pref + + /* + * Redefine your own __data_abort() in order to supply + * a custom handler for data abort exception. + */ + .weak __data_abort + .set __data_abort, __xcpt_dummy_dab + + .ltorg + + .section .exceptions, "ax", %progbits + +__xcpt_dummy_undef: + b __xcpt_dummy_undef + +__xcpt_dummy_swi: + b __xcpt_dummy_swi + +__xcpt_dummy_pref: + b __xcpt_dummy_pref + +__xcpt_dummy_dab: + b __xcpt_dummy_dab diff --git a/2.5/bertos/cpu/arm/hw/crtat91sam7_rom.S b/2.5/bertos/cpu/arm/hw/crtat91sam7_rom.S new file mode 100644 index 00000000..9bd9d46c --- /dev/null +++ b/2.5/bertos/cpu/arm/hw/crtat91sam7_rom.S @@ -0,0 +1,378 @@ +/** + * \file + * + * + * \version $Id: $ + * + * \author Francesco Sacchi + * + * \brief AT91SAM7S256 CRT, adapted from NUt/OS, see license below. + */ + +/* + * Copyright (C) 2005-2007 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + * + */ + +#include +#include "cfg/cfg_arch.h" + + +#if CPU_FREQ != 48023000L + /* Avoid errors on nightly test */ + #if !defined(ARCH_NIGHTTEST) || !(ARCH & ARCH_NIGHTTEST) + #warning Clock registers set for 48.023MHz operation, revise following code if you want a different clock. + #endif +#endif + + +#if CPU_ARM_SAM7S_LARGE || CPU_ARM_SAM7X + /* + * With a 18.420MHz cristal, master clock is: + * (((18.420 * PLL_MUL_VAL + 1) / PLL_DIV_VAL) / AT91MCK_PRES) = 48.023MHz + */ + #define PLL_MUL_VAL 72 /**< Real multiplier value is PLL_MUL_VAL + 1! */ + #define PLL_DIV_VAL 14 + #define AT91MCK_PRES PMC_PRES_CLK_2 + + /* + * Register I/O adresses. + */ + #define MC_BASE 0xFFFFFF00 + #define MC_FMR_OFF 0x00000060 + #define MC_FWS_2R3W 0x00000100 + + #define AIC_BASE 0xFFFFF000 + #define AIC_EOICR_OFF 0x00000130 + #define AIC_IDCR_OFF 0x00000124 + + #define WDT_BASE 0xFFFFFD40 + #define WDT_MR_OFF 0x00000004 + #define WDT_WDDIS (1 << 15) + + #define PMC_BASE 0xFFFFFC00 + #define PMC_PCER_OFF 0x00000010 + #define PMC_SR_OFF 0x00000068 + #define PMC_MCKR_OFF 0x00000030 + #define PMC_MOSCS (1 << 0) + #define PMC_LOCK (1 << 2) + #define PMC_MCKRDY (1 << 3) + #define PMC_CSS_MASK 0x00000003 + #define PMC_CSS_PLL_CLK 0x00000003 + #define PMC_PRES_MASK 0x0000001C + #define PMC_PRES_CLK_2 0x00000004 + + #if CPU_ARM_SAM7S_LARGE + #define PMC_PIO_CLK_EN (1 << 2) + #elif CPU_ARM_SAM7X + #define PMC_PIO_CLK_EN ((1 << 2) | (1 << 3)) + #else + #error CPU not supported + #endif + + #define CKGR_MOR_OFF 0x00000020 + #define CKGR_PLLR_OFF 0x0000002C + #define CKGR_MOSCEN (1 << 0) + #define CKGR_MUL_SHIFT 16 + #define CKGR_PLLCOUNT_SHIFT 8 + + #define RSTC_MR 0xFFFFFD08 + #define RSTC_KEY 0xA5000000 + #define RSTC_URSTEN (1 << 0) + + #define ARM_MODE_USR 0x10 + #define ARM_MODE_FIQ 0x11 + #define ARM_MODE_IRQ 0x12 + #define ARM_MODE_SVC 0x13 + #define ARM_MODE_ABORT 0x17 + #define ARM_MODE_UNDEF 0x1B + #define ARM_MODE_SYS 0x1F + +#else + #error No register I/O definition for selected ARM CPU +#endif +/*\}*/ + +/* + * Section 0: Vector table and reset entry. + */ + .section .vectors,"ax",%progbits + + .global __vectors +__vectors: + ldr pc, [pc, #24] /* Reset */ + ldr pc, [pc, #24] /* Undefined instruction */ + ldr pc, [pc, #24] /* Software interrupt */ + ldr pc, [pc, #24] /* Prefetch abort */ + ldr pc, [pc, #24] /* Data abort */ + ldr pc, [pc, #24] /* Reserved */ + + /* + * On IRQ the PC will be loaded from AIC_IVR, which + * provides the address previously set in AIC_SVR. + * The interrupt routine will be called in ARM_MODE_IRQ + * with IRQ disabled and FIQ unchanged. + */ + ldr pc, [pc, #-0xF20] /* Interrupt request, auto vectoring. */ + ldr pc, [pc, #-0xF20] /* Fast interrupt request, auto vectoring. */ + + .word _init + .word __undef + .word __swi + .word __prefetch_abort + .word __data_abort + + .weak __undef + .set __undef, __xcpt_dummy_undef + .weak __swi + .set __swi, __xcpt_dummy_swi + .weak __prefetch_abort + .set __prefetch_abort, __xcpt_dummy_pref + .weak __data_abort + .set __data_abort, __xcpt_dummy_dab + +/** .global __xcpt_dummy*/ +__xcpt_dummy_undef: + b __xcpt_dummy_undef + +__xcpt_dummy_swi: + b __xcpt_dummy_swi + +__xcpt_dummy_pref: + b __xcpt_dummy_pref + +__xcpt_dummy_dab: + b __xcpt_dummy_dab + + + .ltorg +/* + * Hardware initialization. + */ + .section .init, "ax", %progbits + .globl _init +_init: + /* + * Use 2 cycles for flash access. + */ + ldr r1, =MC_BASE + mov r0, #MC_FWS_2R3W + str r0, [r1, #MC_FMR_OFF] + + /* + * Disable all interrupts. Useful for debugging w/o target reset. + */ + ldr r1, =AIC_BASE + mvn r0, #0 + str r0, [r1, #AIC_EOICR_OFF] + str r0, [r1, #AIC_IDCR_OFF] + + /* + * The watchdog is enabled after processor reset. Disable it. + */ + ldr r1, =WDT_BASE + ldr r0, =WDT_WDDIS + str r0, [r1, #WDT_MR_OFF] + + /* + * Enable the main oscillator. Set startup time of 6 * 8 slow + * clock cycles and wait until oscillator is stabilized. + */ + ldr r1, =PMC_BASE + mov r0, #(6 << 8) + orr r0, r0, #CKGR_MOSCEN + str r0, [r1, #CKGR_MOR_OFF] +wait_moscs: + ldr r0, [r1, #PMC_SR_OFF] + tst r0, #PMC_MOSCS + beq wait_moscs + + /* + * Switch to Slow oscillator clock. + */ + ldr r0, [r1, #PMC_MCKR_OFF] + and r0, r0, #~PMC_CSS_MASK + str r0, [r1, #PMC_MCKR_OFF] +wait_slowosc: + ldr r0, [r1, #PMC_SR_OFF] + tst r0, #PMC_MCKRDY + beq wait_slowosc + + /* + * Switch to prescaler div 1 factor. + */ + ldr r0, [r1, #PMC_MCKR_OFF] + and r0, r0, #~PMC_PRES_MASK + str r0, [r1, #PMC_MCKR_OFF] +wait_presc: + ldr r0, [r1, #PMC_SR_OFF] + tst r0, #PMC_MCKRDY + beq wait_presc + + /* + * Set PLL: + * PLLfreq = crystal / divider * (multiplier + 1) + * Wait 28 clock cycles until PLL is locked. + */ + ldr r0, =((PLL_MUL_VAL << CKGR_MUL_SHIFT) | (28 << CKGR_PLLCOUNT_SHIFT) | PLL_DIV_VAL) + + str r0, [r1, #CKGR_PLLR_OFF] +wait_lock: + ldr r0, [r1, #PMC_SR_OFF] + tst r0, #PMC_LOCK + beq wait_lock + + /* + * Set master clock prescaler. + */ + mov r0, #AT91MCK_PRES + str r0, [r1, #PMC_MCKR_OFF] +wait_presrdy: + ldr r0, [r1, #PMC_SR_OFF] + tst r0, #PMC_MCKRDY + beq wait_presrdy + + /* + * Switch to PLL clock. Trying to set this together with the + * prescaler fails (see datasheets). + */ + ldr r0, [r1, #PMC_MCKR_OFF] + orr r0, r0, #PMC_CSS_PLL_CLK + str r0, [r1, #PMC_MCKR_OFF] +wait_pllsel: + ldr r0, [r1, #PMC_SR_OFF] + tst r0, #PMC_MCKRDY + beq wait_pllsel + + /* + * Enable external reset key. + */ + ldr r0, =(RSTC_KEY | RSTC_URSTEN) + ldr r1, =RSTC_MR + str r0, [r1, #0] + + /* + * Set exception stack pointers + */ + ldr r0, =__stack_fiq_end + msr CPSR_c, #ARM_MODE_FIQ | 0xC0 + mov r13, r0 + ldr r0, =__stack_irq_end + msr CPSR_c, #ARM_MODE_IRQ | 0xC0 + mov r13, r0 + ldr r0, =__stack_abt_end + msr CPSR_c, #ARM_MODE_ABORT | 0xC0 + mov r13, r0 + ldr r0, =__stack_und_end + msr CPSR_c, #ARM_MODE_UNDEF | 0xC0 + mov r13, r0 + ldr r0, =__stack_svc_end + msr CPSR_c, #ARM_MODE_SVC | 0xC0 + mov r13, r0 + + /* + * Clear .bss + */ + ldr r1, =__bss_start + ldr r2, =__bss_end + ldr r3, =0 + +_40: + cmp r1, r2 + strne r3, [r1], #+4 + bne _40 + + /* + * Relocate .data section (Copy from ROM to RAM). + */ + ldr r1, =__etext + ldr r2, =__data_start + ldr r3, =__data_end + +_41: + cmp r2, r3 + ldrlo r0, [r1], #4 + strlo r0, [r2], #4 + blo _41 + + /* + * Initialize user stack pointer. + */ + /* msr CPSR_c, #ARM_MODE_SYS | 0xC0 */ + ldr r13, =__stack_end + + + /* + * Enable clock for PIO(s) + */ + ldr r1, =PMC_BASE + mov r0, #PMC_PIO_CLK_EN + str r0, [r1, #PMC_PCER_OFF] + + + /* + * Jump to main + */ + ldr r0, =main + bx r0 + +End: + b End + + .ltorg diff --git a/2.5/bertos/cpu/arm/hw/init_at91.c b/2.5/bertos/cpu/arm/hw/init_at91.c new file mode 100644 index 00000000..1bba1c22 --- /dev/null +++ b/2.5/bertos/cpu/arm/hw/init_at91.c @@ -0,0 +1,240 @@ +/** + * \file + * + * + * + * \author Francesco Sacchi + * + * \brief AT91SAM7S256 CRT. + */ + +#include +#include + +#define USE_FIXED_PLL 1 + +#define XTAL_FREQ 18420000UL + +#if USE_FIXED_PLL + #if CPU_FREQ != 48023000L + /* Avoid errors on nightly test */ + #if !defined(ARCH_NIGHTTEST) || !(ARCH & ARCH_NIGHTTEST) + #warning Clock registers set for 48.023MHz operation, revise following code if you want a different clock. + #endif + #endif + + /* + * With a 18.420MHz cristal, master clock is: + * (((18.420 * PLL_MUL_VAL + 1) / PLL_DIV_VAL) / AT91MCK_PRES) = 48.023MHz + */ + #define PLL_MUL_VAL 72 /**< Real multiplier value is PLL_MUL_VAL + 1! */ + #define PLL_DIV_VAL 14 + #define AT91MCK_PRES PMC_PRES_CLK_2 + +#else /* !USE_FIXED_PLL*/ + + #define PLL_IN_MIN 1000000UL + #define PLL_IN_MAX 32000000UL + #define PLL_OUT_MIN 80000000UL + #define PLL_OUT_MAX 160000000UL + + #define DIV_HARD_MIN 1 + #define DIV_HARD_MAX 255 + + #define DIV_MIN (DIV_ROUND(XTAL_FREQ, PLL_IN_MAX) \ + < DIV_HARD_MIN ? DIV_HARD_MIN : DIV_ROUND(XTAL_FREQ, PLL_IN_MAX)) + + #define DIV_MAX (DIV_ROUND(XTAL_FREQ, PLL_IN_MIN) \ + > DIV_HARD_MAX ? DIV_HARD_MAX : DIV_ROUND(XTAL_FREQ, PLL_IN_MIN)) + + #define MUL_MIN 0 + #define MUL_MAX 2047 + + typedef struct PllRegs + { + uint32_t mul; + uint32_t div; + uint32_t pres; + } PllRegs; + + /** + * Code used to automatically compute the PLL registers. + * Since the processor uses the internal 32kHz oscillator + * this function takes a lot of time to be executed (~3s!). + */ + static const PllRegs pllCostants(void) + { + uint32_t best_err = CPU_FREQ; + PllRegs res; + + for (uint32_t div = DIV_MIN; div <= DIV_MAX; div++) + { + for (uint32_t pres = 0; pres < 8; pres++) + { + uint32_t mul = DIV_ROUND((CPU_FREQ * div) << pres, XTAL_FREQ) - 1; + if (mul <= MUL_MAX) + { + uint32_t pll = (XTAL_FREQ * (mul + 1)) / div; + if (pll >= PLL_OUT_MIN && pll <= PLL_OUT_MAX) + { + uint32_t err = ABS((int32_t)((pll >> pres) - CPU_FREQ)); + if (err == 0) + { + res.div = div; + res.mul = mul; + res.pres = pres; + return res; + } + if (err < best_err) + { + best_err = err; + res.div = div; + res.mul = mul; + res.pres = pres; + } + } + } + } + } + return res; + } +#endif /* !USE_FIXED_PLL*/ + +/* + * Override dummy hardware init functions supplied by the ASM startup + * routine. + */ + +void __init1(void); +void __init2(void); + +/** + * Early hardware initialization routine1. + * This will be called by the ASM CRT routine just + * *before* clearing .bss and loading .data sections. + * Usually only basic tasks are performed here (i.e. setting the PLL). + * For more generic tasks, __init2() should be used. + * + * \note Please keep in mind that since .bss and .data are not yet set, care + * must be taken. No static data can be used inside this funcition. + * Also some libc functions or floating point operations could potentially + * use initialized static data, be aware! + */ +void __init1(void) +{ + /* + * Compute number of master clock cycles in 1.5us. + * Needed by flash writing functions. + * The maximum FMCN value is 0xFF and 0 can be used only if + * master clock is less than 33kHz. + */ + #define MCN DIV_ROUNDUP(CPU_FREQ, 666667UL) + #define FMCN (CPU_FREQ <= 33333UL ? 0 : (MCN < 0xFF ? MCN : 0xFF)) + + #if CPU_FREQ < 30000000UL + /* Use 1 cycles for flash access. */ + MC_FMR = FMCN << MC_FMCN_SHIFT | MC_FWS_1R2W; + #else + /* Use 2 cycles for flash access. */ + MC_FMR = FMCN << MC_FMCN_SHIFT | MC_FWS_2R3W; + #endif + + /* Disable all interrupts. Useful for debugging w/o target reset. */ + AIC_EOICR = 0xFFFFFFFF; + AIC_IDCR = 0xFFFFFFFF; + + /* The watchdog is enabled after processor reset. Disable it. */ + WDT_MR = BV(WDT_WDDIS); + + /* + * Enable the main oscillator. Set startup time of 6 * 8 slow + * clock cycles and wait until oscillator is stabilized. + */ + CKGR_MOR = (6 << 8) | BV(CKGR_MOSCEN); + while (!(PMC_SR & BV(PMC_MOSCS))) ; + + /* Switch to Slow oscillator clock. */ + PMC_MCKR &= ~PMC_CSS_MASK; + while (!(PMC_SR & BV(PMC_MCKRDY))) ; + + /* Switch to prescaler div 1 factor. */ + PMC_MCKR &= ~PMC_PRES_MASK; + while (!(PMC_SR & BV(PMC_MCKRDY))) ; + + uint32_t div, pres, mul; + #if USE_FIXED_PLL + div = PLL_DIV_VAL; + mul = PLL_MUL_VAL; + pres = AT91MCK_PRES; + #else + PllRegs pll = pllCostants(); + div = pll.div; + mul = pll.mul; + pres = pll.pres << PMC_PRES_SHIFT; + #endif + + /* + * Set PLL: + * PLLfreq = crystal / divider * (multiplier + 1) + * Wait 28 clock cycles until PLL is locked. + */ + CKGR_PLLR = ((mul << CKGR_MUL_SHIFT) + | (28 << CKGR_PLLCOUNT_SHIFT) | div); + while (!(PMC_SR & BV(PMC_LOCK))) ; + + /* Set master clock prescaler. */ + PMC_MCKR = pres; + while (!(PMC_SR & BV(PMC_MCKRDY))) ; + + /* + * Switch to PLL clock. Trying to set this together with the + * prescaler fails (see datasheets). + */ + PMC_MCKR |= PMC_CSS_PLL_CLK; + while (!(PMC_SR & BV(PMC_MCKRDY))) ; +} + +/** + * Early hardware initialization routine2. + * This will be called by the ASM CRT routine just + * *after* clearing .bss and loading .data sections and before calling main(). + */ +void __init2(void) +{ + /* Enable external reset key. */ + RSTC_MR = (RSTC_KEY | BV(RSTC_URSTEN)); + + /* Enable clock for PIO(s) */ + PMC_PCER = BV(PIOA_ID); + #if CPU_ARM_SAM7X + PMC_PCER |= BV(PIOB_ID); + #endif +} diff --git a/2.5/bertos/cpu/arm/hw/init_lpc2.c b/2.5/bertos/cpu/arm/hw/init_lpc2.c new file mode 100644 index 00000000..033216d1 --- /dev/null +++ b/2.5/bertos/cpu/arm/hw/init_lpc2.c @@ -0,0 +1,129 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief LPC2378 CRT. + * notest:arm + */ +#include +#include +#include + +#if CPU_FREQ != 72000000UL + /* Avoid errors on nightly test */ + #if !defined(ARCH_NIGHTTEST) || !(ARCH & ARCH_NIGHTTEST) + #warning Clock registers set for 72MHz operation, revise following code if you want a different clock. + #endif +#endif + +/* + * With a 12MHz cristal, master clock is: + * (((2 * 12 * (PLL_MUL_VAL + 1)) / (PLL_DIV_VAL + 1)) / (LPC2_CPUCLOCK_DIV + 1))= 72MHz + */ +#define PLL_MUL_VAL 11 +#define PLL_DIV_VAL 0 +#define LPC2_CPUCLOCK_DIV 3 + + +/* PLL feed sequence */ +#define PLL_FEED_SEQ() ATOMIC(PLLFEED = 0xAA; PLLFEED = 0x55;) + +static void configurePll(void) +{ + /* Disconnect and disable the PLL, if already active */ + if (PLLSTAT & (1 << 25)) + { + /* Disconnect PLL, but leave it enabled */ + PLLCON = 0x01; + PLL_FEED_SEQ(); + /* Disable PLL */ + PLLCON = 0; + PLL_FEED_SEQ(); + } + + /* Enable the main oscillator and wait for it to be stable */ + SCS |= (1 << 5); + while (!(SCS & (1 << 6))) ; + + /* Select the main oscillator as the PLL clock source */ + CLKSRCSEL = 0x01; + + /* Set up PLL mul and div */ + PLLCFG = PLL_MUL_VAL | (PLL_DIV_VAL << 16); + PLL_FEED_SEQ(); + + /* Enable PLL, disconnected */ + PLLCON = 0x01; + PLL_FEED_SEQ(); + + /* Set clock divider */ + CCLKCFG = LPC2_CPUCLOCK_DIV; + + /* Wait for the PLL to lock */ + while (!(PLLSTAT & (1 << 26))) ; + + /* Enable and connect the PLL */ + PLLCON = 0x03; + PLL_FEED_SEQ(); +} + +void __init1(void); + +void __init1(void) +{ + /* Map irq vectors to internal flash */ + MEMMAP = 0x01; + /* Configure PLL, switch from IRC to Main OSC */ + configurePll(); + + /* Set memory accelerator module flash timings */ +#if CPU_FREQ < 20000000UL + MAMTIM = 1; +#elif CPU_FREQ < 40000000UL + MAMTIM = 2; +#elif CPU_FREQ < 60000000UL + MAMTIM = 3; +#else + MAMTIM = 4; +#endif + + /* Memory accelerator module fully enabled */ + MAMCR = 0x02; +} + +void __init2(void); + +void __init2(void) +{ + vic_init(); +} diff --git a/2.5/bertos/cpu/arm/hw/pll_at91.h b/2.5/bertos/cpu/arm/hw/pll_at91.h new file mode 100644 index 00000000..50f4a0c4 --- /dev/null +++ b/2.5/bertos/cpu/arm/hw/pll_at91.h @@ -0,0 +1,153 @@ +/** + * \file + * + * + * + * \author Giovanni Bajo + * + * \brief AT91SAM7S256 CRT. + */ + +#include +#include + +#if 1 +// Versione completamente unrollata + +#define CREATE_PLL_STEP(xtal, cpufreq) + +#define PLL_STEP(xtal, cpufreq, d, k) \ + do { \ + uint32_t m = (((cpufreq * (1LL << k) * (d)) + (xtal / 2)) / xtal) - 1; \ + if (m < 2048) \ + { \ + uint32_t pll = (d != 0) ? (xtal * (m + 1)) / (d) : 0; \ + if (80000000 <= pll && pll <= 160000000) \ + { \ + uint32_t err = ABS((int32_t)((pll >> k) - cpufreq)); \ + if (err < best_err) \ + { \ + best_err=err; best_m=m; best_k=k; best_d=d; \ + } \ + } \ + } \ + } while (0) + +#else + +// Versione con funzione nestata (GCC only) +// Tempo di compilazione più rapido + +#define CREATE_PLL_STEP(xtal, cpufreq) \ + void __attribute__((always_inline)) PLL_STEP(int u1, int u2, int32_t d, long long k) \ + { \ + (void)u1; (void)u2; \ + uint32_t m = ((((cpufreq * (1LL << k) * (d)) + (xtal / 2)) / xtal) - 1; \ + if (m < 2048) \ + { \ + uint32_t pll = (xtal * (m + 1)) / (d); \ + if (80000000UL <= pll && pll <= 160000000UL) \ + { \ + uint32_t err = ABS((int32_t)((pll >> k) - cpufreq)); \ + if (err < best_err) \ + { \ + best_err=err; best_m=m; best_k=k; best_d=d; \ + } \ + } \ + } \ + } + +#endif + +#define PLL_MACRO_STEP(xtal, cpufreq, d) \ + do { \ + if ((d) > 0 && (d) <= 255 && \ + (d) <= xtal / 1000000 && (d) >= xtal / 32000000) \ + { \ + PLL_STEP(xtal, cpufreq, d, 0); \ + PLL_STEP(xtal, cpufreq, d, 1); \ + PLL_STEP(xtal, cpufreq, d, 2); \ + PLL_STEP(xtal, cpufreq, d, 3); \ + PLL_STEP(xtal, cpufreq, d, 4); \ + PLL_STEP(xtal, cpufreq, d, 5); \ + PLL_STEP(xtal, cpufreq, d, 6); \ + } \ + } while (0) + +#define PLL_ITERATION_4(xtal, cpufreq, d) \ + PLL_MACRO_STEP(xtal, cpufreq, d) + +#define PLL_ITERATION_3(xtal, cpufreq, d) \ + PLL_ITERATION_4(xtal, cpufreq, (d)*4+0); \ + PLL_ITERATION_4(xtal, cpufreq, (d)*4+1); \ + PLL_ITERATION_4(xtal, cpufreq, (d)*4+2); \ + PLL_ITERATION_4(xtal, cpufreq, (d)*4+3); + +#define PLL_ITERATION_2(xtal, cpufreq, d) \ + PLL_ITERATION_3(xtal, cpufreq, (d)*4+0); \ + PLL_ITERATION_3(xtal, cpufreq, (d)*4+1); \ + PLL_ITERATION_3(xtal, cpufreq, (d)*4+2); \ + PLL_ITERATION_3(xtal, cpufreq, (d)*4+3); + +#define PLL_ITERATION_1(xtal, cpufreq, d) \ + PLL_ITERATION_2(xtal, cpufreq, (d)*4+0); \ + PLL_ITERATION_2(xtal, cpufreq, (d)*4+1); \ + PLL_ITERATION_2(xtal, cpufreq, (d)*4+2); \ + PLL_ITERATION_2(xtal, cpufreq, (d)*4+3); + +#define PLL_ITERATION(xtal, cpufreq) \ + PLL_ITERATION_1(xtal, cpufreq, 0); \ + PLL_ITERATION_1(xtal, cpufreq, 1); \ + PLL_ITERATION_1(xtal, cpufreq, 2); \ + PLL_ITERATION_1(xtal, cpufreq, 3) + +#define PLL_CALC(xtal, cpufreq, m, d, k) do \ + { \ + uint32_t best_err=cpufreq, best_m, best_k, best_d; \ + CREATE_PLL_STEP(xtal, cpufreq) \ + PLL_ITERATION(xtal, cpufreq); \ + *(m)=best_m; *(d)=best_d; *(k)=best_k; \ + } while (0) + +#if 0 +int main(int argc, char *argv[]) +{ + int32_t m, d, k; + PLL_CALC(18420000, 48023000, &m, &d, &k); + + if (__builtin_constant_p(m) && __builtin_constant_p(k) && __builtin_constant_p(d)) + printf("SUCCESS -- compile time evaluation\n"); + else + printf("FAILURE -- run time evaluation\n"); + + printf("M:%d D:%d K:%d\n", m, d, k); +} +#endif diff --git a/2.5/bertos/cpu/arm/hw/switch_arm.S b/2.5/bertos/cpu/arm/hw/switch_arm.S new file mode 100644 index 00000000..0e7d6972 --- /dev/null +++ b/2.5/bertos/cpu/arm/hw/switch_arm.S @@ -0,0 +1,6 @@ +#include + +#if !(ARCH & ARCH_NIGHTTEST) + #warning This file is deprecated, use switch_ctx_arm.S + #include "switch_ctx_arm.S" +#endif diff --git a/2.5/bertos/cpu/arm/hw/switch_ctx_arm.S b/2.5/bertos/cpu/arm/hw/switch_ctx_arm.S new file mode 100644 index 00000000..db4f297f --- /dev/null +++ b/2.5/bertos/cpu/arm/hw/switch_ctx_arm.S @@ -0,0 +1,99 @@ +/** + * \file + * + * + * \brief ARM context switch + * + * + * \author Stefano Fedrigo + * \author Francesco Sacchi + * \author Andrea Righi + */ + +#include "cfg/cfg_proc.h" + +/* void asm_switch_context(void **new_sp [r0], void **save_sp [r1]) */ +.globl asm_switch_context +asm_switch_context: + /* Save registers */ + stmfd sp!, {r4 - r11, lr} + /* Save old stack pointer */ + str sp, [r1] + /* Load new stack pointer */ + ldr sp, [r0] + /* Load new registers */ + ldmfd sp!, {r4 - r11, pc} + +#if CONFIG_KERN_PREEMPT + +/* ARM interrupt mode with IRQ and FIQ disabled */ +#define ARM_IRQ_MODE 0xD2 +/* ARM supervisor mode with IRQ and FIQ disabled */ +#define ARM_SVC_MODE 0xD3 + +.globl asm_irq_switch_context +asm_irq_switch_context: + /* Return if preemption is not needed */ + bl proc_needPreempt + cmp r0, #0 + ldmeqfd sp!, {r0 - r3, ip, pc}^ + + /* Otherwise restore regs used by the ISR */ + ldmfd sp!, {r0 - r3, ip, lr} + + /* Save current process context */ + msr cpsr_c, #ARM_SVC_MODE + stmfd sp!, {r0 - r3, ip, lr} + + /* Save lr_irq and spsr_irq in process stack */ + msr cpsr_c, #ARM_IRQ_MODE + mov r0, lr + mrs r1, spsr + msr cpsr_c, #ARM_SVC_MODE + stmfd sp!, {r0, r1} + + /* Perform the context switch */ + bl proc_preempt + + /* Restore lr_irq and spsr_irq from process stack */ + ldmfd sp!, {r0, r1} + msr cpsr_c, #ARM_IRQ_MODE + mov lr, r0 + msr spsr_cxsf, r1 + + /* Restore process regs */ + msr cpsr_c, #ARM_SVC_MODE + ldmfd sp!, {r0 - r3, ip, lr} + + /* Exit from ISR */ + msr cpsr_c, #ARM_IRQ_MODE + movs pc, lr +#endif /* CONFIG_KERN_PREEMPT */ diff --git a/2.5/bertos/cpu/arm/hw/vectors_at91.S b/2.5/bertos/cpu/arm/hw/vectors_at91.S new file mode 100644 index 00000000..ce4991e4 --- /dev/null +++ b/2.5/bertos/cpu/arm/hw/vectors_at91.S @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief Atmel AT91SAM interrupt vectors. + */ + +#include "cfg/cfg_arch.h" +#if defined(ARCH_NIGHTTEST) && (ARCH & ARCH_NIGHTTEST) + /* Avoid errors during nigthly test */ + #define __vectors __vectors_at91 +#endif + + +/* + * Section 0: Vector table and reset entry. + */ + .section .vectors,"ax",%progbits + + .global __vectors +__vectors: + ldr pc, _init /* Reset */ + ldr pc, _undef /* Undefined instruction */ + ldr pc, _swi /* Software interrupt */ + ldr pc, _prefetch_abort /* Prefetch abort */ + ldr pc, _data_abort /* Data abort */ + .word 0 /* Reserved */ + + /* + * On IRQ the PC will be loaded from AIC_IVR, which + * provides the address previously set in AIC_SVR. + * The interrupt routine will be called in ARM_MODE_IRQ + * with IRQ disabled and FIQ unchanged. + */ + ldr pc, [pc, #-0xF20] /* Interrupt request, auto vectoring. */ + ldr pc, [pc, #-0xF20] /* Fast interrupt request, auto vectoring. */ + +_init: + .word __init +_undef: + .word __undef +_swi: + .word __swi +_prefetch_abort: + .word __prefetch_abort +_data_abort: + .word __data_abort + + .ltorg diff --git a/2.5/bertos/cpu/arm/hw/vectors_lpc2.S b/2.5/bertos/cpu/arm/hw/vectors_lpc2.S new file mode 100644 index 00000000..06d0a7df --- /dev/null +++ b/2.5/bertos/cpu/arm/hw/vectors_lpc2.S @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief NXP LPC2xxx interrupt vectors. + */ + +#include +#include "cfg/cfg_arch.h" +#if defined(ARCH_NIGHTTEST) && (ARCH & ARCH_NIGHTTEST) + /* Avoid errors during nigthly test */ + #define __vectors __vectors_lpc2 +#endif + +/* + * Section 0: Vector table and reset entry. + */ + .section .vectors,"ax",%progbits + + .global __vectors +__vectors: + ldr pc, _init /* Reset */ + ldr pc, _undef /* Undefined instruction */ + ldr pc, _swi /* Software interrupt */ + ldr pc, _prefetch_abort /* Prefetch abort */ + ldr pc, _data_abort /* Data abort */ +#if CPU_ARM_LPC2378 + .word 0xb9206e58 /* In LPX2xxx, this location holds the checksum of the previous vectors */ + ldr pc, [pc, #-0x120] /* Use VIC */ +#else + .word 0xb9205f88 /* In LPX2xxx, this location holds the checksum of the previous vectors */ + #if CPU_ARM_LPC2 + #warning Check correct VICAddress register for this CPU, default set to 0xFFFFF030 + #endif + ldr pc, [pc, #-0xFF0] /* Use VIC */ +#endif + ldr pc, _fiq /* Fast interrupt request */ +_init: + .word __init +_undef: + .word __undef +_swi: + .word __swi +_prefetch_abort: + .word __prefetch_abort +_data_abort: + .word __data_abort +_fiq: + .word __fiq + + .weak __fiq +__fiq: + b __fiq + + .ltorg diff --git a/2.5/bertos/cpu/arm/info/AT91SAM7S128.cdef b/2.5/bertos/cpu/arm/info/AT91SAM7S128.cdef new file mode 100644 index 00000000..b825fa3f --- /dev/null +++ b/2.5/bertos/cpu/arm/info/AT91SAM7S128.cdef @@ -0,0 +1,53 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the AT91SAM7S128. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the AT91SAM7 family. +include("at91sam7.common") + +# Short description of the cpu. +CPU_DESC += [ "128 Kbytes internal flash memory", + "32 Kbytes internal SRAM memory" ] + +# GCC flags for this cpu. +MK_CPU_CPPFLAGS += " -D__ARM_AT91SAM7S128__" +MK_CPU_LDFLAGS += " -T " + SCRIPT_DIR + "at91sam7_128_rom.ld" + diff --git a/2.5/bertos/cpu/arm/info/AT91SAM7S256.cdef b/2.5/bertos/cpu/arm/info/AT91SAM7S256.cdef new file mode 100644 index 00000000..3e7c3bd8 --- /dev/null +++ b/2.5/bertos/cpu/arm/info/AT91SAM7S256.cdef @@ -0,0 +1,54 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the AT91SAM7S256. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the AT91SAM7 family. +include("at91sam7.common") + +# Short description of the cpu. +CPU_DESC += [ "256 Kbytes internal flash memory", + "64 Kbytes internal SRAM memory" ] + +# GCC flags for this cpu. +MK_CPU_CPPFLAGS += " -D__ARM_AT91SAM7S256__" +MK_CPU_LDFLAGS += " -T " + SCRIPT_DIR + "at91sam7_256_rom.ld" + + diff --git a/2.5/bertos/cpu/arm/info/AT91SAM7S512.cdef b/2.5/bertos/cpu/arm/info/AT91SAM7S512.cdef new file mode 100644 index 00000000..33ee75ec --- /dev/null +++ b/2.5/bertos/cpu/arm/info/AT91SAM7S512.cdef @@ -0,0 +1,53 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the AT91SAM7S512. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the AT91SAM7 family. +include("at91sam7.common") + +# Short description of the cpu. +CPU_DESC += [ "512 Kbytes internal flash memory", + "64 Kbytes internal SRAM memory" ] + +# GCC flags for this cpu. +MK_CPU_CPPFLAGS += " -D__ARM_AT91SAM7S512__" +MK_CPU_LDFLAGS += " -T " + SCRIPT_DIR + "at91sam7_512_rom.ld" + diff --git a/2.5/bertos/cpu/arm/info/AT91SAM7S64.cdef b/2.5/bertos/cpu/arm/info/AT91SAM7S64.cdef new file mode 100644 index 00000000..1675dcb4 --- /dev/null +++ b/2.5/bertos/cpu/arm/info/AT91SAM7S64.cdef @@ -0,0 +1,53 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the AT91SAM7S64. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the AT91SAM7 family. +include("at91sam7.common") + +# Short description of the cpu. +CPU_DESC += [ "64 Kbytes internal flash memory", + "16 Kbytes internal SRAM memory" ] + +# GCC flags for this cpu. +MK_CPU_CPPFLAGS += " -D__ARM_AT91SAM7S64__" +MK_CPU_LDFLAGS += " -T " + SCRIPT_DIR + "at91sam7_64_rom.ld" + diff --git a/2.5/bertos/cpu/arm/info/AT91SAM7X128.cdef b/2.5/bertos/cpu/arm/info/AT91SAM7X128.cdef new file mode 100644 index 00000000..3f7920e7 --- /dev/null +++ b/2.5/bertos/cpu/arm/info/AT91SAM7X128.cdef @@ -0,0 +1,53 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the AT91SAM7X128. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the AT91SAM7 family. +include("at91sam7.common") + +# Short description of the cpu. +CPU_DESC += [ "128 Kbytes internal flash memory", + "32 Kbytes internal SRAM memory" ] + +# GCC flags for this cpu. +MK_CPU_CPPFLAGS += " -D__ARM_AT91SAM7X128__" +MK_CPU_LDFLAGS += " -T " + SCRIPT_DIR + "at91sam7_128_rom.ld" + diff --git a/2.5/bertos/cpu/arm/info/AT91SAM7X256.cdef b/2.5/bertos/cpu/arm/info/AT91SAM7X256.cdef new file mode 100644 index 00000000..d52e940b --- /dev/null +++ b/2.5/bertos/cpu/arm/info/AT91SAM7X256.cdef @@ -0,0 +1,53 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the AT91SAM7X256. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the AT91SAM7 family. +include("at91sam7.common") + +# Short description of the cpu. +CPU_DESC += [ "256 Kbytes internal flash memory", + "64 Kbytes internal SRAM memory" ] + +# GCC flags for this cpu. +MK_CPU_CPPFLAGS += " -D__ARM_AT91SAM7X256__" +MK_CPU_LDFLAGS += " -T " + SCRIPT_DIR + "at91sam7_256_rom.ld" + diff --git a/2.5/bertos/cpu/arm/info/AT91SAM7X512.cdef b/2.5/bertos/cpu/arm/info/AT91SAM7X512.cdef new file mode 100644 index 00000000..547b456a --- /dev/null +++ b/2.5/bertos/cpu/arm/info/AT91SAM7X512.cdef @@ -0,0 +1,53 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the AT91SAM7X512. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the AT91SAM7 family. +include("at91sam7.common") + +# Short description of the cpu. +CPU_DESC += [ "512 Kbytes internal flash memory", + "64 Kbytes internal SRAM memory" ] + +# GCC flags for this cpu. +MK_CPU_CPPFLAGS += " -D__ARM_AT91SAM7X512__" +MK_CPU_LDFLAGS += " -T " + SCRIPT_DIR + "at91sam7_512_rom.ld" + diff --git a/2.5/bertos/cpu/arm/info/LPC2378.cdef b/2.5/bertos/cpu/arm/info/LPC2378.cdef new file mode 100644 index 00000000..461ee209 --- /dev/null +++ b/2.5/bertos/cpu/arm/info/LPC2378.cdef @@ -0,0 +1,56 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# General CPU info denfinition for NXP LPC2 family. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Francesco Sacchi +# +# + +# Import the common settings for the lpc2xxx family. +include("lpc2.common") + +# Short description of the cpu. +CPU_DESC += [ "512 Kbytes internal flash memory", + "32 Kbytes internal SRAM memory" ] + +# GCC flags for this cpu. +MK_CPU_CPPFLAGS += " -D__ARM_LPC2378__" +MK_CPU_LDFLAGS += " -T " + SCRIPT_DIR + "lpc2378.ld" + +# CPU type used for flashing/debugging +MK_PROGRAMMER_CPU = "lpc2378" + diff --git a/2.5/bertos/cpu/arm/info/at91sam7.common b/2.5/bertos/cpu/arm/info/at91sam7.common new file mode 100644 index 00000000..0026de91 --- /dev/null +++ b/2.5/bertos/cpu/arm/info/at91sam7.common @@ -0,0 +1,87 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# General CPU info denfinition for AT91SAM7 family. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the path. +include("../../path.common") + +# Short description of the cpu. +CPU_DESC = ["ATMEL AT91 ARM", + "ARMTDMI ARM Thumb Processor", + "32-bit RISC Architecture"] + +# Type of the toolchain we should use to compile the source for this CPU. +TOOLCHAIN = "arm" + +# If we use the GCC compiler we should pass some flags. +CORE_CPU = "arm7tdmi" + +# CPU type used for flashing/debugging +MK_PROGRAMMER_CPU = "at91sam7" + +# Name of the flag used by the build system to pass to the compiler the CPU type. +MK_CPU = CORE_CPU + +# CPU default clock frequency +CPU_DEFAULT_FREQ = "48023000UL" + +# Special CPU related tags. +CPU_TAGS = ["at91", CORE_CPU, TOOLCHAIN] + +# Where are locate the bertos directories +SCRIPT_DIR = CPU_DIR + "arm/scripts/" +HW_DIR = CPU_DIR + "arm/hw/" + +MK_FLASH_SCRIPT = PRG_SCRIPTS_DIR + "arm/flash.sh" +MK_STOPFLASH_SCRIPT = PRG_SCRIPTS_DIR + "arm/stopopenocd.sh" +MK_DEBUG_SCRIPT = PRG_SCRIPTS_DIR + "arm/debug.sh" +MK_STOPDEBUG_SCRIPT = PRG_SCRIPTS_DIR + "arm/stopopenocd.sh" + +GDB_INIT_SCRIPT = PRG_SCRIPTS_DIR + "arm/openocd/gdbinit-sam7" + +# Common GCC flags. +MK_CPU_CPPAFLAGS = "-g -gdwarf-2" +MK_CPU_CPPFLAGS = "-O0 -g3 -gdwarf-2 -fverbose-asm -I" + CPU_DIR + "arm/" +MK_CPU_LDFLAGS = "-nostartfiles -Wl,--no-warn-mismatch" + +# CRT files. +MK_CPU_CPPASRC = HW_DIR + "crt_arm7tdmi.S " + HW_DIR + "vectors_at91.S" +MK_CPU_CSRC = HW_DIR + "init_at91.c" diff --git a/2.5/bertos/cpu/arm/info/lpc2.common b/2.5/bertos/cpu/arm/info/lpc2.common new file mode 100644 index 00000000..b6b80043 --- /dev/null +++ b/2.5/bertos/cpu/arm/info/lpc2.common @@ -0,0 +1,85 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# General CPU info denfinition for NXP LPC2 family. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Francesco Sacchi +# +# + +# Import the common settings for the path. +include("../../path.common") + +# Short description of the cpu. +CPU_DESC = ["NXP LPC2xxx ARM", + "ARMTDMI ARM Thumb Processor", + "32-bit RISC Architecture"] + +# Type of the toolchain we should use to compile the source for this CPU. +TOOLCHAIN = "arm" + +# If we use the GCC compiler we should pass some flags. +CORE_CPU = "arm7tdmi" + +# Name of the flag used by the build system to pass to the compiler the CPU type. +MK_CPU = CORE_CPU + +# CPU default clock frequency +CPU_DEFAULT_FREQ = "72000000UL" + +# Special CPU related tags. +CPU_TAGS = ["lpc2", CORE_CPU, TOOLCHAIN] + +# Where are locate the bertos directories +SCRIPT_DIR = CPU_DIR + "arm/scripts/" +HW_DIR = CPU_DIR + "arm/hw/" +DRV_DIR = CPU_DIR + "arm/drv/" + +MK_FLASH_SCRIPT = PRG_SCRIPTS_DIR + "arm/flash.sh" +MK_STOPFLASH_SCRIPT = PRG_SCRIPTS_DIR + "arm/stopopenocd.sh" +MK_DEBUG_SCRIPT = PRG_SCRIPTS_DIR + "arm/debug.sh" +MK_STOPDEBUG_SCRIPT = PRG_SCRIPTS_DIR + "arm/stopopenocd.sh" + +GDB_INIT_SCRIPT = PRG_SCRIPTS_DIR + "arm/openocd/gdbinit-sam7" + +# Common GCC flags. +MK_CPU_CPPAFLAGS = "-g -gdwarf-2" +MK_CPU_CPPFLAGS = "-O0 -g3 -gdwarf-2 -fverbose-asm -I" + CPU_DIR + "arm/" +MK_CPU_LDFLAGS = "-nostartfiles -Wl,--no-warn-mismatch" + +# CRT files. +MK_CPU_CPPASRC = HW_DIR + "crt_arm7tdmi.S " + HW_DIR + "vectors_lpc2.S" +MK_CPU_CSRC = HW_DIR + "init_lpc2.c " + DRV_DIR + "vic_lpc2.c" diff --git a/2.5/bertos/cpu/arm/io/arm.h b/2.5/bertos/cpu/arm/io/arm.h new file mode 100644 index 00000000..62cb4113 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/arm.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * ARM I/O registers. + */ + + +#ifndef ARM_H +#define ARM_H + +#include + +#if CPU_ARM_AT91 + #include "at91.h" +#elif CPU_ARM_LPC2 + #include "lpc23xx.h" +/*#elif Add other ARM families here */ +#else + #error Unknown CPU +#endif + + +#endif /* ARM_H */ diff --git a/2.5/bertos/cpu/arm/io/at91.h b/2.5/bertos/cpu/arm/io/at91.h new file mode 100644 index 00000000..9e350b48 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * AT91 common definitions. + * This file is based on NUT/OS implementation. See license below. + */ + +/* + * Copyright (C) 2006-2007 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91_H +#define AT91_H + +#include + +#if CPU_ARM_SAM7S_LARGE || CPU_ARM_SAM7X + #include "at91sam7.h" + +#else + #error Missing I/O definitions for CPU. +#endif + +#endif /* AT91_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_adc.h b/2.5/bertos/cpu/arm/io/at91_adc.h new file mode 100644 index 00000000..2abe435b --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_adc.h @@ -0,0 +1,199 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Daniele Basile + * + * AT91SAM7 Analog to Digital Converter. + * + */ + + +#ifndef AT91_ADC_H +#define AT91_ADC_H + + +/** + * ADC control register + */ +#define ADC_CR_OFF 0x00000000 ///< Control register offeset. +#define ADC_CR (*((reg32_t *)(ADC_BASE + ADC_CR_OFF))) ///< Control register address. +#define ADC_SWRST 0 ///< Software reset. +#define ADC_START 1 ///< Start conversion. + + +/** + * ADC mode register + */ +#define ADC_MR_OFF 0x00000004 ///< Mode register offeset. +#define ADC_MR (*((reg32_t *)(ADC_BASE + ADC_MR_OFF))) ///< Mode register address. +#define ADC_TRGEN 0 ///< Trigger enable. + +#define ADC_TRGSEL_TIOA0 0x00000000 ///< TIOA output of the timer counter channel 0. +#define ADC_TRGSEL_TIOA1 0x00000002 ///< TIOA output of the timer counter channel 1. +#define ADC_TRGSEL_TIOA2 0x00000004 ///< TIOA output of the timer counter channel 2. +#define ADC_TRGSEL_EXT 0x0000000C ///< External trigger. + +#define ADC_LOWRES 4 ///< Resolution 0: 10-bit, 1: 8-bit. +#define ADC_SLEEP 5 ///< Sleep mode. + +/** + * Prescaler rate selection. + * ADCClock = MCK / ((ADC_PRESCALER_VALUE + 1) * 2) + */ +#define ADC_PRESCALER_MASK 0x00003F00 ///< Prescaler rate selection mask. +#define ADC_PRESCALER_SHIFT 8 ///< Prescale rate selection shift. + +/** + * Start up timer. + * Startup time = (ADC_STARTUP_VALUE + 1) * 8 /ADCClock + */ +#define ADC_STARTUP_MASK 0x001F0000 ///< Start up timer mask. +#define ADC_STARTUP_SHIFT 16 ///< Start up timer shift. + + +/** + * Sample & hold time. + * Sample & hold time = (ADC_SHTIM_VALUE + 1) * 8 /ADCClock + */ +#define ADC_SHTIME_MASK 0x0F000000 ///< Sample & hold time mask. +#define ADC_SHTIME_SHIFT 24 ///< Sample & hold time shift. + + +/** + * ADC channel enable register + */ +#define ADC_CHER_OFF 0x00000010 ///< Channel enable register offeset. +#define ADC_CHER (*((reg32_t *)(ADC_BASE + ADC_CHER_OFF))) ///< Channel enable register address. + +/** + * ADC channel disable register + */ +#define ADC_CHDR_OFF 0x00000014 ///< Channel disable register offeset. +#define ADC_CHDR (*((reg32_t *)(ADC_BASE + ADC_CHDR_OFF))) ///< Channel disable register address. + +/** + * ADC channel status register + */ +#define ADC_CHSR_OFF 0x00000018 ///< Channel status register offeset. +#define ADC_CHSR (*((reg32_t *)(ADC_BASE + ADC_CHSR_OFF))) ///< Channel status register address. + +#define ADC_CH_MASK 0x000000FF ///< Channel mask. +#define ADC_CH0 0 ///< Channel 0 +#define ADC_CH1 1 ///< Channel 1 +#define ADC_CH2 2 ///< Channel 2 +#define ADC_CH3 3 ///< Channel 3 +#define ADC_CH4 4 ///< Channel 4 +#define ADC_CH5 5 ///< Channel 5 +#define ADC_CH6 6 ///< Channel 6 +#define ADC_CH7 7 ///< Channel 7 + +/** + * ADC status register + */ +#define ADC_SR_OFF 0x0000001C ///< Status register offeset. +#define ADC_SR (*((reg32_t *)(ADC_BASE + ADC_SR_OFF))) ///< Status register address. + +/** + * ADC Interrupt enable register. + */ +#define ADC_IER_OFF 0x00000024 ///< Interrupt enable register offeset. +#define ADC_IER (*((reg32_t *)(ADC_BASE + ADC_IER_OFF))) ///< Interrupt enable register. + +/** + * ADC Interrupt disable register. + */ +#define ADC_IDR_OFF 0x00000028 ///< Interrupt disable register offeset. +#define ADC_IDR (*((reg32_t *)(ADC_BASE + ADC_IDR_OFF))) ///< Interrupt disable register. + +/** + * ADC Interrupt mask register. + */ +#define ADC_IMR_OFF 0x0000002C ///< Interrupt mask register offeset. +#define ADC_IMR (*((reg32_t *)(ADC_BASE + ADC_IMR_OFF))) ///< Interrupt mask register. + +#define ADC_EOC_MASK 0x000000FF ///< End of converison mask. +#define ADC_EOC0 0 ///< End of conversion channel 0. +#define ADC_EOC1 1 ///< End of conversion channel 1. +#define ADC_EOC2 2 ///< End of conversion channel 2. +#define ADC_EOC3 3 ///< End of conversion channel 3. +#define ADC_EOC4 4 ///< End of conversion channel 4. +#define ADC_EOC5 5 ///< End of conversion channel 5. +#define ADC_EOC6 6 ///< End of conversion channel 6. +#define ADC_EOC7 7 ///< End of conversion channel 7. + +#define ADC_OVRE0 8 ///< Overrun error channel 0. +#define ADC_OVRE1 9 ///< Overrun error channel 1. +#define ADC_OVRE2 10 ///< Overrun error channel 2. +#define ADC_OVRE3 11 ///< Overrun error channel 3. +#define ADC_OVRE4 12 ///< Overrun error channel 4. +#define ADC_OVRE5 13 ///< Overrun error channel 5. +#define ADC_OVRE6 14 ///< Overrun error channel 6. +#define ADC_OVRE7 15 ///< Overrun error channel 7. + +#define ADC_DRDY 16 ///< Data ready. +#define ADC_GOVRE 17 ///< General overrun error. +#define ADC_ENDRX 18 ///< End of RX buffer. +#define ADC_RXBUFF 19 ///< Rx buffer full. + +/** + * ADC last convert data register. + */ +#define ADC_LCDR_OFF 0x00000020 ///< Last converted data register offeset. +#define ADC_LCDR (*((reg32_t *)(ADC_BASE + ADC_LCDR_OFF))) ///< Last converted data register. + +/** + * ADC channel data register. + * + * \{ + */ +#define ADC_CDR0_OFF 0x00000030 ///< Channel data register 0 offeset. +#define ADC_CDR1_OFF 0x00000034 ///< Channel data register 1 offeset. +#define ADC_CDR2_OFF 0x00000038 ///< Channel data register 2 offeset. +#define ADC_CDR3_OFF 0x0000003C ///< Channel data register 3 offeset. +#define ADC_CDR4_OFF 0x00000040 ///< Channel data register 4 offeset. +#define ADC_CDR5_OFF 0x00000044 ///< Channel data register 5 offeset. +#define ADC_CDR6_OFF 0x00000048 ///< Channel data register 6 offeset. +#define ADC_CDR7_OFF 0x0000004C ///< Channel data register 7 offeset. + +#define ADC_CDR0 (*((reg32_t *)(ADC_BASE + ADC_CDR0_OFF))) ///< Channel data register 0. +#define ADC_CDR1 (*((reg32_t *)(ADC_BASE + ADC_CDR1_OFF))) ///< Channel data register 1. +#define ADC_CDR2 (*((reg32_t *)(ADC_BASE + ADC_CDR2_OFF))) ///< Channel data register 2. +#define ADC_CDR3 (*((reg32_t *)(ADC_BASE + ADC_CDR3_OFF))) ///< Channel data register 3. +#define ADC_CDR4 (*((reg32_t *)(ADC_BASE + ADC_CDR4_OFF))) ///< Channel data register 4. +#define ADC_CDR5 (*((reg32_t *)(ADC_BASE + ADC_CDR5_OFF))) ///< Channel data register 5. +#define ADC_CDR6 (*((reg32_t *)(ADC_BASE + ADC_CDR6_OFF))) ///< Channel data register 6. +#define ADC_CDR7 (*((reg32_t *)(ADC_BASE + ADC_CDR7_OFF))) ///< Channel data register 7. +/* \} */ + +#endif /* AT91_ADC_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_aic.h b/2.5/bertos/cpu/arm/io/at91_aic.h new file mode 100644 index 00000000..8fdd2914 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_aic.h @@ -0,0 +1,223 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * AT91 advanced interrupt controller. + * This file is based on NUT/OS implementation. See license below. + */ + +/* + * Copyright (C) 2005-2006 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91_AIC_H +#define AT91_AIC_H + +#include + + + +/** + * Source mode register array. + */ +#define AIC_SMR(i) (*((reg32_t *)(AIC_BASE + (i) * 4))) + +/** + * Priority mask. + * Priority levels can be between 0 (lowest) and 7 (highest). + */ +#define AIC_PRIOR_MASK 0x00000007 + +/** + * Interrupt source type mask. + * Internal interrupts can level sensitive or edge triggered. + * + * External interrupts can triggered on positive or negative levels or + * on rising or falling edges. + */ +/*\{*/ +#define AIC_SRCTYPE_MASK 0x00000060 + +#define AIC_SRCTYPE_INT_LEVEL_SENSITIVE 0x00000000 ///< Internal level sensitive. +#define AIC_SRCTYPE_INT_EDGE_TRIGGERED 0x00000020 ///< Internal edge triggered. +#define AIC_SRCTYPE_EXT_LOW_LEVEL 0x00000000 ///< External low level. +#define AIC_SRCTYPE_EXT_NEGATIVE_EDGE 0x00000020 ///< External falling edge. +#define AIC_SRCTYPE_EXT_HIGH_LEVEL 0x00000040 ///< External high level. +#define AIC_SRCTYPE_EXT_POSITIVE_EDGE 0x00000060 ///< External rising edge. +/*\}*/ + + +/** + * Type for interrupt handlers. + */ +typedef void (*irq_handler_t)(void); + +/** Interrupt Source Vector Registers */ +/*\{*/ +/** Source vector register array. + * + * Stores the addresses of the corresponding interrupt handlers. + */ +#define AIC_SVR(i) (*((volatile irq_handler_t *)(AIC_BASE + 0x80 + (i) * 4))) +/*\}*/ + +/** Interrupt Vector Register */ +/*\{*/ +#define AIC_IVR_OFF 0x00000100 ///< IRQ vector register offset. +#define AIC_IVR (*((reg32_t *)(AIC_BASE + AIC_IVR_OFF))) ///< IRQ vector register address. +/*\}*/ + +/** Fast Interrupt Vector Register */ +/*\{*/ +#define AIC_FVR_OFF 0x00000104 ///< FIQ vector register offset. +#define AIC_FVR (*((reg32_t *)(AIC_BASE + AIC_FVR_OFF))) ///< FIQ vector register address. +/*\}*/ + +/** Interrupt Status Register */ +/*\{*/ +#define AIC_ISR_OFF 0x00000108 ///< Interrupt status register offset. +#define AIC_ISR (*((reg32_t *)(AIC_BASE + AIC_ISR_OFF))) ///< Interrupt status register address. +#define AIC_IRQID_MASK 0x0000001F ///< Current interrupt identifier mask. +/*\}*/ + +/** Interrupt Pending Register */ +/*\{*/ +#define AIC_IPR_OFF 0x0000010C ///< Interrupt pending register offset. +#define AIC_IPR (*((reg32_t *)(AIC_BASE + AIC_IPR_OFF))) ///< Interrupt pending register address. +/*\}*/ + +/** Interrupt Mask Register */ +/*\{*/ +#define AIC_IMR_OFF 0x00000110 ///< Interrupt mask register offset. +#define AIC_IMR (*((reg32_t *)(AIC_BASE + AIC_IMR_OFF))) ///< Interrupt mask register address. +/*\}*/ + +/** Interrupt Core Status Register */ +/*\{*/ +#define AIC_CISR_OFF 0x00000114 ///< Core interrupt status register offset. +#define AIC_CISR (*((reg32_t *)(AIC_BASE + AIC_CISR_OFF))) ///< Core interrupt status register address. +#define AIC_NFIQ 1 ///< Core FIQ Status +#define AIC_NIRQ 2 ///< Core IRQ Status +/*\}*/ + +/** Interrupt Enable Command Register */ +/*\{*/ +#define AIC_IECR_OFF 0x00000120 ///< Interrupt enable command register offset. +#define AIC_IECR (*((reg32_t *)(AIC_BASE + AIC_IECR_OFF))) ///< Interrupt enable command register address. +/*\}*/ + +/** Interrupt Disable Command Register */ +/*\{*/ +#define AIC_IDCR_OFF 0x00000124 ///< Interrupt disable command register offset. +#define AIC_IDCR (*((reg32_t *)(AIC_BASE + AIC_IDCR_OFF))) ///< Interrupt disable command register address. +/*\}*/ + +/** Interrupt Clear Command Register */ +/*\{*/ +#define AIC_ICCR_OFF 0x00000128 ///< Interrupt clear command register offset. +#define AIC_ICCR (*((reg32_t *)(AIC_BASE + AIC_ICCR_OFF))) ///< Interrupt clear command register address. +/*\}*/ + +/** Interrupt Set Command Register */ +/*\{*/ +#define AIC_ISCR_OFF 0x0000012C ///< Interrupt set command register offset. +#define AIC_ISCR (*((reg32_t *)(AIC_BASE + AIC_ISCR_OFF))) ///< Interrupt set command register address. +/*\}*/ + +/** End Of Interrupt Command Register */ +/*\{*/ +#define AIC_EOICR_OFF 0x00000130 ///< End of interrupt command register offset. +#define AIC_EOICR (*((reg32_t *)(AIC_BASE + AIC_EOICR_OFF))) ///< End of interrupt command register address. +/*\}*/ + +/** Spurious Interrupt Vector Register */ +/*\{*/ +#define AIC_SPU_OFF 0x00000134 ///< Spurious vector register offset. +#define AIC_SPU (*((reg32_t *)(AIC_BASE + AIC_SPU_OFF)== ///< Spurious vector register address. +/*\}*/ + +/** Debug Control Register */ +/*\{*/ +#define AIC_DCR_OFF 0x0000138 ///< Debug control register offset. +#define AIC_DCR (*((reg32_t *)(AIC_BASE + AIC_DCR_OFF))) ///< Debug control register address. +/*\}*/ + +/** Fast Forcing Enable Register */ +/*\{*/ +#define AIC_FFER_OFF 0x00000140 ///< Fast forcing enable register offset. +#define AIC_FFER (*((reg32_t *)(AIC_BASE + AIC_FFER_OFF))) ///< Fast forcing enable register address. +/*\}*/ + +/** Fast Forcing Disable Register */ +/*\{*/ +#define AIC_FFDR_OFF 0x00000144 ///< Fast forcing disable register address. +#define AIC_FFDR (*((reg32_t *)(AIC_BASE + AIC_FFDR_OFF))) ///< Fast forcing disable register address. +/*\}*/ + +/** Fast Forcing Status Register */ +/*\{*/ +#define AIC_FFSR_OFF 0x00000148 ///< Fast forcing status register address. +#define AIC_FFSR (*((reg32_t *)(AIC_BASE + AIC_FFSR_OFF))) ///< Fast forcing status register address. +/*\}*/ + +#endif /* AT91_AIC_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_dbgu.h b/2.5/bertos/cpu/arm/io/at91_dbgu.h new file mode 100644 index 00000000..5fa700de --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_dbgu.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * AT91 Debug unit. + * This file is based on NUT/OS implementation. See license below. + */ + +/* + * Copyright (C) 2005-2006 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ +#ifndef AT91_DBGU_H +#define AT91_DBGU_H + +#define DBGU_CR (*((reg32_t *)(DBGU_BASE + US_CR_OFF))) /// + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * AT91 Memory controller. + * This file is based on NUT/OS implementation. See license below. + */ + +/* + * Copyright (C) 2005-2006 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91_MC_H +#define AT91_MC_H + +#define MC_RCR_OFF 0x00000000 ///< MC remap control register offset. +#define MC_RCR (*((reg32_t *)(MC_BASE + MC_RCR_OFF))) ///< MC remap control register address. +#define MC_RCB 0 ///< Remap command. + +#define MC_ASR_OFF 0x00000004 ///< MC abort status register offset. +#define MC_ASR (*((reg32_t *)(MC_BASE + MC_ASR_OFF))) ///< MC abort status register address. +#define MC_UNDADD 0 ///< Undefined Addess Abort status. +#define MC_MISADD 1 ///< Misaligned Addess Abort status. +#define MC_ABTSZ_MASK 0x00000300 ///< Abort size status mask. +#define MC_ABTSZ_BYTE 0x00000000 ///< Byte size abort. +#define MC_ABTSZ_HWORD 0x00000100 ///< Half-word size abort. +#define MC_ABTSZ_WORD 0x00000200 ///< Word size abort. +#define MC_ABTTYP_MASK 0x00000C00 ///< Abort type status mask. +#define MC_ABTTYP_DATAR 0x00000000 ///< Data read abort. +#define MC_ABTTYP_DATAW 0x00000400 ///< Data write abort. +#define MC_ABTTYP_FETCH 0x00000800 ///< Code fetch abort. +#define MC_MST_PDC 0x00020000 ///< PDC abort source. +#define MC_MST_ARM 0x00040000 ///< ARM abort source. +#define MC_SVMST_PDC 0x02000000 ///< Saved PDC abort source. +#define MC_SVMST_ARM 0x04000000 ///< Saved ARM abort source. + +#define MC_AASR_OFF 0x00000008 ///< MC abort address status register offset. +#define MC_AASR (*((reg32_t *)(MC_BASE + MC_AASR_OFF))) ///< MC abort address status register address. + +#define MC_FMR_OFF 0x00000060 ///< MC flash mode register offset. +#define MC_FMR (*((reg32_t *)(MC_BASE + MC_FMR_OFF))) ///< MC flash mode register address. +#define MC_FRDY 0 ///< Flash ready. +#define MC_LOCKE 2 ///< Lock error. +#define MC_PROGE 3 ///< Programming error. +#define MC_NEBP 7 ///< No erase before programming. +#define MC_FWS_MASK 0x00000300 ///< Flash wait state mask. +#define MC_FWS_1R2W 0x00000000 ///< 1 cycle for read, 2 for write operations. +#define MC_FWS_2R3W 0x00000100 ///< 2 cycles for read, 3 for write operations. +#define MC_FWS_3R4W 0x00000200 ///< 3 cycles for read, 4 for write operations. +#define MC_FWS_4R4W 0x00000300 ///< 4 cycles for read and write operations. +#define MC_FMCN_MASK 0x00FF0000 ///< Flash microsecond cycle number mask. +#define MC_FMCN_SHIFT 16 ///< Flash microsecond cycle number shift. + +#define MC_FCR_OFF 0x00000064 ///< MC flash command register offset. +#define MC_FCR (*((reg32_t *)(MC_BASE + MC_FCR_OFF))) ///< MC flash command register address. +#define MC_FCMD_MASK 0x0000000F ///< Flash command mask. +#define MC_FCMD_NOP 0x00000000 ///< No command. +#define MC_FCMD_WP 0x00000001 ///< Write page. +#define MC_FCMD_SLB 0x00000002 ///< Set lock bit. +#define MC_FCMD_WPL 0x00000003 ///< Write page and lock. +#define MC_FCMD_CLB 0x00000004 ///< Clear lock bit. +#define MC_FCMD_EA 0x00000008 ///< Erase all. +#define MC_FCMD_SGPB 0x0000000B ///< Set general purpose NVM bit. +#define MC_FCMD_CGPB 0x0000000D ///< Clear general purpose NVM bit. +#define MC_FCMD_SSB 0x0000000F ///< Set security bit. +#define MC_PAGEN_MASK 0x0003FF00 ///< Page number mask. +#define MC_KEY 0x5A000000 ///< Writing protect key. + +#define MC_FSR_OFF 0x00000068 ///< MC flash status register offset. +#define MC_FSR (*((reg32_t *)(MC_BASE + MC_FSR_OFF))) ///< MC flash status register address. +#define MC_SECURITY 4 ///< Security bit status. + +#define MC_GPNVM0 8 ///< General purpose NVM bit 0. +#define MC_GPNVM1 9 ///< General purpose NVM bit 1. +#define MC_GPNVM2 10 ///< General purpose NVM bit 2. + +#define MC_LOCKS0 16 ///< Lock region 0 lock status. +#define MC_LOCKS1 17 ///< Lock region 1 lock status. +#define MC_LOCKS2 18 ///< Lock region 2 lock status. +#define MC_LOCKS3 19 ///< Lock region 3 lock status. +#define MC_LOCKS4 20 ///< Lock region 4 lock status. +#define MC_LOCKS5 21 ///< Lock region 5 lock status. +#define MC_LOCKS6 22 ///< Lock region 6 lock status. +#define MC_LOCKS7 23 ///< Lock region 7 lock status. +#define MC_LOCKS8 24 ///< Lock region 8 lock status. +#define MC_LOCKS9 25 ///< Lock region 9 lock status. +#define MC_LOCKS10 26 ///< Lock region 10 lock status. +#define MC_LOCKS11 27 ///< Lock region 11 lock status. +#define MC_LOCKS12 28 ///< Lock region 12 lock status. +#define MC_LOCKS13 29 ///< Lock region 13 lock status. +#define MC_LOCKS14 30 ///< Lock region 14 lock status. +#define MC_LOCKS15 31 ///< Lock region 15 lock status. + +#endif /* AT91_MC_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_pio.h b/2.5/bertos/cpu/arm/io/at91_pio.h new file mode 100644 index 00000000..3aa47565 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_pio.h @@ -0,0 +1,297 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * AT91 Parallel input/output controller. + * This file is based on NUT/OS implementation. See license below. + */ + +/* + * Copyright (C) 2005-2006 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91_PIO_H +#define AT91_PIO_H + +/** PIO Register Offsets */ +/*\{*/ +#define PIO_PER_OFF 0x00000000 ///< PIO enable register offset. +#define PIO_PDR_OFF 0x00000004 ///< PIO disable register offset. +#define PIO_PSR_OFF 0x00000008 ///< PIO status register offset. +#define PIO_OER_OFF 0x00000010 ///< Output enable register offset. +#define PIO_ODR_OFF 0x00000014 ///< Output disable register offset. +#define PIO_OSR_OFF 0x00000018 ///< Output status register offset. +#define PIO_IFER_OFF 0x00000020 ///< Input filter enable register offset. +#define PIO_IFDR_OFF 0x00000024 ///< Input filter disable register offset. +#define PIO_IFSR_OFF 0x00000028 ///< Input filter status register offset. +#define PIO_SODR_OFF 0x00000030 ///< Set output data register offset. +#define PIO_CODR_OFF 0x00000034 ///< Clear output data register offset. +#define PIO_ODSR_OFF 0x00000038 ///< Output data status register offset. +#define PIO_PDSR_OFF 0x0000003C ///< Pin data status register offset. +#define PIO_IER_OFF 0x00000040 ///< Interrupt enable register offset. +#define PIO_IDR_OFF 0x00000044 ///< Interrupt disable register offset. +#define PIO_IMR_OFF 0x00000048 ///< Interrupt mask register offset. +#define PIO_ISR_OFF 0x0000004C ///< Interrupt status register offset. +#if PIO_HAS_MULTIDRIVER +#define PIO_MDER_OFF 0x00000050 ///< Multi-driver enable register offset. +#define PIO_MDDR_OFF 0x00000054 ///< Multi-driver disable register offset. +#define PIO_MDSR_OFF 0x00000058 ///< Multi-driver status register offset. +#endif /* PIO_HAS_MULTIDRIVER */ +#if PIO_HAS_PULLUP +#define PIO_PUDR_OFF 0x00000060 ///< Pull-up disable register offset. +#define PIO_PUER_OFF 0x00000064 ///< Pull-up enable register offset. +#define PIO_PUSR_OFF 0x00000068 ///< Pull-up status register offset. +#endif /* PIO_HAS_PULLUP */ +#if PIO_HAS_PERIPHERALSELECT +#define PIO_ASR_OFF 0x00000070 ///< PIO peripheral A select register offset. +#define PIO_BSR_OFF 0x00000074 ///< PIO peripheral B select register offset. +#define PIO_ABSR_OFF 0x00000078 ///< PIO peripheral AB status register offset. +#endif /* PIO_HAS_PERIPHERALSELECT */ +#if PIO_HAS_OUTPUTWRITEENABLE +#define PIO_OWER_OFF 0x000000A0 ///< PIO output write enable register offset. +#define PIO_OWDR_OFF 0x000000A4 ///< PIO output write disable register offset. +#define PIO_OWSR_OFF 0x000000A8 ///< PIO output write status register offset. +#endif /* PIO_HAS_OUTPUTWRITEENABLE */ +/*\}*/ + +/** Single PIO Register Addresses */ +/*\{*/ +#if defined(PIO_BASE) + #define PIO_ACCESS(offset) (*((reg32_t *)(PIO_BASE + (offset)))) + + #define PIO_PER PIO_ACCESS(PIO_PER_OFF) ///< PIO enable register address. + #define PIO_PDR PIO_ACCESS(PIO_PDR_OFF) ///< PIO disable register address. + #define PIO_PSR PIO_ACCESS(PIO_PSR_OFF) ///< PIO status register address. + #define PIO_OER PIO_ACCESS(PIO_OER_OFF) ///< Output enable register address. + #define PIO_ODR PIO_ACCESS(PIO_ODR_OFF) ///< Output disable register address. + #define PIO_OSR PIO_ACCESS(PIO_OSR_OFF) ///< Output status register address. + #define PIO_IFER PIO_ACCESS(PIO_IFER_OFF) ///< Input filter enable register address. + #define PIO_IFDR PIO_ACCESS(PIO_IFDR_OFF) ///< Input filter disable register address. + #define PIO_IFSR PIO_ACCESS(PIO_IFSR_OFF) ///< Input filter status register address. + #define PIO_SODR PIO_ACCESS(PIO_SODR_OFF) ///< Set output data register address. + #define PIO_CODR PIO_ACCESS(PIO_CODR_OFF) ///< Clear output data register address. + #define PIO_ODSR PIO_ACCESS(PIO_ODSR_OFF) ///< Output data status register address. + #define PIO_PDSR PIO_ACCESS(PIO_PDSR_OFF) ///< Pin data status register address. + #define PIO_IER PIO_ACCESS(PIO_IER_OFF) ///< Interrupt enable register address. + #define PIO_IDR PIO_ACCESS(PIO_IDR_OFF) ///< Interrupt disable register address. + #define PIO_IMR PIO_ACCESS(PIO_IMR_OFF) ///< Interrupt mask register address. + #define PIO_ISR PIO_ACCESS(PIO_ISR_OFF) ///< Interrupt status register address. + #if PIO_HAS_MULTIDRIVER + #define PIO_MDER PIO_ACCESS(PIO_MDER_OFF) ///< Multi-driver enable register address. + #define PIO_MDDR PIO_ACCESS(PIO_MDDR_OFF) ///< Multi-driver disable register address. + #define PIO_MDSR PIO_ACCESS(PIO_MDSR_OFF) ///< Multi-driver status register address. + #endif /* PIO_HAS_MULTIDRIVER */ + #if PIO_HAS_PULLUP + #define PIO_PUDR PIO_ACCESS(PIO_PUDR_OFF) ///< Pull-up disable register address. + #define PIO_PUER PIO_ACCESS(PIO_PUER_OFF) ///< Pull-up enable register address. + #define PIO_PUSR PIO_ACCESS(PIO_PUSR_OFF) ///< Pull-up status register address. + #endif /* PIO_HAS_PULLUP */ + #if PIO_HAS_PERIPHERALSELECT + #define PIO_ASR PIO_ACCESS(PIO_ASR_OFF) ///< PIO peripheral A select register address. + #define PIO_BSR PIO_ACCESS(PIO_BSR_OFF) ///< PIO peripheral B select register address. + #define PIO_ABSR PIO_ACCESS(PIO_ABSR_OFF) ///< PIO peripheral AB status register address. + #endif /* PIO_HAS_PERIPHERALSELECT */ + #if PIO_HAS_OUTPUTWRITEENABLE + #define PIO_OWER PIO_ACCESS(PIO_OWER_OFF) ///< PIO output write enable register address. + #define PIO_OWDR PIO_ACCESS(PIO_OWDR_OFF) ///< PIO output write disable register address. + #define PIO_OWSR PIO_ACCESS(PIO_OWSR_OFF) ///< PIO output write status register address. + #endif /* PIO_HAS_OUTPUTWRITEENABLE */ +#endif /* PIO_BASE */ +/*\}*/ + +/** PIO A Register Addresses */ +/*\{*/ +#if defined(PIOA_BASE) + #define PIOA_ACCESS(offset) (*((reg32_t *)(PIOA_BASE + (offset)))) + + #define PIOA_PER PIOA_ACCESS(PIO_PER_OFF) ///< PIO enable register address. + #define PIOA_PDR PIOA_ACCESS(PIO_PDR_OFF) ///< PIO disable register address. + #define PIOA_PSR PIOA_ACCESS(PIO_PSR_OFF) ///< PIO status register address. + #define PIOA_OER PIOA_ACCESS(PIO_OER_OFF) ///< Output enable register address. + #define PIOA_ODR PIOA_ACCESS(PIO_ODR_OFF) ///< Output disable register address. + #define PIOA_OSR PIOA_ACCESS(PIO_OSR_OFF) ///< Output status register address. + #define PIOA_IFER PIOA_ACCESS(PIO_IFER_OFF) ///< Input filter enable register address. + #define PIOA_IFDR PIOA_ACCESS(PIO_IFDR_OFF) ///< Input filter disable register address. + #define PIOA_IFSR PIOA_ACCESS(PIO_IFSR_OFF) ///< Input filter status register address. + #define PIOA_SODR PIOA_ACCESS(PIO_SODR_OFF) ///< Set output data register address. + #define PIOA_CODR PIOA_ACCESS(PIO_CODR_OFF) ///< Clear output data register address. + #define PIOA_ODSR PIOA_ACCESS(PIO_ODSR_OFF) ///< Output data status register address. + #define PIOA_PDSR PIOA_ACCESS(PIO_PDSR_OFF) ///< Pin data status register address. + #define PIOA_IER PIOA_ACCESS(PIO_IER_OFF) ///< Interrupt enable register address. + #define PIOA_IDR PIOA_ACCESS(PIO_IDR_OFF) ///< Interrupt disable register address. + #define PIOA_IMR PIOA_ACCESS(PIO_IMR_OFF) ///< Interrupt mask register address. + #define PIOA_ISR PIOA_ACCESS(PIO_ISR_OFF) ///< Interrupt status register address. + #if PIO_HAS_MULTIDRIVER + #define PIOA_MDER PIOA_ACCESS(PIO_MDER_OFF) ///< Multi-driver enable register address. + #define PIOA_MDDR PIOA_ACCESS(PIO_MDDR_OFF) ///< Multi-driver disable register address. + #define PIOA_MDSR PIOA_ACCESS(PIO_MDSR_OFF) ///< Multi-driver status register address. + #endif /* PIO_HAS_MULTIDRIVER */ + #if PIO_HAS_PULLUP + #define PIOA_PUDR PIOA_ACCESS(PIO_PUDR_OFF) ///< Pull-up disable register address. + #define PIOA_PUER PIOA_ACCESS(PIO_PUER_OFF) ///< Pull-up enable register address. + #define PIOA_PUSR PIOA_ACCESS(PIO_PUSR_OFF) ///< Pull-up status register address. + #endif /* PIO_HAS_PULLUP */ + #if PIO_HAS_PERIPHERALSELECT + #define PIOA_ASR PIOA_ACCESS(PIO_ASR_OFF) ///< PIO peripheral A select register address. + #define PIOA_BSR PIOA_ACCESS(PIO_BSR_OFF) ///< PIO peripheral B select register address. + #define PIOA_ABSR PIOA_ACCESS(PIO_ABSR_OFF) ///< PIO peripheral AB status register address. + #endif /* PIO_HAS_PERIPHERALSELECT */ + #if PIO_HAS_OUTPUTWRITEENABLE + #define PIOA_OWER PIOA_ACCESS(PIO_OWER_OFF) ///< PIO output write enable register address. + #define PIOA_OWDR PIOA_ACCESS(PIO_OWDR_OFF) ///< PIO output write disable register address. + #define PIOA_OWSR PIOA_ACCESS(PIO_OWSR_OFF) ///< PIO output write status register address. + #endif /* PIO_HAS_OUTPUTWRITEENABLE */ +#endif /* PIOA_BASE */ +/*\}*/ + +/** PIO B Register Addresses */ +/*\{*/ +#if defined(PIOB_BASE) + #define PIOB_ACCESS(offset) (*((reg32_t *)(PIOB_BASE + (offset)))) + + #define PIOB_PER PIOB_ACCESS(PIO_PER_OFF) ///< PIO enable register address. + #define PIOB_PDR PIOB_ACCESS(PIO_PDR_OFF) ///< PIO disable register address. + #define PIOB_PSR PIOB_ACCESS(PIO_PSR_OFF) ///< PIO status register address. + #define PIOB_OER PIOB_ACCESS(PIO_OER_OFF) ///< Output enable register address. + #define PIOB_ODR PIOB_ACCESS(PIO_ODR_OFF) ///< Output disable register address. + #define PIOB_OSR PIOB_ACCESS(PIO_OSR_OFF) ///< Output status register address. + #define PIOB_IFER PIOB_ACCESS(PIO_IFER_OFF) ///< Input filter enable register address. + #define PIOB_IFDR PIOB_ACCESS(PIO_IFDR_OFF) ///< Input filter disable register address. + #define PIOB_IFSR PIOB_ACCESS(PIO_IFSR_OFF) ///< Input filter status register address. + #define PIOB_SODR PIOB_ACCESS(PIO_SODR_OFF) ///< Set output data register address. + #define PIOB_CODR PIOB_ACCESS(PIO_CODR_OFF) ///< Clear output data register address. + #define PIOB_ODSR PIOB_ACCESS(PIO_ODSR_OFF) ///< Output data status register address. + #define PIOB_PDSR PIOB_ACCESS(PIO_PDSR_OFF) ///< Pin data status register address. + #define PIOB_IER PIOB_ACCESS(PIO_IER_OFF) ///< Interrupt enable register address. + #define PIOB_IDR PIOB_ACCESS(PIO_IDR_OFF) ///< Interrupt disable register address. + #define PIOB_IMR PIOB_ACCESS(PIO_IMR_OFF) ///< Interrupt mask register address. + #define PIOB_ISR PIOB_ACCESS(PIO_ISR_OFF) ///< Interrupt status register address. + #if PIO_HAS_MULTIDRIVER + #define PIOB_MDER PIOB_ACCESS(PIO_MDER_OFF) ///< Multi-driver enable register address. + #define PIOB_MDDR PIOB_ACCESS(PIO_MDDR_OFF) ///< Multi-driver disable register address. + #define PIOB_MDSR PIOB_ACCESS(PIO_MDSR_OFF) ///< Multi-driver status register address. + #endif /* PIO_HAS_MULTIDRIVER */ + #if PIO_HAS_PULLUP + #define PIOB_PUDR PIOB_ACCESS(PIO_PUDR_OFF) ///< Pull-up disable register address. + #define PIOB_PUER PIOB_ACCESS(PIO_PUER_OFF) ///< Pull-up enable register address. + #define PIOB_PUSR PIOB_ACCESS(PIO_PUSR_OFF) ///< Pull-up status register address. + #endif /* PIO_HAS_PULLUP */ + #if PIO_HAS_PERIPHERALSELECT + #define PIOB_ASR PIOB_ACCESS(PIO_ASR_OFF) ///< PIO peripheral A select register address. + #define PIOB_BSR PIOB_ACCESS(PIO_BSR_OFF) ///< PIO peripheral B select register address. + #define PIOB_ABSR PIOB_ACCESS(PIO_ABSR_OFF) ///< PIO peripheral AB status register address. + #endif /* PIO_HAS_PERIPHERALSELECT */ + #if PIO_HAS_OUTPUTWRITEENABLE + #define PIOB_OWER PIOB_ACCESS(PIO_OWER_OFF) ///< PIO output write enable register address. + #define PIOB_OWDR PIOB_ACCESS(PIO_OWDR_OFF) ///< PIO output write disable register address. + #define PIOB_OWSR PIOB_ACCESS(PIO_OWSR_OFF) ///< PIO output write status register address. + #endif /* PIO_HAS_OUTPUTWRITEENABLE */ +#endif /* PIOB_BASE */ +/*\}*/ + +/** PIO C Register Addresses */ +/*\{*/ +#if defined(PIOC_BASE) + #define PIOC_ACCESS(offset) (*((reg32_t *)(PIOC_BASE + (offset)))) + + #define PIOC_PER PIOC_ACCESS(PIO_PER_OFF) ///< PIO enable register address. + #define PIOC_PDR PIOC_ACCESS(PIO_PDR_OFF) ///< PIO disable register address. + #define PIOC_PSR PIOC_ACCESS(PIO_PSR_OFF) ///< PIO status register address. + #define PIOC_OER PIOC_ACCESS(PIO_OER_OFF) ///< Output enable register address. + #define PIOC_ODR PIOC_ACCESS(PIO_ODR_OFF) ///< Output disable register address. + #define PIOC_OSR PIOC_ACCESS(PIO_OSR_OFF) ///< Output status register address. + #define PIOC_IFER PIOC_ACCESS(PIO_IFER_OFF) ///< Input filter enable register address. + #define PIOC_IFDR PIOC_ACCESS(PIO_IFDR_OFF) ///< Input filter disable register address. + #define PIOC_IFSR PIOC_ACCESS(PIO_IFSR_OFF) ///< Input filter status register address. + #define PIOC_SODR PIOC_ACCESS(PIO_SODR_OFF) ///< Set output data register address. + #define PIOC_CODR PIOC_ACCESS(PIO_CODR_OFF) ///< Clear output data register address. + #define PIOC_ODSR PIOC_ACCESS(PIO_ODSR_OFF) ///< Output data status register address. + #define PIOC_PDSR PIOC_ACCESS(PIO_PDSR_OFF) ///< Pin data status register address. + #define PIOC_IER PIOC_ACCESS(PIO_IER_OFF) ///< Interrupt enable register address. + #define PIOC_IDR PIOC_ACCESS(PIO_IDR_OFF) ///< Interrupt disable register address. + #define PIOC_IMR PIOC_ACCESS(PIO_IMR_OFF) ///< Interrupt mask register address. + #define PIOC_ISR PIOC_ACCESS(PIO_ISR_OFF) ///< Interrupt status register address. + #if PIO_HAS_MULTIDRIVER + #define PIOC_MDER PIOC_ACCESS(PIO_MDER_OFF) ///< Multi-driver enable register address. + #define PIOC_MDDR PIOC_ACCESS(PIO_MDDR_OFF) ///< Multi-driver disable register address. + #define PIOC_MDSR PIOC_ACCESS(PIO_MDSR_OFF) ///< Multi-driver status register address. + #endif /* PIO_HAS_MULTIDRIVER */ + #if PIO_HAS_PULLUP + #define PIOC_PUDR PIOC_ACCESS(PIO_PUDR_OFF) ///< Pull-up disable register address. + #define PIOC_PUER PIOC_ACCESS(PIO_PUER_OFF) ///< Pull-up enable register address. + #define PIOC_PUSR PIOC_ACCESS(PIO_PUSR_OFF) ///< Pull-up status register address. + #endif /* PIO_HAS_PULLUP */ + #if PIO_HAS_PERIPHERALSELECT + #define PIOC_ASR PIOC_ACCESS(PIO_ASR_OFF) ///< PIO peripheral A select register address. + #define PIOC_BSR PIOC_ACCESS(PIO_BSR_OFF) ///< PIO peripheral B select register address. + #define PIOC_ABSR PIOC_ACCESS(PIO_ABSR_OFF) ///< PIO peripheral AB status register address. + #endif /* PIO_HAS_PERIPHERALSELECT */ + #if PIO_HAS_OUTPUTWRITEENABLE + #define PIOC_OWER PIOC_ACCESS(PIO_OWER_OFF) ///< PIO output write enable register address. + #define PIOC_OWDR PIOC_ACCESS(PIO_OWDR_OFF) ///< PIO output write disable register address. + #define PIOC_OWSR PIOC_ACCESS(PIO_OWSR_OFF) ///< PIO output write status register address. + #endif /* PIO_HAS_OUTPUTWRITEENABLE */ +#endif /* PIOC_BASE */ +/*\}*/ + +#endif /* AT91_PIO_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_pit.h b/2.5/bertos/cpu/arm/io/at91_pit.h new file mode 100644 index 00000000..9bfc3f98 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_pit.h @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * AT91 periodic interval timer. + * This file is based on NUT/OS implementation. See license below. + */ + +/* + * Copyright (C) 2007 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91_PIT_H +#define AT91_PIT_H + +#include +/** + *Periodic Inverval Timer Mode Register + *\{ + */ +#define PIT_MR_OFF 0x00000000 ///< Mode register offset. +#define PIT_MR (*((reg32_t *)(PIT_BASE + PIT_MR_OFF))) ///< Mode register address. + +#define PIV_MASK 0x000FFFFF ///< Periodic interval value mask. +#define PIV_SHIFT 0 ///< Periodic interval value shift. +#define PITEN 24 ///< Periodic interval timer enable. +#define PITIEN 25 ///< Periodic interval timer interrupt enable. +/*\}*/ + +/** + * Periodic Inverval Timer Status Register + *\{ + */ +#define PIT_SR_OFF 0x00000004 ///< Status register offset. +#define PIT_SR (*((reg32_t *)(PIT_BASE + PIT_SR_OFF))) ///< Status register address. + +#define PITS 0 ///< Timer has reached PIV. +/*\}*/ + +/** + * Periodic Inverval Timer Value and Image Registers + *\{ + */ +#define PIVR_OFF 0x00000008 ///< Value register offset. +#define PIVR (*((reg32_t *)(PIT_BASE + PIVR_OFF))) ///< Value register address. + +#define PIIR_OFF 0x0000000C ///< Image register offset. +#define PIIR (*((reg32_t *)(PIT_BASE + PIIR_OFF))) ///< Image register address. +#define CPIV_MASK 0x000FFFFF ///< Current periodic interval value mask. +#define CPIV_SHIFT 0 ///< Current periodic interval value SHIFT. +#define PICNT_MASK 0xFFF00000 ///< Periodic interval counter mask. +#define PICNT_SHIFT 20 ///< Periodic interval counter LSB. +/*\}*/ + +#endif /* AT91_PIT_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_pmc.h b/2.5/bertos/cpu/arm/io/at91_pmc.h new file mode 100644 index 00000000..b7d5b4f5 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_pmc.h @@ -0,0 +1,195 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * AT91 power management controller. + * This file is based on NUT/OS implementation. See license below. + */ + +/* + * Copyright (C) 2005-2006 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91_PMC_H +#define AT91_PMC_H + +/** System Clock Enable, Disable and Status Register */ +/*\{*/ +#define PMC_SCER_OFF 0x00000000 ///< System clock enable register offset. +#define PMC_SCER (*((reg32_t *)(PMC_BASE + PMC_SCER_OFF))) ///< System clock enable register address. +#define PMC_SCDR_OFF 0x00000004 ///< System clock disable register offset. +#define PMC_SCDR (*((reg32_t *)(PMC_BASE + PMC_SCDR_OFF))) ///< System clock disable register address. +#define PMC_SCSR_OFF 0x00000008 ///< System clock status register offset. +#define PMC_SCSR (*((reg32_t *)(PMC_BASE + PMC_SCSR_OFF))) ///< System clock status register address. + +#define PMC_PCK 0 ///< Processor clock. +#define PMC_UDP 7 ///< USB device port clock. +#define PMC_PCK0 8 ///< Programmable clock 0 output. +#define PMC_PCK1 9 ///< Programmable clock 1 output. +#define PMC_PCK2 10 ///< Programmable clock 2 output. +/*\}*/ + +/** Peripheral Clock Enable, Disable and Status Register */ +/*\{*/ +#define PMC_PCER_OFF 0x00000010 ///< Peripheral clock enable register offset. +#define PMC_PCER (*((reg32_t *)(PMC_BASE + PMC_PCER_OFF))) ///< Peripheral clock enable register address. +#define PMC_PCDR_OFF 0x00000014 ///< Peripheral clock disable register offset. +#define PMC_PCDR (*((reg32_t *)(PMC_BASE + PMC_PCDR_OFF))) ///< Peripheral clock disable register address. +#define PMC_PCSR_OFF 0x00000018 ///< Peripheral clock status register offset. +#define PMC_PCSR (*((reg32_t *)(PMC_BASE + PMC_PCSR_OFF))) ///< Peripheral clock status register address. +/*\}*/ + +/** Clock Generator Main Oscillator Register */ +/*\{*/ +#define CKGR_MOR_OFF 0x00000020 ///< Main oscillator register offset. +#define CKGR_MOR (*((reg32_t *)(PMC_BASE + CKGR_MOR_OFF))) ///< Main oscillator register address. + +#define CKGR_MOSCEN 0 ///< Main oscillator enable. +#define CKGR_OSCBYPASS 1 ///< Main oscillator bypass. +#define CKGR_OSCOUNT_MASK 0x0000FF00 ///< Main oscillator start-up time mask. +#define CKGR_OSCOUNT_SHIFT 8 ///< Main oscillator start-up time LSB. +/*\}*/ + +/** Clock Generator Main Clock Frequency Register */ +/*\{*/ +#define CKGR_MCFR_OFF 0x00000024 ///< Main clock frequency register offset. +#define CKGR_MCFR (*((reg32_t *)(PMC_BASE + CKGR_MCFR_OFF))) ///< Main clock frequency register address. + +#define CKGR_MAINF_MASK 0x0000FFFF ///< Main clock frequency mask mask. +#define CKGR_MAINRDY 16 ///< Main clock ready. +/*\}*/ + +/** PLL Registers */ +/*\{*/ +#define CKGR_PLLR_OFF 0x0000002C ///< Clock generator PLL register offset. +#define CKGR_PLLR (*((reg32_t *)(PMC_BASE + CKGR_PLLR_OFF))) ///< Clock generator PLL register address. + +#define CKGR_DIV_MASK 0x000000FF ///< Divider. +#define CKGR_DIV_SHIFT 0 ///< Least significant bit of the divider. +#define CKGR_DIV_0 0x00000000 ///< Divider output is 0. +#define CKGR_DIV_BYPASS 0x00000001 ///< Divider is bypassed. +#define CKGR_PLLCOUNT_MASK 0x00003F00 ///< PLL counter mask. +#define CKGR_PLLCOUNT_SHIFT 8 ///< PLL counter LSB. + +#define CKGR_OUT_MASK 0x0000C000 ///< PLL output frequency range. +#define CKGR_OUT_0 0x00000000 ///< Please refer to the PLL datasheet. +#define CKGR_OUT_1 0x00004000 ///< Please refer to the PLL datasheet. +#define CKGR_OUT_2 0x00008000 ///< Please refer to the PLL datasheet. +#define CKGR_OUT_3 0x0000C000 ///< Please refer to the PLL datasheet. +#define CKGR_MUL_MASK 0x07FF0000 ///< PLL multiplier. +#define CKGR_MUL_SHIFT 16 ///< Least significant bit of the PLL multiplier. + +#define CKGR_USBDIV_MASK 0x30000000 ///< Divider for USB clocks. +#define CKGR_USBDIV_1 0x00000000 ///< Divider output is PLL clock output. +#define CKGR_USBDIV_2 0x10000000 ///< Divider output is PLL clock output divided by 2. +#define CKGR_USBDIV_4 0x20000000 ///< Divider output is PLL clock output divided by 4. +/*\}*/ + +/** Master Clock Register */ +/*\{*/ +#define PMC_MCKR_OFF 0x00000030 ///< Master clock register offset. +#define PMC_MCKR (*((reg32_t *)(PMC_BASE + PMC_MCKR_OFF))) ///< Master clock register address. + +#define PMC_PCKR0_OFF 0x00000040 ///< Programmable clock 0 register offset. +#define PMC_PCKR0 (*((reg32_t *)(PMC_BASE + PMC_PCKR0_OFF))) ///< Programmable clock 0 register address. +#define PMC_PCKR1_OFF 0x00000044 ///< Programmable clock 1 register offset. +#define PMC_PCKR1 (*((reg32_t *)(PMC_BASE + PMC_PCKR1_OFF))) ///< Programmable clock 1 register address. +#define PMC_PCKR2_OFF 0x00000048 ///< Programmable clock 2 register offset. +#define PMC_PCKR2 (*((reg32_t *)(PMC_BASE + PMC_PCKR2_OFF))) ///< Programmable clock 2 register address. + +#define PMC_CSS_MASK 0x00000003 ///< Clock selection mask. +#define PMC_CSS_SLOW_CLK 0x00000000 ///< Slow clock selected. +#define PMC_CSS_MAIN_CLK 0x00000001 ///< Main clock selected. +#define PMC_CSS_PLL_CLK 0x00000003 ///< PLL clock selected. + +#define PMC_PRES_MASK 0x0000001C ///< Clock prescaler mask. +#define PMC_PRES_SHIFT 2 ///< Clock prescaler LSB. +#define PMC_PRES_CLK 0x00000000 ///< Selected clock, not divided. +#define PMC_PRES_CLK_2 0x00000004 ///< Selected clock divided by 2. +#define PMC_PRES_CLK_4 0x00000008 ///< Selected clock divided by 4. +#define PMC_PRES_CLK_8 0x0000000C ///< Selected clock divided by 8. +#define PMC_PRES_CLK_16 0x00000010 ///< Selected clock divided by 16. +#define PMC_PRES_CLK_32 0x00000014 ///< Selected clock divided by 32. +#define PMC_PRES_CLK_64 0x00000018 ///< Selected clock divided by 64. +/*\}*/ + +/** Power Management Status and Interrupt Registers */ +/*\{*/ +#define PMC_IER_OFF 0x00000060 ///< Interrupt enable register offset. +#define PMC_IER (*((reg32_t *)(PMC_BASE + PMC_IER_OFF))) ///< Interrupt enable register address. +#define PMC_IDR_OFF 0x00000064 ///< Interrupt disable register offset. +#define PMC_IDR (*((reg32_t *)(PMC_BASE + PMC_IDR_OFF))) ///< Interrupt disable register address. +#define PMC_SR_OFF 0x00000068 ///< Status register offset. +#define PMC_SR (*((reg32_t *)(PMC_BASE + PMC_SR_OFF))) ///< Status register address. +#define PMC_IMR_OFF 0x0000006C ///< Interrupt mask register offset. +#define PMC_IMR (*((reg32_t *)(PMC_BASE + PMC_IMR_OFF))) ///< Interrupt mask register address. + +#define PMC_MOSCS 0 ///< Main oscillator. +#define PMC_LOCK 2 ///< PLL lock. +#define PMC_MCKRDY 3 ///< Master clock ready. +#define PMC_PCKRDY0 8 ///< Programmable clock 0 ready. +#define PMC_PCKRDY1 9 ///< Programmable clock 1 ready. +#define PMC_PCKRDY2 10 ///< Programmable clock 2 ready. +/*\}*/ + +#endif /* AT91_PMC_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_pwm.h b/2.5/bertos/cpu/arm/io/at91_pwm.h new file mode 100644 index 00000000..f6502f13 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_pwm.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * AT91SAM7 Pulse Width Modulation Controller. + */ + +#ifndef AT91_PWM_H +#define AT91_PWM_H + +/** + * PWM Mode Register. + */ +/*\{*/ +#define PWM_MR_OFF 0x00000000 ///< PWM Mode Register offset. +#define PWM_MR (*((reg32_t *)(PWMC_BASE + PWM_MR_OFF))) ///< PWM Mode Register. +#define PWM_MR_DIVA_MASK 0x000000FF ///< PWM Mode Divide factor A Mask. +#define PWM_MR_DIVA_SHIFT 0 ///< PWM Mode Divide factor A LSB. +#define PWM_MR_DIVB_MASK 0x00FF0000 ///< PWM Mode Divide factor B Mask. +#define PWM_MR_DIVB_SHIFT 16 ///< PWM Mode Divide factor B LSB. + +#define PWM_MR_PREA_MASK 0x00000F00 ///< PWM Mode prescaler A Mask. +#define PWM_MR_PREA_SHIFT 8 ///< PWM Mode prescaler A LSB. +#define PWM_MR_PREB_MASK 0x0F000000 ///< PWM Mode prescaler B Mask. +#define PWM_MR_PREB_SHIFT 24 ///< PWM Mode prescaler B LSB. + +#define PWM_MR_PRE_MCK 0 ///< PWM Mode prescaler set to MCK. +#define PWM_MR_PRE_MCK_DIV2 1 ///< PWM Mode prescaler set to MCK/2. +#define PWM_MR_PRE_MCK_DIV4 2 ///< PWM Mode prescaler set to MCK/4. +#define PWM_MR_PRE_MCK_DIV8 3 ///< PWM Mode prescaler set to MCK/8. +#define PWM_MR_PRE_MCK_DIV16 4 ///< PWM Mode prescaler set to MCK/16. +#define PWM_MR_PRE_MCK_DIV32 5 ///< PWM Mode prescaler set to MCK/32. +#define PWM_MR_PRE_MCK_DIV64 6 ///< PWM Mode prescaler set to MCK/64. +#define PWM_MR_PRE_MCK_DIV128 7 ///< PWM Mode prescaler set to MCK/128. +#define PWM_MR_PRE_MCK_DIV256 8 ///< PWM Mode prescaler set to MCK/256. +#define PWM_MR_PRE_MCK_DIV512 9 ///< PWM Mode prescaler set to MCK/512. +#define PWM_MR_PRE_MCK_DIV1024 10 ///< PWM Mode prescaler set to MCK/1024. +/*\}*/ + +/** + * PWM Channel IDs. + */ +/*\{*/ +#define PWM_CHID_MASK 0x0000000F +#define PWM_CHID0 0 +#define PWM_CHID1 1 +#define PWM_CHID2 2 +#define PWM_CHID3 3 +/*\}*/ + +/** + * PWM Enable Register. + */ +/*\{*/ +#define PWM_ENA_OFF 0x00000004 ///< PWM Enable Register offset. +#define PWM_ENA (*((reg32_t *)(PWMC_BASE + PWM_ENA_OFF))) ///< PWM Enable Register. +/*\}*/ + +/** + * PWM Disable Register. + */ +/*\{*/ +#define PWM_DIS_OFF 0x00000008 ///< PWM Disable Register offset. +#define PWM_DIS (*((reg32_t *)(PWMC_BASE + PWM_DIS_OFF))) ///< PWM Disable Register. +/*\}*/ + +/** + * PWM Status Register. + */ +/*\{*/ +#define PWM_SR_OFF 0x0000000C ///< PWM Status Register offset. +#define PWM_SR (*((reg32_t *)(PWMC_BASE + PWM_SR_OFF))) ///< PWM Status Register. +/*\}*/ + +/** + * PWM Interrupt Enable Register. + */ +/*\{*/ +#define PWM_IER_OFF 0x00000010 ///< PWM Interrupt Enable Register offset. +#define PWM_IER (*((reg32_t *)(PWMC_BASE + PWM_IER_OFF))) ///< PWM Interrupt Enable Register. +/*\}*/ + +/** + * PWM Interrupt Disable Register. + */ +/*\{*/ +#define PWM_IDR_OFF 0x00000014 ///< PWM Interrupt Disable Register offset. +#define PWM_IDR (*((reg32_t *)(PWMC_BASE + PWM_IDR_OFF))) ///< PWM Interrupt Disable Register. +/*\}*/ + +/** + * PWM Interrupt Mask Register. + */ +/*\{*/ +#define PWM_IMR_OFF 0x00000018 ///< PWM Interrupt Mask Register offset. +#define PWM_IMR (*((reg32_t *)(PWMC_BASE + PWM_IMR_OFF))) ///< PWM Interrupt Mask Register. +/*\}*/ + +/** + * PWM Interrupt Status Register. + */ +/*\{*/ +#define PWM_ISR_OFF 0x0000001C ///< PWM Interrupt Status Register offset. +#define PWM_ISR (*((reg32_t *)(PWMC_BASE + PWM_ISR_OFF))) ///< PWM Interrupt Status Register. +/*\}*/ + +#define PWM_CH0_OFF 0x00000200 ///< PWM Channel 0 registers offset. +#define PWM_CH1_OFF 0x00000220 ///< PWM Channel 1 registers offset. +#define PWM_CH2_OFF 0x00000240 ///< PWM Channel 2 registers offset. +#define PWM_CH3_OFF 0x00000260 ///< PWM Channel 3 registers offset. + +/** + * PWM Channel Mode Register. + */ +/*\{*/ +#define PWM_CMR_OFF 0x00000000 ///< PWM Channel Mode Register offset. +#define PWM_CMR0 (*((reg32_t *)(PWMC_BASE + PWM_CMR_OFF + PWM_CH0_OFF))) ///< PWM Channel 0 Mode Register. +#define PWM_CMR1 (*((reg32_t *)(PWMC_BASE + PWM_CMR_OFF + PWM_CH1_OFF))) ///< PWM Channel 1 Mode Register. +#define PWM_CMR2 (*((reg32_t *)(PWMC_BASE + PWM_CMR_OFF + PWM_CH2_OFF))) ///< PWM Channel 2 Mode Register. +#define PWM_CMR3 (*((reg32_t *)(PWMC_BASE + PWM_CMR_OFF + PWM_CH3_OFF))) ///< PWM Channel 3 Mode Register. + +#define PWM_CPRE_MCK_MASK 0x0000000F ///< PWM Mode prescaler mask. +#define PWM_CPRE_MCK 0 ///< PWM Mode prescaler set to MCK. +#define PWM_CPRE_MCK_DIV2 1 ///< PWM Mode prescaler set to MCK/2. +#define PWM_CPRE_MCK_DIV4 2 ///< PWM Mode prescaler set to MCK/4. +#define PWM_CPRE_MCK_DIV8 3 ///< PWM Mode prescaler set to MCK/8. +#define PWM_CPRE_MCK_DIV16 4 ///< PWM Mode prescaler set to MCK/16. +#define PWM_CPRE_MCK_DIV32 5 ///< PWM Mode prescaler set to MCK/32. +#define PWM_CPRE_MCK_DIV64 6 ///< PWM Mode prescaler set to MCK/64. +#define PWM_CPRE_MCK_DIV128 7 ///< PWM Mode prescaler set to MCK/128. +#define PWM_CPRE_MCK_DIV256 8 ///< PWM Mode prescaler set to MCK/256. +#define PWM_CPRE_MCK_DIV512 9 ///< PWM Mode prescaler set to MCK/512. +#define PWM_CPRE_MCK_DIV1024 10 ///< PWM Mode prescaler set to MCK/1024. +#define PWM_CPRE_CLKA 11 ///< PWM Mode prescaler set to CLKA. +#define PWM_CPRE_CLKB 12 ///< PWM Mode prescaler set to CLKB. + +#define PWM_CALG 8 ///< PWM Mode channel alignment. +#define PWM_CPOL 9 ///< PWM Mode channel polarity. +#define PWM_CPD 10 ///< PWM Mode channel update period. +/*\}*/ + + +/** + * PWM Channel Duty Cycle Register. + */ +/*\{*/ +#define PWM_CDTY_OFF 0x00000004 ///< PWM Channel Duty Cycle Register offset. +#define PWM_CDTY0 (*((reg32_t *)(PWMC_BASE + PWM_CDTY_OFF + PWM_CH0_OFF))) ///< PWM Channel 0 Duty Cycle Register. +#define PWM_CDTY1 (*((reg32_t *)(PWMC_BASE + PWM_CDTY_OFF + PWM_CH1_OFF))) ///< PWM Channel 1 Duty Cycle Register. +#define PWM_CDTY2 (*((reg32_t *)(PWMC_BASE + PWM_CDTY_OFF + PWM_CH2_OFF))) ///< PWM Channel 2 Duty Cycle Register. +#define PWM_CDTY3 (*((reg32_t *)(PWMC_BASE + PWM_CDTY_OFF + PWM_CH3_OFF))) ///< PWM Channel 3 Duty Cycle Register. +/*\}*/ + + +/** + * PWM Channel Period Register. + */ +/*\{*/ +#define PWM_CPRD_OFF 0x00000008 ///< PWM Channel Period Register offset. +#define PWM_CPRD0 (*((reg32_t *)(PWMC_BASE + PWM_CPRD_OFF + PWM_CH0_OFF))) ///< PWM Channel 0 Period Register. +#define PWM_CPRD1 (*((reg32_t *)(PWMC_BASE + PWM_CPRD_OFF + PWM_CH1_OFF))) ///< PWM Channel 1 Period Register. +#define PWM_CPRD2 (*((reg32_t *)(PWMC_BASE + PWM_CPRD_OFF + PWM_CH2_OFF))) ///< PWM Channel 2 Period Register. +#define PWM_CPRD3 (*((reg32_t *)(PWMC_BASE + PWM_CPRD_OFF + PWM_CH3_OFF))) ///< PWM Channel 3 Period Register. +/*\}*/ + + +/** + * PWM Channel Counter Register. + */ +/*\{*/ +#define PWM_CCNT_OFF 0x0000000C ///< PWM Channel Counter Register offset. +#define PWM_CCNT0 (*((reg32_t *)(PWMC_BASE + PWM_CCNT_OFF + PWM_CH0_OFF))) ///< PWM Channel 0 Counter Register. +#define PWM_CCNT1 (*((reg32_t *)(PWMC_BASE + PWM_CCNT_OFF + PWM_CH1_OFF))) ///< PWM Channel 1 Counter Register. +#define PWM_CCNT2 (*((reg32_t *)(PWMC_BASE + PWM_CCNT_OFF + PWM_CH2_OFF))) ///< PWM Channel 2 Counter Register. +#define PWM_CCNT3 (*((reg32_t *)(PWMC_BASE + PWM_CCNT_OFF + PWM_CH3_OFF))) ///< PWM Channel 3 Counter Register. +/*\}*/ + + +/** + * PWM Channel Update Register. + */ +/*\{*/ +#define PWM_CUPD_OFF 0x00000010 ///< PWM Channel Update Register offset. +#define PWM_CUPD0 (*((reg32_t *)(PWMC_BASE + PWM_CUPD_OFF + PWM_CH0_OFF))) ///< PWM Channel 0 Update Register. +#define PWM_CUPD1 (*((reg32_t *)(PWMC_BASE + PWM_CUPD_OFF + PWM_CH1_OFF))) ///< PWM Channel 1 Update Register. +#define PWM_CUPD2 (*((reg32_t *)(PWMC_BASE + PWM_CUPD_OFF + PWM_CH2_OFF))) ///< PWM Channel 2 Update Register. +#define PWM_CUPD3 (*((reg32_t *)(PWMC_BASE + PWM_CUPD_OFF + PWM_CH3_OFF))) ///< PWM Channel 3 Update Register. +/*\}*/ + +#endif /* AT91_PWM_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_rstc.h b/2.5/bertos/cpu/arm/io/at91_rstc.h new file mode 100644 index 00000000..96be7c34 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_rstc.h @@ -0,0 +1,112 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * AT91 reset controller. + * This file is based on NUT/OS implementation. See license below. + */ + +/* + * Copyright (C) 2005-2006 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91_RTSC_H +#define AT91_RTSC_H + +/** Reset Controller Control Register */ +/*\{*/ +#define RSTC_CR (*((reg32_t *)(RSTC_BASE + 0x00))) ///< Reset controller control register address. +#define RSTC_PROCRST 0 ///< Processor reset. +#define RSTC_PERRST 2 ///< Peripheral reset. +#define RSTC_EXTRST 3 ///< External reset. +#define RSTC_KEY 0xA5000000 ///< Password. +/*\}*/ + +/** Reset Controller Status Register */ +/*\{*/ +#define RSTC_SR (*((reg32_t *)(RSTC_BASE + 0x04))) ///< Reset controller status register address. +#define RSTC_URSTS 0 ///< User reset status. +#define RSTC_BODSTS 1 ///< Brownout detection status. +#define RSTC_RSTTYP_MASK 0x00000700 ///< Reset type. +#define RSTC_RSTTYP_POWERUP 0x00000000 ///< Power-up reset. +//#define RSTC_RSTTYP_WAKEUP 0x00000100 ///< VDDCORE rising. +#define RSTC_RSTTYP_WATCHDOG 0x00000200 ///< Watchdog reset. +#define RSTC_RSTTYP_SOFTWARE 0x00000300 ///< Software reset. +#define RSTC_RSTTYP_USER 0x00000400 ///< User reset. +#define RSTC_RSTTYP_BROWNOUT 0x00000500 ///< Brownout reset. +#define RSTC_NRSTL 16 ///< NRST pin level. +#define RSTC_SRCMP 17 ///< Software reset command in progress. +/*\}*/ + +/** Reset Controller Mode Register */ +/*\{*/ +#define RSTC_MR (*((reg32_t *)(RSTC_BASE + 0x08))) ///< Reset controller mode register address. +#define RSTC_URSTEN 0 ///< User reset enable. +#define RSTC_URSTIEN 4 ///< User reset interrupt enable. +#define RSTC_ERSTL_MASK 0x00000F00 ///< External reset length. +#define RSTC_ERSTL_SHIFT 8 ///< Least significant bit of external reset length. +#define RSTC_BODIEN 16 ///< Brown-out detection interrupt enable. +/*\}*/ + + +#endif /* AT91_RTSC_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_spi.h b/2.5/bertos/cpu/arm/io/at91_spi.h new file mode 100644 index 00000000..fd6bb746 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_spi.h @@ -0,0 +1,282 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * AT91SAM7 SPI register definitions. + * This file is based on NUT/OS implementation. See license below. + + */ + +/* + * Copyright (C) 2006-2007 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + + */ + +#ifndef AT91_SPI_H +#define AT91_SPI_H + +/** + * SPI Control Register + */ +/*\{*/ +#define SPI_CR_OFF 0x00000000 ///< Control register offset. + +#define SPI_SPIEN 0 ///< SPI enable. +#define SPI_SPIDIS 1 ///< SPI disable. +#define SPI_SWRST 7 ///< Software reset. +#define SPI_LASTXFER 24 ///< Last transfer. +/*\}*/ + +/** + * SPI Mode Register + */ +/*\{*/ +#define SPI_MR_OFF 0x00000004 ///< Mode register offset. + +#define SPI_MSTR 0 ///< Master mode. +#define SPI_PS 1 ///< Peripheral select. +#define SPI_PCSDEC 2 ///< Chip select decode. +#define SPI_FDIV 3 ///< Clock selection. +#define SPI_MODFDIS 4 ///< Mode fault detection. +#define SPI_LLB 7 ///< Local loopback enable. +#define SPI_PCS 0x000F0000 ///< Peripheral chip select mask. +#define SPI_PCS_0 0x000E0000 ///< Peripheral chip select 0. +#define SPI_PCS_1 0x000D0000 ///< Peripheral chip select 1. +#define SPI_PCS_2 0x000B0000 ///< Peripheral chip select 2. +#define SPI_PCS_3 0x00070000 ///< Peripheral chip select 3. +#define SPI_PCS_SHIFT 16 ///< Least significant bit of peripheral chip select. +#define SPI_DLYBCS 0xFF000000 ///< Mask for delay between chip selects. +#define SPI_DLYBCS_SHIFT 24 ///< Least significant bit of delay between chip selects. +/*\}*/ + +/** + * SPI Receive Data Register + */ +/*\{*/ +#define SPI_RDR_OFF 0x00000008 ///< Receive data register offset. + +#define SPI_RD 0x0000FFFF ///< Receive data mask. +#define SPI_RD_SHIFT 0 ///< Least significant bit of receive data. +/*\}*/ + +/** + * SPI Transmit Data Register + */ +/*\{*/ +#define SPI_TDR_OFF 0x0000000C ///< Transmit data register offset. + +#define SPI_TD 0x0000FFFF ///< Transmit data mask. +#define SPI_TD_SHIFT 0 ///< Least significant bit of transmit data. +/*\}*/ + +/** + * SPI Status and Interrupt Register + */ +/*\{*/ +#define SPI_SR_OFF 0x00000010 ///< Status register offset. +#define SPI_IER_OFF 0x00000014 ///< Interrupt enable register offset. +#define SPI_IDR_OFF 0x00000018 ///< Interrupt disable register offset. +#define SPI_IMR_OFF 0x0000001C ///< Interrupt mask register offset. + +#define SPI_RDRF 0 ///< Receive data register full. +#define SPI_TDRE 1 ///< Transmit data register empty. +#define SPI_MODF 2 ///< Mode fault error. +#define SPI_OVRES 3 ///< Overrun error status. +#define SPI_ENDRX 4 ///< End of RX buffer. +#define SPI_ENDTX 5 ///< End of TX buffer. +#define SPI_RXBUFF 6 ///< RX buffer full. +#define SPI_TXBUFE 7 ///< TX buffer empty. +#define SPI_NSSR 8 ///< NSS rising. +#define SPI_TXEMPTY 9 ///< Transmission register empty. +#define SPI_SPIENS 16 ///< SPI enable status. +/*\}*/ + +/** + * SPI Chip Select Registers + */ +/*\{*/ +#define SPI_CSR0_OFF 0x00000030 ///< Chip select register 0 offset. +#define SPI_CSR1_OFF 0x00000034 ///< Chip select register 1 offset. +#define SPI_CSR2_OFF 0x00000038 ///< Chip select register 2 offset. +#define SPI_CSR3_OFF 0x0000003C ///< Chip select register 3 offset. + +#define SPI_CPOL 0 ///< Clock polarity. +#define SPI_NCPHA 1 ///< Clock phase. +#define SPI_CSAAT 3 ///< Chip select active after transfer. +#define SPI_BITS 0x000000F0 ///< Bits per transfer mask. +#define SPI_BITS_8 0x00000000 ///< 8 bits per transfer. +#define SPI_BITS_9 0x00000010 ///< 9 bits per transfer. +#define SPI_BITS_10 0x00000020 ///< 10 bits per transfer. +#define SPI_BITS_11 0x00000030 ///< 11 bits per transfer. +#define SPI_BITS_12 0x00000040 ///< 12 bits per transfer. +#define SPI_BITS_13 0x00000050 ///< 13 bits per transfer. +#define SPI_BITS_14 0x00000060 ///< 14 bits per transfer. +#define SPI_BITS_15 0x00000070 ///< 15 bits per transfer. +#define SPI_BITS_16 0x00000080 ///< 16 bits per transfer. +#define SPI_BITS_SHIFT 4 ///< Least significant bit of bits per transfer. +#define SPI_SCBR 0x0000FF00 ///< Serial clock baud rate mask. +#define SPI_SCBR_SHIFT 8 ///< Least significant bit of serial clock baud rate. +#define SPI_DLYBS 0x00FF0000 ///< Delay before SPCK mask. +#define SPI_DLYBS_SHIFT 16 ///< Least significant bit of delay before SPCK. +#define SPI_DLYBCT 0xFF000000 ///< Delay between consecutive transfers mask. +#define SPI_DLYBCT_SHIFT 24 ///< Least significant bit of delay between consecutive transfers. +/*\}*/ + +/** + * Single SPI Register Addresses + */ +/*\{*/ +#if defined(SPI_BASE) + #define SPI0_BASE SPI_BASE + #define SPI_CR SPI0_CR ///< SPI Control Register Write-only. + #define SPI_MR SPI0_MR ///< SPI Mode Register Read/Write Reset=0x0. + #define SPI_RDR SPI0_RDR ///< SPI Receive Data Register Read-only Reset=0x0. + #define SPI_TDR SPI0_TDR ///< SPI Transmit Data Register Write-only . + #define SPI_SR SPI0_SR ///< SPI Status Register Read-only Reset=0x000000F0. + #define SPI_IER SPI0_IER ///< SPI Interrupt Enable Register Write-only. + #define SPI_IDR SPI0_IDR ///< SPI Interrupt Disable Register Write-only. + #define SPI_IMR SPI0_IMR ///< SPI Interrupt Mask Register Read-only Reset=0x0. + #define SPI_CSR0 SPI0_CSR0 ///< SPI Chip Select Register 0 Read/Write Reset=0x0. + #define SPI_CSR1 SPI0_CSR1 ///< SPI Chip Select Register 1 Read/Write Reset=0x0. + #define SPI_CSR2 SPI0_CSR2 ///< SPI Chip Select Register 2 Read/Write Reset=0x0. + #define SPI_CSR3 SPI0_CSR3 ///< SPI Chip Select Register 3 Read/Write Reset=0x0. + #if defined(SPI_HAS_PDC) + #define SPI_RPR SPI0_RPR ///< PDC channel 0 receive pointer register. + #define SPI_RCR SPI0_RCR ///< PDC channel 0 receive counter register. + #define SPI_TPR SPI0_TPR ///< PDC channel 0 transmit pointer register. + #define SPI_TCR SPI0_TCR ///< PDC channel 0 transmit counter register. + #define SPI_RNPR SPI0_RNPR ///< PDC channel 0 receive next pointer register. + #define SPI_RNCR SPI0_RNCR ///< PDC channel 0 receive next counter register. + #define SPI_TNPR SPI0_TNPR ///< PDC channel 0 transmit next pointer register. + #define SPI_TNCR SPI0_TNCR ///< PDC channel 0 transmit next counter register. + #define SPI_PTCR SPI0_PTCR ///< PDC channel 0 transfer control register. + #define SPI_PTSR SPI0_PTSR ///< PDC channel 0 transfer status register. + #endif /* SPI_HAS_PDC */ +#endif /* SPI_BASE */ +/*\}*/ + +/** + * SPI 0 Register Addresses + */ +/*\{*/ +#if defined(SPI0_BASE) + #define SPI0_CR (*((reg32_t *)(SPI0_BASE + SPI_CR_OFF))) ///< SPI Control Register Write-only. + #define SPI0_MR (*((reg32_t *)(SPI0_BASE + SPI_MR_OFF))) ///< SPI Mode Register Read/Write Reset=0x0. + #define SPI0_RDR (*((reg32_t *)(SPI0_BASE + SPI_RDR_OFF))) ///< SPI Receive Data Register Read-only Reset=0x0. + #define SPI0_TDR (*((reg32_t *)(SPI0_BASE + SPI_TDR_OFF))) ///< SPI Transmit Data Register Write-only . + #define SPI0_SR (*((reg32_t *)(SPI0_BASE + SPI_SR_OFF))) ///< SPI Status Register Read-only Reset=0x000000F0. + #define SPI0_IER (*((reg32_t *)(SPI0_BASE + SPI_IER_OFF))) ///< SPI Interrupt Enable Register Write-only. + #define SPI0_IDR (*((reg32_t *)(SPI0_BASE + SPI_IDR_OFF))) ///< SPI Interrupt Disable Register Write-only. + #define SPI0_IMR (*((reg32_t *)(SPI0_BASE + SPI_IMR_OFF))) ///< SPI Interrupt Mask Register Read-only Reset=0x0. + #define SPI0_CSR0 (*((reg32_t *)(SPI0_BASE + SPI_CSR0_OFF))) ///< SPI Chip Select Register 0 Read/Write Reset=0x0. + #define SPI0_CSR1 (*((reg32_t *)(SPI0_BASE + SPI_CSR1_OFF))) ///< SPI Chip Select Register 1 Read/Write Reset=0x0. + #define SPI0_CSR2 (*((reg32_t *)(SPI0_BASE + SPI_CSR2_OFF))) ///< SPI Chip Select Register 2 Read/Write Reset=0x0. + #define SPI0_CSR3 (*((reg32_t *)(SPI0_BASE + SPI_CSR3_OFF))) ///< SPI Chip Select Register 3 Read/Write Reset=0x0. + #if defined(SPI_HAS_PDC) + #define SPI0_RPR (*((reg32_t *)(SPI0_BASE + PERIPH_RPR_OFF))) ///< PDC channel 0 receive pointer register. + #define SPI0_RCR (*((reg32_t *)(SPI0_BASE + PERIPH_RCR_OFF))) ///< PDC channel 0 receive counter register. + #define SPI0_TPR (*((reg32_t *)(SPI0_BASE + PERIPH_TPR_OFF))) ///< PDC channel 0 transmit pointer register. + #define SPI0_TCR (*((reg32_t *)(SPI0_BASE + PERIPH_TCR_OFF))) ///< PDC channel 0 transmit counter register. + #define SPI0_RNPR (*((reg32_t *)(SPI0_BASE + PERIPH_RNPR_OFF))) ///< PDC channel 0 receive next pointer register. + #define SPI0_RNCR (*((reg32_t *)(SPI0_BASE + PERIPH_RNCR_OFF))) ///< PDC channel 0 receive next counter register. + #define SPI0_TNPR (*((reg32_t *)(SPI0_BASE + PERIPH_TNPR_OFF))) ///< PDC channel 0 transmit next pointer register. + #define SPI0_TNCR (*((reg32_t *)(SPI0_BASE + PERIPH_TNCR_OFF))) ///< PDC channel 0 transmit next counter register. + #define SPI0_PTCR (*((reg32_t *)(SPI0_BASE + PERIPH_PTCR_OFF))) ///< PDC channel 0 transfer control register. + #define SPI0_PTSR (*((reg32_t *)(SPI0_BASE + PERIPH_PTSR_OFF))) ///< PDC channel 0 transfer status register. + #endif /* SPI_HAS_PDC */ +#endif /* SPI0_BASE */ +/*\}*/ + +/** + * SPI 1 Register Addresses + */ +/*\{*/ +#if defined(SPI1_BASE) + #define SPI1_CR (*((reg32_t *)(SPI1_BASE + SPI_CR_OFF))) ///< SPI Control Register Write-only. + #define SPI1_MR (*((reg32_t *)(SPI1_BASE + SPI_MR_OFF))) ///< SPI Mode Register Read/Write Reset=0x0. + #define SPI1_RDR (*((reg32_t *)(SPI1_BASE + SPI_RDR_OFF))) ///< SPI Receive Data Register Read-only Reset=0x0. + #define SPI1_TDR (*((reg32_t *)(SPI1_BASE + SPI_TDR_OFF))) ///< SPI Transmit Data Register Write-only . + #define SPI1_SR (*((reg32_t *)(SPI1_BASE + SPI_SR_OFF))) ///< SPI Status Register Read-only Reset=0x000000F0. + #define SPI1_IER (*((reg32_t *)(SPI1_BASE + SPI_IER_OFF))) ///< SPI Interrupt Enable Register Write-only. + #define SPI1_IDR (*((reg32_t *)(SPI1_BASE + SPI_IDR_OFF))) ///< SPI Interrupt Disable Register Write-only. + #define SPI1_IMR (*((reg32_t *)(SPI1_BASE + SPI_IMR_OFF))) ///< SPI Interrupt Mask Register Read-only Reset=0x0. + #define SPI1_CSR0 (*((reg32_t *)(SPI1_BASE + SPI_CSR0_OFF))) ///< SPI Chip Select Register 0 Read/Write Reset=0x0. + #define SPI1_CSR1 (*((reg32_t *)(SPI1_BASE + SPI_CSR1_OFF))) ///< SPI Chip Select Register 1 Read/Write Reset=0x0. + #define SPI1_CSR2 (*((reg32_t *)(SPI1_BASE + SPI_CSR2_OFF))) ///< SPI Chip Select Register 2 Read/Write Reset=0x0. + #define SPI1_CSR3 (*((reg32_t *)(SPI1_BASE + SPI_CSR3_OFF))) ///< SPI Chip Select Register 3 Read/Write Reset=0x0. + #if defined(SPI_HAS_PDC) + #define SPI1_RPR (*((reg32_t *)(SPI1_BASE + PERIPH_RPR_OFF))) ///< PDC channel 1 receive pointer register. + #define SPI1_RCR (*((reg32_t *)(SPI1_BASE + PERIPH_RCR_OFF))) ///< PDC channel 1 receive counter register. + #define SPI1_TPR (*((reg32_t *)(SPI1_BASE + PERIPH_TPR_OFF))) ///< PDC channel 1 transmit pointer register. + #define SPI1_TCR (*((reg32_t *)(SPI1_BASE + PERIPH_TCR_OFF))) ///< PDC channel 1 transmit counter register. + #define SPI1_RNPR (*((reg32_t *)(SPI1_BASE + PERIPH_RNPR_OFF))) ///< PDC channel 1 receive next pointer register. + #define SPI1_RNCR (*((reg32_t *)(SPI1_BASE + PERIPH_RNCR_OFF))) ///< PDC channel 1 receive next counter register. + #define SPI1_TNPR (*((reg32_t *)(SPI1_BASE + PERIPH_TNPR_OFF))) ///< PDC channel 1 transmit next pointer register. + #define SPI1_TNCR (*((reg32_t *)(SPI1_BASE + PERIPH_TNCR_OFF))) ///< PDC channel 1 transmit next counter register. + #define SPI1_PTCR (*((reg32_t *)(SPI1_BASE + PERIPH_PTCR_OFF))) ///< PDC channel 1 transfer control register. + #define SPI1_PTSR (*((reg32_t *)(SPI1_BASE + PERIPH_PTSR_OFF))) ///< PDC channel 1 transfer status register. + #endif /* SPI_HAS_PDC */ +#endif /* SPI1_BASE */ +/*\}*/ + +#endif /* AT91_SPI_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_ssc.h b/2.5/bertos/cpu/arm/io/at91_ssc.h new file mode 100644 index 00000000..51a34bc5 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_ssc.h @@ -0,0 +1,265 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Luca Ottaviano + * + * AT91SAM7 SSC register definitions. + * This file is based on NUT/OS implementation. See license below. + */ + +/* + * Copyright (C) 2006-2007 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91_SSC_H +#define AT91_SSC_H + +#include + +/** + * SSC Control Register + */ +/*\{*/ +#define SSC_CR_OFF 0x00000000 ///< Control register offset. + +#define SSC_RXEN 0 ///< Receive enable. +#define SSC_RXDIS 1 ///< Receive disable. +#define SSC_TXEN 8 ///< Transmit enable. +#define SSC_TXDIS 9 ///< Transmit disable. +#define SSC_SWRST 15 ///< Software reset. +/*\}*/ + +/** + * SSC Clock Mode Register + */ +/*\{*/ +#define SSC_CMR_OFF 0x00000004 ///< Clock mode register offset. + +#define SSC_DIV_MASK 0x00000FFF ///< Clock divider. +/*\}*/ + +/** + * SSC Receive/Transmit Clock Mode Register + */ +/*\{*/ +#define SSC_RCMR_OFF 0x00000010 ///< Receive clock mode register offset. +#define SSC_TCMR_OFF 0x00000018 ///< Transmit clock mode register offset. + +#define SSC_CKS_MASK 0x00000003 ///< Receive clock selection. +#define SSC_CKS_DIV 0x00000000 ///< Divided clock. +#define SSC_CKS_CLK 0x00000001 ///< RK/TK clock signal. +#define SSC_CKS_PIN 0x00000002 ///< TK/RK pin. +#define SSC_CKO_MASK 0x0000001C ///< Receive clock output mode selection. +#define SSC_CKO_NONE 0x00000000 ///< None. +#define SSC_CKO_CONT 0x00000004 ///< Continous receive clock. +#define SSC_CKO_TRAN 0x00000008 ///< Receive clock only during data transfers. +#define SSC_CKI 5 ///< Receive clock inversion. +#define SSC_CKG_MASK 0x000000C0 ///< Receive clock gating selection. +#define SSC_CKG_NONE 0x00000000 ///< None, continous clock. +#define SSC_CKG_FL 0x00000040 ///< Continous receive clock. +#define SSC_CKG_FH 0x00000080 ///< Receive clock only during data transfers. +#define SSC_START_MASK 0x00000F00 ///< Receive start selection. +#define SSC_START_CONT 0x00000000 ///< Receive start as soon as enabled. +#define SSC_START_TX 0x00000100 ///< Receive start on transmit start. +#define SSC_START_RX 0x00000100 ///< Receive start on receive start. +#define SSC_START_LOW_F 0x00000200 ///< Receive start on low level RF. +#define SSC_START_HIGH_F 0x00000300 ///< Receive start on high level RF. +#define SSC_START_FALL_F 0x00000400 ///< Receive start on falling edge RF. +#define SSC_START_RISE_F 0x00000500 ///< Receive start on rising edge RF. +#define SSC_START_LEVEL_F 0x00000600 ///< Receive start on any RF level change. +#define SSC_START_EDGE_F 0x00000700 ///< Receive start on any RF edge. +#define SSC_START_COMP0 0x00000800 ///< Receive on compare 0. +#define SSC_STOP 12 ///< Receive stop selection. +#define SSC_STTDLY_MASK 0x00FF0000 ///< Receive start delay. +#define SSC_STTDLY_SHIFT 16 ///< Least significant bit of receive start delay. +#define SSC_PERIOD_MASK 0xFF000000 ///< Receive period divider selection. +#define SSC_PERIOD_SHIFT 24 ///< Least significant bit of receive period divider selection. +/*\}*/ + +/** + * SSC Receive/Transmit Frame Mode Registers + */ +/*\{*/ +#define SSC_RFMR_OFF 0x00000014 ///< Receive frame mode register offset. +#define SSC_TFMR_OFF 0x0000001C ///< Transmit frame mode register offset. + +#define SSC_DATLEN_MASK 0x0000001F ///< Data length. +#define SSC_LOOP 5 ///< Receiver loop mode. +#define SSC_DATDEF 5 ///< Transmit default value. + +#define SSC_MSBF 7 ///< Most significant bit first. +#define SSC_DATNB_MASK 0x00000F00 ///< Data number per frame. +#define SSC_DATNB_SHIFT 8 ///< Least significant bit of data number per frame. +#define SSC_FSLEN_MASK 0x000F0000 ///< Receive frame sync. length. +#define SSC_FSLEN_SHIFT 16 ///< Least significant bit of receive frame sync. length. +#define SSC_FSOS 0x00700000 ///< Receive frame sync. output selection. +#define SSC_FSOS_NONE 0x00000000 ///< No frame sync. Line set to input. +#define SSC_FSOS_NEGATIVE 0x00100000 ///< Negative pulse. +#define SSC_FSOS_POSITIVE 0x00200000 ///< Positive pulse. +#define SSC_FSOS_LOW 0x00300000 ///< Low during transfer. +#define SSC_FSOS_HIGH 0x00400000 ///< High during transfer. +#define SSC_FSOS_TOGGLE 0x00500000 ///< Toggling at each start. +#define SSC_FSDEN 23 ///< Frame sync. data enable. +#define SSC_FSEDGE 24 ///< Frame sync. edge detection. +/*\}*/ + +/** + * SSC Receive Holding Register + */ +/*\{*/ +#define SSC_RHR_OFF 0x00000020 ///< Receive holding register offset. +/*\}*/ + +/** + * SSC Transmit Holding Register + */ +/*\{*/ +#define SSC_THR_OFF 0x00000024 ///< Transmit holding register offset. +/*\}*/ + +/** + * SSC Receive Sync. Holding Register + */ +/*\{*/ +#define SSC_RSHR_OFF 0x00000030 ///< Receive sync. holding register offset. +/*\}*/ + +/** + * SSC Transmit Sync. Holding Register + */ +/*\{*/ +#define SSC_TSHR_OFF 0x00000034 ///< Transmit sync. holding register offset. +/*\}*/ + +/** + * SSC Receive Compare 0 Register + */ +/*\{*/ +#define SSC_RC0R_OFF 0x00000038 ///< Receive compare 0 register offset. +/*\}*/ + +/** + * SSC Receive Compare 1 Register + */ +/*\{*/ +#define SSC_RC1R_OFF 0x0000003C ///< Receive compare 1 register offset. +/*\}*/ + +/** + * SSC Status and Interrupt Register + */ +/*\{*/ +#define SSC_SR_OFF 0x00000040 ///< Status register offset. +#define SSC_IER_OFF 0x00000044 ///< Interrupt enable register offset. +#define SSC_IDR_OFF 0x00000048 ///< Interrupt disable register offset. +#define SSC_IMR_OFF 0x0000004C ///< Interrupt mask register offset. + +#define SSC_TXRDY 0 ///< Transmit ready. +#define SSC_TXEMPTY 1 ///< Transmit empty. +#define SSC_ENDTX 2 ///< End of transmission. +#define SSC_TXBUFE 3 ///< Transmit buffer empty. +#define SSC_RXRDY 4 ///< Receive ready. +#define SSC_OVRUN 5 ///< Receive overrun. +#define SSC_ENDRX 6 ///< End of receiption. +#define SSC_RXBUFF 7 ///< Receive buffer full. +#define SSC_CP0 8 ///< Compare 0. +#define SSC_CP1 9 ///< Compare 1. +#define SSC_TXSYN 10 ///< Transmit sync. +#define SSC_RXSYN 11 ///< Receive sync. +#define SSC_TXENA 16 ///< Transmit enable. +#define SSC_RXENA 17 ///< Receive enable. + + +#if defined(SSC_BASE) + #define SSC_CR (*((reg32_t *)(SSC_BASE + SSC_CR_OFF))) ///< Control register address. + #define SSC_CMR (*((reg32_t *)(SSC_BASE + SSC_CMR_OFF))) ///< Clock mode register address. + #define SSC_RCMR (*((reg32_t *)(SSC_BASE + SSC_RCMR_OFF))) ///< Receive clock mode register address. + #define SSC_TCMR (*((reg32_t *)(SSC_BASE + SSC_TCMR_OFF))) ///< Transmit clock mode register address. + #define SSC_RFMR (*((reg32_t *)(SSC_BASE + SSC_RFMR_OFF))) ///< Receive frame mode register address. + #define SSC_TFMR (*((reg32_t *)(SSC_BASE + SSC_TFMR_OFF))) ///< Transmit frame mode register address. + #define SSC_RHR (*((reg32_t *)(SSC_BASE + SSC_RHR_OFF))) ///< Receive holding register address. + #define SSC_THR (*((reg32_t *)(SSC_BASE + SSC_THR_OFF))) ///< Transmit holding register address. + #define SSC_RSHR (*((reg32_t *)(SSC_BASE + SSC_RSHR_OFF))) ///< Receive sync. holding register address. + #define SSC_TSHR (*((reg32_t *)(SSC_BASE + SSC_TSHR_OFF))) ///< Transmit sync. holding register address. + #define SSC_RC0R (*((reg32_t *)(SSC_BASE + SSC_RC0R_OFF))) ///< Receive compare 0 register address. + #define SSC_RC1R (*((reg32_t *)(SSC_BASE + SSC_RC1R_OFF))) ///< Receive compare 1 register address. + #define SSC_SR (*((reg32_t *)(SSC_BASE + SSC_SR_OFF))) ///< Status register address. + #define SSC_IER (*((reg32_t *)(SSC_BASE + SSC_IER_OFF))) ///< Interrupt enable register address. + #define SSC_IDR (*((reg32_t *)(SSC_BASE + SSC_IDR_OFF))) ///< Interrupt disable register address. + #define SSC_IMR (*((reg32_t *)(SSC_BASE + SSC_IMR_OFF))) ///< Interrupt mask register address. + #if defined(SSC_HAS_PDC) + #define SSC_RPR (*((reg32_t *)(SSC_BASE + PERIPH_RPR_OFF))) ///< PDC receive pointer register address. + #define SSC_RCR (*((reg32_t *)(SSC_BASE + PERIPH_RCR_OFF))) ///< PDC receive counter register address. + #define SSC_TPR (*((reg32_t *)(SSC_BASE + PERIPH_TPR_OFF))) ///< PDC transmit pointer register address. + #define SSC_TCR (*((reg32_t *)(SSC_BASE + PERIPH_TCR_OFF))) ///< PDC transmit counter register address. + #define SSC_RNPR (*((reg32_t *)(SSC_BASE + PERIPH_RNPR_OFF))) ///< PDC receive next pointer register address. + #define SSC_RNCR (*((reg32_t *)(SSC_BASE + PERIPH_RNCR_OFF))) ///< PDC receive next counter register address. + #define SSC_TNPR (*((reg32_t *)(SSC_BASE + PERIPH_TNPR_OFF))) ///< PDC transmit next pointer register address. + #define SSC_TNCR (*((reg32_t *)(SSC_BASE + PERIPH_TNCR_OFF))) ///< PDC transmit next counter register address. + #define SSC_PTCR (*((reg32_t *)(SSC_BASE + PERIPH_PTCR_OFF))) ///< PDC transfer control register address. + #define SSC_PTSR (*((reg32_t *)(SSC_BASE + PERIPH_PTSR_OFF))) ///< PDC transfer status register address. + #endif /* SSC_HAS_PDC */ + +#endif /* SSC_BASE */ + + +#endif /* AT91_SSC_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_tc.h b/2.5/bertos/cpu/arm/io/at91_tc.h new file mode 100644 index 00000000..92cee1dd --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_tc.h @@ -0,0 +1,321 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Daniele Basile + * + * AT91SAM7 Conunter timer definition. + * This file is based on NUT/OS implementation. See license below. + */ + +/* + * Copyright (C) 2005-2006 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91_TC_H +#define AT91_TC_H + + +/** + * Timer Counter Control Register + */ +#define TC_TC0_OFF 0x00000000 ///< Channel 0 control register offset. +#define TC_TC1_OFF 0x00000040 ///< Channel 1 control register offset. +#define TC_TC2_OFF 0x00000080 ///< Channel 2 control register offset. +#define TC0_CCR (*((reg32_t *)(TC_BASE + TC_TC0_OFF))) ///< Channel 0 control register address. +#define TC1_CCR (*((reg32_t *)(TC_BASE + TC_TC1_OFF))) ///< Channel 1 control register address. +#define TC2_CCR (*((reg32_t *)(TC_BASE + TC_TC2_OFF))) ///< Channel 2 control register address. +#define TC_CLKEN 0 ///< Clock enable command. +#define TC_CLKDIS 1 ///< Clock disable command. +#define TC_SWTRG 2 ///< Software trigger command. + +/** + * Timer Counter Channel Mode Register + */ +#define TC_CMR_OFF 0x00000004 ///< Mode register offset. +#define TC0_CMR (*((reg32_t *)(TC_BASE + TC_TC0_OFF + TC_CMR_OFF))) ///< Channel 0 mode register address. +#define TC1_CMR (*((reg32_t *)(TC_BASE + TC_TC1_OFF + TC_CMR_OFF))) ///< Channel 1 mode register address. +#define TC2_CMR (*((reg32_t *)(TC_BASE + TC_TC2_OFF + TC_CMR_OFF))) ///< Channel 2 mode register address. + +#define TC_CLKS_MASK 0x00000007 ///< Clock selection mask. +#define TC_CLKS_MCK2 0x00000000 ///< Selects MCK / 2. +#define TC_CLKS_MCK8 0x00000001 ///< Selects MCK / 8. +#define TC_CLKS_MCK32 0x00000002 ///< Selects MCK / 32. +#define TC_CLKS_MCK128 0x00000003 ///< Selects MCK / 128. +#define TC_CLKS_MCK1024 0x00000004 ///< Selects MCK / 1024. +#define TC_CLKS_XC0 0x00000005 ///< Selects external clock 0. +#define TC_CLKS_XC1 0x00000006 ///< Selects external clock 1. +#define TC_CLKS_XC2 0x00000007 ///< Selects external clock 2. + +#define TC_CLKI 3 ///< Increments on falling edge. + +#define TC_BURST_MASK 0x00000030 ///< Burst signal selection mask. +#define TC_BURST_NONE 0x00000000 ///< Clock is not gated by an external signal. +#define TC_BUSRT_XC0 0x00000010 ///< ANDed with external clock 0. +#define TC_BURST_XC1 0x00000020 ///< ANDed with external clock 1. +#define TC_BURST_XC2 0x00000030 ///< ANDed with external clock 2. + + + +#define TC_WAVE 15 ///< Selects waveform mode. +//To select capture mode you must set TC_WAVE bit to 0. +//#define TC_CAPT 15 ///< Selects capture mode. + +/** + * Capture Mode + */ +#define TC_CPCTRG 14 ///< RC Compare Enable Trigger Enable. +#define TC_LDBSTOP 6 ///< Counter clock stopped on RB loading. +#define TC_LDBDIS 7 ///< Counter clock disabled on RB loading. + +#define TC_ETRGEDG_MASK 0x00000300 ///< External trigger edge selection mask. +#define TC_ETRGEDG_RISING_EDGE 0x00000100 ///< Trigger on external rising edge. +#define TC_ETRGEDG_FALLING_EDGE 0x00000200 ///< Trigger on external falling edge. +#define TC_ETRGEDG_BOTH_EDGE 0x00000300 ///< Trigger on both external edges. + +#define TC_ABETRG_MASK 0x00000400 ///< TIOA or TIOB external trigger selection mask. +#define TC_ABETRG_TIOA 10 ///< TIOA used as an external trigger. +//To use external trigger TIOB you must set TC_ABETRG_TIOA bit to 0. +//#define TC_ABETRG_TIOB 10 ///< TIOB used as an external trigger. + + +#define TC_LDRA_MASK 0x00030000 ///< RA loading selection mask. +#define TC_LDRA_RISING_EDGE 0x00010000 ///< Load RA on rising edge of TIOA. +#define TC_LDRA_FALLING_EDGE 0x00020000 ///< Load RA on falling edge of TIOA. +#define TC_LDRA_BOTH_EDGE 0x00030000 ///< Load RA on any edge of TIOA. + +#define TC_LDRB_MASK 0x000C0000 ///< RB loading selection mask. +#define TC_LDRB_RISING_EDGE 0x00040000 ///< Load RB on rising edge of TIOA. +#define TC_LDRB_FALLING_EDGE 0x00080000 ///< Load RB on falling edge of TIOA. +#define TC_LDRB_BOTH_EDGE 0x000C0000 ///< Load RB on any edge of TIOA. + + +/** + * Waveform Mode + */ +#define TC_CPCSTOP 6 ///< Counter clock stopped on RC compare. +#define TC_CPCDIS 7 ///< Counter clock disabled on RC compare. + +#define TC_EEVTEDG_MASK 0x00000300 ///< External event edge selection mask. +#define TC_EEVTEDG_RISING_EDGE 0x00000100 ///< External event on rising edge.. +#define TC_EEVTEDG_FALLING_EDGE 0x00000200 ///< External event on falling edge.. +#define TC_EEVTEDG_BOTH_EDGE 0x00000300 ///< External event on any edge.. + +#define TC_EEVT_MASK 0x00000C00 ///< External event selection mask. +#define TC_EEVT_TIOB 0x00000000 ///< TIOB selected as external event. +#define TC_EEVT_XC0 0x00000400 ///< XC0 selected as external event. +#define TC_EEVT_XC1 0x00000800 ///< XC1 selected as external event. +#define TC_EEVT_XC2 0x00000C00 ///< XC2 selected as external event. + +#define TC_ENETRG 12 ///< External event trigger enable. + +#define TC_WAVSEL_MASK 0x00006000 ///< Waveform selection mask. +#define TC_WAVSEL_UP 0x00000000 ///< UP mode whitout automatic trigger on RC compare. +#define TC_WAVSEL_UP_RC_TRG 0x00004000 ///< UP mode whit automatic trigger on RC compare. +#define TC_WAVSEL_UPDOWN 0x00002000 ///< UPDOWN mode whitout automatic trigger on RC compare. +#define TC_WAVSEL_UPDOWN_RC_TRG 0x00003000 ///< UPDOWN mode whit automatic trigger on RC compare. + + +#define TC_ACPA_MASK 0x00030000 ///< Masks RA compare effect on TIOA. +#define TC_ACPA_SET_OUTPUT 0x00010000 ///< RA compare sets TIOA. +#define TC_ACPA_CLEAR_OUTPUT 0x00020000 ///< RA compare clears TIOA. +#define TC_ACPA_TOGGLE_OUTPUT 0x00030000 ///< RA compare toggles TIOA. + +#define TC_ACPC_MASK 0x000C0000 ///< Masks RC compare effect on TIOA. +#define TC_ACPC_SET_OUTPUT 0x00040000 ///< RC compare sets TIOA. +#define TC_ACPC_CLEAR_OUTPUT 0x00080000 ///< RC compare clears TIOA. +#define TC_ACPC_TOGGLE_OUTPUT 0x000C0000 ///< RC compare toggles TIOA. + +#define TC_AEEVT_MASK 0x00300000 ///< Masks external event effect on TIOA. +#define TC_AEEVT_SET_OUTPUT 0x00100000 ///< External event sets TIOA. +#define TC_AEEVT_CLEAR_OUTPUT 0x00200000 ///< External event clears TIOA. +#define TC_AEEVT_TOGGLE_OUTPUT 0x00300000 ///< External event toggles TIOA. + +#define TC_ASWTRG_MASK 0x00C00000 ///< Masks software trigger effect on TIOA. +#define TC_ASWTRG_SET_OUTPUT 0x00400000 ///< Software trigger sets TIOA. +#define TC_ASWTRG_CLEAR_OUTPUT 0x00800000 ///< Software trigger clears TIOA. +#define TC_ASWTRG_TOGGLE_OUTPUT 0x00C00000 ///< Software trigger toggles TIOA. + +#define TC_BCPB_MASK 0x03000000 ///< Masks RB compare effect on TIOB. +#define TC_BCPB_SET_OUTPUT 0x01000000 ///< RB compare sets TIOB. +#define TC_BCPB_CLEAR_OUTPUT 0x02000000 ///< RB compare clears TIOB. +#define TC_BCPB_TOGGLE_OUTPUT 0x03000000 ///< RB compare toggles TIOB. + +#define TC_BCPC_MASK 0x0C000000 ///< Masks RC compare effect on TIOB. +#define TC_BCPC_SET_OUTPUT 0x04000000 ///< RC compare sets TIOB. +#define TC_BCPC_CLEAR_OUTPUT 0x08000000 ///< RC compare clears TIOB. +#define TC_BCPC_TOGGLE_OUTPUT 0x0C000000 ///< RC compare toggles TIOB. + +#define TC_BEEVT_MASK 0x30000000 ///< Masks external event effect on TIOB. +#define TC_BEEVT_SET_OUTPUT 0x10000000 ///< External event sets TIOB. +#define TC_BEEVT_CLEAR_OUTPUT 0x20000000 ///< External event clears TIOB. +#define TC_BEEVT_TOGGLE_OUTPUT 0x30000000 ///< External event toggles TIOB. + +#define TC_BSWTRG_MASK 0xC0000000 ///< Masks software trigger effect on TIOB. +#define TC_BSWTRG_SET_OUTPUT 0x40000000 ///< Software trigger sets TIOB. +#define TC_BSWTRG_CLEAR_OUTPUT 0x80000000 ///< Software trigger clears TIOB. +#define TC_BSWTRG_TOGGLE_OUTPUT 0xC0000000 ///< Software trigger toggles TIOB. + +/** + * Counter Value Register + */ +#define TC_CV_OFF 0x00000010 ///< Counter register value offset. +#define TC0_CV (*((reg32_t *)(TC_BASE + TC_TC0_OFF + TC_CV_OFF))) ///< Counter 0 value. +#define TC1_CV (*((reg32_t *)(TC_BASE + TC_TC1_OFF + TC_CV_OFF))) ///< Counter 1 value. +#define TC2_CV (*((reg32_t *)(TC_BASE + TC_TC2_OFF + TC_CV_OFF))) ///< Counter 2 value. + +/** + * Timer Counter Register A + */ +#define TC_RA_OFF 0x00000014 ///< Register A offset. +#define TC0_RA (*((reg32_t *)(TC_BASE + TC_TC0_OFF + TC_RA_OFF))) ///< Channel 0 register A. +#define TC1_RA (*((reg32_t *)(TC_BASE + TC_TC1_OFF + TC_RA_OFF))) ///< Channel 1 register A. +#define TC2_RA (*((reg32_t *)(TC_BASE + TC_TC2_OFF + TC_RA_OFF))) ///< Channel 2 register A. + + +/** + * Timer Counter Register B + */ +#define TC_RB_OFF 0x00000018 ///< Register B offset. +#define TC0_RB (*((reg32_t *)(TC_BASE + TC_TC0_OFF + TC_RB_OFF))) ///< Channel 0 register B. +#define TC1_RB (*((reg32_t *)(TC_BASE + TC_TC1_OFF + TC_RB_OFF))) ///< Channel 1 register B. +#define TC2_RB (*((reg32_t *)(TC_BASE + TC_TC2_OFF + TC_RB_OFF))) ///< Channel 2 register B. + + +/** + * Timer Counter Register C + */ +#define TC_RC_OFF 0x0000001C ///< Register C offset. +#define TC0_RC (*((reg32_t *)(TC_BASE + TC_TC0_OFF + TC_RC_OFF))) ///< Channel 0 register C. +#define TC1_RC (*((reg32_t *)(TC_BASE + TC_TC1_OFF + TC_RC_OFF))) ///< Channel 1 register C. +#define TC2_RC (*((reg32_t *)(TC_BASE + TC_TC2_OFF + TC_RC_OFF))) ///< Channel 2 register C. + + + +/** + * Timer Counter Status and Interrupt Registers + */ +#define TC_SR_OFF 0x00000020 ///< Status Register offset. +#define TC0_SR (*((reg32_t *)(TC_BASE + TC_TC0_OFF + TC_SR_OFF))) ///< Status register address. +#define TC1_SR (*((reg32_t *)(TC_BASE + TC_TC1_OFF + TC_SR_OFF))) ///< Status register address. +#define TC2_SR (*((reg32_t *)(TC_BASE + TC_TC2_OFF + TC_SR_OFF))) ///< Status register address. + +#define TC_IER_OFF 0x00000024 ///< Interrupt Enable Register offset. +#define TC0_IER (*((reg32_t *)(TC_BASE + TC_TC0_OFF + TC_IER_OFF))) ///< Channel 0 interrupt enable register address. +#define TC1_IER (*((reg32_t *)(TC_BASE + TC_TC1_OFF + TC_IER_OFF))) ///< Channel 1 interrupt enable register address. +#define TC2_IER (*((reg32_t *)(TC_BASE + TC_TC2_OFF + TC_IER_OFF))) ///< Channel 2 interrupt enable register address. + +#define TC_IDR_OFF 0x00000028 ///< Interrupt Disable Register offset. +#define TC0_IDR (*((reg32_t *)(TC_BASE + TC_TC0_OFF + TC_IDR_OFF))) ///< Channel 0 interrupt disable register address. +#define TC1_IDR (*((reg32_t *)(TC_BASE + TC_TC1_OFF + TC_IDR_OFF))) ///< Channel 1 interrupt disable register address. +#define TC2_IDR (*((reg32_t *)(TC_BASE + TC_TC2_OFF + TC_IDR_OFF))) ///< Channel 2 interrupt disable register address. + +#define TC_IMR_OFF 0x0000002C ///< Interrupt Mask Register offset. +#define TC0_IMR (*((reg32_t *)(TC_BASE + TC_TC0_OFF + TC_IMR_OFF))) ///< Channel 0 interrupt mask register address. +#define TC1_IMR (*((reg32_t *)(TC_BASE + TC_TC1_OFF + TC_IMR_OFF))) ///< Channel 1 interrupt mask register address. +#define TC2_IMR (*((reg32_t *)(TC_BASE + TC_TC2_OFF + TC_IMR_OFF))) ///< Channel 2 interrupt mask register address. + +#define TC_COVFS 0 ///< Counter overflow flag. +#define TC_LOVRS 1 ///< Load overrun flag. +#define TC_CPAS 2 ///< RA compare flag. +#define TC_CPBS 3 ///< RB compare flag. +#define TC_CPCS 4 ///< RC compare flag. +#define TC_LDRAS 5 ///< RA loading flag. +#define TC_LDRBS 6 ///< RB loading flag. +#define TC_ETRGS 7 ///< External trigger flag. +#define TC_CLKSTA 16 ///< Clock enable flag. +#define TC_MTIOA 17 ///< TIOA flag. +#define TC_MTIOB 18 ///< TIOB flag. + + +/** + * Timer Counter Block Control Register + */ +#define TC_BCR_OFF 0x000000C0 ///< Block control register offset. +#define TC_BCR (*((reg32_t *)(TC_BASE + TC_BCR_OFF))) ///< Block control register address. +#define TC_SYNC 0 ///< Synchronisation trigger + + +/** + * Timer Counter Block Mode Register + */ +#define TC_BMR_OFF 0x000000C4 ///< Block mode register offset. +#define TC_BMR (*((reg32_t *)(TC_BASE + TC_BMR_OFF))) ///< Block mode register address. +#define TC_TC0XC0S 0x00000003 ///< External clock signal 0 selection mask. +#define TC_TCLK0XC0 0x00000000 ///< Selects TCLK0. +#define TC_NONEXC0 0x00000001 ///< None selected. +#define TC_TIOA1XC0 0x00000002 ///< Selects TIOA1. +#define TC_TIOA2XC0 0x00000003 ///< Selects TIOA2. + +#define TC_TC1XC1S 0x0000000C ///< External clock signal 1 selection mask. +#define TC_TCLK1XC1 0x00000000 ///< Selects TCLK1. +#define TC_NONEXC1 0x00000004 ///< None selected. +#define TC_TIOA0XC1 0x00000008 ///< Selects TIOA0. +#define TC_TIOA2XC1 0x0000000C ///< Selects TIOA2. + +#define TC_TC2XC2S 0x00000030 ///< External clock signal 2 selection mask. +#define TC_TCLK2XC2 0x00000000 ///< Selects TCLK2. +#define TC_NONEXC2 0x00000010 ///< None selected. +#define TC_TIOA0XC2 0x00000020 ///< Selects TIOA0. +#define TC_TIOA1XC2 0x00000030 ///< Selects TIOA1. + + +#endif /* AT91_TC_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_twi.h b/2.5/bertos/cpu/arm/io/at91_twi.h new file mode 100644 index 00000000..3fbe7dc9 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_twi.h @@ -0,0 +1,191 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * AT91SAM7 Two wire interface. + * This file is based on NUT/OS implementation. See license below. + */ + +/* + * Copyright (C) 2006 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (*((reg32_t *)(INCLUDING NEGLIGENCE OR OTHERWISE))) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91_TWI_H +#define AT91_TWI_H + + +/** + * TWI Control Register. + * \{ + */ +#define TWI_CR_OFF 0x00000000 ///< Control register offset. +#define TWI_CR (*((reg32_t *)(TWI_BASE + TWI_CR_OFF))) ///< Control register address. +#define TWI_START 0 ///< Send start condition. +#define TWI_STOP 1 ///< Send stop condition. +#define TWI_MSEN 2 ///< Enable master mode. +#define TWI_MSDIS 3 ///< Disable master mode. +/* +#define TWI_SVEN 4 ///< Enable slave mode. +#define TWI_SVDIS 5 ///< Disable slave mode. +*/ +#define TWI_SWRST 7 ///< Software reset. +/*\}*/ + +/** + * TWI Master Mode Register. + * \{ + */ +#define TWI_MMR_OFF 0x00000004 ///< Master mode register offset. +#define TWI_MMR (*((reg32_t *)(TWI_BASE + TWI_MMR_OFF))) ///< Master mode register address. +#define TWI_IADRSZ_SHIFT 8 ///< Internal device address size shift. +#define TWI_IADRSZ 0x00000300 ///< Internal device address size mask. +#define TWI_IADRSZ_NONE 0x00000000 ///< No internal device address. +#define TWI_IADRSZ_1BYTE 0x00000100 ///< One byte internal device address. +#define TWI_IADRSZ_2BYTE 0x00000200 ///< Two byte internal device address. +#define TWI_IADRSZ_3BYTE 0x00000300 ///< Three byte internal device address. +#define TWI_MREAD 12 ///< Master read direction. +#define TWI_DADR 0x007F0000 ///< Device address mask. +#define TWI_DADR_SHIFT 16 ///< Device address LSB. +/*\}*/ + +/** + * TWI Internal Address Register. + * \{ + */ +#define TWI_IADR_OFF 0x0000000C ///< Internal address register offset. +#define TWI_IADR (*((reg32_t *)(TWI_BASE + TWI_IADR_OFF))) ///< Internal address register address. +#define TWI_IADR_MASK 0x00FFFFFF ///< Internal address mask. +#define TWI_IADR_SHIFT 0 ///< Internal address LSB. +/*\}*/ + +/** + * TWI Clock Waveform Generator Register. + * \{ + */ +#define TWI_CWGR_OFF 0x00000010 ///< Clock waveform generator register offset. +#define TWI_CWGR (*((reg32_t *)(TWI_BASE + TWI_CWGR_OFF))) ///< Clock waveform generator register address. +#define TWI_CLDIV 0x000000FF ///< Clock low divider mask. +#define TWI_CLDIV_SHIFT 0 ///< Clock low divider LSB. +#define TWI_CHDIV 0x0000FF00 ///< Clock high divider mask. +#define TWI_CHDIV_SHIFT 8 ///< Clock high divider LSB. +#define TWI_CKDIV 0x00070000 ///< Clock divider mask. +#define TWI_CKDIV_SHIFT 16 ///< Clock divider LSB. +/*\}*/ + +/** + * TWI Status and Interrupt Registers. + * \{ + */ +#define TWI_SR_OFF 0x00000020 ///< Status register offset. +#define TWI_SR (*((reg32_t *)(TWI_BASE + TWI_SR_OFF))) ///< Status register address. + +#define TWI_IER_OFF 0x00000024 ///< Interrupt enable register offset. +#define TWI_IER (*((reg32_t *)(TWI_BASE + TWI_IER_OFF))) ///< Interrupt enable register address. + +#define TWI_IDR_OFF 0x00000028 ///< Interrupt disable register offset. +#define TWI_IDR (*((reg32_t *)(TWI_BASE + TWI_IDR_OFF))) ///< Interrupt disable register address. + +#define TWI_IMR_OFF 0x0000002C ///< Interrupt mask register offset. +#define TWI_IMR (*((reg32_t *)(TWI_BASE + TWI_IMR_OFF))) ///< Interrupt mask register address. + +#define TWI_TXCOMP 0 ///< Transmission completed. +#define TWI_RXRDY 1 ///< Receive holding register ready. +#define TWI_TXRDY 2 ///< Transmit holding register ready. + +/* +#define TWI_SVREAD 0x00000008 ///< Slave read. +#define TWI_SVACC 0x00000010 ///< Slave access. +#define TWI_GACC 0x00000020 ///< General call access. +*/ + +#if CPU_ARM_SAM7X +#define TWI_OVRE 6 ///< Overrun error. +#define TWI_UNRE 7 ///< Underrun error. +#endif + +#define TWI_NACK 8 ///< Not acknowledged. +/* +#define TWI_ARBLST 0x00000200 ///< Arbitration lost. +#define TWI_SCLWS 0x00000400 ///< Clock wait state. +#define TWI_EOSACC 0x00000800 ///< End of slave access. +*/ +/*\}*/ + +/** + * TWI Receive Holding Register. + * \{ + */ +#define TWI_RHR_OFF 0x00000030 ///< Receive holding register offset. +#define TWI_RHR (*((reg32_t *)(TWI_BASE + TWI_RHR_OFF))) ///< Receive holding register address. +/*\}*/ + +/** + * TWI Transmit Holding Register. + * \{ + */ +#define TWI_THR_OFF 0x00000034 ///< Transmit holding register offset. +#define TWI_THR (*((reg32_t *)(TWI_BASE + TWI_THR_OFF))) ///< Transmit holding register address. +/*\}*/ + + +#endif /* AT91_TWI_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_us.h b/2.5/bertos/cpu/arm/io/at91_us.h new file mode 100644 index 00000000..fd9bf667 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_us.h @@ -0,0 +1,344 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Daniele Basile + * + * AT91 UART User interface. + * This file is based on NUT/OS implementation. See license below. + */ +/* + * Copyright (C) 2005-2006 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91_US_H +#define AT91_US_H + +/** + * USART Control Register + */ +/*\{*/ +#define US_CR_OFF 0x00000000 ///< USART control register offset. +#define US0_CR (*((reg32_t *)(USART0_BASE + US_CR_OFF))) ///< Channel 0 control register address. +#define US1_CR (*((reg32_t *)(USART1_BASE + US_CR_OFF))) ///< Channel 1 control register address. +#define US_RSTRX 2 ///< Reset receiver. +#define US_RSTTX 3 ///< Reset transmitter. +#define US_RXEN 4 ///< Receiver enable. +#define US_RXDIS 5 ///< Receiver disable. +#define US_TXEN 6 ///< Transmitter enable. +#define US_TXDIS 7 ///< Transmitter disable. +#define US_RSTSTA 8 ///< Reset status bits. +#define US_STTBRK 9 ///< Start break. +#define US_STPBRK 10 ///< Stop break. +#define US_STTTO 11 ///< Start timeout. +#define US_SENDA 12 ///< Send next byte with address bit set. +#define US_RSTIT 13 ///< Reset interations. +#define US_RSTNAK 14 ///< Reset non acknowledge. +#define US_RETTO 15 ///< Rearm time out. +#define US_DTREN 16 ///< Data terminal ready enable. +#define US_DTRDIS 17 ///< Data terminal ready disable. +#define US_RTSEN 18 ///< Request to send enable. +#define US_RTSDIS 19 ///< Request to send disable. +/*\}*/ + +/** + * Mode Register + */ +/*\{*/ +#define US_MR_OFF 0x00000004 ///< USART mode register offset. +#define US0_MR (*((reg32_t *)(USART0_BASE + US_MR_OFF))) ///< Channel 0 mode register address. +#define US1_MR (*((reg32_t *)(USART1_BASE + US_MR_OFF))) ///< Channel 1 mode register address. + +#define US_USART_MODE_MASK 0x0000000F ///< USART mode mask. +#define US_USART_MODE_NORMA 0x00000000 ///< Normal. +#define US_USART_MODE_RS485 0x00000001 ///< RS485. +#define US_USART_MODE_HW_HDSH 0x00000002 ///< Hardware handshaking. +#define US_USART_MODE_MODEM 0x00000003 ///< Modem. +#define US_USART_MODE_ISO7816T0 0x00000004 ///< ISO7816 protocol: T=0. +#define US_USART_MODE_ISO7816T1 0x00000006 ///< ISO7816 protocol: T=1. +#define US_USART_MODE_IRDA 0x00000008 ///< IrDA. + +#define US_CLKS_MASK 0x00000030 ///< Clock selection mask. +#define US_CLKS_MCK 0x00000000 ///< Master clock. +#define US_CLKS_MCK8 0x00000010 ///< Master clock divided by 8. +#define US_CLKS_SCK 0x00000020 ///< External clock. +#define US_CLKS_SLCK 0x00000030 ///< Slow clock. + +#define US_CHRL_MASK 0x000000C0 ///< Masks data length. +#define US_CHRL_5 0x00000000 ///< 5 data bits. +#define US_CHRL_6 0x00000040 ///< 6 data bits. +#define US_CHRL_7 0x00000080 ///< 7 data bits. +#define US_CHRL_8 0x000000C0 ///< 8 data bits. + +#define US_SYNC 8 ///< Synchronous mode enable. + +#define US_PAR_MASK 0x00000E00 ///< Parity mode mask. +#define US_PAR_EVEN 0x00000000 ///< Even parity. +#define US_PAR_ODD 0x00000200 ///< Odd parity. +#define US_PAR_SPACE 0x00000400 ///< Space parity. +#define US_PAR_MARK 0x00000600 ///< Marked parity. +#define US_PAR_NO 0x00000800 ///< No parity. +#define US_PAR_MULTIDROP 0x00000C00 ///< Multi-drop mode. + +#define US_NBSTOP_MASK 0x00003000 ///< Masks stop bit length. +#define US_NBSTOP_1 0x00000000 ///< 1 stop bit. +#define US_NBSTOP_1_5 0x00001000 ///< 1.5 stop bits. +#define US_NBSTOP_2 0x00002000 ///< 2 stop bits. + +#define US_CHMODE_MASK 0x0000C000 ///< Channel mode mask. +#define US_CHMODE_NORMAL 0x00000000 ///< Normal mode. +#define US_CHMODE_AUTOMATIC_ECHO 0x00004000 ///< Automatic echo. +#define US_CHMODE_LOCAL_LOOPBACK 0x00008000 ///< Local loopback. +#define US_CHMODE_REMOTE_LOOPBACK 0x0000C000 ///< Remote loopback. + +#define US_MSBF 16 ///< Bit order. +#define US_MODE9 17 ///< 9 bit mode. +#define US_CLKO 18 ///< Clock output select. +#define US_OVER 19 ///< Oversampling mode. +#define US_INACK 20 ///< Inhibit non acknowledge. +#define US_DSNACK 21 ///< Disable successive nack. + +#define US_MAX_INTERATION_MASK 0x07000000 ///< Max numer of interation in mode ISO7816 T=0. + +#define US_FILTER 28 ///< Infrared receive line filter. + +/*\}*/ + +/** + * Status and Interrupt Register + */ +/*\{*/ +#define US_IER_OFF 0x00000008 ///< USART interrupt enable register offset. +#define US0_IER (*((reg32_t *)(USART0_BASE + US_IER_OFF))) ///< Channel 0 interrupt enable register address. +#define US1_IER (*((reg32_t *)(USART1_BASE + US_IER_OFF))) ///< Channel 1 interrupt enable register address. + +#define US_IDR_OFF 0x0000000C ///< USART interrupt disable register offset. +#define US0_IDR (*((reg32_t *)(USART0_BASE + US_IDR_OFF))) ///< Channel 0 interrupt disable register address. +#define US1_IDR (*((reg32_t *)(USART1_BASE + US_IDR_OFF))) ///< Channel 1 interrupt disable register address. + +#define US_IMR_OFF 0x00000010 ///< USART interrupt mask register offset. +#define US0_IMR (*((reg32_t *)(USART0_BASE + US_IMR_OFF))) ///< Channel 0 interrupt mask register address. +#define US1_IMR (*((reg32_t *)(USART1_BASE + US_IMR_OFF))) ///< Channel 1 interrupt mask register address. + +#define US_CSR_OFF 0x00000014 ///< USART status register offset. +#define US0_CSR (*((reg32_t *)(USART0_BASE + US_CSR_OFF))) ///< Channel 0 status register address. +#define US1_CSR (*((reg32_t *)(USART1_BASE + US_CSR_OFF))) ///< Channel 1 status register address. +#define US_CSR_RI 20 ///< Image of RI input. +#define US_CSR_DSR 21 ///< Image of DSR input. +#define US_CSR_DCD 22 ///< Image of DCD input. +#define US_CSR_CTS 23 ///< Image of CTS input. + +#define US_RXRDY 0 ///< Receiver ready. +#define US_TXRDY 1 ///< Transmitter ready. +#define US_RXBRK 2 ///< Receiver break. +#define US_ENDRX 3 ///< End of receiver PDC transfer. +#define US_ENDTX 4 ///< End of transmitter PDC transfer. +#define US_OVRE 5 ///< Overrun error. +#define US_FRAME 6 ///< Framing error. +#define US_PARE 7 ///< Parity error. +#define US_TIMEOUT 8 ///< Receiver timeout. +#define US_TXEMPTY 9 ///< Transmitter empty. +#define US_ITERATION 10 ///< Iteration interrupt enable. +#define US_TXBUFE 11 ///< Buffer empty interrupt enable. +#define US_RXBUFF 12 ///< Buffer full interrupt enable. +#define US_NACK 13 ///< Non acknowledge interrupt enable. +#define US_RIIC 16 ///< Ring indicator input change enable. +#define US_DSRIC 17 ///< Data set ready input change enable. +#define US_DCDIC 18 ///< Data carrier detect input change interrupt enable. +#define US_CTSIC 19 ///< Clear to send input change interrupt enable. + +/** + * Receiver Holding Register + */ +/*\{*/ +#define US_RHR_OFF 0x00000018 ///< USART receiver holding register offset. +#define US0_RHR (*((reg32_t *)(USART0_BASE + US_RHR_OFF))) ///< Channel 0 receiver holding register address. +#define US1_RHR (*((reg32_t *)(USART1_BASE + US_RHR_OFF))) ///< Channel 1 receiver holding register address. +#define US_RHR_RXCHR_MASK 0x000001FF ///< Last char received if US_RXRDY is set. +#define US_RHR_RXSYNH 15 ///< Received sync. +/*\}*/ + +/** + * Transmitter Holding Register + */ +/*\{*/ +#define US_THR_OFF 0x0000001C ///< USART transmitter holding register offset. +#define US0_THR (*((reg32_t *)(USART0_BASE + US_THR_OFF))) ///< Channel 0 transmitter holding register address. +#define US1_THR (*((reg32_t *)(USART1_BASE + US_THR_OFF))) ///< Channel 1 transmitter holding register address. +#define US_THR_TXCHR_MASK 0x000001FF ///< Next char to be trasmitted. +#define US_THR_TXSYNH 15 ///< Sync field to be trasmitted. +/*\}*/ + +/** + * Baud Rate Generator Register + */ +/*\{*/ +#define US_BRGR_OFF 0x00000020 ///< USART baud rate register offset. +#define US0_BRGR (*((reg32_t *)(USART0_BASE + US_BRGR_OFF))) ///< Channel 0 baud rate register address. +#define US1_BRGR (*((reg32_t *)(USART1_BASE + US_BRGR_OFF))) ///< Channel 1 baud rate register address. +/*\}*/ + +/** + * Receiver Timeout Register + */ +/*\{*/ +#define US_RTOR_OFF 0x00000024 ///< USART receiver timeout register offset. +#define US0_RTOR (*((reg32_t *)(USART0_BASE + US_RTOR_OFF))) ///< Channel 0 receiver timeout register address. +#define US1_RTOR (*((reg32_t *)(USART1_BASE + US_RTOR_OFF))) ///< Channel 1 receiver timeout register address. +/*\}*/ + +/** + * Transmitter Time Guard Register + */ +/*\{*/ +#define US_TTGR_OFF 0x00000028 ///< USART transmitter time guard register offset. +#define US0_TTGR (*((reg32_t *)(USART0_BASE + US_TTGR_OFF))) ///< Channel 0 transmitter time guard register address. +#define US1_TTGR (*((reg32_t *)(USART1_BASE + US_TTGR_OFF))) ///< Channel 1 transmitter time guard register address. +/*\}*/ + +/** + * FI DI Ratio Register +*/ +/*\{*/ +#define US_FIDI_OFF 0x00000040 ///< USART FI DI ratio register offset. +#define US0_FIDI (*((reg32_t *)(USART0_BASE + US_FIDI_OFF))) ///< Channel 0 FI DI ratio register address. +#define US1_FIDI (*((reg32_t *)(USART1_BASE + US_FIDI_OFF))) ///< Channel 1 FI DI ratio register address. +/*\}*/ + +/** + * Error Counter Register + */ +/*\{*/ +#define US_NER_OFF 0x00000044 ///< USART error counter register offset. +#define US0_NER (*((reg32_t *)(USART0_BASE + US_NER_OFF))) ///< Channel 0 error counter register address. +#define US1_NER (*((reg32_t *)(USART1_BASE + US_NER_OFF))) ///< Channel 1 error counter register address. +/*\}*/ + +/** + * IrDA Filter Register + */ +/*\{*/ +#define US_IF_OFF 0x0000004C ///< USART IrDA filter register offset. +#define US0_IF (*((reg32_t *)(USART0_BASE + US_IF_OFF))) ///< Channel 0 IrDA filter register address. +#define US1_IF (*((reg32_t *)(USART1_BASE + US_IF_OFF))) ///< Channel 1 IrDA filter register address. +/*\}*/ + +#if USART_HAS_PDC + + /** + * Receive Pointer Register + */ + /*\{*/ + #define US0_RPR (*((reg32_t *)(USART0_BASE + PERIPH_RPR_OFF))) ///< Channel 0 receive pointer register address. + #define US1_RPR (*((reg32_t *)(USART1_BASE + PERIPH_RPR_OFF))) ///< Channel 1 receive pointer register address. + /*\}*/ + + /** + * Receive Counter Register + */ + /*\{*/ + #define US0_RCR (*((reg32_t *)(USART0_BASE + PERIPH_RCR_OFF))) ///< Channel 0 receive counter register address. + #define US1_RCR (*((reg32_t *)(USART1_BASE + PERIPH_RCR_OFF))) ///< Channel 1 receive counter register address. + /*\}*/ + + /** + * Transmit Pointer Register + */ + /*\{*/ + #define US0_TPR (*((reg32_t *)(USART0_BASE + PERIPH_TPR_OFF))) ///< Channel 0 transmit pointer register address. + #define US1_TPR (*((reg32_t *)(USART1_BASE + PERIPH_TPR_OFF))) ///< Channel 1 transmit pointer register address. + /*\}*/ + + /** + * Transmit Counter Register + */ + /*\{*/ + #define US0_TCR (*((reg32_t *)(USART0_BASE + PERIPH_TCR_OFF))) ///< Channel 0 transmit counter register address. + #define US1_TCR (*((reg32_t *)(USART1_BASE + PERIPH_TCR_OFF))) ///< Channel 1 transmit counter register address. + /*\}*/ + + #if defined(PERIPH_RNPR_OFF) && defined(PERIPH_RNCR_OFF) + #define US0_RNPR (*((reg32_t *)(USART0_BASE + PERIPH_RNPR_OFF))) ///< PDC channel 0 receive next pointer register. + #define US1_RNPR (*((reg32_t *)(USART1_BASE + PERIPH_RNPR_OFF))) ///< PDC channel 1 receive next pointer register. + #define US0_RNCR (*((reg32_t *)(USART0_BASE + PERIPH_RNCR_OFF))) ///< PDC channel 0 receive next counter register. + #define US1_RNCR (*((reg32_t *)(USART1_BASE + PERIPH_RNCR_OFF))) ///< PDC channel 1 receive next counter register. + #endif + + #if defined(PERIPH_TNPR_OFF) && defined(PERIPH_TNCR_OFF) + #define US0_TNPR (*((reg32_t *)(USART0_BASE + PERIPH_TNPR_OFF))) ///< PDC channel 0 transmit next pointer register. + #define US1_TNPR (*((reg32_t *)(USART1_BASE + PERIPH_TNPR_OFF))) ///< PDC channel 1 transmit next pointer register. + #define US0_TNCR (*((reg32_t *)(USART0_BASE + PERIPH_TNCR_OFF))) ///< PDC channel 0 transmit next counter register. + #define US1_TNCR (*((reg32_t *)(USART1_BASE + PERIPH_TNCR_OFF))) ///< PDC channel 1 transmit next counter register. + #endif + + #if defined(PERIPH_PTCR_OFF) + #define US0_PTCR (*((reg32_t *)(USART0_BASE + PERIPH_PTCR_OFF))) ///< PDC channel 0 transfer control register. + #define US1_PTCR (*((reg32_t *)(USART1_BASE + PERIPH_PTCR_OFF))) ///< PDC channel 1 transfer control register. + #endif + + #if defined(PERIPH_PTSR_OFF) + #define US0_PTSR (*((reg32_t *)(USART0_BASE + PERIPH_PTSR_OFF))) ///< PDC channel 0 transfer status register. + #define US1_PTSR (*((reg32_t *)(USART1_BASE + PERIPH_PTSR_OFF))) ///< PDC channel 1 transfer status register. + #endif + +#endif /* USART_HAS_PDC */ + +#endif /* AT91_US_H */ diff --git a/2.5/bertos/cpu/arm/io/at91_wdt.h b/2.5/bertos/cpu/arm/io/at91_wdt.h new file mode 100644 index 00000000..ed394665 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91_wdt.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * AT91 Watchdog. + * This file is based on NUT/OS implementation. See license below. + */ + + +/* + * Copyright (C) 2005-2006 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91_WDT_H +#define AT91_WDT_H + + +/** Watch Dog Control Register */ +/*\{*/ +#define WDT_CR_OFF 0x00000000 ///< Watchdog control register offset. +#define WDT_CR (*((reg32_t *)(WDT_BASE + WDT_CR_OFF))) ///< Watchdog control register address. +#define WDT_WDRSTT 0 ///< Watchdog restart. +#define WDT_KEY 0xA5000000 ///< Watchdog password. +/*\}*/ + +/** Watch Dog Mode Register */ +/*\{*/ +#define WDT_MR_OFF 0x00000004 ///< Mode register offset. +#define WDT_MR (*((reg32_t *)(WDT_BASE + WDT_MR_OFF))) ///< Mode register address. +#define WDT_WDV_MASK 0x00000FFF ///< Counter value mask. +#define WDT_WDV_SHIFT 0 ///< Counter value LSB. +#define WDT_WDFIEN 12 ///< Fault interrupt enable. +#define WDT_WDRSTEN 13 ///< Reset enable. +#define WDT_WDRPROC 14 ///< Eset processor enable. +#define WDT_WDDIS 15 ///< Watchdog disable. +#define WDT_WDD_MASK 0x0FFF0000 ///< Delta value mask. +#define WDT_WDD_SHIFT 16 ///< Delta value LSB. +#define WDT_WDDBGHLT 28 ///< Watchdog debug halt. +#define WDT_WDIDLEHLT 29 ///< Watchdog idle halt. +/*\}*/ + +/** Watch Dog Status Register */ +/*\{*/ +#define WDT_SR_OFF 0x00000008 ///< Status register offset. +#define WDT_SR (*((reg32_t *)(WDT_BASE + WDT_SR_OFF))) ///< Status register address. +#define WDT_WDUNF 0 ///< Watchdog underflow. +#define WDT_WDERR 1 ///< Watchdog error. +/*\}*/ + + +#endif /* AT91_WDT_H */ diff --git a/2.5/bertos/cpu/arm/io/at91sam7.h b/2.5/bertos/cpu/arm/io/at91sam7.h new file mode 100644 index 00000000..9a2e6db8 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/at91sam7.h @@ -0,0 +1,433 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Daniele Basile + * + * AT91SAM7 register definitions. + * This file is based on NUT/OS implementation. See license below. + */ + +/* + * Copyright (C) 2006-2007 by egnite Software GmbH. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE + * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * For additional information see http://www.ethernut.de/ + */ + +#ifndef AT91SAM7_H +#define AT91SAM7_H + +#include + +#if CPU_ARM_SAM7X || CPU_ARM_SAM7S_LARGE + #define FLASH_BASE 0x100000UL + #define RAM_BASE 0x200000UL + + #define TC_BASE 0xFFFA0000 ///< Timer/counter base address. + #define UDP_BASE 0xFFFB0000 ///< USB device port base address. + #define TWI_BASE 0xFFFB8000 ///< Two-wire interface base address. + #define USART0_BASE 0xFFFC0000 ///< USART 0 base address. + #define USART1_BASE 0xFFFC4000 ///< USART 1 base address. + #define PWMC_BASE 0xFFFCC000 ///< PWM controller base address. + #define SSC_BASE 0xFFFD4000 ///< Serial synchronous controller base address. + #define ADC_BASE 0xFFFD8000 ///< ADC base address. + + #define AIC_BASE 0xFFFFF000 ///< AIC base address. + #define DBGU_BASE 0xFFFFF200 ///< DBGU base address. + #define PIOA_BASE 0xFFFFF400 ///< PIO A base address. + #define PMC_BASE 0xFFFFFC00 ///< PMC base address. + #define RSTC_BASE 0xFFFFFD00 ///< Resect controller register base address. + #define RTT_BASE 0xFFFFFD20 ///< Realtime timer base address. + #define PIT_BASE 0xFFFFFD30 ///< Periodic interval timer base address. + #define WDT_BASE 0xFFFFFD40 ///< Watch Dog register base address. + #define VREG_BASE 0xFFFFFD60 ///< Voltage regulator mode controller base address. + #define MC_BASE 0xFFFFFF00 ///< Memory controller base. + + #if CPU_ARM_SAM7X + #define CAN_BASE 0xFFFD0000 ///< PWM controller base address. + #define EMAC_BASE 0xFFFDC000 ///< Ethernet MAC address. + #define SPI0_BASE 0xFFFE0000 ///< SPI0 base address. + #define SPI1_BASE 0xFFFE4000 ///< SPI1 base address. + #define PIOB_BASE 0xFFFFF600 ///< PIO base address. + #endif + + #if CPU_ARM_SAM7S_LARGE + #define SPI_BASE 0xFFFE0000 ///< SPI0 base address. + #endif + + #define PIO_HAS_MULTIDRIVER 1 + #define PIO_HAS_PULLUP 1 + #define PIO_HAS_PERIPHERALSELECT 1 + #define PIO_HAS_OUTPUTWRITEENABLE 1 + + #define DBGU_HAS_PDC 1 + #define SPI_HAS_PDC 1 + #define SSC_HAS_PDC 1 + #define USART_HAS_PDC 1 + + /* PDC registers */ + #define PERIPH_RPR_OFF 0x100 ///< Receive Pointer Register. + #define PERIPH_RCR_OFF 0x104 ///< Receive Counter Register. + #define PERIPH_TPR_OFF 0x108 ///< Transmit Pointer Register. + #define PERIPH_TCR_OFF 0x10C ///< Transmit Counter Register. + #define PERIPH_RNPR_OFF 0x110 ///< Receive Next Pointer Register. + #define PERIPH_RNCR_OFF 0x114 ///< Receive Next Counter Register. + #define PERIPH_TNPR_OFF 0x118 ///< Transmit Next Pointer Register. + #define PERIPH_TNCR_OFF 0x11C ///< Transmit Next Counter Register. + #define PERIPH_PTCR_OFF 0x120 ///< PDC Transfer Control Register. + #define PERIPH_PTSR_OFF 0x124 ///< PDC Transfer Status Register. + + #define PDC_RXTEN 0 + #define PDC_RXTDIS 1 + #define PDC_TXTEN 8 + #define PDC_TXTDIS 9 + +#else + #error No base address register definition for selected ARM CPU + +#endif + +#if CPU_ARM_AT91SAM7S64 + #define FLASH_MEM_SIZE 0x10000UL ///< Internal flash memory size + #define FLASH_PAGE_SIZE_BYTES 128 ///< Size of cpu flash memory page in bytes + #define FLASH_BANKS_NUM 1 ///< Number of flash banks + #define FLASH_SECTORS_NUM 16 ///< Number of flash sector + #define FLASH_PAGE_PER_SECTOR 32 ///< Number of page for sector + +#elif CPU_ARM_AT91SAM7S128 || CPU_ARM_AT91SAM7X128 + #define FLASH_MEM_SIZE 0x20000UL ///< Internal flash memory size + #define FLASH_PAGE_SIZE_BYTES 256 ///< Size of cpu flash memory page in bytes + #define FLASH_BANKS_NUM 1 ///< Number of flash banks + #define FLASH_SECTORS_NUM 8 ///< Number of flash sector + #define FLASH_PAGE_PER_SECTOR 64 ///< Number of page for sector + +#elif CPU_ARM_AT91SAM7S256 || CPU_ARM_AT91SAM7X256 + #define FLASH_MEM_SIZE 0x40000UL ///< Internal flash memory size + #define FLASH_PAGE_SIZE_BYTES 256 ///< Size of cpu flash memory page in bytes + #define FLASH_BANKS_NUM 1 ///< Number of flash banks + #define FLASH_SECTORS_NUM 16 ///< Number of flash sector + #define FLASH_PAGE_PER_SECTOR 64 ///< Number of page for sector + +#elif CPU_ARM_AT91SAM7S512 || CPU_ARM_AT91SAM7X512 + #define FLASH_MEM_SIZE 0x80000UL ///< Internal flash memory size + #define FLASH_PAGE_SIZE_BYTES 256 ///< Size of cpu flash memory page in bytes + #define FLASH_BANKS_NUM 2 ///< Number of flash banks + #define FLASH_SECTORS_NUM 32 ///< Number of flash sector + #define FLASH_PAGE_PER_SECTOR 64 ///< Number of page for sector + +#else + #error Memory size definition for selected ARM CPU +#endif + +#include "at91_aic.h" +#include "at91_pit.h" +#include "at91_pmc.h" +#include "at91_mc.h" +#include "at91_wdt.h" +#include "at91_rstc.h" +#include "at91_pio.h" +#include "at91_us.h" +#include "at91_dbgu.h" +#include "at91_tc.h" +#include "at91_adc.h" +#include "at91_pwm.h" +#include "at91_spi.h" +#include "at91_twi.h" +#include "at91_ssc.h" +//TODO: add other peripherals + +/** + * Peripheral Identifiers and Interrupts + *\{ + */ +#if CPU_ARM_SAM7X || CPU_ARM_SAM7S_LARGE + #define FIQ_ID 0 ///< Fast interrupt ID. + #define SYSC_ID 1 ///< System controller interrupt. + #define US0_ID 6 ///< USART 0 ID. + #define US1_ID 7 ///< USART 1 ID. + #define SSC_ID 8 ///< Synchronous serial controller ID. + #define TWI_ID 9 ///< Two-wire interface ID. + #define PWMC_ID 10 ///< PWM controller ID. + #define UDP_ID 11 ///< USB device port ID. + #define TC0_ID 12 ///< Timer 0 ID. + #define TC1_ID 13 ///< Timer 1 ID. + #define TC2_ID 14 ///< Timer 2 ID. + + #define IRQ0_ID 30 ///< External interrupt 0 ID. + #define IRQ1_ID 31 ///< External interrupt 1 ID. + + #if CPU_ARM_SAM7X + #define PIOA_ID 2 ///< Parallel A I/O controller ID. + #define PIOB_ID 3 ///< Parallel B I/O controller ID. + #define SPI0_ID 4 ///< Serial peripheral interface 0 ID. + #define SPI1_ID 5 ///< Serial peripheral interface 1 ID. + #define CAN_ID 15 ///< CAN controller ID. + #define EMAC_ID 16 ///< Ethernet MAC ID. + #define ADC_ID 17 ///< Analog to digital converter ID. + /* 18-29 Reserved */ + + #endif + + #if CPU_ARM_SAM7S_LARGE + #define PIOA_ID 2 ///< Parallel I/O controller ID. + /* ID 3 is reserved */ + #define ADC_ID 4 ///< Analog to digital converter ID. + #define SPI_ID 5 ///< Serial peripheral interface ID. + #define SPI0_ID SPI_ID ///< Alias + #endif + +#else + #error No peripheral ID and interrupts definition for selected ARM CPU + +#endif +/*\}*/ + +/** + * USART & DEBUG pin names + *\{ + */ +#if CPU_ARM_SAM7S_LARGE + #define RXD0 5 + #define TXD0 6 + #define RXD1 21 + #define TXD1 22 + #define DTXD 10 + #define DRXD 9 +#elif CPU_ARM_SAM7X + #define RXD0 0 // PA0 + #define TXD0 1 // PA1 + #define RXD1 5 // PA5 + #define TXD1 6 // PA6 + #define DTXD 28 // PA28 + #define DRXD 27 // PA27 +#else + #error No USART & debug pin names definition for selected ARM CPU +#endif +/*\}*/ + +/** + * SPI pins name + *\{ + */ +#if CPU_ARM_SAM7S_LARGE + #define SPI0_NPCS0 11 // Same as NSS pin. + #define SPI0_MISO 12 + #define SPI0_MOSI 13 + #define SPI0_SPCK 14 + +#elif CPU_ARM_SAM7X + #define SPI0_NPCS0 12 // Same as NSS pin. PA12 + #define SPI0_NPCS1 13 // PA13 + #define SPI0_NPCS2 14 // PA14 + #define SPI0_NPCS3 15 // PA15 + #define SPI0_MISO 16 // PA16 + #define SPI0_MOSI 17 // PA17 + #define SPI0_SPCK 18 // PA18 + + #define SPI1_NPCS0 21 // Same as NSS pin. PA21 + #define SPI1_NPCS1 25 // PA25 + #define SPI1_NPCS2 26 // PA26 + #define SPI1_NPCS3 29 // PA29 + #define SPI1_MISO 24 // PA24 + #define SPI1_MOSI 23 // PA23 + #define SPI1_SPCK 22 // PA22 + +#else + #error No SPI pins name definition for selected ARM CPU + +#endif +/*\}*/ + +/** + * SSC pins name + *\{ + */ +#if CPU_ARM_SAM7S_LARGE + + #define SSC_TF 15 // PA15 + #define SSC_TK 16 // PA16 + #define SSC_TD 17 // PA17 + #define SSC_RD 18 // PA18 + #define SSC_RK 19 // PA19 + #define SSC_RF 20 // PA20 + +#elif CPU_ARM_SAM7X + + #define SSC_TF 21 // PA21 + #define SSC_TK 22 // PA22 + #define SSC_TD 23 // PA23 + #define SSC_RD 24 // PA24 + #define SSC_RK 25 // PA25 + #define SSC_RF 26 // PA26 + +#else + #error No SSC pins name definition for selected ARM CPU + +#endif +/*\}*/ + +/** + * Timer counter pins definition. + *\{ + */ +#if CPU_ARM_SAM7X + #define TIOA0 23 // PB23 + #define TIOB0 24 // PB24 + #define TIOA1 25 // PB25 + #define TIOB1 26 // PB26 + #define TIOA2 27 // PB27 + #define TIOB2 28 // PB28 + + #define TIO_PIO_PDR PIOB_PDR + #define TIO_PIO_ABSR PIOB_ASR + +#elif CPU_ARM_SAM7S_LARGE + #define TIOA0 0 // PA0 + #define TIOB0 1 // PA1 + #define TIOA1 15 // PA15 + #define TIOB1 16 // PA16 + #define TIOA2 26 // PA26 + #define TIOB2 27 // PA27 + + #define TIO_PIO_PDR PIOA_PDR + #define TIO_PIO_ABSR PIOA_BSR + +#else + #error No Timer Counter names of pins definition for selected ARM CPU + +#endif +/*\}*/ + + +/** + * PWM pins definition. + *\{ + */ +#if CPU_ARM_SAM7X + #define PWM0 19 // PB19 + #define PWM1 20 // PB20 + #define PWM2 21 // PB21 + #define PWM3 22 // PB22 + + #define PWM_PIO_PDR PIOB_PDR + #define PWM_PIO_PER PIOB_PER + #define PWM_PIO_CODR PIOB_CODR + #define PWM_PIO_OER PIOB_OER + #define PWM_PIO_ABSR PIOB_ASR + +#elif CPU_ARM_SAM7S_LARGE + #define PWM0 11 // PA11 + #define PWM1 12 // PA12 + #define PWM2 13 // PA13 + #define PWM3 14 // PA14 + + #define PWM_PIO_PDR PIOA_PDR + #define PWM_PIO_PER PIOA_PER + #define PWM_PIO_CODR PIOA_CODR + #define PWM_PIO_OER PIOA_OER + #define PWM_PIO_ABSR PIOA_BSR + +#else + #error No PWM names of pins definition for selected ARM CPU + +#endif +/*\}*/ + +/** + * TWI pins definition. + *\{ + */ +#if CPU_ARM_SAM7X + #define TWD 10 + #define TWCK 11 + +#elif CPU_ARM_SAM7S_LARGE + #define TWD 3 //PA3 + #define TWCK 4 //PA4 + +#else + #error No TWI names of pins definition for selected ARM CPU +#endif + +/** + * ADC pins definition. + *\{ + */ +#if CPU_ARM_SAM7X + #define ADTRG 18 // PB18 + #define AD0 23 // PB27 + #define AD1 24 // PB28 + #define AD2 25 // PB29 + #define AD3 26 // PB30 + +#elif CPU_ARM_SAM7S_LARGE + #define ADTRG 18 // PA8 + #define AD0 0 // PA17 + #define AD1 1 // PA18 + #define AD2 15 // PA19 + #define AD3 16 // PA20 + +#else + #error No ADC names of pins definition for selected ARM CPU + +#endif +/*\}*/ + +#endif /* AT91SAM7_H */ diff --git a/2.5/bertos/cpu/arm/io/lpc23xx.h b/2.5/bertos/cpu/arm/io/lpc23xx.h new file mode 100644 index 00000000..caee0953 --- /dev/null +++ b/2.5/bertos/cpu/arm/io/lpc23xx.h @@ -0,0 +1,1155 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * LPC23xx I/O registers. + */ + +#ifndef LPC23XX_H +#define LPC23XX_H + +#include + +/* Vectored Interrupt Controller (VIC) */ +#define VIC_BASE_ADDR 0xFFFFF000 +#define VICIRQStatus (*(reg32_t *)(VIC_BASE_ADDR + 0x000)) +#define VICFIQStatus (*(reg32_t *)(VIC_BASE_ADDR + 0x004)) +#define VICRawIntr (*(reg32_t *)(VIC_BASE_ADDR + 0x008)) +#define VICIntSelect (*(reg32_t *)(VIC_BASE_ADDR + 0x00C)) +#define VICIntEnable (*(reg32_t *)(VIC_BASE_ADDR + 0x010)) +#define VICIntEnClr (*(reg32_t *)(VIC_BASE_ADDR + 0x014)) +#define VICSoftInt (*(reg32_t *)(VIC_BASE_ADDR + 0x018)) +#define VICSoftIntClr (*(reg32_t *)(VIC_BASE_ADDR + 0x01C)) +#define VICProtection (*(reg32_t *)(VIC_BASE_ADDR + 0x020)) +#define VICSWPrioMask (*(reg32_t *)(VIC_BASE_ADDR + 0x024)) + +#define VICVectAddr0 (*(reg32_t *)(VIC_BASE_ADDR + 0x100)) +#define VICVectAddr1 (*(reg32_t *)(VIC_BASE_ADDR + 0x104)) +#define VICVectAddr2 (*(reg32_t *)(VIC_BASE_ADDR + 0x108)) +#define VICVectAddr3 (*(reg32_t *)(VIC_BASE_ADDR + 0x10C)) +#define VICVectAddr4 (*(reg32_t *)(VIC_BASE_ADDR + 0x110)) +#define VICVectAddr5 (*(reg32_t *)(VIC_BASE_ADDR + 0x114)) +#define VICVectAddr6 (*(reg32_t *)(VIC_BASE_ADDR + 0x118)) +#define VICVectAddr7 (*(reg32_t *)(VIC_BASE_ADDR + 0x11C)) +#define VICVectAddr8 (*(reg32_t *)(VIC_BASE_ADDR + 0x120)) +#define VICVectAddr9 (*(reg32_t *)(VIC_BASE_ADDR + 0x124)) +#define VICVectAddr10 (*(reg32_t *)(VIC_BASE_ADDR + 0x128)) +#define VICVectAddr11 (*(reg32_t *)(VIC_BASE_ADDR + 0x12C)) +#define VICVectAddr12 (*(reg32_t *)(VIC_BASE_ADDR + 0x130)) +#define VICVectAddr13 (*(reg32_t *)(VIC_BASE_ADDR + 0x134)) +#define VICVectAddr14 (*(reg32_t *)(VIC_BASE_ADDR + 0x138)) +#define VICVectAddr15 (*(reg32_t *)(VIC_BASE_ADDR + 0x13C)) +#define VICVectAddr16 (*(reg32_t *)(VIC_BASE_ADDR + 0x140)) +#define VICVectAddr17 (*(reg32_t *)(VIC_BASE_ADDR + 0x144)) +#define VICVectAddr18 (*(reg32_t *)(VIC_BASE_ADDR + 0x148)) +#define VICVectAddr19 (*(reg32_t *)(VIC_BASE_ADDR + 0x14C)) +#define VICVectAddr20 (*(reg32_t *)(VIC_BASE_ADDR + 0x150)) +#define VICVectAddr21 (*(reg32_t *)(VIC_BASE_ADDR + 0x154)) +#define VICVectAddr22 (*(reg32_t *)(VIC_BASE_ADDR + 0x158)) +#define VICVectAddr23 (*(reg32_t *)(VIC_BASE_ADDR + 0x15C)) +#define VICVectAddr24 (*(reg32_t *)(VIC_BASE_ADDR + 0x160)) +#define VICVectAddr25 (*(reg32_t *)(VIC_BASE_ADDR + 0x164)) +#define VICVectAddr26 (*(reg32_t *)(VIC_BASE_ADDR + 0x168)) +#define VICVectAddr27 (*(reg32_t *)(VIC_BASE_ADDR + 0x16C)) +#define VICVectAddr28 (*(reg32_t *)(VIC_BASE_ADDR + 0x170)) +#define VICVectAddr29 (*(reg32_t *)(VIC_BASE_ADDR + 0x174)) +#define VICVectAddr30 (*(reg32_t *)(VIC_BASE_ADDR + 0x178)) +#define VICVectAddr31 (*(reg32_t *)(VIC_BASE_ADDR + 0x17C)) + +/* The name convention below is from previous LPC2000 family MCUs, in LPC23xx/24xx, +these registers are known as "VICVectPriority(x)". */ +#define VICVectCntl0 (*(reg32_t *)(VIC_BASE_ADDR + 0x200)) +#define VICVectCntl1 (*(reg32_t *)(VIC_BASE_ADDR + 0x204)) +#define VICVectCntl2 (*(reg32_t *)(VIC_BASE_ADDR + 0x208)) +#define VICVectCntl3 (*(reg32_t *)(VIC_BASE_ADDR + 0x20C)) +#define VICVectCntl4 (*(reg32_t *)(VIC_BASE_ADDR + 0x210)) +#define VICVectCntl5 (*(reg32_t *)(VIC_BASE_ADDR + 0x214)) +#define VICVectCntl6 (*(reg32_t *)(VIC_BASE_ADDR + 0x218)) +#define VICVectCntl7 (*(reg32_t *)(VIC_BASE_ADDR + 0x21C)) +#define VICVectCntl8 (*(reg32_t *)(VIC_BASE_ADDR + 0x220)) +#define VICVectCntl9 (*(reg32_t *)(VIC_BASE_ADDR + 0x224)) +#define VICVectCntl10 (*(reg32_t *)(VIC_BASE_ADDR + 0x228)) +#define VICVectCntl11 (*(reg32_t *)(VIC_BASE_ADDR + 0x22C)) +#define VICVectCntl12 (*(reg32_t *)(VIC_BASE_ADDR + 0x230)) +#define VICVectCntl13 (*(reg32_t *)(VIC_BASE_ADDR + 0x234)) +#define VICVectCntl14 (*(reg32_t *)(VIC_BASE_ADDR + 0x238)) +#define VICVectCntl15 (*(reg32_t *)(VIC_BASE_ADDR + 0x23C)) +#define VICVectCntl16 (*(reg32_t *)(VIC_BASE_ADDR + 0x240)) +#define VICVectCntl17 (*(reg32_t *)(VIC_BASE_ADDR + 0x244)) +#define VICVectCntl18 (*(reg32_t *)(VIC_BASE_ADDR + 0x248)) +#define VICVectCntl19 (*(reg32_t *)(VIC_BASE_ADDR + 0x24C)) +#define VICVectCntl20 (*(reg32_t *)(VIC_BASE_ADDR + 0x250)) +#define VICVectCntl21 (*(reg32_t *)(VIC_BASE_ADDR + 0x254)) +#define VICVectCntl22 (*(reg32_t *)(VIC_BASE_ADDR + 0x258)) +#define VICVectCntl23 (*(reg32_t *)(VIC_BASE_ADDR + 0x25C)) +#define VICVectCntl24 (*(reg32_t *)(VIC_BASE_ADDR + 0x260)) +#define VICVectCntl25 (*(reg32_t *)(VIC_BASE_ADDR + 0x264)) +#define VICVectCntl26 (*(reg32_t *)(VIC_BASE_ADDR + 0x268)) +#define VICVectCntl27 (*(reg32_t *)(VIC_BASE_ADDR + 0x26C)) +#define VICVectCntl28 (*(reg32_t *)(VIC_BASE_ADDR + 0x270)) +#define VICVectCntl29 (*(reg32_t *)(VIC_BASE_ADDR + 0x274)) +#define VICVectCntl30 (*(reg32_t *)(VIC_BASE_ADDR + 0x278)) +#define VICVectCntl31 (*(reg32_t *)(VIC_BASE_ADDR + 0x27C)) + +#define VICVectAddr (*(reg32_t *)(VIC_BASE_ADDR + 0xF00)) + + +/* Pin Connect Block */ +#define PINSEL_BASE_ADDR 0xE002C000 +#define PINSEL0 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x00)) +#define PINSEL1 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x04)) +#define PINSEL2 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x08)) +#define PINSEL3 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x0C)) +#define PINSEL4 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x10)) +#define PINSEL5 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x14)) +#define PINSEL6 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x18)) +#define PINSEL7 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x1C)) +#define PINSEL8 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x20)) +#define PINSEL9 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x24)) +#define PINSEL10 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x28)) + +#define PINMODE0 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x40)) +#define PINMODE1 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x44)) +#define PINMODE2 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x48)) +#define PINMODE3 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x4C)) +#define PINMODE4 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x50)) +#define PINMODE5 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x54)) +#define PINMODE6 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x58)) +#define PINMODE7 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x5C)) +#define PINMODE8 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x60)) +#define PINMODE9 (*(reg32_t *)(PINSEL_BASE_ADDR + 0x64)) + +/* General Purpose Input/Output (GPIO) */ +#define GPIO_BASE_ADDR 0xE0028000 +#define IOPIN0 (*(reg32_t *)(GPIO_BASE_ADDR + 0x00)) +#define IOSET0 (*(reg32_t *)(GPIO_BASE_ADDR + 0x04)) +#define IODIR0 (*(reg32_t *)(GPIO_BASE_ADDR + 0x08)) +#define IOCLR0 (*(reg32_t *)(GPIO_BASE_ADDR + 0x0C)) +#define IOPIN1 (*(reg32_t *)(GPIO_BASE_ADDR + 0x10)) +#define IOSET1 (*(reg32_t *)(GPIO_BASE_ADDR + 0x14)) +#define IODIR1 (*(reg32_t *)(GPIO_BASE_ADDR + 0x18)) +#define IOCLR1 (*(reg32_t *)(GPIO_BASE_ADDR + 0x1C)) + +/* GPIO Interrupt Registers */ +#define IO0_INT_EN_R (*(reg32_t *)(GPIO_BASE_ADDR + 0x90)) +#define IO0_INT_EN_F (*(reg32_t *)(GPIO_BASE_ADDR + 0x94)) +#define IO0_INT_STAT_R (*(reg32_t *)(GPIO_BASE_ADDR + 0x84)) +#define IO0_INT_STAT_F (*(reg32_t *)(GPIO_BASE_ADDR + 0x88)) +#define IO0_INT_CLR (*(reg32_t *)(GPIO_BASE_ADDR + 0x8C)) + +#define IO2_INT_EN_R (*(reg32_t *)(GPIO_BASE_ADDR + 0xB0)) +#define IO2_INT_EN_F (*(reg32_t *)(GPIO_BASE_ADDR + 0xB4)) +#define IO2_INT_STAT_R (*(reg32_t *)(GPIO_BASE_ADDR + 0xA4)) +#define IO2_INT_STAT_F (*(reg32_t *)(GPIO_BASE_ADDR + 0xA8)) +#define IO2_INT_CLR (*(reg32_t *)(GPIO_BASE_ADDR + 0xAC)) + +#define IO_INT_STAT (*(reg32_t *)(GPIO_BASE_ADDR + 0x80)) + +#define PARTCFG_BASE_ADDR 0x3FFF8000 +#define PARTCFG (*(reg32_t *)(PARTCFG_BASE_ADDR + 0x00)) + +/* Fast I/O setup */ +#define FIO_BASE_ADDR 0x3FFFC000 +#define FIO0DIR (*(reg32_t *)(FIO_BASE_ADDR + 0x00)) +#define FIO0MASK (*(reg32_t *)(FIO_BASE_ADDR + 0x10)) +#define FIO0PIN (*(reg32_t *)(FIO_BASE_ADDR + 0x14)) +#define FIO0SET (*(reg32_t *)(FIO_BASE_ADDR + 0x18)) +#define FIO0CLR (*(reg32_t *)(FIO_BASE_ADDR + 0x1C)) + +#define FIO1DIR (*(reg32_t *)(FIO_BASE_ADDR + 0x20)) +#define FIO1MASK (*(reg32_t *)(FIO_BASE_ADDR + 0x30)) +#define FIO1PIN (*(reg32_t *)(FIO_BASE_ADDR + 0x34)) +#define FIO1SET (*(reg32_t *)(FIO_BASE_ADDR + 0x38)) +#define FIO1CLR (*(reg32_t *)(FIO_BASE_ADDR + 0x3C)) + +#define FIO2DIR (*(reg32_t *)(FIO_BASE_ADDR + 0x40)) +#define FIO2MASK (*(reg32_t *)(FIO_BASE_ADDR + 0x50)) +#define FIO2PIN (*(reg32_t *)(FIO_BASE_ADDR + 0x54)) +#define FIO2SET (*(reg32_t *)(FIO_BASE_ADDR + 0x58)) +#define FIO2CLR (*(reg32_t *)(FIO_BASE_ADDR + 0x5C)) + +#define FIO3DIR (*(reg32_t *)(FIO_BASE_ADDR + 0x60)) +#define FIO3MASK (*(reg32_t *)(FIO_BASE_ADDR + 0x70)) +#define FIO3PIN (*(reg32_t *)(FIO_BASE_ADDR + 0x74)) +#define FIO3SET (*(reg32_t *)(FIO_BASE_ADDR + 0x78)) +#define FIO3CLR (*(reg32_t *)(FIO_BASE_ADDR + 0x7C)) + +#define FIO4DIR (*(reg32_t *)(FIO_BASE_ADDR + 0x80)) +#define FIO4MASK (*(reg32_t *)(FIO_BASE_ADDR + 0x90)) +#define FIO4PIN (*(reg32_t *)(FIO_BASE_ADDR + 0x94)) +#define FIO4SET (*(reg32_t *)(FIO_BASE_ADDR + 0x98)) +#define FIO4CLR (*(reg32_t *)(FIO_BASE_ADDR + 0x9C)) + +/* FIOs can be accessed through WORD, HALF-WORD or BYTE. */ +#define FIO0DIR0 (*(reg8_t *)(FIO_BASE_ADDR + 0x00)) +#define FIO1DIR0 (*(reg8_t *)(FIO_BASE_ADDR + 0x20)) +#define FIO2DIR0 (*(reg8_t *)(FIO_BASE_ADDR + 0x40)) +#define FIO3DIR0 (*(reg8_t *)(FIO_BASE_ADDR + 0x60)) +#define FIO4DIR0 (*(reg8_t *)(FIO_BASE_ADDR + 0x80)) + +#define FIO0DIR1 (*(reg8_t *)(FIO_BASE_ADDR + 0x01)) +#define FIO1DIR1 (*(reg8_t *)(FIO_BASE_ADDR + 0x21)) +#define FIO2DIR1 (*(reg8_t *)(FIO_BASE_ADDR + 0x41)) +#define FIO3DIR1 (*(reg8_t *)(FIO_BASE_ADDR + 0x61)) +#define FIO4DIR1 (*(reg8_t *)(FIO_BASE_ADDR + 0x81)) + +#define FIO0DIR2 (*(reg8_t *)(FIO_BASE_ADDR + 0x02)) +#define FIO1DIR2 (*(reg8_t *)(FIO_BASE_ADDR + 0x22)) +#define FIO2DIR2 (*(reg8_t *)(FIO_BASE_ADDR + 0x42)) +#define FIO3DIR2 (*(reg8_t *)(FIO_BASE_ADDR + 0x62)) +#define FIO4DIR2 (*(reg8_t *)(FIO_BASE_ADDR + 0x82)) + +#define FIO0DIR3 (*(reg8_t *)(FIO_BASE_ADDR + 0x03)) +#define FIO1DIR3 (*(reg8_t *)(FIO_BASE_ADDR + 0x23)) +#define FIO2DIR3 (*(reg8_t *)(FIO_BASE_ADDR + 0x43)) +#define FIO3DIR3 (*(reg8_t *)(FIO_BASE_ADDR + 0x63)) +#define FIO4DIR3 (*(reg8_t *)(FIO_BASE_ADDR + 0x83)) + +#define FIO0DIRL (*(reg16_t *)(FIO_BASE_ADDR + 0x00)) +#define FIO1DIRL (*(reg16_t *)(FIO_BASE_ADDR + 0x20)) +#define FIO2DIRL (*(reg16_t *)(FIO_BASE_ADDR + 0x40)) +#define FIO3DIRL (*(reg16_t *)(FIO_BASE_ADDR + 0x60)) +#define FIO4DIRL (*(reg16_t *)(FIO_BASE_ADDR + 0x80)) + +#define FIO0DIRU (*(reg16_t *)(FIO_BASE_ADDR + 0x02)) +#define FIO1DIRU (*(reg16_t *)(FIO_BASE_ADDR + 0x22)) +#define FIO2DIRU (*(reg16_t *)(FIO_BASE_ADDR + 0x42)) +#define FIO3DIRU (*(reg16_t *)(FIO_BASE_ADDR + 0x62)) +#define FIO4DIRU (*(reg16_t *)(FIO_BASE_ADDR + 0x82)) + +#define FIO0MASK0 (*(reg8_t *)(FIO_BASE_ADDR + 0x10)) +#define FIO1MASK0 (*(reg8_t *)(FIO_BASE_ADDR + 0x30)) +#define FIO2MASK0 (*(reg8_t *)(FIO_BASE_ADDR + 0x50)) +#define FIO3MASK0 (*(reg8_t *)(FIO_BASE_ADDR + 0x70)) +#define FIO4MASK0 (*(reg8_t *)(FIO_BASE_ADDR + 0x90)) + +#define FIO0MASK1 (*(reg8_t *)(FIO_BASE_ADDR + 0x11)) +#define FIO1MASK1 (*(reg8_t *)(FIO_BASE_ADDR + 0x21)) +#define FIO2MASK1 (*(reg8_t *)(FIO_BASE_ADDR + 0x51)) +#define FIO3MASK1 (*(reg8_t *)(FIO_BASE_ADDR + 0x71)) +#define FIO4MASK1 (*(reg8_t *)(FIO_BASE_ADDR + 0x91)) + +#define FIO0MASK2 (*(reg8_t *)(FIO_BASE_ADDR + 0x12)) +#define FIO1MASK2 (*(reg8_t *)(FIO_BASE_ADDR + 0x32)) +#define FIO2MASK2 (*(reg8_t *)(FIO_BASE_ADDR + 0x52)) +#define FIO3MASK2 (*(reg8_t *)(FIO_BASE_ADDR + 0x72)) +#define FIO4MASK2 (*(reg8_t *)(FIO_BASE_ADDR + 0x92)) + +#define FIO0MASK3 (*(reg8_t *)(FIO_BASE_ADDR + 0x13)) +#define FIO1MASK3 (*(reg8_t *)(FIO_BASE_ADDR + 0x33)) +#define FIO2MASK3 (*(reg8_t *)(FIO_BASE_ADDR + 0x53)) +#define FIO3MASK3 (*(reg8_t *)(FIO_BASE_ADDR + 0x73)) +#define FIO4MASK3 (*(reg8_t *)(FIO_BASE_ADDR + 0x93)) + +#define FIO0MASKL (*(reg16_t *)(FIO_BASE_ADDR + 0x10)) +#define FIO1MASKL (*(reg16_t *)(FIO_BASE_ADDR + 0x30)) +#define FIO2MASKL (*(reg16_t *)(FIO_BASE_ADDR + 0x50)) +#define FIO3MASKL (*(reg16_t *)(FIO_BASE_ADDR + 0x70)) +#define FIO4MASKL (*(reg16_t *)(FIO_BASE_ADDR + 0x90)) + +#define FIO0MASKU (*(reg16_t *)(FIO_BASE_ADDR + 0x12)) +#define FIO1MASKU (*(reg16_t *)(FIO_BASE_ADDR + 0x32)) +#define FIO2MASKU (*(reg16_t *)(FIO_BASE_ADDR + 0x52)) +#define FIO3MASKU (*(reg16_t *)(FIO_BASE_ADDR + 0x72)) +#define FIO4MASKU (*(reg16_t *)(FIO_BASE_ADDR + 0x92)) + +#define FIO0PIN0 (*(reg8_t *)(FIO_BASE_ADDR + 0x14)) +#define FIO1PIN0 (*(reg8_t *)(FIO_BASE_ADDR + 0x34)) +#define FIO2PIN0 (*(reg8_t *)(FIO_BASE_ADDR + 0x54)) +#define FIO3PIN0 (*(reg8_t *)(FIO_BASE_ADDR + 0x74)) +#define FIO4PIN0 (*(reg8_t *)(FIO_BASE_ADDR + 0x94)) + +#define FIO0PIN1 (*(reg8_t *)(FIO_BASE_ADDR + 0x15)) +#define FIO1PIN1 (*(reg8_t *)(FIO_BASE_ADDR + 0x25)) +#define FIO2PIN1 (*(reg8_t *)(FIO_BASE_ADDR + 0x55)) +#define FIO3PIN1 (*(reg8_t *)(FIO_BASE_ADDR + 0x75)) +#define FIO4PIN1 (*(reg8_t *)(FIO_BASE_ADDR + 0x95)) + +#define FIO0PIN2 (*(reg8_t *)(FIO_BASE_ADDR + 0x16)) +#define FIO1PIN2 (*(reg8_t *)(FIO_BASE_ADDR + 0x36)) +#define FIO2PIN2 (*(reg8_t *)(FIO_BASE_ADDR + 0x56)) +#define FIO3PIN2 (*(reg8_t *)(FIO_BASE_ADDR + 0x76)) +#define FIO4PIN2 (*(reg8_t *)(FIO_BASE_ADDR + 0x96)) + +#define FIO0PIN3 (*(reg8_t *)(FIO_BASE_ADDR + 0x17)) +#define FIO1PIN3 (*(reg8_t *)(FIO_BASE_ADDR + 0x37)) +#define FIO2PIN3 (*(reg8_t *)(FIO_BASE_ADDR + 0x57)) +#define FIO3PIN3 (*(reg8_t *)(FIO_BASE_ADDR + 0x77)) +#define FIO4PIN3 (*(reg8_t *)(FIO_BASE_ADDR + 0x97)) + +#define FIO0PINL (*(reg16_t *)(FIO_BASE_ADDR + 0x14)) +#define FIO1PINL (*(reg16_t *)(FIO_BASE_ADDR + 0x34)) +#define FIO2PINL (*(reg16_t *)(FIO_BASE_ADDR + 0x54)) +#define FIO3PINL (*(reg16_t *)(FIO_BASE_ADDR + 0x74)) +#define FIO4PINL (*(reg16_t *)(FIO_BASE_ADDR + 0x94)) + +#define FIO0PINU (*(reg16_t *)(FIO_BASE_ADDR + 0x16)) +#define FIO1PINU (*(reg16_t *)(FIO_BASE_ADDR + 0x36)) +#define FIO2PINU (*(reg16_t *)(FIO_BASE_ADDR + 0x56)) +#define FIO3PINU (*(reg16_t *)(FIO_BASE_ADDR + 0x76)) +#define FIO4PINU (*(reg16_t *)(FIO_BASE_ADDR + 0x96)) + +#define FIO0SET0 (*(reg8_t *)(FIO_BASE_ADDR + 0x18)) +#define FIO1SET0 (*(reg8_t *)(FIO_BASE_ADDR + 0x38)) +#define FIO2SET0 (*(reg8_t *)(FIO_BASE_ADDR + 0x58)) +#define FIO3SET0 (*(reg8_t *)(FIO_BASE_ADDR + 0x78)) +#define FIO4SET0 (*(reg8_t *)(FIO_BASE_ADDR + 0x98)) + +#define FIO0SET1 (*(reg8_t *)(FIO_BASE_ADDR + 0x19)) +#define FIO1SET1 (*(reg8_t *)(FIO_BASE_ADDR + 0x29)) +#define FIO2SET1 (*(reg8_t *)(FIO_BASE_ADDR + 0x59)) +#define FIO3SET1 (*(reg8_t *)(FIO_BASE_ADDR + 0x79)) +#define FIO4SET1 (*(reg8_t *)(FIO_BASE_ADDR + 0x99)) + +#define FIO0SET2 (*(reg8_t *)(FIO_BASE_ADDR + 0x1A)) +#define FIO1SET2 (*(reg8_t *)(FIO_BASE_ADDR + 0x3A)) +#define FIO2SET2 (*(reg8_t *)(FIO_BASE_ADDR + 0x5A)) +#define FIO3SET2 (*(reg8_t *)(FIO_BASE_ADDR + 0x7A)) +#define FIO4SET2 (*(reg8_t *)(FIO_BASE_ADDR + 0x9A)) + +#define FIO0SET3 (*(reg8_t *)(FIO_BASE_ADDR + 0x1B)) +#define FIO1SET3 (*(reg8_t *)(FIO_BASE_ADDR + 0x3B)) +#define FIO2SET3 (*(reg8_t *)(FIO_BASE_ADDR + 0x5B)) +#define FIO3SET3 (*(reg8_t *)(FIO_BASE_ADDR + 0x7B)) +#define FIO4SET3 (*(reg8_t *)(FIO_BASE_ADDR + 0x9B)) + +#define FIO0SETL (*(reg16_t *)(FIO_BASE_ADDR + 0x18)) +#define FIO1SETL (*(reg16_t *)(FIO_BASE_ADDR + 0x38)) +#define FIO2SETL (*(reg16_t *)(FIO_BASE_ADDR + 0x58)) +#define FIO3SETL (*(reg16_t *)(FIO_BASE_ADDR + 0x78)) +#define FIO4SETL (*(reg16_t *)(FIO_BASE_ADDR + 0x98)) + +#define FIO0SETU (*(reg16_t *)(FIO_BASE_ADDR + 0x1A)) +#define FIO1SETU (*(reg16_t *)(FIO_BASE_ADDR + 0x3A)) +#define FIO2SETU (*(reg16_t *)(FIO_BASE_ADDR + 0x5A)) +#define FIO3SETU (*(reg16_t *)(FIO_BASE_ADDR + 0x7A)) +#define FIO4SETU (*(reg16_t *)(FIO_BASE_ADDR + 0x9A)) + +#define FIO0CLR0 (*(reg8_t *)(FIO_BASE_ADDR + 0x1C)) +#define FIO1CLR0 (*(reg8_t *)(FIO_BASE_ADDR + 0x3C)) +#define FIO2CLR0 (*(reg8_t *)(FIO_BASE_ADDR + 0x5C)) +#define FIO3CLR0 (*(reg8_t *)(FIO_BASE_ADDR + 0x7C)) +#define FIO4CLR0 (*(reg8_t *)(FIO_BASE_ADDR + 0x9C)) + +#define FIO0CLR1 (*(reg8_t *)(FIO_BASE_ADDR + 0x1D)) +#define FIO1CLR1 (*(reg8_t *)(FIO_BASE_ADDR + 0x2D)) +#define FIO2CLR1 (*(reg8_t *)(FIO_BASE_ADDR + 0x5D)) +#define FIO3CLR1 (*(reg8_t *)(FIO_BASE_ADDR + 0x7D)) +#define FIO4CLR1 (*(reg8_t *)(FIO_BASE_ADDR + 0x9D)) + +#define FIO0CLR2 (*(reg8_t *)(FIO_BASE_ADDR + 0x1E)) +#define FIO1CLR2 (*(reg8_t *)(FIO_BASE_ADDR + 0x3E)) +#define FIO2CLR2 (*(reg8_t *)(FIO_BASE_ADDR + 0x5E)) +#define FIO3CLR2 (*(reg8_t *)(FIO_BASE_ADDR + 0x7E)) +#define FIO4CLR2 (*(reg8_t *)(FIO_BASE_ADDR + 0x9E)) + +#define FIO0CLR3 (*(reg8_t *)(FIO_BASE_ADDR + 0x1F)) +#define FIO1CLR3 (*(reg8_t *)(FIO_BASE_ADDR + 0x3F)) +#define FIO2CLR3 (*(reg8_t *)(FIO_BASE_ADDR + 0x5F)) +#define FIO3CLR3 (*(reg8_t *)(FIO_BASE_ADDR + 0x7F)) +#define FIO4CLR3 (*(reg8_t *)(FIO_BASE_ADDR + 0x9F)) + +#define FIO0CLRL (*(reg16_t *)(FIO_BASE_ADDR + 0x1C)) +#define FIO1CLRL (*(reg16_t *)(FIO_BASE_ADDR + 0x3C)) +#define FIO2CLRL (*(reg16_t *)(FIO_BASE_ADDR + 0x5C)) +#define FIO3CLRL (*(reg16_t *)(FIO_BASE_ADDR + 0x7C)) +#define FIO4CLRL (*(reg16_t *)(FIO_BASE_ADDR + 0x9C)) + +#define FIO0CLRU (*(reg16_t *)(FIO_BASE_ADDR + 0x1E)) +#define FIO1CLRU (*(reg16_t *)(FIO_BASE_ADDR + 0x3E)) +#define FIO2CLRU (*(reg16_t *)(FIO_BASE_ADDR + 0x5E)) +#define FIO3CLRU (*(reg16_t *)(FIO_BASE_ADDR + 0x7E)) +#define FIO4CLRU (*(reg16_t *)(FIO_BASE_ADDR + 0x9E)) + + +/* System Control Block(SCB) modules include Memory Accelerator Module, +Phase Locked Loop, VPB divider, Power Control, External Interrupt, +Reset, and Code Security/Debugging */ +#define SCB_BASE_ADDR 0xE01FC000 + +/* Memory Accelerator Module (MAM) */ +#define MAMCR (*(reg32_t *)(SCB_BASE_ADDR + 0x000)) +#define MAMTIM (*(reg32_t *)(SCB_BASE_ADDR + 0x004)) +#define MEMMAP (*(reg32_t *)(SCB_BASE_ADDR + 0x040)) + +/* Phase Locked Loop (PLL) */ +#define PLLCON (*(reg32_t *)(SCB_BASE_ADDR + 0x080)) +#define PLLCFG (*(reg32_t *)(SCB_BASE_ADDR + 0x084)) +#define PLLSTAT (*(reg32_t *)(SCB_BASE_ADDR + 0x088)) +#define PLLFEED (*(reg32_t *)(SCB_BASE_ADDR + 0x08C)) + +/* Power Control */ +#define PCON (*(reg32_t *)(SCB_BASE_ADDR + 0x0C0)) +#define PCONP (*(reg32_t *)(SCB_BASE_ADDR + 0x0C4)) + +/* Clock Divider */ +// #define APBDIV (*(reg32_t *)(SCB_BASE_ADDR + 0x100)) +#define CCLKCFG (*(reg32_t *)(SCB_BASE_ADDR + 0x104)) +#define USBCLKCFG (*(reg32_t *)(SCB_BASE_ADDR + 0x108)) +#define CLKSRCSEL (*(reg32_t *)(SCB_BASE_ADDR + 0x10C)) +#define PCLKSEL0 (*(reg32_t *)(SCB_BASE_ADDR + 0x1A8)) +#define PCLKSEL1 (*(reg32_t *)(SCB_BASE_ADDR + 0x1AC)) + +/* External Interrupts */ +#define EXTINT (*(reg32_t *)(SCB_BASE_ADDR + 0x140)) +#define INTWAKE (*(reg32_t *)(SCB_BASE_ADDR + 0x144)) +#define EXTMODE (*(reg32_t *)(SCB_BASE_ADDR + 0x148)) +#define EXTPOLAR (*(reg32_t *)(SCB_BASE_ADDR + 0x14C)) + +/* Reset, reset source identification */ +#define RSIR (*(reg32_t *)(SCB_BASE_ADDR + 0x180)) + +/* RSID, code security protection */ +#define CSPR (*(reg32_t *)(SCB_BASE_ADDR + 0x184)) + +/* AHB configuration */ +#define AHBCFG1 (*(reg32_t *)(SCB_BASE_ADDR + 0x188)) +#define AHBCFG2 (*(reg32_t *)(SCB_BASE_ADDR + 0x18C)) + +/* System Controls and Status */ +#define SCS (*(reg32_t *)(SCB_BASE_ADDR + 0x1A0)) + +/* MPMC(EMC) registers, note: all the external memory controller(EMC) registers +are for LPC24xx only. */ +#define STATIC_MEM0_BASE 0x80000000 +#define STATIC_MEM1_BASE 0x81000000 +#define STATIC_MEM2_BASE 0x82000000 +#define STATIC_MEM3_BASE 0x83000000 + +#define DYNAMIC_MEM0_BASE 0xA0000000 +#define DYNAMIC_MEM1_BASE 0xB0000000 +#define DYNAMIC_MEM2_BASE 0xC0000000 +#define DYNAMIC_MEM3_BASE 0xD0000000 + +/* External Memory Controller (EMC) */ +#define EMC_BASE_ADDR 0xFFE08000 +#define EMC_CTRL (*(reg32_t *)(EMC_BASE_ADDR + 0x000)) +#define EMC_STAT (*(reg32_t *)(EMC_BASE_ADDR + 0x004)) +#define EMC_CONFIG (*(reg32_t *)(EMC_BASE_ADDR + 0x008)) + +/* Dynamic RAM access registers */ +#define EMC_DYN_CTRL (*(reg32_t *)(EMC_BASE_ADDR + 0x020)) +#define EMC_DYN_RFSH (*(reg32_t *)(EMC_BASE_ADDR + 0x024)) +#define EMC_DYN_RD_CFG (*(reg32_t *)(EMC_BASE_ADDR + 0x028)) +#define EMC_DYN_RP (*(reg32_t *)(EMC_BASE_ADDR + 0x030)) +#define EMC_DYN_RAS (*(reg32_t *)(EMC_BASE_ADDR + 0x034)) +#define EMC_DYN_SREX (*(reg32_t *)(EMC_BASE_ADDR + 0x038)) +#define EMC_DYN_APR (*(reg32_t *)(EMC_BASE_ADDR + 0x03C)) +#define EMC_DYN_DAL (*(reg32_t *)(EMC_BASE_ADDR + 0x040)) +#define EMC_DYN_WR (*(reg32_t *)(EMC_BASE_ADDR + 0x044)) +#define EMC_DYN_RC (*(reg32_t *)(EMC_BASE_ADDR + 0x048)) +#define EMC_DYN_RFC (*(reg32_t *)(EMC_BASE_ADDR + 0x04C)) +#define EMC_DYN_XSR (*(reg32_t *)(EMC_BASE_ADDR + 0x050)) +#define EMC_DYN_RRD (*(reg32_t *)(EMC_BASE_ADDR + 0x054)) +#define EMC_DYN_MRD (*(reg32_t *)(EMC_BASE_ADDR + 0x058)) + +#define EMC_DYN_CFG0 (*(reg32_t *)(EMC_BASE_ADDR + 0x100)) +#define EMC_DYN_RASCAS0 (*(reg32_t *)(EMC_BASE_ADDR + 0x104)) +#define EMC_DYN_CFG1 (*(reg32_t *)(EMC_BASE_ADDR + 0x140)) +#define EMC_DYN_RASCAS1 (*(reg32_t *)(EMC_BASE_ADDR + 0x144)) +#define EMC_DYN_CFG2 (*(reg32_t *)(EMC_BASE_ADDR + 0x160)) +#define EMC_DYN_RASCAS2 (*(reg32_t *)(EMC_BASE_ADDR + 0x164)) +#define EMC_DYN_CFG3 (*(reg32_t *)(EMC_BASE_ADDR + 0x180)) +#define EMC_DYN_RASCAS3 (*(reg32_t *)(EMC_BASE_ADDR + 0x184)) + +/* static RAM access registers */ +#define EMC_STA_CFG0 (*(reg32_t *)(EMC_BASE_ADDR + 0x200)) +#define EMC_STA_WAITWEN0 (*(reg32_t *)(EMC_BASE_ADDR + 0x204)) +#define EMC_STA_WAITOEN0 (*(reg32_t *)(EMC_BASE_ADDR + 0x208)) +#define EMC_STA_WAITRD0 (*(reg32_t *)(EMC_BASE_ADDR + 0x20C)) +#define EMC_STA_WAITPAGE0 (*(reg32_t *)(EMC_BASE_ADDR + 0x210)) +#define EMC_STA_WAITWR0 (*(reg32_t *)(EMC_BASE_ADDR + 0x214)) +#define EMC_STA_WAITTURN0 (*(reg32_t *)(EMC_BASE_ADDR + 0x218)) + +#define EMC_STA_CFG1 (*(reg32_t *)(EMC_BASE_ADDR + 0x220)) +#define EMC_STA_WAITWEN1 (*(reg32_t *)(EMC_BASE_ADDR + 0x224)) +#define EMC_STA_WAITOEN1 (*(reg32_t *)(EMC_BASE_ADDR + 0x228)) +#define EMC_STA_WAITRD1 (*(reg32_t *)(EMC_BASE_ADDR + 0x22C)) +#define EMC_STA_WAITPAGE1 (*(reg32_t *)(EMC_BASE_ADDR + 0x230)) +#define EMC_STA_WAITWR1 (*(reg32_t *)(EMC_BASE_ADDR + 0x234)) +#define EMC_STA_WAITTURN1 (*(reg32_t *)(EMC_BASE_ADDR + 0x238)) + +#define EMC_STA_CFG2 (*(reg32_t *)(EMC_BASE_ADDR + 0x240)) +#define EMC_STA_WAITWEN2 (*(reg32_t *)(EMC_BASE_ADDR + 0x244)) +#define EMC_STA_WAITOEN2 (*(reg32_t *)(EMC_BASE_ADDR + 0x248)) +#define EMC_STA_WAITRD2 (*(reg32_t *)(EMC_BASE_ADDR + 0x24C)) +#define EMC_STA_WAITPAGE2 (*(reg32_t *)(EMC_BASE_ADDR + 0x250)) +#define EMC_STA_WAITWR2 (*(reg32_t *)(EMC_BASE_ADDR + 0x254)) +#define EMC_STA_WAITTURN2 (*(reg32_t *)(EMC_BASE_ADDR + 0x258)) + +#define EMC_STA_CFG3 (*(reg32_t *)(EMC_BASE_ADDR + 0x260)) +#define EMC_STA_WAITWEN3 (*(reg32_t *)(EMC_BASE_ADDR + 0x264)) +#define EMC_STA_WAITOEN3 (*(reg32_t *)(EMC_BASE_ADDR + 0x268)) +#define EMC_STA_WAITRD3 (*(reg32_t *)(EMC_BASE_ADDR + 0x26C)) +#define EMC_STA_WAITPAGE3 (*(reg32_t *)(EMC_BASE_ADDR + 0x270)) +#define EMC_STA_WAITWR3 (*(reg32_t *)(EMC_BASE_ADDR + 0x274)) +#define EMC_STA_WAITTURN3 (*(reg32_t *)(EMC_BASE_ADDR + 0x278)) + +#define EMC_STA_EXT_WAIT (*(reg32_t *)(EMC_BASE_ADDR + 0x880)) + + +/* Timer 0 */ +#define TMR0_BASE_ADDR 0xE0004000 +#define T0IR (*(reg32_t *)(TMR0_BASE_ADDR + 0x00)) +#define T0TCR (*(reg32_t *)(TMR0_BASE_ADDR + 0x04)) +#define T0TC (*(reg32_t *)(TMR0_BASE_ADDR + 0x08)) +#define T0PR (*(reg32_t *)(TMR0_BASE_ADDR + 0x0C)) +#define T0PC (*(reg32_t *)(TMR0_BASE_ADDR + 0x10)) +#define T0MCR (*(reg32_t *)(TMR0_BASE_ADDR + 0x14)) +#define T0MR0 (*(reg32_t *)(TMR0_BASE_ADDR + 0x18)) +#define T0MR1 (*(reg32_t *)(TMR0_BASE_ADDR + 0x1C)) +#define T0MR2 (*(reg32_t *)(TMR0_BASE_ADDR + 0x20)) +#define T0MR3 (*(reg32_t *)(TMR0_BASE_ADDR + 0x24)) +#define T0CCR (*(reg32_t *)(TMR0_BASE_ADDR + 0x28)) +#define T0CR0 (*(reg32_t *)(TMR0_BASE_ADDR + 0x2C)) +#define T0CR1 (*(reg32_t *)(TMR0_BASE_ADDR + 0x30)) +#define T0CR2 (*(reg32_t *)(TMR0_BASE_ADDR + 0x34)) +#define T0CR3 (*(reg32_t *)(TMR0_BASE_ADDR + 0x38)) +#define T0EMR (*(reg32_t *)(TMR0_BASE_ADDR + 0x3C)) +#define T0CTCR (*(reg32_t *)(TMR0_BASE_ADDR + 0x70)) + +/* Timer 1 */ +#define TMR1_BASE_ADDR 0xE0008000 +#define T1IR (*(reg32_t *)(TMR1_BASE_ADDR + 0x00)) +#define T1TCR (*(reg32_t *)(TMR1_BASE_ADDR + 0x04)) +#define T1TC (*(reg32_t *)(TMR1_BASE_ADDR + 0x08)) +#define T1PR (*(reg32_t *)(TMR1_BASE_ADDR + 0x0C)) +#define T1PC (*(reg32_t *)(TMR1_BASE_ADDR + 0x10)) +#define T1MCR (*(reg32_t *)(TMR1_BASE_ADDR + 0x14)) +#define T1MR0 (*(reg32_t *)(TMR1_BASE_ADDR + 0x18)) +#define T1MR1 (*(reg32_t *)(TMR1_BASE_ADDR + 0x1C)) +#define T1MR2 (*(reg32_t *)(TMR1_BASE_ADDR + 0x20)) +#define T1MR3 (*(reg32_t *)(TMR1_BASE_ADDR + 0x24)) +#define T1CCR (*(reg32_t *)(TMR1_BASE_ADDR + 0x28)) +#define T1CR0 (*(reg32_t *)(TMR1_BASE_ADDR + 0x2C)) +#define T1CR1 (*(reg32_t *)(TMR1_BASE_ADDR + 0x30)) +#define T1CR2 (*(reg32_t *)(TMR1_BASE_ADDR + 0x34)) +#define T1CR3 (*(reg32_t *)(TMR1_BASE_ADDR + 0x38)) +#define T1EMR (*(reg32_t *)(TMR1_BASE_ADDR + 0x3C)) +#define T1CTCR (*(reg32_t *)(TMR1_BASE_ADDR + 0x70)) + +/* Timer 2 */ +#define TMR2_BASE_ADDR 0xE0070000 +#define T2IR (*(reg32_t *)(TMR2_BASE_ADDR + 0x00)) +#define T2TCR (*(reg32_t *)(TMR2_BASE_ADDR + 0x04)) +#define T2TC (*(reg32_t *)(TMR2_BASE_ADDR + 0x08)) +#define T2PR (*(reg32_t *)(TMR2_BASE_ADDR + 0x0C)) +#define T2PC (*(reg32_t *)(TMR2_BASE_ADDR + 0x10)) +#define T2MCR (*(reg32_t *)(TMR2_BASE_ADDR + 0x14)) +#define T2MR0 (*(reg32_t *)(TMR2_BASE_ADDR + 0x18)) +#define T2MR1 (*(reg32_t *)(TMR2_BASE_ADDR + 0x1C)) +#define T2MR2 (*(reg32_t *)(TMR2_BASE_ADDR + 0x20)) +#define T2MR3 (*(reg32_t *)(TMR2_BASE_ADDR + 0x24)) +#define T2CCR (*(reg32_t *)(TMR2_BASE_ADDR + 0x28)) +#define T2CR0 (*(reg32_t *)(TMR2_BASE_ADDR + 0x2C)) +#define T2CR1 (*(reg32_t *)(TMR2_BASE_ADDR + 0x30)) +#define T2CR2 (*(reg32_t *)(TMR2_BASE_ADDR + 0x34)) +#define T2CR3 (*(reg32_t *)(TMR2_BASE_ADDR + 0x38)) +#define T2EMR (*(reg32_t *)(TMR2_BASE_ADDR + 0x3C)) +#define T2CTCR (*(reg32_t *)(TMR2_BASE_ADDR + 0x70)) + +/* Timer 3 */ +#define TMR3_BASE_ADDR 0xE0074000 +#define T3IR (*(reg32_t *)(TMR3_BASE_ADDR + 0x00)) +#define T3TCR (*(reg32_t *)(TMR3_BASE_ADDR + 0x04)) +#define T3TC (*(reg32_t *)(TMR3_BASE_ADDR + 0x08)) +#define T3PR (*(reg32_t *)(TMR3_BASE_ADDR + 0x0C)) +#define T3PC (*(reg32_t *)(TMR3_BASE_ADDR + 0x10)) +#define T3MCR (*(reg32_t *)(TMR3_BASE_ADDR + 0x14)) +#define T3MR0 (*(reg32_t *)(TMR3_BASE_ADDR + 0x18)) +#define T3MR1 (*(reg32_t *)(TMR3_BASE_ADDR + 0x1C)) +#define T3MR2 (*(reg32_t *)(TMR3_BASE_ADDR + 0x20)) +#define T3MR3 (*(reg32_t *)(TMR3_BASE_ADDR + 0x24)) +#define T3CCR (*(reg32_t *)(TMR3_BASE_ADDR + 0x28)) +#define T3CR0 (*(reg32_t *)(TMR3_BASE_ADDR + 0x2C)) +#define T3CR1 (*(reg32_t *)(TMR3_BASE_ADDR + 0x30)) +#define T3CR2 (*(reg32_t *)(TMR3_BASE_ADDR + 0x34)) +#define T3CR3 (*(reg32_t *)(TMR3_BASE_ADDR + 0x38)) +#define T3EMR (*(reg32_t *)(TMR3_BASE_ADDR + 0x3C)) +#define T3CTCR (*(reg32_t *)(TMR3_BASE_ADDR + 0x70)) + + +/* Pulse Width Modulator (PWM) */ +#define PWM0_BASE_ADDR 0xE0014000 +#define PWM0IR (*(reg32_t *)(PWM0_BASE_ADDR + 0x00)) +#define PWM0TCR (*(reg32_t *)(PWM0_BASE_ADDR + 0x04)) +#define PWM0TC (*(reg32_t *)(PWM0_BASE_ADDR + 0x08)) +#define PWM0PR (*(reg32_t *)(PWM0_BASE_ADDR + 0x0C)) +#define PWM0PC (*(reg32_t *)(PWM0_BASE_ADDR + 0x10)) +#define PWM0MCR (*(reg32_t *)(PWM0_BASE_ADDR + 0x14)) +#define PWM0MR0 (*(reg32_t *)(PWM0_BASE_ADDR + 0x18)) +#define PWM0MR1 (*(reg32_t *)(PWM0_BASE_ADDR + 0x1C)) +#define PWM0MR2 (*(reg32_t *)(PWM0_BASE_ADDR + 0x20)) +#define PWM0MR3 (*(reg32_t *)(PWM0_BASE_ADDR + 0x24)) +#define PWM0CCR (*(reg32_t *)(PWM0_BASE_ADDR + 0x28)) +#define PWM0CR0 (*(reg32_t *)(PWM0_BASE_ADDR + 0x2C)) +#define PWM0CR1 (*(reg32_t *)(PWM0_BASE_ADDR + 0x30)) +#define PWM0CR2 (*(reg32_t *)(PWM0_BASE_ADDR + 0x34)) +#define PWM0CR3 (*(reg32_t *)(PWM0_BASE_ADDR + 0x38)) +#define PWM0EMR (*(reg32_t *)(PWM0_BASE_ADDR + 0x3C)) +#define PWM0MR4 (*(reg32_t *)(PWM0_BASE_ADDR + 0x40)) +#define PWM0MR5 (*(reg32_t *)(PWM0_BASE_ADDR + 0x44)) +#define PWM0MR6 (*(reg32_t *)(PWM0_BASE_ADDR + 0x48)) +#define PWM0PCR (*(reg32_t *)(PWM0_BASE_ADDR + 0x4C)) +#define PWM0LER (*(reg32_t *)(PWM0_BASE_ADDR + 0x50)) +#define PWM0CTCR (*(reg32_t *)(PWM0_BASE_ADDR + 0x70)) + +#define PWM1_BASE_ADDR 0xE0018000 +#define PWM1IR (*(reg32_t *)(PWM1_BASE_ADDR + 0x00)) +#define PWM1TCR (*(reg32_t *)(PWM1_BASE_ADDR + 0x04)) +#define PWM1TC (*(reg32_t *)(PWM1_BASE_ADDR + 0x08)) +#define PWM1PR (*(reg32_t *)(PWM1_BASE_ADDR + 0x0C)) +#define PWM1PC (*(reg32_t *)(PWM1_BASE_ADDR + 0x10)) +#define PWM1MCR (*(reg32_t *)(PWM1_BASE_ADDR + 0x14)) +#define PWM1MR0 (*(reg32_t *)(PWM1_BASE_ADDR + 0x18)) +#define PWM1MR1 (*(reg32_t *)(PWM1_BASE_ADDR + 0x1C)) +#define PWM1MR2 (*(reg32_t *)(PWM1_BASE_ADDR + 0x20)) +#define PWM1MR3 (*(reg32_t *)(PWM1_BASE_ADDR + 0x24)) +#define PWM1CCR (*(reg32_t *)(PWM1_BASE_ADDR + 0x28)) +#define PWM1CR0 (*(reg32_t *)(PWM1_BASE_ADDR + 0x2C)) +#define PWM1CR1 (*(reg32_t *)(PWM1_BASE_ADDR + 0x30)) +#define PWM1CR2 (*(reg32_t *)(PWM1_BASE_ADDR + 0x34)) +#define PWM1CR3 (*(reg32_t *)(PWM1_BASE_ADDR + 0x38)) +#define PWM1EMR (*(reg32_t *)(PWM1_BASE_ADDR + 0x3C)) +#define PWM1MR4 (*(reg32_t *)(PWM1_BASE_ADDR + 0x40)) +#define PWM1MR5 (*(reg32_t *)(PWM1_BASE_ADDR + 0x44)) +#define PWM1MR6 (*(reg32_t *)(PWM1_BASE_ADDR + 0x48)) +#define PWM1PCR (*(reg32_t *)(PWM1_BASE_ADDR + 0x4C)) +#define PWM1LER (*(reg32_t *)(PWM1_BASE_ADDR + 0x50)) +#define PWM1CTCR (*(reg32_t *)(PWM1_BASE_ADDR + 0x70)) + + +/* Universal Asynchronous Receiver Transmitter 0 (UART0) */ +#define UART0_BASE_ADDR 0xE000C000 +#define U0RBR (*(reg32_t *)(UART0_BASE_ADDR + 0x00)) +#define U0THR (*(reg32_t *)(UART0_BASE_ADDR + 0x00)) +#define U0DLL (*(reg32_t *)(UART0_BASE_ADDR + 0x00)) +#define U0DLM (*(reg32_t *)(UART0_BASE_ADDR + 0x04)) +#define U0IER (*(reg32_t *)(UART0_BASE_ADDR + 0x04)) +#define U0IIR (*(reg32_t *)(UART0_BASE_ADDR + 0x08)) +#define U0FCR (*(reg32_t *)(UART0_BASE_ADDR + 0x08)) +#define U0LCR (*(reg32_t *)(UART0_BASE_ADDR + 0x0C)) +#define U0LSR (*(reg32_t *)(UART0_BASE_ADDR + 0x14)) +#define U0SCR (*(reg32_t *)(UART0_BASE_ADDR + 0x1C)) +#define U0ACR (*(reg32_t *)(UART0_BASE_ADDR + 0x20)) +#define U0ICR (*(reg32_t *)(UART0_BASE_ADDR + 0x24)) +#define U0FDR (*(reg32_t *)(UART0_BASE_ADDR + 0x28)) +#define U0TER (*(reg32_t *)(UART0_BASE_ADDR + 0x30)) + +/* Universal Asynchronous Receiver Transmitter 1 (UART1) */ +#define UART1_BASE_ADDR 0xE0010000 +#define U1RBR (*(reg32_t *)(UART1_BASE_ADDR + 0x00)) +#define U1THR (*(reg32_t *)(UART1_BASE_ADDR + 0x00)) +#define U1DLL (*(reg32_t *)(UART1_BASE_ADDR + 0x00)) +#define U1DLM (*(reg32_t *)(UART1_BASE_ADDR + 0x04)) +#define U1IER (*(reg32_t *)(UART1_BASE_ADDR + 0x04)) +#define U1IIR (*(reg32_t *)(UART1_BASE_ADDR + 0x08)) +#define U1FCR (*(reg32_t *)(UART1_BASE_ADDR + 0x08)) +#define U1LCR (*(reg32_t *)(UART1_BASE_ADDR + 0x0C)) +#define U1MCR (*(reg32_t *)(UART1_BASE_ADDR + 0x10)) +#define U1LSR (*(reg32_t *)(UART1_BASE_ADDR + 0x14)) +#define U1MSR (*(reg32_t *)(UART1_BASE_ADDR + 0x18)) +#define U1SCR (*(reg32_t *)(UART1_BASE_ADDR + 0x1C)) +#define U1ACR (*(reg32_t *)(UART1_BASE_ADDR + 0x20)) +#define U1FDR (*(reg32_t *)(UART1_BASE_ADDR + 0x28)) +#define U1TER (*(reg32_t *)(UART1_BASE_ADDR + 0x30)) + +/* Universal Asynchronous Receiver Transmitter 2 (UART2) */ +#define UART2_BASE_ADDR 0xE0078000 +#define U2RBR (*(reg32_t *)(UART2_BASE_ADDR + 0x00)) +#define U2THR (*(reg32_t *)(UART2_BASE_ADDR + 0x00)) +#define U2DLL (*(reg32_t *)(UART2_BASE_ADDR + 0x00)) +#define U2DLM (*(reg32_t *)(UART2_BASE_ADDR + 0x04)) +#define U2IER (*(reg32_t *)(UART2_BASE_ADDR + 0x04)) +#define U2IIR (*(reg32_t *)(UART2_BASE_ADDR + 0x08)) +#define U2FCR (*(reg32_t *)(UART2_BASE_ADDR + 0x08)) +#define U2LCR (*(reg32_t *)(UART2_BASE_ADDR + 0x0C)) +#define U2LSR (*(reg32_t *)(UART2_BASE_ADDR + 0x14)) +#define U2SCR (*(reg32_t *)(UART2_BASE_ADDR + 0x1C)) +#define U2ACR (*(reg32_t *)(UART2_BASE_ADDR + 0x20)) +#define U2ICR (*(reg32_t *)(UART2_BASE_ADDR + 0x24)) +#define U2FDR (*(reg32_t *)(UART2_BASE_ADDR + 0x28)) +#define U2TER (*(reg32_t *)(UART2_BASE_ADDR + 0x30)) + +/* Universal Asynchronous Receiver Transmitter 3 (UART3) */ +#define UART3_BASE_ADDR 0xE007C000 +#define U3RBR (*(reg32_t *)(UART3_BASE_ADDR + 0x00)) +#define U3THR (*(reg32_t *)(UART3_BASE_ADDR + 0x00)) +#define U3DLL (*(reg32_t *)(UART3_BASE_ADDR + 0x00)) +#define U3DLM (*(reg32_t *)(UART3_BASE_ADDR + 0x04)) +#define U3IER (*(reg32_t *)(UART3_BASE_ADDR + 0x04)) +#define U3IIR (*(reg32_t *)(UART3_BASE_ADDR + 0x08)) +#define U3FCR (*(reg32_t *)(UART3_BASE_ADDR + 0x08)) +#define U3LCR (*(reg32_t *)(UART3_BASE_ADDR + 0x0C)) +#define U3LSR (*(reg32_t *)(UART3_BASE_ADDR + 0x14)) +#define U3SCR (*(reg32_t *)(UART3_BASE_ADDR + 0x1C)) +#define U3ACR (*(reg32_t *)(UART3_BASE_ADDR + 0x20)) +#define U3ICR (*(reg32_t *)(UART3_BASE_ADDR + 0x24)) +#define U3FDR (*(reg32_t *)(UART3_BASE_ADDR + 0x28)) +#define U3TER (*(reg32_t *)(UART3_BASE_ADDR + 0x30)) + +/* I2C Interface 0 */ +#define I2C0_BASE_ADDR 0xE001C000 +#define I20CONSET (*(reg32_t *)(I2C0_BASE_ADDR + 0x00)) +#define I20STAT (*(reg32_t *)(I2C0_BASE_ADDR + 0x04)) +#define I20DAT (*(reg32_t *)(I2C0_BASE_ADDR + 0x08)) +#define I20ADR (*(reg32_t *)(I2C0_BASE_ADDR + 0x0C)) +#define I20SCLH (*(reg32_t *)(I2C0_BASE_ADDR + 0x10)) +#define I20SCLL (*(reg32_t *)(I2C0_BASE_ADDR + 0x14)) +#define I20CONCLR (*(reg32_t *)(I2C0_BASE_ADDR + 0x18)) + +/* I2C Interface 1 */ +#define I2C1_BASE_ADDR 0xE005C000 +#define I21CONSET (*(reg32_t *)(I2C1_BASE_ADDR + 0x00)) +#define I21STAT (*(reg32_t *)(I2C1_BASE_ADDR + 0x04)) +#define I21DAT (*(reg32_t *)(I2C1_BASE_ADDR + 0x08)) +#define I21ADR (*(reg32_t *)(I2C1_BASE_ADDR + 0x0C)) +#define I21SCLH (*(reg32_t *)(I2C1_BASE_ADDR + 0x10)) +#define I21SCLL (*(reg32_t *)(I2C1_BASE_ADDR + 0x14)) +#define I21CONCLR (*(reg32_t *)(I2C1_BASE_ADDR + 0x18)) + +/* I2C Interface 2 */ +#define I2C2_BASE_ADDR 0xE0080000 +#define I22CONSET (*(reg32_t *)(I2C2_BASE_ADDR + 0x00)) +#define I22STAT (*(reg32_t *)(I2C2_BASE_ADDR + 0x04)) +#define I22DAT (*(reg32_t *)(I2C2_BASE_ADDR + 0x08)) +#define I22ADR (*(reg32_t *)(I2C2_BASE_ADDR + 0x0C)) +#define I22SCLH (*(reg32_t *)(I2C2_BASE_ADDR + 0x10)) +#define I22SCLL (*(reg32_t *)(I2C2_BASE_ADDR + 0x14)) +#define I22CONCLR (*(reg32_t *)(I2C2_BASE_ADDR + 0x18)) + +/* SPI0 (Serial Peripheral Interface 0) */ +#define SPI0_BASE_ADDR 0xE0020000 +#define S0SPCR (*(reg32_t *)(SPI0_BASE_ADDR + 0x00)) +#define S0SPSR (*(reg32_t *)(SPI0_BASE_ADDR + 0x04)) +#define S0SPDR (*(reg32_t *)(SPI0_BASE_ADDR + 0x08)) +#define S0SPCCR (*(reg32_t *)(SPI0_BASE_ADDR + 0x0C)) +#define S0SPINT (*(reg32_t *)(SPI0_BASE_ADDR + 0x1C)) + +/* SSP0 Controller */ +#define SSP0_BASE_ADDR 0xE0068000 +#define SSP0CR0 (*(reg32_t *)(SSP0_BASE_ADDR + 0x00)) +#define SSP0CR1 (*(reg32_t *)(SSP0_BASE_ADDR + 0x04)) +#define SSP0DR (*(reg32_t *)(SSP0_BASE_ADDR + 0x08)) +#define SSP0SR (*(reg32_t *)(SSP0_BASE_ADDR + 0x0C)) +#define SSP0CPSR (*(reg32_t *)(SSP0_BASE_ADDR + 0x10)) +#define SSP0IMSC (*(reg32_t *)(SSP0_BASE_ADDR + 0x14)) +#define SSP0RIS (*(reg32_t *)(SSP0_BASE_ADDR + 0x18)) +#define SSP0MIS (*(reg32_t *)(SSP0_BASE_ADDR + 0x1C)) +#define SSP0ICR (*(reg32_t *)(SSP0_BASE_ADDR + 0x20)) +#define SSP0DMACR (*(reg32_t *)(SSP0_BASE_ADDR + 0x24)) + +/* SSP1 Controller */ +#define SSP1_BASE_ADDR 0xE0030000 +#define SSP1CR0 (*(reg32_t *)(SSP1_BASE_ADDR + 0x00)) +#define SSP1CR1 (*(reg32_t *)(SSP1_BASE_ADDR + 0x04)) +#define SSP1DR (*(reg32_t *)(SSP1_BASE_ADDR + 0x08)) +#define SSP1SR (*(reg32_t *)(SSP1_BASE_ADDR + 0x0C)) +#define SSP1CPSR (*(reg32_t *)(SSP1_BASE_ADDR + 0x10)) +#define SSP1IMSC (*(reg32_t *)(SSP1_BASE_ADDR + 0x14)) +#define SSP1RIS (*(reg32_t *)(SSP1_BASE_ADDR + 0x18)) +#define SSP1MIS (*(reg32_t *)(SSP1_BASE_ADDR + 0x1C)) +#define SSP1ICR (*(reg32_t *)(SSP1_BASE_ADDR + 0x20)) +#define SSP1DMACR (*(reg32_t *)(SSP1_BASE_ADDR + 0x24)) + + +/* Real Time Clock */ +#define RTC_BASE_ADDR 0xE0024000 +#define RTC_ILR (*(reg32_t *)(RTC_BASE_ADDR + 0x00)) +#define RTC_CTC (*(reg32_t *)(RTC_BASE_ADDR + 0x04)) +#define RTC_CCR (*(reg32_t *)(RTC_BASE_ADDR + 0x08)) +#define RTC_CIIR (*(reg32_t *)(RTC_BASE_ADDR + 0x0C)) +#define RTC_AMR (*(reg32_t *)(RTC_BASE_ADDR + 0x10)) +#define RTC_CTIME0 (*(reg32_t *)(RTC_BASE_ADDR + 0x14)) +#define RTC_CTIME1 (*(reg32_t *)(RTC_BASE_ADDR + 0x18)) +#define RTC_CTIME2 (*(reg32_t *)(RTC_BASE_ADDR + 0x1C)) +#define RTC_SEC (*(reg32_t *)(RTC_BASE_ADDR + 0x20)) +#define RTC_MIN (*(reg32_t *)(RTC_BASE_ADDR + 0x24)) +#define RTC_HOUR (*(reg32_t *)(RTC_BASE_ADDR + 0x28)) +#define RTC_DOM (*(reg32_t *)(RTC_BASE_ADDR + 0x2C)) +#define RTC_DOW (*(reg32_t *)(RTC_BASE_ADDR + 0x30)) +#define RTC_DOY (*(reg32_t *)(RTC_BASE_ADDR + 0x34)) +#define RTC_MONTH (*(reg32_t *)(RTC_BASE_ADDR + 0x38)) +#define RTC_YEAR (*(reg32_t *)(RTC_BASE_ADDR + 0x3C)) +#define RTC_CISS (*(reg32_t *)(RTC_BASE_ADDR + 0x40)) +#define RTC_ALSEC (*(reg32_t *)(RTC_BASE_ADDR + 0x60)) +#define RTC_ALMIN (*(reg32_t *)(RTC_BASE_ADDR + 0x64)) +#define RTC_ALHOUR (*(reg32_t *)(RTC_BASE_ADDR + 0x68)) +#define RTC_ALDOM (*(reg32_t *)(RTC_BASE_ADDR + 0x6C)) +#define RTC_ALDOW (*(reg32_t *)(RTC_BASE_ADDR + 0x70)) +#define RTC_ALDOY (*(reg32_t *)(RTC_BASE_ADDR + 0x74)) +#define RTC_ALMON (*(reg32_t *)(RTC_BASE_ADDR + 0x78)) +#define RTC_ALYEAR (*(reg32_t *)(RTC_BASE_ADDR + 0x7C)) +#define RTC_PREINT (*(reg32_t *)(RTC_BASE_ADDR + 0x80)) +#define RTC_PREFRAC (*(reg32_t *)(RTC_BASE_ADDR + 0x84)) + + +/* A/D Converter 0 (AD0) */ +#define AD0_BASE_ADDR 0xE0034000 +#define AD0CR (*(reg32_t *)(AD0_BASE_ADDR + 0x00)) +#define AD0GDR (*(reg32_t *)(AD0_BASE_ADDR + 0x04)) +#define AD0INTEN (*(reg32_t *)(AD0_BASE_ADDR + 0x0C)) +#define AD0DR0 (*(reg32_t *)(AD0_BASE_ADDR + 0x10)) +#define AD0DR1 (*(reg32_t *)(AD0_BASE_ADDR + 0x14)) +#define AD0DR2 (*(reg32_t *)(AD0_BASE_ADDR + 0x18)) +#define AD0DR3 (*(reg32_t *)(AD0_BASE_ADDR + 0x1C)) +#define AD0DR4 (*(reg32_t *)(AD0_BASE_ADDR + 0x20)) +#define AD0DR5 (*(reg32_t *)(AD0_BASE_ADDR + 0x24)) +#define AD0DR6 (*(reg32_t *)(AD0_BASE_ADDR + 0x28)) +#define AD0DR7 (*(reg32_t *)(AD0_BASE_ADDR + 0x2C)) +#define AD0STAT (*(reg32_t *)(AD0_BASE_ADDR + 0x30)) + + +/* D/A Converter */ +#define DAC_BASE_ADDR 0xE006C000 +#define DACR (*(reg32_t *)(DAC_BASE_ADDR + 0x00)) + + +/* Watchdog */ +#define WDG_BASE_ADDR 0xE0000000 +#define WDMOD (*(reg32_t *)(WDG_BASE_ADDR + 0x00)) +#define WDTC (*(reg32_t *)(WDG_BASE_ADDR + 0x04)) +#define WDFEED (*(reg32_t *)(WDG_BASE_ADDR + 0x08)) +#define WDTV (*(reg32_t *)(WDG_BASE_ADDR + 0x0C)) +#define WDCLKSEL (*(reg32_t *)(WDG_BASE_ADDR + 0x10)) + +/* CAN CONTROLLERS AND ACCEPTANCE FILTER */ +#define CAN_ACCEPT_BASE_ADDR 0xE003C000 +#define CAN_AFMR (*(reg32_t *)(CAN_ACCEPT_BASE_ADDR + 0x00)) +#define CAN_SFF_SA (*(reg32_t *)(CAN_ACCEPT_BASE_ADDR + 0x04)) +#define CAN_SFF_GRP_SA (*(reg32_t *)(CAN_ACCEPT_BASE_ADDR + 0x08)) +#define CAN_EFF_SA (*(reg32_t *)(CAN_ACCEPT_BASE_ADDR + 0x0C)) +#define CAN_EFF_GRP_SA (*(reg32_t *)(CAN_ACCEPT_BASE_ADDR + 0x10)) +#define CAN_EOT (*(reg32_t *)(CAN_ACCEPT_BASE_ADDR + 0x14)) +#define CAN_LUT_ERR_ADR (*(reg32_t *)(CAN_ACCEPT_BASE_ADDR + 0x18)) +#define CAN_LUT_ERR (*(reg32_t *)(CAN_ACCEPT_BASE_ADDR + 0x1C)) + +#define CAN_CENTRAL_BASE_ADDR 0xE0040000 +#define CAN_TX_SR (*(reg32_t *)(CAN_CENTRAL_BASE_ADDR + 0x00)) +#define CAN_RX_SR (*(reg32_t *)(CAN_CENTRAL_BASE_ADDR + 0x04)) +#define CAN_MSR (*(reg32_t *)(CAN_CENTRAL_BASE_ADDR + 0x08)) + +#define CAN1_BASE_ADDR 0xE0044000 +#define CAN1MOD (*(reg32_t *)(CAN1_BASE_ADDR + 0x00)) +#define CAN1CMR (*(reg32_t *)(CAN1_BASE_ADDR + 0x04)) +#define CAN1GSR (*(reg32_t *)(CAN1_BASE_ADDR + 0x08)) +#define CAN1ICR (*(reg32_t *)(CAN1_BASE_ADDR + 0x0C)) +#define CAN1IER (*(reg32_t *)(CAN1_BASE_ADDR + 0x10)) +#define CAN1BTR (*(reg32_t *)(CAN1_BASE_ADDR + 0x14)) +#define CAN1EWL (*(reg32_t *)(CAN1_BASE_ADDR + 0x18)) +#define CAN1SR (*(reg32_t *)(CAN1_BASE_ADDR + 0x1C)) +#define CAN1RFS (*(reg32_t *)(CAN1_BASE_ADDR + 0x20)) +#define CAN1RID (*(reg32_t *)(CAN1_BASE_ADDR + 0x24)) +#define CAN1RDA (*(reg32_t *)(CAN1_BASE_ADDR + 0x28)) +#define CAN1RDB (*(reg32_t *)(CAN1_BASE_ADDR + 0x2C)) + +#define CAN1TFI1 (*(reg32_t *)(CAN1_BASE_ADDR + 0x30)) +#define CAN1TID1 (*(reg32_t *)(CAN1_BASE_ADDR + 0x34)) +#define CAN1TDA1 (*(reg32_t *)(CAN1_BASE_ADDR + 0x38)) +#define CAN1TDB1 (*(reg32_t *)(CAN1_BASE_ADDR + 0x3C)) +#define CAN1TFI2 (*(reg32_t *)(CAN1_BASE_ADDR + 0x40)) +#define CAN1TID2 (*(reg32_t *)(CAN1_BASE_ADDR + 0x44)) +#define CAN1TDA2 (*(reg32_t *)(CAN1_BASE_ADDR + 0x48)) +#define CAN1TDB2 (*(reg32_t *)(CAN1_BASE_ADDR + 0x4C)) +#define CAN1TFI3 (*(reg32_t *)(CAN1_BASE_ADDR + 0x50)) +#define CAN1TID3 (*(reg32_t *)(CAN1_BASE_ADDR + 0x54)) +#define CAN1TDA3 (*(reg32_t *)(CAN1_BASE_ADDR + 0x58)) +#define CAN1TDB3 (*(reg32_t *)(CAN1_BASE_ADDR + 0x5C)) + +#define CAN2_BASE_ADDR 0xE0048000 +#define CAN2MOD (*(reg32_t *)(CAN2_BASE_ADDR + 0x00)) +#define CAN2CMR (*(reg32_t *)(CAN2_BASE_ADDR + 0x04)) +#define CAN2GSR (*(reg32_t *)(CAN2_BASE_ADDR + 0x08)) +#define CAN2ICR (*(reg32_t *)(CAN2_BASE_ADDR + 0x0C)) +#define CAN2IER (*(reg32_t *)(CAN2_BASE_ADDR + 0x10)) +#define CAN2BTR (*(reg32_t *)(CAN2_BASE_ADDR + 0x14)) +#define CAN2EWL (*(reg32_t *)(CAN2_BASE_ADDR + 0x18)) +#define CAN2SR (*(reg32_t *)(CAN2_BASE_ADDR + 0x1C)) +#define CAN2RFS (*(reg32_t *)(CAN2_BASE_ADDR + 0x20)) +#define CAN2RID (*(reg32_t *)(CAN2_BASE_ADDR + 0x24)) +#define CAN2RDA (*(reg32_t *)(CAN2_BASE_ADDR + 0x28)) +#define CAN2RDB (*(reg32_t *)(CAN2_BASE_ADDR + 0x2C)) + +#define CAN2TFI1 (*(reg32_t *)(CAN2_BASE_ADDR + 0x30)) +#define CAN2TID1 (*(reg32_t *)(CAN2_BASE_ADDR + 0x34)) +#define CAN2TDA1 (*(reg32_t *)(CAN2_BASE_ADDR + 0x38)) +#define CAN2TDB1 (*(reg32_t *)(CAN2_BASE_ADDR + 0x3C)) +#define CAN2TFI2 (*(reg32_t *)(CAN2_BASE_ADDR + 0x40)) +#define CAN2TID2 (*(reg32_t *)(CAN2_BASE_ADDR + 0x44)) +#define CAN2TDA2 (*(reg32_t *)(CAN2_BASE_ADDR + 0x48)) +#define CAN2TDB2 (*(reg32_t *)(CAN2_BASE_ADDR + 0x4C)) +#define CAN2TFI3 (*(reg32_t *)(CAN2_BASE_ADDR + 0x50)) +#define CAN2TID3 (*(reg32_t *)(CAN2_BASE_ADDR + 0x54)) +#define CAN2TDA3 (*(reg32_t *)(CAN2_BASE_ADDR + 0x58)) +#define CAN2TDB3 (*(reg32_t *)(CAN2_BASE_ADDR + 0x5C)) + + +/* MultiMedia Card Interface(MCI) Controller */ +#define MCI_BASE_ADDR 0xE008C000 +#define MCI_POWER (*(reg32_t *)(MCI_BASE_ADDR + 0x00)) +#define MCI_CLOCK (*(reg32_t *)(MCI_BASE_ADDR + 0x04)) +#define MCI_ARGUMENT (*(reg32_t *)(MCI_BASE_ADDR + 0x08)) +#define MCI_COMMAND (*(reg32_t *)(MCI_BASE_ADDR + 0x0C)) +#define MCI_RESP_CMD (*(reg32_t *)(MCI_BASE_ADDR + 0x10)) +#define MCI_RESP0 (*(reg32_t *)(MCI_BASE_ADDR + 0x14)) +#define MCI_RESP1 (*(reg32_t *)(MCI_BASE_ADDR + 0x18)) +#define MCI_RESP2 (*(reg32_t *)(MCI_BASE_ADDR + 0x1C)) +#define MCI_RESP3 (*(reg32_t *)(MCI_BASE_ADDR + 0x20)) +#define MCI_DATA_TMR (*(reg32_t *)(MCI_BASE_ADDR + 0x24)) +#define MCI_DATA_LEN (*(reg32_t *)(MCI_BASE_ADDR + 0x28)) +#define MCI_DATA_CTRL (*(reg32_t *)(MCI_BASE_ADDR + 0x2C)) +#define MCI_DATA_CNT (*(reg32_t *)(MCI_BASE_ADDR + 0x30)) +#define MCI_STATUS (*(reg32_t *)(MCI_BASE_ADDR + 0x34)) +#define MCI_CLEAR (*(reg32_t *)(MCI_BASE_ADDR + 0x38)) +#define MCI_MASK0 (*(reg32_t *)(MCI_BASE_ADDR + 0x3C)) +#define MCI_MASK1 (*(reg32_t *)(MCI_BASE_ADDR + 0x40)) +#define MCI_FIFO_CNT (*(reg32_t *)(MCI_BASE_ADDR + 0x48)) +#define MCI_FIFO (*(reg32_t *)(MCI_BASE_ADDR + 0x80)) + + +/* I2S Interface Controller (I2S) */ +#define I2S_BASE_ADDR 0xE0088000 +#define I2S_DAO (*(reg32_t *)(I2S_BASE_ADDR + 0x00)) +#define I2S_DAI (*(reg32_t *)(I2S_BASE_ADDR + 0x04)) +#define I2S_TX_FIFO (*(reg32_t *)(I2S_BASE_ADDR + 0x08)) +#define I2S_RX_FIFO (*(reg32_t *)(I2S_BASE_ADDR + 0x0C)) +#define I2S_STATE (*(reg32_t *)(I2S_BASE_ADDR + 0x10)) +#define I2S_DMA1 (*(reg32_t *)(I2S_BASE_ADDR + 0x14)) +#define I2S_DMA2 (*(reg32_t *)(I2S_BASE_ADDR + 0x18)) +#define I2S_IRQ (*(reg32_t *)(I2S_BASE_ADDR + 0x1C)) +#define I2S_TXRATE (*(reg32_t *)(I2S_BASE_ADDR + 0x20)) +#define I2S_RXRATE (*(reg32_t *)(I2S_BASE_ADDR + 0x24)) + + +/* General-purpose DMA Controller */ +#define DMA_BASE_ADDR 0xFFE04000 +#define GPDMA_INT_STAT (*(reg32_t *)(DMA_BASE_ADDR + 0x000)) +#define GPDMA_INT_TCSTAT (*(reg32_t *)(DMA_BASE_ADDR + 0x004)) +#define GPDMA_INT_TCCLR (*(reg32_t *)(DMA_BASE_ADDR + 0x008)) +#define GPDMA_INT_ERR_STAT (*(reg32_t *)(DMA_BASE_ADDR + 0x00C)) +#define GPDMA_INT_ERR_CLR (*(reg32_t *)(DMA_BASE_ADDR + 0x010)) +#define GPDMA_RAW_INT_TCSTAT (*(reg32_t *)(DMA_BASE_ADDR + 0x014)) +#define GPDMA_RAW_INT_ERR_STAT (*(reg32_t *)(DMA_BASE_ADDR + 0x018)) +#define GPDMA_ENABLED_CHNS (*(reg32_t *)(DMA_BASE_ADDR + 0x01C)) +#define GPDMA_SOFT_BREQ (*(reg32_t *)(DMA_BASE_ADDR + 0x020)) +#define GPDMA_SOFT_SREQ (*(reg32_t *)(DMA_BASE_ADDR + 0x024)) +#define GPDMA_SOFT_LBREQ (*(reg32_t *)(DMA_BASE_ADDR + 0x028)) +#define GPDMA_SOFT_LSREQ (*(reg32_t *)(DMA_BASE_ADDR + 0x02C)) +#define GPDMA_CONFIG (*(reg32_t *)(DMA_BASE_ADDR + 0x030)) +#define GPDMA_SYNC (*(reg32_t *)(DMA_BASE_ADDR + 0x034)) + +/* DMA channel 0 registers */ +#define GPDMA_CH0_SRC (*(reg32_t *)(DMA_BASE_ADDR + 0x100)) +#define GPDMA_CH0_DEST (*(reg32_t *)(DMA_BASE_ADDR + 0x104)) +#define GPDMA_CH0_LLI (*(reg32_t *)(DMA_BASE_ADDR + 0x108)) +#define GPDMA_CH0_CTRL (*(reg32_t *)(DMA_BASE_ADDR + 0x10C)) +#define GPDMA_CH0_CFG (*(reg32_t *)(DMA_BASE_ADDR + 0x110)) + +/* DMA channel 1 registers */ +#define GPDMA_CH1_SRC (*(reg32_t *)(DMA_BASE_ADDR + 0x120)) +#define GPDMA_CH1_DEST (*(reg32_t *)(DMA_BASE_ADDR + 0x124)) +#define GPDMA_CH1_LLI (*(reg32_t *)(DMA_BASE_ADDR + 0x128)) +#define GPDMA_CH1_CTRL (*(reg32_t *)(DMA_BASE_ADDR + 0x12C)) +#define GPDMA_CH1_CFG (*(reg32_t *)(DMA_BASE_ADDR + 0x130)) + + +/* USB Controller */ +#define USB_INT_BASE_ADDR 0xE01FC1C0 +#define USB_BASE_ADDR 0xFFE0C200 /* USB Base Address */ + +#define USB_INT_STAT (*(reg32_t *)(USB_INT_BASE_ADDR + 0x00)) + +/* USB Device Interrupt Registers */ +#define DEV_INT_STAT (*(reg32_t *)(USB_BASE_ADDR + 0x00)) +#define DEV_INT_EN (*(reg32_t *)(USB_BASE_ADDR + 0x04)) +#define DEV_INT_CLR (*(reg32_t *)(USB_BASE_ADDR + 0x08)) +#define DEV_INT_SET (*(reg32_t *)(USB_BASE_ADDR + 0x0C)) +#define DEV_INT_PRIO (*(reg32_t *)(USB_BASE_ADDR + 0x2C)) + +/* USB Device Endpoint Interrupt Registers */ +#define EP_INT_STAT (*(reg32_t *)(USB_BASE_ADDR + 0x30)) +#define EP_INT_EN (*(reg32_t *)(USB_BASE_ADDR + 0x34)) +#define EP_INT_CLR (*(reg32_t *)(USB_BASE_ADDR + 0x38)) +#define EP_INT_SET (*(reg32_t *)(USB_BASE_ADDR + 0x3C)) +#define EP_INT_PRIO (*(reg32_t *)(USB_BASE_ADDR + 0x40)) + +/* USB Device Endpoint Realization Registers */ +#define REALIZE_EP (*(reg32_t *)(USB_BASE_ADDR + 0x44)) +#define EP_INDEX (*(reg32_t *)(USB_BASE_ADDR + 0x48)) +#define MAXPACKET_SIZE (*(reg32_t *)(USB_BASE_ADDR + 0x4C)) + +/* USB Device Command Reagisters */ +#define CMD_CODE (*(reg32_t *)(USB_BASE_ADDR + 0x10)) +#define CMD_DATA (*(reg32_t *)(USB_BASE_ADDR + 0x14)) + +/* USB Device Data Transfer Registers */ +#define RX_DATA (*(reg32_t *)(USB_BASE_ADDR + 0x18)) +#define TX_DATA (*(reg32_t *)(USB_BASE_ADDR + 0x1C)) +#define RX_PLENGTH (*(reg32_t *)(USB_BASE_ADDR + 0x20)) +#define TX_PLENGTH (*(reg32_t *)(USB_BASE_ADDR + 0x24)) +#define USB_CTRL (*(reg32_t *)(USB_BASE_ADDR + 0x28)) + +/* USB Device DMA Registers */ +#define DMA_REQ_STAT (*(reg32_t *)(USB_BASE_ADDR + 0x50)) +#define DMA_REQ_CLR (*(reg32_t *)(USB_BASE_ADDR + 0x54)) +#define DMA_REQ_SET (*(reg32_t *)(USB_BASE_ADDR + 0x58)) +#define UDCA_HEAD (*(reg32_t *)(USB_BASE_ADDR + 0x80)) +#define EP_DMA_STAT (*(reg32_t *)(USB_BASE_ADDR + 0x84)) +#define EP_DMA_EN (*(reg32_t *)(USB_BASE_ADDR + 0x88)) +#define EP_DMA_DIS (*(reg32_t *)(USB_BASE_ADDR + 0x8C)) +#define DMA_INT_STAT (*(reg32_t *)(USB_BASE_ADDR + 0x90)) +#define DMA_INT_EN (*(reg32_t *)(USB_BASE_ADDR + 0x94)) +#define EOT_INT_STAT (*(reg32_t *)(USB_BASE_ADDR + 0xA0)) +#define EOT_INT_CLR (*(reg32_t *)(USB_BASE_ADDR + 0xA4)) +#define EOT_INT_SET (*(reg32_t *)(USB_BASE_ADDR + 0xA8)) +#define NDD_REQ_INT_STAT (*(reg32_t *)(USB_BASE_ADDR + 0xAC)) +#define NDD_REQ_INT_CLR (*(reg32_t *)(USB_BASE_ADDR + 0xB0)) +#define NDD_REQ_INT_SET (*(reg32_t *)(USB_BASE_ADDR + 0xB4)) +#define SYS_ERR_INT_STAT (*(reg32_t *)(USB_BASE_ADDR + 0xB8)) +#define SYS_ERR_INT_CLR (*(reg32_t *)(USB_BASE_ADDR + 0xBC)) +#define SYS_ERR_INT_SET (*(reg32_t *)(USB_BASE_ADDR + 0xC0)) + +/* USB Host and OTG registers are for LPC24xx only */ +/* USB Host Controller */ +#define USBHC_BASE_ADDR 0xFFE0C000 +#define HC_REVISION (*(reg32_t *)(USBHC_BASE_ADDR + 0x00)) +#define HC_CONTROL (*(reg32_t *)(USBHC_BASE_ADDR + 0x04)) +#define HC_CMD_STAT (*(reg32_t *)(USBHC_BASE_ADDR + 0x08)) +#define HC_INT_STAT (*(reg32_t *)(USBHC_BASE_ADDR + 0x0C)) +#define HC_INT_EN (*(reg32_t *)(USBHC_BASE_ADDR + 0x10)) +#define HC_INT_DIS (*(reg32_t *)(USBHC_BASE_ADDR + 0x14)) +#define HC_HCCA (*(reg32_t *)(USBHC_BASE_ADDR + 0x18)) +#define HC_PERIOD_CUR_ED (*(reg32_t *)(USBHC_BASE_ADDR + 0x1C)) +#define HC_CTRL_HEAD_ED (*(reg32_t *)(USBHC_BASE_ADDR + 0x20)) +#define HC_CTRL_CUR_ED (*(reg32_t *)(USBHC_BASE_ADDR + 0x24)) +#define HC_BULK_HEAD_ED (*(reg32_t *)(USBHC_BASE_ADDR + 0x28)) +#define HC_BULK_CUR_ED (*(reg32_t *)(USBHC_BASE_ADDR + 0x2C)) +#define HC_DONE_HEAD (*(reg32_t *)(USBHC_BASE_ADDR + 0x30)) +#define HC_FM_INTERVAL (*(reg32_t *)(USBHC_BASE_ADDR + 0x34)) +#define HC_FM_REMAINING (*(reg32_t *)(USBHC_BASE_ADDR + 0x38)) +#define HC_FM_NUMBER (*(reg32_t *)(USBHC_BASE_ADDR + 0x3C)) +#define HC_PERIOD_START (*(reg32_t *)(USBHC_BASE_ADDR + 0x40)) +#define HC_LS_THRHLD (*(reg32_t *)(USBHC_BASE_ADDR + 0x44)) +#define HC_RH_DESCA (*(reg32_t *)(USBHC_BASE_ADDR + 0x48)) +#define HC_RH_DESCB (*(reg32_t *)(USBHC_BASE_ADDR + 0x4C)) +#define HC_RH_STAT (*(reg32_t *)(USBHC_BASE_ADDR + 0x50)) +#define HC_RH_PORT_STAT1 (*(reg32_t *)(USBHC_BASE_ADDR + 0x54)) +#define HC_RH_PORT_STAT2 (*(reg32_t *)(USBHC_BASE_ADDR + 0x58)) + +/* USB OTG Controller */ +#define USBOTG_BASE_ADDR 0xFFE0C100 +#define OTG_INT_STAT (*(reg32_t *)(USBOTG_BASE_ADDR + 0x00)) +#define OTG_INT_EN (*(reg32_t *)(USBOTG_BASE_ADDR + 0x04)) +#define OTG_INT_SET (*(reg32_t *)(USBOTG_BASE_ADDR + 0x08)) +#define OTG_INT_CLR (*(reg32_t *)(USBOTG_BASE_ADDR + 0x0C)) +/* On LPC23xx, the name is USBPortSel, on LPC24xx, the name is OTG_STAT_CTRL */ +#define OTG_STAT_CTRL (*(reg32_t *)(USBOTG_BASE_ADDR + 0x10)) +#define OTG_TIMER (*(reg32_t *)(USBOTG_BASE_ADDR + 0x14)) + +#define USBOTG_I2C_BASE_ADDR 0xFFE0C300 +#define OTG_I2C_RX (*(reg32_t *)(USBOTG_I2C_BASE_ADDR + 0x00)) +#define OTG_I2C_TX (*(reg32_t *)(USBOTG_I2C_BASE_ADDR + 0x00)) +#define OTG_I2C_STS (*(reg32_t *)(USBOTG_I2C_BASE_ADDR + 0x04)) +#define OTG_I2C_CTL (*(reg32_t *)(USBOTG_I2C_BASE_ADDR + 0x08)) +#define OTG_I2C_CLKHI (*(reg32_t *)(USBOTG_I2C_BASE_ADDR + 0x0C)) +#define OTG_I2C_CLKLO (*(reg32_t *)(USBOTG_I2C_BASE_ADDR + 0x10)) + +/* On LPC23xx, the names are USBClkCtrl and USBClkSt; on LPC24xx, the names are +OTG_CLK_CTRL and OTG_CLK_STAT respectively. */ +#define USBOTG_CLK_BASE_ADDR 0xFFE0CFF0 +#define OTG_CLK_CTRL (*(reg32_t *)(USBOTG_CLK_BASE_ADDR + 0x04)) +#define OTG_CLK_STAT (*(reg32_t *)(USBOTG_CLK_BASE_ADDR + 0x08)) + +/* Note: below three register name convention is for LPC23xx USB device only, match +with the spec. update in USB Device Section. */ +#define USBPortSel (*(reg32_t *)(USBOTG_BASE_ADDR + 0x10)) +#define USBClkCtrl (*(reg32_t *)(USBOTG_CLK_BASE_ADDR + 0x04)) +#define USBClkSt (*(reg32_t *)(USBOTG_CLK_BASE_ADDR + 0x08)) + +/* Ethernet MAC (32 bit data bus) -- all registers are RW unless indicated in parentheses */ +#define MAC_BASE_ADDR 0xFFE00000 /* AHB Peripheral # 0 */ +#define MAC_MAC1 (*(reg32_t *)(MAC_BASE_ADDR + 0x000)) /* MAC config reg 1 */ +#define MAC_MAC2 (*(reg32_t *)(MAC_BASE_ADDR + 0x004)) /* MAC config reg 2 */ +#define MAC_IPGT (*(reg32_t *)(MAC_BASE_ADDR + 0x008)) /* b2b InterPacketGap reg */ +#define MAC_IPGR (*(reg32_t *)(MAC_BASE_ADDR + 0x00C)) /* non b2b InterPacketGap reg */ +#define MAC_CLRT (*(reg32_t *)(MAC_BASE_ADDR + 0x010)) /* CoLlision window/ReTry reg */ +#define MAC_MAXF (*(reg32_t *)(MAC_BASE_ADDR + 0x014)) /* MAXimum Frame reg */ +#define MAC_SUPP (*(reg32_t *)(MAC_BASE_ADDR + 0x018)) /* PHY SUPPort reg */ +#define MAC_TEST (*(reg32_t *)(MAC_BASE_ADDR + 0x01C)) /* TEST reg */ +#define MAC_MCFG (*(reg32_t *)(MAC_BASE_ADDR + 0x020)) /* MII Mgmt ConFiG reg */ +#define MAC_MCMD (*(reg32_t *)(MAC_BASE_ADDR + 0x024)) /* MII Mgmt CoMmanD reg */ +#define MAC_MADR (*(reg32_t *)(MAC_BASE_ADDR + 0x028)) /* MII Mgmt ADdRess reg */ +#define MAC_MWTD (*(reg32_t *)(MAC_BASE_ADDR + 0x02C)) /* MII Mgmt WriTe Data reg (WO) */ +#define MAC_MRDD (*(reg32_t *)(MAC_BASE_ADDR + 0x030)) /* MII Mgmt ReaD Data reg (RO) */ +#define MAC_MIND (*(reg32_t *)(MAC_BASE_ADDR + 0x034)) /* MII Mgmt INDicators reg (RO) */ + +#define MAC_SA0 (*(reg32_t *)(MAC_BASE_ADDR + 0x040)) /* Station Address 0 reg */ +#define MAC_SA1 (*(reg32_t *)(MAC_BASE_ADDR + 0x044)) /* Station Address 1 reg */ +#define MAC_SA2 (*(reg32_t *)(MAC_BASE_ADDR + 0x048)) /* Station Address 2 reg */ + +#define MAC_COMMAND (*(reg32_t *)(MAC_BASE_ADDR + 0x100)) /* Command reg */ +#define MAC_STATUS (*(reg32_t *)(MAC_BASE_ADDR + 0x104)) /* Status reg (RO) */ +#define MAC_RXDESCRIPTOR (*(reg32_t *)(MAC_BASE_ADDR + 0x108)) /* Rx descriptor base address reg */ +#define MAC_RXSTATUS (*(reg32_t *)(MAC_BASE_ADDR + 0x10C)) /* Rx status base address reg */ +#define MAC_RXDESCRIPTORNUM (*(reg32_t *)(MAC_BASE_ADDR + 0x110)) /* Rx number of descriptors reg */ +#define MAC_RXPRODUCEINDEX (*(reg32_t *)(MAC_BASE_ADDR + 0x114)) /* Rx produce index reg (RO) */ +#define MAC_RXCONSUMEINDEX (*(reg32_t *)(MAC_BASE_ADDR + 0x118)) /* Rx consume index reg */ +#define MAC_TXDESCRIPTOR (*(reg32_t *)(MAC_BASE_ADDR + 0x11C)) /* Tx descriptor base address reg */ +#define MAC_TXSTATUS (*(reg32_t *)(MAC_BASE_ADDR + 0x120)) /* Tx status base address reg */ +#define MAC_TXDESCRIPTORNUM (*(reg32_t *)(MAC_BASE_ADDR + 0x124)) /* Tx number of descriptors reg */ +#define MAC_TXPRODUCEINDEX (*(reg32_t *)(MAC_BASE_ADDR + 0x128)) /* Tx produce index reg */ +#define MAC_TXCONSUMEINDEX (*(reg32_t *)(MAC_BASE_ADDR + 0x12C)) /* Tx consume index reg (RO) */ + +#define MAC_TSV0 (*(reg32_t *)(MAC_BASE_ADDR + 0x158)) /* Tx status vector 0 reg (RO) */ +#define MAC_TSV1 (*(reg32_t *)(MAC_BASE_ADDR + 0x15C)) /* Tx status vector 1 reg (RO) */ +#define MAC_RSV (*(reg32_t *)(MAC_BASE_ADDR + 0x160)) /* Rx status vector reg (RO) */ + +#define MAC_FLOWCONTROLCNT (*(reg32_t *)(MAC_BASE_ADDR + 0x170)) /* Flow control counter reg */ +#define MAC_FLOWCONTROLSTS (*(reg32_t *)(MAC_BASE_ADDR + 0x174)) /* Flow control status reg */ + +#define MAC_RXFILTERCTRL (*(reg32_t *)(MAC_BASE_ADDR + 0x200)) /* Rx filter ctrl reg */ +#define MAC_RXFILTERWOLSTS (*(reg32_t *)(MAC_BASE_ADDR + 0x204)) /* Rx filter WoL status reg (RO) */ +#define MAC_RXFILTERWOLCLR (*(reg32_t *)(MAC_BASE_ADDR + 0x208)) /* Rx filter WoL clear reg (WO) */ + +#define MAC_HASHFILTERL (*(reg32_t *)(MAC_BASE_ADDR + 0x210)) /* Hash filter LSBs reg */ +#define MAC_HASHFILTERH (*(reg32_t *)(MAC_BASE_ADDR + 0x214)) /* Hash filter MSBs reg */ + +#define MAC_INTSTATUS (*(reg32_t *)(MAC_BASE_ADDR + 0xFE0)) /* Interrupt status reg (RO) */ +#define MAC_INTENABLE (*(reg32_t *)(MAC_BASE_ADDR + 0xFE4)) /* Interrupt enable reg */ +#define MAC_INTCLEAR (*(reg32_t *)(MAC_BASE_ADDR + 0xFE8)) /* Interrupt clear reg (WO) */ +#define MAC_INTSET (*(reg32_t *)(MAC_BASE_ADDR + 0xFEC)) /* Interrupt set reg (WO) */ + +#define MAC_POWERDOWN (*(reg32_t *)(MAC_BASE_ADDR + 0xFF4)) /* Power-down reg */ +#define MAC_MODULEID (*(reg32_t *)(MAC_BASE_ADDR + 0xFFC)) /* Module ID reg (RO) */ + +#endif /* LPC23XX_H */ diff --git a/2.5/bertos/cpu/arm/scripts/arm7tdmi_ram.ld b/2.5/bertos/cpu/arm/scripts/arm7tdmi_ram.ld new file mode 100644 index 00000000..278256ea --- /dev/null +++ b/2.5/bertos/cpu/arm/scripts/arm7tdmi_ram.ld @@ -0,0 +1,135 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Linker Script for Atmel AT91SAM7 family processors, RAM execution. + * + */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* + * Define stack size here + */ +FIQ_STACK_SIZE = 0x0100; +IRQ_STACK_SIZE = 0x0400; +ABT_STACK_SIZE = 0x0100; +UND_STACK_SIZE = 0x0100; +SVC_STACK_SIZE = 0x1000; + +/* + * Allocate section memory + */ +SECTIONS +{ + .text : + { + KEEP(*(.vectors)); + . = ALIGN (4); + KEEP(*(.exceptions)); + . = ALIGN (4); + *(.init); + . = ALIGN (4); + *(.rodata .rodata.*); + . = ALIGN (4); + *(.text .text.*); + . = ALIGN (4); + *(.glue_7t); + . = ALIGN(4); + *(.glue_7); + . = ALIGN(4); + *(.gcc*); + . = ALIGN(4); + *(.ctors); + . = ALIGN(4); + *(.dtors); + _etext = .; + PROVIDE (__etext = .); + } > ram + + + .data : AT (_etext) + { + PROVIDE (__data_start = .); + *(.data .data.*) + . = ALIGN (4); + _edata = .; + PROVIDE (__data_end = .); + } > ram + + .bss : + { + PROVIDE (__bss_start = .); + *(.bss .bss.*) + . = ALIGN(4); + *(COMMON) + . = ALIGN(4); + PROVIDE (__bss_end = .); + } > ram + + /* + * Allocate stack at the end of bss section. + * Data heap is allocated at end of stack. + */ + PROVIDE (__stack_start = .); + + PROVIDE (__stack_fiq_start = .); + . += FIQ_STACK_SIZE; + . = ALIGN(8); + PROVIDE (__stack_fiq_end = .); + + PROVIDE (__stack_irq_start = .); + . += IRQ_STACK_SIZE; + . = ALIGN(8); + PROVIDE (__stack_irq_end = .); + + PROVIDE (__stack_abt_start = .); + . += ABT_STACK_SIZE; + . = ALIGN(8); + PROVIDE (__stack_abt_end = .); + + PROVIDE (__stack_und_start = .); + . += UND_STACK_SIZE; + . = ALIGN(8); + PROVIDE (__stack_und_end = .); + + PROVIDE (__stack_svc_start = .); + . += SVC_STACK_SIZE; + . = ALIGN(8); + PROVIDE (__stack_svc_end = .); + + PROVIDE (__stack_end = .); + + PROVIDE (__heap_start = .); +} diff --git a/2.5/bertos/cpu/arm/scripts/arm7tdmi_rom.ld b/2.5/bertos/cpu/arm/scripts/arm7tdmi_rom.ld new file mode 100644 index 00000000..a4715b1b --- /dev/null +++ b/2.5/bertos/cpu/arm/scripts/arm7tdmi_rom.ld @@ -0,0 +1,135 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Linker Script for Atmel AT91SAM7 family processors, ROM execution. + * + */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* + * Define stack size here + */ +FIQ_STACK_SIZE = 0x0100; +IRQ_STACK_SIZE = 0x0400; +ABT_STACK_SIZE = 0x0100; +UND_STACK_SIZE = 0x0100; +SVC_STACK_SIZE = 0x1000; + +/* + * Allocate section memory + */ +SECTIONS +{ + .text : + { + KEEP(*(.vectors)); + . = ALIGN (4); + KEEP(*(.exceptions)); + . = ALIGN (4); + *(.init); + . = ALIGN (4); + *(.rodata .rodata.*); + . = ALIGN (4); + *(.text .text.*); + . = ALIGN (4); + *(.glue_7t); + . = ALIGN(4); + *(.glue_7); + . = ALIGN(4); + *(.gcc*); + . = ALIGN(4); + *(.ctors); + . = ALIGN(4); + *(.dtors); + _etext = .; + PROVIDE (__etext = .); + } > rom + + + .data : AT (_etext) + { + PROVIDE (__data_start = .); + *(.data .data.*) + . = ALIGN (4); + _edata = .; + PROVIDE (__data_end = .); + } > ram + + .bss : + { + PROVIDE (__bss_start = .); + *(.bss .bss.*) + . = ALIGN(4); + *(COMMON) + . = ALIGN(4); + PROVIDE (__bss_end = .); + } > ram + + /* + * Allocate stack at the end of bss section. + * Data heap is allocated at end of stack. + */ + PROVIDE (__stack_start = .); + + PROVIDE (__stack_fiq_start = .); + . += FIQ_STACK_SIZE; + . = ALIGN(8); + PROVIDE (__stack_fiq_end = .); + + PROVIDE (__stack_irq_start = .); + . += IRQ_STACK_SIZE; + . = ALIGN(8); + PROVIDE (__stack_irq_end = .); + + PROVIDE (__stack_abt_start = .); + . += ABT_STACK_SIZE; + . = ALIGN(8); + PROVIDE (__stack_abt_end = .); + + PROVIDE (__stack_und_start = .); + . += UND_STACK_SIZE; + . = ALIGN(8); + PROVIDE (__stack_und_end = .); + + PROVIDE (__stack_svc_start = .); + . += SVC_STACK_SIZE; + . = ALIGN(8); + PROVIDE (__stack_svc_end = .); + + PROVIDE (__stack_end = .); + + PROVIDE (__heap_start = .); +} diff --git a/2.5/bertos/cpu/arm/scripts/at91sam7_128_ram.ld b/2.5/bertos/cpu/arm/scripts/at91sam7_128_ram.ld new file mode 100644 index 00000000..f52a9592 --- /dev/null +++ b/2.5/bertos/cpu/arm/scripts/at91sam7_128_ram.ld @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \version $Id: sysirq_at91.c 18273 2007-10-11 14:53:02Z batt $ + * + * \author Daniele Basile + * + * \brief Script linker for Atmel AT91SAM7_128 family processors. + * + */ + + + +/* + * Define memory configuration for AT91SAM7_128 family + */ +MEMORY +{ + rom(rx) : org = 0x00100000, len = 128k + ram(rwx) : org = 0x00200000, len = 32k +} + +INCLUDE "bertos/cpu/arm/scripts/arm7tdmi_ram.ld" diff --git a/2.5/bertos/cpu/arm/scripts/at91sam7_128_rom.ld b/2.5/bertos/cpu/arm/scripts/at91sam7_128_rom.ld new file mode 100644 index 00000000..5d92b06a --- /dev/null +++ b/2.5/bertos/cpu/arm/scripts/at91sam7_128_rom.ld @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \version $Id: sysirq_at91.c 18273 2007-10-11 14:53:02Z batt $ + * + * \author Daniele Basile + * + * \brief Script linker for Atmel AT91SAM7_128 family processors. + * + */ + + +/* + * Define memory configuration for AT91SAM7_128 family + */ +MEMORY +{ + rom(rx) : org = 0x00100000, len = 128k + ram(rwx) : org = 0x00200000, len = 32k +} + + +INCLUDE "bertos/cpu/arm/scripts/arm7tdmi_rom.ld" diff --git a/2.5/bertos/cpu/arm/scripts/at91sam7_256_ram.ld b/2.5/bertos/cpu/arm/scripts/at91sam7_256_ram.ld new file mode 100644 index 00000000..e644e6cc --- /dev/null +++ b/2.5/bertos/cpu/arm/scripts/at91sam7_256_ram.ld @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \version $Id: sysirq_at91.c 18273 2007-10-11 14:53:02Z batt $ + * + * \author Daniele Basile + * + * \brief Script linker for Atmel AT91SAM7_256 family processors. + * + */ + + +/* + * Define memory configuration for AT91SAM7_256 family + */ +MEMORY +{ + rom(rx) : org = 0x00100000, len = 256k + ram(rwx) : org = 0x00200000, len = 64k +} + + +INCLUDE "bertos/cpu/arm/scripts/arm7tdmi_ram.ld" diff --git a/2.5/bertos/cpu/arm/scripts/at91sam7_256_rom.ld b/2.5/bertos/cpu/arm/scripts/at91sam7_256_rom.ld new file mode 100644 index 00000000..9ac3adf5 --- /dev/null +++ b/2.5/bertos/cpu/arm/scripts/at91sam7_256_rom.ld @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \version $Id: sysirq_at91.c 18273 2007-10-11 14:53:02Z batt $ + * + * \author Daniele Basile + * + * \brief Script linker for Atmel AT91SAM7_256 family processors. + * + */ + + + +/* + * Define memory configuration for AT91SAM7_256 family + */ +MEMORY +{ + rom(rx) : org = 0x00100000, len = 256k + ram(rwx) : org = 0x00200000, len = 64k +} + +INCLUDE "bertos/cpu/arm/scripts/arm7tdmi_rom.ld" diff --git a/2.5/bertos/cpu/arm/scripts/at91sam7_512_ram.ld b/2.5/bertos/cpu/arm/scripts/at91sam7_512_ram.ld new file mode 100644 index 00000000..cea33ae7 --- /dev/null +++ b/2.5/bertos/cpu/arm/scripts/at91sam7_512_ram.ld @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \version $Id: sysirq_at91.c 18273 2007-10-11 14:53:02Z batt $ + * + * \author Daniele Basile + * + * \brief Script linker for Atmel AT91SAM7_512 family processors. + * + */ + + +/* + * Define memory configuration for AT91SAM7_512 family + */ +MEMORY +{ + rom(rx) : org = 0x00100000, len = 512k + ram(rwx) : org = 0x00200000, len = 64k +} + + +INCLUDE "bertos/cpu/arm/scripts/arm7tdmi_ram.ld" diff --git a/2.5/bertos/cpu/arm/scripts/at91sam7_512_rom.ld b/2.5/bertos/cpu/arm/scripts/at91sam7_512_rom.ld new file mode 100644 index 00000000..5cabcc8a --- /dev/null +++ b/2.5/bertos/cpu/arm/scripts/at91sam7_512_rom.ld @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \version $Id: sysirq_at91.c 18273 2007-10-11 14:53:02Z batt $ + * + * \author Daniele Basile + * + * \brief Script linker for Atmel AT91SAM7_512 family processors. + * + */ + + +/* + * Define memory configuration for AT91SAM7_512 family + */ +MEMORY +{ + rom(rx) : org = 0x00100000, len = 512k + ram(rwx) : org = 0x00200000, len = 64k +} + + +INCLUDE "bertos/cpu/arm/scripts/arm7tdmi_rom.ld" diff --git a/2.5/bertos/cpu/arm/scripts/at91sam7_64_ram.ld b/2.5/bertos/cpu/arm/scripts/at91sam7_64_ram.ld new file mode 100644 index 00000000..abaf6e9a --- /dev/null +++ b/2.5/bertos/cpu/arm/scripts/at91sam7_64_ram.ld @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \version $Id: sysirq_at91.c 18273 2007-10-11 14:53:02Z batt $ + * + * \author Daniele Basile + * + * \brief Script linker for Atmel AT91SAM7_64 family processors. + * + */ + + +/* + * Define memory configuration for AT91SAM7_64 family + */ +MEMORY +{ + rom(rx) : org = 0x00100000, len = 64k + ram(rwx) : org = 0x00200000, len = 16k +} + + +INCLUDE "bertos/cpu/arm/scripts/arm7tdmi_ram.ld" diff --git a/2.5/bertos/cpu/arm/scripts/at91sam7_64_rom.ld b/2.5/bertos/cpu/arm/scripts/at91sam7_64_rom.ld new file mode 100644 index 00000000..67715e6c --- /dev/null +++ b/2.5/bertos/cpu/arm/scripts/at91sam7_64_rom.ld @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \version $Id: sysirq_at91.c 18273 2007-10-11 14:53:02Z batt $ + * + * \author Daniele Basile + * + * \brief Script linker for Atmel AT91SAM7_64 family processors. + * + */ + + +/* + * Define memory configuration for AT91SAM7_64 family + */ +MEMORY +{ + rom(rx) : org = 0x00100000, len = 64k + ram(rwx) : org = 0x00200000, len = 16k +} + + +INCLUDE "bertos/cpu/arm/scripts/arm7tdmi_rom.ld" diff --git a/2.5/bertos/cpu/arm/scripts/lpc2378.ld b/2.5/bertos/cpu/arm/scripts/lpc2378.ld new file mode 100644 index 00000000..a1f50890 --- /dev/null +++ b/2.5/bertos/cpu/arm/scripts/lpc2378.ld @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \author Francesco sacchi + * + * \brief Linker Script for NXP LPC2378 processors. + * + */ + + +MEMORY +{ + /* last 12k used by the bootloader */ + rom(rx) : org = 0x00000000, len = 512k - 12k + /* First 0x200 bytes and last 288 used by bootloader and debugger */ + ram(rwx) : org = 0x40000200, len = 32k - 0x200 - 288 +} + +/* USB RAM */ +__usb_ram_start = 0x7FD00000; +__usb_ram_size = 8k; +__usb_ram_end = __usb_ram_start + __usb_ram_size; + +/* Ethernet RAM */ +__eth_ram_start = 0x7FE00000; +__eth_ram_size = 16k; +__eth_ram_end = __eth_ram_start + __eth_ram_size; + +INCLUDE "bertos/cpu/arm/scripts/arm7tdmi_rom.ld" diff --git a/2.5/bertos/cpu/attr.h b/2.5/bertos/cpu/attr.h new file mode 100644 index 00000000..da3e08bc --- /dev/null +++ b/2.5/bertos/cpu/attr.h @@ -0,0 +1,272 @@ +/** + * \file + * + * + * \brief CPU-specific attributes. + * + * \author Giovanni Bajo + * \author Bernie Innocenti + * \author Stefano Fedrigo + * \author Francesco Sacchi + */ +#ifndef CPU_ATTR_H +#define CPU_ATTR_H + +#include "detect.h" + +#include "cfg/cfg_proc.h" /* CONFIG_KERN_PREEMPT */ +#include "cfg/cfg_attr.h" /* CONFIG_FAST_MEM */ + + +/** + * \name Macros for determining CPU endianness. + * \{ + */ +#define CPU_BIG_ENDIAN 0x1234 +#define CPU_LITTLE_ENDIAN 0x3412 /* Look twice, pal. This is not a bug. */ +/*\}*/ + +/** Macro to include cpu-specific versions of the headers. */ +#define CPU_HEADER(module) PP_STRINGIZE(drv/PP_CAT3(module, _, CPU_ID).h) + +/** Macro to include cpu-specific versions of implementation files. */ +#define CPU_CSOURCE(module) PP_STRINGIZE(drv/PP_CAT3(module, _, CPU_ID).c) + + +#if CPU_I196 + + #define NOP nop_instruction() + + #define CPU_REG_BITS 16 + #define CPU_REGS_CNT 16 + #define CPU_BYTE_ORDER CPU_LITTLE_ENDIAN + #define CPU_HARVARD 0 + + /// Valid pointers should be >= than this value (used for debug) + #define CPU_RAM_START 0x100 + +#elif CPU_X86 + + #define CPU_REGS_CNT 7 + #define CPU_BYTE_ORDER CPU_LITTLE_ENDIAN + #define CPU_HARVARD 0 + + #if CPU_X86_64 + #define CPU_REG_BITS 64 + + #ifdef __WIN64__ + /* WIN64 is an IL32-P64 weirdo. */ + #define SIZEOF_LONG 4 + #endif + #else + #define CPU_REG_BITS 32 + #endif + + /// Valid pointers should be >= than this value (used for debug) + #define CPU_RAM_START 0x1000 + + #ifdef __GNUC__ + #define NOP asm volatile ("nop") + /* This is a good thing to insert into busy-wait loops. */ + #define PAUSE asm volatile ("rep; nop" ::: "memory") + #define BREAKPOINT asm volatile ("int3" ::) + #endif + +#elif CPU_ARM + + #define CPU_REG_BITS 32 + #define CPU_REGS_CNT 16 + #define CPU_HARVARD 0 + + /// Valid pointers should be >= than this value (used for debug) + #if CPU_ARM_AT91 + #define CPU_RAM_START 0x00200000 + #elif CPU_ARM_LPC2 + #define CPU_RAM_START 0x40000000 + #else + #warning Fix CPU_RAM_START address for your ARM, default value set to 0x200 + #define CPU_RAM_START 0x200 + #endif + + #ifdef __IAR_SYSTEMS_ICC__ + #warning Check CPU_BYTE_ORDER + #define CPU_BYTE_ORDER (__BIG_ENDIAN__ ? CPU_BIG_ENDIAN : CPU_LITTLE_ENDIAN) + + #define NOP __no_operation() + + #else /* GCC and compatibles */ + + #if defined(__ARMEB__) + #define CPU_BYTE_ORDER CPU_BIG_ENDIAN + #elif defined(__ARMEL__) + #define CPU_BYTE_ORDER CPU_LITTLE_ENDIAN + #else + #error Unable to detect ARM endianness! + #endif + + #define NOP asm volatile ("mov r0,r0" ::) + #define BREAKPOINT /* asm("bkpt 0") DOES NOT WORK */ + + #if CONFIG_FAST_MEM + /** + * Function attribute for use with performance critical code. + * + * On the AT91 family, code residing in flash has wait states. + * Moving functions to the data section is a quick & dirty way + * to get them transparently copied to SRAM for zero-wait-state + * operation. + */ + #define FAST_FUNC __attribute__((section(".data"))) + + /** + * Data attribute to move constant data to fast memory storage. + * + * \see FAST_FUNC + */ + #define FAST_RODATA __attribute__((section(".data"))) + + #else // !CONFIG_FAST_MEM + #define FAST_RODATA /**/ + #define FAST_FUNC /**/ + #endif + + /* + * Function attribute to move it into ram memory. + */ + #define RAM_FUNC __attribute__((section(".data"))) + + #endif /* !__IAR_SYSTEMS_ICC_ */ +#elif CPU_CM3 + + #define CPU_REG_BITS 32 + #define CPU_REGS_CNT 16 + #define CPU_HARVARD 0 + + /// Valid pointers should be >= than this value (used for debug) + #if (CPU_CM3_LM3S1968 || CPU_CM3_LM3S8962 || CPU_CM3_STM32F103RB) + #define CPU_RAM_START 0x20000000 + #else + #warning Fix CPU_RAM_START address for your Cortex-M3, default value set to 0x200 + #define CPU_RAM_START 0x200 + #endif + + #if defined(__ARMEB__) + #define CPU_BYTE_ORDER CPU_BIG_ENDIAN + #elif defined(__ARMEL__) + #define CPU_BYTE_ORDER CPU_LITTLE_ENDIAN + #else + #error Unable to detect Cortex-M3 endianess! + #endif + + #define NOP asm volatile ("nop") + #define PAUSE asm volatile ("wfi" ::: "memory") + #define BREAKPOINT /* asm("bkpt 0") DOES NOT WORK */ + +#elif CPU_PPC + + #define CPU_REG_BITS (CPU_PPC32 ? 32 : 64) + #define CPU_REGS_CNT FIXME + #define CPU_BYTE_ORDER (__BIG_ENDIAN__ ? CPU_BIG_ENDIAN : CPU_LITTLE_ENDIAN) + #define CPU_HARVARD 0 + + /// Valid pointers should be >= than this value (used for debug) + #define CPU_RAM_START 0x1000 + + #ifdef __GNUC__ + #define NOP asm volatile ("nop" ::) + #define BREAKPOINT asm volatile ("twge 2,2" ::) + #endif + +#elif CPU_DSP56K + + #define CPU_REG_BITS 16 + #define CPU_REGS_CNT FIXME + #define CPU_BYTE_ORDER CPU_BIG_ENDIAN + #define CPU_HARVARD 1 + + /* Memory is word-addessed in the DSP56K */ + #define CPU_BITS_PER_CHAR 16 + #define SIZEOF_SHORT 1 + #define SIZEOF_INT 1 + #define SIZEOF_LONG 2 + #define SIZEOF_PTR 1 + + /// Valid pointers should be >= than this value (used for debug) + #define CPU_RAM_START 0x200 + + #define NOP asm(nop) + #define BREAKPOINT asm(debug) + +#elif CPU_AVR + + #define NOP asm volatile ("nop" ::) + + #define CPU_REG_BITS 8 + #define CPU_REGS_CNT 33 /* Includes SREG */ + #define CPU_BYTE_ORDER CPU_LITTLE_ENDIAN + #define CPU_HARVARD 1 + + /// Valid pointers should be >= than this value (used for debug) + #if CPU_AVR_ATMEGA8 || CPU_AVR_ATMEGA32 || CPU_AVR_ATMEGA103 + #define CPU_RAM_START 0x60 + #elif CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA128 || CPU_AVR_ATMEGA168 || CPU_AVR_ATMEGA328P + #define CPU_RAM_START 0x100 + #elif CPU_AVR_ATMEGA1281 + #define CPU_RAM_START 0x200 + #else + #warning Fix CPU_RAM_START address for your AVR, default value set to 0x100 + #define CPU_RAM_START 0x100 + #endif + +#else + #error No CPU_... defined. +#endif + +#ifndef BREAKPOINT +#define BREAKPOINT /* nop */ +#endif + +#ifndef FAST_FUNC + /// Function attribute for use with performance critical code. + #define FAST_FUNC /* */ +#endif + +#ifndef FAST_RODATA + /// Data attribute to move constant data to fast memory storage. + #define FAST_RODATA /* */ +#endif + +#ifndef PAUSE + /// Generic PAUSE implementation. + #define PAUSE {NOP; MEMORY_BARRIER;} +#endif + +#endif /* CPU_ATTR_H */ diff --git a/2.5/bertos/cpu/avr/drv/adc_avr.c b/2.5/bertos/cpu/avr/drv/adc_avr.c new file mode 100644 index 00000000..7e932f62 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/adc_avr.c @@ -0,0 +1,199 @@ +/** + * \file + * + * + * \brief ADC hardware-specific definition + * + * \author Francesco Sacchi + * + * This module is automatically included so no need to include + * in test list. + * notest: avr + * + * $WIZ$ + */ + +#include "adc_avr.h" + +#include "cfg/cfg_adc.h" +#include "cfg/cfg_proc.h" +#include "cfg/cfg_signal.h" +#include +#include + +#include // IRQ_ASSERT_ENABLED() + +#include + +#include +#include + +/** + * ADC voltage referencese. + * + * $WIZ$ avr_adc_refs = "ADC_AVR_AREF", "ADC_AVR_AVCC", "ADC_AVR_INT256" + * \{ + */ +#define ADC_AVR_AREF 0 +#define ADC_AVR_AVCC 1 +#define ADC_AVR_INT256 2 +/* \} */ + +#if CONFIG_KERN + #include + #include + #include + + + #if !CONFIG_KERN_SIGNALS + #error Signals must be active to use the ADC with kernel + #endif + + /* Signal adc convertion end */ + #define SIG_ADC_COMPLETE SIG_SINGLE + + /* ADC waiting process */ + static struct Process *adc_process; + + /** + * ADC ISR. + * Simply signal the adc process that convertion is complete. + */ + ISR(ADC_vect) + { + sig_post(adc_process, SIG_ADC_COMPLETE); + } +#endif /* CONFIG_KERN */ + +/** + * Select mux channel \a ch. + * \todo only first 8 channels are selectable! + */ +void adc_hw_select_ch(uint8_t ch) +{ + /* Set to 0 all mux registers */ + #if CPU_AVR_ATMEGA8 || CPU_AVR_ATMEGA328P || CPU_AVR_ATMEGA168 + ADMUX &= ~(BV(MUX3) | BV(MUX2) | BV(MUX1) | BV(MUX0)); + #elif CPU_AVR_ATMEGA32 || CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA128 || CPU_AVR_ATMEGA1281 + ADMUX &= ~(BV(MUX4) | BV(MUX3) | BV(MUX2) | BV(MUX1) | BV(MUX0)); + #else + #error Unknown CPU + #endif + + /* Select channel, only first 8 channel modes are supported for now */ + ADMUX |= (ch & 0x07); +} + + +/** + * Start an ADC convertion. + * If a kernel is present, preempt until convertion is complete, otherwise + * a busy wait on ADCS bit is done. + */ +uint16_t adc_hw_read(void) +{ + // Ensure another convertion is not running. + ASSERT(!(ADCSRA & BV(ADSC))); + + // Start convertion + ADCSRA |= BV(ADSC); + + #if CONFIG_KERN + // Ensure IRQs enabled. + IRQ_ASSERT_ENABLED(); + adc_process = proc_current(); + sig_wait(SIG_ADC_COMPLETE); + #else + //Wait in polling until is done + while (ADCSRA & BV(ADSC)) ; + #endif + + return(ADC); +} + +/** + * Init ADC hardware. + */ +void adc_hw_init(void) +{ + /* + * Select channel 0 as default, + * result right adjusted. + */ + ADMUX = 0; + + #if CONFIG_ADC_AVR_REF == ADC_AVR_AREF + /* External voltage at AREF as analog ref source */ + /* None */ + #elif CONFIG_ADC_AVR_REF == ADC_AVR_AVCC + /* AVCC as analog ref source */ + ADMUX |= BV(REFS0); + #elif CONFIG_ADC_AVR_REF == ADC_AVR_INT256 + /* Internal 2.56V as ref source */ + ADMUX |= BV(REFS1) | BV(REFS0); + #else + #error Unsupported ADC ref value. + #endif + + #if defined(ADCSRB) + /* Disable Auto trigger source: ADC in Free running mode. */ + ADCSRB = 0; + #endif + + /* Enable ADC, disable autotrigger mode. */ + ADCSRA = BV(ADEN); + + #if CONFIG_KERN + MOD_CHECK(proc); + ADCSRA |= BV(ADIE); + #endif + + /* Set convertion frequency */ + #if CONFIG_ADC_AVR_DIVISOR == 2 + ADCSRA |= BV(ADPS0); + #elif CONFIG_ADC_AVR_DIVISOR == 4 + ADCSRA |= BV(ADPS1); + #elif CONFIG_ADC_AVR_DIVISOR == 8 + ADCSRA |= BV(ADPS1) | BV(ADPS0); + #elif CONFIG_ADC_AVR_DIVISOR == 16 + ADCSRA |= BV(ADPS2); + #elif CONFIG_ADC_AVR_DIVISOR == 32 + ADCSRA |= BV(ADPS2) | BV(ADPS0); + #elif CONFIG_ADC_AVR_DIVISOR == 64 + ADCSRA |= BV(ADPS2) | BV(ADPS1); + #elif CONFIG_ADC_AVR_DIVISOR == 128 + ADCSRA |= BV(ADPS2) | BV(ADPS1) | BV(ADPS0); + #else + #error Unsupported ADC prescaler value. + #endif + + /* Start a convertion to init ADC hw */ + adc_hw_read(); +} diff --git a/2.5/bertos/cpu/avr/drv/adc_avr.h b/2.5/bertos/cpu/avr/drv/adc_avr.h new file mode 100644 index 00000000..417e4536 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/adc_avr.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief ADC hardware-specific definition + * + * \author Francesco Sacchi + */ + +#ifndef DRV_ADC_AVR_H +#define DRV_ADC_AVR_H + +#include + +#define ADC_MUX_MAXCH 7 +#define ADC_BITS 10 + +void adc_hw_select_ch(uint8_t ch); +uint16_t adc_hw_read(void); +void adc_hw_init(void); + +#endif /* DRV_ADC_AVR_H */ diff --git a/2.5/bertos/cpu/avr/drv/flash_avr.c b/2.5/bertos/cpu/avr/drv/flash_avr.c new file mode 100644 index 00000000..2c3d1840 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/flash_avr.c @@ -0,0 +1,289 @@ +/** + * \file + * + * + * \brief Self programming routines. + * + * \author Francesco Sacchi + * \author Daniele Basile + * + * This module implements a kfile-like access for Atmel avr + * internal flash. + * Internal flash writing access is controlled by BOOTSZ fuses, check + * datasheet for details. + */ + +#include "flash_avr.h" + +#include "cfg/cfg_flash_avr.h" +#include // MIN() +#include +#include +#include + +// Define log settings for cfg/log.h +#define LOG_LEVEL CONFIG_FLASH_AVR_LOG_LEVEL +#define LOG_FORMAT CONFIG_FLASH_AVR_LOG_FORMAT +#include + +#include +#include + +#include + +#include +#include +#include + +#include + + +/** + * Definition of type for avr flash module. + */ +typedef uint16_t page_addr_t; + + +/** + * Private avr flush funtion. + * + * Write current buffered page in flash memory (if modified). + * This function erase flash memory page before writing. + * + * This function is only use internally in this module. + */ +static void flash_avr_flush(Flash *fd) +{ + if (fd->page_dirty) + { + + LOG_INFO("Flushing page %d\n", fd->curr_page); + + // Wait while the SPM instruction is busy. + boot_spm_busy_wait(); + + LOG_INFO("Filling temparary page buffer..."); + + // Fill the temporary buffer of the AVR + for (page_addr_t page_addr = 0; page_addr < SPM_PAGESIZE; page_addr += 2) + { + uint16_t word = ((uint16_t)fd->page_buf[page_addr + 1] << 8) | fd->page_buf[page_addr]; + + ATOMIC(boot_page_fill(page_addr, word)); + } + LOG_INFO("Done.\n"); + + wdt_reset(); + + LOG_INFO("Erasing page, addr %u...", fd->curr_page * SPM_PAGESIZE); + + /* Page erase */ + ATOMIC(boot_page_erase(fd->curr_page * SPM_PAGESIZE)); + + /* Wait until the memory is erased. */ + boot_spm_busy_wait(); + + LOG_INFO("Done.\n"); + LOG_INFO("Writing page, addr %u...", fd->curr_page * SPM_PAGESIZE); + + /* Store buffer in flash page. */ + ATOMIC(boot_page_write(fd->curr_page * SPM_PAGESIZE)); + boot_spm_busy_wait(); // Wait while the SPM instruction is busy. + + /* + * Reenable RWW-section again. We need this if we want to jump back + * to the application after bootloading. + */ + ATOMIC(boot_rww_enable()); + + fd->page_dirty = false; + LOG_INFO("Done.\n"); + } +} + + +/** + * Flush avr flash function. + * + * Write current buffered page in flash memory (if modified). + * This function erase flash memory page before writing. + */ +static int flash_avr_kfileFlush(struct KFile *_fd) +{ + Flash *fd = FLASH_CAST(_fd); + flash_avr_flush(fd); + return 0; +} + + +/** + * Check current page and if \a page is different, load it in + * temporary buffer. + */ +static void flash_avr_loadPage(Flash *fd, page_t page) +{ + if (page != fd->curr_page) + { + flash_avr_flush(fd); + // Load page + memcpy_P(fd->page_buf, (const char *)(page * SPM_PAGESIZE), SPM_PAGESIZE); + fd->curr_page = page; + LOG_INFO("Loaded page %d\n", fd->curr_page); + } +} + +/** + * Write program memory. + * Write \a size bytes from buffer \a _buf to file \a fd + * \note Write operations are buffered. + */ +static size_t flash_avr_write(struct KFile *_fd, const void *_buf, size_t size) +{ + Flash *fd = FLASH_CAST(_fd); + const uint8_t *buf =(const uint8_t *)_buf; + + page_t page; + page_addr_t page_addr; + size_t total_write = 0; + + + ASSERT(fd->fd.seek_pos + (kfile_off_t)size <= (kfile_off_t)fd->fd.size); + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); + + LOG_INFO("Writing at pos[%u]\n", fd->fd.seek_pos); + while (size) + { + page = fd->fd.seek_pos / SPM_PAGESIZE; + page_addr = fd->fd.seek_pos % SPM_PAGESIZE; + + flash_avr_loadPage(fd, page); + + size_t wr_len = MIN(size, SPM_PAGESIZE - page_addr); + memcpy(fd->page_buf + page_addr, buf, wr_len); + fd->page_dirty = true; + + buf += wr_len; + fd->fd.seek_pos += wr_len; + size -= wr_len; + total_write += wr_len; + } + LOG_INFO("written %u bytes\n", total_write); + return total_write; +} + +/** + * Open flash file \a fd + * \a name and \a mode are unused, cause flash memory is + * threated like one file. + */ +static void flash_avr_open(struct Flash *fd) +{ + fd->curr_page = 0; + memcpy_P(fd->page_buf, (const char *)(fd->curr_page * SPM_PAGESIZE), SPM_PAGESIZE); + + fd->fd.seek_pos = 0; + fd->fd.size = (uint16_t)(FLASHEND - CONFIG_FLASH_AVR_BOOTSIZE + 1); + fd->page_dirty = false; + + LOG_INFO("Flash file opened\n"); +} + +/** + * Close file \a fd + */ +static int flash_avr_close(struct KFile *_fd) +{ + Flash *fd = FLASH_CAST(_fd); + flash_avr_flush(fd); + LOG_INFO("Flash file closed\n"); + return 0; +} + +/** + * Reopen file \a fd + */ +static struct KFile *flash_avr_reopen(struct KFile *fd) +{ + Flash *_fd = FLASH_CAST(fd); + flash_avr_close(fd); + flash_avr_open((struct Flash *)_fd); + return fd; +} + + +/** + * Read from file \a fd \a size bytes and put it in buffer \a buf + * \return the number of bytes read. + */ +static size_t flash_avr_read(struct KFile *_fd, void *buf, size_t size) +{ + Flash *fd = FLASH_CAST(_fd); + ASSERT(fd->fd.seek_pos + (kfile_off_t)size <= (kfile_off_t)fd->fd.size); + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); + + LOG_INFO("Reading at pos[%u]\n", fd->fd.seek_pos); + // Flush current buffered page (if modified). + flash_avr_flush(fd); + + /* + * AVR pointers are 16 bits wide, this hack is needed to avoid + * compiler warning, cause fd->seek_pos is a 32bit offset. + */ + const uint8_t *pgm_addr = (const uint8_t *)0; + pgm_addr += fd->fd.seek_pos; + + memcpy_P(buf, pgm_addr, size); + fd->fd.seek_pos += size; + LOG_INFO("Read %u bytes\n", size); + return size; +} + +/** + * Init AVR flash read/write file. + */ +void flash_hw_init(struct Flash *fd) +{ + memset(fd, 0, sizeof(*fd)); + DB(fd->fd._type = KFT_FLASH); + + // Set up flash programming functions. + fd->fd.reopen = flash_avr_reopen; + fd->fd.close = flash_avr_close; + fd->fd.read = flash_avr_read; + fd->fd.write = flash_avr_write; + fd->fd.seek = kfile_genericSeek; + fd->fd.flush = flash_avr_kfileFlush; + fd->curr_page = 0; + + flash_avr_open(fd); +} + + diff --git a/2.5/bertos/cpu/avr/drv/flash_avr.h b/2.5/bertos/cpu/avr/drv/flash_avr.h new file mode 100644 index 00000000..6c06eaf3 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/flash_avr.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * \author Daniele Basile + * + * \brief AVR Internal flash read/write driver. + * + * + */ + +#ifndef FLASH_AT91_H +#define FLASH_AT91_H + +#include + +#include + +#include + +#include + + +#define FLASH_PAGE_SIZE SPM_PAGESIZE + +/** + * Definition of type for avr flash module. + */ +typedef uint16_t page_t; + +/* Forward declaration */ +struct Flash; + +/** + * FlashAvr KFile context structure. + * DEPREACTED STRUCTURE! + * Use Flash instead + * + * \{ + */ +typedef struct FlashAvr +{ + /** + * File descriptor. + */ + KFile fd; + + /** + * Flag for checking if current page is modified. + */ + bool page_dirty; + + /** + * Current buffered page. + */ + page_t curr_page; + + /** + * Temporary buffer cointaing data block to + * write on flash. + */ + uint8_t page_buf[SPM_PAGESIZE]; +} FlashAvr; +/* \} */ + +void flash_hw_init(struct Flash *fd); + +/** + * WARNING! + * This function is DEPRECADED! + * use the flash module instead. + */ +INLINE void flash_avr_init(struct FlashAvr *fd) +{ + flash_hw_init((struct Flash *)fd); +} + +#endif /* DRV_FLASH_AVR_H */ diff --git a/2.5/bertos/cpu/avr/drv/i2c_avr.c b/2.5/bertos/cpu/avr/drv/i2c_avr.c new file mode 100644 index 00000000..74252403 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/i2c_avr.c @@ -0,0 +1,253 @@ +/** + * \file + * + * + * \brief Driver for the AVR ATMega TWI (implementation) + * + * \version $Id$ + * + * \author Stefano Fedrigo + * \author Bernie Innocenti + */ + +#include /* CPU_FREQ */ + +#include "cfg/cfg_i2c.h" + +#define LOG_LEVEL I2C_LOG_LEVEL +#define LOG_FORMAT I2C_LOG_FORMAT + +#include + +#include +#include // BV() +#include + +#include +#include +#include +#include + +#include + + +/* Wait for TWINT flag set: bus is ready */ +#define WAIT_TWI_READY do {} while (!(TWCR & BV(TWINT))) + +/** + * Send START condition on the bus. + * + * \return true on success, false otherwise. + */ +static bool i2c_builtin_start(void) +{ + TWCR = BV(TWINT) | BV(TWSTA) | BV(TWEN); + WAIT_TWI_READY; + + if (TW_STATUS == TW_START || TW_STATUS == TW_REP_START) + return true; + + LOG_ERR("!TW_(REP)START: %x\n", TWSR); + return false; +} + + +/** + * Send START condition and select slave for write. + * \c id is the device id comprehensive of address left shifted by 1. + * The LSB of \c id is ignored and reset to 0 for write operation. + * + * \return true on success, false otherwise. + */ +bool i2c_builtin_start_w(uint8_t id) +{ + /* + * Loop on the select write sequence: when the eeprom is busy + * writing previously sent data it will reply to the SLA_W + * control byte with a NACK. In this case, we must + * keep trying until the eeprom responds with an ACK. + */ + ticks_t start = timer_clock(); + while (i2c_builtin_start()) + { + TWDR = id & ~I2C_READBIT; + TWCR = BV(TWINT) | BV(TWEN); + WAIT_TWI_READY; + + if (TW_STATUS == TW_MT_SLA_ACK) + return true; + else if (TW_STATUS != TW_MT_SLA_NACK) + { + LOG_ERR("!TW_MT_SLA_(N)ACK: %x\n", TWSR); + break; + } + else if (timer_clock() - start > ms_to_ticks(CONFIG_I2C_START_TIMEOUT)) + { + LOG_ERR("Timeout on TWI_MT_START\n"); + break; + } + } + + return false; +} + + +/** + * Send START condition and select slave for read. + * \c id is the device id comprehensive of address left shifted by 1. + * The LSB of \c id is ignored and set to 1 for read operation. + * + * \return true on success, false otherwise. + */ +bool i2c_builtin_start_r(uint8_t id) +{ + if (i2c_builtin_start()) + { + TWDR = id | I2C_READBIT; + TWCR = BV(TWINT) | BV(TWEN); + WAIT_TWI_READY; + + if (TW_STATUS == TW_MR_SLA_ACK) + return true; + + LOG_ERR("!TW_MR_SLA_ACK: %x\n", TWSR); + } + + return false; +} + + +/** + * Send STOP condition. + */ +void i2c_builtin_stop(void) +{ + TWCR = BV(TWINT) | BV(TWEN) | BV(TWSTO); +} + + +/** + * Put a single byte in master transmitter mode + * to the selected slave device through the TWI bus. + * + * \return true on success, false on error. + */ +bool i2c_builtin_put(const uint8_t data) +{ + TWDR = data; + TWCR = BV(TWINT) | BV(TWEN); + WAIT_TWI_READY; + if (TW_STATUS != TW_MT_DATA_ACK) + { + LOG_ERR("!TW_MT_DATA_ACK: %x\n", TWSR); + return false; + } + return true; +} + +/** + * Get 1 byte from slave in master transmitter mode + * to the selected slave device through the TWI bus. + * If \a ack is true issue a ACK after getting the byte, + * otherwise a NACK is issued. + * + * \return the byte read if ok, EOF on errors. + */ +int i2c_builtin_get(bool ack) +{ + TWCR = BV(TWINT) | BV(TWEN) | (ack ? BV(TWEA) : 0); + WAIT_TWI_READY; + + if (ack) + { + if (TW_STATUS != TW_MR_DATA_ACK) + { + LOG_ERR("!TW_MR_DATA_ACK: %x\n", TWSR); + return EOF; + } + } + else + { + if (TW_STATUS != TW_MR_DATA_NACK) + { + LOG_ERR("!TW_MR_DATA_NACK: %x\n", TWSR); + return EOF; + } + } + + /* avoid sign extension */ + return (int)(uint8_t)TWDR; +} + +MOD_DEFINE(i2c); + +/** + * Initialize TWI module. + */ +void i2c_builtin_init(void) +{ + ATOMIC( + /* + * This is pretty useless according to AVR's datasheet, + * but it helps us driving the TWI data lines on boards + * where the bus pull-up resistors are missing. This is + * probably due to some unwanted interaction between the + * port pin and the TWI lines. + */ +#if CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA128 || CPU_AVR_ATMEGA1281 + PORTD |= BV(PD0) | BV(PD1); + DDRD |= BV(PD0) | BV(PD1); +#elif CPU_AVR_ATMEGA8 + PORTC |= BV(PC4) | BV(PC5); + DDRC |= BV(PC4) | BV(PC5); +#elif CPU_AVR_ATMEGA32 + PORTC |= BV(PC1) | BV(PC0); + DDRC |= BV(PC1) | BV(PC0); +#else + #error Unsupported architecture +#endif + + /* + * Set speed: + * F = CPU_FREQ / (16 + 2*TWBR * 4^TWPS) + */ + #ifndef CONFIG_I2C_FREQ + #warning Using default value of 300000L for CONFIG_I2C_FREQ + #define CONFIG_I2C_FREQ 300000L /* ~300 kHz */ + #endif + #define TWI_PRESC 1 /* 4 ^ TWPS */ + + TWBR = (CPU_FREQ / (2 * CONFIG_I2C_FREQ * TWI_PRESC)) - (8 / TWI_PRESC); + TWSR = 0; + TWCR = BV(TWEN); + ); + MOD_INIT(i2c); +} diff --git a/2.5/bertos/cpu/avr/drv/kdebug_avr.c b/2.5/bertos/cpu/avr/drv/kdebug_avr.c new file mode 100644 index 00000000..81e78530 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/kdebug_avr.c @@ -0,0 +1,276 @@ +/** + * \file + * + * + * \brief AVR debug support (implementation). + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * \author Francesco Sacchi + */ + +#include /* for CPU_FREQ */ +#include "hw/hw_ser.h" /* Required for bus macros overrides */ + +#include "cfg/cfg_debug.h" +#include /* for BV(), DIV_ROUND */ + +#include +#include + +#include + +#if CONFIG_KDEBUG_PORT == 0 + + /* + * Support for special bus policies or external transceivers + * on UART0 (to be overridden in "hw/hw_ser.h"). + * + * HACK: if we don't set TXEN, kdbg disables the transmitter + * after each output statement until the serial driver + * is initialized. These glitches confuse the debug + * terminal that ends up printing some trash. + */ + #ifndef KDBG_UART0_BUS_INIT + #define KDBG_UART0_BUS_INIT do { \ + UCR = BV(TXEN0); \ + } while (0) + #endif + #ifndef KDBG_UART0_BUS_RX + #define KDBG_UART0_BUS_RX do {} while (0) + #endif + #ifndef KDBG_UART0_BUS_TX + #define KDBG_UART0_BUS_TX do {} while (0) + #endif + + #if CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA128 || CPU_AVR_ATMEGA1281 || CPU_AVR_ATMEGA168 || CPU_AVR_ATMEGA328P + #define UCR UCSR0B + #define UDR UDR0 + #define USR UCSR0A + #elif CPU_AVR_ATMEGA8 || CPU_AVR_ATMEGA32 + #define UCR UCSRB + #define USR UCSRA + #define TXEN0 TXEN + #define UDRE0 UDRE + #define TXC0 TXC + #define TXCIE0 TXCIE + #define UDRIE0 UDRIE + #else + #error Unknown CPU + #endif + + #define KDBG_WAIT_READY() do { loop_until_bit_is_set(USR, UDRE0); } while(0) + #define KDBG_WAIT_TXDONE() do { loop_until_bit_is_set(USR, TXC0); } while(0) + + /* + * We must clear the TXC flag before sending a new character to allow + * KDBG_WAIT_TXDONE() to work properly. + * + * BUG: if KDBG_WRITE_CHAR() is called after the TXC flag is set by hardware, + * a new TXC could be generated after we've cleared it and before the new + * character is written to UDR. On a 485 bus, the transceiver will be put + * in RX mode while still transmitting the last char. + */ + #define KDBG_WRITE_CHAR(c) do { USR |= BV(TXC0); UDR = (c); } while(0) + + #define KDBG_MASK_IRQ(old) do { \ + (old) = UCR; \ + UCR |= BV(TXEN0); \ + UCR &= ~(BV(TXCIE0) | BV(UDRIE0)); \ + KDBG_UART0_BUS_TX; \ + } while(0) + + #define KDBG_RESTORE_IRQ(old) do { \ + KDBG_WAIT_TXDONE(); \ + KDBG_UART0_BUS_RX; \ + UCR = (old); \ + } while(0) + + typedef uint8_t kdbg_irqsave_t; + +#elif CONFIG_KDEBUG_PORT == 1 + + /* + * Support for special bus policies or external transceivers + * on UART1 (to be overridden in "hw/hw_ser.h"). + * + * HACK: if we don't set TXEN, kdbg disables the transmitter + * after each output statement until the serial driver + * is initialized. These glitches confuse the debug + * terminal that ends up printing some trash. + */ + #ifndef KDBG_UART1_BUS_INIT + #define KDBG_UART1_BUS_INIT do { \ + UCSR1B = BV(TXEN1); \ + } while (0) + #endif + #ifndef KDBG_UART1_BUS_RX + #define KDBG_UART1_BUS_RX do {} while (0) + #endif + #ifndef KDBG_UART1_BUS_TX + #define KDBG_UART1_BUS_TX do {} while (0) + #endif + + #define KDBG_WAIT_READY() do { loop_until_bit_is_set(UCSR1A, UDRE1); } while(0) + #define KDBG_WAIT_TXDONE() do { loop_until_bit_is_set(UCSR1A, TXC1); } while(0) + #define KDBG_WRITE_CHAR(c) do { UCSR1A |= BV(TXC1); UDR1 = (c); } while(0) + + #define KDBG_MASK_IRQ(old) do { \ + (old) = UCSR1B; \ + UCSR1B |= BV(TXEN1); \ + UCSR1B &= ~(BV(TXCIE1) | BV(UDRIE1)); \ + KDBG_UART1_BUS_TX; \ + } while(0) + + #define KDBG_RESTORE_IRQ(old) do { \ + KDBG_WAIT_TXDONE(); \ + KDBG_UART1_BUS_RX; \ + UCSR1B = (old); \ + } while(0) + + typedef uint8_t kdbg_irqsave_t; + +/* + * Special debug port for BitBanged Serial see below for details... + */ +#elif CONFIG_KDEBUG_PORT == 666 + #include "hw/hw_ser.h" + #define KDBG_WAIT_READY() do { /*nop*/ } while(0) + #define KDBG_WRITE_CHAR(c) _kdebug_bitbang_putchar((c)) + #define KDBG_MASK_IRQ(old) do { IRQ_SAVE_DISABLE((old)); } while(0) + #define KDBG_RESTORE_IRQ(old) do { IRQ_RESTORE((old)); } while(0) + typedef cpu_flags_t kdbg_irqsave_t; + + #define KDBG_DELAY (((CPU_FREQ + CONFIG_KDEBUG_BAUDRATE / 2) / CONFIG_KDEBUG_BAUDRATE) + 7) / 14 + + static void _kdebug_bitbang_delay(void) + { + unsigned long i; + + for (i = 0; i < KDBG_DELAY; i++) + { + NOP; + NOP; + NOP; + NOP; + NOP; + } + } + + /** + * Putchar for BITBANG serial debug console. + * Sometimes, we can't permit to use a whole serial for debugging purpose. + * Since debug console is in output only it is useful to use a single generic I/O pin for debug. + * This is achieved by this simple function, that shift out the data like a UART, but + * in software :) + * The only requirement is that SER_BITBANG_* macros will be defined somewhere (usually hw_ser.h) + * \note All interrupts are disabled during debug prints! + */ + static void _kdebug_bitbang_putchar(char c) + { + int i; + uint16_t data = c; + + /* Add stop bit */ + data |= 0x0100; + + /* Add start bit*/ + data <<= 1; + + /* Shift out data */ + uint16_t shift = 1; + for (i = 0; i < 10; i++) + { + if (data & shift) + SER_BITBANG_HIGH; + else + SER_BITBANG_LOW; + _kdebug_bitbang_delay(); + shift <<= 1; + } + } +#else + #error CONFIG_KDEBUG_PORT should be either 0, 1 or 666 +#endif + + +INLINE void kdbg_hw_init(void) +{ + #if CONFIG_KDEBUG_PORT == 666 + SER_BITBANG_INIT; + #else /* CONFIG_KDEBUG_PORT != 666 */ + /* Compute the baud rate */ + uint16_t period = DIV_ROUND(CPU_FREQ / 16UL, CONFIG_KDEBUG_BAUDRATE) - 1; + + #if (CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA128 || CPU_AVR_ATMEGA1281) + #if CONFIG_KDEBUG_PORT == 0 + UBRR0H = (uint8_t)(period>>8); + UBRR0L = (uint8_t)period; + KDBG_UART0_BUS_INIT; + #elif CONFIG_KDEBUG_PORT == 1 + UBRR1H = (uint8_t)(period>>8); + UBRR1L = (uint8_t)period; + KDBG_UART1_BUS_INIT; + #else + #error CONFIG_KDEBUG_PORT must be either 0 or 1 + #endif + + #elif CPU_AVR_ATMEGA168 || CPU_AVR_ATMEGA328P + #if CONFIG_KDEBUG_PORT == 0 + UBRR0H = (uint8_t)(period>>8); + UBRR0L = (uint8_t)period; + KDBG_UART0_BUS_INIT; + #else + #error Only CONFIG_KDEBUG_PORT 0 is supported for this cpu + #endif + + #elif CPU_AVR_ATMEGA8 || CPU_AVR_ATMEGA32 + #if CONFIG_KDEBUG_PORT == 0 + UBRRH = (uint8_t)(period>>8); + UBRRL = (uint8_t)period; + KDBG_UART0_BUS_INIT; + #else + #error Only CONFIG_KDEBUG_PORT 0 is supported for this cpu + #endif + #elif CPU_AVR_ATMEGA103 + #if CONFIG_KDEBUG_PORT == 0 + UBRR = (uint8_t)period; + KDBG_UART0_BUS_INIT; + #else + #error Only CONFIG_KDEBUG_PORT 0 is supported for this cpu + #endif + #else + #error Unknown CPU + #endif + #endif /* CONFIG_KDEBUG_PORT == 666 */ +} + diff --git a/2.5/bertos/cpu/avr/drv/pwm_avr.c b/2.5/bertos/cpu/avr/drv/pwm_avr.c new file mode 100644 index 00000000..1d76a1a3 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/pwm_avr.c @@ -0,0 +1,160 @@ +/** + * \file + * + * + * \brief Low-level PWM module for AVR (inplementation). + * + * \version $Id$ + * + * \author Daniele Basile + * + */ + + +#include "pwm_avr.h" +#include + +#warning TODO:This is an exmple of implementation of PWM low level channel for AVR, implemnt it! + +/** + * Set PWM polarity to select pwm channel + */ +void pwm_hw_setPolarity(PwmDev dev, bool pol) +{ + + /* + * Put here a code to PWM polarity of select + * PWM channel + */ + + //Only for test remove when implement this function + (void)dev; + (void)pol; +} + +/** + * Get preiod from select channel + * + * \a dev channel + */ +pwm_period_t pwm_hw_getPeriod(PwmDev dev) +{ + /* + * Put here a code to get period value of select + * PWM channel + */ + + //Only for test remove when implement this function + (void)dev; + + return 0; +} + +/** + * Set pwm waveform frequecy. + * + * \a freq in Hz + */ +void pwm_hw_setFrequency(PwmDev dev, uint32_t freq) +{ + /* + * Put here a code to set frequency of select + * PWM channel + */ + + //Only for test remove when implement this function + (void)dev; + (void)freq; + +} + +/** + * Set pwm duty cycle. + * + * \a duty value 0 - 2^16 + */ +void pwm_hw_setDutyUnlock(PwmDev dev, uint16_t duty) +{ + /* + * Put here a code to set duty of select + * PWM channel + */ + + //Only for test remove when implement this function + (void)dev; + (void)duty; + +} + + +/** + * Enable select pwm channel + */ +void pwm_hw_enable(PwmDev dev) +{ + /* + * Put here a code to enable + * a select PWM channel + */ + + //Only for test remove when implement this function + (void)dev; +} + +/** + * Disable select pwm channel + */ +void pwm_hw_disable(PwmDev dev) +{ + /* + * Put here a code to disable + * a select PWM channel + */ + + //Only for test remove when implement this function + (void)dev; +} + + +/** + * Init pwm. + */ +void pwm_hw_init(void) +{ + /* + * Put here a code to init + * a PWM hawdware + */ +} + + + + diff --git a/2.5/bertos/cpu/avr/drv/pwm_avr.h b/2.5/bertos/cpu/avr/drv/pwm_avr.h new file mode 100644 index 00000000..e3a6fa7f --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/pwm_avr.h @@ -0,0 +1,73 @@ +/** + * \file + * + * + * \brief Low-level PWM module for AVR (interface). + * + * \version $Id$ + * + * \author Daniele Basile + * + */ + +#ifndef DRV_PWM_AVR_H +#define DRV_PWM_AVR_H + +#include "hw/pwm_map.h" + +#include + +#define PWM_HW_MAX_PRESCALER_STEP 10 +#define PWM_HW_MAX_PERIOD 0xFFFF + +/** + * Type definition for pwm period. + */ +typedef uint16_t pwm_period_t; + +/** + * Structur definition for pwm driver. + */ +typedef struct PwmChannel +{ + /* */ +} PwmChannel; + + +void pwm_hw_init(void); +void pwm_hw_setFrequency(PwmDev dev, uint32_t freq); +void pwm_hw_setDutyUnlock(PwmDev dev, uint16_t duty); +void pwm_hw_disable(PwmDev dev); +void pwm_hw_enable(PwmDev dev); +void pwm_hw_setPolarity(PwmDev dev, bool pol); +pwm_period_t pwm_hw_getPeriod(PwmDev dev); + +#endif /* DRV_ADC_AT91_H */ diff --git a/2.5/bertos/cpu/avr/drv/ser_avr.c b/2.5/bertos/cpu/avr/drv/ser_avr.c new file mode 100644 index 00000000..2d25fbeb --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/ser_avr.c @@ -0,0 +1,939 @@ +/** + * \file + * + * + * \brief AVR UART and SPI I/O driver (Implementation) + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * \author Luca Ottaviano + */ + +#include "hw/hw_ser.h" /* Required for bus macros overrides */ +#include /* CPU_FREQ */ + +#include "cfg/cfg_ser.h" + +#include /* DIV_ROUND */ +#include +#include // ARCH_NIGHTTEST + +#include +#include +#include + +#include + +#include + +#if defined(__AVR_LIBC_VERSION__) && (__AVR_LIBC_VERSION__ >= 10400UL) + #include +#else + #include +#endif + + +#if !CONFIG_SER_HWHANDSHAKE + /** + * \name Hardware handshake (RTS/CTS). + * \{ + */ + #define RTS_ON do {} while (0) + #define RTS_OFF do {} while (0) + #define IS_CTS_ON true + #define EIMSKF_CTS 0 /**< Dummy value, must be overridden */ + /*\}*/ +#endif + +#if CPU_AVR_ATMEGA1281 + #define BIT_RXCIE0 RXCIE0 + #define BIT_RXEN0 RXEN0 + #define BIT_TXEN0 TXEN0 + #define BIT_UDRIE0 UDRIE0 + + #define BIT_RXCIE1 RXCIE1 + #define BIT_RXEN1 RXEN1 + #define BIT_TXEN1 TXEN1 + #define BIT_UDRIE1 UDRIE1 +#elif CPU_AVR_ATMEGA168 || CPU_AVR_ATMEGA328P + #define BIT_RXCIE0 RXCIE0 + #define BIT_RXEN0 RXEN0 + #define BIT_TXEN0 TXEN0 + #define BIT_UDRIE0 UDRIE0 + + #define BIT_RXCIE1 RXCIE0 + #define BIT_RXEN1 RXEN0 + #define BIT_TXEN1 TXEN0 + #define BIT_UDRIE1 UDRIE0 +#else + #define BIT_RXCIE0 RXCIE + #define BIT_RXEN0 RXEN + #define BIT_TXEN0 TXEN + #define BIT_UDRIE0 UDRIE + + #define BIT_RXCIE1 RXCIE + #define BIT_RXEN1 RXEN + #define BIT_TXEN1 TXEN + #define BIT_UDRIE1 UDRIE +#endif + + +/** + * \name Overridable serial bus hooks + * + * These can be redefined in hw.h to implement + * special bus policies such as half-duplex, 485, etc. + * + * + * \code + * TXBEGIN TXCHAR TXEND TXOFF + * | __________|__________ | | + * | | | | | | | | | + * v v v v v v v v v + * ______ __ __ __ __ __ __ ________________ + * \/ \/ \/ \/ \/ \/ \/ + * ______/\__/\__/\__/\__/\__/\__/ + * + * \endcode + * + * \{ + */ +#ifndef SER_UART0_BUS_TXINIT + /** + * Default TXINIT macro - invoked in uart0_init() + * + * - Enable both the receiver and the transmitter + * - Enable only the RX complete interrupt + */ + #define SER_UART0_BUS_TXINIT do { \ + UCSR0B = BV(BIT_RXCIE0) | BV(BIT_RXEN0) | BV(BIT_TXEN0); \ + } while (0) +#endif + +#ifndef SER_UART0_BUS_TXBEGIN + /** + * Invoked before starting a transmission + * + * - Enable both the receiver and the transmitter + * - Enable both the RX complete and UDR empty interrupts + */ + #define SER_UART0_BUS_TXBEGIN do { \ + UCSR0B = BV(BIT_RXCIE0) | BV(BIT_UDRIE0) | BV(BIT_RXEN0) | BV(BIT_TXEN0); \ + } while (0) +#endif + +#ifndef SER_UART0_BUS_TXCHAR + /** + * Invoked to send one character. + */ + #define SER_UART0_BUS_TXCHAR(c) do { \ + UDR0 = (c); \ + } while (0) +#endif + +#ifndef SER_UART0_BUS_TXEND + /** + * Invoked as soon as the txfifo becomes empty + * + * - Keep both the receiver and the transmitter enabled + * - Keep the RX complete interrupt enabled + * - Disable the UDR empty interrupt + */ + #define SER_UART0_BUS_TXEND do { \ + UCSR0B = BV(BIT_RXCIE0) | BV(BIT_RXEN0) | BV(BIT_TXEN0); \ + } while (0) +#endif + +#ifndef SER_UART0_BUS_TXOFF + /** + * \def SER_UART0_BUS_TXOFF + * + * Invoked after the last character has been transmitted + * + * The default is no action. + */ + #ifdef __doxygen__ + #define SER_UART0_BUS_TXOFF + #endif +#endif + +#ifndef SER_UART1_BUS_TXINIT + /** \sa SER_UART0_BUS_TXINIT */ + #define SER_UART1_BUS_TXINIT do { \ + UCSR1B = BV(BIT_RXCIE1) | BV(BIT_RXEN1) | BV(BIT_TXEN1); \ + } while (0) +#endif +#ifndef SER_UART1_BUS_TXBEGIN + /** \sa SER_UART0_BUS_TXBEGIN */ + #define SER_UART1_BUS_TXBEGIN do { \ + UCSR1B = BV(BIT_RXCIE1) | BV(BIT_UDRIE1) | BV(BIT_RXEN1) | BV(BIT_TXEN1); \ + } while (0) +#endif +#ifndef SER_UART1_BUS_TXCHAR + /** \sa SER_UART0_BUS_TXCHAR */ + #define SER_UART1_BUS_TXCHAR(c) do { \ + UDR1 = (c); \ + } while (0) +#endif +#ifndef SER_UART1_BUS_TXEND + /** \sa SER_UART0_BUS_TXEND */ + #define SER_UART1_BUS_TXEND do { \ + UCSR1B = BV(BIT_RXCIE1) | BV(BIT_RXEN1) | BV(BIT_TXEN1); \ + } while (0) +#endif +#ifndef SER_UART1_BUS_TXOFF + /** + * \def SER_UART1_BUS_TXOFF + * + * \see SER_UART0_BUS_TXOFF + */ + #ifdef __doxygen__ + #define SER_UART1_BUS_TXOFF + #endif +#endif +/*\}*/ + + +/** + * \name Overridable SPI hooks + * + * These can be redefined in hw.h to implement + * special bus policies such as slave select pin handling, etc. + * + * \{ + */ +#ifndef SER_SPI_BUS_TXINIT + /** + * Default TXINIT macro - invoked in spi_init() + * The default is no action. + */ + #define SER_SPI_BUS_TXINIT +#endif + +#ifndef SER_SPI_BUS_TXCLOSE + /** + * Invoked after the last character has been transmitted. + * The default is no action. + */ + #define SER_SPI_BUS_TXCLOSE +#endif +/*\}*/ + + +/* SPI port and pin configuration */ +#if CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA128 || CPU_AVR_ATMEGA103 || CPU_AVR_ATMEGA1281 + #define SPI_PORT PORTB + #define SPI_DDR DDRB + #define SPI_SS_BIT PB0 + #define SPI_SCK_BIT PB1 + #define SPI_MOSI_BIT PB2 + #define SPI_MISO_BIT PB3 +// TODO: these bits are the same as ATMEGA8 but the defines in avr-gcc are different. +// They should be the same! +#elif CPU_AVR_ATMEGA328P + #define SPI_PORT PORTB + #define SPI_DDR DDRB + #define SPI_SS_BIT PORTB2 + #define SPI_SCK_BIT PORTB5 + #define SPI_MOSI_BIT PORTB3 + #define SPI_MISO_BIT PORTB4 +#elif CPU_AVR_ATMEGA8 || CPU_AVR_ATMEGA168 + #define SPI_PORT PORTB + #define SPI_DDR DDRB + #define SPI_SS_BIT PB2 + #define SPI_SCK_BIT PB5 + #define SPI_MOSI_BIT PB3 + #define SPI_MISO_BIT PB4 +#else + #error Unknown architecture +#endif + +/* USART register definitions */ +#if CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA128 || CPU_AVR_ATMEGA1281 + #define AVR_HAS_UART1 1 +#elif CPU_AVR_ATMEGA168 || CPU_AVR_ATMEGA328P + #define AVR_HAS_UART1 0 + #define USART0_UDRE_vect USART_UDRE_vect + #define USART0_RX_vect USART_RX_vect + #define USART0_TX_vect USART_TX_vect +#elif CPU_AVR_ATMEGA8 + #define AVR_HAS_UART1 0 + #define UCSR0A UCSRA + #define UCSR0B UCSRB + #define UCSR0C UCSRC + #define UDR0 UDR + #define UBRR0L UBRRL + #define UBRR0H UBRRH + #define USART0_UDRE_vect USART_UDRE_vect + #define USART0_RX_vect USART_RX_vect + #define USART0_TX_vect USART_TX_vect +#elif CPU_AVR_ATMEGA103 + #define AVR_HAS_UART1 0 + #define UCSR0B UCR + #define UDR0 UDR + #define UCSR0A USR + #define UBRR0L UBRR + #define USART0_UDRE_vect USART_UDRE_vect + #define USART0_RX_vect USART_RX_vect + #define USART0_TX_vect USART_TX_vect +#else + #error Unknown architecture +#endif + + +/* From the high-level serial driver */ +extern struct Serial *ser_handles[SER_CNT]; + +/* TX and RX buffers */ +static unsigned char uart0_txbuffer[CONFIG_UART0_TXBUFSIZE]; +static unsigned char uart0_rxbuffer[CONFIG_UART0_RXBUFSIZE]; +#if AVR_HAS_UART1 + static unsigned char uart1_txbuffer[CONFIG_UART1_TXBUFSIZE]; + static unsigned char uart1_rxbuffer[CONFIG_UART1_RXBUFSIZE]; +#endif +static unsigned char spi_txbuffer[CONFIG_SPI_TXBUFSIZE]; +static unsigned char spi_rxbuffer[CONFIG_SPI_RXBUFSIZE]; + + +/** + * Internal hardware state structure + * + * The \a sending variable is true while the transmission + * interrupt is retriggering itself. + * + * For the USARTs the \a sending flag is useful for taking specific + * actions before sending a burst of data, at the start of a trasmission + * but not before every char sent. + * + * For the SPI, this flag is necessary because the SPI sends and receives + * bytes at the same time and the SPI IRQ is unique for send/receive. + * The only way to start transmission is to write data in SPDR (this + * is done by spi_starttx()). We do this *only* if a transfer is + * not already started. + */ +struct AvrSerial +{ + struct SerialHardware hw; + volatile bool sending; +}; + + + +/* + * Callbacks + */ +static void uart0_init( + UNUSED_ARG(struct SerialHardware *, _hw), + UNUSED_ARG(struct Serial *, ser)) +{ + SER_UART0_BUS_TXINIT; + RTS_ON; + SER_STROBE_INIT; +} + +static void uart0_cleanup(UNUSED_ARG(struct SerialHardware *, _hw)) +{ + UCSR0B = 0; +} + +static void uart0_enabletxirq(struct SerialHardware *_hw) +{ + struct AvrSerial *hw = (struct AvrSerial *)_hw; + + /* + * WARNING: racy code here! The tx interrupt sets hw->sending to false + * when it runs with an empty fifo. The order of statements in the + * if-block matters. + */ + if (!hw->sending) + { + hw->sending = true; + SER_UART0_BUS_TXBEGIN; + } +} + +static void uart0_setbaudrate(UNUSED_ARG(struct SerialHardware *, _hw), unsigned long rate) +{ + /* Compute baud-rate period */ + uint16_t period = DIV_ROUND(CPU_FREQ / 16UL, rate) - 1; + +#if !CPU_AVR_ATMEGA103 + UBRR0H = (period) >> 8; +#endif + UBRR0L = (period); + + //DB(kprintf("uart0_setbaudrate(rate=%lu): period=%d\n", rate, period);) +} + +static void uart0_setparity(UNUSED_ARG(struct SerialHardware *, _hw), int parity) +{ +#if !CPU_AVR_ATMEGA103 + UCSR0C = (UCSR0C & ~(BV(UPM01) | BV(UPM00))) | ((parity) << UPM00); +#endif +} + +#if AVR_HAS_UART1 + +static void uart1_init( + UNUSED_ARG(struct SerialHardware *, _hw), + UNUSED_ARG(struct Serial *, ser)) +{ + SER_UART1_BUS_TXINIT; + RTS_ON; + SER_STROBE_INIT; +} + +static void uart1_cleanup(UNUSED_ARG(struct SerialHardware *, _hw)) +{ + UCSR1B = 0; +} + +static void uart1_enabletxirq(struct SerialHardware *_hw) +{ + struct AvrSerial *hw = (struct AvrSerial *)_hw; + + /* + * WARNING: racy code here! The tx interrupt + * sets hw->sending to false when it runs with + * an empty fifo. The order of the statements + * in the if-block matters. + */ + if (!hw->sending) + { + hw->sending = true; + SER_UART1_BUS_TXBEGIN; + } +} + +static void uart1_setbaudrate(UNUSED_ARG(struct SerialHardware *, _hw), unsigned long rate) +{ + /* Compute baud-rate period */ + uint16_t period = DIV_ROUND(CPU_FREQ / 16UL, rate) - 1; + + UBRR1H = (period) >> 8; + UBRR1L = (period); + + //DB(kprintf("uart1_setbaudrate(rate=%ld): period=%d\n", rate, period);) +} + +static void uart1_setparity(UNUSED_ARG(struct SerialHardware *, _hw), int parity) +{ + UCSR1C = (UCSR1C & ~(BV(UPM11) | BV(UPM10))) | ((parity) << UPM10); +} + +#endif // AVR_HAS_UART1 + +static void spi_init(UNUSED_ARG(struct SerialHardware *, _hw), UNUSED_ARG(struct Serial *, ser)) +{ + /* + * Set MOSI and SCK ports out, MISO in. + * + * The ATmega64/128 datasheet explicitly states that the input/output + * state of the SPI pins is not significant, as when the SPI is + * active the I/O port are overrided. + * This is *blatantly FALSE*. + * + * Moreover, the MISO pin on the board_kc *must* be in high impedance + * state even when the SPI is off, because the line is wired together + * with the KBus serial RX, and the transmitter of the slave boards + * would be unable to drive the line. + */ + ATOMIC(SPI_DDR |= (BV(SPI_MOSI_BIT) | BV(SPI_SCK_BIT))); + + /* + * If the SPI master mode is activated and the SS pin is in input and tied low, + * the SPI hardware will automatically switch to slave mode! + * For proper communication this pins should therefore be: + * - as output + * - as input but tied high forever! + * This driver set the pin as output. + */ + #warning FIXME:SPI SS pin set as output for proper operation, check schematics for possible conflicts. + ATOMIC(SPI_DDR |= BV(SPI_SS_BIT)); + + ATOMIC(SPI_DDR &= ~BV(SPI_MISO_BIT)); + /* Enable SPI, IRQ on, Master */ + SPCR = BV(SPE) | BV(SPIE) | BV(MSTR); + + /* Set data order */ + #if CONFIG_SPI_DATA_ORDER == SER_LSB_FIRST + SPCR |= BV(DORD); + #endif + + /* Set SPI clock rate */ + #if CONFIG_SPI_CLOCK_DIV == 128 + SPCR |= (BV(SPR1) | BV(SPR0)); + #elif (CONFIG_SPI_CLOCK_DIV == 64 || CONFIG_SPI_CLOCK_DIV == 32) + SPCR |= BV(SPR1); + #elif (CONFIG_SPI_CLOCK_DIV == 16 || CONFIG_SPI_CLOCK_DIV == 8) + SPCR |= BV(SPR0); + #elif (CONFIG_SPI_CLOCK_DIV == 4 || CONFIG_SPI_CLOCK_DIV == 2) + // SPR0 & SDPR1 both at 0 + #else + #error Unsupported SPI clock division factor. + #endif + + /* Set SPI2X bit (spi double frequency) */ + #if (CONFIG_SPI_CLOCK_DIV == 128 || CONFIG_SPI_CLOCK_DIV == 64 \ + || CONFIG_SPI_CLOCK_DIV == 16 || CONFIG_SPI_CLOCK_DIV == 4) + SPSR &= ~BV(SPI2X); + #elif (CONFIG_SPI_CLOCK_DIV == 32 || CONFIG_SPI_CLOCK_DIV == 8 || CONFIG_SPI_CLOCK_DIV == 2) + SPSR |= BV(SPI2X); + #else + #error Unsupported SPI clock division factor. + #endif + + /* Set clock polarity */ + #if CONFIG_SPI_CLOCK_POL == 1 + SPCR |= BV(CPOL); + #endif + + /* Set clock phase */ + #if CONFIG_SPI_CLOCK_PHASE == 1 + SPCR |= BV(CPHA); + #endif + SER_SPI_BUS_TXINIT; + + SER_STROBE_INIT; +} + +static void spi_cleanup(UNUSED_ARG(struct SerialHardware *, _hw)) +{ + SPCR = 0; + + SER_SPI_BUS_TXCLOSE; + + /* Set all pins as inputs */ + ATOMIC(SPI_DDR &= ~(BV(SPI_MISO_BIT) | BV(SPI_MOSI_BIT) | BV(SPI_SCK_BIT) | BV(SPI_SS_BIT))); +} + +static void spi_starttx(struct SerialHardware *_hw) +{ + struct AvrSerial *hw = (struct AvrSerial *)_hw; + + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* Send data only if the SPI is not already transmitting */ + if (!hw->sending && !fifo_isempty(&ser_handles[SER_SPI]->txfifo)) + { + hw->sending = true; + SPDR = fifo_pop(&ser_handles[SER_SPI]->txfifo); + } + + IRQ_RESTORE(flags); +} + +static void spi_setbaudrate( + UNUSED_ARG(struct SerialHardware *, _hw), + UNUSED_ARG(unsigned long, rate)) +{ + // nop +} + +static void spi_setparity(UNUSED_ARG(struct SerialHardware *, _hw), UNUSED_ARG(int, parity)) +{ + // nop +} + +static bool tx_sending(struct SerialHardware* _hw) +{ + struct AvrSerial *hw = (struct AvrSerial *)_hw; + return hw->sending; +} + + + +// FIXME: move into compiler.h? Ditch? +#if COMPILER_C99 + #define C99INIT(name,val) .name = val +#elif defined(__GNUC__) + #define C99INIT(name,val) name: val +#else + #warning No designated initializers, double check your code + #define C99INIT(name,val) (val) +#endif + +/* + * High-level interface data structures + */ +static const struct SerialHardwareVT UART0_VT = +{ + C99INIT(init, uart0_init), + C99INIT(cleanup, uart0_cleanup), + C99INIT(setBaudrate, uart0_setbaudrate), + C99INIT(setParity, uart0_setparity), + C99INIT(txStart, uart0_enabletxirq), + C99INIT(txSending, tx_sending), +}; + +#if AVR_HAS_UART1 +static const struct SerialHardwareVT UART1_VT = +{ + C99INIT(init, uart1_init), + C99INIT(cleanup, uart1_cleanup), + C99INIT(setBaudrate, uart1_setbaudrate), + C99INIT(setParity, uart1_setparity), + C99INIT(txStart, uart1_enabletxirq), + C99INIT(txSending, tx_sending), +}; +#endif // AVR_HAS_UART1 + +static const struct SerialHardwareVT SPI_VT = +{ + C99INIT(init, spi_init), + C99INIT(cleanup, spi_cleanup), + C99INIT(setBaudrate, spi_setbaudrate), + C99INIT(setParity, spi_setparity), + C99INIT(txStart, spi_starttx), + C99INIT(txSending, tx_sending), +}; + +static struct AvrSerial UARTDescs[SER_CNT] = +{ + { + C99INIT(hw, /**/) { + C99INIT(table, &UART0_VT), + C99INIT(txbuffer, uart0_txbuffer), + C99INIT(rxbuffer, uart0_rxbuffer), + C99INIT(txbuffer_size, sizeof(uart0_txbuffer)), + C99INIT(rxbuffer_size, sizeof(uart0_rxbuffer)), + }, + C99INIT(sending, false), + }, +#if AVR_HAS_UART1 + { + C99INIT(hw, /**/) { + C99INIT(table, &UART1_VT), + C99INIT(txbuffer, uart1_txbuffer), + C99INIT(rxbuffer, uart1_rxbuffer), + C99INIT(txbuffer_size, sizeof(uart1_txbuffer)), + C99INIT(rxbuffer_size, sizeof(uart1_rxbuffer)), + }, + C99INIT(sending, false), + }, +#endif + { + C99INIT(hw, /**/) { + C99INIT(table, &SPI_VT), + C99INIT(txbuffer, spi_txbuffer), + C99INIT(rxbuffer, spi_rxbuffer), + C99INIT(txbuffer_size, sizeof(spi_txbuffer)), + C99INIT(rxbuffer_size, sizeof(spi_rxbuffer)), + }, + C99INIT(sending, false), + } +}; + +struct SerialHardware *ser_hw_getdesc(int unit) +{ + ASSERT(unit < SER_CNT); + return &UARTDescs[unit].hw; +} + + +/* + * Interrupt handlers + */ + +#if CONFIG_SER_HWHANDSHAKE + +/// This interrupt is triggered when the CTS line goes high +DECLARE_ISR(SIG_CTS) +{ + // Re-enable UDR empty interrupt and TX, then disable CTS interrupt + UCSR0B = BV(BIT_RXCIE0) | BV(BIT_UDRIE0) | BV(BIT_RXEN0) | BV(BIT_TXEN0); + EIMSK &= ~EIMSKF_CTS; +} + +#endif // CONFIG_SER_HWHANDSHAKE + + +/** + * Serial 0 TX interrupt handler + */ +DECLARE_ISR(USART0_UDRE_vect) +{ + SER_STROBE_ON; + + struct FIFOBuffer * const txfifo = &ser_handles[SER_UART0]->txfifo; + + if (fifo_isempty(txfifo)) + { + SER_UART0_BUS_TXEND; +#ifndef SER_UART0_BUS_TXOFF + UARTDescs[SER_UART0].sending = false; +#endif + } +#if CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA128 || CPU_AVR_ATMEGA103 + else if (!IS_CTS_ON) + { + // Disable rx interrupt and tx, enable CTS interrupt + // UNTESTED + UCSR0B = BV(BIT_RXCIE0) | BV(BIT_RXEN0) | BV(BIT_TXEN0); + EIFR |= EIMSKF_CTS; + EIMSK |= EIMSKF_CTS; + } +#endif + else + { + char c = fifo_pop(txfifo); + SER_UART0_BUS_TXCHAR(c); + } + + SER_STROBE_OFF; +} + +#ifdef SER_UART0_BUS_TXOFF +/** + * Serial port 0 TX complete interrupt handler. + * + * This IRQ is usually disabled. The UDR-empty interrupt + * enables it when there's no more data to transmit. + * We need to wait until the last character has been + * transmitted before switching the 485 transceiver to + * receive mode. + * + * The txfifo might have been refilled by putchar() while + * we were waiting for the transmission complete interrupt. + * In this case, we must restart the UDR empty interrupt, + * otherwise we'd stop the serial port with some data + * still pending in the buffer. + */ +DECLARE_ISR(USART0_TX_vect) +{ + SER_STROBE_ON; + + struct FIFOBuffer * const txfifo = &ser_handles[SER_UART0]->txfifo; + if (fifo_isempty(txfifo)) + { + SER_UART0_BUS_TXOFF; + UARTDescs[SER_UART0].sending = false; + } + else + UCSR0B = BV(BIT_RXCIE0) | BV(BIT_UDRIE0) | BV(BIT_RXEN0) | BV(BIT_TXEN0); + + SER_STROBE_OFF; +} +#endif /* SER_UART0_BUS_TXOFF */ + + +#if AVR_HAS_UART1 + +/** + * Serial 1 TX interrupt handler + */ +DECLARE_ISR(USART1_UDRE_vect) +{ + SER_STROBE_ON; + + struct FIFOBuffer * const txfifo = &ser_handles[SER_UART1]->txfifo; + + if (fifo_isempty(txfifo)) + { + SER_UART1_BUS_TXEND; +#ifndef SER_UART1_BUS_TXOFF + UARTDescs[SER_UART1].sending = false; +#endif + } +#if CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA128 || CPU_AVR_ATMEGA103 + else if (!IS_CTS_ON) + { + // Disable rx interrupt and tx, enable CTS interrupt + // UNTESTED + UCSR1B = BV(BIT_RXCIE1) | BV(BIT_RXEN1) | BV(BIT_TXEN1); + EIFR |= EIMSKF_CTS; + EIMSK |= EIMSKF_CTS; + } +#endif + else + { + char c = fifo_pop(txfifo); + SER_UART1_BUS_TXCHAR(c); + } + + SER_STROBE_OFF; +} + +#ifdef SER_UART1_BUS_TXOFF +/** + * Serial port 1 TX complete interrupt handler. + * + * \sa port 0 TX complete handler. + */ +DECLARE_ISR(USART1_TX_vect) +{ + SER_STROBE_ON; + + struct FIFOBuffer * const txfifo = &ser_handles[SER_UART1]->txfifo; + if (fifo_isempty(txfifo)) + { + SER_UART1_BUS_TXOFF; + UARTDescs[SER_UART1].sending = false; + } + else + UCSR1B = BV(BIT_RXCIE1) | BV(BIT_UDRIE1) | BV(BIT_RXEN1) | BV(BIT_TXEN1); + + SER_STROBE_OFF; +} +#endif /* SER_UART1_BUS_TXOFF */ + +#endif // AVR_HAS_UART1 + + +/** + * Serial 0 RX complete interrupt handler. + * + * This handler is interruptible. + * Interrupt are reenabled as soon as recv complete interrupt is + * disabled. Using INTERRUPT() is troublesome when the serial + * is heavily loaded, because an interrupt could be retriggered + * when executing the handler prologue before RXCIE is disabled. + * + * \note The code that re-enables interrupts is commented out + * because in some nasty cases the interrupt is retriggered. + * This is probably due to the RXC flag being set before + * RXCIE is cleared. Unfortunately the RXC flag is read-only + * and can't be cleared by code. + */ +DECLARE_ISR(USART0_RX_vect) +{ + SER_STROBE_ON; + + /* Disable Recv complete IRQ */ + //UCSR0B &= ~BV(RXCIE); + //IRQ_ENABLE; + + /* Should be read before UDR */ + ser_handles[SER_UART0]->status |= UCSR0A & (SERRF_RXSROVERRUN | SERRF_FRAMEERROR); + + /* To clear the RXC flag we must _always_ read the UDR even when we're + * not going to accept the incoming data, otherwise a new interrupt + * will occur once the handler terminates. + */ + char c = UDR0; + struct FIFOBuffer * const rxfifo = &ser_handles[SER_UART0]->rxfifo; + + if (fifo_isfull(rxfifo)) + ser_handles[SER_UART0]->status |= SERRF_RXFIFOOVERRUN; + else + { + fifo_push(rxfifo, c); +#if CONFIG_SER_HWHANDSHAKE + if (fifo_isfull(rxfifo)) + RTS_OFF; +#endif + } + + /* Reenable receive complete int */ + //IRQ_DISABLE; + //UCSR0B |= BV(RXCIE); + + SER_STROBE_OFF; +} + + +#if AVR_HAS_UART1 + +/** + * Serial 1 RX complete interrupt handler. + * + * This handler is interruptible. + * Interrupt are reenabled as soon as recv complete interrupt is + * disabled. Using INTERRUPT() is troublesome when the serial + * is heavily loaded, because an interrupt could be retriggered + * when executing the handler prologue before RXCIE is disabled. + * + * \see DECLARE_ISR(USART1_RX_vect) + */ +DECLARE_ISR(USART1_RX_vect) +{ + SER_STROBE_ON; + + /* Disable Recv complete IRQ */ + //UCSR1B &= ~BV(RXCIE); + //IRQ_ENABLE; + + /* Should be read before UDR */ + ser_handles[SER_UART1]->status |= UCSR1A & (SERRF_RXSROVERRUN | SERRF_FRAMEERROR); + + /* To avoid an IRQ storm, we must _always_ read the UDR even when we're + * not going to accept the incoming data + */ + char c = UDR1; + struct FIFOBuffer * const rxfifo = &ser_handles[SER_UART1]->rxfifo; + //ASSERT_VALID_FIFO(rxfifo); + + if (UNLIKELY(fifo_isfull(rxfifo))) + ser_handles[SER_UART1]->status |= SERRF_RXFIFOOVERRUN; + else + { + fifo_push(rxfifo, c); +#if CONFIG_SER_HWHANDSHAKE + if (fifo_isfull(rxfifo)) + RTS_OFF; +#endif + } + /* Re-enable receive complete int */ + //IRQ_DISABLE; + //UCSR1B |= BV(RXCIE); + + SER_STROBE_OFF; +} + +#endif // AVR_HAS_UART1 + + +/** + * SPI interrupt handler + */ +DECLARE_ISR(SPI_STC_vect) +{ + SER_STROBE_ON; + + /* Read incoming byte. */ + if (!fifo_isfull(&ser_handles[SER_SPI]->rxfifo)) + fifo_push(&ser_handles[SER_SPI]->rxfifo, SPDR); + /* + * FIXME + else + ser_handles[SER_SPI]->status |= SERRF_RXFIFOOVERRUN; + */ + + /* Send */ + if (!fifo_isempty(&ser_handles[SER_SPI]->txfifo)) + SPDR = fifo_pop(&ser_handles[SER_SPI]->txfifo); + else + UARTDescs[SER_SPI].sending = false; + + SER_STROBE_OFF; +} diff --git a/2.5/bertos/cpu/avr/drv/ser_avr.h b/2.5/bertos/cpu/avr/drv/ser_avr.h new file mode 100644 index 00000000..a5a74b52 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/ser_avr.h @@ -0,0 +1,104 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Daniele Basile + * \author Luca Ottaviano + * + * \brief Low-level serial module for AVR (interface). + * + */ + +#ifndef DRV_SER_AVR_H +#define DRV_SER_AVR_H + +#include /* BV() */ +#include /* uint32_t */ + +typedef uint8_t serstatus_t; + +/* Software errors */ +#define SERRF_RXFIFOOVERRUN BV(0) /**< Rx FIFO buffer overrun */ +#define SERRF_RXTIMEOUT BV(5) /**< Receive timeout */ +#define SERRF_TXTIMEOUT BV(6) /**< Transmit timeout */ + +/* +* Hardware errors. +* These flags map directly to the AVR UART Status Register (USR). +*/ +#define SERRF_RXSROVERRUN BV(3) /**< Rx shift register overrun */ +#define SERRF_FRAMEERROR BV(4) /**< Stop bit missing */ +#define SERRF_PARITYERROR BV(7) /**< Parity error */ +#define SERRF_NOISEERROR 0 /**< Unsupported */ + + +/** + * SPI clock polarity. + * + * $WIZ$ ser_spi_pol = "SPI_NORMAL_LOW", "SPI_NORMAL_HIGH" + * } + */ +#define SPI_NORMAL_LOW 0 +#define SPI_NORMAL_HIGH 1 + +/** + * SPI clock phase. + * + * $WIZ$ ser_spi_phase = "SPI_SAMPLE_ON_FIRST_EDGE", "SPI_SAMPLE_ON_SECOND_EDGE" + * } + */ +#define SPI_SAMPLE_ON_FIRST_EDGE 0 +#define SPI_SAMPLE_ON_SECOND_EDGE 1 + +/** + * \name Serial hw numbers + * + * \{ + */ +enum +{ +#if CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA128 || CPU_AVR_ATMEGA1281 + SER_UART0, + SER_UART1, + SER_SPI, +#elif CPU_AVR_ATMEGA103 || CPU_AVR_ATMEGA8 || CPU_AVR_ATMEGA168 || CPU_AVR_ATMEGA328P + SER_UART0, + SER_SPI, +#else + #error unknown architecture +#endif + SER_CNT /**< Number of serial ports */ +}; +/*\}*/ + +#endif /* DRV_SER_AVR_H */ diff --git a/2.5/bertos/cpu/avr/drv/ser_simple_avr.c b/2.5/bertos/cpu/avr/drv/ser_simple_avr.c new file mode 100644 index 00000000..66a00222 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/ser_simple_avr.c @@ -0,0 +1,172 @@ +/** + * \file + * + * + * \brief Simple serial I/O driver + * + * \version $Id$ + * \author Francesco Sacchi + */ + + +#warning FIXME:This module is obsolete, yuo must refactor it. + +#if 0 +#include "ser_simple_avr.h" + +#include +#include +#include /* BV() */ +#include + +#include + +/** + * Send a character over the serial line. + * + * \return the character sent. + */ +int _ser_putchar(int c) +{ + /* Disable Rx to avoid echo*/ + UCSR0B &= ~BV(RXEN); + /* Enable tx*/ + UCSR0B |= BV(TXEN); + /* Prepare transmission */ + UDR0 = c; + /* Wait until byte sent */ + while (!(UCSR0A & BV(TXC))) {} + /* Disable tx to avoid short circuit when tx and rx share the same wire. */ + UCSR0B &= ~BV(TXEN); + /* Enable Rx */ + UCSR0B |= BV(RXEN); + /* Delete TRANSMIT_COMPLETE_BIT flag */ + UCSR0A |= BV(TXC); + return c; +} + + +/** + * Get a character from the serial line. + * If ther is no character in the buffer this function wait until + * one is received (no timeout). + * + * \return the character received. + */ +int _ser_getchar(void) +{ + /* Wait for data */ + while (!(UCSR0A & BV(RXC))) {} + return UDR0; + +} + + +/** + * Get a character from the receiver buffer + * If the buffer is empty, ser_getchar_nowait() returns + * immediatly EOF. + */ +int _ser_getchar_nowait(void) +{ + if (!(UCSR0A & BV(RXC))) return EOF; + else return UDR0; +} + +void _ser_settimeouts(void) +{ +} + +/** + * Set the baudrate. + */ +void _ser_setbaudrate(unsigned long rate) +{ + /* Compute baud-rate period */ + uint16_t period = DIV_ROUND(CPU_FREQ / 16UL, rate) - 1; + + UBRR0H = (period) >> 8; + UBRR0L = (period); +} + +/** + * Send a string. + */ +int _ser_print(const char *s) +{ + while(*s) _ser_putchar(*s++); + return 0; +} + + +void _ser_setparity(int parity) +{ + /* Set the new parity */ + UCSR0C |= (UCSR0C & ~(BV(UPM1) | BV(UPM0))) | (parity << UPM0); +} + +/** + * Dummy functions. + */ +void _ser_purge(void) +{ + while (_ser_getchar_nowait() != EOF) {} +} + +/** + * Initialize serial. + */ +struct Serial * _ser_open(void) +{ + /* + * Set Rx and Tx pins as input to avoid short + * circuit when serial is disabled. + */ + DDRE &= ~(BV(PE0)|BV(PE1)); + PORTE &= ~BV(PE0); + PORTE |= BV(PE1); + /* Enable only Rx section */ + UCSR0B = BV(RXEN); + return NULL; +} + + +/** + * Clean up serial port, disabling the associated hardware. + */ +void _ser_close(void) +{ + /* Disable Rx & Tx. */ + UCSR0B &= ~(BV(RXEN) | BV(TXEN)); +} + +#endif + diff --git a/2.5/bertos/cpu/avr/drv/ser_simple_avr.h b/2.5/bertos/cpu/avr/drv/ser_simple_avr.h new file mode 100644 index 00000000..c6d85883 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/ser_simple_avr.h @@ -0,0 +1,151 @@ +/** + * \file + * + * + * \brief Simple serial I/O driver + * + * \version $Id$ + * \author Bernie Innocenti + * \author Francesco Sacchi + */ + +#ifndef DRV_SER_SIMPLE_AVR_H +#define DRV_SER_SIMPLE_AVR_H + +#warning FIXME:This module is obsolete, yuo must refactor it. + +#if 0 +/* For checking which serial driver is linked */ +#define SER_SIMPLE + +#include +#include + + +#if 0 +#if CPU_AVR + typedef uint8_t serstatus_t; + + /* Software errors */ + #define SERRF_RXFIFOOVERRUN BV(0) /**< Rx FIFO buffer overrun */ + #define SERRF_RXTIMEOUT BV(5) /**< Receive timeout */ + #define SERRF_TXTIMEOUT BV(6) /**< Transmit timeout */ + + /* Hardware errors */ + #define SERRF_RXSROVERRUN BV(3) /**< Rx shift register overrun */ + #define SERRF_FRAMEERROR BV(4) /**< Stop bit missing */ + #define SERRF_PARITYERROR BV(7) /**< Parity error */ +#else + #error unknown architecture +#endif +/*\}*/ + +/** + * \name Serial hw numbers + * + * \{ + */ +enum +{ +#if CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA128 + SER_UART0, + SER_UART1, + SER_SPI, +#elif CPU_AVR_ATMEGA103 || CPU_AVR_ATMEGA8 + SER_UART0, + SER_SPI, +#else + #error unknown architecture +#endif + SER_CNT /**< Number of serial ports */ +}; +/*\}*/ +#endif + +/** \name Parity settings for ser_setparity() */ +/*\{*/ +#define SER_PARITY_NONE 0 +#define SER_PARITY_EVEN 2 +#define SER_PARITY_ODD 3 +/*\}*/ + + +/** Serial handle structure */ +struct Serial; + +/* Function prototypes */ +extern int _ser_putchar(int c); +extern int _ser_getchar(void); +extern int _ser_getchar_nowait(void); +/* +extern int ser_write(struct Serial *port, const void *buf, size_t len); +extern int ser_read(struct Serial *port, void *buf, size_t size); + +extern int ser_printf(struct Serial *port, const char *format, ...) FORMAT(__printf__, 2, 3); + +extern int ser_gets(struct Serial *port, char *buf, int size); +extern int ser_gets_echo(struct Serial *port, char *buf, int size, bool echo); +*/ +extern int _ser_print(const char *s); + +extern void _ser_setbaudrate(unsigned long rate); +extern void _ser_setparity(int parity); +extern void _ser_settimeouts(void); +extern void _ser_setstatus(void); +/* +extern void ser_resync(struct Serial *port, time_t delay); +extern void ser_drain(struct Serial *port); +*/ +extern void _ser_purge(void); +extern struct Serial *_ser_open(void); +extern void _ser_close(void); + +/** + * \name Functions implemented as macros + * + * \{ + */ +#define ser_putchar(c, port) _ser_putchar(c) +#define ser_getchar(port) _ser_getchar() +#define ser_getchar_nowait(port) _ser_getchar_nowait() +#define ser_print(port, s) _ser_print(s) +#define ser_setbaudrate(port, y) _ser_setbaudrate(y) +#define ser_setparity(port, par) _ser_setparity(par) +#define ser_settimeouts(port, y, z) _ser_settimeouts() +#define ser_purge(port) _ser_purge() +#define ser_open(port) _ser_open() +#define ser_getstatus(h) 0 +#define ser_setstatus(h, x) do {(void)(x);} while(0) +/* \} */ + +#endif /* DRV_SER_SIMPLE_AVR_H */ + +#endif diff --git a/2.5/bertos/cpu/avr/drv/stepper_avr.c b/2.5/bertos/cpu/avr/drv/stepper_avr.c new file mode 100644 index 00000000..113865c5 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/stepper_avr.c @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Low-level stepper timer module for AVR (inplementation). + * + * \version $Id$ + * + * \author Daniele Basile + * + */ + +#include "stepper_avr.h" + +#include "cfg/cfg_stepper.h" +#include +#include + +#include +#include + + +#warning TODO:This is an example, you must implement it! + +///< Static array of timer counter struct for stepper. +/* + static struct TimerCounter stepper_timers[CONFIG_TC_STEPPER_MAX_NUM] = + { + { //Timer Counter settings for TIO0 output pin + // fill with stepper timer channel settings + } + + // Add here other stepper timer channel settings + }; +*/ + +/** + * Timer couter setup. + * + * This function apply to select timer couter all needed settings. + * Every settings are stored in stepper_timers[]. + */ +void stepper_tc_setup(int index, stepper_isr_t callback, struct Stepper *motor) +{ + /* Put here the code to setup the stepper timer drive */ + + //Only for test remove when implement this function + (void)index; + (void)callback; + (void)motor; +} + +/** + * Timer counter init. + */ +void stepper_tc_init(void) +{ + /* Put here the code to init the stepper timer drive */ +} + diff --git a/2.5/bertos/cpu/avr/drv/stepper_avr.h b/2.5/bertos/cpu/avr/drv/stepper_avr.h new file mode 100644 index 00000000..840734e7 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/stepper_avr.h @@ -0,0 +1,141 @@ +/** + * \file + * + * + * \brief Low-level stepper timer module for AVR (inplementation). + * + * \version $Id$ + * + * \author Daniele Basile + * + */ + +#ifndef DRV_STEPPER_AVR_H +#define DRV_STEPPER_AVR_H + + +#include +#include + +#include + +#warning TODO:This is an example, you must implement it! + +/** + * IRQ callback function type definition. + */ +typedef void (*irq_t)(void); + +/** + * Timer contex structure. + */ +typedef struct TimerCounter +{ + int timer_id; ///< Timer counter ID + irq_t isr; ///< IRQ handler + stepper_isr_t callback; ///< Interrupt callback pointer + struct Stepper *motor; ///< Stepper context structure + +} TimerCounter; + +/** + * Enable interrupt for timer counter compare event. + */ +INLINE void stepper_tc_irq_enable(struct TimerCounter *timer) +{ + /* put here code to enable timer irq */ + + //Only for test remove when implement this function + (void)timer; +} + + +/** + * Disable interrupt for timer counter compare event. + */ +INLINE void stepper_tc_irq_disable(struct TimerCounter *timer) +{ + /* put here code to disable timer irq */ + + //Only for test remove when implement this function + (void)timer; +} + +/** + * Set delay for next interrupt compare event. + */ +INLINE void stepper_tc_setDelay(struct TimerCounter *timer, stepper_time_t delay) +{ + /* put here code to set the delay for next irq */ + + //Only for test remove when implement this function + (void)timer; + (void)delay; +} + + +/** + * Set delay for next interrupt compare event. + */ +INLINE void stepper_tc_resetTimer(struct TimerCounter *timer) +{ + /* put here code to reset the timer */ + + //Only for test remove when implement this function + (void)timer; +} + +/** + * Programm timer counter to generate a pulse on select TIO output. + */ +INLINE void FAST_FUNC stepper_tc_doPulse(struct TimerCounter *timer) +{ + /* put here code to generate a pulse */ + + //Only for test remove when implement this function + (void)timer; +} + +/** + * Programm timer counter to not generate a pulse on select TIO output. + */ +INLINE void FAST_FUNC stepper_tc_skipPulse(struct TimerCounter *timer) +{ + /* put here code to skip a pulse */ + + //Only for test remove when implement this function + (void)timer; +} + +void stepper_tc_setup(int index, stepper_isr_t callback, struct Stepper *motor); +void stepper_tc_init(void); + +#endif /*DRV_STEPPER_AVR_H */ diff --git a/2.5/bertos/cpu/avr/drv/timer_avr.c b/2.5/bertos/cpu/avr/drv/timer_avr.c new file mode 100644 index 00000000..70876c01 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/timer_avr.c @@ -0,0 +1,259 @@ +/** + * \file + * + * + * \author Bernie Innocenti + * \author Francesco Sacchi + * \author Luca Ottaviano + * + * \brief Low-level timer module for AVR (implementation). + * + * This module is automatically included so no need to include + * in test list. + * notest: avr + */ + +#include +#include // BV() + +#include +#include + +#include + +#if CPU_AVR_ATMEGA1281 || CPU_AVR_ATMEGA168 || CPU_AVR_ATMEGA328P + #define REG_TIFR0 TIFR0 + #define REG_TIFR1 TIFR1 + #define REG_TIFR2 TIFR2 + #if CPU_AVR_ATMEGA1281 + #define REG_TIFR3 TIFR3 + #endif + + #define REG_TIMSK0 TIMSK0 + #define REG_TIMSK1 TIMSK1 + #define REG_TIMSK2 TIMSK2 + #if CPU_AVR_ATMEGA1281 + #define REG_TIMSK3 TIMSK3 + #endif + + #define REG_TCCR0A TCCR0A + #define REG_TCCR0B TCCR0B + + #define REG_TCCR2A TCCR2A + #define REG_TCCR2B TCCR2B + + #define REG_OCR0A OCR0A + #define REG_OCR2A OCR2A + + #define BIT_OCF0A OCF0A + #define BIT_OCF2A OCF2A + + #define BIT_OCIE0A OCIE0A + #define BIT_OCIE2A OCIE2A +#else + #define REG_TIFR0 TIFR + #define REG_TIFR1 TIFR + #define REG_TIFR2 TIFR + #define REG_TIFR3 TIFR + + #define REG_TIMSK0 TIMSK + #define REG_TIMSK1 TIMSK + #define REG_TIMSK2 TIMSK + #define REG_TIMSK3 ETIMSK + + #define REG_TCCR0A TCCR0 + #define REG_TCCR0B TCCR0 + + #define REG_TCCR2A TCCR2 + #define REG_TCCR2B TCCR2 + + #define REG_OCR0A OCR0 + #define REG_OCR2A OCR2 + + #define BIT_OCF0A OCF0 + #define BIT_OCF2A OCF2 + + #define BIT_OCIE0A OCIE0 + #define BIT_OCIE2A OCIE2 +#endif + +#if CPU_AVR_ATMEGA128 || CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA103 + /* These ATMega have different prescaler options. */ + #define TIMER0_PRESCALER_64 BV(CS02) + #define TIMER2_PRESCALER_64 (BV(CS21) | BV(CS20)) +#else + #define TIMER0_PRESCALER_64 (BV(CS01) | BV(CS00)) + #define TIMER2_PRESCALER_64 BV(CS22) +#endif + +/** HW dependent timer initialization */ +#if (CONFIG_TIMER == TIMER_ON_OUTPUT_COMPARE0) + + void timer_hw_init(void) + { + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* Reset Timer flags */ + REG_TIFR0 = BV(BIT_OCF0A) | BV(TOV0); + + /* Setup Timer/Counter interrupt */ + ASSR = 0x00; /* Internal system clock */ + + REG_TCCR0A = 0; // TCCR2 reg could be separate or a unique register with both A & B values, this is needed to + REG_TCCR0B = 0; + + REG_TCCR0A = BV(WGM01); /* Clear on Compare match */ + #if TIMER_PRESCALER == 64 + REG_TCCR0B |= TIMER0_PRESCALER_64; + #else + #error Unsupported value of TIMER_PRESCALER + #endif + + TCNT0 = 0x00; /* Initialization of Timer/Counter */ + REG_OCR0A = OCR_DIVISOR; /* Timer/Counter Output Compare Register */ + + /* Enable timer interrupts: Timer/Counter2 Output Compare (OCIE2) */ + REG_TIMSK0 &= ~BV(TOIE0); + REG_TIMSK0 |= BV(BIT_OCIE0A); + + IRQ_RESTORE(flags); + } + +#elif (CONFIG_TIMER == TIMER_ON_OVERFLOW1) + + void timer_hw_init(void) + { + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* Reset Timer overflow flag */ + REG_TIFR1 |= BV(TOV1); + + /* Fast PWM mode, 9 bit, 24 kHz, no prescaling. */ + #if (TIMER_PRESCALER == 1) && (TIMER_HW_BITS == 9) + TCCR1A |= BV(WGM11); + TCCR1A &= ~BV(WGM10); + TCCR1B |= BV(WGM12) | BV(CS10); + TCCR1B &= ~(BV(WGM13) | BV(CS11) | BV(CS12)); + /* Fast PWM mode, 8 bit, 24 kHz, no prescaling. */ + #elif (TIMER_PRESCALER == 1) && (TIMER_HW_BITS == 8) + TCCR1A |= BV(WGM10); + TCCR1A &= ~BV(WGM11); + TCCR1B |= BV(WGM12) | BV(CS10); + TCCR1B &= ~(BV(WGM13) | BV(CS11) | BV(CS12)); + #else + #error Unsupported value of TIMER_PRESCALER or TIMER_HW_BITS + #endif + + TCNT1 = 0x00; /* initialization of Timer/Counter */ + + /* Enable timer interrupt: Timer/Counter1 Overflow */ + REG_TIMSK1 |= BV(TOIE1); + + IRQ_RESTORE(flags); + } + +#elif (CONFIG_TIMER == TIMER_ON_OUTPUT_COMPARE2) + void timer_hw_init(void) + { + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* Reset Timer flags */ + REG_TIFR2 = BV(BIT_OCF2A) | BV(TOV2); + + /* Setup Timer/Counter interrupt */ + REG_TCCR2A = 0; // TCCR2 reg could be separate or a unique register with both A & B values, this is needed to + REG_TCCR2B = 0; // ensure correct initialization. + + REG_TCCR2A = BV(WGM21); + #if TIMER_PRESCALER == 64 + REG_TCCR2B |= TIMER2_PRESCALER_64; + #else + #error Unsupported value of TIMER_PRESCALER + #endif + + /* Clear on Compare match & prescaler = 64, internal sys clock. + When changing prescaler change TIMER_HW_HPTICKS_PER_SEC too */ + TCNT2 = 0x00; /* initialization of Timer/Counter */ + REG_OCR2A = (uint8_t)OCR_DIVISOR; /* Timer/Counter Output Compare Register */ + + /* Enable timer interrupts: Timer/Counter2 Output Compare (OCIE2) */ + REG_TIMSK2 &= ~BV(TOIE2); + REG_TIMSK2 |= BV(BIT_OCIE2A); + + IRQ_RESTORE(flags); + } + +#elif (CONFIG_TIMER == TIMER_ON_OVERFLOW3) + + #if CPU_AVR_ATMEGA168 || CPU_AVR_ATMEGA328P || CPU_AVR_ATMEGA32 + #error For select target there is not TIMER_ON_OVERFLOW3, please select an other one. + #endif + + void timer_hw_init(void) + { + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* Reset Timer overflow flag */ + REG_TIFR3 |= BV(TOV3); + + /* Fast PWM mode, 9 bit, 24 kHz, no prescaling. */ + #if (TIMER_PRESCALER == 1) && (TIMER_HW_BITS == 9) + TCCR3A |= BV(WGM31); + TCCR3A &= ~BV(WGM30); + TCCR3B |= BV(WGM32) | BV(CS30); + TCCR3B &= ~(BV(WGM33) | BV(CS31) | BV(CS32)); + /* Fast PWM mode, 8 bit, 24 kHz, no prescaling. */ + #elif (TIMER_PRESCALER == 1) && (TIMER_HW_BITS == 8) + TCCR3A |= BV(WGM30); + TCCR3A &= ~BV(WGM31); + TCCR3B |= BV(WGM32) | BV(CS30); + TCCR3B &= ~(BV(WGM33) | BV(CS31) | BV(CS32)); + #else + #error Unsupported value of TIMER_PRESCALER or TIMER_HW_BITS + #endif + + /* initialization of Timer/Counter */ + TCNT3 = 0x00; + + /* Enable timer interrupt: Timer/Counter3 Overflow */ + REG_TIMSK3 |= BV(TOIE3); + + IRQ_RESTORE(flags); + } + +#else + #error Unimplemented value for CONFIG_TIMER +#endif /* CONFIG_TIMER */ + diff --git a/2.5/bertos/cpu/avr/drv/timer_avr.h b/2.5/bertos/cpu/avr/drv/timer_avr.h new file mode 100644 index 00000000..78225ff1 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/timer_avr.h @@ -0,0 +1,173 @@ +/** + * \file + * + * + * \brief Low-level timer module for AVR (interface). + * + * \author Bernie Innocenti + * \author Francesco Sacchi + * \author Luca Ottaviano + * + */ + +#ifndef DRV_TIMER_AVR_H +#define DRV_TIMER_AVR_H + +#include /* CPU_FREQ */ + +#include "cfg/cfg_timer.h" /* CONFIG_TIMER */ +#include /* uint8_t */ +#include /* DIV_ROUND */ + +#include +#include + +/** + * \name Values for CONFIG_TIMER. + * + * Select which hardware timer interrupt to use for system clock and softtimers. + * \note The timer 1 overflow mode set the timer as a 24 kHz PWM. + * $WIZ$ timer_select = "TIMER_ON_OUTPUT_COMPARE0", "TIMER_ON_OVERFLOW1", "TIMER_ON_OUTPUT_COMPARE2", "TIMER_ON_OVERFLOW3", "TIMER_DEFAULT" + */ +#define TIMER_ON_OUTPUT_COMPARE0 1 +#define TIMER_ON_OVERFLOW1 2 +#define TIMER_ON_OUTPUT_COMPARE2 3 +#define TIMER_ON_OVERFLOW3 4 + +#define TIMER_DEFAULT TIMER_ON_OUTPUT_COMPARE0 ///< Default system timer + +/* + * Hardware dependent timer initialization. + */ +#if (CONFIG_TIMER == TIMER_ON_OUTPUT_COMPARE0) + + #define TIMER_PRESCALER 64 + #define TIMER_HW_BITS 8 + #if CPU_AVR_ATMEGA1281 || CPU_AVR_ATMEGA168 || CPU_AVR_ATMEGA328P + #define DEFINE_TIMER_ISR DECLARE_ISR_CONTEXT_SWITCH(TIMER0_COMPA_vect) + #else + #define DEFINE_TIMER_ISR DECLARE_ISR_CONTEXT_SWITCH(TIMER0_COMP_vect) + #endif + #define TIMER_TICKS_PER_SEC 1000 + #define TIMER_HW_CNT OCR_DIVISOR + + /// Type of time expressed in ticks of the hardware high-precision timer + typedef uint8_t hptime_t; + #define SIZEOF_HPTIME_T 1 + + INLINE hptime_t timer_hw_hpread(void) + { + return TCNT0; + } + +#elif (CONFIG_TIMER == TIMER_ON_OVERFLOW1) + + #define TIMER_PRESCALER 1 + #define TIMER_HW_BITS 8 + /** This value is the maximum in overflow based timers. */ + #define TIMER_HW_CNT (1 << TIMER_HW_BITS) + #define DEFINE_TIMER_ISR DECLARE_ISR_CONTEXT_SWITCH(TIMER1_OVF_vect) + #define TIMER_TICKS_PER_SEC DIV_ROUND(TIMER_HW_HPTICKS_PER_SEC, TIMER_HW_CNT) + + /// Type of time expressed in ticks of the hardware high precision timer + typedef uint16_t hptime_t; + #define SIZEOF_HPTIME_T 2 + + INLINE hptime_t timer_hw_hpread(void) + { + return TCNT1; + } + +#elif (CONFIG_TIMER == TIMER_ON_OUTPUT_COMPARE2) + + #define TIMER_PRESCALER 64 + #define TIMER_HW_BITS 8 + #if CPU_AVR_ATMEGA1281 || CPU_AVR_ATMEGA168 || CPU_AVR_ATMEGA328P + #define DEFINE_TIMER_ISR DECLARE_ISR_CONTEXT_SWITCH(TIMER2_COMPA_vect) + #else + #define DEFINE_TIMER_ISR DECLARE_ISR_CONTEXT_SWITCH(TIMER2_COMP_vect) + #endif + #define TIMER_TICKS_PER_SEC 1000 + /** Value for OCR register in output-compare based timers. */ + #define TIMER_HW_CNT OCR_DIVISOR + + /// Type of time expressed in ticks of the hardware high precision timer + typedef uint8_t hptime_t; + #define SIZEOF_HPTIME_T 1 + + INLINE hptime_t timer_hw_hpread(void) + { + return TCNT2; + } + +#elif (CONFIG_TIMER == TIMER_ON_OVERFLOW3) + + #define TIMER_PRESCALER 1 + #define TIMER_HW_BITS 8 + /** This value is the maximum in overflow based timers. */ + #define TIMER_HW_CNT (1 << TIMER_HW_BITS) + #define DEFINE_TIMER_ISR DECLARE_ISR_CONTEXT_SWITCH(TIMER3_OVF_vect) + #define TIMER_TICKS_PER_SEC DIV_ROUND(TIMER_HW_HPTICKS_PER_SEC, TIMER_HW_CNT) + + /// Type of time expressed in ticks of the hardware high precision timer + typedef uint16_t hptime_t; + #define SIZEOF_HPTIME_T 2 + + INLINE hptime_t timer_hw_hpread(void) + { + return TCNT3; + } + +#else + + #error Unimplemented value for CONFIG_TIMER +#endif /* CONFIG_TIMER */ + + +/** Frequency of the hardware high precision timer. */ +#define TIMER_HW_HPTICKS_PER_SEC DIV_ROUND(CPU_FREQ, TIMER_PRESCALER) + +/** + * System timer: additional division after the prescaler + * 12288000 / 64 / 192 (0..191) = 1 ms + */ +#define OCR_DIVISOR (DIV_ROUND(DIV_ROUND(CPU_FREQ, TIMER_PRESCALER), TIMER_TICKS_PER_SEC) - 1) + +/** Not needed, IRQ timer flag cleared automatically */ +#define timer_hw_irq() do {} while (0) + +/** Not needed, timer IRQ handler called only for timer source */ +#define timer_hw_triggered() (true) + +void timer_hw_init(void); + +#endif /* DRV_TIMER_AVR_H */ diff --git a/2.5/bertos/cpu/avr/drv/timer_simple_avr.c b/2.5/bertos/cpu/avr/drv/timer_simple_avr.c new file mode 100644 index 00000000..95caf428 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/timer_simple_avr.c @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Some simple delay routines. + * + * Simple serial driver + * \version $Id$ + * \author Francesco Sacchi + */ + +#warning FIXME:This module is obsolete, yuo must refactor it. + +#if 0 +#include +#include "timer_simple_avr.h" +#include +#include +#include /* BV() */ + +#include + + +#define MS_PER_SEC 1000UL +#define TIMER_PRESCALER 64UL +#define TIMER_DELAY_1MS (255 - CPU_FREQ / TIMER_PRESCALER / MS_PER_SEC) + +/** + * Wait \a time ms using timer 0. + * + */ +void timer_delay(mtime_t time) +{ + /* Set timer clock to clock_freq/64 */ + TCCR0 = BV(CS02); + + while (time--) + { + /* Initialize timer counter register */ + TCNT0 = TIMER_DELAY_1MS; + /* Clear overflow bit. */ + TIFR |= BV(TOV0); + /* Wait overflow. */ + while (!(TIFR & BV(TOV0))); +#if CONFIG_WATCHDOG + wdt_reset(); +#endif + } +} +#endif + diff --git a/2.5/bertos/cpu/avr/drv/timer_simple_avr.h b/2.5/bertos/cpu/avr/drv/timer_simple_avr.h new file mode 100644 index 00000000..a513209c --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/timer_simple_avr.h @@ -0,0 +1,50 @@ +/** + * \file + * + * + * \brief Simple delay routine + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef DRV_TIMER_SIMPLE_AVR_H +#define DRV_TIMER_SIMPLE_AVR_H + +#warning FIXME:This module is obsolete, yuo must refactor it. + +#if 0 +#include + +extern void timer_delay(mtime_t time); + +#endif /* TIMER_SIMPLE_H */ + +#endif diff --git a/2.5/bertos/cpu/avr/drv/wdt_avr.h b/2.5/bertos/cpu/avr/drv/wdt_avr.h new file mode 100644 index 00000000..21f5f9b1 --- /dev/null +++ b/2.5/bertos/cpu/avr/drv/wdt_avr.h @@ -0,0 +1,97 @@ +/** + * \file + * + * + * \brief Watchdog interface for AVR architecture. + * + * \note The avr-libc already provide an api to manage the watchdog on AVR architecture. + * In avr-libc are also available several constants used to set the timeout value + * (see documentation for more detail). + * + * \version $Id$ + * + * \author Daniele Basile + * + */ + +#ifndef DRV_WDT_AVR_H +#define DRV_WDT_AVR_H + +#include "cfg/cfg_wdt.h" + +#include // INLINE + +#include +#include + +/** + * Reset the watchdog timer. + * + * This functions is already defind in avr-libc. + */ +// void wdt_reset(void) + +/** + * Start the watchdog timer that fire at the select + * timeout. + * + * \param _timeout you can use the macro that are defineded in + * avr/wdt.h. + * + * (from avr libc documentation) + * WDTO_15MS + * WDTO_30MS + * WDTO_60MS + * WDTO_120MS + * WDTO_250MS + * WDTO_500MS + * WDTO_1S + * WDTO_2S + * WDTO_4S + * WDTO_8S + */ +INLINE void wdt_start(uint32_t _timeout) +{ + uint8_t timeout = _timeout; + + wdt_enable(timeout); +} + +/** + * Stop watchdog timer. + */ +INLINE void wdt_stop(void) +{ + wdt_disable(); +} + + +#endif /* DRV_WDT_AVR_H */ diff --git a/2.5/bertos/cpu/avr/hw/switch_avr.S b/2.5/bertos/cpu/avr/hw/switch_avr.S new file mode 100644 index 00000000..8de975fc --- /dev/null +++ b/2.5/bertos/cpu/avr/hw/switch_avr.S @@ -0,0 +1,6 @@ +#include + +#if !(ARCH & ARCH_NIGHTTEST) + #warning This file is deprecated, use switch_ctx_avr.S + #include "switch_ctx_avr.S" +#endif diff --git a/2.5/bertos/cpu/avr/hw/switch_ctx_avr.S b/2.5/bertos/cpu/avr/hw/switch_ctx_avr.S new file mode 100644 index 00000000..cb10b5f8 --- /dev/null +++ b/2.5/bertos/cpu/avr/hw/switch_ctx_avr.S @@ -0,0 +1,115 @@ +/*! + * \file + * + * + * \version $Id$ + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + * \brief AVR context switch + * + */ + +#include + +/* void asm_switch_context(void **new_sp [r24:r25], void **save_sp [r22:r23]) */ +.globl asm_switch_context +asm_switch_context: + +; r0 is the TEMP REG and can be used freely. +; r1 is the ZERO REG and must always contain 0. +; +; Stack frame is 18 byte, remember to update +; CPU_SAVED_REGS_CNT if you change pushed regs. + + push r2 + push r3 + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push r16 + push r17 + + push r28 + push r29 + + in r18,SPL-__SFR_OFFSET ; r18:r19 = SP + in r19,SPH-__SFR_OFFSET + movw r26,r22 ; X = save_sp + st X+,r18 ; *save_sp = SP + st X,r19 + movw r26,r24 ; X = new_sp + ld r18,X+ + ld r19,X + +; Set new stack pointer. +; AVR is an 8 bit processor so +; care must be taken when updating +; SP that is a 16 bit reg. +; Two instructions are required to update SP +; so an IRQ can sneak in between them. +; So IRQ *MUST* be disabled and then restored. + in r0, SREG-__SFR_OFFSET + cli ; Disable interrupt + out SPL-__SFR_OFFSET,r18 ; SP = *new_sp + out SPH-__SFR_OFFSET,r19 + out SREG-__SFR_OFFSET,r0 ; Restore previous IRQ state + + pop r29 + pop r28 + + pop r17 + pop r16 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + pop r3 + pop r2 + + ret diff --git a/2.5/bertos/cpu/avr/info/ATmega103.cdef b/2.5/bertos/cpu/avr/info/ATmega103.cdef new file mode 100644 index 00000000..2d1cd912 --- /dev/null +++ b/2.5/bertos/cpu/avr/info/ATmega103.cdef @@ -0,0 +1,54 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the ATMega103. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the path. +include("avr.common") + +# Short description of the cpu. +CPU_DESC += [ "128 Kbyte in-System Programmable Flash", + "4 Kbytes internal SRAM memory", + "4 Kbytes EEPROM memory" ] + +# If we use the GCC compiler we should pass some flags. +CORE_CPU = "atmega103" + +include("avr_post.common") diff --git a/2.5/bertos/cpu/avr/info/ATmega128.cdef b/2.5/bertos/cpu/avr/info/ATmega128.cdef new file mode 100644 index 00000000..88eb826c --- /dev/null +++ b/2.5/bertos/cpu/avr/info/ATmega128.cdef @@ -0,0 +1,54 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the ATMega128. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the path. +include("avr.common") + +# Short description of the cpu. +CPU_DESC += [ "128 Kbyte in-System Programmable Flash", + "4 Kbytes internal SRAM memory", + "4 bytes EEPROM memory" ] + +# If we use the GCC compiler we should pass some flags. +CORE_CPU = "atmega128" + +include("avr_post.common") diff --git a/2.5/bertos/cpu/avr/info/ATmega1281.cdef b/2.5/bertos/cpu/avr/info/ATmega1281.cdef new file mode 100644 index 00000000..7b048660 --- /dev/null +++ b/2.5/bertos/cpu/avr/info/ATmega1281.cdef @@ -0,0 +1,55 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the ATMega1281. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + + +# Import the common settings for the path. +include("avr.common") + +# Short description of the cpu. +CPU_DESC += [ "128 Kbyte in-System Programmable Flash", + "8 Kbytes internal SRAM memory", + "4 Kbytes EEPROM memory" ] + +# If we use the GCC compiler we should pass some flags. +CORE_CPU = "atmega1281" + +include("avr_post.common") diff --git a/2.5/bertos/cpu/avr/info/ATmega168.cdef b/2.5/bertos/cpu/avr/info/ATmega168.cdef new file mode 100644 index 00000000..a373e754 --- /dev/null +++ b/2.5/bertos/cpu/avr/info/ATmega168.cdef @@ -0,0 +1,54 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the ATMega168. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the path. +include("avr.common") + +# Short description of the cpu. +CPU_DESC += [ "16 Kbyte in-System Programmable Flash", + "1 Kbytes internal SRAM memory", + "512 bytes EEPROM memory" ] + +# If we use the GCC compiler we should pass some flags. +CORE_CPU = "atmega168" + +include("avr_post.common") diff --git a/2.5/bertos/cpu/avr/info/ATmega32.cdef b/2.5/bertos/cpu/avr/info/ATmega32.cdef new file mode 100644 index 00000000..9a73ebaf --- /dev/null +++ b/2.5/bertos/cpu/avr/info/ATmega32.cdef @@ -0,0 +1,54 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the ATMega32. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the path. +include("avr.common") + +# Short description of the cpu. +CPU_DESC += [ "32 Kbyte in-System Programmable Flash", + "2 Kbytes internal SRAM memory", + "1 Kbytes EEPROM memory" ] + +# If we use the GCC compiler we should pass some flags. +CORE_CPU = "atmega32" + +include("avr_post.common") diff --git a/2.5/bertos/cpu/avr/info/ATmega328P.cdef b/2.5/bertos/cpu/avr/info/ATmega328P.cdef new file mode 100644 index 00000000..a6d61055 --- /dev/null +++ b/2.5/bertos/cpu/avr/info/ATmega328P.cdef @@ -0,0 +1,55 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the ATMega328P. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Luca Ottaviano +# +# + +# Import the common settings for the path. +include("avr.common") + +# Short description of the cpu. +CPU_DESC += [ "Arduino Duemilanove", + "32 Kbyte in-System Programmable Flash", + "2 Kbytes internal SRAM memory", + "1 Kbyte EEPROM memory" ] + +# If we use the GCC compiler we should pass some flags. +CORE_CPU = "atmega328p" + +include("avr_post.common") diff --git a/2.5/bertos/cpu/avr/info/ATmega64.cdef b/2.5/bertos/cpu/avr/info/ATmega64.cdef new file mode 100644 index 00000000..77b04434 --- /dev/null +++ b/2.5/bertos/cpu/avr/info/ATmega64.cdef @@ -0,0 +1,54 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the ATMega64. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the path. +include("avr.common") + +# Short description of the cpu. +CPU_DESC += [ "64 Kbyte in-System Programmable Flash", + "4 Kbytes internal SRAM memory", + "2 Kbytes EEPROM memory" ] + +# If we use the GCC compiler we should pass some flags. +CORE_CPU = "atmega64" + +include("avr_post.common") diff --git a/2.5/bertos/cpu/avr/info/ATmega8.cdef b/2.5/bertos/cpu/avr/info/ATmega8.cdef new file mode 100644 index 00000000..2cfbaa5e --- /dev/null +++ b/2.5/bertos/cpu/avr/info/ATmega8.cdef @@ -0,0 +1,54 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Cpu info of the ATMega8. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the path. +include("avr.common") + +# Short description of the cpu. +CPU_DESC += [ "8 Kbyte in-System Programmable Flash", + "1 Kbytes internal SRAM memory", + "512 bytes EEPROM memory" ] + +# If we use the GCC compiler we should pass some flags. +CORE_CPU = "atmega8" + +include("avr_post.common") diff --git a/2.5/bertos/cpu/avr/info/avr.common b/2.5/bertos/cpu/avr/info/avr.common new file mode 100644 index 00000000..f0fd278c --- /dev/null +++ b/2.5/bertos/cpu/avr/info/avr.common @@ -0,0 +1,69 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# General CPU info denfinition AVR family. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# Import the common settings for the path. +include("../../path.common") + +# Short description of the cpu. +CPU_DESC = [ "ATMEL AVR Microcontroller ", + "8-bit RISC Architecture"] + +# Type of the toolchain we should use to compile the source for this CPU. +TOOLCHAIN = "avr" + +# Special CPU related tags. +CPU_TAGS = ["harvard", TOOLCHAIN] + +# CPU default clock frequency +CPU_DEFAULT_FREQ = "8000000UL" + +# Where are locate the bertos directories +SCRIPT_DIR = CPU_DIR + "avr/scripts/" + +MK_FLASH_SCRIPT = PRG_SCRIPTS_DIR + "avr/flash.sh" +MK_STOPFLASH_SCRIPT = PRG_SCRIPTS_DIR + "avr/stopflash.sh" +MK_DEBUG_SCRIPT = PRG_SCRIPTS_DIR + "nodebug.sh" +MK_STOPDEBUG_SCRIPT = PRG_SCRIPTS_DIR + "none.sh" + +# Common GCC flags. +MK_CPU_CPPFLAGS = "-Os -I" + CPU_DIR + "avr/" + diff --git a/2.5/bertos/cpu/avr/info/avr_post.common b/2.5/bertos/cpu/avr/info/avr_post.common new file mode 100644 index 00000000..b5aa27f9 --- /dev/null +++ b/2.5/bertos/cpu/avr/info/avr_post.common @@ -0,0 +1,9 @@ + +# CPU type used for flashing +MK_PROGRAMMER_CPU = CORE_CPU + +# Name of the flag used by the build system to pass to the compiler the CPU type. +MK_MCU = CORE_CPU + +# Add CPU core to tags +CPU_TAGS += [ CORE_CPU ] diff --git a/2.5/bertos/cpu/byteorder.h b/2.5/bertos/cpu/byteorder.h new file mode 100644 index 00000000..805a4f5f --- /dev/null +++ b/2.5/bertos/cpu/byteorder.h @@ -0,0 +1,267 @@ +/** + * \file + * + * + * \brief Functions to convert integers to/from host byte-order. + * + * \version $Id$ + * \author Bernie Innocenti + * \author Stefano Fedrigo + */ + +#ifndef MWARE_BYTEORDER_H +#define MWARE_BYTEORDER_H + +#include +#include + +/** + * Swap upper and lower bytes in a 16-bit value. + */ +INLINE uint16_t swab16(uint16_t x) +{ + return ((x & (uint16_t)0x00FFU) << 8) + | ((x & (uint16_t)0xFF00U) >> 8); +} + +/** + * Reverse bytes in a 32-bit value (e.g.: 0x12345678 -> 0x78563412). + */ +INLINE uint32_t swab32(uint32_t x) +{ + return ((x & (uint32_t)0x000000FFUL) << 24) + | ((x & (uint32_t)0x0000FF00UL) << 8) + | ((x & (uint32_t)0x00FF0000UL) >> 8) + | ((x & (uint32_t)0xFF000000UL) >> 24); +} + +/** + * Reverse bytes in a 64-bit value. + */ +INLINE uint64_t swab64(uint64_t x) +{ + return (uint64_t)swab32(x >> 32) + | ((uint64_t)swab32(x & 0xFFFFFFFFUL) << 32); +} + +/** + * Reverse bytes in a float value. + */ +INLINE float swab_float(float x) +{ + /* Avoid breaking strict aliasing rules. */ + char *cx = (char *)(&x); + STATIC_ASSERT(sizeof(float) == 4); + #define BYTEORDER_SWAP(a, b) ((a) ^= (b) ^= (a) ^= (b)) + BYTEORDER_SWAP(cx[0], cx[3]); + BYTEORDER_SWAP(cx[1], cx[2]); + #undef BYTEORDER_SWAP + return x; +} + +INLINE uint16_t cpu_to_be16(uint16_t x) +{ + return (CPU_BYTE_ORDER == CPU_LITTLE_ENDIAN) ? swab16(x) : x; +} + +INLINE uint16_t cpu_to_le16(uint16_t x) +{ + return (CPU_BYTE_ORDER == CPU_BIG_ENDIAN) ? swab16(x) : x; +} + +INLINE uint32_t cpu_to_be32(uint32_t x) +{ + return (CPU_BYTE_ORDER == CPU_LITTLE_ENDIAN) ? swab32(x) : x; +} + +INLINE uint32_t cpu_to_le32(uint32_t x) +{ + return (CPU_BYTE_ORDER == CPU_BIG_ENDIAN) ? swab32(x) : x; +} + +INLINE uint64_t cpu_to_be64(uint64_t x) +{ + return (CPU_BYTE_ORDER == CPU_LITTLE_ENDIAN) ? swab64(x) : x; +} + +INLINE uint64_t cpu_to_le64(uint64_t x) +{ + return (CPU_BYTE_ORDER == CPU_BIG_ENDIAN) ? swab64(x) : x; +} + +INLINE float cpu_to_be_float(float x) +{ + return (CPU_BYTE_ORDER == CPU_LITTLE_ENDIAN) ? swab_float(x) : x; +} + +INLINE float cpu_to_le_float(float x) +{ + return (CPU_BYTE_ORDER == CPU_BIG_ENDIAN) ? swab_float(x) : x; +} + +INLINE uint16_t be16_to_cpu(uint16_t x) +{ + return cpu_to_be16(x); +} + +INLINE uint16_t le16_to_cpu(uint16_t x) +{ + return cpu_to_le16(x); +} + +INLINE uint32_t be32_to_cpu(uint32_t x) +{ + return cpu_to_be32(x); +} + +INLINE uint32_t le32_to_cpu(uint32_t x) +{ + return cpu_to_le32(x); +} + +INLINE uint64_t be64_to_cpu(uint64_t x) +{ + return cpu_to_be64(x); +} + +INLINE uint64_t le64_to_cpu(uint64_t x) +{ + return cpu_to_le64(x); +} + +INLINE float be_float_to_cpu(float x) +{ + return cpu_to_be_float(x); +} + +INLINE float le_float_to_cpu(float x) +{ + return cpu_to_le_float(x); +} + +INLINE uint16_t host_to_net16(uint16_t x) +{ + return cpu_to_be16(x); +} + +INLINE uint16_t net_to_host16(uint16_t x) +{ + return be16_to_cpu(x); +} + +INLINE uint32_t host_to_net32(uint32_t x) +{ + return cpu_to_be32(x); +} + +INLINE uint32_t net_to_host32(uint32_t x) +{ + return be32_to_cpu(x); +} + +INLINE uint64_t host_to_net64(uint64_t x) +{ + return cpu_to_be64(x); +} + +INLINE uint64_t net_to_host64(uint64_t x) +{ + return be64_to_cpu(x); +} + +INLINE float host_to_net_float(float x) +{ + return cpu_to_be_float(x); +} + +INLINE float net_to_host_float(float x) +{ + return be_float_to_cpu(x); +} + +#ifdef __cplusplus + +/// Type generic byte swapping. +template +INLINE T swab(T x); + +template<> INLINE uint16_t swab(uint16_t x) { return swab16(x); } +template<> INLINE uint32_t swab(uint32_t x) { return swab32(x); } +template<> INLINE uint64_t swab(uint64_t x) { return swab64(x); } +template<> INLINE int16_t swab(int16_t x) { return static_cast(swab16(static_cast(x))); } +template<> INLINE int32_t swab(int32_t x) { return static_cast(swab32(static_cast(x))); } +template<> INLINE int64_t swab(int64_t x) { return static_cast(swab64(static_cast(x))); } +template<> INLINE float swab(float x) { return swab_float(x); } + +/// Type generic conversion from CPU byte order to big-endian byte order. +template +INLINE T cpu_to_be(T x) +{ + return (CPU_BYTE_ORDER == CPU_LITTLE_ENDIAN) ? swab(x) : x; +} + +/// Type generic conversion from CPU byte-order to little-endian. +template +INLINE T cpu_to_le(T x) +{ + return (CPU_BYTE_ORDER == CPU_BIG_ENDIAN) ? swab(x) : x; +} + +/// Type generic conversion from big endian byte-order to CPU byte order. +template +INLINE T be_to_cpu(T x) +{ + return cpu_to_be(x); +} + +/// Type generic conversion from little-endian byte order to CPU byte order. +template +INLINE T le_to_cpu(T x) +{ + return cpu_to_le(x); +} + +/// Type generic conversion from network byte order to host byte order. +template +INLINE T net_to_host(T x) +{ + return be_to_cpu(x); +} + +/// Type generic conversion from host byte order to network byte order. +template +INLINE T host_to_net(T x) +{ + return net_to_host(x); +} + +#endif /* __cplusplus */ + +#endif /* MWARE_BYTEORDER_H */ diff --git a/2.5/bertos/cpu/cortex-m3/drv/clock_lm3s.c b/2.5/bertos/cpu/cortex-m3/drv/clock_lm3s.c new file mode 100644 index 00000000..0cd5da84 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/clock_lm3s.c @@ -0,0 +1,175 @@ +/** + * \file + * + * + * \brief LM3S1968 Clocking driver. + * + * \author Andrea Righi + */ + +#include +#include +#include +#include "clock_lm3s.h" + +/* The PLL VCO frequency is 400 MHz */ +#define PLL_VCO 400000000UL + +/* Extract the system clock divisor from the RCC register */ +#define RCC_TO_DIV(rcc) \ + (((rcc & SYSCTL_RCC_SYSDIV_MASK) >> \ + SYSCTL_RCC_SYSDIV_SHIFT) + 1) + +/* + * Very small delay: each loop takes 3 cycles. + */ +void NAKED lm3s_busyWait(unsigned long iterations) +{ + register uint32_t __n asm("r0") = iterations; + + asm volatile ( + "1: subs r0, #1\n\t" + "bne 1b\n\t" + "bx lr\n\t" + : : "r"(__n) : "memory", "cc"); +} + +INLINE unsigned long clock_get_rate(void) +{ + reg32_t rcc = HWREG(SYSCTL_RCC); + + return rcc & SYSCTL_RCC_USESYSDIV ? + PLL_VCO / 2 / RCC_TO_DIV(rcc) : PLL_VCO; +} + +/* + * Try to evaluate the correct SYSDIV value depending on the desired CPU + * frequency. + */ +INLINE int evaluate_sysdiv(unsigned long freq) +{ + int i; + + /* + * NOTE: with BYPASS=0, SYSDIV < 3 are reserved values (see LM3S1968 + * Microcontroller DATASHEET, p.78). + */ + for (i = 3; i < 16; i++) + if (freq >= (PLL_VCO / 2 / (i + 1))) + break; + return i; +} + +void clock_init(void) +{ + reg32_t rcc, rcc2; + unsigned long clk; + int i; + + rcc = HWREG(SYSCTL_RCC); + rcc2 = HWREG(SYSCTL_RCC2); + + /* + * Step #1: bypass the PLL and system clock divider by setting the + * BYPASS bit and clearing the USESYS bit in the RCC register. This + * configures the system to run off a “raw” clock source (using the + * main oscillator or internal oscillator) and allows for the new PLL + * configuration to be validated before switching the system clock to + * the PLL. + */ + rcc |= SYSCTL_RCC_BYPASS; + rcc &= ~SYSCTL_RCC_USESYSDIV; + rcc2 |= SYSCTL_RCC2_BYPASS2; + + /* Write back RCC/RCC2 registers */ + HWREG(SYSCTL_RCC) = rcc; + HWREG(SYSCTL_RCC) = rcc2; + + lm3s_busyWait(16); + + /* + * Step #2: select the crystal value (XTAL) and oscillator source + * (OSCSRC), and clear the PWRDN bit in RCC/RCC2. Setting the XTAL + * field automatically pulls valid PLL configuration data for the + * appropriate crystal, and clearing the PWRDN bit powers and enables + * the PLL and its output. + */ + + /* Enable the main oscillator first. */ + rcc &= ~(SYSCTL_RCC_IOSCDIS | SYSCTL_RCC_MOSCDIS); + rcc |= SYSCTL_RCC_IOSCDIS; + + /* Do not override RCC register fields */ + rcc2 &= ~SYSCTL_RCC2_USERCC2; + + rcc &= ~(SYSCTL_RCC_XTAL_M | SYSCTL_RCC_OSCSRC_M | SYSCTL_RCC_PWRDN); + rcc |= XTAL_FREQ | SYSCTL_RCC_OSCSRC_MAIN; + + /* Clear the PLL lock interrupt. */ + HWREG(SYSCTL_MISC) = SYSCTL_INT_PLL_LOCK; + + HWREG(SYSCTL_RCC) = rcc; + HWREG(SYSCTL_RCC) = rcc2; + + lm3s_busyWait(16); + + /* + * Step #3: select the desired system divider (SYSDIV) in RCC/RCC2 and + * set the USESYS bit in RCC. The SYSDIV field determines the system + * frequency for the microcontroller. + */ + rcc &= ~(SYSCTL_RCC_SYSDIV_M | SYSCTL_RCC_USESYSDIV); + + clk = PLL_VCO / 2; + for (i = 3; i < 16; i++) + if (CPU_FREQ >= (clk / (i + 1))) + break; + rcc |= SYSCTL_RCC_USESYSDIV | + (evaluate_sysdiv(CPU_FREQ) << SYSCTL_RCC_SYSDIV_SHIFT); + + /* + * Step #4: wait for the PLL to lock by polling the PLLLRIS bit in the + * Raw Interrupt Status (RIS) register. + */ + for (i = 0; i < 32768; i++) + if (HWREG(SYSCTL_RIS) & SYSCTL_INT_PLL_LOCK) + break; + + /* + * Step #5: enable use of the PLL by clearing the BYPASS bit in + * RCC/RCC2. + */ + rcc &= ~SYSCTL_RCC_BYPASS; + + HWREG(SYSCTL_RCC) = rcc; + + lm3s_busyWait(16); +} diff --git a/2.5/bertos/cpu/cortex-m3/drv/clock_lm3s.h b/2.5/bertos/cpu/cortex-m3/drv/clock_lm3s.h new file mode 100644 index 00000000..0f93e8ff --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/clock_lm3s.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Low-level clocking driver for LM3S1968. + * + * \author Andrea Righi + */ + +#ifndef DRV_LM3S1968_CLOCK_H +#define DRV_LM3S1968_CLOCK_H + +/* Crystal frequency attached to the main oscillator. */ +#define XTAL_FREQ SYSCTL_RCC_XTAL_8MHZ + +extern void lm3s_busyWait(unsigned long iterations); + +void clock_init(void); + +#endif /* DRV_LM3S1968_CLOCK_H */ diff --git a/2.5/bertos/cpu/cortex-m3/drv/clock_stm32.c b/2.5/bertos/cpu/cortex-m3/drv/clock_stm32.c new file mode 100644 index 00000000..8e9e86d0 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/clock_stm32.c @@ -0,0 +1,149 @@ +/** + * \file + * + * + * \brief STM32 Clocking driver. + * + * \author Andrea Righi + */ + +#include +#include +#include +#include "clock_stm32.h" + +struct RCC *RCC; + +INLINE int rcc_get_flag_status(uint32_t flag) +{ + uint32_t id; + reg32_t reg; + + /* Get the RCC register index */ + id = flag >> 5; + /* The flag to check is in CR register */ + if (id == 1) + reg = RCC->CR; + /* The flag to check is in BDCR register */ + else if (id == 2) + reg = RCC->BDCR; + /* The flag to check is in CSR register */ + else + reg = RCC->CSR; + /* Get the flag position */ + id = flag & FLAG_MASK; + + return reg & (1 << id); +} + +INLINE uint16_t pll_clock(void) +{ + unsigned int div, mul; + + /* Hopefully this is evaluate at compile time... */ + for (div = 2; div; div--) + for (mul = 2; mul <= 16; mul++) + if (CPU_FREQ <= (PLL_VCO / div * mul)) + break; + return mul << 8 | div; +} + +INLINE void rcc_pll_config(void) +{ + reg32_t reg = RCC->CFGR & CFGR_PLL_MASK; + + /* Evaluate clock parameters */ + uint16_t clock = pll_clock(); + uint32_t pll_mul = ((clock >> 8) - 2) << 18; + uint32_t pll_div = ((clock & 0xff) << 1 | 1) << 16; + + /* Set the PLL configuration bits */ + reg |= pll_div | pll_mul; + + /* Store the new value */ + RCC->CFGR = reg; + + /* Enable PLL */ + *CR_PLLON_BB = 1; +} + +INLINE void rcc_set_clock_source(uint32_t source) +{ + reg32_t reg; + + reg = RCC->CFGR & CFGR_SW_MASK; + reg |= source; + RCC->CFGR = reg; +} + +void clock_init(void) +{ + /* Initialize global RCC structure */ + RCC = (struct RCC *)RCC_BASE; + + /* Enable the internal oscillator */ + *CR_HSION_BB = 1; + while (!rcc_get_flag_status(RCC_FLAG_HSIRDY)); + + /* Clock the system from internal HSI RC (8 MHz) */ + rcc_set_clock_source(RCC_SYSCLK_HSI); + + /* Enable external oscillator */ + RCC->CR &= CR_HSEON_RESET; + RCC->CR &= CR_HSEBYP_RESET; + RCC->CR |= CR_HSEON_SET; + while (!rcc_get_flag_status(RCC_FLAG_HSERDY)); + + /* Initialize PLL according to CPU_FREQ */ + rcc_pll_config(); + while(!rcc_get_flag_status(RCC_FLAG_PLLRDY)); + + /* Configure USB clock (48MHz) */ + *CFGR_USBPRE_BB = RCC_USBCLK_PLLCLK_1DIV5; + /* Configure ADC clock: PCLK2 (9MHz) */ + RCC->CFGR &= CFGR_ADCPRE_RESET_MASK; + RCC->CFGR |= RCC_PCLK2_DIV8; + /* Configure system clock dividers: PCLK2 (72MHz) */ + RCC->CFGR &= CFGR_PPRE2_RESET_MASK; + RCC->CFGR |= RCC_HCLK_DIV1 << 3; + /* Configure system clock dividers: PCLK1 (36MHz) */ + RCC->CFGR &= CFGR_PPRE1_RESET_MASK; + RCC->CFGR |= RCC_HCLK_DIV2; + /* Configure system clock dividers: HCLK */ + RCC->CFGR &= CFGR_HPRE_RESET_MASK; + RCC->CFGR |= RCC_SYSCLK_DIV1; + + /* Set 1 wait state for the flash memory */ + *(reg32_t *)FLASH_BASE = 0x12; + + /* Clock the system from the PLL */ + rcc_set_clock_source(RCC_SYSCLK_PLLCLK); +} diff --git a/2.5/bertos/cpu/cortex-m3/drv/clock_stm32.h b/2.5/bertos/cpu/cortex-m3/drv/clock_stm32.h new file mode 100644 index 00000000..4150a44d --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/clock_stm32.h @@ -0,0 +1,265 @@ +/** + * \file + * + * + * \brief Low-level clocking driver for Cortex-M3 STM32. + * + * \author Andrea Righi + */ + +#ifndef CLOCK_STM32_H +#define CLOCK_STM32_H + +/* RCC registers bit address */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) + +/** + * CR Register + */ +/*\{*/ +/* Alias word address of HSION bit */ +#define CR_OFFSET (RCC_OFFSET + 0x00) +#define HSION_BITNUMBER 0x00 +#define CR_HSION_BB ((reg32_t *)(PERIPH_BB_BASE + (CR_OFFSET * 32) + (HSION_BITNUMBER * 4))) + +/* Alias word address of PLLON bit */ +#define PLLON_BITNUMBER 0x18 +#define CR_PLLON_BB ((reg32_t *)(PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLLON_BITNUMBER * 4))) + +/* Alias word address of CSSON bit */ +#define CSSON_BITNUMBER 0x13 +#define CR_CSSON_BB ((reg32_t *)(PERIPH_BB_BASE + (CR_OFFSET * 32) + (CSSON_BITNUMBER * 4))) +/*\}*/ + +/** + * CFGR Register + */ +/*\{*/ +/* Alias word address of USBPRE bit */ +#define CFGR_OFFSET (RCC_OFFSET + 0x04) +#define USBPRE_BITNUMBER 0x16 +#define CFGR_USBPRE_BB ((reg32_t *)(PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (USBPRE_BITNUMBER * 4))) +/*\}*/ + +/** + * BDCR Register + */ +/*\{*/ +/* Alias word address of RTCEN bit */ +#define BDCR_OFFSET (RCC_OFFSET + 0x20) +#define RTCEN_BITNUMBER 0x0F +#define BDCR_RTCEN_BB ((reg32_t *)(PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (RTCEN_BITNUMBER * 4))) + +/* Alias word address of BDRST bit */ +#define BDRST_BITNUMBER 0x10 +#define BDCR_BDRST_BB ((reg32_t *)(PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (BDRST_BITNUMBER * 4))) +/*\}*/ + +/** + * CSR Register + */ +/*\{*/ +/* Alias word address of LSION bit */ +#define CSR_OFFSET (RCC_OFFSET + 0x24) +#define LSION_BITNUMBER 0x00 +#define CSR_LSION_BB ((reg32_t *)(PERIPH_BB_BASE + (CSR_OFFSET * 32) + (LSION_BITNUMBER * 4))) +/*\}*/ + +/** + * RCC registers bit mask + */ +/*\{*/ +/* CR register bit mask */ +#define CR_HSEBYP_RESET (0xFFFBFFFF) +#define CR_HSEBYP_SET (0x00040000) +#define CR_HSEON_RESET (0xFFFEFFFF) +#define CR_HSEON_SET (0x00010000) +#define CR_HSITRIM_MASK (0xFFFFFF07) + +/* CFGR register bit mask */ +#define CFGR_PLL_MASK (0xFFC0FFFF) +#define CFGR_PLLMull_MASK (0x003C0000) +#define CFGR_PLLSRC_MASK (0x00010000) +#define CFGR_PLLXTPRE_MASK (0x00020000) +#define CFGR_SWS_MASK (0x0000000C) +#define CFGR_SW_MASK (0xFFFFFFFC) +#define CFGR_HPRE_RESET_MASK (0xFFFFFF0F) +#define CFGR_HPRE_SET_MASK (0x000000F0) +#define CFGR_PPRE1_RESET_MASK (0xFFFFF8FF) +#define CFGR_PPRE1_SET_MASK (0x00000700) +#define CFGR_PPRE2_RESET_MASK (0xFFFFC7FF) +#define CFGR_PPRE2_SET_MASK (0x00003800) +#define CFGR_ADCPRE_RESET_MASK (0xFFFF3FFF) +#define CFGR_ADCPRE_SET_MASK (0x0000C000) + +/* CSR register bit mask */ +#define CSR_RVMF_SET (0x01000000) + +/* RCC Flag MASK */ +#define FLAG_MASK (0x1F) + +/* Typical VALUE of the HSI in Hz */ +#define HSI_VALUE (8000000) + +/* BDCR register base address */ +#define BDCR_BASE (PERIPH_BASE + BDCR_OFFSET) + +/* RCC Flag */ +#define RCC_FLAG_HSIRDY (0x20) +#define RCC_FLAG_HSERDY (0x31) +#define RCC_FLAG_PLLRDY (0x39) +#define RCC_FLAG_LSERDY (0x41) +#define RCC_FLAG_LSIRDY (0x61) +#define RCC_FLAG_PINRST (0x7A) +#define RCC_FLAG_PORRST (0x7B) +#define RCC_FLAG_SFTRST (0x7C) +#define RCC_FLAG_IWDGRST (0x7D) +#define RCC_FLAG_WWDGRST (0x7E) +#define RCC_FLAG_LPWRRST (0x7F) + +/* System clock source */ +#define RCC_SYSCLK_HSI (0x00000000) +#define RCC_SYSCLK_HSE (0x00000001) +#define RCC_SYSCLK_PLLCLK (0x00000002) + +/* PLL entry clock source */ +#define RCC_PLL_HSI_DIV2 (0x00000000) +#define RCC_PLL_HSE_DIV1 (0x00010000) +#define RCC_PLL_HSE_DIV2 (0x00030000) + +/* PLL multiplication factor */ +#define RCC_PLLMUL_2 (0x00000000) +#define RCC_PLLMUL_3 (0x00040000) +#define RCC_PLLMUL_4 (0x00080000) +#define RCC_PLLMUL_5 (0x000C0000) +#define RCC_PLLMUL_6 (0x00100000) +#define RCC_PLLMUL_7 (0x00140000) +#define RCC_PLLMUL_8 (0x00180000) +#define RCC_PLLMUL_9 (0x001C0000) +#define RCC_PLLMUL_10 (0x00200000) +#define RCC_PLLMUL_11 (0x00240000) +#define RCC_PLLMUL_12 (0x00280000) +#define RCC_PLLMUL_13 (0x002C0000) +#define RCC_PLLMUL_14 (0x00300000) +#define RCC_PLLMUL_15 (0x00340000) +#define RCC_PLLMUL_16 (0x00380000) + +/* APB1/APB2 clock source */ +#define RCC_HCLK_DIV1 (0x00000000) +#define RCC_HCLK_DIV2 (0x00000400) +#define RCC_HCLK_DIV4 (0x00000500) +#define RCC_HCLK_DIV8 (0x00000600) +#define RCC_HCLK_DIV16 (0x00000700) + +/* USB clock source */ +#define RCC_USBCLK_PLLCLK_1DIV5 (0x00) +#define RCC_USBCLK_PLLCLK_DIV1 (0x01) + +/* ADC clock source */ +#define RCC_PCLK2_DIV2 (0x00000000) +#define RCC_PCLK2_DIV4 (0x00004000) +#define RCC_PCLK2_DIV6 (0x00008000) +#define RCC_PCLK2_DIV8 (0x0000C000) + +/* AHB clock source */ +#define RCC_SYSCLK_DIV1 (0x00000000) +#define RCC_SYSCLK_DIV2 (0x00000080) +#define RCC_SYSCLK_DIV4 (0x00000090) +#define RCC_SYSCLK_DIV8 (0x000000A0) +#define RCC_SYSCLK_DIV16 (0x000000B0) +#define RCC_SYSCLK_DIV64 (0x000000C0) +#define RCC_SYSCLK_DIV128 (0x000000D0) +#define RCC_SYSCLK_DIV256 (0x000000E0) +#define RCC_SYSCLK_DIV512 (0x000000F0) +/*\}*/ + +/** + * RCC register: APB1 peripheral + */ +/*\{*/ +#define RCC_APB1_TIM2 (0x00000001) +#define RCC_APB1_TIM3 (0x00000002) +#define RCC_APB1_TIM4 (0x00000004) +#define RCC_APB1_WWDG (0x00000800) +#define RCC_APB1_SPI2 (0x00004000) +#define RCC_APB1_USART2 (0x00020000) +#define RCC_APB1_USART3 (0x00040000) +#define RCC_APB1_I2C1 (0x00200000) +#define RCC_APB1_I2C2 (0x00400000) +#define RCC_APB1_USB (0x00800000) +#define RCC_APB1_CAN (0x02000000) +#define RCC_APB1_BKP (0x08000000) +#define RCC_APB1_PWR (0x10000000) +#define RCC_APB1_ALL (0x1AE64807) +/*\}*/ + +/** + * RCC register: APB2 peripheral + */ +/*\{*/ +#define RCC_APB2_AFIO (0x00000001) +#define RCC_APB2_GPIOA (0x00000004) +#define RCC_APB2_GPIOB (0x00000008) +#define RCC_APB2_GPIOC (0x00000010) +#define RCC_APB2_GPIOD (0x00000020) +#define RCC_APB2_GPIOE (0x00000040) +#define RCC_APB2_ADC1 (0x00000200) +#define RCC_APB2_ADC2 (0x00000400) +#define RCC_APB2_TIM1 (0x00000800) +#define RCC_APB2_SPI1 (0x00001000) +#define RCC_APB2_USART1 (0x00004000) +#define RCC_APB2_ALL (0x00005E7D) +/*\}*/ + +/* Crystal frequency of the main oscillator (8MHz) */ +#define PLL_VCO 8000000 + +/* Reset and Clock Controller registers */ +struct RCC +{ + reg32_t CR; + reg32_t CFGR; + reg32_t CIR; + reg32_t APB2RSTR; + reg32_t APB1RSTR; + reg32_t AHBENR; + reg32_t APB2ENR; + reg32_t APB1ENR; + reg32_t BDCR; + reg32_t CSR; +}; + +/* RCC registers base */ +extern struct RCC *RCC; + +void clock_init(void); + +#endif /* CLOCK_STM32_h */ diff --git a/2.5/bertos/cpu/cortex-m3/drv/flash_cm3.h b/2.5/bertos/cpu/cortex-m3/drv/flash_cm3.h new file mode 100644 index 00000000..bb7020b2 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/flash_cm3.h @@ -0,0 +1,45 @@ +/** + * \file + * + * + * \brief Low-level flash module for Cortex-M3 (interface). + * + * \author Daniele Basile + */ + +#include + +#if CPU_CM3_LM3S + #include "flash_lm3s.h" +/*#elif Add other Cortex-M3 CPUs here */ +#else + #error Unknown CPU +#endif diff --git a/2.5/bertos/cpu/cortex-m3/drv/flash_lm3s.c b/2.5/bertos/cpu/cortex-m3/drv/flash_lm3s.c new file mode 100644 index 00000000..1bebb535 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/flash_lm3s.c @@ -0,0 +1,274 @@ +/** + * \file + * + * + * \brief LM3S1968 internal flash memory driver. + * + * \author Andrea Righi + */ + +#include "flash_lm3s.h" +#include "cfg/log.h" + +#include + +#include + +#include +#include +#include /* cpu_relax() */ + +#include /* memcpy() */ + + +static int flash_lm3s_erase_page(page_t addr) +{ + FLASH_FCMISC_R = FLASH_FCMISC_AMISC; + + FLASH_FMA_R = (volatile uint32_t)addr; + FLASH_FMC_R = FLASH_FMC_WRKEY | FLASH_FMC_ERASE; + + while (FLASH_FMC_R & FLASH_FMC_ERASE) + cpu_relax(); + if (FLASH_FCRIS_R & FLASH_FCRIS_ARIS) + return -1; + return 0; +} + +static int flash_lm3s_write_word(page_t addr, const uint8_t *data, size_t len) +{ + FLASH_FCMISC_R = FLASH_FCMISC_AMISC; + + uint32_t _data; + memcpy(&_data, data, len); + FLASH_FMA_R = (volatile uint32_t)addr; + FLASH_FMD_R = (volatile uint32_t)_data; + FLASH_FMC_R = FLASH_FMC_WRKEY | FLASH_FMC_WRITE; + + while (FLASH_FMC_R & FLASH_FMC_WRITE) + cpu_relax(); + if (FLASH_FCRIS_R & FLASH_FCRIS_ARIS) + return -1; + return 0; +} + +static void _flash_lm3s_flush(Flash *fd) +{ + if (!fd->page_dirty) + return; + + LOG_INFO("Erase page %p\n", fd->curr_page); + flash_lm3s_erase_page(fd->curr_page); + + LOG_INFO("Flush page %p\n", fd->curr_page); + for (int i = 0; i < FLASH_PAGE_SIZE_BYTES; i+=4) + flash_lm3s_write_word(fd->curr_page + i, &fd->page_buf[i], sizeof(uint32_t)); + fd->page_dirty = false; +} + +static void flash_lm3s_load_page(Flash *fd, page_t page) +{ + ASSERT(!((size_t)page % FLASH_PAGE_SIZE_BYTES)); + + if (page == fd->curr_page) + return; + + /* Flush old page */ + _flash_lm3s_flush(fd); + + /* Load a new page */ + memcpy(fd->page_buf, FLASH_BASE + (uint8_t *)page, FLASH_PAGE_SIZE_BYTES); + fd->curr_page = page; + LOG_INFO("Loaded page %p\n", fd->curr_page); +} + +/** + * Write program memory. + * Write \a size bytes from buffer \a _buf to file \a fd + * \note Write operations are not buffered. + */ +static size_t flash_lm3s_write(struct KFile *_fd, const void *_buf, size_t size) +{ + Flash *fd = FLASH_CAST(_fd); + const uint8_t *buf =(const uint8_t *)_buf; + size_t total_write = 0; + size_t len; + + size = MIN((kfile_off_t)size, + (kfile_off_t)(fd->fd.size - (fd->fd.seek_pos - FLASH_BASE))); + + LOG_INFO("Writing at pos[%lx]\n", fd->fd.seek_pos); + while (size) + { + page_t page = (fd->fd.seek_pos & ~(FLASH_PAGE_SIZE_BYTES - 1)); + size_t offset = fd->fd.seek_pos % FLASH_PAGE_SIZE_BYTES; + + flash_lm3s_load_page(fd, page); + + len = MIN(size, FLASH_PAGE_SIZE_BYTES - offset); + + memcpy((uint8_t *)fd->page_buf + offset, buf, len); + fd->page_dirty = true; + + buf += len; + fd->fd.seek_pos += len; + size -= len; + total_write += len; + } + LOG_INFO("written %u bytes\n", total_write); + return total_write; +} + +/** + * Close file \a fd + */ +static int flash_lm3s_close(struct KFile *_fd) +{ + Flash *fd = FLASH_CAST(_fd); + _flash_lm3s_flush(fd); + LOG_INFO("Flash file closed\n"); + return 0; +} + +/** + * Open flash file \a fd + */ +static void flash_lm3s_open(Flash *fd) +{ + fd->fd.size = FLASH_BASE + FLASH_MEM_SIZE; + fd->fd.seek_pos = FLASH_BASE; + /* + * Set an invalid page to force the load of the next actually used page + * in cache. + */ + fd->curr_page = FLASH_BASE + FLASH_MEM_SIZE; + + fd->page_dirty = false; + LOG_INFO("Flash file opened\n"); +} + +/** + * Move \a fd file seek position of \a offset bytes from \a whence. + */ +static kfile_off_t flash_lm3s_seek(struct KFile *_fd, kfile_off_t offset, KSeekMode whence) +{ + Flash *fd = FLASH_CAST(_fd); + kfile_off_t seek_pos; + + switch (whence) + { + case KSM_SEEK_SET: + seek_pos = FLASH_BASE; + break; + case KSM_SEEK_END: + seek_pos = FLASH_BASE + fd->fd.size; + break; + case KSM_SEEK_CUR: + seek_pos = fd->fd.seek_pos; + break; + default: + ASSERT(0); + return EOF; + break; + } + if (seek_pos + offset > fd->fd.size) + LOG_ERR("seek outside EOF\n"); + fd->fd.seek_pos = seek_pos + offset; + + return fd->fd.seek_pos - FLASH_BASE; +} + +/** + * Reopen file \a fd + */ +static struct KFile *flash_lm3s_reopen(struct KFile *_fd) +{ + Flash *fd = FLASH_CAST(_fd); + flash_lm3s_close(_fd); + flash_lm3s_open(fd); + + return _fd; +} + +/** + * Read from file \a fd \a size bytes and put it in buffer \a buf + * \return the number of bytes read. + */ +static size_t flash_lm3s_read(struct KFile *_fd, void *_buf, size_t size) +{ + Flash *fd = FLASH_CAST(_fd); + uint8_t *buf =(uint8_t *)_buf, *addr; + + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); + + LOG_INFO("Reading at pos[%lx]\n", fd->fd.seek_pos); + /* Check if we can get current cached page */ + if ((size_t)fd->fd.seek_pos / FLASH_PAGE_SIZE_BYTES == + (size_t)fd->curr_page) + addr = (uint8_t *)fd->curr_page + + fd->fd.seek_pos % FLASH_PAGE_SIZE_BYTES; + else + addr = (uint8_t *)fd->fd.seek_pos; + memcpy(buf, (uint8_t *)addr, size); + fd->fd.seek_pos += size; + + LOG_INFO("Read %u bytes\n", size); + return size; +} + +static int flash_lm3s_flush(struct KFile *_fd) +{ + Flash *fd = FLASH_CAST(_fd); + + _flash_lm3s_flush(fd); + return 0; +} + +/** + * Init module to perform write and read operation on internal + * flash memory. + */ +void flash_hw_init(Flash *fd) +{ + memset(fd, 0, sizeof(*fd)); + DB(fd->fd._type = KFT_FLASH); + + fd->fd.reopen = flash_lm3s_reopen; + fd->fd.close = flash_lm3s_close; + fd->fd.write = flash_lm3s_write; + fd->fd.read = flash_lm3s_read; + fd->fd.seek = flash_lm3s_seek; + fd->fd.flush = flash_lm3s_flush; + + FLASH_USECRL_R = CPU_FREQ / 1000000 - 1; + + flash_lm3s_open(fd); +} diff --git a/2.5/bertos/cpu/cortex-m3/drv/flash_lm3s.h b/2.5/bertos/cpu/cortex-m3/drv/flash_lm3s.h new file mode 100644 index 00000000..9d054716 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/flash_lm3s.h @@ -0,0 +1,60 @@ +/** + * \file + * + * + * \brief LM3S1968 internal flash memory driver. + * + * \author Andrea Righi + */ + +#ifndef FLASH_LM3S_H +#define FLASH_LM3S_H + +#include +#include + +/* Flash memory mapping */ +#define FLASH_MEM_SIZE 0x40000 //< 256KiB +#define FLASH_PAGE_SIZE_BYTES 0x400 //< 1KiB + + +#define FLASH_PAGE_SIZE FLASH_PAGE_SIZE_BYTES + +/** + * Define data type to manage page and memory address. + */ +typedef uint32_t page_t; + +struct Flash; + +void flash_hw_init(struct Flash *fd); + +#endif /* FLASH_LM3S_H */ diff --git a/2.5/bertos/cpu/cortex-m3/drv/gpio_lm3s.c b/2.5/bertos/cpu/cortex-m3/drv/gpio_lm3s.c new file mode 100644 index 00000000..7fcecbad --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/gpio_lm3s.c @@ -0,0 +1,202 @@ +/** + * \file + * + * + * \brief LM3S1968 GPIO control interface. + * + * \author Andrea Righi + */ + +#include +#include +#include +#include "gpio_lm3s.h" + +/* Set the pin(s) direction and mode */ +INLINE int lm3s_gpioPinConfigMode(uint32_t port, uint8_t pins, uint32_t mode) +{ + if (mode == GPIO_DIR_MODE_IN) + { + HWREG(port + GPIO_O_DIR) &= ~pins; + HWREG(port + GPIO_O_AFSEL) &= ~pins; + } + else if (mode == GPIO_DIR_MODE_OUT) + { + HWREG(port + GPIO_O_DIR) |= pins; + HWREG(port + GPIO_O_AFSEL) &= ~pins; + } + else if (mode == GPIO_DIR_MODE_HW) + { + HWREG(port + GPIO_O_DIR) &= ~pins; + HWREG(port + GPIO_O_AFSEL) |= pins; + } + else + { + ASSERT(0); + return -1; + } + return 0; +} + +/* Set the pin(s) output strength */ +INLINE int +lm3s_gpioPinConfigStrength(uint32_t port, uint8_t pins, uint32_t strength) +{ + if (strength == GPIO_STRENGTH_2MA) + { + HWREG(port + GPIO_O_DR2R) |= pins; + HWREG(port + GPIO_O_DR4R) &= ~pins; + HWREG(port + GPIO_O_DR8R) &= ~pins; + HWREG(port + GPIO_O_SLR) &= ~pins; + } + else if (strength == GPIO_STRENGTH_4MA) + { + HWREG(port + GPIO_O_DR2R) &= ~pins; + HWREG(port + GPIO_O_DR4R) |= pins; + HWREG(port + GPIO_O_DR8R) &= ~pins; + HWREG(port + GPIO_O_SLR) &= ~pins; + } + else if (strength == GPIO_STRENGTH_8MA) + { + HWREG(port + GPIO_O_DR2R) &= ~pins; + HWREG(port + GPIO_O_DR4R) &= ~pins; + HWREG(port + GPIO_O_DR8R) |= pins; + HWREG(port + GPIO_O_SLR) &= ~pins; + } + else if (strength == GPIO_STRENGTH_8MA_SC) + { + HWREG(port + GPIO_O_DR2R) &= ~pins; + HWREG(port + GPIO_O_DR4R) &= ~pins; + HWREG(port + GPIO_O_DR8R) |= pins; + HWREG(port + GPIO_O_SLR) |= pins; + } + else + { + ASSERT(0); + return -1; + } + return 0; +} + +/* Set the pin(s) type */ +INLINE int lm3s_gpioPinConfigType(uint32_t port, uint8_t pins, uint32_t type) +{ + if (type == GPIO_PIN_TYPE_STD) + { + HWREG(port + GPIO_O_ODR) &= ~pins; + HWREG(port + GPIO_O_PUR) &= ~pins; + HWREG(port + GPIO_O_PDR) &= ~pins; + HWREG(port + GPIO_O_DEN) |= pins; + HWREG(port + GPIO_O_AMSEL) &= ~pins; + } + else if (type == GPIO_PIN_TYPE_STD_WPU) + { + HWREG(port + GPIO_O_ODR) &= ~pins; + HWREG(port + GPIO_O_PUR) |= pins; + HWREG(port + GPIO_O_PDR) &= ~pins; + HWREG(port + GPIO_O_DEN) |= pins; + HWREG(port + GPIO_O_AMSEL) &= ~pins; + } + else if (type == GPIO_PIN_TYPE_STD_WPD) + { + HWREG(port + GPIO_O_ODR) &= ~pins; + HWREG(port + GPIO_O_PUR) &= ~pins; + HWREG(port + GPIO_O_PDR) |= pins; + HWREG(port + GPIO_O_DEN) |= pins; + HWREG(port + GPIO_O_AMSEL) &= ~pins; + } + else if (type == GPIO_PIN_TYPE_OD) + { + HWREG(port + GPIO_O_ODR) |= pins; + HWREG(port + GPIO_O_PUR) &= ~pins; + HWREG(port + GPIO_O_PDR) &= ~pins; + HWREG(port + GPIO_O_DEN) |= pins; + HWREG(port + GPIO_O_AMSEL) &= ~pins; + } + else if (type == GPIO_PIN_TYPE_OD_WPU) + { + HWREG(port + GPIO_O_ODR) |= pins; + HWREG(port + GPIO_O_PUR) |= pins; + HWREG(port + GPIO_O_PDR) &= ~pins; + HWREG(port + GPIO_O_DEN) |= pins; + HWREG(port + GPIO_O_AMSEL) &= ~pins; + } + else if (type == GPIO_PIN_TYPE_OD_WPD) + { + HWREG(port + GPIO_O_ODR) |= pins; + HWREG(port + GPIO_O_PUR) &= pins; + HWREG(port + GPIO_O_PDR) |= pins; + HWREG(port + GPIO_O_DEN) |= pins; + HWREG(port + GPIO_O_AMSEL) &= ~pins; + } + else if (type == GPIO_PIN_TYPE_ANALOG) + { + HWREG(port + GPIO_O_ODR) &= ~pins; + HWREG(port + GPIO_O_PUR) &= ~pins; + HWREG(port + GPIO_O_PDR) &= ~pins; + HWREG(port + GPIO_O_DEN) &= ~pins; + HWREG(port + GPIO_O_AMSEL) |= pins; + } + else + { + ASSERT(0); + return -1; + } + return 0; +} + +/** + * Configure a GPIO pin + * + * \param port Base address of the GPIO port + * \param pins Bit-packed representation of the pin(s) + * \param mode Pin(s) configuration mode + * \param strength Output drive strength + * \param type Pin(s) type + * + * Return 0 on success, otherwise a negative value. + */ +int lm3s_gpioPinConfig(uint32_t port, uint8_t pins, + uint32_t mode, uint32_t strength, uint32_t type) +{ + int ret; + + ret = lm3s_gpioPinConfigMode(port, pins, mode); + if (UNLIKELY(ret < 0)) + return ret; + ret = lm3s_gpioPinConfigStrength(port, pins, strength); + if (UNLIKELY(ret < 0)) + return ret; + ret = lm3s_gpioPinConfigType(port, pins, type); + if (UNLIKELY(ret < 0)) + return ret; + return 0; +} diff --git a/2.5/bertos/cpu/cortex-m3/drv/gpio_lm3s.h b/2.5/bertos/cpu/cortex-m3/drv/gpio_lm3s.h new file mode 100644 index 00000000..d80c033f --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/gpio_lm3s.h @@ -0,0 +1,97 @@ +/** + * \file + * + * + * \brief LM3S1968 GPIO control interface. + */ + +#ifndef GPIO_LM3S_H +#define GPIO_LM3S_H + +#include + +/** + * GPIO mode + */ +/*\{*/ +enum +{ + GPIO_DIR_MODE_IN = 0, //< Pin is a GPIO input + GPIO_DIR_MODE_OUT, //< Pin is a GPIO output + GPIO_DIR_MODE_HW, //< Pin is a peripheral function +}; +/*\}*/ + +/** + * GPIO strenght + */ +/*\{*/ +enum +{ + GPIO_STRENGTH_2MA = 0, //< 2mA drive strength + GPIO_STRENGTH_4MA, //< 4mA drive strength + GPIO_STRENGTH_8MA, //< 8mA drive strength + GPIO_STRENGTH_8MA_SC, //< 8mA drive with slew rate control +}; +/*\}*/ + +/** + * GPIO type + */ +/*\{*/ +enum +{ + GPIO_PIN_TYPE_ANALOG = 0, //< Analog comparator + GPIO_PIN_TYPE_STD, //< Push-pull + GPIO_PIN_TYPE_STD_WPU, //< Push-pull with weak pull-up + GPIO_PIN_TYPE_STD_WPD, //< Push-pull with weak pull-down + GPIO_PIN_TYPE_OD, //< Open-drain + GPIO_PIN_TYPE_OD_WPU, //< Open-drain with weak pull-up + GPIO_PIN_TYPE_OD_WPD, //< Open-drain with weak pull-down +}; +/*\}*/ + +/* Write a value to the specified pin(s) */ +INLINE void lm3s_gpioPinWrite(uint32_t port, uint8_t pins, uint8_t val) +{ + HWREG(port + GPIO_O_DATA + (pins << 2)) = val; +} + +/* Read a value from the specified pin(s) */ +INLINE uint32_t lm3s_gpioPinRead(uint32_t port, uint8_t pins) +{ + return HWREG(port + GPIO_O_DATA + (pins << 2)); +} + +int lm3s_gpioPinConfig(uint32_t port, uint8_t pins, + uint32_t mode, uint32_t strength, uint32_t type); + +#endif /* GPIO_LM3S_H */ diff --git a/2.5/bertos/cpu/cortex-m3/drv/gpio_stm32.c b/2.5/bertos/cpu/cortex-m3/drv/gpio_stm32.c new file mode 100644 index 00000000..f15145a4 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/gpio_stm32.c @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief STM32 GPIO control interface. + * + * \author Andrea Righi + */ + +#include +#include +#include +#include "gpio_stm32.h" + +/** + * Configure a GPIO pin + * + * \param base Base address of the GPIO port + * \param pins Bit-packed representation of the pin(s) + * \param mode Pin(s) configuration mode + * \param speed Output drive speed + * + * Return 0 on success, otherwise a negative value. + */ +int stm32_gpioPinConfig(struct stm32_gpio *base, + uint16_t pins, uint8_t mode, uint8_t speed) +{ + uint32_t reg_mode = mode & 0x0f; + int i; + + if (mode & 0x10) + reg_mode |= speed; + + if (pins & 0xff) + { + uint32_t reg = base->CRL; + + for (i = 0; i < 8; i++) + { + uint32_t pos = 1 << i; + + if (pins & pos) + { + pos = i << 2; + reg &= ~(0x0f << pos); + reg |= reg_mode << pos; + + if (mode == GPIO_MODE_IPD) + base->BRR = 0x01 << i; + if (mode == GPIO_MODE_IPU) + base->BSRR = 0x01 << i; + } + } + base->CRL = reg; + } + if (pins > 0xff) + { + uint32_t reg = base->CRH; + + for (i = 0; i < 8; i++) + { + uint32_t pos = 1 << (i + 8); + + if (pins & pos) + { + pos = i << 2; + reg &= ~(0x0f << pos); + reg |= reg_mode << pos; + + if (mode == GPIO_MODE_IPD) + base->BRR = 0x01 << (i + 8); + if (mode == GPIO_MODE_IPU) + base->BSRR = 0x01 << (i + 8); + } + } + base->CRH = reg; + } + return 0; +} diff --git a/2.5/bertos/cpu/cortex-m3/drv/gpio_stm32.h b/2.5/bertos/cpu/cortex-m3/drv/gpio_stm32.h new file mode 100644 index 00000000..4d09db47 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/gpio_stm32.h @@ -0,0 +1,102 @@ +/** + * \file + * + * + * \brief STM32 GPIO control interface. + */ + +#ifndef GPIO_STM32_H +#define GPIO_STM32_H + +#include + +/* GPIO configuration registers structure */ +struct stm32_gpio +{ + reg32_t CRL; + reg32_t CRH; + reg32_t IDR; + reg32_t ODR; + reg32_t BSRR; + reg32_t BRR; + reg32_t LCKR; +}; + +/** + * GPIO mode + */ +/*\{*/ +enum +{ + GPIO_MODE_AIN = 0x0, + GPIO_MODE_IN_FLOATING = 0x04, + GPIO_MODE_IPD = 0x28, + GPIO_MODE_IPU = 0x48, + GPIO_MODE_OUT_OD = 0x14, + GPIO_MODE_OUT_PP = 0x10, + GPIO_MODE_AF_OD = 0x1C, + GPIO_MODE_AF_PP = 0x18, +}; +/*\}*/ + +/** + * GPIO speed + */ +/*\{*/ +enum +{ + GPIO_SPEED_10MHZ = 1, + GPIO_SPEED_2MHZ, + GPIO_SPEED_50MHZ, +}; +/*\}*/ + +/* Write a value to the specified pin(s) */ +INLINE void +stm32_gpioPinWrite(struct stm32_gpio *base, uint32_t pins, uint8_t val) +{ + if (val) + base->BSRR |= pins; + else + base->BRR |= pins; +} + +/* Read a value from the specified pin(s) */ +INLINE uint8_t stm32_gpioPinRead(struct stm32_gpio *base, uint32_t pins) +{ + return !!(base->IDR & pins); +} + +/* Initialize a GPIO peripheral configuration */ +int stm32_gpioPinConfig(struct stm32_gpio *base, + uint16_t pins, uint8_t mode, uint8_t speed); + +#endif /* GPIO_STM32_H */ diff --git a/2.5/bertos/cpu/cortex-m3/drv/irq_cm3.c b/2.5/bertos/cpu/cortex-m3/drv/irq_cm3.c new file mode 100644 index 00000000..d71876fe --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/irq_cm3.c @@ -0,0 +1,127 @@ +/** + * \file + * + * + * \brief Cortex-M3 IRQ management. + * + * \author Andrea Righi + */ + +#include /* ASSERT() */ +#include /* LOG_ERR() */ +#include +#include "irq_cm3.h" + +static void (*irq_table[NUM_INTERRUPTS])(void) + __attribute__((section("vtable"))); + +/* Priority register / IRQ number table */ +static const uint32_t nvic_prio_reg[] = +{ + /* System exception registers */ + 0, NVIC_SYS_PRI1, NVIC_SYS_PRI2, NVIC_SYS_PRI3, + + /* External interrupts registers */ + NVIC_PRI0, NVIC_PRI1, NVIC_PRI2, NVIC_PRI3, + NVIC_PRI4, NVIC_PRI5, NVIC_PRI6, NVIC_PRI7, + NVIC_PRI8, NVIC_PRI9, NVIC_PRI10, NVIC_PRI11, + NVIC_PRI12, NVIC_PRI13 +}; + +/* Unhandled IRQ */ +static NAKED NORETURN void unhandled_isr(void) +{ + register uint32_t reg; + + asm volatile ("mrs %0, ipsr" : "=r"(reg)); + LOG_ERR("unhandled IRQ %lu\n", reg); + while (1) + PAUSE; +} + +void sysirq_setPriority(sysirq_t irq, int prio) +{ + uint32_t pos = (irq & 3) * 8; + reg32_t reg = nvic_prio_reg[irq >> 2]; + uint32_t val; + + val = HWREG(reg); + val &= ~(0xff << pos); + val |= prio << pos; + HWREG(reg) = val; +} + +static void sysirq_enable(sysirq_t irq) +{ + /* Enable the IRQ line (only for generic IRQs) */ + if (irq >= 16 && irq < 48) + NVIC_EN0_R = 1 << (irq - 16); + else if (irq >= 48) + NVIC_EN1_R = 1 << (irq - 48); +} + +void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler) +{ + cpu_flags_t flags; + + ASSERT(irq < NUM_INTERRUPTS); + + IRQ_SAVE_DISABLE(flags); + irq_table[irq] = handler; + sysirq_setPriority(irq, IRQ_PRIO); + sysirq_enable(irq); + IRQ_RESTORE(flags); +} + +void sysirq_freeHandler(sysirq_t irq) +{ + cpu_flags_t flags; + + ASSERT(irq < NUM_INTERRUPTS); + + IRQ_SAVE_DISABLE(flags); + irq_table[irq] = unhandled_isr; + IRQ_RESTORE(flags); +} + +void sysirq_init(void) +{ + cpu_flags_t flags; + int i; + + IRQ_SAVE_DISABLE(flags); + for (i = 0; i < NUM_INTERRUPTS; i++) + irq_table[i] = unhandled_isr; + + /* Update NVIC to point to the new vector table */ + NVIC_VTABLE_R = (size_t)irq_table; + IRQ_RESTORE(flags); +} diff --git a/2.5/bertos/cpu/cortex-m3/drv/irq_cm3.h b/2.5/bertos/cpu/cortex-m3/drv/irq_cm3.h new file mode 100644 index 00000000..9a641e4b --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/irq_cm3.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief IRQ management for the Cortex-M3 processor. + * + * \author Andrea Righi + */ + +#ifndef DRV_CORTEX_M3_SYSIRQ_H +#define DRV_CORTEX_M3_SYSIRQ_H + +#if CPU_CM3_LM3S + #include +#elif CPU_CM3_STM32 + #include +/*#elif Add other families here */ +#else + #error Unknown CPU +#endif + +typedef void (*sysirq_handler_t)(void); +typedef unsigned int sysirq_t; + +void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler); +void sysirq_setPriority(sysirq_t irq, int prio); +void sysirq_freeHandler(sysirq_t irq); + +void sysirq_init(void); + +#endif /* DRV_CORTEX_M3_SYSIRQ_H */ diff --git a/2.5/bertos/cpu/cortex-m3/drv/kdebug_cm3.c b/2.5/bertos/cpu/cortex-m3/drv/kdebug_cm3.c new file mode 100644 index 00000000..c236ca6b --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/kdebug_cm3.c @@ -0,0 +1,47 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief Low-level kdebug module for Cortex-M3 (inplementation). + */ + +#include + +#if CPU_CM3_LM3S + #include "kdebug_lm3s.c" +#elif CPU_CM3_STM32 + #include "kdebug_stm32.c" +/*#elif Add other families here */ +#else + #error Unknown CPU +#endif diff --git a/2.5/bertos/cpu/cortex-m3/drv/kdebug_lm3s.c b/2.5/bertos/cpu/cortex-m3/drv/kdebug_lm3s.c new file mode 100644 index 00000000..30258846 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/kdebug_lm3s.c @@ -0,0 +1,118 @@ +/** + * \file + * + * + * \brief LM3S debug support (implementation). + * + * \author Andrea Righi + */ + +#include +#include /* for BV() */ +#include /* lm3s_busyWait() */ +#include +#include +#include "kdebug_lm3s.h" + +#if CONFIG_KDEBUG_PORT == 0 + #define UART_BASE UART0_BASE + #define UART_GPIO_BASE GPIO_PORTA_BASE + #define UART_PINS (BV(1) | BV(0)) + #define UART_REG_SYSCTL SYSCTL_RCGC2_GPIOA +#elif CONFIG_KDEBUG_PORT == 1 + #define UART_BASE UART1_BASE + #define UART_GPIO_BASE GPIO_PORTD_BASE + #define UART_PINS (BV(3) | BV(2)) + #define UART_REG_SYSCTL SYSCTL_RCGC2_GPIOD +#elif CONFIG_KDEBUG_PORT == 2 + #define UART_BASE UART2_BASE + #define UART_GPIO_BASE GPIO_PORTG_BASE + #define UART_PINS (BV(1) | BV(0)) + #define UART_REG_SYSCTL SYSCTL_RCGC2_GPIOG +#else + #error "UART port not supported in this board" +#endif + +#define KDBG_WAIT_READY() while (!lm3s_uartReady(UART_BASE)) {} +#define KDBG_WAIT_TXDONE() while (!lm3s_uartTxDone(UART_BASE)) {} + +#define KDBG_WRITE_CHAR(c) do { lm3s_uartPutCharNonBlocking(UART_BASE, c); } while(0) + +/* Debug unit is used only for debug purposes so does not generate interrupts. */ +#define KDBG_MASK_IRQ(old) do { (void)old; } while(0) + +/* Debug unit is used only for debug purposes so does not generate interrupts. */ +#define KDBG_RESTORE_IRQ(old) do { (void)old; } while(0) + +typedef uint32_t kdbg_irqsave_t; + +INLINE void uart_hw_config(void) +{ + unsigned long div, baud = CONFIG_KDEBUG_BAUDRATE; + bool hi_speed = false; + + if (baud * 16 > CPU_FREQ) + { + hi_speed = true; + baud /= 2; + } + div = (CPU_FREQ * 8 / baud + 1) / 2; + + lm3s_uartDisable(UART_BASE); + if (hi_speed) + HWREG(UART_BASE + UART_O_CTL) |= UART_CTL_HSE; + else + HWREG(UART_BASE + UART_O_CTL) &= ~UART_CTL_HSE; + /* Set the baud rate */ + HWREG(UART_BASE + UART_O_IBRD) = div / 64; + HWREG(UART_BASE + UART_O_FBRD) = div % 64; + /* Set word lenght and parity */ + HWREG(UART_BASE + UART_O_LCRH) = UART_LCRH_WLEN_8; + lm3s_uartClear(UART_BASE); + lm3s_uartEnable(UART_BASE); +} + +INLINE void kdbg_hw_init(void) +{ + uint32_t reg_clock = 1 << CONFIG_KDEBUG_PORT; + + /* Enable the peripheral clock */ + SYSCTL_RCGC1_R |= reg_clock; + SYSCTL_RCGC2_R |= UART_REG_SYSCTL; + lm3s_busyWait(512); + + /* Configure GPIO pins to work as UART pins */ + lm3s_gpioPinConfig(UART_GPIO_BASE, UART_PINS, + GPIO_DIR_MODE_HW, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); + + /* Low-level UART configuration */ + uart_hw_config(); +} diff --git a/2.5/bertos/cpu/cortex-m3/drv/kdebug_lm3s.h b/2.5/bertos/cpu/cortex-m3/drv/kdebug_lm3s.h new file mode 100644 index 00000000..faabef4e --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/kdebug_lm3s.h @@ -0,0 +1,44 @@ +/** + * \file + * + * + * \brief LM3S debug support (interface). + * + * \author Andrea Righi + */ + +#ifndef DRV_KDEBUG_LM3S_H +#define DRV_KDEBUG_LM3S_H + +#define KDEBUG_PORT_DEFAULT 0 ///< Default debug port. +/* \} */ + +#endif /* DRV_KDEBUG_LM3S_H */ diff --git a/2.5/bertos/cpu/cortex-m3/drv/kdebug_stm32.c b/2.5/bertos/cpu/cortex-m3/drv/kdebug_stm32.c new file mode 100644 index 00000000..f50f3d89 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/kdebug_stm32.c @@ -0,0 +1,190 @@ +/** + * \file + * + * + * \brief STM32 debug support (implementation). + * + * \author Andrea Righi + */ + +#include /* for BV() */ +#include +#include +#include /* RCC */ +#include +#include "kdebug_stm32.h" + +#define CR1_RUN_SET ((uint16_t)0x2000) /* USART Enable MASK */ +#define CR1_RUN_RESET ((uint16_t)0xDFFF) /* USART Disable MASK */ +#define CR1_RWU_SET ((uint16_t)0x0002) /* USART mute mode Enable MASK */ +#define CR1_RWU_RESET ((uint16_t)0xFFFD) /* USART mute mode Enable MASK */ +#define CR1_SBK_SET ((uint16_t)0x0001) /* USART Break Character send MASK */ +#define CR1_CLEAR_MASK ((uint16_t)0xE9F3) /* USART CR1 MASK */ + +#define CR2_MASK ((uint16_t)0xFFF0) /* USART address MASK */ +#define CR2_LINE_SET ((uint16_t)0x4000) /* USART LIN Enable MASK */ +#define CR2_LINE_RESET ((uint16_t)0xBFFF) /* USART LIN Disable MASK */ +#define CR2_CLEAR_MASK ((uint16_t)0xC0FF) /* USART CR2 MASK */ + +#define CR3_SCEN_SET ((uint16_t)0x0020) /* USART SC Enable MASK */ +#define CR3_SCEN_RESET ((uint16_t)0xFFDF) /* USART SC Disable MASK */ +#define CR3_NACK_SET ((uint16_t)0x0010) /* USART SC NACK Enable MASK */ +#define CR3_NACK_RESET ((uint16_t)0xFFEF) /* USART SC NACK Disable MASK */ +#define CR3_HDSEL_SET ((uint16_t)0x0008) /* USART Half-Duplex Enable MASK */ +#define CR3_HDSEL_RESET ((uint16_t)0xFFF7) /* USART Half-Duplex Disable MASK */ +#define CR3_IRLP_MASK ((uint16_t)0xFFFB) /* USART IrDA LowPower mode MASK */ +#define CR3_LBDL_MASK ((uint16_t)0xFFDF) /* USART LIN Break detection MASK */ +#define CR3_WAKE_MASK ((uint16_t)0xF7FF) /* USART WakeUp Method MASK */ +#define CR3_IREN_SET ((uint16_t)0x0002) /* USART IrDA Enable MASK */ +#define CR3_IREN_RESET ((uint16_t)0xFFFD) /* USART IrDA Disable MASK */ +#define CR3_CLEAR_MASK ((uint16_t)0xFCFF) /* USART CR3 MASK */ + +#define GTPR_LSB_MASK ((uint16_t)0x00FF) /* Guard Time Register LSB MASK */ +#define GTPR_MSB_MASK ((uint16_t)0xFF00) /* Guard Time Register MSB MASK */ + +#define USART_IT_MASK ((uint16_t)0x001F) /* USART Interrupt MASK */ + +/* USART flags */ +#define USART_FLAG_CTS ((uint16_t)0x0200) +#define USART_FLAG_LBD ((uint16_t)0x0100) +#define USART_FLAG_TXE ((uint16_t)0x0080) +#define USART_FLAG_TC ((uint16_t)0x0040) +#define USART_FLAG_RXNE ((uint16_t)0x0020) +#define USART_FLAG_IDLE ((uint16_t)0x0010) +#define USART_FLAG_ORE ((uint16_t)0x0008) +#define USART_FLAG_NE ((uint16_t)0x0004) +#define USART_FLAG_FE ((uint16_t)0x0002) +#define USART_FLAG_PE ((uint16_t)0x0001) + +/* USART registers */ +struct stm32_usart +{ + reg16_t SR; + uint16_t _RESERVED0; + reg16_t DR; + uint16_t _RESERVED1; + reg16_t BRR; + uint16_t _RESERVED2; + reg16_t CR1; + uint16_t _RESERVED3; + reg16_t CR2; + uint16_t _RESERVED4; + reg16_t CR3; + uint16_t _RESERVED5; + reg16_t GTPR; + uint16_t _RESERVED6; +}; + +/* USART mode */ +#define USART_MODE_RX ((uint16_t)0x0004) +#define USART_MODE_TX ((uint16_t)0x0008) + +/* USART last bit */ +#define USART_LASTBIT_DISABLE ((uint16_t)0x0000) +#define USART_LASTBIT_ENABLE ((uint16_t)0x0100) + +#if CONFIG_KDEBUG_PORT == 0 + #define UART_BASE ((struct stm32_usart *)USART1_BASE) +#elif CONFIG_KDEBUG_PORT == 1 + #define UART_BASE ((struct stm32_usart *)USART2_BASE) +#elif CONFIG_KDEBUG_PORT == 2 + #define UART_BASE ((struct stm32_usart *)USART3_BASE) +#else + #error "UART port not supported in this board" +#endif + +#define KDBG_WAIT_READY() while (!(UART_BASE->SR & USART_FLAG_TXE)) +#define KDBG_WAIT_TXDONE() while (!(UART_BASE->SR & USART_FLAG_TC)) + +#define KDBG_WRITE_CHAR(c) do { UART_BASE->DR = (c) & 0x1ff; } while(0) + +/* Debug unit is used only for debug purposes so does not generate interrupts. */ +#define KDBG_MASK_IRQ(old) do { (void)old; } while(0) + +/* Debug unit is used only for debug purposes so does not generate interrupts. */ +#define KDBG_RESTORE_IRQ(old) do { (void)old; } while(0) + +typedef uint32_t kdbg_irqsave_t; + +#define GPIO_USART1_TX_PIN (1 << 9) +#define GPIO_USART1_RX_PIN (1 << 10) + +#define GPIO_USART2_TX_PIN (1 << 2) +#define GPIO_USART2_RX_PIN (1 << 3) + +#define GPIO_USART3_TX_PIN (1 << 13) +#define GPIO_USART3_RX_PIN (1 << 14) + +INLINE uint16_t evaluate_brr(void) +{ + uint32_t freq, reg, div, frac; + + /* NOTE: PCLK1 has been configured as CPU_FREQ / 2 */ + freq = (CONFIG_KDEBUG_PORT == 0) ? CPU_FREQ : CPU_FREQ / 2; + div = (0x19 * freq) / (0x04 * CONFIG_KDEBUG_BAUDRATE); + reg = (div / 0x64) << 0x04; + frac = div - (0x64 * (reg >> 0x04)); + reg |= ((frac * 0x10 + 0x32) / 0x64) & 0x0f; + + return (uint16_t)reg; +} + +/* Initialize UART debug port */ +INLINE void kdbg_hw_init(void) +{ + /* Enable clocking on AFIO */ + RCC->APB2ENR |= RCC_APB2_AFIO; + /* Configure USART pins */ +#if CONFIG_KDEBUG_PORT == 0 + RCC->APB2ENR |= RCC_APB2_GPIOA; + RCC->APB2ENR |= RCC_APB2_USART1; + stm32_gpioPinConfig((struct stm32_gpio *)GPIOA_BASE, GPIO_USART1_TX_PIN, + GPIO_MODE_AF_PP, GPIO_SPEED_50MHZ); +#elif CONFIG_KDEBUG_PORT == 1 + RCC->APB2ENR |= RCC_APB2_GPIOA; + RCC->APB1ENR |= RCC_APB1_USART2; + stm32_gpioPinConfig((struct stm32_gpio *)GPIOA_BASE, GPIO_USART2_TX_PIN, + GPIO_MODE_AF_PP, GPIO_SPEED_50MHZ); +#elif CONFIG_KDEBUG_PORT == 2 + RCC->APB2ENR |= RCC_APB2_GPIOB; + RCC->APB2ENR |= RCC_APB1_USART3; + stm32_gpioPinConfig((struct stm32_gpio *)GPIOB_BASE, GPIO_USART3_TX_PIN, + GPIO_MODE_AF_PP, GPIO_SPEED_50MHZ); +#else + #error "UART port not supported in this board" +#endif + /* Enable the USART by writing the UE bit */ + UART_BASE->CR1 |= CR1_RUN_SET; + /* Configure the desired baud rate */ + UART_BASE->BRR = evaluate_brr(); + /* Set the Transmitter Enable bit in CR1 */ + UART_BASE->CR1 |= USART_MODE_TX; +} diff --git a/2.5/bertos/cpu/cortex-m3/drv/kdebug_stm32.h b/2.5/bertos/cpu/cortex-m3/drv/kdebug_stm32.h new file mode 100644 index 00000000..acb71a56 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/kdebug_stm32.h @@ -0,0 +1,44 @@ +/** + * \file + * + * + * \brief STM32 debug support (interface). + * + * \author Andrea Righi + */ + +#ifndef DRV_KDEBUG_STM32_H +#define DRV_KDEBUG_STM32_H + +#define KDEBUG_PORT_DEFAULT 1 ///< Default debug port. +/* \} */ + +#endif /* DRV_KDEBUG_STM32_H */ diff --git a/2.5/bertos/cpu/cortex-m3/drv/ser_cm3.h b/2.5/bertos/cpu/cortex-m3/drv/ser_cm3.h new file mode 100644 index 00000000..7268711f --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/ser_cm3.h @@ -0,0 +1,45 @@ +/** + * \file + * + * + * \brief Low-level serial module for Cortex-M3 (interface). + * + * \author Andrea Righi + */ + +#include + +#if CPU_CM3_LM3S + #include "ser_lm3s.h" +/*#elif Add other Cortex-M3 CPUs here */ +#else + #error Unknown CPU +#endif diff --git a/2.5/bertos/cpu/cortex-m3/drv/ser_lm3s.c b/2.5/bertos/cpu/cortex-m3/drv/ser_lm3s.c new file mode 100644 index 00000000..8de8ce66 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/ser_lm3s.c @@ -0,0 +1,369 @@ +/** + * \file + * + * + * \brief LM3S1968 UART interface driver. + * + * \author Andrea Righi + */ + +#include /* for BV() */ +#include +#include +#include +#include +#include "cfg/cfg_ser.h" +#include "ser_lm3s.h" + +/* From the high-level serial driver */ +extern struct Serial *ser_handles[SER_CNT]; + +struct CM3Serial +{ + struct SerialHardware hw; + bool sending; + uint32_t base; + sysirq_t irq; +}; + +/* Forward declaration */ +static struct CM3Serial UARTDesc[SER_CNT]; + +/* GPIO descriptor for UART pins */ +struct gpio_uart_info +{ + /* Sysctl */ + uint32_t sysctl; + /* GPIO base address register */ + uint32_t base; + /* Pin(s) bitmask */ + uint8_t pins; +}; + +/* Table to retrieve GPIO pins configuration to work as UART pins */ +static const struct gpio_uart_info gpio_uart[SER_CNT] = +{ + /* UART0 */ + { + .base = GPIO_PORTA_BASE, + .pins = BV(1) | BV(0), + .sysctl = SYSCTL_RCGC2_GPIOA, + }, + /* UART1 */ + { + .base = GPIO_PORTD_BASE, + .pins = BV(3) | BV(2), + .sysctl = SYSCTL_RCGC2_GPIOD, + }, + /* UART2 */ + { + .base = GPIO_PORTG_BASE, + .pins = BV(1) | BV(0), + .sysctl = SYSCTL_RCGC2_GPIOG, + }, +}; + +void lm3s_uartSetBaudRate(uint32_t base, unsigned long baud) +{ + unsigned long div; + bool hi_speed; + + if (baud * 16 > CPU_FREQ) + { + hi_speed = true; + baud /= 2; + } + div = (CPU_FREQ * 8 / baud + 1) / 2; + + lm3s_uartDisable(base); + if (hi_speed) + HWREG(base + UART_O_CTL) |= UART_CTL_HSE; + else + HWREG(base + UART_O_CTL) &= ~UART_CTL_HSE; + /* Set the baud rate */ + HWREG(base + UART_O_IBRD) = div / 64; + HWREG(base + UART_O_FBRD) = div % 64; + lm3s_uartClear(base); + lm3s_uartEnable(base); +} + +void lm3s_uartSetParity(uint32_t base, int parity) +{ + /* Set 8-bit word, one stop bit by default */ + uint32_t config = UART_LCRH_WLEN_8; + + switch(parity) + { + case SER_PARITY_NONE: + break; + case SER_PARITY_ODD: + config |= UART_LCRH_PEN; + break; + case SER_PARITY_EVEN: + config |= UART_LCRH_EPS | UART_LCRH_PEN; + break; + default: + ASSERT(0); + return; + } + lm3s_uartDisable(base); + HWREG(base + UART_O_LCRH) = config; + lm3s_uartClear(base); + lm3s_uartEnable(base); +} + +void lm3s_uartInit(int port) +{ + uint32_t reg_clock, base; + + ASSERT(port >= 0 && port < SER_CNT); + + base = UARTDesc[port].base; + reg_clock = 1 << port; + + /* Enable the peripheral clock */ + SYSCTL_RCGC1_R |= reg_clock; + SYSCTL_RCGC2_R |= gpio_uart[port].sysctl; + lm3s_busyWait(512); + + /* Configure GPIO pins to work as UART pins */ + lm3s_gpioPinConfig(gpio_uart[port].base, gpio_uart[port].pins, + GPIO_DIR_MODE_HW, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); + + /* Set serial param: 115.200 bps, no parity */ + lm3s_uartSetBaudRate(base, 115200); + lm3s_uartSetParity(base, SER_PARITY_NONE); +} + +static bool tx_sending(struct SerialHardware *_hw) +{ + struct CM3Serial *hw = (struct CM3Serial *)_hw; + return hw->sending; +} + +static void uart_irq_rx(int port) +{ + struct FIFOBuffer *rxfifo = &ser_handles[port]->rxfifo; + uint32_t base = UARTDesc[port].base; + char c; + + while (lm3s_uartRxReady(base)) + { + c = HWREG(base + UART_O_DR); + if (fifo_isfull(rxfifo)) + ser_handles[port]->status |= SERRF_RXFIFOOVERRUN; + else + fifo_push(rxfifo, c); + } +} + +static void uart_irq_tx(int port) +{ + struct FIFOBuffer *txfifo = &ser_handles[port]->txfifo; + uint32_t base = UARTDesc[port].base; + + while (lm3s_uartTxReady(base)) + { + if (fifo_isempty(txfifo)) { + /* + * Disable TX empty interrupts if there're no more + * characters to transmit. + */ + HWREG(base + UART_O_IM) &= ~UART_IM_TXIM; + UARTDesc[port].sending = false; + break; + } + HWREG(base + UART_O_DR) = fifo_pop(txfifo); + } +} + +static void uart_common_irq_handler(int port) +{ + uint32_t base = UARTDesc[port].base; + uint32_t status; + + /* Read and clear the IRQ status */ + status = HWREG(base + UART_O_RIS); + + /* Process the IRQ */ + if (status & (UART_RIS_RXRIS | UART_RIS_RTRIS)) + uart_irq_rx(port); + if (status & UART_RIS_TXRIS) + uart_irq_tx(port); +} + +static void +lm3s_uartIRQEnable(int port, sysirq_handler_t handler) +{ + uint32_t base = UARTDesc[port].base; + sysirq_t irq = UARTDesc[port].irq; + + /* Register the IRQ handler */ + sysirq_setHandler(irq, handler); + /* Enable RX interrupt in the UART interrupt mask register */ + HWREG(base + UART_O_IM) |= UART_IM_RXIM | UART_IM_RTIM; +} + +static void lm3s_uartIRQDisable(int port) +{ + uint32_t base = UARTDesc[port].base; + + HWREG(base + UART_O_IM) &= + ~(UART_IM_TXIM | UART_IM_RXIM | UART_IM_RTIM); +} + +/* UART class definition */ +#define UART_PORT(port) \ + /* UART TX and RX buffers */ \ + static unsigned char \ + uart ## port ## _txbuffer[CONFIG_UART ## port ## _TXBUFSIZE]; \ + static unsigned char \ + uart ## port ## _rxbuffer[CONFIG_UART ## port ## _RXBUFSIZE]; \ + \ + /* UART interrupt handler */ \ + static DECLARE_ISR(uart ## port ## _irq_handler) \ + { \ + uart_common_irq_handler(port); \ + } \ + \ + /* UART public methods */ \ + static void \ + uart ## port ## _txStart(struct SerialHardware *_hw) \ + { \ + struct FIFOBuffer *txfifo = &ser_handles[port]->txfifo; \ + struct CM3Serial *hw = (struct CM3Serial *)_hw; \ + \ + if (hw->sending) \ + return; \ + lm3s_uartPutChar(UART ## port ## _BASE, fifo_pop(txfifo)); \ + if (!fifo_isempty(txfifo)) \ + { \ + HWREG(UART ## port ## _BASE + UART_O_IM) |= \ + UART_IM_TXIM; \ + hw->sending = true; \ + } \ + } \ + \ + static void \ + uart ## port ## _setbaudrate(UNUSED_ARG(struct SerialHardware *, hw), \ + unsigned long baud) \ + { \ + lm3s_uartSetBaudRate(UART ## port ## _BASE, baud); \ + } \ + \ + static void \ + uart ## port ## _setparity(UNUSED_ARG(struct SerialHardware *, hw), \ + int parity) \ + { \ + lm3s_uartSetParity(UART ## port ## _BASE, parity); \ + } \ + \ + static void \ + uart ## port ## _cleanup(struct SerialHardware *_hw) \ + { \ + struct CM3Serial *hw = (struct CM3Serial *)_hw; \ + \ + hw->sending = false; \ + lm3s_uartIRQDisable(port); \ + lm3s_uartClear(UART ## port ## _BASE); \ + lm3s_uartDisable(UART ## port ## _BASE); \ + } \ + \ + static void \ + uart ## port ## _init(UNUSED_ARG(struct SerialHardware *, hw), \ + UNUSED_ARG(struct Serial *, ser)) \ + { \ + lm3s_uartInit(port); \ + lm3s_uartEnable(UART ## port ## _BASE); \ + lm3s_uartIRQEnable(port, uart ## port ## _irq_handler); \ + } \ + \ + /* UART operations */ \ + static const struct SerialHardwareVT UART ## port ## _VT = \ + { \ + .init = uart ## port ## _init, \ + .cleanup = uart ## port ## _cleanup, \ + .setBaudrate = uart ## port ## _setbaudrate, \ + .setParity = uart ## port ## _setparity, \ + .txStart = uart ## port ## _txStart, \ + .txSending = tx_sending, \ + }; + +/* UART port instances */ +UART_PORT(0) +UART_PORT(1) +UART_PORT(2) + +static struct CM3Serial UARTDesc[SER_CNT] = +{ + { + .hw = { + .table = &UART0_VT, + .txbuffer = uart0_txbuffer, + .rxbuffer = uart0_rxbuffer, + .txbuffer_size = sizeof(uart0_txbuffer), + .rxbuffer_size = sizeof(uart0_rxbuffer), + }, + .sending = false, + .base = UART0_BASE, + .irq = INT_UART0, + }, + { + .hw = { + .table = &UART1_VT, + .txbuffer = uart1_txbuffer, + .rxbuffer = uart1_rxbuffer, + .txbuffer_size = sizeof(uart1_txbuffer), + .rxbuffer_size = sizeof(uart1_rxbuffer), + }, + .sending = false, + .base = UART1_BASE, + .irq = INT_UART1, + }, + { + .hw = { + .table = &UART2_VT, + .txbuffer = uart2_txbuffer, + .rxbuffer = uart2_rxbuffer, + .txbuffer_size = sizeof(uart2_txbuffer), + .rxbuffer_size = sizeof(uart2_rxbuffer), + }, + .sending = false, + .base = UART2_BASE, + .irq = INT_UART2, + }, +}; + +struct SerialHardware *ser_hw_getdesc(int port) +{ + ASSERT(port >= 0 && port < SER_CNT); + return &UARTDesc[port].hw; +} diff --git a/2.5/bertos/cpu/cortex-m3/drv/ser_lm3s.h b/2.5/bertos/cpu/cortex-m3/drv/ser_lm3s.h new file mode 100644 index 00000000..e58738a8 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/ser_lm3s.h @@ -0,0 +1,154 @@ +/** + * \file + * + * + * \brief LM3S1968 UART interface driver. + * + * \author Andrea Righi + */ + +#ifndef SER_LM3S_H +#define SER_LM3S_H + +#include +#include /* cpu_relax() */ +#include /* lm3s_busyWait() */ +#include + +/* Serial hardware numbers */ +enum +{ + SER_UART0, + SER_UART1, + SER_UART2, + + SER_CNT //< Number of serial ports +}; + +/* Software errors */ +#define SERRF_RXFIFOOVERRUN BV(0) //< Rx FIFO buffer overrun +#define SERRF_RXTIMEOUT BV(1) //< Receive timeout +#define SERRF_TXTIMEOUT BV(2) //< Transmit timeout + +/* + * Hardware errors. + */ +#define SERRF_RXSROVERRUN 0 //< Input overrun +#define SERRF_FRAMEERROR 0 //< Stop bit missing +#define SERRF_PARITYERROR 0 //< Parity error +#define SERRF_NOISEERROR 0 //< Noise error + +/* Serial error/status flags */ +typedef uint32_t serstatus_t; + +INLINE void lm3s_uartDisable(uint32_t base) +{ + /* Disable the hardware FIFO */ + HWREG(base + UART_O_LCRH) &= ~UART_LCRH_FEN; + + /* Disable the UART */ + HWREG(base + UART_O_CTL) &= + ~(UART_CTL_UARTEN | UART_CTL_TXE | UART_CTL_RXE); + lm3s_busyWait(512); +} + +INLINE void lm3s_uartEnable(uint32_t base) +{ + /* Enable the hardware FIFO */ + HWREG(base + UART_O_LCRH) |= UART_LCRH_FEN; + + /* Enable RX, TX, and the UART */ + HWREG(base + UART_O_CTL) |= + UART_CTL_UARTEN | UART_CTL_TXE | UART_CTL_RXE; + lm3s_busyWait(512); +} + +/* Clear the flags register */ +INLINE void lm3s_uartClear(uint32_t base) +{ + HWREG(base + UART_O_FR) = 0; +} + +INLINE bool lm3s_uartTxDone(uint32_t base) +{ + return HWREG(base + UART_O_FR) & UART_FR_TXFE ? true : false; +} + +INLINE bool lm3s_uartTxReady(uint32_t base) +{ + return HWREG(base + UART_O_FR) & UART_FR_TXFF ? false : true; +} + +INLINE bool lm3s_uartRxReady(uint32_t base) +{ + return HWREG(base + UART_O_FR) & UART_FR_RXFE ? false : true; +} + +INLINE bool lm3s_uartReady(uint32_t base) +{ + return HWREG(base + UART_O_FR) & UART_FR_BUSY ? false : true; +} + +INLINE int lm3s_uartPutCharNonBlocking(uint32_t base, unsigned char c) +{ + if (!lm3s_uartTxReady(base)) + return EOF; + HWREG(base + UART_O_DR) = c; + return c; +} + +INLINE int lm3s_uartPutChar(uint32_t base, unsigned char c) +{ + while (!lm3s_uartTxReady(base)) + cpu_relax(); + HWREG(base + UART_O_DR) = c; + return c; +} + +INLINE int lm3s_uartGetCharNonBlocking(uint32_t base) +{ + if (!lm3s_uartRxReady(base)) + return EOF; + return HWREG(base + UART_O_DR); +} + +INLINE int lm3s_uartGetChar(uint32_t base) +{ + while (!lm3s_uartRxReady(base)) + cpu_relax(); + return HWREG(base + UART_O_DR); +} + +void lm3s_uartSetBaudRate(uint32_t base, unsigned long baud); +void lm3s_uartSetParity(uint32_t base, int parity); +void lm3s_uartInit(int port); + +#endif /* SER_LM3S_H */ diff --git a/2.5/bertos/cpu/cortex-m3/drv/ssi_lm3s.c b/2.5/bertos/cpu/cortex-m3/drv/ssi_lm3s.c new file mode 100644 index 00000000..2dc80f99 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/ssi_lm3s.c @@ -0,0 +1,207 @@ +/** + * \file + * + * + * \brief LM3S1968 Synchronous Serial Interface (SSI) driver. + * + * \author Andrea Righi + */ + +#include "cfg/compiler.h" +#include "cfg/debug.h" + +#include /* memset() */ + +#include "ssi_lm3s.h" + +/* SSI clocking informations (CPSDVSR + SCR) */ +struct SSIClock +{ + unsigned int cpsdvsr; + unsigned int scr; +}; + +/* + * Evaluate the SSI clock prescale (SSICPSR) and SSI serial clock rate (SCR). + */ +INLINE struct SSIClock +lm3s_ssiPrescale(unsigned int bitrate) +{ + struct SSIClock ret; + + for (ret.cpsdvsr = 2, ret.scr = CPU_FREQ / bitrate / ret.cpsdvsr - 1; + ret.scr > 255; ret.cpsdvsr += 2); + ASSERT(ret.cpsdvsr < 255); + + return ret; +} + +/* + * Initialize the SSI interface. + * + * Return 0 in case of success, a negative value otherwise. + */ +int lm3s_ssiOpen(uint32_t addr, uint32_t frame, int mode, + int bitrate, uint32_t data_width) +{ + struct SSIClock ssi_clock; + + ASSERT(addr == SSI0_BASE || addr == SSI1_BASE); + /* Configure the SSI operating mode */ + switch (mode) + { + /* SSI Slave Mode Output Disable */ + case SSI_MODE_SLAVE_OD: + HWREG(addr + SSI_O_CR1) = SSI_CR1_SOD; + break; + /* SSI Slave */ + case SSI_MODE_SLAVE: + HWREG(addr + SSI_O_CR1) = SSI_CR1_MS; + break; + /* SSI Master */ + case SSI_MODE_MASTER: + HWREG(addr + SSI_O_CR1) = 0; + break; + default: + ASSERT(0); + return -1; + } + /* Configure the peripheral clock and frame format */ + ssi_clock = lm3s_ssiPrescale(bitrate); + HWREG(addr + SSI_O_CPSR) = ssi_clock.cpsdvsr; + HWREG(addr + SSI_O_CR0) = + (ssi_clock.scr << 8) | + ((frame & 3) << 6) | + (frame & SSI_CR0_FRF_M) | + (data_width - 1); + /* Enable the SSI interface */ + HWREG(addr + SSI_O_CR1) |= SSI_CR1_SSE; + + return 0; +} + +/* + * Write data to the SSI bus. + * + * Return the number of bytes written to the bus. + */ +static size_t lm3s_ssiWrite(struct KFile *fd, const void *buf, size_t size) +{ + LM3SSSI *fds = LM3SSSI_CAST(fd); + const char *p = (const char *)buf; + uint32_t frame; + size_t count = 0; + + while (count < size) + { + frame = p[count]; + if (fds->flags & LM3S_SSI_NONBLOCK) + { + if (!lm3s_ssiWriteFrameNonBlocking(fds->addr, + frame)) + break; + } + else + lm3s_ssiWriteFrame(fds->addr, frame); + count++; + } + return count; +} + +/* + * Read data from the SSI bus. + * + * Return the number of bytes read from the bus. + */ +static size_t lm3s_ssiRead(struct KFile *fd, void *buf, size_t size) +{ + LM3SSSI *fds = LM3SSSI_CAST(fd); + + uint8_t *p = (uint8_t *)buf; + uint32_t frame; + size_t count = 0; + + while (count < size) + { + if (fds->flags & LM3S_SSI_NONBLOCK) + { + if (!lm3s_ssiReadFrameNonBlocking(fds->addr, &frame)) + break; + } + else + lm3s_ssiReadFrame(fds->addr, &frame); + *p++ = (uint8_t)frame; + count++; + } + return count; +} + + +/* Wait for data in the TX FIFO being actually transmitted */ +static int lm3s_ssiFlush(struct KFile *fd) +{ + LM3SSSI *fds = LM3SSSI_CAST(fd); + + while (!lm3s_ssiTxDone(fds->addr)) + cpu_relax(); + return 0; +} + +/* Disable the SSI interface */ +static int lm3s_ssiClose(struct KFile *fd) +{ + LM3SSSI *fds = LM3SSSI_CAST(fd); + + lm3s_ssiFlush(fd); + HWREG(fds->addr + SSI_O_CR1) &= ~SSI_CR1_SSE; + return 0; +} + +/** + * Initialize a LM3S SSI driver. + */ +void lm3s_ssiInit(struct LM3SSSI *fds, uint32_t addr, uint32_t frame, int mode, + int bitrate, uint32_t data_width) +{ + memset(fds, 0, sizeof(*fds)); + DB(fds->fd._type = KFT_LM3SSSI); + + /* TODO: only 8-bit frame size is supported */ + ASSERT(data_width == 8); + + fds->fd.write = lm3s_ssiWrite; + fds->fd.read = lm3s_ssiRead; + fds->fd.close = lm3s_ssiClose; + fds->fd.flush = lm3s_ssiFlush; + + fds->addr = addr; + lm3s_ssiOpen(addr, frame, mode, bitrate, data_width); +} diff --git a/2.5/bertos/cpu/cortex-m3/drv/ssi_lm3s.h b/2.5/bertos/cpu/cortex-m3/drv/ssi_lm3s.h new file mode 100644 index 00000000..d5f09e3d --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/ssi_lm3s.h @@ -0,0 +1,191 @@ +/** + * \file + * + * + * \brief LM3S1968 Synchronous Serial Interface (SSI) driver. + * + */ + +#ifndef SSI_LM3S_H +#define SSI_LM3S_H + +#include /* cpu_relax() */ +#include /* KFile */ +#include + +/** + * LM3S1968 SSI frame format + */ +/*\{*/ +#define SSI_FRF_MOTO_MODE_0 0x00000000 //< Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 //< Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 //< Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 //< Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 //< TI frame format +#define SSI_FRF_NMW 0x00000020 //< National MicroWire frame format +/*\}*/ + +/** + * LM3S1968 SSI operational mode + */ +/*\{*/ +#define SSI_MODE_MASTER 0x00000000 //< SSI master +#define SSI_MODE_SLAVE 0x00000001 //< SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 //< SSI slave with output disabled +/*\}*/ + +/* LM3S SSI handle properties */ +enum +{ + /* Non-blocking I/O */ + LM3S_SSI_NONBLOCK = 1, +}; + +/** LM3S1968 SSI handle structure */ +typedef struct LM3SSSI +{ + /* SSI Kfile structure */ + KFile fd; + + /* Handle properties */ + uint32_t flags; + + /* SSI port address */ + uint32_t addr; +} LM3SSSI; + +/** + * ID for LM3S SSI. + */ +#define KFT_LM3SSSI MAKE_ID('L', 'S', 'S', 'I') + +INLINE LM3SSSI *LM3SSSI_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_LM3SSSI); + return (LM3SSSI *)fd; +} + +/* KFile interface to LM3S SSI */ +void lm3s_ssiInit(struct LM3SSSI *fds, uint32_t addr, uint32_t frame, int mode, + int bitrate, uint32_t data_width); + +/* Raw interface to LM3S SSI */ +int lm3s_ssiOpen(uint32_t addr, uint32_t frame, int mode, + int bitrate, uint32_t data_width); + +/* + * Check if the SSI transmitter is busy or not + * + * This allows to determine whether the TX FIFO have been cleared by the + * hardware, so the transmission can be safely considered completed. + */ +INLINE bool lm3s_ssiTxDone(uint32_t base) +{ + return (HWREG(base + SSI_O_SR) & SSI_SR_BSY) ? true : false; +} + +/* + * Check if the SSI TX FIFO is full + */ +INLINE bool lm3s_ssiTxReady(uint32_t base) +{ + return (HWREG(base + SSI_O_SR) & SSI_SR_TNF) ? true : false; +} + +/* + * Check for data available in the RX FIFO + */ +INLINE bool lm3s_ssiRxReady(uint32_t base) +{ + return (HWREG(base + SSI_O_SR) & SSI_SR_RNE) ? true : false; +} + +/* + * Get a frame into the SSI receive FIFO without blocking. + * + * Return the number of frames read from the RX FIFO. + */ +INLINE int lm3s_ssiReadFrameNonBlocking(uint32_t base, uint32_t *val) +{ + /* Check for data available in the RX FIFO */ + if (!lm3s_ssiRxReady(base)) + return 0; + /* Read data from SSI RX FIFO */ + *val = HWREG(base + SSI_O_DR); + return 1; +} + +/* + * Get a frame from the SSI receive FIFO. + */ +INLINE void lm3s_ssiReadFrame(uint32_t base, uint32_t *val) +{ + /* Wait for data available in the RX FIFO */ + while (!lm3s_ssiRxReady(base)) + cpu_relax(); + /* Read data from SSI RX FIFO */ + *val = HWREG(base + SSI_O_DR); +} + +/* + * Put a frame into the SSI transmit FIFO without blocking. + * + * NOTE: the upper bits of the frame will be automatically discarded by the + * hardware according to the frame data width. + * + * Return the number of frames written to the TX FIFO. + */ +INLINE int lm3s_ssiWriteFrameNonBlocking(uint32_t base, uint32_t val) +{ + /* Check for available space in the TX FIFO */ + if (!lm3s_ssiTxReady(base)) + return 0; + /* Enqueue data to the TX FIFO */ + HWREG(base + SSI_O_DR) = val; + return 1; +} + +/* + * Put a frame into the SSI transmit FIFO. + * + * NOTE: the upper bits of the frame will be automatically discarded by the + * hardware according to the frame data width. + */ +INLINE void lm3s_ssiWriteFrame(uint32_t base, uint32_t val) +{ + /* Wait for available space in the TX FIFO */ + while (!lm3s_ssiTxReady(base)) + cpu_relax(); + /* Enqueue data to the TX FIFO */ + HWREG(base + SSI_O_DR) = val; +} + +#endif /* SSI_LM3S_H */ diff --git a/2.5/bertos/cpu/cortex-m3/drv/timer_cm3.c b/2.5/bertos/cpu/cortex-m3/drv/timer_cm3.c new file mode 100644 index 00000000..e5a730bf --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/timer_cm3.c @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Low-level timer driver (SysTick) for LM3S1968. + * + * \author Andrea Righi + */ + +#include +#include +#include +#include "timer_cm3.h" + +INLINE void timer_hw_setPeriod(unsigned long period) +{ + ASSERT(period < (1 << 24)); + NVIC_ST_RELOAD_R = period - 1; +} + +static void timer_hw_enable(void) +{ + NVIC_ST_CTRL_R |= + NVIC_ST_CTRL_CLK_SRC | NVIC_ST_CTRL_ENABLE | NVIC_ST_CTRL_INTEN; +} + +static void timer_hw_disable(void) +{ + NVIC_ST_CTRL_R &= ~(NVIC_ST_CTRL_ENABLE | NVIC_ST_CTRL_INTEN); +} + +void timer_hw_init(void) +{ + timer_hw_setPeriod(CPU_FREQ / TIMER_TICKS_PER_SEC); + sysirq_setHandler(FAULT_SYSTICK, timer_handler); + timer_hw_enable(); +} + +void timer_hw_exit(void) +{ + timer_hw_disable(); + sysirq_freeHandler(FAULT_SYSTICK); +} diff --git a/2.5/bertos/cpu/cortex-m3/drv/timer_cm3.h b/2.5/bertos/cpu/cortex-m3/drv/timer_cm3.h new file mode 100644 index 00000000..1ee8b7a2 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/drv/timer_cm3.h @@ -0,0 +1,104 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Low-level timer driver (SysTick) for Cortex-M3. + */ + +#ifndef TIMER_CM3_H +#define TIMER_CM3_H + +#include "cfg/cfg_timer.h" /* CONFIG_TIMER */ + +#if CPU_CM3_LM3S + #include +#elif CPU_CM3_STM32 + #include +/*#elif Add other families here */ +#else + #error Unknown CPU +#endif + +/** + * \name Values for CONFIG_TIMER. + * + * Select which hardware timer interrupt to use for system clock and softtimers. + * + * $WIZ$ timer_select = "TIMER_DEFAULT", "TIMER_ON_GPTM" + */ +#define TIMER_ON_GPTM 1 + +#define TIMER_DEFAULT TIMER_ON_GPTM ///< Default system timer + +#if (CONFIG_TIMER == TIMER_ON_GPTM) + /* Ticks frequency (HZ) */ + #define TIMER_TICKS_PER_SEC 1000 + + /* Frequency of the hardware high-precision timer. */ + #define TIMER_HW_HPTICKS_PER_SEC (CPU_FREQ) + + /* Maximum value of the high-precision hardware counter register */ + #define TIMER_HW_CNT (CPU_FREQ / TIMER_TICKS_PER_SEC) + + /** Type of time expressed in ticks of the hardware high-precision timer */ + typedef uint32_t hptime_t; + #define SIZEOF_HPTIME_T 4 + + /* Timer ISR prototype */ + ISR_PROTO_CONTEXT_SWITCH(timer_handler); + #define DEFINE_TIMER_ISR DECLARE_ISR_CONTEXT_SWITCH(timer_handler) + + INLINE void timer_hw_irq(void) + { + } + + + INLINE bool timer_hw_triggered(void) + { + return true; + } + + INLINE hptime_t timer_hw_hpread(void) + { + return (TIMER_HW_CNT - NVIC_ST_CURRENT_R); + } + +#else + + #error Unimplemented value for CONFIG_TIMER +#endif /* CONFIG_TIMER */ + +void timer_hw_init(void); +void timer_hw_exit(void); + +#endif /* TIMER_CM3_H */ diff --git a/2.5/bertos/cpu/cortex-m3/hw/crt_cm3.S b/2.5/bertos/cpu/cortex-m3/hw/crt_cm3.S new file mode 100644 index 00000000..c23d8374 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/hw/crt_cm3.S @@ -0,0 +1,112 @@ +/** + * \file + * + * + * \brief Cortex-M3 architecture's entry point + * + * \author Andrea Righi + */ + +#define CONTROL_UNPRIVILEGED 1 +#define CONTROL_PSP 2 + +.syntax unified +.thumb +.section .init, "ax", %progbits + +.weak __init +.set __init, __init0 + +.weak __init1 +.set __init1, __dummy_init + +.weak __init2 +.set __init2, __dummy_init + +.balign 2 +.thumb_func +__dummy_init: + bx lr + +/* + * Reset handler. + */ +.balign 2 +.thumb_func +__init0: + /* Disable IRQs */ + cpsid i + /* + * Initialize process stack pointer. + */ + ldr r0, =__psp_end + msr psp, r0 + + /* Call the early hardware initialization routine */ + bl __init1 + + /* Copy the data segment initializers from flash to SRAM */ + ldr r0, =__text_end + ldr r1, =__data_start + ldr r2, =__data_end +data_loop: + cmp r1, r2 + ittt lo + ldrlo r3, [r0], #4 + strlo r3, [r1], #4 + blo data_loop + + /* Zero fill the bss segment */ + ldr r1, =__bss_start + ldr r2, =__bss_end + mov r0, #0 +bss_loop: + cmp r1, r2 + itt lo + strlo r0, [r1], #4 + blo bss_loop + + /* Switch to the process stack */ + movs r0, CONTROL_PSP + msr control, r0 + isb + + /* Call the hardware initialization routine */ + bl __init2 + + /* Call the application's entry point */ + cpsie i + mov r0, #0 + mov r1, #0 + bl main +end: + wfi + b end diff --git a/2.5/bertos/cpu/cortex-m3/hw/init_cm3.c b/2.5/bertos/cpu/cortex-m3/hw/init_cm3.c new file mode 100644 index 00000000..8415cbfb --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/hw/init_cm3.c @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \brief Cortex-M3 architecture's entry point + * + * \author Andrea Righi + */ + +#include +#include /* CONFIG_KERN_PREEMPT */ +#include +#include +#include /* PAUSE */ +#include /* IRQ_DISABLE */ +#include +#include +#include "switch_ctx_cm3.h" + +#if CPU_CM3_LM3S +#include +#include +#elif CPU_CM3_STM32 +#include +#include +#endif + +extern size_t __text_end, __data_start, __data_end, __bss_start, __bss_end; + +extern void __init2(void); + +/* Architecture's entry point */ +void __init2(void) +{ + /* + * The main application expects IRQs disabled. + */ + IRQ_DISABLE; + +#if CPU_CM3_LM3S + /* + * PLL may not function properly at default LDO setting. + * + * Description: + * + * In designs that enable and use the PLL module, unstable device + * behavior may occur with the LDO set at its default of 2.5 volts or + * below (minimum of 2.25 volts). Designs that do not use the PLL + * module are not affected. + * + * Workaround: Prior to enabling the PLL module, it is recommended that + * the default LDO voltage setting of 2.5 V be adjusted to 2.75 V using + * the LDO Power Control (LDOPCTL) register. + * + * Silicon Revision Affected: A1, A2 + * + * See also: Stellaris LM3S1968 A2 Errata documentation. + */ + if (REVISION_IS_A1 | REVISION_IS_A2) + HWREG(SYSCTL_LDOPCTL) = SYSCTL_LDOPCTL_2_75V; +#endif + /* Set the appropriate clocking configuration */ + clock_init(); + + /* Initialize IRQ vector table in RAM */ + sysirq_init(); + +#if (CONFIG_KERN && CONFIG_KERN_PREEMPT) + /* + * Voluntary context switch handler. + * + * This software interrupt can always be triggered and must be + * dispatched as soon as possible, thus we just disable IRQ priority + * for it. + */ + sysirq_setHandler(FAULT_SVCALL, svcall_handler); + sysirq_setPriority(FAULT_SVCALL, IRQ_PRIO_MAX); + /* + * Preemptible context switch handler + * + * The priority of this IRQ must be the lowest priority in the system + * in order to run last in the interrupt service routines' chain. + */ + sysirq_setHandler(FAULT_PENDSV, pendsv_handler); + sysirq_setPriority(FAULT_PENDSV, IRQ_PRIO_MIN); +#endif +} diff --git a/2.5/bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c b/2.5/bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c new file mode 100644 index 00000000..7b36d902 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c @@ -0,0 +1,145 @@ +/** + * \file + * + * + * \brief Cortex-M3 context switch + * + * \author Andrea Righi + */ + +#include +#include /* CONFIG_KERN_PREEMPT */ +#include /* IRQ_PRIO_DISABLED */ +#include /* cpu_stack_t */ +#include /* asm_switch_context() prototype */ +#include /* proc_preempt() */ +#include "switch_ctx_cm3.h" + +#if CONFIG_KERN_PREEMPT +/* + * Kernel preemption: implementation details. + * + * The kernel preemption is implemented using the PendSV IRQ. Inside the + * SysTick handler when a process needs to be interrupted (expires its time + * quantum or a high-priority process is awakend) a pending PendSV call is + * triggered. + * + * The PendSV handler is called immediately after the SysTick handler, using + * the architecture's tail-chaining functionality (an ISR call without the + * overhead of state saving and restoration between different IRQs). Inside the + * PendSV handler we perform the stack-switching between the old and new + * processes. + * + * Voluntary context switch is implemented as a soft-interrupt call (SVCall), + * so any process is always suspended and resumed from an interrupt context. + * + * NOTE: interrupts must be disabled or enabled when resuming a process context + * depending of the type of the previous suspension. If a process was suspended + * by a voluntary context switch IRQs must be disabled on resume (voluntary + * context switch always happen with IRQs disabled). Instead, if a process was + * suspended by the kernel preemption IRQs must be always re-enabled, because + * the PendSV handler resumes directly the process context. To keep track of + * this, we save the state of the IRQ priority in register r3 before performing + * the context switch. + * + * If CONFIG_KERN_PREEMPT is not enabled the cooperative implementation + * fallbacks to the default stack-switching mechanism, performed directly in + * thread-mode and implemented as a normal function call. + */ + +/* + * Voluntary context switch handler. + */ +void NAKED svcall_handler(void) +{ + asm volatile ( + /* Save context */ + "mrs r3, basepri\n\t" + "mrs ip, psp\n\t" + "stmdb ip!, {r3-r11, lr}\n\t" + /* Stack switch */ + "str ip, [r1]\n\t" + "ldr ip, [r0]\n\t" + /* Restore context */ + "ldmia ip!, {r3-r11, lr}\n\t" + "msr psp, ip\n\t" + "msr basepri, r3\n\t" + "bx lr" : : : "memory"); +} + +/* + * Preemptible context switch handler. + */ +void NAKED pendsv_handler(void) +{ + register cpu_stack_t *stack asm("ip"); + + asm volatile ( + "mrs r3, basepri\n\t" + "mov %0, %2\n\t" + "msr basepri, %0\n\t" + "mrs %0, psp\n\t" + "stmdb %0!, {r3-r11, lr}\n\t" + : "=r"(stack) + : "r"(stack), "i"(IRQ_PRIO_DISABLED) + : "r3", "memory"); + proc_current()->stack = stack; + proc_preempt(); + stack = proc_current()->stack; + asm volatile ( + "ldmia %0!, {r3-r11, lr}\n\t" + "msr psp, %0\n\t" + "msr basepri, r3\n\t" + "bx lr" + : "=r"(stack) : "r"(stack) + : "memory"); +} +#else /* !CONFIG_KERN_PREEMPT */ +void NAKED asm_switch_context(cpu_stack_t **new_sp, cpu_stack_t **old_sp) +{ + register cpu_stack_t **_new_sp asm("r0") = new_sp; + register cpu_stack_t **_old_sp asm("r1") = old_sp; + + asm volatile ( + "mrs ip, psp\n\t" + /* Save registers */ + "stmdb ip!, {r4-r11, lr}\n\t" + /* Save old stack pointer */ + "str ip, [%1]\n\t" + /* Load new stack pointer */ + "ldr ip, [%0]\n\t" + /* Load new registers */ + "ldmia ip!, {r4-r11, lr}\n\t" + "msr psp, ip\n\t" + "bx lr" + : : "r"(_new_sp), "r"(_old_sp) : "ip", "memory"); +} +#endif /* CONFIG_KERN_PREEMPT */ diff --git a/2.5/bertos/cpu/cortex-m3/hw/switch_ctx_cm3.h b/2.5/bertos/cpu/cortex-m3/hw/switch_ctx_cm3.h new file mode 100644 index 00000000..24efcc28 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/hw/switch_ctx_cm3.h @@ -0,0 +1,44 @@ +/** + * \file + * + * + * \brief Cortex-M3 context switch + */ + +#ifndef SWITCH_CTX_CM3_H +#define SWITCH_CTX_CM3_H + +#if CONFIG_KERN_PREEMPT +extern void svcall_handler(void); +extern void pendsv_handler(void); +#endif /* CONFIG_KERN_PREEMPT */ + +#endif /* SWITCH_CTX_CM3_H */ diff --git a/2.5/bertos/cpu/cortex-m3/hw/vectors_cm3.S b/2.5/bertos/cpu/cortex-m3/hw/vectors_cm3.S new file mode 100644 index 00000000..dfd464a6 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/hw/vectors_cm3.S @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Cortex-M3 startup interrupt vector table + * + * \author Andrea Righi + */ + +.syntax unified +.thumb + +.text +.thumb_func +default_isr: + wfi + b default_isr + +.section .vectors,"ax",%progbits + +irq_vectors: + .word __msp_end /* Initial stack pointer */ + .word __init /* The reset handler */ + .word default_isr /* The NMI handler */ + .word default_isr /* The hard fault handler */ +/* + * This IRQ vector table will be replaced by another one in RAM after the IRQ + * module initialization and the reset handler disables IRQ at the very + * beginning, so there is no chance to trigger the following IRQs. + * + * We can safely trim the rest of this table to reduce the memory footprint and + * save some space in flash. + */ diff --git a/2.5/bertos/cpu/cortex-m3/info/LM3S1968.cdef b/2.5/bertos/cpu/cortex-m3/info/LM3S1968.cdef new file mode 100644 index 00000000..e3811a29 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/info/LM3S1968.cdef @@ -0,0 +1,65 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# General CPU info denfinition for Cortex-M3-based LM3S1968 board. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Andrea Righi +# +# + +# Import the common settings for the path. +include("cm3.common") + +# CPU type used for flashing/debugging +MK_PROGRAMMER_CPU = "lm3s" +MK_FLASH_SCRIPT = PRG_SCRIPTS_DIR + "arm/flash-lm3s.sh" + +# CPU default clock frequency +CPU_DEFAULT_FREQ = "50000000UL" + +# Special CPU related tags. +CPU_TAGS += ["lm3s"] + +# Additional hw drivers. +MK_CPU_CSRC += DRV_DIR + "gpio_lm3s.c " + DRV_DIR + "clock_lm3s.c " + +# Short description of the cpu. +CPU_DESC += [ "256 Kbytes on-chip flash memory", + "64 Kbytes on-chip SRAM memory" ] + +# GCC flags for this cpu. +MK_CPU_CPPFLAGS += " -D__ARM_LM3S1968__" +MK_CPU_LDFLAGS += " -T " + SCRIPT_DIR + "lm3s1968_rom.ld" diff --git a/2.5/bertos/cpu/cortex-m3/info/LM3S8962.cdef b/2.5/bertos/cpu/cortex-m3/info/LM3S8962.cdef new file mode 100644 index 00000000..ddabc1f2 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/info/LM3S8962.cdef @@ -0,0 +1,65 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# General CPU info denfinition for Cortex-M3-based LM3S8962 board. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Andrea Righi +# +# + +# Import the common settings for the path. +include("cm3.common") + +# CPU type used for flashing/debugging +MK_PROGRAMMER_CPU = "lm3s" +MK_FLASH_SCRIPT = PRG_SCRIPTS_DIR + "arm/flash-lm3s.sh" + +# CPU default clock frequency +CPU_DEFAULT_FREQ = "50000000UL" + +# Special CPU related tags. +CPU_TAGS += ["lm3s"] + +# Additional hw drivers. +MK_CPU_CSRC += DRV_DIR + "gpio_lm3s.c " + DRV_DIR + "clock_lm3s.c " + +# Short description of the cpu. +CPU_DESC += [ "256 Kbytes on-chip flash memory", + "64 Kbytes on-chip SRAM memory" ] + +# GCC flags for this cpu. +MK_CPU_CPPFLAGS += " -D__ARM_LM3S8962__" +MK_CPU_LDFLAGS += " -T " + SCRIPT_DIR + "lm3s1968_rom.ld" diff --git a/2.5/bertos/cpu/cortex-m3/info/STM32F103RB.cdef b/2.5/bertos/cpu/cortex-m3/info/STM32F103RB.cdef new file mode 100644 index 00000000..add4cea6 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/info/STM32F103RB.cdef @@ -0,0 +1,65 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# General CPU info denfinition for Cortex-M3-based STM32-P103 board. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Andrea Righi +# +# + +# Import the common settings for the path. +include("cm3.common") + +# CPU type used for flashing/debugging +MK_PROGRAMMER_CPU = "stm32" +MK_FLASH_SCRIPT = PRG_SCRIPTS_DIR + "arm/flash-stm32.sh" + +# CPU default clock frequency +CPU_DEFAULT_FREQ = "72000000UL" + +# Special CPU related tags. +CPU_TAGS += ["stm32"] + +# Additional hw drivers. +MK_CPU_CSRC += DRV_DIR + "gpio_stm32.c " + DRV_DIR + "clock_stm32.c " + +# Short description of the cpu. +CPU_DESC += [ "128 Kbytes on-chip flash memory", + "20 Kbytes on-chip SRAM memory" ] + +# GCC flags for this cpu. +MK_CPU_CPPFLAGS += " -D__ARM_STM32F103RB__" +MK_CPU_LDFLAGS += " -T " + SCRIPT_DIR + "stm32f103rb_rom.ld" diff --git a/2.5/bertos/cpu/cortex-m3/info/cm3.common b/2.5/bertos/cpu/cortex-m3/info/cm3.common new file mode 100644 index 00000000..380a02b5 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/info/cm3.common @@ -0,0 +1,81 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# General CPU info denfinition for Cortex-M3-based boards. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Andrea Righi +# +# + +# Import the common settings for the path. +include("../../path.common") + +# Short description of the cpu. +CPU_DESC = ["ARM Cortex-M3", + "ARMv7-M Thumb-2 ISA", + "16-bit and 32-bit RISC Architecture"] + +# Type of the toolchain we should use to compile the source for this CPU. +TOOLCHAIN = "arm" + +# If we use the GCC compiler we should pass some flags. +CORE_CPU = "cortex-m3" + +# Name of the flag used by the build system to pass to the compiler the CPU type. +MK_CPU = CORE_CPU + +# Special CPU related tags. +CPU_TAGS = ["cm3"] + +# Where are locate the bertos directories +SCRIPT_DIR = CPU_DIR + "cortex-m3/scripts/" +HW_DIR = CPU_DIR + "cortex-m3/hw/" +DRV_DIR = CPU_DIR + "cortex-m3/drv/" + +MK_STOPFLASH_SCRIPT = PRG_SCRIPTS_DIR + "arm/stopopenocd.sh" +MK_DEBUG_SCRIPT = PRG_SCRIPTS_DIR + "arm/debug.sh" +MK_STOPDEBUG_SCRIPT = PRG_SCRIPTS_DIR + "arm/stopopenocd.sh" + +GDB_INIT_SCRIPT = PRG_SCRIPTS_DIR + "arm/openocd/gdbinit-sam7" + +# Common GCC flags. +MK_CPU_CPPAFLAGS = "-g -gdwarf-2 -mthumb -mno-thumb-interwork" +MK_CPU_CPPFLAGS = "-O0 -g3 -gdwarf-2 -mthumb -mno-thumb-interwork -fno-strict-aliasing -fwrapv -fverbose-asm -I" + CPU_DIR + "cortex-m3/" +MK_CPU_LDFLAGS = "-mthumb -mno-thumb-interwork -nostartfiles -Wl,--no-warn-mismatch" + +# CRT files. +MK_CPU_CPPASRC = HW_DIR + "crt_cm3.S " + HW_DIR + "vectors_cm3.S " +MK_CPU_CSRC = HW_DIR + "init_cm3.c " + DRV_DIR + "irq_cm3.c " diff --git a/2.5/bertos/cpu/cortex-m3/io/cm3_types.h b/2.5/bertos/cpu/cortex-m3/io/cm3_types.h new file mode 100644 index 00000000..8cb94855 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/cm3_types.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief Cortex-M3 generic hardware macros. + */ + +#ifndef CM3_TYPES_H +#define CM3_TYPES_H + +/** + * Macros for hardware access, both direct and via the bit-band region. + */ +/*\{*/ +#define HWREG(x) (*((reg32_t *)(x))) +#define HWREGH(x) (*((reg16_t *)(x))) +#define HWREGB(x) (*((reg8_t *)(x))) + +#define HWREGBITW(x, b) \ + HWREG(((reg32_t)(x) & 0xF0000000) | 0x02000000 | \ + (((reg32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREGH(((reg32_t)(x) & 0xF0000000) | 0x02000000 | \ + (((reg32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREGB(((reg32_t)(x) & 0xF0000000) | 0x02000000 | \ + (((reg32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +/*\}*/ + +#endif /* CM3_TYPES_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/lm3s.h b/2.5/bertos/cpu/cortex-m3/io/lm3s.h new file mode 100644 index 00000000..d924d442 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/lm3s.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \author Andrea Righi + */ + +#ifndef LM3S_H +#define LM3S_H + +#include +#include + +#if (CPU_CM3_LM3S1968 || CPU_CM3_LM3S8962) + #include "lm3s1968.h" + #include "lm3s_types.h" + #include "lm3s_ints.h" + #include "lm3s_nvic.h" + #include "lm3s_sysctl.h" + #include "lm3s_gpio.h" + #include "lm3s_memmap.h" + #include "lm3s_uart.h" + #include "lm3s_ssi.h" +#else + #error Missing I/O definitions for CPU. +#endif + +#endif /* LM3S_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/lm3s1968.h b/2.5/bertos/cpu/cortex-m3/io/lm3s1968.h new file mode 100644 index 00000000..4ffdc0d1 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/lm3s1968.h @@ -0,0 +1,3765 @@ +/** + * \file + * + * + * \brief LM3S1968 registers definition. + */ + +#ifndef LM3S1968_H +#define LM3S1968_H + +#include + +/** + * Watchdog Timer registers (WATCHDOG0) + */ +/*\{*/ +#define WATCHDOG0_LOAD_R (*((reg32_t *)0x40000000)) +#define WATCHDOG0_VALUE_R (*((reg32_t *)0x40000004)) +#define WATCHDOG0_CTL_R (*((reg32_t *)0x40000008)) +#define WATCHDOG0_ICR_R (*((reg32_t *)0x4000000C)) +#define WATCHDOG0_RIS_R (*((reg32_t *)0x40000010)) +#define WATCHDOG0_MIS_R (*((reg32_t *)0x40000014)) +#define WATCHDOG0_TEST_R (*((reg32_t *)0x40000418)) +#define WATCHDOG0_LOCK_R (*((reg32_t *)0x40000C00)) +/*\}*/ + +/** + * GPIO registers (PORTA) + */ +/*\{*/ +#define GPIO_PORTA_DATA_BITS_R ((reg32_t *)0x40004000) +#define GPIO_PORTA_DATA_R (*((reg32_t *)0x400043FC)) +#define GPIO_PORTA_DIR_R (*((reg32_t *)0x40004400)) +#define GPIO_PORTA_IS_R (*((reg32_t *)0x40004404)) +#define GPIO_PORTA_IBE_R (*((reg32_t *)0x40004408)) +#define GPIO_PORTA_IEV_R (*((reg32_t *)0x4000440C)) +#define GPIO_PORTA_IM_R (*((reg32_t *)0x40004410)) +#define GPIO_PORTA_RIS_R (*((reg32_t *)0x40004414)) +#define GPIO_PORTA_MIS_R (*((reg32_t *)0x40004418)) +#define GPIO_PORTA_ICR_R (*((reg32_t *)0x4000441C)) +#define GPIO_PORTA_AFSEL_R (*((reg32_t *)0x40004420)) +#define GPIO_PORTA_DR2R_R (*((reg32_t *)0x40004500)) +#define GPIO_PORTA_DR4R_R (*((reg32_t *)0x40004504)) +#define GPIO_PORTA_DR8R_R (*((reg32_t *)0x40004508)) +#define GPIO_PORTA_ODR_R (*((reg32_t *)0x4000450C)) +#define GPIO_PORTA_PUR_R (*((reg32_t *)0x40004510)) +#define GPIO_PORTA_PDR_R (*((reg32_t *)0x40004514)) +#define GPIO_PORTA_SLR_R (*((reg32_t *)0x40004518)) +#define GPIO_PORTA_DEN_R (*((reg32_t *)0x4000451C)) +#define GPIO_PORTA_LOCK_R (*((reg32_t *)0x40004520)) +#define GPIO_PORTA_CR_R (*((reg32_t *)0x40004524)) +/*\}*/ + +/** + * GPIO registers (PORTB) + */ +/*\{*/ +#define GPIO_PORTB_DATA_BITS_R ((reg32_t *)0x40005000) +#define GPIO_PORTB_DATA_R (*((reg32_t *)0x400053FC)) +#define GPIO_PORTB_DIR_R (*((reg32_t *)0x40005400)) +#define GPIO_PORTB_IS_R (*((reg32_t *)0x40005404)) +#define GPIO_PORTB_IBE_R (*((reg32_t *)0x40005408)) +#define GPIO_PORTB_IEV_R (*((reg32_t *)0x4000540C)) +#define GPIO_PORTB_IM_R (*((reg32_t *)0x40005410)) +#define GPIO_PORTB_RIS_R (*((reg32_t *)0x40005414)) +#define GPIO_PORTB_MIS_R (*((reg32_t *)0x40005418)) +#define GPIO_PORTB_ICR_R (*((reg32_t *)0x4000541C)) +#define GPIO_PORTB_AFSEL_R (*((reg32_t *)0x40005420)) +#define GPIO_PORTB_DR2R_R (*((reg32_t *)0x40005500)) +#define GPIO_PORTB_DR4R_R (*((reg32_t *)0x40005504)) +#define GPIO_PORTB_DR8R_R (*((reg32_t *)0x40005508)) +#define GPIO_PORTB_ODR_R (*((reg32_t *)0x4000550C)) +#define GPIO_PORTB_PUR_R (*((reg32_t *)0x40005510)) +#define GPIO_PORTB_PDR_R (*((reg32_t *)0x40005514)) +#define GPIO_PORTB_SLR_R (*((reg32_t *)0x40005518)) +#define GPIO_PORTB_DEN_R (*((reg32_t *)0x4000551C)) +#define GPIO_PORTB_LOCK_R (*((reg32_t *)0x40005520)) +#define GPIO_PORTB_CR_R (*((reg32_t *)0x40005524)) +/*\}*/ + +/** + * GPIO registers (PORTC) + */ +/*\{*/ +#define GPIO_PORTC_DATA_BITS_R ((reg32_t *)0x40006000) +#define GPIO_PORTC_DATA_R (*((reg32_t *)0x400063FC)) +#define GPIO_PORTC_DIR_R (*((reg32_t *)0x40006400)) +#define GPIO_PORTC_IS_R (*((reg32_t *)0x40006404)) +#define GPIO_PORTC_IBE_R (*((reg32_t *)0x40006408)) +#define GPIO_PORTC_IEV_R (*((reg32_t *)0x4000640C)) +#define GPIO_PORTC_IM_R (*((reg32_t *)0x40006410)) +#define GPIO_PORTC_RIS_R (*((reg32_t *)0x40006414)) +#define GPIO_PORTC_MIS_R (*((reg32_t *)0x40006418)) +#define GPIO_PORTC_ICR_R (*((reg32_t *)0x4000641C)) +#define GPIO_PORTC_AFSEL_R (*((reg32_t *)0x40006420)) +#define GPIO_PORTC_DR2R_R (*((reg32_t *)0x40006500)) +#define GPIO_PORTC_DR4R_R (*((reg32_t *)0x40006504)) +#define GPIO_PORTC_DR8R_R (*((reg32_t *)0x40006508)) +#define GPIO_PORTC_ODR_R (*((reg32_t *)0x4000650C)) +#define GPIO_PORTC_PUR_R (*((reg32_t *)0x40006510)) +#define GPIO_PORTC_PDR_R (*((reg32_t *)0x40006514)) +#define GPIO_PORTC_SLR_R (*((reg32_t *)0x40006518)) +#define GPIO_PORTC_DEN_R (*((reg32_t *)0x4000651C)) +#define GPIO_PORTC_LOCK_R (*((reg32_t *)0x40006520)) +#define GPIO_PORTC_CR_R (*((reg32_t *)0x40006524)) +/*\}*/ + +/** + * GPIO registers (PORTD) + */ +/*\{*/ +#define GPIO_PORTD_DATA_BITS_R ((reg32_t *)0x40007000) +#define GPIO_PORTD_DATA_R (*((reg32_t *)0x400073FC)) +#define GPIO_PORTD_DIR_R (*((reg32_t *)0x40007400)) +#define GPIO_PORTD_IS_R (*((reg32_t *)0x40007404)) +#define GPIO_PORTD_IBE_R (*((reg32_t *)0x40007408)) +#define GPIO_PORTD_IEV_R (*((reg32_t *)0x4000740C)) +#define GPIO_PORTD_IM_R (*((reg32_t *)0x40007410)) +#define GPIO_PORTD_RIS_R (*((reg32_t *)0x40007414)) +#define GPIO_PORTD_MIS_R (*((reg32_t *)0x40007418)) +#define GPIO_PORTD_ICR_R (*((reg32_t *)0x4000741C)) +#define GPIO_PORTD_AFSEL_R (*((reg32_t *)0x40007420)) +#define GPIO_PORTD_DR2R_R (*((reg32_t *)0x40007500)) +#define GPIO_PORTD_DR4R_R (*((reg32_t *)0x40007504)) +#define GPIO_PORTD_DR8R_R (*((reg32_t *)0x40007508)) +#define GPIO_PORTD_ODR_R (*((reg32_t *)0x4000750C)) +#define GPIO_PORTD_PUR_R (*((reg32_t *)0x40007510)) +#define GPIO_PORTD_PDR_R (*((reg32_t *)0x40007514)) +#define GPIO_PORTD_SLR_R (*((reg32_t *)0x40007518)) +#define GPIO_PORTD_DEN_R (*((reg32_t *)0x4000751C)) +#define GPIO_PORTD_LOCK_R (*((reg32_t *)0x40007520)) +#define GPIO_PORTD_CR_R (*((reg32_t *)0x40007524)) +/*\}*/ + +/** + * SSI registers (SSI0) + */ +/*\{*/ +#define SSI0_CR0_R (*((reg32_t *)0x40008000)) +#define SSI0_CR1_R (*((reg32_t *)0x40008004)) +#define SSI0_DR_R (*((reg32_t *)0x40008008)) +#define SSI0_SR_R (*((reg32_t *)0x4000800C)) +#define SSI0_CPSR_R (*((reg32_t *)0x40008010)) +#define SSI0_IM_R (*((reg32_t *)0x40008014)) +#define SSI0_RIS_R (*((reg32_t *)0x40008018)) +#define SSI0_MIS_R (*((reg32_t *)0x4000801C)) +#define SSI0_ICR_R (*((reg32_t *)0x40008020)) +/*\}*/ + +/** + * SSI registers (SSI1) + */ +/*\{*/ +#define SSI1_CR0_R (*((reg32_t *)0x40009000)) +#define SSI1_CR1_R (*((reg32_t *)0x40009004)) +#define SSI1_DR_R (*((reg32_t *)0x40009008)) +#define SSI1_SR_R (*((reg32_t *)0x4000900C)) +#define SSI1_CPSR_R (*((reg32_t *)0x40009010)) +#define SSI1_IM_R (*((reg32_t *)0x40009014)) +#define SSI1_RIS_R (*((reg32_t *)0x40009018)) +#define SSI1_MIS_R (*((reg32_t *)0x4000901C)) +#define SSI1_ICR_R (*((reg32_t *)0x40009020)) +/*\}*/ + +/** + * UART registers (UART0) + */ +/*\{*/ +#define UART0_DR_R (*((reg32_t *)0x4000C000)) +#define UART0_RSR_R (*((reg32_t *)0x4000C004)) +#define UART0_ECR_R (*((reg32_t *)0x4000C004)) +#define UART0_FR_R (*((reg32_t *)0x4000C018)) +#define UART0_ILPR_R (*((reg32_t *)0x4000C020)) +#define UART0_IBRD_R (*((reg32_t *)0x4000C024)) +#define UART0_FBRD_R (*((reg32_t *)0x4000C028)) +#define UART0_LCRH_R (*((reg32_t *)0x4000C02C)) +#define UART0_CTL_R (*((reg32_t *)0x4000C030)) +#define UART0_IFLS_R (*((reg32_t *)0x4000C034)) +#define UART0_IM_R (*((reg32_t *)0x4000C038)) +#define UART0_RIS_R (*((reg32_t *)0x4000C03C)) +#define UART0_MIS_R (*((reg32_t *)0x4000C040)) +#define UART0_ICR_R (*((reg32_t *)0x4000C044)) +/*\}*/ + +/** + * UART registers (UART1) + */ +/*\{*/ +#define UART1_DR_R (*((reg32_t *)0x4000D000)) +#define UART1_RSR_R (*((reg32_t *)0x4000D004)) +#define UART1_ECR_R (*((reg32_t *)0x4000D004)) +#define UART1_FR_R (*((reg32_t *)0x4000D018)) +#define UART1_ILPR_R (*((reg32_t *)0x4000D020)) +#define UART1_IBRD_R (*((reg32_t *)0x4000D024)) +#define UART1_FBRD_R (*((reg32_t *)0x4000D028)) +#define UART1_LCRH_R (*((reg32_t *)0x4000D02C)) +#define UART1_CTL_R (*((reg32_t *)0x4000D030)) +#define UART1_IFLS_R (*((reg32_t *)0x4000D034)) +#define UART1_IM_R (*((reg32_t *)0x4000D038)) +#define UART1_RIS_R (*((reg32_t *)0x4000D03C)) +#define UART1_MIS_R (*((reg32_t *)0x4000D040)) +#define UART1_ICR_R (*((reg32_t *)0x4000D044)) +/*\}*/ + +/** + * UART registers (UART2) + */ +/*\{*/ +#define UART2_DR_R (*((reg32_t *)0x4000E000)) +#define UART2_RSR_R (*((reg32_t *)0x4000E004)) +#define UART2_ECR_R (*((reg32_t *)0x4000E004)) +#define UART2_FR_R (*((reg32_t *)0x4000E018)) +#define UART2_ILPR_R (*((reg32_t *)0x4000E020)) +#define UART2_IBRD_R (*((reg32_t *)0x4000E024)) +#define UART2_FBRD_R (*((reg32_t *)0x4000E028)) +#define UART2_LCRH_R (*((reg32_t *)0x4000E02C)) +#define UART2_CTL_R (*((reg32_t *)0x4000E030)) +#define UART2_IFLS_R (*((reg32_t *)0x4000E034)) +#define UART2_IM_R (*((reg32_t *)0x4000E038)) +#define UART2_RIS_R (*((reg32_t *)0x4000E03C)) +#define UART2_MIS_R (*((reg32_t *)0x4000E040)) +#define UART2_ICR_R (*((reg32_t *)0x4000E044)) +/*\}*/ + +/** + * I2C registers (I2C0 MASTER) + */ +/*\{*/ +#define I2C0_MASTER_MSA_R (*((reg32_t *)0x40020000)) +#define I2C0_MASTER_SOAR_R (*((reg32_t *)0x40020000)) +#define I2C0_MASTER_SCSR_R (*((reg32_t *)0x40020004)) +#define I2C0_MASTER_MCS_R (*((reg32_t *)0x40020004)) +#define I2C0_MASTER_SDR_R (*((reg32_t *)0x40020008)) +#define I2C0_MASTER_MDR_R (*((reg32_t *)0x40020008)) +#define I2C0_MASTER_MTPR_R (*((reg32_t *)0x4002000C)) +#define I2C0_MASTER_SIMR_R (*((reg32_t *)0x4002000C)) +#define I2C0_MASTER_SRIS_R (*((reg32_t *)0x40020010)) +#define I2C0_MASTER_MIMR_R (*((reg32_t *)0x40020010)) +#define I2C0_MASTER_MRIS_R (*((reg32_t *)0x40020014)) +#define I2C0_MASTER_SMIS_R (*((reg32_t *)0x40020014)) +#define I2C0_MASTER_SICR_R (*((reg32_t *)0x40020018)) +#define I2C0_MASTER_MMIS_R (*((reg32_t *)0x40020018)) +#define I2C0_MASTER_MICR_R (*((reg32_t *)0x4002001C)) +#define I2C0_MASTER_MCR_R (*((reg32_t *)0x40020020)) +/*\}*/ + +/** + * I2C registers (I2C0 SLAVE) + */ +/*\{*/ +#define I2C0_SLAVE_MSA_R (*((reg32_t *)0x40020800)) +#define I2C0_SLAVE_SOAR_R (*((reg32_t *)0x40020800)) +#define I2C0_SLAVE_SCSR_R (*((reg32_t *)0x40020804)) +#define I2C0_SLAVE_MCS_R (*((reg32_t *)0x40020804)) +#define I2C0_SLAVE_SDR_R (*((reg32_t *)0x40020808)) +#define I2C0_SLAVE_MDR_R (*((reg32_t *)0x40020808)) +#define I2C0_SLAVE_MTPR_R (*((reg32_t *)0x4002080C)) +#define I2C0_SLAVE_SIMR_R (*((reg32_t *)0x4002080C)) +#define I2C0_SLAVE_SRIS_R (*((reg32_t *)0x40020810)) +#define I2C0_SLAVE_MIMR_R (*((reg32_t *)0x40020810)) +#define I2C0_SLAVE_MRIS_R (*((reg32_t *)0x40020814)) +#define I2C0_SLAVE_SMIS_R (*((reg32_t *)0x40020814)) +#define I2C0_SLAVE_SICR_R (*((reg32_t *)0x40020818)) +#define I2C0_SLAVE_MMIS_R (*((reg32_t *)0x40020818)) +#define I2C0_SLAVE_MICR_R (*((reg32_t *)0x4002081C)) +#define I2C0_SLAVE_MCR_R (*((reg32_t *)0x40020820)) +/*\}*/ + +/** + * I2C registers (I2C1 MASTER) + */ +/*\{*/ +#define I2C1_MASTER_MSA_R (*((reg32_t *)0x40021000)) +#define I2C1_MASTER_SOAR_R (*((reg32_t *)0x40021000)) +#define I2C1_MASTER_SCSR_R (*((reg32_t *)0x40021004)) +#define I2C1_MASTER_MCS_R (*((reg32_t *)0x40021004)) +#define I2C1_MASTER_SDR_R (*((reg32_t *)0x40021008)) +#define I2C1_MASTER_MDR_R (*((reg32_t *)0x40021008)) +#define I2C1_MASTER_MTPR_R (*((reg32_t *)0x4002100C)) +#define I2C1_MASTER_SIMR_R (*((reg32_t *)0x4002100C)) +#define I2C1_MASTER_SRIS_R (*((reg32_t *)0x40021010)) +#define I2C1_MASTER_MIMR_R (*((reg32_t *)0x40021010)) +#define I2C1_MASTER_MRIS_R (*((reg32_t *)0x40021014)) +#define I2C1_MASTER_SMIS_R (*((reg32_t *)0x40021014)) +#define I2C1_MASTER_SICR_R (*((reg32_t *)0x40021018)) +#define I2C1_MASTER_MMIS_R (*((reg32_t *)0x40021018)) +#define I2C1_MASTER_MICR_R (*((reg32_t *)0x4002101C)) +#define I2C1_MASTER_MCR_R (*((reg32_t *)0x40021020)) +/*\}*/ + +/** + * I2C registers (I2C1 SLAVE) + */ +/*\{*/ +#define I2C1_SLAVE_MSA_R (*((reg32_t *)0x40021800)) +#define I2C1_SLAVE_SOAR_R (*((reg32_t *)0x40021800)) +#define I2C1_SLAVE_SCSR_R (*((reg32_t *)0x40021804)) +#define I2C1_SLAVE_MCS_R (*((reg32_t *)0x40021804)) +#define I2C1_SLAVE_SDR_R (*((reg32_t *)0x40021808)) +#define I2C1_SLAVE_MDR_R (*((reg32_t *)0x40021808)) +#define I2C1_SLAVE_MTPR_R (*((reg32_t *)0x4002180C)) +#define I2C1_SLAVE_SIMR_R (*((reg32_t *)0x4002180C)) +#define I2C1_SLAVE_SRIS_R (*((reg32_t *)0x40021810)) +#define I2C1_SLAVE_MIMR_R (*((reg32_t *)0x40021810)) +#define I2C1_SLAVE_MRIS_R (*((reg32_t *)0x40021814)) +#define I2C1_SLAVE_SMIS_R (*((reg32_t *)0x40021814)) +#define I2C1_SLAVE_SICR_R (*((reg32_t *)0x40021818)) +#define I2C1_SLAVE_MMIS_R (*((reg32_t *)0x40021818)) +#define I2C1_SLAVE_MICR_R (*((reg32_t *)0x4002181C)) +#define I2C1_SLAVE_MCR_R (*((reg32_t *)0x40021820)) +/*\}*/ + +/** + * GPIO registers (PORTE) + */ +/*\{*/ +#define GPIO_PORTE_DATA_BITS_R ((reg32_t *)0x40024000) +#define GPIO_PORTE_DATA_R (*((reg32_t *)0x400243FC)) +#define GPIO_PORTE_DIR_R (*((reg32_t *)0x40024400)) +#define GPIO_PORTE_IS_R (*((reg32_t *)0x40024404)) +#define GPIO_PORTE_IBE_R (*((reg32_t *)0x40024408)) +#define GPIO_PORTE_IEV_R (*((reg32_t *)0x4002440C)) +#define GPIO_PORTE_IM_R (*((reg32_t *)0x40024410)) +#define GPIO_PORTE_RIS_R (*((reg32_t *)0x40024414)) +#define GPIO_PORTE_MIS_R (*((reg32_t *)0x40024418)) +#define GPIO_PORTE_ICR_R (*((reg32_t *)0x4002441C)) +#define GPIO_PORTE_AFSEL_R (*((reg32_t *)0x40024420)) +#define GPIO_PORTE_DR2R_R (*((reg32_t *)0x40024500)) +#define GPIO_PORTE_DR4R_R (*((reg32_t *)0x40024504)) +#define GPIO_PORTE_DR8R_R (*((reg32_t *)0x40024508)) +#define GPIO_PORTE_ODR_R (*((reg32_t *)0x4002450C)) +#define GPIO_PORTE_PUR_R (*((reg32_t *)0x40024510)) +#define GPIO_PORTE_PDR_R (*((reg32_t *)0x40024514)) +#define GPIO_PORTE_SLR_R (*((reg32_t *)0x40024518)) +#define GPIO_PORTE_DEN_R (*((reg32_t *)0x4002451C)) +#define GPIO_PORTE_LOCK_R (*((reg32_t *)0x40024520)) +#define GPIO_PORTE_CR_R (*((reg32_t *)0x40024524)) +/*\}*/ + +/** + * GPIO registers (PORTF) + */ +/*\{*/ +#define GPIO_PORTF_DATA_BITS_R ((reg32_t *)0x40025000) +#define GPIO_PORTF_DATA_R (*((reg32_t *)0x400253FC)) +#define GPIO_PORTF_DIR_R (*((reg32_t *)0x40025400)) +#define GPIO_PORTF_IS_R (*((reg32_t *)0x40025404)) +#define GPIO_PORTF_IBE_R (*((reg32_t *)0x40025408)) +#define GPIO_PORTF_IEV_R (*((reg32_t *)0x4002540C)) +#define GPIO_PORTF_IM_R (*((reg32_t *)0x40025410)) +#define GPIO_PORTF_RIS_R (*((reg32_t *)0x40025414)) +#define GPIO_PORTF_MIS_R (*((reg32_t *)0x40025418)) +#define GPIO_PORTF_ICR_R (*((reg32_t *)0x4002541C)) +#define GPIO_PORTF_AFSEL_R (*((reg32_t *)0x40025420)) +#define GPIO_PORTF_DR2R_R (*((reg32_t *)0x40025500)) +#define GPIO_PORTF_DR4R_R (*((reg32_t *)0x40025504)) +#define GPIO_PORTF_DR8R_R (*((reg32_t *)0x40025508)) +#define GPIO_PORTF_ODR_R (*((reg32_t *)0x4002550C)) +#define GPIO_PORTF_PUR_R (*((reg32_t *)0x40025510)) +#define GPIO_PORTF_PDR_R (*((reg32_t *)0x40025514)) +#define GPIO_PORTF_SLR_R (*((reg32_t *)0x40025518)) +#define GPIO_PORTF_DEN_R (*((reg32_t *)0x4002551C)) +#define GPIO_PORTF_LOCK_R (*((reg32_t *)0x40025520)) +#define GPIO_PORTF_CR_R (*((reg32_t *)0x40025524)) +/*\}*/ + +/** + * GPIO registers (PORTG) + */ +/*\{*/ +#define GPIO_PORTG_DATA_BITS_R ((reg32_t *)0x40026000) +#define GPIO_PORTG_DATA_R (*((reg32_t *)0x400263FC)) +#define GPIO_PORTG_DIR_R (*((reg32_t *)0x40026400)) +#define GPIO_PORTG_IS_R (*((reg32_t *)0x40026404)) +#define GPIO_PORTG_IBE_R (*((reg32_t *)0x40026408)) +#define GPIO_PORTG_IEV_R (*((reg32_t *)0x4002640C)) +#define GPIO_PORTG_IM_R (*((reg32_t *)0x40026410)) +#define GPIO_PORTG_RIS_R (*((reg32_t *)0x40026414)) +#define GPIO_PORTG_MIS_R (*((reg32_t *)0x40026418)) +#define GPIO_PORTG_ICR_R (*((reg32_t *)0x4002641C)) +#define GPIO_PORTG_AFSEL_R (*((reg32_t *)0x40026420)) +#define GPIO_PORTG_DR2R_R (*((reg32_t *)0x40026500)) +#define GPIO_PORTG_DR4R_R (*((reg32_t *)0x40026504)) +#define GPIO_PORTG_DR8R_R (*((reg32_t *)0x40026508)) +#define GPIO_PORTG_ODR_R (*((reg32_t *)0x4002650C)) +#define GPIO_PORTG_PUR_R (*((reg32_t *)0x40026510)) +#define GPIO_PORTG_PDR_R (*((reg32_t *)0x40026514)) +#define GPIO_PORTG_SLR_R (*((reg32_t *)0x40026518)) +#define GPIO_PORTG_DEN_R (*((reg32_t *)0x4002651C)) +#define GPIO_PORTG_LOCK_R (*((reg32_t *)0x40026520)) +#define GPIO_PORTG_CR_R (*((reg32_t *)0x40026524)) +/*\}*/ + +/** + * GPIO registers (PORTH) + */ +/*\{*/ +#define GPIO_PORTH_DATA_BITS_R ((reg32_t *)0x40027000) +#define GPIO_PORTH_DATA_R (*((reg32_t *)0x400273FC)) +#define GPIO_PORTH_DIR_R (*((reg32_t *)0x40027400)) +#define GPIO_PORTH_IS_R (*((reg32_t *)0x40027404)) +#define GPIO_PORTH_IBE_R (*((reg32_t *)0x40027408)) +#define GPIO_PORTH_IEV_R (*((reg32_t *)0x4002740C)) +#define GPIO_PORTH_IM_R (*((reg32_t *)0x40027410)) +#define GPIO_PORTH_RIS_R (*((reg32_t *)0x40027414)) +#define GPIO_PORTH_MIS_R (*((reg32_t *)0x40027418)) +#define GPIO_PORTH_ICR_R (*((reg32_t *)0x4002741C)) +#define GPIO_PORTH_AFSEL_R (*((reg32_t *)0x40027420)) +#define GPIO_PORTH_DR2R_R (*((reg32_t *)0x40027500)) +#define GPIO_PORTH_DR4R_R (*((reg32_t *)0x40027504)) +#define GPIO_PORTH_DR8R_R (*((reg32_t *)0x40027508)) +#define GPIO_PORTH_ODR_R (*((reg32_t *)0x4002750C)) +#define GPIO_PORTH_PUR_R (*((reg32_t *)0x40027510)) +#define GPIO_PORTH_PDR_R (*((reg32_t *)0x40027514)) +#define GPIO_PORTH_SLR_R (*((reg32_t *)0x40027518)) +#define GPIO_PORTH_DEN_R (*((reg32_t *)0x4002751C)) +#define GPIO_PORTH_LOCK_R (*((reg32_t *)0x40027520)) +#define GPIO_PORTH_CR_R (*((reg32_t *)0x40027524)) +/*\}*/ + +/** + * PWM registers (PWM) + */ +/*\{*/ +#define PWM_CTL_R (*((reg32_t *)0x40028000)) +#define PWM_SYNC_R (*((reg32_t *)0x40028004)) +#define PWM_ENABLE_R (*((reg32_t *)0x40028008)) +#define PWM_INVERT_R (*((reg32_t *)0x4002800C)) +#define PWM_FAULT_R (*((reg32_t *)0x40028010)) +#define PWM_INTEN_R (*((reg32_t *)0x40028014)) +#define PWM_RIS_R (*((reg32_t *)0x40028018)) +#define PWM_ISC_R (*((reg32_t *)0x4002801C)) +#define PWM_STATUS_R (*((reg32_t *)0x40028020)) +#define PWM_0_CTL_R (*((reg32_t *)0x40028040)) +#define PWM_0_INTEN_R (*((reg32_t *)0x40028044)) +#define PWM_0_RIS_R (*((reg32_t *)0x40028048)) +#define PWM_0_ISC_R (*((reg32_t *)0x4002804C)) +#define PWM_0_LOAD_R (*((reg32_t *)0x40028050)) +#define PWM_0_COUNT_R (*((reg32_t *)0x40028054)) +#define PWM_0_CMPA_R (*((reg32_t *)0x40028058)) +#define PWM_0_CMPB_R (*((reg32_t *)0x4002805C)) +#define PWM_0_GENA_R (*((reg32_t *)0x40028060)) +#define PWM_0_GENB_R (*((reg32_t *)0x40028064)) +#define PWM_0_DBCTL_R (*((reg32_t *)0x40028068)) +#define PWM_0_DBRISE_R (*((reg32_t *)0x4002806C)) +#define PWM_0_DBFALL_R (*((reg32_t *)0x40028070)) +#define PWM_1_CTL_R (*((reg32_t *)0x40028080)) +#define PWM_1_INTEN_R (*((reg32_t *)0x40028084)) +#define PWM_1_RIS_R (*((reg32_t *)0x40028088)) +#define PWM_1_ISC_R (*((reg32_t *)0x4002808C)) +#define PWM_1_LOAD_R (*((reg32_t *)0x40028090)) +#define PWM_1_COUNT_R (*((reg32_t *)0x40028094)) +#define PWM_1_CMPA_R (*((reg32_t *)0x40028098)) +#define PWM_1_CMPB_R (*((reg32_t *)0x4002809C)) +#define PWM_1_GENA_R (*((reg32_t *)0x400280A0)) +#define PWM_1_GENB_R (*((reg32_t *)0x400280A4)) +#define PWM_1_DBCTL_R (*((reg32_t *)0x400280A8)) +#define PWM_1_DBRISE_R (*((reg32_t *)0x400280AC)) +#define PWM_1_DBFALL_R (*((reg32_t *)0x400280B0)) +#define PWM_2_CTL_R (*((reg32_t *)0x400280C0)) +#define PWM_2_INTEN_R (*((reg32_t *)0x400280C4)) +#define PWM_2_RIS_R (*((reg32_t *)0x400280C8)) +#define PWM_2_ISC_R (*((reg32_t *)0x400280CC)) +#define PWM_2_LOAD_R (*((reg32_t *)0x400280D0)) +#define PWM_2_COUNT_R (*((reg32_t *)0x400280D4)) +#define PWM_2_CMPA_R (*((reg32_t *)0x400280D8)) +#define PWM_2_CMPB_R (*((reg32_t *)0x400280DC)) +#define PWM_2_GENA_R (*((reg32_t *)0x400280E0)) +#define PWM_2_GENB_R (*((reg32_t *)0x400280E4)) +#define PWM_2_DBCTL_R (*((reg32_t *)0x400280E8)) +#define PWM_2_DBRISE_R (*((reg32_t *)0x400280EC)) +#define PWM_2_DBFALL_R (*((reg32_t *)0x400280F0)) +/*\}*/ + +/** + * QEI registers (QEI0) + */ +/*\{*/ +#define QEI0_CTL_R (*((reg32_t *)0x4002C000)) +#define QEI0_STAT_R (*((reg32_t *)0x4002C004)) +#define QEI0_POS_R (*((reg32_t *)0x4002C008)) +#define QEI0_MAXPOS_R (*((reg32_t *)0x4002C00C)) +#define QEI0_LOAD_R (*((reg32_t *)0x4002C010)) +#define QEI0_TIME_R (*((reg32_t *)0x4002C014)) +#define QEI0_COUNT_R (*((reg32_t *)0x4002C018)) +#define QEI0_SPEED_R (*((reg32_t *)0x4002C01C)) +#define QEI0_INTEN_R (*((reg32_t *)0x4002C020)) +#define QEI0_RIS_R (*((reg32_t *)0x4002C024)) +#define QEI0_ISC_R (*((reg32_t *)0x4002C028)) +/*\}*/ + +/** + * QEI registers (QEI1) + */ +/*\{*/ +#define QEI1_CTL_R (*((reg32_t *)0x4002D000)) +#define QEI1_STAT_R (*((reg32_t *)0x4002D004)) +#define QEI1_POS_R (*((reg32_t *)0x4002D008)) +#define QEI1_MAXPOS_R (*((reg32_t *)0x4002D00C)) +#define QEI1_LOAD_R (*((reg32_t *)0x4002D010)) +#define QEI1_TIME_R (*((reg32_t *)0x4002D014)) +#define QEI1_COUNT_R (*((reg32_t *)0x4002D018)) +#define QEI1_SPEED_R (*((reg32_t *)0x4002D01C)) +#define QEI1_INTEN_R (*((reg32_t *)0x4002D020)) +#define QEI1_RIS_R (*((reg32_t *)0x4002D024)) +#define QEI1_ISC_R (*((reg32_t *)0x4002D028)) +/*\}*/ + +/** + * Timer registers (TIMER0) + */ +/*\{*/ +#define TIMER0_CFG_R (*((reg32_t *)0x40030000)) +#define TIMER0_TAMR_R (*((reg32_t *)0x40030004)) +#define TIMER0_TBMR_R (*((reg32_t *)0x40030008)) +#define TIMER0_CTL_R (*((reg32_t *)0x4003000C)) +#define TIMER0_IMR_R (*((reg32_t *)0x40030018)) +#define TIMER0_RIS_R (*((reg32_t *)0x4003001C)) +#define TIMER0_MIS_R (*((reg32_t *)0x40030020)) +#define TIMER0_ICR_R (*((reg32_t *)0x40030024)) +#define TIMER0_TAILR_R (*((reg32_t *)0x40030028)) +#define TIMER0_TBILR_R (*((reg32_t *)0x4003002C)) +#define TIMER0_TAMATCHR_R (*((reg32_t *)0x40030030)) +#define TIMER0_TBMATCHR_R (*((reg32_t *)0x40030034)) +#define TIMER0_TAPR_R (*((reg32_t *)0x40030038)) +#define TIMER0_TBPR_R (*((reg32_t *)0x4003003C)) +#define TIMER0_TAPMR_R (*((reg32_t *)0x40030040)) +#define TIMER0_TBPMR_R (*((reg32_t *)0x40030044)) +#define TIMER0_TAR_R (*((reg32_t *)0x40030048)) +#define TIMER0_TBR_R (*((reg32_t *)0x4003004C)) +/*\}*/ + +/** + * Timer registers (TIMER1) + */ +/*\{*/ +#define TIMER1_CFG_R (*((reg32_t *)0x40031000)) +#define TIMER1_TAMR_R (*((reg32_t *)0x40031004)) +#define TIMER1_TBMR_R (*((reg32_t *)0x40031008)) +#define TIMER1_CTL_R (*((reg32_t *)0x4003100C)) +#define TIMER1_IMR_R (*((reg32_t *)0x40031018)) +#define TIMER1_RIS_R (*((reg32_t *)0x4003101C)) +#define TIMER1_MIS_R (*((reg32_t *)0x40031020)) +#define TIMER1_ICR_R (*((reg32_t *)0x40031024)) +#define TIMER1_TAILR_R (*((reg32_t *)0x40031028)) +#define TIMER1_TBILR_R (*((reg32_t *)0x4003102C)) +#define TIMER1_TAMATCHR_R (*((reg32_t *)0x40031030)) +#define TIMER1_TBMATCHR_R (*((reg32_t *)0x40031034)) +#define TIMER1_TAPR_R (*((reg32_t *)0x40031038)) +#define TIMER1_TBPR_R (*((reg32_t *)0x4003103C)) +#define TIMER1_TAPMR_R (*((reg32_t *)0x40031040)) +#define TIMER1_TBPMR_R (*((reg32_t *)0x40031044)) +#define TIMER1_TAR_R (*((reg32_t *)0x40031048)) +#define TIMER1_TBR_R (*((reg32_t *)0x4003104C)) +/*\}*/ + +/** + * Timer registers (TIMER2) + */ +/*\{*/ +#define TIMER2_CFG_R (*((reg32_t *)0x40032000)) +#define TIMER2_TAMR_R (*((reg32_t *)0x40032004)) +#define TIMER2_TBMR_R (*((reg32_t *)0x40032008)) +#define TIMER2_CTL_R (*((reg32_t *)0x4003200C)) +#define TIMER2_IMR_R (*((reg32_t *)0x40032018)) +#define TIMER2_RIS_R (*((reg32_t *)0x4003201C)) +#define TIMER2_MIS_R (*((reg32_t *)0x40032020)) +#define TIMER2_ICR_R (*((reg32_t *)0x40032024)) +#define TIMER2_TAILR_R (*((reg32_t *)0x40032028)) +#define TIMER2_TBILR_R (*((reg32_t *)0x4003202C)) +#define TIMER2_TAMATCHR_R (*((reg32_t *)0x40032030)) +#define TIMER2_TBMATCHR_R (*((reg32_t *)0x40032034)) +#define TIMER2_TAPR_R (*((reg32_t *)0x40032038)) +#define TIMER2_TBPR_R (*((reg32_t *)0x4003203C)) +#define TIMER2_TAPMR_R (*((reg32_t *)0x40032040)) +#define TIMER2_TBPMR_R (*((reg32_t *)0x40032044)) +#define TIMER2_TAR_R (*((reg32_t *)0x40032048)) +#define TIMER2_TBR_R (*((reg32_t *)0x4003204C)) +/*\}*/ + +/** + * Timer registers (TIMER3) + */ +/*\{*/ +#define TIMER3_CFG_R (*((reg32_t *)0x40033000)) +#define TIMER3_TAMR_R (*((reg32_t *)0x40033004)) +#define TIMER3_TBMR_R (*((reg32_t *)0x40033008)) +#define TIMER3_CTL_R (*((reg32_t *)0x4003300C)) +#define TIMER3_IMR_R (*((reg32_t *)0x40033018)) +#define TIMER3_RIS_R (*((reg32_t *)0x4003301C)) +#define TIMER3_MIS_R (*((reg32_t *)0x40033020)) +#define TIMER3_ICR_R (*((reg32_t *)0x40033024)) +#define TIMER3_TAILR_R (*((reg32_t *)0x40033028)) +#define TIMER3_TBILR_R (*((reg32_t *)0x4003302C)) +#define TIMER3_TAMATCHR_R (*((reg32_t *)0x40033030)) +#define TIMER3_TBMATCHR_R (*((reg32_t *)0x40033034)) +#define TIMER3_TAPR_R (*((reg32_t *)0x40033038)) +#define TIMER3_TBPR_R (*((reg32_t *)0x4003303C)) +#define TIMER3_TAPMR_R (*((reg32_t *)0x40033040)) +#define TIMER3_TBPMR_R (*((reg32_t *)0x40033044)) +#define TIMER3_TAR_R (*((reg32_t *)0x40033048)) +#define TIMER3_TBR_R (*((reg32_t *)0x4003304C)) +/*\}*/ + +/** + * ADC registers (ADC0) + */ +/*\{*/ +#define ADC0_ACTSS_R (*((reg32_t *)0x40038000)) +#define ADC0_RIS_R (*((reg32_t *)0x40038004)) +#define ADC0_IM_R (*((reg32_t *)0x40038008)) +#define ADC0_ISC_R (*((reg32_t *)0x4003800C)) +#define ADC0_OSTAT_R (*((reg32_t *)0x40038010)) +#define ADC0_EMUX_R (*((reg32_t *)0x40038014)) +#define ADC0_USTAT_R (*((reg32_t *)0x40038018)) +#define ADC0_SSPRI_R (*((reg32_t *)0x40038020)) +#define ADC0_PSSI_R (*((reg32_t *)0x40038028)) +#define ADC0_SAC_R (*((reg32_t *)0x40038030)) +#define ADC0_SSMUX0_R (*((reg32_t *)0x40038040)) +#define ADC0_SSCTL0_R (*((reg32_t *)0x40038044)) +#define ADC0_SSFIFO0_R (*((reg32_t *)0x40038048)) +#define ADC0_SSFSTAT0_R (*((reg32_t *)0x4003804C)) +#define ADC0_SSMUX1_R (*((reg32_t *)0x40038060)) +#define ADC0_SSCTL1_R (*((reg32_t *)0x40038064)) +#define ADC0_SSFIFO1_R (*((reg32_t *)0x40038068)) +#define ADC0_SSFSTAT1_R (*((reg32_t *)0x4003806C)) +#define ADC0_SSMUX2_R (*((reg32_t *)0x40038080)) +#define ADC0_SSCTL2_R (*((reg32_t *)0x40038084)) +#define ADC0_SSFIFO2_R (*((reg32_t *)0x40038088)) +#define ADC0_SSFSTAT2_R (*((reg32_t *)0x4003808C)) +#define ADC0_SSMUX3_R (*((reg32_t *)0x400380A0)) +#define ADC0_SSCTL3_R (*((reg32_t *)0x400380A4)) +#define ADC0_SSFIFO3_R (*((reg32_t *)0x400380A8)) +#define ADC0_SSFSTAT3_R (*((reg32_t *)0x400380AC)) +#define ADC0_TMLB_R (*((reg32_t *)0x40038100)) +/*\}*/ + +/** + * Comparator registers (COMP) + */ +/*\{*/ +#define COMP_ACMIS_R (*((reg32_t *)0x4003C000)) +#define COMP_ACRIS_R (*((reg32_t *)0x4003C004)) +#define COMP_ACINTEN_R (*((reg32_t *)0x4003C008)) +#define COMP_ACREFCTL_R (*((reg32_t *)0x4003C010)) +#define COMP_ACSTAT0_R (*((reg32_t *)0x4003C020)) +#define COMP_ACCTL0_R (*((reg32_t *)0x4003C024)) +#define COMP_ACSTAT1_R (*((reg32_t *)0x4003C040)) +#define COMP_ACCTL1_R (*((reg32_t *)0x4003C044)) +#define COMP_ACSTAT2_R (*((reg32_t *)0x4003C060)) +#define COMP_ACCTL2_R (*((reg32_t *)0x4003C064)) +/*\}*/ + +/** + * Hibernation module registers (HIB) + */ +/*\{*/ +#define HIB_RTCC_R (*((reg32_t *)0x400FC000)) +#define HIB_RTCM0_R (*((reg32_t *)0x400FC004)) +#define HIB_RTCM1_R (*((reg32_t *)0x400FC008)) +#define HIB_RTCLD_R (*((reg32_t *)0x400FC00C)) +#define HIB_CTL_R (*((reg32_t *)0x400FC010)) +#define HIB_IM_R (*((reg32_t *)0x400FC014)) +#define HIB_RIS_R (*((reg32_t *)0x400FC018)) +#define HIB_MIS_R (*((reg32_t *)0x400FC01C)) +#define HIB_IC_R (*((reg32_t *)0x400FC020)) +#define HIB_RTCT_R (*((reg32_t *)0x400FC024)) +#define HIB_DATA_R (*((reg32_t *)0x400FC030)) +/*\}*/ + +/** + * FLASH registers (FLASH CTRL) + */ +/*\{*/ +#define FLASH_FMA_R (*((reg32_t *)0x400FD000)) +#define FLASH_FMD_R (*((reg32_t *)0x400FD004)) +#define FLASH_FMC_R (*((reg32_t *)0x400FD008)) +#define FLASH_FCRIS_R (*((reg32_t *)0x400FD00C)) +#define FLASH_FCIM_R (*((reg32_t *)0x400FD010)) +#define FLASH_FCMISC_R (*((reg32_t *)0x400FD014)) +#define FLASH_USECRL_R (*((reg32_t *)0x400FE140)) +#define FLASH_USERDBG_R (*((reg32_t *)0x400FE1D0)) +#define FLASH_USERREG0_R (*((reg32_t *)0x400FE1E0)) +#define FLASH_USERREG1_R (*((reg32_t *)0x400FE1E4)) +#define FLASH_FMPRE0_R (*((reg32_t *)0x400FE200)) +#define FLASH_FMPRE1_R (*((reg32_t *)0x400FE204)) +#define FLASH_FMPRE2_R (*((reg32_t *)0x400FE208)) +#define FLASH_FMPRE3_R (*((reg32_t *)0x400FE20C)) +#define FLASH_FMPPE0_R (*((reg32_t *)0x400FE400)) +#define FLASH_FMPPE1_R (*((reg32_t *)0x400FE404)) +#define FLASH_FMPPE2_R (*((reg32_t *)0x400FE408)) +#define FLASH_FMPPE3_R (*((reg32_t *)0x400FE40C)) +/*\}*/ + +/** + * System Control registers (SYSCTL) + */ +/*\{*/ +#define SYSCTL_DID0_R (*((reg32_t *)0x400FE000)) +#define SYSCTL_DID1_R (*((reg32_t *)0x400FE004)) +#define SYSCTL_DC0_R (*((reg32_t *)0x400FE008)) +#define SYSCTL_DC1_R (*((reg32_t *)0x400FE010)) +#define SYSCTL_DC2_R (*((reg32_t *)0x400FE014)) +#define SYSCTL_DC3_R (*((reg32_t *)0x400FE018)) +#define SYSCTL_DC4_R (*((reg32_t *)0x400FE01C)) +#define SYSCTL_PBORCTL_R (*((reg32_t *)0x400FE030)) +#define SYSCTL_LDOPCTL_R (*((reg32_t *)0x400FE034)) +#define SYSCTL_SRCR0_R (*((reg32_t *)0x400FE040)) +#define SYSCTL_SRCR1_R (*((reg32_t *)0x400FE044)) +#define SYSCTL_SRCR2_R (*((reg32_t *)0x400FE048)) +#define SYSCTL_RIS_R (*((reg32_t *)0x400FE050)) +#define SYSCTL_IMC_R (*((reg32_t *)0x400FE054)) +#define SYSCTL_MISC_R (*((reg32_t *)0x400FE058)) +#define SYSCTL_RESC_R (*((reg32_t *)0x400FE05C)) +#define SYSCTL_RCC_R (*((reg32_t *)0x400FE060)) +#define SYSCTL_PLLCFG_R (*((reg32_t *)0x400FE064)) +#define SYSCTL_RCC2_R (*((reg32_t *)0x400FE070)) +#define SYSCTL_RCGC0_R (*((reg32_t *)0x400FE100)) +#define SYSCTL_RCGC1_R (*((reg32_t *)0x400FE104)) +#define SYSCTL_RCGC2_R (*((reg32_t *)0x400FE108)) +#define SYSCTL_SCGC0_R (*((reg32_t *)0x400FE110)) +#define SYSCTL_SCGC1_R (*((reg32_t *)0x400FE114)) +#define SYSCTL_SCGC2_R (*((reg32_t *)0x400FE118)) +#define SYSCTL_DCGC0_R (*((reg32_t *)0x400FE120)) +#define SYSCTL_DCGC1_R (*((reg32_t *)0x400FE124)) +#define SYSCTL_DCGC2_R (*((reg32_t *)0x400FE128)) +#define SYSCTL_DSLPCLKCFG_R (*((reg32_t *)0x400FE144)) +/*\}*/ + +/** + * NVIC registers (NVIC) + */ +/*\{*/ +#define NVIC_INT_TYPE_R (*((reg32_t *)0xE000E004)) +#define NVIC_ST_CTRL_R (*((reg32_t *)0xE000E010)) +#define NVIC_ST_RELOAD_R (*((reg32_t *)0xE000E014)) +#define NVIC_ST_CURRENT_R (*((reg32_t *)0xE000E018)) +#define NVIC_ST_CAL_R (*((reg32_t *)0xE000E01C)) +#define NVIC_EN0_R (*((reg32_t *)0xE000E100)) +#define NVIC_EN1_R (*((reg32_t *)0xE000E104)) +#define NVIC_DIS0_R (*((reg32_t *)0xE000E180)) +#define NVIC_DIS1_R (*((reg32_t *)0xE000E184)) +#define NVIC_PEND0_R (*((reg32_t *)0xE000E200)) +#define NVIC_PEND1_R (*((reg32_t *)0xE000E204)) +#define NVIC_UNPEND0_R (*((reg32_t *)0xE000E280)) +#define NVIC_UNPEND1_R (*((reg32_t *)0xE000E284)) +#define NVIC_ACTIVE0_R (*((reg32_t *)0xE000E300)) +#define NVIC_ACTIVE1_R (*((reg32_t *)0xE000E304)) +#define NVIC_PRI0_R (*((reg32_t *)0xE000E400)) +#define NVIC_PRI1_R (*((reg32_t *)0xE000E404)) +#define NVIC_PRI2_R (*((reg32_t *)0xE000E408)) +#define NVIC_PRI3_R (*((reg32_t *)0xE000E40C)) +#define NVIC_PRI4_R (*((reg32_t *)0xE000E410)) +#define NVIC_PRI5_R (*((reg32_t *)0xE000E414)) +#define NVIC_PRI6_R (*((reg32_t *)0xE000E418)) +#define NVIC_PRI7_R (*((reg32_t *)0xE000E41C)) +#define NVIC_PRI8_R (*((reg32_t *)0xE000E420)) +#define NVIC_PRI9_R (*((reg32_t *)0xE000E424)) +#define NVIC_PRI10_R (*((reg32_t *)0xE000E428)) +#define NVIC_CPUID_R (*((reg32_t *)0xE000ED00)) +#define NVIC_INT_CTRL_R (*((reg32_t *)0xE000ED04)) +#define NVIC_VTABLE_R (*((reg32_t *)0xE000ED08)) +#define NVIC_APINT_R (*((reg32_t *)0xE000ED0C)) +#define NVIC_SYS_CTRL_R (*((reg32_t *)0xE000ED10)) +#define NVIC_CFG_CTRL_R (*((reg32_t *)0xE000ED14)) +#define NVIC_SYS_PRI1_R (*((reg32_t *)0xE000ED18)) +#define NVIC_SYS_PRI2_R (*((reg32_t *)0xE000ED1C)) +#define NVIC_SYS_PRI3_R (*((reg32_t *)0xE000ED20)) +#define NVIC_SYS_HND_CTRL_R (*((reg32_t *)0xE000ED24)) +#define NVIC_FAULT_STAT_R (*((reg32_t *)0xE000ED28)) +#define NVIC_HFAULT_STAT_R (*((reg32_t *)0xE000ED2C)) +#define NVIC_DEBUG_STAT_R (*((reg32_t *)0xE000ED30)) +#define NVIC_MM_ADDR_R (*((reg32_t *)0xE000ED34)) +#define NVIC_FAULT_ADDR_R (*((reg32_t *)0xE000ED38)) +#define NVIC_MPU_TYPE_R (*((reg32_t *)0xE000ED90)) +#define NVIC_MPU_CTRL_R (*((reg32_t *)0xE000ED94)) +#define NVIC_MPU_NUMBER_R (*((reg32_t *)0xE000ED98)) +#define NVIC_MPU_BASE_R (*((reg32_t *)0xE000ED9C)) +#define NVIC_MPU_ATTR_R (*((reg32_t *)0xE000EDA0)) +#define NVIC_DBG_CTRL_R (*((reg32_t *)0xE000EDF0)) +#define NVIC_DBG_XFER_R (*((reg32_t *)0xE000EDF4)) +#define NVIC_DBG_DATA_R (*((reg32_t *)0xE000EDF8)) +#define NVIC_DBG_INT_R (*((reg32_t *)0xE000EDFC)) +#define NVIC_SW_TRIG_R (*((reg32_t *)0xE000EF00)) +/*\}*/ + +/** + * The following are defines for the bit fields in the WDT_O_LOAD register. + */ +/*\{*/ +#define WDT_LOAD_M 0xFFFFFFFF ///< Watchdog Load Value +#define WDT_LOAD_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the WDT_O_VALUE register. + */ +/*\{*/ +#define WDT_VALUE_M 0xFFFFFFFF ///< Watchdog Value +#define WDT_VALUE_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the WDT_O_CTL register. + */ +/*\{*/ +#define WDT_CTL_RESEN 0x00000002 ///< Watchdog Reset Enable +#define WDT_CTL_INTEN 0x00000001 ///< Watchdog Interrupt Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the WDT_O_ICR register. + */ +/*\{*/ +#define WDT_ICR_M 0xFFFFFFFF ///< Watchdog Interrupt Clear +#define WDT_ICR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the WDT_O_RIS register. + */ +/*\{*/ +#define WDT_RIS_WDTRIS 0x00000001 ///< Watchdog Raw Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the WDT_O_MIS register. + */ +/*\{*/ +#define WDT_MIS_WDTMIS 0x00000001 ///< Watchdog Masked Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the WDT_O_TEST register. + */ +/*\{*/ +#define WDT_TEST_STALL 0x00000100 ///< Watchdog Stall Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the WDT_O_LOCK register. + */ +/*\{*/ +#define WDT_LOCK_M 0xFFFFFFFF ///< Watchdog Lock +#define WDT_LOCK_UNLOCKED 0x00000000 ///< Unlocked +#define WDT_LOCK_LOCKED 0x00000001 ///< Locked +#define WDT_LOCK_UNLOCK 0x1ACCE551 ///< Unlocks the watchdog timer +/*\}*/ + +/** + * The following are defines for the bit fields in the GPIO_O_LOCK register. + */ +/*\{*/ +#define GPIO_LOCK_M 0xFFFFFFFF ///< GPIO Lock +#define GPIO_LOCK_UNLOCKED 0x00000000 ///< The GPIOCR register is unlocked + ///< and may be modified +#define GPIO_LOCK_LOCKED 0x00000001 ///< The GPIOCR register is locked + ///< and may not be modified +#define GPIO_LOCK_KEY 0x1ACCE551 ///< Unlocks the GPIO_CR register +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_CR0 register. + */ +/*\{*/ +#define SSI_CR0_SCR_M 0x0000FF00 ///< SSI Serial Clock Rate +#define SSI_CR0_SPH 0x00000080 ///< SSI Serial Clock Phase +#define SSI_CR0_SPO 0x00000040 ///< SSI Serial Clock Polarity +#define SSI_CR0_FRF_M 0x00000030 ///< SSI Frame Format Select +#define SSI_CR0_FRF_MOTO 0x00000000 ///< Freescale SPI Frame Format +#define SSI_CR0_FRF_TI 0x00000010 ///< Texas Instruments Synchronous + ///< Serial Frame Format +#define SSI_CR0_FRF_NMW 0x00000020 ///< MICROWIRE Frame Format +#define SSI_CR0_DSS_M 0x0000000F ///< SSI Data Size Select +#define SSI_CR0_DSS_4 0x00000003 ///< 4-bit data +#define SSI_CR0_DSS_5 0x00000004 ///< 5-bit data +#define SSI_CR0_DSS_6 0x00000005 ///< 6-bit data +#define SSI_CR0_DSS_7 0x00000006 ///< 7-bit data +#define SSI_CR0_DSS_8 0x00000007 ///< 8-bit data +#define SSI_CR0_DSS_9 0x00000008 ///< 9-bit data +#define SSI_CR0_DSS_10 0x00000009 ///< 10-bit data +#define SSI_CR0_DSS_11 0x0000000A ///< 11-bit data +#define SSI_CR0_DSS_12 0x0000000B ///< 12-bit data +#define SSI_CR0_DSS_13 0x0000000C ///< 13-bit data +#define SSI_CR0_DSS_14 0x0000000D ///< 14-bit data +#define SSI_CR0_DSS_15 0x0000000E ///< 15-bit data +#define SSI_CR0_DSS_16 0x0000000F ///< 16-bit data +#define SSI_CR0_SCR_S 8 +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_CR1 register. + */ +/*\{*/ +#define SSI_CR1_SOD 0x00000008 ///< SSI Slave Mode Output Disable +#define SSI_CR1_MS 0x00000004 ///< SSI Master/Slave Select +#define SSI_CR1_SSE 0x00000002 ///< SSI Synchronous Serial Port + ///< Enable +#define SSI_CR1_LBM 0x00000001 ///< SSI Loopback Mode +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_DR register. + */ +/*\{*/ +#define SSI_DR_DATA_M 0x0000FFFF ///< SSI Receive/Transmit Data +#define SSI_DR_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_SR register. + */ +/*\{*/ +#define SSI_SR_BSY 0x00000010 ///< SSI Busy Bit +#define SSI_SR_RFF 0x00000008 ///< SSI Receive FIFO Full +#define SSI_SR_RNE 0x00000004 ///< SSI Receive FIFO Not Empty +#define SSI_SR_TNF 0x00000002 ///< SSI Transmit FIFO Not Full +#define SSI_SR_TFE 0x00000001 ///< SSI Transmit FIFO Empty +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_CPSR register. + */ +/*\{*/ +#define SSI_CPSR_CPSDVSR_M 0x000000FF ///< SSI Clock Prescale Divisor +#define SSI_CPSR_CPSDVSR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_IM register. + */ +/*\{*/ +#define SSI_IM_TXIM 0x00000008 ///< SSI Transmit FIFO Interrupt Mask +#define SSI_IM_RXIM 0x00000004 ///< SSI Receive FIFO Interrupt Mask +#define SSI_IM_RTIM 0x00000002 ///< SSI Receive Time-Out Interrupt + ///< Mask +#define SSI_IM_RORIM 0x00000001 ///< SSI Receive Overrun Interrupt + ///< Mask +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_RIS register. + */ +/*\{*/ +#define SSI_RIS_TXRIS 0x00000008 ///< SSI Transmit FIFO Raw Interrupt + ///< Status +#define SSI_RIS_RXRIS 0x00000004 ///< SSI Receive FIFO Raw Interrupt + ///< Status +#define SSI_RIS_RTRIS 0x00000002 ///< SSI Receive Time-Out Raw + ///< Interrupt Status +#define SSI_RIS_RORRIS 0x00000001 ///< SSI Receive Overrun Raw + ///< Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_MIS register. + */ +/*\{*/ +#define SSI_MIS_TXMIS 0x00000008 ///< SSI Transmit FIFO Masked + ///< Interrupt Status +#define SSI_MIS_RXMIS 0x00000004 ///< SSI Receive FIFO Masked + ///< Interrupt Status +#define SSI_MIS_RTMIS 0x00000002 ///< SSI Receive Time-Out Masked + ///< Interrupt Status +#define SSI_MIS_RORMIS 0x00000001 ///< SSI Receive Overrun Masked + ///< Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_ICR register. + */ +/*\{*/ +#define SSI_ICR_RTIC 0x00000002 ///< SSI Receive Time-Out Interrupt + ///< Clear +#define SSI_ICR_RORIC 0x00000001 ///< SSI Receive Overrun Interrupt + ///< Clear +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_DR register. + */ +/*\{*/ +#define UART_DR_OE 0x00000800 ///< UART Overrun Error +#define UART_DR_BE 0x00000400 ///< UART Break Error +#define UART_DR_PE 0x00000200 ///< UART Parity Error +#define UART_DR_FE 0x00000100 ///< UART Framing Error +#define UART_DR_DATA_M 0x000000FF ///< Data Transmitted or Received +#define UART_DR_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_RSR register. + */ +/*\{*/ +#define UART_RSR_OE 0x00000008 ///< UART Overrun Error +#define UART_RSR_BE 0x00000004 ///< UART Break Error +#define UART_RSR_PE 0x00000002 ///< UART Parity Error +#define UART_RSR_FE 0x00000001 ///< UART Framing Error +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_ECR register. + */ +/*\{*/ +#define UART_ECR_DATA_M 0x000000FF ///< Error Clear +#define UART_ECR_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_FR register. + */ +/*\{*/ +#define UART_FR_TXFE 0x00000080 ///< UART Transmit FIFO Empty +#define UART_FR_RXFF 0x00000040 ///< UART Receive FIFO Full +#define UART_FR_TXFF 0x00000020 ///< UART Transmit FIFO Full +#define UART_FR_RXFE 0x00000010 ///< UART Receive FIFO Empty +#define UART_FR_BUSY 0x00000008 ///< UART Busy +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_ILPR register. + */ +/*\{*/ +#define UART_ILPR_ILPDVSR_M 0x000000FF ///< IrDA Low-Power Divisor +#define UART_ILPR_ILPDVSR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_IBRD register. + */ +/*\{*/ +#define UART_IBRD_DIVINT_M 0x0000FFFF ///< Integer Baud-Rate Divisor +#define UART_IBRD_DIVINT_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_FBRD register. + */ +/*\{*/ +#define UART_FBRD_DIVFRAC_M 0x0000003F ///< Fractional Baud-Rate Divisor +#define UART_FBRD_DIVFRAC_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_LCRH register. + */ +/*\{*/ +#define UART_LCRH_SPS 0x00000080 ///< UART Stick Parity Select +#define UART_LCRH_WLEN_M 0x00000060 ///< UART Word Length +#define UART_LCRH_WLEN_5 0x00000000 ///< 5 bits (default) +#define UART_LCRH_WLEN_6 0x00000020 ///< 6 bits +#define UART_LCRH_WLEN_7 0x00000040 ///< 7 bits +#define UART_LCRH_WLEN_8 0x00000060 ///< 8 bits +#define UART_LCRH_FEN 0x00000010 ///< UART Enable FIFOs +#define UART_LCRH_STP2 0x00000008 ///< UART Two Stop Bits Select +#define UART_LCRH_EPS 0x00000004 ///< UART Even Parity Select +#define UART_LCRH_PEN 0x00000002 ///< UART Parity Enable +#define UART_LCRH_BRK 0x00000001 ///< UART Send Break +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_CTL register. + */ +/*\{*/ +#define UART_CTL_RXE 0x00000200 ///< UART Receive Enable +#define UART_CTL_TXE 0x00000100 ///< UART Transmit Enable +#define UART_CTL_LBE 0x00000080 ///< UART Loop Back Enable +#define UART_CTL_SIRLP 0x00000004 ///< UART SIR Low-Power Mode +#define UART_CTL_SIREN 0x00000002 ///< UART SIR Enable +#define UART_CTL_UARTEN 0x00000001 ///< UART Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_IFLS register. + */ +/*\{*/ +#define UART_IFLS_RX_M 0x00000038 ///< UART Receive Interrupt FIFO + ///< Level Select +#define UART_IFLS_RX1_8 0x00000000 ///< RX FIFO >= 1/8 full +#define UART_IFLS_RX2_8 0x00000008 ///< RX FIFO >= 1/4 full +#define UART_IFLS_RX4_8 0x00000010 ///< RX FIFO >= 1/2 full (default) +#define UART_IFLS_RX6_8 0x00000018 ///< RX FIFO >= 3/4 full +#define UART_IFLS_RX7_8 0x00000020 ///< RX FIFO >= 7/8 full +#define UART_IFLS_TX_M 0x00000007 ///< UART Transmit Interrupt FIFO + ///< Level Select +#define UART_IFLS_TX1_8 0x00000000 ///< TX FIFO <= 1/8 full +#define UART_IFLS_TX2_8 0x00000001 ///< TX FIFO <= 1/4 full +#define UART_IFLS_TX4_8 0x00000002 ///< TX FIFO <= 1/2 full (default) +#define UART_IFLS_TX6_8 0x00000003 ///< TX FIFO <= 3/4 full +#define UART_IFLS_TX7_8 0x00000004 ///< TX FIFO <= 7/8 full +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_IM register. + */ +/*\{*/ +#define UART_IM_OEIM 0x00000400 ///< UART Overrun Error Interrupt + ///< Mask +#define UART_IM_BEIM 0x00000200 ///< UART Break Error Interrupt Mask +#define UART_IM_PEIM 0x00000100 ///< UART Parity Error Interrupt Mask +#define UART_IM_FEIM 0x00000080 ///< UART Framing Error Interrupt + ///< Mask +#define UART_IM_RTIM 0x00000040 ///< UART Receive Time-Out Interrupt + ///< Mask +#define UART_IM_TXIM 0x00000020 ///< UART Transmit Interrupt Mask +#define UART_IM_RXIM 0x00000010 ///< UART Receive Interrupt Mask +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_RIS register. + */ +/*\{*/ +#define UART_RIS_OERIS 0x00000400 ///< UART Overrun Error Raw Interrupt + ///< Status +#define UART_RIS_BERIS 0x00000200 ///< UART Break Error Raw Interrupt + ///< Status +#define UART_RIS_PERIS 0x00000100 ///< UART Parity Error Raw Interrupt + ///< Status +#define UART_RIS_FERIS 0x00000080 ///< UART Framing Error Raw Interrupt + ///< Status +#define UART_RIS_RTRIS 0x00000040 ///< UART Receive Time-Out Raw + ///< Interrupt Status +#define UART_RIS_TXRIS 0x00000020 ///< UART Transmit Raw Interrupt + ///< Status +#define UART_RIS_RXRIS 0x00000010 ///< UART Receive Raw Interrupt + ///< Status +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_MIS register. + */ +/*\{*/ +#define UART_MIS_OEMIS 0x00000400 ///< UART Overrun Error Masked + ///< Interrupt Status +#define UART_MIS_BEMIS 0x00000200 ///< UART Break Error Masked + ///< Interrupt Status +#define UART_MIS_PEMIS 0x00000100 ///< UART Parity Error Masked + ///< Interrupt Status +#define UART_MIS_FEMIS 0x00000080 ///< UART Framing Error Masked + ///< Interrupt Status +#define UART_MIS_RTMIS 0x00000040 ///< UART Receive Time-Out Masked + ///< Interrupt Status +#define UART_MIS_TXMIS 0x00000020 ///< UART Transmit Masked Interrupt + ///< Status +#define UART_MIS_RXMIS 0x00000010 ///< UART Receive Masked Interrupt + ///< Status +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_ICR register. + */ +/*\{*/ +#define UART_ICR_OEIC 0x00000400 ///< Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x00000200 ///< Break Error Interrupt Clear +#define UART_ICR_PEIC 0x00000100 ///< Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x00000080 ///< Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x00000040 ///< Receive Time-Out Interrupt Clear +#define UART_ICR_TXIC 0x00000020 ///< Transmit Interrupt Clear +#define UART_ICR_RXIC 0x00000010 ///< Receive Interrupt Clear +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_MSA register. + */ +/*\{*/ +#define I2C_MSA_SA_M 0x000000FE ///< I2C Slave Address +#define I2C_MSA_RS 0x00000001 ///< Receive not send +#define I2C_MSA_SA_S 1 +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_SOAR register. + */ +/*\{*/ +#define I2C_SOAR_OAR_M 0x0000007F ///< I2C Slave Own Address +#define I2C_SOAR_OAR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_SCSR register. + */ +/*\{*/ +#define I2C_SCSR_FBR 0x00000004 ///< First Byte Received +#define I2C_SCSR_TREQ 0x00000002 ///< Transmit Request +#define I2C_SCSR_DA 0x00000001 ///< Device Active +#define I2C_SCSR_RREQ 0x00000001 ///< Receive Request +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_MCS register. + */ +/*\{*/ +#define I2C_MCS_BUSBSY 0x00000040 ///< Bus Busy +#define I2C_MCS_IDLE 0x00000020 ///< I2C Idle +#define I2C_MCS_ARBLST 0x00000010 ///< Arbitration Lost +#define I2C_MCS_ACK 0x00000008 ///< Data Acknowledge Enable +#define I2C_MCS_DATACK 0x00000008 ///< Acknowledge Data +#define I2C_MCS_ADRACK 0x00000004 ///< Acknowledge Address +#define I2C_MCS_STOP 0x00000004 ///< Generate STOP +#define I2C_MCS_START 0x00000002 ///< Generate START +#define I2C_MCS_ERROR 0x00000002 ///< Error +#define I2C_MCS_RUN 0x00000001 ///< I2C Master Enable +#define I2C_MCS_BUSY 0x00000001 ///< I2C Busy +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_SDR register. + */ +/*\{*/ +#define I2C_SDR_DATA_M 0x000000FF ///< Data for Transfer +#define I2C_SDR_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_MDR register. + */ +/*\{*/ +#define I2C_MDR_DATA_M 0x000000FF ///< Data Transferred +#define I2C_MDR_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_MTPR register. + */ +/*\{*/ +#define I2C_MTPR_TPR_M 0x000000FF ///< SCL Clock Period +#define I2C_MTPR_TPR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_SIMR register. + */ +/*\{*/ +#define I2C_SIMR_DATAIM 0x00000001 ///< Data Interrupt Mask +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_SRIS register. + */ +/*\{*/ +#define I2C_SRIS_DATARIS 0x00000001 ///< Data Raw Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_MIMR register. + */ +/*\{*/ +#define I2C_MIMR_IM 0x00000001 ///< Interrupt Mask +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_MRIS register. + */ +/*\{*/ +#define I2C_MRIS_RIS 0x00000001 ///< Raw Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_SMIS register. + */ +/*\{*/ +#define I2C_SMIS_DATAMIS 0x00000001 ///< Data Masked Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_SICR register. + */ +/*\{*/ +#define I2C_SICR_DATAIC 0x00000001 ///< Data Interrupt Clear +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_MMIS register. + */ +/*\{*/ +#define I2C_MMIS_MIS 0x00000001 ///< Masked Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_MICR register. + */ +/*\{*/ +#define I2C_MICR_IC 0x00000001 ///< Interrupt Clear +/*\}*/ + +/** + * The following are defines for the bit fields in the I2C_O_MCR register. + */ +/*\{*/ +#define I2C_MCR_SFE 0x00000020 ///< I2C Slave Function Enable +#define I2C_MCR_MFE 0x00000010 ///< I2C Master Function Enable +#define I2C_MCR_LPBK 0x00000001 ///< I2C Loopback +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_CTL register. + */ +/*\{*/ +#define PWM_CTL_GLOBALSYNC2 0x00000004 ///< Update PWM Generator 2 +#define PWM_CTL_GLOBALSYNC1 0x00000002 ///< Update PWM Generator 1 +#define PWM_CTL_GLOBALSYNC0 0x00000001 ///< Update PWM Generator 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_SYNC register. + */ +/*\{*/ +#define PWM_SYNC_SYNC2 0x00000004 ///< Reset Generator 2 Counter +#define PWM_SYNC_SYNC1 0x00000002 ///< Reset Generator 1 Counter +#define PWM_SYNC_SYNC0 0x00000001 ///< Reset Generator 0 Counter +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_ENABLE register. + */ +/*\{*/ +#define PWM_ENABLE_PWM5EN 0x00000020 ///< PWM5 Output Enable +#define PWM_ENABLE_PWM4EN 0x00000010 ///< PWM4 Output Enable +#define PWM_ENABLE_PWM3EN 0x00000008 ///< PWM3 Output Enable +#define PWM_ENABLE_PWM2EN 0x00000004 ///< PWM2 Output Enable +#define PWM_ENABLE_PWM1EN 0x00000002 ///< PWM1 Output Enable +#define PWM_ENABLE_PWM0EN 0x00000001 ///< PWM0 Output Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_INVERT register. + */ +/*\{*/ +#define PWM_INVERT_PWM5INV 0x00000020 ///< Invert PWM5 Signal +#define PWM_INVERT_PWM4INV 0x00000010 ///< Invert PWM4 Signal +#define PWM_INVERT_PWM3INV 0x00000008 ///< Invert PWM3 Signal +#define PWM_INVERT_PWM2INV 0x00000004 ///< Invert PWM2 Signal +#define PWM_INVERT_PWM1INV 0x00000002 ///< Invert PWM1 Signal +#define PWM_INVERT_PWM0INV 0x00000001 ///< Invert PWM0 Signal +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_FAULT register. + */ +/*\{*/ +#define PWM_FAULT_FAULT5 0x00000020 ///< PWM5 Fault +#define PWM_FAULT_FAULT4 0x00000010 ///< PWM4 Fault +#define PWM_FAULT_FAULT3 0x00000008 ///< PWM3 Fault +#define PWM_FAULT_FAULT2 0x00000004 ///< PWM2 Fault +#define PWM_FAULT_FAULT1 0x00000002 ///< PWM1 Fault +#define PWM_FAULT_FAULT0 0x00000001 ///< PWM0 Fault +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_INTEN register. + */ +/*\{*/ +#define PWM_INTEN_INTFAULT 0x00010000 ///< Fault Interrupt Enable +#define PWM_INTEN_INTPWM2 0x00000004 ///< PWM2 Interrupt Enable +#define PWM_INTEN_INTPWM1 0x00000002 ///< PWM1 Interrupt Enable +#define PWM_INTEN_INTPWM0 0x00000001 ///< PWM0 Interrupt Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_RIS register. + */ +/*\{*/ +#define PWM_RIS_INTFAULT 0x00010000 ///< Fault Interrupt Asserted +#define PWM_RIS_INTPWM2 0x00000004 ///< PWM2 Interrupt Asserted +#define PWM_RIS_INTPWM1 0x00000002 ///< PWM1 Interrupt Asserted +#define PWM_RIS_INTPWM0 0x00000001 ///< PWM0 Interrupt Asserted +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_ISC register. + */ +/*\{*/ +#define PWM_ISC_INTFAULT 0x00010000 ///< Fault Interrupt Asserted +#define PWM_ISC_INTPWM2 0x00000004 ///< PWM2 Interrupt Status +#define PWM_ISC_INTPWM1 0x00000002 ///< PWM1 Interrupt Status +#define PWM_ISC_INTPWM0 0x00000001 ///< PWM0 Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_STATUS register. + */ +/*\{*/ +#define PWM_STATUS_FAULT 0x00000001 ///< Fault Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_CTL register. + */ +/*\{*/ +#define PWM_X_CTL_CMPBUPD 0x00000020 ///< Comparator B Update Mode +#define PWM_X_CTL_CMPAUPD 0x00000010 ///< Comparator A Update Mode +#define PWM_X_CTL_LOADUPD 0x00000008 ///< Load Register Update Mode +#define PWM_X_CTL_DEBUG 0x00000004 ///< Debug Mode +#define PWM_X_CTL_MODE 0x00000002 ///< Counter Mode +#define PWM_X_CTL_ENABLE 0x00000001 ///< PWM Block Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_INTEN register. + */ +/*\{*/ +#define PWM_X_INTEN_TRCMPBD 0x00002000 ///< Trigger for Counter=PWMnCMPB + ///< Down +#define PWM_X_INTEN_TRCMPBU 0x00001000 ///< Trigger for Counter=PWMnCMPB Up +#define PWM_X_INTEN_TRCMPAD 0x00000800 ///< Trigger for Counter=PWMnCMPA + ///< Down +#define PWM_X_INTEN_TRCMPAU 0x00000400 ///< Trigger for Counter=PWMnCMPA Up +#define PWM_X_INTEN_TRCNTLOAD 0x00000200 ///< Trigger for Counter=PWMnLOAD +#define PWM_X_INTEN_TRCNTZERO 0x00000100 ///< Trigger for Counter=0 +#define PWM_X_INTEN_INTCMPBD 0x00000020 ///< Interrupt for Counter=PWMnCMPB + ///< Down +#define PWM_X_INTEN_INTCMPBU 0x00000010 ///< Interrupt for Counter=PWMnCMPB + ///< Up +#define PWM_X_INTEN_INTCMPAD 0x00000008 ///< Interrupt for Counter=PWMnCMPA + ///< Down +#define PWM_X_INTEN_INTCMPAU 0x00000004 ///< Interrupt for Counter=PWMnCMPA + ///< Up +#define PWM_X_INTEN_INTCNTLOAD 0x00000002 ///< Interrupt for Counter=PWMnLOAD +#define PWM_X_INTEN_INTCNTZERO 0x00000001 ///< Interrupt for Counter=0 +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_RIS register. + */ +/*\{*/ +#define PWM_X_RIS_INTCMPBD 0x00000020 ///< Comparator B Down Interrupt + ///< Status +#define PWM_X_RIS_INTCMPBU 0x00000010 ///< Comparator B Up Interrupt Status +#define PWM_X_RIS_INTCMPAD 0x00000008 ///< Comparator A Down Interrupt + ///< Status +#define PWM_X_RIS_INTCMPAU 0x00000004 ///< Comparator A Up Interrupt Status +#define PWM_X_RIS_INTCNTLOAD 0x00000002 ///< Counter=Load Interrupt Status +#define PWM_X_RIS_INTCNTZERO 0x00000001 ///< Counter=0 Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_ISC register. + */ +/*\{*/ +#define PWM_X_ISC_INTCMPBD 0x00000020 ///< Comparator B Down Interrupt +#define PWM_X_ISC_INTCMPBU 0x00000010 ///< Comparator B Up Interrupt +#define PWM_X_ISC_INTCMPAD 0x00000008 ///< Comparator A Down Interrupt +#define PWM_X_ISC_INTCMPAU 0x00000004 ///< Comparator A Up Interrupt +#define PWM_X_ISC_INTCNTLOAD 0x00000002 ///< Counter=Load Interrupt +#define PWM_X_ISC_INTCNTZERO 0x00000001 ///< Counter=0 Interrupt +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_LOAD register. + */ +/*\{*/ +#define PWM_X_LOAD_M 0x0000FFFF ///< Counter Load Value +#define PWM_X_LOAD_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_COUNT register. + */ +/*\{*/ +#define PWM_X_COUNT_M 0x0000FFFF ///< Counter Value +#define PWM_X_COUNT_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_CMPA register. + */ +/*\{*/ +#define PWM_X_CMPA_M 0x0000FFFF ///< Comparator A Value +#define PWM_X_CMPA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_CMPB register. + */ +/*\{*/ +#define PWM_X_CMPB_M 0x0000FFFF ///< Comparator B Value +#define PWM_X_CMPB_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_GENA register. + */ +/*\{*/ +#define PWM_X_GENA_ACTCMPBD_M 0x00000C00 ///< Action for Comparator B Down +#define PWM_X_GENA_ACTCMPBD_NONE 0x00000000 ///< Do nothing +#define PWM_X_GENA_ACTCMPBD_INV 0x00000400 ///< Invert pwmA +#define PWM_X_GENA_ACTCMPBD_ZERO 0x00000800 ///< Drive pwmA Low +#define PWM_X_GENA_ACTCMPBD_ONE 0x00000C00 ///< Drive pwmA High +#define PWM_X_GENA_ACTCMPBU_M 0x00000300 ///< Action for Comparator B Up +#define PWM_X_GENA_ACTCMPBU_NONE 0x00000000 ///< Do nothing +#define PWM_X_GENA_ACTCMPBU_INV 0x00000100 ///< Invert pwmA +#define PWM_X_GENA_ACTCMPBU_ZERO 0x00000200 ///< Drive pwmA Low +#define PWM_X_GENA_ACTCMPBU_ONE 0x00000300 ///< Drive pwmA High +#define PWM_X_GENA_ACTCMPAD_M 0x000000C0 ///< Action for Comparator A Down +#define PWM_X_GENA_ACTCMPAD_NONE 0x00000000 ///< Do nothing +#define PWM_X_GENA_ACTCMPAD_INV 0x00000040 ///< Invert pwmA +#define PWM_X_GENA_ACTCMPAD_ZERO 0x00000080 ///< Drive pwmA Low +#define PWM_X_GENA_ACTCMPAD_ONE 0x000000C0 ///< Drive pwmA High +#define PWM_X_GENA_ACTCMPAU_M 0x00000030 ///< Action for Comparator A Up +#define PWM_X_GENA_ACTCMPAU_NONE 0x00000000 ///< Do nothing +#define PWM_X_GENA_ACTCMPAU_INV 0x00000010 ///< Invert pwmA +#define PWM_X_GENA_ACTCMPAU_ZERO 0x00000020 ///< Drive pwmA Low +#define PWM_X_GENA_ACTCMPAU_ONE 0x00000030 ///< Drive pwmA High +#define PWM_X_GENA_ACTLOAD_M 0x0000000C ///< Action for Counter=LOAD +#define PWM_X_GENA_ACTLOAD_NONE 0x00000000 ///< Do nothing +#define PWM_X_GENA_ACTLOAD_INV 0x00000004 ///< Invert pwmA +#define PWM_X_GENA_ACTLOAD_ZERO 0x00000008 ///< Drive pwmA Low +#define PWM_X_GENA_ACTLOAD_ONE 0x0000000C ///< Drive pwmA High +#define PWM_X_GENA_ACTZERO_M 0x00000003 ///< Action for Counter=0 +#define PWM_X_GENA_ACTZERO_NONE 0x00000000 ///< Do nothing +#define PWM_X_GENA_ACTZERO_INV 0x00000001 ///< Invert pwmA +#define PWM_X_GENA_ACTZERO_ZERO 0x00000002 ///< Drive pwmA Low +#define PWM_X_GENA_ACTZERO_ONE 0x00000003 ///< Drive pwmA High +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_GENB register. + */ +/*\{*/ +#define PWM_X_GENB_ACTCMPBD_M 0x00000C00 ///< Action for Comparator B Down +#define PWM_X_GENB_ACTCMPBD_NONE 0x00000000 ///< Do nothing +#define PWM_X_GENB_ACTCMPBD_INV 0x00000400 ///< Invert pwmB +#define PWM_X_GENB_ACTCMPBD_ZERO 0x00000800 ///< Drive pwmB Low +#define PWM_X_GENB_ACTCMPBD_ONE 0x00000C00 ///< Drive pwmB High +#define PWM_X_GENB_ACTCMPBU_M 0x00000300 ///< Action for Comparator B Up +#define PWM_X_GENB_ACTCMPBU_NONE 0x00000000 ///< Do nothing +#define PWM_X_GENB_ACTCMPBU_INV 0x00000100 ///< Invert pwmB +#define PWM_X_GENB_ACTCMPBU_ZERO 0x00000200 ///< Drive pwmB Low +#define PWM_X_GENB_ACTCMPBU_ONE 0x00000300 ///< Drive pwmB High +#define PWM_X_GENB_ACTCMPAD_M 0x000000C0 ///< Action for Comparator A Down +#define PWM_X_GENB_ACTCMPAD_NONE 0x00000000 ///< Do nothing +#define PWM_X_GENB_ACTCMPAD_INV 0x00000040 ///< Invert pwmB +#define PWM_X_GENB_ACTCMPAD_ZERO 0x00000080 ///< Drive pwmB Low +#define PWM_X_GENB_ACTCMPAD_ONE 0x000000C0 ///< Drive pwmB High +#define PWM_X_GENB_ACTCMPAU_M 0x00000030 ///< Action for Comparator A Up +#define PWM_X_GENB_ACTCMPAU_NONE 0x00000000 ///< Do nothing +#define PWM_X_GENB_ACTCMPAU_INV 0x00000010 ///< Invert pwmB +#define PWM_X_GENB_ACTCMPAU_ZERO 0x00000020 ///< Drive pwmB Low +#define PWM_X_GENB_ACTCMPAU_ONE 0x00000030 ///< Drive pwmB High +#define PWM_X_GENB_ACTLOAD_M 0x0000000C ///< Action for Counter=LOAD +#define PWM_X_GENB_ACTLOAD_NONE 0x00000000 ///< Do nothing +#define PWM_X_GENB_ACTLOAD_INV 0x00000004 ///< Invert pwmB +#define PWM_X_GENB_ACTLOAD_ZERO 0x00000008 ///< Drive pwmB Low +#define PWM_X_GENB_ACTLOAD_ONE 0x0000000C ///< Drive pwmB High +#define PWM_X_GENB_ACTZERO_M 0x00000003 ///< Action for Counter=0 +#define PWM_X_GENB_ACTZERO_NONE 0x00000000 ///< Do nothing +#define PWM_X_GENB_ACTZERO_INV 0x00000001 ///< Invert pwmB +#define PWM_X_GENB_ACTZERO_ZERO 0x00000002 ///< Drive pwmB Low +#define PWM_X_GENB_ACTZERO_ONE 0x00000003 ///< Drive pwmB High +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_DBCTL register. + */ +/*\{*/ +#define PWM_X_DBCTL_ENABLE 0x00000001 ///< Dead-Band Generator Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_DBRISE register. + */ +/*\{*/ +#define PWM_X_DBRISE_DELAY_M 0x00000FFF ///< Dead-Band Rise Delay +#define PWM_X_DBRISE_DELAY_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the PWM_O_X_DBFALL register. + */ +/*\{*/ +#define PWM_X_DBFALL_DELAY_M 0x00000FFF ///< Dead-Band Fall Delay +#define PWM_X_DBFALL_DELAY_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the QEI_O_CTL register. + */ +/*\{*/ +#define QEI_CTL_STALLEN 0x00001000 ///< Stall QEI +#define QEI_CTL_INVI 0x00000800 ///< Invert Index Pulse +#define QEI_CTL_INVB 0x00000400 ///< Invert PhB +#define QEI_CTL_INVA 0x00000200 ///< Invert PhA +#define QEI_CTL_VELDIV_M 0x000001C0 ///< Predivide Velocity +#define QEI_CTL_VELDIV_1 0x00000000 ///< QEI clock /1 +#define QEI_CTL_VELDIV_2 0x00000040 ///< QEI clock /2 +#define QEI_CTL_VELDIV_4 0x00000080 ///< QEI clock /4 +#define QEI_CTL_VELDIV_8 0x000000C0 ///< QEI clock /8 +#define QEI_CTL_VELDIV_16 0x00000100 ///< QEI clock /16 +#define QEI_CTL_VELDIV_32 0x00000140 ///< QEI clock /32 +#define QEI_CTL_VELDIV_64 0x00000180 ///< QEI clock /64 +#define QEI_CTL_VELDIV_128 0x000001C0 ///< QEI clock /128 +#define QEI_CTL_VELEN 0x00000020 ///< Capture Velocity +#define QEI_CTL_RESMODE 0x00000010 ///< Reset Mode +#define QEI_CTL_CAPMODE 0x00000008 ///< Capture Mode +#define QEI_CTL_SIGMODE 0x00000004 ///< Signal Mode +#define QEI_CTL_SWAP 0x00000002 ///< Swap Signals +#define QEI_CTL_ENABLE 0x00000001 ///< Enable QEI +/*\}*/ + +/** + * The following are defines for the bit fields in the QEI_O_STAT register. + */ +/*\{*/ +#define QEI_STAT_DIRECTION 0x00000002 ///< Direction of Rotation +#define QEI_STAT_ERROR 0x00000001 ///< Error Detected +/*\}*/ + +/** + * The following are defines for the bit fields in the QEI_O_POS register. + */ +/*\{*/ +#define QEI_POS_M 0xFFFFFFFF ///< Current Position Integrator Value +#define QEI_POS_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the QEI_O_MAXPOS register. + */ +/*\{*/ +#define QEI_MAXPOS_M 0xFFFFFFFF ///< Maximum Position Integrator Value +#define QEI_MAXPOS_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the QEI_O_LOAD register. + */ +/*\{*/ +#define QEI_LOAD_M 0xFFFFFFFF ///< Velocity Timer Load Value +#define QEI_LOAD_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the QEI_O_TIME register. + */ +/*\{*/ +#define QEI_TIME_M 0xFFFFFFFF ///< Velocity Timer Current Value +#define QEI_TIME_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the QEI_O_COUNT register. + */ +/*\{*/ +#define QEI_COUNT_M 0xFFFFFFFF ///< Velocity Pulse Count +#define QEI_COUNT_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the QEI_O_SPEED register. + */ +/*\{*/ +#define QEI_SPEED_M 0xFFFFFFFF ///< Velocity +#define QEI_SPEED_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the QEI_O_INTEN register. + */ +/*\{*/ +#define QEI_INTEN_ERROR 0x00000008 ///< Phase Error Interrupt Enable +#define QEI_INTEN_DIR 0x00000004 ///< Direction Change Interrupt + ///< Enable +#define QEI_INTEN_TIMER 0x00000002 ///< Timer Expires Interrupt Enable +#define QEI_INTEN_INDEX 0x00000001 ///< Index Pulse Detected Interrupt + ///< Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the QEI_O_RIS register. + */ +/*\{*/ +#define QEI_RIS_ERROR 0x00000008 ///< Phase Error Detected +#define QEI_RIS_DIR 0x00000004 ///< Direction Change Detected +#define QEI_RIS_TIMER 0x00000002 ///< Velocity Timer Expired +#define QEI_RIS_INDEX 0x00000001 ///< Index Pulse Asserted +/*\}*/ + +/** + * The following are defines for the bit fields in the QEI_O_ISC register. + */ +/*\{*/ +#define QEI_ISC_ERROR 0x00000008 ///< Phase Error Interrupt +#define QEI_ISC_DIR 0x00000004 ///< Direction Change Interrupt +#define QEI_ISC_TIMER 0x00000002 ///< Velocity Timer Expired Interrupt +#define QEI_ISC_INDEX 0x00000001 ///< Index Pulse Interrupt +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_CFG register. + */ +/*\{*/ +#define TIMER_CFG_M 0x00000007 ///< GPTM Configuration +#define TIMER_CFG_32_BIT_TIMER 0x00000000 ///< 32-bit timer configuration +#define TIMER_CFG_32_BIT_RTC 0x00000001 ///< 32-bit real-time clock (RTC) + ///< counter configuration +#define TIMER_CFG_16_BIT 0x00000004 ///< 16-bit timer configuration. The + ///< function is controlled by bits + ///< 1:0 of GPTMTAMR and GPTMTBMR +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_TAMR register. + */ +/*\{*/ +#define TIMER_TAMR_TAAMS 0x00000008 ///< GPTM Timer A Alternate Mode + ///< Select +#define TIMER_TAMR_TACMR 0x00000004 ///< GPTM Timer A Capture Mode +#define TIMER_TAMR_TAMR_M 0x00000003 ///< GPTM Timer A Mode +#define TIMER_TAMR_TAMR_1_SHOT 0x00000001 ///< One-Shot Timer mode +#define TIMER_TAMR_TAMR_PERIOD 0x00000002 ///< Periodic Timer mode +#define TIMER_TAMR_TAMR_CAP 0x00000003 ///< Capture mode +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_TBMR register. + */ +/*\{*/ +#define TIMER_TBMR_TBAMS 0x00000008 ///< GPTM Timer B Alternate Mode + ///< Select +#define TIMER_TBMR_TBCMR 0x00000004 ///< GPTM Timer B Capture Mode +#define TIMER_TBMR_TBMR_M 0x00000003 ///< GPTM Timer B Mode +#define TIMER_TBMR_TBMR_1_SHOT 0x00000001 ///< One-Shot Timer mode +#define TIMER_TBMR_TBMR_PERIOD 0x00000002 ///< Periodic Timer mode +#define TIMER_TBMR_TBMR_CAP 0x00000003 ///< Capture mode +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_CTL register. + */ +/*\{*/ +#define TIMER_CTL_TBPWML 0x00004000 ///< GPTM Timer B PWM Output Level +#define TIMER_CTL_TBOTE 0x00002000 ///< GPTM Timer B Output Trigger + ///< Enable +#define TIMER_CTL_TBEVENT_M 0x00000C00 ///< GPTM Timer B Event Mode +#define TIMER_CTL_TBEVENT_POS 0x00000000 ///< Positive edge +#define TIMER_CTL_TBEVENT_NEG 0x00000400 ///< Negative edge +#define TIMER_CTL_TBEVENT_BOTH 0x00000C00 ///< Both edges +#define TIMER_CTL_TBSTALL 0x00000200 ///< GPTM Timer B Stall Enable +#define TIMER_CTL_TBEN 0x00000100 ///< GPTM Timer B Enable +#define TIMER_CTL_TAPWML 0x00000040 ///< GPTM Timer A PWM Output Level +#define TIMER_CTL_TAOTE 0x00000020 ///< GPTM Timer A Output Trigger + ///< Enable +#define TIMER_CTL_RTCEN 0x00000010 ///< GPTM RTC Enable +#define TIMER_CTL_TAEVENT_M 0x0000000C ///< GPTM Timer A Event Mode +#define TIMER_CTL_TAEVENT_POS 0x00000000 ///< Positive edge +#define TIMER_CTL_TAEVENT_NEG 0x00000004 ///< Negative edge +#define TIMER_CTL_TAEVENT_BOTH 0x0000000C ///< Both edges +#define TIMER_CTL_TASTALL 0x00000002 ///< GPTM Timer A Stall Enable +#define TIMER_CTL_TAEN 0x00000001 ///< GPTM Timer A Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_IMR register. + */ +/*\{*/ +#define TIMER_IMR_CBEIM 0x00000400 ///< GPTM Capture B Event Interrupt + ///< Mask +#define TIMER_IMR_CBMIM 0x00000200 ///< GPTM Capture B Match Interrupt + ///< Mask +#define TIMER_IMR_TBTOIM 0x00000100 ///< GPTM Timer B Time-Out Interrupt + ///< Mask +#define TIMER_IMR_RTCIM 0x00000008 ///< GPTM RTC Interrupt Mask +#define TIMER_IMR_CAEIM 0x00000004 ///< GPTM Capture A Event Interrupt + ///< Mask +#define TIMER_IMR_CAMIM 0x00000002 ///< GPTM Capture A Match Interrupt + ///< Mask +#define TIMER_IMR_TATOIM 0x00000001 ///< GPTM Timer A Time-Out Interrupt + ///< Mask +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_RIS register. + */ +/*\{*/ +#define TIMER_RIS_CBERIS 0x00000400 ///< GPTM Capture B Event Raw + ///< Interrupt +#define TIMER_RIS_CBMRIS 0x00000200 ///< GPTM Capture B Match Raw + ///< Interrupt +#define TIMER_RIS_TBTORIS 0x00000100 ///< GPTM Timer B Time-Out Raw + ///< Interrupt +#define TIMER_RIS_RTCRIS 0x00000008 ///< GPTM RTC Raw Interrupt +#define TIMER_RIS_CAERIS 0x00000004 ///< GPTM Capture A Event Raw + ///< Interrupt +#define TIMER_RIS_CAMRIS 0x00000002 ///< GPTM Capture A Match Raw + ///< Interrupt +#define TIMER_RIS_TATORIS 0x00000001 ///< GPTM Timer A Time-Out Raw + ///< Interrupt +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_MIS register. + */ +/*\{*/ +#define TIMER_MIS_CBEMIS 0x00000400 ///< GPTM Capture B Event Masked + ///< Interrupt +#define TIMER_MIS_CBMMIS 0x00000200 ///< GPTM Capture B Match Masked + ///< Interrupt +#define TIMER_MIS_TBTOMIS 0x00000100 ///< GPTM Timer B Time-Out Masked + ///< Interrupt +#define TIMER_MIS_RTCMIS 0x00000008 ///< GPTM RTC Masked Interrupt +#define TIMER_MIS_CAEMIS 0x00000004 ///< GPTM Capture A Event Masked + ///< Interrupt +#define TIMER_MIS_CAMMIS 0x00000002 ///< GPTM Capture A Match Masked + ///< Interrupt +#define TIMER_MIS_TATOMIS 0x00000001 ///< GPTM Timer A Time-Out Masked + ///< Interrupt +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_ICR register. + */ +/*\{*/ +#define TIMER_ICR_CBECINT 0x00000400 ///< GPTM Capture B Event Interrupt + ///< Clear +#define TIMER_ICR_CBMCINT 0x00000200 ///< GPTM Capture B Match Interrupt + ///< Clear +#define TIMER_ICR_TBTOCINT 0x00000100 ///< GPTM Timer B Time-Out Interrupt + ///< Clear +#define TIMER_ICR_RTCCINT 0x00000008 ///< GPTM RTC Interrupt Clear +#define TIMER_ICR_CAECINT 0x00000004 ///< GPTM Capture A Event Interrupt + ///< Clear +#define TIMER_ICR_CAMCINT 0x00000002 ///< GPTM Capture A Match Interrupt + ///< Clear +#define TIMER_ICR_TATOCINT 0x00000001 ///< GPTM Timer A Time-Out Raw + ///< Interrupt +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_TAILR register. + */ +/*\{*/ +#define TIMER_TAILR_TAILRH_M 0xFFFF0000 ///< GPTM Timer A Interval Load + ///< Register High +#define TIMER_TAILR_TAILRL_M 0x0000FFFF ///< GPTM Timer A Interval Load + ///< Register Low +#define TIMER_TAILR_TAILRH_S 16 +#define TIMER_TAILR_TAILRL_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_TBILR register. + */ +/*\{*/ +#define TIMER_TBILR_TBILRL_M 0x0000FFFF ///< GPTM Timer B Interval Load + ///< Register +#define TIMER_TBILR_TBILRL_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_TAMATCHR +* register. + */ +/*\{*/ +#define TIMER_TAMATCHR_TAMRH_M 0xFFFF0000 ///< GPTM Timer A Match Register High +#define TIMER_TAMATCHR_TAMRL_M 0x0000FFFF ///< GPTM Timer A Match Register Low +#define TIMER_TAMATCHR_TAMRH_S 16 +#define TIMER_TAMATCHR_TAMRL_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_TBMATCHR +* register. + */ +/*\{*/ +#define TIMER_TBMATCHR_TBMRL_M 0x0000FFFF ///< GPTM Timer B Match Register Low +#define TIMER_TBMATCHR_TBMRL_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_TAPR register. + */ +/*\{*/ +#define TIMER_TAPR_TAPSR_M 0x000000FF ///< GPTM Timer A Prescale +#define TIMER_TAPR_TAPSR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_TBPR register. + */ +/*\{*/ +#define TIMER_TBPR_TBPSR_M 0x000000FF ///< GPTM Timer B Prescale +#define TIMER_TBPR_TBPSR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_TAPMR register. + */ +/*\{*/ +#define TIMER_TAPMR_TAPSMR_M 0x000000FF ///< GPTM TimerA Prescale Match +#define TIMER_TAPMR_TAPSMR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_TBPMR register. + */ +/*\{*/ +#define TIMER_TBPMR_TBPSMR_M 0x000000FF ///< GPTM TimerB Prescale Match +#define TIMER_TBPMR_TBPSMR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_TAR register. + */ +/*\{*/ +#define TIMER_TAR_TARH_M 0xFFFF0000 ///< GPTM Timer A Register High +#define TIMER_TAR_TARL_M 0x0000FFFF ///< GPTM Timer A Register Low +#define TIMER_TAR_TARH_S 16 +#define TIMER_TAR_TARL_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the TIMER_O_TBR register. + */ +/*\{*/ +#define TIMER_TBR_TBRL_M 0x0000FFFF ///< GPTM Timer B +#define TIMER_TBR_TBRL_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_ACTSS register. + */ +/*\{*/ +#define ADC_ACTSS_ASEN3 0x00000008 ///< ADC SS3 Enable +#define ADC_ACTSS_ASEN2 0x00000004 ///< ADC SS2 Enable +#define ADC_ACTSS_ASEN1 0x00000002 ///< ADC SS1 Enable +#define ADC_ACTSS_ASEN0 0x00000001 ///< ADC SS0 Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_RIS register. + */ +/*\{*/ +#define ADC_RIS_INR3 0x00000008 ///< SS3 Raw Interrupt Status +#define ADC_RIS_INR2 0x00000004 ///< SS2 Raw Interrupt Status +#define ADC_RIS_INR1 0x00000002 ///< SS1 Raw Interrupt Status +#define ADC_RIS_INR0 0x00000001 ///< SS0 Raw Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_IM register. + */ +/*\{*/ +#define ADC_IM_MASK3 0x00000008 ///< SS3 Interrupt Mask +#define ADC_IM_MASK2 0x00000004 ///< SS2 Interrupt Mask +#define ADC_IM_MASK1 0x00000002 ///< SS1 Interrupt Mask +#define ADC_IM_MASK0 0x00000001 ///< SS0 Interrupt Mask +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_ISC register. + */ +/*\{*/ +#define ADC_ISC_IN3 0x00000008 ///< SS3 Interrupt Status and Clear +#define ADC_ISC_IN2 0x00000004 ///< SS2 Interrupt Status and Clear +#define ADC_ISC_IN1 0x00000002 ///< SS1 Interrupt Status and Clear +#define ADC_ISC_IN0 0x00000001 ///< SS0 Interrupt Status and Clear +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_OSTAT register. + */ +/*\{*/ +#define ADC_OSTAT_OV3 0x00000008 ///< SS3 FIFO Overflow +#define ADC_OSTAT_OV2 0x00000004 ///< SS2 FIFO Overflow +#define ADC_OSTAT_OV1 0x00000002 ///< SS1 FIFO Overflow +#define ADC_OSTAT_OV0 0x00000001 ///< SS0 FIFO Overflow +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_EMUX register. + */ +/*\{*/ +#define ADC_EMUX_EM3_M 0x0000F000 ///< SS3 Trigger Select +#define ADC_EMUX_EM3_PROCESSOR 0x00000000 ///< Processor (default) +#define ADC_EMUX_EM3_COMP0 0x00001000 ///< Analog Comparator 0 +#define ADC_EMUX_EM3_COMP1 0x00002000 ///< Analog Comparator 1 +#define ADC_EMUX_EM3_COMP2 0x00003000 ///< Analog Comparator 2 +#define ADC_EMUX_EM3_EXTERNAL 0x00004000 ///< External (GPIO PB4) +#define ADC_EMUX_EM3_TIMER 0x00005000 ///< Timer +#define ADC_EMUX_EM3_PWM0 0x00006000 ///< PWM0 +#define ADC_EMUX_EM3_PWM1 0x00007000 ///< PWM1 +#define ADC_EMUX_EM3_PWM2 0x00008000 ///< PWM2 +#define ADC_EMUX_EM3_ALWAYS 0x0000F000 ///< Always (continuously sample) +#define ADC_EMUX_EM2_M 0x00000F00 ///< SS2 Trigger Select +#define ADC_EMUX_EM2_PROCESSOR 0x00000000 ///< Processor (default) +#define ADC_EMUX_EM2_COMP0 0x00000100 ///< Analog Comparator 0 +#define ADC_EMUX_EM2_COMP1 0x00000200 ///< Analog Comparator 1 +#define ADC_EMUX_EM2_COMP2 0x00000300 ///< Analog Comparator 2 +#define ADC_EMUX_EM2_EXTERNAL 0x00000400 ///< External (GPIO PB4) +#define ADC_EMUX_EM2_TIMER 0x00000500 ///< Timer +#define ADC_EMUX_EM2_PWM0 0x00000600 ///< PWM0 +#define ADC_EMUX_EM2_PWM1 0x00000700 ///< PWM1 +#define ADC_EMUX_EM2_PWM2 0x00000800 ///< PWM2 +#define ADC_EMUX_EM2_ALWAYS 0x00000F00 ///< Always (continuously sample) +#define ADC_EMUX_EM1_M 0x000000F0 ///< SS1 Trigger Select +#define ADC_EMUX_EM1_PROCESSOR 0x00000000 ///< Processor (default) +#define ADC_EMUX_EM1_COMP0 0x00000010 ///< Analog Comparator 0 +#define ADC_EMUX_EM1_COMP1 0x00000020 ///< Analog Comparator 1 +#define ADC_EMUX_EM1_COMP2 0x00000030 ///< Analog Comparator 2 +#define ADC_EMUX_EM1_EXTERNAL 0x00000040 ///< External (GPIO PB4) +#define ADC_EMUX_EM1_TIMER 0x00000050 ///< Timer +#define ADC_EMUX_EM1_PWM0 0x00000060 ///< PWM0 +#define ADC_EMUX_EM1_PWM1 0x00000070 ///< PWM1 +#define ADC_EMUX_EM1_PWM2 0x00000080 ///< PWM2 +#define ADC_EMUX_EM1_ALWAYS 0x000000F0 ///< Always (continuously sample) +#define ADC_EMUX_EM0_M 0x0000000F ///< SS0 Trigger Select +#define ADC_EMUX_EM0_PROCESSOR 0x00000000 ///< Processor (default) +#define ADC_EMUX_EM0_COMP0 0x00000001 ///< Analog Comparator 0 +#define ADC_EMUX_EM0_COMP1 0x00000002 ///< Analog Comparator 1 +#define ADC_EMUX_EM0_COMP2 0x00000003 ///< Analog Comparator 2 +#define ADC_EMUX_EM0_EXTERNAL 0x00000004 ///< External (GPIO PB4) +#define ADC_EMUX_EM0_TIMER 0x00000005 ///< Timer +#define ADC_EMUX_EM0_PWM0 0x00000006 ///< PWM0 +#define ADC_EMUX_EM0_PWM1 0x00000007 ///< PWM1 +#define ADC_EMUX_EM0_PWM2 0x00000008 ///< PWM2 +#define ADC_EMUX_EM0_ALWAYS 0x0000000F ///< Always (continuously sample) +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_USTAT register. + */ +/*\{*/ +#define ADC_USTAT_UV3 0x00000008 ///< SS3 FIFO Underflow +#define ADC_USTAT_UV2 0x00000004 ///< SS2 FIFO Underflow +#define ADC_USTAT_UV1 0x00000002 ///< SS1 FIFO Underflow +#define ADC_USTAT_UV0 0x00000001 ///< SS0 FIFO Underflow +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSPRI register. + */ +/*\{*/ +#define ADC_SSPRI_SS3_M 0x00003000 ///< SS3 Priority +#define ADC_SSPRI_SS3_1ST 0x00000000 ///< First priority +#define ADC_SSPRI_SS3_2ND 0x00001000 ///< Second priority +#define ADC_SSPRI_SS3_3RD 0x00002000 ///< Third priority +#define ADC_SSPRI_SS3_4TH 0x00003000 ///< Fourth priority +#define ADC_SSPRI_SS2_M 0x00000300 ///< SS2 Priority +#define ADC_SSPRI_SS2_1ST 0x00000000 ///< First priority +#define ADC_SSPRI_SS2_2ND 0x00000100 ///< Second priority +#define ADC_SSPRI_SS2_3RD 0x00000200 ///< Third priority +#define ADC_SSPRI_SS2_4TH 0x00000300 ///< Fourth priority +#define ADC_SSPRI_SS1_M 0x00000030 ///< SS1 Priority +#define ADC_SSPRI_SS1_1ST 0x00000000 ///< First priority +#define ADC_SSPRI_SS1_2ND 0x00000010 ///< Second priority +#define ADC_SSPRI_SS1_3RD 0x00000020 ///< Third priority +#define ADC_SSPRI_SS1_4TH 0x00000030 ///< Fourth priority +#define ADC_SSPRI_SS0_M 0x00000003 ///< SS0 Priority +#define ADC_SSPRI_SS0_1ST 0x00000000 ///< First priority +#define ADC_SSPRI_SS0_2ND 0x00000001 ///< Second priority +#define ADC_SSPRI_SS0_3RD 0x00000002 ///< Third priority +#define ADC_SSPRI_SS0_4TH 0x00000003 ///< Fourth priority +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_PSSI register. + */ +/*\{*/ +#define ADC_PSSI_SS3 0x00000008 ///< SS3 Initiate +#define ADC_PSSI_SS2 0x00000004 ///< SS2 Initiate +#define ADC_PSSI_SS1 0x00000002 ///< SS1 Initiate +#define ADC_PSSI_SS0 0x00000001 ///< SS0 Initiate +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SAC register. + */ +/*\{*/ +#define ADC_SAC_AVG_M 0x00000007 ///< Hardware Averaging Control +#define ADC_SAC_AVG_OFF 0x00000000 ///< No hardware oversampling +#define ADC_SAC_AVG_2X 0x00000001 ///< 2x hardware oversampling +#define ADC_SAC_AVG_4X 0x00000002 ///< 4x hardware oversampling +#define ADC_SAC_AVG_8X 0x00000003 ///< 8x hardware oversampling +#define ADC_SAC_AVG_16X 0x00000004 ///< 16x hardware oversampling +#define ADC_SAC_AVG_32X 0x00000005 ///< 32x hardware oversampling +#define ADC_SAC_AVG_64X 0x00000006 ///< 64x hardware oversampling +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSMUX0 register. + */ +/*\{*/ +#define ADC_SSMUX0_MUX7_M 0x70000000 ///< 8th Sample Input Select +#define ADC_SSMUX0_MUX6_M 0x07000000 ///< 7th Sample Input Select +#define ADC_SSMUX0_MUX5_M 0x00700000 ///< 6th Sample Input Select +#define ADC_SSMUX0_MUX4_M 0x00070000 ///< 5th Sample Input Select +#define ADC_SSMUX0_MUX3_M 0x00007000 ///< 4th Sample Input Select +#define ADC_SSMUX0_MUX2_M 0x00000700 ///< 3rd Sample Input Select +#define ADC_SSMUX0_MUX1_M 0x00000070 ///< 2nd Sample Input Select +#define ADC_SSMUX0_MUX0_M 0x00000007 ///< 1st Sample Input Select +#define ADC_SSMUX0_MUX7_S 28 +#define ADC_SSMUX0_MUX6_S 24 +#define ADC_SSMUX0_MUX5_S 20 +#define ADC_SSMUX0_MUX4_S 16 +#define ADC_SSMUX0_MUX3_S 12 +#define ADC_SSMUX0_MUX2_S 8 +#define ADC_SSMUX0_MUX1_S 4 +#define ADC_SSMUX0_MUX0_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSCTL0 register. + */ +/*\{*/ +#define ADC_SSCTL0_TS7 0x80000000 ///< 8th Sample Temp Sensor Select +#define ADC_SSCTL0_IE7 0x40000000 ///< 8th Sample Interrupt Enable +#define ADC_SSCTL0_END7 0x20000000 ///< 8th Sample is End of Sequence +#define ADC_SSCTL0_D7 0x10000000 ///< 8th Sample Diff Input Select +#define ADC_SSCTL0_TS6 0x08000000 ///< 7th Sample Temp Sensor Select +#define ADC_SSCTL0_IE6 0x04000000 ///< 7th Sample Interrupt Enable +#define ADC_SSCTL0_END6 0x02000000 ///< 7th Sample is End of Sequence +#define ADC_SSCTL0_D6 0x01000000 ///< 7th Sample Diff Input Select +#define ADC_SSCTL0_TS5 0x00800000 ///< 6th Sample Temp Sensor Select +#define ADC_SSCTL0_IE5 0x00400000 ///< 6th Sample Interrupt Enable +#define ADC_SSCTL0_END5 0x00200000 ///< 6th Sample is End of Sequence +#define ADC_SSCTL0_D5 0x00100000 ///< 6th Sample Diff Input Select +#define ADC_SSCTL0_TS4 0x00080000 ///< 5th Sample Temp Sensor Select +#define ADC_SSCTL0_IE4 0x00040000 ///< 5th Sample Interrupt Enable +#define ADC_SSCTL0_END4 0x00020000 ///< 5th Sample is End of Sequence +#define ADC_SSCTL0_D4 0x00010000 ///< 5th Sample Diff Input Select +#define ADC_SSCTL0_TS3 0x00008000 ///< 4th Sample Temp Sensor Select +#define ADC_SSCTL0_IE3 0x00004000 ///< 4th Sample Interrupt Enable +#define ADC_SSCTL0_END3 0x00002000 ///< 4th Sample is End of Sequence +#define ADC_SSCTL0_D3 0x00001000 ///< 4th Sample Diff Input Select +#define ADC_SSCTL0_TS2 0x00000800 ///< 3rd Sample Temp Sensor Select +#define ADC_SSCTL0_IE2 0x00000400 ///< 3rd Sample Interrupt Enable +#define ADC_SSCTL0_END2 0x00000200 ///< 3rd Sample is End of Sequence +#define ADC_SSCTL0_D2 0x00000100 ///< 3rd Sample Diff Input Select +#define ADC_SSCTL0_TS1 0x00000080 ///< 2nd Sample Temp Sensor Select +#define ADC_SSCTL0_IE1 0x00000040 ///< 2nd Sample Interrupt Enable +#define ADC_SSCTL0_END1 0x00000020 ///< 2nd Sample is End of Sequence +#define ADC_SSCTL0_D1 0x00000010 ///< 2nd Sample Diff Input Select +#define ADC_SSCTL0_TS0 0x00000008 ///< 1st Sample Temp Sensor Select +#define ADC_SSCTL0_IE0 0x00000004 ///< 1st Sample Interrupt Enable +#define ADC_SSCTL0_END0 0x00000002 ///< 1st Sample is End of Sequence +#define ADC_SSCTL0_D0 0x00000001 ///< 1st Sample Diff Input Select +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSFIFO0 register. + */ +/*\{*/ +#define ADC_SSFIFO0_DATA_M 0x000003FF ///< Conversion Result Data +#define ADC_SSFIFO0_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSFSTAT0 register. + */ +/*\{*/ +#define ADC_SSFSTAT0_FULL 0x00001000 ///< FIFO Full +#define ADC_SSFSTAT0_EMPTY 0x00000100 ///< FIFO Empty +#define ADC_SSFSTAT0_HPTR_M 0x000000F0 ///< FIFO Head Pointer +#define ADC_SSFSTAT0_TPTR_M 0x0000000F ///< FIFO Tail Pointer +#define ADC_SSFSTAT0_HPTR_S 4 +#define ADC_SSFSTAT0_TPTR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSMUX1 register. + */ +/*\{*/ +#define ADC_SSMUX1_MUX3_M 0x00007000 ///< 4th Sample Input Select +#define ADC_SSMUX1_MUX2_M 0x00000700 ///< 3rd Sample Input Select +#define ADC_SSMUX1_MUX1_M 0x00000070 ///< 2nd Sample Input Select +#define ADC_SSMUX1_MUX0_M 0x00000007 ///< 1st Sample Input Select +#define ADC_SSMUX1_MUX3_S 12 +#define ADC_SSMUX1_MUX2_S 8 +#define ADC_SSMUX1_MUX1_S 4 +#define ADC_SSMUX1_MUX0_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSCTL1 register. + */ +/*\{*/ +#define ADC_SSCTL1_TS3 0x00008000 ///< 4th Sample Temp Sensor Select +#define ADC_SSCTL1_IE3 0x00004000 ///< 4th Sample Interrupt Enable +#define ADC_SSCTL1_END3 0x00002000 ///< 4th Sample is End of Sequence +#define ADC_SSCTL1_D3 0x00001000 ///< 4th Sample Diff Input Select +#define ADC_SSCTL1_TS2 0x00000800 ///< 3rd Sample Temp Sensor Select +#define ADC_SSCTL1_IE2 0x00000400 ///< 3rd Sample Interrupt Enable +#define ADC_SSCTL1_END2 0x00000200 ///< 3rd Sample is End of Sequence +#define ADC_SSCTL1_D2 0x00000100 ///< 3rd Sample Diff Input Select +#define ADC_SSCTL1_TS1 0x00000080 ///< 2nd Sample Temp Sensor Select +#define ADC_SSCTL1_IE1 0x00000040 ///< 2nd Sample Interrupt Enable +#define ADC_SSCTL1_END1 0x00000020 ///< 2nd Sample is End of Sequence +#define ADC_SSCTL1_D1 0x00000010 ///< 2nd Sample Diff Input Select +#define ADC_SSCTL1_TS0 0x00000008 ///< 1st Sample Temp Sensor Select +#define ADC_SSCTL1_IE0 0x00000004 ///< 1st Sample Interrupt Enable +#define ADC_SSCTL1_END0 0x00000002 ///< 1st Sample is End of Sequence +#define ADC_SSCTL1_D0 0x00000001 ///< 1st Sample Diff Input Select +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSFIFO1 register. + */ +/*\{*/ +#define ADC_SSFIFO1_DATA_M 0x000003FF ///< Conversion Result Data +#define ADC_SSFIFO1_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSFSTAT1 register. + */ +/*\{*/ +#define ADC_SSFSTAT1_FULL 0x00001000 ///< FIFO Full +#define ADC_SSFSTAT1_EMPTY 0x00000100 ///< FIFO Empty +#define ADC_SSFSTAT1_HPTR_M 0x000000F0 ///< FIFO Head Pointer +#define ADC_SSFSTAT1_TPTR_M 0x0000000F ///< FIFO Tail Pointer +#define ADC_SSFSTAT1_HPTR_S 4 +#define ADC_SSFSTAT1_TPTR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSMUX2 register. + */ +/*\{*/ +#define ADC_SSMUX2_MUX3_M 0x00007000 ///< 4th Sample Input Select +#define ADC_SSMUX2_MUX2_M 0x00000700 ///< 3rd Sample Input Select +#define ADC_SSMUX2_MUX1_M 0x00000070 ///< 2nd Sample Input Select +#define ADC_SSMUX2_MUX0_M 0x00000007 ///< 1st Sample Input Select +#define ADC_SSMUX2_MUX3_S 12 +#define ADC_SSMUX2_MUX2_S 8 +#define ADC_SSMUX2_MUX1_S 4 +#define ADC_SSMUX2_MUX0_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSCTL2 register. + */ +/*\{*/ +#define ADC_SSCTL2_TS3 0x00008000 ///< 4th Sample Temp Sensor Select +#define ADC_SSCTL2_IE3 0x00004000 ///< 4th Sample Interrupt Enable +#define ADC_SSCTL2_END3 0x00002000 ///< 4th Sample is End of Sequence +#define ADC_SSCTL2_D3 0x00001000 ///< 4th Sample Diff Input Select +#define ADC_SSCTL2_TS2 0x00000800 ///< 3rd Sample Temp Sensor Select +#define ADC_SSCTL2_IE2 0x00000400 ///< 3rd Sample Interrupt Enable +#define ADC_SSCTL2_END2 0x00000200 ///< 3rd Sample is End of Sequence +#define ADC_SSCTL2_D2 0x00000100 ///< 3rd Sample Diff Input Select +#define ADC_SSCTL2_TS1 0x00000080 ///< 2nd Sample Temp Sensor Select +#define ADC_SSCTL2_IE1 0x00000040 ///< 2nd Sample Interrupt Enable +#define ADC_SSCTL2_END1 0x00000020 ///< 2nd Sample is End of Sequence +#define ADC_SSCTL2_D1 0x00000010 ///< 2nd Sample Diff Input Select +#define ADC_SSCTL2_TS0 0x00000008 ///< 1st Sample Temp Sensor Select +#define ADC_SSCTL2_IE0 0x00000004 ///< 1st Sample Interrupt Enable +#define ADC_SSCTL2_END0 0x00000002 ///< 1st Sample is End of Sequence +#define ADC_SSCTL2_D0 0x00000001 ///< 1st Sample Diff Input Select +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSFIFO2 register. + */ +/*\{*/ +#define ADC_SSFIFO2_DATA_M 0x000003FF ///< Conversion Result Data +#define ADC_SSFIFO2_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSFSTAT2 register. + */ +/*\{*/ +#define ADC_SSFSTAT2_FULL 0x00001000 ///< FIFO Full +#define ADC_SSFSTAT2_EMPTY 0x00000100 ///< FIFO Empty +#define ADC_SSFSTAT2_HPTR_M 0x000000F0 ///< FIFO Head Pointer +#define ADC_SSFSTAT2_TPTR_M 0x0000000F ///< FIFO Tail Pointer +#define ADC_SSFSTAT2_HPTR_S 4 +#define ADC_SSFSTAT2_TPTR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSMUX3 register. + */ +/*\{*/ +#define ADC_SSMUX3_MUX0_M 0x00000007 ///< 1st Sample Input Select +#define ADC_SSMUX3_MUX0_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSCTL3 register. + */ +/*\{*/ +#define ADC_SSCTL3_TS0 0x00000008 ///< 1st Sample Temp Sensor Select +#define ADC_SSCTL3_IE0 0x00000004 ///< 1st Sample Interrupt Enable +#define ADC_SSCTL3_END0 0x00000002 ///< 1st Sample is End of Sequence +#define ADC_SSCTL3_D0 0x00000001 ///< 1st Sample Diff Input Select +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSFIFO3 register. + */ +/*\{*/ +#define ADC_SSFIFO3_DATA_M 0x000003FF ///< Conversion Result Data +#define ADC_SSFIFO3_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_SSFSTAT3 register. + */ +/*\{*/ +#define ADC_SSFSTAT3_FULL 0x00001000 ///< FIFO Full +#define ADC_SSFSTAT3_EMPTY 0x00000100 ///< FIFO Empty +#define ADC_SSFSTAT3_HPTR_M 0x000000F0 ///< FIFO Head Pointer +#define ADC_SSFSTAT3_TPTR_M 0x0000000F ///< FIFO Tail Pointer +#define ADC_SSFSTAT3_HPTR_S 4 +#define ADC_SSFSTAT3_TPTR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the ADC_O_TMLB register. + */ +/*\{*/ +#define ADC_TMLB_LB 0x00000001 ///< Loopback Mode Enable +/*\}*/ + +/** + * The following are defines for the the interpretation of the data in the +* SSFIFOx when the ADC TMLB is enabled. + */ +/*\{*/ +#define ADC_SSFIFO_TMLB_CNT_M 0x000003C0 ///< Continuous Sample Counter +#define ADC_SSFIFO_TMLB_CONT 0x00000020 ///< Continuation Sample Indicator +#define ADC_SSFIFO_TMLB_DIFF 0x00000010 ///< Differential Sample Indicator +#define ADC_SSFIFO_TMLB_TS 0x00000008 ///< Temp Sensor Sample Indicator +#define ADC_SSFIFO_TMLB_MUX_M 0x00000007 ///< Analog Input Indicator +#define ADC_SSFIFO_TMLB_CNT_S 6 ///< Sample counter shift +#define ADC_SSFIFO_TMLB_MUX_S 0 ///< Input channel number shift +/*\}*/ + +/** + * The following are defines for the bit fields in the COMP_O_ACMIS register. + */ +/*\{*/ +#define COMP_ACMIS_IN2 0x00000004 ///< Comparator 2 Masked Interrupt + ///< Status +#define COMP_ACMIS_IN1 0x00000002 ///< Comparator 1 Masked Interrupt + ///< Status +#define COMP_ACMIS_IN0 0x00000001 ///< Comparator 0 Masked Interrupt + ///< Status +/*\}*/ + +/** + * The following are defines for the bit fields in the COMP_O_ACRIS register. + */ +/*\{*/ +#define COMP_ACRIS_IN2 0x00000004 ///< Comparator 2 Interrupt Status +#define COMP_ACRIS_IN1 0x00000002 ///< Comparator 1 Interrupt Status +#define COMP_ACRIS_IN0 0x00000001 ///< Comparator 0 Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the COMP_O_ACINTEN register. + */ +/*\{*/ +#define COMP_ACINTEN_IN2 0x00000004 ///< Comparator 2 Interrupt Enable +#define COMP_ACINTEN_IN1 0x00000002 ///< Comparator 1 Interrupt Enable +#define COMP_ACINTEN_IN0 0x00000001 ///< Comparator 0 Interrupt Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the COMP_O_ACREFCTL +* register. + */ +/*\{*/ +#define COMP_ACREFCTL_EN 0x00000200 ///< Resistor Ladder Enable +#define COMP_ACREFCTL_RNG 0x00000100 ///< Resistor Ladder Range +#define COMP_ACREFCTL_VREF_M 0x0000000F ///< Resistor Ladder Voltage Ref +#define COMP_ACREFCTL_VREF_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the COMP_O_ACSTAT0 register. + */ +/*\{*/ +#define COMP_ACSTAT0_OVAL 0x00000002 ///< Comparator Output Value +/*\}*/ + +/** + * The following are defines for the bit fields in the COMP_O_ACCTL0 register. + */ +/*\{*/ +#define COMP_ACCTL0_TOEN 0x00000800 ///< Trigger Output Enable +#define COMP_ACCTL0_ASRCP_M 0x00000600 ///< Analog Source Positive +#define COMP_ACCTL0_ASRCP_PIN 0x00000000 ///< Pin value of Cn+ +#define COMP_ACCTL0_ASRCP_PIN0 0x00000200 ///< Pin value of C0+ +#define COMP_ACCTL0_ASRCP_REF 0x00000400 ///< Internal voltage reference + ///< (VIREF) +#define COMP_ACCTL0_TSLVAL 0x00000080 ///< Trigger Sense Level Value +#define COMP_ACCTL0_TSEN_M 0x00000060 ///< Trigger Sense +#define COMP_ACCTL0_TSEN_LEVEL 0x00000000 ///< Level sense, see TSLVAL +#define COMP_ACCTL0_TSEN_FALL 0x00000020 ///< Falling edge +#define COMP_ACCTL0_TSEN_RISE 0x00000040 ///< Rising edge +#define COMP_ACCTL0_TSEN_BOTH 0x00000060 ///< Either edge +#define COMP_ACCTL0_ISLVAL 0x00000010 ///< Interrupt Sense Level Value +#define COMP_ACCTL0_ISEN_M 0x0000000C ///< Interrupt Sense +#define COMP_ACCTL0_ISEN_LEVEL 0x00000000 ///< Level sense, see ISLVAL +#define COMP_ACCTL0_ISEN_FALL 0x00000004 ///< Falling edge +#define COMP_ACCTL0_ISEN_RISE 0x00000008 ///< Rising edge +#define COMP_ACCTL0_ISEN_BOTH 0x0000000C ///< Either edge +#define COMP_ACCTL0_CINV 0x00000002 ///< Comparator Output Invert +/*\}*/ + +/** + * The following are defines for the bit fields in the COMP_O_ACSTAT1 register. + */ +/*\{*/ +#define COMP_ACSTAT1_OVAL 0x00000002 ///< Comparator Output Value +/*\}*/ + +/** + * The following are defines for the bit fields in the COMP_O_ACCTL1 register. + */ +/*\{*/ +#define COMP_ACCTL1_TOEN 0x00000800 ///< Trigger Output Enable +#define COMP_ACCTL1_ASRCP_M 0x00000600 ///< Analog Source Positive +#define COMP_ACCTL1_ASRCP_PIN 0x00000000 ///< Pin value of Cn+ +#define COMP_ACCTL1_ASRCP_PIN0 0x00000200 ///< Pin value of C0+ +#define COMP_ACCTL1_ASRCP_REF 0x00000400 ///< Internal voltage reference + ///< (VIREF) +#define COMP_ACCTL1_TSLVAL 0x00000080 ///< Trigger Sense Level Value +#define COMP_ACCTL1_TSEN_M 0x00000060 ///< Trigger Sense +#define COMP_ACCTL1_TSEN_LEVEL 0x00000000 ///< Level sense, see TSLVAL +#define COMP_ACCTL1_TSEN_FALL 0x00000020 ///< Falling edge +#define COMP_ACCTL1_TSEN_RISE 0x00000040 ///< Rising edge +#define COMP_ACCTL1_TSEN_BOTH 0x00000060 ///< Either edge +#define COMP_ACCTL1_ISLVAL 0x00000010 ///< Interrupt Sense Level Value +#define COMP_ACCTL1_ISEN_M 0x0000000C ///< Interrupt Sense +#define COMP_ACCTL1_ISEN_LEVEL 0x00000000 ///< Level sense, see ISLVAL +#define COMP_ACCTL1_ISEN_FALL 0x00000004 ///< Falling edge +#define COMP_ACCTL1_ISEN_RISE 0x00000008 ///< Rising edge +#define COMP_ACCTL1_ISEN_BOTH 0x0000000C ///< Either edge +#define COMP_ACCTL1_CINV 0x00000002 ///< Comparator Output Invert +/*\}*/ + +/** + * The following are defines for the bit fields in the COMP_O_ACSTAT2 register. + */ +/*\{*/ +#define COMP_ACSTAT2_OVAL 0x00000002 ///< Comparator Output Value +/*\}*/ + +/** + * The following are defines for the bit fields in the COMP_O_ACCTL2 register. + */ +/*\{*/ +#define COMP_ACCTL2_TOEN 0x00000800 ///< Trigger Output Enable +#define COMP_ACCTL2_ASRCP_M 0x00000600 ///< Analog Source Positive +#define COMP_ACCTL2_ASRCP_PIN 0x00000000 ///< Pin value of Cn+ +#define COMP_ACCTL2_ASRCP_PIN0 0x00000200 ///< Pin value of C0+ +#define COMP_ACCTL2_ASRCP_REF 0x00000400 ///< Internal voltage reference + ///< (VIREF) +#define COMP_ACCTL2_TSLVAL 0x00000080 ///< Trigger Sense Level Value +#define COMP_ACCTL2_TSEN_M 0x00000060 ///< Trigger Sense +#define COMP_ACCTL2_TSEN_LEVEL 0x00000000 ///< Level sense, see TSLVAL +#define COMP_ACCTL2_TSEN_FALL 0x00000020 ///< Falling edge +#define COMP_ACCTL2_TSEN_RISE 0x00000040 ///< Rising edge +#define COMP_ACCTL2_TSEN_BOTH 0x00000060 ///< Either edge +#define COMP_ACCTL2_ISLVAL 0x00000010 ///< Interrupt Sense Level Value +#define COMP_ACCTL2_ISEN_M 0x0000000C ///< Interrupt Sense +#define COMP_ACCTL2_ISEN_LEVEL 0x00000000 ///< Level sense, see ISLVAL +#define COMP_ACCTL2_ISEN_FALL 0x00000004 ///< Falling edge +#define COMP_ACCTL2_ISEN_RISE 0x00000008 ///< Rising edge +#define COMP_ACCTL2_ISEN_BOTH 0x0000000C ///< Either edge +#define COMP_ACCTL2_CINV 0x00000002 ///< Comparator Output Invert +/*\}*/ + +/** + * The following are defines for the bit fields in the HIB_RTCC register. + */ +/*\{*/ +#define HIB_RTCC_M 0xFFFFFFFF ///< RTC Counter +#define HIB_RTCC_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the HIB_RTCM0 register. + */ +/*\{*/ +#define HIB_RTCM0_M 0xFFFFFFFF ///< RTC Match 0 +#define HIB_RTCM0_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the HIB_RTCM1 register. + */ +/*\{*/ +#define HIB_RTCM1_M 0xFFFFFFFF ///< RTC Match 1 +#define HIB_RTCM1_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the HIB_RTCLD register. + */ +/*\{*/ +#define HIB_RTCLD_M 0xFFFFFFFF ///< RTC Load +#define HIB_RTCLD_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the HIB_CTL register. + */ +/*\{*/ +#define HIB_CTL_VABORT 0x00000080 ///< Power Cut Abort Enable +#define HIB_CTL_CLK32EN 0x00000040 ///< Clocking Enable +#define HIB_CTL_LOWBATEN 0x00000020 ///< Low Battery Monitoring Enable +#define HIB_CTL_PINWEN 0x00000010 ///< External WAKE Pin Enable +#define HIB_CTL_RTCWEN 0x00000008 ///< RTC Wake-up Enable +#define HIB_CTL_CLKSEL 0x00000004 ///< Hibernation Module Clock Select +#define HIB_CTL_HIBREQ 0x00000002 ///< Hibernation Request +#define HIB_CTL_RTCEN 0x00000001 ///< RTC Timer Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the HIB_IM register. + */ +/*\{*/ +#define HIB_IM_EXTW 0x00000008 ///< External Wake-Up Interrupt Mask +#define HIB_IM_LOWBAT 0x00000004 ///< Low Battery Voltage Interrupt + ///< Mask +#define HIB_IM_RTCALT1 0x00000002 ///< RTC Alert 1 Interrupt Mask +#define HIB_IM_RTCALT0 0x00000001 ///< RTC Alert 0 Interrupt Mask +/*\}*/ + +/** + * The following are defines for the bit fields in the HIB_RIS register. + */ +/*\{*/ +#define HIB_RIS_EXTW 0x00000008 ///< External Wake-Up Raw Interrupt + ///< Status +#define HIB_RIS_LOWBAT 0x00000004 ///< Low Battery Voltage Raw + ///< Interrupt Status +#define HIB_RIS_RTCALT1 0x00000002 ///< RTC Alert 1 Raw Interrupt Status +#define HIB_RIS_RTCALT0 0x00000001 ///< RTC Alert 0 Raw Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the HIB_MIS register. + */ +/*\{*/ +#define HIB_MIS_EXTW 0x00000008 ///< External Wake-Up Masked + ///< Interrupt Status +#define HIB_MIS_LOWBAT 0x00000004 ///< Low Battery Voltage Masked + ///< Interrupt Status +#define HIB_MIS_RTCALT1 0x00000002 ///< RTC Alert 1 Masked Interrupt + ///< Status +#define HIB_MIS_RTCALT0 0x00000001 ///< RTC Alert 0 Masked Interrupt + ///< Status +/*\}*/ + +/** + * The following are defines for the bit fields in the HIB_IC register. + */ +/*\{*/ +#define HIB_IC_EXTW 0x00000008 ///< External Wake-Up Masked + ///< Interrupt Clear +#define HIB_IC_LOWBAT 0x00000004 ///< Low Battery Voltage Masked + ///< Interrupt Clear +#define HIB_IC_RTCALT1 0x00000002 ///< RTC Alert1 Masked Interrupt + ///< Clear +#define HIB_IC_RTCALT0 0x00000001 ///< RTC Alert0 Masked Interrupt + ///< Clear +/*\}*/ + +/** + * The following are defines for the bit fields in the HIB_RTCT register. + */ +/*\{*/ +#define HIB_RTCT_TRIM_M 0x0000FFFF ///< RTC Trim Value +#define HIB_RTCT_TRIM_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the HIB_DATA register. + */ +/*\{*/ +#define HIB_DATA_RTD_M 0xFFFFFFFF ///< Hibernation Module NV Data +#define HIB_DATA_RTD_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the FLASH_FMA register. + */ +/*\{*/ +#define FLASH_FMA_OFFSET_M 0x0003FFFF ///< Address Offset +#define FLASH_FMA_OFFSET_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the FLASH_FMD register. + */ +/*\{*/ +#define FLASH_FMD_DATA_M 0xFFFFFFFF ///< Data Value +#define FLASH_FMD_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the FLASH_FMC register. + */ +/*\{*/ +#define FLASH_FMC_WRKEY 0xA4420000 ///< FLASH write key +#define FLASH_FMC_COMT 0x00000008 ///< Commit Register Value +#define FLASH_FMC_MERASE 0x00000004 ///< Mass Erase Flash Memory +#define FLASH_FMC_ERASE 0x00000002 ///< Erase a Page of Flash Memory +#define FLASH_FMC_WRITE 0x00000001 ///< Write a Word into Flash Memory +/*\}*/ + +/** + * The following are defines for the bit fields in the FLASH_FCRIS register. + */ +/*\{*/ +#define FLASH_FCRIS_PRIS 0x00000002 ///< Programming Raw Interrupt Status +#define FLASH_FCRIS_ARIS 0x00000001 ///< Access Raw Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the FLASH_FCIM register. + */ +/*\{*/ +#define FLASH_FCIM_PMASK 0x00000002 ///< Programming Interrupt Mask +#define FLASH_FCIM_AMASK 0x00000001 ///< Access Interrupt Mask +/*\}*/ + +/** + * The following are defines for the bit fields in the FLASH_FCMISC register. + */ +/*\{*/ +#define FLASH_FCMISC_PMISC 0x00000002 ///< Programming Masked Interrupt + ///< Status and Clear +#define FLASH_FCMISC_AMISC 0x00000001 ///< Access Masked Interrupt Status + ///< and Clear +/*\}*/ + +/** + * The following are defines for the bit fields in the FLASH_USECRL register. + */ +/*\{*/ +#define FLASH_USECRL_M 0x000000FF ///< Microsecond Reload Value +#define FLASH_USECRL_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the FLASH_USERDBG register. + */ +/*\{*/ +#define FLASH_USERDBG_NW 0x80000000 ///< User Debug Not Written +#define FLASH_USERDBG_DATA_M 0x7FFFFFFC ///< User Data +#define FLASH_USERDBG_DBG1 0x00000002 ///< Debug Control 1 +#define FLASH_USERDBG_DBG0 0x00000001 ///< Debug Control 0 +#define FLASH_USERDBG_DATA_S 2 +/*\}*/ + +/** + * The following are defines for the bit fields in the FLASH_USERREG0 register. + */ +/*\{*/ +#define FLASH_USERREG0_NW 0x80000000 ///< Not Written +#define FLASH_USERREG0_DATA_M 0x7FFFFFFF ///< User Data +#define FLASH_USERREG0_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the FLASH_USERREG1 register. + */ +/*\{*/ +#define FLASH_USERREG1_NW 0x80000000 ///< Not Written +#define FLASH_USERREG1_DATA_M 0x7FFFFFFF ///< User Data +#define FLASH_USERREG1_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the erase size of the FLASH block that is +* erased by an erase operation, and the protect size is the size of the FLASH +* block that is protected by each protection register. + */ +/*\{*/ +#define FLASH_PROTECT_SIZE 0x00000800 +#define FLASH_ERASE_SIZE 0x00000400 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_INT_TYPE register. + */ +/*\{*/ +#define NVIC_INT_TYPE_LINES_M 0x0000001F ///< Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ST_CTRL register. + */ +/*\{*/ +#define NVIC_ST_CTRL_COUNT 0x00010000 ///< Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 ///< Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 ///< Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 ///< Counter mode +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ST_RELOAD register. + */ +/*\{*/ +#define NVIC_ST_RELOAD_M 0x00FFFFFF ///< Counter load value +#define NVIC_ST_RELOAD_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ST_CURRENT +* register. + */ +/*\{*/ +#define NVIC_ST_CURRENT_M 0x00FFFFFF ///< Counter current value +#define NVIC_ST_CURRENT_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ST_CAL register. + */ +/*\{*/ +#define NVIC_ST_CAL_NOREF 0x80000000 ///< No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 ///< Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF ///< 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_EN0 register. + */ +/*\{*/ +#define NVIC_EN0_INT31 0x80000000 ///< Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 ///< Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 ///< Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 ///< Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 ///< Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 ///< Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 ///< Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 ///< Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 ///< Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 ///< Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 ///< Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 ///< Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 ///< Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 ///< Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 ///< Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 ///< Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 ///< Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 ///< Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 ///< Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 ///< Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 ///< Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 ///< Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 ///< Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 ///< Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 ///< Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 ///< Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 ///< Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 ///< Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 ///< Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 ///< Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 ///< Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 ///< Interrupt 0 enable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_EN1 register. + */ +/*\{*/ +#define NVIC_EN1_INT59 0x08000000 ///< Interrupt 59 enable +#define NVIC_EN1_INT58 0x04000000 ///< Interrupt 58 enable +#define NVIC_EN1_INT57 0x02000000 ///< Interrupt 57 enable +#define NVIC_EN1_INT56 0x01000000 ///< Interrupt 56 enable +#define NVIC_EN1_INT55 0x00800000 ///< Interrupt 55 enable +#define NVIC_EN1_INT54 0x00400000 ///< Interrupt 54 enable +#define NVIC_EN1_INT53 0x00200000 ///< Interrupt 53 enable +#define NVIC_EN1_INT52 0x00100000 ///< Interrupt 52 enable +#define NVIC_EN1_INT51 0x00080000 ///< Interrupt 51 enable +#define NVIC_EN1_INT50 0x00040000 ///< Interrupt 50 enable +#define NVIC_EN1_INT49 0x00020000 ///< Interrupt 49 enable +#define NVIC_EN1_INT48 0x00010000 ///< Interrupt 48 enable +#define NVIC_EN1_INT47 0x00008000 ///< Interrupt 47 enable +#define NVIC_EN1_INT46 0x00004000 ///< Interrupt 46 enable +#define NVIC_EN1_INT45 0x00002000 ///< Interrupt 45 enable +#define NVIC_EN1_INT44 0x00001000 ///< Interrupt 44 enable +#define NVIC_EN1_INT43 0x00000800 ///< Interrupt 43 enable +#define NVIC_EN1_INT42 0x00000400 ///< Interrupt 42 enable +#define NVIC_EN1_INT41 0x00000200 ///< Interrupt 41 enable +#define NVIC_EN1_INT40 0x00000100 ///< Interrupt 40 enable +#define NVIC_EN1_INT39 0x00000080 ///< Interrupt 39 enable +#define NVIC_EN1_INT38 0x00000040 ///< Interrupt 38 enable +#define NVIC_EN1_INT37 0x00000020 ///< Interrupt 37 enable +#define NVIC_EN1_INT36 0x00000010 ///< Interrupt 36 enable +#define NVIC_EN1_INT35 0x00000008 ///< Interrupt 35 enable +#define NVIC_EN1_INT34 0x00000004 ///< Interrupt 34 enable +#define NVIC_EN1_INT33 0x00000002 ///< Interrupt 33 enable +#define NVIC_EN1_INT32 0x00000001 ///< Interrupt 32 enable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DIS0 register. + */ +/*\{*/ +#define NVIC_DIS0_INT31 0x80000000 ///< Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 ///< Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 ///< Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 ///< Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 ///< Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 ///< Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 ///< Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 ///< Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 ///< Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 ///< Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 ///< Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 ///< Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 ///< Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 ///< Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 ///< Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 ///< Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 ///< Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 ///< Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 ///< Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 ///< Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 ///< Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 ///< Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 ///< Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 ///< Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 ///< Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 ///< Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 ///< Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 ///< Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 ///< Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 ///< Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 ///< Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 ///< Interrupt 0 disable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DIS1 register. + */ +/*\{*/ +#define NVIC_DIS1_INT59 0x08000000 ///< Interrupt 59 disable +#define NVIC_DIS1_INT58 0x04000000 ///< Interrupt 58 disable +#define NVIC_DIS1_INT57 0x02000000 ///< Interrupt 57 disable +#define NVIC_DIS1_INT56 0x01000000 ///< Interrupt 56 disable +#define NVIC_DIS1_INT55 0x00800000 ///< Interrupt 55 disable +#define NVIC_DIS1_INT54 0x00400000 ///< Interrupt 54 disable +#define NVIC_DIS1_INT53 0x00200000 ///< Interrupt 53 disable +#define NVIC_DIS1_INT52 0x00100000 ///< Interrupt 52 disable +#define NVIC_DIS1_INT51 0x00080000 ///< Interrupt 51 disable +#define NVIC_DIS1_INT50 0x00040000 ///< Interrupt 50 disable +#define NVIC_DIS1_INT49 0x00020000 ///< Interrupt 49 disable +#define NVIC_DIS1_INT48 0x00010000 ///< Interrupt 48 disable +#define NVIC_DIS1_INT47 0x00008000 ///< Interrupt 47 disable +#define NVIC_DIS1_INT46 0x00004000 ///< Interrupt 46 disable +#define NVIC_DIS1_INT45 0x00002000 ///< Interrupt 45 disable +#define NVIC_DIS1_INT44 0x00001000 ///< Interrupt 44 disable +#define NVIC_DIS1_INT43 0x00000800 ///< Interrupt 43 disable +#define NVIC_DIS1_INT42 0x00000400 ///< Interrupt 42 disable +#define NVIC_DIS1_INT41 0x00000200 ///< Interrupt 41 disable +#define NVIC_DIS1_INT40 0x00000100 ///< Interrupt 40 disable +#define NVIC_DIS1_INT39 0x00000080 ///< Interrupt 39 disable +#define NVIC_DIS1_INT38 0x00000040 ///< Interrupt 38 disable +#define NVIC_DIS1_INT37 0x00000020 ///< Interrupt 37 disable +#define NVIC_DIS1_INT36 0x00000010 ///< Interrupt 36 disable +#define NVIC_DIS1_INT35 0x00000008 ///< Interrupt 35 disable +#define NVIC_DIS1_INT34 0x00000004 ///< Interrupt 34 disable +#define NVIC_DIS1_INT33 0x00000002 ///< Interrupt 33 disable +#define NVIC_DIS1_INT32 0x00000001 ///< Interrupt 32 disable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PEND0 register. + */ +/*\{*/ +#define NVIC_PEND0_INT31 0x80000000 ///< Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 ///< Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 ///< Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 ///< Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 ///< Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 ///< Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 ///< Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 ///< Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 ///< Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 ///< Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 ///< Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 ///< Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 ///< Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 ///< Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 ///< Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 ///< Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 ///< Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 ///< Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 ///< Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 ///< Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 ///< Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 ///< Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 ///< Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 ///< Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 ///< Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 ///< Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 ///< Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 ///< Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 ///< Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 ///< Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 ///< Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 ///< Interrupt 0 pend +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PEND1 register. + */ +/*\{*/ +#define NVIC_PEND1_INT59 0x08000000 ///< Interrupt 59 pend +#define NVIC_PEND1_INT58 0x04000000 ///< Interrupt 58 pend +#define NVIC_PEND1_INT57 0x02000000 ///< Interrupt 57 pend +#define NVIC_PEND1_INT56 0x01000000 ///< Interrupt 56 pend +#define NVIC_PEND1_INT55 0x00800000 ///< Interrupt 55 pend +#define NVIC_PEND1_INT54 0x00400000 ///< Interrupt 54 pend +#define NVIC_PEND1_INT53 0x00200000 ///< Interrupt 53 pend +#define NVIC_PEND1_INT52 0x00100000 ///< Interrupt 52 pend +#define NVIC_PEND1_INT51 0x00080000 ///< Interrupt 51 pend +#define NVIC_PEND1_INT50 0x00040000 ///< Interrupt 50 pend +#define NVIC_PEND1_INT49 0x00020000 ///< Interrupt 49 pend +#define NVIC_PEND1_INT48 0x00010000 ///< Interrupt 48 pend +#define NVIC_PEND1_INT47 0x00008000 ///< Interrupt 47 pend +#define NVIC_PEND1_INT46 0x00004000 ///< Interrupt 46 pend +#define NVIC_PEND1_INT45 0x00002000 ///< Interrupt 45 pend +#define NVIC_PEND1_INT44 0x00001000 ///< Interrupt 44 pend +#define NVIC_PEND1_INT43 0x00000800 ///< Interrupt 43 pend +#define NVIC_PEND1_INT42 0x00000400 ///< Interrupt 42 pend +#define NVIC_PEND1_INT41 0x00000200 ///< Interrupt 41 pend +#define NVIC_PEND1_INT40 0x00000100 ///< Interrupt 40 pend +#define NVIC_PEND1_INT39 0x00000080 ///< Interrupt 39 pend +#define NVIC_PEND1_INT38 0x00000040 ///< Interrupt 38 pend +#define NVIC_PEND1_INT37 0x00000020 ///< Interrupt 37 pend +#define NVIC_PEND1_INT36 0x00000010 ///< Interrupt 36 pend +#define NVIC_PEND1_INT35 0x00000008 ///< Interrupt 35 pend +#define NVIC_PEND1_INT34 0x00000004 ///< Interrupt 34 pend +#define NVIC_PEND1_INT33 0x00000002 ///< Interrupt 33 pend +#define NVIC_PEND1_INT32 0x00000001 ///< Interrupt 32 pend +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_UNPEND0 register. + */ +/*\{*/ +#define NVIC_UNPEND0_INT31 0x80000000 ///< Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 ///< Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 ///< Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 ///< Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 ///< Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 ///< Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 ///< Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 ///< Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 ///< Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 ///< Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 ///< Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 ///< Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 ///< Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 ///< Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 ///< Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 ///< Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 ///< Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 ///< Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 ///< Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 ///< Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 ///< Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 ///< Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 ///< Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 ///< Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 ///< Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 ///< Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 ///< Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 ///< Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 ///< Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 ///< Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 ///< Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 ///< Interrupt 0 unpend +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_UNPEND1 register. + */ +/*\{*/ +#define NVIC_UNPEND1_INT59 0x08000000 ///< Interrupt 59 unpend +#define NVIC_UNPEND1_INT58 0x04000000 ///< Interrupt 58 unpend +#define NVIC_UNPEND1_INT57 0x02000000 ///< Interrupt 57 unpend +#define NVIC_UNPEND1_INT56 0x01000000 ///< Interrupt 56 unpend +#define NVIC_UNPEND1_INT55 0x00800000 ///< Interrupt 55 unpend +#define NVIC_UNPEND1_INT54 0x00400000 ///< Interrupt 54 unpend +#define NVIC_UNPEND1_INT53 0x00200000 ///< Interrupt 53 unpend +#define NVIC_UNPEND1_INT52 0x00100000 ///< Interrupt 52 unpend +#define NVIC_UNPEND1_INT51 0x00080000 ///< Interrupt 51 unpend +#define NVIC_UNPEND1_INT50 0x00040000 ///< Interrupt 50 unpend +#define NVIC_UNPEND1_INT49 0x00020000 ///< Interrupt 49 unpend +#define NVIC_UNPEND1_INT48 0x00010000 ///< Interrupt 48 unpend +#define NVIC_UNPEND1_INT47 0x00008000 ///< Interrupt 47 unpend +#define NVIC_UNPEND1_INT46 0x00004000 ///< Interrupt 46 unpend +#define NVIC_UNPEND1_INT45 0x00002000 ///< Interrupt 45 unpend +#define NVIC_UNPEND1_INT44 0x00001000 ///< Interrupt 44 unpend +#define NVIC_UNPEND1_INT43 0x00000800 ///< Interrupt 43 unpend +#define NVIC_UNPEND1_INT42 0x00000400 ///< Interrupt 42 unpend +#define NVIC_UNPEND1_INT41 0x00000200 ///< Interrupt 41 unpend +#define NVIC_UNPEND1_INT40 0x00000100 ///< Interrupt 40 unpend +#define NVIC_UNPEND1_INT39 0x00000080 ///< Interrupt 39 unpend +#define NVIC_UNPEND1_INT38 0x00000040 ///< Interrupt 38 unpend +#define NVIC_UNPEND1_INT37 0x00000020 ///< Interrupt 37 unpend +#define NVIC_UNPEND1_INT36 0x00000010 ///< Interrupt 36 unpend +#define NVIC_UNPEND1_INT35 0x00000008 ///< Interrupt 35 unpend +#define NVIC_UNPEND1_INT34 0x00000004 ///< Interrupt 34 unpend +#define NVIC_UNPEND1_INT33 0x00000002 ///< Interrupt 33 unpend +#define NVIC_UNPEND1_INT32 0x00000001 ///< Interrupt 32 unpend +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ACTIVE0 register. + */ +/*\{*/ +#define NVIC_ACTIVE0_INT31 0x80000000 ///< Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 ///< Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 ///< Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 ///< Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 ///< Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 ///< Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 ///< Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 ///< Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 ///< Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 ///< Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 ///< Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 ///< Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 ///< Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 ///< Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 ///< Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 ///< Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 ///< Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 ///< Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 ///< Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 ///< Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 ///< Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 ///< Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 ///< Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 ///< Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 ///< Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 ///< Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 ///< Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 ///< Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 ///< Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 ///< Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 ///< Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 ///< Interrupt 0 active +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ACTIVE1 register. + */ +/*\{*/ +#define NVIC_ACTIVE1_INT59 0x08000000 ///< Interrupt 59 active +#define NVIC_ACTIVE1_INT58 0x04000000 ///< Interrupt 58 active +#define NVIC_ACTIVE1_INT57 0x02000000 ///< Interrupt 57 active +#define NVIC_ACTIVE1_INT56 0x01000000 ///< Interrupt 56 active +#define NVIC_ACTIVE1_INT55 0x00800000 ///< Interrupt 55 active +#define NVIC_ACTIVE1_INT54 0x00400000 ///< Interrupt 54 active +#define NVIC_ACTIVE1_INT53 0x00200000 ///< Interrupt 53 active +#define NVIC_ACTIVE1_INT52 0x00100000 ///< Interrupt 52 active +#define NVIC_ACTIVE1_INT51 0x00080000 ///< Interrupt 51 active +#define NVIC_ACTIVE1_INT50 0x00040000 ///< Interrupt 50 active +#define NVIC_ACTIVE1_INT49 0x00020000 ///< Interrupt 49 active +#define NVIC_ACTIVE1_INT48 0x00010000 ///< Interrupt 48 active +#define NVIC_ACTIVE1_INT47 0x00008000 ///< Interrupt 47 active +#define NVIC_ACTIVE1_INT46 0x00004000 ///< Interrupt 46 active +#define NVIC_ACTIVE1_INT45 0x00002000 ///< Interrupt 45 active +#define NVIC_ACTIVE1_INT44 0x00001000 ///< Interrupt 44 active +#define NVIC_ACTIVE1_INT43 0x00000800 ///< Interrupt 43 active +#define NVIC_ACTIVE1_INT42 0x00000400 ///< Interrupt 42 active +#define NVIC_ACTIVE1_INT41 0x00000200 ///< Interrupt 41 active +#define NVIC_ACTIVE1_INT40 0x00000100 ///< Interrupt 40 active +#define NVIC_ACTIVE1_INT39 0x00000080 ///< Interrupt 39 active +#define NVIC_ACTIVE1_INT38 0x00000040 ///< Interrupt 38 active +#define NVIC_ACTIVE1_INT37 0x00000020 ///< Interrupt 37 active +#define NVIC_ACTIVE1_INT36 0x00000010 ///< Interrupt 36 active +#define NVIC_ACTIVE1_INT35 0x00000008 ///< Interrupt 35 active +#define NVIC_ACTIVE1_INT34 0x00000004 ///< Interrupt 34 active +#define NVIC_ACTIVE1_INT33 0x00000002 ///< Interrupt 33 active +#define NVIC_ACTIVE1_INT32 0x00000001 ///< Interrupt 32 active +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI0 register. + */ +/*\{*/ +#define NVIC_PRI0_INT3_M 0xFF000000 ///< Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 ///< Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 ///< Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF ///< Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI1 register. + */ +/*\{*/ +#define NVIC_PRI1_INT7_M 0xFF000000 ///< Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 ///< Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 ///< Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF ///< Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI2 register. + */ +/*\{*/ +#define NVIC_PRI2_INT11_M 0xFF000000 ///< Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 ///< Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 ///< Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF ///< Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI3 register. + */ +/*\{*/ +#define NVIC_PRI3_INT15_M 0xFF000000 ///< Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 ///< Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 ///< Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF ///< Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI4 register. + */ +/*\{*/ +#define NVIC_PRI4_INT19_M 0xFF000000 ///< Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 ///< Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 ///< Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF ///< Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI5 register. + */ +/*\{*/ +#define NVIC_PRI5_INT23_M 0xFF000000 ///< Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 ///< Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 ///< Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF ///< Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI6 register. + */ +/*\{*/ +#define NVIC_PRI6_INT27_M 0xFF000000 ///< Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 ///< Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 ///< Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF ///< Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI7 register. + */ +/*\{*/ +#define NVIC_PRI7_INT31_M 0xFF000000 ///< Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 ///< Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 ///< Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF ///< Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI8 register. + */ +/*\{*/ +#define NVIC_PRI8_INT35_M 0xFF000000 ///< Interrupt 35 priority mask +#define NVIC_PRI8_INT34_M 0x00FF0000 ///< Interrupt 34 priority mask +#define NVIC_PRI8_INT33_M 0x0000FF00 ///< Interrupt 33 priority mask +#define NVIC_PRI8_INT32_M 0x000000FF ///< Interrupt 32 priority mask +#define NVIC_PRI8_INT35_S 24 +#define NVIC_PRI8_INT34_S 16 +#define NVIC_PRI8_INT33_S 8 +#define NVIC_PRI8_INT32_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI9 register. + */ +/*\{*/ +#define NVIC_PRI9_INT39_M 0xFF000000 ///< Interrupt 39 priority mask +#define NVIC_PRI9_INT38_M 0x00FF0000 ///< Interrupt 38 priority mask +#define NVIC_PRI9_INT37_M 0x0000FF00 ///< Interrupt 37 priority mask +#define NVIC_PRI9_INT36_M 0x000000FF ///< Interrupt 36 priority mask +#define NVIC_PRI9_INT39_S 24 +#define NVIC_PRI9_INT38_S 16 +#define NVIC_PRI9_INT37_S 8 +#define NVIC_PRI9_INT36_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI10 register. + */ +/*\{*/ +#define NVIC_PRI10_INT43_M 0xFF000000 ///< Interrupt 43 priority mask +#define NVIC_PRI10_INT42_M 0x00FF0000 ///< Interrupt 42 priority mask +#define NVIC_PRI10_INT41_M 0x0000FF00 ///< Interrupt 41 priority mask +#define NVIC_PRI10_INT40_M 0x000000FF ///< Interrupt 40 priority mask +#define NVIC_PRI10_INT43_S 24 +#define NVIC_PRI10_INT42_S 16 +#define NVIC_PRI10_INT41_S 8 +#define NVIC_PRI10_INT40_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_CPUID register. + */ +/*\{*/ +#define NVIC_CPUID_IMP_M 0xFF000000 ///< Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 ///< Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 ///< Processor part number +#define NVIC_CPUID_REV_M 0x0000000F ///< Revision +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_INT_CTRL register. + */ +/*\{*/ +#define NVIC_INT_CTRL_NMI_SET 0x80000000 ///< Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 ///< Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 ///< Unpend a PendSV +#define NVIC_INT_CTRL_PENDSTSET 0x04000000 ///< Set pending SysTick interrupt +#define NVIC_INT_CTRL_PENDSTCLR 0x02000000 ///< Clear pending SysTick interrupt +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 ///< Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 ///< Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 ///< Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 ///< Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF ///< Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_VTABLE register. + */ +/*\{*/ +#define NVIC_VTABLE_BASE 0x20000000 ///< Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 ///< Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_APINT register. + */ +/*\{*/ +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 ///< Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 ///< Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 ///< Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 ///< Priority group +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 ///< Priority group 0.8 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 ///< Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 ///< Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 ///< Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 ///< Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 ///< Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 ///< Priority group 6.2 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 ///< System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 ///< Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 ///< System reset +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 ///< Priority group 7.1 split +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_CTRL register. + */ +/*\{*/ +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 ///< Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 ///< Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 ///< Sleep on ISR exit +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_CFG_CTRL register. + */ +/*\{*/ +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 ///< Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 ///< Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 ///< Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 ///< Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 ///< Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 ///< Thread state control +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_PRI1 register. + */ +/*\{*/ +#define NVIC_SYS_PRI1_RES_M 0xFF000000 ///< Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 ///< Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 ///< Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF ///< Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_PRI2 register. + */ +/*\{*/ +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 ///< Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF ///< Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_PRI3 register. + */ +/*\{*/ +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 ///< Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 ///< Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 ///< Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF ///< Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_HND_CTRL +* register. + */ +/*\{*/ +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 ///< Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 ///< Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 ///< Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 ///< SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 ///< Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 ///< Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 ///< PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 ///< Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 ///< SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 ///< Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 ///< Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 ///< Mem manage is active +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_FAULT_STAT +* register. + */ +/*\{*/ +#define NVIC_FAULT_STAT_DIV0 0x02000000 ///< Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 ///< Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 ///< No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 ///< Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 ///< Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 ///< Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 ///< BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 ///< Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 ///< Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 ///< Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 ///< Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 ///< Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 ///< MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 ///< Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 ///< Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 ///< Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 ///< Instruction access violation +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_HFAULT_STAT +* register. + */ +/*\{*/ +#define NVIC_HFAULT_STAT_DBG 0x80000000 ///< Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 ///< Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 ///< Vector table read fault +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DEBUG_STAT +* register. + */ +/*\{*/ +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 ///< EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 ///< Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 ///< DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 ///< Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 ///< Halt request +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MM_ADDR register. + */ +/*\{*/ +#define NVIC_MM_ADDR_M 0xFFFFFFFF ///< Data fault address +#define NVIC_MM_ADDR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_FAULT_ADDR +* register. + */ +/*\{*/ +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF ///< Data bus fault address +#define NVIC_FAULT_ADDR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_TYPE register. + */ +/*\{*/ +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 ///< Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 ///< Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 ///< Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_CTRL register. + */ +/*\{*/ +#define NVIC_MPU_CTRL_PRIVDEFEN 0x00000004 ///< MPU default region in priv mode +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 ///< MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 ///< MPU enable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_NUMBER +* register. + */ +/*\{*/ +#define NVIC_MPU_NUMBER_M 0x000000FF ///< MPU region to access +#define NVIC_MPU_NUMBER_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_BASE register. + */ +/*\{*/ +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFFE0 ///< Base address mask +#define NVIC_MPU_BASE_VALID 0x00000010 ///< Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F ///< Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_ATTR register. + */ +/*\{*/ +#define NVIC_MPU_ATTR_M 0xFFFF0000 ///< Attributes +#define NVIC_MPU_ATTR_AP_NO_NO 0x00000000 ///< prv: no access, usr: no access +#define NVIC_MPU_ATTR_BUFFRABLE 0x00010000 ///< Bufferable +#define NVIC_MPU_ATTR_CACHEABLE 0x00020000 ///< Cacheable +#define NVIC_MPU_ATTR_SHAREABLE 0x00040000 ///< Shareable +#define NVIC_MPU_ATTR_TEX_M 0x00380000 ///< Type extension mask +#define NVIC_MPU_ATTR_AP_RW_NO 0x01000000 ///< prv: rw, usr: none +#define NVIC_MPU_ATTR_AP_RW_RO 0x02000000 ///< prv: rw, usr: read-only +#define NVIC_MPU_ATTR_AP_RW_RW 0x03000000 ///< prv: rw, usr: rw +#define NVIC_MPU_ATTR_AP_RO_NO 0x05000000 ///< prv: ro, usr: none +#define NVIC_MPU_ATTR_AP_RO_RO 0x06000000 ///< prv: ro, usr: ro +#define NVIC_MPU_ATTR_AP_M 0x07000000 ///< Access permissions mask +#define NVIC_MPU_ATTR_XN 0x10000000 ///< Execute disable +#define NVIC_MPU_ATTR_SRD_M 0x0000FF00 ///< Sub-region disable mask +#define NVIC_MPU_ATTR_SRD_0 0x00000100 ///< Sub-region 0 disable +#define NVIC_MPU_ATTR_SRD_1 0x00000200 ///< Sub-region 1 disable +#define NVIC_MPU_ATTR_SRD_2 0x00000400 ///< Sub-region 2 disable +#define NVIC_MPU_ATTR_SRD_3 0x00000800 ///< Sub-region 3 disable +#define NVIC_MPU_ATTR_SRD_4 0x00001000 ///< Sub-region 4 disable +#define NVIC_MPU_ATTR_SRD_5 0x00002000 ///< Sub-region 5 disable +#define NVIC_MPU_ATTR_SRD_6 0x00004000 ///< Sub-region 6 disable +#define NVIC_MPU_ATTR_SRD_7 0x00008000 ///< Sub-region 7 disable +#define NVIC_MPU_ATTR_SIZE_M 0x0000003E ///< Region size mask +#define NVIC_MPU_ATTR_SIZE_32B 0x00000008 ///< Region size 32 bytes +#define NVIC_MPU_ATTR_SIZE_64B 0x0000000A ///< Region size 64 bytes +#define NVIC_MPU_ATTR_SIZE_128B 0x0000000C ///< Region size 128 bytes +#define NVIC_MPU_ATTR_SIZE_256B 0x0000000E ///< Region size 256 bytes +#define NVIC_MPU_ATTR_SIZE_512B 0x00000010 ///< Region size 512 bytes +#define NVIC_MPU_ATTR_SIZE_1K 0x00000012 ///< Region size 1 Kbytes +#define NVIC_MPU_ATTR_SIZE_2K 0x00000014 ///< Region size 2 Kbytes +#define NVIC_MPU_ATTR_SIZE_4K 0x00000016 ///< Region size 4 Kbytes +#define NVIC_MPU_ATTR_SIZE_8K 0x00000018 ///< Region size 8 Kbytes +#define NVIC_MPU_ATTR_SIZE_16K 0x0000001A ///< Region size 16 Kbytes +#define NVIC_MPU_ATTR_SIZE_32K 0x0000001C ///< Region size 32 Kbytes +#define NVIC_MPU_ATTR_SIZE_64K 0x0000001E ///< Region size 64 Kbytes +#define NVIC_MPU_ATTR_SIZE_128K 0x00000020 ///< Region size 128 Kbytes +#define NVIC_MPU_ATTR_SIZE_256K 0x00000022 ///< Region size 256 Kbytes +#define NVIC_MPU_ATTR_SIZE_512K 0x00000024 ///< Region size 512 Kbytes +#define NVIC_MPU_ATTR_SIZE_1M 0x00000026 ///< Region size 1 Mbytes +#define NVIC_MPU_ATTR_SIZE_2M 0x00000028 ///< Region size 2 Mbytes +#define NVIC_MPU_ATTR_SIZE_4M 0x0000002A ///< Region size 4 Mbytes +#define NVIC_MPU_ATTR_SIZE_8M 0x0000002C ///< Region size 8 Mbytes +#define NVIC_MPU_ATTR_SIZE_16M 0x0000002E ///< Region size 16 Mbytes +#define NVIC_MPU_ATTR_SIZE_32M 0x00000030 ///< Region size 32 Mbytes +#define NVIC_MPU_ATTR_SIZE_64M 0x00000032 ///< Region size 64 Mbytes +#define NVIC_MPU_ATTR_SIZE_128M 0x00000034 ///< Region size 128 Mbytes +#define NVIC_MPU_ATTR_SIZE_256M 0x00000036 ///< Region size 256 Mbytes +#define NVIC_MPU_ATTR_SIZE_512M 0x00000038 ///< Region size 512 Mbytes +#define NVIC_MPU_ATTR_SIZE_1G 0x0000003A ///< Region size 1 Gbytes +#define NVIC_MPU_ATTR_SIZE_2G 0x0000003C ///< Region size 2 Gbytes +#define NVIC_MPU_ATTR_SIZE_4G 0x0000003E ///< Region size 4 Gbytes +#define NVIC_MPU_ATTR_ENABLE 0x00000001 ///< Region enable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DBG_CTRL register. + */ +/*\{*/ +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 ///< Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 ///< Debug key +#define NVIC_DBG_CTRL_S_RESET_ST \ + 0x02000000 ///< Core has reset since last read +#define NVIC_DBG_CTRL_S_RETIRE_ST \ + 0x01000000 ///< Core has executed insruction + ///< since last read +#define NVIC_DBG_CTRL_S_LOCKUP 0x00080000 ///< Core is locked up +#define NVIC_DBG_CTRL_S_SLEEP 0x00040000 ///< Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00020000 ///< Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00010000 ///< Register read/write available +#define NVIC_DBG_CTRL_C_SNAPSTALL \ + 0x00000020 ///< Breaks a stalled load/store +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 ///< Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 ///< Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 ///< Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 ///< Enable debug +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DBG_XFER register. + */ +/*\{*/ +#define NVIC_DBG_XFER_REG_WNR 0x00010000 ///< Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F ///< Register +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 ///< Control/Fault/BasePri/PriMask +#define NVIC_DBG_XFER_REG_DSP 0x00000013 ///< Deep SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 ///< Process SP +#define NVIC_DBG_XFER_REG_MSP 0x00000011 ///< Main SP +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 ///< xPSR/Flags register +#define NVIC_DBG_XFER_REG_R15 0x0000000F ///< Register R15 +#define NVIC_DBG_XFER_REG_R14 0x0000000E ///< Register R14 +#define NVIC_DBG_XFER_REG_R13 0x0000000D ///< Register R13 +#define NVIC_DBG_XFER_REG_R12 0x0000000C ///< Register R12 +#define NVIC_DBG_XFER_REG_R11 0x0000000B ///< Register R11 +#define NVIC_DBG_XFER_REG_R10 0x0000000A ///< Register R10 +#define NVIC_DBG_XFER_REG_R9 0x00000009 ///< Register R9 +#define NVIC_DBG_XFER_REG_R8 0x00000008 ///< Register R8 +#define NVIC_DBG_XFER_REG_R7 0x00000007 ///< Register R7 +#define NVIC_DBG_XFER_REG_R6 0x00000006 ///< Register R6 +#define NVIC_DBG_XFER_REG_R5 0x00000005 ///< Register R5 +#define NVIC_DBG_XFER_REG_R4 0x00000004 ///< Register R4 +#define NVIC_DBG_XFER_REG_R3 0x00000003 ///< Register R3 +#define NVIC_DBG_XFER_REG_R2 0x00000002 ///< Register R2 +#define NVIC_DBG_XFER_REG_R1 0x00000001 ///< Register R1 +#define NVIC_DBG_XFER_REG_R0 0x00000000 ///< Register R0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DBG_DATA register. + */ +/*\{*/ +#define NVIC_DBG_DATA_M 0xFFFFFFFF ///< Data temporary cache +#define NVIC_DBG_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DBG_INT register. + */ +/*\{*/ +#define NVIC_DBG_INT_HARDERR 0x00000400 ///< Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 ///< Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 ///< Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 ///< Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 ///< Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 ///< Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 ///< Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 ///< Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 ///< Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 ///< Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 ///< Reset vector catch +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SW_TRIG register. + */ +/*\{*/ +#define NVIC_SW_TRIG_INTID_M 0x000003FF ///< Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 +/*\}*/ + +/** + * The following definitions are deprecated. + */ +#ifndef DEPRECATED + +/** + * Deprecated defines for the Watchdog + */ +/*\{*/ +#define WATCHDOG_LOAD_R (*((reg32_t *)0x40000000)) +#define WATCHDOG_VALUE_R (*((reg32_t *)0x40000004)) +#define WATCHDOG_CTL_R (*((reg32_t *)0x40000008)) +#define WATCHDOG_ICR_R (*((reg32_t *)0x4000000C)) +#define WATCHDOG_RIS_R (*((reg32_t *)0x40000010)) +#define WATCHDOG_MIS_R (*((reg32_t *)0x40000014)) +#define WATCHDOG_TEST_R (*((reg32_t *)0x40000418)) +#define WATCHDOG_LOCK_R (*((reg32_t *)0x40000C00)) +/*\}*/ + +/** + * Deprecated defines for the bit fields in the I2C_O_SICR register. + */ +/*\{*/ +#define I2C_SICR_IC 0x00000001 ///< Clear Interrupt +/*\}*/ + +/** + * Deprecated defines for the bit fields in the I2C_O_SMIS register. + */ +/*\{*/ +#define I2C_SMIS_MIS 0x00000001 ///< Masked Interrupt Status +/*\}*/ + +/** + * Deprecated defines for the bit fields in the I2C_O_SRIS register. + */ +/*\{*/ +#define I2C_SRIS_RIS 0x00000001 ///< Raw Interrupt Status +/*\}*/ + +/** + * Deprecated defines for the bit fields in the I2C_O_SIMR register. + */ +/*\{*/ +#define I2C_SIMR_IM 0x00000001 ///< Interrupt Mask +/*\}*/ + +/** + * Deprecated defines for the bit fields in the the interpretation of the data +* in the SSFIFOx when the ADC TMLB is enabled. register. + */ +/*\{*/ +#define ADC_TMLB_CNT_M 0x000003C0 ///< Continuous Sample Counter +#define ADC_TMLB_CONT 0x00000020 ///< Continuation Sample Indicator +#define ADC_TMLB_DIFF 0x00000010 ///< Differential Sample Indicator +#define ADC_TMLB_TS 0x00000008 ///< Temp Sensor Sample Indicator +#define ADC_TMLB_MUX_M 0x00000007 ///< Analog Input Indicator +#define ADC_TMLB_CNT_S 6 ///< Sample counter shift +#define ADC_TMLB_MUX_S 0 ///< Input channel number shift +/*\}*/ + +/** + * Deprecated defines for the ADC register offsets. + */ +/*\{*/ +#define ADC_ACTSS_R (*((reg32_t *)0x40038000)) +#define ADC_RIS_R (*((reg32_t *)0x40038004)) +#define ADC_IM_R (*((reg32_t *)0x40038008)) +#define ADC_ISC_R (*((reg32_t *)0x4003800C)) +#define ADC_OSTAT_R (*((reg32_t *)0x40038010)) +#define ADC_EMUX_R (*((reg32_t *)0x40038014)) +#define ADC_USTAT_R (*((reg32_t *)0x40038018)) +#define ADC_SSPRI_R (*((reg32_t *)0x40038020)) +#define ADC_PSSI_R (*((reg32_t *)0x40038028)) +#define ADC_SAC_R (*((reg32_t *)0x40038030)) +#define ADC_SSMUX0_R (*((reg32_t *)0x40038040)) +#define ADC_SSCTL0_R (*((reg32_t *)0x40038044)) +#define ADC_SSFIFO0_R (*((reg32_t *)0x40038048)) +#define ADC_SSFSTAT0_R (*((reg32_t *)0x4003804C)) +#define ADC_SSMUX1_R (*((reg32_t *)0x40038060)) +#define ADC_SSCTL1_R (*((reg32_t *)0x40038064)) +#define ADC_SSFIFO1_R (*((reg32_t *)0x40038068)) +#define ADC_SSFSTAT1_R (*((reg32_t *)0x4003806C)) +#define ADC_SSMUX2_R (*((reg32_t *)0x40038080)) +#define ADC_SSCTL2_R (*((reg32_t *)0x40038084)) +#define ADC_SSFIFO2_R (*((reg32_t *)0x40038088)) +#define ADC_SSFSTAT2_R (*((reg32_t *)0x4003808C)) +#define ADC_SSMUX3_R (*((reg32_t *)0x400380A0)) +#define ADC_SSCTL3_R (*((reg32_t *)0x400380A4)) +#define ADC_SSFIFO3_R (*((reg32_t *)0x400380A8)) +#define ADC_SSFSTAT3_R (*((reg32_t *)0x400380AC)) +#define ADC_TMLB_R (*((reg32_t *)0x40038100)) +/*\}*/ + +/** + * Deprecated defines for the bit fields in the FLASH_FMC register. + */ +/*\{*/ +#define FLASH_FMC_WRKEY_M 0xFFFF0000 ///< Flash Memory Write Key +#define FLASH_FMC_WRKEY_S 16 +/*\}*/ + +/** + * Deprecated defines for the bit fields in the SYSCTL_DID1 register. + */ +/*\{*/ +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 ///< SOIC package +#define SYSCTL_DID1_PKG_48QFP 0x00000008 ///< QFP package +/*\}*/ + +/** + * Deprecated defines for the NVIC register addresses. + */ +/*\{*/ +#define NVIC_MPU_R (*((reg32_t *)0xE000ED9C)) +/*\}*/ + +#endif /* DEPRECATED */ + +#endif /* LM3S1968_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/lm3s_gpio.h b/2.5/bertos/cpu/cortex-m3/io/lm3s_gpio.h new file mode 100644 index 00000000..8b1c0f99 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/lm3s_gpio.h @@ -0,0 +1,603 @@ +/** + * \file + * + * + * \brief LM3S1968 GPIO hardware definitions. + */ + +#ifndef LM3S_GPIO_H +#define LM3S_GPIO_H + +/** + * The following are defines for the GPIO register offsets. + */ +/*\{*/ +#define GPIO_O_DATA 0x00000000 //< GPIO Data +#define GPIO_O_DIR 0x00000400 //< GPIO Direction +#define GPIO_O_IS 0x00000404 //< GPIO Interrupt Sense +#define GPIO_O_IBE 0x00000408 //< GPIO Interrupt Both Edges +#define GPIO_O_IEV 0x0000040C //< GPIO Interrupt Event +#define GPIO_O_IM 0x00000410 //< GPIO Interrupt Mask +#define GPIO_O_RIS 0x00000414 //< GPIO Raw Interrupt Status +#define GPIO_O_MIS 0x00000418 //< GPIO Masked Interrupt Status +#define GPIO_O_ICR 0x0000041C //< GPIO Interrupt Clear +#define GPIO_O_AFSEL 0x00000420 //< GPIO Alternate Function Select +#define GPIO_O_DR2R 0x00000500 //< GPIO 2-mA Drive Select +#define GPIO_O_DR4R 0x00000504 //< GPIO 4-mA Drive Select +#define GPIO_O_DR8R 0x00000508 //< GPIO 8-mA Drive Select +#define GPIO_O_ODR 0x0000050C //< GPIO Open Drain Select +#define GPIO_O_PUR 0x00000510 //< GPIO Pull-Up Select +#define GPIO_O_PDR 0x00000514 //< GPIO Pull-Down Select +#define GPIO_O_SLR 0x00000518 //< GPIO Slew Rate Control Select +#define GPIO_O_DEN 0x0000051C //< GPIO Digital Enable +#define GPIO_O_LOCK 0x00000520 //< GPIO Lock +#define GPIO_O_CR 0x00000524 //< GPIO Commit +#define GPIO_O_AMSEL 0x00000528 //< GPIO Analog Mode Select +#define GPIO_O_PCTL 0x0000052C //< GPIO Port Control +/*\}*/ + +/** + * The following are defines for the bit fields in the GPIO_O_LOCK register. + */ +/*\{*/ +#define GPIO_LOCK_M 0xFFFFFFFF //< GPIO Lock +#define GPIO_LOCK_UNLOCKED 0x00000000 //< The GPIOCR register is unlocked + //< and may be modified +#define GPIO_LOCK_LOCKED 0x00000001 //< The GPIOCR register is locked + //< and may not be modified +#define GPIO_LOCK_KEY 0x1ACCE551 //< Unlocks the GPIO_CR register +#define GPIO_LOCK_KEY_DD 0x4C4F434B //< Unlocks the GPIO_CR register on + //< DustDevil-class devices and + //< later +/*\}*/ + +/** + * The following are defines for the bit fields in the GPIO_PCTL register for + * port A. + */ +/*\{*/ +#define GPIO_PCTL_PA0_M 0x0000000F //< PA0 mask +#define GPIO_PCTL_PA0_U0RX 0x00000001 //< U0RX on PA0 +#define GPIO_PCTL_PA0_I2C1SCL 0x00000008 //< I2C1SCL on PA0 +#define GPIO_PCTL_PA0_U1RX 0x00000009 //< U1RX on PA0 +#define GPIO_PCTL_PA1_M 0x000000F0 //< PA1 mask +#define GPIO_PCTL_PA1_U0TX 0x00000010 //< U0TX on PA1 +#define GPIO_PCTL_PA1_I2C1SDA 0x00000080 //< I2C1SDA on PA1 +#define GPIO_PCTL_PA1_U1TX 0x00000090 //< U1TX on PA1 +#define GPIO_PCTL_PA2_M 0x00000F00 //< PA2 mask +#define GPIO_PCTL_PA2_SSI0CLK 0x00000100 //< SSI0CLK on PA2 +#define GPIO_PCTL_PA2_PWM4 0x00000400 //< PWM4 on PA2 +#define GPIO_PCTL_PA2_I2S0RXSD 0x00000900 //< I2S0RXSD on PA2 +#define GPIO_PCTL_PA3_M 0x0000F000 //< PA3 mask +#define GPIO_PCTL_PA3_SSI0FSS 0x00001000 //< SSI0FSS on PA3 +#define GPIO_PCTL_PA3_PWM5 0x00004000 //< PWM5 on PA3 +#define GPIO_PCTL_PA3_I2S0RXMCLK \ + 0x00009000 //< I2S0RXMCLK on PA3 +#define GPIO_PCTL_PA4_M 0x000F0000 //< PA4 mask +#define GPIO_PCTL_PA4_SSI0RX 0x00010000 //< SSI0RX on PA4 +#define GPIO_PCTL_PA4_PWM6 0x00040000 //< PWM6 on PA4 +#define GPIO_PCTL_PA4_CAN0RX 0x00050000 //< CAN0RX on PA4 +#define GPIO_PCTL_PA4_I2S0TXSCK 0x00090000 //< I2S0TXSCK on PA4 +#define GPIO_PCTL_PA5_M 0x00F00000 //< PA5 mask +#define GPIO_PCTL_PA5_SSI0TX 0x00100000 //< SSI0TX on PA5 +#define GPIO_PCTL_PA5_PWM7 0x00400000 //< PWM7 on PA5 +#define GPIO_PCTL_PA5_CAN0TX 0x00500000 //< CAN0TX on PA5 +#define GPIO_PCTL_PA5_I2S0TXWS 0x00900000 //< I2S0TXWS on PA5 +#define GPIO_PCTL_PA6_M 0x0F000000 //< PA6 mask +#define GPIO_PCTL_PA6_I2C1SCL 0x01000000 //< I2C1SCL on PA6 +#define GPIO_PCTL_PA6_CCP1 0x02000000 //< CCP1 on PA6 +#define GPIO_PCTL_PA6_PWM0 0x04000000 //< PWM0 on PA6 +#define GPIO_PCTL_PA6_PWM4 0x05000000 //< PWM4 on PA6 +#define GPIO_PCTL_PA6_CAN0RX 0x06000000 //< CAN0RX on PA6 +#define GPIO_PCTL_PA6_USB0EPEN 0x08000000 //< USB0EPEN on PA6 +#define GPIO_PCTL_PA6_U1CTS 0x09000000 //< U1CTS on PA6 +#define GPIO_PCTL_PA7_M 0xF0000000 //< PA7 mask +#define GPIO_PCTL_PA7_I2C1SDA 0x10000000 //< I2C1SDA on PA7 +#define GPIO_PCTL_PA7_CCP4 0x20000000 //< CCP4 on PA7 +#define GPIO_PCTL_PA7_PWM1 0x40000000 //< PWM1 on PA7 +#define GPIO_PCTL_PA7_PWM5 0x50000000 //< PWM5 on PA7 +#define GPIO_PCTL_PA7_CAN0TX 0x60000000 //< CAN0TX on PA7 +#define GPIO_PCTL_PA7_CCP3 0x70000000 //< CCP3 on PA7 +#define GPIO_PCTL_PA7_USB0PFLT 0x80000000 //< USB0PFLT on PA7 +#define GPIO_PCTL_PA7_U1DCD 0x90000000 //< U1DCD on PA7 +/*\}*/ + +/** + * The following are defines for the bit fields in the GPIO_PCTL register for + * port B. + */ +/*\{*/ +#define GPIO_PCTL_PB0_M 0x0000000F //< PB0 mask +#define GPIO_PCTL_PB0_CCP0 0x00000001 //< CCP0 on PB0 +#define GPIO_PCTL_PB0_PWM2 0x00000002 //< PWM2 on PB0 +#define GPIO_PCTL_PB0_U1RX 0x00000005 //< U1RX on PB0 +#define GPIO_PCTL_PB1_M 0x000000F0 //< PB1 mask +#define GPIO_PCTL_PB1_CCP2 0x00000010 //< CCP2 on PB1 +#define GPIO_PCTL_PB1_PWM3 0x00000020 //< PWM3 on PB1 +#define GPIO_PCTL_PB1_CCP1 0x00000040 //< CCP1 on PB1 +#define GPIO_PCTL_PB1_U1TX 0x00000050 //< U1TX on PB1 +#define GPIO_PCTL_PB2_M 0x00000F00 //< PB2 mask +#define GPIO_PCTL_PB2_I2C0SCL 0x00000100 //< I2C0SCL on PB2 +#define GPIO_PCTL_PB2_IDX0 0x00000200 //< IDX0 on PB2 +#define GPIO_PCTL_PB2_CCP3 0x00000400 //< CCP3 on PB2 +#define GPIO_PCTL_PB2_CCP0 0x00000500 //< CCP0 on PB2 +#define GPIO_PCTL_PB2_USB0EPEN 0x00000800 //< USB0EPEN on PB2 +#define GPIO_PCTL_PB3_M 0x0000F000 //< PB3 mask +#define GPIO_PCTL_PB3_I2C0SDA 0x00001000 //< I2C0SDA on PB3 +#define GPIO_PCTL_PB3_FAULT0 0x00002000 //< FAULT0 on PB3 +#define GPIO_PCTL_PB3_FAULT3 0x00004000 //< FAULT3 on PB3 +#define GPIO_PCTL_PB3_USB0PFLT 0x00008000 //< USB0PFLT on PB3 +#define GPIO_PCTL_PB4_M 0x000F0000 //< PB4 mask +#define GPIO_PCTL_PB4_U2RX 0x00040000 //< U2RX on PB4 +#define GPIO_PCTL_PB4_CAN0RX 0x00050000 //< CAN0RX on PB4 +#define GPIO_PCTL_PB4_IDX0 0x00060000 //< IDX0 on PB4 +#define GPIO_PCTL_PB4_U1RX 0x00070000 //< U1RX on PB4 +#define GPIO_PCTL_PB4_EPI0S23 0x00080000 //< EPI0S23 on PB4 +#define GPIO_PCTL_PB5_M 0x00F00000 //< PB5 mask +#define GPIO_PCTL_PB5_C0O 0x00100000 //< C0O on PB5 +#define GPIO_PCTL_PB5_CCP5 0x00200000 //< CCP5 on PB5 +#define GPIO_PCTL_PB5_CCP6 0x00300000 //< CCP6 on PB5 +#define GPIO_PCTL_PB5_CCP0 0x00400000 //< CCP0 on PB5 +#define GPIO_PCTL_PB5_CAN0TX 0x00500000 //< CAN0TX on PB5 +#define GPIO_PCTL_PB5_CCP2 0x00600000 //< CCP2 on PB5 +#define GPIO_PCTL_PB5_U1TX 0x00700000 //< U1TX on PB5 +#define GPIO_PCTL_PB5_EPI0S22 0x00800000 //< EPI0S22 on PB5 +#define GPIO_PCTL_PB6_M 0x0F000000 //< PB6 mask +#define GPIO_PCTL_PB6_CCP1 0x01000000 //< CCP1 on PB6 +#define GPIO_PCTL_PB6_CCP7 0x02000000 //< CCP7 on PB6 +#define GPIO_PCTL_PB6_C0O 0x03000000 //< C0O on PB6 +#define GPIO_PCTL_PB6_FAULT1 0x04000000 //< FAULT1 on PB6 +#define GPIO_PCTL_PB6_IDX0 0x05000000 //< IDX0 on PB6 +#define GPIO_PCTL_PB6_CCP5 0x06000000 //< CCP5 on PB6 +#define GPIO_PCTL_PB6_I2S0TXSCK 0x09000000 //< I2S0TXSCK on PB6 +#define GPIO_PCTL_PB7_M 0xF0000000 //< PB7 mask +#define GPIO_PCTL_PB7_NMI 0x40000000 //< NMI on PB7 +/*\}*/ + +/** + * The following are defines for the bit fields in the GPIO_PCTL register for + * port C. + */ +/*\{*/ +#define GPIO_PCTL_PC0_M 0x0000000F //< PC0 mask +#define GPIO_PCTL_PC0_TCK 0x00000003 //< TCK on PC0 +#define GPIO_PCTL_PC1_M 0x000000F0 //< PC1 mask +#define GPIO_PCTL_PC1_TMS 0x00000030 //< TMS on PC1 +#define GPIO_PCTL_PC2_M 0x00000F00 //< PC2 mask +#define GPIO_PCTL_PC2_TDI 0x00000300 //< TDI on PC2 +#define GPIO_PCTL_PC3_M 0x0000F000 //< PC3 mask +#define GPIO_PCTL_PC3_TDO 0x00003000 //< TDO on PC3 +#define GPIO_PCTL_PC4_M 0x000F0000 //< PC4 mask +#define GPIO_PCTL_PC4_CCP5 0x00010000 //< CCP5 on PC4 +#define GPIO_PCTL_PC4_PHA0 0x00020000 //< PHA0 on PC4 +#define GPIO_PCTL_PC4_PWM6 0x00040000 //< PWM6 on PC4 +#define GPIO_PCTL_PC4_CCP2 0x00050000 //< CCP2 on PC4 +#define GPIO_PCTL_PC4_CCP4 0x00060000 //< CCP4 on PC4 +#define GPIO_PCTL_PC4_EPI0S2 0x00080000 //< EPI0S2 on PC4 +#define GPIO_PCTL_PC4_CCP1 0x00090000 //< CCP1 on PC4 +#define GPIO_PCTL_PC5_M 0x00F00000 //< PC5 mask +#define GPIO_PCTL_PC5_CCP1 0x00100000 //< CCP1 on PC5 +#define GPIO_PCTL_PC5_C1O 0x00200000 //< C1O on PC5 +#define GPIO_PCTL_PC5_C0O 0x00300000 //< C0O on PC5 +#define GPIO_PCTL_PC5_FAULT2 0x00400000 //< FAULT2 on PC5 +#define GPIO_PCTL_PC5_CCP3 0x00500000 //< CCP3 on PC5 +#define GPIO_PCTL_PC5_USB0EPEN 0x00600000 //< USB0EPEN on PC5 +#define GPIO_PCTL_PC5_EPI0S3 0x00800000 //< EPI0S3 on PC5 +#define GPIO_PCTL_PC6_M 0x0F000000 //< PC6 mask +#define GPIO_PCTL_PC6_CCP3 0x01000000 //< CCP3 on PC6 +#define GPIO_PCTL_PC6_PHB0 0x02000000 //< PHB0 on PC6 +#define GPIO_PCTL_PC6_C2O 0x03000000 //< C2O on PC6 +#define GPIO_PCTL_PC6_PWM7 0x04000000 //< PWM7 on PC6 +#define GPIO_PCTL_PC6_U1RX 0x05000000 //< U1RX on PC6 +#define GPIO_PCTL_PC6_CCP0 0x06000000 //< CCP0 on PC6 +#define GPIO_PCTL_PC6_USB0PFLT 0x07000000 //< USB0PFLT on PC6 +#define GPIO_PCTL_PC6_EPI0S4 0x08000000 //< EPI0S4 on PC6 +#define GPIO_PCTL_PC7_M 0xF0000000 //< PC7 mask +#define GPIO_PCTL_PC7_CCP4 0x10000000 //< CCP4 on PC7 +#define GPIO_PCTL_PC7_PHB0 0x20000000 //< PHB0 on PC7 +#define GPIO_PCTL_PC7_CCP0 0x40000000 //< CCP0 on PC7 +#define GPIO_PCTL_PC7_U1TX 0x50000000 //< U1TX on PC7 +#define GPIO_PCTL_PC7_USB0PFLT 0x60000000 //< USB0PFLT on PC7 +#define GPIO_PCTL_PC7_C1O 0x70000000 //< C1O on PC7 +#define GPIO_PCTL_PC7_EPI0S5 0x80000000 //< EPI0S5 on PC7 +/*\}*/ + +/** + * The following are defines for the bit fields in the GPIO_PCTL register for + * port D. + */ +/*\{*/ +#define GPIO_PCTL_PD0_M 0x0000000F //< PD0 mask +#define GPIO_PCTL_PD0_PWM0 0x00000001 //< PWM0 on PD0 +#define GPIO_PCTL_PD0_CAN0RX 0x00000002 //< CAN0RX on PD0 +#define GPIO_PCTL_PD0_IDX0 0x00000003 //< IDX0 on PD0 +#define GPIO_PCTL_PD0_U2RX 0x00000004 //< U2RX on PD0 +#define GPIO_PCTL_PD0_U1RX 0x00000005 //< U1RX on PD0 +#define GPIO_PCTL_PD0_CCP6 0x00000006 //< CCP6 on PD0 +#define GPIO_PCTL_PD0_I2S0RXSCK 0x00000008 //< I2S0RXSCK on PD0 +#define GPIO_PCTL_PD0_U1CTS 0x00000009 //< U1CTS on PD0 +#define GPIO_PCTL_PD1_M 0x000000F0 //< PD1 mask +#define GPIO_PCTL_PD1_PWM1 0x00000010 //< PWM1 on PD1 +#define GPIO_PCTL_PD1_CAN0TX 0x00000020 //< CAN0TX on PD1 +#define GPIO_PCTL_PD1_PHA0 0x00000030 //< PHA0 on PD1 +#define GPIO_PCTL_PD1_U2TX 0x00000040 //< U2TX on PD1 +#define GPIO_PCTL_PD1_U1TX 0x00000050 //< U1TX on PD1 +#define GPIO_PCTL_PD1_CCP7 0x00000060 //< CCP7 on PD1 +#define GPIO_PCTL_PD1_I2S0RXWS 0x00000080 //< I2S0RXWS on PD1 +#define GPIO_PCTL_PD1_U1DCD 0x00000090 //< U1DCD on PD1 +#define GPIO_PCTL_PD1_CCP2 0x000000A0 //< CCP2 on PD1 +#define GPIO_PCTL_PD1_PHB1 0x000000B0 //< PHB1 on PD1 +#define GPIO_PCTL_PD2_M 0x00000F00 //< PD2 mask +#define GPIO_PCTL_PD2_U1RX 0x00000100 //< U1RX on PD2 +#define GPIO_PCTL_PD2_CCP6 0x00000200 //< CCP6 on PD2 +#define GPIO_PCTL_PD2_PWM2 0x00000300 //< PWM2 on PD2 +#define GPIO_PCTL_PD2_CCP5 0x00000400 //< CCP5 on PD2 +#define GPIO_PCTL_PD2_EPI0S20 0x00000800 //< EPI0S20 on PD2 +#define GPIO_PCTL_PD3_M 0x0000F000 //< PD3 mask +#define GPIO_PCTL_PD3_U1TX 0x00001000 //< U1TX on PD3 +#define GPIO_PCTL_PD3_CCP7 0x00002000 //< CCP7 on PD3 +#define GPIO_PCTL_PD3_PWM3 0x00003000 //< PWM3 on PD3 +#define GPIO_PCTL_PD3_CCP0 0x00004000 //< CCP0 on PD3 +#define GPIO_PCTL_PD3_EPI0S21 0x00008000 //< EPI0S21 on PD3 +#define GPIO_PCTL_PD4_M 0x000F0000 //< PD4 mask +#define GPIO_PCTL_PD4_CCP0 0x00010000 //< CCP0 on PD4 +#define GPIO_PCTL_PD4_CCP3 0x00020000 //< CCP3 on PD4 +#define GPIO_PCTL_PD4_I2S0RXSD 0x00080000 //< I2S0RXSD on PD4 +#define GPIO_PCTL_PD4_U1RI 0x00090000 //< U1RI on PD4 +#define GPIO_PCTL_PD4_EPI0S19 0x000A0000 //< EPI0S19 on PD4 +#define GPIO_PCTL_PD5_M 0x00F00000 //< PD5 mask +#define GPIO_PCTL_PD5_CCP2 0x00100000 //< CCP2 on PD5 +#define GPIO_PCTL_PD5_CCP4 0x00200000 //< CCP4 on PD5 +#define GPIO_PCTL_PD5_I2S0RXMCLK \ + 0x00800000 //< I2S0RXMCLK on PD5 +#define GPIO_PCTL_PD5_U2RX 0x00900000 //< U2RX on PD5 +#define GPIO_PCTL_PD5_EPI0S28 0x00A00000 //< EPI0S28 on PD5 +#define GPIO_PCTL_PD6_M 0x0F000000 //< PD6 mask +#define GPIO_PCTL_PD6_FAULT0 0x01000000 //< FAULT0 on PD6 +#define GPIO_PCTL_PD6_I2S0TXSCK 0x08000000 //< I2S0TXSCK on PD6 +#define GPIO_PCTL_PD6_U2TX 0x09000000 //< U2TX on PD6 +#define GPIO_PCTL_PD6_EPI0S29 0x0A000000 //< EPI0S29 on PD6 +#define GPIO_PCTL_PD7_M 0xF0000000 //< PD7 mask +#define GPIO_PCTL_PD7_IDX0 0x10000000 //< IDX0 on PD7 +#define GPIO_PCTL_PD7_C0O 0x20000000 //< C0O on PD7 +#define GPIO_PCTL_PD7_CCP1 0x30000000 //< CCP1 on PD7 +#define GPIO_PCTL_PD7_I2S0TXWS 0x80000000 //< I2S0TXWS on PD7 +#define GPIO_PCTL_PD7_U1DTR 0x90000000 //< U1DTR on PD7 +#define GPIO_PCTL_PD7_EPI0S30 0xA0000000 //< EPI0S30 on PD7 +/*\}*/ + +/** + * The following are defines for the bit fields in the GPIO_PCTL register for + * port E. + */ +/*\{*/ +#define GPIO_PCTL_PE0_M 0x0000000F //< PE0 mask +#define GPIO_PCTL_PE0_PWM4 0x00000001 //< PWM4 on PE0 +#define GPIO_PCTL_PE0_SSI1CLK 0x00000002 //< SSI1CLK on PE0 +#define GPIO_PCTL_PE0_CCP3 0x00000003 //< CCP3 on PE0 +#define GPIO_PCTL_PE0_EPI0S8 0x00000008 //< EPI0S8 on PE0 +#define GPIO_PCTL_PE0_USB0PFLT 0x00000009 //< USB0PFLT on PE0 +#define GPIO_PCTL_PE1_M 0x000000F0 //< PE1 mask +#define GPIO_PCTL_PE1_PWM5 0x00000010 //< PWM5 on PE1 +#define GPIO_PCTL_PE1_SSI1FSS 0x00000020 //< SSI1FSS on PE1 +#define GPIO_PCTL_PE1_FAULT0 0x00000030 //< FAULT0 on PE1 +#define GPIO_PCTL_PE1_CCP2 0x00000040 //< CCP2 on PE1 +#define GPIO_PCTL_PE1_CCP6 0x00000050 //< CCP6 on PE1 +#define GPIO_PCTL_PE1_EPI0S9 0x00000080 //< EPI0S9 on PE1 +#define GPIO_PCTL_PE2_M 0x00000F00 //< PE2 mask +#define GPIO_PCTL_PE2_CCP4 0x00000100 //< CCP4 on PE2 +#define GPIO_PCTL_PE2_SSI1RX 0x00000200 //< SSI1RX on PE2 +#define GPIO_PCTL_PE2_PHB1 0x00000300 //< PHB1 on PE2 +#define GPIO_PCTL_PE2_PHA0 0x00000400 //< PHA0 on PE2 +#define GPIO_PCTL_PE2_CCP2 0x00000500 //< CCP2 on PE2 +#define GPIO_PCTL_PE2_EPI0S24 0x00000800 //< EPI0S24 on PE2 +#define GPIO_PCTL_PE3_M 0x0000F000 //< PE3 mask +#define GPIO_PCTL_PE3_CCP1 0x00001000 //< CCP1 on PE3 +#define GPIO_PCTL_PE3_SSI1TX 0x00002000 //< SSI1TX on PE3 +#define GPIO_PCTL_PE3_PHA1 0x00003000 //< PHA1 on PE3 +#define GPIO_PCTL_PE3_PHB0 0x00004000 //< PHB0 on PE3 +#define GPIO_PCTL_PE3_CCP7 0x00005000 //< CCP7 on PE3 +#define GPIO_PCTL_PE3_EPI0S25 0x00008000 //< EPI0S25 on PE3 +#define GPIO_PCTL_PE4_M 0x000F0000 //< PE4 mask +#define GPIO_PCTL_PE4_CCP3 0x00010000 //< CCP3 on PE4 +#define GPIO_PCTL_PE4_FAULT0 0x00040000 //< FAULT0 on PE4 +#define GPIO_PCTL_PE4_U2TX 0x00050000 //< U2TX on PE4 +#define GPIO_PCTL_PE4_CCP2 0x00060000 //< CCP2 on PE4 +#define GPIO_PCTL_PE4_I2S0TXWS 0x00090000 //< I2S0TXWS on PE4 +#define GPIO_PCTL_PE5_M 0x00F00000 //< PE5 mask +#define GPIO_PCTL_PE5_CCP5 0x00100000 //< CCP5 on PE5 +#define GPIO_PCTL_PE5_I2S0TXSD 0x00900000 //< I2S0TXSD on PE5 +#define GPIO_PCTL_PE6_M 0x0F000000 //< PE6 mask +#define GPIO_PCTL_PE6_PWM4 0x01000000 //< PWM4 on PE6 +#define GPIO_PCTL_PE6_C1O 0x02000000 //< C1O on PE6 +#define GPIO_PCTL_PE6_U1CTS 0x09000000 //< U1CTS on PE6 +#define GPIO_PCTL_PE7_M 0xF0000000 //< PE7 mask +#define GPIO_PCTL_PE7_PWM5 0x10000000 //< PWM5 on PE7 +#define GPIO_PCTL_PE7_C2O 0x20000000 //< C2O on PE7 +#define GPIO_PCTL_PE7_U1DCD 0x90000000 //< U1DCD on PE7 +/*\}*/ + +/** + * The following are defines for the bit fields in the GPIO_PCTL register for + * port F. + */ +/*\{*/ +#define GPIO_PCTL_PF0_M 0x0000000F //< PF0 mask +#define GPIO_PCTL_PF0_CAN1RX 0x00000001 //< CAN1RX on PF0 +#define GPIO_PCTL_PF0_PHB0 0x00000002 //< PHB0 on PF0 +#define GPIO_PCTL_PF0_PWM0 0x00000003 //< PWM0 on PF0 +#define GPIO_PCTL_PF0_I2S0TXSD 0x00000008 //< I2S0TXSD on PF0 +#define GPIO_PCTL_PF0_U1DSR 0x00000009 //< U1DSR on PF0 +#define GPIO_PCTL_PF1_M 0x000000F0 //< PF1 mask +#define GPIO_PCTL_PF1_CAN1TX 0x00000010 //< CAN1TX on PF1 +#define GPIO_PCTL_PF1_IDX1 0x00000020 //< IDX1 on PF1 +#define GPIO_PCTL_PF1_PWM1 0x00000030 //< PWM1 on PF1 +#define GPIO_PCTL_PF1_I2S0TXMCLK \ + 0x00000080 //< I2S0TXMCLK on PF1 +#define GPIO_PCTL_PF1_U1RTS 0x00000090 //< U1RTS on PF1 +#define GPIO_PCTL_PF1_CCP3 0x000000A0 //< CCP3 on PF1 +#define GPIO_PCTL_PF2_M 0x00000F00 //< PF2 mask +#define GPIO_PCTL_PF2_LED1 0x00000100 //< LED1 on PF2 +#define GPIO_PCTL_PF2_PWM4 0x00000200 //< PWM4 on PF2 +#define GPIO_PCTL_PF2_PWM2 0x00000400 //< PWM2 on PF2 +#define GPIO_PCTL_PF2_SSI1CLK 0x00000900 //< SSI1CLK on PF2 +#define GPIO_PCTL_PF3_M 0x0000F000 //< PF3 mask +#define GPIO_PCTL_PF3_LED0 0x00001000 //< LED0 on PF3 +#define GPIO_PCTL_PF3_PWM5 0x00002000 //< PWM5 on PF3 +#define GPIO_PCTL_PF3_PWM3 0x00004000 //< PWM3 on PF3 +#define GPIO_PCTL_PF3_SSI1FSS 0x00009000 //< SSI1FSS on PF3 +#define GPIO_PCTL_PF4_M 0x000F0000 //< PF4 mask +#define GPIO_PCTL_PF4_CCP0 0x00010000 //< CCP0 on PF4 +#define GPIO_PCTL_PF4_C0O 0x00020000 //< C0O on PF4 +#define GPIO_PCTL_PF4_FAULT0 0x00040000 //< FAULT0 on PF4 +#define GPIO_PCTL_PF4_EPI0S12 0x00080000 //< EPI0S12 on PF4 +#define GPIO_PCTL_PF4_SSI1RX 0x00090000 //< SSI1RX on PF4 +#define GPIO_PCTL_PF5_M 0x00F00000 //< PF5 mask +#define GPIO_PCTL_PF5_CCP2 0x00100000 //< CCP2 on PF5 +#define GPIO_PCTL_PF5_C1O 0x00200000 //< C1O on PF5 +#define GPIO_PCTL_PF5_EPI0S15 0x00800000 //< EPI0S15 on PF5 +#define GPIO_PCTL_PF5_SSI1TX 0x00900000 //< SSI1TX on PF5 +#define GPIO_PCTL_PF6_M 0x0F000000 //< PF6 mask +#define GPIO_PCTL_PF6_CCP1 0x01000000 //< CCP1 on PF6 +#define GPIO_PCTL_PF6_C2O 0x02000000 //< C2O on PF6 +#define GPIO_PCTL_PF6_PHA0 0x04000000 //< PHA0 on PF6 +#define GPIO_PCTL_PF6_I2S0TXMCLK \ + 0x09000000 //< I2S0TXMCLK on PF6 +#define GPIO_PCTL_PF6_U1RTS 0x0A000000 //< U1RTS on PF6 +#define GPIO_PCTL_PF7_M 0xF0000000 //< PF7 mask +#define GPIO_PCTL_PF7_CCP4 0x10000000 //< CCP4 on PF7 +#define GPIO_PCTL_PF7_PHB0 0x40000000 //< PHB0 on PF7 +#define GPIO_PCTL_PF7_EPI0S12 0x80000000 //< EPI0S12 on PF7 +#define GPIO_PCTL_PF7_FAULT1 0x90000000 //< FAULT1 on PF7 +/*\}*/ + +/** + * The following are defines for the bit fields in the GPIO_PCTL register for + * port G. + */ +/*\{*/ +#define GPIO_PCTL_PG0_M 0x0000000F //< PG0 mask +#define GPIO_PCTL_PG0_U2RX 0x00000001 //< U2RX on PG0 +#define GPIO_PCTL_PG0_PWM0 0x00000002 //< PWM0 on PG0 +#define GPIO_PCTL_PG0_I2C1SCL 0x00000003 //< I2C1SCL on PG0 +#define GPIO_PCTL_PG0_PWM4 0x00000004 //< PWM4 on PG0 +#define GPIO_PCTL_PG0_USB0EPEN 0x00000007 //< USB0EPEN on PG0 +#define GPIO_PCTL_PG0_EPI0S13 0x00000008 //< EPI0S13 on PG0 +#define GPIO_PCTL_PG1_M 0x000000F0 //< PG1 mask +#define GPIO_PCTL_PG1_U2TX 0x00000010 //< U2TX on PG1 +#define GPIO_PCTL_PG1_PWM1 0x00000020 //< PWM1 on PG1 +#define GPIO_PCTL_PG1_I2C1SDA 0x00000030 //< I2C1SDA on PG1 +#define GPIO_PCTL_PG1_PWM5 0x00000040 //< PWM5 on PG1 +#define GPIO_PCTL_PG1_EPI0S14 0x00000080 //< EPI0S14 on PG1 +#define GPIO_PCTL_PG2_M 0x00000F00 //< PG2 mask +#define GPIO_PCTL_PG2_PWM0 0x00000100 //< PWM0 on PG2 +#define GPIO_PCTL_PG2_FAULT0 0x00000400 //< FAULT0 on PG2 +#define GPIO_PCTL_PG2_IDX1 0x00000800 //< IDX1 on PG2 +#define GPIO_PCTL_PG2_I2S0RXSD 0x00000900 //< I2S0RXSD on PG2 +#define GPIO_PCTL_PG3_M 0x0000F000 //< PG3 mask +#define GPIO_PCTL_PG3_PWM1 0x00001000 //< PWM1 on PG3 +#define GPIO_PCTL_PG3_FAULT2 0x00004000 //< FAULT2 on PG3 +#define GPIO_PCTL_PG3_FAULT0 0x00008000 //< FAULT0 on PG3 +#define GPIO_PCTL_PG3_I2S0RXMCLK \ + 0x00009000 //< I2S0RXMCLK on PG3 +#define GPIO_PCTL_PG4_M 0x000F0000 //< PG4 mask +#define GPIO_PCTL_PG4_CCP3 0x00010000 //< CCP3 on PG4 +#define GPIO_PCTL_PG4_FAULT1 0x00040000 //< FAULT1 on PG4 +#define GPIO_PCTL_PG4_EPI0S15 0x00080000 //< EPI0S15 on PG4 +#define GPIO_PCTL_PG4_PWM6 0x00090000 //< PWM6 on PG4 +#define GPIO_PCTL_PG4_U1RI 0x000A0000 //< U1RI on PG4 +#define GPIO_PCTL_PG5_M 0x00F00000 //< PG5 mask +#define GPIO_PCTL_PG5_CCP5 0x00100000 //< CCP5 on PG5 +#define GPIO_PCTL_PG5_IDX0 0x00400000 //< IDX0 on PG5 +#define GPIO_PCTL_PG5_FAULT1 0x00500000 //< FAULT1 on PG5 +#define GPIO_PCTL_PG5_PWM7 0x00800000 //< PWM7 on PG5 +#define GPIO_PCTL_PG5_I2S0RXSCK 0x00900000 //< I2S0RXSCK on PG5 +#define GPIO_PCTL_PG5_U1DTR 0x00A00000 //< U1DTR on PG5 +#define GPIO_PCTL_PG6_M 0x0F000000 //< PG6 mask +#define GPIO_PCTL_PG6_PHA1 0x01000000 //< PHA1 on PG6 +#define GPIO_PCTL_PG6_PWM6 0x04000000 //< PWM6 on PG6 +#define GPIO_PCTL_PG6_FAULT1 0x08000000 //< FAULT1 on PG6 +#define GPIO_PCTL_PG6_I2S0RXWS 0x09000000 //< I2S0RXWS on PG6 +#define GPIO_PCTL_PG6_U1RI 0x0A000000 //< U1RI on PG6 +#define GPIO_PCTL_PG7_M 0xF0000000 //< PG7 mask +#define GPIO_PCTL_PG7_PHB1 0x10000000 //< PHB1 on PG7 +#define GPIO_PCTL_PG7_PWM7 0x40000000 //< PWM7 on PG7 +#define GPIO_PCTL_PG7_CCP5 0x80000000 //< CCP5 on PG7 +#define GPIO_PCTL_PG7_EPI0S31 0x90000000 //< EPI0S31 on PG7 +/*\}*/ + +/** + * The following are defines for the bit fields in the GPIO_PCTL register for + * port H. + */ +/*\{*/ +#define GPIO_PCTL_PH0_M 0x0000000F //< PH0 mask +#define GPIO_PCTL_PH0_CCP6 0x00000001 //< CCP6 on PH0 +#define GPIO_PCTL_PH0_PWM2 0x00000002 //< PWM2 on PH0 +#define GPIO_PCTL_PH0_EPI0S6 0x00000008 //< EPI0S6 on PH0 +#define GPIO_PCTL_PH0_PWM4 0x00000009 //< PWM4 on PH0 +#define GPIO_PCTL_PH1_M 0x000000F0 //< PH1 mask +#define GPIO_PCTL_PH1_CCP7 0x00000010 //< CCP7 on PH1 +#define GPIO_PCTL_PH1_PWM3 0x00000020 //< PWM3 on PH1 +#define GPIO_PCTL_PH1_EPI0S7 0x00000080 //< EPI0S7 on PH1 +#define GPIO_PCTL_PH1_PWM5 0x00000090 //< PWM5 on PH1 +#define GPIO_PCTL_PH2_M 0x00000F00 //< PH2 mask +#define GPIO_PCTL_PH2_IDX1 0x00000100 //< IDX1 on PH2 +#define GPIO_PCTL_PH2_C1O 0x00000200 //< C1O on PH2 +#define GPIO_PCTL_PH2_FAULT3 0x00000400 //< FAULT3 on PH2 +#define GPIO_PCTL_PH2_EPI0S1 0x00000800 //< EPI0S1 on PH2 +#define GPIO_PCTL_PH3_M 0x0000F000 //< PH3 mask +#define GPIO_PCTL_PH3_PHB0 0x00001000 //< PHB0 on PH3 +#define GPIO_PCTL_PH3_FAULT0 0x00002000 //< FAULT0 on PH3 +#define GPIO_PCTL_PH3_USB0EPEN 0x00004000 //< USB0EPEN on PH3 +#define GPIO_PCTL_PH3_EPI0S0 0x00008000 //< EPI0S0 on PH3 +#define GPIO_PCTL_PH4_M 0x000F0000 //< PH4 mask +#define GPIO_PCTL_PH4_USB0PFLT 0x00040000 //< USB0PFLT on PH4 +#define GPIO_PCTL_PH4_EPI0S10 0x00080000 //< EPI0S10 on PH4 +#define GPIO_PCTL_PH4_SSI1CLK 0x000B0000 //< SSI1CLK on PH4 +#define GPIO_PCTL_PH5_M 0x00F00000 //< PH5 mask +#define GPIO_PCTL_PH5_EPI0S11 0x00800000 //< EPI0S11 on PH5 +#define GPIO_PCTL_PH5_FAULT2 0x00A00000 //< FAULT2 on PH5 +#define GPIO_PCTL_PH5_SSI1FSS 0x00B00000 //< SSI1FSS on PH5 +#define GPIO_PCTL_PH6_M 0x0F000000 //< PH6 mask +#define GPIO_PCTL_PH6_EPI0S26 0x08000000 //< EPI0S26 on PH6 +#define GPIO_PCTL_PH6_PWM4 0x0A000000 //< PWM4 on PH6 +#define GPIO_PCTL_PH6_SSI1RX 0x0B000000 //< SSI1RX on PH6 +#define GPIO_PCTL_PH7_M 0xF0000000 //< PH7 mask +#define GPIO_PCTL_PH7_EPI0S27 0x80000000 //< EPI0S27 on PH7 +#define GPIO_PCTL_PH7_PWM5 0xA0000000 //< PWM5 on PH7 +#define GPIO_PCTL_PH7_SSI1TX 0xB0000000 //< SSI1TX on PH7 +/*\}*/ + +/** + * The following are defines for the bit fields in the GPIO_PCTL register for + * port J. + */ +/*\{*/ +#define GPIO_PCTL_PJ0_M 0x0000000F //< PJ0 mask +#define GPIO_PCTL_PJ0_EPI0S16 0x00000008 //< EPI0S16 on PJ0 +#define GPIO_PCTL_PJ0_PWM0 0x0000000A //< PWM0 on PJ0 +#define GPIO_PCTL_PJ0_I2C1SCL 0x0000000B //< I2C1SCL on PJ0 +#define GPIO_PCTL_PJ1_M 0x000000F0 //< PJ1 mask +#define GPIO_PCTL_PJ1_EPI0S17 0x00000080 //< EPI0S17 on PJ1 +#define GPIO_PCTL_PJ1_USB0PFLT 0x00000090 //< USB0PFLT on PJ1 +#define GPIO_PCTL_PJ1_PWM1 0x000000A0 //< PWM1 on PJ1 +#define GPIO_PCTL_PJ1_I2C1SDA 0x000000B0 //< I2C1SDA on PJ1 +#define GPIO_PCTL_PJ2_M 0x00000F00 //< PJ2 mask +#define GPIO_PCTL_PJ2_EPI0S18 0x00000800 //< EPI0S18 on PJ2 +#define GPIO_PCTL_PJ2_CCP0 0x00000900 //< CCP0 on PJ2 +#define GPIO_PCTL_PJ2_FAULT0 0x00000A00 //< FAULT0 on PJ2 +#define GPIO_PCTL_PJ3_M 0x0000F000 //< PJ3 mask +#define GPIO_PCTL_PJ3_EPI0S19 0x00008000 //< EPI0S19 on PJ3 +#define GPIO_PCTL_PJ3_U1CTS 0x00009000 //< U1CTS on PJ3 +#define GPIO_PCTL_PJ3_CCP6 0x0000A000 //< CCP6 on PJ3 +#define GPIO_PCTL_PJ4_M 0x000F0000 //< PJ4 mask +#define GPIO_PCTL_PJ4_EPI0S28 0x00080000 //< EPI0S28 on PJ4 +#define GPIO_PCTL_PJ4_U1DCD 0x00090000 //< U1DCD on PJ4 +#define GPIO_PCTL_PJ4_CCP4 0x000A0000 //< CCP4 on PJ4 +#define GPIO_PCTL_PJ5_M 0x00F00000 //< PJ5 mask +#define GPIO_PCTL_PJ5_EPI0S29 0x00800000 //< EPI0S29 on PJ5 +#define GPIO_PCTL_PJ5_U1DSR 0x00900000 //< U1DSR on PJ5 +#define GPIO_PCTL_PJ5_CCP2 0x00A00000 //< CCP2 on PJ5 +#define GPIO_PCTL_PJ6_M 0x0F000000 //< PJ6 mask +#define GPIO_PCTL_PJ6_EPI0S30 0x08000000 //< EPI0S30 on PJ6 +#define GPIO_PCTL_PJ6_U1RTS 0x09000000 //< U1RTS on PJ6 +#define GPIO_PCTL_PJ6_CCP1 0x0A000000 //< CCP1 on PJ6 +#define GPIO_PCTL_PJ7_M 0xF0000000 //< PJ7 mask +#define GPIO_PCTL_PJ7_U1DTR 0x90000000 //< U1DTR on PJ7 +#define GPIO_PCTL_PJ7_CCP0 0xA0000000 //< CCP0 on PJ7 +/*\}*/ + +/** + * The following definitions are deprecated. + */ +/*\{*/ +#ifndef DEPRECATED +/*\}*/ + +/** + * The following are deprecated defines for the GPIO register offsets. + */ +/*\{*/ +#define GPIO_O_PeriphID4 0x00000FD0 +#define GPIO_O_PeriphID5 0x00000FD4 +#define GPIO_O_PeriphID6 0x00000FD8 +#define GPIO_O_PeriphID7 0x00000FDC +#define GPIO_O_PeriphID0 0x00000FE0 +#define GPIO_O_PeriphID1 0x00000FE4 +#define GPIO_O_PeriphID2 0x00000FE8 +#define GPIO_O_PeriphID3 0x00000FEC +#define GPIO_O_PCellID0 0x00000FF0 +#define GPIO_O_PCellID1 0x00000FF4 +#define GPIO_O_PCellID2 0x00000FF8 +#define GPIO_O_PCellID3 0x00000FFC +/*\}*/ + +/** + * The following are deprecated defines for the GPIO Register reset values. + */ +/*\{*/ +#define GPIO_RV_DEN 0x000000FF //< Digital input enable reg RV +#define GPIO_RV_PUR 0x000000FF //< Pull up select reg RV +#define GPIO_RV_DR2R 0x000000FF //< 2ma drive select reg RV +#define GPIO_RV_PCellID1 0x000000F0 +#define GPIO_RV_PCellID3 0x000000B1 +#define GPIO_RV_PeriphID0 0x00000061 +#define GPIO_RV_PeriphID1 0x00000010 +#define GPIO_RV_PCellID0 0x0000000D +#define GPIO_RV_PCellID2 0x00000005 +#define GPIO_RV_PeriphID2 0x00000004 +#define GPIO_RV_LOCK 0x00000001 //< Lock register RV +#define GPIO_RV_PeriphID7 0x00000000 +#define GPIO_RV_PDR 0x00000000 //< Pull down select reg RV +#define GPIO_RV_IC 0x00000000 //< Interrupt clear reg RV +#define GPIO_RV_SLR 0x00000000 //< Slew rate control enable reg RV +#define GPIO_RV_ODR 0x00000000 //< Open drain select reg RV +#define GPIO_RV_IBE 0x00000000 //< Interrupt both edges reg RV +#define GPIO_RV_AFSEL 0x00000000 //< Mode control select reg RV +#define GPIO_RV_IS 0x00000000 //< Interrupt sense reg RV +#define GPIO_RV_IM 0x00000000 //< Interrupt mask reg RV +#define GPIO_RV_PeriphID4 0x00000000 +#define GPIO_RV_PeriphID5 0x00000000 +#define GPIO_RV_DR8R 0x00000000 //< 8ma drive select reg RV +#define GPIO_RV_RIS 0x00000000 //< Raw interrupt status reg RV +#define GPIO_RV_DR4R 0x00000000 //< 4ma drive select reg RV +#define GPIO_RV_IEV 0x00000000 //< Intterupt event reg RV +#define GPIO_RV_DIR 0x00000000 //< Data direction reg RV +#define GPIO_RV_PeriphID6 0x00000000 +#define GPIO_RV_PeriphID3 0x00000000 +#define GPIO_RV_DATA 0x00000000 //< Data register reset value +#define GPIO_RV_MIS 0x00000000 //< Masked interrupt status reg RV +/*\}*/ + +#endif /* DEPRECATED */ + +#endif /* LM3S_GPIO_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/lm3s_ints.h b/2.5/bertos/cpu/cortex-m3/io/lm3s_ints.h new file mode 100644 index 00000000..278c19d4 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/lm3s_ints.h @@ -0,0 +1,130 @@ +/** + * \file + * + * + * \brief LM3S1968 interrupts definition. + */ + +#ifndef LM3S_INTS_H +#define LM3S_INTS_H + +/** + * The following are defines for the fault assignments. + */ +/*\{*/ +#define FAULT_NMI 2 ///< NMI fault +#define FAULT_HARD 3 ///< Hard fault +#define FAULT_MPU 4 ///< MPU fault +#define FAULT_BUS 5 ///< Bus fault +#define FAULT_USAGE 6 ///< Usage fault +#define FAULT_SVCALL 11 ///< SVCall +#define FAULT_DEBUG 12 ///< Debug monitor +#define FAULT_PENDSV 14 ///< PendSV +#define FAULT_SYSTICK 15 ///< System Tick +/*\}*/ + +/** + * The following are defines for the interrupt assignments. + */ +/*\{*/ +#define INT_GPIOA 16 ///< GPIO Port A +#define INT_GPIOB 17 ///< GPIO Port B +#define INT_GPIOC 18 ///< GPIO Port C +#define INT_GPIOD 19 ///< GPIO Port D +#define INT_GPIOE 20 ///< GPIO Port E +#define INT_UART0 21 ///< UART0 Rx and Tx +#define INT_UART1 22 ///< UART1 Rx and Tx +#define INT_SSI0 23 ///< SSI0 Rx and Tx +#define INT_I2C0 24 ///< I2C0 Master and Slave +#define INT_PWM_FAULT 25 ///< PWM Fault +#define INT_PWM0 26 ///< PWM Generator 0 +#define INT_PWM1 27 ///< PWM Generator 1 +#define INT_PWM2 28 ///< PWM Generator 2 +#define INT_QEI0 29 ///< Quadrature Encoder 0 +#define INT_ADC0 30 ///< ADC Sequence 0 +#define INT_ADC1 31 ///< ADC Sequence 1 +#define INT_ADC2 32 ///< ADC Sequence 2 +#define INT_ADC3 33 ///< ADC Sequence 3 +#define INT_WATCHDOG 34 ///< Watchdog timer +#define INT_TIMER0A 35 ///< Timer 0 subtimer A +#define INT_TIMER0B 36 ///< Timer 0 subtimer B +#define INT_TIMER1A 37 ///< Timer 1 subtimer A +#define INT_TIMER1B 38 ///< Timer 1 subtimer B +#define INT_TIMER2A 39 ///< Timer 2 subtimer A +#define INT_TIMER2B 40 ///< Timer 2 subtimer B +#define INT_COMP0 41 ///< Analog Comparator 0 +#define INT_COMP1 42 ///< Analog Comparator 1 +#define INT_COMP2 43 ///< Analog Comparator 2 +#define INT_SYSCTL 44 ///< System Control (PLL, OSC, BO) +#define INT_FLASH 45 ///< FLASH Control +#define INT_GPIOF 46 ///< GPIO Port F +#define INT_GPIOG 47 ///< GPIO Port G +#define INT_GPIOH 48 ///< GPIO Port H +#define INT_UART2 49 ///< UART2 Rx and Tx +#define INT_SSI1 50 ///< SSI1 Rx and Tx +#define INT_TIMER3A 51 ///< Timer 3 subtimer A +#define INT_TIMER3B 52 ///< Timer 3 subtimer B +#define INT_I2C1 53 ///< I2C1 Master and Slave +#define INT_QEI1 54 ///< Quadrature Encoder 1 +#define INT_CAN0 55 ///< CAN0 +#define INT_CAN1 56 ///< CAN1 +#define INT_CAN2 57 ///< CAN2 +#define INT_ETH 58 ///< Ethernet +#define INT_HIBERNATE 59 ///< Hibernation module +#define INT_USB0 60 ///< USB 0 Controller +#define INT_PWM3 61 ///< PWM Generator 3 +#define INT_UDMA 62 ///< uDMA controller +#define INT_UDMAERR 63 ///< uDMA Error +#define INT_ADC1SS0 64 ///< ADC1 Sequence 0 +#define INT_ADC1SS1 65 ///< ADC1 Sequence 1 +#define INT_ADC1SS2 66 ///< ADC1 Sequence 2 +#define INT_ADC1SS3 67 ///< ADC1 Sequence 3 +#define INT_I2S0 68 ///< I2S0 +#define INT_EPI0 69 ///< EPI0 +#define INT_GPIOJ 70 ///< GPIO Port J +/*\}*/ + +/** + * The following are defines for the total number of interrupts. + */ +/*\{*/ +#define NUM_INTERRUPTS 71 +/*\}*/ + +/** + * The following are defines for the total number of priority levels. + */ +/*\{*/ +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 +/*\}*/ + +#endif /* LM3S_INTS_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/lm3s_memmap.h b/2.5/bertos/cpu/cortex-m3/io/lm3s_memmap.h new file mode 100644 index 00000000..33993d9b --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/lm3s_memmap.h @@ -0,0 +1,120 @@ +/** + * \file + * + * + * \brief LM3S1968 memory map. + */ + +#ifndef LM3S_MEMMAP_H +#define LM3S_MEMMAP_H + +/** + * The following are defines for the base address of the memories and + * peripherals. + */ +/*\{*/ +#define FLASH_BASE 0x00000000 //< FLASH memory +#define SRAM_BASE 0x20000000 //< SRAM memory +#define WATCHDOG0_BASE 0x40000000 //< Watchdog0 +#define WATCHDOG1_BASE 0x40001000 //< Watchdog1 +#define GPIO_PORTA_BASE 0x40004000 //< GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 //< GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 //< GPIO Port C +#define GPIO_PORTD_BASE 0x40007000 //< GPIO Port D +#define SSI0_BASE 0x40008000 //< SSI0 +#define SSI1_BASE 0x40009000 //< SSI1 +#define UART0_BASE 0x4000C000 //< UART0 +#define UART1_BASE 0x4000D000 //< UART1 +#define UART2_BASE 0x4000E000 //< UART2 +#define I2C0_MASTER_BASE 0x40020000 //< I2C0 Master +#define I2C0_SLAVE_BASE 0x40020800 //< I2C0 Slave +#define I2C1_MASTER_BASE 0x40021000 //< I2C1 Master +#define I2C1_SLAVE_BASE 0x40021800 //< I2C1 Slave +#define GPIO_PORTE_BASE 0x40024000 //< GPIO Port E +#define GPIO_PORTF_BASE 0x40025000 //< GPIO Port F +#define GPIO_PORTG_BASE 0x40026000 //< GPIO Port G +#define GPIO_PORTH_BASE 0x40027000 //< GPIO Port H +#define PWM_BASE 0x40028000 //< PWM +#define QEI0_BASE 0x4002C000 //< QEI0 +#define QEI1_BASE 0x4002D000 //< QEI1 +#define TIMER0_BASE 0x40030000 //< Timer0 +#define TIMER1_BASE 0x40031000 //< Timer1 +#define TIMER2_BASE 0x40032000 //< Timer2 +#define TIMER3_BASE 0x40033000 //< Timer3 +#define ADC0_BASE 0x40038000 //< ADC0 +#define ADC1_BASE 0x40039000 //< ADC1 +#define COMP_BASE 0x4003C000 //< Analog comparators +#define GPIO_PORTJ_BASE 0x4003D000 //< GPIO Port J +#define CAN0_BASE 0x40040000 //< CAN0 +#define CAN1_BASE 0x40041000 //< CAN1 +#define CAN2_BASE 0x40042000 //< CAN2 +#define ETH_BASE 0x40048000 //< Ethernet +#define MAC_BASE 0x40048000 //< Ethernet +#define USB0_BASE 0x40050000 //< USB 0 Controller +#define I2S0_BASE 0x40054000 //< I2S0 +#define GPIO_PORTA_AHB_BASE 0x40058000 //< GPIO Port A (high speed) +#define GPIO_PORTB_AHB_BASE 0x40059000 //< GPIO Port B (high speed) +#define GPIO_PORTC_AHB_BASE 0x4005A000 //< GPIO Port C (high speed) +#define GPIO_PORTD_AHB_BASE 0x4005B000 //< GPIO Port D (high speed) +#define GPIO_PORTE_AHB_BASE 0x4005C000 //< GPIO Port E (high speed) +#define GPIO_PORTF_AHB_BASE 0x4005D000 //< GPIO Port F (high speed) +#define GPIO_PORTG_AHB_BASE 0x4005E000 //< GPIO Port G (high speed) +#define GPIO_PORTH_AHB_BASE 0x4005F000 //< GPIO Port H (high speed) +#define GPIO_PORTJ_AHB_BASE 0x40060000 //< GPIO Port J (high speed) +#define EPI0_BASE 0x400D0000 //< EPI0 +#define HIB_BASE 0x400FC000 //< Hibernation Module +#define FLASH_CTRL_BASE 0x400FD000 //< FLASH Controller +#define SYSCTL_BASE 0x400FE000 //< System Control +#define UDMA_BASE 0x400FF000 //< uDMA Controller +#define ITM_BASE 0xE0000000 //< Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 //< Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 //< FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 //< Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 //< Trace Port Interface Unit +/*\}*/ + +/** + * The following definitions are deprecated. + */ +/*\{*/ +#ifndef DEPRECATED +/*\}*/ + +#define WATCHDOG_BASE 0x40000000 //< Watchdog +#define SSI_BASE 0x40008000 //< SSI +#define I2C_MASTER_BASE 0x40020000 //< I2C Master +#define I2C_SLAVE_BASE 0x40020800 //< I2C Slave +#define QEI_BASE 0x4002C000 //< QEI +#define ADC_BASE 0x40038000 //< ADC + +#endif /* DEPRECATED */ + +#endif /* LM3S_MEMMAP_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/lm3s_nvic.h b/2.5/bertos/cpu/cortex-m3/io/lm3s_nvic.h new file mode 100644 index 00000000..08cc5abf --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/lm3s_nvic.h @@ -0,0 +1,1037 @@ +/** + * \file + * + * + * \brief LM3S1968 NVIC hardware. + */ + +#ifndef LM3S_NVIC_H +#define LM3S_NVIC_H + +/** + * The following are defines for the NVIC register addresses. + */ +/*\{*/ +#define NVIC_INT_TYPE 0xE000E004 ///< Interrupt Controller Type Reg +#define NVIC_ST_CTRL 0xE000E010 ///< SysTick Control and Status Reg +#define NVIC_ST_RELOAD 0xE000E014 ///< SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 ///< SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C ///< SysTick Calibration Value Reg +#define NVIC_EN0 0xE000E100 ///< IRQ 0 to 31 Set Enable Register +#define NVIC_EN1 0xE000E104 ///< IRQ 32 to 63 Set Enable Register +#define NVIC_DIS0 0xE000E180 ///< IRQ 0 to 31 Clear Enable Reg +#define NVIC_DIS1 0xE000E184 ///< IRQ 32 to 63 Clear Enable Reg +#define NVIC_PEND0 0xE000E200 ///< IRQ 0 to 31 Set Pending Register +#define NVIC_PEND1 0xE000E204 ///< IRQ 32 to 63 Set Pending Reg +#define NVIC_UNPEND0 0xE000E280 ///< IRQ 0 to 31 Clear Pending Reg +#define NVIC_UNPEND1 0xE000E284 ///< IRQ 32 to 63 Clear Pending Reg +#define NVIC_ACTIVE0 0xE000E300 ///< IRQ 0 to 31 Active Register +#define NVIC_ACTIVE1 0xE000E304 ///< IRQ 32 to 63 Active Register +#define NVIC_PRI0 0xE000E400 ///< IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 ///< IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 ///< IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C ///< IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 ///< IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 ///< IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 ///< IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C ///< IRQ 28 to 31 Priority Register +#define NVIC_PRI8 0xE000E420 ///< IRQ 32 to 35 Priority Register +#define NVIC_PRI9 0xE000E424 ///< IRQ 36 to 39 Priority Register +#define NVIC_PRI10 0xE000E428 ///< IRQ 40 to 43 Priority Register +#define NVIC_PRI11 0xE000E42C ///< IRQ 44 to 47 Priority Register +#define NVIC_PRI12 0xE000E430 ///< IRQ 48 to 51 Priority Register +#define NVIC_PRI13 0xE000E434 ///< IRQ 52 to 55 Priority Register +#define NVIC_CPUID 0xE000ED00 ///< CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 ///< Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 ///< Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C ///< App. Int & Reset Control Reg +#define NVIC_SYS_CTRL 0xE000ED10 ///< System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 ///< Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 ///< Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C ///< Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 ///< Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 ///< System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 ///< Configurable Fault Status Reg +#define NVIC_HFAULT_STAT 0xE000ED2C ///< Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 ///< Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 ///< Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 ///< Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 ///< MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 ///< MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 ///< MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C ///< MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 ///< MPU Region Attribute & Size Reg +#define NVIC_DBG_CTRL 0xE000EDF0 ///< Debug Control and Status Reg +#define NVIC_DBG_XFER 0xE000EDF4 ///< Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 ///< Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC ///< Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 ///< Software Trigger Interrupt Reg +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_INT_TYPE register. + */ +/*\{*/ +#define NVIC_INT_TYPE_LINES_M 0x0000001F ///< Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ST_CTRL register. + */ +/*\{*/ +#define NVIC_ST_CTRL_COUNT 0x00010000 ///< Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 ///< Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 ///< Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 ///< Counter mode +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ST_RELOAD register. + */ +/*\{*/ +#define NVIC_ST_RELOAD_M 0x00FFFFFF ///< Counter load value +#define NVIC_ST_RELOAD_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ST_CURRENT + * register. + */ +/*\{*/ +#define NVIC_ST_CURRENT_M 0x00FFFFFF ///< Counter current value +#define NVIC_ST_CURRENT_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ST_CAL register. + */ +/*\{*/ +#define NVIC_ST_CAL_NOREF 0x80000000 ///< No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 ///< Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF ///< 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_EN0 register. + */ +/*\{*/ +#define NVIC_EN0_INT31 0x80000000 ///< Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 ///< Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 ///< Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 ///< Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 ///< Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 ///< Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 ///< Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 ///< Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 ///< Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 ///< Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 ///< Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 ///< Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 ///< Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 ///< Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 ///< Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 ///< Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 ///< Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 ///< Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 ///< Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 ///< Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 ///< Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 ///< Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 ///< Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 ///< Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 ///< Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 ///< Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 ///< Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 ///< Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 ///< Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 ///< Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 ///< Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 ///< Interrupt 0 enable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_EN1 register. + */ +/*\{*/ +#define NVIC_EN1_INT59 0x08000000 ///< Interrupt 59 enable +#define NVIC_EN1_INT58 0x04000000 ///< Interrupt 58 enable +#define NVIC_EN1_INT57 0x02000000 ///< Interrupt 57 enable +#define NVIC_EN1_INT56 0x01000000 ///< Interrupt 56 enable +#define NVIC_EN1_INT55 0x00800000 ///< Interrupt 55 enable +#define NVIC_EN1_INT54 0x00400000 ///< Interrupt 54 enable +#define NVIC_EN1_INT53 0x00200000 ///< Interrupt 53 enable +#define NVIC_EN1_INT52 0x00100000 ///< Interrupt 52 enable +#define NVIC_EN1_INT51 0x00080000 ///< Interrupt 51 enable +#define NVIC_EN1_INT50 0x00040000 ///< Interrupt 50 enable +#define NVIC_EN1_INT49 0x00020000 ///< Interrupt 49 enable +#define NVIC_EN1_INT48 0x00010000 ///< Interrupt 48 enable +#define NVIC_EN1_INT47 0x00008000 ///< Interrupt 47 enable +#define NVIC_EN1_INT46 0x00004000 ///< Interrupt 46 enable +#define NVIC_EN1_INT45 0x00002000 ///< Interrupt 45 enable +#define NVIC_EN1_INT44 0x00001000 ///< Interrupt 44 enable +#define NVIC_EN1_INT43 0x00000800 ///< Interrupt 43 enable +#define NVIC_EN1_INT42 0x00000400 ///< Interrupt 42 enable +#define NVIC_EN1_INT41 0x00000200 ///< Interrupt 41 enable +#define NVIC_EN1_INT40 0x00000100 ///< Interrupt 40 enable +#define NVIC_EN1_INT39 0x00000080 ///< Interrupt 39 enable +#define NVIC_EN1_INT38 0x00000040 ///< Interrupt 38 enable +#define NVIC_EN1_INT37 0x00000020 ///< Interrupt 37 enable +#define NVIC_EN1_INT36 0x00000010 ///< Interrupt 36 enable +#define NVIC_EN1_INT35 0x00000008 ///< Interrupt 35 enable +#define NVIC_EN1_INT34 0x00000004 ///< Interrupt 34 enable +#define NVIC_EN1_INT33 0x00000002 ///< Interrupt 33 enable +#define NVIC_EN1_INT32 0x00000001 ///< Interrupt 32 enable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DIS0 register. + */ +/*\{*/ +#define NVIC_DIS0_INT31 0x80000000 ///< Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 ///< Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 ///< Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 ///< Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 ///< Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 ///< Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 ///< Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 ///< Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 ///< Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 ///< Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 ///< Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 ///< Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 ///< Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 ///< Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 ///< Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 ///< Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 ///< Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 ///< Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 ///< Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 ///< Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 ///< Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 ///< Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 ///< Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 ///< Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 ///< Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 ///< Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 ///< Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 ///< Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 ///< Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 ///< Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 ///< Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 ///< Interrupt 0 disable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DIS1 register. + */ +/*\{*/ +#define NVIC_DIS1_INT59 0x08000000 ///< Interrupt 59 disable +#define NVIC_DIS1_INT58 0x04000000 ///< Interrupt 58 disable +#define NVIC_DIS1_INT57 0x02000000 ///< Interrupt 57 disable +#define NVIC_DIS1_INT56 0x01000000 ///< Interrupt 56 disable +#define NVIC_DIS1_INT55 0x00800000 ///< Interrupt 55 disable +#define NVIC_DIS1_INT54 0x00400000 ///< Interrupt 54 disable +#define NVIC_DIS1_INT53 0x00200000 ///< Interrupt 53 disable +#define NVIC_DIS1_INT52 0x00100000 ///< Interrupt 52 disable +#define NVIC_DIS1_INT51 0x00080000 ///< Interrupt 51 disable +#define NVIC_DIS1_INT50 0x00040000 ///< Interrupt 50 disable +#define NVIC_DIS1_INT49 0x00020000 ///< Interrupt 49 disable +#define NVIC_DIS1_INT48 0x00010000 ///< Interrupt 48 disable +#define NVIC_DIS1_INT47 0x00008000 ///< Interrupt 47 disable +#define NVIC_DIS1_INT46 0x00004000 ///< Interrupt 46 disable +#define NVIC_DIS1_INT45 0x00002000 ///< Interrupt 45 disable +#define NVIC_DIS1_INT44 0x00001000 ///< Interrupt 44 disable +#define NVIC_DIS1_INT43 0x00000800 ///< Interrupt 43 disable +#define NVIC_DIS1_INT42 0x00000400 ///< Interrupt 42 disable +#define NVIC_DIS1_INT41 0x00000200 ///< Interrupt 41 disable +#define NVIC_DIS1_INT40 0x00000100 ///< Interrupt 40 disable +#define NVIC_DIS1_INT39 0x00000080 ///< Interrupt 39 disable +#define NVIC_DIS1_INT38 0x00000040 ///< Interrupt 38 disable +#define NVIC_DIS1_INT37 0x00000020 ///< Interrupt 37 disable +#define NVIC_DIS1_INT36 0x00000010 ///< Interrupt 36 disable +#define NVIC_DIS1_INT35 0x00000008 ///< Interrupt 35 disable +#define NVIC_DIS1_INT34 0x00000004 ///< Interrupt 34 disable +#define NVIC_DIS1_INT33 0x00000002 ///< Interrupt 33 disable +#define NVIC_DIS1_INT32 0x00000001 ///< Interrupt 32 disable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PEND0 register. + */ +/*\{*/ +#define NVIC_PEND0_INT31 0x80000000 ///< Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 ///< Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 ///< Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 ///< Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 ///< Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 ///< Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 ///< Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 ///< Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 ///< Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 ///< Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 ///< Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 ///< Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 ///< Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 ///< Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 ///< Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 ///< Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 ///< Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 ///< Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 ///< Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 ///< Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 ///< Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 ///< Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 ///< Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 ///< Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 ///< Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 ///< Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 ///< Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 ///< Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 ///< Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 ///< Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 ///< Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 ///< Interrupt 0 pend +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PEND1 register. + */ +/*\{*/ +#define NVIC_PEND1_INT59 0x08000000 ///< Interrupt 59 pend +#define NVIC_PEND1_INT58 0x04000000 ///< Interrupt 58 pend +#define NVIC_PEND1_INT57 0x02000000 ///< Interrupt 57 pend +#define NVIC_PEND1_INT56 0x01000000 ///< Interrupt 56 pend +#define NVIC_PEND1_INT55 0x00800000 ///< Interrupt 55 pend +#define NVIC_PEND1_INT54 0x00400000 ///< Interrupt 54 pend +#define NVIC_PEND1_INT53 0x00200000 ///< Interrupt 53 pend +#define NVIC_PEND1_INT52 0x00100000 ///< Interrupt 52 pend +#define NVIC_PEND1_INT51 0x00080000 ///< Interrupt 51 pend +#define NVIC_PEND1_INT50 0x00040000 ///< Interrupt 50 pend +#define NVIC_PEND1_INT49 0x00020000 ///< Interrupt 49 pend +#define NVIC_PEND1_INT48 0x00010000 ///< Interrupt 48 pend +#define NVIC_PEND1_INT47 0x00008000 ///< Interrupt 47 pend +#define NVIC_PEND1_INT46 0x00004000 ///< Interrupt 46 pend +#define NVIC_PEND1_INT45 0x00002000 ///< Interrupt 45 pend +#define NVIC_PEND1_INT44 0x00001000 ///< Interrupt 44 pend +#define NVIC_PEND1_INT43 0x00000800 ///< Interrupt 43 pend +#define NVIC_PEND1_INT42 0x00000400 ///< Interrupt 42 pend +#define NVIC_PEND1_INT41 0x00000200 ///< Interrupt 41 pend +#define NVIC_PEND1_INT40 0x00000100 ///< Interrupt 40 pend +#define NVIC_PEND1_INT39 0x00000080 ///< Interrupt 39 pend +#define NVIC_PEND1_INT38 0x00000040 ///< Interrupt 38 pend +#define NVIC_PEND1_INT37 0x00000020 ///< Interrupt 37 pend +#define NVIC_PEND1_INT36 0x00000010 ///< Interrupt 36 pend +#define NVIC_PEND1_INT35 0x00000008 ///< Interrupt 35 pend +#define NVIC_PEND1_INT34 0x00000004 ///< Interrupt 34 pend +#define NVIC_PEND1_INT33 0x00000002 ///< Interrupt 33 pend +#define NVIC_PEND1_INT32 0x00000001 ///< Interrupt 32 pend +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_UNPEND0 register. + */ +/*\{*/ +#define NVIC_UNPEND0_INT31 0x80000000 ///< Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 ///< Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 ///< Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 ///< Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 ///< Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 ///< Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 ///< Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 ///< Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 ///< Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 ///< Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 ///< Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 ///< Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 ///< Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 ///< Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 ///< Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 ///< Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 ///< Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 ///< Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 ///< Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 ///< Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 ///< Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 ///< Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 ///< Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 ///< Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 ///< Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 ///< Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 ///< Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 ///< Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 ///< Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 ///< Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 ///< Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 ///< Interrupt 0 unpend +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_UNPEND1 register. + */ +/*\{*/ +#define NVIC_UNPEND1_INT59 0x08000000 ///< Interrupt 59 unpend +#define NVIC_UNPEND1_INT58 0x04000000 ///< Interrupt 58 unpend +#define NVIC_UNPEND1_INT57 0x02000000 ///< Interrupt 57 unpend +#define NVIC_UNPEND1_INT56 0x01000000 ///< Interrupt 56 unpend +#define NVIC_UNPEND1_INT55 0x00800000 ///< Interrupt 55 unpend +#define NVIC_UNPEND1_INT54 0x00400000 ///< Interrupt 54 unpend +#define NVIC_UNPEND1_INT53 0x00200000 ///< Interrupt 53 unpend +#define NVIC_UNPEND1_INT52 0x00100000 ///< Interrupt 52 unpend +#define NVIC_UNPEND1_INT51 0x00080000 ///< Interrupt 51 unpend +#define NVIC_UNPEND1_INT50 0x00040000 ///< Interrupt 50 unpend +#define NVIC_UNPEND1_INT49 0x00020000 ///< Interrupt 49 unpend +#define NVIC_UNPEND1_INT48 0x00010000 ///< Interrupt 48 unpend +#define NVIC_UNPEND1_INT47 0x00008000 ///< Interrupt 47 unpend +#define NVIC_UNPEND1_INT46 0x00004000 ///< Interrupt 46 unpend +#define NVIC_UNPEND1_INT45 0x00002000 ///< Interrupt 45 unpend +#define NVIC_UNPEND1_INT44 0x00001000 ///< Interrupt 44 unpend +#define NVIC_UNPEND1_INT43 0x00000800 ///< Interrupt 43 unpend +#define NVIC_UNPEND1_INT42 0x00000400 ///< Interrupt 42 unpend +#define NVIC_UNPEND1_INT41 0x00000200 ///< Interrupt 41 unpend +#define NVIC_UNPEND1_INT40 0x00000100 ///< Interrupt 40 unpend +#define NVIC_UNPEND1_INT39 0x00000080 ///< Interrupt 39 unpend +#define NVIC_UNPEND1_INT38 0x00000040 ///< Interrupt 38 unpend +#define NVIC_UNPEND1_INT37 0x00000020 ///< Interrupt 37 unpend +#define NVIC_UNPEND1_INT36 0x00000010 ///< Interrupt 36 unpend +#define NVIC_UNPEND1_INT35 0x00000008 ///< Interrupt 35 unpend +#define NVIC_UNPEND1_INT34 0x00000004 ///< Interrupt 34 unpend +#define NVIC_UNPEND1_INT33 0x00000002 ///< Interrupt 33 unpend +#define NVIC_UNPEND1_INT32 0x00000001 ///< Interrupt 32 unpend +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ACTIVE0 register. + */ +/*\{*/ +#define NVIC_ACTIVE0_INT31 0x80000000 ///< Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 ///< Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 ///< Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 ///< Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 ///< Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 ///< Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 ///< Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 ///< Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 ///< Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 ///< Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 ///< Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 ///< Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 ///< Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 ///< Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 ///< Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 ///< Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 ///< Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 ///< Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 ///< Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 ///< Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 ///< Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 ///< Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 ///< Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 ///< Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 ///< Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 ///< Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 ///< Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 ///< Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 ///< Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 ///< Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 ///< Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 ///< Interrupt 0 active +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ACTIVE1 register. + */ +/*\{*/ +#define NVIC_ACTIVE1_INT59 0x08000000 ///< Interrupt 59 active +#define NVIC_ACTIVE1_INT58 0x04000000 ///< Interrupt 58 active +#define NVIC_ACTIVE1_INT57 0x02000000 ///< Interrupt 57 active +#define NVIC_ACTIVE1_INT56 0x01000000 ///< Interrupt 56 active +#define NVIC_ACTIVE1_INT55 0x00800000 ///< Interrupt 55 active +#define NVIC_ACTIVE1_INT54 0x00400000 ///< Interrupt 54 active +#define NVIC_ACTIVE1_INT53 0x00200000 ///< Interrupt 53 active +#define NVIC_ACTIVE1_INT52 0x00100000 ///< Interrupt 52 active +#define NVIC_ACTIVE1_INT51 0x00080000 ///< Interrupt 51 active +#define NVIC_ACTIVE1_INT50 0x00040000 ///< Interrupt 50 active +#define NVIC_ACTIVE1_INT49 0x00020000 ///< Interrupt 49 active +#define NVIC_ACTIVE1_INT48 0x00010000 ///< Interrupt 48 active +#define NVIC_ACTIVE1_INT47 0x00008000 ///< Interrupt 47 active +#define NVIC_ACTIVE1_INT46 0x00004000 ///< Interrupt 46 active +#define NVIC_ACTIVE1_INT45 0x00002000 ///< Interrupt 45 active +#define NVIC_ACTIVE1_INT44 0x00001000 ///< Interrupt 44 active +#define NVIC_ACTIVE1_INT43 0x00000800 ///< Interrupt 43 active +#define NVIC_ACTIVE1_INT42 0x00000400 ///< Interrupt 42 active +#define NVIC_ACTIVE1_INT41 0x00000200 ///< Interrupt 41 active +#define NVIC_ACTIVE1_INT40 0x00000100 ///< Interrupt 40 active +#define NVIC_ACTIVE1_INT39 0x00000080 ///< Interrupt 39 active +#define NVIC_ACTIVE1_INT38 0x00000040 ///< Interrupt 38 active +#define NVIC_ACTIVE1_INT37 0x00000020 ///< Interrupt 37 active +#define NVIC_ACTIVE1_INT36 0x00000010 ///< Interrupt 36 active +#define NVIC_ACTIVE1_INT35 0x00000008 ///< Interrupt 35 active +#define NVIC_ACTIVE1_INT34 0x00000004 ///< Interrupt 34 active +#define NVIC_ACTIVE1_INT33 0x00000002 ///< Interrupt 33 active +#define NVIC_ACTIVE1_INT32 0x00000001 ///< Interrupt 32 active +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI0 register. + */ +/*\{*/ +#define NVIC_PRI0_INT3_M 0xFF000000 ///< Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 ///< Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 ///< Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF ///< Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI1 register. + */ +/*\{*/ +#define NVIC_PRI1_INT7_M 0xFF000000 ///< Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 ///< Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 ///< Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF ///< Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI2 register. + */ +/*\{*/ +#define NVIC_PRI2_INT11_M 0xFF000000 ///< Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 ///< Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 ///< Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF ///< Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI3 register. + */ +/*\{*/ +#define NVIC_PRI3_INT15_M 0xFF000000 ///< Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 ///< Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 ///< Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF ///< Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI4 register. + */ +/*\{*/ +#define NVIC_PRI4_INT19_M 0xFF000000 ///< Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 ///< Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 ///< Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF ///< Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI5 register. + */ +/*\{*/ +#define NVIC_PRI5_INT23_M 0xFF000000 ///< Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 ///< Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 ///< Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF ///< Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI6 register. + */ +/*\{*/ +#define NVIC_PRI6_INT27_M 0xFF000000 ///< Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 ///< Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 ///< Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF ///< Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI7 register. + */ +/*\{*/ +#define NVIC_PRI7_INT31_M 0xFF000000 ///< Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 ///< Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 ///< Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF ///< Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI8 register. + */ +/*\{*/ +#define NVIC_PRI8_INT35_M 0xFF000000 ///< Interrupt 35 priority mask +#define NVIC_PRI8_INT34_M 0x00FF0000 ///< Interrupt 34 priority mask +#define NVIC_PRI8_INT33_M 0x0000FF00 ///< Interrupt 33 priority mask +#define NVIC_PRI8_INT32_M 0x000000FF ///< Interrupt 32 priority mask +#define NVIC_PRI8_INT35_S 24 +#define NVIC_PRI8_INT34_S 16 +#define NVIC_PRI8_INT33_S 8 +#define NVIC_PRI8_INT32_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI9 register. + */ +/*\{*/ +#define NVIC_PRI9_INT39_M 0xFF000000 ///< Interrupt 39 priority mask +#define NVIC_PRI9_INT38_M 0x00FF0000 ///< Interrupt 38 priority mask +#define NVIC_PRI9_INT37_M 0x0000FF00 ///< Interrupt 37 priority mask +#define NVIC_PRI9_INT36_M 0x000000FF ///< Interrupt 36 priority mask +#define NVIC_PRI9_INT39_S 24 +#define NVIC_PRI9_INT38_S 16 +#define NVIC_PRI9_INT37_S 8 +#define NVIC_PRI9_INT36_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI10 register. + */ +/*\{*/ +#define NVIC_PRI10_INT43_M 0xFF000000 ///< Interrupt 43 priority mask +#define NVIC_PRI10_INT42_M 0x00FF0000 ///< Interrupt 42 priority mask +#define NVIC_PRI10_INT41_M 0x0000FF00 ///< Interrupt 41 priority mask +#define NVIC_PRI10_INT40_M 0x000000FF ///< Interrupt 40 priority mask +#define NVIC_PRI10_INT43_S 24 +#define NVIC_PRI10_INT42_S 16 +#define NVIC_PRI10_INT41_S 8 +#define NVIC_PRI10_INT40_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_CPUID register. + */ +/*\{*/ +#define NVIC_CPUID_IMP_M 0xFF000000 ///< Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 ///< Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 ///< Processor part number +#define NVIC_CPUID_REV_M 0x0000000F ///< Revision +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_INT_CTRL register. + */ +/*\{*/ +#define NVIC_INT_CTRL_NMI_SET 0x80000000 ///< Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 ///< Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 ///< Unpend a PendSV +#define NVIC_INT_CTRL_PENDSTSET 0x04000000 ///< Set pending SysTick interrupt +#define NVIC_INT_CTRL_PENDSTCLR 0x02000000 ///< Clear pending SysTick interrupt +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 ///< Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 ///< Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 ///< Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 ///< Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF ///< Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_VTABLE register. + */ +/*\{*/ +#define NVIC_VTABLE_BASE 0x20000000 ///< Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 ///< Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_APINT register. + */ +/*\{*/ +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 ///< Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 ///< Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 ///< Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 ///< Priority group +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 ///< Priority group 0.8 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 ///< Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 ///< Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 ///< Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 ///< Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 ///< Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 ///< Priority group 6.2 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 ///< System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 ///< Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 ///< System reset +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 ///< Priority group 7.1 split +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_CTRL register. + */ +/*\{*/ +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 ///< Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 ///< Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 ///< Sleep on ISR exit +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_CFG_CTRL register. + */ +/*\{*/ +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 ///< Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 ///< Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 ///< Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 ///< Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 ///< Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 ///< Thread state control +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_PRI1 register. + */ +/*\{*/ +#define NVIC_SYS_PRI1_RES_M 0xFF000000 ///< Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 ///< Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 ///< Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF ///< Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_PRI2 register. + */ +/*\{*/ +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 ///< Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF ///< Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_PRI3 register. + */ +/*\{*/ +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 ///< Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 ///< Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 ///< Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF ///< Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_HND_CTRL + * register. + */ +/*\{*/ +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 ///< Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 ///< Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 ///< Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 ///< SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 ///< Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 ///< Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 ///< PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 ///< Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 ///< SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 ///< Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 ///< Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 ///< Mem manage is active +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_FAULT_STAT + * register. + */ +/*\{*/ +#define NVIC_FAULT_STAT_DIV0 0x02000000 ///< Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 ///< Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 ///< No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 ///< Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 ///< Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 ///< Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 ///< BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 ///< Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 ///< Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 ///< Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 ///< Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 ///< Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 ///< MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 ///< Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 ///< Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 ///< Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 ///< Instruction access violation +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_HFAULT_STAT + * register. + */ +/*\{*/ +#define NVIC_HFAULT_STAT_DBG 0x80000000 ///< Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 ///< Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 ///< Vector table read fault +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DEBUG_STAT + * register. + */ +/*\{*/ +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 ///< EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 ///< Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 ///< DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 ///< Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 ///< Halt request +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MM_ADDR register. + */ +/*\{*/ +#define NVIC_MM_ADDR_M 0xFFFFFFFF ///< Data fault address +#define NVIC_MM_ADDR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_FAULT_ADDR + * register. + */ +/*\{*/ +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF ///< Data bus fault address +#define NVIC_FAULT_ADDR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_TYPE register. + */ +/*\{*/ +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 ///< Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 ///< Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 ///< Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_CTRL register. + */ +/*\{*/ +#define NVIC_MPU_CTRL_PRIVDEFEN 0x00000004 ///< MPU default region in priv mode +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 ///< MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 ///< MPU enable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_NUMBER + * register. + */ +/*\{*/ +#define NVIC_MPU_NUMBER_M 0x000000FF ///< MPU region to access +#define NVIC_MPU_NUMBER_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_BASE register. + */ +/*\{*/ +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFFE0 ///< Base address mask +#define NVIC_MPU_BASE_VALID 0x00000010 ///< Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F ///< Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_ATTR register. + */ +/*\{*/ +#define NVIC_MPU_ATTR_M 0xFFFF0000 ///< Attributes +#define NVIC_MPU_ATTR_AP_NO_NO 0x00000000 ///< prv: no access, usr: no access +#define NVIC_MPU_ATTR_BUFFRABLE 0x00010000 ///< Bufferable +#define NVIC_MPU_ATTR_CACHEABLE 0x00020000 ///< Cacheable +#define NVIC_MPU_ATTR_SHAREABLE 0x00040000 ///< Shareable +#define NVIC_MPU_ATTR_TEX_M 0x00380000 ///< Type extension mask +#define NVIC_MPU_ATTR_AP_RW_NO 0x01000000 ///< prv: rw, usr: none +#define NVIC_MPU_ATTR_AP_RW_RO 0x02000000 ///< prv: rw, usr: read-only +#define NVIC_MPU_ATTR_AP_RW_RW 0x03000000 ///< prv: rw, usr: rw +#define NVIC_MPU_ATTR_AP_RO_NO 0x05000000 ///< prv: ro, usr: none +#define NVIC_MPU_ATTR_AP_RO_RO 0x06000000 ///< prv: ro, usr: ro +#define NVIC_MPU_ATTR_AP_M 0x07000000 ///< Access permissions mask +#define NVIC_MPU_ATTR_XN 0x10000000 ///< Execute disable +#define NVIC_MPU_ATTR_SRD_M 0x0000FF00 ///< Sub-region disable mask +#define NVIC_MPU_ATTR_SRD_0 0x00000100 ///< Sub-region 0 disable +#define NVIC_MPU_ATTR_SRD_1 0x00000200 ///< Sub-region 1 disable +#define NVIC_MPU_ATTR_SRD_2 0x00000400 ///< Sub-region 2 disable +#define NVIC_MPU_ATTR_SRD_3 0x00000800 ///< Sub-region 3 disable +#define NVIC_MPU_ATTR_SRD_4 0x00001000 ///< Sub-region 4 disable +#define NVIC_MPU_ATTR_SRD_5 0x00002000 ///< Sub-region 5 disable +#define NVIC_MPU_ATTR_SRD_6 0x00004000 ///< Sub-region 6 disable +#define NVIC_MPU_ATTR_SRD_7 0x00008000 ///< Sub-region 7 disable +#define NVIC_MPU_ATTR_SIZE_M 0x0000003E ///< Region size mask +#define NVIC_MPU_ATTR_SIZE_32B 0x00000008 ///< Region size 32 bytes +#define NVIC_MPU_ATTR_SIZE_64B 0x0000000A ///< Region size 64 bytes +#define NVIC_MPU_ATTR_SIZE_128B 0x0000000C ///< Region size 128 bytes +#define NVIC_MPU_ATTR_SIZE_256B 0x0000000E ///< Region size 256 bytes +#define NVIC_MPU_ATTR_SIZE_512B 0x00000010 ///< Region size 512 bytes +#define NVIC_MPU_ATTR_SIZE_1K 0x00000012 ///< Region size 1 Kbytes +#define NVIC_MPU_ATTR_SIZE_2K 0x00000014 ///< Region size 2 Kbytes +#define NVIC_MPU_ATTR_SIZE_4K 0x00000016 ///< Region size 4 Kbytes +#define NVIC_MPU_ATTR_SIZE_8K 0x00000018 ///< Region size 8 Kbytes +#define NVIC_MPU_ATTR_SIZE_16K 0x0000001A ///< Region size 16 Kbytes +#define NVIC_MPU_ATTR_SIZE_32K 0x0000001C ///< Region size 32 Kbytes +#define NVIC_MPU_ATTR_SIZE_64K 0x0000001E ///< Region size 64 Kbytes +#define NVIC_MPU_ATTR_SIZE_128K 0x00000020 ///< Region size 128 Kbytes +#define NVIC_MPU_ATTR_SIZE_256K 0x00000022 ///< Region size 256 Kbytes +#define NVIC_MPU_ATTR_SIZE_512K 0x00000024 ///< Region size 512 Kbytes +#define NVIC_MPU_ATTR_SIZE_1M 0x00000026 ///< Region size 1 Mbytes +#define NVIC_MPU_ATTR_SIZE_2M 0x00000028 ///< Region size 2 Mbytes +#define NVIC_MPU_ATTR_SIZE_4M 0x0000002A ///< Region size 4 Mbytes +#define NVIC_MPU_ATTR_SIZE_8M 0x0000002C ///< Region size 8 Mbytes +#define NVIC_MPU_ATTR_SIZE_16M 0x0000002E ///< Region size 16 Mbytes +#define NVIC_MPU_ATTR_SIZE_32M 0x00000030 ///< Region size 32 Mbytes +#define NVIC_MPU_ATTR_SIZE_64M 0x00000032 ///< Region size 64 Mbytes +#define NVIC_MPU_ATTR_SIZE_128M 0x00000034 ///< Region size 128 Mbytes +#define NVIC_MPU_ATTR_SIZE_256M 0x00000036 ///< Region size 256 Mbytes +#define NVIC_MPU_ATTR_SIZE_512M 0x00000038 ///< Region size 512 Mbytes +#define NVIC_MPU_ATTR_SIZE_1G 0x0000003A ///< Region size 1 Gbytes +#define NVIC_MPU_ATTR_SIZE_2G 0x0000003C ///< Region size 2 Gbytes +#define NVIC_MPU_ATTR_SIZE_4G 0x0000003E ///< Region size 4 Gbytes +#define NVIC_MPU_ATTR_ENABLE 0x00000001 ///< Region enable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DBG_CTRL register. + */ +/*\{*/ +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 ///< Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 ///< Debug key +#define NVIC_DBG_CTRL_S_RESET_ST \ + 0x02000000 ///< Core has reset since last read +#define NVIC_DBG_CTRL_S_RETIRE_ST \ + 0x01000000 ///< Core has executed insruction + ///< since last read +#define NVIC_DBG_CTRL_S_LOCKUP 0x00080000 ///< Core is locked up +#define NVIC_DBG_CTRL_S_SLEEP 0x00040000 ///< Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00020000 ///< Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00010000 ///< Register read/write available +#define NVIC_DBG_CTRL_C_SNAPSTALL \ + 0x00000020 ///< Breaks a stalled load/store +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 ///< Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 ///< Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 ///< Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 ///< Enable debug +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DBG_XFER register. + */ +/*\{*/ +#define NVIC_DBG_XFER_REG_WNR 0x00010000 ///< Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F ///< Register +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 ///< Control/Fault/BasePri/PriMask +#define NVIC_DBG_XFER_REG_DSP 0x00000013 ///< Deep SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 ///< Process SP +#define NVIC_DBG_XFER_REG_MSP 0x00000011 ///< Main SP +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 ///< xPSR/Flags register +#define NVIC_DBG_XFER_REG_R15 0x0000000F ///< Register R15 +#define NVIC_DBG_XFER_REG_R14 0x0000000E ///< Register R14 +#define NVIC_DBG_XFER_REG_R13 0x0000000D ///< Register R13 +#define NVIC_DBG_XFER_REG_R12 0x0000000C ///< Register R12 +#define NVIC_DBG_XFER_REG_R11 0x0000000B ///< Register R11 +#define NVIC_DBG_XFER_REG_R10 0x0000000A ///< Register R10 +#define NVIC_DBG_XFER_REG_R9 0x00000009 ///< Register R9 +#define NVIC_DBG_XFER_REG_R8 0x00000008 ///< Register R8 +#define NVIC_DBG_XFER_REG_R7 0x00000007 ///< Register R7 +#define NVIC_DBG_XFER_REG_R6 0x00000006 ///< Register R6 +#define NVIC_DBG_XFER_REG_R5 0x00000005 ///< Register R5 +#define NVIC_DBG_XFER_REG_R4 0x00000004 ///< Register R4 +#define NVIC_DBG_XFER_REG_R3 0x00000003 ///< Register R3 +#define NVIC_DBG_XFER_REG_R2 0x00000002 ///< Register R2 +#define NVIC_DBG_XFER_REG_R1 0x00000001 ///< Register R1 +#define NVIC_DBG_XFER_REG_R0 0x00000000 ///< Register R0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DBG_DATA register. + */ +/*\{*/ +#define NVIC_DBG_DATA_M 0xFFFFFFFF ///< Data temporary cache +#define NVIC_DBG_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DBG_INT register. + */ +/*\{*/ +#define NVIC_DBG_INT_HARDERR 0x00000400 ///< Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 ///< Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 ///< Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 ///< Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 ///< Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 ///< Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 ///< Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 ///< Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 ///< Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 ///< Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 ///< Reset vector catch +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SW_TRIG register. + */ +/*\{*/ +#define NVIC_SW_TRIG_INTID_M 0x000003FF ///< Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 +/*\}*/ + +#endif /* LM3S_NVIC_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/lm3s_pwm.h b/2.5/bertos/cpu/cortex-m3/io/lm3s_pwm.h new file mode 100644 index 00000000..ec19d2f4 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/lm3s_pwm.h @@ -0,0 +1,543 @@ +/** + * \file + * + * + * \brief LM3S1968 PWM hardware definitions. + */ + +#ifndef L3MS_PWM_H +#define L3MS_PWM_H + +/** + * The following are defines for the PWM register offsets. + */ +#define PWM_O_CTL (*((reg32_t *)(PWMC_BASE + 0x00000000))) //< PWM Master Control +#define PWM_O_SYNC (*((reg32_t *)(PWMC_BASE + 0x00000004))) //< PWM Time Base Sync +#define PWM_O_ENABLE (*((reg32_t *)(PWMC_BASE + 0x00000008))) //< PWM Output Enable +#define PWM_O_INVERT (*((reg32_t *)(PWMC_BASE + 0x0000000C))) //< PWM Output Inversion +#define PWM_O_FAULT (*((reg32_t *)(PWMC_BASE + 0x00000010))) //< PWM Output Fault +#define PWM_O_INTEN (*((reg32_t *)(PWMC_BASE + 0x00000014))) //< PWM Interrupt Enable +#define PWM_O_RIS (*((reg32_t *)(PWMC_BASE + 0x00000018))) //< PWM Raw Interrupt Status +#define PWM_O_ISC (*((reg32_t *)(PWMC_BASE + 0x0000001C))) //< PWM Interrupt Status and Clear +#define PWM_O_STATUS (*((reg32_t *)(PWMC_BASE + 0x00000020))) //< PWM Status +#define PWM_O_FAULTVAL (*((reg32_t *)(PWMC_BASE + 0x00000024))) //< PWM Fault Condition Value +#define PWM_O_ENUPD (*((reg32_t *)(PWMC_BASE + 0x00000028))) //< PWM Enable Update +#define PWM_O_0_CTL (*((reg32_t *)(PWMC_BASE + 0x00000040))) //< PWM0 Control +#define PWM_O_0_INTEN (*((reg32_t *)(PWMC_BASE + 0x00000044))) //< PWM0 Interrupt and Trigger Enable +#define PWM_O_0_RIS (*((reg32_t *)(PWMC_BASE + 0x00000048))) //< PWM0 Raw Interrupt Status +#define PWM_O_0_ISC (*((reg32_t *)(PWMC_BASE + 0x0000004C))) //< PWM0 Interrupt Status and Clear +#define PWM_O_0_LOAD (*((reg32_t *)(PWMC_BASE + 0x00000050))) //< PWM0 Load +#define PWM_O_0_COUNT (*((reg32_t *)(PWMC_BASE + 0x00000054))) //< PWM0 Counter +#define PWM_O_0_CMPA (*((reg32_t *)(PWMC_BASE + 0x00000058))) //< PWM0 Compare A +#define PWM_O_0_CMPB (*((reg32_t *)(PWMC_BASE + 0x0000005C))) //< PWM0 Compare B +#define PWM_O_0_GENA (*((reg32_t *)(PWMC_BASE + 0x00000060))) //< PWM0 Generator A Control +#define PWM_O_0_GENB (*((reg32_t *)(PWMC_BASE + 0x00000064))) //< PWM0 Generator B Control +#define PWM_O_0_DBCTL (*((reg32_t *)(PWMC_BASE + 0x00000068))) //< PWM0 Dead-Band Control +#define PWM_O_0_DBRISE (*((reg32_t *)(PWMC_BASE + 0x0000006C))) //< PWM0 Dead-Band Rising-Edge Delay +#define PWM_O_0_DBFALL (*((reg32_t *)(PWMC_BASE + 0x00000070))) //< PWM0 Dead-Band Falling-Edge-Delay +#define PWM_O_0_FLTSRC0 (*((reg32_t *)(PWMC_BASE + 0x00000074))) //< PWM0 Fault Source 0 +#define PWM_O_0_FLTSRC1 (*((reg32_t *)(PWMC_BASE + 0x00000078))) //< PWM0 Fault Source 1 +#define PWM_O_0_MINFLTPER (*((reg32_t *)(PWMC_BASE + 0x0000007C))) //< PWM0 Minimum Fault Period +#define PWM_O_1_CTL (*((reg32_t *)(PWMC_BASE + 0x00000080))) //< PWM1 Control +#define PWM_O_1_INTEN (*((reg32_t *)(PWMC_BASE + 0x00000084))) //< PWM1 Interrupt and Trigger Enable +#define PWM_O_1_RIS (*((reg32_t *)(PWMC_BASE + 0x00000088))) //< PWM1 Raw Interrupt Status +#define PWM_O_1_ISC (*((reg32_t *)(PWMC_BASE + 0x0000008C))) //< PWM1 Interrupt Status and Clear +#define PWM_O_1_LOAD (*((reg32_t *)(PWMC_BASE + 0x00000090))) //< PWM1 Load +#define PWM_O_1_COUNT (*((reg32_t *)(PWMC_BASE + 0x00000094))) //< PWM1 Counter +#define PWM_O_1_CMPA (*((reg32_t *)(PWMC_BASE + 0x00000098))) //< PWM1 Compare A +#define PWM_O_1_CMPB (*((reg32_t *)(PWMC_BASE + 0x0000009C))) //< PWM1 Compare B +#define PWM_O_1_GENA (*((reg32_t *)(PWMC_BASE + 0x000000A0))) //< PWM1 Generator A Control +#define PWM_O_1_GENB (*((reg32_t *)(PWMC_BASE + 0x000000A4))) //< PWM1 Generator B Control +#define PWM_O_1_DBCTL (*((reg32_t *)(PWMC_BASE + 0x000000A8))) //< PWM1 Dead-Band Control +#define PWM_O_1_DBRISE (*((reg32_t *)(PWMC_BASE + 0x000000AC))) //< PWM1 Dead-Band Rising-Edge Delay +#define PWM_O_1_DBFALL (*((reg32_t *)(PWMC_BASE + 0x000000B0))) //< PWM1 Dead-Band Falling-Edge-Delay +#define PWM_O_1_FLTSRC0 (*((reg32_t *)(PWMC_BASE + 0x000000B4))) //< PWM1 Fault Source 0 +#define PWM_O_1_FLTSRC1 (*((reg32_t *)(PWMC_BASE + 0x000000B8))) //< PWM1 Fault Source 1 +#define PWM_O_1_MINFLTPER (*((reg32_t *)(PWMC_BASE + 0x000000BC))) //< PWM1 Minimum Fault Period +#define PWM_O_2_CTL (*((reg32_t *)(PWMC_BASE + 0x000000C0))) //< PWM2 Control +#define PWM_O_2_INTEN (*((reg32_t *)(PWMC_BASE + 0x000000C4))) //< PWM2 Interrupt and Trigger Enable +#define PWM_O_2_RIS (*((reg32_t *)(PWMC_BASE + 0x000000C8))) //< PWM2 Raw Interrupt Status +#define PWM_O_2_ISC (*((reg32_t *)(PWMC_BASE + 0x000000CC))) //< PWM2 Interrupt Status and Clear +#define PWM_O_2_LOAD (*((reg32_t *)(PWMC_BASE + 0x000000D0))) //< PWM2 Load +#define PWM_O_2_COUNT (*((reg32_t *)(PWMC_BASE + 0x000000D4))) //< PWM2 Counter +#define PWM_O_2_CMPA (*((reg32_t *)(PWMC_BASE + 0x000000D8))) //< PWM2 Compare A +#define PWM_O_2_CMPB (*((reg32_t *)(PWMC_BASE + 0x000000DC))) //< PWM2 Compare B +#define PWM_O_2_GENA (*((reg32_t *)(PWMC_BASE + 0x000000E0))) //< PWM2 Generator A Control +#define PWM_O_2_GENB (*((reg32_t *)(PWMC_BASE + 0x000000E4))) //< PWM2 Generator B Control +#define PWM_O_2_DBCTL (*((reg32_t *)(PWMC_BASE + 0x000000E8))) //< PWM2 Dead-Band Control +#define PWM_O_2_DBRISE (*((reg32_t *)(PWMC_BASE + 0x000000EC))) //< PWM2 Dead-Band Rising-Edge Delay +#define PWM_O_2_DBFALL (*((reg32_t *)(PWMC_BASE + 0x000000F0))) //< PWM2 Dead-Band Falling-Edge-Delay +#define PWM_O_2_FLTSRC0 (*((reg32_t *)(PWMC_BASE + 0x000000F4))) //< PWM2 Fault Source 0 +#define PWM_O_2_FLTSRC1 (*((reg32_t *)(PWMC_BASE + 0x000000F8))) //< PWM2 Fault Source 1 +#define PWM_O_2_MINFLTPER (*((reg32_t *)(PWMC_BASE + 0x000000FC))) //< PWM2 Minimum Fault Period +#define PWM_O_3_CTL (*((reg32_t *)(PWMC_BASE + 0x00000100))) //< PWM3 Control +#define PWM_O_3_INTEN (*((reg32_t *)(PWMC_BASE + 0x00000104))) //< PWM3 Interrupt and Trigger Enable +#define PWM_O_3_RIS (*((reg32_t *)(PWMC_BASE + 0x00000108))) //< PWM3 Raw Interrupt Status +#define PWM_O_3_ISC (*((reg32_t *)(PWMC_BASE + 0x0000010C))) //< PWM3 Interrupt Status and Clear +#define PWM_O_3_LOAD (*((reg32_t *)(PWMC_BASE + 0x00000110))) //< PWM3 Load +#define PWM_O_3_COUNT (*((reg32_t *)(PWMC_BASE + 0x00000114))) //< PWM3 Counter +#define PWM_O_3_CMPA (*((reg32_t *)(PWMC_BASE + 0x00000118))) //< PWM3 Compare A +#define PWM_O_3_CMPB (*((reg32_t *)(PWMC_BASE + 0x0000011C))) //< PWM3 Compare B +#define PWM_O_3_GENA (*((reg32_t *)(PWMC_BASE + 0x00000120))) //< PWM3 Generator A Control +#define PWM_O_3_GENB (*((reg32_t *)(PWMC_BASE + 0x00000124))) //< PWM3 Generator B Control +#define PWM_O_3_DBCTL (*((reg32_t *)(PWMC_BASE + 0x00000128))) //< PWM3 Dead-Band Control +#define PWM_O_3_DBRISE (*((reg32_t *)(PWMC_BASE + 0x0000012C))) //< PWM3 Dead-Band Rising-Edge Delay +#define PWM_O_3_DBFALL (*((reg32_t *)(PWMC_BASE + 0x00000130))) //< PWM3 Dead-Band Falling-Edge-Delay +#define PWM_O_3_FLTSRC0 (*((reg32_t *)(PWMC_BASE + 0x00000134))) //< PWM3 Fault Source 0 +#define PWM_O_3_FLTSRC1 (*((reg32_t *)(PWMC_BASE + 0x00000138))) //< PWM3 Fault Source 1 +#define PWM_O_3_MINFLTPER (*((reg32_t *)(PWMC_BASE + 0x0000013C))) //< PWM3 Minimum Fault Period +#define PWM_O_0_FLTSEN (*((reg32_t *)(PWMC_BASE + 0x00000800))) //< PWM0 Fault Pin Logic Sense +#define PWM_O_0_FLTSTAT0 (*((reg32_t *)(PWMC_BASE + 0x00000804))) //< PWM0 Fault Status 0 +#define PWM_O_0_FLTSTAT1 (*((reg32_t *)(PWMC_BASE + 0x00000808))) //< PWM0 Fault Status 1 +#define PWM_O_1_FLTSEN (*((reg32_t *)(PWMC_BASE + 0x00000880))) //< PWM1 Fault Pin Logic Sense +#define PWM_O_1_FLTSTAT0 (*((reg32_t *)(PWMC_BASE + 0x00000884))) //< PWM1 Fault Status 0 +#define PWM_O_1_FLTSTAT1 (*((reg32_t *)(PWMC_BASE + 0x00000888))) //< PWM1 Fault Status 1 +#define PWM_O_2_FLTSEN (*((reg32_t *)(PWMC_BASE + 0x00000900))) //< PWM2 Fault Pin Logic Sense +#define PWM_O_2_FLTSTAT0 (*((reg32_t *)(PWMC_BASE + 0x00000904))) //< PWM2 Fault Status 0 +#define PWM_O_2_FLTSTAT1 (*((reg32_t *)(PWMC_BASE + 0x00000908))) //< PWM2 Fault Status 1 +#define PWM_O_3_FLTSEN (*((reg32_t *)(PWMC_BASE + 0x00000980))) //< PWM3 Fault Pin Logic Sense +#define PWM_O_3_FLTSTAT0 (*((reg32_t *)(PWMC_BASE + 0x00000984))) //< PWM3 Fault Status 0 +#define PWM_O_3_FLTSTAT1 (*((reg32_t *)(PWMC_BASE + 0x00000988))) //< PWM3 Fault Status 1 + +/** + * Defines for the bit fields in the PWM_O_CTL register. + */ +#define PWM_CTL_GLOBALSYNC3 3 //< Update PWM Generator 3 +#define PWM_CTL_GLOBALSYNC2 2 //< Update PWM Generator 2 +#define PWM_CTL_GLOBALSYNC1 1 //< Update PWM Generator 1 +#define PWM_CTL_GLOBALSYNC0 0 //< Update PWM Generator 0 + +/** + * Defines for the bit fields in the PWM_O_SYNC register. + */ +#define PWM_SYNC_SYNC3 3 //< Reset Generator 3 Counter +#define PWM_SYNC_SYNC2 2 //< Reset Generator 2 Counter +#define PWM_SYNC_SYNC1 1 //< Reset Generator 1 Counter +#define PWM_SYNC_SYNC0 0 //< Reset Generator 0 Counter + +/** + * Defines for the bit fields in the PWM_O_ENABLE register. + */ +#define PWM_ENABLE_PWM7EN 7 //< PWM7 Output Enable +#define PWM_ENABLE_PWM6EN 6 //< PWM6 Output Enable +#define PWM_ENABLE_PWM5EN 5 //< PWM5 Output Enable +#define PWM_ENABLE_PWM4EN 4 //< PWM4 Output Enable +#define PWM_ENABLE_PWM3EN 3 //< PWM3 Output Enable +#define PWM_ENABLE_PWM2EN 2 //< PWM2 Output Enable +#define PWM_ENABLE_PWM1EN 1 //< PWM1 Output Enable +#define PWM_ENABLE_PWM0EN 0 //< PWM0 Output Enable + +/** + * Defines for the bit fields in the PWM_O_INVERT register. + */ +#define PWM_INVERT_PWM7INV 7 //< Invert PWM7 Signal +#define PWM_INVERT_PWM6INV 6 //< Invert PWM6 Signal +#define PWM_INVERT_PWM5INV 5 //< Invert PWM5 Signal +#define PWM_INVERT_PWM4INV 4 //< Invert PWM4 Signal +#define PWM_INVERT_PWM3INV 3 //< Invert PWM3 Signal +#define PWM_INVERT_PWM2INV 2 //< Invert PWM2 Signal +#define PWM_INVERT_PWM1INV 1 //< Invert PWM1 Signal +#define PWM_INVERT_PWM0INV 0 //< Invert PWM0 Signal + +/** + * Defines for the bit fields in the PWM_O_FAULT register. + */ +#define PWM_FAULT_FAULT7 7 //< PWM7 Fault +#define PWM_FAULT_FAULT6 6 //< PWM6 Fault +#define PWM_FAULT_FAULT5 5 //< PWM5 Fault +#define PWM_FAULT_FAULT4 4 //< PWM4 Fault +#define PWM_FAULT_FAULT3 3 //< PWM3 Fault +#define PWM_FAULT_FAULT2 2 //< PWM2 Fault +#define PWM_FAULT_FAULT1 1 //< PWM1 Fault +#define PWM_FAULT_FAULT0 0 //< PWM0 Fault + +/** + * Defines for the bit fields in the PWM_O_INTEN register. + */ +#define PWM_INTEN_INTFAULT3 19 //< Interrupt Fault 3 +#define PWM_INTEN_INTFAULT2 18 //< Interrupt Fault 2 +#define PWM_INTEN_INTFAULT1 17 //< Interrupt Fault 1 +#define PWM_INTEN_INTFAULT 16 //< Fault Interrupt Enable +#define PWM_INTEN_INTFAULT0 16 //< Interrupt Fault 0 +#define PWM_INTEN_INTPWM3 3 //< PWM3 Interrupt Enable +#define PWM_INTEN_INTPWM2 2 //< PWM2 Interrupt Enable +#define PWM_INTEN_INTPWM1 1 //< PWM1 Interrupt Enable +#define PWM_INTEN_INTPWM0 0 //< PWM0 Interrupt Enable + +/** + * Defines for the bit fields in the PWM_O_RIS register. + */ +#define PWM_RIS_INTFAULT3 19 //< Interrupt Fault PWM 3 +#define PWM_RIS_INTFAULT2 18 //< Interrupt Fault PWM 2 +#define PWM_RIS_INTFAULT1 17 //< Interrupt Fault PWM 1 +#define PWM_RIS_INTFAULT0 16 //< Interrupt Fault PWM 0 +#define PWM_RIS_INTFAULT 16 //< Fault Interrupt Asserted +#define PWM_RIS_INTPWM3 3 //< PWM3 Interrupt Asserted +#define PWM_RIS_INTPWM2 2 //< PWM2 Interrupt Asserted +#define PWM_RIS_INTPWM1 1 //< PWM1 Interrupt Asserted +#define PWM_RIS_INTPWM0 0 //< PWM0 Interrupt Asserted + +/** + * Defines for the bit fields in the PWM_O_ISC register. + */ +#define PWM_ISC_INTFAULT3 19 //< FAULT3 Interrupt Asserted +#define PWM_ISC_INTFAULT2 18 //< FAULT2 Interrupt Asserted +#define PWM_ISC_INTFAULT1 17 //< FAULT1 Interrupt Asserted +#define PWM_ISC_INTFAULT 16 //< Fault Interrupt Asserted +#define PWM_ISC_INTFAULT0 16 //< FAULT0 Interrupt Asserted +#define PWM_ISC_INTPWM3 3 //< PWM3 Interrupt Status +#define PWM_ISC_INTPWM2 2 //< PWM2 Interrupt Status +#define PWM_ISC_INTPWM1 1 //< PWM1 Interrupt Status +#define PWM_ISC_INTPWM0 0 //< PWM0 Interrupt Status + +/** + * Defines for the bit fields in the PWM_O_STATUS register. + */ +#define PWM_STATUS_FAULT3 3 //< Generator 3 Fault Status +#define PWM_STATUS_FAULT2 2 //< Generator 2 Fault Status +#define PWM_STATUS_FAULT1 1 //< Generator 1 Fault Status +#define PWM_STATUS_FAULT0 0 //< Generator 0 Fault Status + +/** + * Defines for the bit fields in the PWM_O_FAULTVAL register. + */ +#define PWM_FAULTVAL_PWM7 7 //< PWM7 Fault Value +#define PWM_FAULTVAL_PWM6 6 //< PWM6 Fault Value +#define PWM_FAULTVAL_PWM5 5 //< PWM5 Fault Value +#define PWM_FAULTVAL_PWM4 4 //< PWM4 Fault Value +#define PWM_FAULTVAL_PWM3 3 //< PWM3 Fault Value +#define PWM_FAULTVAL_PWM2 2 //< PWM2 Fault Value +#define PWM_FAULTVAL_PWM1 1 //< PWM1 Fault Value +#define PWM_FAULTVAL_PWM0 0 //< PWM0 Fault Value + +/** + * Defines for the bit fields in the PWM_O_ENUPD register. + */ +#define PWM_ENUPD_ENUPD7_M 0x0000C000 //< PWM7 Enable Update Mode +#define PWM_ENUPD_ENUPD7_IMM 0x00000000 //< Immediate +#define PWM_ENUPD_ENUPD7_LSYNC 0x00008000 //< Locally Synchronized +#define PWM_ENUPD_ENUPD7_GSYNC 0x0000C000 //< Globally Synchronized +#define PWM_ENUPD_ENUPD6_M 0x00003000 //< PWM6 Enable Update Mode +#define PWM_ENUPD_ENUPD6_IMM 0x00000000 //< Immediate +#define PWM_ENUPD_ENUPD6_LSYNC 0x00002000 //< Locally Synchronized +#define PWM_ENUPD_ENUPD6_GSYNC 0x00003000 //< Globally Synchronized +#define PWM_ENUPD_ENUPD5_M 0x00000C00 //< PWM5 Enable Update Mode +#define PWM_ENUPD_ENUPD5_IMM 0x00000000 //< Immediate +#define PWM_ENUPD_ENUPD5_LSYNC 0x00000800 //< Locally Synchronized +#define PWM_ENUPD_ENUPD5_GSYNC 0x00000C00 //< Globally Synchronized +#define PWM_ENUPD_ENUPD4_M 0x00000300 //< PWM4 Enable Update Mode +#define PWM_ENUPD_ENUPD4_IMM 0x00000000 //< Immediate +#define PWM_ENUPD_ENUPD4_LSYNC 0x00000200 //< Locally Synchronized +#define PWM_ENUPD_ENUPD4_GSYNC 0x00000300 //< Globally Synchronized +#define PWM_ENUPD_ENUPD3_M 0x000000C0 //< PWM3 Enable Update Mode +#define PWM_ENUPD_ENUPD3_IMM 0x00000000 //< Immediate +#define PWM_ENUPD_ENUPD3_LSYNC 0x00000080 //< Locally Synchronized +#define PWM_ENUPD_ENUPD3_GSYNC 0x000000C0 //< Globally Synchronized +#define PWM_ENUPD_ENUPD2_M 0x00000030 //< PWM2 Enable Update Mode +#define PWM_ENUPD_ENUPD2_IMM 0x00000000 //< Immediate +#define PWM_ENUPD_ENUPD2_LSYNC 0x00000020 //< Locally Synchronized +#define PWM_ENUPD_ENUPD2_GSYNC 0x00000030 //< Globally Synchronized +#define PWM_ENUPD_ENUPD1_M 0x0000000C //< PWM1 Enable Update Mode +#define PWM_ENUPD_ENUPD1_IMM 0x00000000 //< Immediate +#define PWM_ENUPD_ENUPD1_LSYNC 0x00000008 //< Locally Synchronized +#define PWM_ENUPD_ENUPD1_GSYNC 0x0000000C //< Globally Synchronized +#define PWM_ENUPD_ENUPD0_M 0x00000003 //< PWM0 Enable Update Mode +#define PWM_ENUPD_ENUPD0_IMM 0x00000000 //< Immediate +#define PWM_ENUPD_ENUPD0_LSYNC 0x00000002 //< Locally Synchronized +#define PWM_ENUPD_ENUPD0_GSYNC 0x00000003 //< Globally Synchronized + +/** + * Defines for the bit fields in the PWM_O_X_CTL register. + */ +#define PWM_X_CTL_LATCH 0x00040000 //< Latch Fault Input +#define PWM_X_CTL_MINFLTPER 0x00020000 //< Minimum Fault Period +#define PWM_X_CTL_FLTSRC 0x00010000 //< Fault Condition Source +#define PWM_X_CTL_DBFALLUPD_M 0x0000C000 //< PWMnDBFALL Update Mode +#define PWM_X_CTL_DBFALLUPD_I 0x00000000 //< Immediate +#define PWM_X_CTL_DBFALLUPD_LS 0x00008000 //< Locally Synchronized +#define PWM_X_CTL_DBFALLUPD_GS 0x0000C000 //< Globally Synchronized +#define PWM_X_CTL_DBRISEUPD_M 0x00003000 //< PWMnDBRISE Update Mode +#define PWM_X_CTL_DBRISEUPD_I 0x00000000 //< Immediate +#define PWM_X_CTL_DBRISEUPD_LS 0x00002000 //< Locally Synchronized +#define PWM_X_CTL_DBRISEUPD_GS 0x00003000 //< Globally Synchronized +#define PWM_X_CTL_DBCTLUPD_M 0x00000C00 //< PWMnDBCTL Update Mode +#define PWM_X_CTL_DBCTLUPD_I 0x00000000 //< Immediate +#define PWM_X_CTL_DBCTLUPD_LS 0x00000800 //< Locally Synchronized +#define PWM_X_CTL_DBCTLUPD_GS 0x00000C00 //< Globally Synchronized +#define PWM_X_CTL_GENBUPD_M 0x00000300 //< PWMnGENB Update Mode +#define PWM_X_CTL_GENBUPD_I 0x00000000 //< Immediate +#define PWM_X_CTL_GENBUPD_LS 0x00000200 //< Locally Synchronized +#define PWM_X_CTL_GENBUPD_GS 0x00000300 //< Globally Synchronized +#define PWM_X_CTL_GENAUPD_M 0x000000C0 //< PWMnGENA Update Mode +#define PWM_X_CTL_GENAUPD_I 0x00000000 //< Immediate +#define PWM_X_CTL_GENAUPD_LS 0x00000080 //< Locally Synchronized +#define PWM_X_CTL_GENAUPD_GS 0x000000C0 //< Globally Synchronized +#define PWM_X_CTL_CMPBUPD 0x00000020 //< Comparator B Update Mode +#define PWM_X_CTL_CMPAUPD 0x00000010 //< Comparator A Update Mode +#define PWM_X_CTL_LOADUPD 0x00000008 //< Load Register Update Mode +#define PWM_X_CTL_DEBUG 0x00000004 //< Debug Mode +#define PWM_X_CTL_MODE 0x00000002 //< Counter Mode +#define PWM_X_CTL_ENABLE 0x00000001 //< PWM Block Enable + +/** + * Defines for the bit fields in the PWM_O_X_INTEN register. + */ +#define PWM_X_INTEN_TRCMPBD 0x00002000 //< Trigger for Counter=PWMnCMPB Down +#define PWM_X_INTEN_TRCMPBU 0x00001000 //< Trigger for Counter=PWMnCMPB Up +#define PWM_X_INTEN_TRCMPAD 0x00000800 //< Trigger for Counter=PWMnCMPA Down +#define PWM_X_INTEN_TRCMPAU 0x00000400 //< Trigger for Counter=PWMnCMPA Up +#define PWM_X_INTEN_TRCNTLOAD 0x00000200 //< Trigger for Counter=PWMnLOAD +#define PWM_X_INTEN_TRCNTZERO 0x00000100 //< Trigger for Counter=0 +#define PWM_X_INTEN_INTCMPBD 0x00000020 //< Interrupt for Counter=PWMnCMPB Down +#define PWM_X_INTEN_INTCMPBU 0x00000010 //< Interrupt for Counter=PWMnCMPB Up +#define PWM_X_INTEN_INTCMPAD 0x00000008 //< Interrupt for Counter=PWMnCMPA Down +#define PWM_X_INTEN_INTCMPAU 0x00000004 //< Interrupt for Counter=PWMnCMPA Up +#define PWM_X_INTEN_INTCNTLOAD 0x00000002 //< Interrupt for Counter=PWMnLOAD +#define PWM_X_INTEN_INTCNTZERO 0x00000001 //< Interrupt for Counter=0 + +/** + * Defines for the bit fields in the PWM_O_X_RIS register. + */ +#define PWM_X_RIS_INTCMPBD 0x00000020 //< Comparator B Down Interrupt Status +#define PWM_X_RIS_INTCMPBU 0x00000010 //< Comparator B Up Interrupt Status +#define PWM_X_RIS_INTCMPAD 0x00000008 //< Comparator A Down Interrupt Status +#define PWM_X_RIS_INTCMPAU 0x00000004 //< Comparator A Up Interrupt Status +#define PWM_X_RIS_INTCNTLOAD 0x00000002 //< Counter=Load Interrupt Status +#define PWM_X_RIS_INTCNTZERO 0x00000001 //< Counter=0 Interrupt Status + +/** + * Defines for the bit fields in the PWM_O_X_ISC register. + */ +#define PWM_X_ISC_INTCMPBD 0x00000020 //< Comparator B Down Interrupt +#define PWM_X_ISC_INTCMPBU 0x00000010 //< Comparator B Up Interrupt +#define PWM_X_ISC_INTCMPAD 0x00000008 //< Comparator A Down Interrupt +#define PWM_X_ISC_INTCMPAU 0x00000004 //< Comparator A Up Interrupt +#define PWM_X_ISC_INTCNTLOAD 0x00000002 //< Counter=Load Interrupt +#define PWM_X_ISC_INTCNTZERO 0x00000001 //< Counter=0 Interrupt + +/** + * Defines for the bit fields in the PWM_O_X_LOAD register. + */ +#define PWM_X_LOAD_M 0x0000FFFF //< Counter Load Value +#define PWM_X_LOAD_S 0 + +/** + * Defines for the bit fields in the PWM_O_X_COUNT register. + */ +#define PWM_X_COUNT_M 0x0000FFFF //< Counter Value +#define PWM_X_COUNT_S 0 + +/** + * Defines for the bit fields in the PWM_O_X_CMPA register. + */ +#define PWM_X_CMPA_M 0x0000FFFF //< Comparator A Value +#define PWM_X_CMPA_S 0 + +/** + * Defines for the bit fields in the PWM_O_X_CMPB register. + */ +#define PWM_X_CMPB_M 0x0000FFFF //< Comparator B Value +#define PWM_X_CMPB_S 0 + +/** + * Defines for the bit fields in the PWM_O_X_GENA register. + */ +#define PWM_X_GENA_ACTCMPBD_M 0x00000C00 //< Action for Comparator B Down +#define PWM_X_GENA_ACTCMPBD_NONE 0x00000000 //< Do nothing +#define PWM_X_GENA_ACTCMPBD_INV 0x00000400 //< Invert pwmA +#define PWM_X_GENA_ACTCMPBD_ZERO 0x00000800 //< Drive pwmA Low +#define PWM_X_GENA_ACTCMPBD_ONE 0x00000C00 //< Drive pwmA High +#define PWM_X_GENA_ACTCMPBU_M 0x00000300 //< Action for Comparator B Up +#define PWM_X_GENA_ACTCMPBU_NONE 0x00000000 //< Do nothing +#define PWM_X_GENA_ACTCMPBU_INV 0x00000100 //< Invert pwmA +#define PWM_X_GENA_ACTCMPBU_ZERO 0x00000200 //< Drive pwmA Low +#define PWM_X_GENA_ACTCMPBU_ONE 0x00000300 //< Drive pwmA High +#define PWM_X_GENA_ACTCMPAD_M 0x000000C0 //< Action for Comparator A Down +#define PWM_X_GENA_ACTCMPAD_NONE 0x00000000 //< Do nothing +#define PWM_X_GENA_ACTCMPAD_INV 0x00000040 //< Invert pwmA +#define PWM_X_GENA_ACTCMPAD_ZERO 0x00000080 //< Drive pwmA Low +#define PWM_X_GENA_ACTCMPAD_ONE 0x000000C0 //< Drive pwmA High +#define PWM_X_GENA_ACTCMPAU_M 0x00000030 //< Action for Comparator A Up +#define PWM_X_GENA_ACTCMPAU_NONE 0x00000000 //< Do nothing +#define PWM_X_GENA_ACTCMPAU_INV 0x00000010 //< Invert pwmA +#define PWM_X_GENA_ACTCMPAU_ZERO 0x00000020 //< Drive pwmA Low +#define PWM_X_GENA_ACTCMPAU_ONE 0x00000030 //< Drive pwmA High +#define PWM_X_GENA_ACTLOAD_M 0x0000000C //< Action for Counter=LOAD +#define PWM_X_GENA_ACTLOAD_NONE 0x00000000 //< Do nothing +#define PWM_X_GENA_ACTLOAD_INV 0x00000004 //< Invert pwmA +#define PWM_X_GENA_ACTLOAD_ZERO 0x00000008 //< Drive pwmA Low +#define PWM_X_GENA_ACTLOAD_ONE 0x0000000C //< Drive pwmA High +#define PWM_X_GENA_ACTZERO_M 0x00000003 //< Action for Counter=0 +#define PWM_X_GENA_ACTZERO_NONE 0x00000000 //< Do nothing +#define PWM_X_GENA_ACTZERO_INV 0x00000001 //< Invert pwmA +#define PWM_X_GENA_ACTZERO_ZERO 0x00000002 //< Drive pwmA Low +#define PWM_X_GENA_ACTZERO_ONE 0x00000003 //< Drive pwmA High + +/** + * Defines for the bit fields in the PWM_O_X_GENB register. + */ +#define PWM_X_GENB_ACTCMPBD_M 0x00000C00 //< Action for Comparator B Down +#define PWM_X_GENB_ACTCMPBD_NONE 0x00000000 //< Do nothing +#define PWM_X_GENB_ACTCMPBD_INV 0x00000400 //< Invert pwmB +#define PWM_X_GENB_ACTCMPBD_ZERO 0x00000800 //< Drive pwmB Low +#define PWM_X_GENB_ACTCMPBD_ONE 0x00000C00 //< Drive pwmB High +#define PWM_X_GENB_ACTCMPBU_M 0x00000300 //< Action for Comparator B Up +#define PWM_X_GENB_ACTCMPBU_NONE 0x00000000 //< Do nothing +#define PWM_X_GENB_ACTCMPBU_INV 0x00000100 //< Invert pwmB +#define PWM_X_GENB_ACTCMPBU_ZERO 0x00000200 //< Drive pwmB Low +#define PWM_X_GENB_ACTCMPBU_ONE 0x00000300 //< Drive pwmB High +#define PWM_X_GENB_ACTCMPAD_M 0x000000C0 //< Action for Comparator A Down +#define PWM_X_GENB_ACTCMPAD_NONE 0x00000000 //< Do nothing +#define PWM_X_GENB_ACTCMPAD_INV 0x00000040 //< Invert pwmB +#define PWM_X_GENB_ACTCMPAD_ZERO 0x00000080 //< Drive pwmB Low +#define PWM_X_GENB_ACTCMPAD_ONE 0x000000C0 //< Drive pwmB High +#define PWM_X_GENB_ACTCMPAU_M 0x00000030 //< Action for Comparator A Up +#define PWM_X_GENB_ACTCMPAU_NONE 0x00000000 //< Do nothing +#define PWM_X_GENB_ACTCMPAU_INV 0x00000010 //< Invert pwmB +#define PWM_X_GENB_ACTCMPAU_ZERO 0x00000020 //< Drive pwmB Low +#define PWM_X_GENB_ACTCMPAU_ONE 0x00000030 //< Drive pwmB High +#define PWM_X_GENB_ACTLOAD_M 0x0000000C //< Action for Counter=LOAD +#define PWM_X_GENB_ACTLOAD_NONE 0x00000000 //< Do nothing +#define PWM_X_GENB_ACTLOAD_INV 0x00000004 //< Invert pwmB +#define PWM_X_GENB_ACTLOAD_ZERO 0x00000008 //< Drive pwmB Low +#define PWM_X_GENB_ACTLOAD_ONE 0x0000000C //< Drive pwmB High +#define PWM_X_GENB_ACTZERO_M 0x00000003 //< Action for Counter=0 +#define PWM_X_GENB_ACTZERO_NONE 0x00000000 //< Do nothing +#define PWM_X_GENB_ACTZERO_INV 0x00000001 //< Invert pwmB +#define PWM_X_GENB_ACTZERO_ZERO 0x00000002 //< Drive pwmB Low +#define PWM_X_GENB_ACTZERO_ONE 0x00000003 //< Drive pwmB High + +/** + * Defines for the bit fields in the PWM_O_X_DBCTL register. + */ +#define PWM_X_DBCTL_ENABLE 0x00000001 //< Dead-Band Generator Enable +/** + * Defines for the bit fields in the PWM_O_X_DBRISE register. + */ +#define PWM_X_DBRISE_DELAY_M 0x00000FFF //< Dead-Band Rise Delay +#define PWM_X_DBRISE_DELAY_S 0 + +/** + * Defines for the bit fields in the PWM_O_X_DBFALL register. + */ +#define PWM_X_DBFALL_DELAY_M 0x00000FFF //< Dead-Band Fall Delay +#define PWM_X_DBFALL_DELAY_S 0 + +/** + * Defines for the bit fields in the PWM_O_X_FLTSRC0 register. + */ +#define PWM_X_FLTSRC0_FAULT3 0x00000008 //< Fault3 Input +#define PWM_X_FLTSRC0_FAULT2 0x00000004 //< Fault2 Input +#define PWM_X_FLTSRC0_FAULT1 0x00000002 //< Fault1 Input +#define PWM_X_FLTSRC0_FAULT0 0x00000001 //< Fault0 Input + +/** + * The following are defines for the bit fields in the PWM_O_X_FLTSRC1 register. + */ +#define PWM_X_FLTSRC1_DCMP7 0x00000080 //< Digital Comparator 7 +#define PWM_X_FLTSRC1_DCMP6 0x00000040 //< Digital Comparator 6 +#define PWM_X_FLTSRC1_DCMP5 0x00000020 //< Digital Comparator 5 +#define PWM_X_FLTSRC1_DCMP4 0x00000010 //< Digital Comparator 4 +#define PWM_X_FLTSRC1_DCMP3 0x00000008 //< Digital Comparator 3 +#define PWM_X_FLTSRC1_DCMP2 0x00000004 //< Digital Comparator 2 +#define PWM_X_FLTSRC1_DCMP1 0x00000002 //< Digital Comparator 1 +#define PWM_X_FLTSRC1_DCMP0 0x00000001 //< Digital Comparator 0 + +/** + * Defines for the bit fields in the PWM_O_X_MINFLTPER register. + */ +#define PWM_X_MINFLTPER_M 0x0000FFFF //< Minimum Fault Period +#define PWM_X_MINFLTPER_S 0 + +/** + * Defines for the bit fields in the PWM_O_X_FLTSEN register. + */ +#define PWM_X_FLTSEN_FAULT3 0x00000008 //< Fault3 Sense +#define PWM_X_FLTSEN_FAULT2 0x00000004 //< Fault2 Sense +#define PWM_X_FLTSEN_FAULT1 0x00000002 //< Fault1 Sense +#define PWM_X_FLTSEN_FAULT0 0x00000001 //< Fault0 Sense + +/** + * Defines for the bit fields in the PWM_O_X_FLTSTAT0 register. + */ +#define PWM_X_FLTSTAT0_FAULT3 0x00000008 //< Fault Input 3 +#define PWM_X_FLTSTAT0_FAULT2 0x00000004 //< Fault Input 2 +#define PWM_X_FLTSTAT0_FAULT1 0x00000002 //< Fault Input 1 +#define PWM_X_FLTSTAT0_FAULT0 0x00000001 //< Fault Input 0 + +/** + * Defines for the bit fields in the PWM_O_X_FLTSTAT1 register. + */ +#define PWM_X_FLTSTAT1_DCMP7 0x00000080 //< Digital Comparator 7 Trigger +#define PWM_X_FLTSTAT1_DCMP6 0x00000040 //< Digital Comparator 6 Trigger +#define PWM_X_FLTSTAT1_DCMP5 0x00000020 //< Digital Comparator 5 Trigger +#define PWM_X_FLTSTAT1_DCMP4 0x00000010 //< Digital Comparator 4 Trigger +#define PWM_X_FLTSTAT1_DCMP3 0x00000008 //< Digital Comparator 3 Trigger +#define PWM_X_FLTSTAT1_DCMP2 0x00000004 //< Digital Comparator 2 Trigger +#define PWM_X_FLTSTAT1_DCMP1 0x00000002 //< Digital Comparator 1 Trigger +#define PWM_X_FLTSTAT1_DCMP0 0x00000001 //< Digital Comparator 0 Trigger + +/** + * Defines for the PWM Generator standard offsets. + */ +#define PWM_O_X_CTL (*((reg32_t *)(PWMC_BASE + 0x00000000))) //< Gen Control Reg +#define PWM_O_X_INTEN (*((reg32_t *)(PWMC_BASE + 0x00000004))) //< Gen Int/Trig Enable Reg +#define PWM_O_X_RIS (*((reg32_t *)(PWMC_BASE + 0x00000008))) //< Gen Raw Int Status Reg +#define PWM_O_X_ISC (*((reg32_t *)(PWMC_BASE + 0x0000000C))) //< Gen Int Status Reg +#define PWM_O_X_LOAD (*((reg32_t *)(PWMC_BASE + 0x00000010))) //< Gen Load Reg +#define PWM_O_X_COUNT (*((reg32_t *)(PWMC_BASE + 0x00000014))) //< Gen Counter Reg +#define PWM_O_X_CMPA (*((reg32_t *)(PWMC_BASE + 0x00000018))) //< Gen Compare A Reg +#define PWM_O_X_CMPB (*((reg32_t *)(PWMC_BASE + 0x0000001C))) //< Gen Compare B Reg +#define PWM_O_X_GENA (*((reg32_t *)(PWMC_BASE + 0x00000020))) //< Gen Generator A Ctrl Reg +#define PWM_O_X_GENB (*((reg32_t *)(PWMC_BASE + 0x00000024))) //< Gen Generator B Ctrl Reg +#define PWM_O_X_DBCTL (*((reg32_t *)(PWMC_BASE + 0x00000028))) //< Gen Dead Band Ctrl Reg +#define PWM_O_X_DBRISE (*((reg32_t *)(PWMC_BASE + 0x0000002C))) //< Gen DB Rising Edge Delay Reg +#define PWM_O_X_DBFALL (*((reg32_t *)(PWMC_BASE + 0x00000030))) //< Gen DB Falling Edge Delay Reg +#define PWM_O_X_FLTSRC0 (*((reg32_t *)(PWMC_BASE + 0x00000034))) //< Fault pin, comparator condition +#define PWM_O_X_FLTSRC1 (*((reg32_t *)(PWMC_BASE + 0x00000038))) //< Digital comparator condition +#define PWM_O_X_MINFLTPER (*((reg32_t *)(PWMC_BASE + 0x0000003C))) //< Fault minimum period extension +#define PWM_GEN_0_OFFSET (*((reg32_t *)(PWMC_BASE + 0x00000040))) //< PWM0 base +#define PWM_GEN_1_OFFSET (*((reg32_t *)(PWMC_BASE + 0x00000080))) //< PWM1 base +#define PWM_GEN_2_OFFSET (*((reg32_t *)(PWMC_BASE + 0x000000C0))) //< PWM2 base +#define PWM_GEN_3_OFFSET (*((reg32_t *)(PWMC_BASE + 0x00000100))) //< PWM3 base + +/** + * Defines for the PWM Generator extended offsets. + */ +#define PWM_O_X_FLTSEN (*((reg32_t *)(PWMC_BASE + 0x00000000))) //< Fault logic sense +#define PWM_O_X_FLTSTAT0 (*((reg32_t *)(PWMC_BASE + 0x00000004))) //< Pin and comparator status +#define PWM_O_X_FLTSTAT1 (*((reg32_t *)(PWMC_BASE + 0x00000008))) //< Digital comparator status +#define PWM_EXT_0_OFFSET (*((reg32_t *)(PWMC_BASE + 0x00000800))) //< PWM0 extended base +#define PWM_EXT_1_OFFSET (*((reg32_t *)(PWMC_BASE + 0x00000880))) //< PWM1 extended base +#define PWM_EXT_2_OFFSET (*((reg32_t *)(PWMC_BASE + 0x00000900))) //< PWM2 extended base +#define PWM_EXT_3_OFFSET (*((reg32_t *)(PWMC_BASE + 0x00000980))) //< PWM3 extended base + +#endif /* LM3S_PWM_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/lm3s_ssi.h b/2.5/bertos/cpu/cortex-m3/io/lm3s_ssi.h new file mode 100644 index 00000000..001da817 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/lm3s_ssi.h @@ -0,0 +1,228 @@ +/** + * \file + * + * + * \brief LM3S1968 SSI hardware definitions. + */ + +#ifndef LM3S_SSI_H +#define LM3S_SSI_H + +/** + * The following are defines for the SSI register offsets. + */ +/*\{*/ +#define SSI_O_CR0 0x00000000 //< SSI Control 0 +#define SSI_O_CR1 0x00000004 //< SSI Control 1 +#define SSI_O_DR 0x00000008 //< SSI Data +#define SSI_O_SR 0x0000000C //< SSI Status +#define SSI_O_CPSR 0x00000010 //< SSI Clock Prescale +#define SSI_O_IM 0x00000014 //< SSI Interrupt Mask +#define SSI_O_RIS 0x00000018 //< SSI Raw Interrupt Status +#define SSI_O_MIS 0x0000001C //< SSI Masked Interrupt Status +#define SSI_O_ICR 0x00000020 //< SSI Interrupt Clear +#define SSI_O_DMACTL 0x00000024 //< SSI DMA Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_CR0 register. + */ +/*\{*/ +#define SSI_CR0_SCR_M 0x0000FF00 //< SSI Serial Clock Rate +#define SSI_CR0_SPH 0x00000080 //< SSI Serial Clock Phase +#define SSI_CR0_SPO 0x00000040 //< SSI Serial Clock Polarity +#define SSI_CR0_FRF_M 0x00000030 //< SSI Frame Format Select +#define SSI_CR0_FRF_MOTO 0x00000000 //< Freescale SPI Frame Format +#define SSI_CR0_FRF_TI 0x00000010 //< Texas Instruments Synchronous + //< Serial Frame Format +#define SSI_CR0_FRF_NMW 0x00000020 //< MICROWIRE Frame Format +#define SSI_CR0_DSS_M 0x0000000F //< SSI Data Size Select +#define SSI_CR0_DSS_4 0x00000003 //< 4-bit data +#define SSI_CR0_DSS_5 0x00000004 //< 5-bit data +#define SSI_CR0_DSS_6 0x00000005 //< 6-bit data +#define SSI_CR0_DSS_7 0x00000006 //< 7-bit data +#define SSI_CR0_DSS_8 0x00000007 //< 8-bit data +#define SSI_CR0_DSS_9 0x00000008 //< 9-bit data +#define SSI_CR0_DSS_10 0x00000009 //< 10-bit data +#define SSI_CR0_DSS_11 0x0000000A //< 11-bit data +#define SSI_CR0_DSS_12 0x0000000B //< 12-bit data +#define SSI_CR0_DSS_13 0x0000000C //< 13-bit data +#define SSI_CR0_DSS_14 0x0000000D //< 14-bit data +#define SSI_CR0_DSS_15 0x0000000E //< 15-bit data +#define SSI_CR0_DSS_16 0x0000000F //< 16-bit data +#define SSI_CR0_SCR_S 8 +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_CR1 register. + */ +/*\{*/ +#define SSI_CR1_EOT 0x00000010 //< End of Transmission +#define SSI_CR1_SOD 0x00000008 //< SSI Slave Mode Output Disable +#define SSI_CR1_MS 0x00000004 //< SSI Master/Slave Select +#define SSI_CR1_SSE 0x00000002 //< SSI Synchronous Serial Port + //< Enable +#define SSI_CR1_LBM 0x00000001 //< SSI Loopback Mode +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_DR register. + */ +/*\{*/ +#define SSI_DR_DATA_M 0x0000FFFF //< SSI Receive/Transmit Data +#define SSI_DR_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_SR register. + */ +/*\{*/ +#define SSI_SR_BSY 0x00000010 //< SSI Busy Bit +#define SSI_SR_RFF 0x00000008 //< SSI Receive FIFO Full +#define SSI_SR_RNE 0x00000004 //< SSI Receive FIFO Not Empty +#define SSI_SR_TNF 0x00000002 //< SSI Transmit FIFO Not Full +#define SSI_SR_TFE 0x00000001 //< SSI Transmit FIFO Empty +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_CPSR register. + */ +/*\{*/ +#define SSI_CPSR_CPSDVSR_M 0x000000FF //< SSI Clock Prescale Divisor +#define SSI_CPSR_CPSDVSR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_IM register. + */ +/*\{*/ +#define SSI_IM_TXIM 0x00000008 //< SSI Transmit FIFO Interrupt Mask +#define SSI_IM_RXIM 0x00000004 //< SSI Receive FIFO Interrupt Mask +#define SSI_IM_RTIM 0x00000002 //< SSI Receive Time-Out Interrupt + //< Mask +#define SSI_IM_RORIM 0x00000001 //< SSI Receive Overrun Interrupt + //< Mask +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_RIS register. + */ +/*\{*/ +#define SSI_RIS_TXRIS 0x00000008 //< SSI Transmit FIFO Raw Interrupt + //< Status +#define SSI_RIS_RXRIS 0x00000004 //< SSI Receive FIFO Raw Interrupt + //< Status +#define SSI_RIS_RTRIS 0x00000002 //< SSI Receive Time-Out Raw + //< Interrupt Status +#define SSI_RIS_RORRIS 0x00000001 //< SSI Receive Overrun Raw + //< Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_MIS register. + */ +/*\{*/ +#define SSI_MIS_TXMIS 0x00000008 //< SSI Transmit FIFO Masked + //< Interrupt Status +#define SSI_MIS_RXMIS 0x00000004 //< SSI Receive FIFO Masked + //< Interrupt Status +#define SSI_MIS_RTMIS 0x00000002 //< SSI Receive Time-Out Masked + //< Interrupt Status +#define SSI_MIS_RORMIS 0x00000001 //< SSI Receive Overrun Masked + //< Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_ICR register. + */ +/*\{*/ +#define SSI_ICR_RTIC 0x00000002 //< SSI Receive Time-Out Interrupt + //< Clear +#define SSI_ICR_RORIC 0x00000001 //< SSI Receive Overrun Interrupt + //< Clear +/*\}*/ + +/** + * The following are defines for the bit fields in the SSI_O_DMACTL register. + */ +/*\{*/ +#define SSI_DMACTL_TXDMAE 0x00000002 //< Transmit DMA Enable +#define SSI_DMACTL_RXDMAE 0x00000001 //< Receive DMA Enable +/*\}*/ + +/** + * The following definitions are deprecated. + */ +/*\{*/ +#ifndef DEPRECATED +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SSI_O_CR0 + * register. + */ +/*\{*/ +#define SSI_CR0_SCR 0x0000FF00 //< Serial clock rate +#define SSI_CR0_FRF_MASK 0x00000030 //< Frame format mask +#define SSI_CR0_DSS 0x0000000F //< Data size select +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SSI_O_CPSR + * register. + */ +/*\{*/ +#define SSI_CPSR_CPSDVSR_MASK 0x000000FF //< Clock prescale +/*\}*/ + +/** + * The following are deprecated defines for the SSI controller's FIFO size. + */ +/*\{*/ +#define TX_FIFO_SIZE (8) //< Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) //< Number of entries in the RX FIFO +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the interrupt + * mask set and clear, raw interrupt, masked interrupt, and interrupt clear + * registers. + */ +/*\{*/ +#define SSI_INT_TXFF 0x00000008 //< TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 //< RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 //< RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 //< RX overrun interrupt +/*\}*/ + +#endif /* DEPRECATED */ + +#endif /* LM3S_SSI_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/lm3s_sysctl.h b/2.5/bertos/cpu/cortex-m3/io/lm3s_sysctl.h new file mode 100644 index 00000000..fdb33861 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/lm3s_sysctl.h @@ -0,0 +1,1685 @@ +/** + * \file + * + * + * \brief LM3S1968 system control hardware. + */ + +#ifndef LM3S_SYSCTL_H +#define LM3S_SYSCTL_H + +/** + * The following are defines for the System Control register addresses. + */ +/*\{*/ +#define SYSCTL_DID0 0x400FE000 ///< Device Identification 0 +#define SYSCTL_DID1 0x400FE004 ///< Device Identification 1 +#define SYSCTL_DC0 0x400FE008 ///< Device Capabilities 0 +#define SYSCTL_DC1 0x400FE010 ///< Device Capabilities 1 +#define SYSCTL_DC2 0x400FE014 ///< Device Capabilities 2 +#define SYSCTL_DC3 0x400FE018 ///< Device Capabilities 3 +#define SYSCTL_DC4 0x400FE01C ///< Device Capabilities 4 +#define SYSCTL_DC5 0x400FE020 ///< Device Capabilities 5 +#define SYSCTL_DC6 0x400FE024 ///< Device Capabilities 6 +#define SYSCTL_DC7 0x400FE028 ///< Device Capabilities 7 +#define SYSCTL_DC8 0x400FE02C ///< Device Capabilities 8 ADC + ///< Channels +#define SYSCTL_PBORCTL 0x400FE030 ///< Brown-Out Reset Control +#define SYSCTL_LDOPCTL 0x400FE034 ///< LDO Power Control +#define SYSCTL_SRCR0 0x400FE040 ///< Software Reset Control 0 +#define SYSCTL_SRCR1 0x400FE044 ///< Software Reset Control 1 +#define SYSCTL_SRCR2 0x400FE048 ///< Software Reset Control 2 +#define SYSCTL_RIS 0x400FE050 ///< Raw Interrupt Status +#define SYSCTL_IMC 0x400FE054 ///< Interrupt Mask Control +#define SYSCTL_MISC 0x400FE058 ///< Masked Interrupt Status and + ///< Clear +#define SYSCTL_RESC 0x400FE05C ///< Reset Cause +#define SYSCTL_RCC 0x400FE060 ///< Run-Mode Clock Configuration +#define SYSCTL_PLLCFG 0x400FE064 ///< XTAL to PLL Translation +#define SYSCTL_GPIOHSCTL 0x400FE06C ///< GPIO High-Speed Control +#define SYSCTL_GPIOHBCTL 0x400FE06C ///< GPIO High-Performance Bus + ///< Control +#define SYSCTL_RCC2 0x400FE070 ///< Run-Mode Clock Configuration 2 +#define SYSCTL_MOSCCTL 0x400FE07C ///< Main Oscillator Control +#define SYSCTL_RCGC0 0x400FE100 ///< Run Mode Clock Gating Control + ///< Register 0 +#define SYSCTL_RCGC1 0x400FE104 ///< Run Mode Clock Gating Control + ///< Register 1 +#define SYSCTL_RCGC2 0x400FE108 ///< Run Mode Clock Gating Control + ///< Register 2 +#define SYSCTL_SCGC0 0x400FE110 ///< Sleep Mode Clock Gating Control + ///< Register 0 +#define SYSCTL_SCGC1 0x400FE114 ///< Sleep Mode Clock Gating Control + ///< Register 1 +#define SYSCTL_SCGC2 0x400FE118 ///< Sleep Mode Clock Gating Control + ///< Register 2 +#define SYSCTL_DCGC0 0x400FE120 ///< Deep Sleep Mode Clock Gating + ///< Control Register 0 +#define SYSCTL_DCGC1 0x400FE124 ///< Deep-Sleep Mode Clock Gating + ///< Control Register 1 +#define SYSCTL_DCGC2 0x400FE128 ///< Deep Sleep Mode Clock Gating + ///< Control Register 2 +#define SYSCTL_DSLPCLKCFG 0x400FE144 ///< Deep Sleep Clock Configuration +#define SYSCTL_CLKVCLR 0x400FE150 ///< Clock Verification Clear +#define SYSCTL_PIOSCCAL 0x400FE150 ///< Precision Internal Oscillator + ///< Calibration +#define SYSCTL_PIOSCSTAT 0x400FE154 ///< Precision Internal Oscillator + ///< Statistics +#define SYSCTL_LDOARST 0x400FE160 ///< Allow Unregulated LDO to Reset + ///< the Part +#define SYSCTL_I2SMCLKCFG 0x400FE170 ///< I2S MCLK Configuration +#define SYSCTL_DC9 0x400FE190 ///< Device Capabilities 9 ADC + ///< Digital Comparators +#define SYSCTL_NVMSTAT 0x400FE1A0 ///< Non-Volatile Memory Information +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DID0 register. + */ +/*\{*/ +#define SYSCTL_DID0_VER_M 0x70000000 ///< DID0 Version +#define SYSCTL_DID0_VER_0 0x00000000 ///< Initial DID0 register format + ///< definition for Stellaris(R) + ///< Sandstorm-class devices +#define SYSCTL_DID0_VER_1 0x10000000 ///< Second version of the DID0 + ///< register format +#define SYSCTL_DID0_CLASS_M 0x00FF0000 ///< Device Class +#define SYSCTL_DID0_CLASS_SANDSTORM \ + 0x00000000 ///< Sandstorm-class Device +#define SYSCTL_DID0_CLASS_FURY 0x00010000 ///< Stellaris(R) Fury-class devices +#define SYSCTL_DID0_CLASS_DUSTDEVIL \ + 0x00030000 ///< Stellaris(R) DustDevil-class + ///< devices +#define SYSCTL_DID0_CLASS_TEMPEST \ + 0x00040000 ///< Stellaris(R) Tempest-class + ///< microcontrollers +#define SYSCTL_DID0_MAJ_M 0x0000FF00 ///< Major Revision +#define SYSCTL_DID0_MAJ_REVA 0x00000000 ///< Revision A (initial device) +#define SYSCTL_DID0_MAJ_REVB 0x00000100 ///< Revision B (first base layer + ///< revision) +#define SYSCTL_DID0_MAJ_REVC 0x00000200 ///< Revision C (second base layer + ///< revision) +#define SYSCTL_DID0_MIN_M 0x000000FF ///< Minor Revision +#define SYSCTL_DID0_MIN_0 0x00000000 ///< Initial device, or a major + ///< revision update +#define SYSCTL_DID0_MIN_1 0x00000001 ///< First metal layer change +#define SYSCTL_DID0_MIN_2 0x00000002 ///< Second metal layer change +#define SYSCTL_DID0_MIN_3 0x00000003 ///< Minor revision 3 +#define SYSCTL_DID0_MIN_4 0x00000004 ///< Minor revision 4 +#define SYSCTL_DID0_MIN_5 0x00000005 ///< Minor revision 5 +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DID1 register. + */ +/*\{*/ +#define SYSCTL_DID1_VER_M 0xF0000000 ///< DID1 Version +#define SYSCTL_DID1_VER_0 0x00000000 ///< Initial DID1 register format + ///< definition, indicating a + ///< Stellaris LM3Snnn device +#define SYSCTL_DID1_VER_1 0x10000000 ///< Second version of the DID1 + ///< register format +#define SYSCTL_DID1_FAM_M 0x0F000000 ///< Family +#define SYSCTL_DID1_FAM_STELLARIS \ + 0x00000000 ///< Stellaris family of + ///< microcontollers, that is, all + ///< devices with external part + ///< numbers starting with LM3S +#define SYSCTL_DID1_PRTNO_M 0x00FF0000 ///< Part Number +#define SYSCTL_DID1_PRTNO_101 0x00010000 ///< LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 ///< LM3S102 +#define SYSCTL_DID1_PRTNO_300 0x00190000 ///< LM3S300 +#define SYSCTL_DID1_PRTNO_301 0x00110000 ///< LM3S301 +#define SYSCTL_DID1_PRTNO_308 0x001A0000 ///< LM3S308 +#define SYSCTL_DID1_PRTNO_310 0x00120000 ///< LM3S310 +#define SYSCTL_DID1_PRTNO_315 0x00130000 ///< LM3S315 +#define SYSCTL_DID1_PRTNO_316 0x00140000 ///< LM3S316 +#define SYSCTL_DID1_PRTNO_317 0x00170000 ///< LM3S317 +#define SYSCTL_DID1_PRTNO_328 0x00150000 ///< LM3S328 +#define SYSCTL_DID1_PRTNO_600 0x002A0000 ///< LM3S600 +#define SYSCTL_DID1_PRTNO_601 0x00210000 ///< LM3S601 +#define SYSCTL_DID1_PRTNO_608 0x002B0000 ///< LM3S608 +#define SYSCTL_DID1_PRTNO_610 0x00220000 ///< LM3S610 +#define SYSCTL_DID1_PRTNO_611 0x00230000 ///< LM3S611 +#define SYSCTL_DID1_PRTNO_612 0x00240000 ///< LM3S612 +#define SYSCTL_DID1_PRTNO_613 0x00250000 ///< LM3S613 +#define SYSCTL_DID1_PRTNO_615 0x00260000 ///< LM3S615 +#define SYSCTL_DID1_PRTNO_617 0x00280000 ///< LM3S617 +#define SYSCTL_DID1_PRTNO_618 0x00290000 ///< LM3S618 +#define SYSCTL_DID1_PRTNO_628 0x00270000 ///< LM3S628 +#define SYSCTL_DID1_PRTNO_800 0x00380000 ///< LM3S800 +#define SYSCTL_DID1_PRTNO_801 0x00310000 ///< LM3S801 +#define SYSCTL_DID1_PRTNO_808 0x00390000 ///< LM3S808 +#define SYSCTL_DID1_PRTNO_811 0x00320000 ///< LM3S811 +#define SYSCTL_DID1_PRTNO_812 0x00330000 ///< LM3S812 +#define SYSCTL_DID1_PRTNO_815 0x00340000 ///< LM3S815 +#define SYSCTL_DID1_PRTNO_817 0x00360000 ///< LM3S817 +#define SYSCTL_DID1_PRTNO_818 0x00370000 ///< LM3S818 +#define SYSCTL_DID1_PRTNO_828 0x00350000 ///< LM3S828 +#define SYSCTL_DID1_PRTNO_1110 0x00BF0000 ///< LM3S1110 +#define SYSCTL_DID1_PRTNO_1133 0x00C30000 ///< LM3S1133 +#define SYSCTL_DID1_PRTNO_1138 0x00C50000 ///< LM3S1138 +#define SYSCTL_DID1_PRTNO_1150 0x00C10000 ///< LM3S1150 +#define SYSCTL_DID1_PRTNO_1162 0x00C40000 ///< LM3S1162 +#define SYSCTL_DID1_PRTNO_1165 0x00C20000 ///< LM3S1165 +#define SYSCTL_DID1_PRTNO_1332 0x00C60000 ///< LM3S1332 +#define SYSCTL_DID1_PRTNO_1435 0x00BC0000 ///< LM3S1435 +#define SYSCTL_DID1_PRTNO_1439 0x00BA0000 ///< LM3S1439 +#define SYSCTL_DID1_PRTNO_1512 0x00BB0000 ///< LM3S1512 +#define SYSCTL_DID1_PRTNO_1538 0x00C70000 ///< LM3S1538 +#define SYSCTL_DID1_PRTNO_1601 0x00DB0000 ///< LM3S1601 +#define SYSCTL_DID1_PRTNO_1607 0x00060000 ///< LM3S1607 +#define SYSCTL_DID1_PRTNO_1608 0x00DA0000 ///< LM3S1608 +#define SYSCTL_DID1_PRTNO_1620 0x00C00000 ///< LM3S1620 +#define SYSCTL_DID1_PRTNO_1625 0x00030000 ///< LM3S1625 +#define SYSCTL_DID1_PRTNO_1626 0x00040000 ///< LM3S1626 +#define SYSCTL_DID1_PRTNO_1627 0x00050000 ///< LM3S1627 +#define SYSCTL_DID1_PRTNO_1635 0x00B30000 ///< LM3S1635 +#define SYSCTL_DID1_PRTNO_1637 0x00BD0000 ///< LM3S1637 +#define SYSCTL_DID1_PRTNO_1751 0x00B90000 ///< LM3S1751 +#define SYSCTL_DID1_PRTNO_1776 0x00100000 ///< LM3S1776 +#define SYSCTL_DID1_PRTNO_1811 0x00160000 ///< LM3S1811 +#define SYSCTL_DID1_PRTNO_1816 0x003D0000 ///< LM3S1816 +#define SYSCTL_DID1_PRTNO_1850 0x00B40000 ///< LM3S1850 +#define SYSCTL_DID1_PRTNO_1911 0x00DD0000 ///< LM3S1911 +#define SYSCTL_DID1_PRTNO_1918 0x00DC0000 ///< LM3S1918 +#define SYSCTL_DID1_PRTNO_1937 0x00B70000 ///< LM3S1937 +#define SYSCTL_DID1_PRTNO_1958 0x00BE0000 ///< LM3S1958 +#define SYSCTL_DID1_PRTNO_1960 0x00B50000 ///< LM3S1960 +#define SYSCTL_DID1_PRTNO_1968 0x00B80000 ///< LM3S1968 +#define SYSCTL_DID1_PRTNO_1J11 0x000F0000 ///< LM3S1J11 +#define SYSCTL_DID1_PRTNO_1J16 0x003C0000 ///< LM3S1J16 +#define SYSCTL_DID1_PRTNO_1N11 0x000E0000 ///< LM3S1N11 +#define SYSCTL_DID1_PRTNO_1N16 0x003B0000 ///< LM3S1N16 +#define SYSCTL_DID1_PRTNO_1W16 0x00300000 ///< LM3S1W16 +#define SYSCTL_DID1_PRTNO_1Z16 0x002F0000 ///< LM3S1Z16 +#define SYSCTL_DID1_PRTNO_2110 0x00510000 ///< LM3S2110 +#define SYSCTL_DID1_PRTNO_2139 0x00840000 ///< LM3S2139 +#define SYSCTL_DID1_PRTNO_2276 0x00390000 ///< LM3S2276 +#define SYSCTL_DID1_PRTNO_2410 0x00A20000 ///< LM3S2410 +#define SYSCTL_DID1_PRTNO_2412 0x00590000 ///< LM3S2412 +#define SYSCTL_DID1_PRTNO_2432 0x00560000 ///< LM3S2432 +#define SYSCTL_DID1_PRTNO_2533 0x005A0000 ///< LM3S2533 +#define SYSCTL_DID1_PRTNO_2601 0x00E10000 ///< LM3S2601 +#define SYSCTL_DID1_PRTNO_2608 0x00E00000 ///< LM3S2608 +#define SYSCTL_DID1_PRTNO_2616 0x00330000 ///< LM3S2616 +#define SYSCTL_DID1_PRTNO_2620 0x00570000 ///< LM3S2620 +#define SYSCTL_DID1_PRTNO_2637 0x00850000 ///< LM3S2637 +#define SYSCTL_DID1_PRTNO_2651 0x00530000 ///< LM3S2651 +#define SYSCTL_DID1_PRTNO_2671 0x00800000 ///< LM3S2671 +#define SYSCTL_DID1_PRTNO_2678 0x00500000 ///< LM3S2678 +#define SYSCTL_DID1_PRTNO_2730 0x00A40000 ///< LM3S2730 +#define SYSCTL_DID1_PRTNO_2739 0x00520000 ///< LM3S2739 +#define SYSCTL_DID1_PRTNO_2776 0x003A0000 ///< LM3S2776 +#define SYSCTL_DID1_PRTNO_2793 0x006D0000 ///< LM3S2793 +#define SYSCTL_DID1_PRTNO_2911 0x00E30000 ///< LM3S2911 +#define SYSCTL_DID1_PRTNO_2918 0x00E20000 ///< LM3S2918 +#define SYSCTL_DID1_PRTNO_2939 0x00540000 ///< LM3S2939 +#define SYSCTL_DID1_PRTNO_2948 0x008F0000 ///< LM3S2948 +#define SYSCTL_DID1_PRTNO_2950 0x00580000 ///< LM3S2950 +#define SYSCTL_DID1_PRTNO_2965 0x00550000 ///< LM3S2965 +#define SYSCTL_DID1_PRTNO_2B93 0x006C0000 ///< LM3S2B93 +#define SYSCTL_DID1_PRTNO_3651 0x00430000 ///< LM3S3651 +#define SYSCTL_DID1_PRTNO_3739 0x00440000 ///< LM3S3739 +#define SYSCTL_DID1_PRTNO_3748 0x00490000 ///< LM3S3748 +#define SYSCTL_DID1_PRTNO_3749 0x00450000 ///< LM3S3749 +#define SYSCTL_DID1_PRTNO_3826 0x00420000 ///< LM3S3826 +#define SYSCTL_DID1_PRTNO_3J26 0x00410000 ///< LM3S3J26 +#define SYSCTL_DID1_PRTNO_3N26 0x00400000 ///< LM3S3N26 +#define SYSCTL_DID1_PRTNO_3W26 0x003F0000 ///< LM3S3W26 +#define SYSCTL_DID1_PRTNO_3Z26 0x003E0000 ///< LM3S3Z26 +#define SYSCTL_DID1_PRTNO_5632 0x00810000 ///< LM3S5632 +#define SYSCTL_DID1_PRTNO_5651 0x000C0000 ///< LM3S5651 +#define SYSCTL_DID1_PRTNO_5652 0x008A0000 ///< LM3S5652 +#define SYSCTL_DID1_PRTNO_5656 0x004D0000 ///< LM3S5656 +#define SYSCTL_DID1_PRTNO_5662 0x00910000 ///< LM3S5662 +#define SYSCTL_DID1_PRTNO_5732 0x00960000 ///< LM3S5732 +#define SYSCTL_DID1_PRTNO_5737 0x00970000 ///< LM3S5737 +#define SYSCTL_DID1_PRTNO_5739 0x00A00000 ///< LM3S5739 +#define SYSCTL_DID1_PRTNO_5747 0x00990000 ///< LM3S5747 +#define SYSCTL_DID1_PRTNO_5749 0x00A70000 ///< LM3S5749 +#define SYSCTL_DID1_PRTNO_5752 0x009A0000 ///< LM3S5752 +#define SYSCTL_DID1_PRTNO_5762 0x009C0000 ///< LM3S5762 +#define SYSCTL_DID1_PRTNO_5791 0x00690000 ///< LM3S5791 +#define SYSCTL_DID1_PRTNO_5951 0x000B0000 ///< LM3S5951 +#define SYSCTL_DID1_PRTNO_5956 0x004E0000 ///< LM3S5956 +#define SYSCTL_DID1_PRTNO_5B91 0x00680000 ///< LM3S5B91 +#define SYSCTL_DID1_PRTNO_5K31 0x00090000 ///< LM3S5K31 +#define SYSCTL_DID1_PRTNO_5K36 0x004A0000 ///< LM3S5K36 +#define SYSCTL_DID1_PRTNO_5P31 0x000A0000 ///< LM3S5P31 +#define SYSCTL_DID1_PRTNO_5P36 0x00480000 ///< LM3S5P36 +#define SYSCTL_DID1_PRTNO_5P51 0x000D0000 ///< LM3S5P51 +#define SYSCTL_DID1_PRTNO_5P56 0x004C0000 ///< LM3S5P56 +#define SYSCTL_DID1_PRTNO_5R31 0x00070000 ///< LM3S5R31 +#define SYSCTL_DID1_PRTNO_5R36 0x004B0000 ///< LM3S5R36 +#define SYSCTL_DID1_PRTNO_5T36 0x00470000 ///< LM3S5T36 +#define SYSCTL_DID1_PRTNO_5Y36 0x00460000 ///< LM3S5Y36 +#define SYSCTL_DID1_PRTNO_6100 0x00A10000 ///< LM3S6100 +#define SYSCTL_DID1_PRTNO_6110 0x00740000 ///< LM3S6110 +#define SYSCTL_DID1_PRTNO_6420 0x00A50000 ///< LM3S6420 +#define SYSCTL_DID1_PRTNO_6422 0x00820000 ///< LM3S6422 +#define SYSCTL_DID1_PRTNO_6432 0x00750000 ///< LM3S6432 +#define SYSCTL_DID1_PRTNO_6537 0x00760000 ///< LM3S6537 +#define SYSCTL_DID1_PRTNO_6610 0x00710000 ///< LM3S6610 +#define SYSCTL_DID1_PRTNO_6611 0x00E70000 ///< LM3S6611 +#define SYSCTL_DID1_PRTNO_6618 0x00E60000 ///< LM3S6618 +#define SYSCTL_DID1_PRTNO_6633 0x00830000 ///< LM3S6633 +#define SYSCTL_DID1_PRTNO_6637 0x008B0000 ///< LM3S6637 +#define SYSCTL_DID1_PRTNO_6730 0x00A30000 ///< LM3S6730 +#define SYSCTL_DID1_PRTNO_6753 0x00770000 ///< LM3S6753 +#define SYSCTL_DID1_PRTNO_6911 0x00E90000 ///< LM3S6911 +#define SYSCTL_DID1_PRTNO_6918 0x00E80000 ///< LM3S6918 +#define SYSCTL_DID1_PRTNO_6938 0x00890000 ///< LM3S6938 +#define SYSCTL_DID1_PRTNO_6950 0x00720000 ///< LM3S6950 +#define SYSCTL_DID1_PRTNO_6952 0x00780000 ///< LM3S6952 +#define SYSCTL_DID1_PRTNO_6965 0x00730000 ///< LM3S6965 +#define SYSCTL_DID1_PRTNO_8530 0x00640000 ///< LM3S8530 +#define SYSCTL_DID1_PRTNO_8538 0x008E0000 ///< LM3S8538 +#define SYSCTL_DID1_PRTNO_8630 0x00610000 ///< LM3S8630 +#define SYSCTL_DID1_PRTNO_8730 0x00630000 ///< LM3S8730 +#define SYSCTL_DID1_PRTNO_8733 0x008D0000 ///< LM3S8733 +#define SYSCTL_DID1_PRTNO_8738 0x00860000 ///< LM3S8738 +#define SYSCTL_DID1_PRTNO_8930 0x00650000 ///< LM3S8930 +#define SYSCTL_DID1_PRTNO_8933 0x008C0000 ///< LM3S8933 +#define SYSCTL_DID1_PRTNO_8938 0x00880000 ///< LM3S8938 +#define SYSCTL_DID1_PRTNO_8962 0x00A60000 ///< LM3S8962 +#define SYSCTL_DID1_PRTNO_8970 0x00620000 ///< LM3S8970 +#define SYSCTL_DID1_PRTNO_8971 0x00D70000 ///< LM3S8971 +#define SYSCTL_DID1_PRTNO_9790 0x00670000 ///< LM3S9790 +#define SYSCTL_DID1_PRTNO_9792 0x006B0000 ///< LM3S9792 +#define SYSCTL_DID1_PRTNO_9997 0x00200000 ///< LM3S9997 +#define SYSCTL_DID1_PRTNO_9B90 0x00660000 ///< LM3S9B90 +#define SYSCTL_DID1_PRTNO_9B92 0x006A0000 ///< LM3S9B92 +#define SYSCTL_DID1_PRTNO_9B95 0x006E0000 ///< LM3S9B95 +#define SYSCTL_DID1_PRTNO_9B96 0x006F0000 ///< LM3S9B96 +#define SYSCTL_DID1_PRTNO_9L97 0x00180000 ///< LM3S9L97 +#define SYSCTL_DID1_PINCNT_M 0x0000E000 ///< Package Pin Count +#define SYSCTL_DID1_PINCNT_28 0x00000000 ///< 28 pin package +#define SYSCTL_DID1_PINCNT_48 0x00002000 ///< 48 pin package +#define SYSCTL_DID1_PINCNT_100 0x00004000 ///< 100-pin package +#define SYSCTL_DID1_PINCNT_64 0x00006000 ///< 64-pin package +#define SYSCTL_DID1_TEMP_M 0x000000E0 ///< Temperature Range +#define SYSCTL_DID1_TEMP_C 0x00000000 ///< Commercial temperature range (0C + ///< to 70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 ///< Industrial temperature range + ///< (-40C to 85C) +#define SYSCTL_DID1_TEMP_E 0x00000040 ///< Extended temperature range (-40C + ///< to 105C) +#define SYSCTL_DID1_PKG_M 0x00000018 ///< Package Type +#define SYSCTL_DID1_PKG_SOIC 0x00000000 ///< SOIC package +#define SYSCTL_DID1_PKG_QFP 0x00000008 ///< LQFP package +#define SYSCTL_DID1_PKG_BGA 0x00000010 ///< BGA package +#define SYSCTL_DID1_PKG_QFN 0x00000018 ///< QFN package +#define SYSCTL_DID1_ROHS 0x00000004 ///< RoHS-Compliance +#define SYSCTL_DID1_QUAL_M 0x00000003 ///< Qualification Status +#define SYSCTL_DID1_QUAL_ES 0x00000000 ///< Engineering Sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 ///< Pilot Production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 ///< Fully Qualified +#define SYSCTL_DID1_PRTNO_S 16 ///< Part number shift +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DC0 register. + */ +/*\{*/ +#define SYSCTL_DC0_SRAMSZ_M 0xFFFF0000 ///< SRAM Size +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 ///< 2 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_4KB 0x000F0000 ///< 4 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_6KB 0x00170000 ///< 6 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_8KB 0x001F0000 ///< 8 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_12KB 0x002F0000 ///< 12 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_16KB 0x003F0000 ///< 16 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_20KB 0x004F0000 ///< 20 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_24KB 0x005F0000 ///< 24 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_32KB 0x007F0000 ///< 32 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_48KB 0x00BF0000 ///< 48 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_64KB 0x00FF0000 ///< 64 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_96KB 0x017F0000 ///< 96 KB of SRAM +#define SYSCTL_DC0_FLASHSZ_M 0x0000FFFF ///< Flash Size +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 ///< 8 KB of Flash +#define SYSCTL_DC0_FLASHSZ_16KB 0x00000007 ///< 16 KB of Flash +#define SYSCTL_DC0_FLASHSZ_32KB 0x0000000F ///< 32 KB of Flash +#define SYSCTL_DC0_FLASHSZ_64KB 0x0000001F ///< 64 KB of Flash +#define SYSCTL_DC0_FLASHSZ_96KB 0x0000002F ///< 96 KB of Flash +#define SYSCTL_DC0_FLASHSZ_128K 0x0000003F ///< 128 KB of Flash +#define SYSCTL_DC0_FLASHSZ_256K 0x0000007F ///< 256 KB of Flash +#define SYSCTL_DC0_SRAMSZ_S 16 ///< SRAM size shift +#define SYSCTL_DC0_FLASHSZ_S 0 ///< Flash size shift +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DC1 register. + */ +/*\{*/ +#define SYSCTL_DC1_WDT1 0x10000000 ///< Watchdog Timer1 Present +#define SYSCTL_DC1_CAN2 0x04000000 ///< CAN Module 2 Present +#define SYSCTL_DC1_CAN1 0x02000000 ///< CAN Module 1 Present +#define SYSCTL_DC1_CAN0 0x01000000 ///< CAN Module 0 Present +#define SYSCTL_DC1_PWM 0x00100000 ///< PWM Module Present +#define SYSCTL_DC1_ADC1 0x00020000 ///< ADC Module 1 Present +#define SYSCTL_DC1_ADC0 0x00010000 ///< ADC Module 0 Present +#define SYSCTL_DC1_MINSYSDIV_M 0x0000F000 ///< System Clock Divider +#define SYSCTL_DC1_MINSYSDIV_100 \ + 0x00001000 ///< Divide VCO (400MHZ) by 5 minimum +#define SYSCTL_DC1_MINSYSDIV_66 0x00002000 ///< Divide VCO (400MHZ) by 2*2 + 2 = + ///< 6 minimum +#define SYSCTL_DC1_MINSYSDIV_50 0x00003000 ///< Specifies a 50-MHz CPU clock + ///< with a PLL divider of 4 +#define SYSCTL_DC1_MINSYSDIV_25 0x00007000 ///< Specifies a 25-MHz clock with a + ///< PLL divider of 8 +#define SYSCTL_DC1_MINSYSDIV_20 0x00009000 ///< Specifies a 20-MHz clock with a + ///< PLL divider of 10 +#define SYSCTL_DC1_ADCSPD_M 0x00000F00 ///< Max ADC Speed +#define SYSCTL_DC1_ADCSPD_125K 0x00000000 ///< 125Ksps ADC +#define SYSCTL_DC1_ADCSPD_250K 0x00000100 ///< 250K samples/second +#define SYSCTL_DC1_ADCSPD_500K 0x00000200 ///< 500K samples/second +#define SYSCTL_DC1_ADCSPD_1M 0x00000300 ///< 1M samples/second +#define SYSCTL_DC1_ADC1SPD_M 0x00000C00 ///< Max ADC1 Speed +#define SYSCTL_DC1_ADC1SPD_1M 0x00000C00 ///< 1M samples/second +#define SYSCTL_DC1_ADC0SPD_M 0x00000300 ///< Max ADC0 Speed +#define SYSCTL_DC1_ADC0SPD_1M 0x00000300 ///< 1M samples/second +#define SYSCTL_DC1_MPU 0x00000080 ///< MPU Present +#define SYSCTL_DC1_HIB 0x00000040 ///< Hibernation Module Present +#define SYSCTL_DC1_TEMP 0x00000020 ///< Temp Sensor Present +#define SYSCTL_DC1_PLL 0x00000010 ///< PLL Present +#define SYSCTL_DC1_WDT0 0x00000008 ///< Watchdog Timer 0 Present +#define SYSCTL_DC1_SWO 0x00000004 ///< SWO Trace Port Present +#define SYSCTL_DC1_SWD 0x00000002 ///< SWD Present +#define SYSCTL_DC1_JTAG 0x00000001 ///< JTAG Present +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DC2 register. + */ +/*\{*/ +#define SYSCTL_DC2_EPI0 0x40000000 ///< EPI Module 0 Present +#define SYSCTL_DC2_I2S0 0x10000000 ///< I2S Module 0 Present +#define SYSCTL_DC2_COMP2 0x04000000 ///< Analog Comparator 2 Present +#define SYSCTL_DC2_COMP1 0x02000000 ///< Analog Comparator 1 Present +#define SYSCTL_DC2_COMP0 0x01000000 ///< Analog Comparator 0 Present +#define SYSCTL_DC2_TIMER3 0x00080000 ///< Timer Module 3 Present +#define SYSCTL_DC2_TIMER2 0x00040000 ///< Timer Module 2 Present +#define SYSCTL_DC2_TIMER1 0x00020000 ///< Timer Module 1 Present +#define SYSCTL_DC2_TIMER0 0x00010000 ///< Timer Module 0 Present +#define SYSCTL_DC2_I2C1 0x00004000 ///< I2C Module 1 Present +#define SYSCTL_DC2_I2C0 0x00001000 ///< I2C Module 0 Present +#define SYSCTL_DC2_QEI1 0x00000200 ///< QEI Module 1 Present +#define SYSCTL_DC2_QEI0 0x00000100 ///< QEI Module 0 Present +#define SYSCTL_DC2_SSI1 0x00000020 ///< SSI Module 1 Present +#define SYSCTL_DC2_SSI0 0x00000010 ///< SSI Module 0 Present +#define SYSCTL_DC2_UART2 0x00000004 ///< UART Module 2 Present +#define SYSCTL_DC2_UART1 0x00000002 ///< UART Module 1 Present +#define SYSCTL_DC2_UART0 0x00000001 ///< UART Module 0 Present +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DC3 register. + */ +/*\{*/ +#define SYSCTL_DC3_32KHZ 0x80000000 ///< 32KHz Input Clock Available +#define SYSCTL_DC3_CCP5 0x20000000 ///< CCP5 Pin Present +#define SYSCTL_DC3_CCP4 0x10000000 ///< CCP4 Pin Present +#define SYSCTL_DC3_CCP3 0x08000000 ///< CCP3 Pin Present +#define SYSCTL_DC3_CCP2 0x04000000 ///< CCP2 Pin Present +#define SYSCTL_DC3_CCP1 0x02000000 ///< CCP1 Pin Present +#define SYSCTL_DC3_CCP0 0x01000000 ///< CCP0 Pin Present +#define SYSCTL_DC3_ADC0AIN7 0x00800000 ///< ADC Module 0 AIN7 Pin Present +#define SYSCTL_DC3_ADC0AIN6 0x00400000 ///< ADC Module 0 AIN6 Pin Present +#define SYSCTL_DC3_ADC0AIN5 0x00200000 ///< ADC Module 0 AIN5 Pin Present +#define SYSCTL_DC3_ADC0AIN4 0x00100000 ///< ADC Module 0 AIN4 Pin Present +#define SYSCTL_DC3_ADC0AIN3 0x00080000 ///< ADC Module 0 AIN3 Pin Present +#define SYSCTL_DC3_ADC0AIN2 0x00040000 ///< ADC Module 0 AIN2 Pin Present +#define SYSCTL_DC3_ADC0AIN1 0x00020000 ///< ADC Module 0 AIN1 Pin Present +#define SYSCTL_DC3_ADC0AIN0 0x00010000 ///< ADC Module 0 AIN0 Pin Present +#define SYSCTL_DC3_PWMFAULT 0x00008000 ///< PWM Fault Pin Present +#define SYSCTL_DC3_C2O 0x00004000 ///< C2o Pin Present +#define SYSCTL_DC3_C2PLUS 0x00002000 ///< C2+ Pin Present +#define SYSCTL_DC3_C2MINUS 0x00001000 ///< C2- Pin Present +#define SYSCTL_DC3_C1O 0x00000800 ///< C1o Pin Present +#define SYSCTL_DC3_C1PLUS 0x00000400 ///< C1+ Pin Present +#define SYSCTL_DC3_C1MINUS 0x00000200 ///< C1- Pin Present +#define SYSCTL_DC3_C0O 0x00000100 ///< C0o Pin Present +#define SYSCTL_DC3_C0PLUS 0x00000080 ///< C0+ Pin Present +#define SYSCTL_DC3_C0MINUS 0x00000040 ///< C0- Pin Present +#define SYSCTL_DC3_PWM5 0x00000020 ///< PWM5 Pin Present +#define SYSCTL_DC3_PWM4 0x00000010 ///< PWM4 Pin Present +#define SYSCTL_DC3_PWM3 0x00000008 ///< PWM3 Pin Present +#define SYSCTL_DC3_PWM2 0x00000004 ///< PWM2 Pin Present +#define SYSCTL_DC3_PWM1 0x00000002 ///< PWM1 Pin Present +#define SYSCTL_DC3_PWM0 0x00000001 ///< PWM0 Pin Present +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DC4 register. + */ +/*\{*/ +#define SYSCTL_DC4_ETH 0x50000000 ///< Ethernet present +#define SYSCTL_DC4_EPHY0 0x40000000 ///< Ethernet PHY Layer 0 Present +#define SYSCTL_DC4_EMAC0 0x10000000 ///< Ethernet MAC Layer 0 Present +#define SYSCTL_DC4_E1588 0x01000000 ///< 1588 Capable +#define SYSCTL_DC4_PICAL 0x00040000 ///< PIOSC Calibrate +#define SYSCTL_DC4_CCP7 0x00008000 ///< CCP7 Pin Present +#define SYSCTL_DC4_CCP6 0x00004000 ///< CCP6 Pin Present +#define SYSCTL_DC4_UDMA 0x00002000 ///< Micro-DMA Module Present +#define SYSCTL_DC4_ROM 0x00001000 ///< Internal Code ROM Present +#define SYSCTL_DC4_GPIOJ 0x00000100 ///< GPIO Port J Present +#define SYSCTL_DC4_GPIOH 0x00000080 ///< GPIO Port H Present +#define SYSCTL_DC4_GPIOG 0x00000040 ///< GPIO Port G Present +#define SYSCTL_DC4_GPIOF 0x00000020 ///< GPIO Port F Present +#define SYSCTL_DC4_GPIOE 0x00000010 ///< GPIO Port E Present +#define SYSCTL_DC4_GPIOD 0x00000008 ///< GPIO Port D Present +#define SYSCTL_DC4_GPIOC 0x00000004 ///< GPIO Port C Present +#define SYSCTL_DC4_GPIOB 0x00000002 ///< GPIO Port B Present +#define SYSCTL_DC4_GPIOA 0x00000001 ///< GPIO Port A Present +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DC5 register. + */ +/*\{*/ +#define SYSCTL_DC5_PWMFAULT3 0x08000000 ///< PWM Fault 3 Pin Present +#define SYSCTL_DC5_PWMFAULT2 0x04000000 ///< PWM Fault 2 Pin Present +#define SYSCTL_DC5_PWMFAULT1 0x02000000 ///< PWM Fault 1 Pin Present +#define SYSCTL_DC5_PWMFAULT0 0x01000000 ///< PWM Fault 0 Pin Present +#define SYSCTL_DC5_PWMEFLT 0x00200000 ///< PWM Extended Fault Active +#define SYSCTL_DC5_PWMESYNC 0x00100000 ///< PWM Extended SYNC Active +#define SYSCTL_DC5_PWM7 0x00000080 ///< PWM7 Pin Present +#define SYSCTL_DC5_PWM6 0x00000040 ///< PWM6 Pin Present +#define SYSCTL_DC5_PWM5 0x00000020 ///< PWM5 Pin Present +#define SYSCTL_DC5_PWM4 0x00000010 ///< PWM4 Pin Present +#define SYSCTL_DC5_PWM3 0x00000008 ///< PWM3 Pin Present +#define SYSCTL_DC5_PWM2 0x00000004 ///< PWM2 Pin Present +#define SYSCTL_DC5_PWM1 0x00000002 ///< PWM1 Pin Present +#define SYSCTL_DC5_PWM0 0x00000001 ///< PWM0 Pin Present +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DC6 register. + */ +/*\{*/ +#define SYSCTL_DC6_USB0PHY 0x00000010 ///< USB Module 0 PHY Present +#define SYSCTL_DC6_USB0_M 0x00000003 ///< USB Module 0 Present +#define SYSCTL_DC6_USB0_DEV 0x00000001 ///< USB0 is Device Only +#define SYSCTL_DC6_USB0_HOSTDEV 0x00000002 ///< USB is Device or Host +#define SYSCTL_DC6_USB0_OTG 0x00000003 ///< USB0 is OTG +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DC7 register. + */ +/*\{*/ +#define SYSCTL_DC7_DMACH30 0x40000000 ///< SW +#define SYSCTL_DC7_DMACH29 0x20000000 ///< I2S0_TX / CAN1_TX +#define SYSCTL_DC7_DMACH28 0x10000000 ///< I2S0_RX / CAN1_RX +#define SYSCTL_DC7_DMACH27 0x08000000 ///< CAN1_TX / ADC1_SS3 +#define SYSCTL_DC7_DMACH26 0x04000000 ///< CAN1_RX / ADC1_SS2 +#define SYSCTL_DC7_DMACH25 0x02000000 ///< SSI1_TX / ADC1_SS1 +#define SYSCTL_DC7_SSI1_TX 0x02000000 ///< SSI1 TX on uDMA Ch25 +#define SYSCTL_DC7_SSI1_RX 0x01000000 ///< SSI1 RX on uDMA Ch24 +#define SYSCTL_DC7_DMACH24 0x01000000 ///< SSI1_RX / ADC1_SS0 +#define SYSCTL_DC7_UART1_TX 0x00800000 ///< UART1 TX on uDMA Ch23 +#define SYSCTL_DC7_DMACH23 0x00800000 ///< UART1_TX / CAN2_TX +#define SYSCTL_DC7_DMACH22 0x00400000 ///< UART1_RX / CAN2_RX +#define SYSCTL_DC7_UART1_RX 0x00400000 ///< UART1 RX on uDMA Ch22 +#define SYSCTL_DC7_DMACH21 0x00200000 ///< Timer1B / EPI0_WFIFO +#define SYSCTL_DC7_DMACH20 0x00100000 ///< Timer1A / EPI0_NBRFIFO +#define SYSCTL_DC7_DMACH19 0x00080000 ///< Timer0B / Timer1B +#define SYSCTL_DC7_DMACH18 0x00040000 ///< Timer0A / Timer1A +#define SYSCTL_DC7_DMACH17 0x00020000 ///< ADC0_SS3 +#define SYSCTL_DC7_DMACH16 0x00010000 ///< ADC0_SS2 +#define SYSCTL_DC7_DMACH15 0x00008000 ///< ADC0_SS1 / Timer2B +#define SYSCTL_DC7_DMACH14 0x00004000 ///< ADC0_SS0 / Timer2A +#define SYSCTL_DC7_DMACH13 0x00002000 ///< CAN0_TX / UART2_TX +#define SYSCTL_DC7_DMACH12 0x00001000 ///< CAN0_RX / UART2_RX +#define SYSCTL_DC7_SSI0_TX 0x00000800 ///< SSI0 TX on uDMA Ch11 +#define SYSCTL_DC7_DMACH11 0x00000800 ///< SSI0_TX / SSI1_TX +#define SYSCTL_DC7_SSI0_RX 0x00000400 ///< SSI0 RX on uDMA Ch10 +#define SYSCTL_DC7_DMACH10 0x00000400 ///< SSI0_RX / SSI1_RX +#define SYSCTL_DC7_UART0_TX 0x00000200 ///< UART0 TX on uDMA Ch9 +#define SYSCTL_DC7_DMACH9 0x00000200 ///< UART0_TX / UART1_TX +#define SYSCTL_DC7_DMACH8 0x00000100 ///< UART0_RX / UART1_RX +#define SYSCTL_DC7_UART0_RX 0x00000100 ///< UART0 RX on uDMA Ch8 +#define SYSCTL_DC7_DMACH7 0x00000080 ///< ETH_TX / Timer2B +#define SYSCTL_DC7_DMACH6 0x00000040 ///< ETH_RX / Timer2A +#define SYSCTL_DC7_DMACH5 0x00000020 ///< USB_EP3_TX / Timer2B +#define SYSCTL_DC7_USB_EP3_TX 0x00000020 ///< USB EP3 TX on uDMA Ch5 +#define SYSCTL_DC7_USB_EP3_RX 0x00000010 ///< USB EP3 RX on uDMA Ch4 +#define SYSCTL_DC7_DMACH4 0x00000010 ///< USB_EP3_RX / Timer2A +#define SYSCTL_DC7_USB_EP2_TX 0x00000008 ///< USB EP2 TX on uDMA Ch3 +#define SYSCTL_DC7_DMACH3 0x00000008 ///< USB_EP2_TX / Timer3B +#define SYSCTL_DC7_USB_EP2_RX 0x00000004 ///< USB EP2 RX on uDMA Ch2 +#define SYSCTL_DC7_DMACH2 0x00000004 ///< USB_EP2_RX / Timer3A +#define SYSCTL_DC7_USB_EP1_TX 0x00000002 ///< USB EP1 TX on uDMA Ch1 +#define SYSCTL_DC7_DMACH1 0x00000002 ///< USB_EP1_TX / UART2_TX +#define SYSCTL_DC7_DMACH0 0x00000001 ///< USB_EP1_RX / UART2_RX +#define SYSCTL_DC7_USB_EP1_RX 0x00000001 ///< USB EP1 RX on uDMA Ch0 +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DC8 register. + */ +/*\{*/ +#define SYSCTL_DC8_ADC1AIN15 0x80000000 ///< ADC Module 1 AIN15 Pin Present +#define SYSCTL_DC8_ADC1AIN14 0x40000000 ///< ADC Module 1 AIN14 Pin Present +#define SYSCTL_DC8_ADC1AIN13 0x20000000 ///< ADC Module 1 AIN13 Pin Present +#define SYSCTL_DC8_ADC1AIN12 0x10000000 ///< ADC Module 1 AIN12 Pin Present +#define SYSCTL_DC8_ADC1AIN11 0x08000000 ///< ADC Module 1 AIN11 Pin Present +#define SYSCTL_DC8_ADC1AIN10 0x04000000 ///< ADC Module 1 AIN10 Pin Present +#define SYSCTL_DC8_ADC1AIN9 0x02000000 ///< ADC Module 1 AIN9 Pin Present +#define SYSCTL_DC8_ADC1AIN8 0x01000000 ///< ADC Module 1 AIN8 Pin Present +#define SYSCTL_DC8_ADC1AIN7 0x00800000 ///< ADC Module 1 AIN7 Pin Present +#define SYSCTL_DC8_ADC1AIN6 0x00400000 ///< ADC Module 1 AIN6 Pin Present +#define SYSCTL_DC8_ADC1AIN5 0x00200000 ///< ADC Module 1 AIN5 Pin Present +#define SYSCTL_DC8_ADC1AIN4 0x00100000 ///< ADC Module 1 AIN4 Pin Present +#define SYSCTL_DC8_ADC1AIN3 0x00080000 ///< ADC Module 1 AIN3 Pin Present +#define SYSCTL_DC8_ADC1AIN2 0x00040000 ///< ADC Module 1 AIN2 Pin Present +#define SYSCTL_DC8_ADC1AIN1 0x00020000 ///< ADC Module 1 AIN1 Pin Present +#define SYSCTL_DC8_ADC1AIN0 0x00010000 ///< ADC Module 1 AIN0 Pin Present +#define SYSCTL_DC8_ADC0AIN15 0x00008000 ///< ADC Module 0 AIN15 Pin Present +#define SYSCTL_DC8_ADC0AIN14 0x00004000 ///< ADC Module 0 AIN14 Pin Present +#define SYSCTL_DC8_ADC0AIN13 0x00002000 ///< ADC Module 0 AIN13 Pin Present +#define SYSCTL_DC8_ADC0AIN12 0x00001000 ///< ADC Module 0 AIN12 Pin Present +#define SYSCTL_DC8_ADC0AIN11 0x00000800 ///< ADC Module 0 AIN11 Pin Present +#define SYSCTL_DC8_ADC0AIN10 0x00000400 ///< ADC Module 0 AIN10 Pin Present +#define SYSCTL_DC8_ADC0AIN9 0x00000200 ///< ADC Module 0 AIN9 Pin Present +#define SYSCTL_DC8_ADC0AIN8 0x00000100 ///< ADC Module 0 AIN8 Pin Present +#define SYSCTL_DC8_ADC0AIN7 0x00000080 ///< ADC Module 0 AIN7 Pin Present +#define SYSCTL_DC8_ADC0AIN6 0x00000040 ///< ADC Module 0 AIN6 Pin Present +#define SYSCTL_DC8_ADC0AIN5 0x00000020 ///< ADC Module 0 AIN5 Pin Present +#define SYSCTL_DC8_ADC0AIN4 0x00000010 ///< ADC Module 0 AIN4 Pin Present +#define SYSCTL_DC8_ADC0AIN3 0x00000008 ///< ADC Module 0 AIN3 Pin Present +#define SYSCTL_DC8_ADC0AIN2 0x00000004 ///< ADC Module 0 AIN2 Pin Present +#define SYSCTL_DC8_ADC0AIN1 0x00000002 ///< ADC Module 0 AIN1 Pin Present +#define SYSCTL_DC8_ADC0AIN0 0x00000001 ///< ADC Module 0 AIN0 Pin Present +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_PBORCTL register. + */ +/*\{*/ +#define SYSCTL_PBORCTL_BORTIM_M 0x0000FFFC ///< BOR Time Delay +#define SYSCTL_PBORCTL_BORIOR 0x00000002 ///< BOR Interrupt or Reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 ///< BOR Wait and Check for Noise +#define SYSCTL_PBORCTL_BORTIM_S 2 +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_LDOPCTL register. + */ +/*\{*/ +#define SYSCTL_LDOPCTL_M 0x0000003F ///< LDO Output Voltage +#define SYSCTL_LDOPCTL_2_50V 0x00000000 ///< 2.50 +#define SYSCTL_LDOPCTL_2_45V 0x00000001 ///< 2.45 +#define SYSCTL_LDOPCTL_2_40V 0x00000002 ///< 2.40 +#define SYSCTL_LDOPCTL_2_35V 0x00000003 ///< 2.35 +#define SYSCTL_LDOPCTL_2_30V 0x00000004 ///< 2.30 +#define SYSCTL_LDOPCTL_2_25V 0x00000005 ///< 2.25 +#define SYSCTL_LDOPCTL_2_75V 0x0000001B ///< 2.75 +#define SYSCTL_LDOPCTL_2_70V 0x0000001C ///< 2.70 +#define SYSCTL_LDOPCTL_2_65V 0x0000001D ///< 2.65 +#define SYSCTL_LDOPCTL_2_60V 0x0000001E ///< 2.60 +#define SYSCTL_LDOPCTL_2_55V 0x0000001F ///< 2.55 +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_SRCR0 register. + */ +/*\{*/ +#define SYSCTL_SRCR0_WDT1 0x10000000 ///< WDT1 Reset Control +#define SYSCTL_SRCR0_CAN2 0x04000000 ///< CAN2 Reset Control +#define SYSCTL_SRCR0_CAN1 0x02000000 ///< CAN1 Reset Control +#define SYSCTL_SRCR0_CAN0 0x01000000 ///< CAN0 Reset Control +#define SYSCTL_SRCR0_PWM 0x00100000 ///< PWM Reset Control +#define SYSCTL_SRCR0_ADC1 0x00020000 ///< ADC1 Reset Control +#define SYSCTL_SRCR0_ADC0 0x00010000 ///< ADC0 Reset Control +#define SYSCTL_SRCR0_HIB 0x00000040 ///< HIB Reset Control +#define SYSCTL_SRCR0_WDT0 0x00000008 ///< WDT0 Reset Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_SRCR1 register. + */ +/*\{*/ +#define SYSCTL_SRCR1_EPI0 0x40000000 ///< EPI0 Reset Control +#define SYSCTL_SRCR1_I2S0 0x10000000 ///< I2S0 Reset Control +#define SYSCTL_SRCR1_COMP2 0x04000000 ///< Analog Comp 2 Reset Control +#define SYSCTL_SRCR1_COMP1 0x02000000 ///< Analog Comp 1 Reset Control +#define SYSCTL_SRCR1_COMP0 0x01000000 ///< Analog Comp 0 Reset Control +#define SYSCTL_SRCR1_TIMER3 0x00080000 ///< Timer 3 Reset Control +#define SYSCTL_SRCR1_TIMER2 0x00040000 ///< Timer 2 Reset Control +#define SYSCTL_SRCR1_TIMER1 0x00020000 ///< Timer 1 Reset Control +#define SYSCTL_SRCR1_TIMER0 0x00010000 ///< Timer 0 Reset Control +#define SYSCTL_SRCR1_I2C1 0x00004000 ///< I2C1 Reset Control +#define SYSCTL_SRCR1_I2C0 0x00001000 ///< I2C0 Reset Control +#define SYSCTL_SRCR1_QEI1 0x00000200 ///< QEI1 Reset Control +#define SYSCTL_SRCR1_QEI0 0x00000100 ///< QEI0 Reset Control +#define SYSCTL_SRCR1_SSI1 0x00000020 ///< SSI1 Reset Control +#define SYSCTL_SRCR1_SSI0 0x00000010 ///< SSI0 Reset Control +#define SYSCTL_SRCR1_UART2 0x00000004 ///< UART2 Reset Control +#define SYSCTL_SRCR1_UART1 0x00000002 ///< UART1 Reset Control +#define SYSCTL_SRCR1_UART0 0x00000001 ///< UART0 Reset Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_SRCR2 register. + */ +/*\{*/ +#define SYSCTL_SRCR2_EPHY0 0x40000000 ///< PHY0 Reset Control +#define SYSCTL_SRCR2_EMAC0 0x10000000 ///< MAC0 Reset Control +#define SYSCTL_SRCR2_USB0 0x00010000 ///< USB0 Reset Control +#define SYSCTL_SRCR2_UDMA 0x00002000 ///< Micro-DMA Reset Control +#define SYSCTL_SRCR2_GPIOJ 0x00000100 ///< Port J Reset Control +#define SYSCTL_SRCR2_GPIOH 0x00000080 ///< Port H Reset Control +#define SYSCTL_SRCR2_GPIOG 0x00000040 ///< Port G Reset Control +#define SYSCTL_SRCR2_GPIOF 0x00000020 ///< Port F Reset Control +#define SYSCTL_SRCR2_GPIOE 0x00000010 ///< Port E Reset Control +#define SYSCTL_SRCR2_GPIOD 0x00000008 ///< Port D Reset Control +#define SYSCTL_SRCR2_GPIOC 0x00000004 ///< Port C Reset Control +#define SYSCTL_SRCR2_GPIOB 0x00000002 ///< Port B Reset Control +#define SYSCTL_SRCR2_GPIOA 0x00000001 ///< Port A Reset Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_RIS register. + */ +/*\{*/ +#define SYSCTL_RIS_MOSCPUPRIS 0x00000100 ///< MOSC Power Up Raw Interrupt + ///< Status +#define SYSCTL_RIS_USBPLLLRIS 0x00000080 ///< USB PLL Lock Raw Interrupt + ///< Status +#define SYSCTL_RIS_PLLLRIS 0x00000040 ///< PLL Lock Raw Interrupt Status +#define SYSCTL_RIS_CLRIS 0x00000020 ///< Current Limit Raw Interrupt + ///< Status +#define SYSCTL_RIS_IOFRIS 0x00000010 ///< Internal Oscillator Fault Raw + ///< Interrupt Status +#define SYSCTL_RIS_MOFRIS 0x00000008 ///< Main Oscillator Fault Raw + ///< Interrupt Status +#define SYSCTL_RIS_LDORIS 0x00000004 ///< LDO Power Unregulated Raw + ///< Interrupt Status +#define SYSCTL_RIS_BORRIS 0x00000002 ///< Brown-Out Reset Raw Interrupt + ///< Status +#define SYSCTL_RIS_PLLFRIS 0x00000001 ///< PLL Fault Raw Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_IMC register. + */ +/*\{*/ +#define SYSCTL_IMC_MOSCPUPIM 0x00000100 ///< MOSC Power Up Interrupt Mask +#define SYSCTL_IMC_USBPLLLIM 0x00000080 ///< USB PLL Lock Interrupt Mask +#define SYSCTL_IMC_PLLLIM 0x00000040 ///< PLL Lock Interrupt Mask +#define SYSCTL_IMC_CLIM 0x00000020 ///< Current Limit Interrupt Mask +#define SYSCTL_IMC_IOFIM 0x00000010 ///< Internal Oscillator Fault + ///< Interrupt Mask +#define SYSCTL_IMC_MOFIM 0x00000008 ///< Main Oscillator Fault Interrupt + ///< Mask +#define SYSCTL_IMC_LDOIM 0x00000004 ///< LDO Power Unregulated Interrupt + ///< Mask +#define SYSCTL_IMC_BORIM 0x00000002 ///< Brown-Out Reset Interrupt Mask +#define SYSCTL_IMC_PLLFIM 0x00000001 ///< PLL Fault Interrupt Mask +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_MISC register. + */ +/*\{*/ +#define SYSCTL_MISC_MOSCPUPMIS 0x00000100 ///< MOSC Power Up Masked Interrupt + ///< Status +#define SYSCTL_MISC_USBPLLLMIS 0x00000080 ///< USB PLL Lock Masked Interrupt + ///< Status +#define SYSCTL_MISC_PLLLMIS 0x00000040 ///< PLL Lock Masked Interrupt Status +#define SYSCTL_MISC_CLMIS 0x00000020 ///< Current Limit Masked Interrupt + ///< Status +#define SYSCTL_MISC_IOFMIS 0x00000010 ///< Internal Oscillator Fault Masked + ///< Interrupt Status +#define SYSCTL_MISC_MOFMIS 0x00000008 ///< Main Oscillator Fault Masked + ///< Interrupt Status +#define SYSCTL_MISC_LDOMIS 0x00000004 ///< LDO Power Unregulated Masked + ///< Interrupt Status +#define SYSCTL_MISC_BORMIS 0x00000002 ///< BOR Masked Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_RESC register. + */ +/*\{*/ +#define SYSCTL_RESC_MOSCFAIL 0x00010000 ///< MOSC Failure Reset +#define SYSCTL_RESC_LDO 0x00000020 ///< LDO Reset +#define SYSCTL_RESC_WDT1 0x00000020 ///< Watchdog Timer 1 Reset +#define SYSCTL_RESC_SW 0x00000010 ///< Software Reset +#define SYSCTL_RESC_WDT0 0x00000008 ///< Watchdog Timer 0 Reset +#define SYSCTL_RESC_BOR 0x00000004 ///< Brown-Out Reset +#define SYSCTL_RESC_POR 0x00000002 ///< Power-On Reset +#define SYSCTL_RESC_EXT 0x00000001 ///< External Reset +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_RCC register. + */ +/*\{*/ +#define SYSCTL_RCC_ACG 0x08000000 ///< Auto Clock Gating +#define SYSCTL_RCC_SYSDIV_M 0x07800000 ///< System Clock Divisor +#define SYSCTL_RCC_SYSDIV_2 0x00800000 ///< System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 ///< System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 ///< System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 ///< System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 ///< System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 ///< System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 ///< System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 ///< System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 ///< System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 ///< System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 ///< System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 ///< System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 ///< System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 ///< System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 ///< System clock /16 +#define SYSCTL_RCC_USESYSDIV 0x00400000 ///< Enable System Clock Divider +#define SYSCTL_RCC_USEPWMDIV 0x00100000 ///< Enable PWM Clock Divisor +#define SYSCTL_RCC_PWMDIV_M 0x000E0000 ///< PWM Unit Clock Divisor +#define SYSCTL_RCC_PWMDIV_2 0x00000000 ///< PWM clock /2 +#define SYSCTL_RCC_PWMDIV_4 0x00020000 ///< PWM clock /4 +#define SYSCTL_RCC_PWMDIV_8 0x00040000 ///< PWM clock /8 +#define SYSCTL_RCC_PWMDIV_16 0x00060000 ///< PWM clock /16 +#define SYSCTL_RCC_PWMDIV_32 0x00080000 ///< PWM clock /32 +#define SYSCTL_RCC_PWMDIV_64 0x000A0000 ///< PWM clock /64 +#define SYSCTL_RCC_PWRDN 0x00002000 ///< PLL Power Down +#define SYSCTL_RCC_OEN 0x00001000 ///< PLL Output Enable +#define SYSCTL_RCC_BYPASS 0x00000800 ///< PLL Bypass +#define SYSCTL_RCC_XTAL_M 0x000007C0 ///< Crystal Value +#define SYSCTL_RCC_XTAL_1MHZ 0x00000000 ///< 1 MHz +#define SYSCTL_RCC_XTAL_1_84MHZ 0x00000040 ///< 1.8432 MHz +#define SYSCTL_RCC_XTAL_2MHZ 0x00000080 ///< 2 MHz +#define SYSCTL_RCC_XTAL_2_45MHZ 0x000000C0 ///< 2.4576 MHz +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 ///< 3.579545 MHz +#define SYSCTL_RCC_XTAL_3_68MHZ 0x00000140 ///< 3.6864 MHz +#define SYSCTL_RCC_XTAL_4MHZ 0x00000180 ///< 4 MHz +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 ///< 4.096 MHz +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 ///< 4.9152 MHz +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 ///< 5 MHz +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 ///< 5.12 MHz +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 ///< 6 MHz +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 ///< 6.144 MHz +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 ///< 7.3728 MHz +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 ///< 8 MHz +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 ///< 8.192 MHz +#define SYSCTL_RCC_XTAL_10MHZ 0x00000400 ///< 10 MHz +#define SYSCTL_RCC_XTAL_12MHZ 0x00000440 ///< 12 MHz +#define SYSCTL_RCC_XTAL_12_2MHZ 0x00000480 ///< 12.288 MHz +#define SYSCTL_RCC_XTAL_13_5MHZ 0x000004C0 ///< 13.56 MHz +#define SYSCTL_RCC_XTAL_14_3MHZ 0x00000500 ///< 14.31818 MHz +#define SYSCTL_RCC_XTAL_16MHZ 0x00000540 ///< 16 MHz +#define SYSCTL_RCC_XTAL_16_3MHZ 0x00000580 ///< 16.384 MHz +#define SYSCTL_RCC_PLLVER 0x00000400 ///< PLL Verification +#define SYSCTL_RCC_OSCSRC_M 0x00000030 ///< Oscillator Source +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 ///< MOSC +#define SYSCTL_RCC_OSCSRC_INT 0x00000010 ///< IOSC +#define SYSCTL_RCC_OSCSRC_INT4 0x00000020 ///< IOSC/4 +#define SYSCTL_RCC_OSCSRC_30 0x00000030 ///< 30 kHz +#define SYSCTL_RCC_IOSCVER 0x00000008 ///< Internal Oscillator Verification + ///< Timer +#define SYSCTL_RCC_MOSCVER 0x00000004 ///< Main Oscillator Verification + ///< Timer +#define SYSCTL_RCC_IOSCDIS 0x00000002 ///< Internal Oscillator Disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 ///< Main Oscillator Disable +#define SYSCTL_RCC_SYSDIV_S 23 +#define SYSCTL_RCC_PWMDIV_S 17 ///< Shift to the PWMDIV field +#define SYSCTL_RCC_XTAL_S 6 ///< Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_S 4 ///< Shift to the OSCSRC field +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_PLLCFG register. + */ +/*\{*/ +#define SYSCTL_PLLCFG_OD_M 0x0000C000 ///< PLL OD Value +#define SYSCTL_PLLCFG_OD_1 0x00000000 ///< Divide by 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 ///< Divide by 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 ///< Divide by 4 +#define SYSCTL_PLLCFG_F_M 0x00003FE0 ///< PLL F Value +#define SYSCTL_PLLCFG_R_M 0x0000001F ///< PLL R Value +#define SYSCTL_PLLCFG_F_S 5 +#define SYSCTL_PLLCFG_R_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_GPIOHSCTL + * register. + */ +/*\{*/ +#define SYSCTL_GPIOHSCTL_PORTH 0x00000080 ///< Port H High-Speed +#define SYSCTL_GPIOHSCTL_PORTG 0x00000040 ///< Port G High-Speed +#define SYSCTL_GPIOHSCTL_PORTF 0x00000020 ///< Port F High-Speed +#define SYSCTL_GPIOHSCTL_PORTE 0x00000010 ///< Port E High-Speed +#define SYSCTL_GPIOHSCTL_PORTD 0x00000008 ///< Port D High-Speed +#define SYSCTL_GPIOHSCTL_PORTC 0x00000004 ///< Port C High-Speed +#define SYSCTL_GPIOHSCTL_PORTB 0x00000002 ///< Port B High-Speed +#define SYSCTL_GPIOHSCTL_PORTA 0x00000001 ///< Port A High-Speed +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_GPIOHBCTL + * register. + */ +/*\{*/ +#define SYSCTL_GPIOHBCTL_PORTJ 0x00000100 ///< Port J Advanced High-Performance + ///< Bus +#define SYSCTL_GPIOHBCTL_PORTH 0x00000080 ///< Port H Advanced High-Performance + ///< Bus +#define SYSCTL_GPIOHBCTL_PORTG 0x00000040 ///< Port G Advanced High-Performance + ///< Bus +#define SYSCTL_GPIOHBCTL_PORTF 0x00000020 ///< Port F Advanced High-Performance + ///< Bus +#define SYSCTL_GPIOHBCTL_PORTE 0x00000010 ///< Port E Advanced High-Performance + ///< Bus +#define SYSCTL_GPIOHBCTL_PORTD 0x00000008 ///< Port D Advanced High-Performance + ///< Bus +#define SYSCTL_GPIOHBCTL_PORTC 0x00000004 ///< Port C Advanced High-Performance + ///< Bus +#define SYSCTL_GPIOHBCTL_PORTB 0x00000002 ///< Port B Advanced High-Performance + ///< Bus +#define SYSCTL_GPIOHBCTL_PORTA 0x00000001 ///< Port A Advanced High-Performance + ///< Bus +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_RCC2 register. + */ +/*\{*/ +#define SYSCTL_RCC2_USERCC2 0x80000000 ///< Use RCC2 +#define SYSCTL_RCC2_DIV400 0x40000000 ///< Divide PLL as 400 MHz vs. 200 + ///< MHz +#define SYSCTL_RCC2_SYSDIV2_M 0x1F800000 ///< System Clock Divisor 2 +#define SYSCTL_RCC2_SYSDIV2_2 0x00800000 ///< System clock /2 +#define SYSCTL_RCC2_SYSDIV2_3 0x01000000 ///< System clock /3 +#define SYSCTL_RCC2_SYSDIV2_4 0x01800000 ///< System clock /4 +#define SYSCTL_RCC2_SYSDIV2_5 0x02000000 ///< System clock /5 +#define SYSCTL_RCC2_SYSDIV2_6 0x02800000 ///< System clock /6 +#define SYSCTL_RCC2_SYSDIV2_7 0x03000000 ///< System clock /7 +#define SYSCTL_RCC2_SYSDIV2_8 0x03800000 ///< System clock /8 +#define SYSCTL_RCC2_SYSDIV2_9 0x04000000 ///< System clock /9 +#define SYSCTL_RCC2_SYSDIV2_10 0x04800000 ///< System clock /10 +#define SYSCTL_RCC2_SYSDIV2_11 0x05000000 ///< System clock /11 +#define SYSCTL_RCC2_SYSDIV2_12 0x05800000 ///< System clock /12 +#define SYSCTL_RCC2_SYSDIV2_13 0x06000000 ///< System clock /13 +#define SYSCTL_RCC2_SYSDIV2_14 0x06800000 ///< System clock /14 +#define SYSCTL_RCC2_SYSDIV2_15 0x07000000 ///< System clock /15 +#define SYSCTL_RCC2_SYSDIV2_16 0x07800000 ///< System clock /16 +#define SYSCTL_RCC2_SYSDIV2_17 0x08000000 ///< System clock /17 +#define SYSCTL_RCC2_SYSDIV2_18 0x08800000 ///< System clock /18 +#define SYSCTL_RCC2_SYSDIV2_19 0x09000000 ///< System clock /19 +#define SYSCTL_RCC2_SYSDIV2_20 0x09800000 ///< System clock /20 +#define SYSCTL_RCC2_SYSDIV2_21 0x0A000000 ///< System clock /21 +#define SYSCTL_RCC2_SYSDIV2_22 0x0A800000 ///< System clock /22 +#define SYSCTL_RCC2_SYSDIV2_23 0x0B000000 ///< System clock /23 +#define SYSCTL_RCC2_SYSDIV2_24 0x0B800000 ///< System clock /24 +#define SYSCTL_RCC2_SYSDIV2_25 0x0C000000 ///< System clock /25 +#define SYSCTL_RCC2_SYSDIV2_26 0x0C800000 ///< System clock /26 +#define SYSCTL_RCC2_SYSDIV2_27 0x0D000000 ///< System clock /27 +#define SYSCTL_RCC2_SYSDIV2_28 0x0D800000 ///< System clock /28 +#define SYSCTL_RCC2_SYSDIV2_29 0x0E000000 ///< System clock /29 +#define SYSCTL_RCC2_SYSDIV2_30 0x0E800000 ///< System clock /30 +#define SYSCTL_RCC2_SYSDIV2_31 0x0F000000 ///< System clock /31 +#define SYSCTL_RCC2_SYSDIV2_32 0x0F800000 ///< System clock /32 +#define SYSCTL_RCC2_SYSDIV2_33 0x10000000 ///< System clock /33 +#define SYSCTL_RCC2_SYSDIV2_34 0x10800000 ///< System clock /34 +#define SYSCTL_RCC2_SYSDIV2_35 0x11000000 ///< System clock /35 +#define SYSCTL_RCC2_SYSDIV2_36 0x11800000 ///< System clock /36 +#define SYSCTL_RCC2_SYSDIV2_37 0x12000000 ///< System clock /37 +#define SYSCTL_RCC2_SYSDIV2_38 0x12800000 ///< System clock /38 +#define SYSCTL_RCC2_SYSDIV2_39 0x13000000 ///< System clock /39 +#define SYSCTL_RCC2_SYSDIV2_40 0x13800000 ///< System clock /40 +#define SYSCTL_RCC2_SYSDIV2_41 0x14000000 ///< System clock /41 +#define SYSCTL_RCC2_SYSDIV2_42 0x14800000 ///< System clock /42 +#define SYSCTL_RCC2_SYSDIV2_43 0x15000000 ///< System clock /43 +#define SYSCTL_RCC2_SYSDIV2_44 0x15800000 ///< System clock /44 +#define SYSCTL_RCC2_SYSDIV2_45 0x16000000 ///< System clock /45 +#define SYSCTL_RCC2_SYSDIV2_46 0x16800000 ///< System clock /46 +#define SYSCTL_RCC2_SYSDIV2_47 0x17000000 ///< System clock /47 +#define SYSCTL_RCC2_SYSDIV2_48 0x17800000 ///< System clock /48 +#define SYSCTL_RCC2_SYSDIV2_49 0x18000000 ///< System clock /49 +#define SYSCTL_RCC2_SYSDIV2_50 0x18800000 ///< System clock /50 +#define SYSCTL_RCC2_SYSDIV2_51 0x19000000 ///< System clock /51 +#define SYSCTL_RCC2_SYSDIV2_52 0x19800000 ///< System clock /52 +#define SYSCTL_RCC2_SYSDIV2_53 0x1A000000 ///< System clock /53 +#define SYSCTL_RCC2_SYSDIV2_54 0x1A800000 ///< System clock /54 +#define SYSCTL_RCC2_SYSDIV2_55 0x1B000000 ///< System clock /55 +#define SYSCTL_RCC2_SYSDIV2_56 0x1B800000 ///< System clock /56 +#define SYSCTL_RCC2_SYSDIV2_57 0x1C000000 ///< System clock /57 +#define SYSCTL_RCC2_SYSDIV2_58 0x1C800000 ///< System clock /58 +#define SYSCTL_RCC2_SYSDIV2_59 0x1D000000 ///< System clock /59 +#define SYSCTL_RCC2_SYSDIV2_60 0x1D800000 ///< System clock /60 +#define SYSCTL_RCC2_SYSDIV2_61 0x1E000000 ///< System clock /61 +#define SYSCTL_RCC2_SYSDIV2_62 0x1E800000 ///< System clock /62 +#define SYSCTL_RCC2_SYSDIV2_63 0x1F000000 ///< System clock /63 +#define SYSCTL_RCC2_SYSDIV2_64 0x1F800000 ///< System clock /64 +#define SYSCTL_RCC2_SYSDIV2LSB 0x00400000 ///< Additional LSB for SYSDIV2 +#define SYSCTL_RCC2_USBPWRDN 0x00004000 ///< Power-Down USB PLL +#define SYSCTL_RCC2_PWRDN2 0x00002000 ///< Power-Down PLL 2 +#define SYSCTL_RCC2_BYPASS2 0x00000800 ///< PLL Bypass 2 +#define SYSCTL_RCC2_OSCSRC2_M 0x00000070 ///< Oscillator Source 2 +#define SYSCTL_RCC2_OSCSRC2_MO 0x00000000 ///< MOSC +#define SYSCTL_RCC2_OSCSRC2_IO 0x00000010 ///< PIOSC +#define SYSCTL_RCC2_OSCSRC2_IO4 0x00000020 ///< PIOSC/4 +#define SYSCTL_RCC2_OSCSRC2_30 0x00000030 ///< 30 kHz +#define SYSCTL_RCC2_OSCSRC2_419 0x00000060 ///< 4.194304 MHz +#define SYSCTL_RCC2_OSCSRC2_32 0x00000070 ///< 32.768 kHz +#define SYSCTL_RCC2_SYSDIV2_S 23 +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_MOSCCTL register. + */ +/*\{*/ +#define SYSCTL_MOSCCTL_CVAL 0x00000001 ///< Clock Validation for MOSC +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_RCGC0 register. + */ +/*\{*/ +#define SYSCTL_RCGC0_WDT1 0x10000000 ///< WDT1 Clock Gating Control +#define SYSCTL_RCGC0_CAN2 0x04000000 ///< CAN2 Clock Gating Control +#define SYSCTL_RCGC0_CAN1 0x02000000 ///< CAN1 Clock Gating Control +#define SYSCTL_RCGC0_CAN0 0x01000000 ///< CAN0 Clock Gating Control +#define SYSCTL_RCGC0_PWM 0x00100000 ///< PWM Clock Gating Control +#define SYSCTL_RCGC0_ADC1 0x00020000 ///< ADC1 Clock Gating Control +#define SYSCTL_RCGC0_ADC0 0x00010000 ///< ADC0 Clock Gating Control +#define SYSCTL_RCGC0_ADCSPD_M 0x00000F00 ///< ADC Sample Speed +#define SYSCTL_RCGC0_ADCSPD125K 0x00000000 ///< 125K samples/second +#define SYSCTL_RCGC0_ADCSPD250K 0x00000100 ///< 250K samples/second +#define SYSCTL_RCGC0_ADCSPD500K 0x00000200 ///< 500K samples/second +#define SYSCTL_RCGC0_ADCSPD1M 0x00000300 ///< 1M samples/second +#define SYSCTL_RCGC0_ADC1SPD_M 0x00000C00 ///< ADC1 Sample Speed +#define SYSCTL_RCGC0_ADC1SPD_125K \ + 0x00000000 ///< 125K samples/second +#define SYSCTL_RCGC0_ADC1SPD_250K \ + 0x00000400 ///< 250K samples/second +#define SYSCTL_RCGC0_ADC1SPD_500K \ + 0x00000800 ///< 500K samples/second +#define SYSCTL_RCGC0_ADC1SPD_1M 0x00000C00 ///< 1M samples/second +#define SYSCTL_RCGC0_ADC0SPD_M 0x00000300 ///< ADC0 Sample Speed +#define SYSCTL_RCGC0_ADC0SPD_125K \ + 0x00000000 ///< 125K samples/second +#define SYSCTL_RCGC0_ADC0SPD_250K \ + 0x00000100 ///< 250K samples/second +#define SYSCTL_RCGC0_ADC0SPD_500K \ + 0x00000200 ///< 500K samples/second +#define SYSCTL_RCGC0_ADC0SPD_1M 0x00000300 ///< 1M samples/second +#define SYSCTL_RCGC0_HIB 0x00000040 ///< HIB Clock Gating Control +#define SYSCTL_RCGC0_WDT0 0x00000008 ///< WDT0 Clock Gating Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_RCGC1 register. + */ +/*\{*/ +#define SYSCTL_RCGC1_EPI0 0x40000000 ///< EPI0 Clock Gating +#define SYSCTL_RCGC1_I2S0 0x10000000 ///< I2S0 Clock Gating +#define SYSCTL_RCGC1_COMP2 0x04000000 ///< Analog Comparator 2 Clock Gating +#define SYSCTL_RCGC1_COMP1 0x02000000 ///< Analog Comparator 1 Clock Gating +#define SYSCTL_RCGC1_COMP0 0x01000000 ///< Analog Comparator 0 Clock Gating +#define SYSCTL_RCGC1_TIMER3 0x00080000 ///< Timer 3 Clock Gating Control +#define SYSCTL_RCGC1_TIMER2 0x00040000 ///< Timer 2 Clock Gating Control +#define SYSCTL_RCGC1_TIMER1 0x00020000 ///< Timer 1 Clock Gating Control +#define SYSCTL_RCGC1_TIMER0 0x00010000 ///< Timer 0 Clock Gating Control +#define SYSCTL_RCGC1_I2C1 0x00004000 ///< I2C1 Clock Gating Control +#define SYSCTL_RCGC1_I2C0 0x00001000 ///< I2C0 Clock Gating Control +#define SYSCTL_RCGC1_QEI1 0x00000200 ///< QEI1 Clock Gating Control +#define SYSCTL_RCGC1_QEI0 0x00000100 ///< QEI0 Clock Gating Control +#define SYSCTL_RCGC1_SSI1 0x00000020 ///< SSI1 Clock Gating Control +#define SYSCTL_RCGC1_SSI0 0x00000010 ///< SSI0 Clock Gating Control +#define SYSCTL_RCGC1_UART2 0x00000004 ///< UART2 Clock Gating Control +#define SYSCTL_RCGC1_UART1 0x00000002 ///< UART1 Clock Gating Control +#define SYSCTL_RCGC1_UART0 0x00000001 ///< UART0 Clock Gating Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_RCGC2 register. + */ +/*\{*/ +#define SYSCTL_RCGC2_EPHY0 0x40000000 ///< PHY0 Clock Gating Control +#define SYSCTL_RCGC2_EMAC0 0x10000000 ///< MAC0 Clock Gating Control +#define SYSCTL_RCGC2_USB0 0x00010000 ///< USB0 Clock Gating Control +#define SYSCTL_RCGC2_UDMA 0x00002000 ///< Micro-DMA Clock Gating Control +#define SYSCTL_RCGC2_GPIOJ 0x00000100 ///< Port J Clock Gating Control +#define SYSCTL_RCGC2_GPIOH 0x00000080 ///< Port H Clock Gating Control +#define SYSCTL_RCGC2_GPIOG 0x00000040 ///< Port G Clock Gating Control +#define SYSCTL_RCGC2_GPIOF 0x00000020 ///< Port F Clock Gating Control +#define SYSCTL_RCGC2_GPIOE 0x00000010 ///< Port E Clock Gating Control +#define SYSCTL_RCGC2_GPIOD 0x00000008 ///< Port D Clock Gating Control +#define SYSCTL_RCGC2_GPIOC 0x00000004 ///< Port C Clock Gating Control +#define SYSCTL_RCGC2_GPIOB 0x00000002 ///< Port B Clock Gating Control +#define SYSCTL_RCGC2_GPIOA 0x00000001 ///< Port A Clock Gating Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_SCGC0 register. + */ +/*\{*/ +#define SYSCTL_SCGC0_WDT1 0x10000000 ///< WDT1 Clock Gating Control +#define SYSCTL_SCGC0_CAN2 0x04000000 ///< CAN2 Clock Gating Control +#define SYSCTL_SCGC0_CAN1 0x02000000 ///< CAN1 Clock Gating Control +#define SYSCTL_SCGC0_CAN0 0x01000000 ///< CAN0 Clock Gating Control +#define SYSCTL_SCGC0_PWM 0x00100000 ///< PWM Clock Gating Control +#define SYSCTL_SCGC0_ADC1 0x00020000 ///< ADC1 Clock Gating Control +#define SYSCTL_SCGC0_ADC0 0x00010000 ///< ADC0 Clock Gating Control +#define SYSCTL_SCGC0_ADCSPD_M 0x00000F00 ///< ADC Sample Speed +#define SYSCTL_SCGC0_ADCSPD125K 0x00000000 ///< 125K samples/second +#define SYSCTL_SCGC0_ADCSPD250K 0x00000100 ///< 250K samples/second +#define SYSCTL_SCGC0_ADCSPD500K 0x00000200 ///< 500K samples/second +#define SYSCTL_SCGC0_ADCSPD1M 0x00000300 ///< 1M samples/second +#define SYSCTL_SCGC0_ADC1SPD_M 0x00000C00 ///< ADC1 Sample Speed +#define SYSCTL_SCGC0_ADC1SPD_125K \ + 0x00000000 ///< 125K samples/second +#define SYSCTL_SCGC0_ADC1SPD_250K \ + 0x00000400 ///< 250K samples/second +#define SYSCTL_SCGC0_ADC1SPD_500K \ + 0x00000800 ///< 500K samples/second +#define SYSCTL_SCGC0_ADC1SPD_1M 0x00000C00 ///< 1M samples/second +#define SYSCTL_SCGC0_ADC0SPD_M 0x00000300 ///< ADC0 Sample Speed +#define SYSCTL_SCGC0_ADC0SPD_125K \ + 0x00000000 ///< 125K samples/second +#define SYSCTL_SCGC0_ADC0SPD_250K \ + 0x00000100 ///< 250K samples/second +#define SYSCTL_SCGC0_ADC0SPD_500K \ + 0x00000200 ///< 500K samples/second +#define SYSCTL_SCGC0_ADC0SPD_1M 0x00000300 ///< 1M samples/second +#define SYSCTL_SCGC0_HIB 0x00000040 ///< HIB Clock Gating Control +#define SYSCTL_SCGC0_WDT0 0x00000008 ///< WDT0 Clock Gating Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_SCGC1 register. + */ +/*\{*/ +#define SYSCTL_SCGC1_EPI0 0x40000000 ///< EPI0 Clock Gating +#define SYSCTL_SCGC1_I2S0 0x10000000 ///< I2S0 Clock Gating +#define SYSCTL_SCGC1_COMP2 0x04000000 ///< Analog Comparator 2 Clock Gating +#define SYSCTL_SCGC1_COMP1 0x02000000 ///< Analog Comparator 1 Clock Gating +#define SYSCTL_SCGC1_COMP0 0x01000000 ///< Analog Comparator 0 Clock Gating +#define SYSCTL_SCGC1_TIMER3 0x00080000 ///< Timer 3 Clock Gating Control +#define SYSCTL_SCGC1_TIMER2 0x00040000 ///< Timer 2 Clock Gating Control +#define SYSCTL_SCGC1_TIMER1 0x00020000 ///< Timer 1 Clock Gating Control +#define SYSCTL_SCGC1_TIMER0 0x00010000 ///< Timer 0 Clock Gating Control +#define SYSCTL_SCGC1_I2C1 0x00004000 ///< I2C1 Clock Gating Control +#define SYSCTL_SCGC1_I2C0 0x00001000 ///< I2C0 Clock Gating Control +#define SYSCTL_SCGC1_QEI1 0x00000200 ///< QEI1 Clock Gating Control +#define SYSCTL_SCGC1_QEI0 0x00000100 ///< QEI0 Clock Gating Control +#define SYSCTL_SCGC1_SSI1 0x00000020 ///< SSI1 Clock Gating Control +#define SYSCTL_SCGC1_SSI0 0x00000010 ///< SSI0 Clock Gating Control +#define SYSCTL_SCGC1_UART2 0x00000004 ///< UART2 Clock Gating Control +#define SYSCTL_SCGC1_UART1 0x00000002 ///< UART1 Clock Gating Control +#define SYSCTL_SCGC1_UART0 0x00000001 ///< UART0 Clock Gating Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_SCGC2 register. + */ +/*\{*/ +#define SYSCTL_SCGC2_EPHY0 0x40000000 ///< PHY0 Clock Gating Control +#define SYSCTL_SCGC2_EMAC0 0x10000000 ///< MAC0 Clock Gating Control +#define SYSCTL_SCGC2_USB0 0x00010000 ///< USB0 Clock Gating Control +#define SYSCTL_SCGC2_UDMA 0x00002000 ///< Micro-DMA Clock Gating Control +#define SYSCTL_SCGC2_GPIOJ 0x00000100 ///< Port J Clock Gating Control +#define SYSCTL_SCGC2_GPIOH 0x00000080 ///< Port H Clock Gating Control +#define SYSCTL_SCGC2_GPIOG 0x00000040 ///< Port G Clock Gating Control +#define SYSCTL_SCGC2_GPIOF 0x00000020 ///< Port F Clock Gating Control +#define SYSCTL_SCGC2_GPIOE 0x00000010 ///< Port E Clock Gating Control +#define SYSCTL_SCGC2_GPIOD 0x00000008 ///< Port D Clock Gating Control +#define SYSCTL_SCGC2_GPIOC 0x00000004 ///< Port C Clock Gating Control +#define SYSCTL_SCGC2_GPIOB 0x00000002 ///< Port B Clock Gating Control +#define SYSCTL_SCGC2_GPIOA 0x00000001 ///< Port A Clock Gating Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DCGC0 register. + */ +/*\{*/ +#define SYSCTL_DCGC0_WDT1 0x10000000 ///< WDT1 Clock Gating Control +#define SYSCTL_DCGC0_CAN2 0x04000000 ///< CAN2 Clock Gating Control +#define SYSCTL_DCGC0_CAN1 0x02000000 ///< CAN1 Clock Gating Control +#define SYSCTL_DCGC0_CAN0 0x01000000 ///< CAN0 Clock Gating Control +#define SYSCTL_DCGC0_PWM 0x00100000 ///< PWM Clock Gating Control +#define SYSCTL_DCGC0_ADC1 0x00020000 ///< ADC1 Clock Gating Control +#define SYSCTL_DCGC0_ADC0 0x00010000 ///< ADC0 Clock Gating Control +#define SYSCTL_DCGC0_HIB 0x00000040 ///< HIB Clock Gating Control +#define SYSCTL_DCGC0_WDT0 0x00000008 ///< WDT0 Clock Gating Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DCGC1 register. + */ +/*\{*/ +#define SYSCTL_DCGC1_EPI0 0x40000000 ///< EPI0 Clock Gating +#define SYSCTL_DCGC1_I2S0 0x10000000 ///< I2S0 Clock Gating +#define SYSCTL_DCGC1_COMP2 0x04000000 ///< Analog Comparator 2 Clock Gating +#define SYSCTL_DCGC1_COMP1 0x02000000 ///< Analog Comparator 1 Clock Gating +#define SYSCTL_DCGC1_COMP0 0x01000000 ///< Analog Comparator 0 Clock Gating +#define SYSCTL_DCGC1_TIMER3 0x00080000 ///< Timer 3 Clock Gating Control +#define SYSCTL_DCGC1_TIMER2 0x00040000 ///< Timer 2 Clock Gating Control +#define SYSCTL_DCGC1_TIMER1 0x00020000 ///< Timer 1 Clock Gating Control +#define SYSCTL_DCGC1_TIMER0 0x00010000 ///< Timer 0 Clock Gating Control +#define SYSCTL_DCGC1_I2C1 0x00004000 ///< I2C1 Clock Gating Control +#define SYSCTL_DCGC1_I2C0 0x00001000 ///< I2C0 Clock Gating Control +#define SYSCTL_DCGC1_QEI1 0x00000200 ///< QEI1 Clock Gating Control +#define SYSCTL_DCGC1_QEI0 0x00000100 ///< QEI0 Clock Gating Control +#define SYSCTL_DCGC1_SSI1 0x00000020 ///< SSI1 Clock Gating Control +#define SYSCTL_DCGC1_SSI0 0x00000010 ///< SSI0 Clock Gating Control +#define SYSCTL_DCGC1_UART2 0x00000004 ///< UART2 Clock Gating Control +#define SYSCTL_DCGC1_UART1 0x00000002 ///< UART1 Clock Gating Control +#define SYSCTL_DCGC1_UART0 0x00000001 ///< UART0 Clock Gating Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DCGC2 register. + */ +/*\{*/ +#define SYSCTL_DCGC2_EPHY0 0x40000000 ///< PHY0 Clock Gating Control +#define SYSCTL_DCGC2_EMAC0 0x10000000 ///< MAC0 Clock Gating Control +#define SYSCTL_DCGC2_USB0 0x00010000 ///< USB0 Clock Gating Control +#define SYSCTL_DCGC2_UDMA 0x00002000 ///< Micro-DMA Clock Gating Control +#define SYSCTL_DCGC2_GPIOJ 0x00000100 ///< Port J Clock Gating Control +#define SYSCTL_DCGC2_GPIOH 0x00000080 ///< Port H Clock Gating Control +#define SYSCTL_DCGC2_GPIOG 0x00000040 ///< Port G Clock Gating Control +#define SYSCTL_DCGC2_GPIOF 0x00000020 ///< Port F Clock Gating Control +#define SYSCTL_DCGC2_GPIOE 0x00000010 ///< Port E Clock Gating Control +#define SYSCTL_DCGC2_GPIOD 0x00000008 ///< Port D Clock Gating Control +#define SYSCTL_DCGC2_GPIOC 0x00000004 ///< Port C Clock Gating Control +#define SYSCTL_DCGC2_GPIOB 0x00000002 ///< Port B Clock Gating Control +#define SYSCTL_DCGC2_GPIOA 0x00000001 ///< Port A Clock Gating Control +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DSLPCLKCFG + * register. + */ +/*\{*/ +#define SYSCTL_DSLPCLKCFG_D_M 0x1F800000 ///< Divider Field Override +#define SYSCTL_DSLPCLKCFG_D_1 0x00000000 ///< System clock /1 +#define SYSCTL_DSLPCLKCFG_D_2 0x00800000 ///< System clock /2 +#define SYSCTL_DSLPCLKCFG_D_3 0x01000000 ///< System clock /3 +#define SYSCTL_DSLPCLKCFG_D_4 0x01800000 ///< System clock /4 +#define SYSCTL_DSLPCLKCFG_D_5 0x02000000 ///< System clock /5 +#define SYSCTL_DSLPCLKCFG_D_6 0x02800000 ///< System clock /6 +#define SYSCTL_DSLPCLKCFG_D_7 0x03000000 ///< System clock /7 +#define SYSCTL_DSLPCLKCFG_D_8 0x03800000 ///< System clock /8 +#define SYSCTL_DSLPCLKCFG_D_9 0x04000000 ///< System clock /9 +#define SYSCTL_DSLPCLKCFG_D_10 0x04800000 ///< System clock /10 +#define SYSCTL_DSLPCLKCFG_D_11 0x05000000 ///< System clock /11 +#define SYSCTL_DSLPCLKCFG_D_12 0x05800000 ///< System clock /12 +#define SYSCTL_DSLPCLKCFG_D_13 0x06000000 ///< System clock /13 +#define SYSCTL_DSLPCLKCFG_D_14 0x06800000 ///< System clock /14 +#define SYSCTL_DSLPCLKCFG_D_15 0x07000000 ///< System clock /15 +#define SYSCTL_DSLPCLKCFG_D_16 0x07800000 ///< System clock /16 +#define SYSCTL_DSLPCLKCFG_D_17 0x08000000 ///< System clock /17 +#define SYSCTL_DSLPCLKCFG_D_18 0x08800000 ///< System clock /18 +#define SYSCTL_DSLPCLKCFG_D_19 0x09000000 ///< System clock /19 +#define SYSCTL_DSLPCLKCFG_D_20 0x09800000 ///< System clock /20 +#define SYSCTL_DSLPCLKCFG_D_21 0x0A000000 ///< System clock /21 +#define SYSCTL_DSLPCLKCFG_D_22 0x0A800000 ///< System clock /22 +#define SYSCTL_DSLPCLKCFG_D_23 0x0B000000 ///< System clock /23 +#define SYSCTL_DSLPCLKCFG_D_24 0x0B800000 ///< System clock /24 +#define SYSCTL_DSLPCLKCFG_D_25 0x0C000000 ///< System clock /25 +#define SYSCTL_DSLPCLKCFG_D_26 0x0C800000 ///< System clock /26 +#define SYSCTL_DSLPCLKCFG_D_27 0x0D000000 ///< System clock /27 +#define SYSCTL_DSLPCLKCFG_D_28 0x0D800000 ///< System clock /28 +#define SYSCTL_DSLPCLKCFG_D_29 0x0E000000 ///< System clock /29 +#define SYSCTL_DSLPCLKCFG_D_30 0x0E800000 ///< System clock /30 +#define SYSCTL_DSLPCLKCFG_D_31 0x0F000000 ///< System clock /31 +#define SYSCTL_DSLPCLKCFG_D_32 0x0F800000 ///< System clock /32 +#define SYSCTL_DSLPCLKCFG_D_33 0x10000000 ///< System clock /33 +#define SYSCTL_DSLPCLKCFG_D_34 0x10800000 ///< System clock /34 +#define SYSCTL_DSLPCLKCFG_D_35 0x11000000 ///< System clock /35 +#define SYSCTL_DSLPCLKCFG_D_36 0x11800000 ///< System clock /36 +#define SYSCTL_DSLPCLKCFG_D_37 0x12000000 ///< System clock /37 +#define SYSCTL_DSLPCLKCFG_D_38 0x12800000 ///< System clock /38 +#define SYSCTL_DSLPCLKCFG_D_39 0x13000000 ///< System clock /39 +#define SYSCTL_DSLPCLKCFG_D_40 0x13800000 ///< System clock /40 +#define SYSCTL_DSLPCLKCFG_D_41 0x14000000 ///< System clock /41 +#define SYSCTL_DSLPCLKCFG_D_42 0x14800000 ///< System clock /42 +#define SYSCTL_DSLPCLKCFG_D_43 0x15000000 ///< System clock /43 +#define SYSCTL_DSLPCLKCFG_D_44 0x15800000 ///< System clock /44 +#define SYSCTL_DSLPCLKCFG_D_45 0x16000000 ///< System clock /45 +#define SYSCTL_DSLPCLKCFG_D_46 0x16800000 ///< System clock /46 +#define SYSCTL_DSLPCLKCFG_D_47 0x17000000 ///< System clock /47 +#define SYSCTL_DSLPCLKCFG_D_48 0x17800000 ///< System clock /48 +#define SYSCTL_DSLPCLKCFG_D_49 0x18000000 ///< System clock /49 +#define SYSCTL_DSLPCLKCFG_D_50 0x18800000 ///< System clock /50 +#define SYSCTL_DSLPCLKCFG_D_51 0x19000000 ///< System clock /51 +#define SYSCTL_DSLPCLKCFG_D_52 0x19800000 ///< System clock /52 +#define SYSCTL_DSLPCLKCFG_D_53 0x1A000000 ///< System clock /53 +#define SYSCTL_DSLPCLKCFG_D_54 0x1A800000 ///< System clock /54 +#define SYSCTL_DSLPCLKCFG_D_55 0x1B000000 ///< System clock /55 +#define SYSCTL_DSLPCLKCFG_D_56 0x1B800000 ///< System clock /56 +#define SYSCTL_DSLPCLKCFG_D_57 0x1C000000 ///< System clock /57 +#define SYSCTL_DSLPCLKCFG_D_58 0x1C800000 ///< System clock /58 +#define SYSCTL_DSLPCLKCFG_D_59 0x1D000000 ///< System clock /59 +#define SYSCTL_DSLPCLKCFG_D_60 0x1D800000 ///< System clock /60 +#define SYSCTL_DSLPCLKCFG_D_61 0x1E000000 ///< System clock /61 +#define SYSCTL_DSLPCLKCFG_D_62 0x1E800000 ///< System clock /62 +#define SYSCTL_DSLPCLKCFG_D_63 0x1F000000 ///< System clock /63 +#define SYSCTL_DSLPCLKCFG_D_64 0x1F800000 ///< System clock /64 +#define SYSCTL_DSLPCLKCFG_O_M 0x00000070 ///< Clock Source +#define SYSCTL_DSLPCLKCFG_O_IGN 0x00000000 ///< MOSC +#define SYSCTL_DSLPCLKCFG_O_IO 0x00000010 ///< PIOSC +#define SYSCTL_DSLPCLKCFG_O_30 0x00000030 ///< 30 kHz +#define SYSCTL_DSLPCLKCFG_O_32 0x00000070 ///< 32.768 kHz +#define SYSCTL_DSLPCLKCFG_IOSC 0x00000001 ///< IOSC Clock Source +#define SYSCTL_DSLPCLKCFG_D_S 23 +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_CLKVCLR register. + */ +/*\{*/ +#define SYSCTL_CLKVCLR_VERCLR 0x00000001 ///< Clock Verification Clear +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_PIOSCCAL + * register. + */ +/*\{*/ +#define SYSCTL_PIOSCCAL_UTEN 0x80000000 ///< Use User Trim Value +#define SYSCTL_PIOSCCAL_CAL 0x00000200 ///< Start Calibration +#define SYSCTL_PIOSCCAL_UPDATE 0x00000100 ///< Update Trim +#define SYSCTL_PIOSCCAL_UT_M 0x0000007F ///< User Trim Value +#define SYSCTL_PIOSCCAL_UT_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_PIOSCSTAT + * register. + */ +/*\{*/ +#define SYSCTL_PIOSCSTAT_DT_M 0x007F0000 ///< Default Trim Value +#define SYSCTL_PIOSCSTAT_CR_M 0x00000300 ///< Calibration Result +#define SYSCTL_PIOSCSTAT_CRNONE 0x00000000 ///< Calibration has not been + ///< attempted +#define SYSCTL_PIOSCSTAT_CRPASS 0x00000100 ///< The last calibration operation + ///< completed to meet 1% accuracy +#define SYSCTL_PIOSCSTAT_CRFAIL 0x00000200 ///< The last calibration operation + ///< failed to meet 1% accuracy +#define SYSCTL_PIOSCSTAT_CT_M 0x0000007F ///< Calibration Trim Value +#define SYSCTL_PIOSCSTAT_DT_S 16 +#define SYSCTL_PIOSCSTAT_CT_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_LDOARST register. + */ +/*\{*/ +#define SYSCTL_LDOARST_LDOARST 0x00000001 ///< LDO Reset +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_I2SMCLKCFG + * register. + */ +/*\{*/ +#define SYSCTL_I2SMCLKCFG_RXEN 0x80000000 ///< RX Clock Enable +#define SYSCTL_I2SMCLKCFG_RXI_M 0x3FF00000 ///< RX Clock Integer Input +#define SYSCTL_I2SMCLKCFG_RXF_M 0x000F0000 ///< RX Clock Fractional Input +#define SYSCTL_I2SMCLKCFG_TXEN 0x00008000 ///< TX Clock Enable +#define SYSCTL_I2SMCLKCFG_TXI_M 0x00003FF0 ///< TX Clock Integer Input +#define SYSCTL_I2SMCLKCFG_TXF_M 0x0000000F ///< TX Clock Fractional Input +#define SYSCTL_I2SMCLKCFG_RXI_S 20 +#define SYSCTL_I2SMCLKCFG_RXF_S 16 +#define SYSCTL_I2SMCLKCFG_TXI_S 4 +#define SYSCTL_I2SMCLKCFG_TXF_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_DC9 register. + */ +/*\{*/ +#define SYSCTL_DC9_ADC1DC7 0x00800000 ///< ADC1 DC7 Present +#define SYSCTL_DC9_ADC1DC6 0x00400000 ///< ADC1 DC6 Present +#define SYSCTL_DC9_ADC1DC5 0x00200000 ///< ADC1 DC5 Present +#define SYSCTL_DC9_ADC1DC4 0x00100000 ///< ADC1 DC4 Present +#define SYSCTL_DC9_ADC1DC3 0x00080000 ///< ADC1 DC3 Present +#define SYSCTL_DC9_ADC1DC2 0x00040000 ///< ADC1 DC2 Present +#define SYSCTL_DC9_ADC1DC1 0x00020000 ///< ADC1 DC1 Present +#define SYSCTL_DC9_ADC1DC0 0x00010000 ///< ADC1 DC0 Present +#define SYSCTL_DC9_ADC0DC7 0x00000080 ///< ADC0 DC7 Present +#define SYSCTL_DC9_ADC0DC6 0x00000040 ///< ADC0 DC6 Present +#define SYSCTL_DC9_ADC0DC5 0x00000020 ///< ADC0 DC5 Present +#define SYSCTL_DC9_ADC0DC4 0x00000010 ///< ADC0 DC4 Present +#define SYSCTL_DC9_ADC0DC3 0x00000008 ///< ADC0 DC3 Present +#define SYSCTL_DC9_ADC0DC2 0x00000004 ///< ADC0 DC2 Present +#define SYSCTL_DC9_ADC0DC1 0x00000002 ///< ADC0 DC1 Present +#define SYSCTL_DC9_ADC0DC0 0x00000001 ///< ADC0 DC0 Present +/*\}*/ + +/** + * The following are defines for the bit fields in the SYSCTL_NVMSTAT register. + */ +/*\{*/ +#define SYSCTL_NVMSTAT_TPSW 0x00000010 ///< Third Party Software Present +#define SYSCTL_NVMSTAT_FWB 0x00000001 ///< 32 Word Flash Write Buffer + ///< Active +/*\}*/ + +/** + * The following are deprecated defines for the System Control register + * addresses. + */ +/*\{*/ +#define SYSCTL_USER0 0x400FE1E0 ///< NV User Register 0 +#define SYSCTL_USER1 0x400FE1E4 ///< NV User Register 1 +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_DID0 + * register. + */ +/*\{*/ +#define SYSCTL_DID0_VER_MASK 0x70000000 ///< DID0 version mask +#define SYSCTL_DID0_CLASS_MASK 0x00FF0000 ///< Device Class +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 ///< Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 ///< Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 ///< Major revision B +#define SYSCTL_DID0_MAJ_C 0x00000200 ///< Major revision C +#define SYSCTL_DID0_MIN_MASK 0x000000FF ///< Minor revision mask +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_DID1 + * register. + */ +/*\{*/ +#define SYSCTL_DID1_VER_MASK 0xF0000000 ///< Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 ///< Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 ///< Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 ///< Part number mask +#define SYSCTL_DID1_PINCNT_MASK 0x0000E000 ///< Pin count +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 ///< Temperature range mask +#define SYSCTL_DID1_PKG_MASK 0x00000018 ///< Package mask +#define SYSCTL_DID1_PKG_48QFP 0x00000008 ///< QFP package +#define SYSCTL_DID1_QUAL_MASK 0x00000003 ///< Qualification status mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 ///< SOIC package +#define SYSCTL_DID1_PRTNO_SHIFT 16 +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_DC0 + * register. + */ +/*\{*/ +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 ///< SRAM size mask +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF ///< Flash size mask +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_DC1 + * register. + */ +/*\{*/ +#define SYSCTL_DC1_ADC 0x00010000 ///< ADC Module Present +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 ///< Minimum system divider mask +#define SYSCTL_DC1_ADCSPD_MASK 0x00000F00 ///< ADC speed mask +#define SYSCTL_DC1_WDOG 0x00000008 ///< Watchdog present +#define SYSCTL_DC1_WDT 0x00000008 ///< Watchdog Timer Present +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_DC2 + * register. + */ +/*\{*/ +#define SYSCTL_DC2_I2C 0x00001000 ///< I2C present +#define SYSCTL_DC2_QEI 0x00000100 ///< QEI present +#define SYSCTL_DC2_SSI 0x00000010 ///< SSI present +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_DC3 + * register. + */ +/*\{*/ +#define SYSCTL_DC3_ADC7 0x00800000 ///< ADC7 Pin Present +#define SYSCTL_DC3_ADC6 0x00400000 ///< ADC6 Pin Present +#define SYSCTL_DC3_ADC5 0x00200000 ///< ADC5 Pin Present +#define SYSCTL_DC3_ADC4 0x00100000 ///< ADC4 Pin Present +#define SYSCTL_DC3_ADC3 0x00080000 ///< ADC3 Pin Present +#define SYSCTL_DC3_ADC2 0x00040000 ///< ADC2 Pin Present +#define SYSCTL_DC3_ADC1 0x00020000 ///< ADC1 Pin Present +#define SYSCTL_DC3_ADC0 0x00010000 ///< ADC0 Pin Present +#define SYSCTL_DC3_MC_FAULT0 0x00008000 ///< MC0 fault pin present +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the + * SYSCTL_PBORCTL register. + */ +/*\{*/ +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC ///< BOR wait timer +#define SYSCTL_PBORCTL_BOR_SH 2 +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the + * SYSCTL_LDOPCTL register. + */ +/*\{*/ +#define SYSCTL_LDOPCTL_MASK 0x0000003F ///< Voltage adjust mask +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_SRCR0 + * register. + */ +/*\{*/ +#define SYSCTL_SRCR0_ADC 0x00010000 ///< ADC0 Reset Control +#define SYSCTL_SRCR0_WDT 0x00000008 ///< WDT Reset Control +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_RESC + * register. + */ +/*\{*/ +#define SYSCTL_RESC_WDOG 0x00000008 ///< Watchdog reset +#define SYSCTL_RESC_WDT 0x00000008 ///< Watchdog Timer Reset +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_RCC + * register. + */ +/*\{*/ +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 ///< System clock divider +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 ///< Use sytem clock divider +#define SYSCTL_RCC_USE_PWMDIV 0x00100000 ///< Use PWM clock divider +#define SYSCTL_RCC_PWMDIV_MASK 0x000E0000 ///< PWM clock divider +#define SYSCTL_RCC_OE 0x00001000 ///< PLL output enable +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 ///< Using a 3.6864 MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 ///< Using a 4 MHz crystal +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 ///< Crystal attached to main osc +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 ///< Oscillator input select +#define SYSCTL_RCC_SYSDIV_SHIFT 23 ///< Shift to the SYSDIV field +#define SYSCTL_RCC_PWMDIV_SHIFT 17 ///< Shift to the PWMDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 ///< Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 ///< Shift to the OSCSRC field +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_PLLCFG + * register. + */ +/*\{*/ +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 ///< Output divider +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 ///< PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F ///< Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_RCC2 + * register. + */ +/*\{*/ +#define SYSCTL_RCC2_USEFRACT 0x40000000 ///< Use fractional divider +#define SYSCTL_RCC2_SYSDIV2_MSK 0x1F800000 ///< System clock divider +#define SYSCTL_RCC2_FRACT 0x00400000 ///< Fractional divide +#define SYSCTL_RCC2_OSCSRC2_MSK 0x00000070 ///< Oscillator input select +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_RCGC0 + * register. + */ +/*\{*/ +#define SYSCTL_RCGC0_ADC 0x00010000 ///< ADC0 Clock Gating Control +#define SYSCTL_RCGC0_WDT 0x00000008 ///< WDT Clock Gating Control +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_SCGC0 + * register. + */ +/*\{*/ +#define SYSCTL_SCGC0_ADC 0x00010000 ///< ADC0 Clock Gating Control +#define SYSCTL_SCGC0_WDT 0x00000008 ///< WDT Clock Gating Control +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_DCGC0 + * register. + */ +/*\{*/ +#define SYSCTL_DCGC0_ADC 0x00010000 ///< ADC0 Clock Gating Control +#define SYSCTL_DCGC0_WDT 0x00000008 ///< WDT Clock Gating Control +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the + * SYSCTL_DSLPCLKCFG register. + */ +/*\{*/ +#define SYSCTL_DSLPCLKCFG_D_MSK 0x1F800000 ///< Deep sleep system clock override +#define SYSCTL_DSLPCLKCFG_O_MSK 0x00000070 ///< Deep sleep oscillator override +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the + * SYSCTL_CLKVCLR register. + */ +/*\{*/ +#define SYSCTL_CLKVCLR_CLR 0x00000001 ///< Clear clock verification fault +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the + * SYSCTL_LDOARST register. + */ +/*\{*/ +#define SYSCTL_LDOARST_ARST 0x00000001 ///< Allow LDO to reset device +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_SRCR0, + * SYSCTL_RCGC0, SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. + */ +/*\{*/ +#define SYSCTL_SET0_CAN2 0x04000000 ///< CAN 2 module +#define SYSCTL_SET0_CAN1 0x02000000 ///< CAN 1 module +#define SYSCTL_SET0_CAN0 0x01000000 ///< CAN 0 module +#define SYSCTL_SET0_PWM 0x00100000 ///< PWM module +#define SYSCTL_SET0_ADC 0x00010000 ///< ADC module +#define SYSCTL_SET0_ADCSPD_MASK 0x00000F00 ///< ADC speed mask +#define SYSCTL_SET0_ADCSPD_125K 0x00000000 ///< 125Ksps ADC +#define SYSCTL_SET0_ADCSPD_250K 0x00000100 ///< 250Ksps ADC +#define SYSCTL_SET0_ADCSPD_500K 0x00000200 ///< 500Ksps ADC +#define SYSCTL_SET0_ADCSPD_1M 0x00000300 ///< 1Msps ADC +#define SYSCTL_SET0_HIB 0x00000040 ///< Hibernation module +#define SYSCTL_SET0_WDOG 0x00000008 ///< Watchdog module +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_SRCR1, + * SYSCTL_RCGC1, SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. + */ +/*\{*/ +#define SYSCTL_SET1_COMP2 0x04000000 ///< Analog comparator module 2 +#define SYSCTL_SET1_COMP1 0x02000000 ///< Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 ///< Analog comparator module 0 +#define SYSCTL_SET1_TIMER3 0x00080000 ///< Timer module 3 +#define SYSCTL_SET1_TIMER2 0x00040000 ///< Timer module 2 +#define SYSCTL_SET1_TIMER1 0x00020000 ///< Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 ///< Timer module 0 +#define SYSCTL_SET1_I2C1 0x00002000 ///< I2C module 1 +#define SYSCTL_SET1_I2C0 0x00001000 ///< I2C module 0 +#define SYSCTL_SET1_I2C 0x00001000 ///< I2C module +#define SYSCTL_SET1_QEI1 0x00000200 ///< QEI module 1 +#define SYSCTL_SET1_QEI 0x00000100 ///< QEI module +#define SYSCTL_SET1_QEI0 0x00000100 ///< QEI module 0 +#define SYSCTL_SET1_SSI1 0x00000020 ///< SSI module 1 +#define SYSCTL_SET1_SSI0 0x00000010 ///< SSI module 0 +#define SYSCTL_SET1_SSI 0x00000010 ///< SSI module +#define SYSCTL_SET1_UART2 0x00000004 ///< UART module 2 +#define SYSCTL_SET1_UART1 0x00000002 ///< UART module 1 +#define SYSCTL_SET1_UART0 0x00000001 ///< UART module 0 +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_SRCR2, + * SYSCTL_RCGC2, SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. + */ +/*\{*/ +#define SYSCTL_SET2_ETH 0x50000000 ///< ETH module +#define SYSCTL_SET2_GPIOH 0x00000080 ///< GPIO H module +#define SYSCTL_SET2_GPIOG 0x00000040 ///< GPIO G module +#define SYSCTL_SET2_GPIOF 0x00000020 ///< GPIO F module +#define SYSCTL_SET2_GPIOE 0x00000010 ///< GPIO E module +#define SYSCTL_SET2_GPIOD 0x00000008 ///< GPIO D module +#define SYSCTL_SET2_GPIOC 0x00000004 ///< GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 ///< GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 ///< GIPO A module +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the SYSCTL_RIS, + * SYSCTL_IMC, and SYSCTL_IMS registers. + */ +/*\{*/ +#define SYSCTL_INT_PLL_LOCK 0x00000040 ///< PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 ///< Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 ///< Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 ///< Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 ///< Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 ///< Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 ///< PLL failure interrupt +/*\}*/ + +#endif /* LM3S_SYSCTL_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/lm3s_types.h b/2.5/bertos/cpu/cortex-m3/io/lm3s_types.h new file mode 100644 index 00000000..b88347b4 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/lm3s_types.h @@ -0,0 +1,120 @@ +/** + * \file + * + * + * \brief LM3S generic hardware macros. + */ + +#ifndef LM3S_TYPES_H +#define LM3S_TYPES_H + +#include +#include + +/** + * Helper Macros for determining the particular hardware revision. + */ +/*\{*/ +#ifndef CLASS_IS_SANDSTORM +#define CLASS_IS_SANDSTORM \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_M) == SYSCTL_DID0_VER_0) || \ + ((HWREG(SYSCTL_DID0) & (SYSCTL_DID0_VER_M | SYSCTL_DID0_CLASS_M)) == \ + (SYSCTL_DID0_VER_1 | SYSCTL_DID0_CLASS_SANDSTORM))) +#endif + +#ifndef CLASS_IS_FURY +#define CLASS_IS_FURY \ + ((HWREG(SYSCTL_DID0) & (SYSCTL_DID0_VER_M | SYSCTL_DID0_CLASS_M)) == \ + (SYSCTL_DID0_VER_1 | SYSCTL_DID0_CLASS_FURY)) +#endif + +#ifndef CLASS_IS_DUSTDEVIL +#define CLASS_IS_DUSTDEVIL \ + ((HWREG(SYSCTL_DID0) & (SYSCTL_DID0_VER_M | SYSCTL_DID0_CLASS_M)) == \ + (SYSCTL_DID0_VER_1 | SYSCTL_DID0_CLASS_DUSTDEVIL)) +#endif + +#ifndef CLASS_IS_TEMPEST +#define CLASS_IS_TEMPEST \ + ((HWREG(SYSCTL_DID0) & (SYSCTL_DID0_VER_M | SYSCTL_DID0_CLASS_M)) == \ + (SYSCTL_DID0_VER_1 | SYSCTL_DID0_CLASS_TEMPEST)) +#endif + +#ifndef REVISION_IS_A0 +#define REVISION_IS_A0 \ + ((HWREG(SYSCTL_DID0) & (SYSCTL_DID0_MAJ_M | SYSCTL_DID0_MIN_M)) == \ + (SYSCTL_DID0_MAJ_REVA | SYSCTL_DID0_MIN_0)) +#endif + +#ifndef REVISION_IS_A1 +#define REVISION_IS_A1 \ + ((HWREG(SYSCTL_DID0) & (SYSCTL_DID0_MAJ_M | SYSCTL_DID0_MIN_M)) == \ + (SYSCTL_DID0_MAJ_REVA | SYSCTL_DID0_MIN_0)) +#endif + +#ifndef REVISION_IS_A2 +#define REVISION_IS_A2 \ + ((HWREG(SYSCTL_DID0) & (SYSCTL_DID0_MAJ_M | SYSCTL_DID0_MIN_M)) == \ + (SYSCTL_DID0_MAJ_REVA | SYSCTL_DID0_MIN_2)) +#endif + +#ifndef REVISION_IS_B0 +#define REVISION_IS_B0 \ + ((HWREG(SYSCTL_DID0) & (SYSCTL_DID0_MAJ_M | SYSCTL_DID0_MIN_M)) == \ + (SYSCTL_DID0_MAJ_REVB | SYSCTL_DID0_MIN_0)) +#endif + +#ifndef REVISION_IS_B1 +#define REVISION_IS_B1 \ + ((HWREG(SYSCTL_DID0) & (SYSCTL_DID0_MAJ_M | SYSCTL_DID0_MIN_M)) == \ + (SYSCTL_DID0_MAJ_REVB | SYSCTL_DID0_MIN_1)) +#endif + +#ifndef REVISION_IS_C0 +#define REVISION_IS_C0 \ + ((HWREG(SYSCTL_DID0) & (SYSCTL_DID0_MAJ_M | SYSCTL_DID0_MIN_M)) == \ + (SYSCTL_DID0_MAJ_REVC | SYSCTL_DID0_MIN_0)) +#endif + +#ifndef REVISION_IS_C1 +#define REVISION_IS_C1 \ + ((HWREG(SYSCTL_DID0) & (SYSCTL_DID0_MAJ_M | SYSCTL_DID0_MIN_M)) == \ + (SYSCTL_DID0_MAJ_REVC | SYSCTL_DID0_MIN_1)) +#endif + +#ifndef REVISION_IS_C2 +#define REVISION_IS_C2 \ + ((HWREG(SYSCTL_DID0) & (SYSCTL_DID0_MAJ_M | SYSCTL_DID0_MIN_M)) == \ + (SYSCTL_DID0_MAJ_REVC | SYSCTL_DID0_MIN_2)) +#endif +/*\}*/ + +#endif /* LM3S_TYPES_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/lm3s_uart.h b/2.5/bertos/cpu/cortex-m3/io/lm3s_uart.h new file mode 100644 index 00000000..6c6acd35 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/lm3s_uart.h @@ -0,0 +1,469 @@ +/** + * \file + * + * + * \brief LM3S1968 UART hardware. + */ + +#ifndef LM3S_UART_H +#define LM3S_UART_H + +/** + * The following are defines for the UART register offsets. + */ +/*\{*/ +#define UART_O_DR 0x00000000 //< UART Data +#define UART_O_RSR 0x00000004 //< UART Receive Status/Error Clear +#define UART_O_ECR 0x00000004 //< UART Receive Status/Error Clear +#define UART_O_FR 0x00000018 //< UART Flag +#define UART_O_ILPR 0x00000020 //< UART IrDA Low-Power Register +#define UART_O_IBRD 0x00000024 //< UART Integer Baud-Rate Divisor +#define UART_O_FBRD 0x00000028 //< UART Fractional Baud-Rate + //< Divisor +#define UART_O_LCRH 0x0000002C //< UART Line Control +#define UART_O_CTL 0x00000030 //< UART Control +#define UART_O_IFLS 0x00000034 //< UART Interrupt FIFO Level Select +#define UART_O_IM 0x00000038 //< UART Interrupt Mask +#define UART_O_RIS 0x0000003C //< UART Raw Interrupt Status +#define UART_O_MIS 0x00000040 //< UART Masked Interrupt Status +#define UART_O_ICR 0x00000044 //< UART Interrupt Clear +#define UART_O_DMACTL 0x00000048 //< UART DMA Control +#define UART_O_LCTL 0x00000090 //< UART LIN Control +#define UART_O_LSS 0x00000094 //< UART LIN Snap Shot +#define UART_O_LTIM 0x00000098 //< UART LIN Timer +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_DR register. + */ +/*\{*/ +#define UART_DR_OE 0x00000800 //< UART Overrun Error +#define UART_DR_BE 0x00000400 //< UART Break Error +#define UART_DR_PE 0x00000200 //< UART Parity Error +#define UART_DR_FE 0x00000100 //< UART Framing Error +#define UART_DR_DATA_M 0x000000FF //< Data Transmitted or Received +#define UART_DR_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_RSR register. + */ +/*\{*/ +#define UART_RSR_OE 0x00000008 //< UART Overrun Error +#define UART_RSR_BE 0x00000004 //< UART Break Error +#define UART_RSR_PE 0x00000002 //< UART Parity Error +#define UART_RSR_FE 0x00000001 //< UART Framing Error +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_ECR register. + */ +/*\{*/ +#define UART_ECR_DATA_M 0x000000FF //< Error Clear +#define UART_ECR_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_FR register. + */ +/*\{*/ +#define UART_FR_RI 0x00000100 //< Ring Indicator +#define UART_FR_TXFE 0x00000080 //< UART Transmit FIFO Empty +#define UART_FR_RXFF 0x00000040 //< UART Receive FIFO Full +#define UART_FR_TXFF 0x00000020 //< UART Transmit FIFO Full +#define UART_FR_RXFE 0x00000010 //< UART Receive FIFO Empty +#define UART_FR_BUSY 0x00000008 //< UART Busy +#define UART_FR_DCD 0x00000004 //< Data Carrier Detect +#define UART_FR_DSR 0x00000002 //< Data Set Ready +#define UART_FR_CTS 0x00000001 //< Clear To Send +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_ILPR register. + */ +/*\{*/ +#define UART_ILPR_ILPDVSR_M 0x000000FF //< IrDA Low-Power Divisor +#define UART_ILPR_ILPDVSR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_IBRD register. + */ +/*\{*/ +#define UART_IBRD_DIVINT_M 0x0000FFFF //< Integer Baud-Rate Divisor +#define UART_IBRD_DIVINT_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_FBRD register. + */ +/*\{*/ +#define UART_FBRD_DIVFRAC_M 0x0000003F //< Fractional Baud-Rate Divisor +#define UART_FBRD_DIVFRAC_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_LCRH register. + */ +/*\{*/ +#define UART_LCRH_SPS 0x00000080 //< UART Stick Parity Select +#define UART_LCRH_WLEN_M 0x00000060 //< UART Word Length +#define UART_LCRH_WLEN_5 0x00000000 //< 5 bits (default) +#define UART_LCRH_WLEN_6 0x00000020 //< 6 bits +#define UART_LCRH_WLEN_7 0x00000040 //< 7 bits +#define UART_LCRH_WLEN_8 0x00000060 //< 8 bits +#define UART_LCRH_FEN 0x00000010 //< UART Enable FIFOs +#define UART_LCRH_STP2 0x00000008 //< UART Two Stop Bits Select +#define UART_LCRH_EPS 0x00000004 //< UART Even Parity Select +#define UART_LCRH_PEN 0x00000002 //< UART Parity Enable +#define UART_LCRH_BRK 0x00000001 //< UART Send Break +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_CTL register. + */ +/*\{*/ +#define UART_CTL_CTSEN 0x00008000 //< Enable Clear To Send +#define UART_CTL_RTSEN 0x00004000 //< Enable Request to Send +#define UART_CTL_RTS 0x00000800 //< Request to Send +#define UART_CTL_DTR 0x00000400 //< Data Terminal Ready +#define UART_CTL_RXE 0x00000200 //< UART Receive Enable +#define UART_CTL_TXE 0x00000100 //< UART Transmit Enable +#define UART_CTL_LBE 0x00000080 //< UART Loop Back Enable +#define UART_CTL_LIN 0x00000040 //< LIN Mode Enable +#define UART_CTL_HSE 0x00000020 //< High-Speed Enable +#define UART_CTL_EOT 0x00000010 //< End of Transmission +#define UART_CTL_SMART 0x00000008 //< ISO 7816 Smart Card Support +#define UART_CTL_SIRLP 0x00000004 //< UART SIR Low-Power Mode +#define UART_CTL_SIREN 0x00000002 //< UART SIR Enable +#define UART_CTL_UARTEN 0x00000001 //< UART Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_IFLS register. + */ +/*\{*/ +#define UART_IFLS_RX_M 0x00000038 //< UART Receive Interrupt FIFO + //< Level Select +#define UART_IFLS_RX1_8 0x00000000 //< RX FIFO >= 1/8 full +#define UART_IFLS_RX2_8 0x00000008 //< RX FIFO >= 1/4 full +#define UART_IFLS_RX4_8 0x00000010 //< RX FIFO >= 1/2 full (default) +#define UART_IFLS_RX6_8 0x00000018 //< RX FIFO >= 3/4 full +#define UART_IFLS_RX7_8 0x00000020 //< RX FIFO >= 7/8 full +#define UART_IFLS_TX_M 0x00000007 //< UART Transmit Interrupt FIFO + //< Level Select +#define UART_IFLS_TX1_8 0x00000000 //< TX FIFO <= 1/8 full +#define UART_IFLS_TX2_8 0x00000001 //< TX FIFO <= 1/4 full +#define UART_IFLS_TX4_8 0x00000002 //< TX FIFO <= 1/2 full (default) +#define UART_IFLS_TX6_8 0x00000003 //< TX FIFO <= 3/4 full +#define UART_IFLS_TX7_8 0x00000004 //< TX FIFO <= 7/8 full +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_IM register. + */ +/*\{*/ +#define UART_IM_LME5IM 0x00008000 //< LIN Mode Edge 5 Interrupt Mask +#define UART_IM_LME1IM 0x00004000 //< LIN Mode Edge 1 Interrupt Mask +#define UART_IM_LMSBIM 0x00002000 //< LIN Mode Sync Break Interrupt + //< Mask +#define UART_IM_OEIM 0x00000400 //< UART Overrun Error Interrupt + //< Mask +#define UART_IM_BEIM 0x00000200 //< UART Break Error Interrupt Mask +#define UART_IM_PEIM 0x00000100 //< UART Parity Error Interrupt Mask +#define UART_IM_FEIM 0x00000080 //< UART Framing Error Interrupt + //< Mask +#define UART_IM_RTIM 0x00000040 //< UART Receive Time-Out Interrupt + //< Mask +#define UART_IM_TXIM 0x00000020 //< UART Transmit Interrupt Mask +#define UART_IM_RXIM 0x00000010 //< UART Receive Interrupt Mask +#define UART_IM_DSRMIM 0x00000008 //< UART Data Set Ready Modem + //< Interrupt Mask +#define UART_IM_DCDMIM 0x00000004 //< UART Data Carrier Detect Modem + //< Interrupt Mask +#define UART_IM_CTSMIM 0x00000002 //< UART Clear to Send Modem + //< Interrupt Mask +#define UART_IM_RIMIM 0x00000001 //< UART Ring Indicator Modem + //< Interrupt Mask +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_RIS register. + */ +/*\{*/ +#define UART_RIS_LME5RIS 0x00008000 //< LIN Mode Edge 5 Raw Interrupt + //< Status +#define UART_RIS_LME1RIS 0x00004000 //< LIN Mode Edge 1 Raw Interrupt + //< Status +#define UART_RIS_LMSBRIS 0x00002000 //< LIN Mode Sync Break Raw + //< Interrupt Status +#define UART_RIS_OERIS 0x00000400 //< UART Overrun Error Raw Interrupt + //< Status +#define UART_RIS_BERIS 0x00000200 //< UART Break Error Raw Interrupt + //< Status +#define UART_RIS_PERIS 0x00000100 //< UART Parity Error Raw Interrupt + //< Status +#define UART_RIS_FERIS 0x00000080 //< UART Framing Error Raw Interrupt + //< Status +#define UART_RIS_RTRIS 0x00000040 //< UART Receive Time-Out Raw + //< Interrupt Status +#define UART_RIS_TXRIS 0x00000020 //< UART Transmit Raw Interrupt + //< Status +#define UART_RIS_RXRIS 0x00000010 //< UART Receive Raw Interrupt + //< Status +#define UART_RIS_DSRRIS 0x00000008 //< UART Data Set Ready Modem Raw + //< Interrupt Status +#define UART_RIS_DCDRIS 0x00000004 //< UART Data Carrier Detect Modem + //< Raw Interrupt Status +#define UART_RIS_CTSRIS 0x00000002 //< UART Clear to Send Modem Raw + //< Interrupt Status +#define UART_RIS_RIRIS 0x00000001 //< UART Ring Indicator Modem Raw + //< Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_MIS register. + */ +/*\{*/ +#define UART_MIS_LME5MIS 0x00008000 //< LIN Mode Edge 5 Masked Interrupt + //< Status +#define UART_MIS_LME1MIS 0x00004000 //< LIN Mode Edge 1 Masked Interrupt + //< Status +#define UART_MIS_LMSBMIS 0x00002000 //< LIN Mode Sync Break Masked + //< Interrupt Status +#define UART_MIS_OEMIS 0x00000400 //< UART Overrun Error Masked + //< Interrupt Status +#define UART_MIS_BEMIS 0x00000200 //< UART Break Error Masked + //< Interrupt Status +#define UART_MIS_PEMIS 0x00000100 //< UART Parity Error Masked + //< Interrupt Status +#define UART_MIS_FEMIS 0x00000080 //< UART Framing Error Masked + //< Interrupt Status +#define UART_MIS_RTMIS 0x00000040 //< UART Receive Time-Out Masked + //< Interrupt Status +#define UART_MIS_TXMIS 0x00000020 //< UART Transmit Masked Interrupt + //< Status +#define UART_MIS_RXMIS 0x00000010 //< UART Receive Masked Interrupt + //< Status +#define UART_MIS_DSRMIS 0x00000008 //< UART Data Set Ready Modem Masked + //< Interrupt Status +#define UART_MIS_DCDMIS 0x00000004 //< UART Data Carrier Detect Modem + //< Masked Interrupt Status +#define UART_MIS_CTSMIS 0x00000002 //< UART Clear to Send Modem Masked + //< Interrupt Status +#define UART_MIS_RIMIS 0x00000001 //< UART Ring Indicator Modem Masked + //< Interrupt Status +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_ICR register. + */ +/*\{*/ +#define UART_ICR_LME5MIC 0x00008000 //< LIN Mode Edge 5 Interrupt Clear +#define UART_ICR_LME1MIC 0x00004000 //< LIN Mode Edge 1 Interrupt Clear +#define UART_ICR_LMSBMIC 0x00002000 //< LIN Mode Sync Break Interrupt + //< Clear +#define UART_ICR_OEIC 0x00000400 //< Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x00000200 //< Break Error Interrupt Clear +#define UART_ICR_PEIC 0x00000100 //< Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x00000080 //< Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x00000040 //< Receive Time-Out Interrupt Clear +#define UART_ICR_TXIC 0x00000020 //< Transmit Interrupt Clear +#define UART_ICR_RXIC 0x00000010 //< Receive Interrupt Clear +#define UART_ICR_DSRMIC 0x00000008 //< UART Data Set Ready Modem + //< Interrupt Clear +#define UART_ICR_DCDMIC 0x00000004 //< UART Data Carrier Detect Modem + //< Interrupt Clear +#define UART_ICR_CTSMIC 0x00000002 //< UART Clear to Send Modem + //< Interrupt Clear +#define UART_ICR_RIMIC 0x00000001 //< UART Ring Indicator Modem + //< Interrupt Clear +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_DMACTL register. + */ +/*\{*/ +#define UART_DMACTL_DMAERR 0x00000004 //< DMA on Error +#define UART_DMACTL_TXDMAE 0x00000002 //< Transmit DMA Enable +#define UART_DMACTL_RXDMAE 0x00000001 //< Receive DMA Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_LCTL register. + */ +/*\{*/ +#define UART_LCTL_BLEN_M 0x00000030 //< Sync Break Length +#define UART_LCTL_BLEN_13T 0x00000000 //< Sync break length is 13T bits + //< (default) +#define UART_LCTL_BLEN_14T 0x00000010 //< Sync break length is 14T bits +#define UART_LCTL_BLEN_15T 0x00000020 //< Sync break length is 15T bits +#define UART_LCTL_BLEN_16T 0x00000030 //< Sync break length is 16T bits +#define UART_LCTL_MASTER 0x00000001 //< LIN Master Enable +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_LSS register. + */ +/*\{*/ +#define UART_LSS_TSS_M 0x0000FFFF //< Timer Snap Shot +#define UART_LSS_TSS_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the UART_O_LTIM register. + */ +/*\{*/ +#define UART_LTIM_TIMER_M 0x0000FFFF //< Timer Value +#define UART_LTIM_TIMER_S 0 +/*\}*/ + +/** + * The following definitions are deprecated. + */ +/*\{*/ +#ifndef DEPRECATED +/*\}*/ + +/** + * The following are deprecated defines for the UART register offsets. + */ +/*\{*/ +#define UART_O_LCR_H 0x0000002C //< Line Control Register, HIGH byte +#define UART_O_PeriphID4 0x00000FD0 +#define UART_O_PeriphID5 0x00000FD4 +#define UART_O_PeriphID6 0x00000FD8 +#define UART_O_PeriphID7 0x00000FDC +#define UART_O_PeriphID0 0x00000FE0 +#define UART_O_PeriphID1 0x00000FE4 +#define UART_O_PeriphID2 0x00000FE8 +#define UART_O_PeriphID3 0x00000FEC +#define UART_O_PCellID0 0x00000FF0 +#define UART_O_PCellID1 0x00000FF4 +#define UART_O_PCellID2 0x00000FF8 +#define UART_O_PCellID3 0x00000FFC +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the UART_O_DR + * register. + */ +/*\{*/ +#define UART_DR_DATA_MASK 0x000000FF //< UART data +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the UART_O_IBRD + * register. + */ +/*\{*/ +#define UART_IBRD_DIVINT_MASK 0x0000FFFF //< Integer baud-rate divisor +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the UART_O_FBRD + * register. + */ +/*\{*/ +#define UART_FBRD_DIVFRAC_MASK 0x0000003F //< Fractional baud-rate divisor +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the UART_O_LCR_H + * register. + */ +/*\{*/ +#define UART_LCR_H_SPS 0x00000080 //< Stick Parity Select +#define UART_LCR_H_WLEN 0x00000060 //< Word length +#define UART_LCR_H_WLEN_5 0x00000000 //< 5 bit data +#define UART_LCR_H_WLEN_6 0x00000020 //< 6 bit data +#define UART_LCR_H_WLEN_7 0x00000040 //< 7 bit data +#define UART_LCR_H_WLEN_8 0x00000060 //< 8 bit data +#define UART_LCR_H_FEN 0x00000010 //< Enable FIFO +#define UART_LCR_H_STP2 0x00000008 //< Two Stop Bits Select +#define UART_LCR_H_EPS 0x00000004 //< Even Parity Select +#define UART_LCR_H_PEN 0x00000002 //< Parity Enable +#define UART_LCR_H_BRK 0x00000001 //< Send Break +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the UART_O_IFLS + * register. + */ +/*\{*/ +#define UART_IFLS_RX_MASK 0x00000038 //< RX FIFO level mask +#define UART_IFLS_TX_MASK 0x00000007 //< TX FIFO level mask +/*\}*/ + +/** + * The following are deprecated defines for the bit fields in the UART_O_ICR + * register. + */ +/*\{*/ +#define UART_RSR_ANY (UART_RSR_OE | UART_RSR_BE | UART_RSR_PE | \ + UART_RSR_FE) +/*\}*/ + +/** + * The following are deprecated defines for the Reset Values for UART + * Registers. + */ +/*\{*/ +#define UART_RV_CTL 0x00000300 +#define UART_RV_PCellID1 0x000000F0 +#define UART_RV_PCellID3 0x000000B1 +#define UART_RV_FR 0x00000090 +#define UART_RV_PeriphID2 0x00000018 +#define UART_RV_IFLS 0x00000012 +#define UART_RV_PeriphID0 0x00000011 +#define UART_RV_PCellID0 0x0000000D +#define UART_RV_PCellID2 0x00000005 +#define UART_RV_PeriphID3 0x00000001 +#define UART_RV_PeriphID4 0x00000000 +#define UART_RV_LCR_H 0x00000000 +#define UART_RV_PeriphID6 0x00000000 +#define UART_RV_DR 0x00000000 +#define UART_RV_RSR 0x00000000 +#define UART_RV_ECR 0x00000000 +#define UART_RV_PeriphID5 0x00000000 +#define UART_RV_RIS 0x00000000 +#define UART_RV_FBRD 0x00000000 +#define UART_RV_IM 0x00000000 +#define UART_RV_MIS 0x00000000 +#define UART_RV_ICR 0x00000000 +#define UART_RV_PeriphID1 0x00000000 +#define UART_RV_PeriphID7 0x00000000 +#define UART_RV_IBRD 0x00000000 +/*\}*/ + +#endif /* DEPRECATED */ + +#endif /* LM3S_UART_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/stm32.h b/2.5/bertos/cpu/cortex-m3/io/stm32.h new file mode 100644 index 00000000..5a9d4a82 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/stm32.h @@ -0,0 +1,1120 @@ +/** + * \file + * + * + * \brief STM32 registers definition. + */ + +#ifndef STM32_H +#define STM32_H + +#include +#include +#include + +/** + * The following are defines for the fault assignments. + */ +/*\{*/ +#define FAULT_NMI 2 ///< NMI fault +#define FAULT_HARD 3 ///< Hard fault +#define FAULT_MPU 4 ///< MPU fault +#define FAULT_BUS 5 ///< Bus fault +#define FAULT_USAGE 6 ///< Usage fault +#define FAULT_SVCALL 11 ///< SVCall +#define FAULT_DEBUG 12 ///< Debug monitor +#define FAULT_PENDSV 14 ///< PendSV +#define FAULT_SYSTICK 15 ///< System Tick +/*\}*/ + +/** + * The following are defines for the total number of interrupts. + */ +/*\{*/ +#define NUM_INTERRUPTS 71 +/*\}*/ + +/** + * NVIC registers (NVIC) + */ +/*\{*/ +#define NVIC_INT_TYPE_R (*((reg32_t *)0xE000E004)) +#define NVIC_ST_CTRL_R (*((reg32_t *)0xE000E010)) +#define NVIC_ST_RELOAD_R (*((reg32_t *)0xE000E014)) +#define NVIC_ST_CURRENT_R (*((reg32_t *)0xE000E018)) +#define NVIC_ST_CAL_R (*((reg32_t *)0xE000E01C)) +#define NVIC_EN0_R (*((reg32_t *)0xE000E100)) +#define NVIC_EN1_R (*((reg32_t *)0xE000E104)) +#define NVIC_DIS0_R (*((reg32_t *)0xE000E180)) +#define NVIC_DIS1_R (*((reg32_t *)0xE000E184)) +#define NVIC_PEND0_R (*((reg32_t *)0xE000E200)) +#define NVIC_PEND1_R (*((reg32_t *)0xE000E204)) +#define NVIC_UNPEND0_R (*((reg32_t *)0xE000E280)) +#define NVIC_UNPEND1_R (*((reg32_t *)0xE000E284)) +#define NVIC_ACTIVE0_R (*((reg32_t *)0xE000E300)) +#define NVIC_ACTIVE1_R (*((reg32_t *)0xE000E304)) +#define NVIC_PRI0_R (*((reg32_t *)0xE000E400)) +#define NVIC_PRI1_R (*((reg32_t *)0xE000E404)) +#define NVIC_PRI2_R (*((reg32_t *)0xE000E408)) +#define NVIC_PRI3_R (*((reg32_t *)0xE000E40C)) +#define NVIC_PRI4_R (*((reg32_t *)0xE000E410)) +#define NVIC_PRI5_R (*((reg32_t *)0xE000E414)) +#define NVIC_PRI6_R (*((reg32_t *)0xE000E418)) +#define NVIC_PRI7_R (*((reg32_t *)0xE000E41C)) +#define NVIC_PRI8_R (*((reg32_t *)0xE000E420)) +#define NVIC_PRI9_R (*((reg32_t *)0xE000E424)) +#define NVIC_PRI10_R (*((reg32_t *)0xE000E428)) +#define NVIC_CPUID_R (*((reg32_t *)0xE000ED00)) +#define NVIC_INT_CTRL_R (*((reg32_t *)0xE000ED04)) +#define NVIC_VTABLE_R (*((reg32_t *)0xE000ED08)) +#define NVIC_APINT_R (*((reg32_t *)0xE000ED0C)) +#define NVIC_SYS_CTRL_R (*((reg32_t *)0xE000ED10)) +#define NVIC_CFG_CTRL_R (*((reg32_t *)0xE000ED14)) +#define NVIC_SYS_PRI1_R (*((reg32_t *)0xE000ED18)) +#define NVIC_SYS_PRI2_R (*((reg32_t *)0xE000ED1C)) +#define NVIC_SYS_PRI3_R (*((reg32_t *)0xE000ED20)) +#define NVIC_SYS_HND_CTRL_R (*((reg32_t *)0xE000ED24)) +#define NVIC_FAULT_STAT_R (*((reg32_t *)0xE000ED28)) +#define NVIC_HFAULT_STAT_R (*((reg32_t *)0xE000ED2C)) +#define NVIC_DEBUG_STAT_R (*((reg32_t *)0xE000ED30)) +#define NVIC_MM_ADDR_R (*((reg32_t *)0xE000ED34)) +#define NVIC_FAULT_ADDR_R (*((reg32_t *)0xE000ED38)) +#define NVIC_MPU_TYPE_R (*((reg32_t *)0xE000ED90)) +#define NVIC_MPU_CTRL_R (*((reg32_t *)0xE000ED94)) +#define NVIC_MPU_NUMBER_R (*((reg32_t *)0xE000ED98)) +#define NVIC_MPU_BASE_R (*((reg32_t *)0xE000ED9C)) +#define NVIC_MPU_ATTR_R (*((reg32_t *)0xE000EDA0)) +#define NVIC_DBG_CTRL_R (*((reg32_t *)0xE000EDF0)) +#define NVIC_DBG_XFER_R (*((reg32_t *)0xE000EDF4)) +#define NVIC_DBG_DATA_R (*((reg32_t *)0xE000EDF8)) +#define NVIC_DBG_INT_R (*((reg32_t *)0xE000EDFC)) +#define NVIC_SW_TRIG_R (*((reg32_t *)0xE000EF00)) +/*\}*/ + +/** + * The following are defines for the NVIC register addresses. + */ +/*\{*/ +#define NVIC_INT_TYPE 0xE000E004 ///< Interrupt Controller Type Reg +#define NVIC_ST_CTRL 0xE000E010 ///< SysTick Control and Status Reg +#define NVIC_ST_RELOAD 0xE000E014 ///< SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 ///< SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C ///< SysTick Calibration Value Reg +#define NVIC_EN0 0xE000E100 ///< IRQ 0 to 31 Set Enable Register +#define NVIC_EN1 0xE000E104 ///< IRQ 32 to 63 Set Enable Register +#define NVIC_DIS0 0xE000E180 ///< IRQ 0 to 31 Clear Enable Reg +#define NVIC_DIS1 0xE000E184 ///< IRQ 32 to 63 Clear Enable Reg +#define NVIC_PEND0 0xE000E200 ///< IRQ 0 to 31 Set Pending Register +#define NVIC_PEND1 0xE000E204 ///< IRQ 32 to 63 Set Pending Reg +#define NVIC_UNPEND0 0xE000E280 ///< IRQ 0 to 31 Clear Pending Reg +#define NVIC_UNPEND1 0xE000E284 ///< IRQ 32 to 63 Clear Pending Reg +#define NVIC_ACTIVE0 0xE000E300 ///< IRQ 0 to 31 Active Register +#define NVIC_ACTIVE1 0xE000E304 ///< IRQ 32 to 63 Active Register +#define NVIC_PRI0 0xE000E400 ///< IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 ///< IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 ///< IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C ///< IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 ///< IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 ///< IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 ///< IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C ///< IRQ 28 to 31 Priority Register +#define NVIC_PRI8 0xE000E420 ///< IRQ 32 to 35 Priority Register +#define NVIC_PRI9 0xE000E424 ///< IRQ 36 to 39 Priority Register +#define NVIC_PRI10 0xE000E428 ///< IRQ 40 to 43 Priority Register +#define NVIC_PRI11 0xE000E42C ///< IRQ 44 to 47 Priority Register +#define NVIC_PRI12 0xE000E430 ///< IRQ 48 to 51 Priority Register +#define NVIC_PRI13 0xE000E434 ///< IRQ 52 to 55 Priority Register +#define NVIC_CPUID 0xE000ED00 ///< CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 ///< Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 ///< Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C ///< App. Int & Reset Control Reg +#define NVIC_SYS_CTRL 0xE000ED10 ///< System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 ///< Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 ///< Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C ///< Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 ///< Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 ///< System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 ///< Configurable Fault Status Reg +#define NVIC_HFAULT_STAT 0xE000ED2C ///< Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 ///< Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 ///< Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 ///< Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 ///< MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 ///< MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 ///< MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C ///< MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 ///< MPU Region Attribute & Size Reg +#define NVIC_DBG_CTRL 0xE000EDF0 ///< Debug Control and Status Reg +#define NVIC_DBG_XFER 0xE000EDF4 ///< Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 ///< Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC ///< Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 ///< Software Trigger Interrupt Reg +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_INT_TYPE register. + */ +/*\{*/ +#define NVIC_INT_TYPE_LINES_M 0x0000001F ///< Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ST_CTRL register. + */ +/*\{*/ +#define NVIC_ST_CTRL_COUNT 0x00010000 ///< Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 ///< Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 ///< Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 ///< Counter mode +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ST_RELOAD register. + */ +/*\{*/ +#define NVIC_ST_RELOAD_M 0x00FFFFFF ///< Counter load value +#define NVIC_ST_RELOAD_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ST_CURRENT +* register. + */ +/*\{*/ +#define NVIC_ST_CURRENT_M 0x00FFFFFF ///< Counter current value +#define NVIC_ST_CURRENT_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ST_CAL register. + */ +/*\{*/ +#define NVIC_ST_CAL_NOREF 0x80000000 ///< No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 ///< Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF ///< 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_EN0 register. + */ +/*\{*/ +#define NVIC_EN0_INT31 0x80000000 ///< Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 ///< Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 ///< Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 ///< Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 ///< Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 ///< Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 ///< Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 ///< Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 ///< Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 ///< Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 ///< Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 ///< Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 ///< Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 ///< Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 ///< Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 ///< Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 ///< Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 ///< Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 ///< Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 ///< Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 ///< Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 ///< Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 ///< Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 ///< Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 ///< Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 ///< Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 ///< Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 ///< Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 ///< Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 ///< Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 ///< Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 ///< Interrupt 0 enable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_EN1 register. + */ +/*\{*/ +#define NVIC_EN1_INT59 0x08000000 ///< Interrupt 59 enable +#define NVIC_EN1_INT58 0x04000000 ///< Interrupt 58 enable +#define NVIC_EN1_INT57 0x02000000 ///< Interrupt 57 enable +#define NVIC_EN1_INT56 0x01000000 ///< Interrupt 56 enable +#define NVIC_EN1_INT55 0x00800000 ///< Interrupt 55 enable +#define NVIC_EN1_INT54 0x00400000 ///< Interrupt 54 enable +#define NVIC_EN1_INT53 0x00200000 ///< Interrupt 53 enable +#define NVIC_EN1_INT52 0x00100000 ///< Interrupt 52 enable +#define NVIC_EN1_INT51 0x00080000 ///< Interrupt 51 enable +#define NVIC_EN1_INT50 0x00040000 ///< Interrupt 50 enable +#define NVIC_EN1_INT49 0x00020000 ///< Interrupt 49 enable +#define NVIC_EN1_INT48 0x00010000 ///< Interrupt 48 enable +#define NVIC_EN1_INT47 0x00008000 ///< Interrupt 47 enable +#define NVIC_EN1_INT46 0x00004000 ///< Interrupt 46 enable +#define NVIC_EN1_INT45 0x00002000 ///< Interrupt 45 enable +#define NVIC_EN1_INT44 0x00001000 ///< Interrupt 44 enable +#define NVIC_EN1_INT43 0x00000800 ///< Interrupt 43 enable +#define NVIC_EN1_INT42 0x00000400 ///< Interrupt 42 enable +#define NVIC_EN1_INT41 0x00000200 ///< Interrupt 41 enable +#define NVIC_EN1_INT40 0x00000100 ///< Interrupt 40 enable +#define NVIC_EN1_INT39 0x00000080 ///< Interrupt 39 enable +#define NVIC_EN1_INT38 0x00000040 ///< Interrupt 38 enable +#define NVIC_EN1_INT37 0x00000020 ///< Interrupt 37 enable +#define NVIC_EN1_INT36 0x00000010 ///< Interrupt 36 enable +#define NVIC_EN1_INT35 0x00000008 ///< Interrupt 35 enable +#define NVIC_EN1_INT34 0x00000004 ///< Interrupt 34 enable +#define NVIC_EN1_INT33 0x00000002 ///< Interrupt 33 enable +#define NVIC_EN1_INT32 0x00000001 ///< Interrupt 32 enable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DIS0 register. + */ +/*\{*/ +#define NVIC_DIS0_INT31 0x80000000 ///< Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 ///< Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 ///< Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 ///< Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 ///< Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 ///< Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 ///< Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 ///< Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 ///< Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 ///< Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 ///< Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 ///< Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 ///< Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 ///< Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 ///< Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 ///< Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 ///< Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 ///< Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 ///< Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 ///< Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 ///< Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 ///< Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 ///< Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 ///< Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 ///< Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 ///< Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 ///< Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 ///< Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 ///< Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 ///< Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 ///< Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 ///< Interrupt 0 disable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DIS1 register. + */ +/*\{*/ +#define NVIC_DIS1_INT59 0x08000000 ///< Interrupt 59 disable +#define NVIC_DIS1_INT58 0x04000000 ///< Interrupt 58 disable +#define NVIC_DIS1_INT57 0x02000000 ///< Interrupt 57 disable +#define NVIC_DIS1_INT56 0x01000000 ///< Interrupt 56 disable +#define NVIC_DIS1_INT55 0x00800000 ///< Interrupt 55 disable +#define NVIC_DIS1_INT54 0x00400000 ///< Interrupt 54 disable +#define NVIC_DIS1_INT53 0x00200000 ///< Interrupt 53 disable +#define NVIC_DIS1_INT52 0x00100000 ///< Interrupt 52 disable +#define NVIC_DIS1_INT51 0x00080000 ///< Interrupt 51 disable +#define NVIC_DIS1_INT50 0x00040000 ///< Interrupt 50 disable +#define NVIC_DIS1_INT49 0x00020000 ///< Interrupt 49 disable +#define NVIC_DIS1_INT48 0x00010000 ///< Interrupt 48 disable +#define NVIC_DIS1_INT47 0x00008000 ///< Interrupt 47 disable +#define NVIC_DIS1_INT46 0x00004000 ///< Interrupt 46 disable +#define NVIC_DIS1_INT45 0x00002000 ///< Interrupt 45 disable +#define NVIC_DIS1_INT44 0x00001000 ///< Interrupt 44 disable +#define NVIC_DIS1_INT43 0x00000800 ///< Interrupt 43 disable +#define NVIC_DIS1_INT42 0x00000400 ///< Interrupt 42 disable +#define NVIC_DIS1_INT41 0x00000200 ///< Interrupt 41 disable +#define NVIC_DIS1_INT40 0x00000100 ///< Interrupt 40 disable +#define NVIC_DIS1_INT39 0x00000080 ///< Interrupt 39 disable +#define NVIC_DIS1_INT38 0x00000040 ///< Interrupt 38 disable +#define NVIC_DIS1_INT37 0x00000020 ///< Interrupt 37 disable +#define NVIC_DIS1_INT36 0x00000010 ///< Interrupt 36 disable +#define NVIC_DIS1_INT35 0x00000008 ///< Interrupt 35 disable +#define NVIC_DIS1_INT34 0x00000004 ///< Interrupt 34 disable +#define NVIC_DIS1_INT33 0x00000002 ///< Interrupt 33 disable +#define NVIC_DIS1_INT32 0x00000001 ///< Interrupt 32 disable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PEND0 register. + */ +/*\{*/ +#define NVIC_PEND0_INT31 0x80000000 ///< Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 ///< Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 ///< Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 ///< Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 ///< Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 ///< Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 ///< Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 ///< Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 ///< Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 ///< Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 ///< Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 ///< Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 ///< Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 ///< Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 ///< Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 ///< Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 ///< Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 ///< Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 ///< Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 ///< Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 ///< Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 ///< Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 ///< Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 ///< Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 ///< Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 ///< Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 ///< Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 ///< Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 ///< Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 ///< Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 ///< Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 ///< Interrupt 0 pend +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PEND1 register. + */ +/*\{*/ +#define NVIC_PEND1_INT59 0x08000000 ///< Interrupt 59 pend +#define NVIC_PEND1_INT58 0x04000000 ///< Interrupt 58 pend +#define NVIC_PEND1_INT57 0x02000000 ///< Interrupt 57 pend +#define NVIC_PEND1_INT56 0x01000000 ///< Interrupt 56 pend +#define NVIC_PEND1_INT55 0x00800000 ///< Interrupt 55 pend +#define NVIC_PEND1_INT54 0x00400000 ///< Interrupt 54 pend +#define NVIC_PEND1_INT53 0x00200000 ///< Interrupt 53 pend +#define NVIC_PEND1_INT52 0x00100000 ///< Interrupt 52 pend +#define NVIC_PEND1_INT51 0x00080000 ///< Interrupt 51 pend +#define NVIC_PEND1_INT50 0x00040000 ///< Interrupt 50 pend +#define NVIC_PEND1_INT49 0x00020000 ///< Interrupt 49 pend +#define NVIC_PEND1_INT48 0x00010000 ///< Interrupt 48 pend +#define NVIC_PEND1_INT47 0x00008000 ///< Interrupt 47 pend +#define NVIC_PEND1_INT46 0x00004000 ///< Interrupt 46 pend +#define NVIC_PEND1_INT45 0x00002000 ///< Interrupt 45 pend +#define NVIC_PEND1_INT44 0x00001000 ///< Interrupt 44 pend +#define NVIC_PEND1_INT43 0x00000800 ///< Interrupt 43 pend +#define NVIC_PEND1_INT42 0x00000400 ///< Interrupt 42 pend +#define NVIC_PEND1_INT41 0x00000200 ///< Interrupt 41 pend +#define NVIC_PEND1_INT40 0x00000100 ///< Interrupt 40 pend +#define NVIC_PEND1_INT39 0x00000080 ///< Interrupt 39 pend +#define NVIC_PEND1_INT38 0x00000040 ///< Interrupt 38 pend +#define NVIC_PEND1_INT37 0x00000020 ///< Interrupt 37 pend +#define NVIC_PEND1_INT36 0x00000010 ///< Interrupt 36 pend +#define NVIC_PEND1_INT35 0x00000008 ///< Interrupt 35 pend +#define NVIC_PEND1_INT34 0x00000004 ///< Interrupt 34 pend +#define NVIC_PEND1_INT33 0x00000002 ///< Interrupt 33 pend +#define NVIC_PEND1_INT32 0x00000001 ///< Interrupt 32 pend +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_UNPEND0 register. + */ +/*\{*/ +#define NVIC_UNPEND0_INT31 0x80000000 ///< Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 ///< Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 ///< Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 ///< Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 ///< Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 ///< Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 ///< Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 ///< Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 ///< Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 ///< Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 ///< Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 ///< Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 ///< Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 ///< Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 ///< Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 ///< Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 ///< Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 ///< Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 ///< Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 ///< Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 ///< Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 ///< Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 ///< Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 ///< Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 ///< Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 ///< Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 ///< Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 ///< Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 ///< Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 ///< Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 ///< Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 ///< Interrupt 0 unpend +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_UNPEND1 register. + */ +/*\{*/ +#define NVIC_UNPEND1_INT59 0x08000000 ///< Interrupt 59 unpend +#define NVIC_UNPEND1_INT58 0x04000000 ///< Interrupt 58 unpend +#define NVIC_UNPEND1_INT57 0x02000000 ///< Interrupt 57 unpend +#define NVIC_UNPEND1_INT56 0x01000000 ///< Interrupt 56 unpend +#define NVIC_UNPEND1_INT55 0x00800000 ///< Interrupt 55 unpend +#define NVIC_UNPEND1_INT54 0x00400000 ///< Interrupt 54 unpend +#define NVIC_UNPEND1_INT53 0x00200000 ///< Interrupt 53 unpend +#define NVIC_UNPEND1_INT52 0x00100000 ///< Interrupt 52 unpend +#define NVIC_UNPEND1_INT51 0x00080000 ///< Interrupt 51 unpend +#define NVIC_UNPEND1_INT50 0x00040000 ///< Interrupt 50 unpend +#define NVIC_UNPEND1_INT49 0x00020000 ///< Interrupt 49 unpend +#define NVIC_UNPEND1_INT48 0x00010000 ///< Interrupt 48 unpend +#define NVIC_UNPEND1_INT47 0x00008000 ///< Interrupt 47 unpend +#define NVIC_UNPEND1_INT46 0x00004000 ///< Interrupt 46 unpend +#define NVIC_UNPEND1_INT45 0x00002000 ///< Interrupt 45 unpend +#define NVIC_UNPEND1_INT44 0x00001000 ///< Interrupt 44 unpend +#define NVIC_UNPEND1_INT43 0x00000800 ///< Interrupt 43 unpend +#define NVIC_UNPEND1_INT42 0x00000400 ///< Interrupt 42 unpend +#define NVIC_UNPEND1_INT41 0x00000200 ///< Interrupt 41 unpend +#define NVIC_UNPEND1_INT40 0x00000100 ///< Interrupt 40 unpend +#define NVIC_UNPEND1_INT39 0x00000080 ///< Interrupt 39 unpend +#define NVIC_UNPEND1_INT38 0x00000040 ///< Interrupt 38 unpend +#define NVIC_UNPEND1_INT37 0x00000020 ///< Interrupt 37 unpend +#define NVIC_UNPEND1_INT36 0x00000010 ///< Interrupt 36 unpend +#define NVIC_UNPEND1_INT35 0x00000008 ///< Interrupt 35 unpend +#define NVIC_UNPEND1_INT34 0x00000004 ///< Interrupt 34 unpend +#define NVIC_UNPEND1_INT33 0x00000002 ///< Interrupt 33 unpend +#define NVIC_UNPEND1_INT32 0x00000001 ///< Interrupt 32 unpend +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ACTIVE0 register. + */ +/*\{*/ +#define NVIC_ACTIVE0_INT31 0x80000000 ///< Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 ///< Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 ///< Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 ///< Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 ///< Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 ///< Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 ///< Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 ///< Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 ///< Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 ///< Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 ///< Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 ///< Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 ///< Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 ///< Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 ///< Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 ///< Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 ///< Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 ///< Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 ///< Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 ///< Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 ///< Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 ///< Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 ///< Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 ///< Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 ///< Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 ///< Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 ///< Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 ///< Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 ///< Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 ///< Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 ///< Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 ///< Interrupt 0 active +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_ACTIVE1 register. + */ +/*\{*/ +#define NVIC_ACTIVE1_INT59 0x08000000 ///< Interrupt 59 active +#define NVIC_ACTIVE1_INT58 0x04000000 ///< Interrupt 58 active +#define NVIC_ACTIVE1_INT57 0x02000000 ///< Interrupt 57 active +#define NVIC_ACTIVE1_INT56 0x01000000 ///< Interrupt 56 active +#define NVIC_ACTIVE1_INT55 0x00800000 ///< Interrupt 55 active +#define NVIC_ACTIVE1_INT54 0x00400000 ///< Interrupt 54 active +#define NVIC_ACTIVE1_INT53 0x00200000 ///< Interrupt 53 active +#define NVIC_ACTIVE1_INT52 0x00100000 ///< Interrupt 52 active +#define NVIC_ACTIVE1_INT51 0x00080000 ///< Interrupt 51 active +#define NVIC_ACTIVE1_INT50 0x00040000 ///< Interrupt 50 active +#define NVIC_ACTIVE1_INT49 0x00020000 ///< Interrupt 49 active +#define NVIC_ACTIVE1_INT48 0x00010000 ///< Interrupt 48 active +#define NVIC_ACTIVE1_INT47 0x00008000 ///< Interrupt 47 active +#define NVIC_ACTIVE1_INT46 0x00004000 ///< Interrupt 46 active +#define NVIC_ACTIVE1_INT45 0x00002000 ///< Interrupt 45 active +#define NVIC_ACTIVE1_INT44 0x00001000 ///< Interrupt 44 active +#define NVIC_ACTIVE1_INT43 0x00000800 ///< Interrupt 43 active +#define NVIC_ACTIVE1_INT42 0x00000400 ///< Interrupt 42 active +#define NVIC_ACTIVE1_INT41 0x00000200 ///< Interrupt 41 active +#define NVIC_ACTIVE1_INT40 0x00000100 ///< Interrupt 40 active +#define NVIC_ACTIVE1_INT39 0x00000080 ///< Interrupt 39 active +#define NVIC_ACTIVE1_INT38 0x00000040 ///< Interrupt 38 active +#define NVIC_ACTIVE1_INT37 0x00000020 ///< Interrupt 37 active +#define NVIC_ACTIVE1_INT36 0x00000010 ///< Interrupt 36 active +#define NVIC_ACTIVE1_INT35 0x00000008 ///< Interrupt 35 active +#define NVIC_ACTIVE1_INT34 0x00000004 ///< Interrupt 34 active +#define NVIC_ACTIVE1_INT33 0x00000002 ///< Interrupt 33 active +#define NVIC_ACTIVE1_INT32 0x00000001 ///< Interrupt 32 active +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI0 register. + */ +/*\{*/ +#define NVIC_PRI0_INT3_M 0xFF000000 ///< Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 ///< Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 ///< Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF ///< Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI1 register. + */ +/*\{*/ +#define NVIC_PRI1_INT7_M 0xFF000000 ///< Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 ///< Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 ///< Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF ///< Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI2 register. + */ +/*\{*/ +#define NVIC_PRI2_INT11_M 0xFF000000 ///< Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 ///< Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 ///< Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF ///< Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI3 register. + */ +/*\{*/ +#define NVIC_PRI3_INT15_M 0xFF000000 ///< Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 ///< Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 ///< Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF ///< Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI4 register. + */ +/*\{*/ +#define NVIC_PRI4_INT19_M 0xFF000000 ///< Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 ///< Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 ///< Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF ///< Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI5 register. + */ +/*\{*/ +#define NVIC_PRI5_INT23_M 0xFF000000 ///< Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 ///< Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 ///< Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF ///< Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI6 register. + */ +/*\{*/ +#define NVIC_PRI6_INT27_M 0xFF000000 ///< Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 ///< Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 ///< Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF ///< Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI7 register. + */ +/*\{*/ +#define NVIC_PRI7_INT31_M 0xFF000000 ///< Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 ///< Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 ///< Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF ///< Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI8 register. + */ +/*\{*/ +#define NVIC_PRI8_INT35_M 0xFF000000 ///< Interrupt 35 priority mask +#define NVIC_PRI8_INT34_M 0x00FF0000 ///< Interrupt 34 priority mask +#define NVIC_PRI8_INT33_M 0x0000FF00 ///< Interrupt 33 priority mask +#define NVIC_PRI8_INT32_M 0x000000FF ///< Interrupt 32 priority mask +#define NVIC_PRI8_INT35_S 24 +#define NVIC_PRI8_INT34_S 16 +#define NVIC_PRI8_INT33_S 8 +#define NVIC_PRI8_INT32_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI9 register. + */ +/*\{*/ +#define NVIC_PRI9_INT39_M 0xFF000000 ///< Interrupt 39 priority mask +#define NVIC_PRI9_INT38_M 0x00FF0000 ///< Interrupt 38 priority mask +#define NVIC_PRI9_INT37_M 0x0000FF00 ///< Interrupt 37 priority mask +#define NVIC_PRI9_INT36_M 0x000000FF ///< Interrupt 36 priority mask +#define NVIC_PRI9_INT39_S 24 +#define NVIC_PRI9_INT38_S 16 +#define NVIC_PRI9_INT37_S 8 +#define NVIC_PRI9_INT36_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_PRI10 register. + */ +/*\{*/ +#define NVIC_PRI10_INT43_M 0xFF000000 ///< Interrupt 43 priority mask +#define NVIC_PRI10_INT42_M 0x00FF0000 ///< Interrupt 42 priority mask +#define NVIC_PRI10_INT41_M 0x0000FF00 ///< Interrupt 41 priority mask +#define NVIC_PRI10_INT40_M 0x000000FF ///< Interrupt 40 priority mask +#define NVIC_PRI10_INT43_S 24 +#define NVIC_PRI10_INT42_S 16 +#define NVIC_PRI10_INT41_S 8 +#define NVIC_PRI10_INT40_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_CPUID register. + */ +/*\{*/ +#define NVIC_CPUID_IMP_M 0xFF000000 ///< Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 ///< Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 ///< Processor part number +#define NVIC_CPUID_REV_M 0x0000000F ///< Revision +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_INT_CTRL register. + */ +/*\{*/ +#define NVIC_INT_CTRL_NMI_SET 0x80000000 ///< Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 ///< Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 ///< Unpend a PendSV +#define NVIC_INT_CTRL_PENDSTSET 0x04000000 ///< Set pending SysTick interrupt +#define NVIC_INT_CTRL_PENDSTCLR 0x02000000 ///< Clear pending SysTick interrupt +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 ///< Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 ///< Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 ///< Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 ///< Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF ///< Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_VTABLE register. + */ +/*\{*/ +#define NVIC_VTABLE_BASE 0x20000000 ///< Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 ///< Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_APINT register. + */ +/*\{*/ +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 ///< Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 ///< Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 ///< Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 ///< Priority group +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 ///< Priority group 0.8 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 ///< Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 ///< Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 ///< Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 ///< Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 ///< Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 ///< Priority group 6.2 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 ///< System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 ///< Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 ///< System reset +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 ///< Priority group 7.1 split +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_CTRL register. + */ +/*\{*/ +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 ///< Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 ///< Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 ///< Sleep on ISR exit +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_CFG_CTRL register. + */ +/*\{*/ +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 ///< Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 ///< Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 ///< Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 ///< Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 ///< Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 ///< Thread state control +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_PRI1 register. + */ +/*\{*/ +#define NVIC_SYS_PRI1_RES_M 0xFF000000 ///< Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 ///< Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 ///< Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF ///< Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_PRI2 register. + */ +/*\{*/ +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 ///< Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF ///< Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_PRI3 register. + */ +/*\{*/ +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 ///< Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 ///< Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 ///< Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF ///< Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SYS_HND_CTRL +* register. + */ +/*\{*/ +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 ///< Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 ///< Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 ///< Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 ///< SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 ///< Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 ///< Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 ///< PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 ///< Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 ///< SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 ///< Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 ///< Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 ///< Mem manage is active +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_FAULT_STAT +* register. + */ +/*\{*/ +#define NVIC_FAULT_STAT_DIV0 0x02000000 ///< Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 ///< Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 ///< No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 ///< Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 ///< Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 ///< Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 ///< BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 ///< Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 ///< Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 ///< Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 ///< Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 ///< Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 ///< MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 ///< Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 ///< Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 ///< Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 ///< Instruction access violation +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_HFAULT_STAT +* register. + */ +/*\{*/ +#define NVIC_HFAULT_STAT_DBG 0x80000000 ///< Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 ///< Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 ///< Vector table read fault +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DEBUG_STAT +* register. + */ +/*\{*/ +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 ///< EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 ///< Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 ///< DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 ///< Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 ///< Halt request +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MM_ADDR register. + */ +/*\{*/ +#define NVIC_MM_ADDR_M 0xFFFFFFFF ///< Data fault address +#define NVIC_MM_ADDR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_FAULT_ADDR +* register. + */ +/*\{*/ +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF ///< Data bus fault address +#define NVIC_FAULT_ADDR_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_TYPE register. + */ +/*\{*/ +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 ///< Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 ///< Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 ///< Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_CTRL register. + */ +/*\{*/ +#define NVIC_MPU_CTRL_PRIVDEFEN 0x00000004 ///< MPU default region in priv mode +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 ///< MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 ///< MPU enable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_NUMBER +* register. + */ +/*\{*/ +#define NVIC_MPU_NUMBER_M 0x000000FF ///< MPU region to access +#define NVIC_MPU_NUMBER_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_BASE register. + */ +/*\{*/ +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFFE0 ///< Base address mask +#define NVIC_MPU_BASE_VALID 0x00000010 ///< Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F ///< Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_MPU_ATTR register. + */ +/*\{*/ +#define NVIC_MPU_ATTR_M 0xFFFF0000 ///< Attributes +#define NVIC_MPU_ATTR_AP_NO_NO 0x00000000 ///< prv: no access, usr: no access +#define NVIC_MPU_ATTR_BUFFRABLE 0x00010000 ///< Bufferable +#define NVIC_MPU_ATTR_CACHEABLE 0x00020000 ///< Cacheable +#define NVIC_MPU_ATTR_SHAREABLE 0x00040000 ///< Shareable +#define NVIC_MPU_ATTR_TEX_M 0x00380000 ///< Type extension mask +#define NVIC_MPU_ATTR_AP_RW_NO 0x01000000 ///< prv: rw, usr: none +#define NVIC_MPU_ATTR_AP_RW_RO 0x02000000 ///< prv: rw, usr: read-only +#define NVIC_MPU_ATTR_AP_RW_RW 0x03000000 ///< prv: rw, usr: rw +#define NVIC_MPU_ATTR_AP_RO_NO 0x05000000 ///< prv: ro, usr: none +#define NVIC_MPU_ATTR_AP_RO_RO 0x06000000 ///< prv: ro, usr: ro +#define NVIC_MPU_ATTR_AP_M 0x07000000 ///< Access permissions mask +#define NVIC_MPU_ATTR_XN 0x10000000 ///< Execute disable +#define NVIC_MPU_ATTR_SRD_M 0x0000FF00 ///< Sub-region disable mask +#define NVIC_MPU_ATTR_SRD_0 0x00000100 ///< Sub-region 0 disable +#define NVIC_MPU_ATTR_SRD_1 0x00000200 ///< Sub-region 1 disable +#define NVIC_MPU_ATTR_SRD_2 0x00000400 ///< Sub-region 2 disable +#define NVIC_MPU_ATTR_SRD_3 0x00000800 ///< Sub-region 3 disable +#define NVIC_MPU_ATTR_SRD_4 0x00001000 ///< Sub-region 4 disable +#define NVIC_MPU_ATTR_SRD_5 0x00002000 ///< Sub-region 5 disable +#define NVIC_MPU_ATTR_SRD_6 0x00004000 ///< Sub-region 6 disable +#define NVIC_MPU_ATTR_SRD_7 0x00008000 ///< Sub-region 7 disable +#define NVIC_MPU_ATTR_SIZE_M 0x0000003E ///< Region size mask +#define NVIC_MPU_ATTR_SIZE_32B 0x00000008 ///< Region size 32 bytes +#define NVIC_MPU_ATTR_SIZE_64B 0x0000000A ///< Region size 64 bytes +#define NVIC_MPU_ATTR_SIZE_128B 0x0000000C ///< Region size 128 bytes +#define NVIC_MPU_ATTR_SIZE_256B 0x0000000E ///< Region size 256 bytes +#define NVIC_MPU_ATTR_SIZE_512B 0x00000010 ///< Region size 512 bytes +#define NVIC_MPU_ATTR_SIZE_1K 0x00000012 ///< Region size 1 Kbytes +#define NVIC_MPU_ATTR_SIZE_2K 0x00000014 ///< Region size 2 Kbytes +#define NVIC_MPU_ATTR_SIZE_4K 0x00000016 ///< Region size 4 Kbytes +#define NVIC_MPU_ATTR_SIZE_8K 0x00000018 ///< Region size 8 Kbytes +#define NVIC_MPU_ATTR_SIZE_16K 0x0000001A ///< Region size 16 Kbytes +#define NVIC_MPU_ATTR_SIZE_32K 0x0000001C ///< Region size 32 Kbytes +#define NVIC_MPU_ATTR_SIZE_64K 0x0000001E ///< Region size 64 Kbytes +#define NVIC_MPU_ATTR_SIZE_128K 0x00000020 ///< Region size 128 Kbytes +#define NVIC_MPU_ATTR_SIZE_256K 0x00000022 ///< Region size 256 Kbytes +#define NVIC_MPU_ATTR_SIZE_512K 0x00000024 ///< Region size 512 Kbytes +#define NVIC_MPU_ATTR_SIZE_1M 0x00000026 ///< Region size 1 Mbytes +#define NVIC_MPU_ATTR_SIZE_2M 0x00000028 ///< Region size 2 Mbytes +#define NVIC_MPU_ATTR_SIZE_4M 0x0000002A ///< Region size 4 Mbytes +#define NVIC_MPU_ATTR_SIZE_8M 0x0000002C ///< Region size 8 Mbytes +#define NVIC_MPU_ATTR_SIZE_16M 0x0000002E ///< Region size 16 Mbytes +#define NVIC_MPU_ATTR_SIZE_32M 0x00000030 ///< Region size 32 Mbytes +#define NVIC_MPU_ATTR_SIZE_64M 0x00000032 ///< Region size 64 Mbytes +#define NVIC_MPU_ATTR_SIZE_128M 0x00000034 ///< Region size 128 Mbytes +#define NVIC_MPU_ATTR_SIZE_256M 0x00000036 ///< Region size 256 Mbytes +#define NVIC_MPU_ATTR_SIZE_512M 0x00000038 ///< Region size 512 Mbytes +#define NVIC_MPU_ATTR_SIZE_1G 0x0000003A ///< Region size 1 Gbytes +#define NVIC_MPU_ATTR_SIZE_2G 0x0000003C ///< Region size 2 Gbytes +#define NVIC_MPU_ATTR_SIZE_4G 0x0000003E ///< Region size 4 Gbytes +#define NVIC_MPU_ATTR_ENABLE 0x00000001 ///< Region enable +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DBG_CTRL register. + */ +/*\{*/ +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 ///< Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 ///< Debug key +#define NVIC_DBG_CTRL_S_RESET_ST \ + 0x02000000 ///< Core has reset since last read +#define NVIC_DBG_CTRL_S_RETIRE_ST \ + 0x01000000 ///< Core has executed insruction + ///< since last read +#define NVIC_DBG_CTRL_S_LOCKUP 0x00080000 ///< Core is locked up +#define NVIC_DBG_CTRL_S_SLEEP 0x00040000 ///< Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00020000 ///< Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00010000 ///< Register read/write available +#define NVIC_DBG_CTRL_C_SNAPSTALL \ + 0x00000020 ///< Breaks a stalled load/store +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 ///< Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 ///< Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 ///< Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 ///< Enable debug +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DBG_XFER register. + */ +/*\{*/ +#define NVIC_DBG_XFER_REG_WNR 0x00010000 ///< Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F ///< Register +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 ///< Control/Fault/BasePri/PriMask +#define NVIC_DBG_XFER_REG_DSP 0x00000013 ///< Deep SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 ///< Process SP +#define NVIC_DBG_XFER_REG_MSP 0x00000011 ///< Main SP +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 ///< xPSR/Flags register +#define NVIC_DBG_XFER_REG_R15 0x0000000F ///< Register R15 +#define NVIC_DBG_XFER_REG_R14 0x0000000E ///< Register R14 +#define NVIC_DBG_XFER_REG_R13 0x0000000D ///< Register R13 +#define NVIC_DBG_XFER_REG_R12 0x0000000C ///< Register R12 +#define NVIC_DBG_XFER_REG_R11 0x0000000B ///< Register R11 +#define NVIC_DBG_XFER_REG_R10 0x0000000A ///< Register R10 +#define NVIC_DBG_XFER_REG_R9 0x00000009 ///< Register R9 +#define NVIC_DBG_XFER_REG_R8 0x00000008 ///< Register R8 +#define NVIC_DBG_XFER_REG_R7 0x00000007 ///< Register R7 +#define NVIC_DBG_XFER_REG_R6 0x00000006 ///< Register R6 +#define NVIC_DBG_XFER_REG_R5 0x00000005 ///< Register R5 +#define NVIC_DBG_XFER_REG_R4 0x00000004 ///< Register R4 +#define NVIC_DBG_XFER_REG_R3 0x00000003 ///< Register R3 +#define NVIC_DBG_XFER_REG_R2 0x00000002 ///< Register R2 +#define NVIC_DBG_XFER_REG_R1 0x00000001 ///< Register R1 +#define NVIC_DBG_XFER_REG_R0 0x00000000 ///< Register R0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DBG_DATA register. + */ +/*\{*/ +#define NVIC_DBG_DATA_M 0xFFFFFFFF ///< Data temporary cache +#define NVIC_DBG_DATA_S 0 +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_DBG_INT register. + */ +/*\{*/ +#define NVIC_DBG_INT_HARDERR 0x00000400 ///< Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 ///< Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 ///< Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 ///< Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 ///< Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 ///< Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 ///< Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 ///< Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 ///< Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 ///< Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 ///< Reset vector catch +/*\}*/ + +/** + * The following are defines for the bit fields in the NVIC_SW_TRIG register. + */ +/*\{*/ +#define NVIC_SW_TRIG_INTID_M 0x000003FF ///< Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 +/*\}*/ + +#endif /* STM32_H */ diff --git a/2.5/bertos/cpu/cortex-m3/io/stm32_memmap.h b/2.5/bertos/cpu/cortex-m3/io/stm32_memmap.h new file mode 100644 index 00000000..a99577a1 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/io/stm32_memmap.h @@ -0,0 +1,102 @@ +/** + * \file + * + * + * \brief STM32 memory map. + */ + +#ifndef STM32_MEMMAP_H +#define STM32_MEMMAP_H + +/* Peripheral and SRAM base address in the alias region */ +#define PERIPH_BB_BASE (0x42000000) +#define SRAM_BB_BASE (0x22000000) + +/* Peripheral and SRAM base address in the bit-band region */ +#define SRAM_BASE (0x20000000) +#define PERIPH_BASE (0x40000000) + +/* Flash refisters base address */ +#define FLASH_BASE (0x40022000) +/* Flash Option Bytes base address */ +#define OB_BASE (0x1FFFF800) + +/* Peripheral memory map */ +#define APB1PERIPH_BASE (PERIPH_BASE) +#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) + +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) +#define CAN_BASE (APB1PERIPH_BASE + 0x6400) +#define BKP_BASE (APB1PERIPH_BASE + 0x6C00) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000) + +#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) +#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) +#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) +#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) +#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) +#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) +#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2800) +#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) +#define USART1_BASE (APB2PERIPH_BASE + 0x3800) + +#define DMA_BASE (AHBPERIPH_BASE + 0x0000) +#define DMA_CHANNEL1_BASE (AHBPERIPH_BASE + 0x0008) +#define DMA_CHANNEL2_BASE (AHBPERIPH_BASE + 0x001C) +#define DMA_CHANNEL3_BASE (AHBPERIPH_BASE + 0x0030) +#define DMA_CHANNEL4_BASE (AHBPERIPH_BASE + 0x0044) +#define DMA_CHANNEL5_BASE (AHBPERIPH_BASE + 0x0058) +#define DMA_CHANNEL6_BASE (AHBPERIPH_BASE + 0x006C) +#define DMA_CHANNEL7_BASE (AHBPERIPH_BASE + 0x0080) +#define RCC_BASE (AHBPERIPH_BASE + 0x1000) + +/* System Control Space memory map */ +#define SCS_BASE (0xE000E000) + +#define SYSTICK_BASE (SCS_BASE + 0x0010) +#define NVIC_BASE (SCS_BASE + 0x0100) +#define SCB_BASE (SCS_BASE + 0x0D00) + +#endif /* STM32_MEMMAP_H */ diff --git a/2.5/bertos/cpu/cortex-m3/scripts/lm3s1968_ram.ld b/2.5/bertos/cpu/cortex-m3/scripts/lm3s1968_ram.ld new file mode 100644 index 00000000..2bd20d96 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/scripts/lm3s1968_ram.ld @@ -0,0 +1,143 @@ +/** + * \file + * + * + * \author Manuele Fanelli + * + * \brief Script for Luminary Micro LM3S1968 Cortex M3 family processors. + * + */ + + +SEARCH_DIR(.) +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* + * Define memory configuration for LM3S1968 board + */ +MEMORY +{ + rom(rx) : org = 0x00000000, len = 256k + ram(rwx) : org = 0x20000000, len = 64k +} + + +/* + * Define stack size here + */ +FIQ_STACK_SIZE = 0x0100; +IRQ_STACK_SIZE = 0x0100; +ABT_STACK_SIZE = 0x0100; +UND_STACK_SIZE = 0x0100; +SVC_STACK_SIZE = 0x0400; + +/* + * Allocate section memory + */ +SECTIONS +{ + .text : + { + KEEP(*(.vectors)); + . = ALIGN (4); + KEEP(*(.init)); + . = ALIGN (4); + *(.rodata .rodata.*); + . = ALIGN (4); + *(.text .text.*); + . = ALIGN (4); + *(.glue_7t); + . = ALIGN(4); + *(.glue_7); + . = ALIGN(4); + } > ram + + _etext = .; + PROVIDE (__etext = .); + + .data : AT (_etext) + { + PROVIDE (__data_start = .); + *(vtable) + . = ALIGN (0x400); + *(.data .data.*) + . = ALIGN (4); + _edata = .; + PROVIDE (__data_end = .); + } > ram + + .bss : + { + PROVIDE (__bss_start = .); + *(.bss .bss.*) + . = ALIGN(4); + *(COMMON) + . = ALIGN(4); + PROVIDE (__bss_end = .); + } > ram + + /* + * Allocated stack at the end of bss section. + * Data heap is allocate at end of stack. + */ + PROVIDE (__stack_start = .); + + PROVIDE (__stack_fiq_start = .); + . += FIQ_STACK_SIZE; + . = ALIGN(4); + PROVIDE (__stack_fiq_end = .); + + PROVIDE (__stack_irq_start = .); + . += IRQ_STACK_SIZE; + . = ALIGN(4); + PROVIDE (__stack_irq_end = .); + + PROVIDE (__stack_abt_start = .); + . += ABT_STACK_SIZE; + . = ALIGN(4); + PROVIDE (__stack_abt_end = .); + + PROVIDE (__stack_und_start = .); + . += UND_STACK_SIZE; + . = ALIGN(4); + PROVIDE (__stack_und_end = .); + + PROVIDE (__stack_svc_start = .); + . += SVC_STACK_SIZE; + . = ALIGN(4); + PROVIDE (__stack_svc_end = .); + + PROVIDE (__stack_end = .); + + PROVIDE (__heap_start = .); +} + diff --git a/2.5/bertos/cpu/cortex-m3/scripts/lm3s1968_rom.ld b/2.5/bertos/cpu/cortex-m3/scripts/lm3s1968_rom.ld new file mode 100644 index 00000000..b4ed93a3 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/scripts/lm3s1968_rom.ld @@ -0,0 +1,118 @@ +/** + * \file + * + * + * \author Manuele Fanelli + * + * \brief Script for Luminary Micro LM3S1968 Cortex M3 family processors. + * + */ + +SEARCH_DIR(.) +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* + * Define memory configuration for LM3S1968 board + */ +MEMORY +{ + rom(rx) : org = 0x00000000, len = 256k + ram(rwx) : org = 0x20000000, len = 64k +} + +/* + * Define stack size here + */ +STACK_SIZE = 0x1000; + +/* + * Allocate section memory + */ +SECTIONS +{ + .text : + { + KEEP(*(.vectors)); + . = ALIGN (4); + KEEP(*(.init)); + . = ALIGN (4); + *(.rodata .rodata.*); + . = ALIGN (4); + *(.text .text.*); + . = ALIGN (4); + *(.glue_7t); + . = ALIGN(4); + *(.glue_7); + . = ALIGN(4); + } > rom + + __text_end = .; + PROVIDE (__text_end = .); + + .data : AT (__text_end) + { + . = ALIGN (0x400); + PROVIDE (__data_start = .); + *(vtable) + *(.data .data.*) + . = ALIGN (4); + _edata = .; + PROVIDE (__data_end = .); + } > ram + + .bss : + { + PROVIDE (__bss_start = .); + *(.bss .bss.*) + . = ALIGN(4); + *(COMMON) + . = ALIGN(4); + PROVIDE (__bss_end = .); + } > ram + + /* + * Allocated stack at the end of bss section. + * Data heap is allocate at end of stack. + */ + PROVIDE (__msp_start = .); + . = ALIGN(8); + . += STACK_SIZE; + PROVIDE (__msp_end = .); + + PROVIDE (__psp_start = .); + . = ALIGN(8); + . += STACK_SIZE; + PROVIDE (__psp_end = .); + + PROVIDE (__heap_start = .); + . = ALIGN(8); +} diff --git a/2.5/bertos/cpu/cortex-m3/scripts/lm3s8962_ram.ld b/2.5/bertos/cpu/cortex-m3/scripts/lm3s8962_ram.ld new file mode 100644 index 00000000..87d9a309 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/scripts/lm3s8962_ram.ld @@ -0,0 +1,38 @@ +/** + * \file + * + * + * \brief Script for Luminary Micro LM3S8968 Cortex M3 family processors. + * + * \author Andrea Righi + */ + +INCLUDE bertos/cpu/cortex-m3/scripts/lm3s1968_ram.ld diff --git a/2.5/bertos/cpu/cortex-m3/scripts/lm3s8962_rom.ld b/2.5/bertos/cpu/cortex-m3/scripts/lm3s8962_rom.ld new file mode 100644 index 00000000..03a497f7 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/scripts/lm3s8962_rom.ld @@ -0,0 +1,38 @@ +/** + * \file + * + * + * \brief Script for Luminary Micro LM3S8962 Cortex M3 family processors. + * + * \author Andrea Righi + */ + +INCLUDE bertos/cpu/cortex-m3/scripts/lm3s1968_rom.ld diff --git a/2.5/bertos/cpu/cortex-m3/scripts/stm32f103rb_rom.ld b/2.5/bertos/cpu/cortex-m3/scripts/stm32f103rb_rom.ld new file mode 100644 index 00000000..522a8428 --- /dev/null +++ b/2.5/bertos/cpu/cortex-m3/scripts/stm32f103rb_rom.ld @@ -0,0 +1,118 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Script for Olimex STM32-P103 Cortex-M3 board. + * + */ + +SEARCH_DIR(.) +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +/* + * Define memory configuration for STM32F103R8 + */ +MEMORY +{ + rom(rx) : org = 0x00000000, len = 128k + ram(rwx) : org = 0x20000000, len = 20k +} + +/* + * Define stack size here + */ +STACK_SIZE = 0x1000; + +/* + * Allocate section memory + */ +SECTIONS +{ + .text : + { + KEEP(*(.vectors)); + . = ALIGN (4); + KEEP(*(.init)); + . = ALIGN (4); + *(.rodata .rodata.*); + . = ALIGN (4); + *(.text .text.*); + . = ALIGN (4); + *(.glue_7t); + . = ALIGN(4); + *(.glue_7); + . = ALIGN(4); + } > rom + + __text_end = .; + PROVIDE (__text_end = .); + + .data : AT (__text_end) + { + PROVIDE (__data_start = .); + . = ALIGN (0x400); + *(vtable) + *(.data .data.*) + . = ALIGN (4); + _edata = .; + PROVIDE (__data_end = .); + } > ram + + .bss : + { + PROVIDE (__bss_start = .); + *(.bss .bss.*) + . = ALIGN(4); + *(COMMON) + . = ALIGN(4); + PROVIDE (__bss_end = .); + } > ram + + /* + * Allocated stack at the end of bss section. + * Data heap is allocate at end of stack. + */ + PROVIDE (__msp_start = .); + . = ALIGN(8); + . += STACK_SIZE; + PROVIDE (__msp_end = .); + + PROVIDE (__psp_start = .); + . = ALIGN(8); + . += STACK_SIZE; + PROVIDE (__psp_end = .); + + PROVIDE (__heap_start = .); + . = ALIGN(8); +} diff --git a/2.5/bertos/cpu/detect.h b/2.5/bertos/cpu/detect.h new file mode 100644 index 00000000..33f6178c --- /dev/null +++ b/2.5/bertos/cpu/detect.h @@ -0,0 +1,369 @@ +/** + * \file + * + * + * \brief CPU detection through special preprocessor macros + */ +#ifndef CPU_DETECT_H +#define CPU_DETECT_H + +#if defined(__ARM_ARCH_4T__) /* GCC */ \ + || defined(__ARM4TM__) /* IAR: defined for all cores >= 4tm */ + #define CPU_ARM 1 + #define CPU_ID arm + + // AT91SAM7S core family + #if defined(__ARM_AT91SAM7S32__) + #define CPU_ARM_AT91 1 + #define CPU_ARM_AT91SAM7S32 1 + #else + #define CPU_ARM_AT91SAM7S32 0 + #endif + + #if defined(__ARM_AT91SAM7S64__) + #define CPU_ARM_AT91 1 + #define CPU_ARM_SAM7S_LARGE 1 + #define CPU_ARM_AT91SAM7S64 1 + #else + #define CPU_ARM_AT91SAM7S64 0 + #endif + + #if defined(__ARM_AT91SAM7S128__) + #define CPU_ARM_AT91 1 + #define CPU_ARM_SAM7S_LARGE 1 + #define CPU_ARM_AT91SAM7S128 1 + #else + #define CPU_ARM_AT91SAM7S128 0 + #endif + + #if defined(__ARM_AT91SAM7S256__) + #define CPU_ARM_AT91 1 + #define CPU_ARM_SAM7S_LARGE 1 + #define CPU_ARM_AT91SAM7S256 1 + #else + #define CPU_ARM_AT91SAM7S256 0 + #endif + + #if defined(__ARM_AT91SAM7S512__) + #define CPU_ARM_AT91 1 + #define CPU_ARM_SAM7S_LARGE 1 + #define CPU_ARM_AT91SAM7S512 1 + #else + #define CPU_ARM_AT91SAM7S512 0 + #endif + + // AT91SAM7X core family + #if defined(__ARM_AT91SAM7X128__) + #define CPU_ARM_AT91 1 + #define CPU_ARM_SAM7X 1 + #define CPU_ARM_AT91SAM7X128 1 + #else + #define CPU_ARM_AT91SAM7X128 0 + #endif + + #if defined(__ARM_AT91SAM7X256__) + #define CPU_ARM_AT91 1 + #define CPU_ARM_SAM7X 1 + #define CPU_ARM_AT91SAM7X256 1 + #else + #define CPU_ARM_AT91SAM7X256 0 + #endif + + + #if defined(__ARM_AT91SAM7X512__) + #define CPU_ARM_AT91 1 + #define CPU_ARM_SAM7X 1 + #define CPU_ARM_AT91SAM7X512 1 + #else + #define CPU_ARM_AT91SAM7X512 0 + #endif + + #if defined(__ARM_LPC2378__) + #define CPU_ARM_LPC2 1 + #define CPU_ARM_LPC2378 1 + #else + #define CPU_ARM_LPC2378 0 + #endif + + #if !defined(CPU_ARM_SAM7S_LARGE) + #define CPU_ARM_SAM7S_LARGE 0 + #endif + + #if !defined(CPU_ARM_SAM7X) + #define CPU_ARM_SAM7X 0 + #endif + + + #if defined(CPU_ARM_AT91) + #if CPU_ARM_AT91SAM7S32 + CPU_ARM_AT91SAM7S64 \ + + CPU_ARM_AT91SAM7S128 + CPU_ARM_AT91SAM7S256 \ + + CPU_ARM_AT91SAM7S512 \ + + CPU_ARM_AT91SAM7X128 + CPU_ARM_AT91SAM7X256 \ + + CPU_ARM_AT91SAM7X512 != 1 + #error ARM CPU configuration error + #endif + #define CPU_ARM_LPC2 0 + + #elif defined (CPU_ARM_LPC2) + + #if CPU_ARM_LPC2378 + 0 != 1 + #error NXP LPC2xxx ARM CPU configuration error + #endif + #define CPU_ARM_AT91 0 + /* #elif Add other ARM families here */ + #else + #define CPU_ARM_AT91 0 + #define CPU_ARM_LPC2 0 + #endif + + + #if CPU_ARM_AT91 + CPU_ARM_LPC2 + 0 /* Add other ARM families here */ != 1 + #error ARM CPU configuration error + #endif +#else + #define CPU_ARM 0 + + /* ARM Families */ + #define CPU_ARM_AT91 0 + #define CPU_ARM_LPC2 0 + + /* SAM7 sub-families */ + #define CPU_ARM_SAM7S_LARGE 0 + #define CPU_ARM_SAM7X 0 + + /* ARM CPUs */ + #define CPU_ARM_AT91SAM7S32 0 + #define CPU_ARM_AT91SAM7S64 0 + #define CPU_ARM_AT91SAM7S128 0 + #define CPU_ARM_AT91SAM7S256 0 + #define CPU_ARM_AT91SAM7S512 0 + #define CPU_ARM_AT91SAM7X128 0 + #define CPU_ARM_AT91SAM7X256 0 + #define CPU_ARM_AT91SAM7X512 0 + + #define CPU_ARM_LPC2378 0 +#endif + +#if defined(__ARM_ARCH_7M__) + /* Cortex-M3 */ + #define CPU_CM3 1 + #define CPU_ID cm3 + + #if defined (__ARM_LM3S1968__) + #define CPU_CM3_LM3S 1 + #define CPU_CM3_LM3S1968 1 + #else + #define CPU_CM3_LM3S1968 0 + #endif + + #if defined (__ARM_LM3S8962__) + #define CPU_CM3_LM3S 1 + #define CPU_CM3_LM3S8962 1 + #else + #define CPU_CM3_LM3S8962 0 + #endif + + #if defined (__ARM_STM32F103RB__) + #define CPU_CM3_STM32 1 + #define CPU_CM3_STM32F103RB 1 + #else + #define CPU_CM3_STM32F103RB 0 + #endif + + #if defined (CPU_CM3_LM3S) + #if CPU_CM3_LM3S1968 + CPU_CM3_LM3S8962 + 0 != 1 + #error Luminary Cortex-M3 CPU configuration error + #endif + #define CPU_CM3_STM32 0 + #elif defined (CPU_CM3_STM32) + #if CPU_CM3_STM32F103RB + 0 != 1 + #error STM32 Cortex-M3 CPU configuration error + #endif + #define CPU_CM3_LM3S 0 + /* #elif Add other Cortex-M3 families here */ + #else + #define CPU_CM3_LM3S 0 + #define CPU_CM3_STM32 0 + #endif + + + #if CPU_CM3_LM3S + CPU_CM3_STM32 + 0 /* Add other Cortex-M3 families here */ != 1 + #error Cortex-M3 CPU configuration error + #endif + +#else + #define CPU_CM3 0 + + #define CPU_CM3_LM3S 0 + + #define CPU_CM3_LM3S1968 0 + + #define CPU_CM3_LM3S8968 0 + + #define CPU_CM3_STM32 0 + + #define CPU_CM3_STM32F103RB 0 +#endif + +#if (defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)) \ + && !defined(__ARM4TM__) /* IAR: if not ARM assume I196 */ + #warning Assuming CPU is I196 + #define CPU_I196 1 + #define CPU_ID i196 +#else + #define CPU_I196 0 +#endif + +#if defined(__i386__) /* GCC */ \ + || (defined(_M_IX86) && !defined(_WIN64)) /* MSVC */ + #define CPU_X86 1 + #define CPU_X86_32 1 + #define CPU_X86_64 0 + #define CPU_ID x86 +#elif defined(__x86_64__) /* GCC */ \ + || (defined(_M_IX86) && defined(_WIN64)) /* MSVC */ + #define CPU_X86 1 + #define CPU_X86_32 0 + #define CPU_X86_64 1 + #define CPU_ID x86 +#else + #define CPU_X86 0 + #define CPU_I386 0 + #define CPU_X86_64 0 +#endif + +#if defined (_ARCH_PPC) || defined(_ARCH_PPC64) + #define CPU_PPC 1 + #define CPU_ID ppc + #if defined(_ARCH_PPC) + #define CPU_PPC32 1 + #else + #define CPU_PPC32 0 + #endif + #if defined(_ARCH_PPC64) + #define CPU_PPC64 1 + #else + #define CPU_PPC64 0 + #endif +#else + #define CPU_PPC 0 + #define CPU_PPC32 0 + #define CPU_PPC64 0 +#endif + +#if defined(__m56800E__) || defined(__m56800__) + #define CPU_DSP56K 1 + #define CPU_ID dsp56k +#else + #define CPU_DSP56K 0 +#endif + +#if defined (__AVR__) + #define CPU_AVR 1 + #define CPU_ID avr + + #if defined(__AVR_ATmega32__) + #define CPU_AVR_ATMEGA32 1 + #else + #define CPU_AVR_ATMEGA32 0 + #endif + + #if defined(__AVR_ATmega64__) + #define CPU_AVR_ATMEGA64 1 + #else + #define CPU_AVR_ATMEGA64 0 + #endif + + #if defined(__AVR_ATmega103__) + #define CPU_AVR_ATMEGA103 1 + #else + #define CPU_AVR_ATMEGA103 0 + #endif + + #if defined(__AVR_ATmega128__) + #define CPU_AVR_ATMEGA128 1 + #else + #define CPU_AVR_ATMEGA128 0 + #endif + + #if defined(__AVR_ATmega8__) + #define CPU_AVR_ATMEGA8 1 + #else + #define CPU_AVR_ATMEGA8 0 + #endif + + #if defined(__AVR_ATmega168__) + #define CPU_AVR_ATMEGA168 1 + #else + #define CPU_AVR_ATMEGA168 0 + #endif + + #if defined(__AVR_ATmega328P__) + #define CPU_AVR_ATMEGA328P 1 + #else + #define CPU_AVR_ATMEGA328P 0 + #endif + + #if defined(__AVR_ATmega1281__) + #define CPU_AVR_ATMEGA1281 1 + #else + #define CPU_AVR_ATMEGA1281 0 + #endif + + #if CPU_AVR_ATMEGA32 + CPU_AVR_ATMEGA64 + CPU_AVR_ATMEGA103 + CPU_AVR_ATMEGA128 \ + + CPU_AVR_ATMEGA8 + CPU_AVR_ATMEGA168 + CPU_AVR_ATMEGA328P + CPU_AVR_ATMEGA1281 != 1 + #error AVR CPU configuration error + #endif +#else + #define CPU_AVR 0 + #define CPU_AVR_ATMEGA8 0 + #define CPU_AVR_ATMEGA168 0 + #define CPU_AVR_ATMEGA328P 0 + #define CPU_AVR_ATMEGA32 0 + #define CPU_AVR_ATMEGA64 0 + #define CPU_AVR_ATMEGA103 0 + #define CPU_AVR_ATMEGA128 0 + #define CPU_AVR_ATMEGA1281 0 +#endif + + +/* Self-check for the detection: only one CPU must be detected */ +#if CPU_ARM + CPU_CM3 + CPU_I196 + CPU_X86 + CPU_PPC + CPU_DSP56K + CPU_AVR == 0 + #error Unknown CPU +#elif !defined(CPU_ID) + #error CPU_ID not defined +#elif CPU_ARM + CPU_CM3 + CPU_I196 + CPU_X86 + CPU_PPC + CPU_DSP56K + CPU_AVR != 1 + #error Internal CPU configuration error +#endif + + +#endif /* CPU_DETECT_H */ diff --git a/2.5/bertos/cpu/dsp56k/drv/buzzerled_dsp56k.h b/2.5/bertos/cpu/dsp56k/drv/buzzerled_dsp56k.h new file mode 100644 index 00000000..4eafa57b --- /dev/null +++ b/2.5/bertos/cpu/dsp56k/drv/buzzerled_dsp56k.h @@ -0,0 +1,178 @@ +/** + * \file + * + * + * \brief Hardware support for buzzers and leds in DSP56K-based boards + * + * \version $Id$ + * + * \author Giovanni Bajo + */ + +/*#* + *#* $Log$ + *#* Revision 1.7 2006/07/19 12:56:25 bernie + *#* Convert to new Doxygen style. + *#* + *#* Revision 1.6 2005/11/04 16:20:02 bernie + *#* Fix reference to README.devlib in header. + *#* + *#* Revision 1.5 2005/04/11 19:10:27 bernie + *#* Include top-level headers from cfg/ subdir. + *#* + *#* Revision 1.4 2004/11/16 21:54:43 bernie + *#* Changes for SC Monoboard support. + *#* + *#* Revision 1.3 2004/08/25 14:12:08 rasky + *#* Aggiornato il comment block dei log RCS + *#* + *#* Revision 1.2 2004/06/03 11:27:09 bernie + *#* Add dual-license information. + *#* + *#* Revision 1.1 2004/05/23 18:36:05 bernie + *#* Import buzzerled driver. + *#* + *#*/ + +#ifndef DRV_BUZZERLED_DSP56K_H +#define DRV_BUZZERLED_DSP56K_H + +#include +#include +#include "pwm.h" + +#if ARCH & ARCH_HECO + +/** + * \name Connection of the leds to the DSP: + *
+ *   Led       Line    DSP Pin
+ *   ---------------------------
+ *   YELLOW    T2      HOME1/TB3
+ *   GREEN     T3      INDX1/TB2
+ *   RED       T4      PHB1/TB1
+ * 
+ */ + +INLINE bool bld_is_inverted_intensity(enum BLD_DEVICE device) +{ + return (device == BLD_GREEN_LED + || device == BLD_YELLOW_LED + || device == BLD_RED_LED); +} + +INLINE bool bld_is_pwm(enum BLD_DEVICE device) +{ + // Only the buzzer is connected to a PWM + return (device == BLD_BUZZER || device == BLD_READY_LED); +} + +INLINE bool bld_is_timer(enum BLD_DEVICE device) +{ + // LEDs are connected to timers + return (device == BLD_GREEN_LED || device == BLD_YELLOW_LED || device == BLD_RED_LED); +} + +INLINE uint16_t bld_get_pwm(enum BLD_DEVICE device) +{ + switch (device) + { + default: ASSERT(0); + case BLD_BUZZER: return 5; // PWMA5 + case BLD_READY_LED: return 9; // PWMB3 + } +} + + +INLINE struct REG_TIMER_STRUCT* bld_get_timer(enum BLD_DEVICE device) +{ + switch (device) + { + default: ASSERT(0); + case BLD_GREEN_LED: return ®_TIMER_B[2]; + case BLD_RED_LED: return ®_TIMER_B[1]; + case BLD_YELLOW_LED: return ®_TIMER_B[3]; + } +} + +INLINE void bld_hw_init(void) +{ +} + +INLINE void bld_hw_set(enum BLD_DEVICE device, bool enable) +{ + if (bld_is_inverted_intensity(device)) + enable = !enable; + + // Handle a BLD connected to a PWM + if (bld_is_pwm(device)) + { + struct PWM* pwm = pwm_get_handle(bld_get_pwm(device)); + + pwm_set_enable(pwm, false); + pwm_set_dutycycle_percent(pwm, (enable ? 50 : 0)); + pwm_set_enable(pwm, true); + } + else if (bld_is_timer(device)) + { + struct REG_TIMER_STRUCT* timer = bld_get_timer(device); + + // Check that the timer is currently stopped, and the OFLAG is not + // controlled by another timer. Otherwise, the led is already + // controlled by the timer, and we cannot correctly set it + // on/off without reprogramming the timer. + ASSERT((timer->CTRL & REG_TIMER_CTRL_MODE_MASK) == REG_TIMER_CTRL_MODE_STOP); + ASSERT(!(timer->SCR & REG_TIMER_SCR_EEOF)); + + // Check also that polarity is correct + ASSERT(!(timer->SCR & REG_TIMER_SCR_OPS)); + + // Without programming the timer, we have a way to manually force a certain + // value on the external pin. We also need to enable the output pin. + timer->SCR &= ~REG_TIMER_SCR_VAL_1; + timer->SCR |= REG_TIMER_SCR_OEN | + REG_TIMER_SCR_FORCE | + (!enable ? REG_TIMER_SCR_VAL_0 : REG_TIMER_SCR_VAL_1); + } + else + ASSERT(0); +} + +#elif ARCH & ARCH_SC + +// We do not need inline functions here, because constant propagation is not big deal here +void bld_hw_init(void); +void bld_hw_set(enum BLD_DEVICE device, bool enable); + +#endif + +#endif /* DRV_BUZZERLED_DSP56K_H */ diff --git a/2.5/bertos/cpu/dsp56k/drv/kdebug_dsp56k.c b/2.5/bertos/cpu/dsp56k/drv/kdebug_dsp56k.c new file mode 100644 index 00000000..2510b6d5 --- /dev/null +++ b/2.5/bertos/cpu/dsp56k/drv/kdebug_dsp56k.c @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief General pourpose debug support for embedded systems (implementation). + * + * \version $Id$ + * \author Bernie Innocenti + * \author Stefano Fedrigo + */ + +#error Revise me! + +/* Debugging go through the JTAG interface. The MSL library already + implements the console I/O correctly. */ +#include +#define KDBG_WAIT_READY() do { } while (0) +#define KDBG_WRITE_CHAR(c) __put_char(c, stdout) +#define KDBG_MASK_IRQ(old) do { (void)(old); } while (0) +#define KDBG_RESTORE_IRQ(old) do { (void)(old); } while (0) +typedef uint8_t kdbg_irqsave_t; /* unused */ +#if CONFIG_KDEBUG_PORT == 666 + #error BITBANG debug console missing for this platform + +#define kdbg_hw_init() do {} while (0) ///< Not needed diff --git a/2.5/bertos/cpu/dsp56k/drv/ser_dsp56k.c b/2.5/bertos/cpu/dsp56k/drv/ser_dsp56k.c new file mode 100644 index 00000000..d69e0c57 --- /dev/null +++ b/2.5/bertos/cpu/dsp56k/drv/ser_dsp56k.c @@ -0,0 +1,367 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Stefano Fedrigo + * \author Giovanni Bajo + * + * \brief DSP5680x CPU specific serial I/O driver + */ + + +#include +#include +#include +#include +#include +#include + +// GPIO E is shared with SPI (in DSP56807). Pins 0&1 are TXD0 and RXD0. To use +// the serial, we need to disable the GPIO functions on them. +#define REG_GPIO_SERIAL_0 REG_GPIO_E +#define REG_GPIO_SERIAL_MASK_0 0x03 + +#define REG_GPIO_SERIAL_1 REG_GPIO_D +#define REG_GPIO_SERIAL_MASK_1 0xC0 + + +// Check flag consistency +#if (SERRF_PARITYERROR != REG_SCI_SR_PF) || \ + (SERRF_RXSROVERRUN != REG_SCI_SR_OR) || \ + (SERRF_FRAMEERROR != REG_SCI_SR_FE) || \ + (SERRF_NOISEERROR != REG_SCI_SR_NF) + #error error flags do not match with register bits +#endif + +static unsigned char ser0_fifo_rx[CONFIG_SER0_FIFOSIZE_RX]; +static unsigned char ser0_fifo_tx[CONFIG_SER0_FIFOSIZE_TX]; +static unsigned char ser1_fifo_rx[CONFIG_SER1_FIFOSIZE_RX]; +static unsigned char ser1_fifo_tx[CONFIG_SER1_FIFOSIZE_TX]; + +#if CONFIG_SER_MULTI + #include + + #define MAX_MULTI_GROUPS 1 + + struct Semaphore multi_sems[MAX_MULTI_GROUPS]; +#endif + + +struct SCI +{ + struct SerialHardware hw; + struct Serial* serial; + volatile struct REG_SCI_STRUCT* regs; + IRQ_VECTOR irq_tx; + IRQ_VECTOR irq_rx; + int num_group; + int id; +}; + +static inline void enable_tx_irq_bare(volatile struct REG_SCI_STRUCT* regs) +{ + regs->CR |= REG_SCI_CR_TEIE | REG_SCI_CR_TIIE; +} + +static inline void enable_rx_irq_bare(volatile struct REG_SCI_STRUCT* regs) +{ + regs->CR |= REG_SCI_CR_RIE; +} + +static inline void disable_tx_irq_bare(volatile struct REG_SCI_STRUCT* regs) +{ + regs->CR &= ~(REG_SCI_CR_TEIE | REG_SCI_CR_TIIE); +} + +static inline void disable_rx_irq_bare(volatile struct REG_SCI_STRUCT* regs) +{ + regs->CR &= ~(REG_SCI_CR_RIE | REG_SCI_CR_REIE); +} + +static inline void disable_tx_irq(struct SerialHardware* _hw) +{ + struct SCI* hw = (struct SCI*)_hw; + + disable_tx_irq_bare(hw->regs); +} + +static inline void disable_rx_irq(struct SerialHardware* _hw) +{ + struct SCI* hw = (struct SCI*)_hw; + + disable_rx_irq_bare(hw->regs); +} + +static inline void enable_tx_irq(struct SerialHardware* _hw) +{ + struct SCI* hw = (struct SCI*)_hw; + + enable_tx_irq_bare(hw->regs); +} + +static inline void enable_rx_irq(struct SerialHardware* _hw) +{ + struct SCI* hw = (struct SCI*)_hw; + + enable_rx_irq_bare(hw->regs); +} + +static inline bool tx_irq_enabled(struct SerialHardware* _hw) +{ + struct SCI* hw = (struct SCI*)_hw; + + return (hw->regs->CR & REG_SCI_CR_TEIE); +} + +static void tx_isr(const struct SCI *hw) +{ +#pragma interrupt warn + volatile struct REG_SCI_STRUCT* regs = hw->regs; + + if (fifo_isempty(&hw->serial->txfifo)) + disable_tx_irq_bare(regs); + else + { + // Clear transmitter flags before sending data + (void)regs->SR; + regs->DR = fifo_pop(&hw->serial->txfifo); + } +} + +static void rx_isr(const struct SCI *hw) +{ +#pragma interrupt warn + volatile struct REG_SCI_STRUCT* regs = hw->regs; + + // Propagate errors + hw->serial->status |= regs->SR & (SERRF_PARITYERROR | + SERRF_RXSROVERRUN | + SERRF_FRAMEERROR | + SERRF_NOISEERROR); + + /* + * Serial IRQ can happen for two reason: data ready (RDRF) or overrun (OR) + * If the data is ready, we need to fetch it from the data register or + * the interrupt will retrigger immediatly. In case of overrun, instead, + * the value of the data register is meaningless. + */ + if (regs->SR & REG_SCI_SR_RDRF) + { + unsigned char data = regs->DR; + + if (fifo_isfull(&hw->serial->rxfifo)) + hw->serial->status |= SERRF_RXFIFOOVERRUN; + else + fifo_push(&hw->serial->rxfifo, data); + } + + // Writing anything to the status register clear the error bits. + regs->SR = 0; +} + +static void init(struct SerialHardware* _hw, struct Serial* ser) +{ + struct SCI* hw = (struct SCI*)_hw; + volatile struct REG_SCI_STRUCT* regs = hw->regs; + + // Clear status register (IRQ/status flags) + (void)regs->SR; + regs->SR = 0; + + // Clear data register + (void)regs->DR; + + // Install the handlers and set priorities for both IRQs + irq_install(hw->irq_tx, (isr_t)tx_isr, hw); + irq_install(hw->irq_rx, (isr_t)rx_isr, hw); + irq_setpriority(hw->irq_tx, IRQ_PRIORITY_SCI_TX); + irq_setpriority(hw->irq_rx, IRQ_PRIORITY_SCI_RX); + + // Activate the RX error interrupts, and RX/TX transmissions + regs->CR = REG_SCI_CR_TE | REG_SCI_CR_RE; + enable_rx_irq_bare(regs); + + // Disable GPIO pins for TX and RX lines + // \todo this should be divided into serial 0 and 1 + REG_GPIO_SERIAL_0->PER |= REG_GPIO_SERIAL_MASK_0; + REG_GPIO_SERIAL_1->PER |= REG_GPIO_SERIAL_MASK_1; + + hw->serial = ser; +} + +static void cleanup(struct SerialHardware* _hw) +{ + struct SCI* hw = (struct SCI*)_hw; + + // Uninstall the ISRs + disable_rx_irq(_hw); + disable_tx_irq(_hw); + irq_uninstall(hw->irq_tx); + irq_uninstall(hw->irq_rx); +} + +static void setbaudrate(struct SerialHardware* _hw, unsigned long rate) +{ + struct SCI* hw = (struct SCI*)_hw; + + // SCI has an internal 16x divider on the input clock, which comes + // from the IPbus (see the scheme in user manual, 12.7.3). We apply + // it to calculate the period to store in the register. + hw->regs->BR = (IPBUS_FREQ + rate * 8ul) / (rate * 16ul); +} + +static void setparity(struct SerialHardware* _hw, int parity) +{ + // ??? + ASSERT(0); +} + + +#if CONFIG_SER_MULTI + +static void multi_init(void) +{ + static bool flag = false; + int i; + + if (flag) + return; + + for (i = 0; i < MAX_MULTI_GROUPS; ++i) + sem_init(&multi_sems[i]); + flag = true; +} + +static void init_lock(struct SerialHardware* _hw, struct Serial *ser) +{ + struct SCI* hw = (struct SCI*)_hw; + + // Initialize the multi engine (if needed) + multi_init(); + + // Acquire the lock of the semaphore for this group + ASSERT(hw->num_group >= 0); + ASSERT(hw->num_group < MAX_MULTI_GROUPS); + sem_obtain(&multi_sems[hw->num_group]); + + // Do a hardware switch to the given serial + ser_hw_switch(hw->num_group, hw->id); + + init(_hw, ser); +} + +static void cleanup_unlock(struct SerialHardware* _hw) +{ + struct SCI* hw = (struct SCI*)_hw; + + cleanup(_hw); + + sem_release(&multi_sems[hw->num_group]); +} + +#endif /* CONFIG_SER_MULTI */ + + +static const struct SerialHardwareVT SCI_VT = +{ + .init = init, + .cleanup = cleanup, + .setBaudrate = setbaudrate, + .setParity = setparity, + .txStart = enable_tx_irq, + .txSending = tx_irq_enabled, +}; + +#if CONFIG_SER_MULTI +static const struct SerialHardwareVT SCI_MULTI_VT = +{ + .init = init_lock, + .cleanup = cleanup_unlock, + .setBaudrate = setbaudrate, + .setParity = setparity, + .txStart = enable_tx_irq, + .txSending = tx_irq_enabled, +}; +#endif /* CONFIG_SER_MULTI */ + +#define SCI_DESC_NORMAL(hwch) \ + { \ + .hw = \ + { \ + .table = &SCI_VT, \ + .rxbuffer = ser ## hwch ## _fifo_rx, \ + .txbuffer = ser ## hwch ## _fifo_tx, \ + .rxbuffer_size = countof(ser ## hwch ## _fifo_rx), \ + .txbuffer_size = countof(ser ## hwch ## _fifo_tx), \ + }, \ + .regs = ®_SCI[hwch], \ + .irq_rx = IRQ_SCI ## hwch ## _RECEIVER_FULL, \ + .irq_tx = IRQ_SCI ## hwch ## _TRANSMITTER_READY, \ + .num_group = -1, \ + .id = -1, \ + } \ + /**/ + +#if CONFIG_SER_MULTI +#define SCI_DESC_MULTI(hwch, group_, id_) \ + { \ + .hw = \ + { \ + .table = &SCI_MULTI_VT, \ + .rxbuffer = ser ## hwch ## _fifo_rx, \ + .txbuffer = ser ## hwch ## _fifo_tx, \ + .rxbuffer_size = countof(ser ## hwch ## _fifo_rx), \ + .txbuffer_size = countof(ser ## hwch ## _fifo_tx), \ + }, \ + .regs = ®_SCI[hwch], \ + .irq_rx = IRQ_SCI ## hwch ## _RECEIVER_FULL, \ + .irq_tx = IRQ_SCI ## hwch ## _TRANSMITTER_READY, \ + .num_group = group_, \ + .id = id_, \ + } \ + /**/ +#endif /* CONFIG_SER_MULTI */ + +// \todo Move this into hw.h, with a little preprocessor magic +static struct SCI SCIDescs[] = +{ + SCI_DESC_NORMAL(0), + SCI_DESC_MULTI(1, 0, 0), + SCI_DESC_MULTI(1, 0, 1), +}; + +struct SerialHardware* ser_hw_getdesc(int unit) +{ + ASSERT(unit < countof(SCIDescs)); + return &SCIDescs[unit].hw; +} diff --git a/2.5/bertos/cpu/dsp56k/drv/ser_dsp56k.h b/2.5/bertos/cpu/dsp56k/drv/ser_dsp56k.h new file mode 100644 index 00000000..c8fd3e1d --- /dev/null +++ b/2.5/bertos/cpu/dsp56k/drv/ser_dsp56k.h @@ -0,0 +1,72 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Daniele Basile + * + * \brief Low-level serial module for ARM (interface). + */ + +#include /* BV() */ +#include /* uint32_t */ + +typedef uint16_t serstatus_t; + +/* Software errors */ +#define SERRF_RXFIFOOVERRUN BV(0) /**< Rx FIFO buffer overrun */ +#define SERRF_RXTIMEOUT BV(1) /**< Receive timeout */ +#define SERRF_TXTIMEOUT BV(2) /**< Transmit timeout */ + +/* + * Hardware errors. + * These flags map directly to the SCI Control Register. + */ +#define SERRF_PARITYERROR BV(8) /**< Parity error */ +#define SERRF_FRAMEERROR BV(9) /**< Stop bit missing */ +#define SERRF_NOISEERROR BV(10) /**< Noise error */ +#define SERRF_RXSROVERRUN BV(11) /**< Rx shift register overrun */ + +/** + * \name Serial hw numbers + * + * \{ + */ +enum +{ +// \todo since we now support "fake" multiplexed serials, this should be moved to hw.h +SER_UART0, +SER_PUNTALI, +SER_BARCODE, +SER_CNT /**< Number of serial ports */ +}; +/*\}*/ diff --git a/2.5/bertos/cpu/dsp56k/drv/timer_dsp56k.h b/2.5/bertos/cpu/dsp56k/drv/timer_dsp56k.h new file mode 100644 index 00000000..f86cb50b --- /dev/null +++ b/2.5/bertos/cpu/dsp56k/drv/timer_dsp56k.h @@ -0,0 +1,148 @@ +#error This code must be revised for the new timer API +/** + * \file + * + * + * \version $Id$ + * + * \author Giovanni Bajo + * + * \brief Driver module for DSP56K + */ + +/*#* + *#* $Log$ + *#* Revision 1.10 2006/07/19 12:56:26 bernie + *#* Convert to new Doxygen style. + *#* + *#* Revision 1.9 2006/02/21 21:28:02 bernie + *#* New time handling based on TIMER_TICKS_PER_SEC to support slow timers with ticks longer than 1ms. + *#* + *#* Revision 1.8 2005/11/04 16:20:02 bernie + *#* Fix reference to README.devlib in header. + *#* + *#* Revision 1.7 2005/04/11 19:10:28 bernie + *#* Include top-level headers from cfg/ subdir. + *#* + *#* Revision 1.6 2004/11/16 22:37:14 bernie + *#* Replace IPTR with iptr_t. + *#* + *#* Revision 1.5 2004/08/25 14:12:08 rasky + *#* Aggiornato il comment block dei log RCS + *#* + *#* Revision 1.4 2004/07/30 14:27:49 rasky + *#* Aggiornati alcuni file DSP56k per la nuova libreria di IRQ management + *#* + *#* Revision 1.3 2004/06/06 18:30:34 bernie + *#* Import DSP56800 changes from SC. + *#* + *#* Revision 1.2 2004/06/03 11:27:09 bernie + *#* Add dual-license information. + *#* + *#* Revision 1.1 2004/05/23 18:23:30 bernie + *#* Import drv/timer module. + *#* + *#*/ + +#ifndef DRV_TIMER_DSP56K_H +#define DRV_TIMER_DSP56K_H + +#include "timer.h" +#include +#include +#include +#include + +// Calculate register pointer and irq vector from hw.h setting +#define REG_SYSTEM_TIMER PP_CAT(REG_TIMER_, SYSTEM_TIMER) +#define SYSTEM_TIMER_IRQ_VECTOR PP_CAT(IRQ_TIMER_, SYSTEM_TIMER) + +/// Prescaler for the system timer +#define TIMER_PRESCALER 16 + +/// Frequency of the hardware high precision timer +#define TIMER_HW_HPTICKS_PER_SEC (IPBUS_FREQ / TIMER_PRESCALER) + +/// Type of time expressed in ticks of the hardware high precision timer +typedef uint16_t hptime_t; + +static void system_timer_isr(UNUSED(iptr_t, arg)); + +static void timer_hw_init(void) +{ + uint16_t compare; + + // Clear compare flag status and enable interrupt on compare + REG_SYSTEM_TIMER->SCR &= ~REG_TIMER_SCR_TCF; + REG_SYSTEM_TIMER->SCR |= REG_TIMER_SCR_TCFIE; + + // Calculate the compare value needed to generate an interrupt exactly + // TICKS_PER_SEC times each second (usually, every millisecond). Check that + // the calculation is accurate, otherwise there is a precision error + // (probably the prescaler is too big or too small). + compare = TIMER_HW_HPTICKS_PER_SEC / TICKS_PER_SEC; + ASSERT((uint32_t)compare * TICKS_PER_SEC == IPBUS_FREQ / TIMER_PRESCALER); + REG_SYSTEM_TIMER->CMP1 = compare; + + // The value for reload (at initializationa and after compare is met) is zero + REG_SYSTEM_TIMER->LOAD = 0; + + // Set the interrupt handler and priority + irq_install(SYSTEM_TIMER_IRQ_VECTOR, &system_timer_isr, NULL); + irq_setpriority(SYSTEM_TIMER_IRQ_VECTOR, IRQ_PRIORITY_SYSTEM_TIMER); + + // Small preprocessor trick to generate the REG_TIMER_CTRL_PRIMARY_IPBYNN macro + // needed to set the prescaler + #define REG_CONTROL_PRESCALER PP_CAT(REG_TIMER_CTRL_PRIMARY_IPBY, TIMER_PRESCALER) + + // Setup the counter and start counting + REG_SYSTEM_TIMER->CTRL = + REG_TIMER_CTRL_MODE_RISING | // count rising edges (normal) + REG_CONTROL_PRESCALER | // frequency (IPbus / TIMER_PRESCALER) + REG_TIMER_CTRL_LENGTH; // up to CMP1, then reload +} + +INLINE void timer_hw_irq(void) +{ + // Clear the overflow flag so that we are ready for another interrupt + REG_SYSTEM_TIMER->SCR &= ~REG_TIMER_SCR_TCF; +} + +INLINE hptime_t timer_hw_hpread(void) +{ + return REG_SYSTEM_TIMER->CNTR; +} + +#define DEFINE_TIMER_ISR \ + static void system_timer_isr(UNUSED(iptr_t, arg)) + +#endif /* DRV_TIMER_DSP56_H */ diff --git a/2.5/bertos/cpu/dsp56k/hw/switch_dsp56k.c b/2.5/bertos/cpu/dsp56k/hw/switch_dsp56k.c new file mode 100644 index 00000000..116483e2 --- /dev/null +++ b/2.5/bertos/cpu/dsp56k/hw/switch_dsp56k.c @@ -0,0 +1,101 @@ +/** + * \file + * + * + * \version $Id$ + * \author Giovanni Bajo + * + * \brief DSP5680x task switching support + */ + +void asm_switch_context(void ** new_sp /* R2 */, void ** save_sp /* R3 */); +asm void asm_switch_context(void ** new_sp, void ** save_sp) +{ + lea (SP)+ + + ; From the manual: + ; The compiler uses page 0 address locations X: 0x0030 - 0x003F as register + ; variables. Frequently accessed local variables are assigned to the page 0 + ; registers instead of to stack locations so that load and store instructions + ; are shortened. Addresses X: 0x0030 - 0x0037 (page 0 registers MR0-MR7) are + ; volatile registers and can be overwritten. The remaining registers (page 0 + ; registers MR8-MR15) are treated as non-volatile and, if used by a routine, + ; must be saved on entry and restored on exit. + ; + ; So, register 0x30-0x37 are caller-save, while 0x38-0x3F are callee-save. + move x:<$38,y1 + move y1,x:(SP)+ + move x:<$39,y1 + move y1,x:(SP)+ + move x:<$3A,y1 + move y1,x:(SP)+ + move x:<$3B,y1 + move y1,x:(SP)+ + move x:<$3C,y1 + move y1,x:(SP)+ + move x:<$3D,y1 + move y1,x:(SP)+ + move x:<$3E,y1 + move y1,x:(SP)+ + move x:<$3F,y1 + move y1,x:(SP) + + ; + ; Switch stacks + nop + move SP, x:(R3) + nop + move x:(R2), SP + nop + + ; + ; restore all saved registers + ; + pop y1 + move y1,x:<$3F + pop y1 + move y1,x:<$3E + pop y1 + move y1,x:<$3D + pop y1 + move y1,x:<$3C + pop y1 + move y1,x:<$3B + pop y1 + move y1,x:<$3A + pop y1 + move y1,x:<$39 + pop y1 + move y1,x:<$38 + + ; SR is already pushed on the stack (normal call context). Use RTI to restore + ; it, so that interrupt status is preserved across the tasks. + rti +} diff --git a/2.5/bertos/cpu/frame.h b/2.5/bertos/cpu/frame.h new file mode 100644 index 00000000..b65aaed7 --- /dev/null +++ b/2.5/bertos/cpu/frame.h @@ -0,0 +1,282 @@ +/** + * \file + * + * + * \brief CPU-specific stack frame handling macros. + * + * These are mainly used by the portable part of the scheduler + * to work with the process stack frames. + * + * \author Giovanni Bajo + * \author Bernie Innocenti + * \author Stefano Fedrigo + * \author Francesco Sacchi + */ +#ifndef CPU_FRAME_H +#define CPU_FRAME_H + +#include + +#include "cfg/cfg_arch.h" /* ARCH_EMUL */ +#include /* for uintXX_t */ + +#if CPU_X86 + #if CPU_X86_32 + #define CPU_SAVED_REGS_CNT 2 + #elif CPU_X86_64 + #define CPU_SAVED_REGS_CNT 8 + #else + #error "unknown CPU" + #endif + #define CPU_STACK_GROWS_UPWARD 0 + #define CPU_SP_ON_EMPTY_SLOT 0 + +#elif CPU_ARM + + #define CPU_SAVED_REGS_CNT 8 + #define CPU_STACK_GROWS_UPWARD 0 + #define CPU_SP_ON_EMPTY_SLOT 0 + +#elif CPU_CM3 + + #define CPU_SAVED_REGS_CNT 8 + #define CPU_STACK_GROWS_UPWARD 0 + #define CPU_SP_ON_EMPTY_SLOT 0 + +#elif CPU_PPC + + #define CPU_SAVED_REGS_CNT 1 + #define CPU_STACK_GROWS_UPWARD 0 + #define CPU_SP_ON_EMPTY_SLOT 1 + +#elif CPU_DSP56K + + #define CPU_SAVED_REGS_CNT 8 + #define CPU_STACK_GROWS_UPWARD 1 + #define CPU_SP_ON_EMPTY_SLOT 0 + +#elif CPU_AVR + + #define CPU_SAVED_REGS_CNT 18 + #define CPU_STACK_GROWS_UPWARD 0 + #define CPU_SP_ON_EMPTY_SLOT 1 + +#else + #error No CPU_... defined. +#endif + +#ifndef CPU_STACK_GROWS_UPWARD + #error CPU_STACK_GROWS_UPWARD should have been defined to either 0 or 1 +#endif + +#ifndef CPU_SP_ON_EMPTY_SLOT + #error CPU_SP_ON_EMPTY_SLOT should have been defined to either 0 or 1 +#endif + +/// Default for macro not defined in the right arch section +#ifndef CPU_REG_INIT_VALUE + #define CPU_REG_INIT_VALUE(reg) (reg) +#endif + +/* + * Support stack handling peculiarities of a few CPUs. + * + * Most processors let their stack grow downward and + * keep SP pointing at the last pushed value. + */ +#if !CPU_STACK_GROWS_UPWARD + #if !CPU_SP_ON_EMPTY_SLOT + /* Most microprocessors (x86, m68k...) */ + #define CPU_PUSH_WORD(sp, data) \ + do { *--(sp) = (data); } while (0) + #define CPU_POP_WORD(sp) \ + (*(sp)++) + #else + /* AVR insanity */ + #define CPU_PUSH_WORD(sp, data) \ + do { *(sp)-- = (data); } while (0) + #define CPU_POP_WORD(sp) \ + (*++(sp)) + #endif + +#else /* CPU_STACK_GROWS_UPWARD */ + + #if !CPU_SP_ON_EMPTY_SLOT + /* DSP56K and other weirdos */ + #define CPU_PUSH_WORD(sp, data) \ + do { *++(sp) = (cpu_stack_t)(data); } while (0) + #define CPU_POP_WORD(sp) \ + (*(sp)--) + #else + #error I bet you cannot find a CPU like this + #endif +#endif + + +#if CPU_DSP56K + /* + * DSP56k pushes both PC and SR to the stack in the JSR instruction, but + * RTS discards SR while returning (it does not restore it). So we push + * 0 to fake the same context. + */ + #define CPU_PUSH_CALL_FRAME(sp, func) \ + do { \ + CPU_PUSH_WORD((sp), (func)); \ + CPU_PUSH_WORD((sp), 0x100); \ + } while (0); + +#elif CPU_CM3 + + #if CONFIG_KERN_PREEMPT + INLINE void asm_switch_context(cpu_stack_t **new_sp, cpu_stack_t **old_sp) + { + register cpu_stack_t **__new_sp asm ("r0") = new_sp; + register cpu_stack_t **__old_sp asm ("r1") = old_sp; + + asm volatile ("svc #0" + : : "r"(__new_sp), "r"(__old_sp) : "memory", "cc"); + } + #define asm_switch_context asm_switch_context + + #define CPU_PUSH_CALL_FRAME(sp, func) \ + do { \ + CPU_PUSH_WORD((sp), 0x01000000); /* xPSR */ \ + CPU_PUSH_WORD((sp), (cpu_stack_t)(func)); /* pc */ \ + CPU_PUSH_WORD((sp), 0); /* lr */ \ + CPU_PUSH_WORD((sp), 0); /* ip */ \ + CPU_PUSH_WORD((sp), 0); /* r3 */ \ + CPU_PUSH_WORD((sp), 0); /* r2 */ \ + CPU_PUSH_WORD((sp), 0); /* r1 */ \ + CPU_PUSH_WORD((sp), 0); /* r0 */ \ + CPU_PUSH_WORD((sp), 0xfffffffd); /* lr_exc */ \ + } while (0); + + #define CPU_CREATE_NEW_STACK(stack) \ + do { \ + size_t i; \ + /* Initialize process stack frame */ \ + CPU_PUSH_CALL_FRAME(stack, proc_entry); \ + /* Push a clean set of CPU registers for asm_switch_context() */ \ + for (i = 0; i < CPU_SAVED_REGS_CNT; i++) \ + CPU_PUSH_WORD(stack, CPU_REG_INIT_VALUE(i)); \ + CPU_PUSH_WORD(stack, IRQ_PRIO_DISABLED); \ + } while (0) + + #else /* !CONFIG_KERN_PREEMPT */ + #define CPU_PUSH_CALL_FRAME(sp, func) \ + do { \ + CPU_PUSH_WORD((sp), 0x01000000); /* xPSR */ \ + CPU_PUSH_WORD((sp), (cpu_stack_t)(func)); /* pc */ \ + } while (0); + #endif /* CONFIG_KERN_PREEMPT */ + +#elif CPU_AVR + /* + * On AVR, addresses are pushed into the stack as little-endian, while + * memory accesses are big-endian (actually, it's a 8-bit CPU, so there is + * no natural endianess). + */ + #define CPU_PUSH_CALL_FRAME(sp, func) \ + do { \ + uint16_t funcaddr = (uint16_t)(func); \ + CPU_PUSH_WORD((sp), funcaddr); \ + CPU_PUSH_WORD((sp), funcaddr>>8); \ + } while (0) + + /* + * If the kernel is in idle-spinning, the processor executes: + * + * IRQ_ENABLE; + * CPU_IDLE; + * IRQ_DISABLE; + * + * IRQ_ENABLE is translated in asm as "sei" and IRQ_DISABLE as "cli". + * We could define CPU_IDLE to expand to none, so the resulting + * asm code would be: + * + * sei; + * cli; + * + * But Atmel datasheet states: + * "When using the SEI instruction to enable interrupts, + * the instruction following SEI will be executed *before* + * any pending interrupts", so "cli" is executed before any + * pending interrupt with the result that IRQs will *NOT* + * be enabled! + * To ensure that IRQ will run a NOP is required. + */ + #define CPU_IDLE NOP + +#elif CPU_PPC + + #define CPU_PUSH_CALL_FRAME(sp, func) \ + do { \ + CPU_PUSH_WORD((sp), (cpu_stack_t)(func)); /* LR -> 8(SP) */ \ + CPU_PUSH_WORD((sp), 0); /* CR -> 4(SP) */ \ + } while (0) + +#else + #define CPU_PUSH_CALL_FRAME(sp, func) \ + CPU_PUSH_WORD((sp), (cpu_stack_t)(func)) +#endif + +/** + * \def CPU_IDLE + * + * \brief Invoked by the scheduler to stop the CPU when idle. + * + * This hook can be redefined to put the CPU in low-power mode, or to + * profile system load with an external strobe, or to save CPU cycles + * in hosted environments such as emulators. + */ +#ifndef CPU_IDLE + #define CPU_IDLE PAUSE +#endif /* !CPU_IDLE */ + +/** + * Default macro for creating a new Process stack + */ +#ifndef CPU_CREATE_NEW_STACK + + #define CPU_CREATE_NEW_STACK(stack) \ + do { \ + size_t i; \ + /* Initialize process stack frame */ \ + CPU_PUSH_CALL_FRAME(stack, proc_entry); \ + /* Push a clean set of CPU registers for asm_switch_context() */ \ + for (i = 0; i < CPU_SAVED_REGS_CNT; i++) \ + CPU_PUSH_WORD(stack, CPU_REG_INIT_VALUE(i)); \ + } while (0) +#endif + +#endif /* CPU_ATTR_H */ diff --git a/2.5/bertos/cpu/i196/drv/kdebug_i196.c b/2.5/bertos/cpu/i196/drv/kdebug_i196.c new file mode 100644 index 00000000..69f09284 --- /dev/null +++ b/2.5/bertos/cpu/i196/drv/kdebug_i196.c @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief General pourpose debug support for embedded systems (implementation). + * + * \version $Id$ + * \author Bernie Innocenti + * \author Stefano Fedrigo + */ + +#error Revise me! + +#include +#include /* for BV() */ +#include +#include /* for CPU_FREQ */ +#include /* Required for bus macros overrides */ + + +#include "Util196.h" +#define KDBG_WAIT_READY() do {} while (!(SP_STAT & (SPSF_TX_EMPTY | SPSF_TX_INT))) +#define KDBG_WRITE_CHAR(c) do { SBUF = (c); } while(0) +#define KDBG_MASK_IRQ(old) \ + do { \ + (old) = INT_MASK1 & INT1F_TI; \ + INT_MASK1 &= ~INT1F_TI; \ + } while(0) +#define KDBG_RESTORE_IRQ(old) do { INT_MASK1 |= (old); } +typedef uint16_t kdbg_irqsave_t; /* FIXME: unconfirmed */ + +#if CONFIG_KDEBUG_PORT == 666 + #error BITBANG debug console missing for this platform +#endif + + +INLINE void kdbg_hw_init(void) +{ + /* Set serial port for 19200bps 8N1 */ + INT_MASK1 &= ~(INT1F_TI | INT1F_RI); + SP_CON = SPCF_RECEIVE_ENABLE | SPCF_MODE1; + ioc1_img |= IOC1F_TXD_SEL | IOC1F_EXTINT_SRC; + IOC1 = ioc1_img; + BAUD_RATE = 0x33; + BAUD_RATE = 0x80; +} diff --git a/2.5/bertos/cpu/i196/drv/ser_i196.c b/2.5/bertos/cpu/i196/drv/ser_i196.c new file mode 100644 index 00000000..149be7f6 --- /dev/null +++ b/2.5/bertos/cpu/i196/drv/ser_i196.c @@ -0,0 +1,134 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief CPU specific serial I/O driver + */ + +/*#* + *#* $Log$ + *#* Revision 1.7 2006/07/19 12:56:26 bernie + *#* Convert to new Doxygen style. + *#* + *#* Revision 1.6 2005/11/04 16:20:02 bernie + *#* Fix reference to README.devlib in header. + *#* + *#* Revision 1.5 2004/12/13 11:51:08 bernie + *#* DISABLE_INTS/ENABLE_INTS: Convert to IRQ_DISABLE/IRQ_ENABLE. + *#* + *#* Revision 1.4 2004/08/25 14:12:08 rasky + *#* Aggiornato il comment block dei log RCS + *#* + *#* Revision 1.3 2004/06/03 11:27:09 bernie + *#* Add dual-license information. + *#* + *#* Revision 1.2 2004/05/23 18:21:53 bernie + *#* Trim CVS logs and cleanup header info. + *#* + *#*/ + +#include "hw.h" +#include "serhw.h" + +#define SER_HW_ENABLE_TX \ + ATOMIC( \ + if (!ser_sending) \ + { \ + ser_sending = true; \ + (INT_PEND1 |= INT1F_TI) \ + } \ + ); + +static volatile bool ser_sending; + +// Serial TX intr +INTERRUPT(0x30) void TI_interrupt(void) +{ + if (CANT_SEND) + { + ser_sending = false; + return; + } + + /* Can we send two bytes at the same time? */ + if (SP_STAT & SPSF_TX_EMPTY) + { + SBUF = fifo_pop(&ser_txfifo); + + if (CANT_SEND) + { + ser_sending = false; + return; + } + } + + SBUF = fifo_pop(&ser_txfifo); +} + +INTERRUPT(0x32) void RI_interrupt(void) +{ + ser_status |= SP_STAT & + (SPSF_OVERRUN_ERROR | SPSF_PARITY_ERROR | SPSF_FRAMING_ERROR); + if (fifo_isfull(&ser_rxfifo)) + ser_status |= SERRF_RXFIFOOVERRUN; + else + fifo_push(&ser_rxfifo, SBUF); +} + +static void ser_setbaudrate(unsigned long rate) +{ + // Calcola il periodo per la generazione del baud rate richiesto + uint16_t baud = (uint16_t)(((CPU_FREQ / 16) / rate) - 1) | 0x8000; + BAUD_RATE = (uint8_t)baud; + BAUD_RATE = (uint8_t)(baud >> 8); +} + +static void ser_hw_init(void) +{ + // Inizializza la porta seriale + SP_CON = SPCF_RECEIVE_ENABLE | SPCF_MODE1; + ioc1_img |= IOC1F_TXD_SEL | IOC1F_EXTINT_SRC; + IOC1 = ioc1_img; + + // Svuota il buffer di ricezione + { + uint8_t dummy = SBUF; + } + + // Abilita gli interrupt + INT_MASK1 |= INT1F_TI | INT1F_RI; +} + diff --git a/2.5/bertos/cpu/i196/drv/timer_i196.h b/2.5/bertos/cpu/i196/drv/timer_i196.h new file mode 100644 index 00000000..f7419961 --- /dev/null +++ b/2.5/bertos/cpu/i196/drv/timer_i196.h @@ -0,0 +1,89 @@ +#error This code must be revised for the new timer API +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Low-level timer module for AVR + */ + +/*#* + *#* $Log$ + *#* Revision 1.7 2006/07/19 12:56:26 bernie + *#* Convert to new Doxygen style. + *#* + *#* Revision 1.6 2006/02/21 21:28:02 bernie + *#* New time handling based on TIMER_TICKS_PER_SEC to support slow timers with ticks longer than 1ms. + *#* + *#* Revision 1.5 2005/11/04 16:20:02 bernie + *#* Fix reference to README.devlib in header. + *#* + *#* Revision 1.4 2004/12/13 11:51:08 bernie + *#* DISABLE_INTS/ENABLE_INTS: Convert to IRQ_DISABLE/IRQ_ENABLE. + *#* + *#* Revision 1.3 2004/08/25 14:12:08 rasky + *#* Aggiornato il comment block dei log RCS + *#* + *#* Revision 1.2 2004/06/03 11:27:09 bernie + *#* Add dual-license information. + *#* + *#* Revision 1.1 2004/05/23 18:23:30 bernie + *#* Import drv/timer module. + *#* + *#*/ + +#ifndef TIMER_I196_H +#define TIMER_I196_H + +/** + * Retrigger TIMER2, adjusting the time to account for + * the interrupt prologue latency. + */ +#define TIMER_RETRIGGER (TIMER2 -= TICKS_RATE) + +#define TIMER_INIT \ + TIMER2 = (65535 - TICKS_RATE); \ + INT_MASK1 |= INT1F_T2OVF; \ + ATOMIC( \ + WSR = 1; \ + IOC3 |= IOC3F_T2_ENA; \ + WSR = 0; \ + ) + +#define DEFINE_TIMER_ISR \ + INTERRUPT(0x38) void TM2_OVFL_interrupt(void); \ + INTERRUPT(0x38) void TM2_OVFL_interrupt(void) + +#endif /* DRV_TIMER_I196_H */ diff --git a/2.5/bertos/cpu/i196/hw/switch_i196.s32 b/2.5/bertos/cpu/i196/hw/switch_i196.s32 new file mode 100644 index 00000000..de708952 --- /dev/null +++ b/2.5/bertos/cpu/i196/hw/switch_i196.s32 @@ -0,0 +1,92 @@ +;* Copyright 2004 Develer S.r.l. (http://www.develer.com/) +;* Copyright 1999,2000,2001 Bernie Innocenti +;* This file is part of DevLib - See devlib/README for information. +;* +;* \version $Id$ +;* +;* \author Bernie Innocenti +;* + +;* $Log$ +;* Revision 1.2 2004/06/06 16:14:12 bernie +;* Add DevLib license information. +;* +;* Revision 1.1 2004/05/23 17:27:00 bernie +;* Import kern/ subdirectory. +;* +;* + +!!!!!! THIS FILE HAS NOT BEEN REVISED FOR THE NEW SCHEDULER API !!!!!! + + + + NAME AsmSwitch + RSEG CODE + + EXTERN ?LR + EXTERN ?GR + PUBLIC AsmSwitchContext + PUBLIC AsmReplaceContext + + +;* Perform low-level process context switching +;* +;* void AsmSwitchContext(cpustack_t *new_sp, cpustack_t **save_sp) +;* GR+0 SP+2 +;* +;* Replace current context with new process +;* +;* void AsmReplaceContext(cpustack_t *new_sp, cpustack_t **dummy) +;* GR+0 SP+2 +;* + +AsmSwitchContext: + +; pop 2nd parameter from the stack + ld ?GR+2,2[SP] + +; save all registers + push ?LR+0 + push ?LR+2 + push ?LR+4 + push ?LR+6 + push ?LR+8 + push ?LR+10 + push ?LR+12 + push ?LR+14 + push ?LR+16 + push ?LR+18 + push ?LR+20 + push ?LR+22 + push ?LR+24 + push ?LR+26 + push ?LR+28 + push ?LR+30 + st SP,[?GR+2] ; save old stack pointer + ; fall-thru + +AsmReplaceContext: + ld SP,?GR+0 ; load new stack pointer + +; restore all registers + pop ?LR+30 + pop ?LR+28 + pop ?LR+26 + pop ?LR+24 + pop ?LR+22 + pop ?LR+20 + pop ?LR+18 + pop ?LR+16 + pop ?LR+14 + pop ?LR+12 + pop ?LR+10 + pop ?LR+8 + pop ?LR+6 + pop ?LR+4 + pop ?LR+2 + pop ?LR+0 + +; restore execution in new context + ret + + END diff --git a/2.5/bertos/cpu/irq.h b/2.5/bertos/cpu/irq.h new file mode 100644 index 00000000..153f7861 --- /dev/null +++ b/2.5/bertos/cpu/irq.h @@ -0,0 +1,586 @@ +/** + * \file + * + * + * \brief CPU-specific IRQ definitions. + * + * \author Giovanni Bajo + * \author Bernie Innocenti + * \author Stefano Fedrigo + * \author Francesco Sacchi + */ +#ifndef CPU_IRQ_H +#define CPU_IRQ_H + +#include "detect.h" +#include "types.h" + +#include /* proc_needPreempt() / proc_preempt() */ + +#include /* for uintXX_t */ +#include "cfg/cfg_proc.h" /* CONFIG_KERN_PREEMPT */ + +#if CPU_I196 + #define IRQ_DISABLE disable_interrupt() + #define IRQ_ENABLE enable_interrupt() +#elif CPU_X86 + + /* Get IRQ_* definitions from the hosting environment. */ + #include + #if OS_EMBEDDED + #define IRQ_DISABLE FIXME + #define IRQ_ENABLE FIXME + #define IRQ_SAVE_DISABLE(x) FIXME + #define IRQ_RESTORE(x) FIXME + #endif /* OS_EMBEDDED */ + +#elif CPU_CM3 + /* Cortex-M3 */ + + /* + * Interrupt priority. + * + * NOTE: 0 means that an interrupt is not affected by the global IRQ + * priority settings. + */ + #define IRQ_PRIO 0x80 + #define IRQ_PRIO_MIN 0xf0 + #define IRQ_PRIO_MAX 0 + /* + * To disable interrupts we just raise the system base priority to a + * number lower than the default IRQ priority. In this way, all the + * "normal" interrupt can't be triggered. High-priority interrupt can + * still happen (at the moment only the soft-interrupt svcall uses a + * priority greater than the default IRQ priority). + * + * To enable interrupts we set the system base priority to 0, that + * means IRQ priority mechanism is disabled, and any interrupt can + * happen. + */ + #define IRQ_PRIO_DISABLED 0x40 + #define IRQ_PRIO_ENABLED 0 + + #define IRQ_DISABLE \ + ({ \ + register cpu_flags_t reg = IRQ_PRIO_DISABLED; \ + asm volatile ( \ + "msr basepri, %0" \ + : : "r"(reg) : "memory", "cc"); \ + }) + + #define IRQ_ENABLE \ + ({ \ + register cpu_flags_t reg = IRQ_PRIO_ENABLED; \ + asm volatile ( \ + "msr basepri, %0" \ + : : "r"(reg) : "memory", "cc"); \ + }) + + #define CPU_READ_FLAGS() \ + ({ \ + register cpu_flags_t reg; \ + asm volatile ( \ + "mrs %0, basepri" \ + : "=r"(reg) : : "memory", "cc"); \ + reg; \ + }) + + #define IRQ_SAVE_DISABLE(x) \ + ({ \ + x = CPU_READ_FLAGS(); \ + IRQ_DISABLE; \ + }) + + #define IRQ_RESTORE(x) \ + ({ \ + asm volatile ( \ + "msr basepri, %0" \ + : : "r"(x) : "memory", "cc"); \ + }) + + #define IRQ_ENABLED() (CPU_READ_FLAGS() == IRQ_PRIO_ENABLED) + + INLINE bool irq_running(void) + { + register uint32_t ret; + + /* + * Check if the current stack pointer is the main stack or + * process stack: we use the main stack only in Handler mode, + * so this means we're running inside an ISR. + */ + asm volatile ( + "mrs %0, msp\n\t" + "cmp sp, %0\n\t" + "ite ne\n\t" + "movne %0, #0\n\t" + "moveq %0, #1\n\t" : "=r"(ret) : : "cc"); + return ret; + } + #define IRQ_RUNNING() irq_running() + + #if (CONFIG_KERN && CONFIG_KERN_PREEMPT) + + #define DECLARE_ISR_CONTEXT_SWITCH(func) \ + void func(void); \ + INLINE void __isr_##func(void); \ + void func(void) \ + { \ + __isr_##func(); \ + if (!proc_needPreempt()) \ + return; \ + /* + * Set a PendSV request. + * + * The preemption handler will be called immediately + * after this ISR in tail-chaining mode (without the + * overhead of hardware state saving and restoration + * between interrupts). + */ \ + HWREG(NVIC_INT_CTRL) = NVIC_INT_CTRL_PEND_SV; \ + } \ + INLINE void __isr_##func(void) + + /** + * With task priorities enabled each ISR is used a point to + * check if we need to perform a context switch. + * + * Instead, without priorities a context switch can occur only + * when the running task expires its time quantum. In this last + * case, the context switch can only occur in the timer ISR, + * that must be always declared with the + * DECLARE_ISR_CONTEXT_SWITCH() macro. + */ + #if CONFIG_KERN_PRI + #define DECLARE_ISR(func) \ + DECLARE_ISR_CONTEXT_SWITCH(func) + /** + * Interrupt service routine prototype: can be used for + * forward declarations. + */ + #define ISR_PROTO(func) \ + ISR_PROTO_CONTEXT_SWITCH(func) + #endif /* !CONFIG_KERN_PRI */ + #endif + + #ifndef ISR_PROTO + #define ISR_PROTO(func) void func(void) + #endif + #ifndef DECLARE_ISR + #define DECLARE_ISR(func) void func(void) + #endif + #ifndef DECLARE_ISR_CONTEXT_SWITCH + #define DECLARE_ISR_CONTEXT_SWITCH(func) void func(void) + #endif + #ifndef ISR_PROTO_CONTEXT_SWITCH + #define ISR_PROTO_CONTEXT_SWITCH(func) void func(void) + #endif + +#elif CPU_ARM + + #ifdef __IAR_SYSTEMS_ICC__ + + #include + + #if __CPU_MODE__ == 1 /* Thumb */ + /* Use stubs */ + extern cpu_flags_t get_CPSR(void); + extern void set_CPSR(cpu_flags_t flags); + #else + #define get_CPSR __get_CPSR + #define set_CPSR __set_CPSR + #endif + + #define IRQ_DISABLE __disable_interrupt() + #define IRQ_ENABLE __enable_interrupt() + + #define IRQ_SAVE_DISABLE(x) \ + do { \ + (x) = get_CPSR(); \ + __disable_interrupt(); \ + } while (0) + + #define IRQ_RESTORE(x) \ + do { \ + set_CPSR(x); \ + } while (0) + + #define IRQ_ENABLED() \ + ((bool)(get_CPSR() & 0xb0)) + + #else /* !__IAR_SYSTEMS_ICC__ */ + + #define IRQ_DISABLE \ + do { \ + cpu_flags_t sreg; \ + asm volatile ( \ + "mrs %0, cpsr\n\t" \ + "orr %0, %0, #0xc0\n\t" \ + "msr cpsr_c, %0\n\t" \ + : "=r" (sreg) : : "memory", "cc"); \ + } while (0) + + #define IRQ_ENABLE \ + do { \ + cpu_flags_t sreg; \ + asm volatile ( \ + "mrs %0, cpsr\n\t" \ + "bic %0, %0, #0xc0\n\t" \ + "msr cpsr_c, %0\n\t" \ + : "=r" (sreg) : : "memory", "cc"); \ + } while (0) + + #define IRQ_SAVE_DISABLE(x) \ + do { \ + register cpu_flags_t sreg; \ + asm volatile ( \ + "mrs %0, cpsr\n\t" \ + "orr %1, %0, #0xc0\n\t" \ + "msr cpsr_c, %1\n\t" \ + : "=r" (x), "=r" (sreg) \ + : : "memory", "cc"); \ + } while (0) + + #define IRQ_RESTORE(x) \ + do { \ + asm volatile ( \ + "msr cpsr_c, %0\n\t" \ + : : "r" (x) : "memory", "cc"); \ + } while (0) + + #define CPU_READ_FLAGS() \ + ({ \ + cpu_flags_t sreg; \ + asm volatile ( \ + "mrs %0, cpsr\n\t" \ + : "=r" (sreg) : : "memory", "cc"); \ + sreg; \ + }) + + #define IRQ_ENABLED() ((CPU_READ_FLAGS() & 0xc0) != 0xc0) + + #if (CONFIG_KERN && CONFIG_KERN_PREEMPT) + EXTERN_C void asm_irq_switch_context(void); + + /** + * At the beginning of any ISR immediately ajust the + * return address and store all the caller-save + * registers (the ISR may change these registers that + * are shared with the user-context). + */ + #define IRQ_ENTRY() asm volatile ( \ + "sub lr, lr, #4\n\t" \ + "stmfd sp!, {r0-r3, ip, lr}\n\t") + #define IRQ_EXIT() asm volatile ( \ + "b asm_irq_switch_context\n\t") + /** + * Function attribute to declare an interrupt service + * routine. + * + * An ISR function must be declared as naked because we + * want to add our IRQ_ENTRY() prologue and IRQ_EXIT() + * epilogue code to handle the context switch and save + * all the registers (not only the callee-save). + * + */ + #define ISR_FUNC __attribute__((naked)) + + /** + * The compiler cannot establish which + * registers actually need to be saved, because + * the interrupt can happen at any time, so the + * "normal" prologue and epilogue used for a + * generic function call are not suitable for + * the ISR. + * + * Using a naked function has the drawback that + * the stack is not automatically adjusted at + * this point, like a "normal" function call. + * + * So, an ISR can _only_ contain other function + * calls and they can't use the stack in any + * other way. + * + * NOTE: we need to explicitly disable IRQs after + * IRQ_ENTRY(), because the IRQ status flag is not + * masked by the hardware and an IRQ ack inside the ISR + * may cause the triggering of another IRQ before + * exiting from the current ISR. + * + * The respective IRQ_ENABLE is not necessary, because + * IRQs will be automatically re-enabled when restoring + * the context of the user task. + */ + #define DECLARE_ISR_CONTEXT_SWITCH(func) \ + void ISR_FUNC func(void); \ + static NOINLINE void __isr_##func(void); \ + void ISR_FUNC func(void) \ + { \ + IRQ_ENTRY(); \ + IRQ_DISABLE; \ + __isr_##func(); \ + IRQ_EXIT(); \ + } \ + static NOINLINE void __isr_##func(void) + /** + * Interrupt service routine prototype: can be used for + * forward declarations. + */ + #define ISR_PROTO_CONTEXT_SWITCH(func) \ + void ISR_FUNC func(void) + /** + * With task priorities enabled each ISR is used a point to + * check if we need to perform a context switch. + * + * Instead, without priorities a context switch can occur only + * when the running task expires its time quantum. In this last + * case, the context switch can only occur in the timer + * ISR, that must be always declared with the + * DECLARE_ISR_CONTEXT_SWITCH() macro. + */ + #if CONFIG_KERN_PRI + #define DECLARE_ISR(func) \ + DECLARE_ISR_CONTEXT_SWITCH(func) + + #define ISR_PROTO(func) \ + ISR_PROTO_CONTEXT_SWITCH(func) + #endif /* !CONFIG_KERN_PRI */ + #endif /* CONFIG_KERN_PREEMPT */ + + #ifndef ISR_FUNC + #define ISR_FUNC __attribute__((naked)) + #endif + #ifndef DECLARE_ISR + #define DECLARE_ISR(func) \ + void ISR_FUNC func(void); \ + /* \ + * FIXME: avoid the inlining of this function. \ + * \ + * This is terribly inefficient, but it's a \ + * reliable workaround to avoid gcc blowing \ + * away the stack (see the bug below): \ + * \ + * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41999 \ + */ \ + static NOINLINE void __isr_##func(void); \ + void ISR_FUNC func(void) \ + { \ + asm volatile ( \ + "sub lr, lr, #4\n\t" \ + "stmfd sp!, {r0-r3, ip, lr}\n\t"); \ + __isr_##func(); \ + asm volatile ( \ + "ldmfd sp!, {r0-r3, ip, pc}^\n\t"); \ + } \ + static NOINLINE void __isr_##func(void) + #endif + #ifndef DECLARE_ISR_CONTEXT_SWITCH + #define DECLARE_ISR_CONTEXT_SWITCH(func) DECLARE_ISR(func) + #endif + #ifndef ISR_PROTO + #define ISR_PROTO(func) void ISR_FUNC func(void) + #endif + #ifndef ISR_PROTO_CONTEXT_SWITCH + #define ISR_PROTO_CONTEXT_SWITCH(func) ISR_PROTO(func) + #endif + + #endif /* !__IAR_SYSTEMS_ICC_ */ + +#elif CPU_PPC + + /* Get IRQ_* definitions from the hosting environment. */ + #include + #if OS_EMBEDDED + #define IRQ_DISABLE FIXME + #define IRQ_ENABLE FIXME + #define IRQ_SAVE_DISABLE(x) FIXME + #define IRQ_RESTORE(x) FIXME + #define IRQ_ENABLED() FIXME + #endif /* OS_EMBEDDED */ + +#elif CPU_DSP56K + + #define IRQ_DISABLE do { asm(bfset #0x0200,SR); asm(nop); } while (0) + #define IRQ_ENABLE do { asm(bfclr #0x0200,SR); asm(nop); } while (0) + + #define IRQ_SAVE_DISABLE(x) \ + do { (void)x; asm(move SR,x); asm(bfset #0x0200,SR); } while (0) + #define IRQ_RESTORE(x) \ + do { (void)x; asm(move x,SR); } while (0) + + static inline bool irq_running(void) + { + extern void *user_sp; + return !!user_sp; + } + #define IRQ_RUNNING() irq_running() + + static inline bool irq_enabled(void) + { + uint16_t x; + asm(move SR,x); + return !(x & 0x0200); + } + #define IRQ_ENABLED() irq_enabled() + +#elif CPU_AVR + + #define IRQ_DISABLE asm volatile ("cli" ::) + #define IRQ_ENABLE asm volatile ("sei" ::) + + #define IRQ_SAVE_DISABLE(x) \ + do { \ + __asm__ __volatile__( \ + "in %0,__SREG__\n\t" \ + "cli" \ + : "=r" (x) : /* no inputs */ : "cc" \ + ); \ + } while (0) + + #define IRQ_RESTORE(x) \ + do { \ + __asm__ __volatile__( \ + "out __SREG__,%0" : /* no outputs */ : "r" (x) : "cc" \ + ); \ + } while (0) + + #define IRQ_ENABLED() \ + ({ \ + uint8_t sreg; \ + __asm__ __volatile__( \ + "in %0,__SREG__\n\t" \ + : "=r" (sreg) /* no inputs & no clobbers */ \ + ); \ + (bool)(sreg & 0x80); \ + }) + #if (CONFIG_KERN && CONFIG_KERN_PREEMPT) + #define DECLARE_ISR_CONTEXT_SWITCH(vect) \ + INLINE void __isr_##vect(void); \ + ISR(vect) \ + { \ + __isr_##vect(); \ + IRQ_PREEMPT_HANDLER(); \ + } \ + INLINE void __isr_##vect(void) + + /** + * With task priorities enabled each ISR is used a point to + * check if we need to perform a context switch. + * + * Instead, without priorities a context switch can occur only + * when the running task expires its time quantum. In this last + * case, the context switch can only occur in the timer ISR, + * that must be always declared with the + * DECLARE_ISR_CONTEXT_SWITCH() macro. + */ + #if CONFIG_KERN_PRI + #define DECLARE_ISR(func) \ + DECLARE_ISR_CONTEXT_SWITCH(func) + /** + * Interrupt service routine prototype: can be used for + * forward declarations. + */ + #define ISR_PROTO(func) \ + ISR_PROTO_CONTEXT_SWITCH(func) + #endif /* !CONFIG_KERN_PRI */ + #endif + + #ifndef ISR_PROTO + #define ISR_PROTO(vect) ISR(vect) + #endif + #ifndef DECLARE_ISR + #define DECLARE_ISR(vect) ISR(vect) + #endif + #ifndef DECLARE_ISR_CONTEXT_SWITCH + #define DECLARE_ISR_CONTEXT_SWITCH(vect) ISR(vect) + #endif + #ifndef ISR_PROTO_CONTEXT_SWITCH + #define ISR_PROTO_CONTEXT_SWITCH(vect) ISR(vect) + #endif + +#else + #error No CPU_... defined. +#endif + +#ifdef IRQ_RUNNING + /// Ensure callee is running within an interrupt + #define ASSERT_IRQ_CONTEXT() ASSERT(IRQ_RUNNING()) + + /// Ensure callee is not running within an interrupt + #define ASSERT_USER_CONTEXT() ASSERT(!IRQ_RUNNING()) +#else + #define IRQ_RUNNING() false + #define ASSERT_USER_CONTEXT() do {} while(0) + #define ASSERT_IRQ_CONTEXT() do {} while(0) +#endif + +#ifdef IRQ_ENABLED + /// Ensure interrupts are enabled + #define IRQ_ASSERT_ENABLED() ASSERT(IRQ_ENABLED()) + + /// Ensure interrupts are not enabled + #define IRQ_ASSERT_DISABLED() ASSERT(!IRQ_ENABLED()) +#else + #define IRQ_ASSERT_ENABLED() do {} while(0) + #define IRQ_ASSERT_DISABLED() do {} while(0) +#endif + + +#ifndef IRQ_PREEMPT_HANDLER + #if (CONFIG_KERN && CONFIG_KERN_PREEMPT) + /** + * Handle preemptive context switch inside timer IRQ. + */ + INLINE void IRQ_PREEMPT_HANDLER(void) + { + if (proc_needPreempt()) + proc_preempt(); + } + #else + #define IRQ_PREEMPT_HANDLER() /* Nothing */ + #endif +#endif + +/** + * Execute \a CODE atomically with respect to interrupts. + * + * \see IRQ_SAVE_DISABLE IRQ_RESTORE + */ +#define ATOMIC(CODE) \ + do { \ + cpu_flags_t __flags; \ + IRQ_SAVE_DISABLE(__flags); \ + CODE; \ + IRQ_RESTORE(__flags); \ + } while (0) + +#endif /* CPU_IRQ_H */ diff --git a/2.5/bertos/cpu/newcore b/2.5/bertos/cpu/newcore new file mode 100755 index 00000000..043764c9 --- /dev/null +++ b/2.5/bertos/cpu/newcore @@ -0,0 +1,17 @@ +#!/bin/bash + +DIRS="drv hw io scripts" +if [ $# != 1 ]; then + echo "Create a new core tree with subdirs:" + echo $DIRS + echo "usage $0 " + exit 1 +fi +CORE=$1 +mkdir $CORE +cd $CORE +for dir in $DIRS +do + mkdir $dir +done +cd .. diff --git a/2.5/bertos/cpu/path.common b/2.5/bertos/cpu/path.common new file mode 100644 index 00000000..4c1808bd --- /dev/null +++ b/2.5/bertos/cpu/path.common @@ -0,0 +1,46 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# BeRTOS common path info. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# BeRTOS cpu directory +CPU_DIR = "bertos/cpu/" + +PRG_SCRIPTS_DIR = "bertos/prg_scripts/" diff --git a/2.5/bertos/cpu/pgm.h b/2.5/bertos/cpu/pgm.h new file mode 100644 index 00000000..3fac0c72 --- /dev/null +++ b/2.5/bertos/cpu/pgm.h @@ -0,0 +1,213 @@ +/** + * \file + * + * + * \brief Support for reading program memory on Harvard architectures. + * + * Support is currently provided for AVR microcontrollers only. + * + * These macros allow building code twice, with and without + * pgm support (e.g.: strcpy() and strcpy_P()). + * + * Set the _PROGMEM predefine to compile in conditional + * program-memory support. + * + * + * \note This module contains code ripped out from avr-libc, + * which is distributed under a 3-clause BSD license. + * + * \version $Id$ + * \author Bernie Innocenti + */ +#ifndef MWARE_PGM_H +#define MWARE_PGM_H + +#include /* For intXX_t */ +#include +#include /* For CPU_HARVARD */ +#include /* For SIZEOF_INT */ + +#if CPU_AVR + + #ifdef __AVR_ENHANCED__ + #define pgm_read_char(addr) \ + ({ \ + uint16_t __addr16 = (uint16_t)(addr); \ + uint8_t __result; \ + __asm__ \ + ( \ + "lpm %0, Z" "\n\t" \ + : "=r" (__result) \ + : "z" (__addr16) \ + ); \ + __result; \ + }) + #define pgm_read_uint16_t(addr) \ + ({ \ + uint16_t __addr16 = (uint16_t)(addr); \ + uint16_t __result; \ + __asm__ \ + ( \ + "lpm %A0, Z+" "\n\t" \ + "lpm %B0, Z" "\n\t" \ + : "=r" (__result), "=z" (__addr16) \ + : "1" (__addr16) \ + ); \ + __result; \ + }) + + + #else /* !__AVR_ENHANCED__ */ + + #define pgm_read_char(addr) \ + ({ \ + uint16_t __addr16 = (uint16_t)(addr); \ + uint8_t __result; \ + __asm__ \ + ( \ + "lpm" "\n\t" \ + "mov %0, r0" "\n\t" \ + : "=r" (__result) \ + : "z" (__addr16) \ + : "r0" \ + ); \ + __result; \ + }) + #define pgm_read_uint16_t(addr) \ + ({ \ + uint16_t __addr16 = (uint16_t)(addr); \ + uint16_t __result; \ + __asm__ \ + ( \ + "lpm" "\n\t" \ + "mov %A0, r0" "\n\t" \ + "adiw r30, 1" "\n\t" \ + "lpm" "\n\t" \ + "mov %B0, r0" "\n\t" \ + : "=r" (__result), "=z" (__addr16) \ + : "1" (__addr16) \ + : "r0" \ + ); \ + __result; \ + }) + + #endif /* !__AVR_ENHANCED__ */ + + #if SIZEOF_INT == 2 + #define pgm_read_int(addr) ((int)pgm_read_uint16_t(addr)) + #else + #error Missing support for CPU word size != 16bit + #endif + + #ifndef PROGMEM + #define PROGMEM __attribute__((__progmem__)) + #endif + #ifndef PSTR + #define PSTR(s) ({ static const char __c[] PROGMEM = (s); &__c[0]; }) + #endif + #ifndef PFUNC + #define PFUNC(x) x ## _P + #endif + +#elif CPU_HARVARD + #error Missing CPU support +#endif + +#ifndef PSTR +#define PSTR /* nothing */ +#endif + +#ifndef PFUNC +#define PFUNC(x) x +#endif + +#ifndef PROGMEM +#define PROGMEM /* nothing */ +#endif + +/** + * \name Types for variables stored in program memory (harvard processors). + * \{ + */ +typedef PROGMEM char pgm_char; +typedef PROGMEM int8_t pgm_int8_t; +typedef PROGMEM uint8_t pgm_uint8_t; +typedef PROGMEM int16_t pgm_int16_t; +typedef PROGMEM uint16_t pgm_uint16_t; +typedef PROGMEM int32_t pgm_int32_t; +typedef PROGMEM uint32_t pgm_uint32_t; +/*\}*/ + +/** + * \name PGM support macros. + * + * These macros enable dual compilation of code for both program + * and data memory. + * + * Such a function may be defined like this: + * + * \code + * void PGM_FUNC(lcd_puts)(PGM_ATTR const char *str) + * { + * char c; + * while ((c = PGM_READ_CHAR(str++)) + * lcd_putchar(c); + * } + * \endcode + * + * The above code can be compiled twice: once with the _PROGMEM preprocessor + * symbol defined, and once without. The two object modules can then be + * linked in the same application for use by client code: + * + * \code + * lcd_puts("Hello, world!"); + * lcd_puts_P(PSTR("Hello, world!")); + * + * // To be used when invoking inside other PGM_FUNC functions: + * PGM_FUNC(lcd_puts)(some_string); + * \endcode + * + * \{ + */ +#ifdef _PROGMEM + #define PGM_READ_CHAR(s) pgm_read_char(s) + #define PGM_FUNC(x) PFUNC(x) + #define PGM_STR(x) PSTR(x) + #define PGM_ATTR PROGMEM +#else + #define PGM_READ_CHAR(s) (*(s)) + #define PGM_FUNC(x) x + #define PGM_STR(x) x + #define PGM_ATTR /* nothing */ +#endif +/* \} */ + + +#endif /* MWARE_PGM_H */ diff --git a/2.5/bertos/cpu/power.h b/2.5/bertos/cpu/power.h new file mode 100644 index 00000000..d73eb621 --- /dev/null +++ b/2.5/bertos/cpu/power.h @@ -0,0 +1,116 @@ +/** + * \file + * + * + * \brief CPU power management functions + * + * \author Bernie Innocenti + */ + +#ifndef CPU_POWER_H +#define CPU_POWER_H + +#include "cfg/cfg_proc.h" +#include "cfg/cfg_wdt.h" + +#if CONFIG_KERN + #include +#endif + +#if CONFIG_WATCHDOG + #include +#endif + +/** + * Let the CPU rest in tight busy loops + * + * User code that sits in a busy loop should call cpu_relax() every + * once in a while to perform system-dependent idle processing. + * + * Depending on the system configuration, this might perform different + * actions: + * + * - yield the CPU to other processes + * - reset the watchdog timer to avoid it from triggering + * - scale the CPU speed down to save power (unimplemented) + * - let the event loop of the emulator process a few events + * + * \see proc_yield() cpu_pause() + */ +INLINE void cpu_relax(void) +{ +#if CONFIG_KERN + if (proc_preemptAllowed()) + proc_yield(); +#endif + +#if CONFIG_WATCHDOG + wdt_reset(); +#endif +} + +/** + * Stop the processor until the next interrupt occurs. + * + * Pausing the CPU effectively reduces power usage, and should be used + * whenever the program is idle waiting for the next event to occur. + * + * To avoid deadlocking, the caller should normally check for the + * desired condition with interrupts disabled, and enter this function + * while interrupts are still disabled: + * + * \code + * IRQ_DISABLE(); + * while (!event_occurred) + * cpu_pause(); + * IRQ_ENABLE(); + * \endcode + * + * \note Some implementations of cpu_pause() may return before any interrupt + * has occurred. Calling code should take this possibility into account. + * + * \note This function is currently unimplemented + * + * \see cpu_relax() cpu_yield() + */ +INLINE void cpu_pause(void) +{ + //ASSERT_IRQ_DISABLED(); + //IRQ_ENABLE(); + cpu_relax(); + //IRQ_DISABLE(); +} + +/** + * Safely call cpu_pause() until the COND predicate becomes true. + */ +#define CPU_PAUSE_ON(COND) ATOMIC(while (!(COND)) { cpu_pause(); }) + +#endif /* CPU_POWER_H */ diff --git a/2.5/bertos/cpu/types.h b/2.5/bertos/cpu/types.h new file mode 100644 index 00000000..d7e3e8bd --- /dev/null +++ b/2.5/bertos/cpu/types.h @@ -0,0 +1,236 @@ +/** + * \file + * + * + * \brief CPU-specific type definitions. + * + * \author Giovanni Bajo + * \author Bernie Innocenti + * \author Stefano Fedrigo + * \author Francesco Sacchi + */ +#ifndef CPU_TYPES_H +#define CPU_TYPES_H + +#include "detect.h" +#include "attr.h" +#include /* for uintXX_t */ + +#if CPU_I196 + + typedef uint16_t cpu_flags_t; // FIXME + typedef unsigned int cpu_stack_t; + typedef cpu_stack_t cpu_aligned_stack_t; + typedef unsigned int cpu_atomic_t; + #warning Verify following constant + #define SIZEOF_CPUSTACK_T 2 + #define SIZEOF_CPUALIGNED_T SIZEOF_CPUSTACK_T + +#elif CPU_X86 + + /* Get cpu_flags_t definition from the hosting environment. */ + #include + #if OS_EMBEDDED + typedef uint32_t cpu_flags_t; // FIXME + #endif /* OS_EMBEDDED */ + + typedef uint32_t cpu_atomic_t; + + #if CPU_X86_64 + typedef uint64_t cpu_stack_t; + typedef cpu_stack_t cpu_aligned_stack_t; + #define SIZEOF_CPUSTACK_T 8 + #define SIZEOF_CPUALIGNED_T SIZEOF_CPUSTACK_T + #else + typedef uint32_t cpu_stack_t; + typedef cpu_stack_t cpu_aligned_stack_t; + #define SIZEOF_CPUSTACK_T 4 + #define SIZEOF_CPUALIGNED_T SIZEOF_CPUSTACK_T + #endif + +#elif CPU_ARM || CPU_CM3 + + typedef uint32_t cpu_flags_t; + typedef uint32_t cpu_atomic_t; + typedef uint32_t cpu_stack_t; + #define SIZEOF_CPUSTACK_T 4 + + typedef uint64_t cpu_aligned_stack_t; + #define SIZEOF_CPUALIGNED_T 8 + +#elif CPU_PPC + + /* Get cpu_flags_t definition from the hosting environment. */ + #include + #if OS_EMBEDDED + typedef uint32_t cpu_flags_t; + #endif + + typedef uint32_t cpu_atomic_t; + typedef uint32_t cpu_stack_t; + typedef cpu_stack_t cpu_aligned_stack_t; + #define SIZEOF_CPUSTACK_T 4 + #define SIZEOF_CPUALIGNED_T SIZEOF_CPUSTACK_T + +#elif CPU_DSP56K + + typedef uint16_t cpu_flags_t; + typedef uint16_t cpu_atomic_t; + typedef unsigned int cpu_stack_t; + typedef cpu_stack_t cpu_aligned_stack_t; + #warning Verify following costant + #define SIZEOF_CPUSTACK_T 2 + #define SIZEOF_CPUALIGNED_T SIZEOF_CPUSTACK_T + +#elif CPU_AVR + + typedef uint8_t cpu_flags_t; + typedef uint8_t cpu_atomic_t; + typedef uint8_t cpu_stack_t; + typedef cpu_stack_t cpu_aligned_stack_t; + #define SIZEOF_CPUSTACK_T 1 + #define SIZEOF_CPUALIGNED_T SIZEOF_CPUSTACK_T + +#else + #error No CPU_... defined. +#endif + +/** + * \name Default type sizes. + * + * These defaults are reasonable for most 16/32bit machines. + * Some of these macros may be overridden by CPU-specific code above. + * + * ANSI C requires that the following equations be true: + * \code + * sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) + * sizeof(float) <= sizeof(double) + * CPU_BITS_PER_CHAR >= 8 + * CPU_BITS_PER_SHORT >= 8 + * CPU_BITS_PER_INT >= 16 + * CPU_BITS_PER_LONG >= 32 + * \endcode + * \{ + */ +#ifndef SIZEOF_CHAR +#define SIZEOF_CHAR 1 +#endif + +#ifndef SIZEOF_SHORT +#define SIZEOF_SHORT 2 +#endif + +#ifndef SIZEOF_INT +#if CPU_REG_BITS < 32 + #define SIZEOF_INT 2 +#else + #define SIZEOF_INT 4 +#endif +#endif /* !SIZEOF_INT */ + +#ifndef SIZEOF_LONG +#if CPU_REG_BITS > 32 + #define SIZEOF_LONG 8 +#else + #define SIZEOF_LONG 4 +#endif +#endif + +#ifndef SIZEOF_PTR +#if CPU_REG_BITS < 32 + #define SIZEOF_PTR 2 +#elif CPU_REG_BITS == 32 + #define SIZEOF_PTR 4 +#else /* CPU_REG_BITS > 32 */ + #define SIZEOF_PTR 8 +#endif +#endif + +#ifndef SIZEOF_SIZE_T +#if CPU_REG_BITS < 32 + #define SIZEOF_SIZE_T 2 +#elif CPU_REG_BITS == 32 + #define SIZEOF_SIZE_T 4 +#else /* CPU_REG_BITS > 32 */ + #define SIZEOF_SIZE_T 8 +#endif +#endif + +#ifndef CPU_BITS_PER_CHAR +#define CPU_BITS_PER_CHAR (SIZEOF_CHAR * 8) +#endif + +#ifndef CPU_BITS_PER_SHORT +#define CPU_BITS_PER_SHORT (SIZEOF_SHORT * CPU_BITS_PER_CHAR) +#endif + +#ifndef CPU_BITS_PER_INT +#define CPU_BITS_PER_INT (SIZEOF_INT * CPU_BITS_PER_CHAR) +#endif + +#ifndef CPU_BITS_PER_LONG +#define CPU_BITS_PER_LONG (SIZEOF_LONG * CPU_BITS_PER_CHAR) +#endif + +#ifndef CPU_BITS_PER_PTR +#define CPU_BITS_PER_PTR (SIZEOF_PTR * CPU_BITS_PER_CHAR) +#endif + + +/*\}*/ + +#ifndef INT_MAX + #define INT_MAX ((int)((unsigned int)~0 >> 1)) + #define INT_MIN (-INT_MAX - 1) +#endif + +/* Sanity checks for the above definitions */ +STATIC_ASSERT(sizeof(char) == SIZEOF_CHAR); +STATIC_ASSERT(sizeof(short) == SIZEOF_SHORT); +STATIC_ASSERT(sizeof(long) == SIZEOF_LONG); +STATIC_ASSERT(sizeof(int) == SIZEOF_INT); +STATIC_ASSERT(sizeof(void *) == SIZEOF_PTR); +STATIC_ASSERT(sizeof(int8_t) * CPU_BITS_PER_CHAR == 8); +STATIC_ASSERT(sizeof(uint8_t) * CPU_BITS_PER_CHAR == 8); +STATIC_ASSERT(sizeof(int16_t) * CPU_BITS_PER_CHAR == 16); +STATIC_ASSERT(sizeof(uint16_t) * CPU_BITS_PER_CHAR == 16); +STATIC_ASSERT(sizeof(int32_t) * CPU_BITS_PER_CHAR == 32); +STATIC_ASSERT(sizeof(uint32_t) * CPU_BITS_PER_CHAR == 32); +#ifdef __HAS_INT64_T__ +STATIC_ASSERT(sizeof(int64_t) * CPU_BITS_PER_CHAR == 64); +STATIC_ASSERT(sizeof(uint64_t) * CPU_BITS_PER_CHAR == 64); +#endif +STATIC_ASSERT(sizeof(cpu_stack_t) == SIZEOF_CPUSTACK_T); +STATIC_ASSERT(sizeof(cpu_aligned_stack_t) == SIZEOF_CPUALIGNED_T); +STATIC_ASSERT(sizeof(size_t) == SIZEOF_SIZE_T); + +#endif /* CPU_TYPES_H */ diff --git a/2.5/bertos/drv/adc.c b/2.5/bertos/drv/adc.c new file mode 100644 index 00000000..fd2cff1c --- /dev/null +++ b/2.5/bertos/drv/adc.c @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief ADC driver (implementation) + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include + +#ifndef WIZ_AUTOGEN + #warning Deprecated: now you should include adc_ directly in the makefile. Remove this line and the following once done. + #include CPU_CSOURCE(adc) +#else + #include CPU_HEADER(adc) +#endif + +#include // ASSERT() +#include // MIN() +#include +#include + +/** + * Read the ADC channel \a ch. + */ +adcread_t adc_read(adc_ch_t ch) +{ + ASSERT(ch <= (adc_ch_t)ADC_MUX_MAXCH); + ch = MIN(ch, (adc_ch_t)ADC_MUX_MAXCH); + + adc_hw_select_ch(ch); + + return(adc_hw_read()); +} + +MOD_DEFINE(adc); + +/** + * Initialize the ADC hardware. + */ +void adc_init(void) +{ + adc_hw_init(); + + MOD_INIT(adc); +} diff --git a/2.5/bertos/drv/adc.h b/2.5/bertos/drv/adc.h new file mode 100644 index 00000000..78f3e81d --- /dev/null +++ b/2.5/bertos/drv/adc.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Analog to Digital Converter driver (ADC). + * + * \author Francesco Sacchi + * + * $WIZ$ module_name = "adc" + * $WIZ$ module_configuration = "bertos/cfg/cfg_adc.h" + * $WIZ$ module_supports = "not atmega103" + */ + + +#ifndef DRV_ADC_H +#define DRV_ADC_H + +#include +#include +#include +#include CPU_HEADER(adc) + +/** Type for ADC return value. */ +typedef uint16_t adcread_t; + +/** Type for channel */ +typedef uint8_t adc_ch_t; + +#define adc_bits() ADC_BITS + +adcread_t adc_read(adc_ch_t ch); +void adc_init(void); + +/** + * Macro used to convert data from adc range (0...(2 ^ADC_BITS - 1)) to + * \a y1 ... \a y2 range. + * \note \a y1, \a y2 can be negative, and put in ascending or descending order as well. + * \note \a data and \a y2 are evaluated only once, \a y1 twice. + */ +#define ADC_RANGECONV(data, y1, y2) (((((int32_t)(data)) * ((y2) - (y1))) / ((1 << ADC_BITS) - 1)) + (y1)) + +#endif /* DRV_ADC_H */ diff --git a/2.5/bertos/drv/buzzer.c b/2.5/bertos/drv/buzzer.c new file mode 100644 index 00000000..042d06cc --- /dev/null +++ b/2.5/bertos/drv/buzzer.c @@ -0,0 +1,158 @@ +/** + * \file + * + * + * \brief Buzzer driver (implementation) + * + * \author Bernie Innocenti + * \author Francesco Sacchi + */ + +#include "buzzer.h" + +#include "hw/hw_buzzer.h" +#include + +#include + +#include +#include + + +/* Local vars */ +static Timer buz_timer; +static bool buz_timer_running; +static mtime_t buz_repeat_interval; +static mtime_t buz_repeat_duration; + + +/** + * Turn off buzzer, called by software timer + */ +static void buz_softint(void) +{ + if (IS_BUZZER_ON) + { + BUZZER_OFF; + if (buz_repeat_interval) + { + /* Wait for interval time */ + timer_setDelay(&buz_timer, ms_to_ticks(buz_repeat_interval)); + timer_add(&buz_timer); + } + else + buz_timer_running = false; + } + else if (buz_repeat_interval) + { + /* Wait for beep time */ + BUZZER_ON; + timer_setDelay(&buz_timer, ms_to_ticks(buz_repeat_duration)); + timer_add(&buz_timer); + } + else + buz_timer_running = false; +} + + +/** + * Beep for the specified ms time + */ +void buz_beep(mtime_t time) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* Remove the software interrupt if it was already queued */ + if (buz_timer_running) + timer_abort(&buz_timer); + + /* Turn on buzzer */ + BUZZER_ON; + + /* Add software interrupt to turn the buzzer off later */ + buz_timer_running = true; + timer_setDelay(&buz_timer, ms_to_ticks(time)); + timer_add(&buz_timer); + + IRQ_RESTORE(flags); +} + + +/** + * Start buzzer repetition + */ +void buz_repeat_start(mtime_t duration, mtime_t interval) +{ + buz_repeat_interval = interval; + buz_repeat_duration = duration; + buz_beep(duration); +} + + +/** + * Stop buzzer repetition + */ +void buz_repeat_stop(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* Remove the software interrupt if it was already queued */ + if (buz_timer_running) + { + timer_abort(&buz_timer); + buz_timer_running = false; + } + + buz_repeat_interval = 0; + BUZZER_OFF; + + IRQ_RESTORE(flags); +} + +MOD_DEFINE(buzzer) + +/** + * Initialize buzzer. + */ +void buz_init(void) +{ + MOD_CHECK(timer); + + BUZZER_HW_INIT; + + /* Init software interrupt. */ + timer_setSoftint(&buz_timer, (Hook)buz_softint, 0); + + MOD_INIT(buzzer); +} diff --git a/2.5/bertos/drv/buzzer.h b/2.5/bertos/drv/buzzer.h new file mode 100644 index 00000000..9023152c --- /dev/null +++ b/2.5/bertos/drv/buzzer.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \author Bernie Innocenti + * + * \brief Buzzer driver. + * + * $WIZ$ module_name = "buzzer" + * $WIZ$ module_depends = "timer" + * $WIZ$ module_hw = "bertos/hw/hw_buzzer.h" + */ + +#ifndef DRV_BUZZER_H +#define DRV_BUZZER_H + +#include + +void buz_init(void); +void buz_beep(mtime_t time); +void buz_repeat_start(mtime_t duration, mtime_t interval); +void buz_repeat_stop(void); + +#endif /* DRV_BUZZER_H */ diff --git a/2.5/bertos/drv/buzzerled.c b/2.5/bertos/drv/buzzerled.c new file mode 100644 index 00000000..000e7c98 --- /dev/null +++ b/2.5/bertos/drv/buzzerled.c @@ -0,0 +1,104 @@ +/** + * \file + * + * + * \brief Generic library to handle buzzers and leds + * + * This library is divided into three different layers: + * + * - The topmost portable layer is buzzerled.[ch] which exposes a common API + * enable/disable the devices. Basically, it handles the asynchronism to + * implement bld_beep and bld_repeat. + * - The middle layer is CPU-specific and exposes a single main function which + * turns on/off each device. + * - The lower layer is board-specific and communicates with the middle layer + * with any required API. The idea is that devices can be tied to the CPU in + * many different ways (many different pins), so this part should describe + * which devices are present, and how they are connected. + * + * \version $Id$ + * + * \author Giovanni Bajo + */ + +#include "buzzerled.h" + +#warning FIXME:This drive is obsolete, you must refactor it. + +#if 0 +#include "cfg/cfg_buzzerled.h" +#include + +static struct Timer timers[CONFIG_NUM_BLDS]; +static bool timer_go[CONFIG_NUM_BLDS]; + +INLINE enum BLD_DEVICE hook_parm_to_device(void* parm) +{ + struct Timer* t = (struct Timer*)parm; + int num_bld = t - &timers[0]; + + ASSERT(num_bld >= 0); + ASSERT(num_bld < NUM_BLDS); + + return (enum BLD_DEVICE)num_bld; +} + +static void hook_turn_off(void* parm) +{ + enum BLD_DEVICE num_bld = hook_parm_to_device(parm); + bld_set(num_bld, false); +} + +void bld_init(void) +{ + bld_hw_init(); +} + +void bld_beep(enum BLD_DEVICE device, uint16_t duration) +{ + // \todo This is not reentrant for the same device. FIXME! + struct Timer *t = &timers[device]; + timer_set_delay(t, duration); + timer_set_event_softint(t, hook_turn_off, t); + timer_add(t); + + bld_set(device, true); +} + +void bld_beep_and_wait(enum BLD_DEVICE device, uint16_t duration) +{ + bld_set(device, true); + timer_delay(duration); + bld_set(device, false); +} +#endif + diff --git a/2.5/bertos/drv/buzzerled.h b/2.5/bertos/drv/buzzerled.h new file mode 100644 index 00000000..4d174904 --- /dev/null +++ b/2.5/bertos/drv/buzzerled.h @@ -0,0 +1,97 @@ +/** + * \file + * + * + * \brief Generic library to handle buzzers and leds + * + * \version $Id$ + * + * \author Giovanni Bajo + */ + +#ifndef DRV_BUZZERLED_H +#define DRV_BUZZERLED_H + +#include + +#if 0 +/** Include hw_buzzerled.h. We expect hw_buzzerled.h to define enum BLD_DEVICE, which must contain + * an enumarator for each device, plus a special symbol NUM_BLDS containing the + * number of devices. + */ +#include "hw/hw_buzzerled.h" + + +/* Include hw-level implementation. This allows inlining of bld_set, which in turns + * should allow fast constant propagation for the common case (where the parameter + * device is a constant). + */ +#include CPU_HEADER(buzzerled) + + +/** Initialize the buzzerled library. + * + * \note This function must be called before any other function in the library. + */ +void bld_init(void); + + +/** Set or reset a device. + * + * \param device Device to be set + * \param enable Enable/disable status + */ +#define bld_set(device, enable) bld_hw_set(device, enable) + + +/** Enable a device for a certain interval of time + * + * \param device Device to be enabled + * \param duration Number of milliseconds the device must be enabled + * + * \note This function is non-blocking, so it will return immediately. + */ +void bld_beep(enum BLD_DEVICE device, uint16_t duration); + + +/** Enable a device for a certain interval of time and wait. + * + * \param device Device to be enabled + * \param duration Number of milliseconds the device must be enabled + * + * \note This function is blocking, so it will return after the specified period of time. + */ +void bld_beep_and_wait(enum BLD_DEVICE device, uint16_t duration); + +#endif + +#endif /* DRV_BUZZERLED_H */ diff --git a/2.5/bertos/drv/dataflash.c b/2.5/bertos/drv/dataflash.c new file mode 100644 index 00000000..cf639e76 --- /dev/null +++ b/2.5/bertos/drv/dataflash.c @@ -0,0 +1,590 @@ +/** + * \file + * + * + * \brief Function library for dataflash AT45DB family (implementation). + * + * \version $Id$ + * \author Daniele Basile + * \author Francesco Sacchi + */ + +#include "dataflash.h" + +#include "cfg/cfg_dataflash.h" +#include +#include +#include + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL DATAFLASH_LOG_LEVEL +#define LOG_FORMAT DATAFLASH_LOG_FORMAT +#include + +#include + +#include + +#include + +#include /* cpu_relax() */ + +#include + +/** + * Array used to describe dataflash memory devices currently supported. + */ +static const DataflashInfo mem_info[] = +{ + { + /* AT45DB041B */ + .density_id = 0x07, + .page_size = 264, + .page_bits = 9, + .page_cnt = 2048, + .read_cmd = DFO_READ_FLASH_MEM_BYTE_B, + }, + { + /* AT45DB081D */ + .density_id = 0x09, + .page_size = 264, + .page_bits = 9, + .page_cnt = 4096, + .read_cmd = DFO_READ_FLASH_MEM_BYTE_D, + }, + { + /* AT45DB161D */ + .density_id = 0x0B, + .page_size = 528, + .page_bits = 10, + .page_cnt = 4096, + .read_cmd = DFO_READ_FLASH_MEM_BYTE_D, + }, + { + /* AT45DB642D */ + .density_id = 0x0F, + .page_size = 1056, + .page_bits = 11, + .page_cnt = 8192, + .read_cmd = DFO_READ_FLASH_MEM_BYTE_D, + }, + /* Add other memories here */ +}; + +STATIC_ASSERT(countof(mem_info) == DFT_CNT); + +/** + * Macro that toggle CS of dataflash. + * \note This is equivalent to fd->setCS(false) immediately followed by fd->setCS(true). + */ +INLINE void CS_TOGGLE(DataFlash *fd) +{ + fd->setCS(false); + fd->setCS(true); +} + +/** + * Send a generic command to dataflash memory. + * This function send only 4 byte: opcode, page address and + * byte address. + */ +static void send_cmd(DataFlash *fd, dataflash_page_t page_addr, dataflash_offset_t byte_addr, DataFlashOpcode opcode) +{ + + /* + * Make sure to toggle CS signal in order, + * and reset dataflash command decoder. + */ + CS_TOGGLE(fd); + + + /* + * To send one command to data flash memory, we send 4 byte. + * First byte is opcode command, second and third byte are + * page address, in last byte we write a byte page address. + * (see datasheet for more detail). + * + * \note Generally a default memory page size is more than 256 byte. + * In this case we need for addressing a byte in one page more than + * 8 bit, so we put in fourth byte low part of address byte, and + * hight part of address byte in third byte togheter low par of page + * address. + * + */ + + /* + * Send opcode. + */ + kfile_putc(opcode, fd->channel); + + /* + * Send page address. + */ + kfile_putc((uint8_t)(page_addr >> (16 - mem_info[fd->dev].page_bits)), fd->channel); + kfile_putc((uint8_t)((page_addr << (mem_info[fd->dev].page_bits - 8)) + (byte_addr >> 8)), fd->channel); + + /* + * Send byte page address. + */ + kfile_putc((uint8_t)byte_addr, fd->channel); +} + +/** + * Reset dataflash memory function. + * + * If \a fd->setReset function is not NULL, + * this function resets data flash memory + * with one pulse reset long about 10usec. + * + */ +static void dataflash_reset(DataFlash *fd) +{ + fd->setCS(false); + + if (fd->setReset) + { + fd->setReset(true); + timer_delayHp(us_to_hptime(RESET_PULSE_WIDTH)); + fd->setReset(false); + timer_delayHp(us_to_hptime(RESET_PULSE_WIDTH)); + } +} + + +/** + * Read status register of dataflah memory. + */ +static uint8_t dataflash_stat(DataFlash *fd) +{ + /* + * Make sure to toggle CS signal + * and reset dataflash command decoder. + */ + CS_TOGGLE(fd); + kfile_putc(DFO_READ_STATUS, fd->channel); + return kfile_getc(fd->channel); +} + + +/** + * Send one command to data flash memory, and + * return status register value. + * + */ +static uint8_t dataflash_cmd(DataFlash *fd, dataflash_page_t page_addr, dataflash_offset_t byte_addr, DataFlashOpcode opcode) +{ + uint8_t stat; + + send_cmd(fd, page_addr, byte_addr, opcode); + + CS_TOGGLE(fd); + + /* + * We chech data flash memory state, and wait until busy-flag + * is high. + */ + while (!(dataflash_stat(fd) & BUSY_BIT)) + cpu_relax(); + + stat = dataflash_stat(fd); + + kfile_flush(fd->channel); // Flush channel + /* + * Data flash has completed a bus cycle, so disable CS. + */ + fd->setCS(false); + + return stat; +} + +/** + * Read \a len bytes from main data flash memory or buffer data + * flash memory, and put it in \a *block. + */ +static void dataflash_readBlock(DataFlash *fd, dataflash_page_t page_addr, dataflash_offset_t byte_addr, uint8_t *block, dataflash_size_t len) +{ + DataFlashOpcode opcode = mem_info[fd->dev].read_cmd; + send_cmd(fd, page_addr, byte_addr, opcode); + + if (opcode == DFO_READ_FLASH_MEM_BYTE_B) + { + /* + * Send 24 don't care bits. + */ + uint8_t dummy[] = { 0, 0, 0 }; + kfile_write(fd->channel, dummy, sizeof(dummy)); + } + + kfile_putc(0, fd->channel); //Send 8 don't care bit. + kfile_read(fd->channel, block, len); //Read len bytes ad put in block buffer. + kfile_flush(fd->channel); // Flush channel + fd->setCS(false); +} + + +/** + * Write \a len bytes in dataflash memory buffer. + * + * \note Is not possible to write directly in dataflash main memory. + * To perform a write in main memory you must first write in dataflash buffer + * memory and then send a command to write the page in main memory. + */ +static void dataflash_writeBlock(DataFlash *fd, dataflash_offset_t offset, const uint8_t *block, dataflash_size_t len) +{ + ASSERT(offset + len <= mem_info[fd->dev].page_size); + + send_cmd(fd, 0x00, offset, DFO_WRITE_BUFF1); + + kfile_write(fd->channel, block, len); //Write len bytes. + kfile_flush(fd->channel); // Flush channel + + fd->setCS(false); +} + + +/** + * Load selected page from dataflash memory to buffer. + */ +static void dataflash_loadPage(DataFlash *fd, dataflash_page_t page_addr) +{ + dataflash_cmd(fd, page_addr, 0x00, DFO_MOV_MEM_TO_BUFF1); +} + +/* Battfs disk interface section */ + +static size_t dataflash_disk_page_read(struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, void *buf, size_t len) +{ + DataFlash *fd = DATAFLASH_CAST((KFile *)d->disk_ctx); + dataflash_readBlock(fd, page, addr, buf, len); + return len; +} + +static bool dataflash_disk_page_load(struct BattFsSuper *d, pgcnt_t page) +{ + DataFlash *fd = DATAFLASH_CAST((KFile *)d->disk_ctx); + dataflash_loadPage(fd, page); + return true; +} + +static size_t dataflash_disk_buffer_write(struct BattFsSuper *d, pgaddr_t addr, const void *buf, size_t len) +{ + DataFlash *fd = DATAFLASH_CAST((KFile *)d->disk_ctx); + dataflash_writeBlock(fd, addr, buf, len); + return len; +} + +static size_t dataflash_disk_buffer_read(struct BattFsSuper *d, pgaddr_t addr, void *buf, size_t len) +{ + DataFlash *fd = DATAFLASH_CAST((KFile *)d->disk_ctx); + ASSERT(addr + len <= mem_info[fd->dev].page_size); + + CS_TOGGLE(fd); + + kfile_putc(DFO_READ_BUFF1, fd->channel); + + uint32_t byte_addr = addr; + + kfile_putc((byte_addr >> 16) & 0xff, fd->channel); + kfile_putc((byte_addr >> 8) & 0xff, fd->channel); + kfile_putc(byte_addr & 0xff, fd->channel); + + /* Send additional don't care byte to start read operation */ + kfile_putc(0, fd->channel); + + kfile_read(fd->channel, buf, len); //Read len bytes ad put in buffer. + kfile_flush(fd->channel); // Flush channel + fd->setCS(false); + return len; +} + +static bool dataflash_disk_page_save(struct BattFsSuper *d, pgcnt_t page) +{ + DataFlash *fd = DATAFLASH_CAST((KFile *)d->disk_ctx); + dataflash_cmd(fd, page, 0x00, DFO_WRITE_BUFF1_TO_MEM); + return true; +} + +static bool dataflash_disk_page_erase(struct BattFsSuper *d, pgcnt_t page) +{ + DataFlash *fd = DATAFLASH_CAST((KFile *)d->disk_ctx); + dataflash_cmd(fd, page, 0x00, DFO_ERASE_PAGE); + return true; +} + +static int dataflash_close(struct KFile *_fd); + +static bool dataflash_disk_close(struct BattFsSuper *d) +{ + DataFlash *fd = DATAFLASH_CAST((KFile *)d->disk_ctx); + return dataflash_close(&fd->fd) == 0; +} + +bool dataflash_diskInit(struct BattFsSuper *d, DataFlash *fd, pgcnt_t *page_array) +{ + ASSERT(d); + ASSERT(fd); + d->read = dataflash_disk_page_read; + d->load = dataflash_disk_page_load; + d->bufferWrite = dataflash_disk_buffer_write; + d->bufferRead = dataflash_disk_buffer_read; + d->save = dataflash_disk_page_save; + d->erase = dataflash_disk_page_erase; + d->close = dataflash_disk_close; + d->disk_ctx = fd; + d->page_size = mem_info[fd->dev].page_size; + d->page_count = mem_info[fd->dev].page_cnt; + ASSERT(page_array); + d->page_array = page_array; + return d->page_array && fd; +} + +/* Kfile interface section */ + +/** + * Flush select page (stored in buffer) in data flash main memory page. + */ +static int dataflash_flush(KFile *_fd) +{ + DataFlash *fd = DATAFLASH_CAST(_fd); + if (fd->page_dirty) + { + dataflash_cmd(fd, fd->current_page, 0x00, DFO_WRITE_BUFF1_TO_MEM_E); + + fd->page_dirty = false; + + LOG_INFO("Flushing page {%ld}\n", fd->current_page); + } + return 0; +} + + +/** + * Close file \a fd. + */ +static int dataflash_close(struct KFile *_fd) +{ + dataflash_flush(_fd); + LOG_INFO("Close.\n"); + return 0; +} + +/** + * Reopen dataflash file \a fd. + */ +static KFile *dataflash_reopen(KFile *_fd) +{ + DataFlash *fd = DATAFLASH_CAST(_fd); + dataflash_close(_fd); + + fd->current_page = 0; + fd->fd.seek_pos = 0; + + /* Load selected page from dataflash memory */ + dataflash_loadPage(fd, fd->current_page); + + LOG_INFO("Reopen.\n"); + return &fd->fd; +} + + +/** + * Read in \a buf \a size bytes from dataflash memmory. + * + * \note For reading data flash memory, we + * check flag page_dirty, if is true (that mean + * we have written a byte in buffer memory) we + * flush current page in main memory and + * then read from memory, else we read byte + * directly from data flash main memory. + * + * \return the number of bytes read. + */ +static size_t dataflash_read(struct KFile *_fd, void *buf, size_t size) +{ + DataFlash *fd = DATAFLASH_CAST(_fd); + + dataflash_offset_t byte_addr; + dataflash_page_t page_addr; + uint8_t *data = (uint8_t *)buf; + + + ASSERT(fd->fd.seek_pos + (kfile_off_t)size <= fd->fd.size); + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); + + LOG_INFO("Reading at pos[%lu]\n", fd->fd.seek_pos); + + /* + * We select page and offest from absolute address. + */ + page_addr = fd->fd.seek_pos / mem_info[fd->dev].page_size; + byte_addr = fd->fd.seek_pos % mem_info[fd->dev].page_size; + + LOG_INFO("[page-{%ld}, byte-{%ld}]\n", page_addr, byte_addr); + + /* + * Flush current page in main memory if + * we had been written a byte in memory + */ + dataflash_flush(&fd->fd); + + /* + * Read byte in main page data flash memory. + */ + dataflash_readBlock(fd, page_addr, byte_addr, data, size); + + fd->fd.seek_pos += size; + LOG_INFO("Read %ld bytes\n", (long int)size); + + return size; +} + +/** + * Write \a _buf in dataflash memory + * + * \note For writing \a _buf in dataflash memory, we must + * first write in buffer data flash memory. At the end of write, + * we can put page in dataflash main memory. + * If we write in two contiguous pages, we put in main memory current + * page and then reload the page which we want to write. + * + * \return the number of bytes write. + */ +static size_t dataflash_write(struct KFile *_fd, const void *_buf, size_t size) +{ + DataFlash *fd = DATAFLASH_CAST(_fd); + + dataflash_offset_t offset; + dataflash_page_t new_page; + size_t total_write = 0; + + const uint8_t *data = (const uint8_t *) _buf; + + ASSERT(fd->fd.seek_pos + (kfile_off_t)size <= fd->fd.size); + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); + + LOG_INFO("Writing at pos[%lu]\n", fd->fd.seek_pos); + + while (size) + { + /* + * We select page and offest from absolute address. + */ + new_page = fd->fd.seek_pos / mem_info[fd->dev].page_size; + offset = fd->fd.seek_pos % mem_info[fd->dev].page_size; + + + size_t wr_len = MIN((dataflash_size_t)size, mem_info[fd->dev].page_size - offset); + + LOG_INFO("[page-{%ld}, byte-{%ld}]\n",new_page, offset); + + if (new_page != fd->current_page) + { + /* Flush current page in main memory*/ + dataflash_flush(&fd->fd); + /* Load select page memory from data flash memory*/ + dataflash_loadPage(fd, new_page); + + fd->current_page = new_page; + LOG_INFO(" >> Load page: {%ld}\n", new_page); + } + /* + * Write byte in current page, and set true + * page_dirty flag. + */ + dataflash_writeBlock(fd, offset, data, wr_len); + fd->page_dirty = true; + + data += wr_len; + fd->fd.seek_pos += wr_len; + size -= wr_len; + total_write += wr_len; + } + + LOG_INFO("written %lu bytes\n", (long unsigned)total_write); + return total_write; +} + +MOD_DEFINE(dataflash); + +/** + * Dataflash init function. + * This function initialize \a fd with SPI channel \a ch and test if data flash memory + * density is the same specified by device \a dev. + * \a setCS is a callback used to set/reset CS line. + * \a setReset is a callback used to set/reset the dataflash (can be NULL if reset is unconnected) + * \return true if ok, false if memory density read from dataflash is not compliant with the + * configured one. + */ +bool dataflash_init(DataFlash *fd, KFile *ch, DataflashType dev, dataflash_setCS_t *setCS, dataflash_setReset_t *setReset) +{ + uint8_t stat; + + MOD_CHECK(hw_dataflash); + + ASSERT(fd); + ASSERT(ch); + ASSERT(setCS); + ASSERT(dev < DFT_CNT); + + memset(fd, 0, sizeof(*fd)); + DB(fd->fd._type = KFT_DATAFLASH); + fd->dev = dev; + fd->channel = ch; + fd->setReset = setReset; + fd->setCS = setCS; + + // Setup data flash programming functions. + fd->fd.reopen = dataflash_reopen; + fd->fd.close = dataflash_close; + fd->fd.read = dataflash_read; + fd->fd.write = dataflash_write; + fd->fd.seek = kfile_genericSeek; + fd->fd.flush = dataflash_flush; + + dataflash_reset(fd); + stat = dataflash_stat(fd); + + /* + * 2,3,4,5 bits of 1 byte status register + * indicate a device density of dataflash memory + * (see datasheet for more detail.) + */ + if (GET_ID_DESITY_DEVICE(stat) != mem_info[fd->dev].density_id) + return false; + + fd->current_page = 0; + fd->fd.seek_pos = 0; + fd->fd.size = mem_info[fd->dev].page_size * mem_info[fd->dev].page_cnt; + + /* Load selected page from dataflash memory */ + dataflash_loadPage(fd, fd->current_page); + MOD_INIT(dataflash); + return true; +} diff --git a/2.5/bertos/drv/dataflash.h b/2.5/bertos/drv/dataflash.h new file mode 100644 index 00000000..dd805ad2 --- /dev/null +++ b/2.5/bertos/drv/dataflash.h @@ -0,0 +1,206 @@ +/** + * \file + * + * + * \brief Function library for dataflash AT45DB family. + * + * \version $Id$ + * + * \author Daniele Basile + * + * $WIZ$ module_name = "dataflash" + * $WIZ$ module_depends = "kfile" + * $WIZ$ module_configuration = "bertos/cfg/cfg_dataflash.h" + * $WIZ$ module_hw = "bertos/hw/hw_dataflash.h", "bertos/hw/hw_dataflash.c" + */ + + +#ifndef DRV_DATAFLASH_H +#define DRV_DATAFLASH_H + +#include + +#include +#include + +/** + * Type definitions for dflash memory. + * \{ + */ +typedef uint32_t dataflash_page_t; +typedef uint32_t dataflash_offset_t; +typedef uint32_t dataflash_size_t; +/*\}*/ + +/** + * + */ +typedef void (dataflash_setReset_t)(bool); +typedef void (dataflash_setCS_t)(bool); + +/** + * Memory definitions. + * + * List of supported memory devices by this drive. + * Every time we call dataflash_init() we check device id to + * ensure we choose the right memory configuration. + * (see dataflash.c for more details). + */ +typedef enum DataflashType +{ + DFT_AT45DB041B = 0, + DFT_AT45DB081D, + DFT_AT45DB161D, + DFT_AT45DB642D, + DFT_CNT +} DataflashType; + + +/** + * Dataflash KFile context structure. + */ +typedef struct DataFlash +{ + KFile fd; ///< File descriptor. + KFile *channel; ///< Dataflash comm channel (usually SPI). + DataflashType dev; ///< Memory device type; + dataflash_page_t current_page; ///< Current loaded dataflash page. + bool page_dirty; ///< True if current_page is dirty (needs to be flushed). + dataflash_setReset_t *setReset; ///< Callback used to set reset pin of dataflash. + dataflash_setCS_t *setCS; ///< Callback used to set CS pin of dataflash. +} DataFlash; + +/** + * ID for dataflash. + */ +#define KFT_DATAFLASH MAKE_ID('D', 'F', 'L', 'H') + +/** + * Convert + ASSERT from generic KFile to DataFlash. + */ +INLINE DataFlash * DATAFLASH_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_DATAFLASH); + return (DataFlash *)fd; +} + +#define RESET_PULSE_WIDTH 10 ///< Width of reset pulse in usec. +#define BUSY_BIT 0x80 ///< Select a busy bit in status register. +#define CMP_BIT 0x40 ///< Select a compare bit in status register. + +/** + * Select bits 2-5 of status register. These + * bits indicate device density (see datasheet for + * more details). + */ +#define GET_ID_DESITY_DEVICE(reg_stat) (((reg_stat) & 0x3C) >> 2) + +/** + * Data flash opcode commands. + */ +typedef enum DataFlashOpcode { + /** + * Dataflash read commands. + * \{ + */ + DFO_READ_FLASH_MEM_BYTE_D = 0x0B, ///< Continuos array read for D type memories. + DFO_READ_FLASH_MEM_BYTE_B = 0xE8, ///< Continuos array read for B type memories. + + DFO_READ_FLASH_MEM = 0xD2, ///< Main memory page read. + DFO_READ_BUFF1 = 0xD4, ///< SRAM buffer 1 read. + DFO_READ_BUFF2 = 0xD6, ///< SRAM buffer 2 read. + /* \}*/ + + /** + * Program and erase commands data flash. + * \{ + */ + DFO_WRITE_BUFF1 = 0x84, ///< SRAM buffer 1 write. + DFO_WRITE_BUFF2 = 0x87, ///< SRAM buffer 2 write. + DFO_WRITE_BUFF1_TO_MEM_E = 0x83, ///< Buffer 1 to main memory page program with built-in erase. + DFO_WRITE_BUFF2_TO_MEM_E = 0x86, ///< Buffer 2 to main memory page program with built-in erase. + DFO_WRITE_BUFF1_TO_MEM = 0x88, ///< Buffer 1 to main memory page program without built-in erase. + DFO_WRITE_BUFF2_TO_MEM = 0x89, ///< Buffer 2 to main memory page program without built-in erase. + DFO_ERASE_PAGE = 0x81, ///< Erase page. + DFO_ERASE_BLOCK = 0x50, ///< Erase block. + DFO_ERASE_SECTOR = 0x7C, ///< Erase sector. + DFO_WRITE_MEM_TR_BUFF1 = 0x82, ///< Write main memory page through buffer 1. + DFO_WRITE_MEM_TR_BUFF2 = 0x85, ///< Write main memory page through buffer 2. + /* \}*/ + + /** + * Additional dataflash commands. + * \{ + */ + DFO_MOV_MEM_TO_BUFF1 = 0x53, ///< Transfer main mmemory to buffer 1. + DFO_MOV_MEM_TO_BUFF2 = 0x55, ///< Transfer main mmemory to buffer 2. + DFO_CMP_MEM_TO_BUFF1 = 0x60, ///< Compare main mmemory with buffer 1. + DFO_CMP_MEM_TO_BUFF2 = 0x61, ///< Compare main mmemory with buffer 2. + DFO_ARW_MEM_TR_BUFF1 = 0x58, ///< Auto page rewrite through buffer 1. + DFO_ARW_MEM_TR_BUFF2 = 0x59, ///< Auto page rewrite through buffer 2 + DFO_PWR_DOWN = 0xB9, ///< Deep power-down. + DFO_RESUME_PWR_DOWN = 0xAB, ///< Resume from deep power-down. + DFO_READ_STATUS = 0xD7, ///< Read status register. + DFO_ID_DEV = 0x9F ///< Read manufacturer and device ID. + /* \}*/ +} DataFlashOpcode; + + +/** + * Structure used to describe a dataflash memory. + */ +typedef struct DataflashInfo +{ + uint8_t density_id; ///< Density id, used to check memory type. + dataflash_size_t page_size; ///< Page size, in bytes. + uint8_t page_bits; ///< Number of bits needed to access a page. + uint16_t page_cnt; ///< Number of pages on memory. + DataFlashOpcode read_cmd; ///< Command to be used to perform a continuous array. +} DataflashInfo; + + +bool dataflash_init(DataFlash *fd, KFile *ch, DataflashType type, dataflash_setCS_t *setCS, dataflash_setReset_t *setReset); +bool dataflash_diskInit(struct BattFsSuper *d, DataFlash *fd, pgcnt_t *page_array); + +/** + * To test data falsh drive you could use + * this functions. To use these functions make sure to include in your make file the + * drv/datafalsh_test.c source. + * + * (see drv/datafalsh_test.c for more detail) + */ +int dataflash_testSetup(void); +/* For backward compatibility */ +#define dataflash_testSetUp() dataflash_testSetup() +int dataflash_testRun(void); +int dataflash_testTearDown(void); + +#endif /* DRV_DATAFLASH_H */ diff --git a/2.5/bertos/drv/dataflash_hwtest.c b/2.5/bertos/drv/dataflash_hwtest.c new file mode 100644 index 00000000..fa5f480e --- /dev/null +++ b/2.5/bertos/drv/dataflash_hwtest.c @@ -0,0 +1,231 @@ +/** + * \file + * + * + * \brief DataFlash test. + * + * This module test the dataflash memory among the supported memory (see drv/dataflash.h + * for more detail). + * To test memory we fill one buffer with casual char, and write it in different + * part of memory. After every write we read the data that we have been write + * and compare this with test buffer, checking if write and read command work + * correclty. We also check if driver work properly when we make a write out the + * limit of memory size. + * + * Note: dataflash driver use a kfile interface, so for write/read test + * we use a kfile_test module that perform some generic test. + * + * + * \version $Id$ + * \author Daniele Basile + */ + +#include "hw/hw_dataflash.h" +#include "cfg/cfg_dataflash.h" +#include "cfg/cfg_proc.h" + +#include +#include +#include + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL DATAFLASH_LOG_LEVEL +#define LOG_FORMAT DATAFLASH_LOG_FORMAT +#include // for logging system + +#include +#include +#include + +#include +#include + +#include + +/* + * Settings for dataflash test + * + * \{ + */ +// Datafalsh type memory to test (see drv/dataflash.h for supported memory types) +#define DATAFLASH_MEM_MODEL DFT_AT45DB642D + +// Function to set CS, this is typically implement in hw/hw_dataflash.{c, h} +#define DATAFLASH_FUNC_CS_SET dataflash_hw_setCS + +// Function to reset memery, this is typically implement in hw/hw_dataflash.{c, h} +#define DATAFLASH_FUNC_RESET NULL + +// Buffer len to test dataflash +#define DATAFLASH_TEST_STR_LEN 12307 + +// If you want use a rand function of standard library set to 1. +#define DATAFLASH_USE_RAND_FUNC 0 +/* \} */ + +/* + * Kfile structure to test a dataflash. + */ +static Serial spi_fd; +static DataFlash dflash_fd; + +/* + * Define tmp buffer to stora data for + * write and read flash memory test. + */ +static uint8_t test_buf[DATAFLASH_TEST_STR_LEN]; +static uint8_t save_buf[DATAFLASH_TEST_STR_LEN]; + +/** + * Setup all needed to test dataflash memory + * + */ +int dataflash_testSetup(void) +{ + kfile_testSetup(); + LOG_INFO("KFILE setup..ok\n"); + + LOG_INFO("Check if kernel is enable (if enable you should see the assert message.)\n"); + SILENT_ASSERT("bertos/drv/dataflash_test.c:119: Assertion failed: !CONFIG_KERN"); + ASSERT(!CONFIG_KERN); + + /* + * This test use a kfile_test module, + * so should include source in your makefile. + */ + MOD_CHECK(kfile_test); + + timer_init(); + LOG_INFO("Timer init..ok\n"); + + /* + * Init SPI module and dataflash driver. + */ + // Open SPI comunication channel + spimaster_init(&spi_fd, 0); + LOG_INFO("SPI0 init..ok\n"); + + ser_setbaudrate(&spi_fd, 5000000UL); + LOG_INFO("SPI0 set baudrate..ok\n"); + + //Init dataflash memory + dataflash_hw_init(); + LOG_INFO("DATAFLASH HW..ok\n"); + + if (dataflash_init(&dflash_fd, &spi_fd.fd, DATAFLASH_MEM_MODEL, DATAFLASH_FUNC_CS_SET, DATAFLASH_FUNC_RESET)) + LOG_INFO("DATAFLASH init..ok\n"); + else + LOG_ERR("DATAFLASH init..fail\n"); + + + //Fill tmp buffer with rand chars. + for (int i = 0; i < DATAFLASH_TEST_STR_LEN; i++) + { + #if DATAFLASH_USE_RAND_FUNC + #include //Rand() + + test_buf[i] = (uint8_t)rand(); + #else + test_buf[i] = (i & 0xff); + #endif + } + + LOG_INFO("Fill tmp buff..ok\n"); + + return 0; +} + + +/** + * Run dataflash test memory + * + */ +int dataflash_testRun(void) +{ + LOG_INFO("Run KFILE test.\n"); + + SILENT_ASSERT("bertos/drv/dataflash.c:405: Assertion failed: fd->fd.seek_pos + size <= fd->fd.size"); + if (kfile_testRunGeneric(&dflash_fd.fd, test_buf, save_buf, sizeof(test_buf)) != EOF) + { + LOG_INFO("KFILE test..ok\n"); + } + else + { + LOG_ERR("KFILE test..fail!\n"); + return EOF; + } + + return 0; +} + +/** + * End a dataflash Test. + * (Unused) + */ +int dataflash_testTearDown(void) +{ + /* */ + return 0; +} + +/* + * Empty main. + * + * Look it as exmple, or use it if + * you want test a data flash driver stand alone. + */ +#if 0 +int main(void) +{ + IRQ_ENABLE; + kdbg_init(); + + #if CONFIG_KERN + proc_init(); + #endif + + if (!dataflash_testSetup()) + { + LOG_INFO("DATAFLASH setup..ok\n"); + } + else + { + LOG_ERR("DATAFLASH setup..fail!\n"); + return EOF; + } + + dataflash_testRun(); + + for(;;) + { + } +} +#endif diff --git a/2.5/bertos/drv/dc_motor.c b/2.5/bertos/drv/dc_motor.c new file mode 100644 index 00000000..bd0dd0a4 --- /dev/null +++ b/2.5/bertos/drv/dc_motor.c @@ -0,0 +1,488 @@ +/** + * \file + * + * + * + * \brief DC motor driver (implementation) + * + * Thi module provide a simple api to controll a DC motor in direction and + * speed, to allow this we use a Back-EMF technique. + * This technique is based, on the capability of the DC motor to become a generator + * of voltage when we turn off its supply. This happen every time we turn off the + * DC motor supply, and it continues to rotate for a short time thanks to its mechanical + * energy. Using this idea we can turn off the motor for a very short time, and + * we read the volage value from DC motor supply pins. This voltage say to us + * the actual speed of the motor. + * + * \author Daniele Basile + */ + +#include "dc_motor.h" +#include "hw/hw_dc_motor.h" + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL DC_MOTOR_LOG_LEVEL +#define LOG_FORMAT DC_MOTOR_LOG_FORMAT + +#include +#include + +#include + +#include + +#include + +#include + +#include + +/** + * Define status bit for DC motor device. + */ +#define DC_MOTOR_ACTIVE BV(0) ///< DC motor enable or disable flag. +#define DC_MOTOR_DIR BV(1) ///< Spin direction of DC motor. + +/* + * Some utility macro for motor directions + */ +#define POS_DIR 1 +#define NEG_DIR 0 +#define DC_MOTOR_POS_DIR(x) ((x) |= DC_MOTOR_DIR) // Set directions status positive +#define DC_MOTOR_NEG_DIR(x) ((x) &= ~DC_MOTOR_DIR) // Set directions status negative + +// Update the status with current direction +#define DC_MOTOR_SET_STATUS_DIR(status, dir) \ + (dir == POS_DIR ? DC_MOTOR_POS_DIR(status) : DC_MOTOR_NEG_DIR(status)) + +#if (CONFIG_KERN && CONFIG_KERN_PREEMPT) + #if CONFIG_DC_MOTOR_USE_SEM + #include + + Semaphore dc_motor_sem; + #define DC_MOTOR_LOCK sem_obtain(&dc_motor_sem) + #define DC_MOTOR_UNLOCK sem_release(&dc_motor_sem) + #else + #define DC_MOTOR_LOCK proc_forbid() + #define DC_MOTOR_UNLOCK proc_permit() + #endif +#else + #define DC_MOTOR_LOCK /* None */ + #define DC_MOTOR_UNLOCK /* None */ +#endif + +/** + * DC motor definition. + */ +static DCMotor dcm_all[CONFIG_NUM_DC_MOTOR]; + +/* + * Process to poll dc motor status + */ +struct Process *dc_motor; + + +// Stack process for DC motor poll. +static PROC_DEFINE_STACK(dc_motor_poll_stack, 500); + +// Only for Debug +LOG_INFOB(static int debug_msg_delay = 0;); + + +INLINE dc_speed_t dc_motor_readSpeed(int index) +{ + DCMotor *dcm = &dcm_all[index]; + return HW_DC_MOTOR_READ_VALUE(dcm->cfg->adc_ch, dcm->cfg->adc_min, dcm->cfg->adc_max); +} + +/** + * Read the target speed from select device. + */ +dc_speed_t dc_motor_readTargetSpeed(int index) +{ + DCMotor *dcm = &dcm_all[index]; + return HW_DC_MOTOR_READ_VALUE(dcm->cfg->speed_dev_id, CONFIG_DC_MOTOR_MIN_SPEED, CONFIG_DC_MOTOR_MAX_SPEED); +} + +static void dc_motor_start(int index) +{ + DCMotor *dcm = &dcm_all[index]; + + DC_MOTOR_LOCK; + /* + * Clean all PID stutus variable, becouse + * we start with new one. + */ + pid_control_reset(&dcm->pid_ctx); + dcm->status |= DC_MOTOR_ACTIVE; + DC_MOTOR_UNLOCK; +} + +/* + * There are two \a mode to stop the dc motor: + * - DC_MOTOR_DISABLE_MODE + * - DC_MOTOR_IDLE + * + * The DC_MOTOR_DISABLE_MODE shut down the DC motor and + * leave it floating to rotate. + * The DC_MOTOR_IDLE does not shut down DC motor, but put + * its supply pin in short circuite, in this way the motor result + * braked from intentional rotation. + */ +static void dc_motor_stop(int index) +{ + DCMotor *dcm = &dcm_all[index]; + + DC_MOTOR_LOCK; + + dcm->status &= ~DC_MOTOR_ACTIVE; + dcm->expire_time = DC_MOTOR_NO_EXPIRE; + pwm_enable(dcm->cfg->pwm_dev, false); + + if (dcm->cfg->braked) + { + DC_MOTOR_STOP_BRAKED(dcm->index); + } + else + { + DC_MOTOR_STOP_FLOAT(dcm->index); + } + + DC_MOTOR_UNLOCK; +} + +/* + * Sampling a signal on DC motor and compute + * a new value of speed according with PID control. + */ +static void dc_motor_do(int index) +{ + DCMotor *dcm = &dcm_all[index]; + + dc_speed_t curr_pos = 0; + pwm_duty_t new_pid = 0; + + DC_MOTOR_LOCK; + + //If select DC motor is not active we return + if (!(dcm->status & DC_MOTOR_ACTIVE)) + { + DC_MOTOR_UNLOCK; + return; + } + + /* + * To set dc motor direction we must also set the + * PWM polarity according with dc motor driver chip + */ + pwm_setPolarity(dcm->cfg->pwm_dev, dcm->status & DC_MOTOR_DIR); + DC_MOTOR_SET_DIR(dcm->index, dcm->status & DC_MOTOR_DIR); + + //Compute next value for reaching target speed from current position + if (dcm->cfg->pid_enable) + { + /* + * Here we cannot disable the switch context because the + * driver, that read the speed could be need to use signal or + * other thing that needs the kernel switch context, for this + * reason we unlock before to read the speed. + */ + DC_MOTOR_UNLOCK; + curr_pos = dc_motor_readSpeed(index); + DC_MOTOR_LOCK; + new_pid = pid_control_update(&dcm->pid_ctx, dcm->tgt_speed, curr_pos); + } + else + { + new_pid = dcm->tgt_speed; + } + + LOG_INFOB( + if (debug_msg_delay == 20) + { + LOG_INFO("DC Motor[%d]: curr_speed[%d],curr_pos[%d],tgt[%d]\n", dcm->index, + curr_pos, new_pid, dcm->tgt_speed); + debug_msg_delay = 0; + } + debug_msg_delay++; + ); + + //Apply the compute duty value + pwm_setDuty(dcm->cfg->pwm_dev, new_pid); + + //Restart dc motor + pwm_enable(dcm->cfg->pwm_dev, true); + + DC_MOTOR_ENABLE(dcm->index); + DC_MOTOR_UNLOCK; +} + + +/* + * Check if the DC motor run time is expired, if this happend + * we turn off motor and reset status. + */ +INLINE bool check_timerIsExpired(int index) +{ + + DC_MOTOR_LOCK; + bool check = ((dcm_all[index].expire_time - timer_clock()) < 0) && + (dcm_all[index].expire_time != DC_MOTOR_NO_EXPIRE); + DC_MOTOR_UNLOCK; + + return check; +} + +/** + * Process to poll DC motor status. + * To use a Back-EMF technique (see brief for more details), + * we turn off a motor for CONFIG_DC_MOTOR_SAMPLE_DELAY, that value are stored + * in each DC motor config. For this implementation we assume + * that have a common CONFIG_DC_MOTOR_SAMPLE_DELAY, choose among a max delay + * to all DC motor configuration. + * The DC motor off time is choose to allow the out signal to + * be stable, so we can read and process this value for feedback controll loop. + * The period (CONFIG_DC_MOTOR_SAMPLE_PERIOD - CONFIG_DC_MOTOR_SAMPLE_DELAY) + * that every time we turn off a DC motor is choose to have a feedback controll + * more responsive or less responsive. + */ +static void NORETURN dc_motor_poll(void) +{ + for (;;) + { + /* + * For all DC motor we read and process output singal, + * and choose the max value to off time + */ + for (int i = 0; i < CONFIG_NUM_DC_MOTOR; i++) + { + if (!dcm_all[i].cfg) + continue; + + if (check_timerIsExpired(i)) + dc_motor_stop(i); + else + dc_motor_do(i); + + /* + * If we read speed from trimmer we update the target + * speed value when motor is running so we can make + * dc motor speed regulation. + */ + if (dcm_all[i].cfg->speed_dev_id != DC_MOTOR_NO_DEV_SPEED) + dc_motor_setSpeed(i, dc_motor_readTargetSpeed(i)); + } + + //Wait for next sampling + timer_delay(CONFIG_DC_MOTOR_SAMPLE_PERIOD - CONFIG_DC_MOTOR_SAMPLE_DELAY); + + for (int i = 0; i < CONFIG_NUM_DC_MOTOR; i++) + { + if (!dcm_all[i].cfg) + continue; + + if (check_timerIsExpired(i)) + dc_motor_stop(i); + + DC_MOTOR_LOCK; + if (dcm_all[i].status & DC_MOTOR_ACTIVE) + { + DC_MOTOR_DISABLE(dcm_all[i].index); + pwm_enable(dcm_all[i].cfg->pwm_dev, false); + } + DC_MOTOR_UNLOCK; + } + + //Wait some time to allow signal to stabilize before sampling + timer_delay(CONFIG_DC_MOTOR_SAMPLE_DELAY); + } +} + +/** + * Set spin direction of DC motor. + * + * \a index number of DC motor + * \a dir direction of DC motor + */ +void dc_motor_setDir(int index, bool dir) +{ + DCMotor *dcm = &dcm_all[index]; + DC_MOTOR_LOCK; + DC_MOTOR_SET_STATUS_DIR(dcm->status, dir); + DC_MOTOR_UNLOCK; +} + +/** + * Set DC motor speed. + */ +void dc_motor_setSpeed(int index, dc_speed_t speed) +{ + DCMotor *dcm = &dcm_all[index]; + + DC_MOTOR_LOCK; + dcm->tgt_speed = speed; + DC_MOTOR_UNLOCK; + + LOG_INFO("DC Motor[%d]: tgt_speed[%d]\n", index, dcm->tgt_speed); +} + +/** + * Set among of time that dc motor should run. + */ +void dc_motor_startTimer(int index, mtime_t on_time) +{ + DC_MOTOR_LOCK; + dcm_all[index].expire_time = DC_MOTOR_NO_EXPIRE; + if (on_time != DC_MOTOR_NO_EXPIRE) + { + dcm_all[index].expire_time = timer_clock() + ms_to_ticks(on_time); + dc_motor_start(index); + } + DC_MOTOR_UNLOCK; +} + +void dc_motor_waitStop(int index) +{ + DCMotor *dcm = &dcm_all[index]; + bool loop = true; + + while (loop) + { + DC_MOTOR_LOCK; + loop = dcm->status & DC_MOTOR_ACTIVE; + DC_MOTOR_UNLOCK; + + cpu_relax(); + } +} + +/** + * Enable or disable dc motor. + */ +void dc_motor_enable(int index, bool state) +{ + if (state) + dc_motor_start(index); + else + dc_motor_stop(index); +} + +/** + * Apply a confinguration to select DC motor. + */ +void dc_motor_setup(int index, DCMotorConfig *dcm_conf) +{ + DCMotor *dcm = &dcm_all[index]; + + DC_MOTOR_LOCK; + /* + * We are using the same sample period for each + * motor, and so we check if this value is the same + * for all. The sample period time is defined in pid + * configuration. + * + * TODO: Use a different sample period for each motor + * and refactor a module to allow to use a timer interrupt, + * in this way we can controll a DC motor also without a + * kernel, increasing a portability on other target. + */ + pid_control_setPeriod(&dcm_conf->pid_cfg, CONFIG_DC_MOTOR_SAMPLE_PERIOD); + + //Init pid control + pid_control_init(&dcm->pid_ctx, &dcm_conf->pid_cfg); + + + dcm->cfg = dcm_conf; + + /* + * Apply config value. + */ + dcm->index = index; + + /* + * By default the motor run forever.. + */ + dcm->expire_time = DC_MOTOR_NO_EXPIRE; + + /* + * By default set target speed. + */ + dcm->tgt_speed = dcm_conf->speed; + + /* + * Clear the status. + */ + dcm->status = 0; + + pwm_setFrequency(dcm->cfg->pwm_dev, dcm->cfg->freq); + pwm_enable(dcm->cfg->pwm_dev, false); + + //Set default direction for DC motor + DC_MOTOR_SET_DIR(dcm->index, dcm->cfg->dir); + DC_MOTOR_SET_STATUS_DIR(dcm->status, dcm->cfg->dir); + + DC_MOTOR_UNLOCK; + + LOG_INFO("DC motor[%d]:\n", dcm->index); + LOG_INFO("> PID: kp[%f],ki[%f],kd[%f]\n", dcm->cfg->pid_cfg.kp, dcm->cfg->pid_cfg.ki, dcm->cfg->pid_cfg.kd); + LOG_INFO("> PWM: pwm_dev[%d], freq[%ld], sample[%d]\n", dcm->cfg->pwm_dev, dcm->cfg->freq,CONFIG_DC_MOTOR_SAMPLE_DELAY); + LOG_INFO("> ADC: adc_ch[%d], adc_max[%d], adc_min[%d]\n", dcm->cfg->adc_ch, dcm->cfg->adc_max, dcm->cfg->adc_min); + LOG_INFO("> DC: dir[%d], speed[%d]\n", dcm->cfg->dir, dcm->cfg->speed); +} + +/** + * If we had enabled the priority scheduling, we can adjust the + * DC motor poll process priority. + */ +void dc_motor_setPriority(int priority) +{ + ASSERT(CONFIG_KERN); + ASSERT(dc_motor); + proc_setPri(dc_motor, priority); +} + +/** + * Init DC motor. + * \a priority: sets the dc motor process priority. + */ +void dc_motor_init(void) +{ + ASSERT(CONFIG_KERN); + + MOTOR_DC_INIT(); + + #if (CONFIG_KERN_PREEMPT && CONFIG_DC_MOTOR_USE_SEM) + sem_init(&dc_motor_sem); + #endif + + //Create a dc motor poll process + dc_motor = proc_new_with_name("DC_Motor", dc_motor_poll, NULL, sizeof(dc_motor_poll_stack), dc_motor_poll_stack); +} + diff --git a/2.5/bertos/drv/dc_motor.h b/2.5/bertos/drv/dc_motor.h new file mode 100644 index 00000000..94942075 --- /dev/null +++ b/2.5/bertos/drv/dc_motor.h @@ -0,0 +1,126 @@ +/** + * \file + * + * + * + * \brief DC motor driver. + * + * \author Daniele Basile + * + * $WIZ$ module_name = "dc_motor" + * $WIZ$ module_depends = "pwm", "pid_control", "adc", "timer" + * $WIZ$ module_configuration = "bertos/cfg/cfg_dc_motor.h" + * $WIZ$ module_hw = "bertos/hw/hw_dc_motor.h" + */ + +#ifndef DRV_DC_MOTOR_H +#define DRV_DC_MOTOR_H + +#include "hw/hw_dc_motor.h" + +#include "cfg/cfg_dc_motor.h" +#include + +#include + +#include +#include +#include + +#define DC_MOTOR_NO_EXPIRE -1 ///< The DC motor runs do not expire, so it runs forever. +#define DC_MOTOR_NO_DEV_SPEED -1 ///< Disable the speed acquire from device (like trimmer, etc.). + +/** + * Type for DC motor. + */ +typedef uint16_t dc_speed_t; + +/** + * DC motor configuration stucture + */ +typedef struct DCMotorConfig +{ + PidCfg pid_cfg; ///< Pid control. + bool pid_enable; ///< Flag to disable or enable pid control. + + PwmDev pwm_dev; ///< Pwm channel. + pwm_freq_t freq; ///< Pwm waveform frequency. + + adc_ch_t adc_ch; ///< ADC channel. + adcread_t adc_max; ///< ADC max scale value. + adcread_t adc_min; ///< ADC min scale value. + + bool dir; ///< Default direction for select DC motor. + bool braked; ///< If true the motor is braked when we turn off it. + + dc_speed_t speed; ///< Default speed value for select DC motor. + + int speed_dev_id; ///< Index of the device where read speed, to disable set to DC_MOTOR_NO_DEV_SPEED. + +} DCMotorConfig; + + +/** + * Context structure for DC motor. + */ +typedef struct DCMotor +{ + const DCMotorConfig *cfg; ///< All configuration for select DC motor. + PidContext pid_ctx; ///< Pid control. + + int index; ///< DC motor id. + uint32_t status; ///< Status of select DC motor + dc_speed_t tgt_speed; ///< Target speed for select DC motor + + ticks_t expire_time; ///< Amount of time that dc motor run + +} DCMotor; + +void dc_motor_setDir(int index, bool dir); +void dc_motor_enable(int index, bool state); +void dc_motor_setSpeed(int index, dc_speed_t speed); +void dc_motor_startTimer(int index, mtime_t on_time); +void dc_motor_waitStop(int index); +void dc_motor_setup(int index, DCMotorConfig *dcm_conf); +dc_speed_t dc_motor_readTargetSpeed(int index); +void dc_motor_setPriority(int priority); +void dc_motor_init(void); + + +/** + * Test function prototypes. + * + * See dc_motor_hwtest.c file. + */ +int dc_motor_testSetUp(void); +void dc_motor_testRun(void); +int dc_motor_testTearDown(void); + +#endif /* DRV_DC_MOTOR_H */ diff --git a/2.5/bertos/drv/dc_motor_hwtest.c b/2.5/bertos/drv/dc_motor_hwtest.c new file mode 100644 index 00000000..477d35aa --- /dev/null +++ b/2.5/bertos/drv/dc_motor_hwtest.c @@ -0,0 +1,178 @@ +/** + * \file + * + * + * + * \brief Test for PWM driver (implementation) + * + * This is a simple test for PWM driver. This module + * is target independent, so you can test all target that + * BeRTOS support. + * To use this test you should include a pwm_map.h header where + * are defined the PWM channels for your target. Then you should add + * or remove a test setting in pwm_test_cfg array, and edit a value for + * your specific test. + * Afther this, all is ready and you can test PWM driver. + * + * The test check first if all PWM channel starts, and then try + * to change a PWM duty cicle for all channel. + * The change of duty cycle is operate when a PWM channel is enable, + * in this way you can see if a pwm signal is clean and work properly. + * The duty value is change incrementaly, and when it arrive to 100% or 0%, + * we reset the duty value and restart the test. + * Further the duty test, we check also a PWM polarity, infact when we + * reach a reset duty value, we invert a polary of PWM wavform. + * So you can see if the hardware manage correctly this situation. + * + * Note: To be simple and target independently we not use a timer module, + * and so the delay is do with a for cycle. + * + * \author Daniele Basile + * + * \brief HW test for DC Motor. + */ + +#include + +#include +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL DC_MOTOR_LOG_LEVEL +#define LOG_VERBOSITY DC_MOTOR_LOG_FORMAT +#include + + +#include + +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include + +static DCMotorConfig motor = +{ + /* PID */ + { + .kp = 1, /* Proportional coefficient */ + .ki = 4, /* Integral coefficient */ + .kd = 0.008, /* Derivate coefficient */ + .i_max = 2E33, /* Integrale max error value */ + .i_min = -2E33, /* Integrale min error value */ + .out_max = 65535, /* Max output value */ + .out_min = 0, /* Min output value */ + .sample_period = 0 /* Millisecod between 2 output singal sampling */ + }, + .pid_enable = true, /* Enable or disable pid control */ + + /* PWM */ + .pwm_dev = 2, /* PWM channel */ + .freq = 3000, /* Frquency of PWM output waveform */ + + /* ADC */ + .adc_ch = 2, /* ADC channel */ + .adc_max = 65535, /* Max range value for ADC */ + .adc_min = 0, /* Min range value for ADC */ + + /* DC Motor */ + .dir = 1, /* Default spin direction of DC motor */ + .braked = true, + + .speed = 10000, /* Fixed speed value for seldc_motor_enableect DC motor, if enable_dev_speed flag is false */ + .speed_dev_id = 7, /* Index of the device where read speed */ +}; + +int dc_motor_testSetUp(void) +{ + IRQ_ENABLE; + kdbg_init(); + timer_init(); + proc_init(); + pwm_init(); + adc_init(); + + return 0; +} + +#define MOTOR 2 + +void NORETURN dc_motor_testRun(void) +{ + dc_motor_init(); + + /* + * Assign the configuration to motor. + */ + dc_motor_setup(MOTOR, &motor); + + while (1) + { + /* + * Using enable and disable + */ + dc_motor_setDir(MOTOR, 1); + dc_motor_setSpeed(MOTOR, 10000); + dc_motor_enable(MOTOR, true); + timer_delay(500); + dc_motor_enable(MOTOR, false); + + + dc_motor_setDir(MOTOR, 0); + dc_motor_setSpeed(MOTOR, 60000); + dc_motor_enable(MOTOR, true); + timer_delay(150); + dc_motor_enable(MOTOR, false); + + /* + * Using timer + */ + dc_motor_setDir(MOTOR, 1); + dc_motor_setSpeed(MOTOR, 60000); + dc_motor_startTimer(MOTOR, 150); + dc_motor_waitStop(MOTOR); + + dc_motor_setDir(MOTOR, 0); + dc_motor_setSpeed(MOTOR, 10000); + dc_motor_startTimer(MOTOR, 500); + dc_motor_waitStop(MOTOR); + } + +} + +int dc_motor_testTearDown(void) +{ + return 0; +} diff --git a/2.5/bertos/drv/eeprom.c b/2.5/bertos/drv/eeprom.c new file mode 100644 index 00000000..470d85cd --- /dev/null +++ b/2.5/bertos/drv/eeprom.c @@ -0,0 +1,399 @@ +/** + * \file + * + * + * \brief Driver for the 24xx16 and 24xx256 I2C EEPROMS (implementation) + * + * \author Stefano Fedrigo + * \author Bernie Innocenti + */ + +#include "eeprom.h" + +#include // MIN() +#include +#include // MOD_CHECK() + +#include +#include + +#include + +#include // cpu_to_be16() + +#include // memset() + +/** + * EEPROM ID code + */ +#define EEPROM_ID 0xA0 + +/** + * This macros form the correct slave address for EEPROMs + */ +#define EEPROM_ADDR(x) (EEPROM_ID | (((uint8_t)((x) & 0x07)) << 1)) + + +/** + * Array used to describe EEPROM memory devices currently supported. + */ +static const EepromInfo mem_info[] = +{ + { + /* 24XX08 */ + .has_dev_addr = false, + .blk_size = 0x10, + .e2_size = 0x400, + }, + { + /* 24XX16 */ + .has_dev_addr = false, + .blk_size = 0x10, + .e2_size = 0x800, + }, + { + /* 24XX256 */ + .has_dev_addr = true, + .blk_size = 0x40, + .e2_size = 0x8000, + }, + { + /* 24XX512 */ + .has_dev_addr = true, + .blk_size = 0x80, + .e2_size = 0x10000, + }, + { + /* 24XX1024 */ + .has_dev_addr = true, + .blk_size = 0x100, + .e2_size = 0x20000, + }, + + /* Add other memories here */ +}; + +STATIC_ASSERT(countof(mem_info) == EEPROM_CNT); + + +/** + * Copy \a size bytes from buffer \a buf to + * eeprom. + */ +static size_t eeprom_writeRaw(struct KFile *_fd, const void *buf, size_t size) +{ + Eeprom *fd = EEPROM_CAST(_fd); + e2dev_addr_t dev_addr; + uint8_t addr_buf[2]; + uint8_t addr_len; + size_t wr_len = 0; + + e2blk_size_t blk_size = mem_info[fd->type].blk_size; + + STATIC_ASSERT(countof(addr_buf) <= sizeof(e2addr_t)); + + /* clamp size to memory limit (otherwise may roll back) */ + ASSERT(_fd->seek_pos + (kfile_off_t)size <= (kfile_off_t)_fd->size); + size = MIN((kfile_off_t)size, _fd->size - _fd->seek_pos); + + if (mem_info[fd->type].has_dev_addr) + { + dev_addr = fd->addr; + addr_len = 2; + } + else + { + dev_addr = (e2dev_addr_t)((fd->fd.seek_pos >> 8) & 0x07); + addr_len = 1; + } + + while (size) + { + /* + * Split write in multiple sequential mode operations that + * don't cross page boundaries. + */ + size_t count = MIN(size, (size_t)(blk_size - (fd->fd.seek_pos & (blk_size - 1)))); + + if (mem_info[fd->type].has_dev_addr) + { + addr_buf[0] = (fd->fd.seek_pos >> 8) & 0xFF; + addr_buf[1] = (fd->fd.seek_pos & 0xFF); + } + else + { + dev_addr = (e2dev_addr_t)((fd->fd.seek_pos >> 8) & 0x07); + addr_buf[0] = (fd->fd.seek_pos & 0xFF); + } + + + if (!(i2c_start_w(EEPROM_ADDR(dev_addr)) + && i2c_send(addr_buf, addr_len) + && i2c_send(buf, count))) + { + i2c_stop(); + return wr_len; + } + + i2c_stop(); + + /* Update count and addr for next operation */ + size -= count; + fd->fd.seek_pos += count; + buf = ((const char *)buf) + count; + wr_len += count; + } + + return wr_len; +} + +/** + * Copy \a size bytes from buffer \a _buf to + * eeprom. + * \note Writes are verified and if buffer content + * is not matching we retry 5 times max. + */ +static size_t eeprom_writeVerify(struct KFile *_fd, const void *_buf, size_t size) +{ + Eeprom *fd = EEPROM_CAST(_fd); + int retries = 5; + size_t wr_len = 0; + + while (retries--) + { + wr_len = eeprom_writeRaw(_fd, _buf, size); + /* rewind to verify what we have just written */ + kfile_seek(_fd, -(kfile_off_t)wr_len, KSM_SEEK_CUR); + if (wr_len == size + && eeprom_verify(fd, _buf, wr_len)) + { + /* Forward to go after what we have written*/ + kfile_seek(_fd, wr_len, KSM_SEEK_CUR); + return wr_len; + } + } + return wr_len; +} + + +/** + * Copy \a size bytes + * from eeprom to RAM to buffer \a _buf. + * + * \return the number of bytes read. + */ +static size_t eeprom_read(struct KFile *_fd, void *_buf, size_t size) +{ + Eeprom *fd = EEPROM_CAST(_fd); + uint8_t addr_buf[2]; + uint8_t addr_len; + size_t rd_len = 0; + uint8_t *buf = (uint8_t *)_buf; + + STATIC_ASSERT(countof(addr_buf) <= sizeof(e2addr_t)); + + /* clamp size to memory limit (otherwise may roll back) */ + ASSERT(_fd->seek_pos + (kfile_off_t)size <= (kfile_off_t)_fd->size); + size = MIN((kfile_off_t)size, _fd->size - _fd->seek_pos); + + e2dev_addr_t dev_addr; + if (mem_info[fd->type].has_dev_addr) + { + dev_addr = fd->addr; + addr_len = 2; + addr_buf[0] = (fd->fd.seek_pos >> 8) & 0xFF; + addr_buf[1] = (fd->fd.seek_pos & 0xFF); + } + else + { + dev_addr = (e2dev_addr_t)((fd->fd.seek_pos >> 8) & 0x07); + addr_len = 1; + addr_buf[0] = (fd->fd.seek_pos & 0xFF); + } + + + if (!(i2c_start_w(EEPROM_ADDR(dev_addr)) + && i2c_send(addr_buf, addr_len) + && i2c_start_r(EEPROM_ADDR(dev_addr)))) + { + i2c_stop(); + return 0; + } + + while (size--) + { + /* + * The last byte read does not have an ACK + * to stop communication. + */ + int c = i2c_get(size); + + if (c == EOF) + break; + + *buf++ = c; + fd->fd.seek_pos++; + rd_len++; + } + + i2c_stop(); + return rd_len; +} + +/** + * Check that the contents of an EEPROM range + * match with a provided data buffer. + * + * \return true on success. + * \note Seek position of \a fd will not change. + */ +bool eeprom_verify(Eeprom *fd, const void *buf, size_t count) +{ + uint8_t verify_buf[16]; + bool result = true; + + /* Save seek position */ + kfile_off_t prev_seek = fd->fd.seek_pos; + + while (count && result) + { + /* Split read in smaller pieces */ + size_t size = MIN(count, sizeof verify_buf); + + /* Read back buffer */ + if (eeprom_read(&fd->fd, verify_buf, size)) + { + if (memcmp(buf, verify_buf, size) != 0) + { + TRACEMSG("Data mismatch!"); + result = false; + } + } + else + { + TRACEMSG("Read error!"); + result = false; + } + + /* Update count and addr for next operation */ + count -= size; + buf = ((const char *)buf) + size; + } + + /* Restore previous seek position */ + fd->fd.seek_pos = prev_seek; + return result; +} + +/** + * Erase specified part of eeprom, writing 0xFF. + * + * \a addr starting address + * \a count length of block to erase + * \note Seek position is unchanged. + * \return true if ok, false otherwise. + */ +bool eeprom_erase(Eeprom *fd, e2addr_t addr, e2_size_t count) +{ + e2blk_size_t blk_size = mem_info[fd->type].blk_size; + uint8_t buf[blk_size]; + kfile_off_t prev_off = fd->fd.seek_pos; + bool res = true; + size_t size; + + memset(buf, 0xFF, blk_size); + + + kfile_seek(&fd->fd, addr, KSM_SEEK_SET); + + /* + * Optimization: this first write id used to realign + * current address to block boundaries. + */ + + wdt_reset(); + size = MIN(count, (e2_size_t)(blk_size - (addr & (blk_size - 1)))); + if (kfile_write(&fd->fd, buf, size) != size) + { + fd->fd.seek_pos = prev_off; + return false; + } + count -= size; + + /* Clear all */ + while (count) + { + /* Long operation, reset watchdog */ + wdt_reset(); + + size = MIN(count, (e2_size_t)sizeof buf); + if (kfile_write(&fd->fd, buf, size) != size) + { + res = false; + break; + } + + count -= size; + } + fd->fd.seek_pos = prev_off; + return res; +} + + +/** + * Initialize EEPROM module. + * \a fd is the Kfile context. + * \a type is the eeprom device we want to initialize (\see EepromType) + * \a addr is the i2c devide address (usually pins A0, A1, A2). + * \a verify is true if you want that every write operation will be verified. + */ +void eeprom_init(Eeprom *fd, EepromType type, e2dev_addr_t addr, bool verify) +{ + MOD_CHECK(i2c); + ASSERT(type < EEPROM_CNT); + + memset(fd, 0, sizeof(*fd)); + DB(fd->fd._type = KFT_EEPROM); + + fd->type = type; + fd->addr = addr; + fd->fd.size = mem_info[fd->type].e2_size; + + // Setup eeprom programming functions. + fd->fd.read = eeprom_read; + if (verify) + fd->fd.write = eeprom_writeVerify; + else + fd->fd.write = eeprom_writeRaw; + fd->fd.close = kfile_genericClose; + + fd->fd.seek = kfile_genericSeek; +} diff --git a/2.5/bertos/drv/eeprom.h b/2.5/bertos/drv/eeprom.h new file mode 100644 index 00000000..995919ae --- /dev/null +++ b/2.5/bertos/drv/eeprom.h @@ -0,0 +1,134 @@ +/** + * \file + * + * + * \brief Driver for the 24xx16 and 24xx256 I2C EEPROMS. + * + * \author Stefano Fedrigo + * \author Bernie Innocenti + * + * $WIZ$ module_name = "eeprom" + * $WIZ$ module_depends = "kfile", "i2c" + */ + +#ifndef DRV_EEPROM_H +#define DRV_EEPROM_H + +#include + +#include + + +/** + * Values for Eeprom types. + */ +typedef enum EepromType +{ + EEPROM_24XX08, + EEPROM_24XX16, + EEPROM_24XX256, + EEPROM_24XX512, + EEPROM_24XX1024, + EEPROM_CNT, +} EepromType; + +/** + * On the same I2C bus can live more than one EEPROM + * device. Each device can be addressed by one or more + * pins. + */ +typedef uint8_t e2dev_addr_t; + +/** + * Describe an EEPROM context, used by the driver to + * access the single device. + */ +typedef struct Eeprom +{ + KFile fd; ///< File descriptor. + EepromType type; ///< EEPROM type + e2dev_addr_t addr; ///< Device address. +} Eeprom; + +/** + * ID for eeproms. + */ +#define KFT_EEPROM MAKE_ID('E', 'E', 'P', 'R') + +/** + * Convert + ASSERT from generic KFile to Eeprom. + */ +INLINE Eeprom * EEPROM_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_EEPROM); + return (Eeprom *)fd; +} + +/// Type for EEPROM addresses +typedef uint16_t e2addr_t; + +/** + * Macro for E2Layout offset calculation + * + * \note We can't just use offsetof() here because we could use + * non-constant expressions to access array elements. + * + * \note 'type' is the structure type holding eeprom layout + * and must be defined in user files. + */ +#define e2addr(type, field) ((e2addr_t)&(((type *)0)->field)) + +/** + * Type for EEPROM block size. + */ +typedef uint16_t e2blk_size_t; + +/** + * Type for accessing EEPROM whole size. + */ +typedef uint32_t e2_size_t; + +/** + * Descrive all EEPROM informations + * needed by the driver. + */ +typedef struct EepromInfo +{ + bool has_dev_addr; ///< true if memory is device addressable (its A0, A1, A2 pin are used by memory). + e2blk_size_t blk_size; ///< block size + e2_size_t e2_size; ///< eeprom size +} EepromInfo; + +bool eeprom_erase(Eeprom *fd, e2addr_t addr, e2_size_t count); +bool eeprom_verify(Eeprom *fd, const void *buf, size_t count); +void eeprom_init(Eeprom *fd, EepromType, e2dev_addr_t, bool verify); + +#endif /* DRV_EEPROM_H */ diff --git a/2.5/bertos/drv/flash.h b/2.5/bertos/drv/flash.h new file mode 100644 index 00000000..eda1e985 --- /dev/null +++ b/2.5/bertos/drv/flash.h @@ -0,0 +1,109 @@ +/** +* \file +* +* +* +* \brief Embedded flash for cpu. +* +* \author Francesco Sacchi +* \author Daniele Basile +* +* $WIZ$ module_name = "flash" +* $WIZ$ module_depends = "kfile" +*/ + +#ifndef DRV_FLASH_H +#define DRV_FLASH_H + +#include +#include + + +#include CPU_HEADER(flash) + +/** +* EmbFlash KFile context structure. +*/ +typedef struct Flash +{ + /** + * File descriptor. + */ + KFile fd; + + /** + * Flag for checking if current page is modified. + */ + bool page_dirty; + + /** + * Current buffered page. + */ + page_t curr_page; + + /** + * Temporary buffer cointaing data block to + * write on flash. + */ + uint8_t page_buf[FLASH_PAGE_SIZE]; +} Flash; + +/** +* ID for FLASH +*/ +#define KFT_FLASH MAKE_ID('F', 'L', 'A', 'S') + +/** +* Convert + ASSERT from generic KFile to Flash. +*/ +INLINE Flash * FLASH_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_FLASH); + return (Flash *)fd; +} + + +MOD_DEFINE(flash); + +/** + * + * Initialize PWM hw. + */ +INLINE void flash_init(Flash *fd) +{ + flash_hw_init(fd); + + MOD_INIT(flash); +} + + + +#endif /* DRV_FLASH_H */ + diff --git a/2.5/bertos/drv/flash25.c b/2.5/bertos/drv/flash25.c new file mode 100644 index 00000000..0f67e3d4 --- /dev/null +++ b/2.5/bertos/drv/flash25.c @@ -0,0 +1,397 @@ +/** + * \file + * + * + * \brief Function library for serial Flash memory. + * + * Module provide a kfile interface, that ensure an abstraction + * from comunication channel and give a standard interface. + * Typicaly this kind of memory use an SPI bus, but you should + * use another comunication channel you have defined. + * + * \version $Id$ + * \author Daniele Basile + */ + +/* + * We use a spi bus, thus include hardware specific definition. + * If you use another channel you must redefine this macros. + */ +#include "hw/hw_spi.h" + +#include +#include + +#include +#include + +#include + +#include /* cpu_relax() */ + +#warning FIXME:This file was changed, but is untested! + +/** + * Wait until flash memory is ready. + */ +static void flash25_waitReady(Flash25 *fd) +{ + uint8_t stat; + + while (1) + { + CS_ENABLE(); + + kfile_putc(FLASH25_RDSR, fd->channel); + stat = kfile_getc(fd->channel); + + CS_DISABLE(); + + if (!(stat & RDY_BIT)) + break; + + cpu_relax(); + } +} + +/** + * Send a single command to serial flash memory. + */ +static void flash25_sendCmd(Flash25 *fd, Flash25Opcode cmd) +{ + CS_ENABLE(); + + kfile_putc(cmd, fd->channel); + + CS_DISABLE(); +} + +/** + * flash25 init function. + * This function init a comunication channel and + * try to read manufacturer id of serial memory, + * then check if is equal to selected type. + */ +static bool flash25_pin_init(Flash25 *fd) +{ + uint8_t device_id; + uint8_t manufacturer; + + SPI_HW_INIT(); + + CS_ENABLE(); + /* + * Send read id productor opcode on + * comunication channel + * TODO:controllare se ha senso + */ + kfile_putc(FLASH25_RDID, fd->channel); + + manufacturer = kfile_getc(fd->channel); + device_id = kfile_getc(fd->channel); + + CS_DISABLE(); + + if((FLASH25_MANUFACTURER_ID == manufacturer) && + (FLASH25_DEVICE_ID == device_id)) + return true; + else + return false; +} + +/** + * Reopen a serial memory interface. + * + * For serial memory this function reinit only + * the size and seek_pos in kfile stucture. + * Return a kfile pointer, after assert check. + */ +static KFile * flash25_reopen(struct KFile *_fd) +{ + Flash25 *fd = FLASH25_CAST(_fd); + + fd->fd.seek_pos = 0; + fd->fd.size = FLASH25_MEM_SIZE; + + kprintf("flash25 file opened\n"); + return &fd->fd; +} + +/** + * Close a serial memory interface. + * + * For serial memory this funtion do nothing, + * and return always 0. + */ +static int flash25_close(UNUSED_ARG(struct KFile *,fd)) +{ + kprintf("flash25 file closed\n"); + return 0; +} + +/** + * Read \a _buf lenght \a size byte from serial flash memmory. + * + * For read in serial flash memory we + * enble cs pin and send one byte of read opcode, + * and then 3 byte of address of memory cell we + * want to read. After the last byte of address we + * can read data from so pin. + * + * \return the number of bytes read. + */ +static size_t flash25_read(struct KFile *_fd, void *buf, size_t size) +{ + uint8_t *data = (uint8_t *)buf; + + Flash25 *fd = FLASH25_CAST(_fd); + + ASSERT(fd->fd.seek_pos + (kfile_off_t)size <= fd->fd.size); + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); + + //kprintf("Reading at addr[%lu], size[%d]\n", fd->seek_pos, size); + CS_ENABLE(); + + kfile_putc(FLASH25_READ, fd->channel); + + + /* + * Address that we want to read. + */ + kfile_putc((fd->fd.seek_pos >> 16) & 0xFF, fd->channel); + kfile_putc((fd->fd.seek_pos >> 8) & 0xFF, fd->channel); + kfile_putc(fd->fd.seek_pos & 0xFF, fd->channel); + + kfile_read(fd->channel, data, size); + + CS_DISABLE(); + + fd->fd.seek_pos += size; + + return size; +} + +/** + * Write \a _buf in serial flash memory + * + * Before to write data into flash we must enable + * memory writing. To do this we send a WRE command opcode. + * After this command the flash is ready to be write, and so + * we send a PROGRAM opcode followed to 3 byte of + * address memory, at the end of last address byte + * we can send the data. + * When we finish to send all data, we disable cs + * and flash write received data bytes on its memory. + * + * \note: WARNING: you could write only on erased memory section! + * Each write time you could write max a memory page size, + * because if you write more than memory page size the + * address roll over to first byte of page. + * + * \return the number of bytes write. + */ +static size_t flash25_write(struct KFile *_fd, const void *_buf, size_t size) +{ + flash25Offset_t offset; + flash25Size_t total_write = 0; + flash25Size_t wr_len; + const uint8_t *data = (const uint8_t *) _buf; + + Flash25 *fd = FLASH25_CAST(_fd); + + ASSERT(fd->fd.seek_pos + (kfile_off_t)size <= fd->fd.size); + + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); + + while (size) + { + offset = fd->fd.seek_pos % (flash25Size_t)FLASH25_PAGE_SIZE; + wr_len = MIN((flash25Size_t)size, FLASH25_PAGE_SIZE - (flash25Size_t)offset); + + kprintf("[seek_pos-<%lu>, offset-<%d>]\n", fd->fd.seek_pos, offset); + + /* + * We check serial flash memory state, and wait until ready-flag + * is high. + */ + flash25_waitReady(fd); + + /* + * Start write cycle. + * We could write only data not more long than one + * page size. + * + * To write on serial flash memory we must first + * enable write with a WREN opcode command, before + * the PROGRAM opcode. + * + * \note: the same byte cannot be reprogrammed without + * erasing the whole sector first. + */ + flash25_sendCmd(fd, FLASH25_WREN); + + CS_ENABLE(); + kfile_putc(FLASH25_PROGRAM, fd->channel); + + /* + * Address that we want to write. + */ + kfile_putc((fd->fd.seek_pos >> 16) & 0xFF, fd->channel); + kfile_putc((fd->fd.seek_pos >> 8) & 0xFF, fd->channel); + kfile_putc(fd->fd.seek_pos & 0xFF, fd->channel); + + kfile_write(fd->channel, data, wr_len); + + CS_DISABLE(); + + data += wr_len; + fd->fd.seek_pos += wr_len; + size -= wr_len; + total_write += wr_len; + } + + kprintf("written %lu bytes\n", total_write); + return total_write; +} + +/** + * Sector erase function. + * + * Erase a select \p sector of serial flash memory. + * + * \note A sector size is FLASH25_SECTOR_SIZE. + * This operation could take a while. + */ +void flash25_sectorErase(Flash25 *fd, Flash25Sector sector) +{ + + /* + * Erase a sector could take a while, + * for debug we measure that time + * see datasheet to compare this time. + */ + DB(ticks_t start_time = timer_clock()); + + CS_ENABLE(); + + /* + * To erase a sector of serial flash memory we must first + * enable write with a WREN opcode command, before + * the SECTOR_ERASE opcode. Sector is automatically + * determinate if any address within the sector + * is selected. + */ + kfile_putc(FLASH25_WREN, fd->channel); + kfile_putc(FLASH25_SECTORE_ERASE,fd-> channel); + + /* + * Address inside the sector that we want to + * erase. + */ + kfile_putc(sector, fd->channel); + + CS_DISABLE(); + + /* + * We check serial flash memory state, and wait until ready-flag + * is hight. + */ + flash25_waitReady(fd); + + DB(kprintf("Erased sector [%ld] in %ld ms\n", (unsigned long)sector, (unsigned long)ticks_to_ms(timer_clock() - start_time))); +} + +/** + * Chip erase function. + * + * Erase all sector of serial flash memory. + * + * \note This operation could take a while. + */ +void flash25_chipErase(Flash25 *fd) +{ + /* + * Erase all chip could take a while, + * for debug we measure that time + * see datasheet to compare this time. + */ + DB(ticks_t start_time = timer_clock()); + + /* + * To erase serial flash memory we must first + * enable write with a WREN opcode command, before + * the CHIP_ERASE opcode. + */ + flash25_sendCmd(fd, FLASH25_WREN); + flash25_sendCmd(fd, FLASH25_CHIP_ERASE); + + /* + * We check serial flash memory state, and wait until ready-flag + * is high. + */ + flash25_waitReady(fd); + + DB(kprintf("Erased all memory in %ld ms\n", ticks_to_ms(timer_clock() - start_time))); + +} + +/** + * Init data flash memory interface. + */ +void flash25_init(Flash25 *fd, KFile *ch) +{ + + ASSERT(fd); + ASSERT(ch); + + //Set kfile struct type as a generic kfile structure. + DB(fd->fd._type = KFT_FLASH25); + + // Set up data flash programming functions. + fd->fd.reopen = flash25_reopen; + fd->fd.close = flash25_close; + fd->fd.read = flash25_read; + fd->fd.write = flash25_write; + fd->fd.seek = kfile_genericSeek; + + /* + * Init a local channel structure and flash kfile interface. + */ + fd->channel = ch; + flash25_reopen(&fd->fd); + + /* + * Init data flash memory and micro pin. + */ + if (!flash25_pin_init(fd)) + ASSERT(0); +} + + diff --git a/2.5/bertos/drv/flash25.h b/2.5/bertos/drv/flash25.h new file mode 100644 index 00000000..2712c70a --- /dev/null +++ b/2.5/bertos/drv/flash25.h @@ -0,0 +1,143 @@ +/** + * \file + * + * + * \brief Function library for serial Flash memory. + * + * + * \author Daniele Basile + * + * $WIZ$ module_name = "flash25" + * $WIZ$ module_depends = "kfile" + * $WIZ$ module_configuration = "bertos/cfg/cfg_flash25.h" + */ + + +#ifndef DRV_FLASH25_H +#define DRV_FLASH25_H + +#include "cfg/cfg_flash25.h" +#include + +#include + +/** + * Type definition for serial flash memory. + */ +typedef uint32_t flash25Addr_t; +typedef uint32_t flash25Size_t; +typedef uint8_t flash25Offset_t; + +/** + * Flash25 KFile context structure. + */ +typedef struct Flash25 +{ + KFile fd; ///< File descriptor. + KFile *channel; ///< Dataflash comm channel (usually SPI). +} Flash25; + +/** + * ID for dataflash. + */ +#define KFT_FLASH25 MAKE_ID('F', 'L', '2', '5') + + +/** + * Convert + ASSERT from generic KFile to Flash25. + */ +INLINE Flash25 * FLASH25_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_FLASH25); + return (Flash25 *)fd; +} + +/** + * Memory definition. + * + * \note Below are defined valid serial flash memory support to + * this drive. Every time we call flash25_init() function we check + * if memory defined are right (see flash25.c form more detail). + * + * $WIZ$ flash25_list = "FLASH25_AT25F2048" + */ +#define FLASH25_AT25F2048 1 + +#if CONFIG_FLASH25 == FLASH25_AT25F2048 + #define FLASH25_MANUFACTURER_ID 0x1F // ATMEL + #define FLASH25_DEVICE_ID 0x63 // Device ID + #define FLASH25_PAGE_SIZE 256 // Page size in byte + #define FLASH25_NUM_SECTOR 4 // Number of section in serial memory + #define FLASH25_SECTOR_SIZE 65536UL // Section size in byte + #define FLASH25_MEM_SIZE FLASH25_NUM_SECTOR * FLASH25_SECTOR_SIZE + #define FLASH25_NUM_PAGE FLASH25_MEM_SIZE / FLASH25_PAGE_SIZE +#else + #error Nothing memory defined in CONFIG_FLASH25 are support. +#endif + +#define RDY_BIT 0x1 // Statuts of write cycle + +/** + * Serial flash opcode commands. + */ +typedef enum { + FLASH25_WREN = 0x6, ///< Set write enable latch + FLASH25_WRDI = 0x4, ///< Reset enable write latch + FLASH25_RDSR = 0x5, ///< Read status register + FLASH25_WRSR = 0x1, ///< Write status register + FLASH25_READ = 0x3, ///< Read data from memory array + FLASH25_PROGRAM = 0x2, ///< Program data into memory array + FLASH25_SECTORE_ERASE = 0x52, ///< Erase one sector in memory array + FLASH25_CHIP_ERASE = 0x62, ///< Erase all sector in memory array + FLASH25_RDID = 0x15 ///< Read Manufacturer and product ID +} Flash25Opcode; + +/** + * Serial flash sector memory address. + */ +#if CONFIG_FLASH25 != FLASH25_AT25F2048 + #error Nothing memory defined in CONFIG_FLASH25 are support. +#endif + +typedef enum { + FLASH25_SECT1 = 0x0, ///< Sector 1 (0x0 -0xFFFF) + FLASH25_SECT2 = 0x10000, ///< Sector 2 (0x10000 -0x1FFFF) + FLASH25_SECT3 = 0x20000, ///< Sector 3 (0x20000 -0x2FFFF) + FLASH25_SECT4 = 0x30000, ///< Sector 4 (0x30000 -0x3FFFF) +} Flash25Sector; + +void flash25_init(Flash25 *fd, KFile *ch); +void flash25_chipErase(Flash25 *fd); +void flash25_sectorErase(Flash25 *fd, Flash25Sector sector); +bool flash25_test(KFile *channel); + +#endif /* DRV_FLASH25_H */ + diff --git a/2.5/bertos/drv/flash25_hwtest.c b/2.5/bertos/drv/flash25_hwtest.c new file mode 100644 index 00000000..1297feea --- /dev/null +++ b/2.5/bertos/drv/flash25_hwtest.c @@ -0,0 +1,84 @@ +/** + * \file + * + * + * \brief Test function for serial Flash memory. + * + * \version $Id$ + * \author Daniele Basile + */ + +/** + * Test function for flash25. + * + * \note: This implentation use a SPI channel. + */ + + +#include + +#include + +#include + +#warning FIXME:Review and refactor this test.. + +bool flash25_test(KFile *channel) +{ + Flash25 fd; + uint8_t test_buf[256]; + + /* + * Init a spi kfile interface and + * flash driver. + */ + flash25_init(&fd, channel); + + kprintf("Init serial flash\n"); + + flash25_chipErase(&fd); + + flash25_sectorErase(&fd, FLASH25_SECT1); + flash25_sectorErase(&fd, FLASH25_SECT2); + flash25_sectorErase(&fd, FLASH25_SECT3); + flash25_sectorErase(&fd, FLASH25_SECT4); + + /* + * Launche a kfile test interface. + */ + kprintf("Kfile test start..\n"); + if (!kfile_testRunGeneric(&fd.fd, test_buf, NULL, sizeof(test_buf))) + return false; + + return true; +} + + diff --git a/2.5/bertos/drv/ft245rl.c b/2.5/bertos/drv/ft245rl.c new file mode 100644 index 00000000..3cfac12c --- /dev/null +++ b/2.5/bertos/drv/ft245rl.c @@ -0,0 +1,120 @@ +/** + * \file + * + * + * \brief Function library for Accessing FT245RL USB interface. + * + * This module handles USB communication with FT245RL chip. + * This chip is a parallel USB interface with data flow control. + * A kfile-like interface is supplied. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_ft245rl.h" +#include "ft245rl.h" + +#include +#include +#include + +#include + +#include + +#include + + +MOD_DEFINE(ft245rl); + +/** + * Read \a size bytes in buffer \a buf, from fid \a _fd. + */ +static size_t ft245rl_read(struct KFile *_fd, void *_buf, size_t size) +{ + Ft245rl *fd = FT245RL_CAST(_fd); + (void)fd; //unused + uint8_t *buf = (uint8_t *)_buf; + size_t total_read = 0; + + while (size--) + { + while(!FT245RL_DATA_RDY()) + /* busy waiy */; + + *buf++ = FT245RL_GETDATA(); + total_read++; + } + + return total_read; +} + +/** + * Write \a size bytes from buffer \a buf, of fid \a _fd. + */ +static size_t ft245rl_write(struct KFile *_fd, const void *_buf, size_t size) +{ + Ft245rl *fd = FT245RL_CAST(_fd); + (void)fd; //unused + const uint8_t *buf = (const uint8_t *)_buf; + size_t total_write = 0; + + while (size--) + { + while(!FT245RL_TX_ALLOWED()) + /* busy waiy */; + + FT245RL_SETDATA(*buf++); + total_write++; + } + + return total_write; +} + +/** + * Ft245rl init function. + */ +void ft245rl_init(Ft245rl *fd) +{ + memset(fd, 0, sizeof(*fd)); + DB(fd->fd._type = KFT_FT245RL); + + // Setup data ft245rl communication functions. + fd->fd.read = ft245rl_read; + fd->fd.write = ft245rl_write; + + FT245RL_INIT(); + while (FT245RL_DATA_RDY()) + FT245RL_GETDATA(); + + MOD_INIT(ft245rl); +} diff --git a/2.5/bertos/drv/ft245rl.h b/2.5/bertos/drv/ft245rl.h new file mode 100644 index 00000000..258b0a4b --- /dev/null +++ b/2.5/bertos/drv/ft245rl.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Function library for Accessing FT245RL USB interface. + * + * + * \version $Id$ + * \author Francesco Sacchi + * + * $WIZ$ module_name = "ft245rl" + * $WIZ$ module_depends = "kfile", "timer" + * $WIZ$ module_hw = "bertos/hw/hw_ft245rl.h" + */ + + +#ifndef DRV_FT245RL_H +#define DRV_FT245RL_H + +#include +#include + +/** + * ID for FT245RL KFiles. + */ +#define KFT_FT245RL MAKE_ID('F', '2', '4', '5') + +/** + * Ft245rl KFile context structure. + */ +typedef struct Ft245rl +{ + KFile fd; ///< File descriptor. +} Ft245rl; + + +/** + * Convert + ASSERT from generic KFile to KFileFt245rl. + */ +INLINE Ft245rl * FT245RL_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_FT245RL); + return (Ft245rl *)fd; +} + +void ft245rl_init(Ft245rl *fd); + +#endif /* DRV_FT245RL_H */ diff --git a/2.5/bertos/drv/i2c.c b/2.5/bertos/drv/i2c.c new file mode 100644 index 00000000..575dc768 --- /dev/null +++ b/2.5/bertos/drv/i2c.c @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \brief I2C generic driver functions (implementation). + * + * \author Francesco Sacchi + */ + +#include "i2c.h" + +/** + * Send a sequence of bytes in master transmitter mode + * to the selected slave device through the I2C bus. + * + * \return true on success, false on error. + */ +bool i2c_send(const void *_buf, size_t count) +{ + const uint8_t *buf = (const uint8_t *)_buf; + + while (count--) + { + if (!i2c_put(*buf++)) + return false; + } + return true; +} + +/** + * Receive a sequence of one or more bytes from the + * selected slave device in master receive mode through + * the I2C bus. + * + * Received data is placed in \c buf. + * + * \note a NACK is automatically given on the last received + * byte. + * + * \return true on success, false on error + */ +bool i2c_recv(void *_buf, size_t count) +{ + uint8_t *buf = (uint8_t *)_buf; + + while (count--) + { + /* + * The last byte read does not has an ACK + * to stop communication. + */ + int c = i2c_get(count); + + if (c == EOF) + return false; + else + *buf++ = c; + } + + return true; +} + diff --git a/2.5/bertos/drv/i2c.h b/2.5/bertos/drv/i2c.h new file mode 100644 index 00000000..dff995cc --- /dev/null +++ b/2.5/bertos/drv/i2c.h @@ -0,0 +1,117 @@ +/** + * \file + * + * + * \brief I2C generic driver functions. + * + * \author Francesco Sacchi + * + * $WIZ$ module_name = "i2c" + * $WIZ$ module_configuration = "bertos/cfg/cfg_i2c.h" + * $WIZ$ module_hw = "bertos/hw/hw_i2c_bitbang.h" + * $WIZ$ module_supports = "not atmega103 and not atmega168 and not at91" + */ + +#ifndef DRV_I2C_H +#define DRV_I2C_H + +#include "cfg/cfg_i2c.h" +#include + +#define I2C_READBIT BV(0) + +/** + * I2C Backends. + * Sometimes your cpu does not have a builtin + * i2c driver or you don't want, for some reason, to + * use that. + * With this you can choose, at compile time, which backend to use. + * + * $WIZ$ i2c_backend = "I2C_BACKEND_BUILTIN", "I2C_BACKEND_BITBANG" + */ +#define I2C_BACKEND_BUILTIN 0 ///< Uses cpu builtin i2c driver +#define I2C_BACKEND_BITBANG 1 ///< Uses emulated bitbang driver + + +/** + * I2c builtin prototypes. + * Do NOT use these function directly, instead, + * you can call the ones named without "_builtin_" + * and specify in cfg_i2c.h ( \see CONFIG_I2C_BACKEND) + * that you want the builtin backend. + * \{ + */ +void i2c_builtin_init(void); +bool i2c_builtin_start_w(uint8_t id); +bool i2c_builtin_start_r(uint8_t id); +void i2c_builtin_stop(void); +bool i2c_builtin_put(uint8_t _data); +int i2c_builtin_get(bool ack); +/*\}*/ + +/** + * I2c bitbang prototypes. + * Same thing here: do NOT use these function directly, instead, + * you can call the ones named without "_bitbang_" + * and specify in cfg_i2c.h ( \see CONFIG_I2C_BACKEND) + * that you want the bitbang backend. + * \{ + */ +void i2c_bitbang_init(void); +bool i2c_bitbang_start_w(uint8_t id); +bool i2c_bitbang_start_r(uint8_t id); +void i2c_bitbang_stop(void); +bool i2c_bitbang_put(uint8_t _data); +int i2c_bitbang_get(bool ack); +/*\}*/ + +#if CONFIG_I2C_BACKEND == I2C_BACKEND_BUILTIN + #define i2c_init i2c_builtin_init + #define i2c_start_w i2c_builtin_start_w + #define i2c_start_r i2c_builtin_start_r + #define i2c_stop i2c_builtin_stop + #define i2c_put i2c_builtin_put + #define i2c_get i2c_builtin_get +#elif CONFIG_I2C_BACKEND == I2C_BACKEND_BITBANG + #define i2c_init i2c_bitbang_init + #define i2c_start_w i2c_bitbang_start_w + #define i2c_start_r i2c_bitbang_start_r + #define i2c_stop i2c_bitbang_stop + #define i2c_put i2c_bitbang_put + #define i2c_get i2c_bitbang_get +#else + #error Unsupported i2c backend. +#endif + +bool i2c_send(const void *_buf, size_t count); +bool i2c_recv(void *_buf, size_t count); + +#endif diff --git a/2.5/bertos/drv/i2c_bitbang.c b/2.5/bertos/drv/i2c_bitbang.c new file mode 100644 index 00000000..5e9dfb0c --- /dev/null +++ b/2.5/bertos/drv/i2c_bitbang.c @@ -0,0 +1,179 @@ +/** + * \file + * + * + * \brief I2C bitbang driver (implementation) + * + * \author Francesco Sacchi + */ + +#include "i2c.h" +#include "cfg/cfg_i2c.h" + +#define LOG_LEVEL I2C_LOG_LEVEL +#define LOG_FORMAT I2C_LOG_FORMAT + +#include +#include +#include + +#include +#include + +#include "hw/hw_i2c_bitbang.h" + +INLINE bool i2c_bitbang_start(void) +{ + SDA_HI; + SCL_HI; + I2C_HALFBIT_DELAY(); + SDA_LO; + I2C_HALFBIT_DELAY(); + ASSERT(!SDA_IN); + return !SDA_IN; +} + +void i2c_bitbang_stop(void) +{ + SDA_LO; + SCL_HI; + I2C_HALFBIT_DELAY(); + SDA_HI; +} + +bool i2c_bitbang_put(uint8_t _data) +{ + /* Add ACK bit */ + uint16_t data = (_data << 1) | 1; + + for (uint16_t i = 0x100; i != 0; i >>= 1) + { + SCL_LO; + if (data & i) + SDA_HI; + else + SDA_LO; + I2C_HALFBIT_DELAY(); + + SCL_HI; + I2C_HALFBIT_DELAY(); + } + + bool ack = !SDA_IN; + SCL_LO; + I2C_HALFBIT_DELAY(); + return ack; +} + +bool i2c_bitbang_start_w(uint8_t id) +{ + id &= ~I2C_READBIT; + /* + * Loop on the select write sequence: when the device is busy + * writing previously sent data it will reply to the SLA_W + * control byte with a NACK. In this case, we must + * keep trying until the deveice responds with an ACK. + */ + ticks_t start = timer_clock(); + while (i2c_bitbang_start()) + { + if (i2c_bitbang_put(id)) + return true; + else if (timer_clock() - start > ms_to_ticks(CONFIG_I2C_START_TIMEOUT)) + { + LOG_ERR("Timeout on I2C start write\n"); + break; + } + //LOG_INFO("Rep start\n"); + } + + return false; +} + +bool i2c_bitbang_start_r(uint8_t id) +{ + id |= I2C_READBIT; + if (i2c_bitbang_start()) + { + if (i2c_bitbang_put(id)) + return true; + + LOG_ERR("NACK on I2c start read\n"); + } + + return false; +} + +int i2c_bitbang_get(bool ack) +{ + uint8_t data = 0; + for (uint8_t i = 0x80; i != 0; i >>= 1) + { + SCL_LO; + I2C_HALFBIT_DELAY(); + SCL_HI; + if (SDA_IN) + data |= i; + else + data &= ~i; + + I2C_HALFBIT_DELAY(); + } + SCL_LO; + + if (ack) + SDA_LO; + else + SDA_HI; + + I2C_HALFBIT_DELAY(); + SCL_HI; + I2C_HALFBIT_DELAY(); + SCL_LO; + SDA_HI; + /* avoid sign extension */ + return (int)(uint8_t)data; +} + +MOD_DEFINE(i2c); + +/** + * Initialize i2c module. + */ +void i2c_bitbang_init(void) +{ + MOD_CHECK(timer); + I2C_BITBANG_HW_INIT; + SDA_HI; + SCL_HI; + MOD_INIT(i2c); +} + diff --git a/2.5/bertos/drv/kbd.c b/2.5/bertos/drv/kbd.c new file mode 100644 index 00000000..fc6232c7 --- /dev/null +++ b/2.5/bertos/drv/kbd.c @@ -0,0 +1,486 @@ +/** + * \file + * + * + * \brief Keyboard driver (implementation) + * + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * \author Francesco Sacchi + * + */ + +#include "hw/hw_kbd.h" + +#include "cfg/cfg_kbd.h" +#include +#include + +#include +#include + + +/* Configuration sanity checks */ +#if !defined(CONFIG_KBD_POLL) || (CONFIG_KBD_POLL != KBD_POLL_SOFTINT) + #error CONFIG_KBD_POLL must be defined to either KBD_POLL_SOFTINT +#endif +#if !defined(CONFIG_KBD_BEEP) || (CONFIG_KBD_BEEP != 0 && CONFIG_KBD_BEEP != 1) + #error CONFIG_KBD_BEEP must be defined to either 0 or 1 +#endif +#if !defined(CONFIG_KBD_OBSERVER) || (CONFIG_KBD_OBSERVER != 0 && CONFIG_KBD_OBSERVER != 1) + #error CONFIG_KBD_OBSERVER must be defined to either 0 or 1 +#endif +#if !defined(CONFIG_KBD_LONGPRESS) || (CONFIG_KBD_LONGPRESS != 0 && CONFIG_KBD_LONGPRESS != 1) + #error CONFIG_KBD_LONGPRESS must be defined to either 0 or 1 +#endif + +#if CONFIG_KBD_BEEP + #include +#endif + +#define KBD_CHECK_INTERVAL 10 /**< (ms) Timing for kbd softint */ +#define KBD_DEBOUNCE_TIME 30 /**< (ms) Debounce time */ +#define KBD_BEEP_TIME 5 /**< (ms) Duration of keybeep */ + +#define KBD_REPEAT_DELAY 400 /**< (ms) Keyboard repeat delay for first character */ +#define KBD_REPEAT_RATE 100 /**< (ms) Initial interchar delay for keyboard repeat */ +#define KBD_REPEAT_MAXRATE 20 /**< (ms) Minimum delay for keyboard repeat */ +#define KBD_REPEAT_ACCEL 5 /**< (ms) Keyboard repeat speed increase */ + +#define KBD_LNG_DELAY 1000 /**< (ms) Keyboard long pression keys delay */ + + +/** Status for keyboard repeat state machine */ +static enum { KS_IDLE, KS_REPDELAY, KS_REPEAT } kbd_rptStatus; + + +static volatile keymask_t kbd_buf; /**< Single entry keyboard buffer */ +static volatile keymask_t kbd_cnt; /**< Number of keypress events in \c kbd_buf */ +static keymask_t kbd_rpt_mask; /**< Mask of repeatable keys. */ + +#if CONFIG_KBD_POLL == KBD_POLL_SOFTINT +static Timer kbd_timer; /**< Keyboard softtimer */ +#endif + +static List kbd_rawHandlers; /**< Raw keyboard handlers */ +static List kbd_handlers; /**< Cooked keyboard handlers */ + +static KbdHandler kbd_defHandler; /**< The default keyboard handler */ +static KbdHandler kbd_debHandler; /**< The debounce keyboard handler */ +static KbdHandler kbd_rptHandler; /**< Auto-repeat keyboard handler */ + +#if CONFIG_KBD_LONGPRESS +static KbdHandler kbd_lngHandler; /**< Long pression keys handler */ +#endif + +#if CONFIG_KBD_OBSERVER + #include + Subject kbd_subject; +#endif + + +/** + * Poll keyboard and dispatch keys to handlers. + * + * Read the key states and invoke all keyboard + * handlers to process the new state. + * + * Call this function periodically using a software + * timer, an interrupt or a process. + */ +static void kbd_poll(void) +{ + /** Currently depressed key */ + static keymask_t current_key; + + struct KbdHandler *handler; + keymask_t key = kbd_readkeys(); + + /* Call raw input handlers */ + FOREACH_NODE(handler, &kbd_rawHandlers) + key = handler->hook(key); + + /* If this key was not previously pressed */ + if (key != current_key) + { + /* Remember last key */ + current_key = key; + + /* Call cooked input handlers */ + FOREACH_NODE(handler, &kbd_handlers) + key = handler->hook(key); + } +} + +#if CONFIG_KBD_POLL == KBD_POLL_SOFTINT + +/** + * Keyboard soft-irq handler. + */ +static void kbd_softint(UNUSED_ARG(iptr_t, arg)) +{ + kbd_poll(); + timer_add(&kbd_timer); +} + +#else + #error "Define keyboard poll method" + +#endif /* CONFIG_KBD_POLL */ + +/** + * \brief Read a key from the keyboard buffer. + * + * When a key is kept depressed between calls of this function a value + * is returned only after the time specified with KBD_REPAT_DELAY to + * avoid too fast keyboard repeat. + * + * \note Calls \c schedule() internally. + * + * \note This function is \b not interrupt safe! + * + * \return The mask of depressed keys or 0 if no keys are depressed. + * + */ +keymask_t kbd_peek(void) +{ + keymask_t key = 0; + +#if CONFIG_KBD_SCHED + /* Let other tasks run for a while */ + extern void schedule(void); + schedule(); +#endif + + /* Extract an event from the keyboard buffer */ + IRQ_DISABLE; + if (kbd_cnt) + { + --kbd_cnt; + key = kbd_buf; + } + IRQ_ENABLE; + + return key; +} + +/** + * Wait for a keypress and return the mask of depressed keys. + * + * \note This function is \b not interrupt safe! + */ +keymask_t kbd_get(void) +{ + keymask_t key; + + while (!(key = kbd_peek())) {} + + return key; +} + + +/** + * Wait up to \c timeout ms for a keypress + * and return the mask of depressed keys, or K_TIMEOUT + * if the timeout was reacked. + */ +keymask_t kbd_get_timeout(mtime_t timeout) +{ + keymask_t key; + + ticks_t start = timer_clock(); + ticks_t stop = ms_to_ticks(timeout); + do + { + if ((key = kbd_peek())) + return key; + } + while (timer_clock() - start < stop); + + return K_TIMEOUT; +} + + +void kbd_addHandler(struct KbdHandler *handler) +{ + KbdHandler *node; + List *list; + + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* Choose between raw and coocked handlers list */ + list = (handler->flags & KHF_RAWKEYS) ? + &kbd_rawHandlers : &kbd_handlers; + + /* + * Search for the first node whose priority + * is lower than the timer we want to add. + */ + FOREACH_NODE(node,list) + if (node->pri < handler->pri) + break; + + /* Enqueue handler in the handlers chain */ + INSERT_BEFORE(&handler->link, &node->link); + + IRQ_RESTORE(flags); +} + + +void kbd_remHandler(struct KbdHandler *handler) +{ + /* Remove the handler */ + ATOMIC(REMOVE(&handler->link)); +} + + +/** + * This is the default key handler, called after + * all other handlers have had their chance to + * do their special processing. This handler + * pushes all input in the keyboard FIFO buffer. + */ +static keymask_t kbd_defHandlerFunc(keymask_t key) +{ + if (key) + { + /* Force a single event in kbd buffer */ + kbd_buf = key; + kbd_cnt = 1; + + #if CONFIG_KBD_OBSERVER + observer_notify(&kbd_subject, KBD_EVENT_KEY, &key); + #endif + + #if CONFIG_KBD_BEEP + if (!(key & K_REPEAT)) + buz_beep(KBD_BEEP_TIME); + #endif + } + + /* Eat all input */ + return 0; +} + +/** + * Handle keyboard debounce + */ +static keymask_t kbd_debHandlerFunc(keymask_t key) +{ + /** Buffer for debounce */ + static keymask_t debounce_key; + + /** Timer for keyboard debounce */ + static ticks_t debounce_time; + + /** Key aquired after debounce */ + static keymask_t new_key; + + + ticks_t now = timer_clock(); + + if (key != debounce_key) + { + /* Reset debounce timer */ + debounce_key = key; + debounce_time = now; + } + else if ((new_key != debounce_key) + && (now - debounce_time > ms_to_ticks(KBD_DEBOUNCE_TIME))) + { + new_key = debounce_key; + debounce_time = now; + } + + return new_key; +} + +#if CONFIG_KBD_LONGPRESS +/** + * Handle long pression keys. + */ +static keymask_t kbd_lngHandlerFunc(keymask_t key) +{ + static ticks_t start; + ticks_t now = timer_clock(); + + if (key & K_LNG_MASK) + { + if (now - start > ms_to_ticks(KBD_LNG_DELAY)) + key |= K_LONG; + } + else + start = now; + return key; +} +#endif + +/** + * Set current mask of repeatable keys. + */ +keymask_t kbd_setRepeatMask(keymask_t mask) +{ + keymask_t oldmask = kbd_rpt_mask; + ATOMIC(kbd_rpt_mask = mask); + return oldmask; +} + +/** + * Handle keyboard repeat + */ +static keymask_t kbd_rptHandlerFunc(keymask_t key) +{ + /* Timer for keyboard repeat events. */ + static ticks_t repeat_time; + + /* Current repeat rate (for acceleration). */ + static ticks_t repeat_rate; /** Current repeat rate (for acceleration) */ + + ticks_t now = timer_clock(); + + switch (kbd_rptStatus) + { + case KS_IDLE: + if (key & kbd_rpt_mask) + { + repeat_time = now; + kbd_rptStatus = KS_REPDELAY; + } + break; + + case KS_REPDELAY: + if (key & kbd_rpt_mask) + { + if (now - repeat_time > ms_to_ticks(KBD_REPEAT_DELAY)) + { + key = (key & kbd_rpt_mask) | K_REPEAT; + repeat_time = now; + repeat_rate = ms_to_ticks(KBD_REPEAT_RATE); + kbd_rptStatus = KS_REPEAT; + } + else + key = 0; + } + else + kbd_rptStatus = KS_IDLE; + break; + + case KS_REPEAT: + if (key & kbd_rpt_mask) + { + if (now - repeat_time > repeat_rate) + { + /* Enqueue a new event in the buffer */ + key = (key & kbd_rpt_mask) | K_REPEAT; + repeat_time = now; + + /* Repeat rate acceleration */ + if (repeat_rate > ms_to_ticks(KBD_REPEAT_MAXRATE)) + repeat_rate -= ms_to_ticks(KBD_REPEAT_ACCEL); + } + else + key = 0; + } + else + kbd_rptStatus = KS_IDLE; + + break; + } + + return key; +} + + +MOD_DEFINE(kbd) + +/** + * Initialize keyboard ports and softtimer + */ +void kbd_init(void) +{ +#if CONFIG_KBD_BEEP + MOD_CHECK(buzzer); +#endif + + KBD_HW_INIT; + + /* Init handlers lists */ + LIST_INIT(&kbd_handlers); + LIST_INIT(&kbd_rawHandlers); + + /* Add debounce keyboard handler */ + kbd_debHandler.hook = kbd_debHandlerFunc; + kbd_debHandler.pri = 100; /* high priority */ + kbd_debHandler.flags = KHF_RAWKEYS; + kbd_addHandler(&kbd_debHandler); + + #if CONFIG_KBD_LONGPRESS + /* Add long pression keyboard handler */ + kbd_lngHandler.hook = kbd_lngHandlerFunc; + kbd_lngHandler.pri = 90; /* high priority */ + kbd_lngHandler.flags = KHF_RAWKEYS; + kbd_addHandler(&kbd_lngHandler); + #endif + + /* Add repeat keyboard handler */ + kbd_rptHandler.hook = kbd_rptHandlerFunc; + kbd_rptHandler.pri = 80; /* high priority */ + kbd_rptHandler.flags = KHF_RAWKEYS; + kbd_addHandler(&kbd_rptHandler); + + /* Add default keyboard handler */ + kbd_defHandler.hook = kbd_defHandlerFunc; + kbd_defHandler.pri = -128; /* lowest priority */ + kbd_addHandler(&kbd_defHandler); + +#if CONFIG_KBD_OBSERVER + observer_InitSubject(&kbd_subject); +#endif + +#if CONFIG_KBD_POLL == KBD_POLL_SOFTINT + + MOD_CHECK(timer); + + /* Add kbd handler to soft timers list */ + event_initSoftint(&kbd_timer.expire, kbd_softint, NULL); + timer_setDelay(&kbd_timer, ms_to_ticks(KBD_CHECK_INTERVAL)); + timer_add(&kbd_timer); + +#else + #error "Define keyboard poll method" + +#endif + + MOD_INIT(kbd); +} diff --git a/2.5/bertos/drv/kbd.h b/2.5/bertos/drv/kbd.h new file mode 100644 index 00000000..978f142f --- /dev/null +++ b/2.5/bertos/drv/kbd.h @@ -0,0 +1,102 @@ +/** + * \file + * + * + * \brief Keyboard driver. + * + * \version $Id$ + * \author Bernie Innocenti + * \author Stefano Fedrigo + * \author Francesco Sacchi + * + * $WIZ$ module_name = "kbd" + * $WIZ$ module_depends = "timer" + * $WIZ$ module_configuration = "bertos/cfg/cfg_kbd.h" + * $WIZ$ module_hw = "bertos/hw/hw_kbd.h", "bertos/hw/kbd_map.h" + */ + +#ifndef DRV_KBD_H +#define DRV_KBD_H + +#include "hw/kbd_map.h" + +#include "cfg/cfg_kbd.h" // CONFIG_KBD_OBSERVER +#include + +#include + +/** + * \name Keyboard polling modes. + * + * Define CONFIG_KBD_POLL to one of these. + * + * \{ + */ +#define KBD_POLL_SOFTINT 1 +/* \} */ + +/** + * Keyboard handler descriptor + */ +typedef struct KbdHandler +{ + Node link; + keymask_t (*hook)(keymask_t); /**< Hook function */ + int8_t pri; /**< Priority in input queue */ + uint8_t flags; /**< See below for definitions */ +} KbdHandler; + +#define KHF_RAWKEYS BV(0) /**< Handler gets raw key events */ + + +void kbd_init(void); +keymask_t kbd_peek(void); +keymask_t kbd_get(void); +keymask_t kbd_get_timeout(mtime_t timeout); +void kbd_addHandler(struct KbdHandler *handler); +void kbd_remHandler(struct KbdHandler *handler); +keymask_t kbd_setRepeatMask(keymask_t mask); + +#if CONFIG_KBD_OBSERVER + struct Subject; + + /** Subject structure for keyboard observers. */ + extern struct Subject kbd_subject; + + enum + { + /* Event for key presses. */ + KBD_EVENT_KEY = 0x100 + }; +#endif + +#endif /* DRV_KBD_H */ diff --git a/2.5/bertos/drv/kdebug.c b/2.5/bertos/drv/kdebug.c new file mode 100644 index 00000000..cb04f70b --- /dev/null +++ b/2.5/bertos/drv/kdebug.c @@ -0,0 +1,284 @@ +/** + * \file + * + * + * \brief General pourpose debug support for embedded systems (implementation). + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + */ + +#include "cfg/cfg_debug.h" +#include /* for BV() */ +#include +#include + +#include +#include + +#include /* for _formatted_write() */ +#include + +#ifdef _DEBUG + +#if CPU_HARVARD && !defined(_PROGMEM) + #error This module build correctly only in program memory! +#endif + + +#if OS_HOSTED + #include // write() + + #define KDBG_WAIT_READY() do { /*nop*/ } while(0) + #define KDBG_WRITE_CHAR(c) do { char __c = (c); write(STDERR_FILENO, &__c, sizeof(__c)); } while(0) + #define KDBG_MASK_IRQ(old) do { (void)(old); } while(0) + #define KDBG_RESTORE_IRQ(old) do { /*nop*/ } while(0) + typedef char kdbg_irqsave_t; /* unused */ + + #define kdbg_hw_init() do {} while (0) ///< Not needed + + #if CONFIG_KDEBUG_PORT == 666 + #error BITBANG debug console missing for this platform + #endif +#else + #include CPU_CSOURCE(kdebug) +#endif + + +void kdbg_init(void) +{ + /* Init debug hw */ + kdbg_hw_init(); + kputs("\n\n*** BeRTOS DBG START ***\n"); +} + + +/** + * Output one character to the debug console + */ +static void __kputchar(char c, UNUSED_ARG(void *, unused)) +{ + /* Poll while serial buffer is still busy */ + KDBG_WAIT_READY(); + + /* Send '\n' as '\r\n' for dumb terminals */ + if (c == '\n') + { + KDBG_WRITE_CHAR('\r'); + KDBG_WAIT_READY(); + } + + KDBG_WRITE_CHAR(c); +} + + +void kputchar(char c) +{ + /* Mask serial TX intr */ + kdbg_irqsave_t irqsave; + KDBG_MASK_IRQ(irqsave); + + __kputchar(c, 0); + + /* Restore serial TX intr */ + KDBG_RESTORE_IRQ(irqsave); +} + + +static void PGM_FUNC(kvprintf)(const char * PGM_ATTR fmt, va_list ap) +{ +#if CONFIG_PRINTF + /* Mask serial TX intr */ + kdbg_irqsave_t irqsave; + KDBG_MASK_IRQ(irqsave); + + PGM_FUNC(_formatted_write)(fmt, __kputchar, 0, ap); + + /* Restore serial TX intr */ + KDBG_RESTORE_IRQ(irqsave); +#else + /* A better than nothing printf() surrogate. */ + PGM_FUNC(kputs)(fmt); +#endif /* CONFIG_PRINTF */ +} + +void PGM_FUNC(kprintf)(const char * PGM_ATTR fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + PGM_FUNC(kvprintf)(fmt, ap); + va_end(ap); +} + +void PGM_FUNC(kputs)(const char * PGM_ATTR str) +{ + char c; + + /* Mask serial TX intr */ + kdbg_irqsave_t irqsave; + KDBG_MASK_IRQ(irqsave); + + while ((c = PGM_READ_CHAR(str++))) + __kputchar(c, 0); + + KDBG_RESTORE_IRQ(irqsave); +} + + +/** + * Cheap function to print small integers without using printf(). + */ +int kputnum(int num) +{ + int output_len = 0; + int divisor = 10000; + int digit; + + do + { + digit = num / divisor; + num %= divisor; + + if (digit || output_len || divisor == 1) + { + kputchar(digit + '0'); + ++output_len; + } + } + while (divisor /= 10); + + return output_len; +} + + +static void klocation(const char * PGM_ATTR file, int line) +{ + PGM_FUNC(kputs)(file); + kputchar(':'); + kputnum(line); + PGM_FUNC(kputs)(PGM_STR(": ")); +} + +int PGM_FUNC(__bassert)(const char * PGM_ATTR cond, const char * PGM_ATTR file, int line) +{ + klocation(file, line); + PGM_FUNC(kputs)(PGM_STR("Assertion failed: ")); + PGM_FUNC(kputs)(cond); + kputchar('\n'); + BREAKPOINT; + return 1; +} + +/* + * Unfortunately, there's no way to get __func__ in + * program memory, so we waste quite a lot of RAM in + * AVR and other Harvard processors. + */ +void PGM_FUNC(__trace)(const char *name) +{ + PGM_FUNC(kprintf)(PGM_STR("%s()\n"), name); +} + +void PGM_FUNC(__tracemsg)(const char *name, const char * PGM_ATTR fmt, ...) +{ + va_list ap; + + PGM_FUNC(kprintf)(PGM_STR("%s(): "), name); + va_start(ap, fmt); + PGM_FUNC(kvprintf)(fmt, ap); + va_end(ap); + kputchar('\n'); +} + +int PGM_FUNC(__invalid_ptr)(void *value, const char * PGM_ATTR name, const char * PGM_ATTR file, int line) +{ + klocation(file, line); + PGM_FUNC(kputs)(PGM_STR("Invalid ptr: ")); + PGM_FUNC(kputs)(name); + #if CONFIG_PRINTF + PGM_FUNC(kprintf)(PGM_STR(" = 0x%p\n"), value); + #else + (void)value; + kputchar('\n'); + #endif + return 1; +} + + +void __init_wall(long *wall, int size) +{ + while(size--) + *wall++ = WALL_VALUE; +} + + +int PGM_FUNC(__check_wall)(long *wall, int size, const char * PGM_ATTR name, const char * PGM_ATTR file, int line) +{ + int i, fail = 0; + + for (i = 0; i < size; i++) + { + if (wall[i] != WALL_VALUE) + { + klocation(file, line); + PGM_FUNC(kputs)(PGM_STR("Wall broken: ")); + PGM_FUNC(kputs)(name); + #if CONFIG_PRINTF + PGM_FUNC(kprintf)(PGM_STR("[%d] (0x%p) = 0x%lx\n"), i, wall + i, wall[i]); + #else + kputchar('\n'); + #endif + fail = 1; + } + } + + return fail; +} + + +#if CONFIG_PRINTF + +/** + * Dump binary data in hex + */ +void kdump(const void *_buf, size_t len) +{ + const unsigned char *buf = (const unsigned char *)_buf; + + while (len--) + kprintf("%02X", *buf++); + kputchar('\n'); +} + +#endif /* CONFIG_PRINTF */ + +#endif /* _DEBUG */ diff --git a/2.5/bertos/drv/lcd_32122a.c b/2.5/bertos/drv/lcd_32122a.c new file mode 100644 index 00000000..b46ee0b7 --- /dev/null +++ b/2.5/bertos/drv/lcd_32122a.c @@ -0,0 +1,334 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + + +#include "lcd_32122a.h" + +#include "hw/hw_lcd_32122a.h" + +#include "cfg/cfg_lcd_32122a.h" + +#include /* BV() */ +#include +#include + +#include + +#include +#include + +#include +#include + + +/** Number of LCD pages */ +#define LCD_PAGES 4 + +/** Width of an LCD page */ +#define LCD_PAGESIZE (LCD_WIDTH / 2) + +/** + * \name 32122A Commands + * @{ + */ +#define LCD_CMD_DISPLAY_ON 0xAF +#define LCD_CMD_DISPLAY_OFF 0xAE +#define LCD_CMD_STARTLINE 0xC0 +#define LCD_CMD_PAGEADDR 0xB8 +#define LCD_CMD_COLADDR 0x00 +#define LCD_CMD_ADC_LEFT 0xA1 +#define LCD_CMD_ADC_RIGHT 0xA0 +#define LCD_CMD_STATIC_OFF 0xA4 +#define LCD_CMD_STATIC_ON 0xA5 +#define LCD_CMD_DUTY_32 0xA9 +#define LCD_CMD_DUTY_16 0xA8 +#define LCD_CMD_RMW_ON 0xE0 +#define LCD_CMD_RMW_OFF 0xEE +#define LCD_CMD_RESET 0xE2 +/*@}*/ + + +/* Status flags */ +#define LCDF_BUSY BV(7) + +#if CONFIG_LCD_WAIT + /** + * \code + * __ __ + * RS __\____________/__ + * ____________ + * R/W __/ \__ + * _______ + * E1 _____/ \____ + * ______ ____ + * DATA X/ \====/ + * + * \endcode + */ + #define WAIT_LCD \ + do { \ + uint8_t status; \ + LCD_DB_IN; \ + do { \ + LCD_SET_RD; \ + LCD_CLR_A0; \ + LCD_SET_E1; \ + LCD_DELAY_READ; \ + status = LCD_READ; \ + LCD_CLR_E1; \ + LCD_SET_A0; \ + LCD_CLR_RD; \ + } while (status & LCDF_BUSY); \ + LCD_DB_OUT; \ + } while (0) +#else /* CONFIG_LCD_WAIT */ + #define WAIT_LCD do {} while(0) +#endif /* CONFIG_LCD_WAIT */ + + +/** + * Raster buffer to draw into. + * + * Bits in the bitmap bytes have vertical orientation, + * as required by the LCD driver. + */ +static uint8_t lcd_raster[RAST_SIZE(LCD_WIDTH, LCD_HEIGHT)]; + +/** Default LCD bitmap */ +struct Bitmap lcd_bitmap; + + +#if CONFIG_LCD_SOFTINT_REFRESH + +/** Timer for regular LCD refresh */ +static Timer lcd_refresh_timer; + +#endif /* CONFIG_LCD_SOFTINT_REFRESH */ + + +INLINE void lcd_32122_cmd(uint8_t cmd, uint8_t chip) +{ + WAIT_LCD; + + /* __ __ + * A0 __\____________/__ + * + * R/W __________________ + * ______ + * E1 _____/ \_____ + * + * DATA --<============>-- + */ + LCD_WRITE(cmd); + //LCD_DB_OUT; + LCD_CLR_A0; + LCD_SET_E(chip); + LCD_DELAY_WRITE; + LCD_CLR_E(chip); + LCD_SET_A0; + //LCD_DB_IN; + +} + + +INLINE uint8_t lcd_32122_read(uint8_t chip) +{ + uint8_t data; + + WAIT_LCD; + + /** + * \code + * __________________ + * A0 __/ \__ + * ____________ + * R/W __/ \__ + * _______ + * E1 _____/ \____ + * + * DATA -------<=====>---- + * + * \endcode + */ + LCD_DB_IN; + //LCD_SET_A0; + LCD_SET_RD; + LCD_SET_E(chip); + LCD_DELAY_READ; + data = LCD_READ; + LCD_CLR_E(chip); + LCD_CLR_RD; + //LCD_CLR_A0; + LCD_DB_OUT; + + return data; +} + +INLINE void lcd_32122_write(uint8_t c, uint8_t chip) +{ + WAIT_LCD; + + /** + * \code + * __________________ + * A0 ___/ \___ + * + * R/W __________________ + * ______ + * E1 _____/ \_____ + * + * DATA -<==============>- + * + * \endcode + */ + LCD_WRITE(c); + //LCD_DB_OUT; + //LCD_SET_A0; + LCD_SET_E(chip); + LCD_DELAY_WRITE; + LCD_CLR_E(chip); + //LCD_CLR_A0; + //LCD_DB_IN; +} + +static void lcd_32122_clear(void) +{ + uint8_t page, j; + + for (page = 0; page < LCD_PAGES; ++page) + { + lcd_32122_cmd(LCD_CMD_COLADDR, LCDF_E1 | LCDF_E2); + lcd_32122_cmd(LCD_CMD_PAGEADDR | page, LCDF_E1 | LCDF_E2); + for (j = 0; j < LCD_PAGESIZE; j++) + lcd_32122_write(0, LCDF_E1 | LCDF_E2); + } +} + + +static void lcd_32122_writeRaster(const uint8_t *raster) +{ + uint8_t page, rows; + const uint8_t *right_raster; + + for (page = 0; page < LCD_PAGES; ++page) + { + lcd_32122_cmd(LCD_CMD_PAGEADDR | page, LCDF_E1 | LCDF_E2); + lcd_32122_cmd(LCD_CMD_COLADDR | 0, LCDF_E1 | LCDF_E2); + + /* Super optimized lamer loop */ + right_raster = raster + LCD_PAGESIZE; + rows = LCD_PAGESIZE; + do + { + lcd_32122_write(*raster++, LCDF_E1); + lcd_32122_write(*right_raster++, LCDF_E2); + } + while (--rows); + raster = right_raster; + } +} + +#if CONFIG_LCD_SOFTINT_REFRESH + +static void lcd_32122_refreshSoftint(void) +{ + lcd_32122_blitBitmap(&lcd_bitmap); + timer_setDelay(&lcd_refresh_timer, ms_to_ticks(CONFIG_LCD_REFRESH)); + timer_add(&lcd_refresh_timer); +} + +#endif /* CONFIG_LCD_SOFTINT_REFRESH */ + +/** + * Set LCD contrast PWM. + */ +void lcd_32122_setPwm(int duty) +{ + ASSERT(duty >= LCD_MIN_PWM); + ASSERT(duty <= LCD_MAX_PWM); + + pwm_setDuty(LCD_PWM_CH, duty); + pwm_enable(LCD_PWM_CH, true); +} + +/** + * Update the LCD display with data from the provided bitmap. + */ +void lcd_32122_blitBitmap(const Bitmap *bm) +{ + lcd_32122_writeRaster(bm->raster); +} + + +/** + * Initialize LCD subsystem. + * + * \note The PWM used for LCD contrast is initialized in drv/pwm.c + * because it is the same PWM used for output attenuation. + */ +void lcd_32122_init(void) +{ + MOD_CHECK(timer); + + pwm_init(); + + lcd_32122a_hw_bus_init(); + LCD_32122_RESET(); + + lcd_32122_cmd(LCD_CMD_RESET, LCDF_E1 | LCDF_E2); + lcd_32122_cmd(LCD_CMD_DISPLAY_ON, LCDF_E1 | LCDF_E2); + lcd_32122_cmd(LCD_CMD_STARTLINE | 0, LCDF_E1 | LCDF_E2); + + + lcd_32122_clear(); + lcd_32122_setPwm(LCD_DEF_PWM); + + gfx_bitmapInit(&lcd_bitmap, lcd_raster, LCD_WIDTH, LCD_HEIGHT); + gfx_bitmapClear(&lcd_bitmap); + +#if CONFIG_LCD_SOFTINT_REFRESH + /* Init IRQ driven LCD refresh */ + timer_setSoftint(&lcd_refresh_timer, (Hook)lcd_32122_refreshSoftint, 0); + timer_setDelay(&lcd_refresh_timer, ms_to_ticks(CONFIG_LCD_REFRESH)); + timer_add(&lcd_refresh_timer); +#endif /* CONFIG_LCD_SOFTINT_REFRESH */ + +} + diff --git a/2.5/bertos/drv/lcd_32122a.h b/2.5/bertos/drv/lcd_32122a.h new file mode 100644 index 00000000..ed9b1b5e --- /dev/null +++ b/2.5/bertos/drv/lcd_32122a.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + * \brief Displaytech 32122A LCD driver + * + * $WIZ$ module_name = "lcd_32122a" + * $WIZ$ module_hw = "bertos/hw/hw_lcd_32122a.h" + * $WIZ$ module_configuration = "bertos/cfg/cfg_lcd_32122a.h" + * $WIZ$ module_depends = "timer", "pwm" + */ + +#ifndef DRV_LCD_32122A_H +#define DRV_LCD_32122A_H + +/* Display bitmap dims */ +#define LCD_WIDTH 122 +#define LCD_HEIGHT 32 + +#include /* Bitmap */ + +#warning __FILTER_NEXT_WARNING__ +#warning this drive is untested.. + +void lcd_32122_init(void); +void lcd_32122_setPwm(int duty); +void lcd_32122_blitBitmap(const Bitmap *bm); + +#endif /* DRV_LCD_32122A_H */ diff --git a/2.5/bertos/drv/lcd_gfx_hwtest.c b/2.5/bertos/drv/lcd_gfx_hwtest.c new file mode 100644 index 00000000..c07be270 --- /dev/null +++ b/2.5/bertos/drv/lcd_gfx_hwtest.c @@ -0,0 +1,92 @@ +/** + * \file + * + * + * \brief dot-matrix LCD test. + * + * \author Bernie Innocenti + * + */ + + +#warning FIXME: broken test! + +#if 0 + +#include +#include + +#include + +static void magic(struct Bitmap *bitmap, coord_t x, coord_t y) +{ + static const coord_t coords[] = { 120, 34, 90, 90, 30, 90, 0, 34, 60, 0, 90, 90, 0, 34, 120, 34, 30, 90, 60, 0 }; + unsigned int i; + + gfx_moveTo(bitmap, coords[countof(coords)-2]/2 + x, coords[countof(coords)-1]/3 + y); + for (i = 0; i < countof(coords); i += 2) + gfx_lineTo(bitmap, coords[i]/2 + x, coords[i+1]/3 + y); +} + +int main(int argc, char *argv[]) +{ + emul_init(&argc, argv); + lcd_init(); + + coord_t x = 0, y = LCD_WIDTH / 2; + coord_t xdir = +1, ydir = -1; + Bitmap *bm = &lcd_bitmap; + + for(;;) + { + gfx_bitmapClear(bm); + gfx_setClipRect(bm, 0, 0, bm->width, bm->height); + gfx_rectDraw(bm, 10, 10, bm->width-10, bm->height-10); + gfx_setClipRect(bm, 11, 11, bm->width-11, bm->height-11); + magic(bm, x, y); + + x += xdir; + y += ydir; + if (x >= bm->width) xdir = -1; + if (x <= -50) xdir = +1; + if (y >= bm->height) ydir = -1; + if (y <= -50) ydir = +1; + + lcd_blit_bitmap(bm); + emul_idle(); + usleep(10000); + } + + emul_cleanup(); + return 0; +} + +#endif diff --git a/2.5/bertos/drv/lcd_gfx_qt.cpp b/2.5/bertos/drv/lcd_gfx_qt.cpp new file mode 100644 index 00000000..69ff66f4 --- /dev/null +++ b/2.5/bertos/drv/lcd_gfx_qt.cpp @@ -0,0 +1,187 @@ +/** + * \file + * + * + * \author Bernie Innocenti + * + * \brief Custom control for graphics LCD emulation (implementation) + */ + +#include "lcd_gfx_qt.h" +#include +#include +#include // CONFIG_BITMAP_FMT + +#include +#include +#include +#include + +// Display colors +#define LCD_FG_COLOR 0x0, 0x0, 0x0 +#define LCD_BG_COLOR 0xBB, 0xCC, 0xBB + + +EmulLCD::EmulLCD(QWidget *parent) : + QFrame(parent), + fg_color(LCD_FG_COLOR), + bg_brush(QColor(LCD_BG_COLOR)) +{ + // Optimized rendering: we repaint everything anyway + setAttribute(Qt::WA_NoSystemBackground); + + // initialize bitmap + memset(raster, 0xAA, sizeof(raster)); + + // set widget frame + setFrameStyle(QFrame::Panel | QFrame::Sunken); + frame_width = frameWidth(); + + setMinimumSize(WIDTH + frame_width * 2, HEIGHT + frame_width * 2); + + #if CONFIG_EMULLCD_SCALE + QSizePolicy pol = QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred, QSizePolicy::Frame); + pol.setHeightForWidth(true); + #else + QSizePolicy pol = QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed, QSizePolicy::Frame); + #endif + setSizePolicy(pol); +} + + +EmulLCD::~EmulLCD() +{ + // nop +} + +#if CONFIG_EMULLCD_SCALE +int EmulLCD::heightForWidth(int w) const +{ + int h; + + w -= frame_width * 2; + h = (w * HEIGHT + WIDTH/2) / WIDTH; + h += frame_width * 2; + + return h; +} +#endif // CONFIG_EMULLCD_SCALE + +void EmulLCD::paintEvent(QPaintEvent * /*event*/) +{ + QPainter p(this); + QImage img(raster, WIDTH, HEIGHT, QImage::Format_Mono); + + #if CONFIG_EMULLCD_SCALE + int w = width() - frame_width * 2; + int h = height() - frame_width * 2; + if ((w != WIDTH) || (h != HEIGHT)) + { + p.scale((qreal)w / WIDTH, (qreal)h / HEIGHT); + //p.setRenderHint(QPainter::SmoothPixmapTransform); + } + #endif // CONFIG_EMULLCD_SCALE + + p.setBackgroundMode(Qt::OpaqueMode); + p.setBackground(bg_brush); + p.setPen(fg_color); + + p.drawImage(QPoint(frame_width, frame_width), img); +} + +void EmulLCD::writeRaster(uint8_t *new_raster) +{ +#if CONFIG_BITMAP_FMT == BITMAP_FMT_PLANAR_H_MSB + + // Straight copy + //memcpy(raster, new_raster, sizeof(raster)); + + // Inverting copy + for (int i = 0; i < (int)sizeof(raster); ++i) + raster[i] = ~new_raster[i]; + +#elif CONFIG_BITMAP_FMT == BITMAP_FMT_PLANAR_V_LSB + + // Rotation + inversion + for (int y = 0; y < HEIGHT; ++y) + { + for (int xbyte = 0; xbyte < WIDTH/8; ++xbyte) + { + uint8_t v = 0; + for (int xbit = 0; xbit < 8; ++xbit) + v |= (new_raster[(xbyte * 8 + xbit) + (y / 8) * WIDTH] & (1 << (y%8)) ) + ? (1 << (7 - xbit)) : 0; + + raster[y * ((WIDTH + 7) / 8) + xbyte] = v; + } + } +#else + #error Unsupported bitmap format +#endif + + repaint(); +} + + + +#include +#include + +DECLARE_WALL(wall_before_raster, WALL_SIZE) +/** + * Raster buffer to draw into. + * + * Bits in the bitmap bytes have vertical orientation, + * as required by the LCD driver. + */ +static uint8_t lcd_raster[RAST_SIZE(EmulLCD::WIDTH, EmulLCD::HEIGHT)]; +DECLARE_WALL(wall_after_raster, WALL_SIZE) + + + + +/*extern "C"*/ void lcd_gfx_qt_init(Bitmap *lcd_bitmap) +{ + //FIXME INIT_WALL(wall_before_raster); + //FIXME INIT_WALL(wall_after_raster); + gfx_bitmapInit(lcd_bitmap, lcd_raster, EmulLCD::WIDTH, EmulLCD::HEIGHT); + gfx_bitmapClear(lcd_bitmap); +} + +/*extern "C"*/ void lcd_gfx_qt_blitBitmap(const Bitmap *bm) +{ + //FIXME CHECK_WALL(wall_before_raster); + //FIXME CHECK_WALL(wall_after_raster); + emul->emulLCD->writeRaster(bm->raster); +} + +#include "lcd_gfx_qt_moc.cpp" + diff --git a/2.5/bertos/drv/lcd_gfx_qt.h b/2.5/bertos/drv/lcd_gfx_qt.h new file mode 100644 index 00000000..9840f24c --- /dev/null +++ b/2.5/bertos/drv/lcd_gfx_qt.h @@ -0,0 +1,98 @@ +/** + * \file + * + * + * \author Bernie Innocenti + * + * \brief Custom control for graphics LCD emulation (interface) + */ + +#ifndef DRV_LCD_GFX_QT_H +#define DRV_LCD_GFX_QT_H + +// uint8_t +#include +#include + +#include +#include + +#define LCD_WIDTH 128 + +// fwd decls +class QSizePolicy; +class QPaintEvent; +class QResizeEvent; + +#define CONFIG_EMULLCD_SCALE 1 + +class EmulLCD : public QFrame +{ + Q_OBJECT + +public: +// Attributes + enum { WIDTH = 128, HEIGHT = 64 }; + +// Construction + EmulLCD(QWidget *parent = 0); + virtual ~EmulLCD(); + +// Base class overrides +protected: + virtual void paintEvent(QPaintEvent *event); + + #if CONFIG_EMULLCD_SCALE + virtual int heightForWidth(int w) const; + #endif + +// Operations +public: + void writeRaster(uint8_t *raster); + +// Implementation +protected: + /// Frame thickness + int frame_width; + + /// Brushes for painting the LCD + QColor fg_color; + QBrush bg_brush; + + /// Pixel storage + unsigned char raster[(WIDTH + 7 / 8) * HEIGHT]; +}; + + +void lcd_gfx_qt_init(Bitmap *lcd_bitmap); +void lcd_gfx_qt_blitBitmap(const Bitmap *bm); + +#endif // DRV_LCD_GFX_QT_H diff --git a/2.5/bertos/drv/lcd_hd44.c b/2.5/bertos/drv/lcd_hd44.c new file mode 100644 index 00000000..5bce8c6d --- /dev/null +++ b/2.5/bertos/drv/lcd_hd44.c @@ -0,0 +1,429 @@ +/** + * \file + * + * + * \brief LM044L type LCD hardware module (impl.) + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + */ + +#include "lcd_hd44.h" + +#include "hw/hw_lcd_hd44.h" + +#include "cfg/cfg_arch.h" + +#include + +#warning FIXME: Revise and refactor this code. + +#if defined(LCD_READ_H) && defined(LCD_READ_L) && defined(LCD_WRITE_H) && defined(LCD_WRITE_L) + #define CONFIG_LCD_4BIT 1 +#elif defined(LCD_READ) && defined(LCD_WRITE) + #define CONFIG_LCD_4BIT 0 +#else + #error Incomplete or missing LCD_READ/LCD_WRITE macros +#endif + +/** Flag di stato del display */ +#define LCDF_BUSY BV(7) + +#if CONFIG_LCD_ADDRESS_FAST == 1 +#define lcd_address(x) lcd_address[x] +/** + * Addresses of LCD display character positions, expanded + * for faster access (DB7 = 1). + */ +static const uint8_t lcd_address[] = +{ + /* row 0 */ + 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8A, 0x8B, + 0x8C, 0x8D, 0x8E, 0x8F, +#if CONFIG_LCD_COLS > 16 + 0x90, 0x91, 0x92, 0x93, +#endif + + /* row 1 */ + 0xC0, 0xC1, 0xC2, 0xC3, + 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, + 0xCC, 0xCD, 0xCE, 0xCF, +#if CONFIG_LCD_COLS > 16 + 0xD0, 0xD1, 0xD2, 0xD3, +#endif + +#if CONFIG_LCD_ROWS > 2 + /* row 2 */ + 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9A, 0x9B, + 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, +#if CONFIG_LCD_COLS > 16 + 0xA4, 0xA5, 0xA6, 0xA7, +#endif + + /* row 3 */ + 0xD4, 0xD5, 0xD6, 0xD7, + 0xD8, 0xD9, 0xDA, 0xDB, + 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, +#if CONFIG_LCD_COLS > 16 + 0xE4, 0xE5, 0xE6, 0xE7, +#endif + +#endif /* CONFIG_LCD_ROWS > 2 */ +}; + +STATIC_ASSERT(countof(lcd_address) == CONFIG_LCD_ROWS * CONFIG_LCD_COLS); +#else /* CONFIG_LCD_ADDRESS_FAST == 0 */ + +static const uint8_t col_address[] = +{ + 0x80, + 0xC0, +#if CONFIG_LCD_ROWS > 2 + 0x94, + 0xD4 +#endif +}; +STATIC_ASSERT(countof(col_address) == CONFIG_LCD_ROWS); +/** + * Addresses of LCD display character positions, calculated runtime to save RAM + */ +static uint8_t lcd_address(uint8_t addr) +{ + return col_address[addr / CONFIG_LCD_COLS] + addr % CONFIG_LCD_COLS; +} +#endif /* CONFIG_LCD_ADDRESS_FAST */ + +/** + * Current display position. We remember this to optimize + * LCD output by avoiding to set the address every time. + */ +static lcdpos_t lcd_current_addr; + + +#if !defined(ARCH_EMUL) || !(ARCH & ARCH_EMUL) +/* __________________ + * RS + * + * R/W __________________ + * _______ + * ENA _____/ \____ + * + * DATA -<================ + */ +INLINE void lcd_dataWrite(uint8_t data) +{ +#if CONFIG_LCD_4BIT + /* Write high nibble */ + LCD_WRITE_H(data); + LCD_SET_E; + LCD_DELAY_WRITE; + LCD_CLR_E; + LCD_DELAY_WRITE; + + /* Write low nibble */ + LCD_WRITE_L(data); + LCD_SET_E; + LCD_DELAY_WRITE; + LCD_CLR_E; + LCD_DELAY_WRITE; + +#else /* !CONFIG_LCD_4BIT */ + + /* Write data */ + LCD_WRITE(data); + LCD_SET_E; + LCD_DELAY_WRITE; + LCD_CLR_E; + LCD_DELAY_WRITE; + +#endif /* !CONFIG_LCD_4BIT */ +} + +/* __________________ + * RS + * ____________ + * R/W __/ \__ + * _______ + * ENA _____/ \____ + * ______ ____ + * DATA X/ \====/ + */ +INLINE uint8_t lcd_dataRead(void) +{ + uint8_t data; + + LCD_SET_RD; + LCD_DB_IN; /* Set bus as input! */ + LCD_DELAY_READ; + +#if CONFIG_LCD_4BIT + + /* Read high nibble */ + LCD_SET_E; + LCD_DELAY_READ; + data = LCD_READ_H; + LCD_CLR_E; + LCD_DELAY_READ; + + /* Read low nibble */ + LCD_SET_E; + LCD_DELAY_READ; + data |= LCD_READ_L; + LCD_CLR_E; + LCD_DELAY_READ; + +#else /* !CONFIG_LCD_4BIT */ + + /* Read data */ + LCD_SET_E; + LCD_DELAY_READ; + data = LCD_READ; + LCD_CLR_E; + LCD_DELAY_READ; + +#endif /* !CONFIG_LCD_4BIT */ + + LCD_CLR_RD; + LCD_DB_OUT; /* Reset bus as output! */ + + return data; +} + +/* ___ __ + * RS \___________/ + * + * READ __________________ + * _______ + * ENA _____/ \____ + * + * DATA --<=============== + */ +INLINE void lcd_regWrite(uint8_t data) +{ + LCD_CLR_RS; + lcd_dataWrite(data); + LCD_SET_RS; +} + +/* __ _ + * RS \_____________/ + * ___________ + * READ ___/ \__ + * _______ + * ENA _____/ \____ + * ______ ____ + * DATA X/ \====/ + */ +INLINE uint8_t lcd_regRead(void) +{ + uint8_t data; + + LCD_CLR_RS; + data = lcd_dataRead(); + LCD_SET_RS; + return data; +} + +#if CONFIG_LCD_4BIT + +INLINE void lcd_mode4Bit(void) +{ + LCD_CLR_RS; + + LCD_WRITE_H(LCD_CMD_SETFUNC); + LCD_SET_E; + LCD_DELAY_WRITE; + LCD_CLR_E; + LCD_DELAY_WRITE; + + LCD_SET_RS; +} + +#endif /* CONFIG_LCD_4BIT */ + +#else /* ARCH_EMUL */ + +extern void Emul_LCDWriteReg(uint8_t d); +extern uint8_t Emul_LCDReadReg(void); +extern void Emul_LCDWriteData(uint8_t d); +extern uint8_t Emul_LCDReadData(void); + +#define lcd_regWrite(d) Emul_LCDWriteReg(d) +#define lcd_regRead(d) Emul_LCDReadReg() +#define lcd_dataWrite(d) Emul_LCDWriteData(d) +#define lcd_dataRead(d) Emul_LCDReadData() + +#endif /* ARCH_EMUL */ + + +/** + * Wait until the LCD busy flag clears. + */ +void lcd_waitBusy(void) +{ + for (;;) + { + uint8_t val = lcd_regRead(); + if (!(val & LCDF_BUSY)) + break; + } +} + + +/** + * Move the cursor to \a addr, only if not already there. + */ +void lcd_moveTo(uint8_t addr) +{ + if (addr != lcd_current_addr) + { + lcd_waitBusy(); + lcd_regWrite(lcd_address(addr)); + lcd_current_addr = addr; + } +} + + +/** + * Write a value in LCD data register, waiting for the busy flag. + */ +void lcd_setReg(uint8_t val) +{ + lcd_waitBusy(); + lcd_regWrite(val); +} + +#include +/** + * Write the character \a c on display address \a addr. + * + * NOTE: argh, the HD44 lcd type is a bad beast: our + * move/write -> write optimization requires this mess + * because display lines are interleaved! + */ +void lcd_putc(uint8_t addr, uint8_t c) +{ + if (addr != lcd_current_addr) + lcd_setReg(lcd_address(addr)); + + lcd_waitBusy(); + lcd_dataWrite(c); + lcd_current_addr = addr + 1; + + /* If we are at end of display wrap the address to 0 */ + if (lcd_current_addr == CONFIG_LCD_COLS * CONFIG_LCD_ROWS) + lcd_current_addr = 0; + + /* If we are at the end of a row put the cursor at the beginning of the next */ + if (!(lcd_current_addr % CONFIG_LCD_COLS)) + lcd_setReg(lcd_address(lcd_current_addr)); +} + + +/** + * Remap the glyph of a character. + * + * glyph - bitmap of 8x8 bits. + * code - must be 0-7 for the Hitachi LCD-II controller. + */ +void lcd_remapChar(const char *glyph, char code) +{ + int i; + + /* Set CG RAM address */ + lcd_setReg((uint8_t)((1<<6) | (code << 3))); + + /* Write bitmap data */ + for (i = 0; i < 8; i++) + { + lcd_waitBusy(); + lcd_dataWrite(glyph[i]); + } + + /* Move back to original address */ + lcd_setReg(lcd_address(lcd_current_addr)); +} + + +#if 0 /* unused */ +void lcd_remapfont(void) +{ + static const char lcd_glyphs[8] = + { + 0x04, 0x0E, 0x15, 0x04, 0x04, 0x04, 0x04, 0x00 /* up arrow */ + }; + int i; + + for (i = 0; i < 15; i++) + lcd_remapChar(i, bernie_char); + + + lcd_setAddr(lcd_DefLayer, 0); + for (i = 0; i < 80; i++) + lcd_putCharUnlocked(i); +} +#endif /* unused */ + +void lcd_hw_init(void) +{ + lcd_hd44_hw_bus_init(); + + timer_delay(50); + +#if CONFIG_LCD_4BIT + lcd_regWrite(LCD_CMD_SET8BIT); + lcd_mode4Bit(); + timer_delay(2); +#endif /* CONFIG_LCD_4BIT */ + + lcd_regWrite(LCD_CMD_SETFUNC); + timer_delay(2); + + lcd_regWrite(LCD_CMD_DISPLAY_ON); + timer_delay(2); + + lcd_regWrite(LCD_CMD_CLEAR); + timer_delay(2); + +#if !CONFIG_LCD_4BIT + lcd_regWrite(LCD_CMD_RESET_DDRAM); // 4 bit mode doesn't allow char reprogramming +#endif + lcd_regWrite(LCD_CMD_DISPLAYMODE); + timer_delay(2); +} + + diff --git a/2.5/bertos/drv/lcd_hd44.h b/2.5/bertos/drv/lcd_hd44.h new file mode 100644 index 00000000..b2ff8f0c --- /dev/null +++ b/2.5/bertos/drv/lcd_hd44.h @@ -0,0 +1,109 @@ +/** + * \file + * + * + * \brief Hitachi HD44780 and clones LCD module. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + * $WIZ$ module_name = "lcd_hd44" + * $WIZ$ module_depends = "timer" + * $WIZ$ module_configuration = "bertos/cfg/cfg_lcd_hd44.h" + * $WIZ$ module_hw = "bertos/hw/hw_lcd_hd44.h" + */ + +#ifndef DRV_LCD_HD44_H +#define DRV_LCD_HD44_H + +#include "cfg/cfg_lcd_hd44.h" +#include /* For stdint types */ + +/** + * \name Values for CONFIG_LCD_ROWS. + * + * Select the number of rows which are available + * on the HD44780 Display. + * $WIZ$ lcd_hd44_rows = "LCD_HD44_ROWS_2", "LCD_HD44_ROWS_4" + */ +#define LCD_HD44_ROWS_2 2 +#define LCD_HD44_ROWS_4 4 + +/** + * \name Values for CONFIG_LCD_COLS. + * + * Select the number of columns which are available + * on the HD44780 Display. + * $WIZ$ lcd_hd44_cols = "LCD_HD44_COLS_16", "LCD_HD44_COLS_20" + */ +#define LCD_HD44_COLS_16 16 +#define LCD_HD44_COLS_20 20 + +/** + * \name Hitachi HD44 commands. + * \{ + */ +#define LCD_CMD_DISPLAY_INI 0x30 + +#if CONFIG_LCD_4BIT + #define LCD_CMD_SETFUNC 0x28 /**< 4 bits, 2 lines, 5x7 dots */ +#else + #define LCD_CMD_SETFUNC 0x38 /**< 8 bits, 2 lines, 5x7 dots */ +#endif + +#define LCD_CMD_SET8BIT 0x30 +#define LCD_CMD_DISPLAY_ON 0x0F /**< Switch on display */ +#define LCD_CMD_DISPLAY_OFF 0x08 /**< Switch off display */ +#define LCD_CMD_CLEAR 0x01 /**< Clear display */ +#define LCD_CMD_CURSOR_BLOCK 0x0D /**< Show cursor (block) */ +#define LCD_CMD_CURSOR_LINE 0x0F /**< Show cursor (line) */ +#define LCD_CMD_CURSOR_OFF 0x0C /**< Hide cursor */ +#define LCD_CMD_DISPLAYMODE 0x06 +#define LCD_CMD_SET_CGRAMADDR 0x40 +#define LCD_CMD_RESET_DDRAM 0x80 +#define LCD_CMD_SET_DDRAMADDR 0x80 +#define LCD_CMD_DISPLAY_SHIFT 0x18 +#define LCD_CMD_MOVESHIFT_LEFT 0x00 +#define LCD_CMD_MOVESHIFT_RIGHT 0x04 +/*\}*/ + +/** Type for combined LCD cursor position (x,y). */ +typedef uint8_t lcdpos_t; + +void lcd_waitBusy(void); +void lcd_moveTo(uint8_t addr); +void lcd_setReg(uint8_t val); +void lcd_putc(uint8_t a, uint8_t c); +void lcd_remapChar(const char *glyph, char code); +void lcd_hw_init(void); +void lcd_hw_test(void); + +#endif /* DRV_LCD_HD44_H */ diff --git a/2.5/bertos/drv/lcd_hd44_hwtest.c b/2.5/bertos/drv/lcd_hd44_hwtest.c new file mode 100644 index 00000000..19c8d9f6 --- /dev/null +++ b/2.5/bertos/drv/lcd_hd44_hwtest.c @@ -0,0 +1,96 @@ +/** + * \file + * + * + * \brief LM044L type LCD hardware module (impl.) + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + */ + +#include "lcd_hd44.h" +#include "hw/hw_lcd_hd44.h" + +#include +#include + +#warning TODO:Refactor this test to comply whit BeRTOS test policy. + +#if UNIT_TEST + +void lcd_hw_test(void) +{ + lcd_regWrite(LCD_CMD_SET_DDRAMADDR | 3); + timer_delay(1); + kprintf("3 -> %02X\n", lcd_regRead()); + timer_delay(1); + + for (int i = 0; i < 10; i++) + { + lcd_dataWrite('c'); + timer_delay(1); + kprintf("addr = %02X\n", lcd_regRead()); + timer_delay(1); + } + + lcd_regWrite(LCD_CMD_SET_DDRAMADDR | 0x4a); + timer_delay(1); + kprintf("4A -> %02X\n", lcd_regRead()); + timer_delay(1); + + lcd_regWrite(LCD_CMD_SET_DDRAMADDR | 0x52); + timer_delay(1); + kprintf("52 -> %02X\n", lcd_regRead()); + timer_delay(1); + + lcd_regWrite(LCD_CMD_SET_DDRAMADDR | 0x1F); + timer_delay(1); + kprintf("1F -> %02X\n", lcd_regRead()); + timer_delay(1); +} + + + +#include +#include + +int main(void) +{ + lcd_hw_test(); + + for(;;) + { + } + + return 0; +} + +#endif diff --git a/2.5/bertos/drv/lcd_lm44_qt.cpp b/2.5/bertos/drv/lcd_lm44_qt.cpp new file mode 100644 index 00000000..96bd3098 --- /dev/null +++ b/2.5/bertos/drv/lcd_lm44_qt.cpp @@ -0,0 +1,362 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Custom Qt widget for emulating a graphics LCD display (implementation) + */ + +/*#* + *#* $Log$ + *#* Revision 1.1 2006/01/16 03:51:35 bernie + *#* Add LCD Qt emulator. + *#* + *#*/ + +#include +#include +#include +#include +#include "EmulLCD.h" +#include "Emul.h" + + +// Display colors +#define LCD_FG_COLOR 0x0, 0x0, 0x0 +#define LCD_BG_COLOR 0xBB, 0xCC, 0xBB + + +EmulLCD::EmulLCD(QWidget *parent, const char *name) : + QFrame(parent, name, WRepaintNoErase | WResizeNoErase), + lcd_font("courier", 18), + fg_color(LCD_FG_COLOR), + bg_color(LCD_BG_COLOR), + cr_row(0), + cr_col(0), + cgramaddr(-1), + show_cursor(true) +{ + // initialize DDRAM + memcpy(ddram, + "01234567890123456789" + "abcdefghijhlmnopqrst" + "ABCDEFGHIJKLMNOPQRST" + "!@#$%^&*()_+|{}':?><", + sizeof(ddram)); + + // setup font + lcd_font.setFixedPitch(true); + setFont(lcd_font); + + // get exact font size + QFontMetrics fm(lcd_font); + font_width = fm.width(QChar(' ')); + font_height = fm.height(); + + // set widget frame + setFrameStyle(QFrame::Panel | QFrame::Sunken); +// setLineWidth(2); + frame_width = frameWidth(); +} + + +EmulLCD::~EmulLCD() +{ + // nop +} + + +QSizePolicy EmulLCD::sizePolicy() const +{ + return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed, false); +} + + +QSize EmulLCD::sizeHint() const +{ + return QSize( + font_width * COLS + frame_width * 2, + font_height * ROWS + frame_width * 2); +} + + +void EmulLCD::drawContents(QPainter *p) +{ + RedrawText(*p); +} + + +void EmulLCD::SetPainter(QPainter & p) +{ + p.setBackgroundMode(OpaqueMode); + p.setPen(fg_color); + p.setBackgroundColor(bg_color); +} + + +void EmulLCD::RedrawText(QPainter & p) +{ + int r, c; + + SetPainter(p); + + for (r = 0; r < ROWS; r++) + for (c = 0; c < COLS; c++) + PrintChar(p, r, c); +} + + +void EmulLCD::PrintChar(QPainter & p, int row, int col) +{ + // Fetch char from DD RAM + unsigned char c = ddram[row][col]; + + // Map some Hitachi characters to ISO Latin1 + switch(c) + { + case 0xDF: + c = 0xBA; // "degrees" glyph + break; + + case 0xE4: + c = 0xB5; // "micro" glyph + break; + + default: // all others + break; + } + + // Draw char on display + int x = col * font_width + frame_width; + int y = row * font_height + frame_width; + bool restore_colors = false; + + if (show_cursor && (row == cr_row) && (col == cr_col)) + { + // Exchange FG/BG colors + p.setPen(bg_color); + p.setBackgroundColor(fg_color); + restore_colors = true; + } + + p.drawText(x, y, x + font_width, y + font_height, 0 /*tf*/, + QString(QChar(c)), 1); + + if (restore_colors) + { + // Restore FG/BG colors + p.setPen(fg_color); + p.setBackgroundColor(bg_color); + } +} + + +void EmulLCD::MoveCursor(int r, int c) +{ + // Save old cursor position + int old_row = cr_row; + int old_col = cr_col; + + // Move the cursor + cgramaddr = -1; + cr_row = r; + cr_col = c; + + if (show_cursor && (old_col != cr_col || old_row != cr_row)) + { + QPainter p(this); + SetPainter(p); + + // Draw new cursor + PrintChar(p, cr_row, cr_col); + + // Erase old cursor + PrintChar(p, old_row, old_col); + } +} + + +void EmulLCD::ShowCursor(bool show) +{ + show_cursor = show; + + // Draw (or erase) cursor + QPainter p(this); + SetPainter(p); + PrintChar(p, cr_row, cr_col); +} + + +void EmulLCD::AdvanceCursor() +{ + // Move the cursor + if (cr_col == COLS - 1) + { + if (cr_row == ROWS - 1) + MoveCursor(0, 0); + else + MoveCursor(cr_row + 1, 0); + } + else + MoveCursor(cr_row, cr_col + 1); +} + + +void EmulLCD::PutChar(unsigned char c) +{ + if (cgramaddr != -1) + { + // Write data in CGRAM + cgram[cgramaddr] = c; + + // Auto increment CGRAM address + cgramaddr = (cgramaddr + 1) & 0x3F; + } + else + { + // Writing in DDRAM + ddram[cr_row][cr_col] = c; + + // Update display + { + QPainter p(this); + SetPainter(p); + PrintChar(p, cr_row, cr_col); + } + AdvanceCursor(); + } +} + + +char EmulLCD::GetChar() +{ + char c = ddram[cr_row][cr_col]; + AdvanceCursor(); + return c; +} + + +void EmulLCD::Clear() +{ + memset(ddram, ' ', sizeof(ddram)); + cr_row = cr_col = 0; + + QPainter p(this); + RedrawText(p); +} + + +void EmulLCD::SetCGRamAddr(unsigned char addr) +{ + cgramaddr = addr & (sizeof(cgram) - 1); +} + + +// Hitachi LM044L register-level emulation + +#define INI_DISPLAY 0x30 +#define INI_OP_DISP 0x38 /* 8 bits, 2 lines, 5x7 dots */ +#define ON_DISPLAY 0x0F /* Switch on display */ +#define OFF_DISPLAY 0x08 /* Switch off display */ +#define CLR_DISPLAY 0x01 /* Clear display */ +#define CURSOR_BLOCK 0x0D /* Show cursor (block) */ +#define CURSOR_LINE 0x0F /* Show cursor (line) */ +#define CURSOR_OFF 0x0C /* Hide cursor */ +#define MODE_DISPL 0x06 +#define SHIFT_DISPLAY 0x18 +#define MOVESHIFT_LEFT 0x00 +#define MOVESHIFT_RIGHT 0x04 +#define LCD_CGRAMADDR (1<<6) +#define LCD_DDRAMADDR (1<<7) + + +extern "C" void Emul_LCDWriteReg(unsigned char d) +{ + static const unsigned char lcd_rowaddress[EmulLCD::ROWS] = { 0x80, 0xC0, 0x94, 0xD4 }; + + switch(d) + { + case CLR_DISPLAY: + emul->emulLCD->Clear(); + break; + + case CURSOR_BLOCK: + case CURSOR_LINE: + emul->emulLCD->ShowCursor(true); + break; + + case CURSOR_OFF: + emul->emulLCD->ShowCursor(false); + break; + + default: + // Set DDRAM address? + if (d & LCD_DDRAMADDR) + { + for (int i = 0; i < EmulLCD::ROWS; i++) + { + if ((d >= lcd_rowaddress[i]) && (d < lcd_rowaddress[i] + EmulLCD::COLS)) + { + emul->emulLCD->MoveCursor(i, d - lcd_rowaddress[i]); + break; + } + } + } + else if (d & LCD_CGRAMADDR) + emul->emulLCD->SetCGRamAddr(d); + break; + } +} + + +extern "C" unsigned char Emul_LCDReadReg(void) +{ + return 0; /* This LCD model is never busy ;-) */ +} + + +extern "C" void Emul_LCDWriteData(unsigned char d) +{ + emul->emulLCD->PutChar(d); +} + + +extern "C" unsigned char Emul_LCDReadData(void) +{ + return emul->emulLCD->GetChar(); +} + +#include "EmulLCD.moc" + diff --git a/2.5/bertos/drv/lcd_lm44_qt.h b/2.5/bertos/drv/lcd_lm44_qt.h new file mode 100644 index 00000000..a3fd1cf1 --- /dev/null +++ b/2.5/bertos/drv/lcd_lm44_qt.h @@ -0,0 +1,102 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Custom Qt widget for emulating a graphics LCD display (implementation) + */ + +#ifndef EMULLCD_H +#define EMULLCD_H + +#include +#include +#include + +// fwd decls +class QSizePolicy; +class QPaintEvent; +class QResizeEvent; + +/** + * Qt widget to emulate a dot-matrix LCD display. + */ +class EmulLCD : public QFrame +{ + Q_OBJECT + +public: +// Attributes + enum { COLS = 20, ROWS = 4 }; + +// Construction + EmulLCD(QWidget *parent = 0, const char *name = 0); + virtual ~EmulLCD(); + +// Base class overrides +protected: + virtual QSizePolicy sizePolicy() const; + virtual QSize sizeHint() const; + virtual void drawContents(QPainter *p); + +// Operations +public: + void MoveCursor (int col, int row); + void ShowCursor (bool show = true); + void PutChar (unsigned char c); + char GetChar (); + void Clear (); + void SetCGRamAddr (unsigned char addr); + +// Implementation +protected: + void SetPainter(QPainter & p); + void RedrawText(QPainter & p); + void PrintChar(QPainter & p, int row, int col); + void AdvanceCursor(); + + QFont lcd_font; ///< Display character font + QColor fg_color, bg_color; ///< LCD colors + int font_width, font_height; ///< Font dimensions + int frame_width; ///< Frame width (and height) + int cr_row, cr_col; ///< Cursor position + int cgramaddr; ///< CGRAM Address (-1 disabled) + unsigned char ddram[ROWS][COLS];///< Display data RAM + unsigned char cgram[8*8]; ///< CGRAM + bool show_cursor; ///< Cursor enabled? +}; + +#endif // !defined(EMULLCD_H) + diff --git a/2.5/bertos/drv/lcd_rit128x96.c b/2.5/bertos/drv/lcd_rit128x96.c new file mode 100644 index 00000000..f917cbb7 --- /dev/null +++ b/2.5/bertos/drv/lcd_rit128x96.c @@ -0,0 +1,211 @@ +/** + * \file + * + * + * \brief OLED-RIT-128x96 (P14201) graphic display driver + * + * \author Andrea Righi + */ + +#include "lcd_rit128x96.h" + +#include "hw/hw_rit128x96.h" + +#include +#include + + +/* + * Hard-coded command initialization sequence. + * + * NOTE: the first byte is the size of the command. + */ +static const uint8_t init_cmd[] = +{ + /* Unlock commands */ + 3, 0xfd, 0x12, 0xe3, + /* Display off */ + 2, 0xae, 0xe3, + /* Icon off */ + 3, 0x94, 0, 0xe3, + /* Multiplex ratio */ + 3, 0xa8, 95, 0xe3, + /* Contrast */ + 3, 0x81, 0xb7, 0xe3, + /* Pre-charge current */ + 3, 0x82, 0x3f, 0xe3, + /* Display Re-map */ + 3, 0xa0, 0x52, 0xe3, + /* Display Start Line */ + 3, 0xa1, 0, 0xe3, + /* Display Offset */ + 3, 0xa2, 0x00, 0xe3, + /* Display Mode Normal */ + 2, 0xa4, 0xe3, + /* Phase Length */ + 3, 0xb1, 0x11, 0xe3, + /* Frame frequency */ + 3, 0xb2, 0x23, 0xe3, + /* Front Clock Divider */ + 3, 0xb3, 0xe2, 0xe3, + /* Set gray scale table */ + 17, 0xb8, 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 19, 22, 26, 30, 0xe3, + /* Second pre-charge period */ + 3, 0xbb, 0x01, 0xe3, + /* Pre-charge voltage */ + 3, 0xbc, 0x3f, 0xe3, + /* Display ON */ + 2, 0xaf, 0xe3, +}; + +/* + * Hard-coded command shutdown sequence. + */ +static const uint8_t exit_cmd[] = +{ + /* Display OFF */ + 0xae, 0xe3 +}; + +/* + * Hard-coded horizontal increment command. + */ +static const uint8_t horizontal_inc[] = +{ + 0xa0, 0x52 +}; + +/** + * Write a sequence of data bytes to the LCD controller + */ +static void lcd_dataWrite(const uint8_t *buf, size_t count) +{ + while (count--) + LCD_WRITE(*buf++); +} + +/* Turn on the OLED display */ +void rit128x96_on(void) +{ + unsigned int i; + + /* Loop through the SSD1329 controller initialization sequence */ + LCD_SET_COMMAND(); + for (i = 0; i < sizeof(init_cmd); i += init_cmd[i] + 1) + lcd_dataWrite(init_cmd + i + 1, init_cmd[i] - 1); +} + +/* Turn off the OLED display */ +void rit128x96_off(void) +{ + LCD_SET_COMMAND(); + lcd_dataWrite(exit_cmd, sizeof(exit_cmd)); +} + +static void lcd_start_blit(uint8_t x, uint8_t y, uint8_t width, uint8_t height) +{ + uint8_t buffer[3]; + + ASSERT((x + width) <= LCD_WIDTH); + ASSERT((y + height) <= LCD_HEIGHT); + + /* Enter command mode */ + LCD_SET_COMMAND(); + + buffer[0] = 0x15; + buffer[1] = x / 2; + buffer[2] = (x + width - 2) / 2; + lcd_dataWrite(buffer, 3); + + buffer[0] = 0x75; + buffer[1] = y; + buffer[2] = y + height - 1; + lcd_dataWrite(buffer, 3); + lcd_dataWrite((const uint8_t *)&horizontal_inc, sizeof(horizontal_inc)); +} + +/* Refresh a raw image on screen */ +void rit128x96_blitRaw(const uint8_t *data, + uint8_t x, uint8_t y, uint8_t width, uint8_t height) +{ + lcd_start_blit(x, y, width, height); + /* + * Enter data mode and send the encoded image data to the OLED display, + * over the SSI bus. + */ + LCD_SET_DATA(); + while (height--) + { + /* Write an entire row at once */ + lcd_dataWrite(data, width / 2); + data += width / 2; + } +} + +/* Refresh a bitmap on screen */ +void rit128x96_blitBitmap(const Bitmap *bm) +{ + uint8_t lcd_row[bm->width / 2]; + uint8_t mask; + int i, l; + + lcd_start_blit(0, 0, bm->width, bm->height); + /* + * Enter data mode and send the encoded image data to the OLED display, + * over the SSI bus. + */ + LCD_SET_DATA(); + for (l = 0; l < bm->height / 8; l++) + { + for (mask = 1; mask; mask <<= 1) + { + for (i = 0; i < bm->width; i++) + { + if (bm->raster[l * bm->width + i] & mask) + lcd_row[i / 2] |= i & 1 ? 0x0f : 0xf0; + else + lcd_row[i / 2] &= i & 1 ? 0xf0 : 0x0f; + } + /* Write an entire row at once */ + lcd_dataWrite(lcd_row, sizeof(lcd_row)); + } + } +} + +/* Initialize the OLED display */ +void rit128x96_init(void) +{ + /* Initialize the communication bus */ + lcd_rit128x96_hw_bus_init(); + + /* Turn on the OLED display */ + rit128x96_on(); +} diff --git a/2.5/bertos/drv/lcd_rit128x96.h b/2.5/bertos/drv/lcd_rit128x96.h new file mode 100644 index 00000000..04b8e388 --- /dev/null +++ b/2.5/bertos/drv/lcd_rit128x96.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief OLED-RIT-128x96 (P14201) graphic display driver + * + * $WIZ$ module_name = "lcd_rit128x96" + * $WIZ$ module_hw = "bertos/hw/hw_rit128x96.h" + */ + +#ifndef LCD_LM3S_H +#define LCD_LM3S_H + +#include /* Bitmap */ + +#include + +#define LCD_WIDTH 128 +#define LCD_HEIGHT 96 + +void rit128x96_blitRaw(const uint8_t *data, + uint8_t x, uint8_t y, uint8_t width, uint8_t height); +void rit128x96_blitBitmap(const Bitmap *bm); +void rit128x96_on(void); +void rit128x96_off(void); +void rit128x96_init(void); + +#endif /* LCD_LM3S_H */ diff --git a/2.5/bertos/drv/lcd_text.c b/2.5/bertos/drv/lcd_text.c new file mode 100644 index 00000000..ff480776 --- /dev/null +++ b/2.5/bertos/drv/lcd_text.c @@ -0,0 +1,458 @@ +/** + * \file + * + * + * \brief Generic text LCD driver (impl.). + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + */ + +#include "lcd_text.h" +#include "lcd_hd44.h" + +#include // BV() +#include + +#include // timer_delay() + +#include // _formatted_write() +#include // LIST_EMPTY() + +#include // strlen() + + +/** Maximum number of layers. */ +#define LCD_LAYERS 6 + +#if CONFIG_KERN + #include + /** Semaphore to arbitrate access to the display. */ + static struct Semaphore lcd_semaphore; + #define LOCK_LCD sem_obtain(&lcd_semaphore) + #define UNLOCK_LCD sem_release(&lcd_semaphore) +#else /* !CONFIG_KERN */ + #define LOCK_LCD do {} while (0) + #define UNLOCK_LCD do {} while (0) +#endif /* !CONFIG_KERN */ + +DECLARE_LIST_TYPE(Layer); + +Layer *lcd_DefLayer; +static Layer lcd_LayersPool[LCD_LAYERS]; +static LIST_TYPE(Layer) lcd_Layers; +static LIST_TYPE(Layer) lcd_FreeLayers; + +/** + * Current cursor status. + * + * One of LCD_CMD_CURSOR_OFF, LCD_CMD_CURSOR_BLOCK or LCD_CMD_CURSOR_LINE. + */ +static uint8_t lcd_CursorStatus; + +/** Current cursor position, encoded as a Cursor position and status. */ +static lcdpos_t lcd_CursorAddr; + + +void lcd_setAddr(Layer *layer, lcdpos_t addr) +{ + /* Sanity check: wrap around to display limits */ + while (addr >= CONFIG_LCD_ROWS * CONFIG_LCD_COLS) + addr -= CONFIG_LCD_ROWS * CONFIG_LCD_COLS; + + layer->addr = addr; +} + +#if CONFIG_KERN + +void lcd_lock(void) +{ + LOCK_LCD; +} + + +void lcd_unlock(void) +{ + UNLOCK_LCD; +} + +#endif /* CONFIG_KERN */ + + +/** + * Write one character to the display at the current + * cursor prosition, then move the cursor right. The + * cursor is wrapped to the next line when it moves + * beyond the end of the current line. + * + * \note Does _NOT_ lock the display semaphore. + */ +static void lcd_putCharUnlocked(char c, Layer *layer) +{ + Layer *l2; + lcdpos_t addr = layer->addr; + + /* Store character in layer buffer */ + layer->buf[addr] = c; + + /* Move to next character */ + if (++layer->addr >= CONFIG_LCD_COLS * CONFIG_LCD_ROWS) + layer->addr = 0; + + /* Do not write on LCD if layer is hidden. */ + if (layer->pri == LAYER_HIDDEN) + return; + + /* + * Check if this location is obscured by + * other layers above us. + */ + for (l2 = layer->pred; l2->pred; l2 = l2->pred) + { + if (l2->buf[addr]) + { + /* DB(kprintf("layer %04x obs %04x at %d\n", l2, layer, addr);) */ + return; + } + } + + /* Write character */ + if (c) + lcd_putc(addr, c); + else + /* FIXME: should look for layers beneath! */ + lcd_putc(addr, ' '); +} + + +void lcd_putChar(char c, Layer *layer) +{ + LOCK_LCD; + lcd_putCharUnlocked(c, layer); + UNLOCK_LCD; +} + +void lcd_layerSet(Layer *layer, char c) +{ + int i; + + LOCK_LCD; + lcd_setAddr(layer, 0); + for (i = 0; i < CONFIG_LCD_COLS * CONFIG_LCD_ROWS; i++) + lcd_putCharUnlocked(c, layer); + UNLOCK_LCD; +} + + +void lcd_clear(Layer *layer) +{ + lcd_layerSet(layer, 0); +} + + +void lcd_clearLine(Layer *layer, int y) +{ + int i; + + LOCK_LCD; + lcd_setAddr(layer, LCD_POS(0, y)); + for (i = 0; i < CONFIG_LCD_COLS; i++) + lcd_putCharUnlocked(0, layer); + UNLOCK_LCD; +} + + +void lcd_moveCursor(lcdpos_t addr) +{ + LOCK_LCD; + lcd_moveTo(addr); + UNLOCK_LCD; +} + + +char lcd_setCursor(char mode) +{ + static const char cursor_cmd[3] = + { + LCD_CMD_CURSOR_OFF, LCD_CMD_CURSOR_BLOCK, LCD_CMD_CURSOR_LINE + }; + char oldmode = lcd_CursorStatus; + + LOCK_LCD; + lcd_CursorStatus = mode; + lcd_setReg(cursor_cmd[(int)mode]); + if (mode) + lcd_moveCursor(lcd_CursorAddr); + UNLOCK_LCD; + + return oldmode; +} + + +int lcd_vprintf(Layer *layer, lcdpos_t addr, uint8_t mode, const char *format, va_list ap) +{ + int len; + + LOCK_LCD; + + /* + * Se il cursore era acceso, spegnilo durante + * l'output per evitare che salti alla posizione + * in cui si scrive. + */ + if (lcd_CursorStatus) + lcd_setReg(LCD_CMD_CURSOR_OFF); + + /* Spostamento del cursore */ + lcd_setAddr(layer, addr); + + if (mode & LCD_CENTER) + { + int pad; + + /* + * NOTE: calculating the string lenght BEFORE it gets + * printf()-formatted. Real lenght may differ. + */ + pad = (CONFIG_LCD_COLS - strlen(format)) / 2; + while (pad--) + lcd_putCharUnlocked(' ', layer); + } + + len = _formatted_write(format, (void (*)(char, void *))lcd_putCharUnlocked, layer, ap); + + if (mode & (LCD_FILL | LCD_CENTER)) + while (layer->addr % CONFIG_LCD_COLS) + lcd_putCharUnlocked(' ', layer); + + /* + * Riaccendi il cursore e riportalo alla + * vecchia posizione + */ + if (lcd_CursorStatus) + lcd_setCursor(lcd_CursorStatus); + + UNLOCK_LCD; + + return len; +} + + +int lcd_printf(Layer *layer, lcdpos_t addr, uint8_t mode, const char *format, ...) +{ + int len; + va_list ap; + + va_start(ap, format); + len = lcd_vprintf(layer, addr, mode, format, ap); + va_end(ap); + + return len; +} + + +/** + * Internal function to move a layer between two positions. + * + * \note The layer must be *already* enqueued in some list. + * \note The display must be already locked! + */ +static void lcd_enqueueLayer(Layer *layer, char pri) +{ + Layer *l2; + + /* Remove layer from whatever list it was in before */ + REMOVE(layer); + + layer->pri = pri; + + /* + * Search for the first layer whose priority + * is less or equal to the layer we are adding. + */ + FOREACH_NODE(l2, &lcd_Layers) + if (l2->pri <= pri) + break; + + /* Enqueue layer */ + INSERT_BEFORE(layer, l2); +} + +Layer *lcd_newLayer(char pri) +{ + Layer *layer; + + LOCK_LCD; + + if (LIST_EMPTY(&lcd_FreeLayers)) + { + UNLOCK_LCD; + //ASSERT(false); + return NULL; + } + + layer = (Layer *)LIST_HEAD(&lcd_FreeLayers); + layer->addr = 0; + memset(layer->buf, 0, CONFIG_LCD_ROWS * CONFIG_LCD_COLS); + + lcd_enqueueLayer(layer, pri); + + UNLOCK_LCD; + return layer; +} + +/** + * Redraw the display (internal). + * + * \note The display must be already locked. + */ +static void lcd_refresh(void) +{ + lcdpos_t addr; + Layer *l; + + for (addr = 0; addr < CONFIG_LCD_ROWS * CONFIG_LCD_COLS; ++addr) + { + FOREACH_NODE(l, &lcd_Layers) + { + //kprintf("%d %x %p\n", addr, l->buf[0], l); + if (l->pri == LAYER_HIDDEN) + break; + + if (l->buf[addr]) + { + /* Refresh location */ + lcd_putc(addr, l->buf[addr]); + goto done; + } + } + + /* Draw background */ + lcd_putc(addr, ' '); + done: + ; + } +} + +/** + * Rearrange layer depth and refresh display accordingly. + * + * \note Setting a priority of LAYER_HIDDEN makes the layer invisible. + */ +void lcd_setLayerDepth(Layer *layer, char pri) +{ + if (pri != layer->pri) + { + LOCK_LCD; + lcd_enqueueLayer(layer, pri); + /* Vile but simple */ + lcd_refresh(); + UNLOCK_LCD; + } +} + +void lcd_deleteLayer(Layer *layer) +{ + LOCK_LCD; + +/* We use lcd_refresh() instead. Much simpler than this mess, but slower. */ +#if 0 + Layer *l2; + lcdpos_t addr; + + /* Repair damage on underlaying layers */ + for (addr = 0; addr < CONFIG_LCD_ROWS * CONFIG_LCD_COLS; ++addr) + { + /* If location was covered by us */ + if (layer->buf[addr]) + { + /* ...and it wasn't covered by others above us... */ + for (l2 = layer->pred; l2->pred; l2 = l2->pred) + if (l2->buf[addr]) + /* can't just break here! */ + goto not_visible; + + /* ...scan underlaying layers to repair damage */ + for (l2 = layer->succ; l2->succ; l2 = l2->succ) + if (l2->buf[addr]) + { + /* Refresh character */ + lcd_putc(addr, l2->buf[addr]); + + /* No need to search on deeper layers */ + break; + } + + not_visible: + ; + } + } +#endif + + // Remove layer from lcd_Layers list. + REMOVE(layer); + + /* Put layer back into free list */ + ADDHEAD(&lcd_FreeLayers, layer); + + lcd_refresh(); + + UNLOCK_LCD; +} + + +static void lcd_setDefLayer(Layer *layer) +{ + lcd_DefLayer = layer; +} + +#include +void lcd_init(void) +{ + #if CONFIG_KERN + sem_init(&lcd_semaphore); + #endif + + int i; + + LIST_INIT(&lcd_Layers); + LIST_INIT(&lcd_FreeLayers); + for (i = 0; i < LCD_LAYERS; ++i) + ADDHEAD(&lcd_FreeLayers, &lcd_LayersPool[i]); + + lcd_setDefLayer(lcd_newLayer(0)); + + lcd_hw_init(); + + lcd_setCursor(0); +} + + diff --git a/2.5/bertos/drv/lcd_text.h b/2.5/bertos/drv/lcd_text.h new file mode 100644 index 00000000..09a1c70e --- /dev/null +++ b/2.5/bertos/drv/lcd_text.h @@ -0,0 +1,122 @@ +/** + * \file + * + * + * \brief Generic text LCD driver (interface). + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + * $WIZ$ module_name = "lcd_text" + * $WIZ$ module_depends = "lcd_hd44", "timer", "formatwr" + */ + +#ifndef DRV_LCD_H +#define DRV_LCD_H + +#include "lcd_hd44.h" + +#include +#include +#include + +#include // vprintf() + + +/* flags for lcd_printf() */ +#define LCD_NORMAL 0 /* Scrittura normale */ +#define LCD_FILL BV(0) /* Fill rest of line with spaces */ +#define LCD_CENTER BV(1) /* Center string in line */ +#define LCD_NOCURSOR BV(2) /* Scrittura senza spostamento cursore */ + +/** Special priority value for lcd_setLayerDepth(). */ +#define LAYER_HIDDEN -127 + +/* Compute LCD address from x/y coordinates */ +#define LCD_POS(x,y) ((lcdpos_t)((uint8_t)(x) + (uint8_t)(y) * (uint8_t)CONFIG_LCD_COLS)) +#define LCD_ROW0 (CONFIG_LCD_COLS * 0) +#define LCD_ROW1 (CONFIG_LCD_COLS * 1) +#define LCD_ROW2 (CONFIG_LCD_COLS * 2) +#define LCD_ROW3 (CONFIG_LCD_COLS * 3) + +/** + * Overwrapping layer context. + */ +typedef struct _Layer +{ + /** + * Active layers are linked together in a list + * sorted in top to bottom order. + */ + DECLARE_NODE_ANON(struct _Layer) + + /** Current XY address into this layer, for write operations. */ + lcdpos_t addr; + + /** Priority of this layer (greater in front of lesser). */ + signed char pri; + + /** + * Layer backing store buffer. + * + * All writes through the layer are copied into this buffer. + * Characters cells with value 0 are transparent with respect + * to other layers in the background. + */ + char buf[CONFIG_LCD_COLS * CONFIG_LCD_ROWS]; +} Layer; + + +/* Global variables */ +extern Layer *lcd_DefLayer; + +/* Function prototypes */ +extern void lcd_init(void); +extern void lcd_test(void); + +extern void lcd_moveCursor(lcdpos_t addr); +extern char lcd_setCursor(char state); + +extern void lcd_setAddr(Layer *layer, lcdpos_t addr); +extern void lcd_putChar(char c, Layer *layer); +extern int lcd_vprintf(Layer *layer, lcdpos_t addr, uint8_t mode, const char *format, va_list ap) FORMAT(printf, 4, 0); +extern int lcd_printf(Layer *layer, lcdpos_t addr, uint8_t mode, const char *format, ...) FORMAT(printf, 4, 5); +extern void lcd_clear(Layer *layer); +extern void lcd_layerSet(Layer *layer, char c); +extern void lcd_clearLine(Layer *layer, int y); + +extern void lcd_setLayerDepth(Layer *layer, char pri); +extern Layer *lcd_newLayer(char pri); +extern void lcd_deleteLayer(Layer *layer); +extern void lcd_lock(void); +extern void lcd_unlock(void); + +#endif /* DRV_LCD_H */ diff --git a/2.5/bertos/drv/lcd_text_hwtest.c b/2.5/bertos/drv/lcd_text_hwtest.c new file mode 100644 index 00000000..028b8327 --- /dev/null +++ b/2.5/bertos/drv/lcd_text_hwtest.c @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Generic text LCD driver (Test). + * + * \version $Id$ + * + * \author Daniele Basile + * + */ + +#warning TODO:This test is incomplete, you must review! + +#if 0 +void lcd_test(void) +{ + int i; + + for (i = 0; i < CONFIG_LCD_ROWS * CONFIG_LCD_COLS; ++i) + { + lcd_putCharUnlocked('0' + (i % 10), lcd_DefLayer); + timer_delay(100); + } +} +#endif + diff --git a/2.5/bertos/drv/lm75.c b/2.5/bertos/drv/lm75.c new file mode 100644 index 00000000..db8f8a94 --- /dev/null +++ b/2.5/bertos/drv/lm75.c @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief LM75 sensor temperature family. + * + * \author Daniele Basile + * + */ + +#include "lm75.h" + +#include "hw/hw_lm75.h" + +#include "cfg/cfg_lm75.h" + +#include +#include + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL LM75_LOG_LEVEL +#define LOG_FORMAT LM75_LOG_FORMAT + +#include + +#include +#include // Macro and data type to manage celsius degree + +#define SELECT_ADDRESS(addr) LM75_ADDRESS_BYTE | (addr << 1) + +deg_t lm75_read(uint8_t sens_addr) +{ + uint8_t data[2]; + int16_t degree; + int16_t deci_degree; + + i2c_start_w(SELECT_ADDRESS(sens_addr)); + i2c_put(LM75_PAD_BYTE); + i2c_start_r(SELECT_ADDRESS(sens_addr)); + i2c_recv(data, sizeof(data)); + + degree = (int16_t)data[0]; + deci_degree = (int16_t)(((data[1] >> 7) & 1 ) * 5); + + LOG_INFO("[%d.%d C]\n", degree, deci_degree); + + return degree * 10 + deci_degree; +} + +void lm75_init(void) +{ + // Check dependence + MOD_CHECK(i2c); + LM75_HW_INIT(); +} + + diff --git a/2.5/bertos/drv/lm75.h b/2.5/bertos/drv/lm75.h new file mode 100644 index 00000000..62e25c7b --- /dev/null +++ b/2.5/bertos/drv/lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief LM75 sensor temperature family. + * + * \author Daniele Basile + * + * $WIZ$ module_name = "lm75" + * $WIZ$ module_depends = "timer", "i2c" + * $WIZ$ module_configuration = "bertos/cfg/cfg_lm75.h" + * $WIZ$ module_hw = "bertos/hw/hw_lm75.h" + */ + +#ifndef DRV_LM75_H +#define DRV_LM75_H + +#include + +#include // Macro and data type to manage celsius degree + +#define LM75_ADDRESS_BYTE 0x91 +#define LM75_PAD_BYTE 0x0 + +deg_t lm75_read(uint8_t sens_addr); + +void lm75_init(void); + +#endif /* DRV_LM75_H */ diff --git a/2.5/bertos/drv/mcp41.c b/2.5/bertos/drv/mcp41.c new file mode 100644 index 00000000..bfa8fd4e --- /dev/null +++ b/2.5/bertos/drv/mcp41.c @@ -0,0 +1,80 @@ +/** + * \file + * + * + * + * \brief MCP41xxx digital potentiomenter driver (implementation) + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_mcp41.h" + +#include +#include + +#include +#include +#include + +static KFile *ch; + +/** + * Set resitance for digital pot \a dev + */ +void mcp41_setResistance(Mcp41Dev dev, mcp41_res_t res) +{ + MCP41_ON(dev); + /* send command byte */ + kfile_putc(MCP41_WRITE_DATA, ch); + kfile_putc(((MCP41_HW_MAX * (uint32_t)res) + (MCP41_MAX / 2)) / MCP41_MAX, ch); + kfile_flush(ch); + + MCP41_OFF(dev); +} + + +/** + * Initialize mcp41 potentiometer driver + */ +void mcp41_init(KFile *_ch) +{ + Mcp41Dev dev; + + /* Init all potentiometer ports */ + for (dev = 0; dev < MCP41_CNT; dev++) + { + SET_MCP41_DDR(dev); + MCP41_OFF(dev); + } + + ch = _ch; +} diff --git a/2.5/bertos/drv/mcp41.h b/2.5/bertos/drv/mcp41.h new file mode 100644 index 00000000..6f5cf366 --- /dev/null +++ b/2.5/bertos/drv/mcp41.h @@ -0,0 +1,64 @@ +/** + * \file + * + * + * \version $Id$ + * + * \brief MCP41xxx digital potentiomenter driver. + * + * \version $Id$ + * \author Francesco Sacchi + * + * $WIZ$ module_name = "mcp41" + * $WIZ$ module_depends = "timer", "kfile" + * $WIZ$ module_hw = "bertos/hw/hw_mcp41.h", "bertos/hw/hw_mcp41.c", "bertos/hw/mcp41_map.h" + */ + +#ifndef DRV_MCP41_H +#define DRV_MCP41_H + +#include "hw/mcp41_map.h" +#include + +#include + +#define MCP41_WRITE_DATA 0x11 +#define MCP41_HW_MAX 255 +#define MCP41_MAX 999 + +/** + * Type for digital potentiometer resistance. + */ +typedef uint16_t mcp41_res_t; + +void mcp41_setResistance(Mcp41Dev dev, mcp41_res_t res); +void mcp41_init(KFile *ch); + +#endif /* DRV_MCP41_H */ diff --git a/2.5/bertos/drv/mpxx6115a.h b/2.5/bertos/drv/mpxx6115a.h new file mode 100644 index 00000000..aa5a682d --- /dev/null +++ b/2.5/bertos/drv/mpxx6115a.h @@ -0,0 +1,80 @@ +/** + * \file + * + * + * \brief MPXX6115A Pressure Sensor convert formula. + * + * This module convert read voltage value from MPXX6115A + * pressure sensor into hPascal value unit. + * + * \author Daniele Basile + * + * $WIZ$ module_name = "mpxx6115a" + * $WIZ$ module_depends = "adc" + * $WIZ$ module_configuration = "" + * $WIZ$ module_hw = "" + */ + +#ifndef DRV_MPXX6115A_H +#define DRV_MPXX6115A_H + +#include + +#define MPXX6115A_DIV_CONST 0.009f +#define MPXX6115A_ADD_CONST 0.095f + + +/** + * Convert read voltage from MPXX6115A Pressure Sensor in hPascal value. + * + * The conversion formula may be consulted on constructor datasheet + * (see Freescale Semiconductor MP3H6115A, MPXAZ6115A). + * + * \param vout output voltage read from pin sensor. + * \param vref reference voltage that supplies the MPXX6115A sensor. + * + * \return integer value that represent measured pressure in hPascal. + * + * \note: To compute the pressure we use the Vout/Vref ratio, so + * these two values can be expressed in any unit, even ADC levels. + * + */ +INLINE int16_t mpxx6115a_press(adcread_t vout, adcread_t vref) +{ + float tmp; + + tmp = (float)vout/(float)vref + MPXX6115A_ADD_CONST; + + // To return hpascal we should multiply by 10 because the ratio is in kpascal + return (int16_t)(tmp / MPXX6115A_DIV_CONST * 10); +} + +#endif /* DRV_MPXX6115A_H */ diff --git a/2.5/bertos/drv/ntc.c b/2.5/bertos/drv/ntc.c new file mode 100644 index 00000000..8f03732e --- /dev/null +++ b/2.5/bertos/drv/ntc.c @@ -0,0 +1,154 @@ +/** + * \file + * + * + * \brief Driver for NTC (reads a temperature through an ADC) + * + * \author Giovanni Bajo + * \author Francesco Sacchi + * + * + * This module handles an external NTC bound to an AD converter. As usual, + * it relies on a low-level API (ntc_hw_*) (see below): + * + */ + +#include "hw/hw_ntc.h" +#include "hw/ntc_map.h" + +#include "cfg/cfg_ntc.h" + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL CONFIG_NTC_LOG_LEVEL +#define LOG_VERBOSITY CONFIG_NTC_LOG_FORMAT +#include +#include + +#include + +DB(bool ntc_initialized;) + +/** + * Find in a table of values \a orig_table of size \a size, the index which + * value is less or equal to \a val. + * + * \retval 0 When \a val is higher than the first table entry. + * \retval size When \a val is lower than the last table entry. + * \retval 1..size-1 When \a val is within the table. + */ +static size_t upper_bound(const res_t *orig_table, size_t size, res_t val) +{ + const res_t *table = orig_table; + + while (size) + { + size_t pos = size / 2; + if (val > table[pos]) + size = pos; + else + { + table += pos+1; + size -= pos+1; + } + } + + return table - orig_table; +} + + +/** + * Read the temperature for the NTC channel \a dev. + * First read the resistence of the NTC through ntc_hw_read(), then, + * for the conversion from resistance to temperature, since the formula + * varies from device to device, we implemented a generic system using + * a table of data which maps temperature (index) to resistance (data). + * The range of the table (min/max temperature) and the step + * (temperature difference between two consecutive elements of the table) + * is variable and can be specified. Notice that values inbetween the + * table elements are still possible as the library does a linear + * interpolation using the actual calculated resistance to find out + * the exact temperature. + * + * The low-level API provides a function to get access to a description + * of the NTC (ntc_hw_getInfo()), including the resistance table. + * + */ +deg_t ntc_read(NtcDev dev) +{ + const NtcHwInfo* hw = ntc_hw_getInfo(dev); + const res_t* r = hw->resistances; + + res_t rx; + size_t i; + deg_t degrees = 0; + + rx = ntc_hw_read(dev); + + + i = upper_bound(r, hw->num_resistances, rx); + ASSERT(i <= hw->num_resistances); + + if (i >= hw->num_resistances) + return NTC_SHORT_CIRCUIT; + else if (i == 0) + return NTC_OPEN_CIRCUIT; + + /* + * Interpolated value in 0.1 degrees multiplied by 10: + * delta t step t + * ---------- = ---------------- + * (rx - r[i]) (r[i-1] - r [i]) + */ + float tmp; + tmp = 10 * hw->degrees_step * (rx - r[i]) / (r[i - 1] - r[i]); + + /* + * degrees = integer part corresponding to the superior index + * in the table multiplied by 10 + * - decimal part interpolated (already multiplied by 10) + */ + degrees = (i * hw->degrees_step + hw->degrees_min) * 10 - (int)(tmp); + + //kprintf("dev= %d, I=%d, degrees = %d\n", dev, i , degrees); + + return degrees; +} + + +/** + * Init NTC hardware. + */ +void ntc_init(void) +{ + NTC_HW_INIT; + DB(ntc_initialized = true;) +} + diff --git a/2.5/bertos/drv/ntc.h b/2.5/bertos/drv/ntc.h new file mode 100644 index 00000000..cb606b87 --- /dev/null +++ b/2.5/bertos/drv/ntc.h @@ -0,0 +1,91 @@ +/** + * \file + * + * + * \brief Driver for NTC sensors (reads a temperature through an ADC). + * + * \version $Id$ + * + * \author Giovanni Bajo + * \author Francesco Sacchi + * + * $WIZ$ module_name = "ntc" + * $WIZ$ module_hw = "bertos/hw/hw_ntc.h", "bertos/hw/ntc_map.h", "bertos/hw/hw_ntc.c" + */ + +#ifndef DRV_NTC_H +#define DRV_NTC_H + +#include "hw/ntc_map.h" + +#include +#include + +#define NTC_OPEN_CIRCUIT -32768 +#define NTC_SHORT_CIRCUIT 32767 + +typedef int16_t deg_t; /** type for celsius degrees deg_t = °C * 10 */ + +/** Macro for converting from deg to deg_t type */ +#define DEG_TO_DEG_T(x) ((deg_t)((x) * 10)) + +/** Macro for converting from deg_t to celsius degrees (returns only the integer part) */ +#define DEG_T_TO_INTDEG(x) ((x) / 10) + +/** Macro for converting from deg_t to celsius degrees (returns only the decimal part) */ +#define DEG_T_TO_DECIMALDEG(x) ((x) % 10) + +/** Macro for converting from deg_t to celsius degrees (returns type is float) */ +#define DEG_T_TO_FLOATDEG(x) ((x) / 10.0) + + +typedef uint32_t res_t; /** type for resistor res_t = Ohm * 100 */ +typedef float amp_t; /** type for defining amplifications amp_t = A, where A is a pure number */ + +DB(extern bool ntc_initialized;) + + +/** Describe a NTC chip */ +typedef struct NtcHwInfo +{ + const res_t *resistances; ///< resistances of the NTC (ohms * 100) + size_t num_resistances; ///< number of resistances + deg_t degrees_min; ///< degrees corresponding to the first entry in the table (celsius * 10) + deg_t degrees_step; ///< difference in degrees between two consecutive elements in the table (celsius * 10) +} NtcHwInfo; + +/** Initialize the NTC module */ +void ntc_init(void); + +/** Read a single temperature value from the NTC */ +deg_t ntc_read(NtcDev dev); + +#endif /* DRV_NTC_H */ diff --git a/2.5/bertos/drv/pcf8574.c b/2.5/bertos/drv/pcf8574.c new file mode 100644 index 00000000..71150427 --- /dev/null +++ b/2.5/bertos/drv/pcf8574.c @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief PCF8574 i2c port expander driver. + * + * This driver controls the PCF8574. + * The PCF8574 is an 8bit i2c port expander. + * You can read/write 8 pins through an i2c bus. + * The pins are quasi-bidirectionals, this mean that + * without the need of a direction register you can use + * each pin as input or output, see datasheet on how this + * is achieved. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "pcf8574.h" +#include +#include + +/** + * Read PCF8574 \a pcf bit status. + * \return the pins status or EOF on errors. + */ +int pcf8574_get(Pcf8574 *pcf) +{ + if (!i2c_start_r(PCF8574ID | ((pcf->addr << 1) & 0xF7))) + return EOF; + + int data = i2c_get(false); + i2c_stop(); + return data; +} + +/** + * Write to PCF8574 \a pcf port \a data. + * \return true if ok, false on errors. + */ +bool pcf8574_put(Pcf8574 *pcf, uint8_t data) +{ + bool res = i2c_start_w(PCF8574ID | ((pcf->addr << 1) & 0xF7)) && i2c_put(data); + i2c_stop(); + return res; +} + +/** + * Init a PCF8574 on the bus with addr \a addr. + * \return true if device is found, false otherwise. + */ +bool pcf8574_init(Pcf8574 *pcf, pcf8574_addr addr) +{ + MOD_CHECK(i2c); + pcf->addr = addr; + return pcf8574_get(pcf) != EOF; +} diff --git a/2.5/bertos/drv/pcf8574.h b/2.5/bertos/drv/pcf8574.h new file mode 100644 index 00000000..605b89b9 --- /dev/null +++ b/2.5/bertos/drv/pcf8574.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief PCF8574 i2c port expander driver. + * + * \version $Id$ + * \author Francesco Sacchi + * + * $WIZ$ module_name = "pcf8574" + * $WIZ$ module_depends = "i2c" + */ + +#ifndef DRV_PCF8574_H +#define DRV_PCF8574_H + +#include + +typedef uint8_t pcf8574_addr; + +/** + * Context for accessing a PCF8574. + */ +typedef struct Pcf8574 +{ + pcf8574_addr addr; +} Pcf8574; + +#define PCF8574ID 0x40 ///< I2C address + +int pcf8574_get(Pcf8574 *pcf); +bool pcf8574_put(Pcf8574 *pcf, uint8_t data); +bool pcf8574_init(Pcf8574 *pcf, pcf8574_addr addr); + +#endif /* DRV_PCF8574_H */ diff --git a/2.5/bertos/drv/phase.c b/2.5/bertos/drv/phase.c new file mode 100644 index 00000000..81e73f91 --- /dev/null +++ b/2.5/bertos/drv/phase.c @@ -0,0 +1,192 @@ +/** + * \file + * + * + * \brief Phase control driver (implementation) + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + + +#include "hw/hw_phase.h" + +#include +#include + +#include +#include + +#include +#include + +#include + +/** Array of triacs */ +static Triac triacs[TRIAC_CNT]; + +DB(bool phase_initialized;) + +/** + * Zerocross interrupt, call when 220V cross zero. + * + * This function turn off all triacs that have duty < 100% + * and arm the triac timers for phase control. + * This function is frequency adaptive so can work both at 50 or 60Hz. + */ +DEFINE_ZEROCROSS_ISR() +{ + ticks_t period, now; + static ticks_t prev_time; + TriacDev dev; + + now = timer_clock_unlocked(); + period = now - prev_time; + + for (dev = 0; dev < TRIAC_CNT; dev++) + { + /* Only turn off triac if duty is != 100% */ + if (triacs[dev].duty != CONFIG_TRIAC_MAX_DUTY) + TRIAC_OFF(dev); + /* Compute delay from duty */ + timer_setDelay(&triacs[dev].timer, DIV_ROUND(period * (CONFIG_TRIAC_MAX_DUTY - triacs[dev].duty), CONFIG_TRIAC_MAX_DUTY)); + + /* This check avoids inserting the same timer twice + * in case of an intempestive zerocross or spike */ + if (triacs[dev].running) + { + timer_abort(&triacs[dev].timer); + //kprintf("[%lu]\n", timer_clock()); + } + + triacs[dev].running = true; + timer_add(&triacs[dev].timer); + } + prev_time = now; +} + + + +/** + * Set duty of the triac channel \a dev (interrupt safe). + */ +void phase_setDuty(TriacDev dev, triac_duty_t duty) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + phase_setDutyUnlock(dev,duty); + + IRQ_RESTORE(flags); +} + + + +/** + * Set duty of the triac channel \a dev (NOT INTERRUPT SAFE). + */ +void phase_setDutyUnlock(TriacDev dev, triac_duty_t duty) +{ + triacs[dev].duty = MIN(duty, (triac_duty_t)CONFIG_TRIAC_MAX_DUTY); +} + + + +/** + * Set power of the triac channel \a dev (interrupt safe). + * + * This function approsimate the sine wave to a triangular wave to compute + * RMS power. + */ +void phase_setPower(TriacDev dev, triac_power_t power) +{ + bool greater_fifty = false; + triac_duty_t duty; + + power = MIN(power, (triac_power_t)CONFIG_TRIAC_MAX_POWER); + + if (power > CONFIG_TRIAC_MAX_POWER / 2) + { + greater_fifty = true; + power = CONFIG_TRIAC_MAX_POWER - power; + } + + duty = TRIAC_POWER_K * sqrt(power); + + if (greater_fifty) + duty = CONFIG_TRIAC_MAX_DUTY - duty; + phase_setDuty(dev, duty); +} + + + +/** + * Soft int for each \a _dev triac. + * + * The triacs are turned on at different time to achieve phase control. + */ +static void phase_softint(void *_dev) +{ + TriacDev dev = (TriacDev)_dev; + + /* Only turn on if duty is !=0 */ + if (triacs[dev].duty) + TRIAC_ON(dev); + triacs[dev].running = false; +} + + + +/** + * Initialize phase control driver + */ +void phase_init(void) +{ + cpu_flags_t flags; + TriacDev dev; + + /* Init timers and ensure that all triac are off */ + for (dev = 0; dev < TRIAC_CNT; dev++) + { + triacs[dev].duty = 0; + triacs[dev].running = false; + SET_TRIAC_DDR(dev); + TRIAC_OFF(dev); + timer_setSoftint(&triacs[dev].timer, (Hook)phase_softint, (void *)dev); + } + IRQ_SAVE_DISABLE(flags); + + /* Init zero cross interrupt */ + PHASE_HW_INIT; + DB(phase_initialized = true;) + IRQ_RESTORE(flags); +} + diff --git a/2.5/bertos/drv/phase.h b/2.5/bertos/drv/phase.h new file mode 100644 index 00000000..52bc067d --- /dev/null +++ b/2.5/bertos/drv/phase.h @@ -0,0 +1,86 @@ +/** + * \file + * + * + * \version $Id$ + * + * \brief Phase partialization driver with TRIACs. + * + * \version $Id$ + * \author Francesco Sacchi + * + * $WIZ$ module_name = "phase" + * $WIZ$ module_depends = "timer" + * $WIZ$ module_configuration = "bertos/cfg/cfg_phase.h" + * $WIZ$ module_hw = "bertos/hw/hw_phase.h", "bertos/hw/phase_map.h", "bertos/hw/hw_phase.c" + */ + +#ifndef DRV_PHASE_H +#define DRV_PHASE_H + +#include "hw/phase_map.h" + +#include "cfg/cfg_phase.h" + +#include + +#define TRIAC_POWER_K CONFIG_TRIAC_MAX_DUTY * (1 / sqrt(2 * CONFIG_TRIAC_MAX_POWER)) + +/** + * \name Types for duty and power. + * \{ + */ +typedef uint16_t triac_duty_t; +typedef uint16_t triac_power_t; +/* \} */ + + +DB(extern bool phase_initialized;) + +/** + * \name Type for triac control. + * \{ + */ +typedef struct Triac +{ + Timer timer; /**< Timer for phase control. */ + triac_duty_t duty; /**< Duty cycle of the channel. */ + bool running; /**< True when the timer is active. */ +} Triac; +/* \} */ + +void phase_setDutyUnlock(TriacDev dev, triac_duty_t duty); +void phase_setDuty(TriacDev dev, triac_duty_t duty); +void phase_setPower(TriacDev dev, triac_power_t power); + +void phase_init(void); + + +#endif /* DRV_PHASE_H */ diff --git a/2.5/bertos/drv/pwm.c b/2.5/bertos/drv/pwm.c new file mode 100644 index 00000000..d09d9627 --- /dev/null +++ b/2.5/bertos/drv/pwm.c @@ -0,0 +1,121 @@ +/** + * \file + * + * + * + * \brief PWM driver (implementation) + * + * + * \author Francesco Sacchi + * \author Daniele Basile + */ + +#include "cfg/cfg_pwm.h" + +#include +#include + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL PWM_LOG_LEVEL +#define LOG_VERBOSITY PWM_LOG_FORMAT + +#include +#include + +#include + +#include CPU_HEADER(pwm) + +#include +#include + + +/** + * Set duty of pwm channel \p dev. + */ +void pwm_setDuty(PwmDev dev, pwm_duty_t duty) +{ + pwm_period_t period = 0; + pwm_duty_t real_duty = 0; + + duty = MIN(duty, PWM_MAX_DUTY); + + period = pwm_hw_getPeriod(dev); + + real_duty = (uint64_t)(duty * period) >> (uint64_t)PWM_MAX_PERIOD_LOG2; + + LOG_INFO("real_duty[%d] duty[%d], period[%d]\n", real_duty, duty, period); + pwm_hw_setDutyUnlock(dev, real_duty); +} + +/** + * Set frequency of pwm channel \p dev at \p freq in Hz. + */ +void pwm_setFrequency(PwmDev dev, pwm_freq_t freq) +{ + pwm_hw_setFrequency(dev, freq); +} + +/** + * Set duty of pwm channel \p dev. + */ +void pwm_enable(PwmDev dev, bool state) +{ + if (state) + pwm_hw_enable(dev); + else + pwm_hw_disable(dev); +} + +MOD_DEFINE(pwm); + +/** + * Initialize PWM hw. + */ +void pwm_init(void) +{ + cpu_flags_t flags; + PwmDev dev; + + IRQ_SAVE_DISABLE(flags); + + pwm_hw_init(); + + /* set all pwm to 0 */ + for (dev = 0; dev < PWM_CNT; dev++) + pwm_setDuty(dev, 0); + + IRQ_RESTORE(flags); + MOD_INIT(pwm); +} + + + + diff --git a/2.5/bertos/drv/pwm.h b/2.5/bertos/drv/pwm.h new file mode 100644 index 00000000..60ae6e92 --- /dev/null +++ b/2.5/bertos/drv/pwm.h @@ -0,0 +1,92 @@ +/** + * \file + * + * + * + * \brief Pulse Width Modulation (PWM) driver. + * + * \author Francesco Sacchi + * \author Daniele Basile + * + * $WIZ$ module_name = "pwm" + * $WIZ$ module_configuration = "bertos/cfg/cfg_pwm.h" + * $WIZ$ module_hw = "bertos/hw/pwm_map.h" + * $WIZ$ module_supports = "not avr and not cm3" + */ + +#ifndef DRV_PWM_H +#define DRV_PWM_H + +#include "hw/pwm_map.h" + +#include + +#include CPU_HEADER(pwm) + +#include + +#define PWM_MAX_DUTY ((pwm_duty_t)0xFFFF) +#define PWM_MAX_PERIOD 0xFFFF +#define PWM_MAX_PERIOD_LOG2 16 + +/** + * PWM type define. + */ +typedef uint16_t pwm_duty_t; +typedef uint32_t pwm_freq_t; + + + +/** + * Set PWM polarity of pwm \p dev. + */ +INLINE void pwm_setPolarity(PwmDev dev, bool pol) +{ + pwm_hw_setPolarity(dev, pol); +} + +void pwm_setDuty(PwmDev dev, pwm_duty_t duty); +void pwm_setFrequency(PwmDev dev, pwm_freq_t freq); +void pwm_setPolarity(PwmDev dev, bool pol); +void pwm_enable(PwmDev dev, bool state); +void pwm_init(void); + +/** + * Test function prototypes. + * + * See pwm_test.c for implemntation of these functions. + */ +void pwm_testRun(void); +int pwm_testSetup(void); +/* For backward compatibility */ +#define pwm_testSetUp() pwm_testSetup() +int pwm_testTearDown(void); + +#endif /* DRV_PWM_H */ diff --git a/2.5/bertos/drv/pwm_hwtest.c b/2.5/bertos/drv/pwm_hwtest.c new file mode 100644 index 00000000..12a941dd --- /dev/null +++ b/2.5/bertos/drv/pwm_hwtest.c @@ -0,0 +1,239 @@ +/** + * \file + * + * + * + * \brief Test for PWM driver (implementation) + * + * This is a simple test for PWM driver. This module + * is target independent, so you can test all target that + * BeRTOS support. + * To use this test you should include a pwm_map.h header where + * are defined the PWM channels for your target. Then you should add + * or remove a test setting in pwm_test_cfg array, and edit a value for + * your specific test. + * Afther this, all is ready and you can test PWM driver. + * + * The test check first if all PWM channel starts, and then try + * to change a PWM duty cicle for all channel. + * The change of duty cycle is operate when a PWM channel is enable, + * in this way you can see if a pwm signal is clean and work properly. + * The duty value is change incrementaly, and when it arrive to 100% or 0%, + * we reset the duty value and restart the test. + * Further the duty test, we check also a PWM polarity, infact when we + * reach a reset duty value, we invert a polary of PWM wavform. + * So you can see if the hardware manage correctly this situation. + * + * Note: To be simple and target independently we not use a timer module, + * and so the delay is do with a for cycle. + * + * \version $Id$ + * \author Daniele Basile + */ + +#include "hw/pwm_map.h" // For PwmDev and channel avaible on thi target +#include "cfg/cfg_pwm.h" +#include +#include + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL PWM_LOG_LEVEL +#define LOG_FORMAT PWM_LOG_FORMAT +#include // for logging system + +#include +#include + +#include +#include CPU_HEADER(pwm) + +#define DELAY_TIME 10000 // This is a number of for cycle before to set a new value of duty +#define PWM_DUTY_INC 200 // Incremental value for duty + + +/** + * Simple struct to store + * the testing value. + */ +typedef struct PwmTest +{ + int ch; + bool pol; + pwm_freq_t freq; + pwm_duty_t duty; +} PwmTest; + +/* + * Test settings for each channel. + * + * Frequency value is in Hz. + * + * Esample of value for duty cycle" + * + * - 100% => 0xFFFFFFFF + * - 80% => 0xCCCCCCCC + * - 75% => 0xBFFFFFFF + * - 50% => 0x7FFFFFFF + * - 25% => 0x3FFFFFFF + * - 33% => 0x55555555 + * - 16% => 0x2AAAAAAA + */ +static PwmTest pwm_test_cfg[PWM_CNT] = +{ + /* Channel, polarity, frequecy, duty */ + { 0, false, 100UL, 0 }, /* 100Hz, 0% duty */ + { 1, false, 1000UL, 0x7FFF }, /* 1KHz, 50% duty */ + { 2, false, 12356UL, 0x5555 }, /* 12,356KHz, 33% duty */ + { 3, false, 100000UL, 0xCCCC } /* 100KHz, 80% duty */ +}; + +/** + * Setup all needed to test PWM on AT91 + * + */ +int pwm_testSetup(void) +{ + LOG_INFO("Init pwm.."); + pwm_init(); + LOG_INFO("done.\n"); + + return 0; +} + + +/** + * Test suit for genation of pwm waveform. + * + */ +void NORETURN pwm_testRun(void) +{ + pwm_duty_t duty = 0; + int delay = 0; + + pwm_testSetup(); + + LOG_INFO("\n\n===== BeRTOS PWM test =====\n\n"); + + for (int i = 0; i < PWM_CNT; i++) + { + LOG_INFO("PWM test ch[%d]\n", pwm_test_cfg[i].ch); + LOG_INFO("--> set pol[%d]", pwm_test_cfg[i].pol); + LOG_INFO("\n(Note: if polarity is false the output waveform start at high level,\n see low level implentation for detail)i\n"); + pwm_setPolarity(pwm_test_cfg[i].ch, pwm_test_cfg[i].pol); + LOG_INFO("..ok\n"); + + LOG_INFO("--> set freq[%ld]", pwm_test_cfg[i].freq); + pwm_setFrequency(pwm_test_cfg[i].ch, pwm_test_cfg[i].freq); + LOG_INFO("..ok\n"); + + LOG_INFO("--> set duty[%d]", pwm_test_cfg[i].duty); + pwm_setDuty(pwm_test_cfg[i].ch, pwm_test_cfg[i].duty); + LOG_INFO("..ok\n"); + + LOG_INFO("--> Enable pwm"); + pwm_enable(pwm_test_cfg[i].ch, true); + LOG_INFO("..ok\n"); + } + + LOG_INFO("\n-------------------------- Dinamic PWM test --------------------------\n"); + LOG_INFO("We test if driver change correctly the duty cycle durind it working.\n"); + LOG_INFO("On your oscilloscope you should see the pwm singal that increase until\n"); + LOG_INFO("the duty value is 100%%. After this value we invert a polarity of pwm,\n"); + LOG_INFO("and repeat the test. But now you should see that pwm duty decreasing until\n"); + LOG_INFO("0%% duty value.\nAfter that, we repeat the test from beginning.\n\n"); + + for (;;) + { + if (delay == DELAY_TIME) + { + for (int i = 0; i < PWM_CNT; i++) + { + LOG_INFO("PWM test ch[%d]\n", pwm_test_cfg[i].ch); + LOG_INFO("--> set duty[%d]", duty); + pwm_setDuty(pwm_test_cfg[i].ch, duty); + LOG_INFO("..ok\n"); + } + LOG_INFO("\n++++++++++++++++++++\n"); + duty += PWM_DUTY_INC; + delay = 0; + } + + //Reset duty cycle overflow + if (duty >= (pwm_duty_t)0xFFFF) + { + duty = 0; + for (int i = 0; i < PWM_CNT; i++) + { + LOG_INFO("Duty reset, swap polarity:\n"); + LOG_INFO("--> pol from [%d] to [%d]", pwm_test_cfg[i].pol, !pwm_test_cfg[i].pol); + + pwm_test_cfg[i].pol = !pwm_test_cfg[i].pol; + pwm_setPolarity(pwm_test_cfg[i].ch, pwm_test_cfg[i].pol); + + LOG_INFO("..ok\n"); + } + LOG_INFO("\n++++++++++++++++++++\n"); + } + delay++; + } +} + +/** + * End a PWM Test. + * (Unused) + */ +int pwm_testTearDown(void) +{ + /* */ + return 0; +} + +/* + * Empty main. + * + * Look it as exmple or use it if + * you want test a PWM driver stand alone. + */ +#if 0 +int main(void) +{ + IRQ_ENABLE; + kdbg_init(); + + pwm_testRun(); + + for(;;) + { + } + +} +#endif + + diff --git a/2.5/bertos/drv/sd.c b/2.5/bertos/drv/sd.c new file mode 100644 index 00000000..0c151563 --- /dev/null +++ b/2.5/bertos/drv/sd.c @@ -0,0 +1,498 @@ +/** + * \file + * + * + * \brief Function library for secure digital memory. + * + * \version $Id$ + * \author Francesco Sacchi + */ + + +#include "sd.h" +#include "hw/hw_sd.h" +#include +#include + +#include + +#include +#include + +#include /* memset */ + +/** + * Card Specific Data + * read directly from the card. + */ +typedef struct CardCSD +{ + uint16_t block_len; ///< Length of a block + uint32_t block_num; ///< Number of block on the card + uint16_t capacity; ///< Card capacity in MB +} CardCSD; + +#define SD_IN_IDLE 0x01 +#define SD_STARTTOKEN 0xFE + +#define TIMEOUT_NAC 256 + +#define SD_DEFAULT_BLOCKLEN 512 + +/** + * SPI communication channel. + */ +static KFile *fd; + +/** + * Current SD status. + */ +static bool sd_status; + +#define SD_BUSY_TIMEOUT ms_to_ticks(200) + +static bool sd_select(bool state) +{ + if (state) + { + ticks_t start = timer_clock(); + do + { + SD_CS_ON(); + if (kfile_getc(fd) == 0xff) + return true; + SD_CS_OFF(); + kfile_putc(0xff, fd); + kfile_flush(fd); + cpu_relax(); + } + while (timer_clock() - start < SD_BUSY_TIMEOUT); + + LOG_ERR("sd_select timeout\n"); + return false; + } + else + { + kfile_putc(0xff, fd); + kfile_flush(fd); + SD_CS_OFF(); + return true; + } +} + +static int16_t sd_waitR1(void) +{ + uint8_t datain; + + for (int i = 0; i < TIMEOUT_NAC; i++) + { + datain = kfile_getc(fd); + if (datain != 0xff) + return (int16_t)datain; + } + LOG_ERR("Timeout waiting R1\n"); + return EOF; +} + +static int16_t sd_sendCommand(uint8_t cmd, uint32_t param, uint8_t crc) +{ + /* The 7th bit of command must be a 1 */ + kfile_putc(cmd | 0x40, fd); + + /* send parameter */ + kfile_putc((param >> 24) & 0xFF, fd); + kfile_putc((param >> 16) & 0xFF, fd); + kfile_putc((param >> 8) & 0xFF, fd); + kfile_putc((param) & 0xFF, fd); + + kfile_putc(crc, fd); + + return sd_waitR1(); +} + + +static bool sd_getBlock(void *buf, size_t len) +{ + uint8_t token; + uint16_t crc; + + for (int i = 0; i < TIMEOUT_NAC; i++) + { + token = kfile_getc(fd); + if (token != 0xff) + { + if (token == SD_STARTTOKEN) + { + if (kfile_read(fd, buf, len) == len) + { + if (kfile_read(fd, &crc, sizeof(crc)) == sizeof(crc)) + /* check CRC here if needed */ + return true; + else + LOG_ERR("get_block error getting crc\n"); + } + else + LOG_ERR("get_block len error: %d\n", (int)len); + } + else + LOG_ERR("get_block token error: %02X\n", token); + + return false; + } + } + + LOG_ERR("get_block timeout waiting token\n"); + return false; +} + +#define SD_SELECT() \ +do \ +{ \ + if (!sd_select(true)) \ + { \ + LOG_ERR("%s failed, card busy\n", __func__); \ + return EOF; \ + } \ +} \ +while (0) + +#define SD_SETBLOCKLEN 0x50 + +static int16_t sd_setBlockLen(uint32_t newlen) +{ + SD_SELECT(); + + int16_t r1 = sd_sendCommand(SD_SETBLOCKLEN, newlen, 0); + + sd_select(false); + return r1; +} + +#define SD_SEND_CSD 0x49 + +static int16_t sd_getCSD(CardCSD *csd) +{ + SD_SELECT(); + + int16_t r1 = sd_sendCommand(SD_SEND_CSD, 0, 0); + + if (r1) + { + LOG_ERR("send_csd failed: %04X\n", r1); + sd_select(false); + return r1; + } + + uint8_t buf[16]; + bool res = sd_getBlock(buf, sizeof(buf)); + sd_select(false); + + if (res) + { + uint16_t mult = (1L << ((((buf[9] & 0x03) << 1) | ((buf[10] & 0x80) >> 7)) + 2)); + uint16_t c_size = (((uint16_t)(buf[6] & 0x03)) << 10) | (((uint16_t)buf[7]) << 2) | + (((uint16_t)(buf[8] & 0xC0)) >> 6); + + csd->block_len = (1L << (buf[5] & 0x0F)); + csd->block_num = (c_size + 1) * mult; + csd->capacity = (csd->block_len * csd->block_num) >> 20; // in MB + + LOG_INFO("block_len %d bytes, block_num %ld, total capacity %dMB\n", csd->block_len, csd->block_num, csd->capacity); + return 0; + } + else + return EOF; +} + + +#define SD_READ_SINGLEBLOCK 0x51 + +static int16_t sd_readBlock(void *buf, uint32_t addr) +{ + SD_SELECT(); + + int16_t r1 = sd_sendCommand(SD_READ_SINGLEBLOCK, addr, 0); + + if (r1) + { + LOG_ERR("read single block failed: %04X\n", r1); + sd_select(false); + return r1; + } + + bool res = sd_getBlock(buf, SD_DEFAULT_BLOCKLEN); + sd_select(false); + if (!res) + { + LOG_ERR("read single block failed reading data\n"); + return EOF; + } + else + return 0; +} + +#define SD_WRITE_SINGLEBLOCK 0x58 +#define SD_DATA_ACCEPTED 0x05 + +static int16_t sd_writeBlock(const void *buf, uint32_t addr) +{ + SD_SELECT(); + + int16_t r1 = sd_sendCommand(SD_WRITE_SINGLEBLOCK, addr, 0); + + if (r1) + { + LOG_ERR("write single block failed: %04X\n", r1); + sd_select(false); + return r1; + } + + kfile_putc(SD_STARTTOKEN, fd); + kfile_write(fd, buf, SD_DEFAULT_BLOCKLEN); + /* send fake crc */ + kfile_putc(0, fd); + kfile_putc(0, fd); + uint8_t dataresp = (kfile_getc(fd) & 0x1F); + sd_select(false); + + // FIXME: sometimes dataresp is 0, find out why. + if (dataresp != SD_DATA_ACCEPTED) + { + LOG_ERR("write single block failed: %02X\n", dataresp); + return EOF; + } + else + return 0; +} + + +bool sd_test(void) +{ + CardCSD csd; + sd_getCSD(&csd); + + uint8_t buf[SD_DEFAULT_BLOCKLEN]; + + if (sd_readBlock(buf, 0) != 0) + return false; + + kputchar('\n'); + for (int i = 0; i < SD_DEFAULT_BLOCKLEN; i++) + { + kprintf("%02X ", buf[i]); + buf[i] = i; + if (!((i+1) % 16)) + kputchar('\n'); + } + + if (sd_writeBlock(buf, 0) != 0) + return false; + + memset(buf, 0, sizeof(buf)); + if (sd_readBlock(buf, 0) != 0) + return false; + + kputchar('\n'); + for (int i = 0; i < SD_DEFAULT_BLOCKLEN; i++) + { + kprintf("%02X ", buf[i]); + buf[i] = i; + if (!((i+1) % 16)) + kputchar('\n'); + } + + return true; +} + +#define SD_GO_IDLE_STATE 0x40 +#define SD_GO_IDLE_STATE_CRC 0x95 +#define SD_SEND_OP_COND 0x41 +#define SD_SEND_OP_COND_CRC 0xF9 + +#define SD_START_DELAY ms_to_ticks(10) +#define SD_INIT_TIMEOUT ms_to_ticks(1000) +#define SD_IDLE_RETRIES 4 + +bool sd_init(KFile *_fd) +{ + uint16_t r1; + + ASSERT(_fd); + fd = _fd; + + SD_CS_INIT(); + SD_CS_OFF(); + + /* Wait a few moments for supply voltage to stabilize */ + timer_delay(SD_START_DELAY); + + /* Give 80 clk pulses to wake up the card */ + for (int i = 0; i < 10; i++) + kfile_putc(0xff, fd); + kfile_flush(fd); + + for (int i = 0; i < SD_IDLE_RETRIES; i++) + { + SD_SELECT(); + r1 = sd_sendCommand(SD_GO_IDLE_STATE, 0, SD_GO_IDLE_STATE_CRC); + sd_select(false); + + if (r1 == SD_IN_IDLE) + break; + } + + if (r1 != SD_IN_IDLE) + { + LOG_ERR("go_idle_state failed: %04X\n", r1); + return false; + } + + ticks_t start = timer_clock(); + + /* Wait for card to start */ + do + { + SD_SELECT(); + r1 = sd_sendCommand(SD_SEND_OP_COND, 0, SD_SEND_OP_COND_CRC); + sd_select(false); + cpu_relax(); + } + while (r1 != 0 && timer_clock() - start < SD_INIT_TIMEOUT); + + if (r1) + { + LOG_ERR("send_op_cond failed: %04X\n", r1); + return false; + } + + r1 = sd_setBlockLen(SD_DEFAULT_BLOCKLEN); + + if (r1) + { + LOG_ERR("setBlockLen failed: %04X\n", r1); + return false; + } + + sd_status = !r1; + return sd_status; +} + +DSTATUS sd_disk_initialize(BYTE drv) +{ + return sd_disk_status(drv); +} + +DSTATUS sd_disk_status(BYTE drv) +{ + ASSERT(!drv); + + if (sd_status) + return RES_OK; + else + return STA_NOINIT; +} + +DRESULT sd_disk_read(BYTE drv, BYTE* buf, DWORD sector, BYTE count) +{ + ASSERT(!drv); + + if (!sd_status) + return RES_NOTRDY; + + while (count--) + { + if (sd_readBlock(buf, sector * SD_DEFAULT_BLOCKLEN)) + return RES_ERROR; + buf += SD_DEFAULT_BLOCKLEN; + sector++; + } + return RES_OK; +} + +DRESULT sd_disk_write(BYTE drv, const BYTE* buf, DWORD sector, BYTE count) +{ + ASSERT(!drv); + + if (!sd_status) + return RES_NOTRDY; + + while (count--) + { + if (sd_writeBlock(buf, sector * SD_DEFAULT_BLOCKLEN)) + return RES_ERROR; + buf += SD_DEFAULT_BLOCKLEN; + sector++; + } + return RES_OK; +} + +DRESULT sd_disk_ioctl(BYTE drv, BYTE cmd, void* buf) +{ + ASSERT(!drv); + + if (!sd_status) + return RES_NOTRDY; + + switch (cmd) + { + case CTRL_SYNC: + return RES_OK; + + case GET_SECTOR_SIZE: + *(WORD *)buf = SD_DEFAULT_BLOCKLEN; + return RES_OK; + + case GET_SECTOR_COUNT: + { + CardCSD csd; + if (sd_getCSD(&csd)) + return RES_ERROR; + else + { + *(DWORD *)buf = csd.block_num; + return RES_OK; + } + + } + + case GET_BLOCK_SIZE: + *(DWORD *)buf = 1; + return RES_OK; + + default: + LOG_ERR("unknown command: [%d]\n", cmd); + return RES_PARERR; + } +} + +DWORD get_fattime(void) +{ + return 0; +} diff --git a/2.5/bertos/drv/sd.h b/2.5/bertos/drv/sd.h new file mode 100644 index 00000000..42c1d7df --- /dev/null +++ b/2.5/bertos/drv/sd.h @@ -0,0 +1,118 @@ +/** + * \file + * + * + * \brief Function library for secure digital memory. + * + * Right now, the interface for these function is the one defined in diskio.h from + * the FatFS module. + * + * \author Francesco Sacchi + * + * $WIZ$ module_name = "sd" + * $WIZ$ module_depends = "kfile", "timer" + * $WIZ$ module_hw = "bertos/hw/hw_sd.h" + */ + + +#ifndef DRV_SD_H +#define DRV_SD_H + +#include "cfg/cfg_fat.h" + +#include + +#include + +bool sd_test(void); + +/** + * Initializes the SD driver. + * + * \param _fd A pointer to a kfile where the SD will read/write to. + * \return true if initialization succeds, false otherwise. + */ +bool sd_init(KFile *_fd); + +#if CONFIG_FAT_DRIVES == 1 + + /** + * Same as sd_disk_status. + * + * Card initialization must be done with sd_init. + */ + #define sd_disk_initialize disk_initialize + + /** + * Return the status of the disk. + * + * \param drv The number of the drive to initialize. Currently only drive 0 is allowed. + * \return RES_OK if the sd card was correctly initialized by a previous call to sd_init(), STA_NOINIT otherwise. + */ + #define sd_disk_status disk_status + /** + * Read \a count sectors from SD card. + * + * \param drv The drive number to read from. Only 0 is supported. + * \param buf A buffer to store read data. You can get sector size using sd_disk_ioctl. + * \param sector Start sector number. + * \param count The number of sectors to read. + * \return RES_OK if the function succeded, RES_ERROR if any error occurred, RES_NOTRDY if the disk is not initialized. + * + * \sa diskio.h + */ + #define sd_disk_read disk_read + + #if CONFIG_FAT_FS_READONLY == 0 + + /** + * Write \a count sectors to SD card. + * + * \param drv The drive number to read from. Only 0 is supported. + * \param buf The data to be written. + * \param sector Start sector number. + * \param count The number of sectors to write. + * \return RES_OK if the function succeded, RES_ERROR if any error occurred, RES_NOTRDY if the disk is not initialized. + * + * \sa diskio.h + */ + #define sd_disk_write disk_write + #endif + + /** + * Interface to send device independant commands to the device. + * + * \sa diskio.h and related documentation for further explanations. + */ + #define sd_disk_ioctl disk_ioctl + +#endif /* CONFIG_FAT_DRIVES == 1 */ + +#endif /* DRV_SD_H */ diff --git a/2.5/bertos/drv/ser.c b/2.5/bertos/drv/ser.c new file mode 100644 index 00000000..4a2c923d --- /dev/null +++ b/2.5/bertos/drv/ser.c @@ -0,0 +1,504 @@ +/** + * \file + * + * + * \brief Buffered serial I/O driver + * + * The serial rx interrupt buffers incoming data in a software FIFO + * to decouple the higher level protocols from the line speed. + * Outgoing data is buffered as well for better performance. + * This driver is not optimized for best performance, but it + * has proved to be fast enough to handle transfer rates up to + * 38400bps on a 16MHz 80196. + * + * MODULE CONFIGURATION + * + * \li \c CONFIG_SER_HWHANDSHAKE - set to 1 to enable RTS/CTS handshake. + * Support is incomplete/untested. + * \li \c CONFIG_SER_TXTIMEOUT - Enable software serial transmission timeouts + * + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#include "ser.h" +#include "wdt.h" +#include "timer.h" +#include "ser_p.h" + +#include "cfg/cfg_ser.h" +#include "cfg/cfg_proc.h" +#include + +#include + +#include /* cpu_relax() */ + +#include /* memset() */ + +/* + * Sanity check for config parameters required by this module. + */ +#if !defined(CONFIG_KERN) || ((CONFIG_KERN != 0) && CONFIG_KERN != 1) + #error CONFIG_KERN must be set to either 0 or 1 in cfg_kern.h +#endif +#if !defined(CONFIG_SER_RXTIMEOUT) + #error CONFIG_SER_TXTIMEOUT missing in cfg_ser.h +#endif +#if !defined(CONFIG_SER_RXTIMEOUT) + #error CONFIG_SER_RXTIMEOUT missing in cfg_ser.h +#endif +#if !defined(CONFIG_SER_DEFBAUDRATE) + #error CONFIG_SER_DEFBAUDRATE missing in cfg_ser.h +#endif + + +struct Serial *ser_handles[SER_CNT]; + +/** + * Insert \a c in tx FIFO buffer. + * \note This function will switch out the calling process + * if the tx buffer is full. If the buffer is full + * and \a port->txtimeout is 0 return EOF immediatly. + * + * \return EOF on error or timeout, \a c otherwise. + */ +static int ser_putchar(int c, struct Serial *port) +{ + if (fifo_isfull_locked(&port->txfifo)) + { +#if CONFIG_SER_TXTIMEOUT != -1 + /* If timeout == 0 we don't want to wait */ + if (port->txtimeout == 0) + return EOF; + + ticks_t start_time = timer_clock(); +#endif + + /* Wait while buffer is full... */ + do + { + cpu_relax(); + +#if CONFIG_SER_TXTIMEOUT != -1 + if (timer_clock() - start_time >= port->txtimeout) + { + ATOMIC(port->status |= SERRF_TXTIMEOUT); + return EOF; + } +#endif /* CONFIG_SER_TXTIMEOUT */ + } + while (fifo_isfull_locked(&port->txfifo)); + } + + fifo_push_locked(&port->txfifo, (unsigned char)c); + + /* (re)trigger tx interrupt */ + port->hw->table->txStart(port->hw); + + /* Avoid returning signed extended char */ + return (int)((unsigned char)c); +} + + +/** + * Fetch a character from the rx FIFO buffer. + * \note This function will switch out the calling process + * if the rx buffer is empty. If the buffer is empty + * and \a port->rxtimeout is 0 return EOF immediatly. + * + * \return EOF on error or timeout, \a c otherwise. + */ +static int ser_getchar(struct Serial *port) +{ + if (fifo_isempty_locked(&port->rxfifo)) + { +#if CONFIG_SER_RXTIMEOUT != -1 + /* If timeout == 0 we don't want to wait for chars */ + if (port->rxtimeout == 0) + return EOF; + + ticks_t start_time = timer_clock(); +#endif + + /* Wait while buffer is empty */ + do + { + cpu_relax(); + +#if CONFIG_SER_RXTIMEOUT != -1 + if (timer_clock() - start_time >= port->rxtimeout) + { + ATOMIC(port->status |= SERRF_RXTIMEOUT); + return EOF; + } +#endif /* CONFIG_SER_RXTIMEOUT */ + } + while (fifo_isempty_locked(&port->rxfifo) && (ser_getstatus(port) & SERRF_RX) == 0); + } + + /* + * Get a byte from the FIFO (avoiding sign-extension), + * re-enable RTS, then return result. + */ + if (ser_getstatus(port) & SERRF_RX) + return EOF; + return (int)(unsigned char)fifo_pop_locked(&port->rxfifo); +} + +/** + * Fetch a character from the rx FIFO buffer. + * If the buffer is empty, ser_getchar_nowait() returns + * EOF immediatly. + * \note Deprecated, use ser_getchar with rx_timeout set to 0. + */ +int ser_getchar_nowait(struct Serial *fd) +{ + if (fifo_isempty_locked(&fd->rxfifo)) + return EOF; + + /* NOTE: the double cast prevents unwanted sign extension */ + return (int)(unsigned char)fifo_pop_locked(&fd->rxfifo); +} + + + +/** + * Read at most \a size bytes from \a port and put them in \a buf + * + * \return number of bytes actually read. + */ +static size_t ser_read(struct KFile *fd, void *_buf, size_t size) +{ + Serial *fds = SERIAL_CAST(fd); + + size_t i = 0; + char *buf = (char *)_buf; + int c; + + while (i < size) + { + if ((c = ser_getchar(fds)) == EOF) + break; + buf[i++] = c; + } + + return i; +} + +/** + * \brief Write a buffer to serial. + * + * \return 0 if OK, EOF in case of error. + * + * \todo Optimize with fifo_pushblock() + */ +static size_t ser_write(struct KFile *fd, const void *_buf, size_t size) +{ + Serial *fds = SERIAL_CAST(fd); + const char *buf = (const char *)_buf; + size_t i = 0; + + while (size--) + { + if (ser_putchar(*buf++, fds) == EOF) + break; + i++; + } + return i; +} + + +#if CONFIG_SER_RXTIMEOUT != -1 || CONFIG_SER_TXTIMEOUT != -1 +void ser_settimeouts(struct Serial *fd, mtime_t rxtimeout, mtime_t txtimeout) +{ + #if CONFIG_SER_RXTIMEOUT != -1 + fd->rxtimeout = ms_to_ticks(rxtimeout); + #else + (void)rxtimeout; + #endif + + #if CONFIG_SER_TXTIMEOUT != -1 + fd->txtimeout = ms_to_ticks(txtimeout); + #else + (void)txtimeout; + #endif +} +#endif /* CONFIG_SER_RXTIMEOUT || CONFIG_SER_TXTIMEOUT */ + + +/** + * Set the baudrate for the serial port + */ +void ser_setbaudrate(struct Serial *fd, unsigned long rate) +{ + fd->hw->table->setBaudrate(fd->hw, rate); +} + + +/** + * Set the parity for the \a fd serial port + */ +void ser_setparity(struct Serial *fd, int parity) +{ + fd->hw->table->setParity(fd->hw, parity); +} + +static int ser_error(struct KFile *fd) +{ + Serial *fds = SERIAL_CAST(fd); + return ser_getstatus(fds); +} + +static void ser_clearerr(struct KFile *fd) +{ + Serial *fds = SERIAL_CAST(fd); + ser_setstatus(fds, 0); +} + + + +/** + * Flush both the RX and TX buffers. + */ +void ser_purge(struct Serial *fd) +{ + ser_purgeRx(fd); + ser_purgeTx(fd); +} + +/** + * Flush RX buffer. + */ +void ser_purgeRx(struct Serial *fd) +{ + fifo_flush_locked(&fd->rxfifo); +} + +/** + * Flush TX buffer. + */ +void ser_purgeTx(struct Serial *fd) +{ + fifo_flush_locked(&fd->txfifo); +} + + +/** + * Wait until all pending output is completely + * transmitted to the other end. + * + * \note The current implementation only checks the + * software transmission queue. Any hardware + * FIFOs are ignored. + */ +static int ser_flush(struct KFile *fd) +{ + Serial *fds = SERIAL_CAST(fd); + + /* + * Wait until the FIFO becomes empty, and then until the byte currently in + * the hardware register gets shifted out. + */ + while (!fifo_isempty(&fds->txfifo) + || fds->hw->table->txSending(fds->hw)) + cpu_relax(); + return 0; +} + + +/** + * Initialize a serial port. + * + * \param fd KFile Serial struct interface. + * \param unit Serial unit to open. Possible values are architecture dependant. + */ +static struct Serial *ser_open(struct Serial *fd, unsigned int unit) +{ + ASSERT(unit < countof(ser_handles)); + + ser_handles[unit] = fd; + ASSERT(!fd->is_open); + DB(fd->is_open = true); + + fd->unit = unit; + + fd->hw = ser_hw_getdesc(unit); + + /* Initialize circular buffers */ + ASSERT(fd->hw->txbuffer); + ASSERT(fd->hw->rxbuffer); + fifo_init(&fd->txfifo, fd->hw->txbuffer, fd->hw->txbuffer_size); + fifo_init(&fd->rxfifo, fd->hw->rxbuffer, fd->hw->rxbuffer_size); + + fd->hw->table->init(fd->hw, fd); + + /* Set default values */ +#if CONFIG_SER_RXTIMEOUT != -1 || CONFIG_SER_TXTIMEOUT != -1 + ser_settimeouts(fd, CONFIG_SER_RXTIMEOUT, CONFIG_SER_TXTIMEOUT); +#endif +#if CONFIG_SER_DEFBAUDRATE + ser_setbaudrate(fd, CONFIG_SER_DEFBAUDRATE); +#endif + + /* Clear error flags */ + ser_setstatus(fd, 0); + + return fd; +} + + +/** + * Clean up serial port, disabling the associated hardware. + */ +static int ser_close(struct KFile *fd) +{ + Serial *fds = SERIAL_CAST(fd); + Serial *port = fds; + + ASSERT(port->is_open); + DB(port->is_open = false); + + // Wait until we finish sending everything + ser_flush(fd); + + port->hw->table->cleanup(port->hw); + DB(port->hw = NULL); + + /* + * We purge the FIFO buffer only after the low-level cleanup, so that + * we are sure that there are no more interrupts. + */ + ser_purge(fds); + return 0; +} + +/** + * Reopen serial port. + */ +static struct KFile *ser_reopen(struct KFile *fd) +{ + Serial *fds = SERIAL_CAST(fd); + + ser_close(fd); + ser_open(fds, fds->unit); + return (KFile *)fds; +} + +/** + * Init serial driver for \a unit. + * + * Use values SER_UARTn as values for \a unit. + */ +void ser_init(struct Serial *fds, unsigned int unit) +{ + memset(fds, 0, sizeof(*fds)); + + DB(fds->fd._type = KFT_SERIAL); + fds->fd.reopen = ser_reopen; + fds->fd.close = ser_close; + fds->fd.read = ser_read; + fds->fd.write = ser_write; + fds->fd.flush = ser_flush; + fds->fd.error = ser_error; + fds->fd.clearerr = ser_clearerr; + ser_open(fds, unit); +} + + +/** + * Read data from SPI bus. + * Since we are master, we have to trigger slave by sending + * fake chars on the bus. + */ +static size_t spimaster_read(struct KFile *fd, void *_buf, size_t size) +{ + Serial *fd_spi = SERIAL_CAST(fd); + + ser_flush(&fd_spi->fd); + ser_purgeRx(fd_spi); + + size_t total_rd = 0; + uint8_t *buf = (uint8_t *)_buf; + int c; + + while (size--) + { + /* + * Send and receive chars 1 by 1, otherwise the rxfifo + * will overrun. + */ + ser_putchar(0, fd_spi); + + if ((c = ser_getchar(fd_spi)) == EOF) + break; + + *buf++ = c; + total_rd++; + } + return total_rd; +} + +/** + * Write data to SPI bus. + */ +static size_t spimaster_write(struct KFile *fd, const void *buf, size_t size) +{ + Serial *fd_spi = SERIAL_CAST(fd); + + ser_purgeRx(fd_spi); + + return ser_write(&fd_spi->fd, buf, size); +} + + +/** + * Init SPI serial driver \a unit in master mode. + * + * Use SER_SPIn for \a unit parameter. + * + * This interface implements the SPI master protocol over a serial SPI + * driver. This is needed because normal serial driver send/receive data + * at the same time. SPI slaves like memories and other peripherals + * first receive and *then* send response back instead. + * To achieve this, when we are master and we are *sending*, + * we have to discard all incoming data. Then, when we want to + * receive, we must write fake data to SPI to trigger slave devices. + */ +void spimaster_init(Serial *fds, unsigned int unit) +{ + ser_init(fds, unit); + fds->fd.read = spimaster_read; + fds->fd.write = spimaster_write; +} + + diff --git a/2.5/bertos/drv/ser.h b/2.5/bertos/drv/ser.h new file mode 100644 index 00000000..226d9e0c --- /dev/null +++ b/2.5/bertos/drv/ser.h @@ -0,0 +1,218 @@ +/** + * \file + * + * + * \brief High level serial I/O API. + * + * \version $Id$ + * \author Bernie Innocenti + * + * $WIZ$ module_name = "ser" + * $WIZ$ module_depends = "kfile", "timer" + * $WIZ$ module_configuration = "bertos/cfg/cfg_ser.h" + * $WIZ$ module_hw = "bertos/hw/hw_ser.h" + * $WIZ$ module_supports = "not atmega103 and not atmega32 and not atmega8" + */ + +#ifndef DRV_SER_H +#define DRV_SER_H + +#include +#include +#include + +#if OS_HOSTED + #include /* BV() */ + + typedef uint16_t serstatus_t; + + /* Software errors */ + #define SERRF_RXFIFOOVERRUN BV(0) /**< Rx FIFO buffer overrun */ + #define SERRF_RXTIMEOUT BV(1) /**< Receive timeout */ + #define SERRF_TXTIMEOUT BV(2) /**< Transmit timeout */ + + /* Hardware errors */ + #define SERRF_RXSROVERRUN 0 /**< Rx shift register overrun, unsupported in emulated serial port. */ + #define SERRF_FRAMEERROR 0 /**< Stop bit missing, unsupported in emulated serial port. */ + #define SERRF_PARITYERROR 0 /**< Parity error, unsupported in emulated serial port. */ + #define SERRF_NOISEERROR 0 /**< Noise error, unsupported in emulated serial port. */ + + enum + { + SER_UART0, + SER_UART1, + + SER_CNT /**< Number of serial ports */ + }; + +#else + #include CPU_HEADER(ser) +#endif + +#include "cfg/cfg_ser.h" + + + +/** + * \name Masks to group TX/RX errors. + * \{ + */ +#define SERRF_RX \ + ( SERRF_RXFIFOOVERRUN \ + | SERRF_RXTIMEOUT \ + | SERRF_RXSROVERRUN \ + | SERRF_PARITYERROR \ + | SERRF_FRAMEERROR \ + | SERRF_NOISEERROR) /**< All possible rx errors */ +#define SERRF_TX (SERRF_TXTIMEOUT) /**< All possible tx errors */ +/*\}*/ + +/** + * \name LSB or MSB first data order for SPI driver. + * + * $WIZ$ ser_order_bit = "SER_MSB_FIRST", "SER_LSB_FIRST" + */ +#define SER_MSB_FIRST 0 +#define SER_LSB_FIRST 1 + +/** + * \name Parity settings for ser_setparity(). + * + * \note Values are AVR-specific for performance reasons. + * Other processors should either decode them or + * redefine these macros. + * \{ + */ +#define SER_PARITY_NONE 0 +#define SER_PARITY_EVEN 2 +#define SER_PARITY_ODD 3 +/*\}*/ + + +/** + * \def CONFIG_SER_STROBE + * + * This is a debug facility that can be used to + * monitor SER interrupt activity on an external pin. + * + * To use strobes, redefine the macros SER_STROBE_ON, + * SER_STROBE_OFF and SER_STROBE_INIT and set + * CONFIG_SER_STROBE to 1. + */ +#if !defined(CONFIG_SER_STROBE) || !CONFIG_SER_STROBE + #define SER_STROBE_ON do {/*nop*/} while(0) + #define SER_STROBE_OFF do {/*nop*/} while(0) + #define SER_STROBE_INIT do {/*nop*/} while(0) +#endif + +struct SerialHardware; + +/** Human-readable serial error descriptions */ +extern const char * const serial_errors[8]; + +/** Serial handle structure */ +typedef struct Serial +{ + /** Serial have a KFile struct implementation **/ + KFile fd; + + /** Physical port number */ + unsigned int unit; + +#ifdef _DEBUG + bool is_open; +#endif + + /** + * \name Transmit and receive FIFOs. + * + * Declared volatile because handled asinchronously by interrupts. + * + * \{ + */ + FIFOBuffer txfifo; + FIFOBuffer rxfifo; + /* \} */ + +#if CONFIG_SER_RXTIMEOUT != -1 + ticks_t rxtimeout; +#endif +#if CONFIG_SER_TXTIMEOUT != -1 + ticks_t txtimeout; +#endif + + /** Holds the flags defined above. Will be 0 when no errors have occurred. */ + volatile serstatus_t status; + + /** Low-level interface to hardware. */ + struct SerialHardware* hw; +} Serial; + + +/** + * ID for serial. + */ +#define KFT_SERIAL MAKE_ID('S', 'E', 'R', 'L') + + +INLINE Serial * SERIAL_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_SERIAL); + return (Serial *)fd; +} + +/* Function prototypes */ +//extern int ser_getchar_nowait(struct Serial *port); + +void ser_setbaudrate(struct Serial *fd, unsigned long rate); +void ser_setparity(struct Serial *fd, int parity); +void ser_settimeouts(struct Serial *fd, mtime_t rxtimeout, mtime_t txtimeout); +void ser_resync(struct Serial *fd, mtime_t delay); +int ser_getchar_nowait(struct Serial *fd); + +void ser_purgeRx(struct Serial *fd); +void ser_purgeTx(struct Serial *fd); +void ser_purge(struct Serial *fd); +void ser_init(struct Serial *fds, unsigned int unit); +void spimaster_init(Serial *fds, unsigned int unit); + + +/** + * \name Additional functions implemented as macros + * + * \{ + */ +#define ser_getstatus(serial) ((serial)->status) +#define ser_setstatus(serial, new_status) ((serial)->status = (new_status)) +/* \} */ + +#endif /* DRV_SER_H */ diff --git a/2.5/bertos/drv/ser_p.h b/2.5/bertos/drv/ser_p.h new file mode 100644 index 00000000..ff68f710 --- /dev/null +++ b/2.5/bertos/drv/ser_p.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Hardware dependent serial driver (interface) + * + * \version $Id$ + * + * \author Stefano Fedrigo + * \author Giovanni Bajo + */ + + +#ifndef DRV_SER_P_H +#define DRV_SER_P_H + +#include /* size_t */ + + + +struct SerialHardware; +struct Serial; + +struct SerialHardwareVT +{ + void (*init)(struct SerialHardware *ctx, struct Serial *ser); + void (*cleanup)(struct SerialHardware *ctx); + void (*setBaudrate)(struct SerialHardware *ctx, unsigned long rate); + void (*setParity)(struct SerialHardware *ctx, int parity); + void (*txStart)(struct SerialHardware *ctx); + bool (*txSending)(struct SerialHardware *ctx); +}; + +struct SerialHardware +{ + const struct SerialHardwareVT *table; + unsigned char *txbuffer; + unsigned char *rxbuffer; + size_t txbuffer_size; + size_t rxbuffer_size; +}; + +struct SerialHardware *ser_hw_getdesc(int unit); + + + +#endif /* DRV_SER_P_H */ diff --git a/2.5/bertos/drv/sipo.c b/2.5/bertos/drv/sipo.c new file mode 100644 index 00000000..2d3d64fd --- /dev/null +++ b/2.5/bertos/drv/sipo.c @@ -0,0 +1,122 @@ +/** + * \file + * + * + * + * \brief SIPO Module + * + * The SIPO module transforms a serial input in a parallel output. Please check hw_sipo.h + * file to customize hardware related parameters. + * + * \author Andrea Grandi + * \author Daniele Basile + */ + +#include "sipo.h" + +#include "hw/hw_sipo.h" + +#include +#include + +#include + +#include + + +#define SIPO_DATAORDER_START(order) (order ? SIPO_DATAORDER_START_LSB : SIPO_DATAORDER_START_MSB) +#define SIPO_DATAORDER_SHIFT(shift, order) (order ? ((shift) <<= 1) : ((shift) >>= 1)) + +/** + * Write a char in sipo shift register + */ +INLINE void sipo_putchar(uint8_t c, uint8_t bit_order, uint8_t clock_pol) +{ + uint8_t shift = SIPO_DATAORDER_START(bit_order); + + for(int i = 0; i < 8; i++) + { + if((c & shift) == 0) + SIPO_SI_LOW(); + else + SIPO_SI_HIGH(); + + SIPO_SI_CLOCK(clock_pol); + + SIPO_DATAORDER_SHIFT(shift, bit_order); + } +} + +/** + * Write a buffer into the sipo register and, when finished, give a load pulse. + */ +static size_t sipo_write(struct KFile *_fd, const void *_buf, size_t size) +{ + const uint8_t *buf = (const uint8_t *)_buf; + Sipo *fd = SIPO_CAST(_fd); + size_t write_len = size; + + ASSERT(buf); + + SIPO_SET_SI_LEVEL(); + SIPO_SET_CLK_LEVEL(fd->clock_pol); + SIPO_SET_LD_LEVEL(fd->load_device, fd->load_pol); + + // Load into the shift register all the buffer bytes + while(size--) + sipo_putchar(*buf++, fd->bit_order, fd->clock_pol); + + // We finsh to load bytes, so load it. + SIPO_LOAD(fd->load_device, fd->load_pol); + + return write_len; +} + +/** + * Initialize the SIPO + */ +void sipo_init(Sipo *fd) +{ + ASSERT(fd); + + memset(fd, 0, sizeof(Sipo)); + + //Set kfile struct type as a generic kfile structure. + DB(fd->fd._type = KFT_SIPO); + + // Set up SIPO writing functions. + fd->fd.write = sipo_write; + + SIPO_INIT_PIN(); + + /* Enable sipo output */ + SIPO_ENABLE(); +} diff --git a/2.5/bertos/drv/sipo.h b/2.5/bertos/drv/sipo.h new file mode 100644 index 00000000..940f8537 --- /dev/null +++ b/2.5/bertos/drv/sipo.h @@ -0,0 +1,119 @@ +/** + * \file + * + * + * \brief Generic Serial-in, Parallel-out implementation (SIPO). + * + * + * \version $Id$ + * + * \author Andrea Grandi + * \author Daniele Basile + * + * $WIZ$ module_name = "sipo" + * $WIZ$ module_depends = "kfile" + * $WIZ$ module_hw = "bertos/hw/hw_sipo.h" + */ + + + + + +#ifndef DRV_SIPO_H +#define DRV_SIPO_H + +#include "hw/hw_sipo.h" + +#include + +#define SIPO_DATAORDER_START_LSB 1 +#define SIPO_DATAORDER_START_MSB 0x80 + +/** + * Define enum to set sipo data order. + */ +typedef enum SipoBitOrder +{ + SIPO_DATAORDER_MSB = 0, + SIPO_DATAORDER_LSB = 1 +} SipoBitOrder; + +/** + * Define enum to set the start level of clock. + */ +typedef enum SipoClockPol +{ + SIPO_START_LOW = 0, + SIPO_START_HIGH = 1 + +} SipoClkPol; + +/** + * Define enum to set load signal level. + */ +typedef enum SipoLoadPol +{ + SIPO_LOW_TO_HIGH = 0, + SIPO_HIGH_TO_LOW = 1 + +} SipoLoadPol; + +/** + * Sipo KFile context structure. + */ +typedef struct Sipo +{ + KFile fd; ///< File descriptor. + SipoMap load_device; ///< Descriptor of the device that we want drive. + SipoLoadPol load_pol; ///< Set polarity of load signal. + SipoClkPol clock_pol; ///< Set polarity of data clock. + SipoBitOrder bit_order; ///< Set the order of pushed bits in sipo. + +} Sipo; + +/** + * ID for sipo. + */ +#define KFT_SIPO MAKE_ID('S', 'I', 'P', 'O') + +/** + * Convert + ASSERT from generic KFile to Sipo. + */ +INLINE Sipo * SIPO_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_SIPO); + return (Sipo *)fd; +} + +void sipo_init(Sipo *fd); + +#endif // DRV_SIPO_H + diff --git a/2.5/bertos/drv/spi_bitbang.c b/2.5/bertos/drv/spi_bitbang.c new file mode 100644 index 00000000..30209a37 --- /dev/null +++ b/2.5/bertos/drv/spi_bitbang.c @@ -0,0 +1,121 @@ +/** + * \file + * + * + * \brief Emulated SPI Master for DSP firmware download (impl.) + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Daniele Basile + */ + + +#include "spi_bitbang.h" +#include "hw/hw_spi.h" + +#include "cfg/cfg_spi_bitbang.h" +#include + +#include + +void spi_assertSS(void) +{ + ATOMIC(SS_ACTIVE()); +} + +void spi_deassertSS(void) +{ + ATOMIC(SS_INACTIVE()); +} + +/** + * Send byte \c c over MOSI line, CONFIG_SPI_DATAORDER first. + * SS pin state is left unchanged. + */ +uint8_t spi_sendRecv(uint8_t c) +{ + uint8_t data = 0; + uint8_t shift = SPI_DATAORDER_START; + + + ATOMIC( + for (int i = 0; i < 8; i++) + { + /* Shift the i-th bit to MOSI */ + if (c & shift) + MOSI_HIGH(); + else + MOSI_LOW(); + /* Assert clock */ + SCK_ACTIVE(); + data |= IS_MISO_HIGH() ? shift : 0; + /* De-assert clock */ + SCK_INACTIVE(); + SPI_DATAORDER_SHIFT(shift); + } + ); + return data; +} + +MOD_DEFINE(spi); +void spi_init(void) +{ + ATOMIC(SPI_HW_INIT()); + MOD_INIT(spi); +} + +/** + * Read \param len from spi, and put it in \param _buff . + */ +void spi_read(void *_buff, size_t len) +{ + uint8_t *buff = (uint8_t *)_buff; + + while (len--) + /* Read byte from spi and put it in buffer. */ + *buff++ = spi_sendRecv(0); + +} + +/** + * Write \param len to spi, and take it from \param _buff . + */ +void spi_write(const void *_buff, size_t len) +{ + const uint8_t *buff = (const uint8_t *)_buff; + + while (len--) + /* Write byte pointed at by *buff to spi */ + spi_sendRecv(*buff++); + +} diff --git a/2.5/bertos/drv/spi_bitbang.h b/2.5/bertos/drv/spi_bitbang.h new file mode 100644 index 00000000..392c790d --- /dev/null +++ b/2.5/bertos/drv/spi_bitbang.h @@ -0,0 +1,77 @@ +/** + * \file + * + * + * \brief Emulated SPI driver. + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Daniele Basile + * + * $WIZ$ module_name = "spi_bitbang" + * $WIZ$ module_configuration = "bertos/cfg/cfg_spi_bitbang.h" + * $WIZ$ module_hw = "bertos/hw/hw_spi.h" + */ + + +#ifndef DRV_SPI_BITBANG_H +#define DRV_SPI_BITBANG_H + +#include "cfg/cfg_spi_bitbang.h" + +#include + +/** + * Define send and receive order bit. + * + * $WIZ$ ordet_bit_list = "SPI_LSB_FIRST", "SPI_MSB_FIRST" + */ +#define SPI_LSB_FIRST 1 +#define SPI_MSB_FIRST 2 + +#if CONFIG_SPI_DATAORDER == SPI_LSB_FIRST + #define SPI_DATAORDER_START 1 + #define SPI_DATAORDER_SHIFT(i) ((i) <<= 1) +#elif CONFIG_SPI_DATAORDER == SPI_MSB_FIRST + #define SPI_DATAORDER_START 0x80 + #define SPI_DATAORDER_SHIFT(i) ((i) >>= 1) +#endif + +void spi_write(const void *buf, size_t len); +void spi_read(void *buf, size_t len); +uint8_t spi_sendRecv(uint8_t c); +void spi_init(void); +void spi_assertSS(void); +void spi_deassertSS(void); + +#endif /* DRV_SPI_BITBANG_H */ diff --git a/2.5/bertos/drv/stepper.c b/2.5/bertos/drv/stepper.c new file mode 100644 index 00000000..7586cf87 --- /dev/null +++ b/2.5/bertos/drv/stepper.c @@ -0,0 +1,979 @@ +/** + * \file + * + * + * \brief Driver to control stepper motor + * + * \version $Id$ + * \author Francesco Michelini + * \author Giovanni Bajo + * \author Bernie Innocenti + * \author Simone Zinanni + * \author Daniele Basile + */ + +#include "stepper.h" + +#include "hw/hw_stepper.h" +#include "hw/hw_sensor.h" + +#include "cfg/cfg_stepper.h" +#include + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL STEPPER_LOG_LEVEL +#define LOG_FORMAT STEPPER_LOG_FORMAT +#include + +#include + +#include + +#include CPU_HEADER(stepper) + +#include // memset + +/** + * \name Motor timings + * \{ + */ +#define MOTOR_SWITCH_TICKS 60000 ///< Timer ticks to wait for 10ms +#define MOTOR_SWITCH_COUNT 5 ///< Number of intervals, long 10ms, to wait before/after switching current off/on +#define MOTOR_HOME_MAX_STEPS 30000 ///< Steps before giving up when trying to reach home +#define MOTOR_CURRENT_TICKS 6000 ///< Number of intervals, long 10ms, to mantain high current +// \} + +///< Stepper motors +static struct Stepper all_motors[CONFIG_NUM_STEPPER_MOTORS]; + +///< General FSM states (or NULL if state is not handled) +static fsm_state general_states[STEPPER_MAX_STATES]; + +// IRQ functions for stepper motors +static void stepper_interrupt(struct Stepper *motor); + +static void stepper_accel(struct Stepper *motor); +static void stepper_decel(struct Stepper *motor); + +static bool stepper_isState(struct Stepper *motor, enum StepperState state); +INLINE void stepper_changeState(struct Stepper *motor, enum StepperState newState); + +static void stepper_enableCheckHome(struct Stepper *motor, bool bDirPositive); + +#define MOTOR_INDEX(motor) (motor->index) + +//------------------------------------------------------------------------ + +INLINE bool setLowCurrent(struct Stepper* motor) +{ + if (motor->power == motor->cfg->powerIdle) + return false; + + motor->power = motor->cfg->powerIdle; + STEPPER_SET_POWER_CURRENT(MOTOR_INDEX(motor), motor->cfg->powerIdle); + + return true; +} + +INLINE bool setHighCurrent(struct Stepper* motor) +{ + if (motor->power == motor->cfg->powerRun) + return false; + + motor->power = motor->cfg->powerRun; + STEPPER_SET_POWER_CURRENT(MOTOR_INDEX(motor), motor->cfg->powerRun); + return true; +} + +INLINE void setCheckSensor(struct Stepper* motor, enum MotorHomeSensorCheck value) +{ + motor->enableCheckHome = value; +} + +INLINE int8_t getCheckSensor(struct Stepper* motor) +{ + return motor->enableCheckHome; +} + +INLINE void setDirection(struct Stepper* motor, enum MotorDirection dir) +{ + ASSERT(dir == DIR_POSITIVE || dir == DIR_NEGATIVE); + motor->dir = dir; + + if (!motor->cfg->flags.axisInverted) + { + STEPPER_SET_DIRECTION(MOTOR_INDEX(motor), (dir == DIR_POSITIVE)); + } + else + { + STEPPER_SET_DIRECTION(MOTOR_INDEX(motor), (dir != DIR_POSITIVE)); + } +} + +/** + * Schedule a new stepper IRQ to happen after \a delay (number of clocks), + * and optionally doing a step at the same time (if \a do_step is true). + */ +INLINE void FAST_FUNC stepper_schedule_irq(struct Stepper* motor, stepper_time_t delay, bool do_step) +{ + + if (do_step) + { + // Record the step we just did + motor->step += motor->dir; + stepper_tc_doPulse(motor->timer); + } + else + stepper_tc_skipPulse(motor->timer); + + stepper_tc_setDelay(motor->timer, delay); +} + + +static void stepper_accel(struct Stepper *motor) +{ + DB(uint16_t old_val = motor->rampValue;) + DB(uint32_t old_clock = motor->rampClock;) + + const struct Ramp *ramp = &motor->cfg->ramp; + + ASSERT(motor->rampClock != 0); + + motor->rampValue = ramp_evaluate(ramp, motor->rampClock); + motor->rampClock += motor->rampValue; + motor->rampStep++; + + DB(if (old_val && motor->rampValue > old_val) + { + LOG_ERR("Runtime ramp error: (max=%x, min=%x)\n", ramp->clocksMaxWL, ramp->clocksMinWL); + LOG_ERR(" %04x @ %lu --> %04x @ %lu\n", old_val, old_clock, motor->rampValue, motor->rampClock); + }) + +} + +static void stepper_decel(struct Stepper *motor) +{ + const struct Ramp *ramp = &motor->cfg->ramp; + DB(uint16_t old_val = motor->rampValue;) + + motor->rampClock -= motor->rampValue; + ASSERT(motor->rampClock != 0); + motor->rampValue = ramp_evaluate(ramp, motor->rampClock); + motor->rampStep--; + DB(ASSERT(!old_val || motor->rampValue >= old_val);); +} + +INLINE void stepper_enable_irq(struct Stepper* motor) +{ + stepper_tc_irq_enable(motor->timer); +} + +INLINE void stepper_disable_irq(struct Stepper* motor) +{ + stepper_tc_irq_disable(motor->timer); +} + +// the home sensor can be in the standard home list or in the digital +// sensor list +bool stepper_readHome(struct Stepper* motor) +{ + return (motor->cfg->homeSensorIndex < NUM_HOME_SENSORS) ? + hw_home_sensor_read(motor->cfg->homeSensorIndex) : + bld_hw_sensor_read(motor->cfg->homeSensorIndex - NUM_HOME_SENSORS); +} + +bool stepper_readLevel(struct Stepper* motor) +{ + return hw_level_sensor_read(motor->cfg->levelSensorIndex); +} + +/************************************************************************/ +/* Finite-state machine to drive stepper logic from IRQ */ +/************************************************************************/ + +INLINE void stepper_changeState(struct Stepper* motor, enum StepperState newState) +{ + ASSERT(newState < STEPPER_MAX_STATES); + + motor->state = motor->cfg->states[newState]; + if (!motor->state) + motor->state = general_states[newState]; + ASSERT(motor->state); +} + +static bool stepper_isState(struct Stepper* motor, enum StepperState state) +{ + return (motor->cfg->states[state] + ? motor->cfg->states[state] == motor->state + : general_states[state] == motor->state); +} + +static bool stepper_checkHomeErrors(struct Stepper* motor) +{ + bool home; + + home = stepper_readHome(motor); + + if (motor->enableCheckHome == MOTOR_HOMESENSOR_INCHECK && home + && (!motor->stepCircular || motor->step < motor->stepCircular / 2)) + /* + * if home Sensor check enabled in movement to 0 position and + * the motor is in home increase the counter + * for rotating motor we include the check that the motor is + * inside the last "lap" (FIXME: check it better) + */ + motor->stepsErrorHome++; + else if (motor->enableCheckHome == MOTOR_HOMESENSOR_OUTCHECK && !home) + /* + * if home Sensor check enabled in movement from 0 position and + * the motor is not in home increase the counter + */ + motor->stepsErrorHome++; + else + // clear error steps counter + motor->stepsErrorHome = 0; + + // if this is the last consecutive position in which the motor is in/out home ... + ASSERT(motor->stepsErrorHome <= MOTOR_CONSECUTIVE_ERROR_STEPS); + if (motor->stepsErrorHome >= MOTOR_CONSECUTIVE_ERROR_STEPS) + { + // if the position at which the motor first saw/didn't see the home + // is out of tolerance -> breakmotor -> ERROR + if (motor->step > motor->stepsTollMax || motor->step < motor->stepsTollMin ) + { + // break motor and error + motor->speed = SPEED_STOPPED; + motor->stepToReach = motor->step; + + stepper_schedule_irq(motor, MOTOR_SWITCH_TICKS, false); + motor->skipIrqs = MOTOR_SWITCH_COUNT; + return false; + } + + // the motor reached the home crossing -> disable error check + setCheckSensor(motor, MOTOR_HOMESENSOR_NOCHECK); + } + + return true; +} + +static void stepper_checkLevelSensor(struct Stepper* motor) +{ + // level sensor check + if (motor->step > motor->stepsDeaf) + { + if (stepper_readLevel(motor)) + { + // record current position, disable check and stop motor + motor->stepsDeaf = DEAFSTEPS_DEFAULT; + motor->stepsLevel = motor->step; + //motor->stepToReach = motor->step + motor->rampStep * motor->dir; + + motor->stepToReach = motor->step; + motor->rampClock = motor->cfg->ramp.clocksMaxWL; + motor->rampValue = motor->cfg->ramp.clocksMaxWL; + } + } +} + +static enum StepperState FAST_FUNC FSM_run(struct Stepper *motor) +{ + uint16_t distance; + + if (!stepper_checkHomeErrors(motor)) + return MSTS_ERROR; + + stepper_checkLevelSensor(motor); + + if ((motor->stepToReach != STEPS_INFINITE_POSITIVE) && + (motor->stepToReach != STEPS_INFINITE_NEGATIVE )) + { + // Calculate (always positive) distance between current position and destination step + distance = (uint16_t)((motor->stepToReach - motor->step) * motor->dir); + } + else + { + // We're at a very long distance ;-) + distance = 0xFFFF; + // if the motor is rotating and it has just ran a complete round + // the position is set to 0 + if(motor->step == motor->stepCircular) + motor->step = 0; + } + + if (distance == 0) + // Position reached - stop motor + //motor->speed = SPEED_STOPPED; + motor->rampStep = -1; + //motor->rampClock = motor->ramp->clocksMaxWL; + //motor->rampValue = 0; + //motor->rampClock = motor->rampValue = motor->ramp->clocksMaxWL; + + else if (distance <= (uint16_t)motor->rampStep) + stepper_decel(motor); + + // check whether the velocity must be changed + else if (motor->speed < (uint16_t)motor->rampValue) + { + stepper_accel(motor); + if (motor->speed > (uint16_t)motor->rampValue) + motor->speed = (uint16_t)motor->rampValue; + } + else if (motor->speed > (uint16_t)motor->rampValue) + stepper_decel(motor); + + // If rampStep == -1, leave output pin high and wait for low current + if (motor->rampStep < 0) + { + // Wait before switching to low current + motor->speed = SPEED_STOPPED; + + stepper_schedule_irq(motor, MOTOR_SWITCH_TICKS, false); + motor->skipIrqs = MOTOR_SWITCH_COUNT; + + /* + * If there was a home sensor check activated, and the check has not + * been done yet, it means that we reached the end position without + * finding the home (or exiting from it). This is bad! + */ + if (motor->enableCheckHome != MOTOR_HOMESENSOR_NOCHECK) + return MSTS_ERROR; + + // check if the motor has to stay in high current + if(motor->cfg->flags.highcurrentBit) + { + motor->changeCurrentIrqs = MOTOR_CURRENT_TICKS; + return MSTS_IDLE; + } + + return MSTS_PREIDLE; + } + + // Wait for high->low transition + ASSERT(motor->rampValue > motor->cfg->pulse); + stepper_schedule_irq(motor, motor->rampValue, true); + + return MSTS_RUN; +} + +static enum StepperState FSM_idle(struct Stepper* motor) +{ + stepper_schedule_irq(motor, MOTOR_SWITCH_TICKS, false); + + if (motor->speed == SPEED_STOPPED) + { + // check if it's time to switch to low current + if(motor->changeCurrentIrqs > 0) + { + if(--motor->changeCurrentIrqs == 0) + setLowCurrent(motor); + } + return MSTS_IDLE; + } + + // Switch to high current and wait for stabilization + // (if the motor is in low current) + if(motor->changeCurrentIrqs == 0) + { + setHighCurrent(motor); + motor->skipIrqs = MOTOR_SWITCH_COUNT; + } + + return MSTS_PRERUN; +} + +static enum StepperState FSM_preidle(struct Stepper* motor) +{ + // Normal operation mode + motor->changeCurrentIrqs = 0; + setLowCurrent(motor); + stepper_schedule_irq(motor, MOTOR_SWITCH_TICKS, false); + return MSTS_IDLE; +} + +static enum StepperState FSM_error(struct Stepper* motor) +{ + // Error condition mode + setLowCurrent(motor); + stepper_schedule_irq(motor, MOTOR_SWITCH_TICKS, false); + return MSTS_ERROR; +} + +static enum StepperState FSM_prerun(struct Stepper* motor) +{ + enum MotorDirection dir; + + // distance != 0? + if ((motor->stepToReach != motor->step) || + (motor->stepToReach == STEPS_INFINITE_POSITIVE) || + (motor->stepToReach == STEPS_INFINITE_NEGATIVE) ) + { + // Setup for first step + motor->rampStep = 0; + + // Setup Direction + if(motor->stepToReach == STEPS_INFINITE_POSITIVE) + dir = DIR_POSITIVE; + else if(motor->stepToReach == STEPS_INFINITE_NEGATIVE) + dir = DIR_NEGATIVE; + else if(motor->stepToReach > motor->step) + dir = DIR_POSITIVE; + else + dir = DIR_NEGATIVE; + + setDirection(motor, dir); + + // Enable of the home sensor control, if necessary + // (before calling this function set the motor direction as above) + stepper_enableCheckHome(motor, (dir == DIR_POSITIVE)); + + // if the movement is infinite negative set the sw direction positive + // (not the hw: see below) to count the steps + if(motor->stepToReach == STEPS_INFINITE_NEGATIVE) motor->dir = DIR_POSITIVE; + + stepper_schedule_irq(motor, MOTOR_SWITCH_TICKS, false); + return MSTS_RUN; + } + else + { + /* + * If we are here we should do at least one step. + * anyway .... + */ + stepper_schedule_irq(motor, MOTOR_SWITCH_TICKS, false); + motor->skipIrqs = MOTOR_SWITCH_COUNT; + return MSTS_PREIDLE; + } +} + +static enum StepperState FSM_preinit(struct Stepper* motor) +{ + // Set current high, and wait for stabilization + if (setHighCurrent(motor)) + { + motor->skipIrqs = MOTOR_SWITCH_COUNT; + return MSTS_PREINIT; + } + + /* + * This state is used when initializing the motor, to bring back + * to the home. The idea is that we do not know where the motor + * is at this point, so there can be two possibilities: + * + * - The motor is already in home. We do not know how much into the + * home we are. So we need to get out of the home (MSTS_LEAVING) + * and then get back into it of the desired number of steps. + * + * - The motor is not in home: we need to look for it (MSTS_INIT). + * We can safely assume that we will find the home in the negative + * direction. For circular motors, any direction would do. For + * other motors, the home is set at zero, so the current position + * has to be a positive value. + * + */ + if (stepper_readHome(motor)) + { + setDirection(motor, DIR_POSITIVE); + stepper_schedule_irq(motor, MOTOR_SWITCH_TICKS, false); + return MSTS_LEAVING; + } + + setDirection(motor, DIR_NEGATIVE); + stepper_schedule_irq(motor, MOTOR_SWITCH_TICKS, false); + return MSTS_INIT; +} + + +static enum StepperState FSM_init(struct Stepper* motor) +{ + // If we are not in home, keep looking + if (!stepper_readHome(motor)) + { + stepper_schedule_irq(motor, motor->cfg->clocksHome, true); + return MSTS_INIT; + } + + /* + * Home! We still need to enter the home of the specified number of steps. + * That will be our absolute zero. + */ + + motor->step = motor->cfg->stepsInHome - 1; // start counting down steps in home + motor->stepToReach = 0; + + stepper_schedule_irq(motor, motor->cfg->clocksHome, true); + return MSTS_ENTERING; +} + +static enum StepperState FSM_entering(struct Stepper* motor) +{ + // We must be in home + //ASSERT(stepper_readHome(motor)); + + // if while entering the sensor we are no more in home we reset the steps + // counter (optical sensor) + if(!stepper_readHome(motor)) + motor->step = motor->cfg->stepsInHome - 1; + + // Current Position must be non-negative + ASSERT(motor->step >= 0); + + if(motor->step == 0) + { + // reach the final target inside home sensor + motor->step = 0; + return MSTS_PREIDLE; + } + + // keep doing steps + stepper_schedule_irq(motor, motor->cfg->clocksHome, true); + return MSTS_ENTERING; +} + +static enum StepperState FSM_leaving(struct Stepper* motor) +{ + ASSERT(motor->dir == DIR_POSITIVE); + + motor->step = 0; + if (!stepper_readHome(motor)) + { + // we are out of home : change state and going far from sensor + stepper_schedule_irq(motor, motor->cfg->clocksHome, true); + return MSTS_OUTHOME; + } + else + { + // Still at home. Just wait here and keep doing steps + stepper_schedule_irq(motor, motor->cfg->clocksHome, true); + return MSTS_LEAVING; + } +} + +static enum StepperState FSM_outhome(struct Stepper* motor) +{ + ASSERT(motor->dir == DIR_POSITIVE); + + // We must be out of home: once we are no more in home + // we just need to move away, even if not very precide (optical sensor) + // ASSERT(!stepper_readHome(motor)); + + if(motor->step >= motor->cfg->stepsOutHome) + { + // reach the final target outside home sensor + motor->step = 0; + + // start home entering procedure (delay in executing step) + setDirection(motor, DIR_NEGATIVE); + stepper_schedule_irq(motor, MOTOR_SWITCH_TICKS, false); + motor->skipIrqs = MOTOR_SWITCH_COUNT; + return MSTS_INIT; + } + + // keep doing steps + stepper_schedule_irq(motor, motor->cfg->clocksHome, true); + return MSTS_OUTHOME; +} + +static void FAST_FUNC stepper_interrupt(struct Stepper *motor) +{ + enum StepperState newState; + + // Check if we need to skip a certain number of IRQs + if (motor->skipIrqs) + { + --motor->skipIrqs; + stepper_schedule_irq(motor, MOTOR_SWITCH_TICKS, false); + return; + } + + ASSERT(motor->state); + newState = motor->state(motor); + stepper_changeState(motor, newState); +} + + + + +/************************************************************************/ +/* Public API */ +/************************************************************************/ + +/** + * Initialize the stepper module + */ +void stepper_init(void) +{ + STEPPER_INIT(); + + // before starting the power all the stepper enable must be surely low + stepper_disable(); + + // Bind functions to general states + memset(general_states, 0, sizeof(general_states)); + general_states[MSTS_IDLE] = FSM_idle; + general_states[MSTS_PREIDLE] = FSM_preidle; + general_states[MSTS_PRERUN] = FSM_prerun; + general_states[MSTS_RUN] = FSM_run; + general_states[MSTS_PREINIT] = FSM_preinit; + general_states[MSTS_INIT] = FSM_init; + general_states[MSTS_ENTERING] = FSM_entering; + general_states[MSTS_LEAVING]= FSM_leaving; + general_states[MSTS_OUTHOME]= FSM_outhome; + general_states[MSTS_ERROR]= FSM_error; +} + +void stepper_end(void) +{ + // Disable all stepper timer interrupt to stop motors + for (int i = 0; i < CONFIG_NUM_STEPPER_MOTORS; i++) + stepper_disable_irq(&all_motors[i]); +} + +/** + * Apply a setup config to motor structure context + */ +struct Stepper* stepper_setup(int index, struct StepperConfig *cfg) +{ + struct Stepper* motor; + + ASSERT(index < CONFIG_NUM_STEPPER_MOTORS); + + motor = &all_motors[index]; + motor->index = index; + motor->cfg = cfg; + + //Register timer to stepper, and enable irq + stepper_tc_setup(motor->index, &stepper_interrupt, motor); + + stepper_reset(motor); + + stepper_enable_irq(motor); + + return motor; +} + +/** + * Set the enable for all the motors to 0 before switching on the power + */ +void stepper_disable(void) +{ + STEPPER_DISABLE_ALL(); +} + +/** + * Reset the motor + */ +void stepper_reset(struct Stepper *motor) +{ + /* + * To stop motor diable stepper irq. + */ + stepper_disable_irq(motor); + + //Disable a stepper motor + STEPPER_DISABLE(MOTOR_INDEX(motor)); + + // Setup context variables + motor->power = 0; + motor->step = 0; + motor->rampStep = -1; + // We cannot set the clock at zero at start because of a limit in the fixed point ramp + motor->rampClock = motor->cfg->ramp.clocksMaxWL; + motor->rampValue = motor->cfg->ramp.clocksMaxWL; + motor->speed = SPEED_STOPPED; + motor->stepToReach = 0; + motor->skipIrqs = 0; + motor->stepCircular = 0; + setDirection(motor, DIR_POSITIVE); + setLowCurrent(motor); + + motor->changeCurrentIrqs = 0; + + // default value (disable level sensor check) + motor->stepsDeaf = DEAFSTEPS_DEFAULT; + + STEPPER_SET_HALF_STEP(MOTOR_INDEX(motor), motor->cfg->flags.halfStep); + STEPPER_SET_CONTROL_BIT(MOTOR_INDEX(motor), motor->cfg->flags.controlBit); + + if (motor->cfg->homeSensorIndex < NUM_HOME_SENSORS) + hw_home_sensor_set_inverted(motor->cfg->homeSensorIndex, motor->cfg->flags.homeInverted); + + if (motor->cfg->levelSensorIndex != MOTOR_NO_LEVEL_SENSOR) + hw_level_sensor_set_inverted(motor->cfg->levelSensorIndex, motor->cfg->flags.levelInverted); + + stepper_changeState(motor, MSTS_IDLE); + + // Reset stepper timer counter + stepper_tc_resetTimer(motor->timer); + + // reset hw to the stepper motor + STEPPER_RESET(MOTOR_INDEX(motor)); + STEPPER_ENABLE(MOTOR_INDEX(motor)); +} + + +void stepper_updateHalfStep(struct Stepper *motor) +{ + STEPPER_SET_HALF_STEP(MOTOR_INDEX(motor), motor->cfg->flags.halfStep); +} + +void stepper_updateControlBit(struct Stepper *motor) +{ + STEPPER_SET_CONTROL_BIT(MOTOR_INDEX(motor), motor->cfg->flags.controlBit); +} + +void stepper_updateControlMoveBit(struct Stepper *motor) +{ + STEPPER_SET_CONTROL_BIT(MOTOR_INDEX(motor), motor->cfg->flags.controlMoveBit); +} + +/** + * Find the home of a \a motor assuming no current knowledge about its position. + * + * This must be done when the motor is desynchronized with the firmware and + * we do not know anymore where it is. + * + * In normal operation mode, to go back to the home, it is sufficient to use + * move to step #0 with stepper_move, since the home is always at step #0. + */ +void stepper_home(struct Stepper *motor) +{ + + // Begin home procedure + stepper_disable_irq(motor); + + // disable home sensor check (default) + setCheckSensor(motor, MOTOR_HOMESENSOR_NOCHECK); + // deafult value (disable level sensor check) + motor->stepsDeaf = DEAFSTEPS_DEFAULT; + + setDirection(motor, DIR_POSITIVE); + stepper_schedule_irq(motor, MOTOR_SWITCH_TICKS, false); + stepper_changeState(motor, MSTS_PREINIT); + + stepper_enable_irq(motor); +} + + +void stepper_setStep(struct Stepper *motor, int16_t step) +{ + motor->step = step; +} + + +int16_t stepper_getStep(struct Stepper *motor) +{ + return motor->step; +} + +int16_t stepper_getLevelStep(struct Stepper *motor) +{ + return motor->stepsLevel; +} + +void stepper_set_stepCircular(struct Stepper *motor, int16_t steps) +{ + motor->stepCircular = steps; +} + +int16_t stepper_get_stepCircular(struct Stepper *motor) +{ + return motor->stepCircular; +} + +int16_t stepper_scaleSteps(struct Stepper *motor, int16_t dir) +{ + int16_t steps; + + // scale the current position inside the motor lap + if(!motor->stepCircular) return 0; + + // to be sure .... + while(motor->step > motor->stepCircular) motor->step -= motor->stepCircular; + + if(dir == DIR_NEGATIVE) + { + steps = ((motor->stepCircular - motor->step) % motor->stepCircular); + motor->step = steps; + } + /* + else + steps = (motor->step % motor->stepCircular); + motor->step = steps; + */ + return motor->step; +} + +static void stepper_enableCheckHome(struct Stepper *motor, bool bDirPositive) +{ + enum MotorHomeSensorCheck value = MOTOR_HOMESENSOR_NOCHECK; // default + + motor->stepsTollMin = 0; + + if((motor->stepToReach != STEPS_INFINITE_POSITIVE) && + (motor->stepToReach != STEPS_INFINITE_NEGATIVE) ) + { + if(bDirPositive) // else if(motor->dir == DIR_POSITIVE) + { + /* if the direction is positive (movement from 0 position), + * if the starting position is inside home and the target position + * is outside home -> the motor has to cross the home sensor -> enable the control + */ + if (motor->step < motor->cfg->stepsInHome - motor->cfg->stepsTollOutHome && + motor->stepToReach > motor->cfg->stepsInHome + motor->cfg->stepsTollOutHome) + { + value = MOTOR_HOMESENSOR_OUTCHECK; + // home sensor out max position + motor->stepsTollMax = motor->cfg->stepsInHome + motor->cfg->stepsTollOutHome + MOTOR_CONSECUTIVE_ERROR_STEPS; + // home sensor in max position + if(motor->cfg->stepsInHome + MOTOR_CONSECUTIVE_ERROR_STEPS > motor->cfg->stepsTollOutHome) + motor->stepsTollMin = motor->cfg->stepsInHome + MOTOR_CONSECUTIVE_ERROR_STEPS - motor->cfg->stepsTollOutHome; + } + } + else // if(motor->dir == DIR_NEGATIVE) + { + /* + * if the direction is negative (movement to 0 position), + * if the starting position is far from home and the target position + * is inside home -> the motor has to cross the home sensor -> enable the control + */ + if (motor->step > motor->cfg->stepsInHome + motor->cfg->stepsTollInHome && + motor->stepToReach < motor->cfg->stepsInHome - motor->cfg->stepsTollInHome) + { + value = MOTOR_HOMESENSOR_INCHECK; + // home sensor out max position + motor->stepsTollMax = motor->cfg->stepsInHome + motor->cfg->stepsTollInHome - MOTOR_CONSECUTIVE_ERROR_STEPS; + // home sensor in max position + if(motor->cfg->stepsInHome > motor->cfg->stepsTollInHome + MOTOR_CONSECUTIVE_ERROR_STEPS) + motor->stepsTollMin = motor->cfg->stepsInHome - (motor->cfg->stepsTollInHome + MOTOR_CONSECUTIVE_ERROR_STEPS); + } + } + } + setCheckSensor(motor, value); +} + +/** + * Move motor to absolute position at specified speed + * + * \arg steps position to reach in steps + * \arg speed speed in timer ticks (use TIME2CLOCKS() to convert) + */ +int16_t stepper_move(struct Stepper *motor, int16_t steps, uint16_t speed, int16_t deafstep) +{ + // if the stepper already is in the desired position -> nothing to do + if (motor->step == steps) + return 0; + + stepper_disable_irq(motor); + + // final position + motor->stepToReach = steps; + + // clear error steps + motor->stepsErrorHome = 0; + + // position to start level check + motor->stepsDeaf = deafstep; + + // clear level position + motor->stepsLevel = 0; + + if (speed < motor->cfg->ramp.clocksMinWL) + { + ASSERT2(0, "speed too fast (small number)"); + speed = motor->cfg->ramp.clocksMinWL; + } + + motor->rampClock = motor->cfg->ramp.clocksMaxWL; + motor->rampValue = motor->cfg->ramp.clocksMaxWL; + + // TODO: find the exact value for motor->speed searching in the ramp array. + motor->speed = speed; + + stepper_enable_irq(motor); + + return 0; +} + + +/** + * Stop motor gracefully + */ +void stepper_stop(struct Stepper *motor) +{ + /* + * The best way is to set the target of the movement to the minimum + * distance needed to decelerate. The logic in FSM_run will do the rest. + */ + if(stepper_idle(motor)) + return; + + stepper_disable_irq(motor); + motor->stepToReach = motor->step + motor->rampStep * motor->dir; + stepper_enable_irq(motor); +} + + +/** + * Stop motor immediately, changing the status + */ +void stepper_break(struct Stepper *motor, enum StepperState state) +{ + // The best way to abort any operation is to go back to pre-idle mode + stepper_disable_irq(motor); + + // Set of Speed disabled and Steps reached so that the function + // stepper_idle() succeeds + motor->speed = SPEED_STOPPED; + motor->stepToReach = motor->step; + stepper_changeState(motor, state); + stepper_enable_irq(motor); +} + +///< Returns true if the stepper is in idle at the final position or in error: +// this means anyway that the motor is not moving +bool stepper_idle(struct Stepper *motor) +{ + return (stepper_isState(motor, MSTS_ERROR) || + (stepper_isState(motor, MSTS_IDLE) && motor->step == motor->stepToReach) ); +} + +///< Returns true if the stepper is in error mode +bool stepper_error(struct Stepper *motor) +{ + return (stepper_isState(motor, MSTS_ERROR)); +} + +///< check the home sensor in zero position +bool stepper_inhome(struct Stepper *motor) +{ + return(stepper_getStep(motor) == 0 && + !stepper_readHome(motor) ); +} diff --git a/2.5/bertos/drv/stepper.h b/2.5/bertos/drv/stepper.h new file mode 100644 index 00000000..1ad268b9 --- /dev/null +++ b/2.5/bertos/drv/stepper.h @@ -0,0 +1,228 @@ +/** + * \file + * + * + * \brief Driver to control stepper motor + * + * \version $Id$ + * + * \author Francesco Michelini + * \author Giovanni Bajo + * \author Bernie Innocenti + * \author Simone Zinanni + * \author Daniele Basile + * + * $WIZ$ module_name = "stepper" + * $WIZ$ module_depends = "timer", "ramp" + * $WIZ$ module_configuration = "bertos/cfg/cfg_stepper.h" + * $WIZ$ module_hw = "bertos/hw/hw_stepper.h" + * $WIZ$ module_supports = "not avr" + */ + +#ifndef DRV_STEPPER_H +#define DRV_STEPPER_H + +#include + +#include + +// Forward declaration +struct Stepper; + +///< Special value for steps to move the motor continuously +#define STEPS_INFINITE_POSITIVE ((int16_t)0xFFFF) +#define STEPS_INFINITE_NEGATIVE ((int16_t)0x8FFF) + +///< Maximum value for stepper steps +#define MAX_STEPS 0x7FFF + +///< Default value -> no level sensor associated to the motor +#define MOTOR_NO_LEVEL_SENSOR 0xFFFF + +///< Default value -> no home sensor associated to the motor +#define MOTOR_NO_HOME_SENSOR 0xFFFF + +///< Default value for deafsteps in normal movement (no level sensor) +#define DEAFSTEPS_DEFAULT MAX_STEPS + +///< Out-of-band values for speed +//\{ +#define SPEED_STOPPED 0xFFFF ///< motor is stopped +#define SPEED_HOMING 0xFFFE ///< motor is homing +//\} + +// default values for steps inside and outside home sensor +#define MOTOR_INSIDE_HOME_STEPS 10 +#define MOTOR_OUTSIDE_HOME_STEPS 40 + +// default value for home sensor tolerance +#define MOTOR_TOLERANCE_HOME_STEPS 2 + +// default value for consecutive error +#define MOTOR_CONSECUTIVE_ERROR_STEPS 3 + +// values for the home control enabling +enum MotorHomeSensorCheck +{ + MOTOR_HOMESENSOR_NOCHECK = 0, + MOTOR_HOMESENSOR_INCHECK, + MOTOR_HOMESENSOR_OUTCHECK +}; + +// default value in ms for home procedure timeout +#define MOTOR_TIMEOUT_HOME 20000 + +/** + * Motor direction + */ +enum MotorDirection +{ + DIR_POSITIVE = 1, ///< moving away from zero (which is the home) + DIR_NONE = 0, ///< no movement + DIR_NEGATIVE = -1 ///< moving towards towards zero (which is the home) +}; + +#define STEPPER_MAX_STATES 32 + + +/** + * Stepper state-machine conditions + */ +enum StepperState +{ + MSTS_UNINIT, ///< stepper_init() not yet called + MSTS_RUN, ///< running + MSTS_IDLE, ///< waiting for a command + MSTS_PREIDLE, ///< waiting before going low-current + MSTS_PRERUN, ///< waiting after high-current + +// Home procedure + MSTS_PREINIT, ///< preparing to initialize ;-) + MSTS_INIT, ///< initializing home procedure + MSTS_ENTERING, ///< entering home sensor + MSTS_LEAVING, ///< moving away from home (inside the sensor) + MSTS_OUTHOME, ///< moving away from home (outside the sensor) + + MSTS_ERROR, ///< error status + + ///< Dummy entry to guarantee the right underlying size for the enum + MSTS_DUMMY_ALIGN = STEPPER_MAX_STATES - 1 +}; + +///< Pointer to a function handling a state of the FSM driving the motor +typedef enum StepperState (*fsm_state)(struct Stepper* ); + +///< Pointer to a isr stepper function +typedef void (*stepper_isr_t)(struct Stepper* ); + +///< Time for steppers motor +typedef uint16_t stepper_time_t; + +/** + * Stepper configuration + */ +struct StepperConfig +{ + struct Ramp ramp; ///< Acceleration ramp + uint16_t pulse; ///< (clocks) Length of the clock pulse used to drive the motor + + fsm_state states[STEPPER_MAX_STATES]; ///< Custom FSM states (or NULL for default handling) + + int16_t stepsInHome; ///< Additional steps to do after home detection + int16_t stepsOutHome; ///< Additional steps to do leaving sensor in home procedure + uint16_t clocksHome; ///< Clock ticks for steps done when searching home + + int16_t stepsTollOutHome; ///< tolerance steps leaving home sensor control while moving + int16_t stepsTollInHome; ///< tolerance steps leaving home sensor control while moving + + int16_t timeoutHome; ///< timeout in ms in home procedure + + uint8_t powerRun; ///< Vref voltage when motor runs (0-255) + uint8_t powerIdle; ///< Vref voltage when motor is idle (0-255) + + uint16_t homeSensorIndex; ///< Home Sensor index in the sensor list + uint16_t levelSensorIndex; ///< Level Sensor index in the sensor list + + struct + { + bool homeInverted : 1; ///< True for inverted home sensor + bool halfStep : 1; ///< True for half-step mode + bool axisInverted : 1; ///< True if the CW/CCW are inverted from default + bool levelInverted : 1; ///< True for inverted level sensor + bool controlBit : 1; ///< Control bit status + bool controlMoveBit : 1; ///< Control bit status in movement + bool highcurrentBit : 1; ///< Mantain high current bit status + } flags; +}; + + +/** + * Motor context structure + */ +struct Stepper +{ + const struct StepperConfig *cfg; ///< Configuration of this stepper + fsm_state state; ///< Motor FSM state function + + struct TimerCounter *timer; ///< HW timer bound to this motor + uint16_t index; ///< Index of the motor + + volatile int16_t step; ///< Steps counter (used in interrupt) + volatile int16_t rampStep; ///< Current position in acceleration ramp (used in intrrupt) +#if RAMP_USE_FLOATING_POINT + float rampValue; ///< Nr of Ticks for current step in ramp + float rampClock; ///< Cumulative nr of ticks for current step in ramp +#else + uint16_t rampValue; + uint32_t rampClock; +#endif + + enum MotorDirection dir; ///< Current direction + uint8_t power; ///< Current power + + uint16_t speed; ///< Timer compare value to reach + int16_t stepToReach; ///< Final position to reach when running + + int16_t skipIrqs; ///< Counter used to skip IRQs (delay state changes) + int16_t changeCurrentIrqs; ///< Counter used to change current level (delay state changes) + + int8_t enableCheckHome; ///< enable the home sensor control during movement + int8_t stepsErrorHome; ///< number of consecutive steps in error + int16_t stepsTollMax; ///< home sensor out max position + int16_t stepsTollMin; ///< home sensor in max position + + int16_t stepsDeaf; ///< Position after which start the level check + int16_t stepsLevel; ///< Position of level contact + + int16_t stepCircular; ///< Steps corresponding to 360 degrees (rotating motor) +}; + + +void stepper_init(void); +void stepper_end(void); +struct Stepper *stepper_setup(int index, struct StepperConfig *cfg); +void stepper_disable(void); +void stepper_reset(struct Stepper *motor); +void stepper_home(struct Stepper *motor); +void stepper_setStep(struct Stepper *motor, int16_t step); +int16_t stepper_getStep(struct Stepper *motor); +int16_t stepper_move(struct Stepper *motor, int16_t step, uint16_t speed, int16_t deafstep); +void stepper_stop(struct Stepper *motor); +void stepper_break(struct Stepper *motor, enum StepperState state); +bool stepper_idle(struct Stepper *motor); +bool stepper_readHome(struct Stepper *motor); +bool stepper_readLevel(struct Stepper *motor); +void stepper_updateHalfStep(struct Stepper *motor); +void stepper_updateControlBit(struct Stepper *motor); +void stepper_updateControlMoveBit(struct Stepper *motor); +bool stepper_error(struct Stepper *motor); +bool stepper_inhome(struct Stepper *motor); +int16_t stepper_getLevelStep(struct Stepper *motor); +void stepper_set_stepCircular(struct Stepper *motor, int16_t steps); +int16_t stepper_get_stepCircular(struct Stepper *motor); +int16_t stepper_scaleSteps(struct Stepper *motor, int16_t dir); + +#endif /* DRV_STEPPER_H */ diff --git a/2.5/bertos/drv/tas5706a.c b/2.5/bertos/drv/tas5706a.c new file mode 100644 index 00000000..b935c42f --- /dev/null +++ b/2.5/bertos/drv/tas5706a.c @@ -0,0 +1,146 @@ +/** + * \file + * + * + * \brief TAS5706A Power DAC i2c driver. + * + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "tas5706a.h" +#include + +#include +#include + +#include "hw/hw_tas5706a.h" +#include "cfg/cfg_tas5706a.h" + +#define TAS_ADDR 0x36 + +typedef uint8_t tas_addr_t; + +static bool tas5706a_send(tas_addr_t addr, const void *buf, size_t len) +{ + bool ret = i2c_start_w(TAS_ADDR) && i2c_put(addr) && i2c_send(buf, len); + i2c_stop(); + return ret; +} + +INLINE bool tas5706a_putc(tas_addr_t addr, uint8_t ch) +{ + return tas5706a_send(addr, &ch, sizeof(ch)); +} + +static bool tas5706a_recv(tas_addr_t addr, void *buf, size_t len) +{ + bool ret = i2c_start_w(TAS_ADDR) && i2c_put(addr) && i2c_start_r(TAS_ADDR) && i2c_recv(buf, len); + i2c_stop(); + return ret; +} + +INLINE int tas5706a_getc(tas_addr_t addr) +{ + uint8_t ch; + if (tas5706a_recv(addr, &ch, sizeof(ch))) + return (int)(uint8_t)ch; + else + return EOF; +} + +#define TRIM_REG 0x1B +#define SYS_REG2 0x05 +#define VOLUME_REG 0x07 +#define MUTE_VOL 0xFF + +#define DB_TO_REG(db) ((24 - (db)) * 2) + +void tas5706a_init(void) +{ + MOD_CHECK(i2c); + MOD_CHECK(timer); + TAS5706A_PIN_INIT(); + timer_delay(200); + TAS5706A_SETPOWERDOWN(false); + TAS5706A_SETMUTE(false); + TAS5706A_MCLK_INIT(); + timer_delay(2); + TAS5706A_SETRESET(false); + timer_delay(20); + tas5706a_putc(TRIM_REG, 0x00); + + tas5706a_putc(VOLUME_REG, DB_TO_REG(CONFIG_TAS_MAX_VOL)); + + /* Unmute */ + tas5706a_putc(SYS_REG2, 0); +} + +#define CH1_VOL_REG 0x08 +#define CH2_VOL_REG 0x09 +#define CH3_VOL_REG 0x0A +#define CH4_VOL_REG 0x0B + +void tas5706a_setVolume(Tas5706aCh ch, tas5706a_vol_t vol) +{ + ASSERT(ch < TAS_CNT); + ASSERT(vol <= TAS_VOL_MAX); + + tas_addr_t addr1, addr2; + + switch(ch) + { + case TAS_CH1: + addr1 = CH1_VOL_REG; + addr2 = CH3_VOL_REG; + break; + case TAS_CH2: + addr1 = CH2_VOL_REG; + addr2 = CH4_VOL_REG; + break; + default: + ASSERT(0); + return; + } + + uint8_t vol_att = 0xff - ((vol * 0xff) / TAS_VOL_MAX); + + tas5706a_putc(addr1, vol_att); + tas5706a_putc(addr2, vol_att); +} + +void tas5706a_setLowPower(bool val) +{ + TAS5706A_SETPOWERDOWN(val); + TAS5706A_SETMUTE(val); +} + diff --git a/2.5/bertos/drv/tas5706a.h b/2.5/bertos/drv/tas5706a.h new file mode 100644 index 00000000..d7811de5 --- /dev/null +++ b/2.5/bertos/drv/tas5706a.h @@ -0,0 +1,94 @@ +/** + * \file + * + * + * \brief TAS5706A Power DAC i2c driver. + * + * + * \version $Id$ + * \author Francesco Sacchi + * + * $WIZ$ module_name = "tas5706a" + * $WIZ$ module_depends = "timer", "i2c" + * $WIZ$ module_configuration = "bertos/cfg/cfg_tas5706a.h" + * $WIZ$ module_hw = "bertos/hw/hw_tas5706a.h" + */ + +#ifndef DRV_TAS5706A_H +#define DRV_TAS5706A_H + +#include + +typedef enum Tas5706aCh +{ + TAS_CH1, + TAS_CH2, + TAS_CNT, +} Tas5706aCh; + +/** + * TAS minimum volume (%). + */ +#define TAS_VOL_MIN 0 + +/** + * TAS maximum volume (%). + */ +#define TAS_VOL_MAX 100 + +typedef uint8_t tas5706a_vol_t; + +/** + * Set the volume for the specified channel. + * + * The volume must be expressed in % and will be at maximum CONFIG_TAS_MAX_VOL. + * + * \param ch The channel to be controlled. + * \param vol The volume you want to set. + */ +void tas5706a_setVolume(Tas5706aCh ch, tas5706a_vol_t vol); + +/** + * Initialize the TAS chip. + */ +void tas5706a_init(void); + +/** + * Set TAS chip to low power mode. + * + * When in low power mode, the TAS will not play any sound. You should put the TAS chip in low + * power whenever possible to prevent overheating and to save power. + * + * \param val True if you want to enable low power mode, false otherwise. + */ +void tas5706a_setLowPower(bool val); + +#endif /* DRV_TAS5706A_H */ diff --git a/2.5/bertos/drv/tc520.c b/2.5/bertos/drv/tc520.c new file mode 100644 index 00000000..f285f850 --- /dev/null +++ b/2.5/bertos/drv/tc520.c @@ -0,0 +1,169 @@ +/** + * \file + * + * + * + * \brief TC520 ADC driver (implementation) + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Marco Benelli + */ + + +#include "hw/hw_tc520.h" + +#include +#include + +#include +#include + +#warning FIXME:This implementation is obsolete. Refactor with KFile interface. + +#if 0 + +#include + +static Serial *spi_ser; + +#define TC520_CONVERSION_TIMEOUT ms_to_ticks(1000) +#define INIT_LOAD_VALUE 0x00 + +/** + * Start an AD conversion and return result. + * + * To start a conversion first we must pull down CE pin. + * The ADC starts a convertion and keeps the DV pin high until the end. + * At this point, we can read the conversion value by SPI. + * The convertion result is yield in 3 bytes. + * + * \verbatim + * + * First byte: + * bit | Value + * ----|------- + * 7 | Overrange + * 6 | Polarity + * 5:0 | data bits 15:10 + * + * Second byte: data 9:2 + * + * Third byte: + * bit | Value + * ----|------- + * 7 | data bit 1 + * 6 | data bit 0 + * 5:0 | '0' + * + * \endverbatim + * + * So, to get the result we must shift and recompose the bits. + * \note Overrange bit is handled as the 17th data bit. + */ +tc520_data_t tc520_read(void) +{ + /* Start convertion and wait */ + CE_LOW(); + ticks_t start = timer_clock(); + do + { + /* timeout check */ + if (timer_clock() - start >= TC520_CONVERSION_TIMEOUT) + { + ASSERT(0); + CE_HIGH(); + return TC520_MAX_VALUE; + } + } + while(DV_LOW()); + + start = timer_clock(); + do + { + /* timeout check */ + if (timer_clock() - start >= TC520_CONVERSION_TIMEOUT) + { + ASSERT(0); + CE_HIGH(); + return TC520_MAX_VALUE; + } + } + while(DV_HIGH()); + + /* Ok, convertion finished, read result */ + CE_HIGH(); + READ_LOW(); + + /* RX buffer could be dirty...*/ + ser_purge(spi_ser); + + /* I/O buffer */ + uint8_t buf[3] = "\x0\x0\x0"; + + /* Dummy write to activate recv */ + ser_write(spi_ser, buf, sizeof(buf)); + ser_drain(spi_ser); + READ_HIGH(); + + /* recv */ + ASSERT(ser_read(spi_ser, buf, sizeof(buf)) == sizeof(buf)); + + tc520_data_t res; + + /* Recompose data */ + res = (((tc520_data_t)(buf[0] & 0x3F)) << 10) | (((tc520_data_t)buf[1]) << 2) | (((tc520_data_t)buf[2]) >> 6); + + #define OVERRANGE_BIT BV(7) + /* Handle overrange bit as 17th bit */ + if (buf[0] & OVERRANGE_BIT) + res |= BV32(16); + + return res; +} + + +/** + * Initialize tc520 A/D converter driver + */ +void tc520_init(Serial *spi_port) +{ + spi_ser = spi_port; + /* init io ports */ + TC520_HW_INIT; + /* Send initial load value */ + LOAD_LOW(); + ser_putchar(INIT_LOAD_VALUE, spi_ser); + ser_drain(spi_ser); + LOAD_HIGH(); +} + +#endif diff --git a/2.5/bertos/drv/tc520.h b/2.5/bertos/drv/tc520.h new file mode 100644 index 00000000..bd40c493 --- /dev/null +++ b/2.5/bertos/drv/tc520.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \version $Id$ + * + * \brief TC520 ADC driver (intercace) + * + * \version $Id$ + * \author Francesco Sacchi + * \author Marco Benelli + */ + +#ifndef DRV_TC520_H +#define DRV_TC520_H + +#warning FIXME: This drive is obsolete, you should refactor it. + +#include +#include + +typedef uint32_t tc520_data_t; + +/* 17 bit max value */ +#define TC520_MAX_VALUE 0x1FFFFUL + +tc520_data_t tc520_read(void); +void tc520_init(Serial *spi_port); + +#endif /* DRV_TC520_H */ diff --git a/2.5/bertos/drv/thermo.c b/2.5/bertos/drv/thermo.c new file mode 100644 index 00000000..6fa5ba2e --- /dev/null +++ b/2.5/bertos/drv/thermo.c @@ -0,0 +1,327 @@ +/** + * \file + * + * + * \brief Thermo-control driver. + * + * The Thermo controll can works both with kernel or without it. In the case + * we use kernel, the thermo controll is done by one process that poll every + * CONFIG_THERMO_INTERVAL_MS the temperature sensor and make all operation to + * follow the target temperature. While we not use the kernel the module works + * with one timer interrupt in the same way of the kenel case. + * + * \author Giovanni Bajo + * \author Francesco Sacchi + * \author Daniele Basile + * + */ + +#include "hw/thermo_map.h" +#include "hw/hw_thermo.h" + +#include "cfg/cfg_thermo.h" + +#include +#include +#include +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL CONFIG_THERMO_LOG_LEVEL +#define LOG_VERBOSITY CONFIG_THERMO_LOG_FORMAT +#include + +#include +#include +#include + +#include + +#define THERMO_OFF 0 +#define THERMO_HEATING BV(0) +#define THERMO_FREEZING BV(1) +#define THERMO_TGT_REACH BV(2) +#define THERMOERRF_NTCSHORT BV(3) +#define THERMOERRF_NTCOPEN BV(4) +#define THERMOERRF_TIMEOUT BV(5) +#define THERMO_ACTIVE BV(6) +#define THERMO_TIMER BV(7) + +#define THERMO_ERRMASK (THERMOERRF_NTCSHORT | THERMOERRF_NTCOPEN | THERMOERRF_TIMEOUT) + + +#if CONFIG_KERN + /** Stack process for Thermo process. */ + static PROC_DEFINE_STACK(thermo_poll_stack, 400); +#else + /** Timer for thermo-regulation. */ + static Timer thermo_timer; +#endif + +typedef struct ThermoControlDev +{ + deg_t hifi_samples[CONFIG_THERMO_HIFI_NUM_SAMPLES]; + deg_t cur_hifi_sample; + deg_t target; + thermostatus_t status; + ticks_t expire; + ticks_t on_time; +} ThermoControlDev; + +/** Array of thermo-devices. */ +ThermoControlDev devs[THERMO_CNT]; + +/** + * Return the status of the specific \a dev thermo-device. + */ +thermostatus_t thermo_status(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + return devs[dev].status; +} + + +/** + * Do a single thermo control for device \a dev. + */ +static void thermo_do(ThermoDev index) +{ + ThermoControlDev* dev = &devs[index]; + deg_t cur_temp; + deg_t tolerance = thermo_hw_tolerance(index); + + cur_temp = thermo_hw_read(index); + + // Store the sample into the hifi FIFO buffer for later interpolation + dev->hifi_samples[dev->cur_hifi_sample] = cur_temp; + if (++dev->cur_hifi_sample == CONFIG_THERMO_HIFI_NUM_SAMPLES) + dev->cur_hifi_sample = 0; + + cur_temp = thermo_readTemperature(index); + + if (cur_temp == NTC_SHORT_CIRCUIT || cur_temp == NTC_OPEN_CIRCUIT) + { + if (cur_temp == NTC_SHORT_CIRCUIT) + { + LOG_INFOB(if (!(dev->status & THERMOERRF_NTCSHORT)) + LOG_INFO("dev[%d], thermo_do: NTC_SHORT\n",index);); + + dev->status |= THERMOERRF_NTCSHORT; + } + else + { + + LOG_INFOB(if (!(dev->status & THERMOERRF_NTCOPEN)) + LOG_INFO("dev[%d], thermo_do: NTC_OPEN\n", index);); + + dev->status |= THERMOERRF_NTCOPEN; + } + + /* Reset timeout when there is an ntc error */ + dev->expire = thermo_hw_timeout(index) + timer_clock(); + thermo_hw_off(index); + return; + } + dev->status &= ~(THERMOERRF_NTCOPEN | THERMOERRF_NTCSHORT); + + if ((cur_temp < dev->target - tolerance) || (cur_temp > dev->target + tolerance)) + { + dev->status &= ~THERMO_TGT_REACH; + + /* Check for timeout */ + if (timer_clock() - dev->expire > 0) + { + dev->status |= THERMOERRF_TIMEOUT; + LOG_INFO("dev[%d], thermo_do: TIMEOUT\n", index); + } + } + else /* In target */ + { + /* Clear errors */ + dev->status &= ~THERMO_ERRMASK; + dev->status |= THERMO_TGT_REACH; + + /* Reset timeout in case we go out of target in the future */ + dev->expire = thermo_hw_timeout(index) + timer_clock(); + } + + if (cur_temp < dev->target) + dev->status = (dev->status | THERMO_HEATING) & ~THERMO_FREEZING; + else + dev->status = (dev->status & ~THERMO_HEATING) | THERMO_FREEZING; + + thermo_hw_set(index, dev->target, cur_temp); + +} + +static void poll(void) +{ + for (int i = 0; i < THERMO_CNT; ++i) + if (devs[i].status & THERMO_ACTIVE) + { + LOG_INFO("THERMO [%d] on_time[%ld],\n", i, ticks_to_ms(devs[i].on_time)); + if ((devs[i].status & THERMO_TIMER) && (devs[i].on_time - timer_clock() < 0)) + { + thermo_stop(i); + continue; + } + + thermo_do((ThermoDev)i); + } +} + +#if CONFIG_KERN + static void NORETURN thermo_poll(void) + { + for (;;) + { + poll(); + timer_delay(CONFIG_THERMO_INTERVAL_MS); + } + } +#else + /** + * Thermo soft interrupt. + */ + static void thermo_softint(void) + { + poll(); + timer_add(&thermo_timer); + } +#endif + +/** + * Starts a thermo-regulation for channel \a dev, and turn off timer + * when \a on_time was elapsed. + */ +void thermo_timer(ThermoDev dev, mtime_t on_time) +{ + ASSERT(dev < THERMO_CNT); + devs[dev].on_time = timer_clock() + ms_to_ticks(on_time); + devs[dev].status |= THERMO_TIMER; + thermo_start(dev); +} + + +/** + * Set the target temperature \a temperature for a specific \a dev thermo-device. + */ +void thermo_setTarget(ThermoDev dev, deg_t temperature) +{ + ASSERT(dev < THERMO_CNT); + devs[dev].target = temperature; + devs[dev].expire = timer_clock() + thermo_hw_timeout(dev); + + LOG_INFO("THERMO Set Target dev[%d], T[%d.%d]\n", dev, temperature / 10, temperature % 10); +} + +/** + * Starts a thermo-regulation for channel \a dev. + */ +void thermo_start(ThermoDev dev) +{ + int i; + deg_t temp; + + ASSERT(dev < THERMO_CNT); + + devs[dev].status |= THERMO_ACTIVE; + LOG_INFO("THERMO Start dev[%d], status[%04x]\n", dev, devs[dev].status); + + /* Initialize the hifi FIFO with a constant value (the current temperature) */ + temp = thermo_hw_read(dev); + for (i = 0; i < CONFIG_THERMO_HIFI_NUM_SAMPLES; ++i) + devs[dev].hifi_samples[i] = temp; + devs[dev].cur_hifi_sample = 0; + + /* Reset timeout */ + devs[dev].expire = timer_clock() + thermo_hw_timeout(dev); +} + +/** + * Stops a thermo-regulation for channel \a dev. + */ +void thermo_stop(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + devs[dev].status &= ~THERMO_ACTIVE; + thermo_hw_off(dev); +} + + +/** + * Clear errors for channel \a dev. + */ +void thermo_clearErrors(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + devs[dev].status &= ~(THERMO_ERRMASK); +} + + +/** + * Read the temperature of the thermo-device \a dev using mobile mean. + */ +deg_t thermo_readTemperature(ThermoDev dev) +{ + int i; + long accum = 0; + + MOD_CHECK(thermo); + + for (i = 0; i < CONFIG_THERMO_HIFI_NUM_SAMPLES; i++) + accum += devs[dev].hifi_samples[i]; + + return (deg_t)(accum / CONFIG_THERMO_HIFI_NUM_SAMPLES); +} + +MOD_DEFINE(thermo) + +/** + * Init thermo-control and associated hw. + */ +void thermo_init(void) +{ + THERMO_HW_INIT; + + /* Set all status to off */ + for (int i = 0; i < THERMO_CNT; i++) + devs[i].status = THERMO_OFF; + + MOD_INIT(thermo); + + #if CONFIG_KERN + proc_new_with_name("Thermo", thermo_poll, NULL, sizeof(thermo_poll_stack), thermo_poll_stack); + #else + timer_setDelay(&thermo_timer, ms_to_ticks(CONFIG_THERMO_INTERVAL_MS)); + timer_setSoftint(&thermo_timer, (Hook)thermo_softint, 0); + timer_add(&thermo_timer); + #endif +} diff --git a/2.5/bertos/drv/thermo.h b/2.5/bertos/drv/thermo.h new file mode 100644 index 00000000..02b1ccbc --- /dev/null +++ b/2.5/bertos/drv/thermo.h @@ -0,0 +1,105 @@ +/** + * \file + * + * + * \brief Thermo-control driver. + * + * This module implements multiple thermo controls, which is the logic needed to try + * keeping the temperature of a device constant. For this module, a "device" is a black box + * whose temperature can be measured, and which has a mean to make it hotter or colder. + * For instance, a device could be the combination of a NTC (analog temperature reader) and + * a Peltier connected to the same physic block. + * + * This module relies on a low-level driver to communicate with the device (implementation + * of the black box). This low-level driver also controls the units in which the temperature + * is expressed: thermo control treats it just as a number. + * + * + * \author Giovanni Bajo + * \author Francesco Sacchi + * \author Daniele Basile + * + * $WIZ$ module_name = "thermo" + * $WIZ$ module_depends = "timer", "ntc" + * $WIZ$ module_configuration = "bertos/cfg/cfg_thermo.h" + * $WIZ$ module_hw = "bertos/hw/hw_thermo.h", "bertos/hw/thermo_map.h" + */ + +#ifndef DRV_THERMO_H +#define DRV_THERMO_H + +#include "hw/thermo_map.h" + +#include +#include + +typedef uint8_t thermostatus_t; + + +/** + * Set the target temperature at which a given device should be kept. + * + * \param dev Device + * \param temperature Target temperature + */ +void thermo_setTarget(ThermoDev dev, deg_t temperature); + +/** + * Start thermo control for a certain device \a dev and stop it after + * \a on_time msec. + */ +void thermo_timer(ThermoDev dev, mtime_t on_time); + +/** Start thermo control for a certain device \a dev */ +void thermo_start(ThermoDev dev); + +/** Stop thermo control for a certain device \a dev */ +void thermo_stop(ThermoDev dev); + +/** Clear errors for channel \a dev */ +void thermo_clearErrors(ThermoDev dev); + +/** Return the status of the specific \a dev thermo-device. */ +thermostatus_t thermo_status(ThermoDev dev); + +/** + * Return the current temperature of a device currently under thermo + * control. + * + * \param dev Device + * \return Current temperature (Celsius degrees * 10) + */ +deg_t thermo_readTemperature(ThermoDev dev); + +void thermo_init(void); + + +#endif /* DRV_THERMO_H */ diff --git a/2.5/bertos/drv/timer.c b/2.5/bertos/drv/timer.c new file mode 100644 index 00000000..d380e5f1 --- /dev/null +++ b/2.5/bertos/drv/timer.c @@ -0,0 +1,402 @@ +/** + * \file + * + * + * \brief Hardware independent timer driver (implementation) + * + * \author Bernie Innocenti + * \author Francesco Sacchi + */ + +#include "timer.h" +#include "hw/hw_timer.h" + +#include "cfg/cfg_timer.h" +#include "cfg/cfg_wdt.h" +#include "cfg/cfg_proc.h" +#include "cfg/cfg_signal.h" +#include +#include +#include + +#include +#include +#include +#include // cpu_relax() + +#include // proc_decQuantun() + +/* + * Include platform-specific binding code if we're hosted. + * Try the CPU specific one for bare-metal environments. + */ +#if OS_HOSTED + //#include OS_CSOURCE(timer) + #include +#else + #ifndef WIZ_AUTOGEN + #warning Deprecated: now you should include timer_ directly in the makefile. Remove this line and the following once done. + #include CPU_CSOURCE(timer) + #endif +#endif + +/* + * Sanity check for config parameters required by this module. + */ +#if !defined(CONFIG_KERN) || ((CONFIG_KERN != 0) && CONFIG_KERN != 1) + #error CONFIG_KERN must be set to either 0 or 1 in config.h +#endif +#if !defined(CONFIG_WATCHDOG) || ((CONFIG_WATCHDOG != 0) && CONFIG_WATCHDOG != 1) + #error CONFIG_WATCHDOG must be set to either 0 or 1 in config.h +#endif + +#if CONFIG_WATCHDOG + #include +#endif + +#if defined (CONFIG_KERN_SIGNALS) && CONFIG_KERN_SIGNALS + #include /* sig_wait(), sig_check() */ + #include /* proc_current() */ + #include /* BV() */ +#endif + + +/** + * \def CONFIG_TIMER_STROBE + * + * This is a debug facility that can be used to + * monitor timer interrupt activity on an external pin. + * + * To use strobes, redefine the macros TIMER_STROBE_ON, + * TIMER_STROBE_OFF and TIMER_STROBE_INIT and set + * CONFIG_TIMER_STROBE to 1. + */ +#if !defined(CONFIG_TIMER_STROBE) || !CONFIG_TIMER_STROBE + #define TIMER_STROBE_ON do {/*nop*/} while(0) + #define TIMER_STROBE_OFF do {/*nop*/} while(0) + #define TIMER_STROBE_INIT do {/*nop*/} while(0) +#endif + + +/// Master system clock (1 tick accuracy) +volatile ticks_t _clock; + + +#if CONFIG_TIMER_EVENTS + +/** + * List of active asynchronous timers. + */ +REGISTER static List timers_queue; + +/** + * This function really does the job. It adds \a timer to \a queue. + * \see timer_add for details. + */ +INLINE void timer_addToList(Timer *timer, List *queue) +{ + /* Inserting timers twice causes mayhem. */ + ASSERT(timer->magic != TIMER_MAGIC_ACTIVE); + DB(timer->magic = TIMER_MAGIC_ACTIVE;) + + + /* Calculate expiration time for this timer */ + timer->tick = _clock + timer->_delay; + + /* + * Search for the first node whose expiration time is + * greater than the timer we want to add. + */ + Timer *node = (Timer *)LIST_HEAD(queue); + while (node->link.succ) + { + /* + * Stop just after the insertion point. + * (this fancy compare takes care of wrap-arounds). + */ + if (node->tick - timer->tick > 0) + break; + + /* Go to next node */ + node = (Timer *)node->link.succ; + } + + /* Enqueue timer request into the list */ + INSERT_BEFORE(&timer->link, &node->link); +} + +/** + * Add the specified timer to the software timer service queue. + * When the delay indicated by the timer expires, the timer + * device will execute the event associated with it. + * + * \note Interrupt safe + */ +void timer_add(Timer *timer) +{ + ATOMIC(timer_addToList(timer, &timers_queue)); +} + +/** + * Remove a timer from the timers queue before it has expired. + * + * \note Attempting to remove a timer already expired cause + * undefined behaviour. + */ +Timer *timer_abort(Timer *timer) +{ + ATOMIC(REMOVE(&timer->link)); + DB(timer->magic = TIMER_MAGIC_INACTIVE;) + + return timer; +} + + +INLINE void timer_poll(List *queue) +{ + Timer *timer; + + /* + * Check the first timer request in the list and process + * it when it has expired. Repeat this check until the + * first node has not yet expired. Since the list is sorted + * by expiry time, all the following requests are guaranteed + * to expire later. + */ + while ((timer = (Timer *)LIST_HEAD(queue))->link.succ) + { + /* This request in list has not yet expired? */ + if (timer_clock() - timer->tick < 0) + break; + + /* Retreat the expired timer */ + REMOVE(&timer->link); + DB(timer->magic = TIMER_MAGIC_INACTIVE;) + + /* Execute the associated event */ + event_do(&timer->expire); + } +} + +/** + * Add \a timer to \a queue. + * \see synctimer_poll() for details. + */ +void synctimer_add(Timer *timer, List *queue) +{ + timer_addToList(timer, queue); +} + +/** + * Simple synchronous timer based scheduler polling routine. + * + * Sometimes you would like to have a proper scheduler, + * but you can't afford it due to memory constraints. + * + * This is a simple replacement: you can create events and call + * them periodically at specific time intervals. + * All you have to do is to set up normal timers, and call synctimer_add() + * instead of timer_add() to add the events to your specific queue. + * Then, in the main loop or wherever you want, you can call + * synctimer_poll() to process expired events. The associated callbacks will be + * executed. + * As this is done synchronously you don't have to worry about race conditions. + * You can kill an event by simply calling synctimer_abort(). + * + */ +void synctimer_poll(List *queue) +{ + timer_poll(queue); +} + +#endif /* CONFIG_TIMER_EVENTS */ + + +/** + * Wait for the specified amount of timer ticks. + * + * \note Sleeping while preemption is disabled fallbacks to a busy wait sleep. + */ +void timer_delayTicks(ticks_t delay) +{ + /* We shouldn't sleep with interrupts disabled */ + IRQ_ASSERT_ENABLED(); + +#if CONFIG_KERN_SIGNALS + Timer t; + + if (proc_preemptAllowed()) + { + ASSERT(!sig_check(SIG_SINGLE)); + timer_setSignal(&t, proc_current(), SIG_SINGLE); + timer_setDelay(&t, delay); + timer_add(&t); + sig_wait(SIG_SINGLE); + } + else +#endif /* !CONFIG_KERN_SIGNALS */ + { + ticks_t start = timer_clock(); + + /* Busy wait */ + while (timer_clock() - start < delay) + cpu_relax(); + } +} + + +#if CONFIG_TIMER_UDELAY + +/** + * Busy wait until the specified amount of high-precision ticks have elapsed. + * + * \note This function is interrupt safe, the only + * requirement is a running hardware timer. + */ +void timer_busyWait(hptime_t delay) +{ + hptime_t now, prev = timer_hw_hpread(); + hptime_t delta; + + for(;;) + { + now = timer_hw_hpread(); + /* + * We rely on hptime_t being unsigned here to + * reduce the modulo to an AND in the common + * case of TIMER_HW_CNT. + */ + delta = (now - prev) % TIMER_HW_CNT; + if (delta >= delay) + break; + delay -= delta; + prev = now; + } +} + +/** + * Wait for the specified amount of time (expressed in microseconds). + * + * \bug In AVR arch the maximum amount of time that can be used as + * delay could be very limited, depending on the hardware timer + * used. Check timer_avr.h, and what register is used as hptime_t. + */ +void timer_delayHp(hptime_t delay) +{ + if (UNLIKELY(delay > us_to_hptime(1000))) + { + timer_delayTicks(delay / (TIMER_HW_HPTICKS_PER_SEC / TIMER_TICKS_PER_SEC)); + delay %= (TIMER_HW_HPTICKS_PER_SEC / TIMER_TICKS_PER_SEC); + } + + timer_busyWait(delay); +} +#endif /* CONFIG_TIMER_UDELAY */ + +/** + * Timer interrupt handler. Find soft timers expired and + * trigger corresponding events. + */ +DEFINE_TIMER_ISR +{ + /* + * With the Metrowerks compiler, the only way to force the compiler generate + * an interrupt service routine is to put a pragma directive within the function + * body. + */ + #ifdef __MWERKS__ + #pragma interrupt saveall + #endif + + /* + * On systems sharing IRQ line and vector, this check is needed + * to ensure that IRQ is generated by timer source. + */ + if (!timer_hw_triggered()) + return; + + TIMER_STROBE_ON; + + /* Update the master ms counter */ + ++_clock; + + /* Update the current task's quantum (if enabled). */ + proc_decQuantum(); + + #if CONFIG_TIMER_EVENTS + timer_poll(&timers_queue); + #endif + + /* Perform hw IRQ handling */ + timer_hw_irq(); + + TIMER_STROBE_OFF; +} + +MOD_DEFINE(timer) + +/** + * Initialize timer + */ +void timer_init(void) +{ + #if CONFIG_KERN_IRQ + MOD_CHECK(irq); + #endif + + #if CONFIG_TIMER_EVENTS + LIST_INIT(&timers_queue); + #endif + + TIMER_STROBE_INIT; + + _clock = 0; + + timer_hw_init(); + + MOD_INIT(timer); +} + + +#if (ARCH & ARCH_EMUL) +/** + * Stop timer (only used by emulator) + */ +void timer_cleanup(void) +{ + MOD_CLEANUP(timer); + + timer_hw_cleanup(); + + // Hmmm... apparently, the demo app does not cleanup properly + //ASSERT(LIST_EMPTY(&timers_queue)); +} +#endif /* ARCH_EMUL */ diff --git a/2.5/bertos/drv/timer.h b/2.5/bertos/drv/timer.h new file mode 100644 index 00000000..50d118a9 --- /dev/null +++ b/2.5/bertos/drv/timer.h @@ -0,0 +1,316 @@ +/** + * \file + * + * + * \brief Hardware independent timer driver. + * + * All timer related functions are implemented in this module. You have several options to use timers: + * \li simple delay: just use timer_delay() if you want to wait for a few milliseconds; + * \li delay with callback: create a timer structure and use timer_setDelay() and timer_setSoftint() to set the callback; + * \li delay with signal: same as above but use timer_setSignal() to set specify which signal to send. + * \li simple synchronous timer based scheduler: use synctimer_add() to schedule an event in a user provided queue. + * + * Whenever a timer expires you need to explicitly arm it again with timer_add(). If you want to abort a timer, use timer_abort(). + * You can use conversion macros when using msecs to specify the delay. + * + * \author Bernie Innocenti + * + * $WIZ$ module_name = "timer" + * $WIZ$ module_configuration = "bertos/cfg/cfg_timer.h" + * $WIZ$ module_depends = "event", "sysirq" + * $WIZ$ module_supports = "not atmega103 and not atmega8" + */ + +#ifndef DRV_TIMER_H +#define DRV_TIMER_H + +#include +#include + +#include +#include + + +/* + * Include platform-specific binding header if we're hosted. + * Try the CPU specific one for bare-metal environments. + */ +#if OS_HOSTED + //#include OS_HEADER(timer) + #include +#else + #include CPU_HEADER(timer) +#endif + +STATIC_ASSERT(sizeof(hptime_t) == SIZEOF_HPTIME_T); + +#include "cfg/cfg_timer.h" +#include +#include + +#include + +/* + * Sanity check for config parameters required by this module. + */ +#if !defined(CONFIG_TIMER_EVENTS) || ((CONFIG_TIMER_EVENTS != 0) && CONFIG_TIMER_EVENTS != 1) + #error CONFIG_TIMER_EVENTS must be set to either 0 or 1 in cfg_timer.h +#endif +#if !defined(CONFIG_TIMER_UDELAY) || ((CONFIG_TIMER_UDELAY != 0) && CONFIG_TIMER_EVENTS != 1) + #error CONFIG_TIMER_UDELAY must be set to either 0 or 1 in cfg_timer.h +#endif +#if defined(CONFIG_TIMER_DISABLE_UDELAY) + #error Obosolete config option CONFIG_TIMER_DISABLE_UDELAY. Use CONFIG_TIMER_UDELAY +#endif +#if defined(CONFIG_TIMER_DISABLE_EVENTS) + #error Obosolete config option CONFIG_TIMER_DISABLE_EVENTS. Use CONFIG_TIMER_EVENTS +#endif + +extern volatile ticks_t _clock; + +/** + * \brief Return the system tick counter (expressed in ticks) + * + * The result is guaranteed to increment monotonically, + * but client code must be tolerant with respect to overflows. + * + * The following code is safe: + * + * \code + * drop_teabag(); + * ticks_t tea_start_time = timer_clock(); + * + * for (;;) + * { + * if (timer_clock() - tea_start_time > TEAPOT_DELAY) + * { + * printf("Your tea, Sir.\n"); + * break; + * } + * patience(); + * } + * \endcode + * + * \note This function must disable interrupts on 8/16bit CPUs because the + * clock variable is larger than the processor word size and can't + * be copied atomically. + * \sa timer_delay() + */ +INLINE ticks_t timer_clock(void) +{ + ticks_t result; + + ATOMIC(result = _clock); + + return result; +} + +/** + * Faster version of timer_clock(), to be called only when the timer + * interrupt is disabled (DISABLE_INTS) or overridden by a + * higher-priority or non-nesting interrupt. + * + * \sa timer_clock + */ +INLINE ticks_t timer_clock_unlocked(void) +{ + return _clock; +} + + +/** Convert \a ms [ms] to ticks. */ +INLINE ticks_t ms_to_ticks(mtime_t ms) +{ +#if TIMER_TICKS_PER_SEC < 1000 + /* Slow timer: avoid rounding down too much. */ + return (ms * TIMER_TICKS_PER_SEC) / 1000; +#else + /* Fast timer: don't overflow ticks_t. */ + return ms * DIV_ROUND(TIMER_TICKS_PER_SEC, 1000); +#endif +} + +/** Convert \a us [us] to ticks. */ +INLINE ticks_t us_to_ticks(utime_t us) +{ +#if TIMER_TICKS_PER_SEC < 1000 + /* Slow timer: avoid rounding down too much. */ + return ((us / 1000) * TIMER_TICKS_PER_SEC) / 1000; +#else + /* Fast timer: don't overflow ticks_t. */ + return (us * DIV_ROUND(TIMER_TICKS_PER_SEC, 1000)) / 1000; +#endif +} + +/** Convert \a ticks [ticks] to ms. */ +INLINE mtime_t ticks_to_ms(ticks_t ticks) +{ +#if TIMER_TICKS_PER_SEC < 1000 + /* Slow timer: avoid rounding down too much. */ + return (ticks * 1000) / TIMER_TICKS_PER_SEC; +#else + /* Fast timer: avoid overflowing ticks_t. */ + return ticks / (TIMER_TICKS_PER_SEC / 1000); +#endif +} + +/** Convert \a ticks [ticks] to us. */ +INLINE utime_t ticks_to_us(ticks_t ticks) +{ +#if TIMER_TICKS_PER_SEC < 1000 + /* Slow timer: avoid rounding down too much. */ + return ((ticks * 1000) / TIMER_TICKS_PER_SEC) * 1000; +#else + /* Fast timer: avoid overflowing ticks_t. */ + return (ticks / (TIMER_TICKS_PER_SEC / 1000)) * 1000; +#endif +} + +/** Convert \a us [us] to hpticks */ +INLINE hptime_t us_to_hptime(utime_t us) +{ +#if TIMER_HW_HPTICKS_PER_SEC > 10000000UL + return us * DIV_ROUND(TIMER_HW_HPTICKS_PER_SEC, 1000000UL); +#else + return (us * ((TIMER_HW_HPTICKS_PER_SEC + 500) / 1000UL) + 500) / 1000UL; +#endif +} + +/** Convert \a hpticks [hptime] to usec */ +INLINE utime_t hptime_to_us(hptime_t hpticks) +{ +#if TIMER_HW_HPTICKS_PER_SEC < 100000UL + return hpticks * DIV_ROUND(1000000UL, TIMER_HW_HPTICKS_PER_SEC); +#else + return (hpticks * 1000UL) / DIV_ROUND(TIMER_HW_HPTICKS_PER_SEC, 1000UL); +#endif /* TIMER_HW_HPTICKS_PER_SEC < 100000UL */ +} + +void timer_delayTicks(ticks_t delay); +/** + * Wait some time [ms]. + * + * \note CPU is released while waiting so you don't have to call cpu_relax() explicitly. + * \param delay Time to wait [ms]. + */ +INLINE void timer_delay(mtime_t delay) +{ + timer_delayTicks(ms_to_ticks(delay)); +} + +void timer_init(void); +void timer_cleanup(void); + +int timer_testSetup(void); +int timer_testRun(void); +int timer_testTearDown(void); + +#if CONFIG_TIMER_UDELAY +void timer_busyWait(hptime_t delay); +void timer_delayHp(hptime_t delay); +INLINE void timer_udelay(utime_t delay) +{ + timer_delayHp(us_to_hptime(delay)); +} +#endif + +#if CONFIG_TIMER_EVENTS + +#include + +/** + * The timer driver supports multiple synchronous timers + * that can trigger an event when they expire. + * + * \sa timer_add() + * \sa timer_abort() + */ +typedef struct Timer +{ + Node link; /**< Link into timers queue */ + ticks_t _delay; /**< [ticks] Timer delay */ + ticks_t tick; /**< [ticks] When this timer will expire */ + Event expire; /**< Event to execute when the timer expires */ + DB(uint16_t magic;) +} Timer; + +/* Timer is active when Timer.magic contains this value (for debugging purposes). */ +#define TIMER_MAGIC_ACTIVE 0xABBA +#define TIMER_MAGIC_INACTIVE 0xBAAB + +void timer_add(Timer *timer); +Timer *timer_abort(Timer *timer); + +/** + * Set the timer so that it calls an user hook when it expires + * + * Sometimes you may want to use the same callback for different events, so you must have + * different data to operate on. The user_data parameter is such data. + * + * \param timer Timer struct to set the callback to + * \param func Function that will be called when the timer expires + * \param user_data Additional data you may want to pass to the callback + */ +INLINE void timer_setSoftint(Timer *timer, Hook func, iptr_t user_data) +{ + event_initSoftint(&timer->expire, func, user_data); +} + +/** Set the timer delay (the time before the event will be triggered) */ +INLINE void timer_setDelay(Timer *timer, ticks_t delay) +{ + timer->_delay = delay; +} + + +void synctimer_add(Timer *timer, List* q); + +/** \sa timer_abort */ +#define synctimer_abort(t) timer_abort(t) + +void synctimer_poll(List* q); + + +#endif /* CONFIG_TIMER_EVENTS */ + +#if defined(CONFIG_KERN_SIGNALS) && CONFIG_KERN_SIGNALS + +/** Set the timer so that it sends a signal when it expires */ +INLINE void timer_setSignal(Timer *timer, struct Process *proc, sigmask_t sigs) +{ + event_initSignal(&timer->expire, proc, sigs); +} + +#define timer_set_event_signal timer_setSignal + +#endif /* CONFIG_KERN_SIGNALS */ + +#endif /* DRV_TIMER_H */ diff --git a/2.5/bertos/drv/timer_test.c b/2.5/bertos/drv/timer_test.c new file mode 100644 index 00000000..6569781b --- /dev/null +++ b/2.5/bertos/drv/timer_test.c @@ -0,0 +1,210 @@ +/** + * \file + * + * + * \brief Hardware independent timer driver (implementation) + * + * \version $Id$ + * \author Bernie Innocenti + * + */ + +#include + +#include +#include + +#include + +#include + +static void timer_test_constants(void) +{ + kprintf("TIMER_HW_HPTICKS_PER_SEC=%lu\n", (unsigned long)TIMER_HW_HPTICKS_PER_SEC); + #ifdef TIMER_PRESCALER + kprintf("TIMER_PRESCALER = %lu\n", (unsigned long)TIMER_PRESCALER); + #endif + #ifdef TIMER1_OVF_COUNT + kprintf("TIMER1_OVF_COUNT = %lu\n", (unsigned long)TIMER1_OVF_COUNT); + #endif + kprintf("TIMER_TICKS_PER_SEC= %lu\n", (unsigned long)TIMER_TICKS_PER_SEC); + kprintf("\n"); + kprintf("ms_to_ticks(100) = %lu\n", (unsigned long)ms_to_ticks(100)); + kprintf("ms_to_ticks(10000) = %lu\n", (unsigned long)ms_to_ticks(10000)); + kprintf("us_to_ticks(100) = %lu\n", (unsigned long)us_to_ticks(100)); + kprintf("us_to_ticks(10000) = %lu\n", (unsigned long)us_to_ticks(10000)); + kprintf("\n"); + kprintf("ticks_to_ms(100) = %lu\n", (unsigned long)ticks_to_ms(100)); + kprintf("ticks_to_ms(10000) = %lu\n", (unsigned long)ticks_to_ms(10000)); + kprintf("ticks_to_us(100) = %lu\n", (unsigned long)ticks_to_us(100)); + kprintf("ticks_to_us(10000) = %lu\n", (unsigned long)ticks_to_us(10000)); + kprintf("\n"); + kprintf("hptime_to_us(100) = %lu\n", (unsigned long)hptime_to_us(100)); + #if (SIZEOF_HPTIME_T > 1) + kprintf("hptime_to_us(10000)= %lu\n", (unsigned long)hptime_to_us(10000)); + #endif + kprintf("us_to_hptime(100) = %lu\n", (unsigned long)us_to_hptime(100)); + kprintf("us_to_hptime(10000)= %lu\n", (unsigned long)us_to_hptime(10000)); +} + +static void timer_test_delay(void) +{ + int i; + + kputs("Delay test\n"); + for (i = 0; i < 1000; i += 100) + { + kprintf("delay %d...", i); + timer_delay(i); + kputs("done\n"); + } +} + +static void timer_test_hook(iptr_t _timer) +{ + Timer *timer = (Timer *)(void *)_timer; + + kprintf("Timer %lu expired\n", (unsigned long)ticks_to_ms(timer->_delay)); + timer_add(timer); +} + +static Timer test_timers[5]; + +List synctimer_list; +static Timer synctimer_timers[5]; + +static void synctimer_test_hook(iptr_t _timer) +{ + Timer *timer = (Timer *)(void *)_timer; + kprintf("Sync timer process %lu expired\n", (unsigned long)ticks_to_ms(timer->_delay)); + synctimer_add(timer, &synctimer_list); +} + + +static const mtime_t test_delays[5] = { 170, 50, 310, 1500, 310 }; + +static void timer_test_async(void) +{ + size_t i; + + for (i = 0; i < countof(test_timers); ++i) + { + Timer *timer = &test_timers[i]; + timer_setDelay(timer, ms_to_ticks(test_delays[i])); + timer_setSoftint(timer, timer_test_hook, (iptr_t)timer); + timer_add(timer); + } +} + +static void timer_test_poll(void) +{ + int secs = 0; + mtime_t start_time = ticks_to_ms(timer_clock()); + mtime_t now; + + while (secs <= 10) + { + now = ticks_to_ms(timer_clock()); + if (now - start_time >= 1000) + { + ++secs; + start_time += 1000; + kprintf("seconds = %d, ticks=%lu\n", secs, (unsigned long)now); + } + wdt_reset(); + } +} + +static void synctimer_test(void) +{ + size_t i; + + LIST_INIT(&synctimer_list); + for (i = 0; i < countof(synctimer_timers); ++i) + { + Timer *timer = &synctimer_timers[i]; + timer_setDelay(timer, ms_to_ticks(test_delays[i])); + timer_setSoftint(timer, synctimer_test_hook, (iptr_t)timer); + synctimer_add(timer, &synctimer_list); + } + + int secs = 0; + mtime_t start_time = ticks_to_ms(timer_clock()); + mtime_t now; + + while (secs <= 10) + { + now = ticks_to_ms(timer_clock()); + synctimer_poll(&synctimer_list); + if (now - start_time >= 1000) + { + ++secs; + start_time += 1000; + kprintf("seconds = %d, ticks=%lu\n", secs, (unsigned long)now); + } + wdt_reset(); + } + + for (i = 0; i < countof(synctimer_timers); ++i) + { + synctimer_abort(&synctimer_timers[i]); + } +} + +int timer_testSetup(void) +{ + IRQ_ENABLE; + wdt_start(7); + timer_init(); + kdbg_init(); + return 0; +} + +int timer_testRun(void) +{ + timer_test_constants(); + timer_test_delay(); + timer_test_async(); + timer_test_poll(); + synctimer_test(); + return 0; +} + +int timer_testTearDown(void) +{ + unsigned i; + for (i = 0; i < countof(test_timers); ++i) + timer_abort(&test_timers[i]); + return 0; +} + +TEST_MAIN(timer); + diff --git a/2.5/bertos/drv/tlv5618.c b/2.5/bertos/drv/tlv5618.c new file mode 100644 index 00000000..4639df6b --- /dev/null +++ b/2.5/bertos/drv/tlv5618.c @@ -0,0 +1,104 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * Texas instrument TLV5618 DAC driver. + */ + +#include "tlv5618.h" +#include "hw/hw_tlv5618.h" + +#include + +#include //memset + + +static void tlv5618_write(Tlv5618 *ctx, uint16_t val) +{ + TLV5618_CSLOW(ctx->cs_pin); + kfile_putc(val >> 8, ctx->ch); + kfile_putc(val & 0xFF, ctx->ch); + kfile_flush(ctx->ch); + TLV5618_CSHIGH(ctx->cs_pin); +} + +#define POWERDOWN 0x2000 +#define OUTA 0xC000 +#define OUTB 0x4000 + +/** + * Set DAC output A to \a val. + * \a val ranges from 0 to 4095 (12 bit). + * \note : if in power down, the device will be awaken. + */ +void tlv5618_setOutA(Tlv5618 *ctx, uint16_t val) +{ + val &= 0x0FFF; + tlv5618_write(ctx, val | OUTA); +} + +/** + * Set DAC output B to \a val. + * \a val ranges from 0 to 4095 (12 bit). + * \note : if in power down, the device will be awaken. + */ +void tlv5618_setOutB(Tlv5618 *ctx, uint16_t val) +{ + val &= 0x0FFF; + tlv5618_write(ctx, val | OUTB); +} + +/** + * Set the TLV5618 in the power down state. + */ +void tlv5618_setPowerDown(Tlv5618 *ctx) +{ + tlv5618_write(ctx, POWERDOWN); +} + + +/** + * Init the TLV5618 with CS connected to \a cs_pin. + * \a ch should be the SPI channel needed to communicate with the DAC. + * This SPI should also be correctly configured (the MOSI should + * change on the rising edge of the SCK clock). + * \note the device is set in power down mode. + */ +void tlv5618_init(Tlv5618 *ctx, KFile *ch, int cs_pin) +{ + memset(ctx, 0, sizeof(*ctx)); + ctx->cs_pin = cs_pin; + ctx->ch = ch; + TLV5618_CSINIT(cs_pin); + tlv5618_setPowerDown(ctx); +} diff --git a/2.5/bertos/drv/tlv5618.h b/2.5/bertos/drv/tlv5618.h new file mode 100644 index 00000000..7deb1eb7 --- /dev/null +++ b/2.5/bertos/drv/tlv5618.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * + * \brief Texas instrument TLV5618 DAC driver. + * + * $WIZ$ module_name = "tlv5618" + * $WIZ$ module_depends = "kfile" + * $WIZ$ module_hw = "bertos/hw/hw_tlv5618.h" + */ + +#ifndef DRV_TLV5618_H +#define DRV_TLV5618_H + +#include +#include + +typedef struct Tlv5618 +{ + KFile *ch; + int cs_pin; +} Tlv5618; + +void tlv5618_setOutA(Tlv5618 *ctx, uint16_t val); +void tlv5618_setOutB(Tlv5618 *ctx, uint16_t val); +void tlv5618_setPowerDown(Tlv5618 *ctx); +void tlv5618_init(Tlv5618 *ctx, KFile *ch, int pin); + +#endif /* DRV_TLV5618_H */ diff --git a/2.5/bertos/drv/tmp123.c b/2.5/bertos/drv/tmp123.c new file mode 100644 index 00000000..cce2696a --- /dev/null +++ b/2.5/bertos/drv/tmp123.c @@ -0,0 +1,74 @@ +/** + * \file + * + * + * \brief TMP123 Texas Intrument sensor temperature. + * + * \author Daniele Basile + * + */ + +#include "tmp123.h" + +#include "hw/hw_tmp123.h" + +#include + +#include + +#include + +#include // Macro and data type to manage celsius degree + +/** + * Read temperature from TMP123 chip. + */ +deg_t tmp123_read(KFile *fd) +{ + int16_t tmp; + + TMP123_HW_CS_EN(); + kfile_read(fd, &tmp, sizeof(tmp)); + tmp = be16_to_cpu(tmp); + TMP123_HW_CS_DIS(); + + tmp >>= 3; + return DIV_ROUND((tmp * 10), 16); +} +/** + * Init module + */ +void tmp123_init(void) +{ + TMP123_HW_INIT(); +} + + diff --git a/2.5/bertos/drv/tmp123.h b/2.5/bertos/drv/tmp123.h new file mode 100644 index 00000000..85859b25 --- /dev/null +++ b/2.5/bertos/drv/tmp123.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief TMP123 Texas Intrument sensor temperature. + * + * \author Daniele Basile + * + * $WIZ$ module_name = "tmp123" + * $WIZ$ module_depends = "timer", "kfile" + * $WIZ$ module_configuration = "" + * $WIZ$ module_hw = "bertos/hw/hw_tmp123.h" + */ + +#ifndef DRV_TMP123_H +#define DRV_TMP123_H + +#include + +#include + +#include // Macro and data type to manage celsius degree + +deg_t tmp123_read(KFile *fd); + +void tmp123_init(void); + +#endif /* DRV_TMP123_H */ diff --git a/2.5/bertos/drv/wdt.h b/2.5/bertos/drv/wdt.h new file mode 100644 index 00000000..89752bf7 --- /dev/null +++ b/2.5/bertos/drv/wdt.h @@ -0,0 +1,126 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Watchdog module, supplies a simple API to manage wdt on supported target. + * + * $WIZ$ module_name = "wdt" + * $WIZ$ module_configuration = "bertos/cfg/cfg_wdt.h" + * $WIZ$ module_supports = "avr" + */ + +#ifndef DRV_WDT_H +#define DRV_WDT_H + +#include "cfg/cfg_wdt.h" + +#include // INLINE + +/* Configury sanity check */ +#if !defined(CONFIG_WATCHDOG) || (CONFIG_WATCHDOG != 0 && CONFIG_WATCHDOG != 1) + #error CONFIG_WATCHDOG must be defined to either 0 or 1 +#endif + +#if OS_HOSTED + #include + #include + + #if OS_QT + #include + #elif OS_POSIX + #include + #else + #error unknown CPU + #endif +#elif CONFIG_WATCHDOG + #include CPU_HEADER(wdt) +#endif /* CONFIG_WATCHDOG */ + + +#if OS_HOSTED || !CONFIG_WATCHDOG + + /** + * Reset the watchdog timer. + */ + INLINE void wdt_reset(void) + { + #if CONFIG_WATCHDOG + #if OS_POSIX + static struct timeval tv = { 0, 0 }; + select(0, NULL, NULL, NULL, &tv); + #endif + #endif /* CONFIG_WATCHDOG */ + } + + /** + * Start the watchdog timer that fire at the select + * timeout. + * + * \param timeout this value is target dependant. + * See the target documentation for more details. + */ + INLINE void wdt_start(uint32_t timeout) + { + #if CONFIG_WATCHDOG + #if OS_QT + // Create a dummy QApplication object + if (!qApp) + { + int argc; + new QApplication(argc, (char **)NULL); + } + (void)timeout; + #elif OS_POSIX + (void)timeout; // NOP + #endif + #endif /* CONFIG_WATCHDOG */ + (void)timeout; // NOP + } + + INLINE void wdt_stop(void) + { + #if CONFIG_WATCHDOG + #if OS_QT + // NOP + #elif OS_POSIX + // NOP + #else + #error unknown CPU + #endif + #endif /* CONFIG_WATCHDOG */ + } +#endif /* OS_HOSTED || !CONFIG_WATCHDOG */ + +#endif /* DRV_WDT_H */ diff --git a/2.5/bertos/dt/dnotifier.c b/2.5/bertos/dt/dnotifier.c new file mode 100644 index 00000000..6c1ddd45 --- /dev/null +++ b/2.5/bertos/dt/dnotifier.c @@ -0,0 +1,163 @@ +/** + * \file + * + * + * \version $Id$ + * + * \brief Notifier obj (implementation). + * + * \version $Id$ + * \author Bernie Innocenti + * \author Francesco Sacchi + */ + +#include + +#include
+#include
+#include + +/** + * Default update used to notify target: notify all trasparently all + * targets in the list. + */ +static void notifier_update(DNotifier *n, dtag_t tag, dval_t val) +{ + dnotify_targets(n, tag, val); +} + +/** + * Init. + */ +void notifier_init(DNotifier *n) +{ + // Init instance + n->update = notifier_update; + LIST_INIT(&n->targets); +} + +/** + * Search in the map a tag and a val corresponding to the ones supplied. + * If a match is found change them to the corresponding ones in the map. + * If map is NULL the filter is trasparent and all messages sent to filter + * will be forwarded to its target. + */ +void filter_update(DFilter *f, dtag_t tag, dval_t val) +{ + + const DFilterMap *map = f->map; + + if (map) + { + while (map->src.tag != TAG_END) + { + if ((map->src.tag == tag) && (map->src.val == val)) + { + tag = map->dst.tag; + val = map->dst.val; + break; + } + /* TAG_ANY matches anything */ + if (map->src.tag == TAG_ANY) + break; + map++; + } + + if (map->src.tag != TAG_END) + dnotify(f->target, tag, val); + } + else + dnotify(f->target, tag, val); +} + + +/** + * Search in the table a tag corresponding to the one supplied and a val + * that has at least the mask map supplied bits to one. + * If a match is found change them to the corresponding ones in the map. + * If map is NULL the filter is trasparent and all messages sent to filter + * will be forwarded to its target. + */ +void filter_mask_update(DFilter *f, dtag_t tag, dval_t val) +{ + + const DFilterMap *map = f->map; + dfilter_mask_t mask; + + if (map) + { + while (map->src.tag != TAG_END) + { + mask = (dfilter_mask_t) map->src.val; + if ((map->src.tag == tag) && ((mask & (dfilter_mask_t)val) == mask)) + { + tag = map->dst.tag; + val = map->dst.val; + break; + } + /* TAG_ANY matches anything */ + if (map->src.tag == TAG_ANY) + break; + map++; + } + + + if (map->src.tag != TAG_END) + dnotify(f->target, tag, val); + } + else + dnotify(f->target, tag, val); +} + + +#define FILTER_MAGIC_ACTIVE 0xAA +/** + * Init filter. + * If \a masked is true, all the fields value in \a map must be interpreted as a mask of bits. + */ +void filter_init(DFilter *f, const DFilterMap *map, bool masked, DNotifier *source, DNotifier *target) +{ + // Init instance + if (masked) + f->update = (update_filter_ptr)filter_mask_update; + else + f->update = (update_filter_ptr)filter_update; + + /* set filter map and target */ + f->map = map; + f->target = target; + + /* these ensure that the filter is not inserted in more than one list */ + ASSERT(f->magic != FILTER_MAGIC_ACTIVE); + DB(f->magic = FILTER_MAGIC_ACTIVE;) + + /* Add the filter to source filter list */ + ADDTAIL(&source->targets, &f->link); +} diff --git a/2.5/bertos/dt/dnotifier.h b/2.5/bertos/dt/dnotifier.h new file mode 100644 index 00000000..4b4ef1bf --- /dev/null +++ b/2.5/bertos/dt/dnotifier.h @@ -0,0 +1,151 @@ +/** + * \file + * + * + * \brief Notifier obj (interface). + * + * \version $Id$ + * \author Bernie Innocenti + * \author Francesco Sacchi + */ + +#ifndef DT_DNOTIFIER_H +#define DT_DNOTIFIER_H + +#include + +#include
+#include + +//Fwd declaretion. +struct DNotifier; +struct DFilter; + +typedef void (* update_func_ptr)(struct DNotifier *, dtag_t, dval_t); +typedef void (* update_filter_ptr)(struct DFilter *, dtag_t, dval_t); + +/** + * Base object for receive and forward messages. + * It contains an update function used to update itslef and a list to + * notify other DNotifer eventually connected. + */ +typedef struct DNotifier +{ + /// Receive new attributes from other notifiers. + update_func_ptr update; + + /// List of target notifiers to set new attributes to. + List targets; +} DNotifier; + +/** + * Map for messages. + * Used to translate src message to dst message. + */ +typedef struct DFilterMap +{ + DTagItem src; + DTagItem dst; +} DFilterMap; + + +/** + * A filter is an interface between two notifier. + * It can translate messages between them through a map (if it is not null). + */ +typedef struct DFilter +{ + /// Allow creating a list of dfilter objects. + Node link; + + /// Target of the filter + DNotifier *target; + + /// Update function called by the source dnotifier + update_filter_ptr update; + + ///Map for translating messages for target + const DFilterMap *map; + + ///Used in debug to prevent inserting this filter in more than one list + DB(uint8_t magic;) +} DFilter; + +/// Type for filter-mask checking +typedef unsigned int dfilter_mask_t; + +/// Filter init +void filter_init(DFilter *f, const DFilterMap *map, bool masked, DNotifier *source, DNotifier *target); + +/// Filter update function without masking capabilities. +void filter_update(DFilter *f, dtag_t tag, dval_t val); + +/// Filter update function with masking capabilities. +void filter_mask_update(DFilter *f, dtag_t tag, dval_t val); + +/// Notifier init +void notifier_init(DNotifier *n); + + +/** + * Macro to notify the target object. + */ +INLINE void dnotify(DNotifier *target, dtag_t tag, dval_t val) +{ + if (target) + target->update(target, tag, val); +} + +/** + * Macro to notify all the targets of \a target object. + */ +INLINE void dnotify_targets(DNotifier *target, dtag_t tag, dval_t val) +{ + DFilter *f; + if (!LIST_EMPTY(&target->targets)) + FOREACH_NODE(f, &target->targets) + f->update(f, tag, val); +} + + +/** + * Macro that connect \a src notifier to \a tgt using \a map and passing \a opt for filtering option. + * It declares a static filter to achieve connection and messages translation. + * \note Due its static filter declaration, DCONNECT MUST NOT be used inside loops or in functions called multiple times. + * Failing to do so will lead to unpredictable connections between notifiers. + */ +#define DCONNECT(src, tgt, map, opt) \ + do { \ + static DFilter _filter_; /* Declare a filter */ \ + filter_init(&(_filter_), map, opt, src, tgt); /* Init it. */ \ + } while (0) + + +#endif /* DT_DNOTIFIER_H */ diff --git a/2.5/bertos/dt/dtag.h b/2.5/bertos/dt/dtag.h new file mode 100644 index 00000000..799ec6b4 --- /dev/null +++ b/2.5/bertos/dt/dtag.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \version $Id$ + * + * \brief Tags interface. + * This module contains the base message definitions and the list of all available tags. + * + * \version $Id$ + * \author Bernie Innocenti + * \author Francesco Sacchi + */ + +/*#* + *#* $Log$ + *#* Revision 1.2 2006/07/19 12:56:26 bernie + *#* Convert to new Doxygen style. + *#* + *#* Revision 1.1 2005/11/04 18:26:38 bernie + *#* Import into DevLib. + *#* + *#* Revision 1.8 2005/06/07 15:22:29 batt + *#* Add const_dval_t. + *#* + *#* Revision 1.7 2005/06/06 17:42:23 batt + *#* Add error tag TAG_ERROR. + *#* + *#* Revision 1.6 2005/06/06 12:45:33 batt + *#* Add TAG_NONE tag. + *#* + *#* Revision 1.5 2005/06/06 11:04:12 batt + *#* Add some comments. + *#* + *#* Revision 1.4 2005/05/31 11:09:52 batt + *#* Add some tags. + *#* + *#* Revision 1.3 2005/05/26 14:55:12 batt + *#* Add form_processTime; change form_kbdProcess to form_processKey. + *#* + *#* Revision 1.2 2005/05/26 14:43:33 batt + *#* Add new message filter interface. + *#* + *#* Revision 1.1 2005/05/26 08:32:53 batt + *#* Add new Develer widget system :) + *#* + *#*/ + +#ifndef DT_DTAG_H +#define DT_DTAG_H + +#include + +/** Type for values associated with tags. */ +typedef iptr_t dval_t; + +/** Type for constant values associated with tags. */ +typedef const_iptr_t const_dval_t; + +/** Type for tag */ +typedef enum dtag_t +{ + TAG_END = 0, + TAG_NONE, + TAG_ANY, + TAG_SETVALUE, + TAG_UP, + TAG_DOWN, + TAG_START, + TAG_STOP, + TAG_TOGGLE, + TAG_KEY, + TAG_TIME, + TAG_ERROR, +} dtag_t; + +/** This is the basic message structure used by all dnotifiers. */ +typedef struct DTagItem +{ + dtag_t tag; + dval_t val; +} DTagItem; + +/** Marker to indicate the end of a map for message filtering/translating */ +#define TAG_END_MARKER {{TAG_END, 0}, {TAG_END, 0}} +#endif diff --git a/2.5/bertos/dt/dwidget.c b/2.5/bertos/dt/dwidget.c new file mode 100644 index 00000000..f399caa4 --- /dev/null +++ b/2.5/bertos/dt/dwidget.c @@ -0,0 +1,77 @@ +/** + * \file + * + * + * \version $Id$ + * + * \brief Widget (implementation). + * A widget is typically a graphic object on a device. + * Its proproperties are the position, the size and a context on which the widget is drawn. + * + * \version $Id$ + * \author Bernie Innocenti + * \author Francesco Sacchi + */ + +/*#* + *#* $Log$ + *#* Revision 1.2 2006/07/19 12:56:26 bernie + *#* Convert to new Doxygen style. + *#* + *#* Revision 1.1 2005/11/04 18:26:38 bernie + *#* Import into DevLib. + *#* + *#* Revision 1.3 2005/06/06 11:04:12 batt + *#* Add some comments. + *#* + *#* Revision 1.2 2005/05/26 14:44:10 batt + *#* Abstract widget from layer: use context. + *#* + *#* Revision 1.1 2005/05/26 08:32:53 batt + *#* Add new Develer widget system :) + *#* + *#*/ + +#include
+#include
+ +/** + * Init the widget of \a pos and \a size on the drawing \a context. + */ +void widget_init(DWidget *w, dpos_t pos, dpos_t size, dcontext_t *context) +{ + // Init superclass + notifier_init(&w->notifier); + + // Init instance + w->pos = pos; + w->size = size; + w->context = context; +} diff --git a/2.5/bertos/dt/dwidget.h b/2.5/bertos/dt/dwidget.h new file mode 100644 index 00000000..24549d7d --- /dev/null +++ b/2.5/bertos/dt/dwidget.h @@ -0,0 +1,66 @@ +/** + * \file + * + * + * \version $Id$ + * + * \brief Widget (interface). + * + * \version $Id$ + * \author Bernie Innocenti + * \author Francesco Sacchi + */ + +#ifndef DT_DWIDGET_H +#define DT_DWIDGET_H + +#include
+#include + +/** Widget position. */ +typedef uint8_t dpos_t; + +/** Widget drawing context. */ +typedef iptr_t dcontext_t; + +/** Widget definition. */ +typedef struct DWidget +{ + DNotifier notifier; + + dpos_t pos; + dpos_t size; + dcontext_t *context; +} DWidget; + + +void widget_init(DWidget *w, dpos_t pos, dpos_t size, dcontext_t *context); + +#endif diff --git a/2.5/bertos/dt/editbool.c b/2.5/bertos/dt/editbool.c new file mode 100644 index 00000000..b0290c6e --- /dev/null +++ b/2.5/bertos/dt/editbool.c @@ -0,0 +1,99 @@ +/** + * \file + * + * + * \brief Edit bool widget (implementation). + * This widget handles boolean editing. + * The boolean value will be displayed using two strings: + * one when the bool is false and one when it's true. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "editbool.h" +#include
+ +#include + +/** + * Init widget. + */ +void editbool_init(DEditBool *e, dpos_t pos, dpos_t size, dcontext_t *context, bool *value, const char *true_string, const char *false_string) +{ + // Initialize superclass + widget_init(&e->widget, pos, size, context); + + // Override superclass methods + e->widget.notifier.update = (update_func_ptr)editbool_update; + + // Init instance + e->value = value; + e->true_string = true_string; + e->false_string = false_string; + e->draw = editbool_draw; +} + +/** + * Handle the messages (edit the bool). + */ +void editbool_update(DEditBool *e, dtag_t tag, dval_t _val) +{ + bool changed = false; + + switch (tag) + { + case TAG_SETVALUE: + *e->value = (bool)_val; + changed = true; + break; + + case TAG_TOGGLE: + *e->value = !*e->value; + changed = true; + break; + default: + break; + } + + if (changed) + { + e->draw(e); + dnotify_targets(&e->widget.notifier, TAG_SETVALUE, (dval_t)*e->value); + } +} + +/** + * Draw the string on the context. + */ +void editbool_draw(DEditBool *e) +{ + lcd_printf((Layer *)e->widget.context, (lcdpos_t)e->widget.pos, LCD_NORMAL, "%*s", (int)e->widget.size , *e->value? e->true_string: e->false_string); +} diff --git a/2.5/bertos/dt/editbool.h b/2.5/bertos/dt/editbool.h new file mode 100644 index 00000000..a339330d --- /dev/null +++ b/2.5/bertos/dt/editbool.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief Edit bool widget (interface). + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef DT_EDITBOOL_H +#define DT_EDITBOOL_H + +#include
+#include
+ +typedef struct DEditBool +{ + DWidget widget; + bool *value; + const char *true_string; + const char *false_string; + void (*draw)(struct DEditBool *); +} DEditBool; + +void editbool_init(DEditBool *e, dpos_t pos, dpos_t size, dcontext_t *context, bool *val, const char *true_str, const char *false_str); +void editbool_update(DEditBool *e, dtag_t tag, dval_t val); +void editbool_draw(DEditBool *e); + + +#endif /* DT_EDITBOOL_H */ diff --git a/2.5/bertos/dt/editint.c b/2.5/bertos/dt/editint.c new file mode 100644 index 00000000..26fcde90 --- /dev/null +++ b/2.5/bertos/dt/editint.c @@ -0,0 +1,127 @@ +/** + * \file + * + * + * \brief Integer edit widget (implementation). + * + * \version $Id$ + * \author Bernie Innocenti + * \author Francesco Sacchi + */ + +#include "editint.h" + +#include + +#include
+#include
+#include
+ +#include + +/** + * Init. + */ +void editint_init(DEditInt *e, dpos_t pos, dpos_t size, dcontext_t *context, int *value, int min, int max) +{ + // Initialize superclass + widget_init(&e->widget, pos, size, context); + + // Override superclass methods + e->widget.notifier.update = (update_func_ptr)editint_update; + + // Init instance + e->value = value; + e->min = min; + e->max = max; + e->style = EDIS_DEFAULT; + e->draw = editint_draw; +} + +/** + * Handle the messages (edit the int). + */ +void editint_update(DEditInt *e, dtag_t tag, dval_t _val) +{ + bool changed = false; + int val = (int)_val; + + switch (tag) + { + case TAG_SETVALUE: + *e->value = MINMAX(e->min, val, e->max); + changed = true; + break; + + /* Increments the integer by val */ + case TAG_UP: + if (e->style & EDIS_WRAP) + { + if (*e->value + val > e->max) + *e->value = (*e->value + val - e->min) % (e->max - e->min + 1) + e->min; + else + *e->value += val; + } + else + *e->value = MIN(*e->value + val, e->max); + changed = true; + break; + /* Decrements the integer by val */ + case TAG_DOWN: + if (e->style & EDIS_WRAP) + { + if (*e->value - val < e->min) + *e->value = e->max - (e->max - (*e->value - val)) % (e->max - e->min + 1); + else + *e->value -= val; + } + else + *e->value = MAX(*e->value - val, e->min); + changed = true; + break; + + default: + break; + } + + if (changed) + { + e->draw(e); + dnotify_targets(&e->widget.notifier, TAG_SETVALUE, (dval_t)*e->value); + } +} + +/** + * Draw the integer on the context. + */ +void editint_draw(DEditInt *e) +{ + lcd_printf((Layer *)e->widget.context, (lcdpos_t)e->widget.pos, LCD_NORMAL,"%*d", (int)e->widget.size, *e->value); +} diff --git a/2.5/bertos/dt/editint.h b/2.5/bertos/dt/editint.h new file mode 100644 index 00000000..f719eadf --- /dev/null +++ b/2.5/bertos/dt/editint.h @@ -0,0 +1,94 @@ +/** + * \file + * + * + * \version $Id$ + * + * \brief Integer edit (interface). + * + * \version $Id$ + * \author Bernie Innocenti + * \author Francesco Sacchi + */ + +/*#* + *#* $Log$ + *#* Revision 1.2 2006/07/19 12:56:26 bernie + *#* Convert to new Doxygen style. + *#* + *#* Revision 1.1 2005/11/04 18:26:38 bernie + *#* Import into DevLib. + *#* + *#* Revision 1.3 2005/06/10 15:46:09 batt + *#* Add EDIS_WRAP style that wrap around min and max. + *#* + *#* Revision 1.2 2005/05/26 14:44:10 batt + *#* Abstract widget from layer: use context. + *#* + *#* Revision 1.1 2005/05/26 08:32:53 batt + *#* Add new Develer widget system :) + *#* + *#*/ + +#ifndef DT_EDITINT_H +#define DT_EDITINT_H + +#include
+#include
+#include + +#include +#include + + +#define EDIS_DEFAULT 0 +#define EDIS_CURSORLEFT BV(0) +#define EDIS_WRAP BV(1) + +/** Type for edit style */ +typedef uint16_t dstyle_t; + +typedef struct DEditInt +{ + DWidget widget; + + int *value; + int min; + int max; + dstyle_t style; + void (*draw)(struct DEditInt *); + +} DEditInt; + +void editint_init(DEditInt *e, dpos_t pos, dpos_t size, dcontext_t *context, int *value, int min, int max); +void editint_update(DEditInt *e, dtag_t tag, dval_t val); +void editint_draw(DEditInt *e); + +#endif diff --git a/2.5/bertos/emul/diskio_emul.c b/2.5/bertos/emul/diskio_emul.c new file mode 100644 index 00000000..d3470cac --- /dev/null +++ b/2.5/bertos/emul/diskio_emul.c @@ -0,0 +1,220 @@ +/** + * \file + * + * + * \brief Low level disk access for FatFs emulated. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +/*-----------------------------------------------------------------------*/ +/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2007 */ +/*-----------------------------------------------------------------------*/ + +#include +#include +#include +#include + +#define SECTOR_SIZE 512 + +static volatile DSTATUS Stat = STA_NOINIT; + +/** + * This is an example implementation, used to simulate the the calls to normal filesystem calls + * It only works for drive 0. + */ + + +/*-----------------------------------------------------------------------*/ +/* Inidialize a Drive */ + +static FILE *fake_disk = 0; + +DSTATUS disk_initialize ( + BYTE drv /* Physical drive nmuber (0..) */ +) +{ + if (drv) + return STA_NOINIT; /* Support only drive 0 */ + // XXX: pay attention here: some functions call disk_initialize *after* it has + // been initialized for the first time. + // Here we just return the status (that should always be ~STA_NOINIT after the first + // call) + if (fake_disk) + return Stat; + + const char *path = "emuldisk.dsk"; + fake_disk = fopen(path, "w+"); + int err = errno; + if (!fake_disk) + { + switch (err) + { + case EINVAL: + fprintf(stderr, "invalid mode\n"); + default: + return STA_NOINIT; + } + } + Stat &= ~STA_NOINIT; + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Return Disk Status */ + +DSTATUS disk_status ( + BYTE drv /* Physical drive nmuber (0..) */ +) +{ + if (drv) + return STA_NOINIT; /* Support only drive 0 */ + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ + +DRESULT disk_read ( + BYTE drv, /* Physical drive nmuber (0..) */ + BYTE *buff, /* Data buffer to store read data */ + DWORD sector, /* Sector address (LBA) */ + BYTE count /* Number of sectors to read (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + fseek(fake_disk, sector * SECTOR_SIZE, SEEK_SET); + size_t read_items = fread(buff, SECTOR_SIZE, count, fake_disk); + if (read_items == count) + return RES_OK; + else + { + if (feof(fake_disk)) + fprintf(stderr, "end-of-file\n"); + if (ferror(fake_disk)) + fprintf(stderr, "error\n"); + return RES_ERROR; + } +} + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ + +#if _READONLY == 0 +DRESULT disk_write ( + BYTE drv, /* Physical drive nmuber (0..) */ + const BYTE *buff, /* Data to be written */ + DWORD sector, /* Sector address (LBA) */ + BYTE count /* Number of sectors to write (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + if (Stat & STA_PROTECT) return RES_WRPRT; + + fseek(fake_disk, sector * SECTOR_SIZE, SEEK_SET); + size_t write_items = fwrite(buff, SECTOR_SIZE, count, fake_disk); + if (write_items == count) + return RES_OK; + else + { + if (feof(fake_disk)) + fprintf(stderr, "end-of-file\n"); + if (ferror(fake_disk)) + fprintf(stderr, "error\n"); + return RES_ERROR; + } +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ + +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive nmuber (0..) */ + BYTE ctrl, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + if (drv) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + switch (ctrl) + { + case GET_SECTOR_SIZE: + *(WORD*)buff = SECTOR_SIZE; + break; + case GET_SECTOR_COUNT: + *(DWORD*)buff = 65536; + break; + case GET_BLOCK_SIZE: + *(DWORD*)buff = 1; + break; + case CTRL_SYNC: + fflush(fake_disk); + break; + default: + return RES_PARERR; + } + return RES_OK; +} + +DWORD get_fattime(void) +{ + time_t tmp = time(0); + struct tm *t = localtime(&tmp); + DWORD tim = 0; + // seconds + tim |= (t->tm_sec / 2); + // min + tim |= (t->tm_min << 5); + // hour + tim |= (t->tm_hour << 11); + // month day (1..31) + tim |= (t->tm_mday << 16); + // month (1..12) + tim |= ((t->tm_mon + 1) << 21); + // year (0..127) + tim |= ((t->tm_year - 80) << 25); + return tim; +} + diff --git a/2.5/bertos/emul/emul.cpp b/2.5/bertos/emul/emul.cpp new file mode 100644 index 00000000..7e1da2ed --- /dev/null +++ b/2.5/bertos/emul/emul.cpp @@ -0,0 +1,105 @@ +/** + * \file + * + * + * \brief Qt-based emulator framework for embedded applications (implementation) + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#include "emul.h" +#include "emulwin.h" + +#include + +#include +#include // std::exit() + + +/// The global emulator instance. +Emulator *emul; + +Emulator::Emulator(int &argc, char **argv) : + emulApp(new QApplication(argc, argv)), + emulWin(new EmulWin(this)) +{ + emulWin->show(); +} + + +Emulator::~Emulator() +{ + // we don't delete emulWin because it automatically + // deletes itself when closed + delete emulApp; +} + + +NORETURN void Emulator::quit() +{ + // WHAT A KLUDGE! + this->~Emulator(); + emul = NULL; + + // do we have a better way to shut down the emulation? + exit(0); +} + +MOD_DEFINE(emul) + +/// Main emulator entry point. +extern "C" void emul_init(int *argc, char *argv[]) +{ + // setup global emulator pointer + emul = new Emulator(*argc, argv); + + MOD_INIT(emul); +} + +extern "C" void emul_cleanup() +{ + MOD_CLEANUP(emul); + + // Timer must be made inactive before we destroy the emulator + extern bool timer_initialized; + ASSERT(!timer_initialized); + + delete emul; + emul = NULL; +} + +extern "C" void emul_idle() +{ + // We process GUI events when the application is idle. + emul->emulApp->processEvents(); +} + diff --git a/2.5/bertos/emul/emul.h b/2.5/bertos/emul/emul.h new file mode 100644 index 00000000..f542a5bf --- /dev/null +++ b/2.5/bertos/emul/emul.h @@ -0,0 +1,101 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Qt-based emulator framework for embedded applications (interface) + */ + +/*#* + *#* $Log$ + *#* Revision 1.4 2006/02/15 09:11:17 bernie + *#* Add keyboard emulator. + *#* + *#* Revision 1.3 2006/01/23 23:12:08 bernie + *#* Let Doxygen see through C++ protected section. + *#* + *#* Revision 1.2 2006/01/16 03:51:51 bernie + *#* Fix boilerplate. + *#* + *#* Revision 1.1 2006/01/16 03:37:12 bernie + *#* Add emulator skeleton. + *#* + *#*/ + +#ifndef EMUL_EMUL_H +#define EMUL_EMUL_H + +#include + +#if defined(__cplusplus) || defined(__doxygen__) + +// fwd decls +class QApplication; +class EmulWin; +class EmulPRT; +class EmulLCD; +class EmulKbd; +class QCheckBox; +class QSlider; +class QLabel; + +class Emulator +{ +// data members +public: + QApplication *emulApp; ///< QT Application. + EmulWin *emulWin; ///< Main window. + + EmulLCD *emulLCD; ///< Display emulator. + EmulKbd *emulKbd; ///< Keyboard emulator. + +// construction + Emulator(int &argc, char **argv); + ~Emulator(); + +// public methods + void quit(); +}; + +extern Emulator *emul; + +#endif /* __cplusplus */ + +EXTERN_C void emul_init(int *argc, char *argv[]); +EXTERN_C void emul_cleanup(); +EXTERN_C void emul_idle(); + +#endif /* EMUL_EMUL_H */ + diff --git a/2.5/bertos/emul/emul.mk b/2.5/bertos/emul/emul.mk new file mode 100644 index 00000000..779d9220 --- /dev/null +++ b/2.5/bertos/emul/emul.mk @@ -0,0 +1,22 @@ +# +# Copyright 2007 Bernie Innocenti (http://www.codewiz.org/) +# All rights reserved. +# +# Author: Bernie Innocenti +# +# Qt configuration for BeRTOS emulator. Include it from +# your app Makefile fragment + +#On Darwin architecture environment variables need a different configuration. +ifeq ($(shell uname | grep -c "Darwin"),1) + EMUL_CFLAGS = -D'ARCH=(ARCH_EMUL|ARCH_QT)' -DQT_CLEAN_NAMESPACE + EMUL_LDFLAGS = -framework QtGui -framework QtCore + QT_MOC = /usr/bin/moc +#On other platforms. +else + EMUL_CFLAGS = -D'ARCH=(ARCH_EMUL|ARCH_QT)' $(shell pkg-config QtCore QtGui --cflags) -DQT_CLEAN_NAMESPACE + EMUL_LDFLAGS = $(shell pkg-config QtCore QtGui --libs) + QT_MOC = $(shell pkg-config QtCore --variable=moc_location) + #QT_UIC = $(shell pkg-config QtCore --variable=uic_location) +endif + diff --git a/2.5/bertos/emul/emulkbd.cpp b/2.5/bertos/emul/emulkbd.cpp new file mode 100644 index 00000000..7afc1f2a --- /dev/null +++ b/2.5/bertos/emul/emulkbd.cpp @@ -0,0 +1,231 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief QT-based widget for keyboard emulation (implementation) + */ + +#include "emulkbd.h" +#include "emul.h" + +#include +#include +#include +#include +#include +#include +#include +#include + + +EmulKey::EmulKey(EmulKbd *kbd, const char *label, int _keycode, int _row, int _col) : + QPushButton(label, kbd), + row(_row), col(_col), + keycode(_keycode) +{ + // don't let the widget get focus + setFocusPolicy(Qt::NoFocus); + + // unused + connect(this, SIGNAL(pressed()), this, SLOT(keyPressed())); + connect(this, SIGNAL(released()), this, SLOT(keyReleased())); +} + + +EmulKey::~EmulKey() +{ + // nop +} + + +/** + * Override standad QButton behaviour: we must also emit the signals. + */ +// unused +void EmulKey::setDown(bool enable) +{ + // let our superclass do everything else + QPushButton::setDown(enable); + + if (enable) + emit pressed(); + else + emit released(); +} + + +// unused +void EmulKey::keyPressed(void) +{ + static_cast(parent())->setKey(row, col, true); +} + + +// unused +void EmulKey::keyReleased(void) +{ + static_cast(parent())->setKey(row, col, false); +} + + +EmulKbd::EmulKbd(QWidget *parent, Qt::WFlags f) : + QFrame(parent, f), + layout(new QGridLayout(this)), + active_row(0) +{ + setFrameStyle(QFrame::Box | QFrame::Sunken); + setLineWidth(1); + setFocusPolicy(Qt::StrongFocus); + frame_width = frameWidth(); +} + + +EmulKbd::~EmulKbd() +{ + delete layout; +} + + +QSizePolicy EmulKbd::sizePolicy() const +{ + return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); +} + + +void EmulKbd::resizeEvent(QResizeEvent *event) +{ + // Let our superclass process the event first + QFrame::resizeEvent(event); +} + + +// handle key presses for all keys in keyboard +bool EmulKbd::event(QEvent *_e) +{ + switch (_e->type()) + { + case QEvent::KeyPress: + case QEvent::KeyRelease: + { + QKeyEvent *e = static_cast(_e); + int keycode = e->key(); + EmulKey *key; + + // ignore repeated keys + if (!e->isAutoRepeat()) + { + // scan all children + for (QObjectList::const_iterator it(children().begin()); it != children().end(); ++it) + { + // only keys, not other children! + if ((*it)->metaObject() == &EmulKey::staticMetaObject) + // if ((key = dynamic_cast(*it))) + { + key = static_cast(*it); + + // same key? + if (key->keycode == keycode) + { + // yes, tell key to go down (or up) + key->setDown(_e->type() == QEvent::KeyPress); + break; + } + } + } + } + return true; + } + + default: + // let superclass process this event + return QFrame::event(_e); + + } // end switch(_e->type()) +} + + +void EmulKbd::addKey(const char *label, int keycode, int row, int col, int matrix_row, int matrix_col) +{ + if (matrix_row == -1) + matrix_row = row; + if (matrix_col == -1) + matrix_col = col; + + layout->addWidget(new EmulKey(this, label, keycode, matrix_row, matrix_col), row, col); +} + + +// unused +void EmulKbd::setKey(int /*row*/, int /*col*/, bool /*on*/) +{ +} + + +void EmulKbd::setRow(int r) +{ + active_row = r; +} + +int EmulKbd::readCols(void) +{ + QLayoutItem *item; + EmulKey *key; + int cols = 0; + + for (int i = 0; (item = layout->itemAt(i)); ++i) + { + key = static_cast(item->widget()); + if (key->row == active_row) + { + if (key->isDown()) + cols |= (1<col); + } + } + return cols; +} + +extern "C" void emul_kbdSetRows(int r) +{ + emul->emulKbd->setRow(r); +} + + +extern "C" int emul_kbdReadCols(void) +{ + return emul->emulKbd->readCols(); +} + +#include "emulkbd_moc.cpp" diff --git a/2.5/bertos/emul/emulkbd.h b/2.5/bertos/emul/emulkbd.h new file mode 100644 index 00000000..9f3a32d1 --- /dev/null +++ b/2.5/bertos/emul/emulkbd.h @@ -0,0 +1,119 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief QT-based widget for leyboard emulation (interface) + */ + +#if !defined(EMULKBD_H) +#define EMULKBD_H + +#if defined (_MSC_VER) && (_MSC_VER > 1000) +#pragma once +#endif // _MSC_VER > 1000 + +#include + +// fwd decl +class QGridLayout; +class EmulKey; + +class EmulKbd : public QFrame +{ + Q_OBJECT + +// Data members +protected: + QGridLayout *layout; + int frame_width; + int active_row; + +// Construction +public: + EmulKbd(QWidget *parent = 0, Qt::WFlags f = 0); + virtual ~EmulKbd(); + +// Public methods + void addKey(const char *label, int keycode, int row, int col, int matrix_row = -1, int matrix_col = -1); + void setRow(int row); + int readCols(void); + +// Protected methods +protected: + void setKey(int row, int col, bool on); + +// Base class overrides +protected: + virtual QSizePolicy sizePolicy() const; + virtual void resizeEvent(QResizeEvent *e); + virtual bool event(QEvent *e); + +// Friends + friend class EmulKey; +}; + + +// Private helper class for EmulKbd +// NOTE: with protected inheritance, dynamic_cast<> does not work (gcc 2.96) +#include +class EmulKey : public QPushButton +{ + Q_OBJECT + +// Data members +protected: + int row, col; + int keycode; + +// Construction +public: + EmulKey(EmulKbd *parent, const char *label, int keycode, int _row, int _col); + virtual ~EmulKey(); + +// superclass overrides + void setDown(bool enable); + +protected slots: + void keyPressed(void); + void keyReleased(void); + +// Friends +public: + friend class EmulKbd; +}; + +#endif // !defined(EMULKBD_H) + diff --git a/2.5/bertos/emul/emulwin.cpp b/2.5/bertos/emul/emulwin.cpp new file mode 100644 index 00000000..c3c7c074 --- /dev/null +++ b/2.5/bertos/emul/emulwin.cpp @@ -0,0 +1,130 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Main Qt window for embedded applications emulator (implementation) + */ + +#include "emulwin.h" + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace Qt; + +EmulWin::EmulWin(Emulator *e) +{ + setWindowTitle(tr("BeRTOS Emul Demo")); + setAttribute(Qt::WA_DeleteOnClose); + + // Create the menu bar + QMenu *file_menu = menuBar()->addMenu(tr("&File")); + file_menu->addAction(tr("&Quit"), + e->emulApp, SLOT(closeAllWindows()), CTRL+Key_Q); + + menuBar()->addSeparator(); + + QMenu *help_menu = menuBar()->addMenu(tr("&Help")); + help_menu->addAction(tr("&About"), + this, SLOT(about()), Key_F1); + + // Make a central widget to contain the other widgets + QWidget *central = new QWidget(this); + setCentralWidget(central); + + // Create a layout to position the widgets + QHBoxLayout *box_main = new QHBoxLayout(central); + + // Main layout + QVBoxLayout *box_right = new QVBoxLayout(); + box_main->addLayout(box_right); + + // LCD + QHBoxLayout *lay_lcd = new QHBoxLayout(); + box_right->addLayout(lay_lcd); + lay_lcd->addStretch(1); + lay_lcd->addWidget(e->emulLCD = new EmulLCD(central), 8); + lay_lcd->addStretch(1); + + // Keyboard + box_right->addWidget(e->emulKbd = new EmulKbd(central)); + + // Setup keyboard: Label Keycode Row Col MRow MCol + e->emulKbd->addKey("^", Key_Up, 0, 0, 0, 0); + e->emulKbd->addKey("v", Key_Down, 1, 0, 0, 1); + e->emulKbd->addKey("OK", Key_Return, 0, 1, 0, 2); + e->emulKbd->addKey("ESC", Key_Escape, 1, 1, 0, 3); +} + + +EmulWin::~EmulWin() +{ + emul->quit(); +} + + +void EmulWin::closeEvent(QCloseEvent *ce) +{ + emul->quit(); + ce->accept(); +} + + +void EmulWin::about() +{ + QMessageBox::about(this, + "BeRTOS Embedded Application Emulator", + "Version 0.1\n" + "Copyright 2006, 2008 Develer S.r.l. (http://www.develer.com/)\n" + "Copyright 2001, 2002, 2003, 2005 Bernie Innocenti \n" + "All rights reserved." + ); +} + +#include "emulwin_moc.cpp" diff --git a/2.5/bertos/emul/emulwin.h b/2.5/bertos/emul/emulwin.h new file mode 100644 index 00000000..9d919505 --- /dev/null +++ b/2.5/bertos/emul/emulwin.h @@ -0,0 +1,82 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Main Qt window for embedded applications emulator (interface) + */ + +/*#* + *#* $Log$ + *#* Revision 1.4 2006/05/28 12:17:56 bernie + *#* Drop almost all the Qt3 cruft. + *#* + *#* Revision 1.3 2006/02/20 02:00:39 bernie + *#* Port to Qt 4.1. + *#* + *#* Revision 1.2 2006/01/16 03:51:51 bernie + *#* Fix boilerplate. + *#* + *#* Revision 1.1 2006/01/16 03:37:12 bernie + *#* Add emulator skeleton. + *#* + *#*/ + +#ifndef EMUL_EMULWIN_H +#define EMUL_EMULWIN_H + +#include + +// fwd decls +class Emulator; + +class EmulWin : public QMainWindow +{ + Q_OBJECT + +// construction +public: + EmulWin(Emulator *emul); + ~EmulWin(); + +protected: + void closeEvent(QCloseEvent *); + +private slots: + void about(); +}; + +#endif // EMUL_EMULWIN_H + diff --git a/2.5/bertos/emul/kfile_posix.c b/2.5/bertos/emul/kfile_posix.c new file mode 100644 index 00000000..1f09aaff --- /dev/null +++ b/2.5/bertos/emul/kfile_posix.c @@ -0,0 +1,104 @@ +/** + * \file + * + * + * \brief KFile interface implementation in Posix systems. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#include +#include + +static size_t kfile_posix_read(struct KFile *_fd, void *buf, size_t size) +{ + KFilePosix *fd = KFILEPOSIX_CAST(_fd); + return fread(buf, sizeof(uint8_t), size, fd->fp); +} + +static size_t kfile_posix_write(struct KFile *_fd, const void *buf, size_t size) +{ + KFilePosix *fd = KFILEPOSIX_CAST(_fd); + return fwrite(buf, sizeof(uint8_t), size, fd->fp); +} + +static kfile_off_t kfile_posix_seek(struct KFile *_fd, kfile_off_t offset, KSeekMode whence) +{ + KFilePosix *fd = KFILEPOSIX_CAST(_fd); + int std_whence; + switch (whence) + { + case KSM_SEEK_CUR: + std_whence = SEEK_CUR; + break; + case KSM_SEEK_END: + std_whence = SEEK_END; + break; + case KSM_SEEK_SET: + std_whence = SEEK_SET; + break; + default: + ASSERT(0); + return EOF; + } + int err = fseek(fd->fp, offset, std_whence); + if (err) + return err; + + return ftell(fd->fp); +} + +static int kfile_posix_close(struct KFile *_fd) +{ + KFilePosix *fd = KFILEPOSIX_CAST(_fd); + return fclose(fd->fp); +} + +static int kfile_posix_flush(struct KFile *_fd) +{ + KFilePosix *fd = KFILEPOSIX_CAST(_fd); + return fflush(fd->fp); +} + +FILE *kfile_posix_init(KFilePosix *file, const char *filename, const char *mode) +{ + memset(file, 0, sizeof(*file)); + DB(file->fd._type = KFT_KFILEPOSIX); + file->fd.read = kfile_posix_read; + file->fd.write = kfile_posix_write; + file->fd.close = kfile_posix_close; + file->fd.seek = kfile_posix_seek; + file->fd.flush = kfile_posix_flush; + + file->fp = fopen(filename, mode); + return file->fp; +} diff --git a/2.5/bertos/emul/kfile_posix.h b/2.5/bertos/emul/kfile_posix.h new file mode 100644 index 00000000..ba88ab78 --- /dev/null +++ b/2.5/bertos/emul/kfile_posix.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief KFile interface implementation in Posix systems. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef KFILE_POSIX_H +#define KFILE_POSIX_H + +#include +#include + +typedef struct KFilePosix +{ + KFile fd; + FILE *fp; +} KFilePosix; + +#define KFT_KFILEPOSIX MAKE_ID('K', 'F', 'T', 'P') + +INLINE KFilePosix *KFILEPOSIX_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_KFILEPOSIX); + return (KFilePosix *)fd; +} + +FILE *kfile_posix_init(KFilePosix *file, const char *filename, const char *mode); + +#endif /* KFILE_POSIX_H */ diff --git a/2.5/bertos/emul/ser_posix.c b/2.5/bertos/emul/ser_posix.c new file mode 100644 index 00000000..50a63ed7 --- /dev/null +++ b/2.5/bertos/emul/ser_posix.c @@ -0,0 +1,179 @@ +/** + * \file + * + * + * \brief Serial port emulator for hosted environments. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#include "cfg/cfg_ser.h" + +#include +#include + +#include +#include + +#include + +#include +#include + +#include /* open() */ +#include /* read(), write() */ + + +/* From the high-level serial driver */ +extern struct Serial ser_handles[SER_CNT]; + +/* TX and RX buffers */ +static unsigned char uart0_txbuffer[CONFIG_UART0_TXBUFSIZE]; +static unsigned char uart0_rxbuffer[CONFIG_UART0_RXBUFSIZE]; +static unsigned char uart1_txbuffer[CONFIG_UART1_TXBUFSIZE]; +static unsigned char uart1_rxbuffer[CONFIG_UART1_RXBUFSIZE]; + + +/** + * Internal state structure + */ +struct EmulSerial +{ + struct SerialHardware hw; + struct Serial *ser; + int fd; +}; + + +/* + * Callbacks + */ +static void uart_init(struct SerialHardware *_hw, struct Serial *ser) +{ + struct EmulSerial *hw = (struct EmulSerial *)_hw; + + hw->ser = ser; + hw->fd = open("/dev/ttyS0", O_RDWR); +} + +static void uart_cleanup(UNUSED_ARG(struct SerialHardware *, _hw)) +{ + struct EmulSerial *hw = (struct EmulSerial *)_hw; + + close(hw->fd); + hw->fd = -1; +} + +static void uart_txStart(struct SerialHardware * _hw) +{ + struct EmulSerial *hw = (struct EmulSerial *)_hw; + + while(!fifo_isempty(&hw->ser->txfifo)) + { + char c = fifo_pop(&hw->ser->txfifo); + write(hw->fd, &c, 1); + } +} + +static bool uart_txSending(UNUSED_ARG(struct SerialHardware *, _hw)) +{ + return false; +} + + +static void uart_setBaudrate(UNUSED_ARG(struct SerialHardware *, _hw), unsigned long rate) +{ + TRACEMSG("rate=%lu", rate); + // TODO + +} + +static void uart_setParity(UNUSED_ARG(struct SerialHardware *, _hw), int parity) +{ + TRACEMSG("parity=%d", parity); + // TODO +} + +// FIXME: move into compiler.h? Ditch? +#if COMPILER_C99 + #define C99INIT(name,val) .name = val +#elif defined(__GNUC__) + #define C99INIT(name,val) name: val +#else + #warning No designated initializers, double check your code + #define C99INIT(name,val) (val) +#endif + +/* + * High-level interface data structures. + */ +static const struct SerialHardwareVT uart_vtable = +{ + C99INIT(init, uart_init), + C99INIT(cleanup, uart_cleanup), + C99INIT(setBaudrate, uart_setBaudrate), + C99INIT(setParity, uart_setParity), + C99INIT(txStart, uart_txStart), + C99INIT(txSending, uart_txSending), +}; + +static struct EmulSerial UARTDescs[SER_CNT] = +{ + { + C99INIT(hw, /**/) { + C99INIT(table, &uart_vtable), + C99INIT(txbuffer, uart0_txbuffer), + C99INIT(rxbuffer, uart0_rxbuffer), + C99INIT(txbuffer_size, sizeof(uart0_txbuffer)), + C99INIT(rxbuffer_size, sizeof(uart0_rxbuffer)), + }, + C99INIT(ser, NULL), + C99INIT(fd, -1), + }, + { + C99INIT(hw, /**/) { + C99INIT(table, &uart_vtable), + C99INIT(txbuffer, uart1_txbuffer), + C99INIT(rxbuffer, uart1_rxbuffer), + C99INIT(txbuffer_size, sizeof(uart1_txbuffer)), + C99INIT(rxbuffer_size, sizeof(uart1_rxbuffer)), + }, + C99INIT(ser, NULL), + C99INIT(fd, -1), + }, +}; + +struct SerialHardware *ser_hw_getdesc(int unit) +{ + ASSERT(unit < SER_CNT); + return &UARTDescs[unit].hw; +} diff --git a/2.5/bertos/emul/switch.S b/2.5/bertos/emul/switch.S new file mode 100644 index 00000000..110d62f5 --- /dev/null +++ b/2.5/bertos/emul/switch.S @@ -0,0 +1,2 @@ +#warning This file is deprecated, use switch_ctx_emul.S +#include "switch_ctx_emul.S" diff --git a/2.5/bertos/emul/switch_ctx_emul.S b/2.5/bertos/emul/switch_ctx_emul.S new file mode 100644 index 00000000..50567d19 --- /dev/null +++ b/2.5/bertos/emul/switch_ctx_emul.S @@ -0,0 +1,10 @@ +#if defined(__i386__) + #include "switch_i386.S" +#elif defined(__x86_64__) + #include "switch_x86_64.s" +#elif defined(_ARCH_PPC) || defined(_ARCH_PPC64) + #include "switch_ppc.S" +#else + #error Unknown CPU +#endif + diff --git a/2.5/bertos/emul/switch_i386.S b/2.5/bertos/emul/switch_i386.S new file mode 100644 index 00000000..abcb487b --- /dev/null +++ b/2.5/bertos/emul/switch_i386.S @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \version $Id$ + * \author Bernie Innocenti + * + * \brief i386 context switch + * + * x86 function calling convention: + * -------------------------------- + * arguments | callee-saved | extra caller-saved | return + * [callee-clobbered] | | [callee-clobbered] | + * ------------------------------------------------------------------------- + * eax edx ecx | ebx edi esi ebp [*] | | eax, edx + * + * [*] In the frame-pointers case rbp must hold a base address for the + * current stack frame. + * + * asm_switch_context() can be considered as a normal function call, so we need + * to save all the callee-clobbered registers minus the return registers. + */ + +#ifdef __APPLE__ + // This workaround is necessary to compile under OS X assembler. + #define SWITCH_CONTEXT _asm_switch_context +#else + #define SWITCH_CONTEXT asm_switch_context +#endif + +/* void asm_switch_context(void ** new_sp [sp+4], void ** save_sp [sp+8]) */ +.globl SWITCH_CONTEXT +SWITCH_CONTEXT: + pushl %ebp + pushl %ecx + movl 0x10(%esp),%ebp /* ebp = save_sp */ + movl %esp,(%ebp) /* *save_sp = esp */ + movl 0x0c(%esp),%ebp /* ebp = new_sp */ + movl (%ebp),%esp /* esp = *new_sp */ + popl %ecx + popl %ebp + ret diff --git a/2.5/bertos/emul/switch_ppc.S b/2.5/bertos/emul/switch_ppc.S new file mode 100644 index 00000000..082efa8e --- /dev/null +++ b/2.5/bertos/emul/switch_ppc.S @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \version $Id: switch_i386.S 1578 2008-08-08 10:54:40Z bernie $ + * \author Bernie Innocenti + * + * \brief PowerPC context switch + */ + +#ifdef __APPLE__ + //This workaround is necessary to compile under OS X assembler. + #define SWITCH_CONTEXT _asm_switch_context +#else + #define SWITCH_CONTEXT asm_switch_context +#endif + +.balign 4 + +/* void asm_switch_context(void ** new_sp, void ** save_sp) */ +/* r3 r4 */ +.globl SWITCH_CONTEXT +SWITCH_CONTEXT: + mflr 0 /* r0 = lr */ + stw 0,8(1) /* store lr at *(sp+8) */ + stw 1,0(4) /* *save_sp = sp */ + lwz 1,0(3) /* sp = *new_sp */ + lwz 0,8(1) /* retrieve lr from *(sp+8) */ + mtlr 0 /* lr = r0 */ + blr /* return */ diff --git a/2.5/bertos/emul/switch_win32.s b/2.5/bertos/emul/switch_win32.s new file mode 100644 index 00000000..c258f6ef --- /dev/null +++ b/2.5/bertos/emul/switch_win32.s @@ -0,0 +1,82 @@ +/** + * \file + * + * + * \version $Id$ + * \author Bernie Innocenti + * + * \brief i386 context switch for WIN32 + */ + +!!!!!! THIS FILE HAS NOT BEEN REVISED FOR THE NEW SCHEDULER API !!!!!! + +__declspec(naked) void AsmSwitchContext(void * new_sp, void ** save_sp) +{ + __asm + { + push eax + push ebx + push ecx + push edx + push esi + push edi + push ebp + mov ebp,dword ptr [esp+24h] ; ebp <- save_sp + mov dword ptr [ebp],esp ; *save_sp = esp + mov esp,dword ptr [esp+20h] ; new_sp + pop ebp + pop edi + pop esi + pop edx + pop ecx + pop ebx + pop eax + ret + } +} + +__declspec(naked) void AsmReplaceContext(void * new_sp, void ** dummy) +{ + __asm + { + mov esp,dword ptr [esp + 4] ; new_sp + pop ebp + pop edi + pop esi + pop edx + pop ecx + pop ebx + pop eax + ret + } +} + diff --git a/2.5/bertos/emul/switch_x86_64.s b/2.5/bertos/emul/switch_x86_64.s new file mode 100644 index 00000000..df12bed1 --- /dev/null +++ b/2.5/bertos/emul/switch_x86_64.s @@ -0,0 +1,73 @@ +/** + * \file + * + * + * \version $Id$ + * \author Bernie Innocenti + * + * \brief x86_64 context switch + * + * x86_64 function call convention: + * -------------------------------- + * arguments | callee-saved | extra caller-saved | return + * [callee-clobbered] | | [callee-clobbered] | + * ------------------------------------------------------------------------- + * rdi rsi rdx rcx r8-9 | rbx rbp [*] r12-15 | r10-11 | rax, rdx + * + * [*] In the frame-pointers case rbp must hold a base address for the + * current stack frame. + * + * asm_switch_context() can be considered as a normal function call, so we need + * to save all the callee-clobbered registers minus the return registers. + */ + +/* void asm_switch_context(void **new_sp [%rdi], void **save_sp [%rsi]) */ +.globl asm_switch_context +asm_switch_context: + pushq %rbp + pushq %rdi + pushq %rsi + pushq %rcx + pushq %r8 + pushq %r9 + pushq %r10 + pushq %r11 + movq %rsp,(%rsi) /* *save_sp = rsp */ + movq (%rdi),%rsp /* rsp = *new_sp */ + popq %r11 + popq %r10 + popq %r9 + popq %r8 + popq %rcx + popq %rsi + popq %rdi + popq %rbp + ret diff --git a/2.5/bertos/emul/timer_posix.c b/2.5/bertos/emul/timer_posix.c new file mode 100644 index 00000000..70990a21 --- /dev/null +++ b/2.5/bertos/emul/timer_posix.c @@ -0,0 +1,93 @@ +/** + * \file + * + * + * \brief Low-level timer module for Qt emulator (implementation). + * + * \version $Id$ + * \author Bernie Innocenti + */ +//#include // hptime.t +#include +#include // irq_register() + +#if !CONFIG_KERN_IRQ +#include // sigaction() +#include // memset() +#endif +#include // setitimer() + + +// Forward declaration for the user interrupt server routine. +void timer_isr(int); + +/// HW dependent timer initialization. +static void timer_hw_init(void) +{ + #if CONFIG_KERN_IRQ + irq_register(SIGALRM, (void (*)(void))timer_isr); + #else // ! CONFIG_KERN_IRQ + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + + // Setup interrupt callback + sa.sa_handler = timer_isr; + sigemptyset(&sa.sa_mask); + sigaddset(&sa.sa_mask, SIGALRM); + sa.sa_flags = SA_RESTART; + sigaction(SIGALRM, &sa, NULL); + #endif // CONFIG_KERN_IRQ + + // Setup POSIX realtime timer to interrupt every 1/TIMER_TICKS_PER_SEC. + static const struct itimerval itv = + { + { 0, 1000000 / TIMER_TICKS_PER_SEC }, /* it_interval */ + { 0, 1000000 / TIMER_TICKS_PER_SEC } /* it_value */ + }; + setitimer(ITIMER_REAL, &itv, NULL); +} + +static void timer_hw_cleanup(void) +{ + static const struct itimerval itv = + { + { 0, 0 }, /* it_interval */ + { 0, 0 } /* it_value */ + }; + setitimer(ITIMER_REAL, &itv, NULL); + signal(SIGALRM, SIG_DFL); +} + +INLINE hptime_t timer_hw_hpread(void) +{ + return hptime_get(); +} + +#define timer_hw_triggered() (true) diff --git a/2.5/bertos/emul/timer_posix.h b/2.5/bertos/emul/timer_posix.h new file mode 100644 index 00000000..e782da6e --- /dev/null +++ b/2.5/bertos/emul/timer_posix.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Low-level timer module for POSIX systems (interface). + */ +#ifndef DRV_TIMER_POSIX_H +#define DRV_TIMER_POSIX_H + +// HW dependent timer initialization + +#define DEFINE_TIMER_ISR DECLARE_ISR_CONTEXT_SWITCH(timer_isr) + +/** Most Linux kernels can't do better than this (CONFIG_HZ=250). */ +#define TIMER_TICKS_PER_SEC 250 + +#define TIMER_HW_CNT (1<<31) /* We assume 32bit integers here */ + +#include + +/// Frequency of the hardware high-precision timer. +#define TIMER_HW_HPTICKS_PER_SEC HPTIME_TICKS_PER_SECOND + +/// Not needed. +#define timer_hw_irq() do {} while (0) + +#endif /* DRV_TIMER_POSIX_H */ diff --git a/2.5/bertos/emul/timer_qt.c b/2.5/bertos/emul/timer_qt.c new file mode 100644 index 00000000..0b24178d --- /dev/null +++ b/2.5/bertos/emul/timer_qt.c @@ -0,0 +1,156 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Low-level timer module for Qt emulator (implementation). + */ +#include /* hptime.t */ + +// Qt headers +#include +#include + +#if CONFIG_KERN_IRQ +#include +#endif + + +// The user interrupt server routine +void timer_isr(void); + + +/** + * Singleton class for Qt-based hardware timer emulation. + */ +class EmulTimer : public QObject +{ +private: + Q_OBJECT; + + /// System timer (counts ms since application startup) + QTime system_time; + + /// The 1ms "hardware" tick counter. + QTimer timer; + + /** + * We deliberately don't use RAII because the real hardware + * we're simulating needs to be initialized manually. + */ + bool initialized; + + /// Private ctor (singleton) + EmulTimer() : initialized(false) { } + +public: + /// Return singleton instance + static EmulTimer &instance() + { + static EmulTimer et; + return et; + } + + /// Start timer emulator. + void init() + { + // Timer initialized twice? + ASSERT(!initialized); + + // Record initial time + system_time.start(); + + #if CONFIG_KERN_IRQ + irq_register(SIGALRM, timer_isr); + #endif + + // Activate timer interrupt + connect(&timer, SIGNAL(timeout()), SLOT(timerInterrupt())); + timer.start(1000 / TIMER_TICKS_PER_SEC); + + initialized = true; + } + + void cleanup() + { + // Timer cleaned twice? + ASSERT(initialized); + + timer.stop(); + timer.disconnect(); + + initialized = false; + } + + /// Return current time in high-precision format. + hptime_t hpread() + { + ASSERT(initialized); + return system_time.elapsed(); + } + +public slots: + void timerInterrupt(void) + { + // Just call user interrupt server, timer restarts automatically. + #if CONFIG_KERN_IRQ + irq_entry(SIGALRM); + #else + timer_isr(); + #endif + } + +}; + +#include "timer_qt_moc.cpp" + + +/// HW dependent timer initialization. +static void timer_hw_init(void) +{ + EmulTimer::instance().init(); +} + +static void timer_hw_cleanup(void) +{ + EmulTimer::instance().cleanup(); +} + +INLINE hptime_t timer_hw_hpread(void) +{ + return EmulTimer::instance().hpread(); +} + +/** Not needed, timer IRQ handler called only for timer source */ +#define timer_hw_triggered() (true) diff --git a/2.5/bertos/emul/timer_qt.h b/2.5/bertos/emul/timer_qt.h new file mode 100644 index 00000000..1f37c6c9 --- /dev/null +++ b/2.5/bertos/emul/timer_qt.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Low-level timer module for Qt emulator (interface). + */ +#ifndef DRV_TIMER_QT_H +#define DRV_TIMER_QT_H + +// HW dependent timer initialization + +#define DEFINE_TIMER_ISR DECLARE_ISR_CONTEXT_SWITCH(timer_isr) +#define TIMER_TICKS_PER_SEC 250 +#define TIMER_HW_CNT (1<<31) /* We assume 32bit integers here */ + +/// Type of time expressed in ticks of the hardware high-precision timer. +typedef unsigned int hptime_t; +#define SIZEOF_HPTIME_T 4 + +/// Frequency of the hardware high-precision timer. +#define TIMER_HW_HPTICKS_PER_SEC 1000 + +/// Not needed. +#define timer_hw_irq() do {} while (0) + +#endif /* DRV_TIMER_QT_H */ diff --git a/2.5/bertos/fonts/convbdf b/2.5/bertos/fonts/convbdf new file mode 100755 index 00000000..1e9e97e6 --- /dev/null +++ b/2.5/bertos/fonts/convbdf @@ -0,0 +1,209 @@ +#! /usr/bin/perl -w +# +# Convert BDF files to nano-X font files +# modified by G Haerr from bdftobogl for 16 bit MWIMAGEBITS +# modified on 2/10/00 by K Harris to accept any size input character +# modified on 3/26/00 by G Haerr added ascent field, fixed $IMAGE_BITS +# modified on 2/15/06 by for DevLib. +# originally from BOGL - Ben's Own Graphics Library . +# + +use POSIX; + +if ($#ARGV < 0) { + print "Usage: convbdf font.bdf > font.c\n"; + exit -1; +} + +$LAST_CHAR = 0xff; +$IMAGE_BITS = 8; +$IMAGE_NIBBLES = $IMAGE_BITS/4; +$IMAGE_MASK = 0xff; +$IMAGE_VERTICAL = 1; + +$file = $ARGV[0]; + +$font = $file; +$font =~ s#.*/##; # remove path name +$font =~ s/\.bdf//; +$font =~ tr/a-zA-Z0-9_/_/cs; + +print "/* Generated by convbdf on ", substr(`date`, 0, -1), ". */\n"; +print "#include \n\n"; + +open BDF, "<$file" || die; +while () { + chop; + $pixel_size = $1 if /^PIXEL_SIZE (\d+)$/; + $font_ascent = $1 if /^FONT_ASCENT (\d+)$/; + $font_descent = $1 if /^FONT_DESCENT (\d+)$/; + $font_name = $1 if /^FONT (.*)$/; + $default_char = $1 if /^DEFAULT_CHAR (\d+)$/; + + last if /^CHARS /; +} + +print "/* Font information:\n\n"; +print " name: $font_name\n"; +print " pixel size: $pixel_size\n"; +print " ascent: $font_ascent\n"; +print " descent: $font_descent\n"; +print "*/\n\n"; + +print "/* Font character bitmap data. */\n"; +print "static const PROGMEM uint8_t font_${font}_glyphs[] = {\n"; + +$ch_height = $font_ascent + $font_descent; +$ofs = 0; +$maxwidth = 0; +$proportional = 0; +$firstchar = -1; +while () { + chop; + undef $encoding, undef $width, undef $bbx, undef $bby, undef $bbw, undef $bbh if /^STARTCHAR /; + $encoding = $1 if /^ENCODING (\d+)/; + last if defined $encoding && $encoding > $LAST_CHAR; + $width = $1 if /^DWIDTH (-?\d+)/; + ($bbw, $bbh, $bbx, $bby) = ($1, $2, $3, $4) if /^BBX (-?\d+) (-?\d+) (-?\d+) (-?\d+)/; + + if (/^BITMAP$/) { + next if !defined $encoding; + $firstchar = $encoding if $firstchar < 0; + $encoding_tab[$encoding] = $ofs; + $width -= $bbx, $bbx = 0 if $bbx < 0; + $width[$encoding] = $width; + $maxwidth != 0 and $width != $maxwidth and $proportional = 1; + $maxwidth = $width if $width > $maxwidth; + $ch_words = int (($width+$IMAGE_BITS-1)/$IMAGE_BITS); + $ch_bits = $ch_words*$IMAGE_BITS; + for (my $i = 0; $i < $ch_height; $i++) { + for (my $k = 0; $k < $ch_words; $k++) { + $bm[$i][$k] = 0; + } + } + for (my $i = 0; ; $i++) { + $_ = ; + chop; + last if /^ENDCHAR$/; + + @hexnibbles = split //,$_; + for (my $k=0; $k<$ch_words; $k++) { + $ndx = $k*$IMAGE_NIBBLES; + $padnibbles = @hexnibbles - $ndx; + # if bbx pushes bits into next word + # and no more bits from bdf file + last if $padnibbles <= 0; + $padnibbles = 0 if $padnibbles >= $IMAGE_NIBBLES; + $value = hex join '',@hexnibbles[$ndx..($ndx+$IMAGE_NIBBLES-1-$padnibbles)]; + $value = $value << ($padnibbles*$IMAGE_NIBBLES); + $bm[$ch_height - $font_descent - $bby - $bbh + $i][$k] |= + $value >> ($bbx); + if ($bbx) { # handle overflow into next image_word + $bm[$ch_height - $font_descent - $bby - $bbh + $i][$k+1] = + ($value << ($IMAGE_BITS - $bbx)) & $IMAGE_MASK; + } + } + } + + # GLYPH PREVIEW +### printf "\n/* Character %c (0x%02x): ", $encoding, $encoding; + printf "\n/* Character (0x%02x): ", $encoding; + print "bbw=$bbw, bbh=$bbh, bbx=$bbx, bby=$bby, width=$width */\n"; + + # GLYPH DATA + if ($IMAGE_VERTICAL) { + my $bitstring = ""; + for (my $k = 0; $k < int(($ch_height + $IMAGE_BITS - 1) / $IMAGE_BITS); $k++) { + for (my $x = 0; $x < $width; $x++) { + my $v = 0; + for (my $y = 0; $y < $IMAGE_BITS && ($y + $k * $IMAGE_BITS < $ch_height); ++$y) { + my $bit = ($bm[$k * $IMAGE_BITS + $y][int($x / $IMAGE_BITS)] & (1 << ($IMAGE_BITS - ($x % $IMAGE_BITS) - 1))) ? 1 : 0; + $bitstring .= $bit ? '*' : ' '; + $v |= $bit << $y; + } + $ofs++; + printf "0x%02x, ", $v; + } + # Preview + printf "/* $bitstring */\n"; + } + + } + else { # IMAGE_HORIZONTAL + + # Preview + print " +", ("-" x $ch_bits), "+\n"; + for (my $i = 0; $i < $ch_height; $i++) { + print " |"; + for (my $k = 0; $k < $ch_words; $k++) { + for (my $j = $IMAGE_BITS - 1; $j >= 0; $j--) { + print $bm[$i][$k] & (1 << $j) ? "*" : " "; + } + } + print "|\n"; + } + print " +", ("-" x $ch_bits), "+ */\n"; + + for (my $i = 0; $i < $ch_height; $i++) { + for (my $k=0; $k<$ch_words; $k++) { + $ofs++; + printf "0x%02x, ", $bm[$i][$k]; + } + printf "\n"; + } + } + } +} + +print "};\n\n"; + +#print STDERR "Maximum character width=$maxwidth\n"; + +if ($proportional) { + print "/* Character->glyph data. */\n"; + print "static const PROGMEM uint16_t ${font}_offset[] = {\n"; + for (my $i = $firstchar; $i <= $LAST_CHAR; $i++) { + my $char = $i; + my $ofs = $encoding_tab[$i]; + $ofs = $encoding_tab[$default_char], $char = $default_char if !defined $ofs; + ### printf " $ofs,\t/* %c (0x%02x) */\n", $char, $i; + printf " $ofs,\t/* (0x%02x) */\n", $i; + } + print "};\n\n"; + + print "/* Character width data. */\n"; + print "static const PROGMEM uint8_t ${font}_width[] = {\n"; + for (my $i = $firstchar; $i <= $LAST_CHAR; $i++) { + my $char = $i; + my $width = $width[$i]; + $width = $width[$default_char], $char = $default_char if !defined $encoding_tab[$i]; + ### printf " $width,\t/* %c (0x%02x) */\n", $char, $i; + printf " $width,\t/* (0x%02x) */\n", $i; + } + print "};\n\n"; + + $font_offset = "${font}_offset"; + $font_width = "${font}_width"; +} else { + $font_offset = "NULL"; + $font_width = "NULL"; +} + +$lastchar = $LAST_CHAR; +#$size = $lastchar - $firstchar + 1; + +print < + * + * --> + * + * \brief Font 8x6 IBM-PC 8bit + * + * \version $Id$ + * + * \author Bernie Innocenti + * + */ + +#include + +static const PROGMEM uint8_t default_font_glyphs[256 * 6] = +{ +/* 0x00 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ + 0x3E, 0x45, 0x51, 0x45, 0x3E, 0x00, /* */ + 0x3E, 0x7B, 0x6F, 0x7B, 0x3E, 0x00, /* */ + 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, /* */ + 0x08, 0x1C, 0x3E, 0x1C, 0x08, 0x00, /* */ + 0x18, 0x5A, 0x67, 0x5A, 0x18, 0x00, /* */ + 0x0C, 0x5E, 0x6F, 0x5E, 0x0C, 0x00, /* */ + 0x08, 0x1C, 0x3E, 0x1C, 0x08, 0x00, /* */ +/* 0x08 */ + 0x77, 0x63, 0x41, 0x63, 0x77, 0x00, /* */ + 0x18, 0x3C, 0x66, 0x3C, 0x18, 0x00, /* */ + 0x77, 0x63, 0x41, 0x63, 0x77, 0x00, /* */ + 0x20, 0x50, 0x5A, 0x56, 0x2E, 0x00, /* */ + 0x06, 0x29, 0x79, 0x29, 0x06, 0x00, /* */ + 0x60, 0x60, 0x7F, 0x05, 0x07, 0x00, /* */ + 0x18, 0x1F, 0x01, 0x61, 0x7F, 0x00, /* */ + 0x15, 0x0E, 0x1B, 0x0E, 0x15, 0x00, /* */ +/* 0x10 */ + 0x00, 0x08, 0x1C, 0x3E, 0x08, 0x08, /* */ + 0x7F, 0x3E, 0x1C, 0x08, 0x00, 0x00, /* */ + 0x14, 0x36, 0x7F, 0x36, 0x14, 0x00, /* */ + 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, /* */ + 0x02, 0x05, 0x7F, 0x01, 0x7F, 0x00, /* */ + 0x20, 0x4A, 0x55, 0x29, 0x02, 0x00, /* */ + 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, /* */ + 0x54, 0x76, 0x7F, 0x76, 0x54, 0x00, /* */ +/* 0x18 */ + 0x08, 0x0C, 0x7E, 0x0C, 0x08, 0x00, /* */ + 0x10, 0x30, 0x7E, 0x30, 0x10, 0x00, /* */ + 0x08, 0x08, 0x3E, 0x1C, 0x08, 0x00, /* */ + 0x08, 0x1C, 0x3E, 0x08, 0x08, 0x00, /* */ + 0x1C, 0x10, 0x10, 0x10, 0x10, 0x00, /* */ + 0x08, 0x1C, 0x08, 0x1C, 0x08, 0x00, /* */ + 0x18, 0x1C, 0x1E, 0x1C, 0x18, 0x00, /* */ + 0x0C, 0x1C, 0x3C, 0x1C, 0x0C, 0x00, /* */ +/* 0x20 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ + 0x00, 0x00, 0x4F, 0x00, 0x00, 0x00, /* ! */ + 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, /* " */ + 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, /* # */ + 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, /* $ */ + 0x63, 0x13, 0x08, 0x64, 0x63, 0x00, /* % */ + 0x36, 0x49, 0x55, 0x22, 0x50, 0x00, /* & */ + 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, /* ' */ +/* 0x28 */ + 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, /* ( */ + 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, /* ) */ + 0x14, 0x08, 0x3E, 0x08, 0x14, 0x00, /* * */ + 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, /* + */ + 0x00, 0x50, 0x30, 0x00, 0x00, 0x00, /* , */ + 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, /* - */ + 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, /* . */ + 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, /* / */ +/* 0x30 */ + 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, /* 0 */ + 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, /* 1 */ + 0x62, 0x51, 0x49, 0x49, 0x46, 0x00, /* 2 */ + 0x21, 0x41, 0x45, 0x4B, 0x31, 0x00, /* 3 */ + 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, /* 4 */ + 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, /* 5 */ + 0x3C, 0x4A, 0x49, 0x49, 0x30, 0x00, /* 6 */ + 0x01, 0x71, 0x09, 0x05, 0x03, 0x00, /* 7 */ +/* 0x38 */ + 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, /* 8 */ + 0x06, 0x49, 0x49, 0x29, 0x1E, 0x00, /* 9 */ + 0x00, 0x36, 0x36, 0x00, 0x00, 0x00, /* : */ + 0x00, 0x56, 0x36, 0x00, 0x00, 0x00, /* ; */ + 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, /* < */ + 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, /* = */ + 0x00, 0x41, 0x22, 0x14, 0x08, 0x00, /* > */ + 0x02, 0x01, 0x51, 0x09, 0x06, 0x00, /* ? */ +/* 0x40 */ + 0x32, 0x49, 0x79, 0x41, 0x3E, 0x00, /* @ */ + 0x7E, 0x09, 0x09, 0x09, 0x7E, 0x00, /* A */ + 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, /* B */ + 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, /* C */ + 0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00, /* D */ + 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, /* E */ + 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, /* F */ + 0x3E, 0x41, 0x49, 0x49, 0x7A, 0x00, /* G */ +/* 0x48 */ + 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, /* H */ + 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, /* I */ + 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, /* J */ + 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, /* K */ + 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, /* L */ + 0x7F, 0x02, 0x0C, 0x02, 0x7F, 0x00, /* M */ + 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, /* N */ + 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, /* O */ +/* 0x50 */ + 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, /* P */ + 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, /* Q */ + 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, /* R */ + 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, /* S */ + 0x01, 0x01, 0x7F, 0x01, 0x01, 0x00, /* T */ + 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, /* U */ + 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, /* V */ + 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, /* W */ +/* 0x58 */ + 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, /* X */ + 0x07, 0x08, 0x70, 0x08, 0x07, 0x00, /* Y */ + 0x61, 0x51, 0x49, 0x45, 0x43, 0x00, /* Z */ + 0x00, 0x7F, 0x41, 0x41, 0x00, 0x00, /* [ */ + 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, /* \ */ + 0x00, 0x41, 0x41, 0x7F, 0x00, 0x00, /* ] */ + 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, /* ^ */ + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, /* _ */ +/* 0x60 */ + 0x00, 0x01, 0x02, 0x04, 0x00, 0x00, /* ` */ + 0x00, 0x74, 0x54, 0x54, 0x78, 0x00, /* a */ + 0x7F, 0x44, 0x44, 0x44, 0x38, 0x00, /* b */ + 0x38, 0x44, 0x44, 0x44, 0x28, 0x00, /* c */ + 0x38, 0x44, 0x44, 0x44, 0x7F, 0x00, /* d */ + 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, /* e */ + 0x08, 0x7E, 0x09, 0x01, 0x02, 0x00, /* f */ + 0x08, 0x54, 0x54, 0x54, 0x3C, 0x00, /* g */ +/* 0x68 */ + 0x7F, 0x04, 0x04, 0x04, 0x78, 0x00, /* h */ + 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, /* i */ + 0x20, 0x40, 0x44, 0x3D, 0x00, 0x00, /* j */ + 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, /* k */ + 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, /* l */ + 0x7C, 0x04, 0x18, 0x04, 0x78, 0x00, /* m */ + 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, /* n */ + 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, /* o */ +/* 0x70 */ + 0x7C, 0x14, 0x14, 0x14, 0x08, 0x00, /* p */ + 0x08, 0x14, 0x14, 0x14, 0x7C, 0x00, /* q */ + 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, /* r */ + 0x48, 0x54, 0x54, 0x54, 0x24, 0x00, /* s */ + 0x04, 0x3F, 0x44, 0x40, 0x20, 0x00, /* t */ + 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, /* u */ + 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, /* v */ + 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, /* w */ +/* 0x78 */ + 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, /* x */ + 0x0C, 0x50, 0x50, 0x50, 0x3C, 0x00, /* y */ + 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, /* z */ + 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, /* { */ + 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, /* | */ + 0x00, 0x41, 0x36, 0x08, 0x00, 0x00, /* } */ + 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, /* ~ */ + 0x70, 0x48, 0x44, 0x48, 0x70, 0x00, /*  */ +/* 0x80 */ + 0x38, 0xC4, 0xC4, 0x44, 0x28, 0x00, /* € */ + 0x3A, 0x40, 0x40, 0x20, 0x7A, 0x00, /*  */ + 0x38, 0x54, 0x54, 0x55, 0x19, 0x00, /* ‚ */ + 0x22, 0x55, 0x55, 0x55, 0x78, 0x00, /* ƒ */ + 0x20, 0x55, 0x54, 0x54, 0x79, 0x00, /* „ */ + 0x21, 0x75, 0x55, 0x54, 0x78, 0x00, /* … */ + 0x20, 0x74, 0x57, 0x54, 0x78, 0x00, /* † */ + 0x08, 0x54, 0x54, 0x74, 0x14, 0x00, /* ‡ */ +/* 0x88 */ + 0x3A, 0x55, 0x55, 0x55, 0x1A, 0x00, /* ˆ */ + 0x39, 0x54, 0x54, 0x55, 0x18, 0x00, /* ‰ */ + 0x39, 0x55, 0x55, 0x54, 0x18, 0x00, /* Š */ + 0x00, 0x45, 0x7C, 0x41, 0x00, 0x00, /* ‹ */ + 0x02, 0x45, 0x7D, 0x42, 0x00, 0x00, /* Œ */ + 0x01, 0x45, 0x7D, 0x40, 0x00, 0x00, /*  */ + 0x79, 0x14, 0x12, 0x14, 0x79, 0x00, /* Ž */ + 0x70, 0x2B, 0x2B, 0x2B, 0x70, 0x00, /*  */ +/* 0x90 */ + 0x7C, 0x54, 0x55, 0x55, 0x45, 0x00, /*  */ + 0x20, 0x54, 0x38, 0x54, 0x48, 0x00, /* ‘ */ + 0x7E, 0x09, 0x7F, 0x49, 0x49, 0x00, /* ’ */ + 0x32, 0x49, 0x49, 0x49, 0x32, 0x00, /* “ */ + 0x32, 0x48, 0x48, 0x48, 0x32, 0x00, /* ” */ + 0x32, 0x4A, 0x4A, 0x48, 0x30, 0x00, /* • */ + 0x3A, 0x41, 0x41, 0x21, 0x7A, 0x00, /* – */ + 0x3A, 0x42, 0x42, 0x20, 0x78, 0x00, /* — */ +/* 0x98 */ + 0x0D, 0x50, 0x50, 0x50, 0x3D, 0x00, /* ˜ */ + 0x19, 0x24, 0x42, 0x24, 0x19, 0x00, /* ™ */ + 0x3D, 0x40, 0x40, 0x40, 0x3D, 0x00, /* š */ + 0x18, 0x24, 0x7E, 0x24, 0x24, 0x00, /* › */ + 0x28, 0x5E, 0x29, 0x42, 0x20, 0x00, /* œ */ + 0x09, 0x2A, 0x7C, 0x2A, 0x09, 0x00, /*  */ + 0x7F, 0x05, 0x15, 0x3D, 0x52, 0x00, /* ž */ + 0x20, 0x48, 0x3E, 0x09, 0x02, 0x00, /* Ÿ */ +/* 0xa0 */ + 0x20, 0x74, 0x55, 0x55, 0x79, 0x00, /*   */ + 0x01, 0x45, 0x7D, 0x40, 0x00, 0x00, /* ¡ */ + 0x30, 0x48, 0x4A, 0x4A, 0x32, 0x00, /* ¢ */ + 0x38, 0x40, 0x42, 0x22, 0x7A, 0x00, /* £ */ + 0x7A, 0x12, 0x0A, 0x0A, 0x72, 0x00, /* ¤ */ + 0x7D, 0x09, 0x11, 0x21, 0x7D, 0x00, /* ¥ */ + 0x02, 0x15, 0x15, 0x12, 0x04, 0x00, /* ¦ */ + 0x02, 0x15, 0x15, 0x15, 0x02, 0x00, /* § */ +/* 0xa8 */ + 0x30, 0x48, 0x45, 0x40, 0x20, 0x00, /* ¨ */ + 0x00, 0x38, 0x08, 0x08, 0x08, 0x00, /* © */ + 0x00, 0x08, 0x08, 0x08, 0x38, 0x00, /* ª */ + 0x0B, 0x04, 0x6A, 0x55, 0x48, 0x00, /* « */ + 0x0B, 0x24, 0x32, 0x79, 0x20, 0x00, /* ¬ */ + 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, /* ­ */ + 0x08, 0x14, 0x2A, 0x14, 0x22, 0x00, /* ® */ + 0x22, 0x14, 0x2A, 0x14, 0x08, 0x00, /* ¯ */ +/* 0xb0 */ + 0x2A, 0x55, 0x00, 0x2A, 0x55, 0x00, /* ° */ + 0x2A, 0x55, 0x2A, 0x55, 0x2A, 0x55, /* ± */ + 0x55, 0x2A, 0x7F, 0x55, 0x2A, 0x7F, /* ² */ + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, /* ³ */ + 0x08, 0x08, 0xFF, 0x00, 0x00, 0x00, /* ´ */ + 0x14, 0x14, 0xFF, 0x00, 0x00, 0x00, /* µ */ + 0x08, 0xFF, 0x00, 0xFF, 0x00, 0x00, /* ¶ */ + 0x08, 0xF8, 0x08, 0xF8, 0x00, 0x00, /* · */ +/* 0xb8 */ + 0x14, 0x14, 0xFC, 0x00, 0x00, 0x00, /* ¸ */ + 0x14, 0xF7, 0x00, 0xFF, 0x00, 0x00, /* ¹ */ + 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, /* º */ + 0x14, 0xF4, 0x04, 0xFC, 0x00, 0x00, /* » */ + 0x14, 0x17, 0x10, 0x1F, 0x00, 0x00, /* ¼ */ + 0x08, 0x0F, 0x08, 0x0F, 0x00, 0x00, /* ½ */ + 0x14, 0x14, 0x1F, 0x00, 0x00, 0x00, /* ¾ */ + 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, /* ¿ */ +/* 0xc0 */ + 0x00, 0x00, 0x0F, 0x08, 0x08, 0x08, /* À */ + 0x08, 0x08, 0x0F, 0x08, 0x08, 0x08, /* Á */ + 0x08, 0x08, 0xF8, 0x08, 0x08, 0x08, /*  */ + 0x00, 0x00, 0xFF, 0x08, 0x08, 0x08, /* à */ + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, /* Ä */ + 0x08, 0x08, 0xFF, 0x08, 0x08, 0x08, /* Å */ + 0x00, 0x00, 0xFF, 0x14, 0x14, 0x14, /* Æ */ + 0x00, 0xFF, 0x00, 0xFF, 0x08, 0x08, /* Ç */ +/* 0xc8 */ + 0x00, 0x1F, 0x10, 0x17, 0x14, 0x14, /* È */ + 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14, /* É */ + 0x28, 0x2F, 0x20, 0x2F, 0x28, 0x28, /* Ê */ + 0x14, 0xF4, 0x04, 0xF4, 0x14, 0x14, /* Ë */ + 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14, /* Ì */ + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, /* Í */ + 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, /* Î */ + 0x14, 0x14, 0xF7, 0x14, 0x14, 0x14, /* Ï */ +/* 0xd0 */ + 0x08, 0x0F, 0x08, 0x0F, 0x08, 0x08, /* Ð */ + 0x14, 0x14, 0xF4, 0x14, 0x14, 0x14, /* Ñ */ + 0x08, 0x08, 0xF8, 0x08, 0x08, 0x08, /* Ò */ + 0x08, 0x0F, 0x08, 0x0F, 0x08, 0x08, /* Ó */ + 0x00, 0x00, 0x1F, 0x14, 0x14, 0x14, /* Ô */ + 0x00, 0x00, 0xFC, 0x14, 0x14, 0x14, /* Õ */ + 0x00, 0xF8, 0x08, 0xF8, 0x08, 0x08, /* Ö */ + 0x08, 0xFF, 0x08, 0xFF, 0x08, 0x08, /* × */ +/* 0xd8 */ + 0x14, 0x14, 0xFF, 0x14, 0x14, 0x14, /* Ø */ + 0x08, 0x08, 0x0F, 0x00, 0x00, 0x00, /* Ù */ + 0x00, 0x00, 0xF8, 0x08, 0x08, 0x08, /* Ú */ + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, /* Û */ + 0x70, 0x70, 0x70, 0x70, 0x70, 0x00, /* Ü */ + 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, /* Ý */ + 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, /* Þ */ + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x00, /* ß */ +/* 0xe0 */ + 0x30, 0x48, 0x48, 0x30, 0x48, 0x00, /* à */ + 0x7E, 0x11, 0x25, 0x25, 0x1A, 0x00, /* á */ + 0x7E, 0x02, 0x02, 0x02, 0x06, 0x00, /* â */ + 0x04, 0x7C, 0x04, 0x7C, 0x04, 0x00, /* ã */ + 0x41, 0x63, 0x55, 0x49, 0x63, 0x00, /* ä */ + 0x3C, 0x42, 0x4A, 0x4A, 0x31, 0x00, /* å */ + 0x40, 0x7C, 0x20, 0x20, 0x1C, 0x00, /* æ */ + 0x08, 0x04, 0x7C, 0x08, 0x04, 0x00, /* ç */ +/* 0xe8 */ + 0x49, 0x55, 0x77, 0x55, 0x49, 0x00, /* è */ + 0x1C, 0x2A, 0x49, 0x2A, 0x1C, 0x00, /* é */ + 0x4C, 0x72, 0x02, 0x72, 0x4C, 0x00, /* ê */ + 0x30, 0x4A, 0x45, 0x49, 0x31, 0x00, /* ë */ + 0x18, 0x24, 0x18, 0x24, 0x18, 0x00, /* ì */ + 0x5C, 0x72, 0x2A, 0x27, 0x1D, 0x00, /* í */ + 0x1C, 0x2A, 0x49, 0x49, 0x00, 0x00, /* î */ + 0x7E, 0x01, 0x01, 0x01, 0x7E, 0x00, /* ï */ +/* 0xf0 */ + 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x00, /* ð */ + 0x24, 0x24, 0x2E, 0x24, 0x24, 0x00, /* ñ */ + 0x40, 0x51, 0x4A, 0x44, 0x00, 0x00, /* ò */ + 0x44, 0x4A, 0x51, 0x40, 0x00, 0x00, /* ó */ + 0x00, 0x00, 0xFE, 0x01, 0x02, 0x00, /* ô */ + 0x20, 0x40, 0x3F, 0x00, 0x00, 0x00, /* õ */ + 0x08, 0x08, 0x2A, 0x08, 0x08, 0x00, /* ö */ + 0x24, 0x12, 0x24, 0x12, 0x00, 0x00, /* ÷ */ +/* 0xf8 */ + 0x06, 0x09, 0x09, 0x09, 0x06, 0x00, /* ø */ + 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, /* ù */ + 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, /* ú */ + 0x10, 0x30, 0x7F, 0x01, 0x01, 0x00, /* û */ + 0x01, 0x0E, 0x01, 0x01, 0x0E, 0x00, /* ü */ + 0x0A, 0x09, 0x0D, 0x0A, 0x00, 0x00, /* ý */ + 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x00, /* þ */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* ÿ */ +}; + + +#ifndef default_font +struct Font default_font = +{ + /* .glyph = */ default_font_glyphs, + /* .width = */ 6, + /* .height = */ 8 +}; + +#endif diff --git a/2.5/bertos/fonts/fonts.mk b/2.5/bertos/fonts/fonts.mk new file mode 100644 index 00000000..5d6e3ba8 --- /dev/null +++ b/2.5/bertos/fonts/fonts.mk @@ -0,0 +1,12 @@ +# +# $Id$ +# Copyright 2003, 2004, 2005, 2006 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Makefile fragment for DevLib demo application. +# +# Author: Bernie Innocenti +# + +%.c: %.bdf + bertos/fonts/convbdf $< > $@ diff --git a/2.5/bertos/fonts/gohu.bdf b/2.5/bertos/fonts/gohu.bdf new file mode 100644 index 00000000..2e757833 --- /dev/null +++ b/2.5/bertos/fonts/gohu.bdf @@ -0,0 +1,2714 @@ +STARTFONT 2.1 +COMMENT "Copyright by Hugo Chargois" +COMMENT "Licensed under the WTFPL" +FONT -Gohu-GohuFont-Medium-R-Normal--11-80-100-100-C-60-ISO8859-1 +SIZE 11 100 100 +FONTBOUNDINGBOX 6 11 0 -2 +STARTPROPERTIES 30 +FOUNDRY "Gohu" +FAMILY_NAME "GohuFont" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 11 +POINT_SIZE 80 +RESOLUTION_X 100 +RESOLUTION_Y 100 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +FONTNAME_REGISTRY "" +FONT_NAME "GohuFont" +FACE_NAME "GohuFont" +FONT_VERSION "003.000" +FONT_ASCENT 9 +FONT_DESCENT 2 +UNDERLINE_POSITION -1 +UNDERLINE_THICKNESS 1 +X_HEIGHT 4 +CAP_HEIGHT 7 +RAW_ASCENT 818 +RAW_DESCENT 182 +NORM_SPACE 6 +FIGURE_WIDTH 6 +AVG_LOWERCASE_WIDTH 60 +AVG_UPPERCASE_WIDTH "60" +ENDPROPERTIES +CHARS 191 +STARTCHAR SPACE +ENCODING 32 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR EXCLAMATION MARK +ENCODING 33 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR QUOTATION MARK +ENCODING 34 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR NUMBER SIGN +ENCODING 35 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +50 +50 +F8 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR DOLLAR SIGN +ENCODING 36 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +70 +20 +ENDCHAR +STARTCHAR PERCENT SIGN +ENCODING 37 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +50 +20 +50 +A8 +90 +ENDCHAR +STARTCHAR AMPERSAND +ENCODING 38 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +90 +A0 +40 +A8 +90 +68 +ENDCHAR +STARTCHAR APOSTROPHE +ENCODING 39 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 1 3 2 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR LEFT PARENTHESIS +ENCODING 40 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR RIGHT PARENTHESIS +ENCODING 41 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR ASTERISK +ENCODING 42 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR PLUS SIGN +ENCODING 43 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR COMMA +ENCODING 44 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 2 4 1 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR HYPHEN-MINUS +ENCODING 45 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR FULL STOP +ENCODING 46 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR SOLIDUS +ENCODING 47 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR DIGIT ZERO +ENCODING 48 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +98 +A8 +C8 +88 +70 +ENDCHAR +STARTCHAR DIGIT ONE +ENCODING 49 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 7 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR DIGIT TWO +ENCODING 50 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR DIGIT THREE +ENCODING 51 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +08 +88 +70 +ENDCHAR +STARTCHAR DIGIT FOUR +ENCODING 52 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +30 +50 +90 +F8 +10 +10 +ENDCHAR +STARTCHAR DIGIT FIVE +ENCODING 53 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +F0 +08 +08 +88 +70 +ENDCHAR +STARTCHAR DIGIT SIX +ENCODING 54 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR DIGIT SEVEN +ENCODING 55 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +ENDCHAR +STARTCHAR DIGIT EIGHT +ENCODING 56 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR DIGIT NINE +ENCODING 57 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR COLON +ENCODING 58 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 2 5 2 0 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR SEMICOLON +ENCODING 59 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 2 7 1 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR LESS-THAN SIGN +ENCODING 60 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +40 +80 +40 +20 +10 +ENDCHAR +STARTCHAR EQUALS SIGN +ENCODING 61 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR GREATER-THAN SIGN +ENCODING 62 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +40 +20 +10 +20 +40 +80 +ENDCHAR +STARTCHAR QUESTION MARK +ENCODING 63 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +10 +20 +00 +20 +ENDCHAR +STARTCHAR COMMERCIAL AT +ENCODING 64 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +B8 +A8 +B8 +80 +78 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A +ENCODING 65 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER B +ENCODING 66 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER C +ENCODING 67 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER D +ENCODING 68 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E +ENCODING 69 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER F +ENCODING 70 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER G +ENCODING 71 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +B8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER H +ENCODING 72 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I +ENCODING 73 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER J +ENCODING 74 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER K +ENCODING 75 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER L +ENCODING 76 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER M +ENCODING 77 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER N +ENCODING 78 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O +ENCODING 79 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER P +ENCODING 80 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Q +ENCODING 81 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +A8 +90 +68 +08 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER R +ENCODING 82 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +F0 +90 +88 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER S +ENCODING 83 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +70 +08 +08 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER T +ENCODING 84 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U +ENCODING 85 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER V +ENCODING 86 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER W +ENCODING 87 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +A8 +A8 +A8 +50 +50 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER X +ENCODING 88 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Y +ENCODING 89 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Z +ENCODING 90 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR LEFT SQUARE BRACKET +ENCODING 91 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 9 2 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR REVERSE SOLIDUS +ENCODING 92 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 10 1 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR RIGHT SQUARE BRACKET +ENCODING 93 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 9 0 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR CIRCUMFLEX ACCENT +ENCODING 94 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR LOW LINE +ENCODING 95 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 6 1 0 -1 +BITMAP +FC +ENDCHAR +STARTCHAR GRAVE ACCENT +ENCODING 96 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A +ENCODING 97 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER B +ENCODING 98 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +B0 +C8 +88 +88 +F0 +ENDCHAR +STARTCHAR LATIN SMALL LETTER C +ENCODING 99 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +80 +80 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER D +ENCODING 100 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +78 +88 +88 +98 +68 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E +ENCODING 101 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +80 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER F +ENCODING 102 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +60 +80 +80 +E0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR LATIN SMALL LETTER G +ENCODING 103 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +98 +68 +08 +70 +ENDCHAR +STARTCHAR LATIN SMALL LETTER H +ENCODING 104 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I +ENCODING 105 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +40 +40 +60 +ENDCHAR +STARTCHAR LATIN SMALL LETTER J +ENCODING 106 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 9 0 -2 +BITMAP +20 +00 +60 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR LATIN SMALL LETTER K +ENCODING 107 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +90 +A0 +E0 +90 +88 +ENDCHAR +STARTCHAR LATIN SMALL LETTER L +ENCODING 108 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR LATIN SMALL LETTER M +ENCODING 109 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR LATIN SMALL LETTER N +ENCODING 110 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O +ENCODING 111 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN SMALL LETTER P +ENCODING 112 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Q +ENCODING 113 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +98 +68 +08 +08 +ENDCHAR +STARTCHAR LATIN SMALL LETTER R +ENCODING 114 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR LATIN SMALL LETTER S +ENCODING 115 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR LATIN SMALL LETTER T +ENCODING 116 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +40 +40 +40 +F0 +40 +40 +40 +30 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U +ENCODING 117 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR LATIN SMALL LETTER V +ENCODING 118 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR LATIN SMALL LETTER W +ENCODING 119 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR LATIN SMALL LETTER X +ENCODING 120 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Y +ENCODING 121 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +68 +08 +70 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Z +ENCODING 122 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR LEFT CURLY BRACKET +ENCODING 123 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +18 +20 +20 +20 +20 +C0 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR VERTICAL LINE +ENCODING 124 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR RIGHT CURLY BRACKET +ENCODING 125 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +C0 +20 +20 +20 +20 +18 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR TILDE +ENCODING 126 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +40 +A8 +10 +ENDCHAR +STARTCHAR NO-BREAK SPACE +ENCODING 160 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR INVERTED EXCLAMATION MARK +ENCODING 161 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR CENT SIGN +ENCODING 162 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +78 +A0 +A0 +A0 +78 +20 +ENDCHAR +STARTCHAR POUND SIGN +ENCODING 163 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +40 +40 +E0 +40 +48 +B0 +ENDCHAR +STARTCHAR CURRENCY SIGN +ENCODING 164 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +70 +50 +70 +88 +ENDCHAR +STARTCHAR YEN SIGN +ENCODING 165 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +50 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR BROKEN BAR +ENCODING 166 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SECTION SIGN +ENCODING 167 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +70 +80 +80 +E0 +90 +70 +10 +10 +E0 +ENDCHAR +STARTCHAR DIAERESIS +ENCODING 168 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +A0 +ENDCHAR +STARTCHAR COPYRIGHT SIGN +ENCODING 169 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +C8 +A8 +88 +70 +ENDCHAR +STARTCHAR FEMININE ORDINAL INDICATOR +ENCODING 170 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 4 6 1 1 +BITMAP +70 +90 +B0 +50 +00 +F0 +ENDCHAR +STARTCHAR LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +ENCODING 171 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +48 +90 +48 +24 +ENDCHAR +STARTCHAR NOT SIGN +ENCODING 172 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 4 2 1 2 +BITMAP +F0 +10 +ENDCHAR +STARTCHAR SOFT HYPHEN +ENCODING 173 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR REGISTERED SIGN +ENCODING 174 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +E8 +C8 +C8 +88 +70 +ENDCHAR +STARTCHAR MACRON +ENCODING 175 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 1 0 7 +BITMAP +F8 +ENDCHAR +STARTCHAR DEGREE SIGN +ENCODING 176 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 3 1 4 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR PLUS-MINUS SIGN +ENCODING 177 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +F8 +20 +20 +F8 +ENDCHAR +STARTCHAR SUPERSCRIPT TWO +ENCODING 178 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 4 5 1 3 +BITMAP +60 +90 +20 +40 +F0 +ENDCHAR +STARTCHAR SUPERSCRIPT THREE +ENCODING 179 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 4 5 1 3 +BITMAP +E0 +10 +60 +10 +E0 +ENDCHAR +STARTCHAR ACUTE ACCENT +ENCODING 180 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR MICRO SIGN +ENCODING 181 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +88 +88 +88 +C8 +B0 +80 +ENDCHAR +STARTCHAR PILCROW SIGN +ENCODING 182 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +E8 +E8 +68 +28 +28 +28 +ENDCHAR +STARTCHAR MIDDLE DOT +ENCODING 183 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR CEDILLA +ENCODING 184 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR SUPERSCRIPT ONE +ENCODING 185 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR MASCULINE ORDINAL INDICATOR +ENCODING 186 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 4 6 1 1 +BITMAP +60 +90 +90 +60 +00 +F0 +ENDCHAR +STARTCHAR RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +ENCODING 187 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +24 +48 +90 +ENDCHAR +STARTCHAR VULGAR FRACTION ONE QUARTER +ENCODING 188 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +40 +C0 +40 +40 +E4 +0C +14 +3C +04 +ENDCHAR +STARTCHAR VULGAR FRACTION ONE HALF +ENCODING 189 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +40 +C0 +40 +40 +E8 +14 +04 +08 +1C +ENDCHAR +STARTCHAR VULGAR FRACTION THREE QUARTERS +ENCODING 190 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +C0 +20 +40 +20 +C8 +18 +28 +78 +08 +ENDCHAR +STARTCHAR INVERTED QUESTION MARK +ENCODING 191 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +40 +80 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH GRAVE +ENCODING 192 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH ACUTE +ENCODING 193 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH CIRCUMFLEX +ENCODING 194 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH TILDE +ENCODING 195 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH DIAERESIS +ENCODING 196 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER A WITH RING ABOVE +ENCODING 197 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER AE +ENCODING 198 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER C WITH CEDILLA +ENCODING 199 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +88 +70 +20 +40 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH GRAVE +ENCODING 200 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH ACUTE +ENCODING 201 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH CIRCUMFLEX +ENCODING 202 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER E WITH DIAERESIS +ENCODING 203 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH GRAVE +ENCODING 204 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +20 +00 +E0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH ACUTE +ENCODING 205 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +80 +00 +E0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH CIRCUMFLEX +ENCODING 206 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +A0 +00 +E0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER I WITH DIAERESIS +ENCODING 207 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER ETH +ENCODING 208 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +E8 +48 +48 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER N WITH TILDE +ENCODING 209 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +68 +B0 +88 +C8 +A8 +98 +88 +88 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH GRAVE +ENCODING 210 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH ACUTE +ENCODING 211 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH CIRCUMFLEX +ENCODING 212 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH TILDE +ENCODING 213 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +68 +B0 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH DIAERESIS +ENCODING 214 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR MULTIPLICATION SIGN +ENCODING 215 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER O WITH STROKE +ENCODING 216 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +74 +88 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH GRAVE +ENCODING 217 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH ACUTE +ENCODING 218 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH CIRCUMFLEX +ENCODING 219 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER U WITH DIAERESIS +ENCODING 220 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER Y WITH ACUTE +ENCODING 221 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +88 +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR LATIN CAPITAL LETTER THORN +ENCODING 222 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +F0 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR LATIN SMALL LETTER SHARP S +ENCODING 223 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +30 +48 +88 +90 +90 +88 +88 +B0 +80 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH GRAVE +ENCODING 224 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH ACUTE +ENCODING 225 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH CIRCUMFLEX +ENCODING 226 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH TILDE +ENCODING 227 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH DIAERESIS +ENCODING 228 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER A WITH RING ABOVE +ENCODING 229 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER AE +ENCODING 230 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B8 +A0 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER C WITH CEDILLA +ENCODING 231 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +80 +80 +78 +20 +40 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH GRAVE +ENCODING 232 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F8 +80 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH ACUTE +ENCODING 233 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +F8 +80 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH CIRCUMFLEX +ENCODING 234 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +F8 +80 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER E WITH DIAERESIS +ENCODING 235 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F8 +80 +78 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH GRAVE +ENCODING 236 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +80 +40 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH ACUTE +ENCODING 237 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +40 +80 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH CIRCUMFLEX +ENCODING 238 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR LATIN SMALL LETTER I WITH DIAERESIS +ENCODING 239 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR LATIN SMALL LETTER ETH +ENCODING 240 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +60 +10 +78 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN SMALL LETTER N WITH TILDE +ENCODING 241 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +A0 +00 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH GRAVE +ENCODING 242 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH ACUTE +ENCODING 243 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH CIRCUMFLEX +ENCODING 244 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH TILDE +ENCODING 245 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +A0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH DIAERESIS +ENCODING 246 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR DIVISION SIGN +ENCODING 247 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR LATIN SMALL LETTER O WITH STROKE +ENCODING 248 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +98 +A8 +C8 +70 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH GRAVE +ENCODING 249 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH ACUTE +ENCODING 250 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH CIRCUMFLEX +ENCODING 251 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR LATIN SMALL LETTER U WITH DIAERESIS +ENCODING 252 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Y WITH ACUTE +ENCODING 253 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +88 +88 +88 +98 +68 +08 +70 +ENDCHAR +STARTCHAR LATIN SMALL LETTER THORN +ENCODING 254 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR LATIN SMALL LETTER Y WITH DIAERESIS +ENCODING 255 +SWIDTH 392 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +98 +68 +08 +70 +ENDCHAR +ENDFONT diff --git a/2.5/bertos/fonts/gohu.c b/2.5/bertos/fonts/gohu.c new file mode 100644 index 00000000..523cf21a --- /dev/null +++ b/2.5/bertos/fonts/gohu.c @@ -0,0 +1,792 @@ +/* Generated by convbdf on Wed Apr 28 11:17:58 CEST 2010. */ +#include + +/* Font information: + + name: -Gohu-GohuFont-Medium-R-Normal--11-80-100-100-C-60-ISO8859-1 + pixel size: 11 + ascent: 9 + descent: 2 +*/ + +/* Font character bitmap data. */ +static const PROGMEM uint8_t font_gohu_glyphs[] = { + +/* Character (0x20): bbw=0, bbh=0, bbx=0, bby=0, width=6 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ + +/* Character (0x21): bbw=1, bbh=8, bbx=2, bby=0, width=6 */ +0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, /* ****** */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* ****** * */ + +/* Character (0x22): bbw=3, bbh=3, bbx=1, bby=5, width=6 */ +0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, /* *** *** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* *** *** */ + +/* Character (0x23): bbw=5, bbh=7, bbx=0, bby=1, width=6 */ +0x28, 0xfe, 0x28, 0xfe, 0x28, 0x00, /* * * ******* * * ******* * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ******* * * ******* * * */ + +/* Character (0x24): bbw=5, bbh=9, bbx=0, bby=-1, width=6 */ +0x98, 0x24, 0xfe, 0x24, 0xc8, 0x00, /* ** * * * ******* * * * ** */ +0x00, 0x01, 0x03, 0x01, 0x00, 0x00, /* ** * * * ******* * * * ** * ** * */ + +/* Character (0x25): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0x88, 0x54, 0xa8, 0x50, 0x8c, 0x00, /* * * * * * * * * * * ** * */ +0x01, 0x00, 0x00, 0x01, 0x00, 0x00, /* * * * * * * * * * * ** * * * */ + +/* Character (0x26): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xd8, 0x24, 0x54, 0x88, 0x40, 0x00, /* ** ** * * * * * * * * */ +0x00, 0x01, 0x01, 0x00, 0x01, 0x00, /* ** ** * * * * * * * * * * * */ + +/* Character (0x27): bbw=1, bbh=3, bbx=2, bby=5, width=6 */ +0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, /* *** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* *** */ + +/* Character (0x28): bbw=3, bbh=9, bbx=1, bby=-1, width=6 */ +0x00, 0x70, 0x8c, 0x02, 0x00, 0x00, /* *** ** * * */ +0x00, 0x00, 0x01, 0x02, 0x00, 0x00, /* *** ** * * * * */ + +/* Character (0x29): bbw=3, bbh=9, bbx=1, bby=-1, width=6 */ +0x00, 0x02, 0x8c, 0x70, 0x00, 0x00, /* * ** * *** */ +0x00, 0x02, 0x01, 0x00, 0x00, 0x00, /* * ** * *** * * */ + +/* Character (0x2a): bbw=5, bbh=5, bbx=0, bby=1, width=6 */ +0x50, 0x20, 0xf8, 0x20, 0x50, 0x00, /* * * * ***** * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * ***** * * * */ + +/* Character (0x2b): bbw=5, bbh=5, bbx=0, bby=1, width=6 */ +0x20, 0x20, 0xf8, 0x20, 0x20, 0x00, /* * * ***** * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ***** * * */ + +/* Character (0x2c): bbw=2, bbh=4, bbx=1, bby=-2, width=6 */ +0x00, 0x80, 0x80, 0x00, 0x00, 0x00, /* * * */ +0x00, 0x05, 0x03, 0x00, 0x00, 0x00, /* * * * *** */ + +/* Character (0x2d): bbw=5, bbh=1, bbx=0, bby=3, width=6 */ +0x20, 0x20, 0x20, 0x20, 0x20, 0x00, /* * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * */ + +/* Character (0x2e): bbw=2, bbh=2, bbx=1, bby=0, width=6 */ +0x00, 0x80, 0x80, 0x00, 0x00, 0x00, /* * * */ +0x00, 0x01, 0x01, 0x00, 0x00, 0x00, /* * * * * */ + +/* Character (0x2f): bbw=5, bbh=10, bbx=0, bby=-2, width=6 */ +0x00, 0x80, 0x60, 0x18, 0x06, 0x00, /* * ** ** ** */ +0x06, 0x01, 0x00, 0x00, 0x00, 0x00, /* * ** ** ** *** */ + +/* Character (0x30): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xf8, 0x44, 0x24, 0x14, 0xf8, 0x00, /* ***** * * * * * * ***** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ***** * * * * * * ***** * * * */ + +/* Character (0x31): bbw=3, bbh=7, bbx=0, bby=0, width=6 */ +0x10, 0x08, 0xfc, 0x00, 0x00, 0x00, /* * * ****** */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* * * ****** * */ + +/* Character (0x32): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0x08, 0x84, 0x44, 0x24, 0x18, 0x00, /* * * * * * * * ** */ +0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* * * * * * * * ** * * * * * */ + +/* Character (0x33): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0x88, 0x04, 0x24, 0x24, 0xd8, 0x00, /* * * * * * * * ** ** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* * * * * * * * ** ** * * * */ + +/* Character (0x34): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0x60, 0x50, 0x48, 0xfc, 0x40, 0x00, /* ** * * * * ****** * */ +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, /* ** * * * * ****** * * */ + +/* Character (0x35): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0x9c, 0x14, 0x14, 0x14, 0xe4, 0x00, /* *** * * * * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* *** * * * * * * * * *** * * * */ + +/* Character (0x36): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xf8, 0x14, 0x14, 0x14, 0xe0, 0x00, /* ***** * * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ***** * * * * * * *** * * * */ + +/* Character (0x37): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0x04, 0x04, 0xc4, 0x34, 0x0c, 0x00, /* * * * ** * ** ** */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* * * * ** * ** ** * */ + +/* Character (0x38): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xd8, 0x24, 0x24, 0x24, 0xd8, 0x00, /* ** ** * * * * * * ** ** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ** ** * * * * * * ** ** * * * */ + +/* Character (0x39): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0x18, 0x24, 0x24, 0x24, 0xf8, 0x00, /* ** * * * * * * ***** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ** * * * * * * ***** * * * */ + +/* Character (0x3a): bbw=2, bbh=5, bbx=2, bby=0, width=6 */ +0x00, 0x00, 0xb0, 0xb0, 0x00, 0x00, /* ** * ** * */ +0x00, 0x00, 0x01, 0x01, 0x00, 0x00, /* ** * ** * * * */ + +/* Character (0x3b): bbw=2, bbh=7, bbx=1, bby=-2, width=6 */ +0x00, 0xb0, 0xb0, 0x00, 0x00, 0x00, /* ** * ** * */ +0x00, 0x05, 0x03, 0x00, 0x00, 0x00, /* ** * ** * * *** */ + +/* Character (0x3c): bbw=4, bbh=7, bbx=1, bby=0, width=6 */ +0x00, 0x20, 0x50, 0x88, 0x04, 0x00, /* * * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, /* * * * * * * * */ + +/* Character (0x3d): bbw=5, bbh=3, bbx=0, bby=2, width=6 */ +0x50, 0x50, 0x50, 0x50, 0x50, 0x00, /* * * * * * * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * * * */ + +/* Character (0x3e): bbw=4, bbh=7, bbx=1, bby=0, width=6 */ +0x00, 0x04, 0x88, 0x50, 0x20, 0x00, /* * * * * * * */ +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * */ + +/* Character (0x3f): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0x08, 0x04, 0x44, 0x24, 0x18, 0x00, /* * * * * * * ** */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* * * * * * * ** * */ + +/* Character (0x40): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xf8, 0x04, 0x74, 0x54, 0x78, 0x00, /* ***** * * *** * * * **** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* ***** * * *** * * * **** * * * * */ + +/* Character (0x41): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfc, 0x12, 0x12, 0x12, 0xfc, 0x00, /* ****** * * * * * * ****** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ****** * * * * * * ****** * * */ + +/* Character (0x42): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x12, 0x12, 0x12, 0xec, 0x00, /* ******* * * * * * * ** *** */ +0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* ******* * * * * * * ** *** * * * * */ + +/* Character (0x43): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfc, 0x02, 0x02, 0x02, 0x84, 0x00, /* ****** * * * * * */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ****** * * * * * * * * */ + +/* Character (0x44): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x02, 0x02, 0x02, 0xfc, 0x00, /* ******* * * * ****** */ +0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* ******* * * * ****** * * * * */ + +/* Character (0x45): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x12, 0x12, 0x12, 0x02, 0x00, /* ******* * * * * * * * */ +0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* ******* * * * * * * * * * * * * */ + +/* Character (0x46): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x12, 0x12, 0x12, 0x02, 0x00, /* ******* * * * * * * * */ +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, /* ******* * * * * * * * * */ + +/* Character (0x47): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfc, 0x02, 0x12, 0x12, 0xf4, 0x00, /* ****** * * * * * * **** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ****** * * * * * * **** * * * */ + +/* Character (0x48): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x10, 0x10, 0x10, 0xfe, 0x00, /* ******* * * * ******* */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ******* * * * ******* * * */ + +/* Character (0x49): bbw=3, bbh=8, bbx=1, bby=0, width=6 */ +0x00, 0x02, 0xfe, 0x02, 0x00, 0x00, /* * ******* * */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* * ******* * * * * */ + +/* Character (0x4a): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xc0, 0x00, 0x00, 0x00, 0xfe, 0x00, /* ** ******* */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ** ******* * * * */ + +/* Character (0x4b): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x10, 0x28, 0x44, 0x82, 0x00, /* ******* * * * * * * * */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ******* * * * * * * * * * */ + +/* Character (0x4c): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, /* ******* */ +0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* ******* * * * * * */ + +/* Character (0x4d): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x04, 0x18, 0x04, 0xfe, 0x00, /* ******* * ** * ******* */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ******* * ** * ******* * * */ + +/* Character (0x4e): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x0c, 0x30, 0xc0, 0xfe, 0x00, /* ******* ** ** ** ******* */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ******* ** ** ** ******* * * */ + +/* Character (0x4f): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfc, 0x02, 0x02, 0x02, 0xfc, 0x00, /* ****** * * * ****** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ****** * * * ****** * * * */ + +/* Character (0x50): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x12, 0x12, 0x12, 0x0c, 0x00, /* ******* * * * * * * ** */ +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, /* ******* * * * * * * ** * */ + +/* Character (0x51): bbw=5, bbh=9, bbx=0, bby=-1, width=6 */ +0xfc, 0x02, 0x42, 0x82, 0x7c, 0x00, /* ****** * * * * * ***** */ +0x00, 0x01, 0x01, 0x00, 0x03, 0x00, /* ****** * * * * * ***** * * ** */ + +/* Character (0x52): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x12, 0x12, 0x32, 0xcc, 0x00, /* ******* * * * * * ** ** ** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ******* * * * * * ** ** ** * * */ + +/* Character (0x53): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x8c, 0x12, 0x12, 0x12, 0xe4, 0x00, /* ** * * * * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ** * * * * * * * * *** * * * */ + +/* Character (0x54): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x02, 0x02, 0xfe, 0x02, 0x02, 0x00, /* * * ******* * * */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* * * ******* * * * */ + +/* Character (0x55): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x00, 0x00, 0x00, 0xfe, 0x00, /* ******* ******* */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ******* ******* * * * */ + +/* Character (0x56): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x1e, 0x60, 0x80, 0x60, 0x1e, 0x00, /* **** ** * ** **** */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* **** ** * ** **** * */ + +/* Character (0x57): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x7e, 0x80, 0x70, 0x80, 0x7e, 0x00, /* ****** * *** * ****** */ +0x00, 0x01, 0x00, 0x01, 0x00, 0x00, /* ****** * *** * ****** * * */ + +/* Character (0x58): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xc6, 0x28, 0x10, 0x28, 0xc6, 0x00, /* ** ** * * * * * ** ** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ** ** * * * * * ** ** * * */ + +/* Character (0x59): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x06, 0x08, 0xf0, 0x08, 0x06, 0x00, /* ** * **** * ** */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* ** * **** * ** * */ + +/* Character (0x5a): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xc2, 0x22, 0x12, 0x0a, 0x06, 0x00, /* * ** * * * * * * ** */ +0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* * ** * * * * * * ** * * * * * */ + +/* Character (0x5b): bbw=3, bbh=9, bbx=2, bby=-1, width=6 */ +0x00, 0x00, 0xfe, 0x02, 0x02, 0x00, /* ******* * * */ +0x00, 0x00, 0x03, 0x02, 0x02, 0x00, /* ******* * * ** * * */ + +/* Character (0x5c): bbw=5, bbh=10, bbx=1, bby=-2, width=6 */ +0x00, 0x06, 0x18, 0x60, 0x80, 0x00, /* ** ** ** * */ +0x00, 0x00, 0x00, 0x00, 0x01, 0x06, /* ** ** ** * * ** */ + +/* Character (0x5d): bbw=3, bbh=9, bbx=0, bby=-1, width=6 */ +0x02, 0x02, 0xfe, 0x00, 0x00, 0x00, /* * * ******* */ +0x02, 0x02, 0x03, 0x00, 0x00, 0x00, /* * * ******* * * ** */ + +/* Character (0x5e): bbw=5, bbh=3, bbx=0, bby=4, width=6 */ +0x10, 0x08, 0x04, 0x08, 0x10, 0x00, /* * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * */ + +/* Character (0x5f): bbw=6, bbh=1, bbx=0, bby=-1, width=6 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* * * * * * * */ + +/* Character (0x60): bbw=3, bbh=3, bbx=1, bby=5, width=6 */ +0x00, 0x02, 0x04, 0x08, 0x00, 0x00, /* * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * */ + +/* Character (0x61): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0x80, 0x50, 0x50, 0x50, 0xe0, 0x00, /* * * * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* * * * * * * * *** * * * * */ + +/* Character (0x62): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x20, 0x10, 0x10, 0xe0, 0x00, /* ******* * * * *** */ +0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* ******* * * * *** * * * * */ + +/* Character (0x63): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0xe0, 0x10, 0x10, 0x10, 0x10, 0x00, /* *** * * * * */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* *** * * * * * * * * */ + +/* Character (0x64): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xe0, 0x10, 0x10, 0x90, 0xfe, 0x00, /* *** * * * * ******* */ +0x00, 0x01, 0x01, 0x00, 0x01, 0x00, /* *** * * * * ******* * * * */ + +/* Character (0x65): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0xe0, 0x50, 0x50, 0x50, 0x60, 0x00, /* *** * * * * * * ** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* *** * * * * * * ** * * * * */ + +/* Character (0x66): bbw=3, bbh=8, bbx=1, bby=0, width=6 */ +0x00, 0xfc, 0x12, 0x12, 0x00, 0x00, /* ****** * * * * */ +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, /* ****** * * * * * */ + +/* Character (0x67): bbw=5, bbh=7, bbx=0, bby=-2, width=6 */ +0xe0, 0x10, 0x10, 0x90, 0xf0, 0x00, /* *** * * * * **** */ +0x00, 0x05, 0x05, 0x04, 0x03, 0x00, /* *** * * * * **** * ** * *** */ + +/* Character (0x68): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x20, 0x10, 0x10, 0xe0, 0x00, /* ******* * * * *** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ******* * * * *** * * */ + +/* Character (0x69): bbw=3, bbh=7, bbx=1, bby=0, width=6 */ +0x00, 0x10, 0xf4, 0x00, 0x00, 0x00, /* * * **** */ +0x00, 0x00, 0x01, 0x01, 0x00, 0x00, /* * * **** * * */ + +/* Character (0x6a): bbw=3, bbh=9, bbx=0, bby=-2, width=6 */ +0x00, 0x10, 0xf4, 0x00, 0x00, 0x00, /* * * **** */ +0x04, 0x04, 0x03, 0x00, 0x00, 0x00, /* * * **** * *** */ + +/* Character (0x6b): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfe, 0x40, 0x60, 0x90, 0x00, 0x00, /* ******* * ** * * */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ******* * ** * * * * */ + +/* Character (0x6c): bbw=4, bbh=8, bbx=1, bby=0, width=6 */ +0x00, 0x02, 0xfe, 0x00, 0x00, 0x00, /* * ******* */ +0x00, 0x00, 0x00, 0x01, 0x01, 0x00, /* * ******* * * */ + +/* Character (0x6d): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0xf0, 0x10, 0xf0, 0x10, 0xe0, 0x00, /* **** * **** * *** */ +0x01, 0x00, 0x01, 0x00, 0x01, 0x00, /* **** * **** * *** * * * */ + +/* Character (0x6e): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0xf0, 0x10, 0x10, 0x10, 0xe0, 0x00, /* **** * * * *** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* **** * * * *** * * */ + +/* Character (0x6f): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0xe0, 0x10, 0x10, 0x10, 0xe0, 0x00, /* *** * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* *** * * * *** * * * */ + +/* Character (0x70): bbw=5, bbh=7, bbx=0, bby=-2, width=6 */ +0xf0, 0x20, 0x10, 0x10, 0xe0, 0x00, /* **** * * * *** */ +0x07, 0x01, 0x01, 0x01, 0x00, 0x00, /* **** * * * *** **** * * */ + +/* Character (0x71): bbw=5, bbh=7, bbx=0, bby=-2, width=6 */ +0xe0, 0x10, 0x10, 0x90, 0xf0, 0x00, /* *** * * * * **** */ +0x00, 0x01, 0x01, 0x00, 0x07, 0x00, /* *** * * * * **** * * *** */ + +/* Character (0x72): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0xf0, 0x20, 0x10, 0x10, 0x20, 0x00, /* **** * * * * */ +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** * * * * * */ + +/* Character (0x73): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0x20, 0x50, 0x50, 0x50, 0x80, 0x00, /* * * * * * * * * */ +0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* * * * * * * * * * * * * */ + +/* Character (0x74): bbw=4, bbh=8, bbx=0, bby=0, width=6 */ +0x10, 0xfe, 0x10, 0x10, 0x00, 0x00, /* * ******* * * */ +0x00, 0x00, 0x01, 0x01, 0x00, 0x00, /* * ******* * * * * */ + +/* Character (0x75): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0xf0, 0x00, 0x00, 0x80, 0xf0, 0x00, /* **** * **** */ +0x00, 0x01, 0x01, 0x00, 0x01, 0x00, /* **** * **** * * * */ + +/* Character (0x76): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0x30, 0xc0, 0x00, 0xc0, 0x30, 0x00, /* ** ** ** ** */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* ** ** ** ** * */ + +/* Character (0x77): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0xf0, 0x00, 0xe0, 0x00, 0xf0, 0x00, /* **** *** **** */ +0x00, 0x01, 0x00, 0x01, 0x00, 0x00, /* **** *** **** * * */ + +/* Character (0x78): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0x10, 0xa0, 0x40, 0xa0, 0x10, 0x00, /* * * * * * * * */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* * * * * * * * * * */ + +/* Character (0x79): bbw=5, bbh=7, bbx=0, bby=-2, width=6 */ +0xf0, 0x00, 0x00, 0x80, 0xf0, 0x00, /* **** * **** */ +0x00, 0x05, 0x05, 0x04, 0x03, 0x00, /* **** * **** * ** * *** */ + +/* Character (0x7a): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0x10, 0x90, 0x50, 0x30, 0x10, 0x00, /* * * * * * ** * */ +0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* * * * * * ** * * * * * * */ + +/* Character (0x7b): bbw=6, bbh=11, bbx=0, bby=-2, width=6 */ +0x20, 0x20, 0xde, 0x01, 0x01, 0x00, /* * * **** *** * */ +0x00, 0x00, 0x03, 0x04, 0x04, 0x00, /* * * **** *** * ** * * */ + +/* Character (0x7c): bbw=1, bbh=9, bbx=2, bby=-1, width=6 */ +0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, /* ******* */ +0x00, 0x00, 0x03, 0x00, 0x00, 0x00, /* ******* ** */ + +/* Character (0x7d): bbw=6, bbh=11, bbx=0, bby=-2, width=6 */ +0x01, 0x01, 0xde, 0x20, 0x20, 0x00, /* * * **** ** * * */ +0x04, 0x04, 0x03, 0x00, 0x00, 0x00, /* * * **** ** * * * *** */ + +/* Character (0x7e): bbw=5, bbh=3, bbx=0, bby=2, width=6 */ +0x20, 0x10, 0x20, 0x40, 0x20, 0x00, /* * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * */ + +/* Character (0xa0): bbw=0, bbh=0, bbx=0, bby=0, width=6 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ + +/* Character (0xa1): bbw=1, bbh=8, bbx=2, bby=0, width=6 */ +0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, /* * ***** */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* * ***** * */ + +/* Character (0xa2): bbw=5, bbh=7, bbx=0, bby=-1, width=6 */ +0xe0, 0x10, 0xf8, 0x10, 0x10, 0x00, /* *** * ***** * * */ +0x00, 0x01, 0x03, 0x01, 0x01, 0x00, /* *** * ***** * * * ** * * */ + +/* Character (0xa3): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x20, 0xfc, 0x22, 0x02, 0x84, 0x00, /* * ****** * * * * * */ +0x01, 0x00, 0x01, 0x01, 0x00, 0x00, /* * ****** * * * * * * * * */ + +/* Character (0xa4): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0x10, 0xe0, 0xa0, 0xe0, 0x10, 0x00, /* * *** * * *** * */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* * *** * * *** * * * */ + +/* Character (0xa5): bbw=5, bbh=9, bbx=0, bby=-1, width=6 */ +0xa6, 0xa8, 0xf0, 0xa8, 0xa6, 0x00, /* ** * * * * * **** * * * ** * * */ +0x00, 0x00, 0x03, 0x00, 0x00, 0x00, /* ** * * * * * **** * * * ** * * ** */ + +/* Character (0xa6): bbw=1, bbh=9, bbx=2, bby=-1, width=6 */ +0x00, 0x00, 0xde, 0x00, 0x00, 0x00, /* **** ** */ +0x00, 0x00, 0x03, 0x00, 0x00, 0x00, /* **** ** ** */ + +/* Character (0xa7): bbw=4, bbh=9, bbx=1, bby=-1, width=6 */ +0x00, 0x3c, 0x52, 0x52, 0xe2, 0x00, /* **** * * * * * * * *** */ +0x00, 0x02, 0x02, 0x02, 0x01, 0x00, /* **** * * * * * * * *** * * * * */ + +/* Character (0xa8): bbw=3, bbh=1, bbx=1, bby=7, width=6 */ +0x00, 0x02, 0x00, 0x02, 0x00, 0x00, /* * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * */ + +/* Character (0xa9): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xf8, 0x24, 0x54, 0x04, 0xf8, 0x00, /* ***** * * * * * * ***** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ***** * * * * * * ***** * * * */ + +/* Character (0xaa): bbw=4, bbh=6, bbx=1, bby=1, width=6 */ +0x00, 0x98, 0xa4, 0x94, 0xbc, 0x00, /* ** * * * * * * * **** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** * * * * * * * **** * */ + +/* Character (0xab): bbw=6, bbh=5, bbx=0, bby=1, width=6 */ +0x20, 0x50, 0x88, 0x20, 0x50, 0x88, /* * * * * * * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * * * */ + +/* Character (0xac): bbw=4, bbh=2, bbx=1, bby=2, width=6 */ +0x00, 0x20, 0x20, 0x20, 0x60, 0x00, /* * * * ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * ** */ + +/* Character (0xad): bbw=4, bbh=1, bbx=1, bby=3, width=6 */ +0x00, 0x20, 0x20, 0x20, 0x20, 0x00, /* * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * */ + +/* Character (0xae): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xf8, 0x74, 0x14, 0x04, 0xf8, 0x00, /* ***** * *** * * * ***** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ***** * *** * * * ***** * * * */ + +/* Character (0xaf): bbw=5, bbh=1, bbx=0, bby=7, width=6 */ +0x02, 0x02, 0x02, 0x02, 0x02, 0x00, /* * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * */ + +/* Character (0xb0): bbw=3, bbh=3, bbx=1, bby=4, width=6 */ +0x00, 0x08, 0x14, 0x08, 0x00, 0x00, /* * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * */ + +/* Character (0xb1): bbw=5, bbh=6, bbx=0, bby=0, width=6 */ +0x20, 0x20, 0xf8, 0x20, 0x20, 0x00, /* * * ***** * * */ +0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* * * ***** * * * * * * * */ + +/* Character (0xb2): bbw=4, bbh=5, bbx=1, bby=3, width=6 */ +0x00, 0x24, 0x32, 0x2a, 0x24, 0x00, /* * * * ** * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * ** * * * * * */ + +/* Character (0xb3): bbw=4, bbh=5, bbx=1, bby=3, width=6 */ +0x00, 0x22, 0x2a, 0x2a, 0x14, 0x00, /* * * * * * * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * * * */ + +/* Character (0xb4): bbw=2, bbh=2, bbx=2, bby=6, width=6 */ +0x00, 0x00, 0x04, 0x02, 0x00, 0x00, /* * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * */ + +/* Character (0xb5): bbw=5, bbh=6, bbx=0, bby=-1, width=6 */ +0xf0, 0x80, 0x00, 0x00, 0xf0, 0x00, /* **** * **** */ +0x03, 0x00, 0x01, 0x01, 0x00, 0x00, /* **** * **** ** * * */ + +/* Character (0xb6): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0x18, 0x3c, 0xfc, 0x04, 0xfc, 0x00, /* ** **** ****** * ****** */ +0x00, 0x00, 0x01, 0x00, 0x01, 0x00, /* ** **** ****** * ****** * * */ + +/* Character (0xb7): bbw=1, bbh=1, bbx=2, bby=3, width=6 */ +0x00, 0x00, 0x20, 0x00, 0x00, 0x00, /* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * */ + +/* Character (0xb8): bbw=2, bbh=2, bbx=2, bby=-2, width=6 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x04, 0x02, 0x00, 0x00, /* * * */ + +/* Character (0xb9): bbw=3, bbh=5, bbx=1, bby=3, width=6 */ +0x00, 0x24, 0x3e, 0x20, 0x00, 0x00, /* * * ***** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ***** * */ + +/* Character (0xba): bbw=4, bbh=6, bbx=1, bby=1, width=6 */ +0x00, 0x98, 0xa4, 0xa4, 0x98, 0x00, /* ** * * * * * * * ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** * * * * * * * ** * */ + +/* Character (0xbb): bbw=6, bbh=5, bbx=0, bby=1, width=6 */ +0x88, 0x50, 0x20, 0x88, 0x50, 0x20, /* * * * * * * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * * * */ + +/* Character (0xbc): bbw=6, bbh=9, bbx=0, bby=-1, width=6 */ +0x24, 0x3e, 0x20, 0x80, 0x40, 0xe0, /* * * ***** * * * *** */ +0x00, 0x00, 0x01, 0x01, 0x01, 0x03, /* * * ***** * * * *** * * * ** */ + +/* Character (0xbd): bbw=6, bbh=9, bbx=0, bby=-1, width=6 */ +0x24, 0x3e, 0x20, 0x40, 0x20, 0xc0, /* * * ***** * * * ** */ +0x00, 0x00, 0x00, 0x02, 0x03, 0x02, /* * * ***** * * * ** * ** * */ + +/* Character (0xbe): bbw=5, bbh=9, bbx=0, bby=-1, width=6 */ +0x22, 0x2a, 0x94, 0x40, 0xe0, 0x00, /* * * * * * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x03, 0x00, /* * * * * * * * * * *** * * * ** */ + +/* Character (0xbf): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xc0, 0x20, 0x14, 0x00, 0x80, 0x00, /* ** * * * * */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ** * * * * * * * */ + +/* Character (0xc0): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf8, 0x25, 0x26, 0x24, 0xf8, 0x00, /* ****** * * ** * * * ***** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ****** * * ** * * * ***** * * */ + +/* Character (0xc1): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf8, 0x24, 0x26, 0x25, 0xf8, 0x00, /* ***** * * ** * * * * ***** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ***** * * ** * * * * ***** * * */ + +/* Character (0xc2): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf0, 0x4a, 0x49, 0x4a, 0xf0, 0x00, /* **** * * * * * * * * * **** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* **** * * * * * * * * * **** * * */ + +/* Character (0xc3): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf2, 0x49, 0x4b, 0x4a, 0xf1, 0x00, /* * ***** * * ** * * * * * * **** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* * ***** * * ** * * * * * * **** * * */ + +/* Character (0xc4): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf8, 0x25, 0x24, 0x25, 0xf8, 0x00, /* ****** * * * * * * * ***** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ****** * * * * * * * ***** * * */ + +/* Character (0xc5): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf0, 0x4a, 0x4d, 0x4a, 0xf0, 0x00, /* **** * * * * ** * * * * **** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* **** * * * * ** * * * * **** * * */ + +/* Character (0xc6): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xf8, 0x24, 0xfc, 0x24, 0x04, 0x00, /* ***** * * ****** * * * */ +0x01, 0x00, 0x01, 0x01, 0x01, 0x00, /* ***** * * ****** * * * * * * * */ + +/* Character (0xc7): bbw=5, bbh=9, bbx=0, bby=-2, width=6 */ +0xf8, 0x04, 0x04, 0x04, 0x88, 0x00, /* ***** * * * * * */ +0x00, 0x05, 0x03, 0x01, 0x00, 0x00, /* ***** * * * * * * *** * */ + +/* Character (0xc8): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xfc, 0x25, 0x26, 0x24, 0x04, 0x00, /* ******* * * ** * * * * */ +0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* ******* * * ** * * * * * * * * * */ + +/* Character (0xc9): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xfc, 0x24, 0x26, 0x25, 0x04, 0x00, /* ****** * * ** * * * * * */ +0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* ****** * * ** * * * * * * * * * * */ + +/* Character (0xca): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xfc, 0x26, 0x25, 0x26, 0x04, 0x00, /* ****** ** * * * * ** * * */ +0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* ****** ** * * * * ** * * * * * * * */ + +/* Character (0xcb): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xfc, 0x25, 0x24, 0x25, 0x04, 0x00, /* ******* * * * * * * * * */ +0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* ******* * * * * * * * * * * * * * */ + +/* Character (0xcc): bbw=3, bbh=9, bbx=1, bby=0, width=6 */ +0x00, 0x08, 0xf9, 0x0a, 0x00, 0x00, /* * * ***** * * */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* * * ***** * * * * * */ + +/* Character (0xcd): bbw=3, bbh=9, bbx=1, bby=0, width=6 */ +0x00, 0x0a, 0xf9, 0x08, 0x00, 0x00, /* * * * ***** * */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* * * * ***** * * * * */ + +/* Character (0xce): bbw=3, bbh=9, bbx=1, bby=0, width=6 */ +0x00, 0x0a, 0xf9, 0x0a, 0x00, 0x00, /* * * * ***** * * */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* * * * ***** * * * * * */ + +/* Character (0xcf): bbw=3, bbh=9, bbx=1, bby=0, width=6 */ +0x00, 0x05, 0xfc, 0x05, 0x00, 0x00, /* * * ******* * */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* * * ******* * * * * */ + +/* Character (0xd0): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0x20, 0xfc, 0x24, 0x04, 0xf8, 0x00, /* * ****** * * * ***** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* * ****** * * * ***** * * * */ + +/* Character (0xd1): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xfe, 0x09, 0x13, 0x22, 0xfd, 0x00, /* ******** * ** * * * * ****** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* ******** * ** * * * * ****** * * */ + +/* Character (0xd2): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf8, 0x05, 0x06, 0x04, 0xf8, 0x00, /* ****** * ** * ***** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ****** * ** * ***** * * * */ + +/* Character (0xd3): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf8, 0x04, 0x06, 0x05, 0xf8, 0x00, /* ***** * ** * * ***** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ***** * ** * * ***** * * * */ + +/* Character (0xd4): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf0, 0x0a, 0x09, 0x0a, 0xf0, 0x00, /* **** * * * * * * **** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* **** * * * * * * **** * * * */ + +/* Character (0xd5): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xfa, 0x05, 0x07, 0x06, 0xf9, 0x00, /* * ****** * *** ** * ***** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* * ****** * *** ** * ***** * * * */ + +/* Character (0xd6): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf8, 0x05, 0x04, 0x05, 0xf8, 0x00, /* ****** * * * * ***** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ****** * * * * ***** * * * */ + +/* Character (0xd7): bbw=5, bbh=5, bbx=0, bby=1, width=6 */ +0x88, 0x50, 0x20, 0x50, 0x88, 0x00, /* * * * * * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * * */ + +/* Character (0xd8): bbw=6, bbh=6, bbx=0, bby=1, width=6 */ +0xf8, 0xc4, 0xa4, 0x94, 0x78, 0x04, /* ***** * ** * * * * * * **** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ***** * ** * * * * * * **** * */ + +/* Character (0xd9): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xfc, 0x01, 0x02, 0x00, 0xfc, 0x00, /* ******* * ****** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ******* * ****** * * * */ + +/* Character (0xda): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xfc, 0x00, 0x02, 0x01, 0xfc, 0x00, /* ****** * * ****** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ****** * * ****** * * * */ + +/* Character (0xdb): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xfc, 0x00, 0x02, 0x01, 0xfc, 0x00, /* ****** * * ****** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ****** * * ****** * * * */ + +/* Character (0xdc): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xfc, 0x01, 0x00, 0x01, 0xfc, 0x00, /* ******* * ****** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* ******* * ****** * * * */ + +/* Character (0xdd): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0x1c, 0x20, 0xc2, 0x21, 0x1c, 0x00, /* *** * * *** * *** */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* *** * * *** * *** * */ + +/* Character (0xde): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xfc, 0x48, 0x48, 0x48, 0x30, 0x00, /* ****** * * * * * * ** */ +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, /* ****** * * * * * * ** * */ + +/* Character (0xdf): bbw=5, bbh=9, bbx=0, bby=-1, width=6 */ +0xf8, 0x04, 0x02, 0x32, 0xcc, 0x00, /* ***** * * * ** ** ** */ +0x03, 0x00, 0x01, 0x01, 0x00, 0x00, /* ***** * * * ** ** ** ** * * */ + +/* Character (0xe0): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x80, 0x50, 0x52, 0x54, 0xe0, 0x00, /* * * * * * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* * * * * * * * * * *** * * * * */ + +/* Character (0xe1): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x80, 0x50, 0x54, 0x52, 0xe0, 0x00, /* * * * * * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* * * * * * * * * * *** * * * * */ + +/* Character (0xe2): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x80, 0x54, 0x52, 0x54, 0xe0, 0x00, /* * * * * * * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* * * * * * * * * * * *** * * * * */ + +/* Character (0xe3): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x84, 0x52, 0x56, 0x54, 0xe2, 0x00, /* * * * * * ** * * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* * * * * * ** * * * * * * *** * * * * */ + +/* Character (0xe4): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0x80, 0x54, 0x50, 0x54, 0xe0, 0x00, /* * * * * * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* * * * * * * * * * *** * * * * */ + +/* Character (0xe5): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x80, 0x54, 0x5a, 0x54, 0xe0, 0x00, /* * * * * * ** * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* * * * * * ** * * * * *** * * * * */ + +/* Character (0xe6): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0xe0, 0x10, 0xf0, 0x50, 0x60, 0x00, /* *** * **** * * ** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* *** * **** * * ** * * * * */ + +/* Character (0xe7): bbw=5, bbh=7, bbx=0, bby=-2, width=6 */ +0xe0, 0x10, 0x10, 0x10, 0x10, 0x00, /* *** * * * * */ +0x00, 0x05, 0x03, 0x01, 0x01, 0x00, /* *** * * * * * *** * * */ + +/* Character (0xe8): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xe0, 0x52, 0x54, 0x50, 0x60, 0x00, /* *** * * * * * * * * ** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* *** * * * * * * * * ** * * * * */ + +/* Character (0xe9): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xe0, 0x50, 0x54, 0x52, 0x60, 0x00, /* *** * * * * * * * * ** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* *** * * * * * * * * ** * * * * */ + +/* Character (0xea): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xe0, 0x54, 0x52, 0x54, 0x60, 0x00, /* *** * * * * * * * * * ** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* *** * * * * * * * * * ** * * * * */ + +/* Character (0xeb): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xe0, 0x54, 0x50, 0x54, 0x60, 0x00, /* *** * * * * * * * * ** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, /* *** * * * * * * * * ** * * * * */ + +/* Character (0xec): bbw=2, bbh=8, bbx=2, bby=0, width=6 */ +0x00, 0x00, 0xf2, 0x04, 0x00, 0x00, /* * **** * */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* * **** * * */ + +/* Character (0xed): bbw=2, bbh=8, bbx=1, bby=0, width=6 */ +0x00, 0x04, 0xf2, 0x00, 0x00, 0x00, /* * * **** */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* * * **** * */ + +/* Character (0xee): bbw=3, bbh=8, bbx=1, bby=0, width=6 */ +0x00, 0x04, 0xf2, 0x04, 0x00, 0x00, /* * * **** * */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* * * **** * * */ + +/* Character (0xef): bbw=3, bbh=7, bbx=1, bby=0, width=6 */ +0x00, 0x04, 0xf0, 0x04, 0x00, 0x00, /* * **** * */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* * **** * * */ + +/* Character (0xf0): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xe0, 0x16, 0x16, 0x18, 0xf0, 0x00, /* *** ** * ** * ** **** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* *** ** * ** * ** **** * * * */ + +/* Character (0xf1): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xf4, 0x12, 0x14, 0x12, 0xe0, 0x00, /* * **** * * * * * * *** */ +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, /* * **** * * * * * * *** * * */ + +/* Character (0xf2): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xe0, 0x12, 0x14, 0x10, 0xe0, 0x00, /* *** * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* *** * * * * * *** * * * */ + +/* Character (0xf3): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xe0, 0x10, 0x14, 0x12, 0xe0, 0x00, /* *** * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* *** * * * * * *** * * * */ + +/* Character (0xf4): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xe0, 0x14, 0x12, 0x14, 0xe0, 0x00, /* *** * * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* *** * * * * * * *** * * * */ + +/* Character (0xf5): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xe4, 0x12, 0x14, 0x12, 0xe0, 0x00, /* * *** * * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* * *** * * * * * * *** * * * */ + +/* Character (0xf6): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xe0, 0x14, 0x10, 0x14, 0xe0, 0x00, /* *** * * * * * *** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* *** * * * * * *** * * * */ + +/* Character (0xf7): bbw=5, bbh=5, bbx=0, bby=1, width=6 */ +0x20, 0x20, 0xa8, 0x20, 0x20, 0x00, /* * * * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * */ + +/* Character (0xf8): bbw=5, bbh=5, bbx=0, bby=0, width=6 */ +0xe0, 0x90, 0x50, 0x30, 0xe0, 0x00, /* *** * * * * ** *** */ +0x00, 0x01, 0x01, 0x01, 0x00, 0x00, /* *** * * * * ** *** * * * */ + +/* Character (0xf9): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xf0, 0x02, 0x04, 0x80, 0xf0, 0x00, /* **** * * * **** */ +0x00, 0x01, 0x01, 0x00, 0x01, 0x00, /* **** * * * **** * * * */ + +/* Character (0xfa): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xf0, 0x00, 0x04, 0x82, 0xf0, 0x00, /* **** * * * **** */ +0x00, 0x01, 0x01, 0x00, 0x01, 0x00, /* **** * * * **** * * * */ + +/* Character (0xfb): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xf0, 0x04, 0x02, 0x84, 0xf0, 0x00, /* **** * * * * **** */ +0x00, 0x01, 0x01, 0x00, 0x01, 0x00, /* **** * * * * **** * * * */ + +/* Character (0xfc): bbw=5, bbh=7, bbx=0, bby=0, width=6 */ +0xf0, 0x04, 0x00, 0x84, 0xf0, 0x00, /* **** * * * **** */ +0x00, 0x01, 0x01, 0x00, 0x01, 0x00, /* **** * * * **** * * * */ + +/* Character (0xfd): bbw=5, bbh=10, bbx=0, bby=-2, width=6 */ +0xf0, 0x00, 0x04, 0x82, 0xf0, 0x00, /* **** * * * **** */ +0x00, 0x05, 0x05, 0x04, 0x03, 0x00, /* **** * * * **** * ** * *** */ + +/* Character (0xfe): bbw=5, bbh=9, bbx=0, bby=-2, width=6 */ +0xfc, 0x10, 0x10, 0x10, 0xe0, 0x00, /* ****** * * * *** */ +0x07, 0x01, 0x01, 0x01, 0x00, 0x00, /* ****** * * * *** **** * * */ + +/* Character (0xff): bbw=5, bbh=9, bbx=0, bby=-2, width=6 */ +0xf0, 0x04, 0x00, 0x84, 0xf0, 0x00, /* **** * * * **** */ +0x00, 0x05, 0x05, 0x04, 0x03, 0x00, /* **** * * * **** * ** * *** */ +}; + +/* Font structure definition. */ +EXTERN_CONST Font font_gohu = +{ + /* .glyph = */ font_gohu_glyphs, + /* .name = "gohu", */ + /* .width = */ 6, + /* .height = */ 11, + /* .ascent = 9, */ + /* .first = */ 32, + /* .last = */ 255, + /* .offset = */ NULL, + /* .width = */ NULL, +}; diff --git a/2.5/bertos/fonts/helvB10.bdf b/2.5/bertos/fonts/helvB10.bdf new file mode 100644 index 00000000..fe548f54 --- /dev/null +++ b/2.5/bertos/fonts/helvB10.bdf @@ -0,0 +1,3305 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-R-Normal--10-100-75-75-P-60-ISO8859-1 +SIZE 10 75 75 +FONTBOUNDINGBOX 11 13 -1 -2 +COMMENT $XConsortium: helvB10.bdf,v 1.13 95/01/26 18:01:30 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 10 +POINT_SIZE 100 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO8859" +CHARSET_ENCODING "1" +CAP_HEIGHT 8 +X_HEIGHT 6 +FONT_ASCENT 10 +FONT_DESCENT 2 +FACE_NAME "Helvetica Bold" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO8859-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold" +ENDPROPERTIES +CHARS 229 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 8 1 0 +BITMAP +C0 +C0 +C0 +C0 +80 +80 +00 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 5 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +50 +FC +50 +F8 +A0 +A0 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +E0 +70 +38 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +62 +B4 +68 +10 +10 +2C +56 +8C +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +70 +D8 +D8 +70 +DE +CC +DC +76 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 3 0 5 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 10 0 -2 +BITMAP +20 +60 +40 +C0 +C0 +C0 +C0 +40 +60 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 10 0 -2 +BITMAP +80 +C0 +40 +60 +60 +60 +60 +40 +C0 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 4 0 +BBX 3 3 0 5 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 4 0 -2 +BITMAP +40 +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 2 1 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +30 +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +18 +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +18 +30 +18 +18 +D8 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +18 +38 +58 +58 +98 +FC +18 +18 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F0 +18 +98 +D8 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +C0 +F0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +18 +18 +30 +30 +30 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +78 +18 +D8 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 1 6 1 0 +BITMAP +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 8 0 -2 +BITMAP +40 +40 +00 +00 +40 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 5 0 1 +BITMAP +30 +60 +C0 +60 +30 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 5 0 1 +BITMAP +C0 +60 +30 +60 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +18 +30 +60 +60 +00 +60 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 11 0 +BBX 10 9 0 -2 +BITMAP +1F00 +6080 +4D40 +9240 +A240 +A480 +9B00 +4000 +3E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +CC +CC +F8 +CC +CC +CC +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +3C +66 +C2 +C0 +C0 +C2 +66 +3C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F0 +D8 +CC +CC +CC +CC +D8 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +3C +66 +C2 +C0 +CE +C6 +66 +3A +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +18 +18 +18 +18 +D8 +70 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +CC +D8 +F0 +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 10 0 +BBX 9 8 0 0 +BITMAP +C180 +E380 +E380 +F780 +D580 +DD80 +C980 +C980 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +CC +CC +CC +F8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 9 0 -1 +BITMAP +38 +6C +C6 +C6 +C6 +D6 +6C +3C +02 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +CC +CC +CC +F8 +CC +CC +CC +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +78 +CC +E0 +78 +1C +8C +CC +78 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +C6 +C6 +6C +6C +6C +38 +38 +10 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 10 8 0 0 +BITMAP +CCC0 +CCC0 +CCC0 +6D80 +6D80 +7F80 +3300 +2100 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +C6 +C6 +6C +38 +38 +6C +C6 +C6 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +C3 +66 +66 +3C +18 +18 +18 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +FC +0C +18 +30 +70 +60 +C0 +FC +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 10 0 -2 +BITMAP +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 10 0 -2 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 5 4 0 4 +BITMAP +20 +70 +D8 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 3 0 5 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +F0 +D8 +C8 +C8 +D8 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +70 +D0 +C0 +C0 +D0 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +78 +D8 +98 +98 +D8 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +F8 +C0 +D8 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +70 +C0 +E0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +D8 +98 +98 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 0 0 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 10 0 -2 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +C0 +C0 +D8 +F0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 9 0 +BBX 8 6 0 0 +BITMAP +B6 +DB +DB +DB +DB +DB +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +B0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +B0 +D8 +C8 +C8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +D8 +98 +98 +D8 +78 +18 +18 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 4 0 +BBX 4 6 0 0 +BITMAP +B0 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +70 +18 +D8 +70 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 8 0 0 +BITMAP +C0 +C0 +E0 +C0 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +D8 +50 +70 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 6 0 0 +BITMAP +D6 +D6 +D6 +6C +6C +6C +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 6 0 0 +BITMAP +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +78 +30 +30 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 10 0 -2 +BITMAP +30 +60 +60 +60 +C0 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 3 0 +BBX 1 10 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 10 0 -2 +BITMAP +C0 +60 +60 +60 +30 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 2 0 2 +BITMAP +6C +D8 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 8 1 -2 +BITMAP +C0 +00 +40 +40 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +70 +D8 +A0 +A0 +D8 +70 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +68 +60 +F0 +60 +60 +68 +D8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +D8 +70 +D8 +D8 +70 +D8 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +84 +CC +48 +78 +FC +30 +FC +30 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 3 0 +BBX 1 10 1 -2 +BITMAP +80 +80 +80 +80 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +C8 +E0 +70 +98 +C8 +70 +38 +98 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 0 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +3C +42 +99 +A5 +A1 +9D +42 +3C +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 5 0 +BBX 3 5 1 3 +BITMAP +E0 +20 +A0 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 3 0 1 +BITMAP +6C +D8 +6C +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +3C +42 +BD +A5 +B9 +A5 +42 +3C +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 0 7 +BITMAP +E0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 4 0 +BBX 3 3 1 4 +BITMAP +60 +A0 +C0 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +FC +30 +30 +00 +FC +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 3 +BITMAP +60 +A0 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 3 +BITMAP +E0 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 2 0 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +E8 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +7C +E8 +E8 +E8 +68 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 1 0 3 +BITMAP +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 2 0 -2 +BITMAP +40 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 4 0 3 +BITMAP +40 +C0 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 5 0 +BBX 3 5 1 3 +BITMAP +E0 +A0 +E0 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 3 0 1 +BITMAP +D8 +6C +D8 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +42 +C4 +48 +48 +12 +26 +2F +42 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +42 +C4 +48 +48 +16 +2A +24 +4E +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +E2 +44 +28 +C8 +12 +26 +2F +42 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +00 +30 +30 +60 +C0 +D8 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +20 +10 +00 +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +08 +10 +00 +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +10 +28 +00 +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +14 +28 +00 +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +28 +00 +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +10 +28 +10 +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 10 0 +BBX 9 8 0 0 +BITMAP +3F80 +3C00 +6C00 +6F80 +6C00 +FC00 +CC00 +CF80 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 10 0 -2 +BITMAP +3C +66 +C2 +C0 +C0 +C2 +66 +3C +10 +30 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +40 +20 +00 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +10 +20 +00 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +20 +50 +00 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 11 0 0 +BITMAP +80 +40 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 11 0 0 +BITMAP +40 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 0 +BITMAP +40 +A0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +A0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F0 +D8 +CC +EC +CC +CC +D8 +F0 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +14 +28 +00 +C6 +C6 +E6 +D6 +D6 +CE +CE +C6 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +20 +10 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +04 +08 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +10 +28 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +14 +28 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +28 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +3A +6C +CE +D6 +D6 +E6 +6C +B8 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +10 +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +08 +10 +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +10 +28 +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +28 +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +04 +08 +00 +C3 +C3 +66 +66 +3C +18 +18 +18 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +C0 +F8 +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +C8 +C8 +D0 +C8 +C8 +C8 +D0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +40 +20 +00 +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +30 +68 +00 +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +28 +50 +00 +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +50 +50 +00 +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +50 +20 +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 9 0 +BBX 8 6 0 0 +BITMAP +7E +9B +7F +D8 +DB +6E +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 0 -2 +BITMAP +70 +D0 +C0 +C0 +D0 +70 +20 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +D8 +F8 +C0 +D8 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +D8 +F8 +C0 +D8 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +D8 +F8 +C0 +D8 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +50 +00 +70 +D8 +F8 +C0 +D8 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +80 +40 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +20 +40 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 -1 0 +BITMAP +40 +A0 +00 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +A0 +A0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +60 +A0 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +B0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +A0 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +00 +FC +00 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +74 +D8 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +D8 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +D8 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +D8 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +50 +00 +D8 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +D8 +D8 +D8 +D8 +78 +30 +30 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +F0 +D8 +C8 +C8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +50 +50 +00 +D8 +D8 +D8 +D8 +78 +30 +30 +60 +ENDCHAR +STARTCHAR Lslash +ENCODING -1 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 8 -1 0 +BITMAP +60 +60 +60 +70 +E0 +60 +60 +7C +ENDCHAR +STARTCHAR OE +ENCODING -1 +SWIDTH 1000 0 +DWIDTH 10 0 +BBX 9 8 0 0 +BITMAP +3F80 +6C00 +CC00 +CF80 +CC00 +CC00 +6C00 +3F80 +ENDCHAR +STARTCHAR Scaron +ENCODING -1 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +28 +10 +00 +78 +CC +70 +3C +CC +78 +ENDCHAR +STARTCHAR Ydieresis +ENCODING -1 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +14 +00 +C3 +66 +3C +18 +18 +18 +ENDCHAR +STARTCHAR Zcaron +ENCODING -1 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +28 +10 +00 +FC +18 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR breve +ENCODING -1 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 2 0 6 +BITMAP +90 +60 +ENDCHAR +STARTCHAR bullet +ENCODING -1 +SWIDTH 350 0 +DWIDTH 4 0 +BBX 2 2 1 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR caron +ENCODING -1 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 6 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING -1 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 6 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR dagger +ENCODING -1 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 -2 +BITMAP +30 +30 +FC +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR daggerdbl +ENCODING -1 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 -2 +BITMAP +30 +30 +FC +30 +30 +30 +FC +30 +30 +30 +ENDCHAR +STARTCHAR dotaccent +ENCODING -1 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 1 1 0 7 +BITMAP +80 +ENDCHAR +STARTCHAR dotlessi +ENCODING -1 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 6 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR ellipsis +ENCODING -1 +SWIDTH 1000 0 +DWIDTH 10 0 +BBX 8 1 1 0 +BITMAP +DB +ENDCHAR +STARTCHAR emdash +ENCODING -1 +SWIDTH 1000 0 +DWIDTH 10 0 +BBX 10 1 0 3 +BITMAP +FFC0 +ENDCHAR +STARTCHAR endash +ENCODING -1 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR fi +ENCODING -1 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 8 -1 0 +BITMAP +36 +60 +F6 +66 +66 +66 +66 +66 +ENDCHAR +STARTCHAR fl +ENCODING -1 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 8 -1 0 +BITMAP +36 +66 +F6 +66 +66 +66 +66 +66 +ENDCHAR +STARTCHAR florin +ENCODING -1 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +38 +60 +F8 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR fraction +ENCODING -1 +SWIDTH 167 0 +DWIDTH 4 0 +BBX 5 7 -1 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR grave +ENCODING -1 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 2 0 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING -1 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 3 1 1 +BITMAP +60 +C0 +60 +ENDCHAR +STARTCHAR guilsinglright +ENCODING -1 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 3 1 1 +BITMAP +C0 +60 +C0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING -1 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 2 0 6 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR lslash +ENCODING -1 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 8 -1 0 +BITMAP +60 +60 +60 +70 +E0 +60 +60 +60 +ENDCHAR +STARTCHAR oe +ENCODING -1 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 9 6 0 0 +BITMAP +7700 +CD80 +CF80 +CC00 +CD80 +7700 +ENDCHAR +STARTCHAR ogonek +ENCODING -1 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 2 0 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR perthousand +ENCODING -1 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +6200 +B400 +6800 +1000 +2D80 +56C0 +8D80 +ENDCHAR +STARTCHAR quotedblbase +ENCODING -1 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblleft +ENCODING -1 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 5 +BITMAP +48 +90 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING -1 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 5 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING -1 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 3 0 -2 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotesingle +ENCODING -1 +SWIDTH 238 0 +DWIDTH 3 0 +BBX 1 3 1 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR ring +ENCODING -1 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 3 0 5 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR scaron +ENCODING -1 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +70 +D8 +70 +18 +D8 +70 +ENDCHAR +STARTCHAR tilde +ENCODING -1 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 2 0 6 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR trademark +ENCODING -1 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 9 4 1 3 +BITMAP +E880 +4D80 +4A80 +4A80 +ENDCHAR +STARTCHAR zcaron +ENCODING -1 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +F8 +18 +30 +60 +C0 +F8 +ENDCHAR +ENDFONT diff --git a/2.5/bertos/fonts/helvB10.c b/2.5/bertos/fonts/helvB10.c new file mode 100644 index 00000000..b3282ced --- /dev/null +++ b/2.5/bertos/fonts/helvB10.c @@ -0,0 +1,1248 @@ +/* Generated by convbdf on Wed Apr 28 00:42:58 CEST 2010. */ +#include + +/* Font information: + + name: -Adobe-Helvetica-Bold-R-Normal--10-100-75-75-P-60-ISO8859-1 + pixel size: 10 + ascent: 10 + descent: 2 +*/ + +/* Font character bitmap data. */ +static const PROGMEM uint8_t font_helvB10_glyphs[] = { + +/* Character (0x20): bbw=1, bbh=1, bbx=0, bby=0, width=3 */ +0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, /* */ + +/* Character (0x21): bbw=2, bbh=8, bbx=1, bby=0, width=4 */ +0x00, 0xfc, 0x3c, 0x00, /* ****** **** */ +0x00, 0x02, 0x02, 0x00, /* ****** **** * * */ + +/* Character (0x22): bbw=3, bbh=3, bbx=1, bby=5, width=5 */ +0x00, 0x1c, 0x00, 0x1c, 0x00, /* *** *** */ +0x00, 0x00, 0x00, 0x00, 0x00, /* *** *** */ + +/* Character (0x23): bbw=6, bbh=7, bbx=0, bby=0, width=6 */ +0xa0, 0xf8, 0xa0, 0xf8, 0xa0, 0x20, /* * * ***** * * ***** * * * */ +0x03, 0x00, 0x03, 0x00, 0x00, 0x00, /* * * ***** * * ***** * * * ** ** */ + +/* Character (0x24): bbw=5, bbh=9, bbx=0, bby=-1, width=6 */ +0x30, 0x68, 0xfc, 0xc8, 0x90, 0x00, /* ** * ** ****** * ** * * */ +0x01, 0x02, 0x07, 0x02, 0x01, 0x00, /* ** * ** ****** * ** * * * * *** * * */ + +/* Character (0x25): bbw=7, bbh=8, bbx=0, bby=0, width=8 */ +0x08, 0x14, 0x9c, 0x68, 0x90, 0x88, 0x04, 0x00, /* * * * *** * * ** * * * * * */ +0x02, 0x01, 0x00, 0x01, 0x02, 0x03, 0x01, 0x00, /* * * * *** * * ** * * * * * * * * * ** * */ + +/* Character (0x26): bbw=7, bbh=8, bbx=0, bby=0, width=8 */ +0xd8, 0xfc, 0x24, 0x7c, 0xd8, 0xc0, 0x40, 0x00, /* ** ** ****** * * ***** ** ** ** * */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x03, 0x02, 0x00, /* ** ** ****** * * ***** ** ** ** * * ** * ** * ** * */ + +/* Character (0x27): bbw=2, bbh=3, bbx=0, bby=5, width=3 */ +0x14, 0x0c, 0x00, /* * * ** */ +0x00, 0x00, 0x00, /* * * ** */ + +/* Character (0x28): bbw=3, bbh=10, bbx=0, bby=-2, width=4 */ +0xe0, 0xf8, 0x0c, 0x00, /* *** ***** ** */ +0x01, 0x07, 0x0c, 0x00, /* *** ***** ** * *** ** */ + +/* Character (0x29): bbw=3, bbh=10, bbx=0, bby=-2, width=4 */ +0x0c, 0xf8, 0xe0, 0x00, /* ** ***** *** */ +0x0c, 0x07, 0x01, 0x00, /* ** ***** *** ***** * */ + +/* Character (0x2a): bbw=3, bbh=3, bbx=0, bby=5, width=4 */ +0x14, 0x08, 0x14, 0x00, /* * * * * * */ +0x00, 0x00, 0x00, 0x00, /* * * * * * */ + +/* Character (0x2b): bbw=6, bbh=5, bbx=0, bby=1, width=6 */ +0x40, 0x40, 0xf0, 0xf0, 0x40, 0x40, /* * * **** **** * * */ +0x00, 0x00, 0x01, 0x01, 0x00, 0x00, /* * * **** **** * * * * */ + +/* Character (0x2c): bbw=2, bbh=4, bbx=0, bby=-2, width=3 */ +0x00, 0x00, 0x00, /* */ +0x08, 0x07, 0x00, /* **** */ + +/* Character (0x2d): bbw=5, bbh=1, bbx=1, bby=3, width=7 */ +0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, /* * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * */ + +/* Character (0x2e): bbw=1, bbh=2, bbx=1, bby=0, width=3 */ +0x00, 0x00, 0x00, /* */ +0x00, 0x03, 0x00, /* ** */ + +/* Character (0x2f): bbw=4, bbh=8, bbx=0, bby=0, width=4 */ +0x00, 0xc0, 0x30, 0x0c, /* ** ** ** */ +0x03, 0x00, 0x00, 0x00, /* ** ** ** ** */ + +/* Character (0x30): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xf8, 0xfc, 0x04, 0xfc, 0xf8, 0x00, /* ***** ****** * ****** ***** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* ***** ****** * ****** ***** * ** * ** * */ + +/* Character (0x31): bbw=4, bbh=8, bbx=0, bby=0, width=6 */ +0x08, 0x08, 0xfc, 0xfc, 0x00, 0x00, /* * * ****** ****** */ +0x00, 0x00, 0x03, 0x03, 0x00, 0x00, /* * * ****** ****** ** ** */ + +/* Character (0x32): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x08, 0x8c, 0xc4, 0x7c, 0x38, 0x00, /* * ** * * ** ***** *** */ +0x03, 0x03, 0x02, 0x02, 0x02, 0x00, /* * ** * * ** ***** *** ** ** * * * */ + +/* Character (0x33): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x08, 0x0c, 0x24, 0xfc, 0xd8, 0x00, /* * ** * * ****** ** ** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* * ** * * ****** ** ** * ** * ** * */ + +/* Character (0x34): bbw=6, bbh=8, bbx=0, bby=0, width=6 */ +0xc0, 0xb0, 0x88, 0xfc, 0xfc, 0x80, /* ** ** * * * ****** ****** * */ +0x00, 0x00, 0x00, 0x03, 0x03, 0x00, /* ** ** * * * ****** ****** * ** ** */ + +/* Character (0x35): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xbc, 0x3c, 0x24, 0xe4, 0xc4, 0x00, /* **** * **** * * * *** * ** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* **** * **** * * * *** * ** * ** * ** * */ + +/* Character (0x36): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xf8, 0xfc, 0x24, 0xec, 0xc8, 0x00, /* ***** ****** * * ** *** * ** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* ***** ****** * * ** *** * ** * ** * ** * */ + +/* Character (0x37): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x04, 0x04, 0xe4, 0xfc, 0x1c, 0x00, /* * * * *** ****** *** */ +0x00, 0x03, 0x03, 0x00, 0x00, 0x00, /* * * * *** ****** *** ** ** */ + +/* Character (0x38): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xd8, 0xfc, 0x24, 0xfc, 0xd8, 0x00, /* ** ** ****** * * ****** ** ** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* ** ** ****** * * ****** ** ** * ** * ** * */ + +/* Character (0x39): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x38, 0x7c, 0x44, 0xfc, 0xf8, 0x00, /* *** ***** * * ****** ***** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* *** ***** * * ****** ***** * ** * ** * */ + +/* Character (0x3a): bbw=1, bbh=6, bbx=1, bby=0, width=3 */ +0x00, 0x30, 0x00, /* ** */ +0x00, 0x03, 0x00, /* ** ** */ + +/* Character (0x3b): bbw=2, bbh=8, bbx=0, bby=-2, width=3 */ +0x00, 0x30, 0x00, /* ** */ +0x08, 0x07, 0x00, /* ** **** */ + +/* Character (0x3c): bbw=4, bbh=5, bbx=0, bby=1, width=5 */ +0x40, 0xe0, 0xb0, 0x10, 0x00, /* * *** ** * * */ +0x00, 0x00, 0x01, 0x01, 0x00, /* * *** ** * * * * */ + +/* Character (0x3d): bbw=5, bbh=3, bbx=0, bby=2, width=6 */ +0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x00, /* * * * * * * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * * * */ + +/* Character (0x3e): bbw=4, bbh=5, bbx=0, bby=1, width=5 */ +0x10, 0xb0, 0xe0, 0x40, 0x00, /* * ** * *** * */ +0x01, 0x01, 0x00, 0x00, 0x00, /* * ** * *** * * * */ + +/* Character (0x3f): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x08, 0xcc, 0xe4, 0x3c, 0x18, 0x00, /* * ** ** * *** **** ** */ +0x00, 0x02, 0x02, 0x00, 0x00, 0x00, /* * ** ** * *** **** ** * * */ + +/* Character (0x40): bbw=10, bbh=9, bbx=0, bby=-2, width=11 */ +0xc0, 0x30, 0x90, 0x48, 0x28, 0x28, 0xc8, 0x28, 0x10, 0xe0, 0x00, /* ** ** * * * * * * * * * ** * * * *** */ +0x03, 0x04, 0x09, 0x0a, 0x0a, 0x09, 0x0a, 0x02, 0x01, 0x00, 0x00, /* ** ** * * * * * * * * * ** * * * *** ** * * * * * * ** * * * * * */ + +/* Character (0x41): bbw=7, bbh=8, bbx=0, bby=0, width=8 */ +0x80, 0xf0, 0xfc, 0x8c, 0xfc, 0xf0, 0x80, 0x00, /* * **** ****** ** * ****** **** * */ +0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, /* * **** ****** ** * ****** **** * ** ** ** ** */ + +/* Character (0x42): bbw=6, bbh=8, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x24, 0x24, 0xfc, 0xd8, 0x00, /* ****** ****** * * * * ****** ** ** */ +0x03, 0x03, 0x02, 0x02, 0x03, 0x01, 0x00, /* ****** ****** * * * * ****** ** ** ** ** * * ** * */ + +/* Character (0x43): bbw=7, bbh=8, bbx=0, bby=0, width=8 */ +0xf0, 0xf8, 0x0c, 0x04, 0x04, 0x0c, 0x98, 0x00, /* **** ***** ** * * ** ** * */ +0x00, 0x01, 0x03, 0x02, 0x02, 0x03, 0x01, 0x00, /* **** ***** ** * * ** ** * * ** * * ** * */ + +/* Character (0x44): bbw=6, bbh=8, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x04, 0x0c, 0xf8, 0xf0, 0x00, /* ****** ****** * ** ***** **** */ +0x03, 0x03, 0x02, 0x03, 0x01, 0x00, 0x00, /* ****** ****** * ** ***** **** ** ** * ** * */ + +/* Character (0x45): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfc, 0xfc, 0x24, 0x24, 0x24, 0x00, /* ****** ****** * * * * * * */ +0x03, 0x03, 0x02, 0x02, 0x02, 0x00, /* ****** ****** * * * * * * ** ** * * * */ + +/* Character (0x46): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfc, 0xfc, 0x24, 0x24, 0x04, 0x00, /* ****** ****** * * * * * */ +0x03, 0x03, 0x00, 0x00, 0x00, 0x00, /* ****** ****** * * * * * ** ** */ + +/* Character (0x47): bbw=7, bbh=8, bbx=0, bby=0, width=8 */ +0xf0, 0xf8, 0x0c, 0x04, 0x44, 0xcc, 0xd8, 0x00, /* **** ***** ** * * * ** ** ** ** */ +0x00, 0x01, 0x03, 0x02, 0x02, 0x01, 0x03, 0x00, /* **** ***** ** * * * ** ** ** ** * ** * * * ** */ + +/* Character (0x48): bbw=6, bbh=8, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x20, 0x20, 0xfc, 0xfc, 0x00, /* ****** ****** * * ****** ****** */ +0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, /* ****** ****** * * ****** ****** ** ** ** ** */ + +/* Character (0x49): bbw=2, bbh=8, bbx=0, bby=0, width=3 */ +0xfc, 0xfc, 0x00, /* ****** ****** */ +0x03, 0x03, 0x00, /* ****** ****** ** ** */ + +/* Character (0x4a): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x00, 0x00, 0x00, 0xfc, 0xfc, 0x00, /* ****** ****** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* ****** ****** * ** * ** * */ + +/* Character (0x4b): bbw=7, bbh=8, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x70, 0xd8, 0x8c, 0x04, 0x00, /* ****** ****** *** ** ** ** * * */ +0x03, 0x03, 0x00, 0x00, 0x01, 0x03, 0x02, /* ****** ****** *** ** ** ** * * ** ** * ** * */ + +/* Character (0x4c): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, /* ****** ****** */ +0x03, 0x03, 0x02, 0x02, 0x02, 0x00, /* ****** ****** ** ** * * * */ + +/* Character (0x4d): bbw=9, bbh=8, bbx=0, bby=0, width=10 */ +0xfc, 0xfc, 0x38, 0xe0, 0x80, 0xe0, 0x38, 0xfc, 0xfc, 0x00, /* ****** ****** *** *** * *** *** ****** ****** */ +0x03, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, /* ****** ****** *** *** * *** *** ****** ****** ** ** ** ** ** */ + +/* Character (0x4e): bbw=7, bbh=8, bbx=0, bby=0, width=8 */ +0xfc, 0xfc, 0x18, 0x60, 0x80, 0xfc, 0xfc, 0x00, /* ****** ****** ** ** * ****** ****** */ +0x03, 0x03, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, /* ****** ****** ** ** * ****** ****** ** ** * ** ** */ + +/* Character (0x4f): bbw=7, bbh=8, bbx=0, bby=0, width=8 */ +0xf0, 0xf8, 0x0c, 0x04, 0x0c, 0xf8, 0xf0, 0x00, /* **** ***** ** * ** ***** **** */ +0x00, 0x01, 0x03, 0x02, 0x03, 0x01, 0x00, 0x00, /* **** ***** ** * ** ***** **** * ** * ** * */ + +/* Character (0x50): bbw=6, bbh=8, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x44, 0x44, 0x7c, 0x38, 0x00, /* ****** ****** * * * * ***** *** */ +0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, /* ****** ****** * * * * ***** *** ** ** */ + +/* Character (0x51): bbw=7, bbh=9, bbx=0, bby=-1, width=8 */ +0xf0, 0xf8, 0x0c, 0x84, 0x0c, 0xf8, 0xf0, 0x00, /* **** ***** ** * * ** ***** **** */ +0x00, 0x01, 0x03, 0x02, 0x03, 0x03, 0x04, 0x00, /* **** ***** ** * * ** ***** **** * ** * ** ** * */ + +/* Character (0x52): bbw=6, bbh=8, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x44, 0x44, 0xfc, 0xb8, 0x00, /* ****** ****** * * * * ****** *** * */ +0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, /* ****** ****** * * * * ****** *** * ** ** ** ** */ + +/* Character (0x53): bbw=6, bbh=8, bbx=0, bby=0, width=7 */ +0x98, 0x3c, 0x34, 0x64, 0xec, 0xc8, 0x00, /* ** * **** * ** * ** ** *** * ** */ +0x01, 0x03, 0x02, 0x02, 0x03, 0x01, 0x00, /* ** * **** * ** * ** ** *** * ** * ** * * ** * */ + +/* Character (0x54): bbw=6, bbh=8, bbx=0, bby=0, width=7 */ +0x04, 0x04, 0xfc, 0xfc, 0x04, 0x04, 0x00, /* * * ****** ****** * * */ +0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, /* * * ****** ****** * * ** ** */ + +/* Character (0x55): bbw=6, bbh=8, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x00, 0x00, 0xfc, 0xfc, 0x00, /* ****** ****** ****** ****** */ +0x01, 0x03, 0x02, 0x02, 0x03, 0x01, 0x00, /* ****** ****** ****** ****** * ** * * ** * */ + +/* Character (0x56): bbw=7, bbh=8, bbx=0, bby=0, width=8 */ +0x0c, 0x7c, 0xf0, 0x80, 0xf0, 0x7c, 0x0c, 0x00, /* ** ***** **** * **** ***** ** */ +0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, /* ** ***** **** * **** ***** ** * ** * */ + +/* Character (0x57): bbw=10, bbh=8, bbx=0, bby=0, width=11 */ +0x1c, 0xfc, 0xe0, 0x80, 0xfc, 0xfc, 0x80, 0xe0, 0xfc, 0x1c, 0x00, /* *** ****** *** * ****** ****** * *** ****** *** */ +0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, /* *** ****** *** * ****** ****** * *** ****** *** ** * * ** */ + +/* Character (0x58): bbw=7, bbh=8, bbx=0, bby=0, width=8 */ +0x0c, 0x9c, 0xf0, 0x60, 0xf0, 0x9c, 0x0c, 0x00, /* ** *** * **** ** **** *** * ** */ +0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, /* ** *** * **** ** **** *** * ** ** ** ** ** */ + +/* Character (0x59): bbw=8, bbh=8, bbx=0, bby=0, width=9 */ +0x0c, 0x3c, 0x70, 0xc0, 0xc0, 0x70, 0x3c, 0x0c, 0x00, /* ** **** *** ** ** *** **** ** */ +0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, /* ** **** *** ** ** *** **** ** ** ** */ + +/* Character (0x5a): bbw=6, bbh=8, bbx=0, bby=0, width=7 */ +0x04, 0xc4, 0xe4, 0x74, 0x1c, 0x0c, 0x00, /* * * ** * *** * *** *** ** */ +0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x00, /* * * ** * *** * *** *** ** ** ** * * * * */ + +/* Character (0x5b): bbw=3, bbh=10, bbx=0, bby=-2, width=4 */ +0xfc, 0xfc, 0x04, 0x00, /* ****** ****** * */ +0x0f, 0x0f, 0x08, 0x00, /* ****** ****** * ******** * */ + +/* Character (0x5c): bbw=4, bbh=8, bbx=0, bby=0, width=4 */ +0x0c, 0x30, 0xc0, 0x00, /* ** ** ** */ +0x00, 0x00, 0x00, 0x03, /* ** ** ** ** */ + +/* Character (0x5d): bbw=3, bbh=10, bbx=0, bby=-2, width=4 */ +0x04, 0xfc, 0xfc, 0x00, /* * ****** ****** */ +0x08, 0x0f, 0x0f, 0x00, /* * ****** ****** ********* */ + +/* Character (0x5e): bbw=5, bbh=4, bbx=0, bby=4, width=5 */ +0x30, 0x18, 0x0c, 0x18, 0x30, /* ** ** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ** ** */ + +/* Character (0x5f): bbw=6, bbh=1, bbx=0, bby=-2, width=6 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x08, 0x08, 0x08, 0x08, 0x08, 0x08, /* * * * * * * */ + +/* Character (0x60): bbw=2, bbh=3, bbx=0, bby=5, width=3 */ +0x18, 0x14, 0x00, /* ** * * */ +0x00, 0x00, 0x00, /* ** * * */ + +/* Character (0x61): bbw=6, bbh=6, bbx=0, bby=0, width=6 */ +0xa0, 0xd0, 0x50, 0xf0, 0xe0, 0x00, /* * * * ** * * **** *** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x02, /* * * * ** * * **** *** * ** * * ** * */ + +/* Character (0x62): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfc, 0xfc, 0x10, 0x30, 0xe0, 0x00, /* ****** ****** * ** *** */ +0x03, 0x03, 0x02, 0x03, 0x01, 0x00, /* ****** ****** * ** *** ** ** * ** * */ + +/* Character (0x63): bbw=4, bbh=6, bbx=0, bby=0, width=5 */ +0xe0, 0xf0, 0x10, 0x30, 0x00, /* *** **** * ** */ +0x01, 0x03, 0x02, 0x03, 0x00, /* *** **** * ** * ** * ** */ + +/* Character (0x64): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xe0, 0x30, 0x10, 0xfc, 0xfc, 0x00, /* *** ** * ****** ****** */ +0x01, 0x03, 0x02, 0x03, 0x03, 0x00, /* *** ** * ****** ****** * ** * ** ** */ + +/* Character (0x65): bbw=5, bbh=6, bbx=0, bby=0, width=6 */ +0xe0, 0xf0, 0x50, 0x70, 0x60, 0x00, /* *** **** * * *** ** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* *** **** * * *** ** * ** * ** * */ + +/* Character (0x66): bbw=4, bbh=8, bbx=0, bby=0, width=4 */ +0xf8, 0xfc, 0x14, 0x04, /* ***** ****** * * * */ +0x03, 0x03, 0x00, 0x00, /* ***** ****** * * * ** ** */ + +/* Character (0x67): bbw=5, bbh=8, bbx=0, bby=-2, width=6 */ +0xe0, 0x30, 0x10, 0xe0, 0xf0, 0x00, /* *** ** * *** **** */ +0x01, 0x0b, 0x0a, 0x0f, 0x07, 0x00, /* *** ** * *** **** * ** * * ******** */ + +/* Character (0x68): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xfc, 0xfc, 0x10, 0xf0, 0xe0, 0x00, /* ****** ****** * **** *** */ +0x03, 0x03, 0x00, 0x03, 0x03, 0x00, /* ****** ****** * **** *** ** ** ** ** */ + +/* Character (0x69): bbw=2, bbh=8, bbx=0, bby=0, width=3 */ +0xf4, 0xf4, 0x00, /* * **** * **** */ +0x03, 0x03, 0x00, /* * **** * **** ** ** */ + +/* Character (0x6a): bbw=2, bbh=10, bbx=0, bby=-2, width=3 */ +0xf4, 0xf4, 0x00, /* * **** * **** */ +0x0f, 0x07, 0x00, /* * **** * **** ******* */ + +/* Character (0x6b): bbw=6, bbh=8, bbx=0, bby=0, width=6 */ +0xfc, 0xfc, 0xe0, 0xb0, 0x10, 0x00, /* ****** ****** *** ** * * */ +0x03, 0x03, 0x00, 0x01, 0x03, 0x02, /* ****** ****** *** ** * * ** ** * ** * */ + +/* Character (0x6c): bbw=2, bbh=8, bbx=0, bby=0, width=3 */ +0xfc, 0xfc, 0x00, /* ****** ****** */ +0x03, 0x03, 0x00, /* ****** ****** ** ** */ + +/* Character (0x6d): bbw=8, bbh=6, bbx=0, bby=0, width=9 */ +0xf0, 0xe0, 0x10, 0xf0, 0xe0, 0x10, 0xf0, 0xe0, 0x00, /* **** *** * **** *** * **** *** */ +0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, /* **** *** * **** *** * **** *** ** ** ** ** ** ** */ + +/* Character (0x6e): bbw=5, bbh=6, bbx=0, bby=0, width=6 */ +0xf0, 0xe0, 0x10, 0xf0, 0xe0, 0x00, /* **** *** * **** *** */ +0x03, 0x03, 0x00, 0x03, 0x03, 0x00, /* **** *** * **** *** ** ** ** ** */ + +/* Character (0x6f): bbw=5, bbh=6, bbx=0, bby=0, width=6 */ +0xe0, 0xf0, 0x10, 0xf0, 0xe0, 0x00, /* *** **** * **** *** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* *** **** * **** *** * ** * ** * */ + +/* Character (0x70): bbw=5, bbh=8, bbx=0, bby=-2, width=6 */ +0xf0, 0xe0, 0x10, 0x30, 0xe0, 0x00, /* **** *** * ** *** */ +0x0f, 0x0f, 0x02, 0x03, 0x01, 0x00, /* **** *** * ** *** ******** * ** * */ + +/* Character (0x71): bbw=5, bbh=8, bbx=0, bby=-2, width=6 */ +0xe0, 0x30, 0x10, 0xe0, 0xf0, 0x00, /* *** ** * *** **** */ +0x01, 0x03, 0x02, 0x0f, 0x0f, 0x00, /* *** ** * *** **** * ** * ******** */ + +/* Character (0x72): bbw=4, bbh=6, bbx=0, bby=0, width=4 */ +0xf0, 0xe0, 0x30, 0x10, /* **** *** ** * */ +0x03, 0x03, 0x00, 0x00, /* **** *** ** * ** ** */ + +/* Character (0x73): bbw=5, bbh=6, bbx=0, bby=0, width=6 */ +0x20, 0x70, 0x50, 0xf0, 0xa0, 0x00, /* * *** * * **** * * */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* * *** * * **** * * * ** * ** * */ + +/* Character (0x74): bbw=3, bbh=8, bbx=0, bby=0, width=4 */ +0xfc, 0xfc, 0x10, 0x00, /* ****** ****** * */ +0x01, 0x03, 0x02, 0x00, /* ****** ****** * * ** * */ + +/* Character (0x75): bbw=5, bbh=6, bbx=0, bby=0, width=6 */ +0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0x00, /* **** **** **** **** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x00, /* **** **** **** **** * ** * * ** */ + +/* Character (0x76): bbw=5, bbh=6, bbx=0, bby=0, width=6 */ +0x70, 0xf0, 0x00, 0xf0, 0x70, 0x00, /* *** **** **** *** */ +0x00, 0x01, 0x03, 0x01, 0x00, 0x00, /* *** **** **** *** * ** * */ + +/* Character (0x77): bbw=7, bbh=6, bbx=0, bby=0, width=8 */ +0x70, 0xf0, 0x80, 0x70, 0x80, 0xf0, 0x70, 0x00, /* *** **** * *** * **** *** */ +0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x00, /* *** **** * *** * **** *** ** ** ** ** */ + +/* Character (0x78): bbw=6, bbh=6, bbx=0, bby=0, width=7 */ +0x10, 0xb0, 0xe0, 0xe0, 0xb0, 0x10, 0x00, /* * ** * *** *** ** * * */ +0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, /* * ** * *** *** ** * * ** ** ** ** */ + +/* Character (0x79): bbw=5, bbh=8, bbx=0, bby=-2, width=6 */ +0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0x00, /* **** **** **** **** */ +0x00, 0x09, 0x0f, 0x07, 0x01, 0x00, /* **** **** **** **** * ******** * */ + +/* Character (0x7a): bbw=5, bbh=6, bbx=0, bby=0, width=6 */ +0x10, 0x90, 0xd0, 0x70, 0x30, 0x00, /* * * * * ** *** ** */ +0x03, 0x03, 0x02, 0x02, 0x02, 0x00, /* * * * * ** *** ** ** ** * * * */ + +/* Character (0x7b): bbw=4, bbh=10, bbx=0, bby=-2, width=5 */ +0x40, 0xf8, 0xbc, 0x04, 0x00, /* * ***** **** * * */ +0x00, 0x07, 0x0f, 0x08, 0x00, /* * ***** **** * * *** **** * */ + +/* Character (0x7c): bbw=1, bbh=10, bbx=1, bby=-2, width=3 */ +0x00, 0xfc, 0x00, /* ****** */ +0x00, 0x0f, 0x00, /* ****** **** */ + +/* Character (0x7d): bbw=4, bbh=10, bbx=0, bby=-2, width=5 */ +0x04, 0xbc, 0xf8, 0x40, 0x00, /* * **** * ***** * */ +0x08, 0x0f, 0x07, 0x00, 0x00, /* * **** * ***** * ******** */ + +/* Character (0x7e): bbw=6, bbh=2, bbx=0, bby=2, width=6 */ +0x80, 0xc0, 0x40, 0x80, 0xc0, 0x40, /* * ** * * ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** * * ** * */ + +/* Character (0xa0): bbw=1, bbh=1, bbx=0, bby=0, width=3 */ +0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, /* */ + +/* Character (0xa1): bbw=2, bbh=8, bbx=1, bby=-2, width=4 */ +0x00, 0x10, 0xd0, 0x00, /* * * ** */ +0x00, 0x0f, 0x0f, 0x00, /* * * ** ******** */ + +/* Character (0xa2): bbw=5, bbh=8, bbx=0, bby=-1, width=6 */ +0xe0, 0x30, 0xd0, 0x38, 0x20, 0x00, /* *** ** * ** *** * */ +0x01, 0x07, 0x02, 0x03, 0x01, 0x00, /* *** ** * ** *** * * *** * ** * */ + +/* Character (0xa3): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0x20, 0xf8, 0xfc, 0x24, 0x0c, 0x00, /* * ***** ****** * * ** */ +0x02, 0x03, 0x01, 0x02, 0x03, 0x00, /* * ***** ****** * * ** * ** * * ** */ + +/* Character (0xa4): bbw=5, bbh=6, bbx=0, bby=1, width=6 */ +0x68, 0xf8, 0x90, 0xf8, 0x68, 0x00, /* * ** ***** * * ***** * ** */ +0x01, 0x01, 0x00, 0x01, 0x01, 0x00, /* * ** ***** * * ***** * ** * * * * */ + +/* Character (0xa5): bbw=6, bbh=8, bbx=0, bby=0, width=7 */ +0x4c, 0x78, 0xe0, 0xe0, 0x78, 0x4c, 0x00, /* ** * **** *** *** **** ** * */ +0x01, 0x01, 0x03, 0x03, 0x01, 0x01, 0x00, /* ** * **** *** *** **** ** * * * ** ** * * */ + +/* Character (0xa6): bbw=1, bbh=10, bbx=1, bby=-2, width=3 */ +0x00, 0x3c, 0x00, /* **** */ +0x00, 0x0f, 0x00, /* **** **** */ + +/* Character (0xa7): bbw=5, bbh=10, bbx=0, bby=-2, width=6 */ +0xd8, 0xbc, 0x34, 0x64, 0xc8, 0x00, /* ** ** **** * * ** * ** * ** */ +0x04, 0x09, 0x0b, 0x0f, 0x06, 0x00, /* ** ** **** * * ** * ** * ** * * *** ***** ** */ + +/* Character (0xa8): bbw=3, bbh=1, bbx=0, bby=7, width=3 */ +0x04, 0x00, 0x04, /* * * */ +0x00, 0x00, 0x00, /* * * */ + +/* Character (0xa9): bbw=8, bbh=8, bbx=1, bby=0, width=10 */ +0x00, 0xf0, 0x08, 0x64, 0x94, 0x94, 0xa4, 0x08, 0xf0, 0x00, /* **** * * ** * * * * * * * * * * **** */ +0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, /* **** * * ** * * * * * * * * * * **** * * * * * * */ + +/* Character (0xaa): bbw=3, bbh=5, bbx=1, bby=3, width=5 */ +0x00, 0x54, 0x44, 0x5c, 0x00, /* * * * * * *** * */ +0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * *** * */ + +/* Character (0xab): bbw=6, bbh=3, bbx=0, bby=1, width=7 */ +0x80, 0xc0, 0x40, 0x80, 0xc0, 0x40, 0x00, /* * ** * * ** * */ +0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, /* * ** * * ** * * * * * */ + +/* Character (0xac): bbw=5, bbh=3, bbx=1, bby=2, width=7 */ +0x00, 0x20, 0x20, 0x20, 0x20, 0xe0, 0x00, /* * * * * *** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * *** */ + +/* Character (0xad): bbw=4, bbh=1, bbx=0, bby=3, width=5 */ +0x40, 0x40, 0x40, 0x40, 0x00, /* * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * */ + +/* Character (0xae): bbw=8, bbh=8, bbx=1, bby=0, width=10 */ +0x00, 0xf0, 0x08, 0xf4, 0x54, 0x54, 0xb4, 0x08, 0xf0, 0x00, /* **** * * **** * * * * * * * ** * * **** */ +0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, /* **** * * **** * * * * * * * ** * * **** * * * * * * */ + +/* Character (0xaf): bbw=3, bbh=1, bbx=0, bby=7, width=3 */ +0x04, 0x04, 0x04, /* * * * */ +0x00, 0x00, 0x00, /* * * * */ + +/* Character (0xb0): bbw=3, bbh=3, bbx=1, bby=4, width=4 */ +0x00, 0x30, 0x28, 0x18, /* ** * * ** */ +0x00, 0x00, 0x00, 0x00, /* ** * * ** */ + +/* Character (0xb1): bbw=6, bbh=7, bbx=0, bby=0, width=6 */ +0x20, 0x20, 0xf8, 0xf8, 0x20, 0x20, /* * * ***** ***** * * */ +0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* * * ***** ***** * * * * * * * * */ + +/* Character (0xb2): bbw=3, bbh=4, bbx=0, bby=3, width=3 */ +0x50, 0x68, 0x58, /* * * * ** ** * */ +0x00, 0x00, 0x00, /* * * * ** ** * */ + +/* Character (0xb3): bbw=3, bbh=4, bbx=0, bby=3, width=3 */ +0x48, 0x58, 0x28, /* * * ** * * * */ +0x00, 0x00, 0x00, /* * * ** * * * */ + +/* Character (0xb4): bbw=2, bbh=2, bbx=0, bby=7, width=3 */ +0x04, 0x02, 0x00, /* * * */ +0x00, 0x00, 0x00, /* * * */ + +/* Character (0xb5): bbw=5, bbh=8, bbx=0, bby=-2, width=6 */ +0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0x00, /* **** **** **** **** */ +0x0f, 0x0f, 0x02, 0x01, 0x03, 0x00, /* **** **** **** **** ******** * * ** */ + +/* Character (0xb6): bbw=6, bbh=10, bbx=0, bby=-2, width=6 */ +0x38, 0x7c, 0xfc, 0x04, 0xfc, 0x04, /* *** ***** ****** * ****** * */ +0x00, 0x00, 0x0f, 0x00, 0x0f, 0x00, /* *** ***** ****** * ****** * **** **** */ + +/* Character (0xb7): bbw=2, bbh=1, bbx=0, bby=3, width=3 */ +0x40, 0x40, 0x00, /* * * */ +0x00, 0x00, 0x00, /* * * */ + +/* Character (0xb8): bbw=2, bbh=2, bbx=0, bby=-2, width=3 */ +0x00, 0x00, 0x00, /* */ +0x08, 0x0c, 0x00, /* * ** */ + +/* Character (0xb9): bbw=2, bbh=4, bbx=0, bby=3, width=3 */ +0x10, 0x78, 0x00, /* * **** */ +0x00, 0x00, 0x00, /* * **** */ + +/* Character (0xba): bbw=3, bbh=5, bbx=1, bby=3, width=5 */ +0x00, 0x5c, 0x54, 0x5c, 0x00, /* *** * * * * *** * */ +0x00, 0x00, 0x00, 0x00, 0x00, /* *** * * * * *** * */ + +/* Character (0xbb): bbw=6, bbh=3, bbx=0, bby=1, width=7 */ +0x40, 0xc0, 0x80, 0x40, 0xc0, 0x80, 0x00, /* * ** * * ** * */ +0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, /* * ** * * ** * * * * * */ + +/* Character (0xbc): bbw=8, bbh=8, bbx=0, bby=0, width=9 */ +0x08, 0x3c, 0x80, 0x40, 0x30, 0x88, 0xc4, 0x00, 0x00, /* * **** * * ** * * * ** */ +0x00, 0x02, 0x01, 0x00, 0x01, 0x01, 0x03, 0x01, 0x00, /* * **** * * ** * * * ** * * * * ** * */ + +/* Character (0xbd): bbw=7, bbh=8, bbx=0, bby=0, width=9 */ +0x08, 0x3c, 0x80, 0x40, 0xb0, 0x48, 0xc4, 0x00, 0x00, /* * **** * * ** * * * * ** */ +0x00, 0x02, 0x01, 0x00, 0x02, 0x03, 0x02, 0x00, 0x00, /* * **** * * ** * * * * ** * * * ** * */ + +/* Character (0xbe): bbw=8, bbh=8, bbx=0, bby=0, width=9 */ +0x24, 0x2c, 0x94, 0x40, 0x30, 0x88, 0xc4, 0x00, 0x00, /* * * ** * * * * * ** * * * ** */ +0x00, 0x02, 0x01, 0x00, 0x01, 0x01, 0x03, 0x01, 0x00, /* * * ** * * * * * ** * * * ** * * * * ** * */ + +/* Character (0xbf): bbw=5, bbh=8, bbx=0, bby=-2, width=6 */ +0x00, 0x00, 0xd0, 0xd0, 0x00, 0x00, /* * ** * ** */ +0x06, 0x0f, 0x09, 0x0c, 0x04, 0x00, /* * ** * ** ** ***** * ** * */ + +/* Character (0xc0): bbw=7, bbh=11, bbx=0, bby=0, width=8 */ +0x80, 0xf0, 0xfc, 0x8d, 0xfc, 0xf0, 0x80, 0x00, /* * **** ******* ** * ****** **** * */ +0x03, 0x03, 0x08, 0x00, 0x00, 0x03, 0x03, 0x00, /* * **** ******* ** * ****** **** * ** ** * ** ** */ + +/* Character (0xc1): bbw=7, bbh=11, bbx=0, bby=0, width=8 */ +0x80, 0xf0, 0xfc, 0x8d, 0xfc, 0xf0, 0x80, 0x00, /* * **** ******* ** * ****** **** * */ +0x03, 0x03, 0x00, 0x00, 0x08, 0x03, 0x03, 0x00, /* * **** ******* ** * ****** **** * ** ** *** ** */ + +/* Character (0xc2): bbw=7, bbh=11, bbx=0, bby=0, width=8 */ +0x80, 0xf0, 0xfd, 0x8c, 0xfd, 0xf0, 0x80, 0x00, /* * ***** ****** ** ** ****** **** * */ +0x03, 0x03, 0x00, 0x08, 0x00, 0x03, 0x03, 0x00, /* * ***** ****** ** ** ****** **** * ** ** * ** ** */ + +/* Character (0xc3): bbw=7, bbh=11, bbx=0, bby=0, width=8 */ +0x80, 0xf0, 0xfd, 0x8c, 0xfd, 0xf0, 0x80, 0x00, /* * ***** ****** ** ** ****** **** * */ +0x03, 0x03, 0x00, 0x08, 0x00, 0x0b, 0x03, 0x00, /* * ***** ****** ** ** ****** **** * ** ** * ** *** */ + +/* Character (0xc4): bbw=7, bbh=10, bbx=0, bby=0, width=8 */ +0x80, 0xf0, 0xfd, 0x8c, 0xfd, 0xf0, 0x80, 0x00, /* * ***** ****** ** ** ****** **** * */ +0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, /* * ***** ****** ** ** ****** **** * ** ** ** ** */ + +/* Character (0xc5): bbw=7, bbh=11, bbx=0, bby=0, width=8 */ +0x80, 0xf0, 0xfd, 0x8e, 0xfd, 0xf0, 0x80, 0x00, /* * ***** ****** *** ** ****** **** * */ +0x03, 0x03, 0x00, 0x08, 0x00, 0x03, 0x03, 0x00, /* * ***** ****** *** ** ****** **** * ** ** * ** ** */ + +/* Character (0xc6): bbw=9, bbh=8, bbx=0, bby=0, width=10 */ +0x80, 0xf0, 0xfc, 0x8c, 0xfc, 0xfc, 0x24, 0x24, 0x24, 0x00, /* * **** ****** ** * ****** ****** * * * * * * */ +0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x02, 0x02, 0x02, 0x00, /* * **** ****** ** * ****** ****** * * * * * * ** ** ** ** * * * */ + +/* Character (0xc7): bbw=7, bbh=10, bbx=0, bby=-2, width=8 */ +0xf0, 0xf8, 0x0c, 0x04, 0x04, 0x0c, 0x98, 0x00, /* **** ***** ** * * ** ** * */ +0x00, 0x01, 0x0b, 0x0e, 0x02, 0x03, 0x01, 0x00, /* **** ***** ** * * ** ** * * ** * *** * ** * */ + +/* Character (0xc8): bbw=5, bbh=11, bbx=0, bby=0, width=6 */ +0xfc, 0xfc, 0x25, 0x24, 0x24, 0x00, /* ****** ******* * * * * * * */ +0x03, 0x0b, 0x02, 0x02, 0x02, 0x00, /* ****** ******* * * * * * * ** ** * * * * */ + +/* Character (0xc9): bbw=5, bbh=11, bbx=0, bby=0, width=6 */ +0xfc, 0xfc, 0x25, 0x24, 0x24, 0x00, /* ****** ******* * * * * * * */ +0x03, 0x03, 0x02, 0x0a, 0x02, 0x00, /* ****** ******* * * * * * * ** ** * * * * */ + +/* Character (0xca): bbw=5, bbh=11, bbx=0, bby=0, width=6 */ +0xfc, 0xfd, 0x24, 0x25, 0x24, 0x00, /* ******* ****** * * * * * * * */ +0x03, 0x03, 0x0a, 0x02, 0x02, 0x00, /* ******* ****** * * * * * * * ** ** * * * * */ + +/* Character (0xcb): bbw=5, bbh=10, bbx=0, bby=0, width=6 */ +0xfc, 0xfd, 0x24, 0x25, 0x24, 0x00, /* ******* ****** * * * * * * * */ +0x03, 0x03, 0x02, 0x02, 0x02, 0x00, /* ******* ****** * * * * * * * ** ** * * * */ + +/* Character (0xcc): bbw=2, bbh=11, bbx=0, bby=0, width=3 */ +0xfc, 0xfd, 0x00, /* ******* ****** */ +0x0b, 0x03, 0x00, /* ******* ****** ** *** */ + +/* Character (0xcd): bbw=2, bbh=11, bbx=0, bby=0, width=3 */ +0xfd, 0xfc, 0x00, /* * ****** ****** */ +0x03, 0x0b, 0x00, /* * ****** ****** ** ** * */ + +/* Character (0xce): bbw=3, bbh=11, bbx=0, bby=0, width=3 */ +0xfd, 0xfc, 0x01, /* * ****** ******* */ +0x03, 0x0b, 0x00, /* * ****** ******* ** ** * */ + +/* Character (0xcf): bbw=3, bbh=10, bbx=0, bby=0, width=3 */ +0xfd, 0xfc, 0x01, /* * ****** ******* */ +0x03, 0x03, 0x00, /* * ****** ******* ** ** */ + +/* Character (0xd0): bbw=6, bbh=8, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x24, 0x0c, 0xf8, 0xf0, 0x00, /* ****** ****** * * ** ***** **** */ +0x03, 0x03, 0x02, 0x03, 0x01, 0x00, 0x00, /* ****** ****** * * ** ***** **** ** ** * ** * */ + +/* Character (0xd1): bbw=7, bbh=11, bbx=0, bby=0, width=8 */ +0xfc, 0xfc, 0x11, 0x60, 0x81, 0xfc, 0xfc, 0x00, /* ****** ******* * ** * * ****** ****** */ +0x03, 0x03, 0x00, 0x08, 0x01, 0x0b, 0x03, 0x00, /* ****** ******* * ** * * ****** ****** ** ** ** ** *** */ + +/* Character (0xd2): bbw=7, bbh=11, bbx=0, bby=0, width=8 */ +0xf0, 0xf8, 0x0c, 0x05, 0x0c, 0xf8, 0xf0, 0x00, /* **** ***** ** * * ** ***** **** */ +0x00, 0x01, 0x0b, 0x02, 0x03, 0x01, 0x00, 0x00, /* **** ***** ** * * ** ***** **** * ** * * ** * */ + +/* Character (0xd3): bbw=7, bbh=11, bbx=0, bby=0, width=8 */ +0xf0, 0xf8, 0x0c, 0x04, 0x0d, 0xf8, 0xf0, 0x00, /* **** ***** ** * * ** ***** **** */ +0x00, 0x01, 0x03, 0x02, 0x03, 0x09, 0x00, 0x00, /* **** ***** ** * * ** ***** **** * ** * ** * * */ + +/* Character (0xd4): bbw=7, bbh=11, bbx=0, bby=0, width=8 */ +0xf0, 0xf8, 0x0d, 0x04, 0x0d, 0xf8, 0xf0, 0x00, /* **** ****** ** * * ** ***** **** */ +0x00, 0x01, 0x03, 0x0a, 0x03, 0x01, 0x00, 0x00, /* **** ****** ** * * ** ***** **** * ** * *** * */ + +/* Character (0xd5): bbw=7, bbh=11, bbx=0, bby=0, width=8 */ +0xf0, 0xf8, 0x0d, 0x04, 0x0d, 0xf8, 0xf0, 0x00, /* **** ****** ** * * ** ***** **** */ +0x00, 0x01, 0x03, 0x0a, 0x03, 0x09, 0x00, 0x00, /* **** ****** ** * * ** ***** **** * ** * *** * * */ + +/* Character (0xd6): bbw=7, bbh=10, bbx=0, bby=0, width=8 */ +0xf0, 0xf8, 0x0d, 0x04, 0x0d, 0xf8, 0xf0, 0x00, /* **** ****** ** * * ** ***** **** */ +0x00, 0x01, 0x03, 0x02, 0x03, 0x01, 0x00, 0x00, /* **** ****** ** * * ** ***** **** * ** * ** * */ + +/* Character (0xd7): bbw=6, bbh=5, bbx=0, bby=1, width=6 */ +0x10, 0xb0, 0xe0, 0xe0, 0xb0, 0x10, /* * ** * *** *** ** * * */ +0x01, 0x01, 0x00, 0x00, 0x01, 0x01, /* * ** * *** *** ** * * * * * * */ + +/* Character (0xd8): bbw=7, bbh=8, bbx=0, bby=0, width=8 */ +0xf0, 0xf8, 0x8c, 0x64, 0x1c, 0xf8, 0xf4, 0x00, /* **** ***** ** * * ** *** ***** * **** */ +0x02, 0x01, 0x03, 0x02, 0x03, 0x01, 0x00, 0x00, /* **** ***** ** * * ** *** ***** * **** * * ** * ** * */ + +/* Character (0xd9): bbw=6, bbh=11, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x00, 0x01, 0xfc, 0xfc, 0x00, /* ****** ****** * ****** ****** */ +0x01, 0x03, 0x0a, 0x02, 0x03, 0x01, 0x00, /* ****** ****** * ****** ****** * ** * * * ** * */ + +/* Character (0xda): bbw=6, bbh=11, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x00, 0x01, 0xfc, 0xfc, 0x00, /* ****** ****** * ****** ****** */ +0x01, 0x03, 0x02, 0x02, 0x0b, 0x01, 0x00, /* ****** ****** * ****** ****** * ** * * ** ** */ + +/* Character (0xdb): bbw=6, bbh=11, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x01, 0x00, 0xfd, 0xfc, 0x00, /* ****** ******* * ****** ****** */ +0x01, 0x03, 0x02, 0x0a, 0x03, 0x01, 0x00, /* ****** ******* * ****** ****** * ** * * *** * */ + +/* Character (0xdc): bbw=6, bbh=10, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x01, 0x00, 0xfd, 0xfc, 0x00, /* ****** ******* * ****** ****** */ +0x01, 0x03, 0x02, 0x02, 0x03, 0x01, 0x00, /* ****** ******* * ****** ****** * ** * * ** * */ + +/* Character (0xdd): bbw=8, bbh=11, bbx=0, bby=0, width=9 */ +0x0c, 0x3c, 0x70, 0xc0, 0xc1, 0x70, 0x3c, 0x0c, 0x00, /* ** **** *** *** ** *** **** ** */ +0x00, 0x00, 0x00, 0x03, 0x03, 0x08, 0x00, 0x00, 0x00, /* ** **** *** *** ** *** **** ** ** ** * */ + +/* Character (0xde): bbw=6, bbh=8, bbx=0, bby=0, width=7 */ +0xfc, 0xfc, 0x88, 0x88, 0xf8, 0x70, 0x00, /* ****** ****** * * * * ***** *** */ +0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, /* ****** ****** * * * * ***** *** ** ** */ + +/* Character (0xdf): bbw=5, bbh=8, bbx=0, bby=0, width=6 */ +0xf8, 0xfc, 0x04, 0x24, 0xd8, 0x00, /* ***** ****** * * * ** ** */ +0x03, 0x03, 0x00, 0x02, 0x01, 0x00, /* ***** ****** * * * ** ** ** ** * * */ + +/* Character (0xe0): bbw=6, bbh=9, bbx=0, bby=0, width=6 */ +0xa0, 0xd2, 0x54, 0xf0, 0xe0, 0x00, /* * * * * ** * * * **** *** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x02, /* * * * * ** * * * **** *** * ** * * ** * */ + +/* Character (0xe1): bbw=6, bbh=9, bbx=0, bby=0, width=6 */ +0xa0, 0xd0, 0x50, 0xf4, 0xe2, 0x00, /* * * * ** * * * **** * *** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x02, /* * * * ** * * * **** * *** * ** * * ** * */ + +/* Character (0xe2): bbw=6, bbh=9, bbx=0, bby=0, width=6 */ +0xa0, 0xd4, 0x56, 0xf2, 0xe4, 0x00, /* * * * * ** ** * * * **** * *** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x02, /* * * * * ** ** * * * **** * *** * ** * * ** * */ + +/* Character (0xe3): bbw=6, bbh=9, bbx=0, bby=0, width=6 */ +0xa0, 0xd4, 0x52, 0xf4, 0xe2, 0x00, /* * * * * ** * * * * **** * *** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x02, /* * * * * ** * * * * **** * *** * ** * * ** * */ + +/* Character (0xe4): bbw=6, bbh=9, bbx=0, bby=0, width=6 */ +0xa0, 0xd6, 0x50, 0xf6, 0xe0, 0x00, /* * * ** * ** * * ** **** *** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x02, /* * * ** * ** * * ** **** *** * ** * * ** * */ + +/* Character (0xe5): bbw=6, bbh=9, bbx=0, bby=0, width=6 */ +0xa0, 0xd4, 0x5a, 0xf4, 0xe0, 0x00, /* * * * * ** * ** * * **** *** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x02, /* * * * * ** * ** * * **** *** * ** * * ** * */ + +/* Character (0xe6): bbw=8, bbh=6, bbx=0, bby=0, width=9 */ +0xa0, 0xd0, 0x50, 0xf0, 0xf0, 0x50, 0x70, 0x60, 0x00, /* * * * ** * * **** **** * * *** ** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* * * * ** * * **** **** * * *** ** * ** * * ** * ** * */ + +/* Character (0xe7): bbw=4, bbh=8, bbx=0, bby=-2, width=5 */ +0xe0, 0xf0, 0x10, 0x30, 0x00, /* *** **** * ** */ +0x01, 0x0b, 0x0e, 0x03, 0x00, /* *** **** * ** * ** * ***** */ + +/* Character (0xe8): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xe0, 0xf2, 0x54, 0x70, 0x60, 0x00, /* *** * **** * * * *** ** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* *** * **** * * * *** ** * ** * ** * */ + +/* Character (0xe9): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xe0, 0xf0, 0x54, 0x72, 0x60, 0x00, /* *** **** * * * * *** ** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* *** **** * * * * *** ** * ** * ** * */ + +/* Character (0xea): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xe0, 0xf4, 0x52, 0x74, 0x60, 0x00, /* *** * **** * * * * *** ** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* *** * **** * * * * *** ** * ** * ** * */ + +/* Character (0xeb): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xe0, 0xf6, 0x50, 0x76, 0x60, 0x00, /* *** ** **** * * ** *** ** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* *** ** **** * * ** *** ** * ** * ** * */ + +/* Character (0xec): bbw=2, bbh=9, bbx=0, bby=0, width=3 */ +0xf2, 0xf4, 0x00, /* * **** * **** */ +0x03, 0x03, 0x00, /* * **** * **** ** ** */ + +/* Character (0xed): bbw=3, bbh=9, bbx=0, bby=0, width=3 */ +0xf0, 0xf4, 0x02, /* **** * **** * */ +0x03, 0x03, 0x00, /* **** * **** * ** ** */ + +/* Character (0xee): bbw=3, bbh=9, bbx=0, bby=0, width=4 */ +0x04, 0xf2, 0xf4, 0x00, /* * * **** * **** */ +0x00, 0x03, 0x03, 0x00, /* * * **** * **** ** ** */ + +/* Character (0xef): bbw=3, bbh=9, bbx=0, bby=0, width=3 */ +0xf6, 0xf0, 0x06, /* ** **** **** ** */ +0x03, 0x03, 0x00, /* ** **** **** ** ** ** */ + +/* Character (0xf0): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xe8, 0xf6, 0x1c, 0xf2, 0xe0, 0x00, /* * *** ** **** *** * **** *** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* * *** ** **** *** * **** *** * ** * ** * */ + +/* Character (0xf1): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf0, 0xe4, 0x12, 0xf4, 0xe2, 0x00, /* **** * *** * * * **** * *** */ +0x03, 0x03, 0x00, 0x03, 0x03, 0x00, /* **** * *** * * * **** * *** ** ** ** ** */ + +/* Character (0xf2): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xe0, 0xf2, 0x14, 0xf0, 0xe0, 0x00, /* *** * **** * * **** *** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* *** * **** * * **** *** * ** * ** * */ + +/* Character (0xf3): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xe0, 0xf0, 0x14, 0xf2, 0xe0, 0x00, /* *** **** * * * **** *** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* *** **** * * * **** *** * ** * ** * */ + +/* Character (0xf4): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xe0, 0xf4, 0x12, 0xf4, 0xe0, 0x00, /* *** * **** * * * **** *** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* *** * **** * * * **** *** * ** * ** * */ + +/* Character (0xf5): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xe4, 0xf2, 0x14, 0xf2, 0xe0, 0x00, /* * *** * **** * * * **** *** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* * *** * **** * * * **** *** * ** * ** * */ + +/* Character (0xf6): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xe0, 0xf6, 0x10, 0xf6, 0xe0, 0x00, /* *** ** **** * ** **** *** */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* *** ** **** * ** **** *** * ** * ** * */ + +/* Character (0xf7): bbw=6, bbh=5, bbx=0, bby=1, width=6 */ +0x40, 0x40, 0x50, 0x50, 0x40, 0x40, /* * * * * * * * * */ +0x00, 0x00, 0x01, 0x01, 0x00, 0x00, /* * * * * * * * * * * */ + +/* Character (0xf8): bbw=6, bbh=6, bbx=0, bby=0, width=6 */ +0xe0, 0xf0, 0x50, 0xf0, 0xe0, 0x10, /* *** **** * * **** *** * */ +0x01, 0x03, 0x02, 0x03, 0x01, 0x00, /* *** **** * * **** *** * * ** * ** * */ + +/* Character (0xf9): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf0, 0xf2, 0x04, 0xf0, 0xf0, 0x00, /* **** * **** * **** **** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x00, /* **** * **** * **** **** * ** * * ** */ + +/* Character (0xfa): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf0, 0xf0, 0x04, 0xf2, 0xf0, 0x00, /* **** **** * * **** **** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x00, /* **** **** * * **** **** * ** * * ** */ + +/* Character (0xfb): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf0, 0xf4, 0x02, 0xf4, 0xf0, 0x00, /* **** * **** * * **** **** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x00, /* **** * **** * * **** **** * ** * * ** */ + +/* Character (0xfc): bbw=5, bbh=9, bbx=0, bby=0, width=6 */ +0xf0, 0xf6, 0x00, 0xf6, 0xf0, 0x00, /* **** ** **** ** **** **** */ +0x01, 0x03, 0x02, 0x01, 0x03, 0x00, /* **** ** **** ** **** **** * ** * * ** */ + +/* Character (0xfd): bbw=5, bbh=11, bbx=0, bby=-2, width=6 */ +0xf0, 0xf0, 0x04, 0xf2, 0xf0, 0x00, /* **** **** * * **** **** */ +0x00, 0x09, 0x0f, 0x07, 0x01, 0x00, /* **** **** * * **** **** * ******** * */ + +/* Character (0xfe): bbw=5, bbh=10, bbx=0, bby=-2, width=6 */ +0xfc, 0xfc, 0x10, 0x30, 0xe0, 0x00, /* ****** ****** * ** *** */ +0x0f, 0x0f, 0x02, 0x03, 0x01, 0x00, /* ****** ****** * ** *** ******** * ** * */ + +/* Character (0xff): bbw=5, bbh=11, bbx=0, bby=-2, width=6 */ +0xf0, 0xf6, 0x00, 0xf6, 0xf0, 0x00, /* **** ** **** ** **** **** */ +0x00, 0x09, 0x0f, 0x07, 0x01, 0x00, /* **** ** **** ** **** **** * ******** * */ +}; + +/* Character->glyph data. */ +static const PROGMEM uint16_t helvB10_offset[] = { + 0, /* (0x20) */ + 6, /* (0x21) */ + 14, /* (0x22) */ + 24, /* (0x23) */ + 36, /* (0x24) */ + 48, /* (0x25) */ + 64, /* (0x26) */ + 80, /* (0x27) */ + 86, /* (0x28) */ + 94, /* (0x29) */ + 102, /* (0x2a) */ + 110, /* (0x2b) */ + 122, /* (0x2c) */ + 128, /* (0x2d) */ + 142, /* (0x2e) */ + 148, /* (0x2f) */ + 156, /* (0x30) */ + 168, /* (0x31) */ + 180, /* (0x32) */ + 192, /* (0x33) */ + 204, /* (0x34) */ + 216, /* (0x35) */ + 228, /* (0x36) */ + 240, /* (0x37) */ + 252, /* (0x38) */ + 264, /* (0x39) */ + 276, /* (0x3a) */ + 282, /* (0x3b) */ + 288, /* (0x3c) */ + 298, /* (0x3d) */ + 310, /* (0x3e) */ + 320, /* (0x3f) */ + 332, /* (0x40) */ + 354, /* (0x41) */ + 370, /* (0x42) */ + 384, /* (0x43) */ + 400, /* (0x44) */ + 414, /* (0x45) */ + 426, /* (0x46) */ + 438, /* (0x47) */ + 454, /* (0x48) */ + 468, /* (0x49) */ + 474, /* (0x4a) */ + 486, /* (0x4b) */ + 500, /* (0x4c) */ + 512, /* (0x4d) */ + 532, /* (0x4e) */ + 548, /* (0x4f) */ + 564, /* (0x50) */ + 578, /* (0x51) */ + 594, /* (0x52) */ + 608, /* (0x53) */ + 622, /* (0x54) */ + 636, /* (0x55) */ + 650, /* (0x56) */ + 666, /* (0x57) */ + 688, /* (0x58) */ + 704, /* (0x59) */ + 722, /* (0x5a) */ + 736, /* (0x5b) */ + 744, /* (0x5c) */ + 752, /* (0x5d) */ + 760, /* (0x5e) */ + 770, /* (0x5f) */ + 782, /* (0x60) */ + 788, /* (0x61) */ + 800, /* (0x62) */ + 812, /* (0x63) */ + 822, /* (0x64) */ + 834, /* (0x65) */ + 846, /* (0x66) */ + 854, /* (0x67) */ + 866, /* (0x68) */ + 878, /* (0x69) */ + 884, /* (0x6a) */ + 890, /* (0x6b) */ + 902, /* (0x6c) */ + 908, /* (0x6d) */ + 926, /* (0x6e) */ + 938, /* (0x6f) */ + 950, /* (0x70) */ + 962, /* (0x71) */ + 974, /* (0x72) */ + 982, /* (0x73) */ + 994, /* (0x74) */ + 1002, /* (0x75) */ + 1014, /* (0x76) */ + 1026, /* (0x77) */ + 1042, /* (0x78) */ + 1056, /* (0x79) */ + 1068, /* (0x7a) */ + 1080, /* (0x7b) */ + 1090, /* (0x7c) */ + 1096, /* (0x7d) */ + 1106, /* (0x7e) */ + 0, /* (0x7f) */ + 0, /* (0x80) */ + 0, /* (0x81) */ + 0, /* (0x82) */ + 0, /* (0x83) */ + 0, /* (0x84) */ + 0, /* (0x85) */ + 0, /* (0x86) */ + 0, /* (0x87) */ + 0, /* (0x88) */ + 0, /* (0x89) */ + 0, /* (0x8a) */ + 0, /* (0x8b) */ + 0, /* (0x8c) */ + 0, /* (0x8d) */ + 0, /* (0x8e) */ + 0, /* (0x8f) */ + 0, /* (0x90) */ + 0, /* (0x91) */ + 0, /* (0x92) */ + 0, /* (0x93) */ + 0, /* (0x94) */ + 0, /* (0x95) */ + 0, /* (0x96) */ + 0, /* (0x97) */ + 0, /* (0x98) */ + 0, /* (0x99) */ + 0, /* (0x9a) */ + 0, /* (0x9b) */ + 0, /* (0x9c) */ + 0, /* (0x9d) */ + 0, /* (0x9e) */ + 0, /* (0x9f) */ + 1118, /* (0xa0) */ + 1124, /* (0xa1) */ + 1132, /* (0xa2) */ + 1144, /* (0xa3) */ + 1156, /* (0xa4) */ + 1168, /* (0xa5) */ + 1182, /* (0xa6) */ + 1188, /* (0xa7) */ + 1200, /* (0xa8) */ + 1206, /* (0xa9) */ + 1226, /* (0xaa) */ + 1236, /* (0xab) */ + 1250, /* (0xac) */ + 1264, /* (0xad) */ + 1274, /* (0xae) */ + 1294, /* (0xaf) */ + 1300, /* (0xb0) */ + 1308, /* (0xb1) */ + 1320, /* (0xb2) */ + 1326, /* (0xb3) */ + 1332, /* (0xb4) */ + 1338, /* (0xb5) */ + 1350, /* (0xb6) */ + 1362, /* (0xb7) */ + 1368, /* (0xb8) */ + 1374, /* (0xb9) */ + 1380, /* (0xba) */ + 1390, /* (0xbb) */ + 1404, /* (0xbc) */ + 1422, /* (0xbd) */ + 1440, /* (0xbe) */ + 1458, /* (0xbf) */ + 1470, /* (0xc0) */ + 1486, /* (0xc1) */ + 1502, /* (0xc2) */ + 1518, /* (0xc3) */ + 1534, /* (0xc4) */ + 1550, /* (0xc5) */ + 1566, /* (0xc6) */ + 1586, /* (0xc7) */ + 1602, /* (0xc8) */ + 1614, /* (0xc9) */ + 1626, /* (0xca) */ + 1638, /* (0xcb) */ + 1650, /* (0xcc) */ + 1656, /* (0xcd) */ + 1662, /* (0xce) */ + 1668, /* (0xcf) */ + 1674, /* (0xd0) */ + 1688, /* (0xd1) */ + 1704, /* (0xd2) */ + 1720, /* (0xd3) */ + 1736, /* (0xd4) */ + 1752, /* (0xd5) */ + 1768, /* (0xd6) */ + 1784, /* (0xd7) */ + 1796, /* (0xd8) */ + 1812, /* (0xd9) */ + 1826, /* (0xda) */ + 1840, /* (0xdb) */ + 1854, /* (0xdc) */ + 1868, /* (0xdd) */ + 1886, /* (0xde) */ + 1900, /* (0xdf) */ + 1912, /* (0xe0) */ + 1924, /* (0xe1) */ + 1936, /* (0xe2) */ + 1948, /* (0xe3) */ + 1960, /* (0xe4) */ + 1972, /* (0xe5) */ + 1984, /* (0xe6) */ + 2002, /* (0xe7) */ + 2012, /* (0xe8) */ + 2024, /* (0xe9) */ + 2036, /* (0xea) */ + 2048, /* (0xeb) */ + 2060, /* (0xec) */ + 2066, /* (0xed) */ + 2072, /* (0xee) */ + 2080, /* (0xef) */ + 2086, /* (0xf0) */ + 2098, /* (0xf1) */ + 2110, /* (0xf2) */ + 2122, /* (0xf3) */ + 2134, /* (0xf4) */ + 2146, /* (0xf5) */ + 2158, /* (0xf6) */ + 2170, /* (0xf7) */ + 2182, /* (0xf8) */ + 2194, /* (0xf9) */ + 2206, /* (0xfa) */ + 2218, /* (0xfb) */ + 2230, /* (0xfc) */ + 2242, /* (0xfd) */ + 2254, /* (0xfe) */ + 2266, /* (0xff) */ +}; + +/* Character width data. */ +static const PROGMEM uint8_t helvB10_width[] = { + 3, /* (0x20) */ + 4, /* (0x21) */ + 5, /* (0x22) */ + 6, /* (0x23) */ + 6, /* (0x24) */ + 8, /* (0x25) */ + 8, /* (0x26) */ + 3, /* (0x27) */ + 4, /* (0x28) */ + 4, /* (0x29) */ + 4, /* (0x2a) */ + 6, /* (0x2b) */ + 3, /* (0x2c) */ + 7, /* (0x2d) */ + 3, /* (0x2e) */ + 4, /* (0x2f) */ + 6, /* (0x30) */ + 6, /* (0x31) */ + 6, /* (0x32) */ + 6, /* (0x33) */ + 6, /* (0x34) */ + 6, /* (0x35) */ + 6, /* (0x36) */ + 6, /* (0x37) */ + 6, /* (0x38) */ + 6, /* (0x39) */ + 3, /* (0x3a) */ + 3, /* (0x3b) */ + 5, /* (0x3c) */ + 6, /* (0x3d) */ + 5, /* (0x3e) */ + 6, /* (0x3f) */ + 11, /* (0x40) */ + 8, /* (0x41) */ + 7, /* (0x42) */ + 8, /* (0x43) */ + 7, /* (0x44) */ + 6, /* (0x45) */ + 6, /* (0x46) */ + 8, /* (0x47) */ + 7, /* (0x48) */ + 3, /* (0x49) */ + 6, /* (0x4a) */ + 7, /* (0x4b) */ + 6, /* (0x4c) */ + 10, /* (0x4d) */ + 8, /* (0x4e) */ + 8, /* (0x4f) */ + 7, /* (0x50) */ + 8, /* (0x51) */ + 7, /* (0x52) */ + 7, /* (0x53) */ + 7, /* (0x54) */ + 7, /* (0x55) */ + 8, /* (0x56) */ + 11, /* (0x57) */ + 8, /* (0x58) */ + 9, /* (0x59) */ + 7, /* (0x5a) */ + 4, /* (0x5b) */ + 4, /* (0x5c) */ + 4, /* (0x5d) */ + 5, /* (0x5e) */ + 6, /* (0x5f) */ + 3, /* (0x60) */ + 6, /* (0x61) */ + 6, /* (0x62) */ + 5, /* (0x63) */ + 6, /* (0x64) */ + 6, /* (0x65) */ + 4, /* (0x66) */ + 6, /* (0x67) */ + 6, /* (0x68) */ + 3, /* (0x69) */ + 3, /* (0x6a) */ + 6, /* (0x6b) */ + 3, /* (0x6c) */ + 9, /* (0x6d) */ + 6, /* (0x6e) */ + 6, /* (0x6f) */ + 6, /* (0x70) */ + 6, /* (0x71) */ + 4, /* (0x72) */ + 6, /* (0x73) */ + 4, /* (0x74) */ + 6, /* (0x75) */ + 6, /* (0x76) */ + 8, /* (0x77) */ + 7, /* (0x78) */ + 6, /* (0x79) */ + 6, /* (0x7a) */ + 5, /* (0x7b) */ + 3, /* (0x7c) */ + 5, /* (0x7d) */ + 6, /* (0x7e) */ + 3, /* (0x7f) */ + 3, /* (0x80) */ + 3, /* (0x81) */ + 3, /* (0x82) */ + 3, /* (0x83) */ + 3, /* (0x84) */ + 3, /* (0x85) */ + 3, /* (0x86) */ + 3, /* (0x87) */ + 3, /* (0x88) */ + 3, /* (0x89) */ + 3, /* (0x8a) */ + 3, /* (0x8b) */ + 3, /* (0x8c) */ + 3, /* (0x8d) */ + 3, /* (0x8e) */ + 3, /* (0x8f) */ + 3, /* (0x90) */ + 3, /* (0x91) */ + 3, /* (0x92) */ + 3, /* (0x93) */ + 3, /* (0x94) */ + 3, /* (0x95) */ + 3, /* (0x96) */ + 3, /* (0x97) */ + 3, /* (0x98) */ + 3, /* (0x99) */ + 3, /* (0x9a) */ + 3, /* (0x9b) */ + 3, /* (0x9c) */ + 3, /* (0x9d) */ + 3, /* (0x9e) */ + 3, /* (0x9f) */ + 3, /* (0xa0) */ + 4, /* (0xa1) */ + 6, /* (0xa2) */ + 6, /* (0xa3) */ + 6, /* (0xa4) */ + 7, /* (0xa5) */ + 3, /* (0xa6) */ + 6, /* (0xa7) */ + 3, /* (0xa8) */ + 10, /* (0xa9) */ + 5, /* (0xaa) */ + 7, /* (0xab) */ + 7, /* (0xac) */ + 5, /* (0xad) */ + 10, /* (0xae) */ + 3, /* (0xaf) */ + 4, /* (0xb0) */ + 6, /* (0xb1) */ + 3, /* (0xb2) */ + 3, /* (0xb3) */ + 3, /* (0xb4) */ + 6, /* (0xb5) */ + 6, /* (0xb6) */ + 3, /* (0xb7) */ + 3, /* (0xb8) */ + 3, /* (0xb9) */ + 5, /* (0xba) */ + 7, /* (0xbb) */ + 9, /* (0xbc) */ + 9, /* (0xbd) */ + 9, /* (0xbe) */ + 6, /* (0xbf) */ + 8, /* (0xc0) */ + 8, /* (0xc1) */ + 8, /* (0xc2) */ + 8, /* (0xc3) */ + 8, /* (0xc4) */ + 8, /* (0xc5) */ + 10, /* (0xc6) */ + 8, /* (0xc7) */ + 6, /* (0xc8) */ + 6, /* (0xc9) */ + 6, /* (0xca) */ + 6, /* (0xcb) */ + 3, /* (0xcc) */ + 3, /* (0xcd) */ + 3, /* (0xce) */ + 3, /* (0xcf) */ + 7, /* (0xd0) */ + 8, /* (0xd1) */ + 8, /* (0xd2) */ + 8, /* (0xd3) */ + 8, /* (0xd4) */ + 8, /* (0xd5) */ + 8, /* (0xd6) */ + 6, /* (0xd7) */ + 8, /* (0xd8) */ + 7, /* (0xd9) */ + 7, /* (0xda) */ + 7, /* (0xdb) */ + 7, /* (0xdc) */ + 9, /* (0xdd) */ + 7, /* (0xde) */ + 6, /* (0xdf) */ + 6, /* (0xe0) */ + 6, /* (0xe1) */ + 6, /* (0xe2) */ + 6, /* (0xe3) */ + 6, /* (0xe4) */ + 6, /* (0xe5) */ + 9, /* (0xe6) */ + 5, /* (0xe7) */ + 6, /* (0xe8) */ + 6, /* (0xe9) */ + 6, /* (0xea) */ + 6, /* (0xeb) */ + 3, /* (0xec) */ + 3, /* (0xed) */ + 4, /* (0xee) */ + 3, /* (0xef) */ + 6, /* (0xf0) */ + 6, /* (0xf1) */ + 6, /* (0xf2) */ + 6, /* (0xf3) */ + 6, /* (0xf4) */ + 6, /* (0xf5) */ + 6, /* (0xf6) */ + 6, /* (0xf7) */ + 6, /* (0xf8) */ + 6, /* (0xf9) */ + 6, /* (0xfa) */ + 6, /* (0xfb) */ + 6, /* (0xfc) */ + 6, /* (0xfd) */ + 6, /* (0xfe) */ + 6, /* (0xff) */ +}; + +/* Font structure definition. */ +EXTERN_CONST Font font_helvB10 = +{ + /* .glyph = */ font_helvB10_glyphs, + /* .name = "helvB10", */ + /* .width = */ 11, + /* .height = */ 12, + /* .ascent = 10, */ + /* .first = */ 32, + /* .last = */ 255, + /* .offset = */ helvB10_offset, + /* .width = */ helvB10_width, +}; diff --git a/2.5/bertos/fonts/luBS14.bdf b/2.5/bertos/fonts/luBS14.bdf new file mode 100644 index 00000000..90c37be9 --- /dev/null +++ b/2.5/bertos/fonts/luBS14.bdf @@ -0,0 +1,13542 @@ +STARTFONT 2.1 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT (c) Copyright Bigelow & Holmes 1986, 1985. Lucida is a registered +COMMENT trademark of Bigelow & Holmes. See LEGAL NOTICE file for terms +COMMENT of the license. +COMMENT GRID 0014 0014 0200 0200 +FONT -B&H-Lucida-Bold-R-Normal-Sans-14-140-75-75-P-92-ISO10646-1 +SIZE 14 72 72 +FONTBOUNDINGBOX 18 21 -1 -5 +STARTPROPERTIES 22 +COMMENT Begin LogicalFontDescription +FONTNAME_REGISTRY "" +FOUNDRY "B&H" +FAMILY_NAME "Lucida" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "Sans" +PIXEL_SIZE 14 +POINT_SIZE 140 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 92 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +COMMENT END LogicalFontDescription +FONT_ASCENT 13 +FONT_DESCENT 2 +DEFAULT_CHAR 0 +COPYRIGHT "Copyright Bigelow & Holmes 1986, 1985." +FACE_NAME "Lucida Sans Bold" +X_HEIGHT 8 +CAP_HEIGHT 10 +ENDPROPERTIES +CHARS 756 +STARTCHAR char0 +ENCODING 0 +SWIDTH 813 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +AA +00 +82 +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 343 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +80 +80 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 530 0 +DWIDTH 7 0 +BBX 5 4 1 7 +BITMAP +D8 +D8 +90 +90 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +1B00 +1B00 +1B00 +7F80 +3600 +3600 +FF80 +6C00 +6C00 +6C00 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 12 1 -1 +BITMAP +10 +7C +D6 +D0 +F0 +70 +1C +1E +16 +D6 +7C +10 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 898 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +7000 +D980 +DB00 +7200 +0400 +0800 +1380 +36C0 +66C0 +0380 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 792 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +6600 +6600 +6400 +3980 +5980 +CD00 +C600 +E700 +7980 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 4 1 7 +BITMAP +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 386 0 +DWIDTH 6 0 +BBX 4 12 1 -1 +BITMAP +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 386 0 +DWIDTH 6 0 +BBX 4 12 1 -1 +BITMAP +C0 +60 +60 +30 +30 +30 +30 +30 +30 +60 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 464 0 +DWIDTH 7 0 +BBX 5 5 1 5 +BITMAP +20 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 7 1 1 +BITMAP +10 +10 +10 +FE +10 +10 +10 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 343 0 +DWIDTH 4 0 +BBX 2 4 1 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 289 0 +DWIDTH 5 0 +BBX 3 1 1 4 +BITMAP +E0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 343 0 +DWIDTH 4 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 596 0 +DWIDTH 8 0 +BBX 8 12 0 -1 +BITMAP +03 +06 +06 +0C +0C +18 +18 +30 +30 +60 +60 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 5 10 2 0 +BITMAP +18 +F8 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7E +C7 +03 +03 +06 +0C +18 +60 +FF +FF +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7E +C7 +03 +06 +3C +06 +03 +03 +C7 +7E +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +0C +1C +2C +4C +8C +FF +FF +0C +0C +0C +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 10 2 0 +BITMAP +FC +FC +80 +80 +FC +0E +06 +06 +CC +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3E +63 +C0 +DC +E6 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +FF +FF +06 +0C +18 +30 +30 +60 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7E +C7 +C3 +72 +3C +4E +C7 +C3 +E3 +7E +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +67 +1B +03 +C6 +7C +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 343 0 +DWIDTH 4 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 343 0 +DWIDTH 4 0 +BBX 2 9 1 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 6 7 2 1 +BITMAP +0C +38 +60 +C0 +60 +38 +0C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 3 1 3 +BITMAP +FE +00 +FE +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 6 7 2 1 +BITMAP +C0 +70 +18 +0C +18 +70 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 572 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +78 +CC +0C +0C +18 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 833 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +1E00 +6100 +4180 +8F80 +9980 +9980 +9980 +4EC0 +6000 +1F00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 669 0 +DWIDTH 10 0 +BBX 7 10 2 0 +BITMAP +FC +C6 +C6 +CC +F0 +CC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 726 0 +DWIDTH 11 0 +BBX 8 10 2 0 +BITMAP +3E +63 +C0 +C0 +C0 +C0 +C0 +C0 +63 +3E +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 819 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +FE00 +C300 +C180 +C180 +C180 +C180 +C180 +C180 +C300 +FE00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 10 2 0 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 602 0 +DWIDTH 9 0 +BBX 6 10 2 0 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 759 0 +DWIDTH 11 0 +BBX 8 10 2 0 +BITMAP +3E +63 +C0 +C0 +C0 +C3 +C3 +C3 +63 +3F +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 813 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +C3 +C3 +C3 +C3 +FF +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 2 10 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 501 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 753 0 +DWIDTH 11 0 +BBX 8 10 2 0 +BITMAP +C3 +C6 +CC +D8 +F0 +D8 +CC +C6 +C3 +C3 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 620 0 +DWIDTH 9 0 +BBX 6 10 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 940 0 +DWIDTH 15 0 +BBX 11 10 2 0 +BITMAP +E0E0 +E0E0 +B160 +B160 +B160 +9A60 +9A60 +8C60 +8C60 +8060 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +E1 +E1 +B1 +B1 +99 +99 +8D +8D +87 +87 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 657 0 +DWIDTH 9 0 +BBX 6 10 2 0 +BITMAP +F8 +CC +CC +CC +CC +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 12 1 -2 +BITMAP +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +0300 +0180 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 734 0 +DWIDTH 11 0 +BBX 8 10 2 0 +BITMAP +FC +C6 +C6 +C4 +CC +F8 +CC +C6 +C3 +C3 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +7C +C6 +C0 +E0 +78 +3C +0E +06 +C6 +7C +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 735 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 735 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +C180 +C180 +C180 +6100 +6300 +6300 +3200 +3600 +1C00 +1C00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 940 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +C060 +C060 +C660 +C660 +6640 +6B40 +6B40 +7BC0 +3180 +3180 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 699 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +C6 +C6 +6C +6C +38 +38 +6C +6C +C6 +C6 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 738 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C3 +C3 +62 +66 +34 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 675 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +FE +06 +0C +1C +18 +30 +70 +60 +C0 +FE +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 386 0 +DWIDTH 6 0 +BBX 4 12 1 -1 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 596 0 +DWIDTH 8 0 +BBX 8 12 0 -1 +BITMAP +C0 +60 +60 +30 +30 +18 +18 +0C +0C +06 +06 +03 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 386 0 +DWIDTH 6 0 +BBX 4 12 1 -1 +BITMAP +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 6 7 2 3 +BITMAP +30 +30 +78 +48 +CC +84 +84 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 500 0 +DWIDTH 11 0 +BBX 9 1 1 -1 +BITMAP +FF80 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 5 2 2 9 +BITMAP +E0 +38 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 8 1 0 +BITMAP +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +C0 +C0 +C0 +DC +E6 +C3 +C3 +C3 +C3 +C6 +FC +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 545 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +3C +66 +C0 +C0 +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +03 +03 +03 +3F +63 +C3 +C3 +C3 +C3 +67 +3B +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 461 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +1E +30 +30 +FE +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3F +63 +C3 +C3 +C3 +67 +3B +03 +C6 +7C +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +C0 +C0 +C0 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 2 11 1 0 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 361 0 +DWIDTH 5 0 +BBX 4 13 0 -2 +BITMAP +30 +30 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 681 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +C0 +C0 +C0 +C6 +CC +D8 +F0 +D8 +CC +C6 +C7 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 2 11 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 1006 0 +DWIDTH 14 0 +BBX 12 8 1 0 +BITMAP +DDE0 +EF70 +C630 +C630 +C630 +C630 +C630 +C630 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +DC +E6 +C3 +C3 +C3 +C3 +C6 +FC +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3F +63 +C3 +C3 +C3 +C3 +67 +3B +03 +03 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 8 2 0 +BITMAP +D8 +D8 +E0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 622 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +7C +C0 +C0 +F0 +3C +0C +0C +F8 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 436 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +60 +60 +F8 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 663 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +C6 +C6 +C6 +64 +68 +38 +38 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 885 0 +DWIDTH 13 0 +BBX 11 8 1 0 +BITMAP +C060 +C460 +C460 +6EC0 +6AC0 +7B80 +3180 +3180 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 568 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +C6 +64 +38 +38 +4C +C6 +C6 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +C6 +C6 +C6 +C6 +6C +68 +38 +30 +60 +E0 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 608 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FE +06 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 386 0 +DWIDTH 6 0 +BBX 4 12 1 -1 +BITMAP +70 +C0 +C0 +60 +20 +C0 +20 +60 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 12 1 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 386 0 +DWIDTH 6 0 +BBX 4 12 1 -1 +BITMAP +E0 +30 +30 +60 +40 +30 +40 +60 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 687 0 +DWIDTH 9 0 +BBX 7 3 1 3 +BITMAP +72 +BA +9C +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 343 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 10 1 -2 +BITMAP +C0 +C0 +00 +40 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 12 1 -1 +BITMAP +08 +08 +3E +6A +C8 +C8 +C8 +C8 +68 +3E +08 +08 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 10 1 0 +BITMAP +1C +32 +30 +30 +FC +30 +30 +30 +60 +FE +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +8080 +4100 +3E00 +6300 +6300 +6300 +6300 +3E00 +4100 +8080 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C3 +C3 +62 +66 +34 +7E +18 +7E +18 +18 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 12 1 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 6 11 2 -1 +BITMAP +78 +CC +C0 +70 +D8 +CC +6C +38 +0C +CC +78 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 4 2 3 9 +BITMAP +90 +90 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 825 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +1E00 +6180 +4080 +8E40 +9840 +9840 +8E40 +4080 +6180 +1E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 536 0 +DWIDTH 8 0 +BBX 6 6 1 4 +BITMAP +70 +18 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 8 5 0 2 +BITMAP +33 +66 +CC +66 +33 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 4 1 1 +BITMAP +FE +02 +02 +02 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 289 0 +DWIDTH 5 0 +BBX 3 1 1 4 +BITMAP +E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 7 1 3 +BITMAP +38 +44 +BA +B2 +AA +44 +38 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 4 1 3 9 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 241 0 +DWIDTH 4 0 +BBX 4 3 0 7 +BITMAP +60 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 7 1 1 +BITMAP +10 +10 +FE +10 +10 +00 +FE +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 536 0 +DWIDTH 7 0 +BBX 5 6 1 4 +BITMAP +F0 +18 +18 +60 +C0 +F8 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 536 0 +DWIDTH 7 0 +BBX 5 6 1 4 +BITMAP +F0 +18 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 5 2 3 9 +BITMAP +38 +E0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 699 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FB +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 6 11 2 -1 +BITMAP +7C +F4 +F4 +F4 +F4 +74 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 343 0 +DWIDTH 10 0 +BBX 2 2 4 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 3 2 3 -2 +BITMAP +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 536 0 +DWIDTH 7 0 +BBX 4 6 1 4 +BITMAP +30 +F0 +30 +30 +30 +30 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 536 0 +DWIDTH 8 0 +BBX 6 6 1 4 +BITMAP +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 8 5 1 2 +BITMAP +CC +66 +33 +66 +CC +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 1066 0 +DWIDTH 14 0 +BBX 12 10 1 0 +BITMAP +6100 +E100 +6200 +6200 +64E0 +6560 +0A60 +0BF0 +1060 +1060 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 1066 0 +DWIDTH 14 0 +BBX 12 10 1 0 +BITMAP +6100 +E100 +6200 +6200 +64E0 +6530 +0870 +08E0 +1180 +11F0 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 1120 0 +DWIDTH 15 0 +BBX 13 10 1 0 +BITMAP +7080 +9880 +3100 +1A00 +9A70 +74B0 +0530 +09F8 +1030 +1030 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 572 0 +DWIDTH 8 0 +BBX 6 10 1 -2 +BITMAP +30 +30 +00 +30 +30 +60 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +7000 +1C00 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +0700 +1C00 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +1C00 +2600 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +1A00 +2C00 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 773 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +24 +24 +00 +18 +18 +2C +2C +66 +46 +FE +C3 +C3 +C3 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +1C00 +2600 +1C00 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 997 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +1FE0 +1600 +2600 +2600 +67C0 +4600 +7E00 +C600 +C600 +C7E0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 726 0 +DWIDTH 11 0 +BBX 8 12 2 -2 +BITMAP +3E +63 +C0 +C0 +C0 +C0 +C0 +C0 +63 +3E +08 +30 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +70 +1C +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +1C +70 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +30 +58 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +48 +48 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 4 13 1 0 +BITMAP +E0 +30 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 4 13 1 0 +BITMAP +70 +C0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 4 13 1 0 +BITMAP +60 +B0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 4 13 1 0 +BITMAP +90 +90 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 819 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +3F80 +30C0 +3060 +3060 +FC60 +3060 +3060 +3060 +30C0 +3F80 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +1A +2C +00 +E1 +E1 +B1 +B1 +99 +99 +8D +8D +87 +87 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +3800 +0E00 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +0700 +1C00 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +0C00 +1600 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +0D00 +1600 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +2100 +2100 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 5 5 2 2 +BITMAP +C8 +70 +20 +70 +98 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 12 1 -1 +BITMAP +0040 +3F40 +6180 +C2C0 +C2C0 +C4C0 +C8C0 +D0C0 +D0C0 +6180 +BF00 +8000 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +70 +1C +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +0E +38 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +18 +2C +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +24 +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +64 +3C +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 738 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +0E +38 +00 +C3 +C3 +62 +66 +34 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 657 0 +DWIDTH 9 0 +BBX 6 10 2 0 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 724 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +7C +C6 +C6 +C4 +CC +C6 +C3 +C3 +C3 +C3 +CE +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +70 +1C +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +0E +38 +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +18 +2C +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +34 +58 +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +24 +24 +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +18 +2C +18 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 913 0 +DWIDTH 14 0 +BBX 12 8 1 0 +BITMAP +7DE0 +0730 +0630 +7FF0 +C600 +C600 +C710 +79E0 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 545 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +3C +66 +C0 +C0 +C0 +C0 +62 +3C +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +70 +1C +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +0E +38 +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +18 +2C +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +44 +44 +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 4 11 0 0 +BITMAP +E0 +30 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 4 11 0 0 +BITMAP +70 +C0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 4 11 0 0 +BITMAP +60 +B0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 4 11 0 0 +BITMAP +90 +90 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +10 +3E +0C +3E +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +1A +2C +00 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +70 +1C +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +0E +38 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +18 +2C +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +34 +58 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +24 +24 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 7 1 1 +BITMAP +10 +10 +00 +FE +00 +10 +10 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +3D +66 +CB +CB +D3 +D3 +66 +BC +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +70 +1C +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +1C +70 +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +18 +2C +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +24 +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +1C +70 +00 +C6 +C6 +C6 +C6 +6C +68 +38 +30 +60 +E0 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 12 1 -2 +BITMAP +C0 +C0 +DC +E6 +C3 +C3 +C3 +C3 +C6 +FC +C0 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +44 +44 +00 +C6 +C6 +C6 +C6 +6C +68 +38 +30 +60 +E0 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +1E00 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 10 1 0 +BITMAP +3C +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2100 +1E00 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +42 +3C +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 12 1 -2 +BITMAP +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +0800 +0600 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 10 1 -2 +BITMAP +7C +06 +06 +7E +C6 +C6 +CE +77 +10 +0C +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 726 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +0E +38 +00 +3E +63 +C0 +C0 +C0 +C0 +C0 +C0 +63 +3E +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 545 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +0E +38 +00 +3C +66 +C0 +C0 +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 726 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +18 +2C +00 +3E +63 +C0 +C0 +C0 +C0 +C0 +C0 +63 +3E +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 545 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +58 +00 +3C +66 +C0 +C0 +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 726 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +18 +18 +00 +3E +63 +C0 +C0 +C0 +C0 +C0 +C0 +63 +3E +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 545 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +30 +00 +3C +66 +C0 +C0 +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 726 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +2C +18 +00 +3E +63 +C0 +C0 +C0 +C0 +C0 +C0 +63 +3E +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 545 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +58 +30 +00 +3C +66 +C0 +C0 +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 819 0 +DWIDTH 12 0 +BBX 9 13 2 0 +BITMAP +2C00 +1800 +0000 +FE00 +C300 +C180 +C180 +C180 +C180 +C180 +C180 +C300 +FE00 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 926 0 +DWIDTH 14 0 +BBX 12 11 1 0 +BITMAP +0330 +0330 +0310 +3F20 +6300 +C300 +C300 +C300 +C300 +6700 +3B00 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 819 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +3F80 +30C0 +3060 +3060 +FC60 +3060 +3060 +3060 +30C0 +3F80 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +03 +1F +03 +3F +63 +C3 +C3 +C3 +C3 +67 +3B +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 12 2 0 +BITMAP +F0 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +3C +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +84 +78 +00 +7E +60 +60 +60 +7C +60 +60 +60 +60 +7E +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +42 +3C +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +60 +60 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +18 +18 +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 12 2 -2 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +20 +18 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +3C +66 +C6 +FE +C0 +C0 +62 +3C +20 +18 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +B0 +60 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +2C +18 +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 759 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +18 +2C +00 +3E +63 +C0 +C0 +C0 +C3 +C3 +C3 +63 +3F +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 13 1 -2 +BITMAP +18 +2C +00 +3F +63 +C3 +C3 +C3 +67 +3B +03 +C6 +7C +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 759 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +42 +3C +00 +3E +63 +C0 +C0 +C0 +C3 +C3 +C3 +63 +3F +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 13 1 -2 +BITMAP +42 +3C +00 +3F +63 +C3 +C3 +C3 +67 +3B +03 +C6 +7C +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 759 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +18 +18 +00 +3E +63 +C0 +C0 +C0 +C3 +C3 +C3 +63 +3F +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 13 1 -2 +BITMAP +18 +18 +00 +3F +63 +C3 +C3 +C3 +67 +3B +03 +C6 +7C +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 759 0 +DWIDTH 11 0 +BBX 8 15 2 -5 +BITMAP +3E +63 +C0 +C0 +C0 +C3 +C3 +C3 +63 +3F +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 15 1 -2 +BITMAP +08 +10 +18 +18 +00 +3F +63 +C3 +C3 +C3 +67 +3B +03 +C6 +7C +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 813 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +18 +2C +00 +C3 +C3 +C3 +C3 +FF +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +60 +B0 +00 +C0 +C0 +C0 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 813 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +C3 +FF +C3 +C3 +FF +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +C0 +F8 +C0 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 5 13 1 0 +BITMAP +68 +B0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 5 11 0 0 +BITMAP +68 +B0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 4 12 1 0 +BITMAP +F0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 4 10 0 0 +BITMAP +F0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 6 13 0 0 +BITMAP +84 +78 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 6 11 -1 0 +BITMAP +84 +78 +00 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 3 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +60 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 3 13 1 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +60 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 2 13 2 0 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 2 8 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 844 0 +DWIDTH 12 0 +BBX 8 12 2 -2 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +03 +0E +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 704 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C6 +C6 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +1C +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 501 0 +DWIDTH 6 0 +BBX 5 15 0 -2 +BITMAP +30 +58 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 361 0 +DWIDTH 5 0 +BBX 5 13 0 -2 +BITMAP +30 +58 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 753 0 +DWIDTH 11 0 +BBX 8 15 2 -5 +BITMAP +C3 +C6 +CC +D8 +F0 +D8 +CC +C6 +C3 +C3 +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 681 0 +DWIDTH 9 0 +BBX 8 16 1 -5 +BITMAP +C0 +C0 +C0 +C6 +CC +D8 +F0 +D8 +CC +C6 +C7 +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 681 0 +DWIDTH 9 0 +BBX 8 8 1 0 +BITMAP +C6 +CC +D8 +F0 +D8 +CC +C6 +C7 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 620 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +38 +E0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 5 14 0 0 +BITMAP +38 +E0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 620 0 +DWIDTH 9 0 +BBX 6 15 2 -5 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +60 +60 +20 +40 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 2 16 1 -5 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 854 0 +DWIDTH 13 0 +BBX 10 11 2 0 +BITMAP +00C0 +C0C0 +C040 +C080 +C000 +C000 +C000 +C000 +C000 +C000 +FC00 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 608 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +CC +CC +C4 +C8 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 932 0 +DWIDTH 19 0 +BBX 13 10 2 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +C018 +C018 +C000 +C000 +FC00 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 686 0 +DWIDTH 14 0 +BBX 9 11 1 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C180 +C180 +C000 +C000 +C000 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 620 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +30 +30 +30 +30 +3C +F0 +30 +30 +30 +3F +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 6 11 0 0 +BITMAP +30 +30 +30 +30 +3C +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +0E +38 +00 +E1 +E1 +B1 +B1 +99 +99 +8D +8D +87 +87 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +0E +38 +00 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 15 2 -5 +BITMAP +E1 +E1 +B1 +B1 +99 +99 +8D +8D +87 +87 +00 +0C +0C +04 +08 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 13 1 -5 +BITMAP +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +58 +30 +00 +E1 +E1 +B1 +B1 +99 +99 +8D +8D +87 +87 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +2C +18 +00 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 945 0 +DWIDTH 14 0 +BBX 12 11 1 0 +BITMAP +C000 +C000 +4000 +8DE0 +0E70 +0C30 +0C30 +0C30 +0C30 +0C30 +0C30 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 12 2 -2 +BITMAP +E1 +E1 +B1 +B1 +99 +99 +8F +8F +87 +87 +03 +0E +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +03 +0E +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 12 1 0 +BITMAP +1E00 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +2100 +1E00 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +42 +3C +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +1B00 +1200 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +36 +24 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 1102 0 +DWIDTH 15 0 +BBX 13 10 1 0 +BITMAP +3DF8 +6380 +C180 +C180 +C1F0 +C180 +C180 +C180 +6380 +3DF8 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 990 0 +DWIDTH 15 0 +BBX 13 8 1 0 +BITMAP +3CF0 +6398 +C318 +C3F8 +C300 +C300 +6388 +3CF0 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 734 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +0E +38 +00 +FC +C6 +C6 +C4 +CC +F8 +CC +C6 +C3 +C3 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 2 0 +BITMAP +38 +E0 +00 +D8 +D8 +E0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 734 0 +DWIDTH 11 0 +BBX 8 15 2 -5 +BITMAP +FC +C6 +C6 +C4 +CC +F8 +CC +C6 +C3 +C3 +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 13 2 -5 +BITMAP +D8 +D8 +E0 +C0 +C0 +C0 +C0 +C0 +00 +60 +60 +20 +40 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 734 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +2C +18 +00 +FC +C6 +C6 +C4 +CC +F8 +CC +C6 +C3 +C3 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 2 0 +BITMAP +B0 +60 +00 +D8 +D8 +E0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +1C +70 +00 +7C +C6 +C0 +E0 +78 +3C +0E +06 +C6 +7C +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 622 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +1C +70 +00 +7C +C0 +C0 +F0 +3C +0C +0C +F8 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +30 +58 +00 +7C +C6 +C0 +E0 +78 +3C +0E +06 +C6 +7C +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 622 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +60 +B0 +00 +7C +C0 +C0 +F0 +3C +0C +0C +F8 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 7 12 1 -2 +BITMAP +7C +C6 +C0 +E0 +78 +3C +0E +06 +C6 +7C +08 +30 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 622 0 +DWIDTH 8 0 +BBX 6 10 1 -2 +BITMAP +7C +C0 +C0 +F0 +3C +0C +0C +F8 +10 +60 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +2C +18 +00 +7C +C6 +C0 +E0 +78 +3C +0E +06 +C6 +7C +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 622 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +58 +30 +00 +7C +C0 +C0 +F0 +3C +0C +0C +F8 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 735 0 +DWIDTH 10 0 +BBX 8 12 1 -2 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +08 +30 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 436 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +60 +60 +F8 +60 +60 +60 +60 +60 +60 +38 +20 +C0 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 735 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +2C +18 +00 +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 679 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +0180 +6180 +6080 +F900 +6000 +6000 +6000 +6000 +6000 +6000 +3800 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 735 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +FF +18 +18 +18 +3E +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 436 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +60 +60 +F8 +60 +60 +F8 +60 +60 +60 +38 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +1A +2C +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +1A +2C +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 12 2 0 +BITMAP +3C +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +42 +3C +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +42 +3C +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 14 2 0 +BITMAP +18 +2C +18 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +18 +2C +18 +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +36 +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +36 +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 12 2 -2 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +10 +0C +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +10 +0C +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 940 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +0C00 +1600 +0000 +C060 +C060 +C660 +C660 +6640 +6B40 +6B40 +7BC0 +3180 +3180 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 885 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +0C00 +1600 +0000 +C060 +C460 +C460 +6EC0 +6AC0 +7B80 +3180 +3180 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 738 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +18 +2C +00 +C3 +C3 +62 +66 +34 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +30 +58 +00 +C6 +C6 +C6 +C6 +6C +68 +38 +30 +60 +E0 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 738 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +24 +24 +00 +C3 +C3 +62 +66 +34 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 675 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +0E +38 +00 +FE +06 +0C +1C +18 +30 +70 +60 +C0 +FE +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 608 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +0E +38 +00 +FE +06 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 675 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +18 +00 +FE +06 +0C +1C +18 +30 +70 +60 +C0 +FE +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 608 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +18 +18 +00 +FE +06 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 675 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +2C +18 +00 +FE +06 +0C +1C +18 +30 +70 +60 +C0 +FE +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 608 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +2C +18 +00 +FE +06 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 726 0 +DWIDTH 11 0 +BBX 8 10 2 0 +BITMAP +7C +C6 +03 +03 +03 +03 +03 +03 +C6 +7C +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 819 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +3F80 +30C0 +3060 +3060 +FC60 +3060 +3060 +3060 +30C0 +3F80 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 10 2 0 +BITMAP +FC +0C +0C +0C +0C +7C +0C +0C +0C +FC +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 11 2 -1 +BITMAP +1C +32 +30 +30 +FC +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 5 10 1 0 +BITMAP +60 +60 +60 +60 +F8 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 5 11 0 0 +BITMAP +60 +60 +60 +60 +60 +F8 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 10 12 0 -2 +BITMAP +3840 +3840 +2C40 +2C40 +2640 +2640 +3340 +3140 +31C0 +31C0 +3000 +E000 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +3F00 +6180 +C0C0 +C0C0 +FFC0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +3F60 +61E0 +C0E0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 10 8 1 0 +BITMAP +3CC0 +66C0 +C340 +C380 +C300 +C300 +6600 +3C00 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +7C +C6 +06 +0E +3C +78 +E0 +C0 +C6 +7C +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 622 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +F8 +0C +0C +3C +F0 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 735 0 +DWIDTH 10 0 +BBX 8 12 1 -2 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +0E +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +C3C0 +C3C0 +C340 +C380 +C300 +C300 +C300 +C300 +6600 +3C00 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 10 8 1 0 +BITMAP +C3C0 +C3C0 +C340 +C380 +C300 +C300 +E700 +7B00 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 675 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +FE +06 +0C +1C +7C +30 +70 +60 +C0 +FE +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 608 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FE +06 +0C +7C +30 +60 +C0 +FE +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7E +C7 +03 +03 +FF +0C +18 +60 +FF +FF +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 10 2 0 +BITMAP +FC +FC +80 +80 +FC +0E +06 +06 +CC +78 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 12 1 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 12 1 -1 +BITMAP +18 +18 +18 +18 +18 +FE +18 +FE +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +80 +80 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +1600 +0C00 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +2C +18 +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 4 13 1 0 +BITMAP +B0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 4 11 0 0 +BITMAP +B0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +1600 +0C00 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +2C +18 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +2C +18 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +2C +18 +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 15 2 0 +BITMAP +3C +00 +24 +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +64 +3C +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +00 +24 +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 16 2 0 +BITMAP +0E +38 +00 +24 +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +64 +3C +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0E +38 +00 +24 +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 16 2 0 +BITMAP +2C +18 +00 +24 +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +64 +3C +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +2C +18 +00 +24 +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 16 2 0 +BITMAP +70 +1C +00 +24 +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +64 +3C +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +70 +1C +00 +24 +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +78 +8C +06 +06 +FE +C6 +CC +78 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 773 0 +DWIDTH 10 0 +BBX 8 15 1 0 +BITMAP +3C +00 +24 +24 +00 +18 +18 +2C +2C +66 +46 +FE +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 13 1 0 +BITMAP +3C +00 +24 +24 +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 15 1 0 +BITMAP +1E00 +0000 +0C00 +0C00 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 13 1 0 +BITMAP +3C +00 +18 +18 +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 997 0 +DWIDTH 13 0 +BBX 11 12 1 0 +BITMAP +0F00 +0000 +1FE0 +1600 +2600 +2600 +67C0 +4600 +7E00 +C600 +C600 +C7E0 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 913 0 +DWIDTH 14 0 +BBX 12 10 1 0 +BITMAP +0780 +0000 +7DE0 +0730 +0630 +7FF0 +C600 +C600 +C710 +79E0 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 759 0 +DWIDTH 11 0 +BBX 9 10 2 0 +BITMAP +3E00 +6300 +C000 +C000 +C000 +C300 +CF80 +C300 +6300 +3F00 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3F +63 +C3 +C3 +C3 +67 +3B +FF +C6 +7C +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 759 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +2C +18 +00 +3E +63 +C0 +C0 +C0 +C3 +C3 +C3 +63 +3F +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 13 1 -2 +BITMAP +2C +18 +00 +3F +63 +C3 +C3 +C3 +67 +3B +03 +C6 +7C +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 753 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +2C +18 +00 +C3 +C6 +CC +D8 +F0 +D8 +CC +C6 +C3 +C3 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 681 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +B0 +60 +00 +C0 +C0 +C0 +C6 +CC +D8 +F0 +D8 +CC +C6 +C7 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 12 1 -2 +BITMAP +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +0800 +0600 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +66 +3C +10 +0C +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 14 1 -2 +BITMAP +1E00 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +0800 +0600 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 12 1 -2 +BITMAP +3C +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +10 +0C +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 361 0 +DWIDTH 5 0 +BBX 5 13 0 -2 +BITMAP +58 +30 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 759 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +0E +38 +00 +3E +63 +C0 +C0 +C0 +C3 +C3 +C3 +63 +3F +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 13 1 -2 +BITMAP +07 +1C +00 +3F +63 +C3 +C3 +C3 +67 +3B +03 +C6 +7C +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +E0 +38 +00 +E1 +E1 +B1 +B1 +99 +99 +8D +8D +87 +87 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +70 +1C +00 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +0700 +1C00 +0000 +1C00 +2600 +1C00 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +0E +38 +00 +18 +2C +18 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 997 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +0380 +0E00 +0000 +1FE0 +1600 +2600 +2600 +67C0 +4600 +7E00 +C600 +C600 +C7E0 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 913 0 +DWIDTH 14 0 +BBX 12 11 1 0 +BITMAP +01C0 +0700 +0000 +7DE0 +0730 +0630 +7FF0 +C600 +C600 +C710 +79E0 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 15 1 -1 +BITMAP +0380 +0E00 +0000 +0040 +3F40 +6180 +C2C0 +C2C0 +C4C0 +C8C0 +D0C0 +D0C0 +6180 +BF00 +8000 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 13 1 -1 +BITMAP +07 +1C +00 +01 +3D +66 +CB +CB +D3 +D3 +66 +BC +80 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +3600 +1200 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +36 +12 +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +1E00 +2100 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +3C +42 +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +D8 +48 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +24 +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +78 +84 +00 +7E +60 +60 +60 +7C +60 +60 +60 +60 +7E +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3C +42 +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 5 13 0 0 +BITMAP +D8 +48 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 5 11 -1 0 +BITMAP +D8 +48 +00 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 6 13 0 0 +BITMAP +78 +84 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 6 11 -1 0 +BITMAP +78 +84 +00 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +3600 +1200 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +6C +24 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +1E00 +2100 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +3C +42 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 734 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +6C +24 +00 +FC +C6 +C6 +C4 +CC +F8 +CC +C6 +C3 +C3 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +D8 +48 +00 +6C +6C +70 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 734 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +3C +42 +00 +FC +C6 +C6 +C4 +CC +F8 +CC +C6 +C3 +C3 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +78 +84 +00 +6C +6C +70 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +6C +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +6C +24 +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +3C +42 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +3C +42 +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 7 15 1 -5 +BITMAP +7C +C6 +C0 +E0 +78 +3C +0E +06 +C6 +7C +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 622 0 +DWIDTH 8 0 +BBX 6 13 1 -5 +BITMAP +7C +C0 +C0 +F0 +3C +0C +0C +F8 +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 735 0 +DWIDTH 10 0 +BBX 8 15 1 -5 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +18 +18 +08 +10 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 436 0 +DWIDTH 7 0 +BBX 5 15 1 -5 +BITMAP +60 +60 +F8 +60 +60 +60 +60 +60 +60 +38 +00 +30 +30 +10 +20 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 813 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +2C +18 +00 +C3 +C3 +C3 +C3 +FF +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +B0 +60 +00 +C0 +C0 +C0 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +0C00 +0C00 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +18 +18 +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 12 2 -2 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +20 +C0 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +3C +66 +C6 +FE +C0 +C0 +62 +3C +10 +60 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +1E00 +0000 +2100 +2100 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +00 +24 +24 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +1E00 +0000 +0D00 +1600 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +00 +34 +58 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +0C00 +0C00 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +18 +18 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +1E00 +0000 +0C00 +0C00 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +00 +18 +18 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 738 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +3C +00 +C3 +C3 +62 +66 +34 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 12 1 -2 +BITMAP +3C +00 +C6 +C6 +C6 +C6 +6C +68 +38 +30 +60 +E0 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 8 1 0 +BITMAP +EE +73 +63 +63 +7E +60 +60 +3E +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 545 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +78 +CC +06 +06 +06 +06 +8C +78 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +78 +CC +C6 +FE +06 +06 +8C +78 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +78 +8C +06 +06 +FE +C6 +CC +78 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 461 0 +DWIDTH 7 0 +BBX 7 11 0 -3 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FE +18 +18 +F0 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 -3 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +03 +03 +03 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +3C +66 +C3 +FF +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 8 2 0 +BITMAP +18 +18 +18 +18 +18 +38 +D8 +D8 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 436 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +E0 +30 +30 +30 +30 +30 +30 +F8 +30 +30 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 436 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +60 +60 +F8 +60 +60 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +C3 +C3 +C3 +FF +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 663 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +38 +38 +2C +4C +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 885 0 +DWIDTH 13 0 +BBX 11 8 1 0 +BITMAP +3180 +3180 +3BC0 +6AC0 +6EC0 +C460 +C460 +C060 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +0E +0C +18 +38 +2C +6C +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 681 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +E3 +63 +33 +1B +0F +1B +33 +63 +03 +03 +03 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 4 1 7 +BITMAP +40 +80 +C0 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 4 1 7 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 4 1 7 +BITMAP +C0 +C0 +80 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 4 2 3 9 +BITMAP +60 +B0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 4 2 3 9 +BITMAP +B0 +60 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 4 1 7 +BITMAP +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 4 1 3 9 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CA +ENCODING 714 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 5 2 3 9 +BITMAP +38 +E0 +ENDCHAR +STARTCHAR uni02CB +ENCODING 715 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 5 2 2 9 +BITMAP +E0 +38 +ENDCHAR +STARTCHAR uni02CD +ENCODING 717 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 4 1 3 -2 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CE +ENCODING 718 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 5 2 2 -3 +BITMAP +E0 +38 +ENDCHAR +STARTCHAR uni02CF +ENCODING 719 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 5 2 3 -3 +BITMAP +38 +E0 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 6 2 2 9 +BITMAP +84 +78 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 2 2 4 9 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 4 3 3 8 +BITMAP +60 +B0 +60 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 3 2 5 -2 +BITMAP +80 +60 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 5 2 3 9 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 5 2 3 9 +BITMAP +D8 +90 +ENDCHAR +STARTCHAR uni02EE +ENCODING 750 +SWIDTH 530 0 +DWIDTH 7 0 +BBX 5 4 1 7 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 343 0 +DWIDTH 4 0 +BBX 2 9 1 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 5 2 3 9 +BITMAP +38 +E0 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 5 5 3 9 +BITMAP +38 +E0 +00 +90 +90 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 343 0 +DWIDTH 10 0 +BBX 2 2 4 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 699 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FB +C0 +C0 +ENDCHAR +STARTCHAR uni1E00 +ENCODING 7680 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +0000 +0C00 +1600 +0C00 +ENDCHAR +STARTCHAR uni1E01 +ENCODING 7681 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 12 1 -4 +BITMAP +7C +06 +06 +7E +C6 +C6 +CE +77 +00 +18 +2C +18 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 669 0 +DWIDTH 10 0 +BBX 7 13 2 0 +BITMAP +30 +30 +00 +FC +C6 +C6 +CC +F0 +CC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +60 +60 +00 +C0 +C0 +C0 +DC +E6 +C3 +C3 +C3 +C3 +C6 +FC +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 669 0 +DWIDTH 10 0 +BBX 7 13 2 -3 +BITMAP +FC +C6 +C6 +CC +F0 +CC +C6 +C6 +C6 +FC +00 +30 +30 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 14 1 -3 +BITMAP +C0 +C0 +C0 +DC +E6 +C3 +C3 +C3 +C3 +C6 +FC +00 +18 +18 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 669 0 +DWIDTH 10 0 +BBX 7 12 2 -2 +BITMAP +FC +C6 +C6 +CC +F0 +CC +C6 +C6 +C6 +FC +00 +78 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 13 1 -2 +BITMAP +C0 +C0 +C0 +DC +E6 +C3 +C3 +C3 +C3 +C6 +FC +00 +3C +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 726 0 +DWIDTH 11 0 +BBX 8 15 2 -2 +BITMAP +0E +38 +00 +3E +63 +C0 +C0 +C0 +C0 +C0 +C0 +63 +3E +08 +30 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 545 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +0E +38 +00 +3C +66 +C0 +C0 +C0 +C0 +62 +3C +10 +60 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 819 0 +DWIDTH 12 0 +BBX 9 13 2 0 +BITMAP +1800 +1800 +0000 +FE00 +C300 +C180 +C180 +C180 +C180 +C180 +C180 +C300 +FE00 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +06 +06 +00 +03 +03 +03 +3F +63 +C3 +C3 +C3 +C3 +67 +3B +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 819 0 +DWIDTH 12 0 +BBX 9 13 2 -3 +BITMAP +FE00 +C300 +C180 +C180 +C180 +C180 +C180 +C180 +C300 +FE00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 14 1 -3 +BITMAP +03 +03 +03 +3F +63 +C3 +C3 +C3 +C3 +67 +3B +00 +18 +18 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 819 0 +DWIDTH 12 0 +BBX 9 12 2 -2 +BITMAP +FE00 +C300 +C180 +C180 +C180 +C180 +C180 +C180 +C300 +FE00 +0000 +3C00 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 13 1 -2 +BITMAP +03 +03 +03 +3F +63 +C3 +C3 +C3 +C3 +67 +3B +00 +3C +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 819 0 +DWIDTH 12 0 +BBX 9 12 2 -2 +BITMAP +FE00 +C300 +C180 +C180 +C180 +C180 +C180 +C180 +C300 +FE00 +0800 +3000 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 13 1 -2 +BITMAP +03 +03 +03 +3F +63 +C3 +C3 +C3 +C3 +67 +3B +08 +30 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 819 0 +DWIDTH 12 0 +BBX 9 13 2 -3 +BITMAP +FE00 +C300 +C180 +C180 +C180 +C180 +C180 +C180 +C300 +FE00 +0000 +1800 +2C00 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 14 1 -3 +BITMAP +03 +03 +03 +3F +63 +C3 +C3 +C3 +C3 +67 +3B +00 +18 +2C +ENDCHAR +STARTCHAR uni1E14 +ENCODING 7700 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 15 1 0 +BITMAP +E0 +38 +00 +78 +00 +7E +60 +60 +60 +7C +60 +60 +60 +60 +7E +ENDCHAR +STARTCHAR uni1E15 +ENCODING 7701 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +70 +1C +00 +3C +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR uni1E16 +ENCODING 7702 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 15 2 0 +BITMAP +1C +70 +00 +F0 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1E17 +ENCODING 7703 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +0E +38 +00 +3C +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR uni1E18 +ENCODING 7704 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 13 2 -3 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +00 +60 +B0 +ENDCHAR +STARTCHAR uni1E19 +ENCODING 7705 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +3C +66 +C6 +FE +C0 +C0 +62 +3C +00 +30 +58 +ENDCHAR +STARTCHAR uni1E1A +ENCODING 7706 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 13 2 -3 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E1B +ENCODING 7707 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +3C +66 +C6 +FE +C0 +C0 +62 +3C +00 +34 +58 +ENDCHAR +STARTCHAR uni1E1C +ENCODING 7708 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 15 1 -2 +BITMAP +84 +78 +00 +7E +60 +60 +60 +7C +60 +60 +60 +60 +7E +10 +60 +ENDCHAR +STARTCHAR uni1E1D +ENCODING 7709 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +42 +3C +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +10 +60 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 602 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +60 +60 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 461 0 +DWIDTH 7 0 +BBX 7 14 0 0 +BITMAP +18 +18 +00 +1E +30 +30 +FE +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1E20 +ENCODING 7712 +SWIDTH 759 0 +DWIDTH 11 0 +BBX 8 12 2 0 +BITMAP +3C +00 +3E +63 +C0 +C0 +C0 +C3 +C3 +C3 +63 +3F +ENDCHAR +STARTCHAR uni1E21 +ENCODING 7713 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 12 1 -2 +BITMAP +3C +00 +3F +63 +C3 +C3 +C3 +67 +3B +03 +C6 +7C +ENDCHAR +STARTCHAR uni1E22 +ENCODING 7714 +SWIDTH 813 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +18 +18 +00 +C3 +C3 +C3 +C3 +FF +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1E23 +ENCODING 7715 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +60 +60 +00 +C0 +C0 +C0 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1E24 +ENCODING 7716 +SWIDTH 813 0 +DWIDTH 12 0 +BBX 8 13 2 -3 +BITMAP +C3 +C3 +C3 +C3 +FF +C3 +C3 +C3 +C3 +C3 +00 +18 +18 +ENDCHAR +STARTCHAR uni1E25 +ENCODING 7717 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 14 1 -3 +BITMAP +C0 +C0 +C0 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +00 +18 +18 +ENDCHAR +STARTCHAR uni1E26 +ENCODING 7718 +SWIDTH 813 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +24 +24 +00 +C3 +C3 +C3 +C3 +FF +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1E27 +ENCODING 7719 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +90 +90 +00 +C0 +C0 +C0 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1E28 +ENCODING 7720 +SWIDTH 813 0 +DWIDTH 12 0 +BBX 8 12 2 -2 +BITMAP +C3 +C3 +C3 +C3 +FF +C3 +C3 +C3 +C3 +C3 +08 +30 +ENDCHAR +STARTCHAR uni1E29 +ENCODING 7721 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 13 1 -2 +BITMAP +C0 +C0 +C0 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +08 +30 +ENDCHAR +STARTCHAR uni1E2A +ENCODING 7722 +SWIDTH 813 0 +DWIDTH 12 0 +BBX 8 13 2 -3 +BITMAP +C3 +C3 +C3 +C3 +FF +C3 +C3 +C3 +C3 +C3 +00 +42 +3C +ENDCHAR +STARTCHAR uni1E2B +ENCODING 7723 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 14 1 -3 +BITMAP +C0 +C0 +C0 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +00 +42 +3C +ENDCHAR +STARTCHAR uni1E2C +ENCODING 7724 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 5 13 0 -3 +BITMAP +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E2D +ENCODING 7725 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 5 14 -1 -3 +BITMAP +30 +30 +00 +30 +30 +30 +30 +30 +30 +30 +30 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E2E +ENCODING 7726 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 5 16 1 0 +BITMAP +38 +E0 +00 +90 +90 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E2F +ENCODING 7727 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 5 14 0 0 +BITMAP +38 +E0 +00 +90 +90 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 753 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +0E +38 +00 +C3 +C6 +CC +D8 +F0 +D8 +CC +C6 +C3 +C3 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 681 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +38 +E0 +00 +C0 +C0 +C0 +C6 +CC +D8 +F0 +D8 +CC +C6 +C7 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 753 0 +DWIDTH 11 0 +BBX 8 13 2 -3 +BITMAP +C3 +C6 +CC +D8 +F0 +D8 +CC +C6 +C3 +C3 +00 +18 +18 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 681 0 +DWIDTH 9 0 +BBX 8 14 1 -3 +BITMAP +C0 +C0 +C0 +C6 +CC +D8 +F0 +D8 +CC +C6 +C7 +00 +18 +18 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 753 0 +DWIDTH 11 0 +BBX 8 12 2 -2 +BITMAP +C3 +C6 +CC +D8 +F0 +D8 +CC +C6 +C3 +C3 +00 +3C +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 681 0 +DWIDTH 9 0 +BBX 8 13 1 -2 +BITMAP +C0 +C0 +C0 +C6 +CC +D8 +F0 +D8 +CC +C6 +C7 +00 +3C +ENDCHAR +STARTCHAR uni1E36 +ENCODING 7734 +SWIDTH 620 0 +DWIDTH 9 0 +BBX 6 13 2 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +60 +60 +ENDCHAR +STARTCHAR uni1E37 +ENCODING 7735 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 2 14 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni1E38 +ENCODING 7736 +SWIDTH 620 0 +DWIDTH 9 0 +BBX 6 15 2 -3 +BITMAP +F0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +60 +60 +ENDCHAR +STARTCHAR uni1E39 +ENCODING 7737 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 4 16 0 -3 +BITMAP +F0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +00 +60 +60 +ENDCHAR +STARTCHAR uni1E3A +ENCODING 7738 +SWIDTH 620 0 +DWIDTH 9 0 +BBX 6 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +F0 +ENDCHAR +STARTCHAR uni1E3B +ENCODING 7739 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 4 13 0 -2 +BITMAP +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +00 +F0 +ENDCHAR +STARTCHAR uni1E3C +ENCODING 7740 +SWIDTH 620 0 +DWIDTH 9 0 +BBX 6 13 2 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +60 +B0 +ENDCHAR +STARTCHAR uni1E3D +ENCODING 7741 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 4 14 0 -3 +BITMAP +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +00 +60 +B0 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 940 0 +DWIDTH 15 0 +BBX 11 13 2 0 +BITMAP +0380 +0E00 +0000 +E0E0 +E0E0 +B160 +B160 +B160 +9A60 +9A60 +8C60 +8C60 +8060 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 1006 0 +DWIDTH 14 0 +BBX 12 11 1 0 +BITMAP +0380 +0E00 +0000 +DDE0 +EF70 +C630 +C630 +C630 +C630 +C630 +C630 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 940 0 +DWIDTH 15 0 +BBX 11 13 2 0 +BITMAP +0600 +0600 +0000 +E0E0 +E0E0 +B160 +B160 +B160 +9A60 +9A60 +8C60 +8C60 +8060 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 1006 0 +DWIDTH 14 0 +BBX 12 11 1 0 +BITMAP +0600 +0600 +0000 +DDE0 +EF70 +C630 +C630 +C630 +C630 +C630 +C630 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 940 0 +DWIDTH 15 0 +BBX 11 13 2 -3 +BITMAP +E0E0 +E0E0 +B160 +B160 +B160 +9A60 +9A60 +8C60 +8C60 +8060 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 1006 0 +DWIDTH 14 0 +BBX 12 11 1 -3 +BITMAP +DDE0 +EF70 +C630 +C630 +C630 +C630 +C630 +C630 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1E44 +ENCODING 7748 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 0 +BITMAP +30 +30 +00 +E1 +E1 +B1 +B1 +99 +99 +8D +8D +87 +87 +ENDCHAR +STARTCHAR uni1E45 +ENCODING 7749 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +18 +18 +00 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1E46 +ENCODING 7750 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 -3 +BITMAP +E1 +E1 +B1 +B1 +99 +99 +8D +8D +87 +87 +00 +0C +0C +ENDCHAR +STARTCHAR uni1E47 +ENCODING 7751 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 -3 +BITMAP +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +00 +18 +18 +ENDCHAR +STARTCHAR uni1E48 +ENCODING 7752 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 12 2 -2 +BITMAP +E1 +E1 +B1 +B1 +99 +99 +8D +8D +87 +87 +00 +1E +ENDCHAR +STARTCHAR uni1E49 +ENCODING 7753 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +00 +3C +ENDCHAR +STARTCHAR uni1E4A +ENCODING 7754 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 -3 +BITMAP +E1 +E1 +B1 +B1 +99 +99 +8D +8D +87 +87 +00 +0C +16 +ENDCHAR +STARTCHAR uni1E4B +ENCODING 7755 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 -3 +BITMAP +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +00 +18 +2C +ENDCHAR +STARTCHAR uni1E4C +ENCODING 7756 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +0700 +1C00 +0000 +0D00 +1600 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni1E4D +ENCODING 7757 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0E +38 +00 +34 +58 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1E4E +ENCODING 7758 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +1200 +1200 +0000 +0D00 +1600 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni1E4F +ENCODING 7759 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +24 +24 +00 +34 +58 +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1E50 +ENCODING 7760 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +3800 +0E00 +0000 +1E00 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni1E51 +ENCODING 7761 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +70 +1C +00 +3C +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1E52 +ENCODING 7762 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +0700 +1C00 +0000 +1E00 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni1E53 +ENCODING 7763 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +0E +38 +00 +3C +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 657 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +1C +70 +00 +F8 +CC +CC +CC +CC +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 13 1 -2 +BITMAP +0E +38 +00 +DC +E6 +C3 +C3 +C3 +C3 +C6 +FC +C0 +C0 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 657 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +30 +30 +00 +F8 +CC +CC +CC +CC +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 696 0 +DWIDTH 10 0 +BBX 8 13 1 -2 +BITMAP +18 +18 +00 +DC +E6 +C3 +C3 +C3 +C3 +C6 +FC +C0 +C0 +ENDCHAR +STARTCHAR uni1E58 +ENCODING 7768 +SWIDTH 734 0 +DWIDTH 11 0 +BBX 8 13 2 0 +BITMAP +18 +18 +00 +FC +C6 +C6 +C4 +CC +F8 +CC +C6 +C3 +C3 +ENDCHAR +STARTCHAR uni1E59 +ENCODING 7769 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 2 0 +BITMAP +60 +60 +00 +D8 +D8 +E0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E5A +ENCODING 7770 +SWIDTH 734 0 +DWIDTH 11 0 +BBX 8 13 2 -3 +BITMAP +FC +C6 +C6 +C4 +CC +F8 +CC +C6 +C3 +C3 +00 +18 +18 +ENDCHAR +STARTCHAR uni1E5B +ENCODING 7771 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 2 -3 +BITMAP +D8 +D8 +E0 +C0 +C0 +C0 +C0 +C0 +00 +60 +60 +ENDCHAR +STARTCHAR uni1E5C +ENCODING 7772 +SWIDTH 734 0 +DWIDTH 11 0 +BBX 8 15 2 -3 +BITMAP +78 +00 +FC +C6 +C6 +C4 +CC +F8 +CC +C6 +C3 +C3 +00 +18 +18 +ENDCHAR +STARTCHAR uni1E5D +ENCODING 7773 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 13 2 -3 +BITMAP +F0 +00 +D8 +D8 +E0 +C0 +C0 +C0 +C0 +C0 +00 +60 +60 +ENDCHAR +STARTCHAR uni1E5E +ENCODING 7774 +SWIDTH 734 0 +DWIDTH 11 0 +BBX 8 12 2 -2 +BITMAP +FC +C6 +C6 +C4 +CC +F8 +CC +C6 +C3 +C3 +00 +3C +ENDCHAR +STARTCHAR uni1E5F +ENCODING 7775 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 10 2 -2 +BITMAP +D8 +D8 +E0 +C0 +C0 +C0 +C0 +C0 +00 +F0 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +30 +30 +00 +7C +C6 +C0 +E0 +78 +3C +0E +06 +C6 +7C +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 622 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +30 +30 +00 +7C +C0 +C0 +F0 +3C +0C +0C +F8 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 7 13 1 -3 +BITMAP +7C +C6 +C0 +E0 +78 +3C +0E +06 +C6 +7C +00 +18 +18 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 622 0 +DWIDTH 8 0 +BBX 6 11 1 -3 +BITMAP +7C +C0 +C0 +F0 +3C +0C +0C +F8 +00 +30 +30 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 7 16 1 0 +BITMAP +18 +18 +00 +1C +70 +00 +7C +C6 +C0 +E0 +78 +3C +0E +06 +C6 +7C +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 622 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +30 +30 +00 +1C +70 +00 +7C +C0 +C0 +F0 +3C +0C +0C +F8 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 7 16 1 0 +BITMAP +18 +18 +00 +2C +18 +00 +7C +C6 +C0 +E0 +78 +3C +0E +06 +C6 +7C +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 622 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +30 +30 +00 +58 +30 +00 +7C +C0 +C0 +F0 +3C +0C +0C +F8 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 594 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +30 +30 +00 +7C +C6 +C0 +E0 +78 +3C +0E +06 +C6 +7C +00 +18 +18 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 622 0 +DWIDTH 8 0 +BBX 6 14 1 -3 +BITMAP +30 +30 +00 +7C +C0 +C0 +F0 +3C +0C +0C +F8 +00 +30 +30 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 735 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +18 +18 +00 +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 436 0 +DWIDTH 7 0 +BBX 5 13 1 0 +BITMAP +60 +60 +00 +60 +60 +F8 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 735 0 +DWIDTH 10 0 +BBX 8 13 1 -3 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 436 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +60 +60 +F8 +60 +60 +60 +60 +60 +60 +38 +00 +30 +30 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 735 0 +DWIDTH 10 0 +BBX 8 12 1 -2 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +3C +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 436 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +60 +60 +F8 +60 +60 +60 +60 +60 +60 +38 +00 +78 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 735 0 +DWIDTH 10 0 +BBX 8 13 1 -3 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +18 +2C +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 436 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +60 +60 +F8 +60 +60 +60 +60 +60 +60 +38 +00 +30 +58 +ENDCHAR +STARTCHAR uni1E72 +ENCODING 7794 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 -3 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +00 +24 +24 +ENDCHAR +STARTCHAR uni1E73 +ENCODING 7795 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 -3 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +00 +24 +24 +ENDCHAR +STARTCHAR uni1E74 +ENCODING 7796 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 -3 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +00 +34 +58 +ENDCHAR +STARTCHAR uni1E75 +ENCODING 7797 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 -3 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +00 +34 +58 +ENDCHAR +STARTCHAR uni1E76 +ENCODING 7798 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 -3 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +00 +18 +2C +ENDCHAR +STARTCHAR uni1E77 +ENCODING 7799 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 -3 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +00 +18 +2C +ENDCHAR +STARTCHAR uni1E78 +ENCODING 7800 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 16 2 0 +BITMAP +0E +38 +00 +1A +2C +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1E79 +ENCODING 7801 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +07 +1C +00 +1A +2C +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR uni1E7A +ENCODING 7802 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 15 2 0 +BITMAP +24 +24 +00 +3C +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1E7B +ENCODING 7803 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +24 +24 +00 +3C +00 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +ENDCHAR +STARTCHAR uni1E7C +ENCODING 7804 +SWIDTH 735 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +1A00 +2C00 +0000 +C180 +C180 +C180 +6100 +6300 +6300 +3200 +3600 +1C00 +1C00 +ENDCHAR +STARTCHAR uni1E7D +ENCODING 7805 +SWIDTH 663 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +34 +58 +00 +C6 +C6 +C6 +C6 +64 +68 +38 +38 +ENDCHAR +STARTCHAR uni1E7E +ENCODING 7806 +SWIDTH 735 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +C180 +C180 +C180 +6100 +6300 +6300 +3200 +3600 +1C00 +1C00 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1E7F +ENCODING 7807 +SWIDTH 663 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +C6 +C6 +C6 +64 +68 +38 +38 +00 +30 +30 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 940 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +3800 +0E00 +0000 +C060 +C060 +C660 +C660 +6640 +6B40 +6B40 +7BC0 +3180 +3180 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 885 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +3800 +0E00 +0000 +C060 +C460 +C460 +6EC0 +6AC0 +7B80 +3180 +3180 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 940 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +0380 +0E00 +0000 +C060 +C060 +C660 +C660 +6640 +6B40 +6B40 +7BC0 +3180 +3180 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 885 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +0380 +0E00 +0000 +C060 +C460 +C460 +6EC0 +6AC0 +7B80 +3180 +3180 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 940 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +0900 +0900 +0000 +C060 +C060 +C660 +C660 +6640 +6B40 +6B40 +7BC0 +3180 +3180 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 885 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +0900 +0900 +0000 +C060 +C460 +C460 +6EC0 +6AC0 +7B80 +3180 +3180 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 940 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +0600 +0600 +0000 +C060 +C060 +C660 +C660 +6640 +6B40 +6B40 +7BC0 +3180 +3180 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 885 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +0600 +0600 +0000 +C060 +C460 +C460 +6EC0 +6AC0 +7B80 +3180 +3180 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 940 0 +DWIDTH 13 0 +BBX 11 13 1 -3 +BITMAP +C060 +C060 +C660 +C660 +6640 +6B40 +6B40 +7BC0 +3180 +3180 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 885 0 +DWIDTH 13 0 +BBX 11 11 1 -3 +BITMAP +C060 +C460 +C460 +6EC0 +6AC0 +7B80 +3180 +3180 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 699 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +18 +00 +C6 +C6 +6C +6C +38 +38 +6C +6C +C6 +C6 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 568 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +30 +00 +C6 +C6 +64 +38 +38 +4C +C6 +C6 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 699 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +24 +24 +00 +C6 +C6 +6C +6C +38 +38 +6C +6C +C6 +C6 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 568 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +48 +48 +00 +C6 +C6 +64 +38 +38 +4C +C6 +C6 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 738 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +18 +18 +00 +C3 +C3 +62 +66 +34 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +18 +18 +00 +C6 +C6 +C6 +C6 +6C +68 +38 +30 +60 +E0 +ENDCHAR +STARTCHAR uni1E90 +ENCODING 7824 +SWIDTH 675 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +2C +00 +FE +06 +0C +1C +18 +30 +70 +60 +C0 +FE +ENDCHAR +STARTCHAR uni1E91 +ENCODING 7825 +SWIDTH 608 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +18 +2C +00 +FE +06 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR uni1E92 +ENCODING 7826 +SWIDTH 675 0 +DWIDTH 9 0 +BBX 7 13 1 -3 +BITMAP +FE +06 +0C +1C +18 +30 +70 +60 +C0 +FE +00 +30 +30 +ENDCHAR +STARTCHAR uni1E93 +ENCODING 7827 +SWIDTH 608 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FE +06 +0C +18 +30 +60 +C0 +FE +00 +30 +30 +ENDCHAR +STARTCHAR uni1E94 +ENCODING 7828 +SWIDTH 675 0 +DWIDTH 9 0 +BBX 7 12 1 -2 +BITMAP +FE +06 +0C +1C +18 +30 +70 +60 +C0 +FE +00 +78 +ENDCHAR +STARTCHAR uni1E95 +ENCODING 7829 +SWIDTH 608 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +FE +06 +0C +18 +30 +60 +C0 +FE +00 +78 +ENDCHAR +STARTCHAR uni1E96 +ENCODING 7830 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 13 1 -2 +BITMAP +C0 +C0 +C0 +DE +E7 +C3 +C3 +C3 +C3 +C3 +C3 +00 +3C +ENDCHAR +STARTCHAR uni1E97 +ENCODING 7831 +SWIDTH 436 0 +DWIDTH 7 0 +BBX 5 13 1 0 +BITMAP +90 +90 +00 +60 +60 +F8 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1E98 +ENCODING 7832 +SWIDTH 885 0 +DWIDTH 13 0 +BBX 11 12 1 0 +BITMAP +0600 +0B00 +0600 +0000 +C060 +C460 +C460 +6EC0 +6AC0 +7B80 +3180 +3180 +ENDCHAR +STARTCHAR uni1E99 +ENCODING 7833 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 14 1 -2 +BITMAP +18 +2C +18 +00 +C6 +C6 +C6 +C6 +6C +68 +38 +30 +60 +E0 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +7C +06 +06 +7E +C6 +C6 +CE +77 +00 +18 +18 +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +0700 +1C00 +0000 +1C00 +2600 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +0E +38 +00 +18 +2C +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +7000 +1C00 +0000 +1C00 +2600 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +70 +1C +00 +18 +2C +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +1A00 +2C00 +0000 +1C00 +2600 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +1A +2C +00 +18 +2C +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 16 1 -3 +BITMAP +0C00 +1600 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 14 1 -3 +BITMAP +18 +2C +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +00 +18 +18 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +0700 +1C00 +0000 +2100 +1E00 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +0E +38 +00 +42 +3C +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +3800 +0E00 +0000 +2100 +1E00 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +70 +1C +00 +42 +3C +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +1A00 +2C00 +0000 +2100 +1E00 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +1A +2C +00 +42 +3C +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 16 1 -3 +BITMAP +2100 +1E00 +0000 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 623 0 +DWIDTH 9 0 +BBX 8 14 1 -3 +BITMAP +42 +3C +00 +7C +06 +06 +7E +C6 +C6 +CE +77 +00 +18 +18 +ENDCHAR +STARTCHAR uni1EB8 +ENCODING 7864 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 13 2 -3 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +00 +60 +60 +ENDCHAR +STARTCHAR uni1EB9 +ENCODING 7865 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +3C +66 +C6 +FE +C0 +C0 +62 +3C +00 +30 +30 +ENDCHAR +STARTCHAR uni1EBC +ENCODING 7868 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +68 +B0 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EBD +ENCODING 7869 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +34 +58 +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 16 2 0 +BITMAP +1C +70 +00 +30 +58 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +0E +38 +00 +18 +2C +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 16 2 0 +BITMAP +E0 +38 +00 +30 +58 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +70 +1C +00 +18 +2C +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 16 2 0 +BITMAP +34 +58 +00 +30 +58 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +1A +2C +00 +18 +2C +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 16 2 -3 +BITMAP +60 +B0 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FC +00 +60 +60 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 614 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +18 +2C +00 +3C +66 +C6 +FE +C0 +C0 +62 +3C +00 +30 +30 +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 361 0 +DWIDTH 6 0 +BBX 2 13 2 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 361 0 +DWIDTH 4 0 +BBX 2 14 1 -3 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni1ECC +ENCODING 7884 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 13 1 -3 +BITMAP +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1ECD +ENCODING 7885 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 11 1 -3 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +66 +3C +00 +18 +18 +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +0700 +1C00 +0000 +0C00 +1600 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0E +38 +00 +18 +2C +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +3800 +0E00 +0000 +0C00 +1600 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +70 +1C +00 +18 +2C +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +0D00 +1600 +0000 +0C00 +1600 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +1A +2C +00 +18 +2C +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 10 16 1 -3 +BITMAP +0C00 +1600 +0000 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 8 14 1 -3 +BITMAP +18 +2C +00 +3C +66 +C3 +C3 +C3 +C3 +66 +3C +00 +18 +18 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 11 13 1 0 +BITMAP +0380 +0E00 +0000 +3F60 +61E0 +C0E0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +0380 +0E00 +0000 +3CC0 +66C0 +C340 +C380 +C300 +C300 +6600 +3C00 +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 11 13 1 0 +BITMAP +1C00 +0700 +0000 +3F60 +61E0 +C0E0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +3800 +0E00 +0000 +3CC0 +66C0 +C340 +C380 +C300 +C300 +6600 +3C00 +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 11 13 1 0 +BITMAP +0680 +0B00 +0000 +3F60 +61E0 +C0E0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +0D00 +1600 +0000 +3CC0 +66C0 +C340 +C380 +C300 +C300 +6600 +3C00 +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 855 0 +DWIDTH 12 0 +BBX 11 13 1 -3 +BITMAP +3F60 +61E0 +C0E0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +3F00 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 675 0 +DWIDTH 10 0 +BBX 10 11 1 -3 +BITMAP +3CC0 +66C0 +C340 +C380 +C300 +C300 +6600 +3C00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 13 2 -3 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +00 +18 +18 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 8 11 1 -3 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +E7 +7B +00 +18 +18 +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 10 13 2 0 +BITMAP +0380 +0E00 +0000 +C3C0 +C3C0 +C340 +C380 +C300 +C300 +C300 +C300 +6600 +3C00 +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +0380 +0E00 +0000 +C3C0 +C3C0 +C340 +C380 +C300 +C300 +E700 +7B00 +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 10 13 2 0 +BITMAP +3800 +0E00 +0000 +C3C0 +C3C0 +C340 +C380 +C300 +C300 +C300 +C300 +6600 +3C00 +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +3800 +0E00 +0000 +C3C0 +C3C0 +C340 +C380 +C300 +C300 +E700 +7B00 +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 10 13 2 0 +BITMAP +0D00 +1600 +0000 +C3C0 +C3C0 +C340 +C380 +C300 +C300 +C300 +C300 +6600 +3C00 +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +0D00 +1600 +0000 +C3C0 +C3C0 +C340 +C380 +C300 +C300 +E700 +7B00 +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 10 13 2 -3 +BITMAP +C3C0 +C3C0 +C340 +C380 +C300 +C300 +C300 +C300 +6600 +3C00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 10 11 1 -3 +BITMAP +C3C0 +C3C0 +C340 +C380 +C300 +C300 +E700 +7B00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 738 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +70 +1C +00 +C3 +C3 +62 +66 +34 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +E0 +38 +00 +C6 +C6 +C6 +C6 +6C +68 +38 +30 +60 +E0 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 738 0 +DWIDTH 10 0 +BBX 8 13 1 -3 +BITMAP +C3 +C3 +62 +66 +34 +18 +18 +18 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 13 1 -5 +BITMAP +C6 +C6 +C6 +C6 +6C +68 +38 +30 +60 +E0 +00 +30 +30 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 738 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +1A +2C +00 +C3 +C3 +62 +66 +34 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +34 +58 +00 +C6 +C6 +C6 +C6 +6C +68 +38 +30 +60 +E0 +ENDCHAR +STARTCHAR uni2000 +ENCODING 8192 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2001 +ENCODING 8193 +SWIDTH 1000 0 +DWIDTH 15 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2002 +ENCODING 8194 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2003 +ENCODING 8195 +SWIDTH 1000 0 +DWIDTH 15 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2004 +ENCODING 8196 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2005 +ENCODING 8197 +SWIDTH 250 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2006 +ENCODING 8198 +SWIDTH 167 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2007 +ENCODING 8199 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2008 +ENCODING 8200 +SWIDTH 343 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2009 +ENCODING 8201 +SWIDTH 200 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni200A +ENCODING 8202 +SWIDTH 100 0 +DWIDTH 1 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni200B +ENCODING 8203 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 289 0 +DWIDTH 5 0 +BBX 3 1 1 4 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 289 0 +DWIDTH 5 0 +BBX 3 1 1 4 +BITMAP +E0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 1000 0 +DWIDTH 15 0 +BBX 13 1 1 4 +BITMAP +FFF8 +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 1000 0 +DWIDTH 15 0 +BBX 13 1 1 4 +BITMAP +FFF8 +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 4 1 7 +BITMAP +40 +80 +C0 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 4 1 7 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 4 1 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 265 0 +DWIDTH 4 0 +BBX 2 4 1 7 +BITMAP +C0 +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 530 0 +DWIDTH 7 0 +BBX 5 4 1 7 +BITMAP +48 +90 +D8 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 530 0 +DWIDTH 7 0 +BBX 5 4 1 7 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 530 0 +DWIDTH 7 0 +BBX 5 4 1 -2 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 530 0 +DWIDTH 7 0 +BBX 5 4 1 7 +BITMAP +D8 +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 6 11 2 -1 +BITMAP +30 +30 +30 +FC +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 693 0 +DWIDTH 10 0 +BBX 6 11 2 -1 +BITMAP +30 +30 +30 +FC +30 +30 +30 +FC +30 +30 +30 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 4 4 3 2 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 1000 0 +DWIDTH 10 0 +BBX 6 2 2 0 +BITMAP +CC +CC +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 1313 0 +DWIDTH 18 0 +BBX 16 10 1 0 +BITMAP +7000 +D980 +DB00 +7200 +0400 +0800 +138E +36DB +66DB +038E +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 361 0 +DWIDTH 5 0 +BBX 4 5 0 2 +BITMAP +30 +60 +C0 +60 +30 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 361 0 +DWIDTH 5 0 +BBX 4 5 1 2 +BITMAP +C0 +60 +30 +60 +C0 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 93 0 +DWIDTH 4 0 +BBX 6 10 -1 0 +BITMAP +0C +0C +18 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 536 0 +DWIDTH 7 0 +BBX 4 6 1 -2 +BITMAP +30 +F0 +30 +30 +30 +30 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 536 0 +DWIDTH 7 0 +BBX 5 6 1 -2 +BITMAP +F0 +18 +18 +60 +C0 +F8 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 536 0 +DWIDTH 7 0 +BBX 5 6 1 -2 +BITMAP +F0 +18 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 1006 0 +DWIDTH 14 0 +BBX 12 12 1 -2 +BITMAP +00C0 +0180 +DDE0 +EF70 +C730 +C630 +C630 +CE30 +CE30 +DE30 +1800 +3000 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 783 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +E1 +E1 +B1 +FF +99 +FF +8D +8D +87 +87 +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 940 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +C060 +C060 +C660 +FFE0 +6640 +7FC0 +6B40 +7BC0 +3180 +3180 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 726 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +1F00 +3180 +6000 +FE00 +6000 +FE00 +6000 +6000 +3180 +1F00 +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 753 0 +DWIDTH 11 0 +BBX 8 10 2 0 +BITMAP +C3 +C6 +CC +D8 +FF +D8 +CC +C6 +C3 +C3 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 955 0 +DWIDTH 15 0 +BBX 14 10 0 0 +BITMAP +60F8 +918C +6300 +0300 +0300 +0300 +0300 +0300 +018C +00F8 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 831 0 +DWIDTH 13 0 +BBX 12 10 0 0 +BITMAP +63F0 +9300 +6300 +0300 +03E0 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 901 0 +DWIDTH 13 0 +BBX 10 5 1 5 +BITMAP +FEC0 +2540 +2540 +2540 +2440 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 753 0 +DWIDTH 11 0 +BBX 8 10 2 0 +BITMAP +C3 +C6 +CC +D8 +F0 +D8 +CC +C6 +C3 +C3 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +1C00 +2600 +1C00 +1C00 +1C00 +2600 +2600 +6300 +4300 +FF00 +C180 +C180 +C180 +ENDCHAR +STARTCHAR uni2132 +ENCODING 8498 +SWIDTH 602 0 +DWIDTH 9 0 +BBX 6 10 2 0 +BITMAP +0C +0C +0C +0C +0C +7C +0C +0C +0C +FC +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 773 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +C180 +C180 +C180 +FF00 +4300 +6300 +2600 +2600 +1C00 +1C00 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 6 10 2 0 +BITMAP +FC +0C +0C +0C +7C +0C +0C +0C +0C +FC +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 645 0 +DWIDTH 9 0 +BBX 8 12 1 -1 +BITMAP +03 +7E +06 +0E +0E +3E +1E +36 +36 +66 +7E +C0 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 1 1 4 +BITMAP +FE +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 93 0 +DWIDTH 4 0 +BBX 6 10 -1 0 +BITMAP +0C +0C +18 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 343 0 +DWIDTH 10 0 +BBX 2 2 4 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 343 0 +DWIDTH 4 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 6 1 3 +BITMAP +18 +2C +00 +FE +00 +FE +ENDCHAR +STARTCHAR uni225A +ENCODING 8794 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 6 1 3 +BITMAP +2C +18 +00 +FE +00 +FE +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 12 1 -1 +BITMAP +03 +06 +06 +0C +0C +FE +18 +FE +30 +60 +60 +C0 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 7 5 0 2 +BITMAP +FE +00 +FE +00 +FE +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 12 0 -1 +BITMAP +03 +06 +06 +0C +FE +18 +FE +30 +FE +60 +60 +C0 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +0C +38 +60 +C0 +60 +38 +0C +00 +FC +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +C0 +70 +18 +0C +18 +70 +C0 +00 +FC +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 12 1 -1 +BITMAP +03 +06 +06 +0E +1C +38 +78 +30 +3C +66 +60 +C0 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 12 1 -1 +BITMAP +03 +06 +06 +6C +3C +1C +1E +3C +38 +60 +60 +C0 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 12 1 -2 +BITMAP +03 +06 +06 +1C +3C +78 +38 +3C +36 +60 +7E +C0 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 687 0 +DWIDTH 10 0 +BBX 8 12 1 -2 +BITMAP +03 +06 +66 +3C +0C +1E +1C +38 +70 +60 +7E +C0 +ENDCHAR +STARTCHAR fi +ENCODING -1 +SWIDTH 711 0 +DWIDTH 11 0 +BBX 9 11 0 0 +BITMAP +1D80 +3180 +3000 +FF80 +3180 +3180 +3180 +3180 +3180 +3180 +3180 +ENDCHAR +STARTCHAR fl +ENCODING -1 +SWIDTH 711 0 +DWIDTH 10 0 +BBX 9 11 0 0 +BITMAP +1F80 +3180 +3180 +FD80 +3180 +3180 +3180 +3180 +3180 +3180 +3180 +ENDCHAR +ENDFONT diff --git a/2.5/bertos/fonts/luBS14.c b/2.5/bertos/fonts/luBS14.c new file mode 100644 index 00000000..ee717dec --- /dev/null +++ b/2.5/bertos/fonts/luBS14.c @@ -0,0 +1,1316 @@ +/* Generated by convbdf on Thu Apr 8 16:34:22 CEST 2010. */ +#include + +/* Font information: + + name: -B&H-Lucida-Bold-R-Normal-Sans-14-140-75-75-P-92-ISO10646-1 + pixel size: 14 + ascent: 13 + descent: 2 +*/ + +/* Font character bitmap data. */ +static const PROGMEM uint8_t font_luBS14_glyphs[] = { + +/* Character (0x00): bbw=7, bbh=9, bbx=2, bby=0, width=12 */ +0x00, 0x00, 0x50, 0x00, 0x10, 0x00, 0x10, 0x00, 0x50, 0x00, 0x00, 0x00, /* * * * * * * */ +0x00, 0x00, 0x15, 0x00, 0x10, 0x00, 0x10, 0x00, 0x15, 0x00, 0x00, 0x00, /* * * * * * * * * * * * * * * */ + +/* Character (0x20): bbw=1, bbh=1, bbx=0, bby=0, width=4 */ +0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, 0x00, /* */ + +/* Character (0x21): bbw=2, bbh=10, bbx=1, bby=0, width=4 */ +0x00, 0xf8, 0xf8, 0x00, /* ***** ***** */ +0x00, 0x1b, 0x18, 0x00, /* ***** ***** ** ** ** */ + +/* Character (0x22): bbw=5, bbh=4, bbx=1, bby=7, width=7 */ +0x00, 0x3c, 0x0c, 0x00, 0x3c, 0x0c, 0x00, /* **** ** **** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ** **** ** */ + +/* Character (0x23): bbw=9, bbh=10, bbx=0, bby=0, width=10 */ +0x00, 0x40, 0xc0, 0xf8, 0x78, 0xc0, 0xf8, 0x78, 0x40, 0x00, /* * ** ***** **** ** ***** **** * */ +0x02, 0x1e, 0x1f, 0x03, 0x1e, 0x1f, 0x03, 0x02, 0x02, 0x00, /* * ** ***** **** ** ***** **** * * **** ***** ** **** ***** ** * * */ + +/* Character (0x24): bbw=7, bbh=12, bbx=1, bby=-1, width=10 */ +0x00, 0x70, 0xf8, 0xc8, 0xfc, 0x08, 0x18, 0x10, 0x00, 0x00, /* *** ***** * ** ****** * ** * */ +0x00, 0x08, 0x18, 0x10, 0x3f, 0x13, 0x1f, 0x0e, 0x00, 0x00, /* *** ***** * ** ****** * ** * * ** * ****** ** * ***** *** */ + +/* Character (0x25): bbw=10, bbh=10, bbx=1, bby=0, width=12 */ +0x00, 0x30, 0x78, 0x48, 0x78, 0x30, 0x80, 0x60, 0x30, 0x10, 0x00, 0x00, /* ** **** * * **** ** * ** ** * */ +0x00, 0x00, 0x08, 0x0c, 0x06, 0x01, 0x0c, 0x1e, 0x12, 0x1e, 0x0c, 0x00, /* ** **** * * **** ** * ** ** * * ** ** * ** **** * * **** ** */ + +/* Character (0x26): bbw=9, bbh=10, bbx=1, bby=0, width=11 */ +0x00, 0x00, 0x70, 0xf8, 0x88, 0x88, 0x78, 0x30, 0x80, 0x80, 0x00, /* *** ***** * * * * **** ** * * */ +0x00, 0x0e, 0x1f, 0x18, 0x11, 0x13, 0x0e, 0x0c, 0x1b, 0x11, 0x00, /* *** ***** * * * * **** ** * * *** ***** ** * * ** * *** ** ** ** * * */ + +/* Character (0x27): bbw=2, bbh=4, bbx=1, bby=7, width=4 */ +0x00, 0x3c, 0x0c, 0x00, /* **** ** */ +0x00, 0x00, 0x00, 0x00, /* **** ** */ + +/* Character (0x28): bbw=4, bbh=12, bbx=1, bby=-1, width=6 */ +0x00, 0xe0, 0xf8, 0x1c, 0x04, 0x00, /* *** ***** *** * */ +0x00, 0x07, 0x1f, 0x38, 0x20, 0x00, /* *** ***** *** * *** ***** *** * */ + +/* Character (0x29): bbw=4, bbh=12, bbx=1, bby=-1, width=6 */ +0x00, 0x04, 0x1c, 0xf8, 0xe0, 0x00, /* * *** ***** *** */ +0x00, 0x20, 0x38, 0x1f, 0x07, 0x00, /* * *** ***** *** * *** ***** *** */ + +/* Character (0x2a): bbw=5, bbh=5, bbx=1, bby=5, width=7 */ +0x00, 0x50, 0x20, 0xf8, 0x20, 0x50, 0x00, /* * * * ***** * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * ***** * * * */ + +/* Character (0x2b): bbw=7, bbh=7, bbx=1, bby=1, width=10 */ +0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, /* *** */ +0x00, 0x01, 0x01, 0x01, 0x0f, 0x01, 0x01, 0x01, 0x00, 0x00, /* *** * * * **** * * * */ + +/* Character (0x2c): bbw=2, bbh=4, bbx=1, bby=-2, width=4 */ +0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x58, 0x38, 0x00, /* ** * *** */ + +/* Character (0x2d): bbw=3, bbh=1, bbx=1, bby=4, width=5 */ +0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x01, 0x01, 0x01, 0x00, /* * * * */ + +/* Character (0x2e): bbw=2, bbh=2, bbx=1, bby=0, width=4 */ +0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x18, 0x18, 0x00, /* ** ** */ + +/* Character (0x2f): bbw=8, bbh=12, bbx=0, bby=-1, width=8 */ +0x00, 0x00, 0x00, 0x80, 0xe0, 0x78, 0x1c, 0x04, /* * *** **** *** * */ +0x20, 0x38, 0x1e, 0x07, 0x01, 0x00, 0x00, 0x00, /* * *** **** *** * * *** **** *** * */ + +/* Character (0x30): bbw=8, bbh=10, bbx=1, bby=0, width=10 */ +0x00, 0xe0, 0xf0, 0x18, 0x08, 0x08, 0x18, 0xf0, 0xe0, 0x00, /* *** **** ** * * ** **** *** */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* *** **** ** * * ** **** *** *** **** ** * * ** **** *** */ + +/* Character (0x31): bbw=5, bbh=10, bbx=2, bby=0, width=10 */ +0x00, 0x00, 0x10, 0x10, 0x10, 0xf8, 0xf8, 0x00, 0x00, 0x00, /* * * * ***** ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, /* * * * ***** ***** ***** ***** */ + +/* Character (0x32): bbw=8, bbh=10, bbx=1, bby=0, width=10 */ +0x00, 0x10, 0x18, 0x08, 0x08, 0x08, 0x98, 0xf8, 0x70, 0x00, /* * ** * * * ** * ***** *** */ +0x00, 0x18, 0x1c, 0x1c, 0x1a, 0x1b, 0x19, 0x18, 0x18, 0x00, /* * ** * * * ** * ***** *** ** *** *** * ** ** ** * ** ** ** */ + +/* Character (0x33): bbw=8, bbh=10, bbx=1, bby=0, width=10 */ +0x00, 0x10, 0x18, 0x88, 0x88, 0x88, 0xd8, 0x78, 0x30, 0x00, /* * ** * * * * * * ** ** **** ** */ +0x00, 0x08, 0x18, 0x10, 0x10, 0x10, 0x19, 0x1f, 0x0e, 0x00, /* * ** * * * * * * ** ** **** ** * ** * * * * ** ***** *** */ + +/* Character (0x34): bbw=8, bbh=10, bbx=1, bby=0, width=10 */ +0x00, 0x80, 0x40, 0x20, 0x10, 0xf8, 0xf8, 0x00, 0x00, 0x00, /* * * * * ***** ***** */ +0x00, 0x03, 0x03, 0x03, 0x03, 0x1f, 0x1f, 0x03, 0x03, 0x00, /* * * * * ***** ***** ** ** ** ** ***** ***** ** ** */ + +/* Character (0x35): bbw=7, bbh=10, bbx=2, bby=0, width=10 */ +0x00, 0x00, 0xf8, 0x98, 0x98, 0x98, 0x98, 0x98, 0x00, 0x00, /* ***** ** * ** * ** * ** * ** * */ +0x00, 0x00, 0x08, 0x18, 0x10, 0x10, 0x19, 0x0f, 0x07, 0x00, /* ***** ** * ** * ** * ** * ** * * ** * * * ** **** *** */ + +/* Character (0x36): bbw=8, bbh=10, bbx=1, bby=0, width=10 */ +0x00, 0xe0, 0xf0, 0x98, 0x48, 0x48, 0xc8, 0x98, 0x10, 0x00, /* *** **** ** * * * * * * ** ** * * */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* *** **** ** * * * * * * ** ** * * *** **** ** * * ** **** *** */ + +/* Character (0x37): bbw=8, bbh=10, bbx=1, bby=0, width=10 */ +0x00, 0x18, 0x18, 0x18, 0x98, 0xd8, 0x78, 0x38, 0x18, 0x00, /* ** ** ** ** * ** ** **** *** ** */ +0x00, 0x00, 0x1c, 0x1f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ** * ** ** **** *** ** *** ***** ** */ + +/* Character (0x38): bbw=8, bbh=10, bbx=1, bby=0, width=10 */ +0x00, 0x30, 0x78, 0xc8, 0xc8, 0x88, 0x98, 0x78, 0x30, 0x00, /* ** **** * ** * ** * * ** * **** ** */ +0x00, 0x0e, 0x1f, 0x18, 0x10, 0x11, 0x13, 0x1f, 0x0e, 0x00, /* ** **** * ** * ** * * ** * **** ** *** ***** ** * * * ** * ***** *** */ + +/* Character (0x39): bbw=8, bbh=10, bbx=1, bby=0, width=10 */ +0x00, 0xe0, 0xf0, 0x18, 0x08, 0x08, 0x18, 0xf0, 0xe0, 0x00, /* *** **** ** * * ** **** *** */ +0x00, 0x08, 0x19, 0x11, 0x12, 0x12, 0x19, 0x0f, 0x07, 0x00, /* *** **** ** * * ** **** *** * * ** * * * * * * * ** **** *** */ + +/* Character (0x3a): bbw=2, bbh=7, bbx=1, bby=0, width=4 */ +0x00, 0xc0, 0xc0, 0x00, /* ** ** */ +0x00, 0x18, 0x18, 0x00, /* ** ** ** ** */ + +/* Character (0x3b): bbw=2, bbh=9, bbx=1, bby=-2, width=4 */ +0x00, 0xc0, 0xc0, 0x00, /* ** ** */ +0x00, 0x58, 0x38, 0x00, /* ** ** ** * *** */ + +/* Character (0x3c): bbw=6, bbh=7, bbx=2, bby=1, width=10 */ +0x00, 0x00, 0x00, 0x80, 0xc0, 0x40, 0x60, 0x20, 0x00, 0x00, /* * ** * ** * */ +0x00, 0x00, 0x01, 0x03, 0x06, 0x04, 0x0c, 0x08, 0x00, 0x00, /* * ** * ** * * ** ** * ** * */ + +/* Character (0x3d): bbw=7, bbh=3, bbx=1, bby=3, width=10 */ +0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, /* * * * * * * * */ +0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, /* * * * * * * * * * * * * * * */ + +/* Character (0x3e): bbw=6, bbh=7, bbx=2, bby=1, width=10 */ +0x00, 0x00, 0x20, 0x60, 0x40, 0xc0, 0x80, 0x00, 0x00, 0x00, /* * ** * ** * */ +0x00, 0x00, 0x08, 0x0c, 0x04, 0x06, 0x03, 0x01, 0x00, 0x00, /* * ** * ** * * ** * ** ** * */ + +/* Character (0x3f): bbw=6, bbh=10, bbx=1, bby=0, width=8 */ +0x00, 0x10, 0x18, 0x08, 0x88, 0xf8, 0x70, 0x00, /* * ** * * * ***** *** */ +0x00, 0x00, 0x00, 0x1b, 0x1b, 0x00, 0x00, 0x00, /* * ** * * * ***** *** ** ** ** ** */ + +/* Character (0x40): bbw=10, bbh=10, bbx=1, bby=0, width=12 */ +0x00, 0xc0, 0x30, 0x10, 0x88, 0xc8, 0x48, 0x48, 0xf0, 0xe0, 0x00, 0x00, /* ** ** * * * * ** * * * * **** *** */ +0x00, 0x03, 0x0c, 0x08, 0x13, 0x17, 0x14, 0x14, 0x13, 0x07, 0x04, 0x00, /* ** ** * * * * ** * * * * **** *** ** ** * ** * *** * * * * * ** * *** * */ + +/* Character (0x41): bbw=9, bbh=10, bbx=1, bby=0, width=11 */ +0x00, 0x00, 0x80, 0xe0, 0x18, 0x18, 0x78, 0xe0, 0x80, 0x00, 0x00, /* * *** ** ** **** *** * */ +0x00, 0x1e, 0x1f, 0x02, 0x02, 0x02, 0x02, 0x03, 0x1f, 0x1c, 0x00, /* * *** ** ** **** *** * **** ***** * * * * ** ***** *** */ + +/* Character (0x42): bbw=7, bbh=10, bbx=2, bby=0, width=10 */ +0x00, 0x00, 0xf8, 0xf8, 0x88, 0x88, 0x48, 0x78, 0x30, 0x00, /* ***** ***** * * * * * * **** ** */ +0x00, 0x00, 0x1f, 0x1f, 0x10, 0x10, 0x11, 0x1f, 0x0e, 0x00, /* ***** ***** * * * * * * **** ** ***** ***** * * * * ***** *** */ + +/* Character (0x43): bbw=8, bbh=10, bbx=2, bby=0, width=11 */ +0x00, 0x00, 0xe0, 0xf0, 0x18, 0x08, 0x08, 0x08, 0x18, 0x10, 0x00, /* *** **** ** * * * ** * */ +0x00, 0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x10, 0x18, 0x08, 0x00, /* *** **** ** * * * ** * *** **** ** * * * ** * */ + +/* Character (0x44): bbw=9, bbh=10, bbx=2, bby=0, width=12 */ +0x00, 0x00, 0xf8, 0xf8, 0x08, 0x08, 0x08, 0x08, 0x18, 0xf0, 0xe0, 0x00, /* ***** ***** * * * * ** **** *** */ +0x00, 0x00, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* ***** ***** * * * * ** **** *** ***** ***** * * * * ** **** *** */ + +/* Character (0x45): bbw=6, bbh=10, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0xf8, 0xf8, 0x88, 0x88, 0x88, 0x08, 0x00, /* ***** ***** * * * * * * * */ +0x00, 0x00, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x00, /* ***** ***** * * * * * * * ***** ***** * * * * */ + +/* Character (0x46): bbw=6, bbh=10, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0xf8, 0xf8, 0x88, 0x88, 0x88, 0x08, 0x00, /* ***** ***** * * * * * * * */ +0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, /* ***** ***** * * * * * * * ***** ***** */ + +/* Character (0x47): bbw=8, bbh=10, bbx=2, bby=0, width=11 */ +0x00, 0x00, 0xe0, 0xf0, 0x18, 0x08, 0x08, 0x08, 0x18, 0x10, 0x00, /* *** **** ** * * * ** * */ +0x00, 0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x10, 0x1f, 0x1f, 0x00, /* *** **** ** * * * ** * *** **** ** * * * ***** ***** */ + +/* Character (0x48): bbw=8, bbh=10, bbx=2, bby=0, width=12 */ +0x00, 0x00, 0xf8, 0xf8, 0x80, 0x80, 0x80, 0x80, 0xf8, 0xf8, 0x00, 0x00, /* ***** ***** * * * * ***** ***** */ +0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, /* ***** ***** * * * * ***** ***** ***** ***** ***** ***** */ + +/* Character (0x49): bbw=2, bbh=10, bbx=2, bby=0, width=6 */ +0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, /* ***** ***** */ +0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, /* ***** ***** ***** ***** */ + +/* Character (0x4a): bbw=4, bbh=12, bbx=0, bby=-2, width=6 */ +0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, /* ***** ***** */ +0x40, 0x40, 0x7f, 0x3f, 0x00, 0x00, /* ***** ***** * ************** */ + +/* Character (0x4b): bbw=8, bbh=10, bbx=2, bby=0, width=11 */ +0x00, 0x00, 0xf8, 0xf8, 0x80, 0xc0, 0x60, 0x30, 0x18, 0x08, 0x00, /* ***** ***** * ** ** ** ** * */ +0x00, 0x00, 0x1f, 0x1f, 0x00, 0x01, 0x03, 0x06, 0x1c, 0x18, 0x00, /* ***** ***** * ** ** ** ** * ***** ***** * ** ** *** ** */ + +/* Character (0x4c): bbw=6, bbh=10, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, /* ***** ***** */ +0x00, 0x00, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x00, /* ***** ***** ***** ***** * * * * */ + +/* Character (0x4d): bbw=11, bbh=10, bbx=2, bby=0, width=15 */ +0x00, 0x00, 0xf8, 0x18, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x18, 0xf8, 0xf8, 0x00, 0x00, /* ***** ** ***** *** *** ** ***** ***** */ +0x00, 0x00, 0x1f, 0x00, 0x00, 0x03, 0x0f, 0x0c, 0x03, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, /* ***** ** ***** *** *** ** ***** ***** ***** ** **** ** ** ***** ***** */ + +/* Character (0x4e): bbw=8, bbh=10, bbx=2, bby=0, width=12 */ +0x00, 0x00, 0xf8, 0x18, 0x78, 0xe0, 0x80, 0x00, 0x00, 0xf8, 0x00, 0x00, /* ***** ** **** *** * ***** */ +0x00, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x07, 0x1e, 0x18, 0x1f, 0x00, 0x00, /* ***** ** **** *** * ***** ***** * *** **** ** ***** */ + +/* Character (0x4f): bbw=10, bbh=10, bbx=1, bby=0, width=12 */ +0x00, 0xe0, 0xf0, 0x18, 0x08, 0x08, 0x08, 0x08, 0x18, 0xf0, 0xe0, 0x00, /* *** **** ** * * * * ** **** *** */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* *** **** ** * * * * ** **** *** *** **** ** * * * * ** **** *** */ + +/* Character (0x50): bbw=6, bbh=10, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0xf8, 0xf8, 0x08, 0x08, 0xf8, 0xf0, 0x00, /* ***** ***** * * ***** **** */ +0x00, 0x00, 0x1f, 0x1f, 0x01, 0x01, 0x01, 0x00, 0x00, /* ***** ***** * * ***** **** ***** ***** * * * */ + +/* Character (0x51): bbw=10, bbh=12, bbx=1, bby=-2, width=12 */ +0x00, 0xe0, 0xf0, 0x18, 0x08, 0x08, 0x08, 0x08, 0x18, 0xf0, 0xe0, 0x00, /* *** **** ** * * * * ** **** *** */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x10, 0x30, 0x78, 0x4f, 0x07, 0x00, /* *** **** ** * * * * ** **** *** *** **** ** * * * ** ******** **** */ + +/* Character (0x52): bbw=8, bbh=10, bbx=2, bby=0, width=11 */ +0x00, 0x00, 0xf8, 0xf8, 0x08, 0x08, 0x88, 0xf8, 0x30, 0x00, 0x00, /* ***** ***** * * * * ***** ** */ +0x00, 0x00, 0x1f, 0x1f, 0x01, 0x01, 0x03, 0x06, 0x1c, 0x18, 0x00, /* ***** ***** * * * * ***** ** ***** ***** * * ** ** *** ** */ + +/* Character (0x53): bbw=7, bbh=10, bbx=1, bby=0, width=9 */ +0x00, 0x70, 0xf8, 0xc8, 0x88, 0x88, 0x18, 0x10, 0x00, /* *** ***** * ** * * * * ** * */ +0x00, 0x08, 0x18, 0x11, 0x11, 0x13, 0x1f, 0x0e, 0x00, /* *** ***** * ** * * * * ** * * ** * * * * ** * ***** *** */ + +/* Character (0x54): bbw=8, bbh=10, bbx=1, bby=0, width=10 */ +0x00, 0x08, 0x08, 0x08, 0xf8, 0xf8, 0x08, 0x08, 0x08, 0x00, /* * * * ***** ***** * * * */ +0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, /* * * * ***** ***** * * * ***** ***** */ + +/* Character (0x55): bbw=8, bbh=10, bbx=2, bby=0, width=12 */ +0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, /* ***** ***** ***** ***** */ +0x00, 0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, 0x00, /* ***** ***** ***** ***** *** **** ** * * ** **** *** */ + +/* Character (0x56): bbw=9, bbh=10, bbx=1, bby=0, width=11 */ +0x00, 0x38, 0xf8, 0xc0, 0x00, 0x00, 0x00, 0x80, 0xf8, 0x38, 0x00, /* *** ***** ** * ***** *** */ +0x00, 0x00, 0x01, 0x07, 0x1e, 0x18, 0x1c, 0x07, 0x01, 0x00, 0x00, /* *** ***** ** * ***** *** * *** **** ** *** *** * */ + +/* Character (0x57): bbw=11, bbh=10, bbx=1, bby=0, width=13 */ +0x00, 0x78, 0xf8, 0x80, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf8, 0x78, 0x00, /* **** ***** * *** *** ***** **** */ +0x00, 0x00, 0x07, 0x1f, 0x1c, 0x07, 0x00, 0x07, 0x1f, 0x1c, 0x07, 0x00, 0x00, /* **** ***** * *** *** ***** **** *** ***** *** *** *** ***** *** *** */ + +/* Character (0x58): bbw=7, bbh=10, bbx=1, bby=0, width=9 */ +0x00, 0x18, 0x78, 0xe0, 0x80, 0xe0, 0x78, 0x18, 0x00, /* ** **** *** * *** **** ** */ +0x00, 0x18, 0x1e, 0x07, 0x01, 0x07, 0x1e, 0x18, 0x00, /* ** **** *** * *** **** ** ** **** *** * *** **** ** */ + +/* Character (0x59): bbw=8, bbh=10, bbx=1, bby=0, width=10 */ +0x00, 0x18, 0x78, 0xe0, 0x80, 0x00, 0xc0, 0x78, 0x18, 0x00, /* ** **** *** * ** **** ** */ +0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, /* ** **** *** * ** **** ** ***** ***** */ + +/* Character (0x5a): bbw=7, bbh=10, bbx=1, bby=0, width=9 */ +0x00, 0x08, 0x08, 0x08, 0xc8, 0xe8, 0x78, 0x18, 0x00, /* * * * * ** * *** **** ** */ +0x00, 0x18, 0x1e, 0x17, 0x13, 0x10, 0x10, 0x10, 0x00, /* * * * * ** * *** **** ** ** **** *** * ** * * * * */ + +/* Character (0x5b): bbw=4, bbh=12, bbx=1, bby=-1, width=6 */ +0x00, 0xfc, 0xfc, 0x04, 0x04, 0x00, /* ****** ****** * * */ +0x00, 0x3f, 0x3f, 0x20, 0x20, 0x00, /* ****** ****** * * ****** ****** * * */ + +/* Character (0x5c): bbw=8, bbh=12, bbx=0, bby=-1, width=8 */ +0x04, 0x1c, 0x78, 0xe0, 0x80, 0x00, 0x00, 0x00, /* * *** **** *** * */ +0x00, 0x00, 0x00, 0x01, 0x07, 0x1e, 0x38, 0x20, /* * *** **** *** * * *** **** *** * */ + +/* Character (0x5d): bbw=4, bbh=12, bbx=1, bby=-1, width=6 */ +0x00, 0x04, 0x04, 0xfc, 0xfc, 0x00, /* * * ****** ****** */ +0x00, 0x20, 0x20, 0x3f, 0x3f, 0x00, /* * * ****** ****** * * ****** ****** */ + +/* Character (0x5e): bbw=6, bbh=7, bbx=2, bby=3, width=10 */ +0x00, 0x00, 0x80, 0xe0, 0x38, 0x38, 0xe0, 0x80, 0x00, 0x00, /* * *** *** *** *** * */ +0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, /* * *** *** *** *** * ** ** */ + +/* Character (0x5f): bbw=9, bbh=1, bbx=1, bby=-1, width=11 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, /* * * * * * * * * * */ + +/* Character (0x60): bbw=5, bbh=2, bbx=2, bby=9, width=10 */ +0x00, 0x00, 0x04, 0x04, 0x0c, 0x08, 0x08, 0x00, 0x00, 0x00, /* * * ** * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ** * * */ + +/* Character (0x61): bbw=8, bbh=8, bbx=1, bby=0, width=9 */ +0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0xe0, 0xc0, 0x00, /* * * * * *** ** */ +0x00, 0x0e, 0x1f, 0x11, 0x11, 0x09, 0x1f, 0x1f, 0x10, /* * * * * *** ** *** ***** * * * * * * ***** ***** * */ + +/* Character (0x62): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0xfc, 0xfc, 0x40, 0x20, 0x20, 0x60, 0xc0, 0x80, 0x00, /* ****** ****** * * * ** ** * */ +0x00, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* ****** ****** * * * ** ** * ***** ***** * * * ** **** *** */ + +/* Character (0x63): bbw=7, bbh=8, bbx=1, bby=0, width=9 */ +0x00, 0x80, 0xc0, 0x60, 0x20, 0x20, 0x60, 0x40, 0x00, /* * ** ** * * ** * */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x10, 0x08, 0x00, /* * ** ** * * ** * *** **** ** * * * * */ + +/* Character (0x64): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0x80, 0xc0, 0x60, 0x20, 0x20, 0x20, 0xfc, 0xfc, 0x00, /* * ** ** * * * ****** ****** */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x08, 0x1f, 0x1f, 0x00, /* * ** ** * * * ****** ****** *** **** ** * * * ***** ***** */ + +/* Character (0x65): bbw=7, bbh=8, bbx=1, bby=0, width=9 */ +0x00, 0x80, 0xc0, 0x60, 0x20, 0x20, 0xe0, 0xc0, 0x00, /* * ** ** * * *** ** */ +0x00, 0x07, 0x0f, 0x19, 0x11, 0x11, 0x11, 0x09, 0x00, /* * ** ** * * *** ** *** **** * ** * * * * * * * * */ + +/* Character (0x66): bbw=7, bbh=11, bbx=0, bby=0, width=7 */ +0x20, 0x20, 0xf8, 0xfc, 0x24, 0x24, 0x24, /* * * ***** ****** * * * * * * */ +0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, /* * * ***** ****** * * * * * * ***** ***** */ + +/* Character (0x67): bbw=8, bbh=10, bbx=1, bby=-2, width=10 */ +0x00, 0x80, 0xc0, 0x60, 0x20, 0x20, 0x20, 0xe0, 0xe0, 0x00, /* * ** ** * * * *** *** */ +0x00, 0x23, 0x67, 0x4c, 0x48, 0x48, 0x64, 0x3f, 0x1f, 0x00, /* * ** ** * * * *** *** ** * *** ** ** * * * * * * ******** ***** */ + +/* Character (0x68): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0xfc, 0xfc, 0x40, 0x20, 0x20, 0x60, 0xe0, 0xc0, 0x00, /* ****** ****** * * * ** *** ** */ +0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, /* ****** ****** * * * ** *** ** ***** ***** ***** ***** */ + +/* Character (0x69): bbw=2, bbh=11, bbx=1, bby=0, width=4 */ +0x00, 0xec, 0xec, 0x00, /* ** *** ** *** */ +0x00, 0x1f, 0x1f, 0x00, /* ** *** ** *** ***** ***** */ + +/* Character (0x6a): bbw=4, bbh=13, bbx=0, bby=-2, width=5 */ +0x00, 0x00, 0xec, 0xec, 0x00, /* ** *** ** *** */ +0x40, 0x40, 0x7f, 0x3f, 0x00, /* ** *** ** *** * ************** */ + +/* Character (0x6b): bbw=8, bbh=11, bbx=1, bby=0, width=9 */ +0x00, 0xfc, 0xfc, 0x00, 0x80, 0xc0, 0x60, 0x20, 0x00, /* ****** ****** * ** ** * */ +0x00, 0x1f, 0x1f, 0x01, 0x03, 0x06, 0x1c, 0x18, 0x10, /* ****** ****** * ** ** * ***** ***** * ** ** *** ** * */ + +/* Character (0x6c): bbw=2, bbh=11, bbx=1, bby=0, width=4 */ +0x00, 0xfc, 0xfc, 0x00, /* ****** ****** */ +0x00, 0x1f, 0x1f, 0x00, /* ****** ****** ***** ***** */ + +/* Character (0x6d): bbw=12, bbh=8, bbx=1, bby=0, width=14 */ +0x00, 0xe0, 0xe0, 0x40, 0x20, 0x60, 0xe0, 0xc0, 0x60, 0x20, 0x60, 0xe0, 0xc0, 0x00, /* *** *** * * ** *** ** ** * ** *** ** */ +0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, /* *** *** * * ** *** ** ** * ** *** ** ***** ***** ***** ***** ***** ***** */ + +/* Character (0x6e): bbw=8, bbh=8, bbx=1, bby=0, width=10 */ +0x00, 0xe0, 0xe0, 0x40, 0x20, 0x20, 0x60, 0xe0, 0xc0, 0x00, /* *** *** * * * ** *** ** */ +0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, /* *** *** * * * ** *** ** ***** ***** ***** ***** */ + +/* Character (0x6f): bbw=8, bbh=8, bbx=1, bby=0, width=10 */ +0x00, 0x80, 0xc0, 0x60, 0x20, 0x20, 0x60, 0xc0, 0x80, 0x00, /* * ** ** * * ** ** * */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* * ** ** * * ** ** * *** **** ** * * ** **** *** */ + +/* Character (0x70): bbw=8, bbh=10, bbx=1, bby=-2, width=10 */ +0x00, 0xe0, 0xe0, 0x40, 0x20, 0x20, 0x60, 0xc0, 0x80, 0x00, /* *** *** * * * ** ** * */ +0x00, 0x7f, 0x7f, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* *** *** * * * ** ** * ************** * * * ** **** *** */ + +/* Character (0x71): bbw=8, bbh=10, bbx=1, bby=-2, width=10 */ +0x00, 0x80, 0xc0, 0x60, 0x20, 0x20, 0x20, 0xe0, 0xe0, 0x00, /* * ** ** * * * *** *** */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x08, 0x7f, 0x7f, 0x00, /* * ** ** * * * *** *** *** **** ** * * * ************** */ + +/* Character (0x72): bbw=5, bbh=8, bbx=2, bby=0, width=8 */ +0x00, 0x00, 0xe0, 0xe0, 0x80, 0x60, 0x60, 0x00, /* *** *** * ** ** */ +0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, /* *** *** * ** ** ***** ***** */ + +/* Character (0x73): bbw=6, bbh=8, bbx=1, bby=0, width=8 */ +0x00, 0xc0, 0xe0, 0x20, 0x20, 0x20, 0x20, 0x00, /* ** *** * * * * */ +0x00, 0x11, 0x11, 0x13, 0x13, 0x1e, 0x0e, 0x00, /* ** *** * * * * * * * * ** * ** * **** *** */ + +/* Character (0x74): bbw=5, bbh=10, bbx=1, bby=0, width=7 */ +0x00, 0x20, 0xf8, 0xf8, 0x20, 0x20, 0x00, /* * ***** ***** * * */ +0x00, 0x00, 0x0f, 0x1f, 0x10, 0x10, 0x00, /* * ***** ***** * * **** ***** * * */ + +/* Character (0x75): bbw=8, bbh=8, bbx=1, bby=0, width=10 */ +0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, /* *** *** *** *** */ +0x00, 0x0f, 0x1f, 0x18, 0x10, 0x10, 0x08, 0x1f, 0x1f, 0x00, /* *** *** *** *** **** ***** ** * * * ***** ***** */ + +/* Character (0x76): bbw=7, bbh=8, bbx=1, bby=0, width=9 */ +0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, /* *** *** *** *** */ +0x00, 0x01, 0x07, 0x1e, 0x18, 0x1c, 0x03, 0x01, 0x00, /* *** *** *** *** * *** **** ** *** ** * */ + +/* Character (0x77): bbw=11, bbh=8, bbx=1, bby=0, width=13 */ +0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, /* *** *** ** *** *** */ +0x00, 0x00, 0x07, 0x1f, 0x1c, 0x07, 0x01, 0x07, 0x1c, 0x1f, 0x03, 0x00, 0x00, /* *** *** ** *** *** *** ***** *** *** * *** *** ***** ** */ + +/* Character (0x78): bbw=7, bbh=8, bbx=1, bby=0, width=9 */ +0x00, 0x60, 0xe0, 0x80, 0x00, 0x00, 0xe0, 0x60, 0x00, /* ** *** * *** ** */ +0x00, 0x18, 0x1c, 0x03, 0x03, 0x07, 0x1c, 0x18, 0x00, /* ** *** * *** ** ** *** ** ** *** *** ** */ + +/* Character (0x79): bbw=7, bbh=10, bbx=1, bby=-2, width=9 */ +0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, /* *** *** *** *** */ +0x00, 0x41, 0x67, 0x7e, 0x18, 0x0e, 0x03, 0x01, 0x00, /* *** *** *** *** * **** ** ****** ** *** ** * */ + +/* Character (0x7a): bbw=7, bbh=8, bbx=1, bby=0, width=9 */ +0x00, 0x20, 0x20, 0x20, 0x20, 0xa0, 0xe0, 0x60, 0x00, /* * * * * * * *** ** */ +0x00, 0x18, 0x1c, 0x16, 0x13, 0x11, 0x10, 0x10, 0x00, /* * * * * * * *** ** ** *** ** * ** * * * * * */ + +/* Character (0x7b): bbw=4, bbh=12, bbx=1, bby=-1, width=6 */ +0x00, 0x98, 0xbc, 0x64, 0x04, 0x00, /* ** * **** * * ** * */ +0x00, 0x1c, 0x3e, 0x23, 0x20, 0x00, /* ** * **** * * ** * *** ***** ** * * */ + +/* Character (0x7c): bbw=2, bbh=12, bbx=1, bby=-1, width=4 */ +0x00, 0xfc, 0xfc, 0x00, /* ****** ****** */ +0x00, 0x3f, 0x3f, 0x00, /* ****** ****** ****** ****** */ + +/* Character (0x7d): bbw=4, bbh=12, bbx=1, bby=-1, width=6 */ +0x00, 0x04, 0x64, 0xbc, 0x98, 0x00, /* * * ** **** * ** * */ +0x00, 0x20, 0x23, 0x3e, 0x1c, 0x00, /* * * ** **** * ** * * ** * ***** *** */ + +/* Character (0x7e): bbw=7, bbh=3, bbx=1, bby=3, width=9 */ +0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, /* * * * * */ +0x00, 0x03, 0x00, 0x01, 0x03, 0x03, 0x02, 0x01, 0x00, /* * * * * ** * ** ** * * */ + +/* Character (0xa0): bbw=1, bbh=1, bbx=0, bby=0, width=4 */ +0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, 0x00, /* */ + +/* Character (0xa1): bbw=2, bbh=10, bbx=1, bby=-2, width=4 */ +0x00, 0x60, 0x60, 0x00, /* ** ** */ +0x00, 0x7e, 0x7f, 0x00, /* ** ** ************* */ + +/* Character (0xa2): bbw=7, bbh=12, bbx=1, bby=-1, width=10 */ +0x00, 0xc0, 0xe0, 0x30, 0x10, 0xfc, 0x10, 0x30, 0x00, 0x00, /* ** *** ** * ****** * ** */ +0x00, 0x03, 0x07, 0x0c, 0x08, 0x3f, 0x08, 0x08, 0x00, 0x00, /* ** *** ** * ****** * ** ** *** ** * ****** * * */ + +/* Character (0xa3): bbw=7, bbh=10, bbx=1, bby=0, width=10 */ +0x00, 0x80, 0x80, 0xf0, 0xf8, 0x88, 0x88, 0x10, 0x00, 0x00, /* * * **** ***** * * * * * */ +0x00, 0x10, 0x18, 0x1f, 0x17, 0x10, 0x10, 0x10, 0x00, 0x00, /* * * **** ***** * * * * * * ** ***** *** * * * * */ + +/* Character (0xa4): bbw=9, bbh=10, bbx=0, bby=0, width=10 */ +0x08, 0xd0, 0xe0, 0x20, 0x20, 0x20, 0xe0, 0xd0, 0x08, 0x00, /* * * ** *** * * * *** * ** * */ +0x10, 0x0b, 0x07, 0x04, 0x04, 0x04, 0x07, 0x0b, 0x10, 0x00, /* * * ** *** * * * *** * ** * * ** * *** * * * *** ** * * */ + +/* Character (0xa5): bbw=8, bbh=10, bbx=1, bby=0, width=10 */ +0x00, 0x18, 0x78, 0xe0, 0x80, 0x00, 0xc0, 0x78, 0x18, 0x00, /* ** **** *** * ** **** ** */ +0x00, 0x00, 0x05, 0x05, 0x1f, 0x1f, 0x05, 0x05, 0x00, 0x00, /* ** **** *** * ** **** ** * * * * ***** ***** * * * * */ + +/* Character (0xa6): bbw=2, bbh=12, bbx=1, bby=-1, width=4 */ +0x00, 0x7c, 0x7c, 0x00, /* ***** ***** */ +0x00, 0x3e, 0x3e, 0x00, /* ***** ***** ***** ***** */ + +/* Character (0xa7): bbw=6, bbh=11, bbx=2, bby=-1, width=10 */ +0x00, 0x00, 0xb0, 0xf8, 0x48, 0xc8, 0x98, 0x10, 0x00, 0x00, /* ** * ***** * * * ** ** * * */ +0x00, 0x00, 0x11, 0x33, 0x26, 0x24, 0x3f, 0x1b, 0x00, 0x00, /* ** * ***** * * * ** ** * * * * ** ** ** * * * ****** ** ** */ + +/* Character (0xa8): bbw=4, bbh=2, bbx=3, bby=9, width=10 */ +0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** */ + +/* Character (0xa9): bbw=10, bbh=10, bbx=1, bby=0, width=12 */ +0x00, 0xc0, 0x30, 0x10, 0x88, 0xc8, 0x48, 0x48, 0x10, 0x30, 0xc0, 0x00, /* ** ** * * * * ** * * * * * ** ** */ +0x00, 0x03, 0x0c, 0x08, 0x11, 0x13, 0x12, 0x12, 0x08, 0x0c, 0x03, 0x00, /* ** ** * * * * ** * * * * * ** ** ** ** * * * ** * * * * * * ** ** */ + +/* Character (0xaa): bbw=6, bbh=6, bbx=1, bby=4, width=8 */ +0x00, 0xc0, 0xe8, 0x28, 0xf8, 0xf0, 0x00, 0x00, /* ** * *** * * ***** **** */ +0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, /* ** * *** * * ***** **** * * * * */ + +/* Character (0xab): bbw=8, bbh=5, bbx=0, bby=2, width=9 */ +0x00, 0x80, 0xc0, 0x40, 0x00, 0x80, 0xc0, 0x40, 0x00, /* * ** * * ** * */ +0x01, 0x03, 0x06, 0x04, 0x01, 0x03, 0x06, 0x04, 0x00, /* * ** * * ** * * ** ** * * ** ** * */ + +/* Character (0xac): bbw=7, bbh=4, bbx=1, bby=1, width=10 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0f, 0x00, 0x00, /* * * * * * * **** */ + +/* Character (0xad): bbw=3, bbh=1, bbx=1, bby=4, width=5 */ +0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x01, 0x01, 0x01, 0x00, /* * * * */ + +/* Character (0xae): bbw=7, bbh=7, bbx=1, bby=3, width=10 */ +0x00, 0xe0, 0x10, 0xe8, 0x68, 0xa8, 0x10, 0xe0, 0x00, 0x00, /* *** * * *** * ** * * * * *** */ +0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, /* *** * * *** * ** * * * * *** * * * * * */ + +/* Character (0xaf): bbw=4, bbh=1, bbx=3, bby=9, width=10 */ +0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, /* * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * */ + +/* Character (0xb0): bbw=4, bbh=3, bbx=0, bby=7, width=4 */ +0x10, 0x28, 0x28, 0x10, /* * * * * * * */ +0x00, 0x00, 0x00, 0x00, /* * * * * * * */ + +/* Character (0xb1): bbw=7, bbh=7, bbx=1, bby=1, width=10 */ +0x00, 0x80, 0x80, 0x80, 0xe0, 0x80, 0x80, 0x80, 0x00, 0x00, /* * * * *** * * * */ +0x00, 0x08, 0x08, 0x08, 0x0b, 0x08, 0x08, 0x08, 0x00, 0x00, /* * * * *** * * * * * * ** * * * * */ + +/* Character (0xb2): bbw=5, bbh=6, bbx=1, bby=4, width=7 */ +0x00, 0x88, 0xc8, 0x48, 0x38, 0x30, 0x00, /* * * * ** * * *** ** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /* * * * ** * * *** ** * * * * * */ + +/* Character (0xb3): bbw=5, bbh=6, bbx=1, bby=4, width=7 */ +0x00, 0x08, 0x28, 0x28, 0xf8, 0xd0, 0x00, /* * * * * * ***** * ** */ +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* * * * * * ***** * ** * * * * */ + +/* Character (0xb4): bbw=5, bbh=2, bbx=3, bby=9, width=10 */ +0x00, 0x00, 0x00, 0x08, 0x08, 0x0c, 0x04, 0x04, 0x00, 0x00, /* * * ** * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ** * * */ + +/* Character (0xb5): bbw=8, bbh=10, bbx=1, bby=-2, width=10 */ +0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, /* *** *** *** *** */ +0x00, 0x7f, 0x7f, 0x18, 0x10, 0x10, 0x08, 0x1f, 0x1f, 0x00, /* *** *** *** *** ************** ** * * * ***** ***** */ + +/* Character (0xb6): bbw=6, bbh=11, bbx=2, bby=-1, width=10 */ +0x00, 0x00, 0xf0, 0xf8, 0xf8, 0xf8, 0x08, 0xf8, 0x00, 0x00, /* **** ***** ***** ***** * ***** */ +0x00, 0x00, 0x00, 0x01, 0x01, 0x3f, 0x00, 0x3f, 0x00, 0x00, /* **** ***** ***** ***** * ***** * * ****** ****** */ + +/* Character (0xb7): bbw=2, bbh=2, bbx=4, bby=3, width=10 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, /* ** ** */ + +/* Character (0xb8): bbw=3, bbh=2, bbx=3, bby=-2, width=10 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, /* * * * */ + +/* Character (0xb9): bbw=4, bbh=6, bbx=1, bby=4, width=7 */ +0x00, 0x10, 0x10, 0xf8, 0xf8, 0x00, 0x00, /* * * ***** ***** */ +0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, /* * * ***** ***** * * */ + +/* Character (0xba): bbw=6, bbh=6, bbx=1, bby=4, width=8 */ +0x00, 0xf0, 0xf8, 0x08, 0x08, 0xf8, 0xf0, 0x00, /* **** ***** * * ***** **** */ +0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* **** ***** * * ***** **** * * * * */ + +/* Character (0xbb): bbw=8, bbh=5, bbx=1, bby=2, width=9 */ +0x00, 0x40, 0xc0, 0x80, 0x00, 0x40, 0xc0, 0x80, 0x00, /* * ** * * ** * */ +0x00, 0x04, 0x06, 0x03, 0x01, 0x04, 0x06, 0x03, 0x01, /* * ** * * ** * * ** ** * * ** ** * */ + +/* Character (0xbc): bbw=12, bbh=10, bbx=1, bby=0, width=14 */ +0x00, 0x10, 0xf8, 0xf8, 0x00, 0x00, 0x80, 0x60, 0x18, 0x80, 0x80, 0x80, 0x00, 0x00, /* * ***** ***** * ** ** * * * */ +0x00, 0x00, 0x01, 0x01, 0x18, 0x06, 0x01, 0x06, 0x05, 0x04, 0x1f, 0x1f, 0x04, 0x00, /* * ***** ***** * ** ** * * * * * ** ** * ** * * * ***** ***** * */ + +/* Character (0xbd): bbw=12, bbh=10, bbx=1, bby=0, width=14 */ +0x00, 0x10, 0xf8, 0xf8, 0x00, 0x00, 0x80, 0x60, 0x18, 0x80, 0x80, 0x80, 0x00, 0x00, /* * ***** ***** * ** ** * * * */ +0x00, 0x00, 0x01, 0x01, 0x18, 0x06, 0x01, 0x00, 0x19, 0x1c, 0x16, 0x17, 0x13, 0x00, /* * ***** ***** * ** ** * * * * * ** ** * * ** *** ** * *** * ** * */ + +/* Character (0xbe): bbw=13, bbh=10, bbx=1, bby=0, width=15 */ +0x00, 0x90, 0x08, 0x28, 0xf8, 0xd0, 0x00, 0xc0, 0x20, 0x18, 0x80, 0x80, 0x80, 0x00, 0x00, /* * * * * * ***** * ** ** * ** * * * */ +0x00, 0x00, 0x01, 0x01, 0x19, 0x04, 0x03, 0x00, 0x06, 0x05, 0x04, 0x1f, 0x1f, 0x04, 0x00, /* * * * * * ***** * ** ** * ** * * * * * * ** * ** ** * * * ***** ***** * */ + +/* Character (0xbf): bbw=6, bbh=10, bbx=1, bby=-2, width=8 */ +0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, /* ** ** */ +0x00, 0x38, 0x7c, 0x47, 0x43, 0x60, 0x20, 0x00, /* ** ** *** ******** *** * ** * */ + +/* Character (0xc0): bbw=9, bbh=13, bbx=1, bby=0, width=11 */ +0x00, 0x00, 0x81, 0xe1, 0x1b, 0x1a, 0x7a, 0xe0, 0x80, 0x00, 0x00, /* * ** ***** ** * ** * **** *** * */ +0x00, 0x1e, 0x1f, 0x02, 0x02, 0x02, 0x02, 0x03, 0x1f, 0x1c, 0x00, /* * ** ***** ** * ** * **** *** * **** ***** * * * * ** ***** *** */ + +/* Character (0xc1): bbw=9, bbh=13, bbx=1, bby=0, width=11 */ +0x00, 0x00, 0x80, 0xe0, 0x1a, 0x1a, 0x7b, 0xe1, 0x81, 0x00, 0x00, /* * *** * ** * ** ** **** * **** * */ +0x00, 0x1e, 0x1f, 0x02, 0x02, 0x02, 0x02, 0x03, 0x1f, 0x1c, 0x00, /* * *** * ** * ** ** **** * **** * **** ***** * * * * ** ***** *** */ + +/* Character (0xc2): bbw=9, bbh=13, bbx=1, bby=0, width=11 */ +0x00, 0x00, 0x80, 0xe2, 0x19, 0x19, 0x7b, 0xe2, 0x80, 0x00, 0x00, /* * * **** ** * ** ** **** * *** * */ +0x00, 0x1e, 0x1f, 0x02, 0x02, 0x02, 0x02, 0x03, 0x1f, 0x1c, 0x00, /* * * **** ** * ** ** **** * *** * **** ***** * * * * ** ***** *** */ + +/* Character (0xc3): bbw=9, bbh=13, bbx=1, bby=0, width=11 */ +0x00, 0x00, 0x80, 0xe2, 0x19, 0x1b, 0x7a, 0xe1, 0x80, 0x00, 0x00, /* * * **** ** ** ** * **** * *** * */ +0x00, 0x1e, 0x1f, 0x02, 0x02, 0x02, 0x02, 0x03, 0x1f, 0x1c, 0x00, /* * * **** ** ** ** * **** * *** * **** ***** * * * * ** ***** *** */ + +/* Character (0xc4): bbw=8, bbh=13, bbx=1, bby=0, width=10 */ +0x00, 0x00, 0x80, 0xe3, 0x18, 0x78, 0xe3, 0x80, 0x00, 0x00, /* *** *** ** **** ** *** * */ +0x00, 0x1e, 0x1f, 0x02, 0x02, 0x02, 0x03, 0x1f, 0x1c, 0x00, /* *** *** ** **** ** *** * **** ***** * * * ** ***** *** */ + +/* Character (0xc5): bbw=9, bbh=13, bbx=1, bby=0, width=11 */ +0x00, 0x00, 0x80, 0xe2, 0x1d, 0x1d, 0x7f, 0xe2, 0x80, 0x00, 0x00, /* * * **** *** * *** ******* * *** * */ +0x00, 0x1e, 0x1f, 0x02, 0x02, 0x02, 0x02, 0x03, 0x1f, 0x1c, 0x00, /* * * **** *** * *** ******* * *** * **** ***** * * * * ** ***** *** */ + +/* Character (0xc6): bbw=11, bbh=10, bbx=1, bby=0, width=13 */ +0x00, 0x00, 0x80, 0xe0, 0x18, 0x08, 0xf8, 0xf8, 0x88, 0x88, 0x88, 0x08, 0x00, /* * *** ** * ***** ***** * * * * * * * */ +0x00, 0x1c, 0x1f, 0x02, 0x02, 0x02, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x00, /* * *** ** * ***** ***** * * * * * * * *** ***** * * * ***** ***** * * * * */ + +/* Character (0xc7): bbw=8, bbh=12, bbx=2, bby=-2, width=11 */ +0x00, 0x00, 0xe0, 0xf0, 0x18, 0x08, 0x08, 0x08, 0x18, 0x10, 0x00, /* *** **** ** * * * ** * */ +0x00, 0x00, 0x07, 0x0f, 0x58, 0x50, 0x30, 0x10, 0x18, 0x08, 0x00, /* *** **** ** * * * ** * *** **** ** * * * ** * ** * */ + +/* Character (0xc8): bbw=6, bbh=13, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0xf8, 0xf9, 0x89, 0x8b, 0x8a, 0x0a, 0x00, /* ****** ****** * *** * * * * * * * */ +0x00, 0x00, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x00, /* ****** ****** * *** * * * * * * * ***** ***** * * * * */ + +/* Character (0xc9): bbw=6, bbh=13, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0xf8, 0xfa, 0x8a, 0x8b, 0x89, 0x09, 0x00, /* ***** * ***** * * *** * ** * ** * */ +0x00, 0x00, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x00, /* ***** * ***** * * *** * ** * ** * ***** ***** * * * * */ + +/* Character (0xca): bbw=6, bbh=13, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0xf8, 0xfa, 0x89, 0x8b, 0x8a, 0x08, 0x00, /* ***** * ****** * *** * * * * * * */ +0x00, 0x00, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x00, /* ***** * ****** * *** * * * * * * ***** ***** * * * * */ + +/* Character (0xcb): bbw=6, bbh=13, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0xf8, 0xfb, 0x88, 0x88, 0x8b, 0x08, 0x00, /* ******* ***** * * * *** * * * */ +0x00, 0x00, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x00, /* ******* ***** * * * *** * * * ***** ***** * * * * */ + +/* Character (0xcc): bbw=4, bbh=13, bbx=1, bby=0, width=6 */ +0x00, 0x01, 0xf9, 0xfb, 0x02, 0x00, /* * * ******* ***** * */ +0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, /* * * ******* ***** * ***** ***** */ + +/* Character (0xcd): bbw=4, bbh=13, bbx=1, bby=0, width=6 */ +0x00, 0x02, 0xfb, 0xf9, 0x01, 0x00, /* * ** ****** ****** */ +0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, /* * ** ****** ****** ***** ***** */ + +/* Character (0xce): bbw=4, bbh=13, bbx=1, bby=0, width=6 */ +0x00, 0x02, 0xf9, 0xfb, 0x02, 0x00, /* * * ******* ***** * */ +0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, /* * * ******* ***** * ***** ***** */ + +/* Character (0xcf): bbw=4, bbh=13, bbx=1, bby=0, width=6 */ +0x00, 0x03, 0xf8, 0xf8, 0x03, 0x00, /* ** ***** ******* */ +0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, /* ** ***** ******* ***** ***** */ + +/* Character (0xd0): bbw=11, bbh=10, bbx=0, bby=0, width=12 */ +0x80, 0x80, 0xf8, 0xf8, 0x88, 0x88, 0x08, 0x08, 0x18, 0xf0, 0xe0, 0x00, /* * * ***** ***** * * * * * * ** **** *** */ +0x00, 0x00, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* * * ***** ***** * * * * * * ** **** *** ***** ***** * * * * ** **** *** */ + +/* Character (0xd1): bbw=8, bbh=13, bbx=2, bby=0, width=12 */ +0x00, 0x00, 0xf8, 0x18, 0x7a, 0xe1, 0x83, 0x02, 0x01, 0xf8, 0x00, 0x00, /* ***** ** * **** * ***** * * * ***** */ +0x00, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x07, 0x1e, 0x18, 0x1f, 0x00, 0x00, /* ***** ** * **** * ***** * * * ***** ***** * *** **** ** ***** */ + +/* Character (0xd2): bbw=10, bbh=13, bbx=1, bby=0, width=12 */ +0x00, 0xe0, 0xf0, 0x19, 0x09, 0x0b, 0x0a, 0x0a, 0x18, 0xf0, 0xe0, 0x00, /* *** ***** ** * * ** * * * * * ** **** *** */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* *** ***** ** * * ** * * * * * ** **** *** *** **** ** * * * * ** **** *** */ + +/* Character (0xd3): bbw=10, bbh=13, bbx=1, bby=0, width=12 */ +0x00, 0xe0, 0xf0, 0x18, 0x0a, 0x0a, 0x0b, 0x09, 0x19, 0xf0, 0xe0, 0x00, /* *** **** ** * * * * ** * * * * ** **** *** */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* *** **** ** * * * * ** * * * * ** **** *** *** **** ** * * * * ** **** *** */ + +/* Character (0xd4): bbw=10, bbh=13, bbx=1, bby=0, width=12 */ +0x00, 0xe0, 0xf0, 0x18, 0x0a, 0x09, 0x0b, 0x0a, 0x18, 0xf0, 0xe0, 0x00, /* *** **** ** * * * * ** * * * ** **** *** */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* *** **** ** * * * * ** * * * ** **** *** *** **** ** * * * * ** **** *** */ + +/* Character (0xd5): bbw=10, bbh=13, bbx=1, bby=0, width=12 */ +0x00, 0xe0, 0xf0, 0x18, 0x0a, 0x09, 0x0b, 0x0a, 0x19, 0xf0, 0xe0, 0x00, /* *** **** ** * * * * ** * * * * ** **** *** */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* *** **** ** * * * * ** * * * * ** **** *** *** **** ** * * * * ** **** *** */ + +/* Character (0xd6): bbw=10, bbh=13, bbx=1, bby=0, width=12 */ +0x00, 0xe0, 0xf0, 0x1b, 0x08, 0x08, 0x08, 0x08, 0x1b, 0xf0, 0xe0, 0x00, /* *** ****** ** * * * * ** ** **** *** */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* *** ****** ** * * * * ** ** **** *** *** **** ** * * * * ** **** *** */ + +/* Character (0xd7): bbw=5, bbh=5, bbx=2, bby=2, width=10 */ +0x00, 0x00, 0x40, 0xc0, 0x80, 0x80, 0x40, 0x00, 0x00, 0x00, /* * ** * * * */ +0x00, 0x00, 0x04, 0x02, 0x03, 0x06, 0x04, 0x00, 0x00, 0x00, /* * ** * * * * * ** ** * */ + +/* Character (0xd8): bbw=10, bbh=12, bbx=1, bby=-1, width=12 */ +0x00, 0xe0, 0xf0, 0x18, 0x08, 0x08, 0x88, 0x68, 0x18, 0xf0, 0xec, 0x00, /* *** **** ** * * * * * ** ** **** ** *** */ +0x00, 0x37, 0x0f, 0x18, 0x16, 0x11, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* *** **** ** * * * * * ** ** **** ** *** *** ** **** ** ** * * * * * ** **** *** */ + +/* Character (0xd9): bbw=8, bbh=13, bbx=2, bby=0, width=12 */ +0x00, 0x00, 0xf8, 0xf9, 0x01, 0x03, 0x02, 0x02, 0xf8, 0xf8, 0x00, 0x00, /* ****** ****** ** * * ***** ***** */ +0x00, 0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, 0x00, /* ****** ****** ** * * ***** ***** *** **** ** * * ** **** *** */ + +/* Character (0xda): bbw=8, bbh=13, bbx=2, bby=0, width=12 */ +0x00, 0x00, 0xf8, 0xf8, 0x02, 0x02, 0x03, 0x01, 0xf9, 0xf8, 0x00, 0x00, /* ***** ***** * * ** * * ***** ***** */ +0x00, 0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, 0x00, /* ***** ***** * * ** * * ***** ***** *** **** ** * * ** **** *** */ + +/* Character (0xdb): bbw=8, bbh=13, bbx=2, bby=0, width=12 */ +0x00, 0x00, 0xf8, 0xf8, 0x02, 0x01, 0x03, 0x02, 0xf8, 0xf8, 0x00, 0x00, /* ***** ***** * * ** * ***** ***** */ +0x00, 0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, 0x00, /* ***** ***** * * ** * ***** ***** *** **** ** * * ** **** *** */ + +/* Character (0xdc): bbw=8, bbh=13, bbx=2, bby=0, width=12 */ +0x00, 0x00, 0xf8, 0xf8, 0x03, 0x00, 0x00, 0x03, 0xf8, 0xf8, 0x00, 0x00, /* ***** ******* ** ***** ***** */ +0x00, 0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x07, 0x07, 0x00, 0x00, /* ***** ******* ** ***** ***** *** **** ** * * ** *** *** */ + +/* Character (0xdd): bbw=8, bbh=13, bbx=1, bby=0, width=10 */ +0x00, 0x18, 0x78, 0xe2, 0x82, 0x03, 0xc1, 0x79, 0x18, 0x00, /* ** **** * *** * *** * *** **** ** */ +0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, /* ** **** * *** * *** * *** **** ** ***** ***** */ + +/* Character (0xde): bbw=6, bbh=10, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0xf8, 0xf8, 0x20, 0x20, 0xe0, 0xc0, 0x00, /* ***** ***** * * *** ** */ +0x00, 0x00, 0x1f, 0x1f, 0x04, 0x04, 0x07, 0x03, 0x00, /* ***** ***** * * *** ** ***** ***** * * *** ** */ + +/* Character (0xdf): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0xf8, 0xfc, 0x04, 0x04, 0x44, 0xfc, 0x98, 0x00, 0x00, /* ***** ****** * * * * ****** ** * */ +0x00, 0x1f, 0x1f, 0x00, 0x00, 0x10, 0x10, 0x1f, 0x0f, 0x00, /* ***** ****** * * * * ****** ** * ***** ***** * * ***** **** */ + +/* Character (0xe0): bbw=8, bbh=11, bbx=1, bby=0, width=9 */ +0x00, 0x00, 0x24, 0x24, 0x2c, 0x28, 0xe8, 0xc0, 0x00, /* * * * * ** * * * * *** ** */ +0x00, 0x0e, 0x1f, 0x11, 0x11, 0x09, 0x1f, 0x1f, 0x10, /* * * * * ** * * * * *** ** *** ***** * * * * * * ***** ***** * */ + +/* Character (0xe1): bbw=8, bbh=11, bbx=1, bby=0, width=9 */ +0x00, 0x00, 0x20, 0x28, 0x28, 0x2c, 0xe4, 0xc4, 0x00, /* * * * * * ** * * *** * ** */ +0x00, 0x0e, 0x1f, 0x11, 0x11, 0x09, 0x1f, 0x1f, 0x10, /* * * * * * ** * * *** * ** *** ***** * * * * * * ***** ***** * */ + +/* Character (0xe2): bbw=8, bbh=11, bbx=1, bby=0, width=9 */ +0x00, 0x00, 0x20, 0x28, 0x24, 0x2c, 0xe8, 0xc0, 0x00, /* * * * * * ** * * *** ** */ +0x00, 0x0e, 0x1f, 0x11, 0x11, 0x09, 0x1f, 0x1f, 0x10, /* * * * * * ** * * *** ** *** ***** * * * * * * ***** ***** * */ + +/* Character (0xe3): bbw=8, bbh=11, bbx=1, bby=0, width=9 */ +0x00, 0x00, 0x28, 0x24, 0x2c, 0x28, 0xe4, 0xc0, 0x00, /* * * * * ** * * * * *** ** */ +0x00, 0x0e, 0x1f, 0x11, 0x11, 0x09, 0x1f, 0x1f, 0x10, /* * * * * ** * * * * *** ** *** ***** * * * * * * ***** ***** * */ + +/* Character (0xe4): bbw=8, bbh=11, bbx=1, bby=0, width=9 */ +0x00, 0x00, 0x20, 0x2c, 0x20, 0x20, 0xec, 0xc0, 0x00, /* * ** * * * ** *** ** */ +0x00, 0x0e, 0x1f, 0x11, 0x11, 0x09, 0x1f, 0x1f, 0x10, /* * ** * * * ** *** ** *** ***** * * * * * * ***** ***** * */ + +/* Character (0xe5): bbw=8, bbh=11, bbx=1, bby=0, width=9 */ +0x00, 0x00, 0x20, 0x28, 0x34, 0x3c, 0xe8, 0xc0, 0x00, /* * * * * ** **** * *** ** */ +0x00, 0x0e, 0x1f, 0x11, 0x11, 0x09, 0x1f, 0x1f, 0x10, /* * * * * ** **** * *** ** *** ***** * * * * * * ***** ***** * */ + +/* Character (0xe6): bbw=12, bbh=8, bbx=1, bby=0, width=14 */ +0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0xe0, 0xc0, 0x60, 0x20, 0x20, 0xe0, 0xc0, 0x00, /* * * * * *** ** ** * * *** ** */ +0x00, 0x0e, 0x1f, 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x19, 0x11, 0x11, 0x11, 0x09, 0x00, /* * * * * *** ** ** * * *** ** *** ***** * * * * * * **** **** * ** * * * * * * * * */ + +/* Character (0xe7): bbw=7, bbh=10, bbx=1, bby=-2, width=9 */ +0x00, 0x80, 0xc0, 0x60, 0x20, 0x20, 0x60, 0x40, 0x00, /* * ** ** * * ** * */ +0x00, 0x07, 0x4f, 0x58, 0x30, 0x10, 0x10, 0x08, 0x00, /* * ** ** * * ** * *** **** * ** * ** * * * */ + +/* Character (0xe8): bbw=7, bbh=11, bbx=1, bby=0, width=9 */ +0x00, 0x80, 0xc4, 0x64, 0x2c, 0x28, 0xe8, 0xc0, 0x00, /* * * ** * ** ** * * * * *** ** */ +0x00, 0x07, 0x0f, 0x19, 0x11, 0x11, 0x11, 0x09, 0x00, /* * * ** * ** ** * * * * *** ** *** **** * ** * * * * * * * * */ + +/* Character (0xe9): bbw=7, bbh=11, bbx=1, bby=0, width=9 */ +0x00, 0x80, 0xc0, 0x68, 0x28, 0x2c, 0xe4, 0xc4, 0x00, /* * ** * ** * * ** * * *** * ** */ +0x00, 0x07, 0x0f, 0x19, 0x11, 0x11, 0x11, 0x09, 0x00, /* * ** * ** * * ** * * *** * ** *** **** * ** * * * * * * * * */ + +/* Character (0xea): bbw=7, bbh=11, bbx=1, bby=0, width=9 */ +0x00, 0x80, 0xc0, 0x68, 0x24, 0x2c, 0xe8, 0xc0, 0x00, /* * ** * ** * * ** * * *** ** */ +0x00, 0x07, 0x0f, 0x19, 0x11, 0x11, 0x11, 0x09, 0x00, /* * ** * ** * * ** * * *** ** *** **** * ** * * * * * * * * */ + +/* Character (0xeb): bbw=7, bbh=11, bbx=1, bby=0, width=9 */ +0x00, 0x80, 0xcc, 0x60, 0x20, 0x20, 0xec, 0xc0, 0x00, /* * ** ** ** * * ** *** ** */ +0x00, 0x07, 0x0f, 0x19, 0x11, 0x11, 0x11, 0x09, 0x00, /* * ** ** ** * * ** *** ** *** **** * ** * * * * * * * * */ + +/* Character (0xec): bbw=4, bbh=11, bbx=0, bby=0, width=4 */ +0x04, 0xe4, 0xec, 0x08, /* * * *** ** *** * */ +0x00, 0x1f, 0x1f, 0x00, /* * * *** ** *** * ***** ***** */ + +/* Character (0xed): bbw=4, bbh=11, bbx=0, bby=0, width=4 */ +0x08, 0xec, 0xe4, 0x04, /* * ** *** * *** * */ +0x00, 0x1f, 0x1f, 0x00, /* * ** *** * *** * ***** ***** */ + +/* Character (0xee): bbw=4, bbh=11, bbx=0, bby=0, width=4 */ +0x08, 0xe4, 0xec, 0x08, /* * * *** ** *** * */ +0x00, 0x1f, 0x1f, 0x00, /* * * *** ** *** * ***** ***** */ + +/* Character (0xef): bbw=4, bbh=11, bbx=0, bby=0, width=4 */ +0x0c, 0xe0, 0xe0, 0x0c, /* ** *** *** ** */ +0x00, 0x1f, 0x1f, 0x00, /* ** *** *** ** ***** ***** */ + +/* Character (0xf0): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0x80, 0xc0, 0x68, 0x2c, 0x38, 0x78, 0xe8, 0x80, 0x00, /* * ** * ** ** * *** **** * *** * */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* * ** * ** ** * *** **** * *** * *** **** ** * * ** **** *** */ + +/* Character (0xf1): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0xe0, 0xe0, 0x48, 0x24, 0x2c, 0x68, 0xe4, 0xc0, 0x00, /* *** *** * * * * ** * * ** * *** ** */ +0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, /* *** *** * * * * ** * * ** * *** ** ***** ***** ***** ***** */ + +/* Character (0xf2): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0x80, 0xc4, 0x64, 0x2c, 0x28, 0x68, 0xc0, 0x80, 0x00, /* * * ** * ** ** * * * * ** ** * */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* * * ** * ** ** * * * * ** ** * *** **** ** * * ** **** *** */ + +/* Character (0xf3): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0x80, 0xc0, 0x68, 0x28, 0x2c, 0x64, 0xc4, 0x80, 0x00, /* * ** * ** * * ** * * ** * ** * */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* * ** * ** * * ** * * ** * ** * *** **** ** * * ** **** *** */ + +/* Character (0xf4): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0x80, 0xc0, 0x68, 0x24, 0x2c, 0x68, 0xc0, 0x80, 0x00, /* * ** * ** * * ** * * ** ** * */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* * ** * ** * * ** * * ** ** * *** **** ** * * ** **** *** */ + +/* Character (0xf5): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0x80, 0xc8, 0x64, 0x2c, 0x28, 0x64, 0xc0, 0x80, 0x00, /* * * ** * ** ** * * * * ** ** * */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* * * ** * ** ** * * * * ** ** * *** **** ** * * ** **** *** */ + +/* Character (0xf6): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0x80, 0xc0, 0x6c, 0x20, 0x20, 0x6c, 0xc0, 0x80, 0x00, /* * ** ** ** * * ** ** ** * */ +0x00, 0x07, 0x0f, 0x18, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* * ** ** ** * * ** ** ** * *** **** ** * * ** **** *** */ + +/* Character (0xf7): bbw=7, bbh=7, bbx=1, bby=1, width=10 */ +0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** */ +0x00, 0x01, 0x01, 0x01, 0x0d, 0x01, 0x01, 0x01, 0x00, 0x00, /* ** * * * * ** * * * */ + +/* Character (0xf8): bbw=8, bbh=10, bbx=1, bby=-1, width=10 */ +0x00, 0x80, 0xc0, 0x60, 0x20, 0xa0, 0x60, 0xc0, 0xb0, 0x00, /* * ** ** * * * ** ** ** * */ +0x00, 0x37, 0x0f, 0x18, 0x16, 0x11, 0x18, 0x0f, 0x07, 0x00, /* * ** ** * * * ** ** ** * *** ** **** ** ** * * * ** **** *** */ + +/* Character (0xf9): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0xe0, 0xe4, 0x04, 0x0c, 0x08, 0x08, 0xe0, 0xe0, 0x00, /* *** * *** * ** * * *** *** */ +0x00, 0x0f, 0x1f, 0x18, 0x10, 0x10, 0x08, 0x1f, 0x1f, 0x00, /* *** * *** * ** * * *** *** **** ***** ** * * * ***** ***** */ + +/* Character (0xfa): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0xe0, 0xe8, 0x08, 0x0c, 0x04, 0x04, 0xe0, 0xe0, 0x00, /* *** * *** * ** * * *** *** */ +0x00, 0x0f, 0x1f, 0x18, 0x10, 0x10, 0x08, 0x1f, 0x1f, 0x00, /* *** * *** * ** * * *** *** **** ***** ** * * * ***** ***** */ + +/* Character (0xfb): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0xe0, 0xe0, 0x08, 0x04, 0x0c, 0x08, 0xe0, 0xe0, 0x00, /* *** *** * * ** * *** *** */ +0x00, 0x0f, 0x1f, 0x18, 0x10, 0x10, 0x08, 0x1f, 0x1f, 0x00, /* *** *** * * ** * *** *** **** ***** ** * * * ***** ***** */ + +/* Character (0xfc): bbw=8, bbh=11, bbx=1, bby=0, width=10 */ +0x00, 0xe0, 0xe0, 0x0c, 0x00, 0x00, 0x0c, 0xe0, 0xe0, 0x00, /* *** *** ** ** *** *** */ +0x00, 0x0f, 0x1f, 0x18, 0x10, 0x10, 0x08, 0x1f, 0x1f, 0x00, /* *** *** ** ** *** *** **** ***** ** * * * ***** ***** */ + +/* Character (0xfd): bbw=7, bbh=13, bbx=1, bby=-2, width=9 */ +0x00, 0xe0, 0xe8, 0x08, 0x0c, 0x04, 0xe4, 0xe0, 0x00, /* *** * *** * ** * * *** *** */ +0x00, 0x41, 0x67, 0x7e, 0x18, 0x0e, 0x03, 0x01, 0x00, /* *** * *** * ** * * *** *** * **** ** ****** ** *** ** * */ + +/* Character (0xfe): bbw=8, bbh=12, bbx=1, bby=-2, width=10 */ +0x00, 0xf8, 0xf8, 0x40, 0x20, 0x20, 0x60, 0xc0, 0x80, 0x00, /* ***** ***** * * * ** ** * */ +0x00, 0x7f, 0x7f, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x07, 0x00, /* ***** ***** * * * ** ** * ************** * * * ** **** *** */ + +/* Character (0xff): bbw=7, bbh=13, bbx=1, bby=-2, width=9 */ +0x00, 0xe0, 0xec, 0x00, 0x00, 0x00, 0xec, 0xe0, 0x00, /* *** ** *** ** *** *** */ +0x00, 0x41, 0x67, 0x7e, 0x18, 0x0e, 0x03, 0x01, 0x00, /* *** ** *** ** *** *** * **** ** ****** ** *** ** * */ +}; + +/* Character->glyph data. */ +static const PROGMEM uint16_t luBS14_offset[] = { + 0, /* (0x00) */ + 0, /* (0x01) */ + 0, /* (0x02) */ + 0, /* (0x03) */ + 0, /* (0x04) */ + 0, /* (0x05) */ + 0, /* (0x06) */ + 0, /* (0x07) */ + 0, /* (0x08) */ + 0, /* (0x09) */ + 0, /* (0x0a) */ + 0, /* (0x0b) */ + 0, /* (0x0c) */ + 0, /* (0x0d) */ + 0, /* (0x0e) */ + 0, /* (0x0f) */ + 0, /* (0x10) */ + 0, /* (0x11) */ + 0, /* (0x12) */ + 0, /* (0x13) */ + 0, /* (0x14) */ + 0, /* (0x15) */ + 0, /* (0x16) */ + 0, /* (0x17) */ + 0, /* (0x18) */ + 0, /* (0x19) */ + 0, /* (0x1a) */ + 0, /* (0x1b) */ + 0, /* (0x1c) */ + 0, /* (0x1d) */ + 0, /* (0x1e) */ + 0, /* (0x1f) */ + 24, /* (0x20) */ + 32, /* (0x21) */ + 40, /* (0x22) */ + 54, /* (0x23) */ + 74, /* (0x24) */ + 94, /* (0x25) */ + 118, /* (0x26) */ + 140, /* (0x27) */ + 148, /* (0x28) */ + 160, /* (0x29) */ + 172, /* (0x2a) */ + 186, /* (0x2b) */ + 206, /* (0x2c) */ + 214, /* (0x2d) */ + 224, /* (0x2e) */ + 232, /* (0x2f) */ + 248, /* (0x30) */ + 268, /* (0x31) */ + 288, /* (0x32) */ + 308, /* (0x33) */ + 328, /* (0x34) */ + 348, /* (0x35) */ + 368, /* (0x36) */ + 388, /* (0x37) */ + 408, /* (0x38) */ + 428, /* (0x39) */ + 448, /* (0x3a) */ + 456, /* (0x3b) */ + 464, /* (0x3c) */ + 484, /* (0x3d) */ + 504, /* (0x3e) */ + 524, /* (0x3f) */ + 540, /* (0x40) */ + 564, /* (0x41) */ + 586, /* (0x42) */ + 606, /* (0x43) */ + 628, /* (0x44) */ + 652, /* (0x45) */ + 670, /* (0x46) */ + 688, /* (0x47) */ + 710, /* (0x48) */ + 734, /* (0x49) */ + 746, /* (0x4a) */ + 758, /* (0x4b) */ + 780, /* (0x4c) */ + 798, /* (0x4d) */ + 828, /* (0x4e) */ + 852, /* (0x4f) */ + 876, /* (0x50) */ + 894, /* (0x51) */ + 918, /* (0x52) */ + 940, /* (0x53) */ + 958, /* (0x54) */ + 978, /* (0x55) */ + 1002, /* (0x56) */ + 1024, /* (0x57) */ + 1050, /* (0x58) */ + 1068, /* (0x59) */ + 1088, /* (0x5a) */ + 1106, /* (0x5b) */ + 1118, /* (0x5c) */ + 1134, /* (0x5d) */ + 1146, /* (0x5e) */ + 1166, /* (0x5f) */ + 1188, /* (0x60) */ + 1208, /* (0x61) */ + 1226, /* (0x62) */ + 1246, /* (0x63) */ + 1264, /* (0x64) */ + 1284, /* (0x65) */ + 1302, /* (0x66) */ + 1316, /* (0x67) */ + 1336, /* (0x68) */ + 1356, /* (0x69) */ + 1364, /* (0x6a) */ + 1374, /* (0x6b) */ + 1392, /* (0x6c) */ + 1400, /* (0x6d) */ + 1428, /* (0x6e) */ + 1448, /* (0x6f) */ + 1468, /* (0x70) */ + 1488, /* (0x71) */ + 1508, /* (0x72) */ + 1524, /* (0x73) */ + 1540, /* (0x74) */ + 1554, /* (0x75) */ + 1574, /* (0x76) */ + 1592, /* (0x77) */ + 1618, /* (0x78) */ + 1636, /* (0x79) */ + 1654, /* (0x7a) */ + 1672, /* (0x7b) */ + 1684, /* (0x7c) */ + 1692, /* (0x7d) */ + 1704, /* (0x7e) */ + 0, /* (0x7f) */ + 0, /* (0x80) */ + 0, /* (0x81) */ + 0, /* (0x82) */ + 0, /* (0x83) */ + 0, /* (0x84) */ + 0, /* (0x85) */ + 0, /* (0x86) */ + 0, /* (0x87) */ + 0, /* (0x88) */ + 0, /* (0x89) */ + 0, /* (0x8a) */ + 0, /* (0x8b) */ + 0, /* (0x8c) */ + 0, /* (0x8d) */ + 0, /* (0x8e) */ + 0, /* (0x8f) */ + 0, /* (0x90) */ + 0, /* (0x91) */ + 0, /* (0x92) */ + 0, /* (0x93) */ + 0, /* (0x94) */ + 0, /* (0x95) */ + 0, /* (0x96) */ + 0, /* (0x97) */ + 0, /* (0x98) */ + 0, /* (0x99) */ + 0, /* (0x9a) */ + 0, /* (0x9b) */ + 0, /* (0x9c) */ + 0, /* (0x9d) */ + 0, /* (0x9e) */ + 0, /* (0x9f) */ + 1722, /* (0xa0) */ + 1730, /* (0xa1) */ + 1738, /* (0xa2) */ + 1758, /* (0xa3) */ + 1778, /* (0xa4) */ + 1798, /* (0xa5) */ + 1818, /* (0xa6) */ + 1826, /* (0xa7) */ + 1846, /* (0xa8) */ + 1866, /* (0xa9) */ + 1890, /* (0xaa) */ + 1906, /* (0xab) */ + 1924, /* (0xac) */ + 1944, /* (0xad) */ + 1954, /* (0xae) */ + 1974, /* (0xaf) */ + 1994, /* (0xb0) */ + 2002, /* (0xb1) */ + 2022, /* (0xb2) */ + 2036, /* (0xb3) */ + 2050, /* (0xb4) */ + 2070, /* (0xb5) */ + 2090, /* (0xb6) */ + 2110, /* (0xb7) */ + 2130, /* (0xb8) */ + 2150, /* (0xb9) */ + 2164, /* (0xba) */ + 2180, /* (0xbb) */ + 2198, /* (0xbc) */ + 2226, /* (0xbd) */ + 2254, /* (0xbe) */ + 2284, /* (0xbf) */ + 2300, /* (0xc0) */ + 2322, /* (0xc1) */ + 2344, /* (0xc2) */ + 2366, /* (0xc3) */ + 2388, /* (0xc4) */ + 2408, /* (0xc5) */ + 2430, /* (0xc6) */ + 2456, /* (0xc7) */ + 2478, /* (0xc8) */ + 2496, /* (0xc9) */ + 2514, /* (0xca) */ + 2532, /* (0xcb) */ + 2550, /* (0xcc) */ + 2562, /* (0xcd) */ + 2574, /* (0xce) */ + 2586, /* (0xcf) */ + 2598, /* (0xd0) */ + 2622, /* (0xd1) */ + 2646, /* (0xd2) */ + 2670, /* (0xd3) */ + 2694, /* (0xd4) */ + 2718, /* (0xd5) */ + 2742, /* (0xd6) */ + 2766, /* (0xd7) */ + 2786, /* (0xd8) */ + 2810, /* (0xd9) */ + 2834, /* (0xda) */ + 2858, /* (0xdb) */ + 2882, /* (0xdc) */ + 2906, /* (0xdd) */ + 2926, /* (0xde) */ + 2944, /* (0xdf) */ + 2964, /* (0xe0) */ + 2982, /* (0xe1) */ + 3000, /* (0xe2) */ + 3018, /* (0xe3) */ + 3036, /* (0xe4) */ + 3054, /* (0xe5) */ + 3072, /* (0xe6) */ + 3100, /* (0xe7) */ + 3118, /* (0xe8) */ + 3136, /* (0xe9) */ + 3154, /* (0xea) */ + 3172, /* (0xeb) */ + 3190, /* (0xec) */ + 3198, /* (0xed) */ + 3206, /* (0xee) */ + 3214, /* (0xef) */ + 3222, /* (0xf0) */ + 3242, /* (0xf1) */ + 3262, /* (0xf2) */ + 3282, /* (0xf3) */ + 3302, /* (0xf4) */ + 3322, /* (0xf5) */ + 3342, /* (0xf6) */ + 3362, /* (0xf7) */ + 3382, /* (0xf8) */ + 3402, /* (0xf9) */ + 3422, /* (0xfa) */ + 3442, /* (0xfb) */ + 3462, /* (0xfc) */ + 3482, /* (0xfd) */ + 3500, /* (0xfe) */ + 3520, /* (0xff) */ +}; + +/* Character width data. */ +static const PROGMEM uint8_t luBS14_width[] = { + 12, /* (0x00) */ + 12, /* (0x01) */ + 12, /* (0x02) */ + 12, /* (0x03) */ + 12, /* (0x04) */ + 12, /* (0x05) */ + 12, /* (0x06) */ + 12, /* (0x07) */ + 12, /* (0x08) */ + 12, /* (0x09) */ + 12, /* (0x0a) */ + 12, /* (0x0b) */ + 12, /* (0x0c) */ + 12, /* (0x0d) */ + 12, /* (0x0e) */ + 12, /* (0x0f) */ + 12, /* (0x10) */ + 12, /* (0x11) */ + 12, /* (0x12) */ + 12, /* (0x13) */ + 12, /* (0x14) */ + 12, /* (0x15) */ + 12, /* (0x16) */ + 12, /* (0x17) */ + 12, /* (0x18) */ + 12, /* (0x19) */ + 12, /* (0x1a) */ + 12, /* (0x1b) */ + 12, /* (0x1c) */ + 12, /* (0x1d) */ + 12, /* (0x1e) */ + 12, /* (0x1f) */ + 4, /* (0x20) */ + 4, /* (0x21) */ + 7, /* (0x22) */ + 10, /* (0x23) */ + 10, /* (0x24) */ + 12, /* (0x25) */ + 11, /* (0x26) */ + 4, /* (0x27) */ + 6, /* (0x28) */ + 6, /* (0x29) */ + 7, /* (0x2a) */ + 10, /* (0x2b) */ + 4, /* (0x2c) */ + 5, /* (0x2d) */ + 4, /* (0x2e) */ + 8, /* (0x2f) */ + 10, /* (0x30) */ + 10, /* (0x31) */ + 10, /* (0x32) */ + 10, /* (0x33) */ + 10, /* (0x34) */ + 10, /* (0x35) */ + 10, /* (0x36) */ + 10, /* (0x37) */ + 10, /* (0x38) */ + 10, /* (0x39) */ + 4, /* (0x3a) */ + 4, /* (0x3b) */ + 10, /* (0x3c) */ + 10, /* (0x3d) */ + 10, /* (0x3e) */ + 8, /* (0x3f) */ + 12, /* (0x40) */ + 11, /* (0x41) */ + 10, /* (0x42) */ + 11, /* (0x43) */ + 12, /* (0x44) */ + 9, /* (0x45) */ + 9, /* (0x46) */ + 11, /* (0x47) */ + 12, /* (0x48) */ + 6, /* (0x49) */ + 6, /* (0x4a) */ + 11, /* (0x4b) */ + 9, /* (0x4c) */ + 15, /* (0x4d) */ + 12, /* (0x4e) */ + 12, /* (0x4f) */ + 9, /* (0x50) */ + 12, /* (0x51) */ + 11, /* (0x52) */ + 9, /* (0x53) */ + 10, /* (0x54) */ + 12, /* (0x55) */ + 11, /* (0x56) */ + 13, /* (0x57) */ + 9, /* (0x58) */ + 10, /* (0x59) */ + 9, /* (0x5a) */ + 6, /* (0x5b) */ + 8, /* (0x5c) */ + 6, /* (0x5d) */ + 10, /* (0x5e) */ + 11, /* (0x5f) */ + 10, /* (0x60) */ + 9, /* (0x61) */ + 10, /* (0x62) */ + 9, /* (0x63) */ + 10, /* (0x64) */ + 9, /* (0x65) */ + 7, /* (0x66) */ + 10, /* (0x67) */ + 10, /* (0x68) */ + 4, /* (0x69) */ + 5, /* (0x6a) */ + 9, /* (0x6b) */ + 4, /* (0x6c) */ + 14, /* (0x6d) */ + 10, /* (0x6e) */ + 10, /* (0x6f) */ + 10, /* (0x70) */ + 10, /* (0x71) */ + 8, /* (0x72) */ + 8, /* (0x73) */ + 7, /* (0x74) */ + 10, /* (0x75) */ + 9, /* (0x76) */ + 13, /* (0x77) */ + 9, /* (0x78) */ + 9, /* (0x79) */ + 9, /* (0x7a) */ + 6, /* (0x7b) */ + 4, /* (0x7c) */ + 6, /* (0x7d) */ + 9, /* (0x7e) */ + 12, /* (0x7f) */ + 12, /* (0x80) */ + 12, /* (0x81) */ + 12, /* (0x82) */ + 12, /* (0x83) */ + 12, /* (0x84) */ + 12, /* (0x85) */ + 12, /* (0x86) */ + 12, /* (0x87) */ + 12, /* (0x88) */ + 12, /* (0x89) */ + 12, /* (0x8a) */ + 12, /* (0x8b) */ + 12, /* (0x8c) */ + 12, /* (0x8d) */ + 12, /* (0x8e) */ + 12, /* (0x8f) */ + 12, /* (0x90) */ + 12, /* (0x91) */ + 12, /* (0x92) */ + 12, /* (0x93) */ + 12, /* (0x94) */ + 12, /* (0x95) */ + 12, /* (0x96) */ + 12, /* (0x97) */ + 12, /* (0x98) */ + 12, /* (0x99) */ + 12, /* (0x9a) */ + 12, /* (0x9b) */ + 12, /* (0x9c) */ + 12, /* (0x9d) */ + 12, /* (0x9e) */ + 12, /* (0x9f) */ + 4, /* (0xa0) */ + 4, /* (0xa1) */ + 10, /* (0xa2) */ + 10, /* (0xa3) */ + 10, /* (0xa4) */ + 10, /* (0xa5) */ + 4, /* (0xa6) */ + 10, /* (0xa7) */ + 10, /* (0xa8) */ + 12, /* (0xa9) */ + 8, /* (0xaa) */ + 9, /* (0xab) */ + 10, /* (0xac) */ + 5, /* (0xad) */ + 10, /* (0xae) */ + 10, /* (0xaf) */ + 4, /* (0xb0) */ + 10, /* (0xb1) */ + 7, /* (0xb2) */ + 7, /* (0xb3) */ + 10, /* (0xb4) */ + 10, /* (0xb5) */ + 10, /* (0xb6) */ + 10, /* (0xb7) */ + 10, /* (0xb8) */ + 7, /* (0xb9) */ + 8, /* (0xba) */ + 9, /* (0xbb) */ + 14, /* (0xbc) */ + 14, /* (0xbd) */ + 15, /* (0xbe) */ + 8, /* (0xbf) */ + 11, /* (0xc0) */ + 11, /* (0xc1) */ + 11, /* (0xc2) */ + 11, /* (0xc3) */ + 10, /* (0xc4) */ + 11, /* (0xc5) */ + 13, /* (0xc6) */ + 11, /* (0xc7) */ + 9, /* (0xc8) */ + 9, /* (0xc9) */ + 9, /* (0xca) */ + 9, /* (0xcb) */ + 6, /* (0xcc) */ + 6, /* (0xcd) */ + 6, /* (0xce) */ + 6, /* (0xcf) */ + 12, /* (0xd0) */ + 12, /* (0xd1) */ + 12, /* (0xd2) */ + 12, /* (0xd3) */ + 12, /* (0xd4) */ + 12, /* (0xd5) */ + 12, /* (0xd6) */ + 10, /* (0xd7) */ + 12, /* (0xd8) */ + 12, /* (0xd9) */ + 12, /* (0xda) */ + 12, /* (0xdb) */ + 12, /* (0xdc) */ + 10, /* (0xdd) */ + 9, /* (0xde) */ + 10, /* (0xdf) */ + 9, /* (0xe0) */ + 9, /* (0xe1) */ + 9, /* (0xe2) */ + 9, /* (0xe3) */ + 9, /* (0xe4) */ + 9, /* (0xe5) */ + 14, /* (0xe6) */ + 9, /* (0xe7) */ + 9, /* (0xe8) */ + 9, /* (0xe9) */ + 9, /* (0xea) */ + 9, /* (0xeb) */ + 4, /* (0xec) */ + 4, /* (0xed) */ + 4, /* (0xee) */ + 4, /* (0xef) */ + 10, /* (0xf0) */ + 10, /* (0xf1) */ + 10, /* (0xf2) */ + 10, /* (0xf3) */ + 10, /* (0xf4) */ + 10, /* (0xf5) */ + 10, /* (0xf6) */ + 10, /* (0xf7) */ + 10, /* (0xf8) */ + 10, /* (0xf9) */ + 10, /* (0xfa) */ + 10, /* (0xfb) */ + 10, /* (0xfc) */ + 9, /* (0xfd) */ + 10, /* (0xfe) */ + 9, /* (0xff) */ +}; + +/* Font structure definition. */ +EXTERN_CONST Font font_luBS14 = +{ + /* .glyph = */ font_luBS14_glyphs, + /* .name = "luBS14", */ + /* .width = */ 15, + /* .height = */ 15, + /* .ascent = 13, */ + /* .first = */ 0, + /* .last = */ 255, + /* .offset = */ luBS14_offset, + /* .width = */ luBS14_width, +}; diff --git a/2.5/bertos/fonts/ncenB18.bdf b/2.5/bertos/fonts/ncenB18.bdf new file mode 100644 index 00000000..d8eae064 --- /dev/null +++ b/2.5/bertos/fonts/ncenB18.bdf @@ -0,0 +1,16273 @@ +STARTFONT 2.1 +FONT -Adobe-New Century Schoolbook-Bold-R-Normal--18-180-75-75-P-113-ISO10646-1 +SIZE 18 75 75 +FONTBOUNDINGBOX 24 31 -3 -8 +COMMENT $Xorg: $ +COMMENT ISO10646-1 extension by Markus Kuhn , 2001-03-20 +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 26 +FOUNDRY "Adobe" +FAMILY_NAME "New Century Schoolbook" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 18 +POINT_SIZE 180 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 113 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 14 +X_HEIGHT 9 +FONT_ASCENT 16 +FONT_DESCENT 4 +FACE_NAME "New Century Schoolbook Bold" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "New Century Schoolbook is a trademark of Linotype-Hell AG and/or its subsidiaries." +_DEC_DEVICE_FONTNAMES "PS=NewCenturySchlbk-Bold" +DEFAULT_CHAR 0 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +FULL_NAME "New Century Schoolbook Bold" +ENDPROPERTIES +CHARS 756 +STARTCHAR char0 +ENCODING 0 +SWIDTH 870 0 +DWIDTH 16 0 +BBX 13 13 1 0 +BITMAP +AAA8 +0000 +8008 +0000 +8008 +0000 +8008 +0000 +8008 +0000 +8008 +0000 +AAA8 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 287 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 296 0 +DWIDTH 6 0 +BBX 4 14 1 0 +BITMAP +60 +F0 +F0 +F0 +F0 +F0 +60 +60 +60 +00 +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 5 5 1 9 +BITMAP +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 574 0 +DWIDTH 12 0 +BBX 11 13 0 0 +BITMAP +0D80 +0D80 +0D80 +7FE0 +7FE0 +1B00 +1B00 +FFC0 +FFC0 +3600 +3600 +3600 +3600 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 18 1 -2 +BITMAP +0800 +0800 +3E00 +6B80 +C980 +C980 +E800 +F800 +7E00 +3F00 +0F80 +0B80 +C980 +C980 +EB80 +7F00 +0800 +0800 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 833 0 +DWIDTH 15 0 +BBX 14 14 0 0 +BITMAP +38C0 +6740 +C4C0 +C480 +C580 +C900 +7300 +0238 +0664 +04C4 +0CC4 +08C4 +18C8 +1070 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 852 0 +DWIDTH 17 0 +BBX 16 14 0 0 +BITMAP +0780 +0CC0 +1840 +18C0 +1D80 +1F00 +0E3E +3F18 +7790 +E3E0 +E1E0 +E0F1 +F1FE +3F1C +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 241 0 +DWIDTH 5 0 +BBX 2 5 1 9 +BITMAP +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 16 1 -2 +BITMAP +18 +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +18 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 16 0 -2 +BITMAP +C0 +60 +30 +30 +18 +18 +18 +18 +18 +18 +18 +18 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 7 +BITMAP +38 +92 +D6 +38 +D6 +92 +38 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +0C00 +0C00 +0C00 +0C00 +FFC0 +FFC0 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 4 7 0 -3 +BITMAP +60 +F0 +F0 +70 +20 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 2 0 4 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 4 4 0 0 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 6 14 0 0 +BITMAP +0C +0C +0C +18 +18 +18 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +7700 +6300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +6300 +7700 +1C00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 7 14 2 0 +BITMAP +18 +38 +F8 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +FE +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1E00 +6700 +E380 +E380 +6380 +0380 +0700 +0700 +0E00 +1800 +3000 +6080 +FF80 +FF80 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1E00 +6700 +E380 +E380 +6380 +0300 +1C00 +0300 +0380 +6380 +E380 +E380 +6700 +3E00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0700 +0F00 +0F00 +1700 +1700 +2700 +2700 +4700 +4700 +8700 +FF80 +0700 +0700 +0F80 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +7F80 +7F00 +4000 +4000 +4000 +7E00 +4700 +0380 +0380 +6380 +E380 +E380 +6700 +3E00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1F00 +7380 +6380 +E300 +E000 +EE00 +F700 +E380 +E380 +E380 +E380 +6380 +7300 +1C00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +FF80 +FF80 +FF80 +8300 +0600 +0600 +0C00 +0C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +6300 +C180 +C180 +E180 +FB00 +7E00 +3F00 +4F80 +C380 +C180 +C180 +E300 +3C00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +6700 +E300 +E380 +E380 +E380 +E380 +7780 +3B80 +0380 +6380 +E300 +E700 +7C00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +60 +F0 +F0 +60 +00 +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +60 +F0 +F0 +60 +00 +60 +F0 +F0 +70 +20 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +00C0 +03C0 +0F00 +3C00 +F000 +F000 +3C00 +0F00 +03C0 +00C0 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 9 6 1 2 +BITMAP +FF80 +FF80 +0000 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +C000 +F000 +3C00 +0F00 +03C0 +03C0 +0F00 +3C00 +F000 +C000 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +1F00 +6780 +E380 +E380 +6380 +0300 +0600 +0C00 +1800 +0000 +1800 +3C00 +3C00 +1800 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 747 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +07F0 +1C1C +300C +63E6 +6666 +CC66 +CC66 +D8CC +D8CC +D9D8 +CEF0 +6008 +7870 +1FC0 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +FFC0 +71E0 +70E0 +70E0 +70E0 +71C0 +7F80 +70E0 +70F0 +7070 +7070 +7070 +70E0 +FF80 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E000 +F010 +7010 +7820 +3C60 +0F80 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +FFC0 +70F0 +7078 +7038 +703C +701C +701C +701C +701C +703C +7038 +7078 +70F0 +FFC0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFE0 +70E0 +7060 +7120 +7120 +7320 +7F00 +7300 +7100 +7100 +7000 +7000 +7000 +F800 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 833 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E0F8 +F070 +7070 +7870 +3CF0 +0F90 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 870 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +FCFC +7038 +7038 +7038 +7038 +7038 +7FF8 +7038 +7038 +7038 +7038 +7038 +7038 +FCFC +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 5 14 2 0 +BITMAP +F8 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 648 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +07E0 +01C0 +01C0 +01C0 +01C0 +01C0 +01C0 +01C0 +61C0 +F1C0 +F1C0 +C3C0 +4780 +3E00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +FC7C +7030 +7060 +70C0 +7180 +7300 +7780 +7FC0 +7BC0 +71E0 +70F0 +70F8 +707C +FCFE +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 722 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +FC00 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7020 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 981 0 +DWIDTH 19 0 +BBX 17 14 1 0 +BITMAP +7C0780 +3C0F00 +3E0F00 +2E1F00 +2F1700 +2F1700 +273700 +27A700 +23E700 +23C700 +23C700 +21C700 +718700 +F88F80 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +F83E +7C1C +3C08 +3E08 +2F08 +2788 +2388 +21C8 +21E8 +20E8 +2078 +2078 +7038 +F818 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +FFE0 +70F0 +7070 +7070 +7070 +70F0 +71E0 +7F80 +7000 +7000 +7000 +7000 +7000 +FC00 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 18 0 -4 +BITMAP +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F79E +79DC +70FC +3CF8 +0FE0 +0060 +0074 +007C +0038 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +FFE0 +70F0 +7070 +7070 +70F0 +71E0 +7F80 +71C0 +71E0 +70E0 +70E0 +70F0 +7074 +F878 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +3F40 +61C0 +C0C0 +C040 +E000 +FE00 +7FC0 +7FE0 +0FE0 +80E0 +8060 +C060 +E0C0 +BF80 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFE0 +CE60 +CE60 +8E20 +8E20 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +1F00 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +F87C +7038 +7830 +3820 +3820 +3C60 +1C40 +1E40 +0EC0 +0E80 +0780 +0780 +0300 +0300 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 981 0 +DWIDTH 19 0 +BBX 19 14 0 0 +BITMAP +FBF3E0 +71E1C0 +70E180 +78E100 +38F100 +39F300 +3D7200 +1D3A00 +1F3E00 +1E3C00 +0E1C00 +0E1C00 +0C1800 +040800 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 722 0 +DWIDTH 17 0 +BBX 16 14 0 0 +BITMAP +7E3F +3C1C +1E18 +0E30 +0F60 +07C0 +03C0 +03E0 +06F0 +0C70 +1878 +303C +703E +F87F +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 722 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +F878 +7030 +7820 +3860 +3C40 +1CC0 +1F80 +0F80 +0F00 +0700 +0700 +0700 +0700 +0F80 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFE0 +E1E0 +C1C0 +83C0 +8780 +0700 +0F00 +1E00 +1C00 +3C20 +7820 +7060 +F0E0 +FFE0 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 16 1 -2 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 606 0 +DWIDTH 9 0 +BBX 8 14 0 0 +BITMAP +C0 +C0 +60 +60 +30 +30 +18 +18 +0C +0C +06 +06 +03 +03 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 16 0 -2 +BITMAP +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 606 0 +DWIDTH 9 0 +BBX 8 8 0 6 +BITMAP +18 +18 +3C +3C +66 +66 +C3 +C3 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 10 2 0 -3 +BITMAP +FFC0 +FFC0 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 4 1 10 +BITMAP +C0 +E0 +70 +18 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 648 0 +DWIDTH 12 0 +BBX 12 14 -1 0 +BITMAP +F000 +7000 +7000 +7000 +7000 +7780 +78E0 +7070 +7070 +7070 +7070 +7070 +78E0 +6F80 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +1F00 +7380 +E180 +E000 +E000 +E000 +E080 +7180 +1E00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +01E0 +00E0 +00E0 +00E0 +00E0 +1EE0 +71E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71E0 +1EF0 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 389 0 +DWIDTH 7 0 +BBX 8 14 0 0 +BITMAP +1E +37 +77 +70 +70 +FC +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 15 0 -4 +BITMAP +0060 +00E0 +3F00 +7380 +6180 +6180 +7380 +3F00 +6000 +7F80 +3FC0 +C1C0 +C0C0 +E180 +7F00 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +F000 +7000 +7000 +7000 +7000 +77C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 5 14 0 0 +BITMAP +70 +70 +70 +00 +00 +F0 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 352 0 +DWIDTH 6 0 +BBX 7 18 -3 -4 +BITMAP +0E +0E +0E +00 +00 +1E +0E +0E +0E +0E +0E +0E +0E +0E +0E +EE +EC +78 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +F000 +7000 +7000 +7000 +7000 +73E0 +7180 +7200 +7600 +7F00 +7780 +73C0 +71E0 +FBF0 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 352 0 +DWIDTH 6 0 +BBX 5 14 0 0 +BITMAP +F0 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 963 0 +DWIDTH 20 0 +BBX 19 9 0 0 +BITMAP +F7DF80 +79F3C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +F9F3E0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 9 0 0 +BITMAP +F7C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 13 -1 -4 +BITMAP +E780 +78E0 +7070 +7070 +7070 +7070 +7070 +78E0 +7780 +7000 +7000 +7000 +F800 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 648 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +1E60 +71E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71E0 +1EE0 +00E0 +00E0 +00E0 +01F0 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 519 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +F7 +7B +73 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +3D00 +6300 +E100 +FC00 +7F00 +0F80 +8380 +C300 +BE00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 426 0 +DWIDTH 8 0 +BBX 7 13 0 0 +BITMAP +10 +30 +30 +70 +FC +70 +70 +70 +70 +70 +72 +72 +3C +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 9 0 0 +BITMAP +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 10 9 -1 0 +BITMAP +F9C0 +7080 +7080 +3900 +3900 +1E00 +1E00 +0C00 +0C00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 16 9 -1 0 +BITMAP +FBE7 +71C2 +71C2 +39E4 +39E4 +1E78 +1E78 +0C30 +0C30 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +FCE0 +78C0 +3D00 +1E00 +0E00 +0F00 +1780 +63C0 +E7E0 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 13 0 -4 +BITMAP +F8E0 +7040 +7040 +3880 +3880 +1D00 +1D00 +0E00 +0E00 +0400 +C400 +E800 +7000 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 537 0 +DWIDTH 10 0 +BBX 8 9 0 0 +BITMAP +FF +CF +8E +1C +38 +39 +71 +F3 +FF +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 16 0 -2 +BITMAP +18 +20 +60 +60 +60 +60 +60 +C0 +60 +60 +60 +60 +60 +60 +20 +18 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 2 14 4 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 16 0 -2 +BITMAP +C0 +20 +30 +30 +30 +30 +30 +18 +30 +30 +30 +30 +30 +30 +20 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 606 0 +DWIDTH 12 0 +BBX 10 3 1 4 +BITMAP +39C0 +7F80 +E700 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 287 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 296 0 +DWIDTH 7 0 +BBX 4 14 1 -4 +BITMAP +60 +F0 +F0 +60 +00 +60 +60 +60 +F0 +F0 +F0 +F0 +F0 +60 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 13 1 -2 +BITMAP +0080 +0080 +1F00 +7380 +E380 +E400 +E400 +E800 +E880 +7180 +1E00 +2000 +2000 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +1F00 +3180 +7380 +7380 +7000 +7000 +3800 +FF80 +1C00 +1C00 +1840 +70C0 +9FC0 +EF80 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 606 0 +DWIDTH 10 0 +BBX 9 9 0 2 +BITMAP +DD80 +FF80 +6300 +C180 +C180 +C180 +6300 +FF80 +DD80 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 722 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +F878 +7030 +7820 +3860 +1C40 +1CC0 +0F80 +1FC0 +0700 +1FC0 +0700 +0700 +0700 +0F80 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 2 14 4 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 16 0 -2 +BITMAP +78 +CC +8C +C0 +70 +7C +9E +86 +C2 +F2 +7C +1C +04 +C4 +CC +78 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 10 0 +BBX 6 2 2 10 +BITMAP +CC +CC +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 747 0 +DWIDTH 15 0 +BBX 14 14 0 0 +BITMAP +0780 +1860 +2010 +47C8 +4CC8 +9844 +9804 +9804 +9804 +4C48 +4788 +2010 +1860 +0780 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 367 0 +DWIDTH 8 0 +BBX 7 8 0 6 +BITMAP +78 +CC +3C +CC +DC +6E +00 +FE +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +11 +66 +CC +66 +11 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 606 0 +DWIDTH 10 0 +BBX 9 6 0 2 +BITMAP +FF80 +FF80 +0180 +0180 +0180 +0180 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 2 0 4 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 747 0 +DWIDTH 15 0 +BBX 14 14 0 0 +BITMAP +0780 +1860 +2010 +5F88 +4CC8 +8CC4 +8F84 +8D84 +8CC4 +5EE8 +4008 +2010 +1860 +0780 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 2 1 10 +BITMAP +FC +FC +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 7 0 +BBX 6 6 0 8 +BITMAP +78 +CC +84 +84 +CC +78 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 10 11 0 0 +BITMAP +0C00 +0C00 +0C00 +FFC0 +FFC0 +0C00 +0C00 +0C00 +0000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 344 0 +DWIDTH 6 0 +BBX 6 8 0 6 +BITMAP +78 +CC +CC +18 +30 +60 +C4 +FC +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 344 0 +DWIDTH 6 0 +BBX 6 8 0 6 +BITMAP +78 +CC +0C +38 +0C +CC +CC +78 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 4 1 10 +BITMAP +18 +38 +70 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 13 0 -4 +BITMAP +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +7EF0 +6000 +7000 +7000 +2000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 747 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +3FF8 +7E70 +FE70 +FE70 +FE70 +FE70 +7E70 +3E70 +0E70 +0E70 +0E70 +0E70 +0E70 +1FF8 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 4 4 0 3 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 4 1 -4 +BITMAP +40 +70 +30 +E0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 344 0 +DWIDTH 6 0 +BBX 6 8 0 6 +BITMAP +30 +F0 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 367 0 +DWIDTH 7 0 +BBX 6 8 0 6 +BITMAP +78 +CC +CC +CC +CC +78 +00 +FC +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +88 +66 +33 +66 +88 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 861 0 +DWIDTH 15 0 +BBX 14 14 0 0 +BITMAP +3060 +F060 +30C0 +30C0 +3180 +3180 +3318 +FF38 +0678 +06D8 +0D98 +0DFC +1818 +183C +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 861 0 +DWIDTH 15 0 +BBX 14 14 0 0 +BITMAP +3060 +F060 +30C0 +30C0 +3180 +3180 +3378 +FFCC +06CC +0618 +0C30 +0C60 +18C4 +18FC +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 861 0 +DWIDTH 15 0 +BBX 14 14 0 0 +BITMAP +7860 +CC60 +0CC0 +38C0 +0D80 +CD80 +CF18 +7B38 +0678 +06D8 +0D98 +0DFC +1818 +183C +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 14 0 -4 +BITMAP +0C00 +1E00 +1E00 +0C00 +0000 +0C00 +1800 +3000 +6000 +E300 +E380 +E380 +F300 +7C00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 19 0 0 +BITMAP +1800 +1C00 +0E00 +0300 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 19 0 0 +BITMAP +0060 +00E0 +01C0 +0300 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 18 0 0 +BITMAP +0380 +07C0 +0C60 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 18 0 0 +BITMAP +0620 +0FC0 +1180 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 17 0 0 +BITMAP +0CC0 +0CC0 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 18 0 0 +BITMAP +0300 +0480 +0480 +0300 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 981 0 +DWIDTH 21 0 +BBX 20 14 0 0 +BITMAP +03FFF0 +00B870 +01B830 +013890 +033890 +063980 +043F80 +0C3980 +1FF880 +103890 +203810 +203830 +603870 +F1FFF0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E000 +F010 +7010 +7820 +3C60 +0F80 +0400 +0700 +0300 +0E00 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +3000 +3800 +1C00 +0600 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +1F00 +3180 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +1980 +1980 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 5 19 2 0 +BITMAP +C0 +E0 +70 +18 +00 +F8 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 6 19 2 0 +BITMAP +0C +1C +38 +60 +00 +F8 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 7 18 1 0 +BITMAP +38 +7C +C6 +00 +7C +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +7C +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 6 17 2 0 +BITMAP +CC +CC +00 +F8 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +7FE0 +3878 +383C +381C +381E +380E +FE0E +380E +380E +381E +381C +383C +3878 +7FE0 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0310 +07E0 +08C0 +0000 +F83E +7C1C +3C08 +3E08 +2F08 +2788 +2388 +21C8 +21E8 +20E8 +2078 +2078 +7038 +F818 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0C00 +0E00 +0700 +0180 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0060 +00E0 +01C0 +0300 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 18 0 0 +BITMAP +0380 +07C0 +0C60 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 18 0 0 +BITMAP +0310 +07E0 +08C0 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 17 0 0 +BITMAP +0660 +0660 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +C0C0 +E1C0 +7380 +3F00 +1E00 +1E00 +3F00 +7380 +E1C0 +C0C0 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +0FC8 +38F0 +7078 +7078 +E0BC +E11C +E21C +E21C +E41C +E83C +7038 +7078 +78F0 +8FC0 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +0C00 +0E00 +0700 +0180 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +00C0 +01C0 +0380 +0600 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0380 +07C0 +0C60 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 17 1 0 +BITMAP +0CC0 +0CC0 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 722 0 +DWIDTH 15 0 +BBX 13 19 1 0 +BITMAP +0060 +00E0 +01C0 +0300 +0000 +F878 +7030 +7820 +3860 +3C40 +1CC0 +1F80 +0F80 +0F00 +0700 +0700 +0700 +0700 +0F80 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +F800 +7000 +7000 +7FC0 +70F0 +7070 +7070 +7070 +7070 +70E0 +7F80 +7000 +7000 +F800 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +1E00 +3380 +71C0 +71C0 +71C0 +7180 +7700 +71C0 +70E0 +70E0 +70E0 +70E0 +71C0 +F700 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +3000 +3800 +1C00 +0600 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0600 +0E00 +1C00 +3000 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +1C00 +3E00 +6300 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +1880 +3F00 +4600 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 12 0 0 +BITMAP +3300 +3300 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0C00 +1200 +1200 +0C00 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 870 0 +DWIDTH 17 0 +BBX 16 9 0 0 +BITMAP +3F78 +63CE +E387 +0787 +3BFF +E380 +E381 +E7C3 +78FC +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 -4 +BITMAP +1F00 +7380 +E180 +E000 +E000 +E000 +E080 +7180 +1E00 +1000 +1C00 +0C00 +3800 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +3000 +3800 +1C00 +0600 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0600 +0E00 +1C00 +3000 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +0E00 +1F00 +3180 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 12 0 0 +BITMAP +3300 +3300 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 5 14 0 0 +BITMAP +C0 +E0 +70 +18 +00 +F0 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 5 14 0 0 +BITMAP +18 +38 +70 +C0 +00 +F0 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 7 13 -1 0 +BITMAP +38 +7C +C6 +00 +78 +38 +38 +38 +38 +38 +38 +38 +7C +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 6 12 0 0 +BITMAP +CC +CC +00 +F0 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +6000 +1B00 +1C00 +6600 +0300 +1F80 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 13 0 0 +BITMAP +0C40 +1F80 +2300 +0000 +F7C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +1800 +1C00 +0E00 +0300 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +0300 +0700 +0E00 +1800 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 13 0 0 +BITMAP +0E00 +1F00 +3180 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 13 0 0 +BITMAP +1880 +3F00 +4600 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 12 0 0 +BITMAP +1980 +1980 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +0C00 +0C00 +0000 +0000 +FFC0 +FFC0 +0000 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 11 0 -1 +BITMAP +0100 +1F00 +7380 +E3C0 +E5C0 +E5C0 +E9C0 +E9C0 +7380 +3E00 +2000 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +1800 +1C00 +0E00 +0300 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 13 0 0 +BITMAP +0700 +0F80 +18C0 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 12 0 0 +BITMAP +1980 +1980 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 18 0 -4 +BITMAP +0180 +0380 +0700 +0C00 +0000 +F8E0 +7040 +7040 +3880 +3880 +1D00 +1D00 +0E00 +0E00 +0400 +C400 +E800 +7000 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 18 -1 -4 +BITMAP +F000 +7000 +7000 +7000 +7000 +7780 +78E0 +7070 +7070 +7070 +7070 +7070 +78E0 +7780 +7000 +7000 +7000 +F800 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 16 0 -4 +BITMAP +1980 +1980 +0000 +F8E0 +7040 +7040 +3880 +3880 +1D00 +1D00 +0E00 +0E00 +0400 +C400 +E800 +7000 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 17 0 0 +BITMAP +0FC0 +0FC0 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 12 0 0 +BITMAP +3F00 +3F00 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 18 0 0 +BITMAP +0840 +0CC0 +0780 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +2100 +3300 +1E00 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 18 0 -4 +BITMAP +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +0180 +0300 +0340 +0180 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 13 0 -4 +BITMAP +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +0C00 +1800 +1A00 +0C00 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E000 +F010 +7010 +7820 +3C60 +0F80 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0300 +0700 +0E00 +1800 +0000 +1F00 +7380 +E180 +E000 +E000 +E000 +E080 +7180 +1E00 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0200 +0700 +0F80 +18C0 +0000 +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E000 +F010 +7010 +7820 +3C60 +0F80 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0800 +1C00 +3E00 +6300 +0000 +1F00 +7380 +E180 +E000 +E000 +E000 +E080 +7180 +1E00 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 17 1 0 +BITMAP +0600 +0600 +0000 +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E000 +F010 +7010 +7820 +3C60 +0F80 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 12 0 0 +BITMAP +0C00 +0C00 +0000 +1F00 +7380 +E180 +E000 +E000 +E000 +E080 +7180 +1E00 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +18C0 +0F80 +0700 +0200 +0000 +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E000 +F010 +7010 +7820 +3C60 +0F80 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +6300 +3E00 +1C00 +0800 +0000 +1F00 +7380 +E180 +E000 +E000 +E000 +E080 +7180 +1E00 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +18C0 +0F80 +0700 +0200 +0000 +FFC0 +70F0 +7078 +7038 +703C +701C +701C +701C +701C +703C +7038 +7078 +70F0 +FFC0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 875 0 +DWIDTH 17 0 +BBX 16 14 0 0 +BITMAP +01E6 +00EF +00EF +00E7 +00E2 +1EE4 +71E8 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71E0 +1EF0 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +7FE0 +3878 +383C +381C +381E +380E +FE0E +380E +380E +381E +381C +383C +3878 +7FE0 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +01E0 +00E0 +00E0 +01F0 +01F0 +1EE0 +71E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71E0 +1EF0 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +1F80 +1F80 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 12 0 0 +BITMAP +3F00 +3F00 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1080 +1980 +0F00 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +2100 +3300 +1E00 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +0600 +0600 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 12 0 0 +BITMAP +0C00 +0C00 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +0600 +0C00 +0D00 +0600 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 13 0 -4 +BITMAP +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +0C00 +1800 +1A00 +0C00 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +3180 +1F00 +0E00 +0400 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +3180 +1F00 +0E00 +0400 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 833 0 +DWIDTH 15 0 +BBX 13 19 1 0 +BITMAP +0200 +0700 +0F80 +18C0 +0000 +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E0F8 +F070 +7070 +7870 +3CF0 +0F90 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 20 0 -4 +BITMAP +0200 +0700 +0F80 +18C0 +0000 +0060 +00E0 +3F00 +7380 +6180 +6180 +7380 +3F00 +6000 +7F80 +3FC0 +C1C0 +C0C0 +E180 +7F00 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 833 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +1080 +1980 +0F00 +0000 +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E0F8 +F070 +7070 +7870 +3CF0 +0F90 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 19 0 -4 +BITMAP +1080 +1980 +0F00 +0000 +0060 +00E0 +3F00 +7380 +6180 +6180 +7380 +3F00 +6000 +7F80 +3FC0 +C1C0 +C0C0 +E180 +7F00 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 833 0 +DWIDTH 15 0 +BBX 13 17 1 0 +BITMAP +0600 +0600 +0000 +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E0F8 +F070 +7070 +7870 +3CF0 +0F90 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 18 0 -4 +BITMAP +0600 +0600 +0000 +0060 +00E0 +3F00 +7380 +6180 +6180 +7380 +3F00 +6000 +7F80 +3FC0 +C1C0 +C0C0 +E180 +7F00 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 833 0 +DWIDTH 15 0 +BBX 13 22 1 -8 +BITMAP +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E0F8 +F070 +7070 +7870 +3CF0 +0F90 +0000 +0300 +0780 +0780 +0380 +0100 +0200 +0400 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 23 0 -4 +BITMAP +0100 +0200 +0400 +0E00 +0F00 +0F00 +0600 +0000 +0060 +00E0 +3F00 +7380 +6180 +6180 +7380 +3F00 +6000 +7F80 +3FC0 +C1C0 +C0C0 +E180 +7F00 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 870 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +0100 +0380 +07C0 +0C60 +0000 +FCFC +7038 +7038 +7038 +7038 +7038 +7FF8 +7038 +7038 +7038 +7038 +7038 +7038 +FCFC +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 19 0 0 +BITMAP +1000 +3800 +7C00 +C600 +0000 +F000 +7000 +7000 +7000 +7000 +77C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 870 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +FCFC +7038 +7038 +7038 +FFFC +FFFC +7FF8 +7038 +7038 +7038 +7038 +7038 +7038 +FCFC +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +F000 +7000 +7000 +7C00 +7C00 +77C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 8 18 1 0 +BITMAP +31 +7E +8C +00 +7C +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +7C +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 8 13 -1 0 +BITMAP +31 +7E +8C +00 +78 +38 +38 +38 +38 +38 +38 +38 +7C +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 6 17 2 0 +BITMAP +FC +FC +00 +F8 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 6 12 -1 0 +BITMAP +FC +FC +00 +78 +38 +38 +38 +38 +38 +38 +38 +7C +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 6 18 2 0 +BITMAP +84 +CC +78 +00 +F8 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 6 13 -1 0 +BITMAP +84 +CC +78 +00 +78 +38 +38 +38 +38 +38 +38 +38 +7C +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 5 18 2 -4 +BITMAP +F8 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +30 +60 +68 +30 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 5 18 0 -4 +BITMAP +70 +70 +70 +00 +00 +F0 +70 +70 +70 +70 +70 +70 +70 +F8 +30 +60 +68 +30 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 5 17 2 0 +BITMAP +30 +30 +00 +F8 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 1070 0 +DWIDTH 21 0 +BBX 18 14 2 0 +BITMAP +F80FC0 +700380 +700380 +700380 +700380 +700380 +700380 +700380 +70C380 +71E380 +71E380 +718780 +708F00 +F87C00 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 704 0 +DWIDTH 12 0 +BBX 10 18 0 -4 +BITMAP +71C0 +71C0 +71C0 +0000 +0000 +F3C0 +71C0 +71C0 +71C0 +71C0 +71C0 +71C0 +71C0 +F9C0 +01C0 +1DC0 +1D80 +0F00 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 648 0 +DWIDTH 12 0 +BBX 11 19 0 0 +BITMAP +0100 +0380 +07C0 +0C60 +0000 +07E0 +01C0 +01C0 +01C0 +01C0 +01C0 +01C0 +01C0 +61C0 +F1C0 +F1C0 +C3C0 +4780 +3E00 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 352 0 +DWIDTH 6 0 +BBX 8 18 -3 -4 +BITMAP +08 +1C +3E +63 +00 +1E +0E +0E +0E +0E +0E +0E +0E +0E +0E +EE +EC +78 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 15 22 1 -8 +BITMAP +FC7C +7030 +7060 +70C0 +7180 +7300 +7780 +7FC0 +7BC0 +71E0 +70F0 +70F8 +707C +FCFE +0000 +0180 +03C0 +03C0 +01C0 +0080 +0100 +0200 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 22 0 -8 +BITMAP +F000 +7000 +7000 +7000 +7000 +73E0 +7180 +7200 +7600 +7F00 +7780 +73C0 +71E0 +FBF0 +0000 +0600 +0F00 +0F00 +0700 +0200 +0400 +0800 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 9 0 0 +BITMAP +73E0 +7180 +7200 +7600 +7F00 +7780 +73C0 +71E0 +FBF0 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 722 0 +DWIDTH 12 0 +BBX 11 19 1 0 +BITMAP +0600 +0E00 +1C00 +3000 +0000 +FC00 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7020 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 352 0 +DWIDTH 6 0 +BBX 5 19 0 0 +BITMAP +18 +38 +70 +C0 +00 +F0 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 722 0 +DWIDTH 12 0 +BBX 11 22 1 -8 +BITMAP +FC00 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7020 +7020 +7060 +70E0 +FFE0 +0000 +0C00 +1E00 +1E00 +0E00 +0400 +0800 +1000 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 352 0 +DWIDTH 6 0 +BBX 5 22 0 -8 +BITMAP +F0 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +00 +30 +78 +78 +38 +10 +20 +40 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 927 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +FC18 +703C +703C +701C +7008 +7010 +7020 +7000 +7000 +7020 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 575 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +F180 +73C0 +73C0 +71C0 +7080 +7100 +7200 +7000 +7000 +7000 +7000 +7000 +7000 +F800 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 964 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +FC00 +7000 +7000 +7000 +7000 +7000 +7000 +7018 +703C +703C +7038 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 612 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +F000 +7000 +7000 +7000 +7000 +7000 +7000 +7180 +73C0 +73C0 +7180 +7000 +7000 +F800 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 722 0 +DWIDTH 12 0 +BBX 12 14 -1 0 +BITMAP +7E00 +3C00 +3C00 +3C00 +3D00 +3E00 +3C00 +3C00 +7C00 +BC10 +3C10 +3C30 +3C70 +7FF0 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 352 0 +DWIDTH 6 0 +BBX 6 14 0 0 +BITMAP +F0 +70 +70 +70 +74 +78 +70 +F0 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 19 1 0 +BITMAP +00C0 +01C0 +0380 +0600 +0000 +F83E +7C1C +3C08 +3E08 +2F08 +2788 +2388 +21C8 +21E8 +20E8 +2078 +2078 +7038 +F818 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +F7C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 22 1 -8 +BITMAP +F83E +7C1C +3C08 +3E08 +2F08 +2788 +2388 +21C8 +21E8 +20E8 +2078 +2078 +7038 +F818 +0000 +0300 +0780 +0780 +0380 +0100 +0200 +0400 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 17 0 -8 +BITMAP +F7C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +0000 +0600 +0F00 +0F00 +0700 +0200 +0400 +0800 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 19 1 0 +BITMAP +18C0 +0F80 +0700 +0200 +0000 +F83E +7C1C +3C08 +3E08 +2F08 +2788 +2388 +21C8 +21E8 +20E8 +2078 +2078 +7038 +F818 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +3180 +1F00 +0E00 +0400 +0000 +F7C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 914 0 +DWIDTH 18 0 +BBX 17 14 0 0 +BITMAP +600000 +F00000 +F00000 +700000 +200000 +47BE00 +83CF00 +038700 +038700 +038700 +038700 +038700 +038700 +07CF80 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 18 1 -4 +BITMAP +F83E +7C1C +3C08 +3E08 +2F08 +2788 +2388 +21C8 +21E8 +20E8 +2078 +2078 +7038 +F838 +0038 +03B8 +03B0 +01E0 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 11 13 0 -4 +BITMAP +F7C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F8E0 +00E0 +0EE0 +0EC0 +0780 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 17 0 0 +BITMAP +07E0 +07E0 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 12 0 0 +BITMAP +1F80 +1F80 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 18 0 0 +BITMAP +0420 +0660 +03C0 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 13 0 0 +BITMAP +1080 +1980 +0F00 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0660 +0660 +0CC0 +0880 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +1980 +1980 +3300 +2200 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 1000 0 +DWIDTH 22 0 +BBX 21 14 0 0 +BITMAP +0FFFF8 +3C7C38 +783C18 +783C48 +F03C48 +F03CC0 +F03FC0 +F03CC0 +F03C40 +F03C48 +783C08 +783C18 +3C7C38 +0FFFF8 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 907 0 +DWIDTH 19 0 +BBX 18 9 0 0 +BITMAP +1F1E00 +71F380 +E0E1C0 +E0E1C0 +E0FFC0 +E0E000 +E0E040 +71F0C0 +1F1F00 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +FFE0 +70F0 +7070 +7070 +70F0 +71E0 +7F80 +71C0 +71E0 +70E0 +70E0 +70F0 +7074 +F878 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 519 0 +DWIDTH 9 0 +BBX 8 14 0 0 +BITMAP +06 +0E +1C +30 +00 +F7 +7B +73 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 14 22 1 -8 +BITMAP +FFE0 +70F0 +7070 +7070 +70F0 +71E0 +7F80 +71C0 +71E0 +70E0 +70E0 +70F0 +7074 +F878 +0000 +0300 +0780 +0780 +0380 +0100 +0200 +0400 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 519 0 +DWIDTH 9 0 +BBX 8 17 0 -8 +BITMAP +F7 +7B +73 +70 +70 +70 +70 +70 +F8 +00 +30 +78 +78 +38 +10 +20 +40 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +18C0 +0F80 +0700 +0200 +0000 +FFE0 +70F0 +7070 +7070 +70F0 +71E0 +7F80 +71C0 +71E0 +70E0 +70E0 +70F0 +7074 +F878 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 519 0 +DWIDTH 9 0 +BBX 8 14 0 0 +BITMAP +63 +3E +1C +08 +00 +F7 +7B +73 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 19 0 0 +BITMAP +0300 +0700 +0E00 +1800 +0000 +3F40 +61C0 +C0C0 +C040 +E000 +FE00 +7FC0 +7FE0 +0FE0 +80E0 +8060 +C060 +E0C0 +BF80 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0600 +0E00 +1C00 +3000 +0000 +3D00 +6300 +E100 +FC00 +7F00 +0F80 +8380 +C300 +BE00 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 19 0 0 +BITMAP +0400 +0E00 +1F00 +3180 +0000 +3F40 +61C0 +C0C0 +C040 +E000 +FE00 +7FC0 +7FE0 +0FE0 +80E0 +8060 +C060 +E0C0 +BF80 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0800 +1C00 +3E00 +6300 +0000 +3D00 +6300 +E100 +FC00 +7F00 +0F80 +8380 +C300 +BE00 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 18 0 -4 +BITMAP +3F40 +61C0 +C0C0 +C040 +E000 +FE00 +7FC0 +7FE0 +0FE0 +80E0 +8060 +C060 +E0C0 +BF80 +0800 +0E00 +0600 +1C00 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 13 0 -4 +BITMAP +3D00 +6300 +E100 +FC00 +7F00 +0F80 +8380 +C300 +BE00 +1000 +1C00 +0C00 +3800 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 14 0 0 +BITMAP +6180 +3300 +1E00 +0C00 +0000 +3F80 +7180 +7880 +7E00 +3F00 +0F80 +83C0 +C780 +BF00 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +C300 +6600 +3C00 +1800 +0000 +3D00 +6300 +E100 +FC00 +7F00 +0F80 +8380 +C300 +BE00 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +FFE0 +CE60 +CE60 +8E20 +8E20 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +1F00 +0800 +0E00 +0600 +1C00 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 426 0 +DWIDTH 8 0 +BBX 7 17 0 -4 +BITMAP +10 +30 +30 +70 +FC +70 +70 +70 +70 +70 +72 +72 +3C +20 +38 +18 +70 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +3180 +1F00 +0E00 +0400 +0000 +FFE0 +CE60 +CE60 +8E20 +8E20 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +1F00 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 646 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +0060 +10F0 +30F0 +3070 +7020 +FC40 +7080 +7000 +7000 +7000 +7000 +7200 +7200 +3C00 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFE0 +CE60 +CE60 +8E20 +8E20 +0E00 +1F00 +1F00 +0E00 +0E00 +0E00 +0E00 +0E00 +1F00 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 426 0 +DWIDTH 8 0 +BBX 7 13 0 0 +BITMAP +10 +30 +30 +70 +FC +70 +70 +70 +7C +7C +72 +72 +3C +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0620 +0FC0 +1180 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 13 0 0 +BITMAP +0C40 +1F80 +2300 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 17 1 0 +BITMAP +0FC0 +0FC0 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 12 0 0 +BITMAP +1F80 +1F80 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0840 +0CC0 +0780 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 13 0 0 +BITMAP +1080 +1980 +0F00 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +0300 +0480 +0480 +0300 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +0600 +0900 +0900 +0600 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +0CC0 +0CC0 +1980 +1100 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +0CC0 +0CC0 +1980 +1100 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 18 1 -4 +BITMAP +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +0600 +0C00 +0D00 +0600 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 13 0 -4 +BITMAP +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +0300 +0600 +0680 +0300 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 981 0 +DWIDTH 19 0 +BBX 19 19 0 0 +BITMAP +008000 +01C000 +03E000 +063000 +000000 +FBF3E0 +71E1C0 +70E180 +78E100 +38F100 +39F300 +3D7200 +1D3A00 +1F3E00 +1E3C00 +0E1C00 +0E1C00 +0C1800 +040800 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 16 14 -1 0 +BITMAP +0100 +0380 +07C0 +0C60 +0000 +FBE7 +71C2 +71C2 +39E4 +39E4 +1E78 +1E78 +0C30 +0C30 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 722 0 +DWIDTH 15 0 +BBX 13 19 1 0 +BITMAP +0200 +0700 +0F80 +18C0 +0000 +F878 +7030 +7820 +3860 +3C40 +1CC0 +1F80 +0F80 +0F00 +0700 +0700 +0700 +0700 +0F80 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 18 0 -4 +BITMAP +0800 +1C00 +3E00 +6300 +0000 +F8E0 +7040 +7040 +3880 +3880 +1D00 +1D00 +0E00 +0E00 +0400 +C400 +E800 +7000 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 722 0 +DWIDTH 15 0 +BBX 13 14 0 0 +BITMAP +0CC0 +0CC0 +0000 +0000 +0000 +FCF8 +7870 +3CE0 +1FC0 +0F80 +0780 +0780 +0780 +0FC0 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +FFE0 +E1E0 +C1C0 +83C0 +8780 +0700 +0F00 +1E00 +1C00 +3C20 +7820 +7060 +F0E0 +FFE0 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 537 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +06 +0E +1C +30 +00 +FF +CF +8E +1C +38 +39 +71 +F3 +FF +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +0600 +0600 +0000 +FFE0 +E1E0 +C1C0 +83C0 +8780 +0700 +0F00 +1E00 +1C00 +3C20 +7820 +7060 +F0E0 +FFE0 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 537 0 +DWIDTH 10 0 +BBX 8 12 0 0 +BITMAP +18 +18 +00 +FF +CF +8E +1C +38 +39 +71 +F3 +FF +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +30C0 +1980 +0F00 +0600 +0000 +FFF0 +C1E0 +83C0 +0780 +0F10 +1E10 +3C30 +7870 +FFF0 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 537 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +C3 +66 +3C +18 +00 +FF +C7 +8F +1E +3C +79 +F1 +E3 +FF +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +1F00 +63C0 +41E0 +80E0 +80F0 +0070 +0070 +0070 +8070 +80F0 +C0E0 +C1E0 +E3C0 +9F00 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +7FE0 +3878 +383C +381C +381E +380E +FE0E +380E +380E +381E +381C +383C +3878 +7FE0 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFE0 +E1C0 +C1C0 +81C0 +91C0 +11C0 +19C0 +1FC0 +19C0 +91C0 +91C0 +C1C0 +E1C0 +FFE0 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 574 0 +DWIDTH 12 0 +BBX 11 18 0 -4 +BITMAP +01C0 +0360 +0760 +0700 +0700 +1FC0 +0E00 +0E00 +0E00 +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +DC00 +D800 +7000 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 5 14 2 0 +BITMAP +F8 +70 +70 +70 +70 +70 +F8 +F8 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 352 0 +DWIDTH 6 0 +BBX 5 14 0 0 +BITMAP +F0 +70 +70 +70 +70 +70 +F8 +F8 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 17 18 -1 -4 +BITMAP +3E0F80 +1F0700 +0F0200 +0F8200 +0BC200 +09E200 +08E200 +087200 +087A00 +083A00 +0E1E00 +0E1E00 +0E0E00 +0E0600 +0E0000 +EE0000 +EC0000 +780000 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +0FE0 +3C78 +783C +701C +F01E +E00E +FFFE +FFFE +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 18 14 0 0 +BITMAP +0FE180 +3C7BC0 +783FC0 +701DC0 +F01E80 +E00F00 +E00E00 +E00E00 +E00E00 +F01E00 +701C00 +783C00 +3C7800 +0FE000 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 14 9 0 0 +BITMAP +1F18 +71FC +E0FC +E0FC +E0E8 +E0F0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +5F80 +70C0 +6060 +4060 +00E0 +0FE0 +7FC0 +FFC0 +FE00 +E020 +C020 +C060 +60E0 +3FA0 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +5E00 +6300 +4380 +1F80 +7F00 +F800 +E080 +6180 +3E80 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +FFE0 +CE60 +CE60 +8E20 +8E20 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0EE0 +06E0 +03C0 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 17 14 1 0 +BITMAP +F87F00 +703F80 +701780 +701380 +701100 +701200 +701400 +701000 +701000 +701000 +701000 +701000 +382000 +1FC000 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 15 9 0 0 +BITMAP +F1EC +70FE +70FE +70EE +70E4 +70E8 +70F0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFE0 +E1E0 +C1C0 +83C0 +8780 +0700 +1F00 +1F00 +1C00 +3C20 +7820 +7060 +F0E0 +FFE0 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 537 0 +DWIDTH 10 0 +BBX 8 9 0 0 +BITMAP +FF +CF +8E +3E +3E +39 +71 +F3 +FF +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1E00 +6700 +E380 +E380 +6380 +0380 +FF80 +FF80 +0E00 +1800 +3000 +6080 +FF80 +FF80 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +7F80 +7F00 +4000 +4000 +4000 +7E00 +4700 +0380 +0380 +6380 +E380 +E380 +6700 +3E00 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 2 14 4 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 9 14 1 -2 +BITMAP +0C00 +0C00 +0C00 +0C00 +FF80 +FF80 +0C00 +0C00 +FF80 +FF80 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 296 0 +DWIDTH 6 0 +BBX 4 14 1 0 +BITMAP +60 +F0 +F0 +F0 +F0 +F0 +60 +60 +60 +00 +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 19 0 0 +BITMAP +0C60 +07C0 +0380 +0100 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +6300 +3E00 +1C00 +0800 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 7 19 1 0 +BITMAP +C6 +7C +38 +10 +00 +7C +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +7C +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 7 14 -1 0 +BITMAP +C6 +7C +38 +10 +00 +78 +38 +38 +38 +38 +38 +38 +38 +7C +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0C60 +07C0 +0380 +0100 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +3180 +1F00 +0E00 +0400 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +18C0 +0F80 +0700 +0200 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +3180 +1F00 +0E00 +0400 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 20 1 0 +BITMAP +0FC0 +0FC0 +0000 +0CC0 +0CC0 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 15 0 0 +BITMAP +1F80 +1F80 +0000 +1980 +1980 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 22 1 0 +BITMAP +00C0 +01C0 +0380 +0600 +0000 +0CC0 +0CC0 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +1980 +1980 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 22 1 0 +BITMAP +0C60 +07C0 +0380 +0100 +0000 +0CC0 +0CC0 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +3180 +1F00 +0E00 +0400 +0000 +1980 +1980 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 22 1 0 +BITMAP +0C00 +0E00 +0700 +0180 +0000 +0CC0 +0CC0 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +1800 +1C00 +0E00 +0300 +0000 +1980 +1980 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +3E00 +C380 +81C0 +01C0 +FFC0 +E1C0 +E1C0 +7380 +1E00 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 20 0 0 +BITMAP +0FC0 +0FC0 +0000 +0CC0 +0CC0 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +3F00 +3F00 +0000 +3300 +3300 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 20 0 0 +BITMAP +0FC0 +0FC0 +0000 +0300 +0300 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +3F00 +3F00 +0000 +0C00 +0C00 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 981 0 +DWIDTH 21 0 +BBX 20 17 0 0 +BITMAP +007E00 +007E00 +000000 +03FFF0 +00B870 +01B830 +013890 +033890 +063980 +043F80 +0C3980 +1FF880 +103890 +203810 +203830 +603870 +F1FFF0 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 870 0 +DWIDTH 17 0 +BBX 16 12 0 0 +BITMAP +07E0 +07E0 +0000 +3F78 +63CE +E387 +0787 +3BFF +E380 +E381 +E7C3 +78FC +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 833 0 +DWIDTH 15 0 +BBX 14 14 1 0 +BITMAP +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E0F8 +F070 +7070 +787C +3CFC +0F90 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 15 0 -4 +BITMAP +0060 +00E0 +3F00 +7380 +6180 +6180 +7380 +3F00 +6000 +7F80 +FFE0 +FFE0 +C0C0 +E180 +7F00 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 833 0 +DWIDTH 15 0 +BBX 13 19 1 0 +BITMAP +18C0 +0F80 +0700 +0200 +0000 +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E0F8 +F070 +7070 +7870 +3CF0 +0F90 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 20 0 -4 +BITMAP +18C0 +0F80 +0700 +0200 +0000 +0060 +00E0 +3F00 +7380 +6180 +6180 +7380 +3F00 +6000 +7F80 +3FC0 +C1C0 +C0C0 +E180 +7F00 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 15 19 1 0 +BITMAP +18C0 +0F80 +0700 +0200 +0000 +FC7C +7030 +7060 +70C0 +7180 +7300 +7780 +7FC0 +7BC0 +71E0 +70F0 +70F8 +707C +FCFE +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 19 0 0 +BITMAP +C600 +7C00 +3800 +1000 +0000 +F000 +7000 +7000 +7000 +7000 +73E0 +7180 +7200 +7600 +7F00 +7780 +73C0 +71E0 +FBF0 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 18 0 -4 +BITMAP +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +0180 +0300 +0340 +0180 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 13 0 -4 +BITMAP +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +0600 +0C00 +0D00 +0600 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 21 0 -4 +BITMAP +07E0 +07E0 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +0180 +0300 +0340 +0180 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 16 0 -4 +BITMAP +1F80 +1F80 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +0600 +0C00 +0D00 +0600 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 352 0 +DWIDTH 6 0 +BBX 8 18 -3 -4 +BITMAP +63 +3E +1C +08 +00 +1E +0E +0E +0E +0E +0E +0E +0E +0E +0E +EE +EC +78 +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 833 0 +DWIDTH 15 0 +BBX 13 19 1 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E0F8 +F070 +7070 +7870 +3CF0 +0F90 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 20 0 -4 +BITMAP +0180 +0380 +0700 +0C00 +0000 +0060 +00E0 +3F00 +7380 +6180 +6180 +7380 +3F00 +6000 +7F80 +3FC0 +C1C0 +C0C0 +E180 +7F00 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 19 1 0 +BITMAP +0C00 +0E00 +0700 +0180 +0000 +F83E +7C1C +3C08 +3E08 +2F08 +2788 +2388 +21C8 +21E8 +20E8 +2078 +2078 +7038 +F818 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +1800 +1C00 +0E00 +0300 +0000 +F7C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 23 0 0 +BITMAP +00C0 +01C0 +0380 +0600 +0000 +0300 +0480 +0480 +0300 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 19 0 0 +BITMAP +0300 +0700 +0E00 +1800 +0000 +0C00 +1200 +1200 +0C00 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 981 0 +DWIDTH 21 0 +BBX 20 19 0 0 +BITMAP +000600 +000E00 +001C00 +003000 +000000 +03FFF0 +00B870 +01B830 +013890 +033890 +063980 +043F80 +0C3980 +1FF880 +103890 +203810 +203830 +603870 +F1FFF0 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 870 0 +DWIDTH 17 0 +BBX 16 14 0 0 +BITMAP +0060 +00E0 +01C0 +0300 +0000 +3F78 +63CE +E387 +0787 +3BFF +E380 +E381 +E7C3 +78FC +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +00C0 +01C0 +0380 +0600 +0000 +0FC8 +38F0 +7078 +7078 +E0BC +E11C +E21C +E21C +E41C +E83C +7038 +7078 +78F0 +8FC0 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 16 0 -1 +BITMAP +0300 +0700 +0E00 +1800 +0000 +0100 +1F00 +7380 +E3C0 +E5C0 +E5C0 +E9C0 +E9C0 +7380 +3E00 +2000 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 19 0 0 +BITMAP +1980 +1980 +0CC0 +0440 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +6600 +6600 +3300 +1100 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 18 0 0 +BITMAP +0780 +0CC0 +0840 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +1E00 +3300 +2100 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +3300 +3300 +1980 +0880 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +6600 +6600 +3300 +1100 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0F00 +1980 +1080 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +1E00 +3300 +2100 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 7 19 1 0 +BITMAP +CC +CC +66 +22 +00 +7C +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +7C +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 7 14 -2 0 +BITMAP +CC +CC +66 +22 +00 +3C +1C +1C +1C +1C +1C +1C +1C +3E +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 6 18 2 0 +BITMAP +78 +CC +84 +00 +F8 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 6 13 -1 0 +BITMAP +78 +CC +84 +00 +78 +38 +38 +38 +38 +38 +38 +38 +7C +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 19 0 0 +BITMAP +0CC0 +0CC0 +0660 +0220 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +3300 +3300 +1980 +0880 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 18 0 0 +BITMAP +03C0 +0660 +0420 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 13 0 0 +BITMAP +0F00 +1980 +1080 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +1980 +1980 +0CC0 +0440 +0000 +FFE0 +70F0 +7070 +7070 +70F0 +71E0 +7F80 +71C0 +71E0 +70E0 +70E0 +70F0 +7074 +F878 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 519 0 +DWIDTH 9 0 +BBX 8 14 0 0 +BITMAP +CC +CC +66 +22 +00 +F7 +7B +73 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0F00 +1980 +1080 +0000 +FFE0 +70F0 +7070 +7070 +70F0 +71E0 +7F80 +71C0 +71E0 +70E0 +70E0 +70F0 +7074 +F878 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 519 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3C +66 +42 +00 +F7 +7B +73 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +1980 +1980 +0CC0 +0440 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +3300 +3300 +1980 +0880 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0780 +0CC0 +0840 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 13 0 0 +BITMAP +0F00 +1980 +1080 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 22 0 -8 +BITMAP +3F40 +61C0 +C0C0 +C040 +E000 +FE00 +7FC0 +7FE0 +0FE0 +80E0 +8060 +C060 +E0C0 +BF80 +0000 +0C00 +1E00 +1E00 +0E00 +0400 +0800 +1000 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 17 0 -8 +BITMAP +3D00 +6300 +E100 +FC00 +7F00 +0F80 +8380 +C300 +BE00 +0000 +1800 +3C00 +3C00 +1C00 +0800 +1000 +2000 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 22 1 -8 +BITMAP +FFE0 +CE60 +CE60 +8E20 +8E20 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +1F00 +0000 +0600 +0F00 +0F00 +0700 +0200 +0400 +0800 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 426 0 +DWIDTH 8 0 +BBX 7 21 0 -8 +BITMAP +10 +30 +30 +70 +FC +70 +70 +70 +70 +70 +72 +72 +3C +00 +30 +78 +78 +38 +10 +20 +40 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 870 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +0C60 +07C0 +0380 +0100 +0000 +FCFC +7038 +7038 +7038 +7038 +7038 +7FF8 +7038 +7038 +7038 +7038 +7038 +7038 +FCFC +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 19 0 0 +BITMAP +C600 +7C00 +3800 +1000 +0000 +F000 +7000 +7000 +7000 +7000 +77C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 17 0 0 +BITMAP +0300 +0300 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 12 0 0 +BITMAP +0C00 +0C00 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +0800 +0E00 +0600 +1C00 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 13 0 -4 +BITMAP +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +0800 +0E00 +0600 +1C00 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +07E0 +07E0 +0000 +0660 +0660 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +1F80 +1F80 +0000 +1980 +1980 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 21 0 0 +BITMAP +07E0 +07E0 +0000 +0310 +07E0 +08C0 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 16 0 0 +BITMAP +3F00 +3F00 +0000 +1880 +3F00 +4600 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 17 0 0 +BITMAP +0180 +0180 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 12 0 0 +BITMAP +0600 +0600 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 20 0 0 +BITMAP +07E0 +07E0 +0000 +0180 +0180 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 15 0 0 +BITMAP +1F80 +1F80 +0000 +0600 +0600 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 722 0 +DWIDTH 15 0 +BBX 13 17 1 0 +BITMAP +1F80 +1F80 +0000 +F878 +7030 +7820 +3860 +3C40 +1CC0 +1F80 +0F80 +0F00 +0700 +0700 +0700 +0700 +0F80 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 16 0 -4 +BITMAP +3F00 +3F00 +0000 +F8E0 +7040 +7040 +3880 +3880 +1D00 +1D00 +0E00 +0E00 +0400 +C400 +E800 +7000 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +F780 +79C0 +71C0 +71C0 +7700 +7800 +70C0 +71C0 +3F80 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +7C00 +E700 +C380 +0380 +0380 +0380 +8380 +C700 +3C00 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +1E00 +7380 +E1C0 +E1C0 +FFC0 +01C0 +81C0 +C380 +3E00 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +3E00 +C380 +81C0 +01C0 +FFC0 +E1C0 +E1C0 +7380 +1E00 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 389 0 +DWIDTH 7 0 +BBX 8 14 0 -5 +BITMAP +1F +0E +0E +0E +0E +0E +0E +0E +3F +0E +0E +EE +EC +78 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 -5 +BITMAP +F9F0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EE0 +00E0 +00E0 +00E0 +00E0 +00F0 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +1F00 +71C0 +E0E0 +FFE0 +FFE0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 519 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +1F +0E +0E +0E +0E +0E +CE +DE +EF +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 426 0 +DWIDTH 8 0 +BBX 7 13 0 0 +BITMAP +78 +9C +9C +1C +1C +1C +1C +1C +7E +1C +18 +18 +10 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 426 0 +DWIDTH 8 0 +BBX 8 17 0 -4 +BITMAP +10 +30 +30 +70 +FC +70 +70 +70 +70 +70 +70 +70 +70 +70 +77 +37 +1E +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 9 0 0 +BITMAP +F1E0 +70E0 +70E0 +FFF0 +FFF0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 10 9 -1 0 +BITMAP +0C00 +0C00 +1E00 +1E00 +2700 +2700 +4380 +4380 +E7C0 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 16 9 -1 0 +BITMAP +0C30 +0C30 +1E78 +1E78 +279C +279C +438E +438E +E7DF +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 13 0 0 +BITMAP +01C0 +02E0 +0460 +0400 +0E00 +0E00 +1700 +1700 +2380 +2380 +41C0 +41C0 +E3E0 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 14 0 -5 +BITMAP +FDF0 +78E0 +3CE0 +1EE0 +0FE0 +06E0 +04E0 +18E0 +7CE0 +00E0 +00E0 +00E0 +00E0 +00F0 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 241 0 +DWIDTH 5 0 +BBX 4 7 0 7 +BITMAP +10 +20 +40 +E0 +F0 +F0 +60 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 241 0 +DWIDTH 5 0 +BBX 4 7 0 7 +BITMAP +60 +F0 +F0 +70 +20 +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 241 0 +DWIDTH 5 0 +BBX 4 7 0 7 +BITMAP +60 +F0 +F0 +E0 +40 +20 +10 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 7 4 0 10 +BITMAP +10 +38 +7C +C6 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 333 0 +DWIDTH 10 0 +BBX 7 4 1 10 +BITMAP +C6 +7C +38 +10 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 241 0 +DWIDTH 5 0 +BBX 2 5 1 9 +BITMAP +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 2 1 10 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni02CA +ENCODING 714 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 4 1 10 +BITMAP +18 +38 +70 +C0 +ENDCHAR +STARTCHAR uni02CB +ENCODING 715 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 4 1 10 +BITMAP +C0 +E0 +70 +18 +ENDCHAR +STARTCHAR uni02CD +ENCODING 717 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 2 1 -3 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni02CE +ENCODING 718 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 4 1 -5 +BITMAP +C0 +E0 +70 +18 +ENDCHAR +STARTCHAR uni02CF +ENCODING 719 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 4 1 -5 +BITMAP +18 +38 +70 +C0 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 3 1 10 +BITMAP +84 +CC +78 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 2 2 2 10 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 4 1 10 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 4 1 -4 +BITMAP +60 +C0 +D0 +60 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 333 0 +DWIDTH 10 0 +BBX 8 3 1 10 +BITMAP +31 +7E +8C +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 333 0 +DWIDTH 9 0 +BBX 7 4 1 10 +BITMAP +66 +66 +CC +88 +ENDCHAR +STARTCHAR uni02EE +ENCODING 750 +SWIDTH 481 0 +DWIDTH 10 0 +BBX 9 7 0 7 +BITMAP +6300 +F780 +F780 +7380 +2100 +4200 +8400 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +60 +F0 +F0 +60 +00 +60 +F0 +F0 +70 +20 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 4 1 10 +BITMAP +18 +38 +70 +C0 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 333 0 +DWIDTH 10 0 +BBX 6 7 2 10 +BITMAP +0C +1C +38 +60 +00 +CC +CC +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 4 4 0 3 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 13 0 -4 +BITMAP +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +7EF0 +6000 +7000 +7000 +2000 +ENDCHAR +STARTCHAR uni1E00 +ENCODING 7680 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 19 0 -5 +BITMAP +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +0000 +0180 +0240 +0240 +0180 +ENDCHAR +STARTCHAR uni1E01 +ENCODING 7681 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 14 0 -5 +BITMAP +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +0000 +0C00 +1200 +1200 +0C00 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 17 1 0 +BITMAP +0600 +0600 +0000 +FFC0 +71E0 +70E0 +70E0 +70E0 +71C0 +7F80 +70E0 +70F0 +7070 +7070 +7070 +70E0 +FF80 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 648 0 +DWIDTH 12 0 +BBX 12 17 -1 0 +BITMAP +1800 +1800 +0000 +F000 +7000 +7000 +7000 +7000 +7780 +78E0 +7070 +7070 +7070 +7070 +7070 +78E0 +6F80 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 17 1 -3 +BITMAP +FFC0 +71E0 +70E0 +70E0 +70E0 +71C0 +7F80 +70E0 +70F0 +7070 +7070 +7070 +70E0 +FF80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 648 0 +DWIDTH 12 0 +BBX 12 17 -1 -3 +BITMAP +F000 +7000 +7000 +7000 +7000 +7780 +78E0 +7070 +7070 +7070 +7070 +7070 +78E0 +6F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 17 1 -3 +BITMAP +FFC0 +71E0 +70E0 +70E0 +70E0 +71C0 +7F80 +70E0 +70F0 +7070 +7070 +7070 +70E0 +FF80 +0000 +1F80 +1F80 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 648 0 +DWIDTH 12 0 +BBX 12 17 -1 -3 +BITMAP +F000 +7000 +7000 +7000 +7000 +7780 +78E0 +7070 +7070 +7070 +7070 +7070 +78E0 +6F80 +0000 +1F80 +1F80 +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 23 1 -4 +BITMAP +0180 +0380 +0700 +0C00 +0000 +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E000 +F010 +7010 +7820 +3C60 +0F80 +0400 +0700 +0300 +0E00 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 18 0 -4 +BITMAP +0600 +0E00 +1C00 +3000 +0000 +1F00 +7380 +E180 +E000 +E000 +E000 +E080 +7180 +1E00 +1000 +1C00 +0C00 +3800 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 17 1 0 +BITMAP +0300 +0300 +0000 +FFC0 +70F0 +7078 +7038 +703C +701C +701C +701C +701C +703C +7038 +7078 +70F0 +FFC0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +0180 +0180 +0000 +01E0 +00E0 +00E0 +00E0 +00E0 +1EE0 +71E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71E0 +1EF0 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 17 1 -3 +BITMAP +FFC0 +70F0 +7078 +7038 +703C +701C +701C +701C +701C +703C +7038 +7078 +70F0 +FFC0 +0000 +0300 +0300 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 17 0 -3 +BITMAP +01E0 +00E0 +00E0 +00E0 +00E0 +1EE0 +71E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71E0 +1EF0 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 17 1 -3 +BITMAP +FFC0 +70F0 +7078 +7038 +703C +701C +701C +701C +701C +703C +7038 +7078 +70F0 +FFC0 +0000 +0FC0 +0FC0 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 17 0 -3 +BITMAP +01E0 +00E0 +00E0 +00E0 +00E0 +1EE0 +71E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71E0 +1EF0 +0000 +1F80 +1F80 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 18 1 -4 +BITMAP +FFC0 +70F0 +7078 +7038 +703C +701C +701C +701C +701C +703C +7038 +7078 +70F0 +FFC0 +0400 +0700 +0300 +0E00 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 18 0 -4 +BITMAP +01E0 +00E0 +00E0 +00E0 +00E0 +1EE0 +71E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71E0 +1EF0 +0400 +0700 +0300 +0E00 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 19 1 -5 +BITMAP +FFC0 +70F0 +7078 +7038 +703C +701C +701C +701C +701C +703C +7038 +7078 +70F0 +FFC0 +0000 +0200 +0700 +0F80 +18C0 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 19 0 -5 +BITMAP +01E0 +00E0 +00E0 +00E0 +00E0 +1EE0 +71E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71E0 +1EF0 +0000 +0200 +0700 +0F80 +18C0 +ENDCHAR +STARTCHAR uni1E14 +ENCODING 7700 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 22 1 0 +BITMAP +1800 +1C00 +0E00 +0300 +0000 +1F80 +1F80 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR uni1E15 +ENCODING 7701 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 17 0 0 +BITMAP +3000 +3800 +1C00 +0600 +0000 +3F00 +3F00 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR uni1E16 +ENCODING 7702 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 22 1 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +1F80 +1F80 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR uni1E17 +ENCODING 7703 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 17 0 0 +BITMAP +0300 +0700 +0E00 +1800 +0000 +3F00 +3F00 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR uni1E18 +ENCODING 7704 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 19 1 -5 +BITMAP +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +0000 +0400 +0E00 +1F00 +3180 +ENDCHAR +STARTCHAR uni1E19 +ENCODING 7705 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 14 0 -5 +BITMAP +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +0000 +0800 +1C00 +3E00 +6300 +ENDCHAR +STARTCHAR uni1E1A +ENCODING 7706 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +0000 +1880 +3F00 +4600 +ENDCHAR +STARTCHAR uni1E1B +ENCODING 7707 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 13 0 -4 +BITMAP +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +0000 +1880 +3F00 +4600 +ENDCHAR +STARTCHAR uni1E1C +ENCODING 7708 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 22 1 -4 +BITMAP +2100 +3300 +1E00 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +0800 +0E00 +0600 +1C00 +ENDCHAR +STARTCHAR uni1E1D +ENCODING 7709 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 17 0 -4 +BITMAP +2100 +3300 +1E00 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +0800 +0E00 +0600 +1C00 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +0600 +0600 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7320 +7F00 +7300 +7100 +7100 +7000 +7000 +7000 +F800 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 389 0 +DWIDTH 7 0 +BBX 8 17 0 0 +BITMAP +18 +18 +00 +1E +37 +77 +70 +70 +FC +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR uni1E20 +ENCODING 7712 +SWIDTH 833 0 +DWIDTH 15 0 +BBX 13 17 1 0 +BITMAP +1F80 +1F80 +0000 +0F90 +3C70 +7830 +7030 +F010 +E010 +E000 +E000 +E0F8 +F070 +7070 +7870 +3CF0 +0F90 +ENDCHAR +STARTCHAR uni1E21 +ENCODING 7713 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 18 0 -4 +BITMAP +1F80 +1F80 +0000 +0060 +00E0 +3F00 +7380 +6180 +6180 +7380 +3F00 +6000 +7F80 +3FC0 +C1C0 +C0C0 +E180 +7F00 +ENDCHAR +STARTCHAR uni1E22 +ENCODING 7714 +SWIDTH 870 0 +DWIDTH 16 0 +BBX 14 17 1 0 +BITMAP +0300 +0300 +0000 +FCFC +7038 +7038 +7038 +7038 +7038 +7FF8 +7038 +7038 +7038 +7038 +7038 +7038 +FCFC +ENDCHAR +STARTCHAR uni1E23 +ENCODING 7715 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +1800 +1800 +0000 +F000 +7000 +7000 +7000 +7000 +77C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +ENDCHAR +STARTCHAR uni1E24 +ENCODING 7716 +SWIDTH 870 0 +DWIDTH 16 0 +BBX 14 17 1 -3 +BITMAP +FCFC +7038 +7038 +7038 +7038 +7038 +7FF8 +7038 +7038 +7038 +7038 +7038 +7038 +FCFC +0000 +0300 +0300 +ENDCHAR +STARTCHAR uni1E25 +ENCODING 7717 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 17 0 -3 +BITMAP +F000 +7000 +7000 +7000 +7000 +77C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1E26 +ENCODING 7718 +SWIDTH 870 0 +DWIDTH 16 0 +BBX 14 17 1 0 +BITMAP +0CC0 +0CC0 +0000 +FCFC +7038 +7038 +7038 +7038 +7038 +7FF8 +7038 +7038 +7038 +7038 +7038 +7038 +FCFC +ENDCHAR +STARTCHAR uni1E27 +ENCODING 7719 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +6600 +6600 +0000 +F000 +7000 +7000 +7000 +7000 +77C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +ENDCHAR +STARTCHAR uni1E28 +ENCODING 7720 +SWIDTH 870 0 +DWIDTH 16 0 +BBX 14 18 1 -4 +BITMAP +FCFC +7038 +7038 +7038 +7038 +7038 +7FF8 +7038 +7038 +7038 +7038 +7038 +7038 +FCFC +0200 +0380 +0180 +0700 +ENDCHAR +STARTCHAR uni1E29 +ENCODING 7721 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 18 0 -4 +BITMAP +F000 +7000 +7000 +7000 +7000 +77C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +0400 +0700 +0300 +0E00 +ENDCHAR +STARTCHAR uni1E2A +ENCODING 7722 +SWIDTH 870 0 +DWIDTH 16 0 +BBX 14 18 1 -4 +BITMAP +FCFC +7038 +7038 +7038 +7038 +7038 +7FF8 +7038 +7038 +7038 +7038 +7038 +7038 +FCFC +0000 +0840 +0CC0 +0780 +ENDCHAR +STARTCHAR uni1E2B +ENCODING 7723 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 18 0 -4 +BITMAP +F000 +7000 +7000 +7000 +7000 +77C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +0000 +1080 +1980 +0F00 +ENDCHAR +STARTCHAR uni1E2C +ENCODING 7724 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 8 18 0 -4 +BITMAP +3E +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +3E +00 +31 +7E +8C +ENDCHAR +STARTCHAR uni1E2D +ENCODING 7725 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 8 18 -2 -4 +BITMAP +1C +1C +1C +00 +00 +3C +1C +1C +1C +1C +1C +1C +1C +3E +00 +31 +7E +8C +ENDCHAR +STARTCHAR uni1E2E +ENCODING 7726 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 6 22 2 0 +BITMAP +0C +1C +38 +60 +00 +CC +CC +00 +F8 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR uni1E2F +ENCODING 7727 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 6 17 0 0 +BITMAP +0C +1C +38 +60 +00 +CC +CC +00 +F0 +70 +70 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 15 19 1 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +FC7C +7030 +7060 +70C0 +7180 +7300 +7780 +7FC0 +7BC0 +71E0 +70F0 +70F8 +707C +FCFE +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 19 0 0 +BITMAP +0C00 +1C00 +3800 +6000 +0000 +F000 +7000 +7000 +7000 +7000 +73E0 +7180 +7200 +7600 +7F00 +7780 +73C0 +71E0 +FBF0 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 15 17 1 -3 +BITMAP +FC7C +7030 +7060 +70C0 +7180 +7300 +7780 +7FC0 +7BC0 +71E0 +70F0 +70F8 +707C +FCFE +0000 +0180 +0180 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 17 0 -3 +BITMAP +F000 +7000 +7000 +7000 +7000 +73E0 +7180 +7200 +7600 +7F00 +7780 +73C0 +71E0 +FBF0 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 15 17 1 -3 +BITMAP +FC7C +7030 +7060 +70C0 +7180 +7300 +7780 +7FC0 +7BC0 +71E0 +70F0 +70F8 +707C +FCFE +0000 +07E0 +07E0 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 17 0 -3 +BITMAP +F000 +7000 +7000 +7000 +7000 +73E0 +7180 +7200 +7600 +7F00 +7780 +73C0 +71E0 +FBF0 +0000 +1F80 +1F80 +ENDCHAR +STARTCHAR uni1E36 +ENCODING 7734 +SWIDTH 722 0 +DWIDTH 12 0 +BBX 11 17 1 -3 +BITMAP +FC00 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7020 +7020 +7060 +70E0 +FFE0 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1E37 +ENCODING 7735 +SWIDTH 352 0 +DWIDTH 6 0 +BBX 5 17 0 -3 +BITMAP +F0 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +00 +30 +30 +ENDCHAR +STARTCHAR uni1E38 +ENCODING 7736 +SWIDTH 722 0 +DWIDTH 12 0 +BBX 11 20 1 -3 +BITMAP +7E00 +7E00 +0000 +FC00 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7020 +7020 +7060 +70E0 +FFE0 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1E39 +ENCODING 7737 +SWIDTH 352 0 +DWIDTH 6 0 +BBX 6 20 -1 -3 +BITMAP +FC +FC +00 +78 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +7C +00 +18 +18 +ENDCHAR +STARTCHAR uni1E3A +ENCODING 7738 +SWIDTH 722 0 +DWIDTH 12 0 +BBX 11 17 1 -3 +BITMAP +FC00 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7020 +7020 +7060 +70E0 +FFE0 +0000 +3F00 +3F00 +ENDCHAR +STARTCHAR uni1E3B +ENCODING 7739 +SWIDTH 352 0 +DWIDTH 6 0 +BBX 6 17 0 -3 +BITMAP +F0 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +00 +FC +FC +ENDCHAR +STARTCHAR uni1E3C +ENCODING 7740 +SWIDTH 722 0 +DWIDTH 12 0 +BBX 11 19 1 -5 +BITMAP +FC00 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7000 +7020 +7020 +7060 +70E0 +FFE0 +0000 +0400 +0E00 +1F00 +3180 +ENDCHAR +STARTCHAR uni1E3D +ENCODING 7741 +SWIDTH 352 0 +DWIDTH 6 0 +BBX 7 19 -1 -5 +BITMAP +78 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +7C +00 +10 +38 +7C +C6 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 981 0 +DWIDTH 19 0 +BBX 17 19 1 0 +BITMAP +003000 +007000 +00E000 +018000 +000000 +7C0780 +3C0F00 +3E0F00 +2E1F00 +2F1700 +2F1700 +273700 +27A700 +23E700 +23C700 +23C700 +21C700 +718700 +F88F80 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 963 0 +DWIDTH 20 0 +BBX 19 14 0 0 +BITMAP +003000 +007000 +00E000 +018000 +000000 +F7DF80 +79F3C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +F9F3E0 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 981 0 +DWIDTH 19 0 +BBX 17 17 1 0 +BITMAP +00C000 +00C000 +000000 +7C0780 +3C0F00 +3E0F00 +2E1F00 +2F1700 +2F1700 +273700 +27A700 +23E700 +23C700 +23C700 +21C700 +718700 +F88F80 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 963 0 +DWIDTH 20 0 +BBX 19 12 0 0 +BITMAP +00C000 +00C000 +000000 +F7DF80 +79F3C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +F9F3E0 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 981 0 +DWIDTH 19 0 +BBX 17 17 1 -3 +BITMAP +7C0780 +3C0F00 +3E0F00 +2E1F00 +2F1700 +2F1700 +273700 +27A700 +23E700 +23C700 +23C700 +21C700 +718700 +F88F80 +000000 +00C000 +00C000 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 963 0 +DWIDTH 20 0 +BBX 19 12 0 -3 +BITMAP +F7DF80 +79F3C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +F9F3E0 +000000 +006000 +006000 +ENDCHAR +STARTCHAR uni1E44 +ENCODING 7748 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 17 1 0 +BITMAP +0300 +0300 +0000 +F83E +7C1C +3C08 +3E08 +2F08 +2788 +2388 +21C8 +21E8 +20E8 +2078 +2078 +7038 +F818 +ENDCHAR +STARTCHAR uni1E45 +ENCODING 7749 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 12 0 0 +BITMAP +0600 +0600 +0000 +F7C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +ENDCHAR +STARTCHAR uni1E46 +ENCODING 7750 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 17 1 -3 +BITMAP +F83E +7C1C +3C08 +3E08 +2F08 +2788 +2388 +21C8 +21E8 +20E8 +2078 +2078 +7038 +F818 +0000 +0300 +0300 +ENDCHAR +STARTCHAR uni1E47 +ENCODING 7751 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 12 0 -3 +BITMAP +F7C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1E48 +ENCODING 7752 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 17 1 -3 +BITMAP +F83E +7C1C +3C08 +3E08 +2F08 +2788 +2388 +21C8 +21E8 +20E8 +2078 +2078 +7038 +F818 +0000 +0FC0 +0FC0 +ENDCHAR +STARTCHAR uni1E49 +ENCODING 7753 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 12 0 -3 +BITMAP +F7C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +0000 +1F80 +1F80 +ENDCHAR +STARTCHAR uni1E4A +ENCODING 7754 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 19 1 -5 +BITMAP +F83E +7C1C +3C08 +3E08 +2F08 +2788 +2388 +21C8 +21E8 +20E8 +2078 +2078 +7038 +F818 +0000 +0100 +0380 +07C0 +0C60 +ENDCHAR +STARTCHAR uni1E4B +ENCODING 7755 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 -5 +BITMAP +F7C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +0000 +0200 +0700 +0F80 +18C0 +ENDCHAR +STARTCHAR uni1E4C +ENCODING 7756 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 23 0 0 +BITMAP +0060 +00E0 +01C0 +0300 +0000 +0310 +07E0 +08C0 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni1E4D +ENCODING 7757 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 18 0 0 +BITMAP +0300 +0700 +0E00 +1800 +0000 +1880 +3F00 +4600 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni1E4E +ENCODING 7758 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 21 0 0 +BITMAP +0660 +0660 +0000 +0310 +07E0 +08C0 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni1E4F +ENCODING 7759 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 16 0 0 +BITMAP +3300 +3300 +0000 +1880 +3F00 +4600 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni1E50 +ENCODING 7760 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 22 0 0 +BITMAP +0600 +0700 +0380 +00C0 +0000 +07E0 +07E0 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni1E51 +ENCODING 7761 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 17 0 0 +BITMAP +1800 +1C00 +0E00 +0300 +0000 +1F80 +1F80 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni1E52 +ENCODING 7762 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 22 0 0 +BITMAP +0060 +00E0 +01C0 +0300 +0000 +07E0 +07E0 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni1E53 +ENCODING 7763 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 17 0 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +1F80 +1F80 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +FFE0 +70F0 +7070 +7070 +7070 +70F0 +71E0 +7F80 +7000 +7000 +7000 +7000 +7000 +FC00 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 18 -1 -4 +BITMAP +0180 +0380 +0700 +0C00 +0000 +E780 +78E0 +7070 +7070 +7070 +7070 +7070 +78E0 +7780 +7000 +7000 +7000 +F800 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 12 17 1 0 +BITMAP +0600 +0600 +0000 +FFE0 +70F0 +7070 +7070 +7070 +70F0 +71E0 +7F80 +7000 +7000 +7000 +7000 +7000 +FC00 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 16 -1 -4 +BITMAP +0600 +0600 +0000 +E780 +78E0 +7070 +7070 +7070 +7070 +7070 +78E0 +7780 +7000 +7000 +7000 +F800 +ENDCHAR +STARTCHAR uni1E58 +ENCODING 7768 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 14 17 1 0 +BITMAP +0600 +0600 +0000 +FFE0 +70F0 +7070 +7070 +70F0 +71E0 +7F80 +71C0 +71E0 +70E0 +70E0 +70F0 +7074 +F878 +ENDCHAR +STARTCHAR uni1E59 +ENCODING 7769 +SWIDTH 519 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +18 +18 +00 +F7 +7B +73 +70 +70 +70 +70 +70 +F8 +ENDCHAR +STARTCHAR uni1E5A +ENCODING 7770 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 14 17 1 -3 +BITMAP +FFE0 +70F0 +7070 +7070 +70F0 +71E0 +7F80 +71C0 +71E0 +70E0 +70E0 +70F0 +7074 +F878 +0000 +0300 +0300 +ENDCHAR +STARTCHAR uni1E5B +ENCODING 7771 +SWIDTH 519 0 +DWIDTH 9 0 +BBX 8 12 0 -3 +BITMAP +F7 +7B +73 +70 +70 +70 +70 +70 +F8 +00 +30 +30 +ENDCHAR +STARTCHAR uni1E5C +ENCODING 7772 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 14 20 1 -3 +BITMAP +0FC0 +0FC0 +0000 +FFE0 +70F0 +7070 +7070 +70F0 +71E0 +7F80 +71C0 +71E0 +70E0 +70E0 +70F0 +7074 +F878 +0000 +0300 +0300 +ENDCHAR +STARTCHAR uni1E5D +ENCODING 7773 +SWIDTH 519 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +7E +7E +00 +F7 +7B +73 +70 +70 +70 +70 +70 +F8 +00 +30 +30 +ENDCHAR +STARTCHAR uni1E5E +ENCODING 7774 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 14 17 1 -3 +BITMAP +FFE0 +70F0 +7070 +7070 +70F0 +71E0 +7F80 +71C0 +71E0 +70E0 +70E0 +70F0 +7074 +F878 +0000 +0FC0 +0FC0 +ENDCHAR +STARTCHAR uni1E5F +ENCODING 7775 +SWIDTH 519 0 +DWIDTH 9 0 +BBX 8 12 0 -3 +BITMAP +F7 +7B +73 +70 +70 +70 +70 +70 +F8 +00 +FC +FC +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 17 0 0 +BITMAP +0C00 +0C00 +0000 +3F40 +61C0 +C0C0 +C040 +E000 +FE00 +7FC0 +7FE0 +0FE0 +80E0 +8060 +C060 +E0C0 +BF80 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 12 0 0 +BITMAP +1800 +1800 +0000 +3D00 +6300 +E100 +FC00 +7F00 +0F80 +8380 +C300 +BE00 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 17 0 -3 +BITMAP +3F40 +61C0 +C0C0 +C040 +E000 +FE00 +7FC0 +7FE0 +0FE0 +80E0 +8060 +C060 +E0C0 +BF80 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 12 0 -3 +BITMAP +3D00 +6300 +E100 +FC00 +7F00 +0F80 +8380 +C300 +BE00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 22 0 0 +BITMAP +0600 +0600 +0000 +0300 +0700 +0E00 +1800 +0000 +3F40 +61C0 +C0C0 +C040 +E000 +FE00 +7FC0 +7FE0 +0FE0 +80E0 +8060 +C060 +E0C0 +BF80 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 17 0 0 +BITMAP +0C00 +0C00 +0000 +0600 +0E00 +1C00 +3000 +0000 +3D00 +6300 +E100 +FC00 +7F00 +0F80 +8380 +C300 +BE00 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 17 0 0 +BITMAP +0C00 +0C00 +0000 +6180 +3300 +1E00 +0C00 +0000 +3F80 +7180 +7880 +7E00 +3F00 +0F80 +83C0 +C780 +BF00 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 17 0 0 +BITMAP +1800 +1800 +0000 +C300 +6600 +3C00 +1800 +0000 +3D00 +6300 +E100 +FC00 +7F00 +0F80 +8380 +C300 +BE00 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 20 0 -3 +BITMAP +0C00 +0C00 +0000 +3F40 +61C0 +C0C0 +C040 +E000 +FE00 +7FC0 +7FE0 +0FE0 +80E0 +8060 +C060 +E0C0 +BF80 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 15 0 -3 +BITMAP +1800 +1800 +0000 +3D00 +6300 +E100 +FC00 +7F00 +0F80 +8380 +C300 +BE00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +0600 +0600 +0000 +FFE0 +CE60 +CE60 +8E20 +8E20 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +1F00 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 426 0 +DWIDTH 8 0 +BBX 7 16 0 0 +BITMAP +30 +30 +00 +10 +30 +30 +70 +FC +70 +70 +70 +70 +70 +72 +72 +3C +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 17 1 -3 +BITMAP +FFE0 +CE60 +CE60 +8E20 +8E20 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +1F00 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 426 0 +DWIDTH 8 0 +BBX 7 16 0 -3 +BITMAP +10 +30 +30 +70 +FC +70 +70 +70 +70 +70 +72 +72 +3C +00 +30 +30 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 17 1 -3 +BITMAP +FFE0 +CE60 +CE60 +8E20 +8E20 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +1F00 +0000 +1F80 +1F80 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 426 0 +DWIDTH 8 0 +BBX 7 16 0 -3 +BITMAP +10 +30 +30 +70 +FC +70 +70 +70 +70 +70 +72 +72 +3C +00 +FC +FC +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 19 1 -5 +BITMAP +FFE0 +CE60 +CE60 +8E20 +8E20 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +1F00 +0000 +0400 +0E00 +1F00 +3180 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 426 0 +DWIDTH 8 0 +BBX 7 18 0 -5 +BITMAP +10 +30 +30 +70 +FC +70 +70 +70 +70 +70 +72 +72 +3C +00 +10 +38 +7C +C6 +ENDCHAR +STARTCHAR uni1E72 +ENCODING 7794 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 17 1 -3 +BITMAP +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +0000 +1980 +1980 +ENDCHAR +STARTCHAR uni1E73 +ENCODING 7795 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 12 0 -3 +BITMAP +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +0000 +1980 +1980 +ENDCHAR +STARTCHAR uni1E74 +ENCODING 7796 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 18 1 -4 +BITMAP +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +0000 +0C40 +1F80 +2300 +ENDCHAR +STARTCHAR uni1E75 +ENCODING 7797 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 13 0 -4 +BITMAP +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +0000 +0C40 +1F80 +2300 +ENDCHAR +STARTCHAR uni1E76 +ENCODING 7798 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 19 1 -5 +BITMAP +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +0000 +0200 +0700 +0F80 +18C0 +ENDCHAR +STARTCHAR uni1E77 +ENCODING 7799 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 14 0 -5 +BITMAP +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +0000 +0200 +0700 +0F80 +18C0 +ENDCHAR +STARTCHAR uni1E78 +ENCODING 7800 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 23 1 0 +BITMAP +00C0 +01C0 +0380 +0600 +0000 +0620 +0FC0 +1180 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR uni1E79 +ENCODING 7801 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0180 +0380 +0700 +0C00 +0000 +0C40 +1F80 +2300 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni1E7A +ENCODING 7802 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 20 1 0 +BITMAP +0CC0 +0CC0 +0000 +0FC0 +0FC0 +0000 +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +ENDCHAR +STARTCHAR uni1E7B +ENCODING 7803 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 15 0 0 +BITMAP +1980 +1980 +0000 +1F80 +1F80 +0000 +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni1E7C +ENCODING 7804 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 18 0 0 +BITMAP +0620 +0FC0 +1180 +0000 +F87C +7038 +7830 +3820 +3820 +3C60 +1C40 +1E40 +0EC0 +0E80 +0780 +0780 +0300 +0300 +ENDCHAR +STARTCHAR uni1E7D +ENCODING 7805 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 10 13 -1 0 +BITMAP +1880 +3F00 +4600 +0000 +F9C0 +7080 +7080 +3900 +3900 +1E00 +1E00 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1E7E +ENCODING 7806 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 17 0 -3 +BITMAP +F87C +7038 +7830 +3820 +3820 +3C60 +1C40 +1E40 +0EC0 +0E80 +0780 +0780 +0300 +0300 +0000 +0300 +0300 +ENDCHAR +STARTCHAR uni1E7F +ENCODING 7807 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 10 12 -1 -3 +BITMAP +F9C0 +7080 +7080 +3900 +3900 +1E00 +1E00 +0C00 +0C00 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 981 0 +DWIDTH 19 0 +BBX 19 19 0 0 +BITMAP +030000 +038000 +01C000 +006000 +000000 +FBF3E0 +71E1C0 +70E180 +78E100 +38F100 +39F300 +3D7200 +1D3A00 +1F3E00 +1E3C00 +0E1C00 +0E1C00 +0C1800 +040800 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 16 14 -1 0 +BITMAP +0600 +0700 +0380 +00C0 +0000 +FBE7 +71C2 +71C2 +39E4 +39E4 +1E78 +1E78 +0C30 +0C30 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 981 0 +DWIDTH 19 0 +BBX 19 19 0 0 +BITMAP +003000 +007000 +00E000 +018000 +000000 +FBF3E0 +71E1C0 +70E180 +78E100 +38F100 +39F300 +3D7200 +1D3A00 +1F3E00 +1E3C00 +0E1C00 +0E1C00 +0C1800 +040800 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 16 14 -1 0 +BITMAP +00C0 +01C0 +0380 +0600 +0000 +FBE7 +71C2 +71C2 +39E4 +39E4 +1E78 +1E78 +0C30 +0C30 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 981 0 +DWIDTH 19 0 +BBX 19 17 0 0 +BITMAP +033000 +033000 +000000 +FBF3E0 +71E1C0 +70E180 +78E100 +38F100 +39F300 +3D7200 +1D3A00 +1F3E00 +1E3C00 +0E1C00 +0E1C00 +0C1800 +040800 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 16 12 -1 0 +BITMAP +0CC0 +0CC0 +0000 +FBE7 +71C2 +71C2 +39E4 +39E4 +1E78 +1E78 +0C30 +0C30 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 981 0 +DWIDTH 19 0 +BBX 19 17 0 0 +BITMAP +00C000 +00C000 +000000 +FBF3E0 +71E1C0 +70E180 +78E100 +38F100 +39F300 +3D7200 +1D3A00 +1F3E00 +1E3C00 +0E1C00 +0E1C00 +0C1800 +040800 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 16 12 -1 0 +BITMAP +0300 +0300 +0000 +FBE7 +71C2 +71C2 +39E4 +39E4 +1E78 +1E78 +0C30 +0C30 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 981 0 +DWIDTH 19 0 +BBX 19 17 0 -3 +BITMAP +FBF3E0 +71E1C0 +70E180 +78E100 +38F100 +39F300 +3D7200 +1D3A00 +1F3E00 +1E3C00 +0E1C00 +0E1C00 +0C1800 +040800 +000000 +00C000 +00C000 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 16 12 -1 -3 +BITMAP +FBE7 +71C2 +71C2 +39E4 +39E4 +1E78 +1E78 +0C30 +0C30 +0000 +0180 +0180 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 722 0 +DWIDTH 17 0 +BBX 16 17 0 0 +BITMAP +0180 +0180 +0000 +7E3F +3C1C +1E18 +0E30 +0F60 +07C0 +03C0 +03E0 +06F0 +0C70 +1878 +303C +703E +F87F +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 12 0 0 +BITMAP +0C00 +0C00 +0000 +FCE0 +78C0 +3D00 +1E00 +0E00 +0F00 +1780 +63C0 +E7E0 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 722 0 +DWIDTH 17 0 +BBX 16 17 0 0 +BITMAP +0660 +0660 +0000 +7E3F +3C1C +1E18 +0E30 +0F60 +07C0 +03C0 +03E0 +06F0 +0C70 +1878 +303C +703E +F87F +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 12 0 0 +BITMAP +3300 +3300 +0000 +FCE0 +78C0 +3D00 +1E00 +0E00 +0F00 +1780 +63C0 +E7E0 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 722 0 +DWIDTH 15 0 +BBX 13 17 1 0 +BITMAP +0600 +0600 +0000 +F878 +7030 +7820 +3860 +3C40 +1CC0 +1F80 +0F80 +0F00 +0700 +0700 +0700 +0700 +0F80 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 16 0 -4 +BITMAP +0C00 +0C00 +0000 +F8E0 +7040 +7040 +3880 +3880 +1D00 +1D00 +0E00 +0E00 +0400 +C400 +E800 +7000 +ENDCHAR +STARTCHAR uni1E90 +ENCODING 7824 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +0400 +0E00 +1F00 +3180 +0000 +FFE0 +E1E0 +C1C0 +83C0 +8780 +0700 +0F00 +1E00 +1C00 +3C20 +7820 +7060 +F0E0 +FFE0 +ENDCHAR +STARTCHAR uni1E91 +ENCODING 7825 +SWIDTH 537 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +08 +1C +3E +63 +00 +FF +CF +8E +1C +38 +39 +71 +F3 +FF +ENDCHAR +STARTCHAR uni1E92 +ENCODING 7826 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 17 1 -3 +BITMAP +FFE0 +E1E0 +C1C0 +83C0 +8780 +0700 +0F00 +1E00 +1C00 +3C20 +7820 +7060 +F0E0 +FFE0 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1E93 +ENCODING 7827 +SWIDTH 537 0 +DWIDTH 10 0 +BBX 8 12 0 -3 +BITMAP +FF +CF +8E +1C +38 +39 +71 +F3 +FF +00 +18 +18 +ENDCHAR +STARTCHAR uni1E94 +ENCODING 7828 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 17 1 -3 +BITMAP +FFE0 +E1E0 +C1C0 +83C0 +8780 +0700 +0F00 +1E00 +1C00 +3C20 +7820 +7060 +F0E0 +FFE0 +0000 +3F00 +3F00 +ENDCHAR +STARTCHAR uni1E95 +ENCODING 7829 +SWIDTH 537 0 +DWIDTH 10 0 +BBX 8 12 0 -3 +BITMAP +FF +CF +8E +1C +38 +39 +71 +F3 +FF +00 +7E +7E +ENDCHAR +STARTCHAR uni1E96 +ENCODING 7830 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 17 0 -3 +BITMAP +F000 +7000 +7000 +7000 +7000 +77C0 +79E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +F9F0 +0000 +1F80 +1F80 +ENDCHAR +STARTCHAR uni1E97 +ENCODING 7831 +SWIDTH 426 0 +DWIDTH 8 0 +BBX 7 16 0 0 +BITMAP +CC +CC +00 +10 +30 +30 +70 +FC +70 +70 +70 +70 +70 +72 +72 +3C +ENDCHAR +STARTCHAR uni1E98 +ENCODING 7832 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 16 14 -1 0 +BITMAP +0300 +0480 +0480 +0300 +0000 +FBE7 +71C2 +71C2 +39E4 +39E4 +1E78 +1E78 +0C30 +0C30 +ENDCHAR +STARTCHAR uni1E99 +ENCODING 7833 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 18 0 -4 +BITMAP +0C00 +1200 +1200 +0C00 +0000 +F8E0 +7040 +7040 +3880 +3880 +1D00 +1D00 +0E00 +0E00 +0400 +C400 +E800 +7000 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 17 0 -3 +BITMAP +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +0000 +0180 +0180 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 12 0 -3 +BITMAP +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 23 0 0 +BITMAP +00C0 +01C0 +0380 +0600 +0000 +0380 +07C0 +0C60 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +0300 +0700 +0E00 +1800 +0000 +1C00 +3E00 +6300 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 23 0 0 +BITMAP +0C00 +0E00 +0700 +0180 +0000 +0380 +07C0 +0C60 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +3000 +3800 +1C00 +0600 +0000 +1C00 +3E00 +6300 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 22 0 0 +BITMAP +0310 +07E0 +08C0 +0000 +0380 +07C0 +0C60 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 17 0 0 +BITMAP +1880 +3F00 +4600 +0000 +1C00 +3E00 +6300 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 22 0 -3 +BITMAP +0200 +0700 +0F80 +18C0 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +0000 +0180 +0180 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 17 0 -3 +BITMAP +0400 +0E00 +1F00 +3180 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 23 0 0 +BITMAP +00C0 +01C0 +0380 +0600 +0000 +0840 +0CC0 +0780 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +0300 +0700 +0E00 +1800 +0000 +2100 +3300 +1E00 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 23 0 0 +BITMAP +0C00 +0E00 +0700 +0180 +0000 +0840 +0CC0 +0780 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +3000 +3800 +1C00 +0600 +0000 +2100 +3300 +1E00 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 22 0 0 +BITMAP +0620 +0FC0 +1180 +0000 +0840 +0CC0 +0780 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 17 0 0 +BITMAP +1880 +3F00 +4600 +0000 +2100 +3300 +1E00 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 21 0 -3 +BITMAP +0840 +0CC0 +0780 +0000 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +0000 +0180 +0180 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 16 0 -3 +BITMAP +2100 +3300 +1E00 +0000 +7F00 +E380 +C380 +0780 +3B80 +E380 +E380 +E780 +7BC0 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1EB8 +ENCODING 7864 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 17 1 -3 +BITMAP +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1EB9 +ENCODING 7865 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 12 0 -3 +BITMAP +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1EBC +ENCODING 7868 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0C40 +1F80 +2300 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR uni1EBD +ENCODING 7869 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +1880 +3F00 +4600 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 23 1 0 +BITMAP +0300 +0700 +0E00 +1800 +0000 +0E00 +1F00 +3180 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +0300 +0700 +0E00 +1800 +0000 +0E00 +1F00 +3180 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 23 1 0 +BITMAP +1800 +1C00 +0E00 +0300 +0000 +0E00 +1F00 +3180 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +3000 +3800 +1C00 +0600 +0000 +0E00 +1F00 +3180 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 22 1 0 +BITMAP +0C40 +1F80 +2300 +0000 +0E00 +1F00 +3180 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 17 0 0 +BITMAP +0C40 +1F80 +2300 +0000 +0E00 +1F00 +3180 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 22 1 -3 +BITMAP +0400 +0E00 +1F00 +3180 +0000 +FFE0 +70E0 +7060 +7120 +7120 +7300 +7F00 +7300 +7100 +7120 +7020 +7060 +70E0 +FFE0 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 10 17 0 -3 +BITMAP +0400 +0E00 +1F00 +3180 +0000 +1E00 +7380 +E1C0 +E1C0 +FFC0 +E000 +E040 +70C0 +1F00 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 444 0 +DWIDTH 9 0 +BBX 5 17 2 -3 +BITMAP +F8 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +F8 +00 +30 +30 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 5 17 0 -3 +BITMAP +70 +70 +70 +00 +00 +F0 +70 +70 +70 +70 +70 +70 +70 +F8 +00 +30 +30 +ENDCHAR +STARTCHAR uni1ECC +ENCODING 7884 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 17 0 -3 +BITMAP +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +0000 +0180 +0180 +ENDCHAR +STARTCHAR uni1ECD +ENCODING 7885 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 12 0 -3 +BITMAP +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 23 0 0 +BITMAP +00C0 +01C0 +0380 +0600 +0000 +0380 +07C0 +0C60 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 18 0 0 +BITMAP +0300 +0700 +0E00 +1800 +0000 +0E00 +1F00 +3180 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 23 0 0 +BITMAP +0600 +0700 +0380 +00C0 +0000 +0380 +07C0 +0C60 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 18 0 0 +BITMAP +1800 +1C00 +0E00 +0300 +0000 +0E00 +1F00 +3180 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 22 0 0 +BITMAP +0310 +07E0 +08C0 +0000 +0380 +07C0 +0C60 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 17 0 0 +BITMAP +0C40 +1F80 +2300 +0000 +0E00 +1F00 +3180 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 22 0 -3 +BITMAP +0100 +0380 +07C0 +0C60 +0000 +0FE0 +3C78 +783C +701C +F01E +E00E +E00E +E00E +E00E +F01E +701C +783C +3C78 +0FE0 +0000 +0180 +0180 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 17 0 -3 +BITMAP +0400 +0E00 +1F00 +3180 +0000 +1F00 +71C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +1F00 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 18 19 0 0 +BITMAP +001800 +003800 +007000 +00C000 +000000 +0FE180 +3C7BC0 +783FC0 +701DC0 +F01E80 +E00F00 +E00E00 +E00E00 +E00E00 +F01E00 +701C00 +783C00 +3C7800 +0FE000 +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 14 14 0 0 +BITMAP +00C0 +01C0 +0380 +0600 +0000 +1F18 +71FC +E0FC +E0FC +E0E8 +E0F0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 18 19 0 0 +BITMAP +018000 +01C000 +00E000 +003000 +000000 +0FE180 +3C7BC0 +783FC0 +701DC0 +F01E80 +E00F00 +E00E00 +E00E00 +E00E00 +F01E00 +701C00 +783C00 +3C7800 +0FE000 +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 14 14 0 0 +BITMAP +0600 +0700 +0380 +00C0 +0000 +1F18 +71FC +E0FC +E0FC +E0E8 +E0F0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 18 18 0 0 +BITMAP +00C400 +01F800 +023000 +000000 +0FE180 +3C7BC0 +783FC0 +701DC0 +F01E80 +E00F00 +E00E00 +E00E00 +E00E00 +F01E00 +701C00 +783C00 +3C7800 +0FE000 +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 14 13 0 0 +BITMAP +0310 +07E0 +08C0 +0000 +1F18 +71FC +E0FC +E0FC +E0E8 +E0F0 +E0E0 +71C0 +1F00 +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 18 17 0 -3 +BITMAP +0FE180 +3C7BC0 +783FC0 +701DC0 +F01E80 +E00F00 +E00E00 +E00E00 +E00E00 +F01E00 +701C00 +783C00 +3C7800 +0FE000 +000000 +018000 +018000 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 14 12 0 -3 +BITMAP +1F18 +71FC +E0FC +E0FC +E0E8 +E0F0 +E0E0 +71C0 +1F00 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 17 1 -3 +BITMAP +F87C +7038 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +7010 +3820 +1FC0 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 12 12 0 -3 +BITMAP +F1E0 +70E0 +70E0 +70E0 +70E0 +70E0 +70E0 +79E0 +3EF0 +0000 +0600 +0600 +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 17 19 1 0 +BITMAP +003000 +007000 +00E000 +018000 +000000 +F87F00 +703F80 +701780 +701380 +701100 +701200 +701400 +701000 +701000 +701000 +701000 +701000 +382000 +1FC000 +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 15 14 0 0 +BITMAP +0060 +00E0 +01C0 +0300 +0000 +F1EC +70FE +70FE +70EE +70E4 +70E8 +70F0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 17 19 1 0 +BITMAP +030000 +038000 +01C000 +006000 +000000 +F87F00 +703F80 +701780 +701380 +701100 +701200 +701400 +701000 +701000 +701000 +701000 +701000 +382000 +1FC000 +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 15 14 0 0 +BITMAP +0600 +0700 +0380 +00C0 +0000 +F1EC +70FE +70FE +70EE +70E4 +70E8 +70F0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 17 18 1 0 +BITMAP +018800 +03F000 +046000 +000000 +F87F00 +703F80 +701780 +701380 +701100 +701200 +701400 +701000 +701000 +701000 +701000 +701000 +382000 +1FC000 +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 15 13 0 0 +BITMAP +0310 +07E0 +08C0 +0000 +F1EC +70FE +70FE +70EE +70E4 +70E8 +70F0 +79E0 +3EF0 +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 17 17 1 -3 +BITMAP +F87F00 +703F80 +701780 +701380 +701100 +701200 +701400 +701000 +701000 +701000 +701000 +701000 +382000 +1FC000 +000000 +030000 +030000 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 685 0 +DWIDTH 13 0 +BBX 15 12 0 -3 +BITMAP +F1EC +70FE +70FE +70EE +70E4 +70E8 +70F0 +79E0 +3EF0 +0000 +0300 +0300 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 722 0 +DWIDTH 15 0 +BBX 13 19 1 0 +BITMAP +1800 +1C00 +0E00 +0300 +0000 +F878 +7030 +7820 +3860 +3C40 +1CC0 +1F80 +0F80 +0F00 +0700 +0700 +0700 +0700 +0F80 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 18 0 -4 +BITMAP +3000 +3800 +1C00 +0600 +0000 +F8E0 +7040 +7040 +3880 +3880 +1D00 +1D00 +0E00 +0E00 +0400 +C400 +E800 +7000 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 722 0 +DWIDTH 15 0 +BBX 13 17 1 -3 +BITMAP +F878 +7030 +7820 +3860 +3C40 +1CC0 +1F80 +0F80 +0F00 +0700 +0700 +0700 +0700 +0F80 +0000 +0300 +0300 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 16 0 -7 +BITMAP +F8E0 +7040 +7040 +3880 +3880 +1D00 +1D00 +0E00 +0E00 +0400 +C400 +E800 +7000 +0000 +1800 +1800 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 722 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0C40 +1F80 +2300 +0000 +F878 +7030 +7820 +3860 +3C40 +1CC0 +1F80 +0F80 +0F00 +0700 +0700 +0700 +0700 +0F80 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 11 17 0 -4 +BITMAP +1880 +3F00 +4600 +0000 +F8E0 +7040 +7040 +3880 +3880 +1D00 +1D00 +0E00 +0E00 +0400 +C400 +E800 +7000 +ENDCHAR +STARTCHAR uni2000 +ENCODING 8192 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2001 +ENCODING 8193 +SWIDTH 1000 0 +DWIDTH 19 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2002 +ENCODING 8194 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2003 +ENCODING 8195 +SWIDTH 1000 0 +DWIDTH 19 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2004 +ENCODING 8196 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2005 +ENCODING 8197 +SWIDTH 250 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2006 +ENCODING 8198 +SWIDTH 167 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2007 +ENCODING 8199 +SWIDTH 574 0 +DWIDTH 11 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2008 +ENCODING 8200 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2009 +ENCODING 8201 +SWIDTH 200 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni200A +ENCODING 8202 +SWIDTH 100 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni200B +ENCODING 8203 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 2 0 4 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 2 0 4 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 2 0 4 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 2 0 4 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 1000 0 +DWIDTH 18 0 +BBX 18 2 0 4 +BITMAP +FFFFC0 +FFFFC0 +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 1000 0 +DWIDTH 18 0 +BBX 18 2 0 4 +BITMAP +FFFFC0 +FFFFC0 +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 241 0 +DWIDTH 5 0 +BBX 4 7 0 7 +BITMAP +10 +20 +40 +E0 +F0 +F0 +60 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 241 0 +DWIDTH 5 0 +BBX 4 7 0 7 +BITMAP +60 +F0 +F0 +70 +20 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 241 0 +DWIDTH 6 0 +BBX 4 7 1 -3 +BITMAP +60 +F0 +F0 +70 +20 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 241 0 +DWIDTH 5 0 +BBX 4 7 0 7 +BITMAP +60 +F0 +F0 +E0 +40 +20 +10 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 481 0 +DWIDTH 10 0 +BBX 9 7 0 7 +BITMAP +1080 +2100 +4200 +E700 +F780 +F780 +6300 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 481 0 +DWIDTH 10 0 +BBX 9 7 0 7 +BITMAP +6300 +F780 +F780 +7380 +2100 +4200 +8400 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 481 0 +DWIDTH 11 0 +BBX 9 7 1 -3 +BITMAP +6300 +F780 +F780 +7380 +2100 +4200 +8400 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 481 0 +DWIDTH 10 0 +BBX 9 7 0 7 +BITMAP +6300 +F780 +F780 +E700 +4200 +2100 +1080 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 16 0 -2 +BITMAP +1C00 +1C00 +0800 +C980 +FF80 +C980 +0800 +1C00 +1C00 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 16 0 -2 +BITMAP +1C00 +1C00 +0800 +C980 +FF80 +C980 +0800 +1C00 +1C00 +0800 +C980 +FF80 +C980 +0800 +1C00 +1C00 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 6 6 2 4 +BITMAP +78 +FC +FC +FC +FC +78 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 1000 0 +DWIDTH 18 0 +BBX 16 4 1 0 +BITMAP +6186 +F3CF +F3CF +6186 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 1000 0 +DWIDTH 22 0 +BBX 21 15 0 -1 +BITMAP +38C000 +674000 +C4C000 +C48000 +C58000 +C90000 +730000 +023870 +0664C8 +04C588 +0CC588 +08C588 +18C990 +1070E0 +100000 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 5 0 3 +BITMAP +30 +60 +C0 +60 +30 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 5 0 3 +BITMAP +C0 +60 +30 +60 +C0 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 167 0 +DWIDTH 3 0 +BBX 8 14 -3 0 +BITMAP +03 +03 +06 +06 +0C +0C +18 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 344 0 +DWIDTH 6 0 +BBX 6 8 0 -4 +BITMAP +30 +F0 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 344 0 +DWIDTH 6 0 +BBX 6 8 0 -4 +BITMAP +78 +CC +CC +18 +30 +60 +C4 +FC +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 344 0 +DWIDTH 6 0 +BBX 6 8 0 -4 +BITMAP +78 +CC +0C +38 +0C +CC +CC +78 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 963 0 +DWIDTH 20 0 +BBX 19 14 0 -2 +BITMAP +001800 +001800 +001800 +F7FF80 +79F3C0 +70F1C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +F9F3E0 +018000 +018000 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +F83E +7C1C +3C08 +3E08 +3FF8 +3FF8 +2388 +21C8 +3FF8 +3FF8 +2078 +2078 +7038 +F818 +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 981 0 +DWIDTH 19 0 +BBX 19 14 0 0 +BITMAP +FBF3E0 +71E1C0 +70E180 +78E100 +3FFD00 +3FFF00 +3D7200 +1D3A00 +1FFE00 +1FFC00 +0E1C00 +0E1C00 +0C1800 +040800 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 14 14 -1 0 +BITMAP +03E4 +0F1C +1E0C +1C0C +FF84 +FF84 +3800 +3800 +FF80 +FF84 +1C04 +1E08 +0F18 +03E0 +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +FC7C +7030 +7060 +70C0 +7180 +7300 +FFFE +FFFE +7BC0 +71E0 +70F0 +70F8 +707C +FCFE +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 1158 0 +DWIDTH 21 0 +BBX 20 14 0 0 +BITMAP +780F90 +CC3C70 +847830 +847030 +CCF010 +78E010 +00E000 +00E000 +00E000 +00F010 +007010 +007820 +003C60 +000F80 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 1102 0 +DWIDTH 20 0 +BBX 19 14 0 0 +BITMAP +78FFE0 +CC70E0 +847060 +847120 +CC7120 +787320 +007F00 +007300 +007100 +007100 +007000 +007000 +007000 +00F800 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 1000 0 +DWIDTH 20 0 +BBX 19 8 0 6 +BITMAP +FFF1E0 +9971C0 +185AC0 +185AC0 +185AC0 +184CC0 +184CC0 +3CEDE0 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 815 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +FC7C +7030 +7060 +70C0 +7180 +7300 +7780 +7FC0 +7BC0 +71E0 +70F0 +70F8 +707C +FCFE +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 18 0 0 +BITMAP +0300 +0480 +0480 +0300 +0300 +0300 +0780 +0780 +0F80 +09C0 +09C0 +19E0 +10E0 +3FE0 +20F0 +6070 +4078 +E0FC +ENDCHAR +STARTCHAR uni2132 +ENCODING 8498 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +03E0 +01C0 +01C0 +01C0 +11C0 +11C0 +19C0 +1FC0 +99C0 +91C0 +91C0 +C1C0 +E1C0 +FFE0 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 759 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +E0FC +4078 +6070 +20F0 +3FE0 +10E0 +19E0 +09C0 +09C0 +0F80 +0780 +0780 +0300 +0300 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFE0 +E1C0 +C1C0 +91C0 +91C0 +19C0 +1FC0 +19C0 +11C0 +91C0 +81C0 +C1C0 +E1C0 +FFE0 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 759 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFE0 +E1C0 +C1C0 +93C0 +93C0 +1BC0 +1FC0 +1FC0 +17C0 +9DC0 +8DC0 +CDC0 +F9C0 +FFE0 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 606 0 +DWIDTH 10 0 +BBX 9 2 0 4 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 167 0 +DWIDTH 3 0 +BBX 8 14 -3 0 +BITMAP +03 +03 +06 +06 +0C +0C +18 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 4 4 0 3 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +60 +F0 +F0 +60 +00 +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 9 11 1 2 +BITMAP +0800 +1C00 +3E00 +6300 +0000 +FF80 +FF80 +0000 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR uni225A +ENCODING 8794 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 9 11 1 2 +BITMAP +6300 +3E00 +1C00 +0800 +0000 +FF80 +FF80 +0000 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 9 14 1 -2 +BITMAP +0300 +0300 +0300 +0600 +FF80 +FF80 +0C00 +0C00 +FF80 +FF80 +1800 +1800 +3000 +3000 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 9 8 0 1 +BITMAP +FF80 +FF80 +0000 +FF80 +FF80 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 9 14 0 -2 +BITMAP +0300 +0300 +0300 +FF80 +FF80 +0600 +FF80 +FF80 +0C00 +FF80 +FF80 +1800 +3000 +3000 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 10 13 0 -3 +BITMAP +00C0 +03C0 +0F00 +3C00 +F000 +F000 +3C00 +0F00 +03C0 +00C0 +0000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 10 13 0 -3 +BITMAP +C000 +F000 +3C00 +0F00 +03C0 +03C0 +0F00 +3C00 +F000 +C000 +0000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 10 14 0 -2 +BITMAP +0300 +0300 +03C0 +07C0 +0F00 +3E00 +FC00 +FC00 +3C00 +1F00 +1BC0 +18C0 +3000 +3000 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 10 14 0 -2 +BITMAP +0300 +0300 +C300 +F600 +3E00 +0F00 +0FC0 +0FC0 +0F00 +3C00 +F800 +D800 +3000 +3000 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 10 14 0 -3 +BITMAP +0300 +03C0 +03C0 +0F00 +3E00 +F600 +FC00 +3C00 +0F00 +1BC0 +18C0 +1800 +FFC0 +FFC0 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 606 0 +DWIDTH 11 0 +BBX 10 14 0 -3 +BITMAP +0300 +C300 +F300 +3E00 +0F00 +07C0 +0FC0 +0F00 +3C00 +F800 +D800 +1800 +FFC0 +FFC0 +ENDCHAR +STARTCHAR fi +ENCODING -1 +SWIDTH 685 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +0F80 +39C0 +31C0 +7000 +7000 +FFC0 +71C0 +71C0 +71C0 +71C0 +71C0 +71C0 +71C0 +FBE0 +ENDCHAR +STARTCHAR fl +ENCODING -1 +SWIDTH 685 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +1EC0 +33C0 +71C0 +71C0 +71C0 +FFC0 +71C0 +71C0 +71C0 +71C0 +71C0 +71C0 +71C0 +FBE0 +ENDCHAR +ENDFONT diff --git a/2.5/bertos/fonts/ncenB18.c b/2.5/bertos/fonts/ncenB18.c new file mode 100644 index 00000000..3a1f8157 --- /dev/null +++ b/2.5/bertos/fonts/ncenB18.c @@ -0,0 +1,1508 @@ +/* Generated by convbdf on Thu Apr 8 18:53:54 CEST 2010. */ +#include + +/* Font information: + + name: -Adobe-New Century Schoolbook-Bold-R-Normal--18-180-75-75-P-113-ISO10646-1 + pixel size: 18 + ascent: 16 + descent: 4 +*/ + +/* Font character bitmap data. */ +static const PROGMEM uint8_t font_ncenB18_glyphs[] = { + +/* Character (0x00): bbw=13, bbh=13, bbx=1, bby=0, width=16 */ +0x00, 0xa8, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xa8, 0x00, 0x00, /* * * * * * * * * * * * */ +0x00, 0xaa, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xaa, 0x00, 0x00, /* * * * * * * * * * * * * * * * * * * * * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Character (0x20): bbw=1, bbh=1, bbx=0, bby=0, width=5 */ +0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, 0x00, 0x00, /* */ + +/* Character (0x21): bbw=4, bbh=14, bbx=1, bby=0, width=6 */ +0x00, 0xf8, 0xfc, 0xfc, 0xf8, 0x00, /* ***** ****** ****** ***** */ +0x00, 0x60, 0xf7, 0xf7, 0x60, 0x00, /* ***** ****** ****** ***** ** *** ******* **** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ***** ****** ****** ***** ** *** ******* **** ** */ + +/* Character (0x22): bbw=5, bbh=5, bbx=1, bby=9, width=8 */ +0x00, 0x7c, 0x7c, 0x00, 0x7c, 0x7c, 0x00, 0x00, /* ***** ***** ***** ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ***** ***** ***** ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ***** ***** ***** ***** */ + +/* Character (0x23): bbw=11, bbh=13, bbx=0, bby=0, width=12 */ +0x00, 0xc0, 0xc0, 0xc0, 0xf8, 0xf8, 0xc0, 0xf8, 0xf8, 0xc0, 0xc0, 0x00, /* ** ** ** ***** ***** ** ***** ***** ** ** */ +0x0c, 0x0c, 0xfc, 0xff, 0x0f, 0xfc, 0xff, 0x0f, 0x0c, 0x0c, 0x00, 0x00, /* ** ** ** ***** ***** ** ***** ***** ** ** ** ** ****************** ****************** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ***** ***** ** ***** ***** ** ** ** ** ****************** ****************** ** ** */ + +/* Character (0x24): bbw=9, bbh=18, bbx=1, bby=-2, width=11 */ +0x00, 0xf0, 0xf8, 0xcc, 0x84, 0xff, 0x04, 0x0c, 0x38, 0x38, 0x00, /* **** ***** ** ** * ********* * ** *** *** */ +0x00, 0x70, 0xf1, 0xc3, 0x83, 0xff, 0x87, 0xcf, 0xfe, 0x7c, 0x00, /* **** ***** ** ** * ********* * ** *** *** *** * ****** **** ************ ***** ** ******* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ***** ** ** * ********* * ** *** *** *** * ****** **** ************ ***** ** ******* ***** ** */ + +/* Character (0x25): bbw=14, bbh=14, bbx=0, bby=0, width=15 */ +0xf0, 0xf8, 0x0c, 0x04, 0x84, 0x78, 0x08, 0xc8, 0x74, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ***** ** * * * **** * * ** * *** *** */ +0x00, 0x01, 0x01, 0xc1, 0x70, 0x1c, 0x07, 0x01, 0x78, 0xfc, 0x86, 0x82, 0x42, 0x3c, 0x00, /* **** ***** ** * * * **** * * ** * *** *** * * * ** *** *** *** * **** ****** ** * * * * * **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ***** ** * * * **** * * ** * *** *** * * * ** *** *** *** * **** ****** ** * * * * * **** */ + +/* Character (0x26): bbw=16, bbh=14, bbx=0, bby=0, width=17 */ +0x00, 0x00, 0x00, 0xf0, 0xf8, 0xcc, 0x84, 0xc4, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ***** ** ** * * * ** ** ** *** */ +0x78, 0x7c, 0xfe, 0xc6, 0x83, 0x87, 0x8f, 0xde, 0x7c, 0x78, 0x79, 0xe7, 0xc3, 0xc1, 0x41, 0x20, 0x00, /* **** ***** ** ** * * * ** ** ** *** **** ***** ******* ** **** **** ***** * **** ** ***** **** * **** *** ***** *** *** * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ***** ** ** * * * ** ** ** *** **** ***** ******* ** **** **** ***** * **** ** ***** **** * **** *** ***** *** *** * * */ + +/* Character (0x27): bbw=2, bbh=5, bbx=1, bby=9, width=5 */ +0x00, 0x7c, 0x7c, 0x00, 0x00, /* ***** ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, /* ***** ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, /* ***** ***** */ + +/* Character (0x28): bbw=5, bbh=16, bbx=1, bby=-2, width=6 */ +0x00, 0xc0, 0xf0, 0x38, 0x0c, 0x04, /* ** **** *** ** * */ +0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, /* ** **** *** ** * ****** ******** ** */ +0x00, 0x00, 0x00, 0x01, 0x03, 0x02, /* ** **** *** ** * ****** ******** ** * ** * */ + +/* Character (0x29): bbw=5, bbh=16, bbx=0, bby=-2, width=6 */ +0x04, 0x0c, 0x38, 0xf0, 0xc0, 0x00, /* * ** *** **** ** */ +0x00, 0x00, 0xc0, 0xff, 0x3f, 0x00, /* * ** *** **** ** **************** */ +0x02, 0x03, 0x01, 0x00, 0x00, 0x00, /* * ** *** **** ** **************** * ** * */ + +/* Character (0x2a): bbw=7, bbh=7, bbx=0, bby=7, width=8 */ +0xd8, 0x50, 0x24, 0xfc, 0x24, 0x50, 0xd8, 0x00, /* ** ** * * * * ****** * * * * ** ** */ +0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, /* ** ** * * * * ****** * * * * ** ** * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** * * * * ****** * * * * ** ** * * * */ + +/* Character (0x2b): bbw=10, bbh=10, bbx=0, bby=0, width=11 */ +0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** */ +0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, /* ** ** ** ** ** ** **************** ** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ** ** ** **************** ** ** ** ** */ + +/* Character (0x2c): bbw=4, bbh=7, bbx=0, bby=-3, width=5 */ +0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x60, 0xf0, 0xf0, 0xe0, 0x00, /* ** **** **** *** */ +0x04, 0x02, 0x01, 0x00, 0x00, /* ** **** **** *** * * * */ + +/* Character (0x2d): bbw=5, bbh=2, bbx=0, bby=4, width=6 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, /* ** ** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ** ** */ + +/* Character (0x2e): bbw=4, bbh=4, bbx=0, bby=0, width=5 */ +0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x60, 0xf0, 0xf0, 0x60, 0x00, /* ** **** **** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** **** ** */ + +/* Character (0x2f): bbw=6, bbh=14, bbx=0, bby=0, width=7 */ +0x00, 0x00, 0x00, 0xe0, 0xfc, 0x1c, 0x00, /* *** ****** *** */ +0xc0, 0xf8, 0x3f, 0x07, 0x00, 0x00, 0x00, /* *** ****** *** ** *********** *** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* *** ****** *** ** *********** *** */ + +/* Character (0x30): bbw=9, bbh=14, bbx=1, bby=0, width=11 */ +0x00, 0xe0, 0xf8, 0xf8, 0x0c, 0x04, 0x0c, 0xf8, 0xf8, 0xe0, 0x00, /* *** ***** ***** ** * ** ***** ***** *** */ +0x00, 0x1f, 0x7f, 0x7f, 0xc0, 0x80, 0xc0, 0x7f, 0x7f, 0x1f, 0x00, /* *** ***** ***** ** * ** ***** ***** *** ***** ******* ******* ** * ********* ******* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* *** ***** ***** ** * ** ***** ***** *** ***** ******* ******* ** * ********* ******* ***** */ + +/* Character (0x31): bbw=7, bbh=14, bbx=2, bby=0, width=11 */ +0x00, 0x00, 0x10, 0x10, 0xf8, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, /* * * ***** ****** ****** */ +0x00, 0x00, 0x80, 0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, /* * * ***** ****** ****** * ************************* * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ***** ****** ****** * ************************* * * */ + +/* Character (0x32): bbw=9, bbh=14, bbx=1, bby=0, width=11 */ +0x00, 0x30, 0x78, 0x78, 0x04, 0x04, 0x0c, 0xfc, 0xf8, 0xf0, 0x00, /* ** **** **** * * ** ****** ***** **** */ +0x00, 0xc0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc7, 0xc7, 0xc3, 0xe0, 0x00, /* ** **** **** * * ** ****** ***** **** ** *** **** ** ** ** ***** ***** **** ** *** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** **** * * ** ****** ***** **** ** *** **** ** ** ** ***** ***** **** ** *** */ + +/* Character (0x33): bbw=9, bbh=14, bbx=1, bby=0, width=11 */ +0x00, 0x30, 0x78, 0x78, 0x04, 0x04, 0x0c, 0xfc, 0xf8, 0x70, 0x00, /* ** **** **** * * ** ****** ***** *** */ +0x00, 0x30, 0x78, 0xf8, 0x81, 0x81, 0xc1, 0xfe, 0x7e, 0x3c, 0x00, /* ** **** **** * * ** ****** ***** *** ** **** ****** ** ** ** ******* ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** **** * * ** ****** ***** *** ** **** ****** ** ** ** ******* ****** **** */ + +/* Character (0x34): bbw=9, bbh=14, bbx=1, bby=0, width=11 */ +0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0xfc, 0xfc, 0xfc, 0x00, 0x00, /* * ** ** ****** ****** ****** */ +0x00, 0x18, 0x16, 0x11, 0x10, 0x90, 0xff, 0xff, 0xff, 0x90, 0x00, /* * ** ** ****** ****** ****** ** ** * * * * * ************************* * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** ** ****** ****** ****** ** ** * * * * * ************************* * * */ + +/* Character (0x35): bbw=9, bbh=14, bbx=1, bby=0, width=11 */ +0x00, 0x00, 0xfc, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x0c, 0x04, 0x00, /* ****** ** * ** * ** * ** * ** * ** * */ +0x00, 0x30, 0x79, 0xf8, 0x80, 0x80, 0xc1, 0xff, 0x7f, 0x3e, 0x00, /* ****** ** * ** * ** * ** * ** * ** * ** * **** ***** * ** ***************** ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ****** ** * ** * ** * ** * ** * ** * ** * **** ***** * ** ***************** ***** */ + +/* Character (0x36): bbw=9, bbh=14, bbx=1, bby=0, width=11 */ +0x00, 0xe0, 0xf8, 0xf8, 0x0c, 0x84, 0x84, 0xbc, 0x3c, 0x18, 0x00, /* *** ***** ***** ** * * * * **** * **** ** */ +0x00, 0x1f, 0x7f, 0x7f, 0xc1, 0x80, 0x81, 0x7f, 0x7f, 0x3e, 0x00, /* *** ***** ***** ** * * * * **** * **** ** ***** ******* ******* * ** ** ******** ******* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* *** ***** ***** ** * * * * **** * **** ** ***** ******* ******* * ** ** ******** ******* ***** */ + +/* Character (0x37): bbw=9, bbh=14, bbx=1, bby=0, width=11 */ +0x00, 0x3c, 0x1c, 0x1c, 0x1c, 0x1c, 0xdc, 0xfc, 0x3c, 0x1c, 0x00, /* **** *** *** *** *** *** ** ****** **** *** */ +0x00, 0x00, 0x00, 0xf0, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, /* **** *** *** *** *** *** ** ****** **** *** **** ****************** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** *** *** *** *** *** ** ****** **** *** **** ****************** */ + +/* Character (0x38): bbw=9, bbh=14, bbx=1, bby=0, width=11 */ +0x00, 0xf0, 0xf8, 0xc8, 0x84, 0x84, 0x04, 0x88, 0xf8, 0x70, 0x00, /* **** ***** * ** * * * * * * * ***** *** */ +0x00, 0x78, 0x7d, 0xc3, 0x83, 0x87, 0x87, 0x4f, 0x7e, 0x3c, 0x00, /* **** ***** * ** * * * * * * * ***** *** **** * ***** ** **** **** **** ***** * ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ***** * ** * * * * * * * ***** *** **** * ***** ** **** **** **** ***** * ****** **** */ + +/* Character (0x39): bbw=9, bbh=14, bbx=1, bby=0, width=11 */ +0x00, 0xf0, 0xf8, 0xf8, 0x04, 0x04, 0x0c, 0xf8, 0xf8, 0xe0, 0x00, /* **** ***** ***** * * ** ***** ***** *** */ +0x00, 0x61, 0xf3, 0xf7, 0x86, 0x84, 0xc2, 0x7f, 0x7f, 0x1f, 0x00, /* **** ***** ***** * * ** ***** ***** *** * ** ** ******* **** ** * * * * ********* ******* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ***** ***** * * ** ***** ***** *** * ** ** ******* **** ** * * * * ********* ******* ***** */ + +/* Character (0x3a): bbw=4, bbh=9, bbx=1, bby=0, width=6 */ +0x00, 0x00, 0x80, 0x80, 0x00, 0x00, /* * * */ +0x00, 0x63, 0xf7, 0xf7, 0x63, 0x00, /* * * ** ** *** ******* ****** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ** ** *** ******* ****** ** */ + +/* Character (0x3b): bbw=4, bbh=12, bbx=1, bby=-3, width=6 */ +0x00, 0x00, 0x80, 0x80, 0x00, 0x00, /* * * */ +0x00, 0x63, 0xf7, 0xf7, 0xe3, 0x00, /* * * ** ** *** ******* ****** *** */ +0x00, 0x04, 0x02, 0x01, 0x00, 0x00, /* * * ** ** *** ******* ****** *** * * * */ + +/* Character (0x3c): bbw=10, bbh=10, bbx=0, bby=0, width=11 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0x00, /* * * ** ** */ +0x0c, 0x0c, 0x1e, 0x1e, 0x33, 0x33, 0x61, 0x61, 0xc0, 0xc0, 0x00, /* * * ** ** ** ** **** **** ** ** ** ** * ** * ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ** ** ** ** **** **** ** ** ** ** * ** * ** ** ** */ + +/* Character (0x3d): bbw=9, bbh=6, bbx=1, bby=2, width=11 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, /* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ + +/* Character (0x3e): bbw=10, bbh=10, bbx=0, bby=0, width=11 */ +0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** * * */ +0xc0, 0xc0, 0x61, 0x61, 0x33, 0x33, 0x1e, 0x1e, 0x0c, 0x0c, 0x00, /* ** ** * * ** *** ** * ** ** ** ** ** **** **** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** * * ** *** ** * ** ** ** ** ** **** **** ** ** */ + +/* Character (0x3f): bbw=9, bbh=14, bbx=0, bby=0, width=10 */ +0x30, 0x78, 0x78, 0x04, 0x04, 0x0c, 0xfc, 0xfc, 0x78, 0x00, /* ** **** **** * * ** ****** ****** **** */ +0x00, 0x00, 0x60, 0xf4, 0xf6, 0x63, 0x01, 0x00, 0x00, 0x00, /* ** **** **** * * ** ****** ****** **** ** * **** ** ****** ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** **** * * ** ****** ****** **** ** * **** ** ****** ** * */ + +/* Character (0x40): bbw=15, bbh=14, bbx=0, bby=0, width=16 */ +0x80, 0xe0, 0x70, 0x18, 0x88, 0xcc, 0x64, 0x24, 0x24, 0xe4, 0xe4, 0x0c, 0x18, 0xf8, 0xe0, 0x00, /* * *** *** ** * * ** ** * ** * * * * * *** * *** ** ** ***** *** */ +0x1f, 0x7f, 0x60, 0xce, 0xdf, 0x91, 0x90, 0x88, 0x9e, 0xdf, 0x51, 0x58, 0x2e, 0x07, 0x01, 0x00, /* * *** *** ** * * ** ** * ** * * * * * *** * *** ** ** ***** *** ***** ******* ** *** ******* *** * * * * * * **** ****** *** * * ** * *** * *** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * *** *** ** * * ** ** * ** * * * * * *** * *** ** ** ***** *** ***** ******* ** *** ******* *** * * * * * * **** ****** *** * * ** * *** * *** * */ + +/* Character (0x41): bbw=14, bbh=14, bbx=0, bby=0, width=14 */ +0x00, 0x00, 0x00, 0x00, 0xc0, 0x70, 0x7c, 0xfc, 0xf0, 0x80, 0x00, 0x00, 0x00, 0x00, /* ** *** ***** ****** **** * */ +0x80, 0xe0, 0xb8, 0x0e, 0x0b, 0x08, 0x08, 0x0b, 0x9f, 0xff, 0xfe, 0xf0, 0xc0, 0x80, /* ** *** ***** ****** **** * * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** *** ***** ****** **** * * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * */ + +/* Character (0x42): bbw=12, bbh=14, bbx=1, bby=0, width=14 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0x04, 0x8c, 0xfc, 0xfc, 0x78, 0x00, 0x00, /* * ****** ****** ****** * * * ** * ****** ****** **** */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x81, 0x81, 0x81, 0x81, 0xc7, 0x7e, 0x7e, 0x3c, 0x00, /* * ****** ****** ****** * * * ** * ****** ****** **** ************************** ** ** ** **** ** ****** ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * ** * ****** ****** **** ************************** ** ** ** **** ** ****** ****** **** */ + +/* Character (0x43): bbw=12, bbh=14, bbx=1, bby=0, width=14 */ +0x00, 0xc0, 0xf0, 0xf8, 0x78, 0x1c, 0x0c, 0x04, 0x04, 0x04, 0x08, 0x38, 0xfc, 0x00, /* ** **** ***** **** *** ** * * * * *** ****** */ +0x00, 0x0f, 0x3f, 0x7f, 0x78, 0xe0, 0xc0, 0x80, 0x80, 0x80, 0x40, 0x60, 0x18, 0x00, /* ** **** ***** **** *** ** * * * * *** ****** **** ****** ******* **** *** ** * * * * ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** ***** **** *** ** * * * * *** ****** **** ****** ******* **** *** ** * * * * ** ** */ + +/* Character (0x44): bbw=14, bbh=14, bbx=1, bby=0, width=16 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0x04, 0x04, 0x0c, 0x1c, 0x78, 0xf8, 0xf0, 0xc0, 0x00, /* * ****** ****** ****** * * * * ** *** **** ***** **** ** */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xe0, 0x78, 0x7f, 0x3f, 0x0f, 0x00, /* * ****** ****** ****** * * * * ** *** **** ***** **** ** ************************* * * * * ** *** **** ******* ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * ** *** **** ***** **** ** ************************* * * * * ** *** **** ******* ****** **** */ + +/* Character (0x45): bbw=11, bbh=14, bbx=1, bby=0, width=13 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0x84, 0xe4, 0x0c, 0x1c, 0x7c, 0x00, /* * ****** ****** ****** * * * * * *** ** *** ***** */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x81, 0x81, 0x83, 0x8f, 0xc0, 0xe0, 0xf8, 0x00, /* * ****** ****** ****** * * * * * *** ** *** ***** ************************** ** *** ***** * ** *** ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * * *** ** *** ***** ************************** ** *** ***** * ** *** ***** */ + +/* Character (0x46): bbw=11, bbh=14, bbx=1, bby=0, width=13 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0x84, 0xe4, 0x0c, 0x1c, 0xfc, 0x00, /* * ****** ****** ****** * * * * * *** ** *** ****** */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x81, 0x01, 0x03, 0x0f, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * * *** ** *** ****** ************************** ** ** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * * *** ** *** ****** ************************** ** ** **** */ + +/* Character (0x47): bbw=13, bbh=14, bbx=1, bby=0, width=15 */ +0x00, 0xc0, 0xf0, 0xf8, 0x78, 0x1c, 0x0c, 0x04, 0x04, 0x04, 0x08, 0x38, 0xfc, 0x00, 0x00, /* ** **** ***** **** *** ** * * * * *** ****** */ +0x00, 0x0f, 0x3f, 0x7f, 0x78, 0xe0, 0xc0, 0x80, 0x80, 0xc4, 0x7c, 0x7c, 0xfc, 0x04, 0x00, /* ** **** ***** **** *** ** * * * * *** ****** **** ****** ******* **** *** ** * * * ** ***** ***** ****** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** ***** **** *** ** * * * * *** ****** **** ****** ******* **** *** ** * * * ** ***** ***** ****** * */ + +/* Character (0x48): bbw=14, bbh=14, bbx=1, bby=0, width=16 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0x00, 0x00, 0x04, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x00, /* * ****** ****** ****** * * * * ****** ****** ****** * */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x81, 0x81, 0x01, 0x01, 0x81, 0x81, 0xff, 0xff, 0xff, 0x80, 0x00, /* * ****** ****** ****** * * * * ****** ****** ****** * ************************** ** ** * * ** ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * ****** ****** ****** * ************************** ** ** * * ** ************************* * */ + +/* Character (0x49): bbw=5, bbh=14, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x00, 0x00, /* * ****** ****** ****** * */ +0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, /* * ****** ****** ****** * ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * ************************* * */ + +/* Character (0x4a): bbw=11, bbh=14, bbx=0, bby=0, width=12 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x00, /* * * ****** ****** ****** * */ +0x38, 0x7c, 0x9c, 0x98, 0x80, 0xc0, 0xe0, 0x7f, 0x7f, 0x3f, 0x00, 0x00, /* * * ****** ****** ****** * *** ***** *** * ** * * ** ********** ******* ****** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ****** ****** ****** * *** ***** *** * ** * * ** ********** ******* ****** */ + +/* Character (0x4b): bbw=15, bbh=14, bbx=1, bby=0, width=16 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0x80, 0xc0, 0x60, 0x34, 0x1c, 0x0c, 0x04, 0x04, 0x00, /* * ****** ****** ****** * * * ** ** * ** *** ** * * */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x86, 0x83, 0x07, 0x0f, 0xbf, 0xfe, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, /* * ****** ****** ****** * * * ** ** * ** *** ** * * ************************* ** *** **** **** ****** * ******* ***** **** *** ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * ** ** * ** *** ** * * ************************* ** *** **** **** ****** * ******* ***** **** *** ** * */ + +/* Character (0x4c): bbw=11, bbh=14, bbx=1, bby=0, width=12 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xe0, 0xf8, /* * ****** ****** ****** * * ************************* * * * * ** *** ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * ************************* * * * * ** *** ***** */ + +/* Character (0x4d): bbw=17, bbh=14, bbx=1, bby=0, width=19 */ +0x00, 0x00, 0x04, 0xfc, 0x1c, 0xfc, 0xfc, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x38, 0xfc, 0xfc, 0xfc, 0x04, 0x00, /* * ****** *** ****** ****** **** ** *** *** ****** ****** ****** * */ +0x00, 0x80, 0xc0, 0xff, 0xc0, 0x80, 0x03, 0x1f, 0x7f, 0xfe, 0x3c, 0x07, 0x01, 0x80, 0xff, 0xff, 0xff, 0x80, 0x00, /* * ****** *** ****** ****** **** ** *** *** ****** ****** ****** * * ********** ** *** ***** ******* ******* **** *** * ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** *** ****** ****** **** ** *** *** ****** ****** ****** * * ********** ** *** ***** ******* ******* **** *** * ************************* * */ + +/* Character (0x4e): bbw=15, bbh=14, bbx=1, bby=0, width=16 */ +0x00, 0x04, 0x0c, 0xfc, 0x3c, 0x7c, 0xf8, 0xe0, 0xc0, 0x80, 0x00, 0x04, 0x0c, 0xfc, 0x0c, 0x04, /* * ** ****** **** ***** ***** *** ** * * ** ****** ** * */ +0x00, 0x80, 0xc0, 0xff, 0xc0, 0x80, 0x00, 0x01, 0x07, 0x0f, 0x3e, 0x7c, 0xf0, 0xff, 0x00, 0x00, /* * ** ****** **** ***** ***** *** ** * * ** ****** ** * * ********** ** * * *** **** ***** ***** ************ */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** ****** **** ***** ***** *** ** * * ** ****** ** * * ********** ** * * *** **** ***** ***** ************ */ + +/* Character (0x4f): bbw=15, bbh=14, bbx=0, bby=0, width=16 */ +0xc0, 0xf0, 0xf8, 0x78, 0x1c, 0x0c, 0x04, 0x04, 0x04, 0x0c, 0x1c, 0x78, 0xf8, 0xf0, 0xc0, 0x00, /* ** **** ***** **** *** ** * * * ** *** **** ***** **** ** */ +0x0f, 0x3f, 0x7f, 0x78, 0xe0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xe0, 0x78, 0x7f, 0x3f, 0x0f, 0x00, /* ** **** ***** **** *** ** * * * ** *** **** ***** **** ** **** ****** ******* **** *** ** * * * ** *** **** ******* ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** ***** **** *** ** * * * ** *** **** ***** **** ** **** ****** ******* **** *** ** * * * ** *** **** ******* ****** **** */ + +/* Character (0x50): bbw=12, bbh=14, bbx=1, bby=0, width=14 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0x04, 0x04, 0x8c, 0xfc, 0xfc, 0xf8, 0x00, /* * ****** ****** ****** * * * * ** * ****** ****** ***** */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x82, 0x82, 0x02, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, /* * ****** ****** ****** * * * * ** * ****** ****** ***** ************************* * * * * * ** ** * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * ** * ****** ****** ***** ************************* * * * * * ** ** * * */ + +/* Character (0x51): bbw=15, bbh=18, bbx=0, bby=-4, width=16 */ +0xc0, 0xf0, 0xf8, 0x78, 0x1c, 0x0c, 0x04, 0x04, 0x04, 0x0c, 0x1c, 0x78, 0xf8, 0xf0, 0xc0, 0x00, /* ** **** ***** **** *** ** * * * ** *** **** ***** **** ** */ +0x0f, 0x3f, 0x7f, 0x78, 0xd0, 0xc8, 0x88, 0x98, 0xf8, 0xf0, 0xe0, 0x78, 0x7f, 0x3f, 0x0f, 0x00, /* ** **** ***** **** *** ** * * * ** *** **** ***** **** ** **** ****** ******* **** * ** * ** * * ** * ***** **** *** **** ******* ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0f, 0x0e, 0x0c, 0x06, 0x00, 0x00, /* ** **** ***** **** *** ** * * * ** *** **** ***** **** ** **** ****** ******* **** * ** * ** * * ** * ***** **** *** **** ******* ****** **** *** **** *** ** ** */ + +/* Character (0x52): bbw=14, bbh=14, bbx=1, bby=0, width=16 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0x04, 0x84, 0xcc, 0xfc, 0xfc, 0x78, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * * ** ** ****** ****** **** */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x81, 0x01, 0x01, 0x07, 0x3f, 0xfe, 0xfc, 0xe0, 0x80, 0x40, 0x00, /* * ****** ****** ****** * * * * * ** ** ****** ****** **** ************************** ** * *** ****** ******* ****** *** * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * * ** ** ****** ****** **** ************************** ** * *** ****** ******* ****** *** * * */ + +/* Character (0x53): bbw=11, bbh=14, bbx=0, bby=0, width=12 */ +0xf0, 0xf8, 0xcc, 0x84, 0x84, 0x84, 0x84, 0x0c, 0x18, 0x3c, 0x00, 0x00, /* **** ***** ** ** * * * * * * * * ** ** **** */ +0xf8, 0x63, 0xc3, 0x83, 0x87, 0x87, 0x87, 0x87, 0xcf, 0x7f, 0x3e, 0x00, /* **** ***** ** ** * * * * * * * * ** ** **** ******* ** ** **** **** **** **** **** ***** ********* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ***** ** ** * * * * * * * * ** ** **** ******* ** ** **** **** **** **** **** ***** ********* ***** */ + +/* Character (0x54): bbw=11, bbh=14, bbx=1, bby=0, width=13 */ +0x00, 0x7c, 0x1c, 0x04, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0x1c, 0x7c, 0x00, /* ***** *** * * ****** ****** ****** * * *** ***** */ +0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, /* ***** *** * * ****** ****** ****** * * *** ***** ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ***** *** * * ****** ****** ****** * * *** ***** ************************* * */ + +/* Character (0x55): bbw=14, bbh=14, bbx=1, bby=0, width=16 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0xfc, 0x0c, 0x04, 0x00, /* * ****** ****** ****** * * ** ****** ** * */ +0x00, 0x00, 0x3f, 0x7f, 0xff, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x3f, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * ** ****** ** * ****** ******* ******** ** * * * * * * ****** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * ** ****** ** * ****** ******* ******** ** * * * * * * ****** */ + +/* Character (0x56): bbw=14, bbh=14, bbx=0, bby=0, width=14 */ +0x04, 0x1c, 0xfc, 0xfc, 0xf4, 0x80, 0x00, 0x00, 0x00, 0x84, 0xfc, 0x1c, 0x0c, 0x04, /* * *** ****** ****** * **** * * * ****** *** ** * */ +0x00, 0x00, 0x00, 0x03, 0x0f, 0x3f, 0xfe, 0xf0, 0x3c, 0x07, 0x00, 0x00, 0x00, 0x00, /* * *** ****** ****** * **** * * * ****** *** ** * ** **** ****** ******* **** **** *** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * *** ****** ****** * **** * * * ****** *** ** * ** **** ****** ******* **** **** *** */ + +/* Character (0x57): bbw=19, bbh=14, bbx=0, bby=0, width=19 */ +0x04, 0x3c, 0xfc, 0xfc, 0xe4, 0x00, 0x04, 0x8c, 0xfc, 0xfc, 0xfc, 0xc4, 0x00, 0x00, 0x84, 0xfc, 0x1c, 0x0c, 0x04, /* * **** ****** ****** * *** * ** * ****** ****** ****** * ** * * ****** *** ** * */ +0x00, 0x00, 0x01, 0x0f, 0x7f, 0xff, 0x3c, 0x07, 0x00, 0x01, 0x0f, 0x7f, 0xfe, 0x3c, 0x07, 0x00, 0x00, 0x00, 0x00, /* * **** ****** ****** * *** * ** * ****** ****** ****** * ** * * ****** *** ** * * **** ******* ******** **** *** * **** ******* ******* **** *** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * **** ****** ****** * *** * ** * ****** ****** ****** * ** * * ****** *** ** * * **** ******* ******** **** *** * **** ******* ******* **** *** */ + +/* Character (0x58): bbw=16, bbh=14, bbx=0, bby=0, width=17 */ +0x00, 0x04, 0x0c, 0x1c, 0x7c, 0xfc, 0xf4, 0xc0, 0x80, 0xc0, 0x64, 0x3c, 0x1c, 0x0c, 0x04, 0x04, 0x00, /* * ** *** ***** ****** * **** ** * ** * ** **** *** ** * * */ +0x80, 0xc0, 0xe0, 0xf0, 0x98, 0x0c, 0x07, 0x03, 0x07, 0x9f, 0xfe, 0xfc, 0xf0, 0xe0, 0xc0, 0x80, 0x00, /* * ** *** ***** ****** * **** ** * ** * ** **** *** ** * * * ** *** **** ** * ** *** ** *** ***** * ******* ****** **** *** ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** *** ***** ****** * **** ** * ** * ** **** *** ** * * * ** *** **** ** * ** *** ** *** ***** * ******* ****** **** *** ** * */ + +/* Character (0x59): bbw=13, bbh=14, bbx=1, bby=0, width=15 */ +0x00, 0x04, 0x1c, 0x7c, 0xfc, 0xf4, 0xc0, 0x00, 0x00, 0x80, 0xe4, 0x3c, 0x0c, 0x04, 0x00, /* * *** ***** ****** * **** ** * * *** **** ** * */ +0x00, 0x00, 0x00, 0x00, 0x01, 0x87, 0xff, 0xff, 0xff, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* * *** ***** ****** * **** ** * * *** **** ** * * *** *************************** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * *** ***** ****** * **** ** * * *** **** ** * * *** *************************** * */ + +/* Character (0x5a): bbw=11, bbh=14, bbx=1, bby=0, width=13 */ +0x00, 0x7c, 0x1c, 0x0c, 0x04, 0x04, 0xc4, 0xe4, 0xfc, 0x7c, 0x3c, 0x0c, 0x00, /* ***** *** ** * * * ** * *** ****** ***** **** ** */ +0x00, 0xc0, 0xf0, 0xf8, 0xfe, 0x9f, 0x8f, 0x83, 0x81, 0xc0, 0xe0, 0xf8, 0x00, /* ***** *** ** * * * ** * *** ****** ***** **** ** ** **** ***** ************ ***** *** ** * ** *** ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ***** *** ** * * * ** * *** ****** ***** **** ** ** **** ***** ************ ***** *** ** * ** *** ***** */ + +/* Character (0x5b): bbw=4, bbh=16, bbx=1, bby=-2, width=5 */ +0x00, 0xfc, 0xfc, 0x04, 0x04, /* ****** ****** * * */ +0x00, 0xff, 0xff, 0x00, 0x00, /* ****** ****** * * **************** */ +0x00, 0x03, 0x03, 0x02, 0x02, /* ****** ****** * * **************** ** ** * * */ + +/* Character (0x5c): bbw=8, bbh=14, bbx=0, bby=0, width=9 */ +0x0c, 0x3c, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** **** ** */ +0x00, 0x00, 0x00, 0x03, 0x0f, 0x3c, 0xf0, 0xc0, 0x00, /* ** **** **** ** ** **** **** **** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** **** ** ** **** **** **** ** */ + +/* Character (0x5d): bbw=4, bbh=16, bbx=0, bby=-2, width=5 */ +0x04, 0x04, 0xfc, 0xfc, 0x00, /* * * ****** ****** */ +0x00, 0x00, 0xff, 0xff, 0x00, /* * * ****** ****** **************** */ +0x02, 0x02, 0x03, 0x03, 0x00, /* * * ****** ****** **************** * * ** ** */ + +/* Character (0x5e): bbw=8, bbh=8, bbx=0, bby=6, width=9 */ +0x00, 0xc0, 0xf0, 0x3c, 0x3c, 0xf0, 0xc0, 0x00, 0x00, /* ** **** **** **** **** ** */ +0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, /* ** **** **** **** **** ** ** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** **** **** **** ** ** ** ** ** */ + +/* Character (0x5f): bbw=10, bbh=2, bbx=0, bby=-3, width=10 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, /* ** ** ** ** ** ** ** ** ** ** */ + +/* Character (0x60): bbw=5, bbh=4, bbx=1, bby=10, width=7 */ +0x00, 0x0c, 0x1c, 0x18, 0x30, 0x20, 0x00, /* ** *** ** ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** *** ** ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** *** ** ** * */ + +/* Character (0x61): bbw=10, bbh=9, bbx=0, bby=0, width=11 */ +0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, /* * * * * * * * */ +0x73, 0xf3, 0xf9, 0x88, 0x88, 0x44, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * * * * * * ** *** ** ***** ***** * * * * * * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * ** *** ** ***** ***** * * * * * * ************************ * */ + +/* Character (0x62): bbw=12, bbh=14, bbx=0, bby=0, width=13 */ +0x04, 0xfc, 0xfc, 0xfc, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * */ +0x00, 0xff, 0xff, 0x7f, 0xc1, 0x80, 0x80, 0x80, 0xc1, 0x7f, 0x7f, 0x3e, 0x00, /* * ****** ****** ****** * * * * *********************** * ** * * ** ********* ******* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * *********************** * ** * * ** ********* ******* ***** */ + +/* Character (0x63): bbw=9, bbh=9, bbx=0, bby=0, width=10 */ +0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, /* * * * * * */ +0x3e, 0x7f, 0x7f, 0xc1, 0x80, 0x80, 0x81, 0x43, 0x63, 0x00, /* * * * * * ***** ******* ******* * ** * ** *** * ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * ***** ******* ******* * ** * ** *** * ** ** */ + +/* Character (0x64): bbw=12, bbh=14, bbx=0, bby=0, width=13 */ +0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x04, 0xfc, 0xfc, 0xfc, 0x00, 0x00, /* * * * * * ****** ****** ****** */ +0x3e, 0x7f, 0x7f, 0xc1, 0x80, 0x80, 0x80, 0x41, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * * * * ****** ****** ****** ***** ******* ******* * ** * * ** * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * ****** ****** ****** ***** ******* ******* * ** * * ** * ************************ * */ + +/* Character (0x65): bbw=10, bbh=9, bbx=0, bby=0, width=11 */ +0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, /* * * * * */ +0x3e, 0x7f, 0x7f, 0xc9, 0x88, 0x88, 0x89, 0x8f, 0x4f, 0x6e, 0x00, /* * * * * ***** ******* ******* * * ** * * * ** * ***** ***** * *** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * ***** ******* ******* * * ** * * * ** * ***** ***** * *** ** */ + +/* Character (0x66): bbw=8, bbh=14, bbx=0, bby=0, width=7 */ +0x80, 0xf0, 0xf8, 0xfc, 0x84, 0x9c, 0x1c, /* * **** ***** ****** * * *** * *** */ +0x80, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, /* * **** ***** ****** * * *** * *** ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * **** ***** ****** * * *** * *** ************************* * */ + +/* Character (0x67): bbw=11, bbh=15, bbx=0, bby=-4, width=11 */ +0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x60, 0x60, /* * * * * * * * ** ** */ +0x00, 0x6f, 0xff, 0xd9, 0xd0, 0xd0, 0xd9, 0xdf, 0xcf, 0x80, 0x00, /* * * * * * * * ** ** **** ** ********* ** ** * ** * *** ** ******* ****** ** * */ +0x07, 0x0f, 0x0c, 0x08, 0x08, 0x08, 0x08, 0x0d, 0x07, 0x03, 0x00, /* * * * * * * * ** ** **** ** ********* ** ** * ** * *** ** ******* ****** ** * *** **** ** * * * ** ***** ** */ + +/* Character (0x68): bbw=12, bbh=14, bbx=0, bby=0, width=13 */ +0x04, 0xfc, 0xfc, 0xfc, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * * */ +0x80, 0xff, 0xff, 0xff, 0x81, 0x00, 0x00, 0x81, 0xff, 0xff, 0xff, 0x80, 0x00, /* * ****** ****** ****** * * * * * ************************** * * ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * * ************************** * * ************************* * */ + +/* Character (0x69): bbw=5, bbh=14, bbx=0, bby=0, width=6 */ +0x80, 0x9c, 0x9c, 0x9c, 0x00, 0x00, /* * *** * *** * *** * */ +0x80, 0xff, 0xff, 0xff, 0x80, 0x00, /* * *** * *** * *** * ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * *** * *** * *** * ************************* * */ + +/* Character (0x6a): bbw=7, bbh=18, bbx=0, bby=-4, width=9 */ +0x00, 0x00, 0x00, 0x80, 0x9c, 0x9c, 0x9c, 0x00, 0x00, /* * *** * *** * *** * */ +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, /* * *** * *** * *** * ************************ */ +0x06, 0x0e, 0x0e, 0x08, 0x0f, 0x07, 0x03, 0x00, 0x00, /* * *** * *** * *** * ************************ ** *** *** ******** ** */ + +/* Character (0x6b): bbw=12, bbh=14, bbx=0, bby=0, width=13 */ +0x04, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, /* * ****** ****** ****** * * * * * */ +0x80, 0xff, 0xff, 0xff, 0x88, 0x1c, 0xbe, 0xf9, 0xf1, 0xe0, 0xc0, 0x80, 0x00, /* * ****** ****** ****** * * * * * ************************* * * *** ***** ** ****** **** *** ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * * ************************* * * *** ***** ** ****** **** *** ** * */ + +/* Character (0x6c): bbw=5, bbh=14, bbx=0, bby=0, width=6 */ +0x04, 0xfc, 0xfc, 0xfc, 0x00, 0x00, /* * ****** ****** ****** */ +0x80, 0xff, 0xff, 0xff, 0x80, 0x00, /* * ****** ****** ****** ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** ************************* * */ + +/* Character (0x6d): bbw=19, bbh=9, bbx=0, bby=0, width=20 */ +0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, /* * * * * * * * * * * * * * * * */ +0x80, 0xff, 0xff, 0xff, 0x81, 0x00, 0x00, 0x81, 0xff, 0xff, 0xff, 0x81, 0x00, 0x00, 0x81, 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, /* * * * * * * * * * * * * * * * ************************** * * ************************** * * ************************* * */ + +/* Character (0x6e): bbw=12, bbh=9, bbx=0, bby=0, width=13 */ +0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, /* * * * * * * * * * */ +0x80, 0xff, 0xff, 0xff, 0x81, 0x00, 0x00, 0x81, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * * * * * * * * ************************** * * ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * * ************************** * * ************************* * */ + +/* Character (0x6f): bbw=11, bbh=9, bbx=0, bby=0, width=12 */ +0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, /* * * * * * */ +0x3e, 0x7f, 0x7f, 0xc1, 0x80, 0x80, 0x80, 0xc1, 0x7f, 0x7f, 0x3e, 0x00, /* * * * * * ***** ******* ******* * ** * * ** ********* ******* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * ***** ******* ******* * ** * * ** ********* ******* ***** */ + +/* Character (0x70): bbw=12, bbh=13, bbx=0, bby=-4, width=13 */ +0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * */ +0x00, 0xff, 0xff, 0xff, 0x41, 0x80, 0x80, 0x80, 0xc1, 0x7f, 0x7f, 0x3e, 0x00, /* * * * * * * * ************************* * * * ** ********* ******* ***** */ +0x08, 0x0f, 0x0f, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * ************************* * * * ** ********* ******* ***** ************* * */ + +/* Character (0x71): bbw=12, bbh=13, bbx=0, bby=-4, width=12 */ +0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, /* * * * * * * */ +0x3e, 0x7f, 0x7f, 0xc1, 0x80, 0x80, 0x80, 0x41, 0xff, 0xff, 0xff, 0x00, /* * * * * * * ***** ******* ******* * ** * * ** * ************************ */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0f, 0x0f, 0x0f, 0x08, /* * * * * * * ***** ******* ******* * ** * * ** * ************************ ************* * */ + +/* Character (0x72): bbw=8, bbh=9, bbx=0, bby=0, width=9 */ +0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, /* * * * * * * * */ +0x80, 0xff, 0xff, 0xff, 0x81, 0x00, 0x03, 0x03, 0x00, /* * * * * * * * ************************** * ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * ************************** * ** ** */ + +/* Character (0x73): bbw=9, bbh=9, bbx=0, bby=0, width=10 */ +0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, /* * * * * * */ +0xe6, 0x4f, 0x8f, 0x8c, 0x9c, 0x9c, 0xf9, 0x7b, 0x30, 0x00, /* * * * * * ** ******* * **** * ** * *** * *** ** ******* **** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * ** ******* * **** * ** * *** * *** ** ******* **** ** */ + +/* Character (0x74): bbw=7, bbh=13, bbx=0, bby=0, width=8 */ +0x80, 0xc0, 0xf0, 0xf8, 0x80, 0x80, 0x00, 0x00, /* * ** **** ***** * * */ +0x00, 0x7f, 0xff, 0xff, 0x80, 0x80, 0x60, 0x00, /* * ** **** ***** * * ******* **************** * * ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** **** ***** * * ******* **************** * * ** */ + +/* Character (0x75): bbw=12, bbh=9, bbx=0, bby=0, width=13 */ +0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, /* * * * * * * * * */ +0x00, 0x7f, 0xff, 0xff, 0xc0, 0x80, 0x80, 0x40, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * * * * * * * ******* **************** ** * * * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * ******* **************** ** * * * ************************ * */ + +/* Character (0x76): bbw=10, bbh=9, bbx=0, bby=0, width=10 */ +0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, /* * * * * * * * * */ +0x00, 0x03, 0x0f, 0x3f, 0xfc, 0xf0, 0x30, 0x0c, 0x03, 0x00, /* * * * * * * * * ** **** ****** ****** **** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * ** **** ****** ****** **** ** ** ** */ + +/* Character (0x77): bbw=16, bbh=9, bbx=0, bby=0, width=16 */ +0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, /* * * * * * * * * * * * * * */ +0x00, 0x03, 0x0f, 0x3f, 0xfc, 0xf0, 0x30, 0x0f, 0x0f, 0x3f, 0xfc, 0xf0, 0x30, 0x0c, 0x03, 0x00, /* * * * * * * * * * * * * * ** **** ****** ****** **** ** **** **** ****** ****** **** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * * * * * * ** **** ****** ****** **** ** **** **** ****** ****** **** ** ** ** */ + +/* Character (0x78): bbw=11, bbh=9, bbx=0, bby=0, width=12 */ +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, /* * * * * * * * * * */ +0x80, 0xc1, 0xc3, 0x27, 0x1f, 0xbe, 0xfc, 0xf2, 0xe1, 0xc1, 0x80, 0x00, /* * * * * * * * * * ** **** ***** * ***** ***** * ****** * ***** **** ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * * ** **** ***** * ***** ***** * ****** * ***** **** ** * */ + +/* Character (0x79): bbw=11, bbh=13, bbx=0, bby=-4, width=12 */ +0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, /* * * * * * * * * */ +0x00, 0x03, 0x0f, 0x3f, 0xfc, 0xf0, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, /* * * * * * * * * ** **** ****** ****** **** ** ** ** ** */ +0x06, 0x0e, 0x0c, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * ** **** ****** ****** **** ** ** ** ** ** *** ** * * ** */ + +/* Character (0x7a): bbw=8, bbh=9, bbx=0, bby=0, width=10 */ +0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, /* * * * * * * * * */ +0xc3, 0xe1, 0xf8, 0xfc, 0x9f, 0x87, 0xc3, 0xf1, 0x00, 0x00, /* * * * * * * * * ** *** *** ***** *********** **** *** *** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * ** *** *** ***** *********** **** *** *** **** */ + +/* Character (0x7b): bbw=5, bbh=16, bbx=0, bby=-2, width=6 */ +0x00, 0xf0, 0xf8, 0x04, 0x04, 0x00, /* **** ***** * * */ +0x02, 0xff, 0xfd, 0x00, 0x00, 0x00, /* **** ***** * * * ********* ****** */ +0x00, 0x00, 0x01, 0x02, 0x02, 0x00, /* **** ***** * * * ********* ****** * * * */ + +/* Character (0x7c): bbw=2, bbh=14, bbx=4, bby=0, width=11 */ +0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, /* ****** ****** */ +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, /* ****** ****** **************** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ****** ****** **************** */ + +/* Character (0x7d): bbw=5, bbh=16, bbx=0, bby=-2, width=6 */ +0x04, 0x04, 0xf8, 0xf0, 0x00, 0x00, /* * * ***** **** */ +0x00, 0x00, 0xfd, 0xff, 0x02, 0x00, /* * * ***** **** * ************** * */ +0x02, 0x02, 0x01, 0x00, 0x00, 0x00, /* * * ***** **** * ************** * * * * */ + +/* Character (0x7e): bbw=10, bbh=3, bbx=1, bby=4, width=12 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x08, 0x0c, 0x0e, 0x06, 0x06, 0x0c, 0x0c, 0x0e, 0x06, 0x02, 0x00, /* * ** *** ** ** ** ** *** ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** *** ** ** ** ** *** ** * */ + +/* Character (0xa0): bbw=1, bbh=1, bbx=0, bby=0, width=5 */ +0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, 0x00, 0x00, /* */ + +/* Character (0xa1): bbw=4, bbh=14, bbx=1, bby=-4, width=7 */ +0x00, 0x80, 0xc0, 0xc0, 0x80, 0x00, 0x00, /* * ** ** * */ +0x00, 0xc1, 0xfb, 0xfb, 0xc1, 0x00, 0x00, /* * ** ** * * **** ******* ****** ** */ +0x00, 0x07, 0x0f, 0x0f, 0x07, 0x00, 0x00, /* * ** ** * * **** ******* ****** ** *** *********** */ + +/* Character (0xa2): bbw=9, bbh=13, bbx=1, bby=-2, width=11 */ +0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x60, 0x00, /* * * * * * ** */ +0x00, 0x3e, 0x7f, 0x7f, 0xc1, 0xb0, 0x8c, 0x83, 0x43, 0x63, 0x00, /* * * * * * ** ***** ******* ******* * ** ** * ** *** *** * ** ** */ +0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * ** ***** ******* ******* * ** ** * ** *** *** * ** ** ** */ + +/* Character (0xa3): bbw=10, bbh=14, bbx=0, bby=0, width=11 */ +0x00, 0xf0, 0xf8, 0xfc, 0x04, 0x04, 0x34, 0x3c, 0x38, 0x00, 0x00, /* **** ***** ****** * * * ** **** *** */ +0xc2, 0xa2, 0xa3, 0x7f, 0xdf, 0xce, 0xc2, 0xc2, 0xe2, 0x70, 0x00, /* **** ***** ****** * * * ** **** *** * ** * * *** * ******** ***** ** *** ** * ** * ** * *** *** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ***** ****** * * * ** **** *** * ** * * *** * ******** ***** ** *** ** * ** * ** * *** *** */ + +/* Character (0xa4): bbw=9, bbh=9, bbx=0, bby=2, width=10 */ +0x60, 0xe0, 0xc0, 0x60, 0x60, 0x60, 0xc0, 0xe0, 0x60, 0x00, /* ** *** ** ** ** ** ** *** ** */ +0x37, 0x3f, 0x18, 0x30, 0x30, 0x30, 0x18, 0x3f, 0x37, 0x00, /* ** *** ** ** ** ** ** *** ** *** ** ****** ** ** ** ** ** ****** *** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** *** ** ** ** ** ** *** ** *** ** ****** ** ** ** ** ** ****** *** ** */ + +/* Character (0xa5): bbw=13, bbh=14, bbx=1, bby=0, width=15 */ +0x00, 0x04, 0x1c, 0x3c, 0xfc, 0xf4, 0xc0, 0x00, 0x00, 0x80, 0xe4, 0x3c, 0x0c, 0x04, 0x00, /* * *** **** ****** * **** ** * * *** **** ** * */ +0x00, 0x00, 0x00, 0x00, 0x0a, 0x8b, 0xff, 0xff, 0xff, 0x8b, 0x0a, 0x00, 0x00, 0x00, 0x00, /* * *** **** ****** * **** ** * * *** **** ** * * * ** * *************************** * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * *** **** ****** * **** ** * * *** **** ** * * * ** * *************************** * * * * */ + +/* Character (0xa6): bbw=2, bbh=14, bbx=4, bby=0, width=11 */ +0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, /* ****** ****** */ +0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, /* ****** ****** ****** ****** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ****** ****** ****** ****** */ + +/* Character (0xa7): bbw=7, bbh=16, bbx=0, bby=-2, width=8 */ +0x38, 0xec, 0xc4, 0xc4, 0x9c, 0x98, 0x00, 0x00, /* *** ** *** * ** * ** *** * ** * */ +0x8f, 0x9c, 0x18, 0x39, 0x31, 0xf3, 0x0f, 0x00, /* *** ** *** * ** * ** *** * ** * **** * *** * ** * *** * ** ** ******** */ +0x01, 0x03, 0x02, 0x02, 0x03, 0x01, 0x00, 0x00, /* *** ** *** * ** * ** *** * ** * **** * *** * ** * *** * ** ** ******** * ** * * ** * */ + +/* Character (0xa8): bbw=6, bbh=2, bbx=2, bby=10, width=10 */ +0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, /* ** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ** */ + +/* Character (0xa9): bbw=14, bbh=14, bbx=0, bby=0, width=15 */ +0x80, 0x60, 0x10, 0x88, 0xc8, 0x64, 0x24, 0x24, 0x64, 0xe8, 0x08, 0x10, 0x60, 0x80, 0x00, /* * ** * * * * ** * ** * * * * * ** * *** * * ** * */ +0x07, 0x18, 0x20, 0x47, 0x4f, 0x98, 0x90, 0x90, 0x90, 0x48, 0x40, 0x20, 0x18, 0x07, 0x00, /* * ** * * * * ** * ** * * * * * ** * *** * * ** * *** ** * *** * **** * ** * * * * * * * * * * * ** *** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** * * * * ** * ** * * * * * ** * *** * * ** * *** ** * *** * **** * ** * * * * * * * * * * * ** *** */ + +/* Character (0xaa): bbw=7, bbh=8, bbx=0, bby=6, width=8 */ +0x68, 0xec, 0x94, 0x54, 0xfc, 0xf8, 0x80, 0x00, /* * ** ** *** * * * * * * ****** ***** * */ +0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, /* * ** ** *** * * * * * * ****** ***** * * * * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** ** *** * * * * * * ****** ***** * * * * * * * * */ + +/* Character (0xab): bbw=8, bbh=5, bbx=0, bby=3, width=9 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x04, 0x0e, 0x0a, 0x11, 0x04, 0x0e, 0x0a, 0x11, 0x00, /* * *** * * * * * *** * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * *** * * * * * *** * * * * */ + +/* Character (0xac): bbw=9, bbh=6, bbx=0, bby=2, width=10 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x3f, 0x3f, 0x00, /* ** ** ** ** ** ** ** ****** ****** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ** ** ** ** ****** ****** */ + +/* Character (0xad): bbw=5, bbh=2, bbx=0, bby=4, width=6 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, /* ** ** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ** ** */ + +/* Character (0xae): bbw=14, bbh=14, bbx=0, bby=0, width=15 */ +0x80, 0x60, 0x10, 0x28, 0xe8, 0xe4, 0x24, 0x24, 0xe4, 0xc8, 0x08, 0x10, 0x60, 0x80, 0x00, /* * ** * * * * *** * *** * * * * * *** * ** * * ** * */ +0x07, 0x18, 0x20, 0x48, 0x4f, 0x8f, 0x89, 0x83, 0x8f, 0x4c, 0x48, 0x20, 0x18, 0x07, 0x00, /* * ** * * * * *** * *** * * * * * *** * ** * * ** * *** ** * * * **** * **** ** * *** ***** * ** * * * * ** *** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** * * * * *** * *** * * * * * *** * ** * * ** * *** ** * * * **** * **** ** * *** ***** * ** * * * * ** *** */ + +/* Character (0xaf): bbw=6, bbh=2, bbx=1, bby=10, width=8 */ +0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, /* ** ** ** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ** ** ** */ + +/* Character (0xb0): bbw=6, bbh=6, bbx=0, bby=8, width=7 */ +0x78, 0xcc, 0x84, 0x84, 0xcc, 0x78, 0x00, /* **** ** ** * * * * ** ** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ** ** * * * * ** ** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ** ** * * * * ** ** **** */ + +/* Character (0xb1): bbw=10, bbh=11, bbx=0, bby=0, width=11 */ +0x00, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, /* *** *** */ +0xc3, 0xc3, 0xc3, 0xc3, 0xdf, 0xdf, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, /* *** *** ** **** **** **** ******* ******* **** **** **** **** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* *** *** ** **** **** **** ******* ******* **** **** **** **** ** */ + +/* Character (0xb2): bbw=6, bbh=8, bbx=0, bby=6, width=6 */ +0x18, 0x9c, 0xc4, 0x64, 0x3c, 0x18, /* ** *** * * ** * ** **** ** */ +0x03, 0x03, 0x02, 0x02, 0x02, 0x03, /* ** *** * * ** * ** **** ** ** ** * * * ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** *** * * ** * ** **** ** ** ** * * * ** */ + +/* Character (0xb3): bbw=6, bbh=8, bbx=0, bby=6, width=6 */ +0x88, 0x8c, 0x24, 0x24, 0xfc, 0xd8, /* * * ** * * * * * ****** ** ** */ +0x01, 0x03, 0x02, 0x02, 0x03, 0x01, /* * * ** * * * * * ****** ** *** ** * * ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ** * * * * * ****** ** *** ** * * ** * */ + +/* Character (0xb4): bbw=5, bbh=4, bbx=1, bby=10, width=7 */ +0x00, 0x20, 0x30, 0x18, 0x1c, 0x0c, 0x00, /* * ** ** *** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** ** *** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** ** *** ** */ + +/* Character (0xb5): bbw=12, bbh=13, bbx=0, bby=-4, width=13 */ +0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, /* * * * * * * * * */ +0x00, 0xff, 0xff, 0xff, 0xc0, 0x80, 0x80, 0x40, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * * * * * * * ************************ ** * * * ************************ * */ +0x00, 0x07, 0x0f, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * ************************ ** * * * ************************ * *** **** ** */ + +/* Character (0xb6): bbw=13, bbh=14, bbx=0, bby=0, width=14 */ +0xf0, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x00, /* **** ***** ****** ****** ****** ****** ****** * * ****** ****** ****** * */ +0x00, 0x01, 0x03, 0x83, 0xff, 0xff, 0xff, 0x80, 0x80, 0xff, 0xff, 0xff, 0x80, 0x00, /* **** ***** ****** ****** ****** ****** ****** * * ****** ****** ****** * * ** ** ************************* * ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ***** ****** ****** ****** ****** ****** * * ****** ****** ****** * * ** ** ************************* * ************************* * */ + +/* Character (0xb7): bbw=4, bbh=4, bbx=0, bby=3, width=5 */ +0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x0c, 0x1e, 0x1e, 0x0c, 0x00, /* ** **** **** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** **** ** */ + +/* Character (0xb8): bbw=4, bbh=4, bbx=1, bby=-4, width=6 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x00, 0x08, 0x0b, 0x0e, 0x06, 0x00, /* *** * *** ** */ + +/* Character (0xb9): bbw=6, bbh=8, bbx=0, bby=6, width=6 */ +0x08, 0x08, 0xfc, 0xfc, 0x00, 0x00, /* * * ****** ****** */ +0x02, 0x02, 0x03, 0x03, 0x02, 0x02, /* * * ****** ****** * * ** ** * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ****** ****** * * ** ** * * */ + +/* Character (0xba): bbw=6, bbh=8, bbx=0, bby=6, width=7 */ +0x78, 0xfc, 0x84, 0x84, 0xfc, 0x78, 0x00, /* **** ****** * * * * ****** **** */ +0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, /* **** ****** * * * * ****** **** * * * * * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ****** * * * * ****** **** * * * * * * */ + +/* Character (0xbb): bbw=8, bbh=5, bbx=0, bby=3, width=9 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ +0x11, 0x0a, 0x0e, 0x04, 0x11, 0x0a, 0x0e, 0x04, 0x00, /* * * * * *** * * * * * *** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * *** * * * * * *** * */ + +/* Character (0xbc): bbw=14, bbh=14, bbx=0, bby=0, width=15 */ +0x08, 0x08, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0x3c, 0x0c, 0x00, 0x00, 0x00, 0x00, /* * * ****** ****** ** **** **** ** */ +0x02, 0x02, 0x03, 0xc3, 0xf2, 0x3e, 0x0f, 0x33, 0x38, 0x2c, 0xa6, 0xff, 0xff, 0xa0, 0x00, /* * * ****** ****** ** **** **** ** * * ** ** ** * **** ***** **** ** ** *** ** * ** * ***************** * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ****** ****** ** **** **** ** * * ** ** ** * **** ***** **** ** ** *** ** * ** * ***************** * * */ + +/* Character (0xbd): bbw=14, bbh=14, bbx=0, bby=0, width=15 */ +0x08, 0x08, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0x3c, 0x0c, 0x00, 0x00, 0x00, 0x00, /* * * ****** ****** ** **** **** ** */ +0x02, 0x02, 0x03, 0xc3, 0xf2, 0x3e, 0x0f, 0x03, 0xc6, 0xe7, 0xb1, 0x99, 0x8f, 0xc6, 0x00, /* * * ****** ****** ** **** **** ** * * ** ** ** * **** ***** **** ** ** ***** **** ** ** ** ***** * ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ****** ****** ** **** **** ** * * ** ** ** * **** ***** **** ** ** ***** **** ** ** ** ***** * ** ** */ + +/* Character (0xbe): bbw=14, bbh=14, bbx=0, bby=0, width=15 */ +0x88, 0x8c, 0x24, 0x24, 0xfc, 0xd8, 0x00, 0xc0, 0xf0, 0x3c, 0x0c, 0x00, 0x00, 0x00, 0x00, /* * * ** * * * * * ****** ** ** ** **** **** ** */ +0x01, 0x03, 0x02, 0xc2, 0xf3, 0x3d, 0x0f, 0x33, 0x38, 0x2c, 0xa6, 0xff, 0xff, 0xa0, 0x00, /* * * ** * * * * * ****** ** ** ** **** **** ** * ** * * **** ***** **** **** ** ** *** ** * ** * ***************** * * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ** * * * * * ****** ** ** ** **** **** ** * ** * * **** ***** **** **** ** ** *** ** * ** * ***************** * * */ + +/* Character (0xbf): bbw=9, bbh=14, bbx=0, bby=-4, width=10 */ +0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0x80, 0x00, 0x00, 0x00, /* * ** ** * */ +0x80, 0xc0, 0xe0, 0x31, 0x1b, 0x0b, 0x81, 0x80, 0x00, 0x00, /* * ** ** * * ** **** ** ** ** ** * * * * */ +0x07, 0x0f, 0x0f, 0x0c, 0x08, 0x08, 0x07, 0x07, 0x03, 0x00, /* * ** ** * * ** **** ** ** ** ** * * * * *** ******** ** * **** *** ** */ + +/* Character (0xc0): bbw=14, bbh=19, bbx=0, bby=0, width=14 */ +0x00, 0x00, 0x00, 0x00, 0xc0, 0x70, 0x7d, 0xfd, 0xf0, 0x80, 0x00, 0x00, 0x00, 0x00, /* ** *** * ***** * ****** **** * */ +0x80, 0xe0, 0xb8, 0x0e, 0x0b, 0x08, 0x08, 0x0b, 0x9f, 0xff, 0xfe, 0xf0, 0xc0, 0x80, /* ** *** * ***** * ****** **** * * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * */ +0x00, 0x00, 0x00, 0x06, 0x0e, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** *** * ***** * ****** **** * * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * ** *** ** * */ + +/* Character (0xc1): bbw=14, bbh=19, bbx=0, bby=0, width=14 */ +0x00, 0x00, 0x00, 0x00, 0xc0, 0x70, 0x7d, 0xfd, 0xf0, 0x80, 0x00, 0x00, 0x00, 0x00, /* ** *** * ***** * ****** **** * */ +0x80, 0xe0, 0xb8, 0x0e, 0x0b, 0x08, 0x08, 0x0b, 0x9f, 0xff, 0xfe, 0xf0, 0xc0, 0x80, /* ** *** * ***** * ****** **** * * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0e, 0x06, 0x00, 0x00, 0x00, /* ** *** * ***** * ****** **** * * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * * ** *** ** */ + +/* Character (0xc2): bbw=14, bbh=18, bbx=0, bby=0, width=14 */ +0x00, 0x00, 0x00, 0x00, 0xc1, 0x71, 0x7c, 0xfc, 0xf0, 0x81, 0x01, 0x00, 0x00, 0x00, /* * *** *** ***** ****** ***** ** */ +0x80, 0xe0, 0xb8, 0x0e, 0x0b, 0x08, 0x08, 0x0b, 0x9f, 0xff, 0xfe, 0xf0, 0xc0, 0x80, /* * *** *** ***** ****** ***** ** * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0c, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, /* * *** *** ***** ****** ***** ** * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * * ** ** ** * */ + +/* Character (0xc3): bbw=14, bbh=18, bbx=0, bby=0, width=14 */ +0x00, 0x00, 0x00, 0x01, 0xc0, 0x70, 0x7c, 0xfd, 0xf1, 0x80, 0x00, 0x00, 0x00, 0x00, /* * ** *** ***** * ******* **** * */ +0x80, 0xe0, 0xb8, 0x0e, 0x0b, 0x08, 0x08, 0x0b, 0x9f, 0xff, 0xfe, 0xf0, 0xc0, 0x80, /* * ** *** ***** * ******* **** * * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * */ +0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x04, 0x00, 0x00, 0x00, /* * ** *** ***** * ******* **** * * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * * ** ** * * * * */ + +/* Character (0xc4): bbw=14, bbh=17, bbx=0, bby=0, width=14 */ +0x00, 0x00, 0x00, 0x00, 0xc1, 0x71, 0x7c, 0xfc, 0xf1, 0x81, 0x00, 0x00, 0x00, 0x00, /* * *** *** ***** ******* ***** * */ +0x80, 0xe0, 0xb8, 0x0e, 0x0b, 0x08, 0x08, 0x0b, 0x9f, 0xff, 0xfe, 0xf0, 0xc0, 0x80, /* * *** *** ***** ******* ***** * * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * */ +0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, /* * *** *** ***** ******* ***** * * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * * * * * */ + +/* Character (0xc5): bbw=14, bbh=18, bbx=0, bby=0, width=14 */ +0x00, 0x00, 0x00, 0x00, 0xc0, 0x71, 0x7e, 0xfe, 0xf1, 0x80, 0x00, 0x00, 0x00, 0x00, /* *** *** ****** ******** **** * */ +0x80, 0xe0, 0xb8, 0x0e, 0x0b, 0x08, 0x08, 0x0b, 0x9f, 0xff, 0xfe, 0xf0, 0xc0, 0x80, /* *** *** ****** ******** **** * * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, /* *** *** ****** ******** **** * * *** *** * *** ** * * * ** * ***** ********* ******* **** ** * * * * * */ + +/* Character (0xc6): bbw=20, bbh=14, bbx=0, bby=0, width=21 */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc4, 0x74, 0x1c, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0x84, 0xe4, 0x0c, 0x1c, 0x7c, 0x00, /* * * ** * *** *** * ****** ****** ****** * * * * * *** ** *** ***** */ +0x80, 0xc0, 0xf0, 0x8c, 0x06, 0x07, 0x04, 0x84, 0x84, 0x84, 0xff, 0xff, 0xff, 0x81, 0x81, 0x83, 0x8f, 0xc0, 0xe0, 0xf8, 0x00, /* * * ** * *** *** * ****** ****** ****** * * * * * *** ** *** ***** * ** **** ** * ** *** * * * * * * ************************** ** *** ***** * ** *** ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ** * *** *** * ****** ****** ****** * * * * * *** ** *** ***** * ** **** ** * ** *** * * * * * * ************************** ** *** ***** * ** *** ***** */ + +/* Character (0xc7): bbw=12, bbh=18, bbx=1, bby=-4, width=14 */ +0x00, 0xc0, 0xf0, 0xf8, 0x78, 0x1c, 0x0c, 0x04, 0x04, 0x04, 0x08, 0x38, 0xfc, 0x00, /* ** **** ***** **** *** ** * * * * *** ****** */ +0x00, 0x0f, 0x3f, 0x7f, 0x78, 0xe0, 0xc0, 0x80, 0x80, 0x80, 0x40, 0x60, 0x18, 0x00, /* ** **** ***** **** *** ** * * * * *** ****** **** ****** ******* **** *** ** * * * * ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0b, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** ***** **** *** ** * * * * *** ****** **** ****** ******* **** *** ** * * * * ** ** *** * *** ** */ + +/* Character (0xc8): bbw=11, bbh=19, bbx=1, bby=0, width=13 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x05, 0x85, 0xe4, 0x0c, 0x1c, 0x7c, 0x00, /* * ****** ****** ****** * * * * * * * *** ** *** ***** */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x81, 0x81, 0x83, 0x8f, 0xc0, 0xe0, 0xf8, 0x00, /* * ****** ****** ****** * * * * * * * *** ** *** ***** ************************** ** *** ***** * ** *** ***** */ +0x00, 0x00, 0x00, 0x06, 0x0e, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * * * * *** ** *** ***** ************************** ** *** ***** * ** *** ***** ** *** ** * */ + +/* Character (0xc9): bbw=11, bbh=19, bbx=1, bby=0, width=13 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x05, 0x05, 0x84, 0xe4, 0x0c, 0x1c, 0x7c, 0x00, /* * ****** ****** ******* * * * * * * *** ** *** ***** */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x81, 0x81, 0x83, 0x8f, 0xc0, 0xe0, 0xf8, 0x00, /* * ****** ****** ******* * * * * * * *** ** *** ***** ************************** ** *** ***** * ** *** ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0e, 0x06, 0x00, 0x00, 0x00, /* * ****** ****** ******* * * * * * * *** ** *** ***** ************************** ** *** ***** * ** *** ***** * ** *** ** */ + +/* Character (0xca): bbw=11, bbh=18, bbx=1, bby=0, width=13 */ +0x00, 0x04, 0xfc, 0xfd, 0xfd, 0x04, 0x04, 0x84, 0xe5, 0x0d, 0x1c, 0x7c, 0x00, /* * ******* ******* ****** * * * ** * **** ** *** ***** */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x81, 0x81, 0x83, 0x8f, 0xc0, 0xe0, 0xf8, 0x00, /* * ******* ******* ****** * * * ** * **** ** *** ***** ************************** ** *** ***** * ** *** ***** */ +0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0c, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, /* * ******* ******* ****** * * * ** * **** ** *** ***** ************************** ** *** ***** * ** *** ***** * ** ** ** * */ + +/* Character (0xcb): bbw=11, bbh=17, bbx=1, bby=0, width=13 */ +0x00, 0x04, 0xfc, 0xfc, 0xfd, 0x05, 0x04, 0x84, 0xe5, 0x0d, 0x1c, 0x7c, 0x00, /* * ****** ******* ******* * * * ** * **** ** *** ***** */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x81, 0x81, 0x83, 0x8f, 0xc0, 0xe0, 0xf8, 0x00, /* * ****** ******* ******* * * * ** * **** ** *** ***** ************************** ** *** ***** * ** *** ***** */ +0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, /* * ****** ******* ******* * * * ** * **** ** *** ***** ************************** ** *** ***** * ** *** ***** * * * * */ + +/* Character (0xcc): bbw=5, bbh=19, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0x04, 0xfc, 0xfc, 0xfd, 0x05, 0x00, 0x00, /* * ****** ******* ******* * */ +0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, /* * ****** ******* ******* * ************************* * */ +0x00, 0x00, 0x06, 0x0e, 0x0c, 0x08, 0x00, 0x00, 0x00, /* * ****** ******* ******* * ************************* * ** *** ** * */ + +/* Character (0xcd): bbw=6, bbh=19, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0x04, 0xfd, 0xfd, 0xfc, 0x04, 0x00, 0x00, /* * * ******* ****** ****** * */ +0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, /* * * ******* ****** ****** * ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0e, 0x06, 0x00, /* * * ******* ****** ****** * ************************* * * ** *** ** */ + +/* Character (0xce): bbw=7, bbh=18, bbx=1, bby=0, width=9 */ +0x00, 0x01, 0x05, 0xfc, 0xfc, 0xfc, 0x05, 0x01, 0x00, /* * * * ****** ****** ******* * * */ +0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, /* * * * ****** ****** ******* * * ************************* * */ +0x00, 0x00, 0x08, 0x0c, 0x0c, 0x0c, 0x08, 0x00, 0x00, /* * * * ****** ****** ******* * * ************************* * * ** ** ** * */ + +/* Character (0xcf): bbw=6, bbh=17, bbx=2, bby=0, width=9 */ +0x00, 0x00, 0x05, 0xfd, 0xfc, 0xfc, 0x05, 0x01, 0x00, /* * * * ****** ****** ******* * * */ +0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, /* * * * ****** ****** ******* * * ************************* * */ +0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, /* * * * ****** ****** ******* * * ************************* * * * * * */ + +/* Character (0xd0): bbw=15, bbh=14, bbx=0, bby=0, width=16 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x04, 0x04, 0x04, 0x0c, 0x1c, 0x78, 0xf8, 0xf0, 0xc0, 0x00, /* * ****** ****** ****** * * * * ** *** **** ***** **** ** */ +0x01, 0x81, 0xff, 0xff, 0xff, 0x81, 0x81, 0x80, 0x80, 0xc0, 0xe0, 0x78, 0x7f, 0x3f, 0x0f, 0x00, /* * ****** ****** ****** * * * * ** *** **** ***** **** ** * * ************************** ** * * * ** *** **** ******* ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * ** *** **** ***** **** ** * * ************************** ** * * * ** *** **** ******* ****** **** */ + +/* Character (0xd1): bbw=15, bbh=18, bbx=1, bby=0, width=16 */ +0x00, 0x04, 0x0c, 0xfc, 0x3c, 0x7d, 0xf8, 0xe0, 0xc0, 0x81, 0x01, 0x04, 0x0c, 0xfc, 0x0c, 0x04, /* * ** ****** **** * ***** ***** *** *** ** * ** ****** ** * */ +0x00, 0x80, 0xc0, 0xff, 0xc0, 0x80, 0x00, 0x01, 0x07, 0x0f, 0x3e, 0x7c, 0xf0, 0xff, 0x00, 0x00, /* * ** ****** **** * ***** ***** *** *** ** * ** ****** ** * * ********** ** * * *** **** ***** ***** ************ */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x04, 0x00, 0x00, 0x00, /* * ** ****** **** * ***** ***** *** *** ** * ** ****** ** * * ********** ** * * *** **** ***** ***** ************ * ** ** * * * * */ + +/* Character (0xd2): bbw=15, bbh=19, bbx=0, bby=0, width=16 */ +0xc0, 0xf0, 0xf8, 0x78, 0x1c, 0x0c, 0x04, 0x05, 0x05, 0x0c, 0x1c, 0x78, 0xf8, 0xf0, 0xc0, 0x00, /* ** **** ***** **** *** ** * * * * * ** *** **** ***** **** ** */ +0x0f, 0x3f, 0x7f, 0x78, 0xe0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xe0, 0x78, 0x7f, 0x3f, 0x0f, 0x00, /* ** **** ***** **** *** ** * * * * * ** *** **** ***** **** ** **** ****** ******* **** *** ** * * * ** *** **** ******* ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** ***** **** *** ** * * * * * ** *** **** ***** **** ** **** ****** ******* **** *** ** * * * ** *** **** ******* ****** **** ** *** ** * */ + +/* Character (0xd3): bbw=15, bbh=19, bbx=0, bby=0, width=16 */ +0xc0, 0xf0, 0xf8, 0x78, 0x1c, 0x0c, 0x05, 0x05, 0x04, 0x0c, 0x1c, 0x78, 0xf8, 0xf0, 0xc0, 0x00, /* ** **** ***** **** *** ** * * * * * ** *** **** ***** **** ** */ +0x0f, 0x3f, 0x7f, 0x78, 0xe0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xe0, 0x78, 0x7f, 0x3f, 0x0f, 0x00, /* ** **** ***** **** *** ** * * * * * ** *** **** ***** **** ** **** ****** ******* **** *** ** * * * ** *** **** ******* ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** ***** **** *** ** * * * * * ** *** **** ***** **** ** **** ****** ******* **** *** ** * * * ** *** **** ******* ****** **** * ** *** ** */ + +/* Character (0xd4): bbw=15, bbh=18, bbx=0, bby=0, width=16 */ +0xc0, 0xf0, 0xf8, 0x78, 0x1d, 0x0d, 0x04, 0x04, 0x04, 0x0d, 0x1d, 0x78, 0xf8, 0xf0, 0xc0, 0x00, /* ** **** ***** **** * *** * ** * * * * ** * *** **** ***** **** ** */ +0x0f, 0x3f, 0x7f, 0x78, 0xe0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xe0, 0x78, 0x7f, 0x3f, 0x0f, 0x00, /* ** **** ***** **** * *** * ** * * * * ** * *** **** ***** **** ** **** ****** ******* **** *** ** * * * ** *** **** ******* ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0c, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** ***** **** * *** * ** * * * * ** * *** **** ***** **** ** **** ****** ******* **** *** ** * * * ** *** **** ******* ****** **** * ** ** ** * */ + +/* Character (0xd5): bbw=15, bbh=18, bbx=0, bby=0, width=16 */ +0xc0, 0xf0, 0xf8, 0x78, 0x1d, 0x0c, 0x04, 0x04, 0x05, 0x0d, 0x1c, 0x78, 0xf8, 0xf0, 0xc0, 0x00, /* ** **** ***** **** * *** ** * * * * * ** *** **** ***** **** ** */ +0x0f, 0x3f, 0x7f, 0x78, 0xe0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xe0, 0x78, 0x7f, 0x3f, 0x0f, 0x00, /* ** **** ***** **** * *** ** * * * * * ** *** **** ***** **** ** **** ****** ******* **** *** ** * * * ** *** **** ******* ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, /* ** **** ***** **** * *** ** * * * * * ** *** **** ***** **** ** **** ****** ******* **** *** ** * * * ** *** **** ******* ****** **** * ** ** * * * * */ + +/* Character (0xd6): bbw=15, bbh=17, bbx=0, bby=0, width=16 */ +0xc0, 0xf0, 0xf8, 0x78, 0x1c, 0x0d, 0x05, 0x04, 0x04, 0x0d, 0x1d, 0x78, 0xf8, 0xf0, 0xc0, 0x00, /* ** **** ***** **** *** * ** * * * * * ** * *** **** ***** **** ** */ +0x0f, 0x3f, 0x7f, 0x78, 0xe0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xe0, 0x78, 0x7f, 0x3f, 0x0f, 0x00, /* ** **** ***** **** *** * ** * * * * * ** * *** **** ***** **** ** **** ****** ******* **** *** ** * * * ** *** **** ******* ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** ***** **** *** * ** * * * * * ** * *** **** ***** **** ** **** ****** ******* **** *** ** * * * ** *** **** ******* ****** **** * * * * */ + +/* Character (0xd7): bbw=10, bbh=10, bbx=0, bby=0, width=11 */ +0xc0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0x00, /* ** ** * * ** ** */ +0xc0, 0xe1, 0x73, 0x3f, 0x1e, 0x1e, 0x3f, 0x73, 0xe1, 0xc0, 0x00, /* ** ** * * ** ** *** ***** *** ****** **** **** ****** ** *** * *** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** * * ** ** *** ***** *** ****** **** **** ****** ** *** * *** ** */ + +/* Character (0xd8): bbw=14, bbh=14, bbx=1, bby=0, width=16 */ +0x00, 0xc0, 0xf0, 0xf8, 0x38, 0x0c, 0x04, 0x04, 0x84, 0x4c, 0x3c, 0x78, 0xf8, 0xf4, 0xc0, 0x00, /* ** **** ***** *** ** * * * * ** * **** **** ***** * **** ** */ +0x00, 0x8f, 0x7f, 0x7f, 0x70, 0xc8, 0x84, 0x83, 0x80, 0xc0, 0xe0, 0x78, 0x7f, 0x3f, 0x0f, 0x00, /* ** **** ***** *** ** * * * * ** * **** **** ***** * **** ** **** ******** ******* *** * ** * *** * * ** *** **** ******* ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** **** ***** *** ** * * * * ** * **** **** ***** * **** ** **** ******** ******* *** * ** * *** * * ** *** **** ******* ****** **** */ + +/* Character (0xd9): bbw=14, bbh=19, bbx=1, bby=0, width=16 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x00, 0x00, 0x01, 0x01, 0x04, 0x0c, 0xfc, 0x0c, 0x04, 0x00, /* * ****** ****** ****** * * * * ** ****** ** * */ +0x00, 0x00, 0x3f, 0x7f, 0xff, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x3f, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * ** ****** ** * ****** ******* ******** ** * * * * * * ****** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * ** ****** ** * ****** ******* ******** ** * * * * * * ****** ** *** ** * */ + +/* Character (0xda): bbw=14, bbh=19, bbx=1, bby=0, width=16 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x04, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0c, 0xfc, 0x0c, 0x04, 0x00, /* * ****** ****** ****** * * * * ** ****** ** * */ +0x00, 0x00, 0x3f, 0x7f, 0xff, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x3f, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * ** ****** ** * ****** ******* ******** ** * * * * * * ****** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * ** ****** ** * ****** ******* ******** ** * * * * * * ****** * ** *** ** */ + +/* Character (0xdb): bbw=14, bbh=18, bbx=1, bby=0, width=16 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x05, 0x01, 0x00, 0x00, 0x00, 0x05, 0x0d, 0xfc, 0x0c, 0x04, 0x00, /* * ****** ****** ******* * * * * * ** ****** ** * */ +0x00, 0x00, 0x3f, 0x7f, 0xff, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x3f, 0x00, 0x00, 0x00, /* * ****** ****** ******* * * * * * ** ****** ** * ****** ******* ******** ** * * * * * * ****** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0c, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ******* * * * * * ** ****** ** * ****** ******* ******** ** * * * * * * ****** * ** ** ** * */ + +/* Character (0xdc): bbw=14, bbh=17, bbx=1, bby=0, width=16 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x05, 0x01, 0x00, 0x00, 0x01, 0x05, 0x0c, 0xfc, 0x0c, 0x04, 0x00, /* * ****** ****** ******* * * * * * ** ****** ** * */ +0x00, 0x00, 0x3f, 0x7f, 0xff, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x3f, 0x00, 0x00, 0x00, /* * ****** ****** ******* * * * * * ** ****** ** * ****** ******* ******** ** * * * * * * ****** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ******* * * * * * ** ****** ** * ****** ******* ******** ** * * * * * * ****** * * * * */ + +/* Character (0xdd): bbw=13, bbh=19, bbx=1, bby=0, width=15 */ +0x00, 0x04, 0x1c, 0x7c, 0xfc, 0xf4, 0xc0, 0x01, 0x01, 0x80, 0xe4, 0x3c, 0x0c, 0x04, 0x00, /* * *** ***** ****** * **** *** * * * *** **** ** * */ +0x00, 0x00, 0x00, 0x00, 0x01, 0x87, 0xff, 0xff, 0xff, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* * *** ***** ****** * **** *** * * * *** **** ** * * *** *************************** * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c, 0x0e, 0x06, 0x00, 0x00, 0x00, /* * *** ***** ****** * **** *** * * * *** **** ** * * *** *************************** * * ** *** ** */ + +/* Character (0xde): bbw=12, bbh=14, bbx=1, bby=0, width=14 */ +0x00, 0x04, 0xfc, 0xfc, 0xfc, 0x24, 0x20, 0x20, 0x20, 0x60, 0xe0, 0xc0, 0xc0, 0x00, /* * ****** ****** ****** * * * * * ** *** ** ** */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x90, 0x10, 0x10, 0x10, 0x18, 0x0f, 0x0f, 0x07, 0x00, /* * ****** ****** ****** * * * * * ** *** ** ** ************************* * * * * * ** **** **** *** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * * ** *** ** ** ************************* * * * * * ** **** **** *** */ + +/* Character (0xdf): bbw=11, bbh=14, bbx=0, bby=0, width=12 */ +0x00, 0xf0, 0xf8, 0xfc, 0x04, 0x04, 0x0c, 0xf8, 0xf8, 0x70, 0x00, 0x00, /* **** ***** ****** * * ** ***** ***** *** */ +0x80, 0xff, 0xff, 0xff, 0x00, 0x81, 0x81, 0xc3, 0x7e, 0x7e, 0x3c, 0x00, /* **** ***** ****** * * ** ***** ***** *** ************************* * ** *** ** ****** ****** **** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* **** ***** ****** * * ** ***** ***** *** ************************* * ** *** ** ****** ****** **** */ + +/* Character (0xe0): bbw=10, bbh=14, bbx=0, bby=0, width=11 */ +0x00, 0x80, 0x8c, 0x9c, 0x98, 0xb0, 0xa0, 0x80, 0x00, 0x00, 0x00, /* * ** * *** * ** * ** * * * * */ +0x73, 0xf3, 0xf9, 0x88, 0x88, 0x44, 0xff, 0xff, 0xff, 0x80, 0x00, /* * ** * *** * ** * ** * * * * ** *** ** ***** ***** * * * * * * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** * *** * ** * ** * * * * ** *** ** ***** ***** * * * * * * ************************ * */ + +/* Character (0xe1): bbw=10, bbh=14, bbx=0, bby=0, width=11 */ +0x00, 0x80, 0xa0, 0xb0, 0x98, 0x9c, 0x8c, 0x80, 0x00, 0x00, 0x00, /* * * * ** * ** * *** * ** * * */ +0x73, 0xf3, 0xf9, 0x88, 0x88, 0x44, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * * ** * ** * *** * ** * * ** *** ** ***** ***** * * * * * * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * ** * ** * *** * ** * * ** *** ** ***** ***** * * * * * * ************************ * */ + +/* Character (0xe2): bbw=10, bbh=13, bbx=0, bby=0, width=11 */ +0x00, 0xa0, 0xb0, 0x98, 0x98, 0x98, 0xb0, 0xa0, 0x00, 0x00, 0x00, /* * * ** * ** * ** * ** * ** * * * */ +0x73, 0xf3, 0xf9, 0x88, 0x88, 0x44, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * ** * ** * ** * ** * ** * * * ** *** ** ***** ***** * * * * * * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ** * ** * ** * ** * ** * * * ** *** ** ***** ***** * * * * * * ************************ * */ + +/* Character (0xe3): bbw=10, bbh=13, bbx=0, bby=0, width=11 */ +0x00, 0xa0, 0x90, 0x98, 0x98, 0xb0, 0xb0, 0x90, 0x08, 0x00, 0x00, /* * * * * ** * ** * ** * ** * * * * */ +0x73, 0xf3, 0xf9, 0x88, 0x88, 0x44, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * * * ** * ** * ** * ** * * * * ** *** ** ***** ***** * * * * * * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * ** * ** * ** * ** * * * * ** *** ** ***** ***** * * * * * * ************************ * */ + +/* Character (0xe4): bbw=10, bbh=12, bbx=0, bby=0, width=11 */ +0x00, 0x80, 0xb0, 0xb0, 0x80, 0x80, 0xb0, 0xb0, 0x00, 0x00, 0x00, /* * ** * ** * * * ** * ** * */ +0x73, 0xf3, 0xf9, 0x88, 0x88, 0x44, 0xff, 0xff, 0xff, 0x80, 0x00, /* * ** * ** * * * ** * ** * ** *** ** ***** ***** * * * * * * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** * ** * * * ** * ** * ** *** ** ***** ***** * * * * * * ************************ * */ + +/* Character (0xe5): bbw=10, bbh=14, bbx=0, bby=0, width=11 */ +0x00, 0x80, 0x80, 0x98, 0xa4, 0xa4, 0x98, 0x80, 0x00, 0x00, 0x00, /* * * ** * * * * * * * ** * * */ +0x73, 0xf3, 0xf9, 0x88, 0x88, 0x44, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * ** * * * * * * * ** * * ** *** ** ***** ***** * * * * * * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ** * * * * * * * ** * * ** *** ** ***** ***** * * * * * * ************************ * */ + +/* Character (0xe6): bbw=16, bbh=9, bbx=0, bby=0, width=17 */ +0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * * * */ +0x72, 0xf3, 0xfb, 0x88, 0x88, 0x44, 0x7f, 0x7f, 0xff, 0xc9, 0x88, 0x88, 0x89, 0x8f, 0x4f, 0x6e, 0x00, /* * * * * * * * * * * * *** ** ****** ***** * * * * * * ******* ******* ********* * ** * * * ** * ***** ***** * *** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * * * * * * *** ** ****** ***** * * * * * * ******* ******* ********* * ** * * * ** * ***** ***** * *** ** */ + +/* Character (0xe7): bbw=9, bbh=13, bbx=0, bby=-4, width=10 */ +0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, /* * * * * * */ +0x3e, 0x7f, 0x7f, 0xc1, 0x80, 0x80, 0x81, 0x43, 0x63, 0x00, /* * * * * * ***** ******* ******* * ** * ** *** * ** ** */ +0x00, 0x00, 0x08, 0x0b, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, /* * * * * * ***** ******* ******* * ** * ** *** * ** ** *** * *** ** */ + +/* Character (0xe8): bbw=10, bbh=14, bbx=0, bby=0, width=11 */ +0x00, 0x00, 0x0c, 0x9c, 0x98, 0xb0, 0xa0, 0x00, 0x00, 0x00, 0x00, /* ** *** * ** * ** * * * */ +0x3e, 0x7f, 0x7f, 0xc9, 0x88, 0x88, 0x89, 0x8f, 0x4f, 0x6e, 0x00, /* ** *** * ** * ** * * * ***** ******* ******* * * ** * * * ** * ***** ***** * *** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** *** * ** * ** * * * ***** ******* ******* * * ** * * * ** * ***** ***** * *** ** */ + +/* Character (0xe9): bbw=10, bbh=14, bbx=0, bby=0, width=11 */ +0x00, 0x00, 0x20, 0xb0, 0x98, 0x9c, 0x8c, 0x00, 0x00, 0x00, 0x00, /* * ** * ** * *** * ** * */ +0x3e, 0x7f, 0x7f, 0xc9, 0x88, 0x88, 0x89, 0x8f, 0x4f, 0x6e, 0x00, /* * ** * ** * *** * ** * ***** ******* ******* * * ** * * * ** * ***** ***** * *** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** * ** * *** * ** * ***** ******* ******* * * ** * * * ** * ***** ***** * *** ** */ + +/* Character (0xea): bbw=10, bbh=13, bbx=0, bby=0, width=11 */ +0x00, 0x00, 0x20, 0xb0, 0x98, 0x98, 0x98, 0x30, 0x20, 0x00, 0x00, /* * ** * ** * ** * ** * ** * */ +0x3e, 0x7f, 0x7f, 0xc9, 0x88, 0x88, 0x89, 0x8f, 0x4f, 0x6e, 0x00, /* * ** * ** * ** * ** * ** * ***** ******* ******* * * ** * * * ** * ***** ***** * *** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** * ** * ** * ** * ** * ***** ******* ******* * * ** * * * ** * ***** ***** * *** ** */ + +/* Character (0xeb): bbw=10, bbh=12, bbx=0, bby=0, width=11 */ +0x00, 0x00, 0x30, 0xb0, 0x80, 0x80, 0xb0, 0x30, 0x00, 0x00, 0x00, /* ** ** * * * ** * ** */ +0x3e, 0x7f, 0x7f, 0xc9, 0x88, 0x88, 0x89, 0x8f, 0x4f, 0x6e, 0x00, /* ** ** * * * ** * ** ***** ******* ******* * * ** * * * ** * ***** ***** * *** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** * * * ** * ** ***** ******* ******* * * ** * * * ** * ***** ***** * *** ** */ + +/* Character (0xec): bbw=5, bbh=14, bbx=0, bby=0, width=6 */ +0x8c, 0x9c, 0x98, 0xb0, 0x20, 0x00, /* ** * *** * ** * ** * * */ +0x80, 0xff, 0xff, 0xff, 0x80, 0x00, /* ** * *** * ** * ** * * ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** * *** * ** * ** * * ************************* * */ + +/* Character (0xed): bbw=5, bbh=14, bbx=0, bby=0, width=6 */ +0xa0, 0xb0, 0x98, 0x9c, 0x0c, 0x00, /* * * ** * ** * *** * ** */ +0x80, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * ** * ** * *** * ** ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ** * ** * *** * ** ************************* * */ + +/* Character (0xee): bbw=7, bbh=13, bbx=0, bby=0, width=7 */ +0x20, 0xb0, 0x98, 0x98, 0x98, 0x30, 0x20, /* * ** * ** * ** * ** * ** * */ +0x00, 0x80, 0xff, 0xff, 0xff, 0x80, 0x00, /* * ** * ** * ** * ** * ** * ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** * ** * ** * ** * ** * ************************* * */ + +/* Character (0xef): bbw=6, bbh=12, bbx=0, bby=0, width=6 */ +0xb0, 0xb0, 0x80, 0x80, 0x30, 0x30, /* ** * ** * * * ** ** */ +0x80, 0xff, 0xff, 0xff, 0x80, 0x00, /* ** * ** * * * ** ** ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** * ** * * * ** ** ************************* * */ + +/* Character (0xf0): bbw=11, bbh=14, bbx=0, bby=0, width=12 */ +0x00, 0x24, 0x24, 0x98, 0x98, 0xb0, 0xe8, 0xc8, 0x80, 0x00, 0x00, 0x00, /* * * * * ** * ** * ** * * *** * ** * */ +0x3e, 0x7f, 0x7f, 0xc1, 0x80, 0x80, 0x80, 0xc1, 0x7f, 0x7f, 0x3e, 0x00, /* * * * * ** * ** * ** * * *** * ** * ***** ******* ******* * ** * * ** ********* ******* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * ** * ** * ** * * *** * ** * ***** ******* ******* * ** * * ** ********* ******* ***** */ + +/* Character (0xf1): bbw=12, bbh=13, bbx=0, bby=0, width=13 */ +0x80, 0x80, 0xa0, 0x90, 0x18, 0x98, 0xb0, 0xb0, 0x90, 0x88, 0x00, 0x00, 0x00, /* * * * * * * ** ** * ** * ** * * * * * */ +0x80, 0xff, 0xff, 0xff, 0x81, 0x00, 0x00, 0x81, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * * * * * ** ** * ** * ** * * * * * ************************** * * ************************* * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * ** ** * ** * ** * * * * * ************************** * * ************************* * */ + +/* Character (0xf2): bbw=11, bbh=14, bbx=0, bby=0, width=12 */ +0x00, 0x00, 0x00, 0x8c, 0x9c, 0x98, 0xb0, 0xa0, 0x00, 0x00, 0x00, 0x00, /* ** * *** * ** * ** * * * */ +0x3e, 0x7f, 0x7f, 0xc1, 0x80, 0x80, 0x80, 0xc1, 0x7f, 0x7f, 0x3e, 0x00, /* ** * *** * ** * ** * * * ***** ******* ******* * ** * * ** ********* ******* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** * *** * ** * ** * * * ***** ******* ******* * ** * * ** ********* ******* ***** */ + +/* Character (0xf3): bbw=11, bbh=14, bbx=0, bby=0, width=12 */ +0x00, 0x00, 0x00, 0xa0, 0xb0, 0x98, 0x9c, 0x8c, 0x00, 0x00, 0x00, 0x00, /* * * ** * ** * *** * ** * */ +0x3e, 0x7f, 0x7f, 0xc1, 0x80, 0x80, 0x80, 0xc1, 0x7f, 0x7f, 0x3e, 0x00, /* * * ** * ** * *** * ** * ***** ******* ******* * ** * * ** ********* ******* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ** * ** * *** * ** * ***** ******* ******* * ** * * ** ********* ******* ***** */ + +/* Character (0xf4): bbw=11, bbh=13, bbx=0, bby=0, width=12 */ +0x00, 0x00, 0x20, 0xb0, 0x98, 0x98, 0x98, 0xb0, 0x20, 0x00, 0x00, 0x00, /* * ** * ** * ** * ** * ** * * */ +0x3e, 0x7f, 0x7f, 0xc1, 0x80, 0x80, 0x80, 0xc1, 0x7f, 0x7f, 0x3e, 0x00, /* * ** * ** * ** * ** * ** * * ***** ******* ******* * ** * * ** ********* ******* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ** * ** * ** * ** * ** * * ***** ******* ******* * ** * * ** ********* ******* ***** */ + +/* Character (0xf5): bbw=11, bbh=13, bbx=0, bby=0, width=12 */ +0x00, 0x20, 0x10, 0x98, 0x98, 0xb0, 0xb0, 0x90, 0x08, 0x00, 0x00, 0x00, /* * * ** * ** * ** * ** * * * * */ +0x3e, 0x7f, 0x7f, 0xc1, 0x80, 0x80, 0x80, 0xc1, 0x7f, 0x7f, 0x3e, 0x00, /* * * ** * ** * ** * ** * * * * ***** ******* ******* * ** * * ** ********* ******* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * ** * ** * ** * ** * * * * ***** ******* ******* * ** * * ** ********* ******* ***** */ + +/* Character (0xf6): bbw=11, bbh=12, bbx=0, bby=0, width=12 */ +0x00, 0x00, 0x00, 0xb0, 0xb0, 0x80, 0x80, 0xb0, 0x30, 0x00, 0x00, 0x00, /* ** * ** * * * ** * ** */ +0x3e, 0x7f, 0x7f, 0xc1, 0x80, 0x80, 0x80, 0xc1, 0x7f, 0x7f, 0x3e, 0x00, /* ** * ** * * * ** * ** ***** ******* ******* * ** * * ** ********* ******* ***** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** * ** * * * ** * ** ***** ******* ******* * ** * * ** ********* ******* ***** */ + +/* Character (0xf7): bbw=10, bbh=10, bbx=0, bby=0, width=11 */ +0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** */ +0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, /* ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ + +/* Character (0xf8): bbw=10, bbh=11, bbx=0, bby=-1, width=11 */ +0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xc0, 0x00, 0x00, 0x00, /* * * * * ** */ +0x3e, 0x7f, 0xff, 0xc1, 0xb0, 0x8c, 0xc3, 0x7f, 0x7f, 0x3e, 0x00, /* * * * * ** ***** ******* ********* ** ** * ** *** ********* ******* ***** */ +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * ** ***** ******* ********* ** ** * ** *** ********* ******* ***** * */ + +/* Character (0xf9): bbw=12, bbh=14, bbx=0, bby=0, width=13 */ +0x80, 0x80, 0x80, 0x8c, 0x1c, 0x18, 0x30, 0xa0, 0x80, 0x80, 0x80, 0x00, 0x00, /* * * * ** * *** ** ** * * * * * */ +0x00, 0x7f, 0xff, 0xff, 0xc0, 0x80, 0x80, 0x40, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * * ** * *** ** ** * * * * * ******* **************** ** * * * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * ** * *** ** ** * * * * * ******* **************** ** * * * ************************ * */ + +/* Character (0xfa): bbw=12, bbh=14, bbx=0, bby=0, width=13 */ +0x80, 0x80, 0x80, 0x80, 0x20, 0x30, 0x18, 0x9c, 0x8c, 0x80, 0x80, 0x00, 0x00, /* * * * * * ** ** *** * ** * * * */ +0x00, 0x7f, 0xff, 0xff, 0xc0, 0x80, 0x80, 0x40, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * * * * ** ** *** * ** * * * ******* **************** ** * * * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * ** ** *** * ** * * * ******* **************** ** * * * ************************ * */ + +/* Character (0xfb): bbw=12, bbh=13, bbx=0, bby=0, width=13 */ +0x80, 0x80, 0x80, 0xa0, 0x30, 0x18, 0x18, 0x98, 0xb0, 0xa0, 0x80, 0x00, 0x00, /* * * * * * ** ** ** ** * ** * * * * */ +0x00, 0x7f, 0xff, 0xff, 0xc0, 0x80, 0x80, 0x40, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * * * * ** ** ** ** * ** * * * * ******* **************** ** * * * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * ** ** ** ** * ** * * * * ******* **************** ** * * * ************************ * */ + +/* Character (0xfc): bbw=12, bbh=12, bbx=0, bby=0, width=13 */ +0x80, 0x80, 0x80, 0xb0, 0x30, 0x00, 0x00, 0xb0, 0xb0, 0x80, 0x80, 0x00, 0x00, /* * * * ** * ** ** * ** * * * */ +0x00, 0x7f, 0xff, 0xff, 0xc0, 0x80, 0x80, 0x40, 0xff, 0xff, 0xff, 0x80, 0x00, /* * * * ** * ** ** * ** * * * ******* **************** ** * * * ************************ * */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * ** * ** ** * ** * * * ******* **************** ** * * * ************************ * */ + +/* Character (0xfd): bbw=11, bbh=18, bbx=0, bby=-4, width=12 */ +0x80, 0x80, 0x80, 0x80, 0xa0, 0x30, 0x18, 0x1c, 0x8c, 0x80, 0x80, 0x00, /* * * * * * * ** ** *** ** * * * */ +0x00, 0x03, 0x0f, 0x3f, 0xfc, 0xf0, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, /* * * * * * * ** ** *** ** * * * ** **** ****** ****** **** ** ** ** ** */ +0x06, 0x0e, 0x0c, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * * * * ** ** *** ** * * * ** **** ****** ****** **** ** ** ** ** ** *** ** * * ** */ + +/* Character (0xfe): bbw=12, bbh=18, bbx=0, bby=-4, width=13 */ +0x04, 0xfc, 0xfc, 0xfc, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * */ +0x00, 0xff, 0xff, 0xff, 0x41, 0x80, 0x80, 0x80, 0xc1, 0x7f, 0x7f, 0x3e, 0x00, /* * ****** ****** ****** * * * * ************************* * * * ** ********* ******* ***** */ +0x08, 0x0f, 0x0f, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * ****** ****** ****** * * * * ************************* * * * ** ********* ******* ***** ************* * */ + +/* Character (0xff): bbw=11, bbh=16, bbx=0, bby=-4, width=12 */ +0x80, 0x80, 0x80, 0xb0, 0xb0, 0x00, 0x00, 0x30, 0xb0, 0x80, 0x80, 0x00, /* * * * ** * ** * ** ** * * * */ +0x00, 0x03, 0x0f, 0x3f, 0xfc, 0xf0, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, /* * * * ** * ** * ** ** * * * ** **** ****** ****** **** ** ** ** ** */ +0x06, 0x0e, 0x0c, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * * * ** * ** * ** ** * * * ** **** ****** ****** **** ** ** ** ** ** *** ** * * ** */ +}; + +/* Character->glyph data. */ +static const PROGMEM uint16_t ncenB18_offset[] = { + 0, /* (0x00) */ + 0, /* (0x01) */ + 0, /* (0x02) */ + 0, /* (0x03) */ + 0, /* (0x04) */ + 0, /* (0x05) */ + 0, /* (0x06) */ + 0, /* (0x07) */ + 0, /* (0x08) */ + 0, /* (0x09) */ + 0, /* (0x0a) */ + 0, /* (0x0b) */ + 0, /* (0x0c) */ + 0, /* (0x0d) */ + 0, /* (0x0e) */ + 0, /* (0x0f) */ + 0, /* (0x10) */ + 0, /* (0x11) */ + 0, /* (0x12) */ + 0, /* (0x13) */ + 0, /* (0x14) */ + 0, /* (0x15) */ + 0, /* (0x16) */ + 0, /* (0x17) */ + 0, /* (0x18) */ + 0, /* (0x19) */ + 0, /* (0x1a) */ + 0, /* (0x1b) */ + 0, /* (0x1c) */ + 0, /* (0x1d) */ + 0, /* (0x1e) */ + 0, /* (0x1f) */ + 48, /* (0x20) */ + 63, /* (0x21) */ + 81, /* (0x22) */ + 105, /* (0x23) */ + 141, /* (0x24) */ + 174, /* (0x25) */ + 219, /* (0x26) */ + 270, /* (0x27) */ + 285, /* (0x28) */ + 303, /* (0x29) */ + 321, /* (0x2a) */ + 345, /* (0x2b) */ + 378, /* (0x2c) */ + 393, /* (0x2d) */ + 411, /* (0x2e) */ + 426, /* (0x2f) */ + 447, /* (0x30) */ + 480, /* (0x31) */ + 513, /* (0x32) */ + 546, /* (0x33) */ + 579, /* (0x34) */ + 612, /* (0x35) */ + 645, /* (0x36) */ + 678, /* (0x37) */ + 711, /* (0x38) */ + 744, /* (0x39) */ + 777, /* (0x3a) */ + 795, /* (0x3b) */ + 813, /* (0x3c) */ + 846, /* (0x3d) */ + 879, /* (0x3e) */ + 912, /* (0x3f) */ + 942, /* (0x40) */ + 990, /* (0x41) */ + 1032, /* (0x42) */ + 1074, /* (0x43) */ + 1116, /* (0x44) */ + 1164, /* (0x45) */ + 1203, /* (0x46) */ + 1242, /* (0x47) */ + 1287, /* (0x48) */ + 1335, /* (0x49) */ + 1362, /* (0x4a) */ + 1398, /* (0x4b) */ + 1446, /* (0x4c) */ + 1482, /* (0x4d) */ + 1539, /* (0x4e) */ + 1587, /* (0x4f) */ + 1635, /* (0x50) */ + 1677, /* (0x51) */ + 1725, /* (0x52) */ + 1773, /* (0x53) */ + 1809, /* (0x54) */ + 1848, /* (0x55) */ + 1896, /* (0x56) */ + 1938, /* (0x57) */ + 1995, /* (0x58) */ + 2046, /* (0x59) */ + 2091, /* (0x5a) */ + 2130, /* (0x5b) */ + 2145, /* (0x5c) */ + 2172, /* (0x5d) */ + 2187, /* (0x5e) */ + 2214, /* (0x5f) */ + 2244, /* (0x60) */ + 2265, /* (0x61) */ + 2298, /* (0x62) */ + 2337, /* (0x63) */ + 2367, /* (0x64) */ + 2406, /* (0x65) */ + 2439, /* (0x66) */ + 2460, /* (0x67) */ + 2493, /* (0x68) */ + 2532, /* (0x69) */ + 2550, /* (0x6a) */ + 2577, /* (0x6b) */ + 2616, /* (0x6c) */ + 2634, /* (0x6d) */ + 2694, /* (0x6e) */ + 2733, /* (0x6f) */ + 2769, /* (0x70) */ + 2808, /* (0x71) */ + 2844, /* (0x72) */ + 2871, /* (0x73) */ + 2901, /* (0x74) */ + 2925, /* (0x75) */ + 2964, /* (0x76) */ + 2994, /* (0x77) */ + 3042, /* (0x78) */ + 3078, /* (0x79) */ + 3114, /* (0x7a) */ + 3144, /* (0x7b) */ + 3162, /* (0x7c) */ + 3195, /* (0x7d) */ + 3213, /* (0x7e) */ + 0, /* (0x7f) */ + 0, /* (0x80) */ + 0, /* (0x81) */ + 0, /* (0x82) */ + 0, /* (0x83) */ + 0, /* (0x84) */ + 0, /* (0x85) */ + 0, /* (0x86) */ + 0, /* (0x87) */ + 0, /* (0x88) */ + 0, /* (0x89) */ + 0, /* (0x8a) */ + 0, /* (0x8b) */ + 0, /* (0x8c) */ + 0, /* (0x8d) */ + 0, /* (0x8e) */ + 0, /* (0x8f) */ + 0, /* (0x90) */ + 0, /* (0x91) */ + 0, /* (0x92) */ + 0, /* (0x93) */ + 0, /* (0x94) */ + 0, /* (0x95) */ + 0, /* (0x96) */ + 0, /* (0x97) */ + 0, /* (0x98) */ + 0, /* (0x99) */ + 0, /* (0x9a) */ + 0, /* (0x9b) */ + 0, /* (0x9c) */ + 0, /* (0x9d) */ + 0, /* (0x9e) */ + 0, /* (0x9f) */ + 3249, /* (0xa0) */ + 3264, /* (0xa1) */ + 3285, /* (0xa2) */ + 3318, /* (0xa3) */ + 3351, /* (0xa4) */ + 3381, /* (0xa5) */ + 3426, /* (0xa6) */ + 3459, /* (0xa7) */ + 3483, /* (0xa8) */ + 3513, /* (0xa9) */ + 3558, /* (0xaa) */ + 3582, /* (0xab) */ + 3609, /* (0xac) */ + 3639, /* (0xad) */ + 3657, /* (0xae) */ + 3702, /* (0xaf) */ + 3726, /* (0xb0) */ + 3747, /* (0xb1) */ + 3780, /* (0xb2) */ + 3798, /* (0xb3) */ + 3816, /* (0xb4) */ + 3837, /* (0xb5) */ + 3876, /* (0xb6) */ + 3918, /* (0xb7) */ + 3933, /* (0xb8) */ + 3951, /* (0xb9) */ + 3969, /* (0xba) */ + 3990, /* (0xbb) */ + 4017, /* (0xbc) */ + 4062, /* (0xbd) */ + 4107, /* (0xbe) */ + 4152, /* (0xbf) */ + 4182, /* (0xc0) */ + 4224, /* (0xc1) */ + 4266, /* (0xc2) */ + 4308, /* (0xc3) */ + 4350, /* (0xc4) */ + 4392, /* (0xc5) */ + 4434, /* (0xc6) */ + 4497, /* (0xc7) */ + 4539, /* (0xc8) */ + 4578, /* (0xc9) */ + 4617, /* (0xca) */ + 4656, /* (0xcb) */ + 4695, /* (0xcc) */ + 4722, /* (0xcd) */ + 4749, /* (0xce) */ + 4776, /* (0xcf) */ + 4803, /* (0xd0) */ + 4851, /* (0xd1) */ + 4899, /* (0xd2) */ + 4947, /* (0xd3) */ + 4995, /* (0xd4) */ + 5043, /* (0xd5) */ + 5091, /* (0xd6) */ + 5139, /* (0xd7) */ + 5172, /* (0xd8) */ + 5220, /* (0xd9) */ + 5268, /* (0xda) */ + 5316, /* (0xdb) */ + 5364, /* (0xdc) */ + 5412, /* (0xdd) */ + 5457, /* (0xde) */ + 5499, /* (0xdf) */ + 5535, /* (0xe0) */ + 5568, /* (0xe1) */ + 5601, /* (0xe2) */ + 5634, /* (0xe3) */ + 5667, /* (0xe4) */ + 5700, /* (0xe5) */ + 5733, /* (0xe6) */ + 5784, /* (0xe7) */ + 5814, /* (0xe8) */ + 5847, /* (0xe9) */ + 5880, /* (0xea) */ + 5913, /* (0xeb) */ + 5946, /* (0xec) */ + 5964, /* (0xed) */ + 5982, /* (0xee) */ + 6003, /* (0xef) */ + 6021, /* (0xf0) */ + 6057, /* (0xf1) */ + 6096, /* (0xf2) */ + 6132, /* (0xf3) */ + 6168, /* (0xf4) */ + 6204, /* (0xf5) */ + 6240, /* (0xf6) */ + 6276, /* (0xf7) */ + 6309, /* (0xf8) */ + 6342, /* (0xf9) */ + 6381, /* (0xfa) */ + 6420, /* (0xfb) */ + 6459, /* (0xfc) */ + 6498, /* (0xfd) */ + 6534, /* (0xfe) */ + 6573, /* (0xff) */ +}; + +/* Character width data. */ +static const PROGMEM uint8_t ncenB18_width[] = { + 16, /* (0x00) */ + 16, /* (0x01) */ + 16, /* (0x02) */ + 16, /* (0x03) */ + 16, /* (0x04) */ + 16, /* (0x05) */ + 16, /* (0x06) */ + 16, /* (0x07) */ + 16, /* (0x08) */ + 16, /* (0x09) */ + 16, /* (0x0a) */ + 16, /* (0x0b) */ + 16, /* (0x0c) */ + 16, /* (0x0d) */ + 16, /* (0x0e) */ + 16, /* (0x0f) */ + 16, /* (0x10) */ + 16, /* (0x11) */ + 16, /* (0x12) */ + 16, /* (0x13) */ + 16, /* (0x14) */ + 16, /* (0x15) */ + 16, /* (0x16) */ + 16, /* (0x17) */ + 16, /* (0x18) */ + 16, /* (0x19) */ + 16, /* (0x1a) */ + 16, /* (0x1b) */ + 16, /* (0x1c) */ + 16, /* (0x1d) */ + 16, /* (0x1e) */ + 16, /* (0x1f) */ + 5, /* (0x20) */ + 6, /* (0x21) */ + 8, /* (0x22) */ + 12, /* (0x23) */ + 11, /* (0x24) */ + 15, /* (0x25) */ + 17, /* (0x26) */ + 5, /* (0x27) */ + 6, /* (0x28) */ + 6, /* (0x29) */ + 8, /* (0x2a) */ + 11, /* (0x2b) */ + 5, /* (0x2c) */ + 6, /* (0x2d) */ + 5, /* (0x2e) */ + 7, /* (0x2f) */ + 11, /* (0x30) */ + 11, /* (0x31) */ + 11, /* (0x32) */ + 11, /* (0x33) */ + 11, /* (0x34) */ + 11, /* (0x35) */ + 11, /* (0x36) */ + 11, /* (0x37) */ + 11, /* (0x38) */ + 11, /* (0x39) */ + 6, /* (0x3a) */ + 6, /* (0x3b) */ + 11, /* (0x3c) */ + 11, /* (0x3d) */ + 11, /* (0x3e) */ + 10, /* (0x3f) */ + 16, /* (0x40) */ + 14, /* (0x41) */ + 14, /* (0x42) */ + 14, /* (0x43) */ + 16, /* (0x44) */ + 13, /* (0x45) */ + 13, /* (0x46) */ + 15, /* (0x47) */ + 16, /* (0x48) */ + 9, /* (0x49) */ + 12, /* (0x4a) */ + 16, /* (0x4b) */ + 12, /* (0x4c) */ + 19, /* (0x4d) */ + 16, /* (0x4e) */ + 16, /* (0x4f) */ + 14, /* (0x50) */ + 16, /* (0x51) */ + 16, /* (0x52) */ + 12, /* (0x53) */ + 13, /* (0x54) */ + 16, /* (0x55) */ + 14, /* (0x56) */ + 19, /* (0x57) */ + 17, /* (0x58) */ + 15, /* (0x59) */ + 13, /* (0x5a) */ + 5, /* (0x5b) */ + 9, /* (0x5c) */ + 5, /* (0x5d) */ + 9, /* (0x5e) */ + 10, /* (0x5f) */ + 7, /* (0x60) */ + 11, /* (0x61) */ + 13, /* (0x62) */ + 10, /* (0x63) */ + 13, /* (0x64) */ + 11, /* (0x65) */ + 7, /* (0x66) */ + 11, /* (0x67) */ + 13, /* (0x68) */ + 6, /* (0x69) */ + 9, /* (0x6a) */ + 13, /* (0x6b) */ + 6, /* (0x6c) */ + 20, /* (0x6d) */ + 13, /* (0x6e) */ + 12, /* (0x6f) */ + 13, /* (0x70) */ + 12, /* (0x71) */ + 9, /* (0x72) */ + 10, /* (0x73) */ + 8, /* (0x74) */ + 13, /* (0x75) */ + 10, /* (0x76) */ + 16, /* (0x77) */ + 12, /* (0x78) */ + 12, /* (0x79) */ + 10, /* (0x7a) */ + 6, /* (0x7b) */ + 11, /* (0x7c) */ + 6, /* (0x7d) */ + 12, /* (0x7e) */ + 16, /* (0x7f) */ + 16, /* (0x80) */ + 16, /* (0x81) */ + 16, /* (0x82) */ + 16, /* (0x83) */ + 16, /* (0x84) */ + 16, /* (0x85) */ + 16, /* (0x86) */ + 16, /* (0x87) */ + 16, /* (0x88) */ + 16, /* (0x89) */ + 16, /* (0x8a) */ + 16, /* (0x8b) */ + 16, /* (0x8c) */ + 16, /* (0x8d) */ + 16, /* (0x8e) */ + 16, /* (0x8f) */ + 16, /* (0x90) */ + 16, /* (0x91) */ + 16, /* (0x92) */ + 16, /* (0x93) */ + 16, /* (0x94) */ + 16, /* (0x95) */ + 16, /* (0x96) */ + 16, /* (0x97) */ + 16, /* (0x98) */ + 16, /* (0x99) */ + 16, /* (0x9a) */ + 16, /* (0x9b) */ + 16, /* (0x9c) */ + 16, /* (0x9d) */ + 16, /* (0x9e) */ + 16, /* (0x9f) */ + 5, /* (0xa0) */ + 7, /* (0xa1) */ + 11, /* (0xa2) */ + 11, /* (0xa3) */ + 10, /* (0xa4) */ + 15, /* (0xa5) */ + 11, /* (0xa6) */ + 8, /* (0xa7) */ + 10, /* (0xa8) */ + 15, /* (0xa9) */ + 8, /* (0xaa) */ + 9, /* (0xab) */ + 10, /* (0xac) */ + 6, /* (0xad) */ + 15, /* (0xae) */ + 8, /* (0xaf) */ + 7, /* (0xb0) */ + 11, /* (0xb1) */ + 6, /* (0xb2) */ + 6, /* (0xb3) */ + 7, /* (0xb4) */ + 13, /* (0xb5) */ + 14, /* (0xb6) */ + 5, /* (0xb7) */ + 6, /* (0xb8) */ + 6, /* (0xb9) */ + 7, /* (0xba) */ + 9, /* (0xbb) */ + 15, /* (0xbc) */ + 15, /* (0xbd) */ + 15, /* (0xbe) */ + 10, /* (0xbf) */ + 14, /* (0xc0) */ + 14, /* (0xc1) */ + 14, /* (0xc2) */ + 14, /* (0xc3) */ + 14, /* (0xc4) */ + 14, /* (0xc5) */ + 21, /* (0xc6) */ + 14, /* (0xc7) */ + 13, /* (0xc8) */ + 13, /* (0xc9) */ + 13, /* (0xca) */ + 13, /* (0xcb) */ + 9, /* (0xcc) */ + 9, /* (0xcd) */ + 9, /* (0xce) */ + 9, /* (0xcf) */ + 16, /* (0xd0) */ + 16, /* (0xd1) */ + 16, /* (0xd2) */ + 16, /* (0xd3) */ + 16, /* (0xd4) */ + 16, /* (0xd5) */ + 16, /* (0xd6) */ + 11, /* (0xd7) */ + 16, /* (0xd8) */ + 16, /* (0xd9) */ + 16, /* (0xda) */ + 16, /* (0xdb) */ + 16, /* (0xdc) */ + 15, /* (0xdd) */ + 14, /* (0xde) */ + 12, /* (0xdf) */ + 11, /* (0xe0) */ + 11, /* (0xe1) */ + 11, /* (0xe2) */ + 11, /* (0xe3) */ + 11, /* (0xe4) */ + 11, /* (0xe5) */ + 17, /* (0xe6) */ + 10, /* (0xe7) */ + 11, /* (0xe8) */ + 11, /* (0xe9) */ + 11, /* (0xea) */ + 11, /* (0xeb) */ + 6, /* (0xec) */ + 6, /* (0xed) */ + 7, /* (0xee) */ + 6, /* (0xef) */ + 12, /* (0xf0) */ + 13, /* (0xf1) */ + 12, /* (0xf2) */ + 12, /* (0xf3) */ + 12, /* (0xf4) */ + 12, /* (0xf5) */ + 12, /* (0xf6) */ + 11, /* (0xf7) */ + 11, /* (0xf8) */ + 13, /* (0xf9) */ + 13, /* (0xfa) */ + 13, /* (0xfb) */ + 13, /* (0xfc) */ + 12, /* (0xfd) */ + 13, /* (0xfe) */ + 12, /* (0xff) */ +}; + +/* Font structure definition. */ +EXTERN_CONST Font font_ncenB18 = +{ + /* .glyph = */ font_ncenB18_glyphs, + /* .name = "ncenB18", */ + /* .width = */ 21, + /* .height = */ 20, + /* .ascent = 16, */ + /* .first = */ 0, + /* .last = */ 255, + /* .offset = */ ncenB18_offset, + /* .width = */ ncenB18_width, +}; diff --git a/2.5/bertos/fs/battfs.c b/2.5/bertos/fs/battfs.c new file mode 100644 index 00000000..deef25cc --- /dev/null +++ b/2.5/bertos/fs/battfs.c @@ -0,0 +1,1052 @@ +/** + * \file + * + * + * \brief BattFS: a filesystem for embedded platforms (implementation). + * + * \version $Id$ + * + * \author Francesco Sacchi + * + */ + +#include "battfs.h" +#include "cfg/cfg_battfs.h" +#include +#include /* MIN, MAX */ +#include +#include /* cpu_to_xx */ + +#define LOG_LEVEL BATTFS_LOG_LEVEL +#define LOG_FORMAT BATTFS_LOG_FORMAT +#include + +#include /* memset, memmove */ + +#if LOG_LEVEL >= LOG_LVL_INFO +static void dumpPageArray(struct BattFsSuper *disk) +{ + kprintf("Page array dump, free_page_start %d:", disk->free_page_start); + for (pgcnt_t i = 0; i < disk->page_count; i++) + { + if (!(i % 16)) + kputchar('\n'); + kprintf("%04d ", disk->page_array[i]); + } + kputchar('\n'); +} +#endif + +/** + * Convert from memory representation to disk structure. + * \note filesystem is in little-endian format. + */ +INLINE void battfs_to_disk(struct BattFsPageHeader *hdr, uint8_t *buf) +{ + STATIC_ASSERT(BATTFS_HEADER_LEN == 12); + buf[0] = hdr->inode; + + buf[1] = hdr->fill; + buf[2] = hdr->fill >> 8; + + buf[3] = hdr->pgoff; + buf[4] = hdr->pgoff >> 8; + + /* + * Sequence number is 40 bits long. + * No need to take care of wraparonds: the memory will die first! + */ + buf[5] = hdr->seq; + buf[6] = hdr->seq >> 8; + buf[7] = hdr->seq >> 16; + buf[8] = hdr->seq >> 24; + buf[9] = hdr->seq >> 32; + + /* + * This field must be the last one! + * This is needed because if the page is only partially + * written, we can use this to detect it. + */ + buf[10] = hdr->fcs; + buf[11] = hdr->fcs >> 8; +} + +/** + * Convert from disk structure to memory representation. + * \note filesystem is in little-endian format. + */ +INLINE void disk_to_battfs(uint8_t *buf, struct BattFsPageHeader *hdr) +{ + STATIC_ASSERT(BATTFS_HEADER_LEN == 12); + hdr->inode = buf[0]; + hdr->fill = buf[2] << 8 | buf[1]; + hdr->pgoff = buf[4] << 8 | buf[3]; + hdr->seq = (seq_t)buf[9] << 32 | (seq_t)buf[8] << 24 | (seq_t)buf[7] << 16 | buf[6] << 8 | buf[5]; + hdr->fcs = buf[11] << 8 | buf[10]; +} + +/** + * Compute the fcs of the header. + */ +static fcs_t computeFcs(struct BattFsPageHeader *hdr) +{ + uint8_t buf[BATTFS_HEADER_LEN]; + fcs_t cks; + + battfs_to_disk(hdr, buf); + rotating_init(&cks); + /* fcs is at the end of whole header */ + rotating_update(buf, BATTFS_HEADER_LEN - sizeof(fcs_t), &cks); + return cks; +} + +/** + * Read from disk. + * If available, the cache will be used. + * \return the number of bytes read. + */ +static size_t diskRead(struct BattFsSuper *disk, pgcnt_t page, pgaddr_t addr, void *buf, size_t size) +{ + /* Try to read from cache */ + if (page == disk->curr_page) + return disk->bufferRead(disk, addr, buf, size); + /* Read from disk */ + else + return disk->read(disk, page, addr, buf, size); +} + + +/** + * Read header of \a page in \a hdr. + * \return true on success, false otherwise. + */ +static bool readHdr(struct BattFsSuper *disk, pgcnt_t page, struct BattFsPageHeader *hdr) +{ + uint8_t buf[BATTFS_HEADER_LEN]; + /* + * Read header from disk. + * Header is actually a footer, and so + * resides at page end. + */ + if (diskRead(disk, page, disk->data_size, buf, BATTFS_HEADER_LEN) + != BATTFS_HEADER_LEN) + { + LOG_ERR("page[%d]\n", page); + return false; + } + + /* Fill header */ + disk_to_battfs(buf, hdr); + + return true; +} + +/** + * Set header on current \a disk page buffer. + * \return true on success, false otherwise. + */ +static bool setBufferHdr(struct BattFsSuper *disk, struct BattFsPageHeader *hdr) +{ + uint8_t buf[BATTFS_HEADER_LEN]; + + #warning FIXME:refactor computeFcs to save time and stack + hdr->fcs = computeFcs(hdr); + /* Fill buffer */ + battfs_to_disk(hdr, buf); + + /* + * write header to buffer. + * Header is actually a footer, and so + * resides at page end. + */ + if (disk->bufferWrite(disk, disk->data_size, buf, BATTFS_HEADER_LEN) + != BATTFS_HEADER_LEN) + { + LOG_ERR("writing to buffer\n"); + return false; + } + return true; +} + +static bool getBufferHdr(struct BattFsSuper *disk, struct BattFsPageHeader *hdr) +{ + uint8_t buf[BATTFS_HEADER_LEN]; + + if (disk->bufferRead(disk, disk->data_size, buf, BATTFS_HEADER_LEN) + != BATTFS_HEADER_LEN) + { + LOG_ERR("reading from buffer\n"); + return false; + } + + disk_to_battfs(buf, hdr); + + return true; +} + +/** + * Count the number of pages from + * inode 0 to \a inode in \a filelen_table. + */ +static pgcnt_t countPages(pgoff_t *filelen_table, inode_t inode) +{ + pgcnt_t cnt = 0; + + for (inode_t i = 0; i < inode; i++) + cnt += filelen_table[i]; + + return cnt; +} + +/** + * Move all pages in page allocation array from \a src to \a src + \a offset. + * The number of pages moved is page_count - MAX(dst, src). + */ +static void movePages(struct BattFsSuper *disk, pgcnt_t src, int offset) +{ + pgcnt_t dst = src + offset; + LOG_INFO("src %d, offset %d, size %d\n", src, offset, (unsigned int)((disk->page_count - MAX(dst, src)) * sizeof(pgcnt_t))); + memmove(&disk->page_array[dst], &disk->page_array[src], (disk->page_count - MAX(dst, src)) * sizeof(pgcnt_t)); + + if (offset < 0) + { + /* Fill empty space in array with sentinel */ + for (pgcnt_t page = disk->page_count + offset; page < disk->page_count; page++) + disk->page_array[page] = PAGE_UNSET_SENTINEL; + } +} + +/** + * Count number of pages per file on \a disk. + * This information is registered in \a filelen_table. + * Array index represent file inode, while value contained + * is the number of pages used by that file. + * + * \return true if ok, false on disk read errors. + * \note The whole disk is scanned once. + */ +static bool countDiskFilePages(struct BattFsSuper *disk, pgoff_t *filelen_table) +{ + BattFsPageHeader hdr; + disk->free_page_start = 0; + + /* Count the number of disk page per file */ + for (pgcnt_t page = 0; page < disk->page_count; page++) + { + if (!readHdr(disk, page, &hdr)) + return false; + + /* Increase free space */ + disk->free_bytes += disk->data_size; + + /* Check header FCS */ + if (hdr.fcs == computeFcs(&hdr)) + { + ASSERT(hdr.fill <= disk->data_size); + + /* Page is valid and is owned by a file */ + filelen_table[hdr.inode]++; + + /* Keep trace of free space */ + disk->free_bytes -= hdr.fill; + disk->free_page_start++; + } + } + LOG_INFO("free_bytes:%ld, free_page_start:%d\n", (long)disk->free_bytes, disk->free_page_start); + + return true; +} + +/** + * Fill page allocation array of \a disk + * using file lenghts in \a filelen_table. + * + * The page allocation array is an array containings all file infos. + * Is ordered by file, and within each file is ordered by page offset + * inside file. + * e.g. : at page array[0] you will find page address of the first page + * of the first file (if present). + * Free blocks are allocated after the last file. + * + * \return true if ok, false on disk read errors. + * \note The whole disk is scanned at max twice. + */ +static bool fillPageArray(struct BattFsSuper *disk, pgoff_t *filelen_table) +{ + BattFsPageHeader hdr; + pgcnt_t curr_free_page = disk->free_page_start; + /* Fill page allocation array */ + for (pgcnt_t page = 0; page < disk->page_count; page++) + { + if (!readHdr(disk, page, &hdr)) + return false; + + /* Check header FCS */ + if (hdr.fcs == computeFcs(&hdr)) + { + /* Compute array position */ + pgcnt_t array_pos = countPages(filelen_table, hdr.inode); + array_pos += hdr.pgoff; + + + /* Check if position is already used by another page of the same file */ + if (disk->page_array[array_pos] == PAGE_UNSET_SENTINEL) + disk->page_array[array_pos] = page; + else + { + BattFsPageHeader hdr_prv; + + if (!readHdr(disk, disk->page_array[array_pos], &hdr_prv)) + return false; + + /* Check header FCS */ + ASSERT(hdr_prv.fcs == computeFcs(&hdr_prv)); + + /* Only the very same page with a different seq number can be here */ + ASSERT(hdr.inode == hdr_prv.inode); + ASSERT(hdr.pgoff == hdr_prv.pgoff); + ASSERT(hdr.seq != hdr_prv.seq); + + pgcnt_t new_page, old_page; + fill_t old_fill; + + /* + * Sequence number comparison: since + * seq is 40 bits wide, it wraps once + * every 1.1E12 times. + * The memory will not live enough to + * see a wraparound, so we can use a simple + * compare here. + */ + if (hdr.seq > hdr_prv.seq) + { + /* Current header is newer than the previuos one */ + old_page = disk->page_array[array_pos]; + new_page = page; + old_fill = hdr_prv.fill; + } + else + { + /* Previous header is newer than the current one */ + old_page = page; + new_page = disk->page_array[array_pos]; + old_fill = hdr.fill; + } + + /* Set new page */ + disk->page_array[array_pos] = new_page; + /* Add free space */ + disk->free_bytes += old_fill; + /* Shift all array one position to the left, overwriting duplicate page */ + array_pos -= hdr.pgoff; + array_pos += filelen_table[hdr.inode]; + movePages(disk, array_pos, -1); + /* Move back all indexes */ + filelen_table[hdr.inode]--; + disk->free_page_start--; + curr_free_page--; + /* Set old page as free */ + ASSERT(disk->page_array[curr_free_page] == PAGE_UNSET_SENTINEL); + disk->page_array[curr_free_page++] = old_page; + + } + } + else + { + /* Invalid page, keep as free */ + ASSERT(disk->page_array[curr_free_page] == PAGE_UNSET_SENTINEL); + //LOG_INFO("Page %d invalid, keeping as free\n", page); + disk->page_array[curr_free_page++] = page; + } + } + return true; +} + + +/** + * Flush the current \a disk buffer. + * \return true if ok, false on errors. + */ +static bool flushBuffer(struct BattFsSuper *disk) +{ + if (disk->cache_dirty) + { + LOG_INFO("Flushing to disk page %d\n", disk->curr_page); + + if (!(disk->erase(disk, disk->curr_page) + && disk->save(disk, disk->curr_page))) + return false; + + disk->cache_dirty = false; + } + return true; +} + +/** + * Load \a new_page from \a disk in disk page buffer. + * If a previuos page is still dirty in the buffer, will be + * flushed first. The new page header loaded will be put in \a new_hdr. + * \return true if ok, false on errors. + */ +static bool loadPage(struct BattFsSuper *disk, pgcnt_t new_page, BattFsPageHeader *new_hdr) +{ + if (disk->curr_page == new_page) + return getBufferHdr(disk, new_hdr); + + LOG_INFO("Loading page %d\n", new_page); + + if (!(flushBuffer(disk) + && disk->load(disk, new_page) + && getBufferHdr(disk, new_hdr))) + return false; + + disk->curr_page = new_page; + + return true; +} + + +/** + * Initialize and mount disk described by + * \a disk. + * \return false on errors, true otherwise. + */ +bool battfs_mount(struct BattFsSuper *disk) +{ + pgoff_t filelen_table[BATTFS_MAX_FILES]; + + /* Disk open must set all of these */ + ASSERT(disk->read); + ASSERT(disk->load); + ASSERT(disk->bufferWrite); + ASSERT(disk->bufferRead); + ASSERT(disk->save); + ASSERT(disk->erase); + ASSERT(disk->close); + ASSERT(disk->page_size > BATTFS_HEADER_LEN); + /* Fill page_size with the usable space */ + disk->data_size = disk->page_size - BATTFS_HEADER_LEN; + ASSERT(disk->page_count); + ASSERT(disk->page_count < PAGE_UNSET_SENTINEL - 1); + ASSERT(disk->page_array); + + memset(filelen_table, 0, BATTFS_MAX_FILES * sizeof(pgoff_t)); + + disk->free_bytes = 0; + disk->disk_size = (disk_size_t)disk->data_size * disk->page_count; + + /* Initialize page buffer cache */ + disk->cache_dirty = false; + disk->curr_page = 0; + disk->load(disk, disk->curr_page); + + /* Count pages per file */ + if (!countDiskFilePages(disk, filelen_table)) + { + LOG_ERR("counting file pages\n"); + return false; + } + + /* Once here, we have filelen_table filled with file lengths */ + + /* Fill page array with sentinel */ + for (pgcnt_t page = 0; page < disk->page_count; page++) + disk->page_array[page] = PAGE_UNSET_SENTINEL; + + /* Fill page allocation array using filelen_table */ + if (!fillPageArray(disk, filelen_table)) + { + LOG_ERR("filling page array\n"); + return false; + } + #if LOG_LEVEL >= LOG_LVL_INFO + dumpPageArray(disk); + #endif + #if CONFIG_BATTFS_SHUFFLE_FREE_PAGES + SHUFFLE(&disk->page_array[disk->free_page_start], disk->page_count - disk->free_page_start); + + LOG_INFO("Page array after shuffle:\n"); + #if LOG_LEVEL >= LOG_LVL_INFO + dumpPageArray(disk); + #endif + #endif + /* Init list for opened files. */ + LIST_INIT(&disk->file_opened_list); + return true; +} + +/** + * Check the filesystem. + * \return true if ok, false on errors. + */ +bool battfs_fsck(struct BattFsSuper *disk) +{ + #define FSCHECK(cond) do { if(!(cond)) { LOG_ERR("\"" #cond "\"\n"); return false; } } while (0) + + FSCHECK(disk->free_page_start <= disk->page_count); + FSCHECK(disk->data_size < disk->page_size); + FSCHECK(disk->free_bytes <= disk->disk_size); + + disk_size_t free_bytes = 0; + BattFsPageHeader hdr, prev_hdr; + inode_t files = 0; + pgcnt_t page_used = 0; + + bool start = true; + + /* Uneeded, the first time will be overwritten but useful to silence + * the warning for uninitialized value */ + FSCHECK(readHdr(disk, 0, &prev_hdr)); + for (pgcnt_t page = 0; page < disk->page_count; page++) + { + FSCHECK(readHdr(disk, disk->page_array[page], &hdr)); + free_bytes += disk->data_size; + + if (page < disk->free_page_start) + { + FSCHECK(computeFcs(&hdr) == hdr.fcs); + page_used++; + free_bytes -= hdr.fill; + if (hdr.inode != prev_hdr.inode || start) + { + if (LIKELY(!start)) + FSCHECK(hdr.inode > prev_hdr.inode); + else + start = false; + + FSCHECK(hdr.pgoff == 0); + files++; + } + else + { + FSCHECK(hdr.fill != 0); + FSCHECK(prev_hdr.fill == disk->data_size); + FSCHECK(hdr.pgoff == prev_hdr.pgoff + 1); + } + prev_hdr = hdr; + } + } + + FSCHECK(page_used == disk->free_page_start); + FSCHECK(free_bytes == disk->free_bytes); + + return true; +} + +/** + * Flush file \a fd. + * \return 0 if ok, EOF on errors. + */ +static int battfs_flush(struct KFile *fd) +{ + BattFs *fdb = BATTFS_CAST(fd); + + if (flushBuffer(fdb->disk)) + return 0; + else + { + fdb->errors |= BATTFS_DISK_FLUSHBUF_ERR; + return EOF; + } +} + +/** + * Close file \a fd. + * \return 0 if ok, EOF on errors. + */ +static int battfs_fileclose(struct KFile *fd) +{ + BattFs *fdb = BATTFS_CAST(fd); + + if (battfs_flush(fd) == 0) + { + REMOVE(&fdb->link); + return 0; + } + else + return EOF; +} + + +static bool getNewPage(struct BattFsSuper *disk, pgcnt_t new_pos, inode_t inode, pgoff_t pgoff, BattFsPageHeader *new_hdr) +{ + if (SPACE_OVER(disk)) + { + LOG_ERR("No disk space available!\n"); + return false; + } + flushBuffer(disk); + LOG_INFO("Getting new page %d, pos %d\n", disk->page_array[disk->free_page_start], new_pos); + disk->curr_page = disk->page_array[disk->free_page_start++]; + memmove(&disk->page_array[new_pos + 1], &disk->page_array[new_pos], (disk->free_page_start - new_pos - 1) * sizeof(pgcnt_t)); + + Node *n; + /* Move following file start point one position ahead. */ + FOREACH_NODE(n, &disk->file_opened_list) + { + BattFs *file = containerof(n, BattFs, link); + if (file->inode > inode) + { + LOG_INFO("Move file %d start pos\n", file->inode); + file->start++; + } + } + + disk->page_array[new_pos] = disk->curr_page; + disk->cache_dirty = true; + + new_hdr->inode = inode; + new_hdr->pgoff = pgoff; + new_hdr->fill = 0; + new_hdr->seq = 0; + return setBufferHdr(disk, new_hdr); +} + +/** + * Write to file \a fd \a size bytes from \a buf. + * \return The number of bytes written. + */ +static size_t battfs_write(struct KFile *fd, const void *_buf, size_t size) +{ + BattFs *fdb = BATTFS_CAST(fd); + BattFsSuper *disk = fdb->disk; + const uint8_t *buf = (const uint8_t *)_buf; + + size_t total_write = 0; + pgoff_t pg_offset; + pgaddr_t addr_offset; + pgaddr_t wr_len; + BattFsPageHeader curr_hdr; + + if (fd->seek_pos < 0) + { + fdb->errors |= BATTFS_NEGATIVE_SEEK_ERR; + return total_write; + } + + if (fd->seek_pos > fd->size) + { + /* Handle writing when seek pos if far over EOF */ + if (!loadPage(disk, fdb->start[fdb->max_off], &curr_hdr)) + { + fdb->errors |= BATTFS_DISK_LOADPAGE_ERR; + return total_write; + } + + /* Fill unused space of first page with 0s */ + uint8_t dummy = 0; + pgaddr_t zero_bytes = MIN(fd->seek_pos - fd->size, (kfile_off_t)(disk->data_size - curr_hdr.fill)); + while (zero_bytes--) + { + if (disk->bufferWrite(disk, curr_hdr.fill, &dummy, 1) != 1) + { + fdb->errors |= BATTFS_DISK_BUFFERWR_ERR; + return total_write; + } + curr_hdr.fill++; + fd->size++; + disk->free_bytes--; + disk->cache_dirty = true; + } + setBufferHdr(disk, &curr_hdr); + + /* Allocate the missing pages first. */ + pgoff_t missing_pages = fd->seek_pos / disk->data_size - fdb->max_off; + + if (missing_pages) + { + LOG_INFO("missing pages: %d\n", missing_pages); + flushBuffer(disk); + + /* Fill page buffer with 0 to avoid filling unused pages with garbage */ + for (pgaddr_t off = 0; off < disk->data_size; off++) + { + if (disk->bufferWrite(disk, off, &dummy, 1) != 1) + { + fdb->errors |= BATTFS_DISK_BUFFERWR_ERR; + return total_write; + } + } + + while (missing_pages--) + { + zero_bytes = MIN((kfile_off_t)disk->data_size, fd->seek_pos - fd->size); + /* Get the new page needed */ + if (!getNewPage(disk, (fdb->start - disk->page_array) + fdb->max_off + 1, fdb->inode, fdb->max_off + 1, &curr_hdr)) + { + fdb->errors |= BATTFS_DISK_GETNEWPAGE_ERR; + return total_write; + } + + /* Update size and free space left */ + fd->size += zero_bytes; + disk->free_bytes -= zero_bytes; + + curr_hdr.fill = zero_bytes; + setBufferHdr(disk, &curr_hdr); + + fdb->max_off++; + } + } + } + else if (!getBufferHdr(disk, &curr_hdr)) + { + fdb->errors |= BATTFS_DISK_BUFFERRD_ERR; + return total_write; + } + + while (size) + { + pg_offset = fd->seek_pos / disk->data_size; + addr_offset = fd->seek_pos % disk->data_size; + wr_len = MIN(size, (size_t)(disk->data_size - addr_offset)); + + /* Handle write outside EOF */ + if (pg_offset > fdb->max_off) + { + LOG_INFO("New page needed, pg_offset %d, pos %d\n", pg_offset, (int)((fdb->start - disk->page_array) + pg_offset)); + if (!getNewPage(disk, (fdb->start - disk->page_array) + pg_offset, fdb->inode, pg_offset, &curr_hdr)) + { + fdb->errors |= BATTFS_DISK_GETNEWPAGE_ERR; + return total_write; + } + + fdb->max_off = pg_offset; + } + /* Handle cache load of a new page*/ + else if (fdb->start[pg_offset] != disk->curr_page) + { + if (SPACE_OVER(disk)) + { + LOG_ERR("No disk space available!\n"); + fdb->errors |= BATTFS_DISK_SPACEOVER_ERR; + return total_write; + } + LOG_INFO("Re-writing page %d to %d\n", fdb->start[pg_offset], disk->page_array[disk->free_page_start]); + if (!loadPage(disk, fdb->start[pg_offset], &curr_hdr)) + { + fdb->errors |= BATTFS_DISK_LOADPAGE_ERR; + return total_write; + } + + /* Get a free page */ + disk->curr_page = disk->page_array[disk->free_page_start]; + movePages(disk, disk->free_page_start + 1, -1); + + /* Insert previous page in free blocks list */ + LOG_INFO("Setting page %d as free\n", fdb->start[pg_offset]); + disk->page_array[disk->page_count - 1] = fdb->start[pg_offset]; + /* Assign new page */ + fdb->start[pg_offset] = disk->curr_page; + curr_hdr.seq++; + } + + //LOG_INFO("writing to buffer for page %d, offset %d, size %d\n", disk->curr_page, addr_offset, wr_len); + if (disk->bufferWrite(disk, addr_offset, buf, wr_len) != wr_len) + { + fdb->errors |= BATTFS_DISK_BUFFERWR_ERR; + return total_write; + } + disk->cache_dirty = true; + + size -= wr_len; + fd->seek_pos += wr_len; + total_write += wr_len; + buf += wr_len; + fill_t fill_delta = MAX((int32_t)(addr_offset + wr_len) - curr_hdr.fill, (int32_t)0); + disk->free_bytes -= fill_delta; + fd->size += fill_delta; + curr_hdr.fill += fill_delta; + + if (!setBufferHdr(disk, &curr_hdr)) + { + fdb->errors |= BATTFS_DISK_BUFFERWR_ERR; + return total_write; + } + + //LOG_INFO("free_bytes %d, seek_pos %d, size %d, curr_hdr.fill %d\n", disk->free_bytes, fd->seek_pos, fd->size, curr_hdr.fill); + } + return total_write; +} + + +/** + * Read from file \a fd \a size bytes in \a buf. + * \return The number of bytes read. + */ +static size_t battfs_read(struct KFile *fd, void *_buf, size_t size) +{ + BattFs *fdb = BATTFS_CAST(fd); + BattFsSuper *disk = fdb->disk; + uint8_t *buf = (uint8_t *)_buf; + + size_t total_read = 0; + pgoff_t pg_offset; + pgaddr_t addr_offset; + pgaddr_t read_len; + + if (fd->seek_pos < 0) + { + fdb->errors |= BATTFS_NEGATIVE_SEEK_ERR; + return total_read; + } + + size = MIN((kfile_off_t)size, MAX(fd->size - fd->seek_pos, (kfile_off_t)0)); + + while (size) + { + pg_offset = fd->seek_pos / disk->data_size; + addr_offset = fd->seek_pos % disk->data_size; + read_len = MIN(size, (size_t)(disk->data_size - addr_offset)); + + //LOG_INFO("reading from page %d, offset %d, size %d\n", fdb->start[pg_offset], addr_offset, read_len); + /* Read from disk */ + if (diskRead(disk, fdb->start[pg_offset], addr_offset, buf, read_len) != read_len) + { + fdb->errors |= BATTFS_DISK_READ_ERR; + return total_read; + } + + #ifdef _DEBUG + BattFsPageHeader hdr; + readHdr(disk, fdb->start[pg_offset], &hdr); + ASSERT(hdr.inode == fdb->inode); + #endif + + size -= read_len; + fd->seek_pos += read_len; + total_read += read_len; + buf += read_len; + } + return total_read; +} + + +/** + * Search file \a inode in \a disk using a binary search. + * \a last is filled with array offset of file start + * in disk->page_array if file is found, otherwise + * \a last is filled with the correct insert position + * for creating a file with the given \a inode. + * \return true if file is found, false otherwisr. + */ +static bool findFile(BattFsSuper *disk, inode_t inode, pgcnt_t *last) +{ + BattFsPageHeader hdr; + pgcnt_t first = 0, page; + *last = disk->free_page_start; + fcs_t fcs; + + while (first < *last) + { + page = (first + *last) / 2; + LOG_INFO("first %d, last %d, page %d\n", first, *last, page); + if (!readHdr(disk, disk->page_array[page], &hdr)) + return false; + LOG_INFO("inode read: %d\n", hdr.inode); + fcs = computeFcs(&hdr); + if (hdr.fcs == fcs && hdr.inode == inode) + { + *last = page - hdr.pgoff; + LOG_INFO("Found: %d\n", *last); + return true; + } + else if (hdr.fcs == fcs && hdr.inode < inode) + first = page + 1; + else + *last = page; + } + LOG_INFO("Not found: last %d\n", *last); + return false; +} + +/** + * \return true if file \a inode exists on \a disk, false otherwise. + */ +bool battfs_fileExists(BattFsSuper *disk, inode_t inode) +{ + pgcnt_t dummy; + return findFile(disk, inode, &dummy); +} + +/** + * Count size of file \a inode on \a disk, starting at pointer \a start + * in disk->page_array. Size is written in \a size. + * \return true if all s ok, false on disk read errors. + */ +static file_size_t countFileSize(BattFsSuper *disk, pgcnt_t *start, inode_t inode) +{ + file_size_t size = 0; + BattFsPageHeader hdr; + + while (start < &disk->page_array[disk->free_page_start]) + { + if (!readHdr(disk, *start++, &hdr)) + return EOF; + if (hdr.fcs == computeFcs(&hdr) && hdr.inode == inode) + size += hdr.fill; + else + break; + } + return size; +} + +static int battfs_error(struct KFile *fd) +{ + BattFs *fdb = BATTFS_CAST(fd); + return fdb->errors; +} + + +static void battfs_clearerr(struct KFile *fd) +{ + BattFs *fdb = BATTFS_CAST(fd); + fdb->errors = 0; +} + +/** + * Open file \a inode from \a disk in \a mode. + * File context is stored in \a fd. + * \return true if ok, false otherwise. + */ +bool battfs_fileopen(BattFsSuper *disk, BattFs *fd, inode_t inode, filemode_t mode) +{ + Node *n; + + memset(fd, 0, sizeof(*fd)); + + /* Search file start point in disk page array */ + pgcnt_t start_pos; + if (!findFile(disk, inode, &start_pos)) + { + LOG_INFO("file %d not found\n", inode); + if (!(mode & BATTFS_CREATE)) + { + fd->errors |= BATTFS_FILE_NOT_FOUND_ERR; + return false; + } + /* Create the file */ + BattFsPageHeader hdr; + if (!(getNewPage(disk, start_pos, inode, 0, &hdr))) + { + fd->errors |= BATTFS_DISK_GETNEWPAGE_ERR; + return false; + } + } + fd->start = &disk->page_array[start_pos]; + LOG_INFO("Start pos %d\n", start_pos); + + /* Fill file size */ + if ((fd->fd.size = countFileSize(disk, fd->start, inode)) == EOF) + { + fd->errors |= BATTFS_DISK_READ_ERR; + return false; + } + fd->max_off = fd->fd.size / disk->data_size; + + /* Reset seek position */ + fd->fd.seek_pos = 0; + + /* Insert file handle in list, ordered by inode, ascending. */ + FOREACH_NODE(n, &disk->file_opened_list) + { + BattFs *file = containerof(n, BattFs, link); + if (file->inode >= inode) + break; + } + INSERT_BEFORE(&fd->link, n); + + /* Fill in data */ + fd->inode = inode; + fd->mode = mode; + fd->disk = disk; + + fd->fd.close = battfs_fileclose; + fd->fd.flush = battfs_flush; + fd->fd.read = battfs_read; + fd->fd.reopen = kfile_genericReopen; + fd->fd.seek = kfile_genericSeek; + fd->fd.write = battfs_write; + + fd->fd.error = battfs_error; + fd->fd.clearerr = battfs_clearerr; + + DB(fd->fd._type = KFT_BATTFS); + + return true; +} + + +/** + * Umount \a disk. + */ +bool battfs_umount(struct BattFsSuper *disk) +{ + Node *n; + int res = 0; + + /* Close all open files */ + FOREACH_NODE(n, &disk->file_opened_list) + { + BattFs *file = containerof(n, BattFs, link); + res += battfs_fileclose(&file->fd); + } + + /* Close disk */ + return disk->close(disk) && (res == 0); +} + +#if UNIT_TEST + +bool battfs_writeTestBlock(struct BattFsSuper *disk, pgcnt_t page, inode_t inode, seq_t seq, fill_t fill, pgoff_t pgoff) +{ + BattFsPageHeader hdr; + + /* Reset page to all 0xff */ + uint8_t buf[disk->page_size]; + memset(buf, 0xFF, disk->page_size); + disk->bufferWrite(disk, 0, buf, disk->page_size); + + hdr.inode = inode; + hdr.fill = fill; + hdr.pgoff = pgoff; + hdr.seq = seq; + hdr.fcs = computeFcs(&hdr); + + if (!(setBufferHdr(disk, &hdr) && disk->save(disk, page))) + { + LOG_ERR("error writing hdr\n"); + return false; + } + + return true; +} +#endif diff --git a/2.5/bertos/fs/battfs.h b/2.5/bertos/fs/battfs.h new file mode 100644 index 00000000..4c7e619d --- /dev/null +++ b/2.5/bertos/fs/battfs.h @@ -0,0 +1,291 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * \brief BattFS: a filesystem for embedded platforms (interface). + * TODO: Add detailed filesystem description. + * + * $WIZ$ module_name = "battfs" + * $WIZ$ module_depends = "rotating_hash", "kfile" + * $WIZ$ module_configuration = "bertos/cfg/cfg_battfs.h" + */ + +#ifndef FS_BATTFS_H +#define FS_BATTFS_H + +#include // uintXX_t; STATIC_ASSERT +#include // CPU_BITS_PER_CHAR +#include +#include +#include + +typedef uint16_t fill_t; ///< Type for keeping trace of space filled inside a page +typedef fill_t pgaddr_t; ///< Type for addressing space inside a page +typedef uint16_t pgcnt_t; ///< Type for counting pages on disk +typedef pgcnt_t pgoff_t; ///< Type for counting pages inside a file +typedef uint8_t inode_t; ///< Type for file inodes +typedef uint64_t seq_t; ///< Type for page seq number, at least 40bits wide. +typedef rotating_t fcs_t; ///< Type for header FCS. + + +/** + * BattFS page header, used to represent a page + * header in memory. + * To see how this is stored on disk: + * \see battfs_to_disk + * \see disk_to_battfs + */ +typedef struct BattFsPageHeader +{ + inode_t inode; ///< File inode (file identifier). + fill_t fill; ///< Filled bytes in page. + pgoff_t pgoff; ///< Page offset inside file. + + /** + * Page sequence number. + * Every time a page is rewritten the seq number is + * increased by 1. seq_t is wide enough to not to perform + * a wrap around before the memory death. + * So it can be kept as it would be + * monotonically increasing for our needs. + */ + seq_t seq; + + /** + * FCS (Frame Check Sequence) of the page header. + */ + fcs_t fcs; +} BattFsPageHeader; + +/** + * Size of the header once saved on disk. + * \see battfs_to_disk + * \see disk_to_battfs + */ +#define BATTFS_HEADER_LEN 12 + +/** + * Maximum page address. + */ +#define MAX_PAGE_ADDR ((1 << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t))) - 1) + +/** + * Max number of files. + */ +#define BATTFS_MAX_FILES (1 << (CPU_BITS_PER_CHAR * sizeof(inode_t))) + +/* Fwd decl */ +struct BattFsSuper; + +/** + * Sentinel used to keep trace of unset pages in disk->page_array. + */ +#define PAGE_UNSET_SENTINEL ((pgcnt_t)((1L << (CPU_BITS_PER_CHAR * sizeof(pgcnt_t))) - 1)) + +/** + * Type interface for disk page read function. + * \a page is the page address, \a addr the address inside the page, + * \a size the lenght to be read. + * \return the number of bytes read. + */ +typedef size_t (*disk_page_read_t) (struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, void *buf, size_t); + + +/** + * Type interface for disk page load function. + * The disk should supply a buffer used for loading/saving pages. + * This has to be done by the disk driver because it knows memory details + * (e.g. some memories can have the buffer inside the memory itself). + * \a page is the page to be loaded from the disk in the buffer. + * \return true if ok, false on errors. + */ +typedef bool (*disk_page_load_t) (struct BattFsSuper *d, pgcnt_t page); + +/** + * Type interface for disk pagebuffer write function. + * \a addr is the address inside the current loaded page, + * \a size the lenght to be written. + * \return the number of bytes written. + */ +typedef size_t (*disk_buffer_write_t) (struct BattFsSuper *d, pgaddr_t addr, const void *buf, size_t); + +/** + * Type interface for disk pagebuffer read function. + * \a addr is the address inside the current loaded page, + * \a size the lenght to be read. + * \return the number of bytes read. + */ +typedef size_t (*disk_buffer_read_t) (struct BattFsSuper *d, pgaddr_t addr, void *buf, size_t); + +/** + * Type interface for disk page save function. + * The disk should supply a buffer used for loading/saving pages. + * For details \see disk_page_load_t. + * \a page is the page where the buffer will be written. + * \return true if ok, false on errors. + */ +typedef bool (*disk_page_save_t) (struct BattFsSuper *d, pgcnt_t page); + +/** + * Type interface for disk page erase function. + * \a page is the page address. + * \return true if all is ok, false otherwise. + */ +typedef bool (*disk_page_erase_t) (struct BattFsSuper *d, pgcnt_t page); + +/** + * Type interface for disk deinit function. + * \return true if all is ok, false otherwise. + */ +typedef bool (*disk_close_t) (struct BattFsSuper *d); + + +typedef uint32_t disk_size_t; ///< Type for disk sizes. + +/** + * Context used to describe a disk. + * This context structure will be used to access disk. + * Must be initialized by hw memory driver. + */ +typedef struct BattFsSuper +{ + void *disk_ctx; ///< Disk context used by disk access functions. + disk_page_read_t read; ///< Page read. + disk_page_load_t load; ///< Page load. + disk_buffer_write_t bufferWrite; ///< Buffer write. + disk_buffer_read_t bufferRead; ///< Buffer read. + disk_page_save_t save; ///< Page save. + disk_page_erase_t erase; ///< Page erase. + disk_close_t close; ///< Disk deinit. + + pgaddr_t page_size; ///< Size of a memory page, in bytes. Used by disk low level driver. + pgaddr_t data_size; ///< Size of space usable for data in a disk page, in bytes. The rest is used by the page header. + pgcnt_t page_count; ///< Number of pages on disk. + + /** + * Page allocation array. + * This array must be allocated somewhere and + * must have enough space for page_count elements. + * Is used by the filesystem to represent + * the entire disk in memory. + */ + pgcnt_t *page_array; + pgcnt_t curr_page; ///< Current page loaded in disk buffer. + bool cache_dirty; ///< True if current cache is dirty (nneds to be flushed). + + /** + * Lowest address, in page array, for free pages. + * Pages above this element are free for use. + */ + pgcnt_t free_page_start; + + disk_size_t disk_size; ///< Size of the disk, in bytes (page_count * page_size). + disk_size_t free_bytes; ///< Free space on the disk. + + List file_opened_list; ///< List used to keep trace of open files. + /* TODO add other fields. */ +} BattFsSuper; + +/** + * True if space on \a disk is over. + */ +#define SPACE_OVER(disk) ((disk)->free_page_start >= (disk)->page_count) + +typedef uint8_t filemode_t; ///< Type for file open modes. +typedef int32_t file_size_t; ///< Type for file sizes. + +/** + * Modes for battfs_fileopen. + * \{ + */ +#define BATTFS_CREATE BV(0) ///< Create file if does not exist +#define BATTFS_RD BV(1) ///< Open file for reading +#define BATTFS_WR BV(2) ///< Open file fir writing +/*/}*/ + + +/** + * File errors. + * \{ + */ +#define BATTFS_NEGATIVE_SEEK_ERR BV(0) ///< Trying to read/write before file start. +#define BATTFS_DISK_READ_ERR BV(1) ///< Error reading from disk driver. +#define BATTFS_DISK_LOADPAGE_ERR BV(2) ///< Error loading a disk page in the buffer. +#define BATTFS_DISK_BUFFERWR_ERR BV(3) ///< Error writing in the disk page buffer. +#define BATTFS_DISK_GETNEWPAGE_ERR BV(4) ///< Error getting a free page. +#define BATTFS_DISK_BUFFERRD_ERR BV(6) ///< Error reading from the disk page buffer. +#define BATTFS_DISK_SPACEOVER_ERR BV(7) ///< No more disk space available. +#define BATTFS_DISK_FLUSHBUF_ERR BV(8) ///< Error flushing (writing) the current page to disk. +#define BATTFS_FILE_NOT_FOUND_ERR BV(9) ///< File not found on disk. +/*/}*/ + +/** + * Describe a BattFs file usign a KFile. + */ +typedef struct BattFs +{ + KFile fd; ///< KFile context + Node link; ///< Link for inserting in opened file list + inode_t inode; ///< inode of the opened file + BattFsSuper *disk; ///< Disk context + filemode_t mode; ///< File open mode + pgcnt_t *start; ///< Pointer to page_array file start position. + pgcnt_t max_off; ///< Max page offset allocated for the file. + int errors; ///< File status/errors +} BattFs; + +/** + * Id for battfs file descriptors. + */ +#define KFT_BATTFS MAKE_ID('B', 'T', 'F', 'S') + +/** + * Macro used to cast a KFile to a BattFS. + * Also perform dynamic type check. + */ +INLINE BattFs * BATTFS_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_BATTFS); + return (BattFs *)fd; +} + +bool battfs_mount(struct BattFsSuper *d); +bool battfs_fsck(struct BattFsSuper *disk); +bool battfs_umount(struct BattFsSuper *disk); + +bool battfs_fileExists(BattFsSuper *disk, inode_t inode); +bool battfs_fileopen(BattFsSuper *disk, BattFs *fd, inode_t inode, filemode_t mode); +bool battfs_writeTestBlock(struct BattFsSuper *disk, pgcnt_t page, inode_t inode, seq_t seq, fill_t fill, pgoff_t pgoff); +#endif /* FS_BATTFS_H */ diff --git a/2.5/bertos/fs/battfs_test.c b/2.5/bertos/fs/battfs_test.c new file mode 100644 index 00000000..642e6d64 --- /dev/null +++ b/2.5/bertos/fs/battfs_test.c @@ -0,0 +1,1149 @@ +/** + * \file + * + * + * \brief BattFS Test. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include + +#include +#include + +#include +#include +#include + +#define FILE_SIZE 32768 +#define PAGE_SIZE 128 +#define PAGE_COUNT FILE_SIZE / PAGE_SIZE + +#if UNIT_TEST + +const char test_filename[]="battfs_disk.bin"; + +static uint8_t page_buffer[PAGE_SIZE]; + +static size_t disk_page_read(struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, void *buf, size_t size) +{ + //TRACEMSG("page:%d, addr:%d, size:%d", page, addr, size); + FILE *fp = (FILE *)d->disk_ctx; + fseek(fp, page * d->page_size + addr, SEEK_SET); + return fread(buf, 1, size, fp); +} + +static size_t disk_buffer_write(struct BattFsSuper *d, pgaddr_t addr, const void *buf, size_t size) +{ + //TRACEMSG("addr:%d, size:%d", addr, size); + ASSERT(addr + size <= d->page_size); + memcpy(&page_buffer[addr], buf, size); + + return size; +} + +static size_t disk_buffer_read(struct BattFsSuper *d, pgaddr_t addr, void *buf, size_t size) +{ + //TRACEMSG("addr:%d, size:%d", addr, size); + ASSERT(addr + size <= d->page_size); + memcpy(buf, &page_buffer[addr], size); + + return size; +} + +static bool disk_page_load(struct BattFsSuper *d, pgcnt_t page) +{ + FILE *fp = (FILE *)d->disk_ctx; + //TRACEMSG("page:%d", page); + fseek(fp, page * d->page_size, SEEK_SET); + return fread(page_buffer, 1, d->page_size, fp) == d->page_size; +} + +static bool disk_page_save(struct BattFsSuper *d, pgcnt_t page) +{ + FILE *fp = (FILE *)d->disk_ctx; + //TRACEMSG("page:%d", page); + fseek(fp, page * d->page_size, SEEK_SET); + return fwrite(page_buffer, 1, d->page_size, fp) == d->page_size; +} + +static bool disk_page_erase(struct BattFsSuper *d, pgcnt_t page) +{ + FILE *fp = (FILE *)d->disk_ctx; + //TRACEMSG("page:%d", page); + fseek(fp, page * d->page_size, SEEK_SET); + + for (int i = 0; i < d->page_size; i++) + if (fputc(0xff, fp) == EOF) + return false; + return true; +} + +static bool disk_close(struct BattFsSuper *d) +{ + FILE *fp = (FILE *)d->disk_ctx; + //TRACE; + free(d->page_array); + return (fclose(fp) != EOF); +} + +static bool disk_open(struct BattFsSuper *d) +{ + d->read = disk_page_read; + d->load = disk_page_load; + d->bufferWrite = disk_buffer_write; + d->bufferRead = disk_buffer_read; + d->save = disk_page_save; + d->erase = disk_page_erase; + d->close = disk_close; + + FILE *fp = fopen(test_filename, "r+b"); + ASSERT(fp); + d->disk_ctx = fp; + fseek(fp, 0, SEEK_END); + d->page_size = PAGE_SIZE; + d->page_count = ftell(fp) / d->page_size; + d->page_array = malloc(d->page_count * sizeof(pgcnt_t)); + //TRACEMSG("page_size:%d, page_count:%d\n", d->page_size, d->page_count); + return (fp && d->page_array); +} + +static void testCheck(BattFsSuper *disk, pgcnt_t *reference) +{ + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + + for (int i = 0; i < disk->page_count; i++) + { + if (disk->page_array[i] != reference[i]) + { + kprintf("Error at addr %d: page_array read", i); + for (pgcnt_t i = 0; i < disk->page_count; i++) + { + if (!(i % 16)) + kputchar('\n'); + kprintf("%04d ", disk->page_array[i]); + } + kputchar('\n'); + kprintf("Expected:"); + for (pgcnt_t i = 0; i < disk->page_count; i++) + { + if (!(i % 16)) + kputchar('\n'); + kprintf("%04d ", reference[i]); + } + kputchar('\n'); + battfs_umount(disk); + exit(2); + } + } + + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); +} + +static void diskNew(BattFsSuper *disk) +{ + pgcnt_t ref[PAGE_COUNT]; + TRACEMSG("1: disk new\n"); + + FILE *fpt = fopen(test_filename, "w+"); + + for (int i = 0; i < FILE_SIZE; i++) + fputc(0xff, fpt); + fclose(fpt); + for (int i = 0; i < PAGE_COUNT; i++) + ref[i] = i; + + testCheck(disk, ref); + TRACEMSG("1: passed\n"); +} + +static void disk1File(BattFsSuper *disk) +{ + pgcnt_t ref[PAGE_COUNT]; + TRACEMSG("2: disk full with 1 contiguos file\n"); + + + FILE *fp = fopen(test_filename, "w+"); + + for (int i = 0; i < PAGE_COUNT; i++) + { + battfs_writeTestBlock(disk, i, 0, 0, disk->data_size, i); + ref[i] = i; + } + fclose(fp); + + testCheck(disk, ref); + TRACEMSG("2: passed\n"); +} + + +static void diskHalfFile(BattFsSuper *disk) +{ + pgcnt_t ref[PAGE_COUNT]; + TRACEMSG("3: disk half full with 1 contiguos file, rest unformatted\n"); + + + FILE *fp = fopen(test_filename, "w+"); + + for (int i = 0; i < PAGE_COUNT / 2; i++) + { + battfs_writeTestBlock(disk, i, 0, 0, disk->data_size, i); + ref[i] = i; + } + fseek(fp, FILE_SIZE / 2, SEEK_SET); + for (int i = FILE_SIZE / 2; i < FILE_SIZE; i++) + fputc(0xff, fp); + fclose(fp); + + for (int i = PAGE_COUNT / 2; i < PAGE_COUNT; i++) + { + ref[i] = i; + } + + + testCheck(disk, ref); + TRACEMSG("3: passed\n"); +} + + +static void oldSeq1(BattFsSuper *disk) +{ + pgcnt_t ref[4]; + TRACEMSG("6: 1 file with 1 old seq num, 1 free block\n"); + + + FILE *fp = fopen(test_filename, "w+"); + // page, inode, seq, fill, pgoff + battfs_writeTestBlock(disk, 0, 0, 0, disk->data_size, 0); + battfs_writeTestBlock(disk, 1, 0, 0, disk->data_size, 1); + battfs_writeTestBlock(disk, 2, 0, 1, disk->data_size, 1); + disk->erase(disk, 3); + + + fclose(fp); + ref[0] = 0; + ref[1] = 2; + ref[2] = 1; + ref[3] = 3; + + testCheck(disk, ref); + TRACEMSG("6: passed\n"); +} + +static void oldSeq2(BattFsSuper *disk) +{ + pgcnt_t ref[4]; + TRACEMSG("7: 1 file with 1 old seq num, 1 free block\n"); + + + FILE *fp = fopen(test_filename, "w+"); + // page, inode, seq, fill, pgoff + battfs_writeTestBlock(disk, 0, 0, 0, disk->data_size, 0); + battfs_writeTestBlock(disk, 1, 0, 1, disk->data_size, 1); + battfs_writeTestBlock(disk, 2, 0, 0, disk->data_size, 1); + disk->erase(disk, 3); + + fclose(fp); + ref[0] = 0; + ref[1] = 1; + ref[2] = 2; + ref[3] = 3; + + testCheck(disk, ref); + TRACEMSG("7: passed\n"); +} + +static void oldSeq3(BattFsSuper *disk) +{ + pgcnt_t ref[4]; + TRACEMSG("8: 1 file with 1 old seq num, 1 free block\n"); + + + FILE *fp = fopen(test_filename, "w+"); + + // page, inode, seq, fill, pgoff + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, 0, 0, disk->data_size, 0); + battfs_writeTestBlock(disk, 2, 0, 1, disk->data_size, 1); + battfs_writeTestBlock(disk, 3, 0, 0, disk->data_size, 1); + + + fclose(fp); + ref[0] = 1; + ref[1] = 2; + ref[2] = 0; + ref[3] = 3; + + testCheck(disk, ref); + TRACEMSG("8: passed\n"); +} + +static void oldSeq2File(BattFsSuper *disk) +{ + pgcnt_t ref[8]; + TRACEMSG("9: 2 file with old seq num, 2 free block\n"); + + + FILE *fp = fopen(test_filename, "w+"); + + // page, inode, seq, fill, pgoff + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, 0, 0, disk->data_size, 0); + battfs_writeTestBlock(disk, 2, 0, 3, disk->data_size, 1); + battfs_writeTestBlock(disk, 3, 0, 0, disk->data_size, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, 4, 0, disk->data_size, 0); + battfs_writeTestBlock(disk, 6, 4, 1, disk->data_size, 1); + battfs_writeTestBlock(disk, 7, 4, 0, disk->data_size, 1); + + + fclose(fp); + ref[0] = 1; + ref[1] = 2; + ref[2] = 5; + ref[3] = 6; + ref[4] = 0; + ref[5] = 3; + ref[6] = 4; + ref[7] = 7; + + testCheck(disk, ref); + TRACEMSG("9: passed\n"); +} + +static void openFile(BattFsSuper *disk) +{ + BattFs fd1; + BattFs fd2; + TRACEMSG("10: open file test, inode 0 and inode 4\n"); + + FILE *fp = fopen(test_filename, "w+"); + + int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; + inode_t INODE = 0; + inode_t INODE2 = 4; + inode_t INEXISTENT_INODE = 123; + unsigned int MODE = 0; + + // page, inode, seq, fill, pgoff + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, INODE2, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 6, INODE2, 1, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 7, INODE2, 0, PAGE_FILL, 1); + + fclose(fp); + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(!battfs_fileExists(disk, INEXISTENT_INODE)); + + ASSERT(battfs_fileExists(disk, INODE)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + ASSERT(fd1.fd.size == PAGE_FILL * 2); + ASSERT(fd1.fd.seek_pos == 0); + ASSERT(fd1.mode == MODE); + ASSERT(fd1.inode == INODE); + ASSERT(fd1.start == &disk->page_array[0]); + ASSERT(fd1.disk == disk); + ASSERT(LIST_HEAD(&disk->file_opened_list) == &fd1.link); + + ASSERT(kfile_reopen(&fd1.fd) == &fd1.fd); + ASSERT(fd1.fd.size == PAGE_FILL * 2); + ASSERT(fd1.fd.seek_pos == 0); + ASSERT(fd1.mode == MODE); + ASSERT(fd1.inode == INODE); + ASSERT(fd1.start == &disk->page_array[0]); + ASSERT(fd1.disk == disk); + ASSERT(LIST_HEAD(&disk->file_opened_list) == &fd1.link); + + ASSERT(battfs_fileExists(disk, INODE2)); + ASSERT(battfs_fileopen(disk, &fd2, INODE2, MODE)); + ASSERT(fd2.fd.size == PAGE_FILL * 2); + ASSERT(fd2.fd.seek_pos == 0); + ASSERT(fd2.mode == MODE); + ASSERT(fd2.inode == INODE2); + ASSERT(fd2.start == &disk->page_array[2]); + ASSERT(fd2.disk == disk); + ASSERT(LIST_HEAD(&disk->file_opened_list)->succ == &fd2.link); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); + ASSERT(kfile_close(&fd2.fd) == 0); + ASSERT(kfile_error(&fd2.fd) == 0); + ASSERT(LIST_EMPTY(&disk->file_opened_list)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("10: passed\n"); +} + +static void readFile(BattFsSuper *disk) +{ + BattFs fd1; + uint8_t buf[16]; + + TRACEMSG("11: read file test\n"); + + FILE *fp = fopen(test_filename, "w+"); + + unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; + inode_t INODE = 0; + inode_t INODE2 = 4; + unsigned int MODE = 0; + + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, INODE2, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 6, INODE2, 1, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 7, INODE2, 0, PAGE_FILL, 1); + + fclose(fp); + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == sizeof(buf)); + for (size_t i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == 0xff); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("11: passed\n"); +} + +static void readAcross(BattFsSuper *disk) +{ + BattFs fd1; + + TRACEMSG("12: read file test across page boundary and seek test\n"); + + FILE *fp = fopen(test_filename, "w+"); + + const unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; + inode_t INODE = 0; + unsigned int MODE = 0; + uint8_t buf[PAGE_FILL + BATTFS_HEADER_LEN / 2]; + + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, INODE, 0, PAGE_FILL, 2); + battfs_writeTestBlock(disk, 6, INODE, 1, PAGE_FILL, 3); + battfs_writeTestBlock(disk, 7, INODE, 0, PAGE_FILL, 3); + + fclose(fp); + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf)); + for (size_t i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == 0xff); + + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf) * 2); + for (size_t i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == 0xff); + + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf) * 3); + for (size_t i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == 0xff); + + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == PAGE_FILL * 4 - sizeof(buf) * 3); + ASSERT(fd1.fd.seek_pos == (kfile_off_t)fd1.fd.size); + for (size_t i = 0; i < PAGE_FILL * 4 - sizeof(buf) * 3; i++) + ASSERT(buf[i] == 0xff); + + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + ASSERT(fd1.fd.seek_pos == 0); + + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_END) == (kfile_off_t)fd1.fd.size); + ASSERT(fd1.fd.seek_pos = (kfile_off_t)fd1.fd.size); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("12: passed\n"); +} + + +static void writeFile(BattFsSuper *disk) +{ + BattFs fd1; + uint8_t buf[PAGE_SIZE - BATTFS_HEADER_LEN]; + + TRACEMSG("13: write file test\n"); + + FILE *fp = fopen(test_filename, "w+"); + + unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; + inode_t INODE = 0; + inode_t INODE2 = 4; + unsigned int MODE = 0; + + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, INODE2, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 6, INODE2, 1, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 7, INODE2, 0, PAGE_FILL, 1); + + fclose(fp); + + for (size_t i = 0; i < sizeof(buf); i++) + buf[i] = i; + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == sizeof(buf)); + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + ASSERT(fd1.fd.seek_pos == 0); + + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (size_t i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == i); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("13: passed\n"); +} + +static void writeAcross(BattFsSuper *disk) +{ + BattFs fd1; + + TRACEMSG("14: write file test across page boundary and seek test\n"); + + FILE *fp = fopen(test_filename, "w+"); + + const unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; + inode_t INODE = 0; + unsigned int MODE = 0; + uint8_t buf[PAGE_FILL + BATTFS_HEADER_LEN / 2]; + + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, INODE, 0, PAGE_FILL, 2); + battfs_writeTestBlock(disk, 6, INODE, 1, PAGE_FILL, 3); + battfs_writeTestBlock(disk, 7, INODE, 0, PAGE_FILL, 3); + + fclose(fp); + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + + uint8_t val = 0; + for (size_t i = 0; i < sizeof(buf); i++) + buf[i] = val++; + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf)); + + for (size_t i = 0; i < sizeof(buf); i++) + buf[i] = val++; + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf) * 2); + + for (size_t i = 0; i < sizeof(buf); i++) + buf[i] = val++; + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf) * 3); + + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + ASSERT(fd1.fd.seek_pos == 0); + val = 0; + + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (size_t i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == val++); + + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (size_t i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == val++); + + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (size_t i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == val++); + + ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf) * 3); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("14: passed\n"); +} + +static void createFile(BattFsSuper *disk) +{ + TRACEMSG("15: file creation on new disk\n"); + + FILE *fpt = fopen(test_filename, "w+"); + + for (int i = 0; i < FILE_SIZE; i++) + fputc(0xff, fpt); + fclose(fpt); + + BattFs fd1; + inode_t INODE = 0; + unsigned int MODE = BATTFS_CREATE; + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + for (int i = 0; i < FILE_SIZE / 2; i++) + ASSERT(kfile_putc(i, &fd1.fd) != EOF); + + ASSERT(fd1.fd.seek_pos == FILE_SIZE / 2); + ASSERT(fd1.fd.size == FILE_SIZE / 2); + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, 0)); + ASSERT(fd1.fd.size == FILE_SIZE / 2); + ASSERT(fd1.fd.seek_pos == 0); + + uint8_t buf[FILE_SIZE / 2]; + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, FILE_SIZE / 2) == FILE_SIZE / 2); + + for (int i = 0; i < FILE_SIZE / 2; i++) + ASSERT(buf[i] == (i & 0xff)); + + ASSERT(fd1.fd.seek_pos == FILE_SIZE / 2); + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + + TRACEMSG("15: passed\n"); +} + +static void multipleWrite(BattFsSuper *disk) +{ + TRACEMSG("16: multiple write on file\n"); + + FILE *fpt = fopen(test_filename, "w+"); + + for (int i = 0; i < FILE_SIZE; i++) + fputc(0xff, fpt); + fclose(fpt); + + BattFs fd1; + inode_t INODE = 0; + unsigned int MODE = BATTFS_CREATE; + uint8_t buf[1000]; + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + + int j; + for (j = 1; j < 1013; j++) + { + for (unsigned i = 0; i < sizeof(buf); i++) + buf[i] = j+i; + + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == sizeof(buf)); + ASSERT(fd1.fd.size == sizeof(buf)); + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == sizeof(buf)); + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == ((j+i) & 0xff)); + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + ASSERT(disk->free_bytes == disk->disk_size - sizeof(buf)); + } + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(disk->free_bytes == disk->disk_size - sizeof(buf)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, 0)); + ASSERT(fd1.fd.size == sizeof(buf)); + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == ((j-1+i) & 0xff)); + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + + TRACEMSG("16: passed\n"); +} + +static void increaseFile(BattFsSuper *disk) +{ + TRACEMSG("17: increasing dimension of a file with multiple open files.\n"); + + FILE *fpt = fopen(test_filename, "w+"); + + for (int i = 0; i < FILE_SIZE / 10; i++) + fputc(0xff, fpt); + fclose(fpt); + + BattFs fd1,fd2; + inode_t INODE1 = 1, INODE2 = 2; + unsigned int MODE = BATTFS_CREATE; + uint8_t buf[1000]; + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE1, MODE)); + ASSERT(battfs_fileopen(disk, &fd2, INODE2, MODE)); + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(kfile_putc(i, &fd2.fd) != EOF); + ASSERT(kfile_seek(&fd2.fd, 0, KSM_SEEK_SET) == 0); + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd2.fd, buf, sizeof(buf)) == sizeof(buf)); + + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == (i & 0xff)); + ASSERT(kfile_seek(&fd2.fd, 0, KSM_SEEK_SET) == 0); + + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(kfile_putc(i, &fd1.fd) != EOF); + + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd2.fd, buf, sizeof(buf)) == sizeof(buf)); + + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == (i & 0xff)); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); + ASSERT(kfile_close(&fd2.fd) == 0); + ASSERT(kfile_error(&fd2.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("17: passed\n"); +} + +static void readEOF(BattFsSuper *disk) +{ + BattFs fd1; + uint8_t buf[16]; + + TRACEMSG("18: reading over EOF test\n"); + + FILE *fp = fopen(test_filename, "w+"); + + unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; + inode_t INODE = 0; + inode_t INODE2 = 4; + unsigned int MODE = 0; + + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, INODE2, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 6, INODE2, 1, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 7, INODE2, 0, PAGE_FILL, 1); + + fclose(fp); + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + ASSERT(kfile_seek(&fd1.fd, fd1.fd.size + 10, SEEK_SET) == fd1.fd.size + 10); + ASSERT(fd1.fd.seek_pos == fd1.fd.size + 10); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == 0); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("18: passed\n"); +} + +static void writeEOF(BattFsSuper *disk) +{ + TRACEMSG("19: writing over EOF test\n"); + + FILE *fpt = fopen(test_filename, "w+"); + + for (int i = 0; i < FILE_SIZE / 5; i++) + fputc(0xff, fpt); + fclose(fpt); + + BattFs fd1; + inode_t INODE = 0; + unsigned int MODE = BATTFS_CREATE; + uint8_t buf[FILE_SIZE / 13]; + + for (int i = 0; i < 2; i++) + buf[i] = i; + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + disk_size_t prev_free = disk->free_bytes; + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + ASSERT(fd1.fd.size == 0); + + ASSERT(kfile_seek(&fd1.fd, 2, KSM_SEEK_END) == 2); + ASSERT(kfile_write(&fd1.fd, buf, 2)); + ASSERT(fd1.fd.seek_pos == 4); + ASSERT(fd1.fd.size == 4); + ASSERT(disk->free_bytes == prev_free - 4); + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + memset(buf, 0, 2); + ASSERT(kfile_read(&fd1.fd, buf, 2) == 2); + for (int i = 0; i < 2; i++) + ASSERT(buf[i] == 0); + + memset(buf, 0, 2); + ASSERT(kfile_read(&fd1.fd, buf, 2) == 2); + for (int i = 0; i < 2; i++) + ASSERT(buf[i] == (i & 0xff)); + + ASSERT(kfile_seek(&fd1.fd, sizeof(buf), KSM_SEEK_END) == sizeof(buf) + 4); + for (unsigned i = 0; i < sizeof(buf); i++) + buf[i] = i; + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf))); + ASSERT(fd1.fd.seek_pos == sizeof(buf) * 2 + 4); + ASSERT(fd1.fd.size == sizeof(buf) * 2 + 4); + ASSERT(disk->free_bytes == prev_free - sizeof(buf) * 2 - 4); + + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + + memset(buf, 0, 2); + ASSERT(kfile_read(&fd1.fd, buf, 2) == 2); + ASSERT(fd1.fd.seek_pos == 2); + for (int i = 0; i < 2; i++) + ASSERT(buf[i] == 0); + + memset(buf, 0, 2); + ASSERT(kfile_read(&fd1.fd, buf, 2) == 2); + ASSERT(fd1.fd.seek_pos == 4); + for (int i = 0; i < 2; i++) + ASSERT(buf[i] == (i & 0xff)); + + memset(buf, 0, 4); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == sizeof(buf) + 4); + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == 0); + + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == (i & 0xff)); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("19: passed\n"); + +} + +static void endOfSpace(BattFsSuper *disk) +{ + TRACEMSG("20: what happens when disk space is over?\n"); + BattFs fd1; + uint8_t buf[(PAGE_SIZE - BATTFS_HEADER_LEN) * 5]; + + FILE *fp = fopen(test_filename, "w+"); + + unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; + inode_t INODE = 0; + unsigned int MODE = BATTFS_CREATE; + + disk->erase(disk, 0); + disk->erase(disk, 1); + disk->erase(disk, 2); + disk->erase(disk, 3); + fclose(fp); + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == PAGE_FILL * 4); + ASSERT(fd1.fd.size == (kfile_off_t)(PAGE_FILL * 4)); + ASSERT(fd1.fd.seek_pos == (kfile_off_t)(PAGE_FILL * 4)); + ASSERT(disk->free_bytes == 0); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == BATTFS_DISK_GETNEWPAGE_ERR); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("20: passed\n"); +} + + +static void multipleFilesRW(BattFsSuper *disk) +{ + TRACEMSG("21: multiple files read/write test\n"); + + FILE *fpt = fopen(test_filename, "w+"); + + for (int i = 0; i < FILE_SIZE; i++) + fputc(0xff, fpt); + fclose(fpt); + + #define N_FILES 10 + BattFs fd[N_FILES]; + unsigned int MODE = BATTFS_CREATE; + uint32_t buf[FILE_SIZE / (4 * N_FILES * sizeof(uint32_t))]; + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + for (inode_t i = 0; i < N_FILES; i++) + ASSERT(battfs_fileopen(disk, &fd[i], i, MODE)); + + for (int i = N_FILES - 1; i >= 0; i--) + { + for (uint32_t j = 0; j < countof(buf); j++) + buf[j] = j+i; + + ASSERT(kfile_write(&fd[i].fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd[i].fd.size == sizeof(buf)); + ASSERT(fd[i].fd.seek_pos == sizeof(buf)); + ASSERT(kfile_seek(&fd[i].fd, 0, SEEK_SET) == 0); + } + + for (inode_t i = 0; i < N_FILES; i++) + { + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd[i].fd, buf, sizeof(buf)) == sizeof(buf)); + + for (uint32_t j = 0; j < countof(buf); j++) + ASSERT(buf[j] == j+i); + + ASSERT(fd[i].fd.size == sizeof(buf)); + ASSERT(fd[i].fd.seek_pos == sizeof(buf)); + ASSERT(kfile_seek(&fd[i].fd, 0, SEEK_SET) == 0); + } + + for (inode_t i = 0; i < N_FILES; i++) + { + ASSERT(kfile_close(&fd[i].fd) == 0); + ASSERT(kfile_error(&fd[i].fd) == 0); + } + + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + + for (inode_t i = 0; i < N_FILES; i++) + ASSERT(battfs_fileopen(disk, &fd[i], i, 0)); + + for (inode_t i = 0; i < N_FILES; i++) + { + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd[i].fd, buf, sizeof(buf)) == sizeof(buf)); + + for (uint32_t j = 0; j < countof(buf); j++) + ASSERT(buf[j] == j+i); + + ASSERT(fd[i].fd.size == sizeof(buf)); + ASSERT(fd[i].fd.seek_pos == sizeof(buf)); + ASSERT(kfile_seek(&fd[i].fd, 0, SEEK_SET) == 0); + } + + for (inode_t i = 0; i < N_FILES; i++) + { + ASSERT(kfile_close(&fd[i].fd) == 0); + ASSERT(kfile_error(&fd[i].fd) == 0); + } + + ASSERT(battfs_umount(disk)); + TRACEMSG("21: passed\n"); +} + + +static void openAllFiles(BattFsSuper *disk) +{ + TRACEMSG("22: try to open a lot of files\n"); + + FILE *fpt = fopen(test_filename, "w+"); + + for (int i = 0; i < FILE_SIZE; i++) + fputc(0xff, fpt); + fclose(fpt); + + BattFs fd[BATTFS_MAX_FILES]; + unsigned int MODE = BATTFS_CREATE; + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + for (unsigned i = 0; i < countof(fd); i++) + ASSERT(battfs_fileopen(disk, &fd[i], i, MODE)); + + ASSERT(battfs_fsck(disk)); + + for (unsigned i = 0; i < countof(fd); i++) + { + ASSERT(kfile_close(&fd[i].fd) == 0); + ASSERT(kfile_error(&fd[i].fd) == 0); + } + + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + ASSERT(disk_open(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + + + for (unsigned i = 0; i < countof(fd); i++) + ASSERT(battfs_fileopen(disk, &fd[i], i, MODE)); + + ASSERT(battfs_fsck(disk)); + + for (unsigned i = 0; i < countof(fd); i++) + { + ASSERT(kfile_close(&fd[i].fd) == 0); + ASSERT(kfile_error(&fd[i].fd) == 0); + } + + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + TRACEMSG("22: passed\n"); +} + + +int battfs_testRun(void) +{ + BattFsSuper disk; + + diskNew(&disk); + disk1File(&disk); + diskHalfFile(&disk); + oldSeq1(&disk); + oldSeq2(&disk); + oldSeq3(&disk); + oldSeq2File(&disk); + openFile(&disk); + readFile(&disk); + readAcross(&disk); + writeFile(&disk); + writeAcross(&disk); + createFile(&disk); + multipleWrite(&disk); + increaseFile(&disk); + readEOF(&disk); + writeEOF(&disk); + endOfSpace(&disk); + multipleFilesRW(&disk); + openAllFiles(&disk); + + kprintf("All tests passed!\n"); + + return 0; +} + +int battfs_testSetup(void) +{ + return 0; +} + +int battfs_testTearDown(void) +{ + return 0; +} + +TEST_MAIN(battfs); + +#endif // _TEST diff --git a/2.5/bertos/fs/fat.c b/2.5/bertos/fs/fat.c new file mode 100644 index 00000000..77590c56 --- /dev/null +++ b/2.5/bertos/fs/fat.c @@ -0,0 +1,144 @@ +/** + * \file + * + * + * \brief FatFS: kfile interface for FatFS module by ChaN. + * + * \version $Id$ + * + * \author Luca Ottaviano + * + */ + +#include "fat.h" + +static size_t fatfile_read(struct KFile *_fd, void *buf, size_t size) +{ + FatFile *fd = FATFILE_CAST(_fd); + UINT count; + fd->error_code = f_read(&fd->fat_file, buf, size, &count); + return count; +} + +static size_t fatfile_write(struct KFile *_fd, const void *buf, size_t size) +{ + FatFile *fd = FATFILE_CAST(_fd); + UINT count; + fd->error_code = f_write(&fd->fat_file, buf, size, &count); + return count; +} + +static int fatfile_close(struct KFile *_fd) +{ + FatFile *fd = FATFILE_CAST(_fd); + fd->error_code = f_close(&fd->fat_file); + if (fd->error_code) + return EOF; + else + return 0; +} + +static kfile_off_t fatfile_seek(struct KFile *_fd, kfile_off_t offset, KSeekMode whence) +{ + /* clip at start-of-file + * don't clip at end-of-file when in write mode + */ + FatFile *fd = FATFILE_CAST(_fd); + DWORD lseek_offset = 0; + switch (whence) + { + case KSM_SEEK_SET: + if (offset > 0) + lseek_offset = (DWORD) offset; + break; + case KSM_SEEK_CUR: + if (offset > 0) + lseek_offset = fd->fat_file.fptr + (DWORD) offset; + else + { + if (fd->fat_file.fptr > (DWORD) (-offset)) + lseek_offset = fd->fat_file.fptr - (DWORD)(-offset); + } + break; + case KSM_SEEK_END: + if (offset > 0) + lseek_offset = fd->fat_file.fsize + (DWORD) offset; + else + { + if (fd->fat_file.fsize > (DWORD) (-offset)) + lseek_offset = fd->fat_file.fsize + (DWORD) offset; + } + break; + } + fd->error_code = f_lseek(&fd->fat_file, lseek_offset); + if ((fd->error_code) || (fd->fat_file.fptr != lseek_offset)) + return EOF; + else + /* TODO: this conversion may overflow */ + return (kfile_off_t)fd->fat_file.fptr; +} + +static int fatfile_flush(struct KFile *_fd) +{ + FatFile *fd = FATFILE_CAST(_fd); + fd->error_code = f_sync(&fd->fat_file); + if (fd->error_code) + return EOF; + else + return 0; +} + +static int fatfile_error(struct KFile *_fd) +{ + FatFile *fd = FATFILE_CAST(_fd); + return (int)fd->error_code; +} + +static void fatfile_clearerr(struct KFile *_fd) +{ + FatFile *fd = FATFILE_CAST(_fd); + fd->error_code = FR_OK; +} + +FRESULT fatfile_open(FatFile *file, const char *file_path, BYTE mode) +{ + DB(file->fd._type = KFT_FATFILE); + file->fd.read = fatfile_read; + file->fd.write = fatfile_write; + file->fd.reopen = 0; + file->fd.close = fatfile_close; + file->fd.seek = fatfile_seek; + file->fd.flush = fatfile_flush; + file->fd.error = fatfile_error; + file->fd.clearerr = fatfile_clearerr; + return f_open(&file->fat_file, file_path, mode); +} + diff --git a/2.5/bertos/fs/fat.h b/2.5/bertos/fs/fat.h new file mode 100644 index 00000000..3e7dc787 --- /dev/null +++ b/2.5/bertos/fs/fat.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief FatFS: kfile interface for FatFS module by ChaN. + * + * This driver needs some low level hardware access functions. An example implementation + * is provided in sd.h. + * + * \version $Id$ + * + * \author Luca Ottaviano + * + * $WIZ$ module_name = "fat" + * $WIZ$ module_configuration = "bertos/cfg/cfg_fat.h" + * $WIZ$ module_depends = "kfile", "ff" + * + */ + +#ifndef FS_FAT_H +#define FS_FAT_H + +#include +#include "fatfs/ff.h" + +typedef struct FatFile +{ + KFile fd; + FIL fat_file; + FRESULT error_code; ///< error code for calls like kfile_read +} FatFile; + +#define KFT_FATFILE MAKE_ID('F', 'A', 'T', 'F') + +INLINE FatFile * FATFILE_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_FATFILE); + return (FatFile *)fd; +} + +/** + * Initialize \a file and open \a file_path for reading. + * + * \a mode is a OR combination of various flags, you can use \a FA_READ for + * read access or \a FA_WRITE for write access. + * The function returns \a FR_OK if success, other values (defined in ff.h) in case + * of failure. + * + * \param file A pointer to a FatFile structure. + * \param file_path The file path on the filesystem. + * \param mode Open mode for the file, which can be OR'ed together + * \sa ff.h for return code meaning and \a mode flags. + */ +FRESULT fatfile_open(FatFile *file, const char *file_path, BYTE mode); + +#endif /* FS_FAT_H */ + diff --git a/2.5/bertos/fs/fat_test.c b/2.5/bertos/fs/fat_test.c new file mode 100644 index 00000000..8de93406 --- /dev/null +++ b/2.5/bertos/fs/fat_test.c @@ -0,0 +1,129 @@ +/** + * \file + * + * + * \brief FatFs test. + * + * \version $Id$ + * \author Luca Ottaviano + * + * $test$: cp bertos/cfg/cfg_fat.h $cfgdir/ + * $test$: echo "#undef CONFIG_FAT_USE_MKFS" >> $cfgdir/cfg_fat.h + * $test$: echo "#define CONFIG_FAT_USE_MKFS 1" >> $cfgdir/cfg_fat.h + * + */ + +#include "fat.h" + +#include "fatfs/ff.h" +#include "fatfs/diskio.h" + +#include + +/* avoid compiler warnings... */ +int fatfile_testSetup(void); +int fatfile_testTearDown(void); +int fatfile_testRun(void); + +static FATFS file_system; + +int fatfile_testSetup(void) +{ + FRESULT err; + err = f_mount(0, &file_system); + ASSERT(err == FR_OK); + + err = f_mkfs(0, 0, 512); + ASSERT(err == FR_OK); + return 0; +} + +int fatfile_testTearDown(void) +{ + FRESULT err; + err = f_mount(0, 0); + ASSERT(err == FR_OK); + return 0; +} + +int fatfile_testRun(void) +{ + FRESULT fat_err; + FatFile file_handler; + const int SIZE = 10; + int write[SIZE], read[SIZE]; + + fat_err = fatfile_open(&file_handler, "foo.txt", FA_WRITE | FA_CREATE_ALWAYS); + ASSERT(fat_err == FR_OK); + + for (int i = 0; i < SIZE; ++i) + { + write[i] = i; + size_t count = kfile_write(&file_handler.fd, &i, sizeof(int)); + ASSERT(count == sizeof(int)); + } + /* test error function */ + int tmp; + if (kfile_read(&file_handler.fd, &tmp, sizeof(int)) < sizeof(int)) + ASSERT(kfile_error(&file_handler.fd) == FR_DENIED); + kfile_clearerr(&file_handler.fd); + ASSERT(file_handler.error_code == FR_OK); + + + int err = 0; + err = kfile_close(&file_handler.fd); + ASSERT(err == 0); + + fat_err = fatfile_open(&file_handler, "foo.txt", FA_READ); + ASSERT(fat_err == FR_OK); + + for (int i = 0; i < SIZE; ++ i) + { + size_t count = kfile_read(&file_handler.fd, &read[i], sizeof(int)); + ASSERT(count == sizeof(int)); + /* check for correctness */ + ASSERT(read[i] == write[i]); + } + /* test kfile_seek() */ + ASSERT(kfile_seek(&file_handler.fd, -(sizeof(int) * SIZE * 2), KSM_SEEK_CUR) == 0); + ASSERT(kfile_seek(&file_handler.fd, sizeof(int), KSM_SEEK_END) == EOF); + + ASSERT(kfile_close(&file_handler.fd) == 0); + + fatfile_open(&file_handler, "foo.txt", FA_READ | FA_WRITE); + ASSERT((size_t)kfile_seek(&file_handler.fd, sizeof(int), KSM_SEEK_END) == sizeof(int) * (SIZE + 1)); + ASSERT(kfile_seek(&file_handler.fd, -SIZE, KSM_SEEK_SET) == 0); + + return 0; +} + + +TEST_MAIN(fatfile); diff --git a/2.5/bertos/fs/fatfs/00readme.txt b/2.5/bertos/fs/fatfs/00readme.txt new file mode 100644 index 00000000..f38a9587 --- /dev/null +++ b/2.5/bertos/fs/fatfs/00readme.txt @@ -0,0 +1,96 @@ +FatFs/Tiny-FatFs Module Source Files R0.07a (C)ChaN, 2009 + + +FILES + + ff.h Common include file for FatFs and application module. + ff.c FatFs module. + diskio.h Common include file for FatFs and disk I/O module. + diskio.c Skeleton of low level disk I/O module. + integer.h Alternative type definitions for integer variables. + option Optional external functions. + + Low level disk I/O module is not included in this archive because the FatFs + module is only a generic file system layer and not depend on any specific + storage device. You have to provide a low level disk I/O module that written + to control your storage device. + + + +AGREEMENTS + + FatFs module is an open source software to implement FAT file system to + small embedded systems. This is a free software and is opened for education, + research and commercial developments under license policy of following trems. + + Copyright (C) 2009, ChaN, all right reserved. + + * The FatFs module is a free software and there is NO WARRANTY. + * No restriction on use. You can use, modify and redistribute it for + personal, non-profit or commercial use UNDER YOUR RESPONSIBILITY. + * Redistributions of source code must retain the above copyright notice. + + + +REVISION HISTORY + + Feb 26, 2006 R0.00 Prototype + + Apr 29, 2006 R0.01 First release. + + Jun 01, 2006 R0.02 Added FAT12. + Removed unbuffered mode. + Fixed a problem on small (<32M) patition. + + Jun 10, 2006 R0.02a Added a configuration option _FS_MINIMUM. + + Sep 22, 2006 R0.03 Added f_rename. + Changed option _FS_MINIMUM to _FS_MINIMIZE. + + Dec 11, 2006 R0.03a Improved cluster scan algolithm to write files fast. + Fixed f_mkdir creates incorrect directory on FAT32. + + Feb 04, 2007 R0.04 Supported multiple drive system. (FatFs) + Changed some APIs for multiple drive system. + Added f_mkfs. (FatFs) + Added _USE_FAT32 option. (Tiny-FatFs) + + Apr 01, 2007 R0.04a Supported multiple partitions on a plysical drive. (FatFs) + Fixed an endian sensitive code in f_mkfs. (FatFs) + Added a capability of extending the file size to f_lseek. + Added minimization level 3. + Fixed a problem that can collapse a sector when recreate an + existing file in any sub-directory at non FAT32 cfg. (Tiny-FatFs) + + May 05, 2007 R0.04b Added _USE_NTFLAG option. + Added FSInfo support. + Fixed some problems corresponds to FAT32. (Tiny-FatFs) + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (0 < ofs <= csize) collapses the file object. + + Aug 25, 2007 R0.05 Changed arguments of f_read, f_write. + Changed arguments of f_mkfs. (FatFs) + Fixed f_mkfs on FAT32 creates incorrect FSInfo. (FatFs) + Fixed f_mkdir on FAT32 creates incorrect directory. (FatFs) + + Feb 03, 2008 R0.05a Added f_truncate(). + Added f_utime(). + Fixed off by one error at FAT sub-type determination. + Fixed btr in f_read() can be mistruncated. + Fixed cached sector is not flushed when create and close without write. + + Apr 01, 2008 R0.06 Added f_forward(). (Tiny-FatFs) + Added string functions: fputc(), fputs(), fprintf() and fgets(). + Improved performance of f_lseek() on move to the same or following cluster. + + Apr 01, 2009, R0.07 Merged Tiny-FatFs as a buffer configuration option. + Added long file name support. + Added multiple code page support. + Added re-entrancy for multitask operation. + Added auto cluster size selection to f_mkfs(). + Added rewind option to f_readdir(). + Changed result code of critical errors. + Renamed string functions to avoid name collision. + + Apr 14, 2009, R0.07a Separated out OS dependent code on reentrant cfg. + Added multiple sector size support. diff --git a/2.5/bertos/fs/fatfs/diskio.c b/2.5/bertos/fs/fatfs/diskio.c new file mode 100644 index 00000000..756a45a9 --- /dev/null +++ b/2.5/bertos/fs/fatfs/diskio.c @@ -0,0 +1,202 @@ +/*-----------------------------------------------------------------------*/ +/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2007 */ +/*-----------------------------------------------------------------------*/ +/* This is a stub disk I/O module that acts as front end of the existing */ +/* disk I/O modules and attach it to FatFs module with common interface. */ +/*-----------------------------------------------------------------------*/ + +#include "diskio.h" + +/*-----------------------------------------------------------------------*/ +/* Correspondence between physical drive number and physical drive. */ + +#define ATA 0 +#define MMC 1 +#define USB 2 + + + +/*-----------------------------------------------------------------------*/ +/* Inidialize a Drive */ + +DSTATUS disk_initialize ( + BYTE drv /* Physical drive nmuber (0..) */ +) +{ + DSTATUS stat; + int result; + + switch (drv) { + case ATA : + result = ATA_disk_initialize(); + // translate the reslut code here + + return stat; + + case MMC : + result = MMC_disk_initialize(); + // translate the reslut code here + + return stat; + + case USB : + result = USB_disk_initialize(); + // translate the reslut code here + + return stat; + } + return STA_NOINIT; +} + + + +/*-----------------------------------------------------------------------*/ +/* Return Disk Status */ + +DSTATUS disk_status ( + BYTE drv /* Physical drive nmuber (0..) */ +) +{ + DSTATUS stat; + int result; + + switch (drv) { + case ATA : + result = ATA_disk_status(); + // translate the reslut code here + + return stat; + + case MMC : + result = MMC_disk_status(); + // translate the reslut code here + + return stat; + + case USB : + result = USB_disk_status(); + // translate the reslut code here + + return stat; + } + return STA_NOINIT; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ + +DRESULT disk_read ( + BYTE drv, /* Physical drive nmuber (0..) */ + BYTE *buff, /* Data buffer to store read data */ + DWORD sector, /* Sector address (LBA) */ + BYTE count /* Number of sectors to read (1..255) */ +) +{ + DRESULT res; + int result; + + switch (drv) { + case ATA : + result = ATA_disk_read(buff, sector, count); + // translate the reslut code here + + return res; + + case MMC : + result = MMC_disk_read(buff, sector, count); + // translate the reslut code here + + return res; + + case USB : + result = USB_disk_read(buff, sector, count); + // translate the reslut code here + + return res; + } + return RES_PARERR; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ + +#if _READONLY == 0 +DRESULT disk_write ( + BYTE drv, /* Physical drive nmuber (0..) */ + const BYTE *buff, /* Data to be written */ + DWORD sector, /* Sector address (LBA) */ + BYTE count /* Number of sectors to write (1..255) */ +) +{ + DRESULT res; + int result; + + switch (drv) { + case ATA : + result = ATA_disk_write(buff, sector, count); + // translate the reslut code here + + return res; + + case MMC : + result = MMC_disk_write(buff, sector, count); + // translate the reslut code here + + return res; + + case USB : + result = USB_disk_write(buff, sector, count); + // translate the reslut code here + + return res; + } + return RES_PARERR; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ + +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive nmuber (0..) */ + BYTE ctrl, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res; + int result; + + switch (drv) { + case ATA : + // pre-process here + + result = ATA_disk_ioctl(ctrl, buff); + // post-process here + + return res; + + case MMC : + // pre-process here + + result = MMC_disk_ioctl(ctrl, buff); + // post-process here + + return res; + + case USB : + // pre-process here + + result = USB_disk_ioctl(ctrl, buff); + // post-process here + + return res; + } + return RES_PARERR; +} + diff --git a/2.5/bertos/fs/fatfs/diskio.h b/2.5/bertos/fs/fatfs/diskio.h new file mode 100644 index 00000000..6fde2dde --- /dev/null +++ b/2.5/bertos/fs/fatfs/diskio.h @@ -0,0 +1,70 @@ +/*----------------------------------------------------------------------- +/ Low level disk interface modlue include file R0.07 (C)ChaN, 2009 +/-----------------------------------------------------------------------*/ + +#ifndef _DISKIO + +#define _READONLY 0 /* 1: Read-only mode */ +#define _USE_IOCTL 1 + +#include "integer.h" + + +/* Status of Disk Functions */ +typedef BYTE DSTATUS; + +/* Results of Disk Functions */ +typedef enum { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ +} DRESULT; + + +/*---------------------------------------*/ +/* Prototypes for disk control functions */ + +BOOL assign_drives (int argc, char *argv[]); +DSTATUS disk_initialize (BYTE); +DSTATUS disk_status (BYTE); +DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE); +#if _READONLY == 0 +DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE); +#endif +DRESULT disk_ioctl (BYTE, BYTE, void*); + + + +/* Disk Status Bits (DSTATUS) */ + +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ + + +/* Command code for disk_ioctrl() */ + +/* Generic command */ +#define CTRL_SYNC 0 /* Mandatory for write functions */ +#define GET_SECTOR_COUNT 1 /* Mandatory for only f_mkfs() */ +#define GET_SECTOR_SIZE 2 +#define GET_BLOCK_SIZE 3 /* Mandatory for only f_mkfs() */ +#define CTRL_POWER 4 +#define CTRL_LOCK 5 +#define CTRL_EJECT 6 +/* MMC/SDC command */ +#define MMC_GET_TYPE 10 +#define MMC_GET_CSD 11 +#define MMC_GET_CID 12 +#define MMC_GET_OCR 13 +#define MMC_GET_SDSTAT 14 +/* ATA/CF command */ +#define ATA_GET_REV 20 +#define ATA_GET_MODEL 21 +#define ATA_GET_SN 22 + + +#define _DISKIO +#endif diff --git a/2.5/bertos/fs/fatfs/ff.c b/2.5/bertos/fs/fatfs/ff.c new file mode 100644 index 00000000..ed16bc02 --- /dev/null +++ b/2.5/bertos/fs/fatfs/ff.c @@ -0,0 +1,2947 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - FAT file system module R0.07a (C)ChaN, 2009 +/-----------------------------------------------------------------------------/ +/ FatFs module is an open source software to implement FAT file system to +/ small embedded systems. This is a free software and is opened for education, +/ research and commercial developments under license policy of following trems. +/ +/ Copyright (C) 2009, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial use UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +//-----------------------------------------------------------------------------/ +/ Feb 26,'06 R0.00 Prototype. +/ +/ Apr 29,'06 R0.01 First stable version. +/ +/ Jun 01,'06 R0.02 Added FAT12 support. +/ Removed unbuffered mode. +/ Fixed a problem on small (<32M) patition. +/ Jun 10,'06 R0.02a Added a configuration option (_FS_MINIMUM). +/ +/ Sep 22,'06 R0.03 Added f_rename(). +/ Changed option _FS_MINIMUM to _FS_MINIMIZE. +/ Dec 11,'06 R0.03a Improved cluster scan algolithm to write files fast. +/ Fixed f_mkdir() creates incorrect directory on FAT32. +/ +/ Feb 04,'07 R0.04 Supported multiple drive system. +/ Changed some interfaces for multiple drive system. +/ Changed f_mountdrv() to f_mount(). +/ Added f_mkfs(). +/ Apr 01,'07 R0.04a Supported multiple partitions on a plysical drive. +/ Added a capability of extending file size to f_lseek(). +/ Added minimization level 3. +/ Fixed an endian sensitive code in f_mkfs(). +/ May 05,'07 R0.04b Added a configuration option _USE_NTFLAG. +/ Added FSInfo support. +/ Fixed DBCS name can result FR_INVALID_NAME. +/ Fixed short seek (<= csize) collapses the file object. +/ +/ Aug 25,'07 R0.05 Changed arguments of f_read(), f_write() and f_mkfs(). +/ Fixed f_mkfs() on FAT32 creates incorrect FSInfo. +/ Fixed f_mkdir() on FAT32 creates incorrect directory. +/ Feb 03,'08 R0.05a Added f_truncate() and f_utime(). +/ Fixed off by one error at FAT sub-type determination. +/ Fixed btr in f_read() can be mistruncated. +/ Fixed cached sector is not flushed when create and close +/ without write. +/ +/ Apr 01,'08 R0.06 Added fputc(), fputs(), fprintf() and fgets(). +/ Improved performance of f_lseek() on moving to the same +/ or following cluster. +/ +/ Apr 01,'09 R0.07 Merged Tiny-FatFs as a buffer configuration option. +/ Added long file name support. +/ Added multiple code page support. +/ Added re-entrancy for multitask operation. +/ Added auto cluster size selection to f_mkfs(). +/ Added rewind option to f_readdir(). +/ Changed result code of critical errors. +/ Renamed string functions to avoid name collision. +/ Apr 14,'09 R0.07a Separated out OS dependent code on reentrant cfg. +/ Added multiple sector size support. +/---------------------------------------------------------------------------*/ + +#include "ff.h" /* FatFs configurations and declarations */ +#include "diskio.h" /* Declarations of low level disk I/O functions */ + + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if _FS_REENTRANT +#if _USE_LFN == 1 +#error Static LFN work area must not be used in re-entrant configuration. +#endif +#define ENTER_FF(fs) { if (!lock_fs(fs)) return FR_TIMEOUT; } +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } + +#else +#define ENTER_FF(fs) +#define LEAVE_FF(fs, res) return res + +#endif + +#define ABORT(fs, res) { fp->flag |= FA__ERROR; LEAVE_FF(fs, res); } + +#ifndef NULL +#define NULL 0 +#endif + + +/*-------------------------------------------------------------------------- + + Private Work Area + +---------------------------------------------------------------------------*/ + +static +FATFS *FatFs[_DRIVES]; /* Pointer to the file system objects (logical drives) */ +static +WORD Fsid; /* File system mount ID */ + + +#if _USE_LFN == 1 /* LFN with static LFN working buffer */ +static +WORD LfnBuf[_MAX_LFN + 1]; +#define NAMEBUF(sp,lp) BYTE sp[12]; WCHAR *lp = LfnBuf +#define INITBUF(dj,sp,lp) dj.fn = sp; dj.lfn = lp + +#elif _USE_LFN > 1 /* LFN with dynamic LFN working buffer */ +#define NAMEBUF(sp,lp) BYTE sp[12]; WCHAR lbuf[_MAX_LFN + 1], *lp = lbuf +#define INITBUF(dj,sp,lp) dj.fn = sp; dj.lfn = lp + +#else /* No LFN */ +#define NAMEBUF(sp,lp) BYTE sp[12] +#define INITBUF(dj,sp,lp) dj.fn = sp + +#endif + + + + +/*-------------------------------------------------------------------------- + + Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static +void mem_cpy (void* dst, const void* src, int cnt) { + char *d = (char*)dst; + const char *s = (const char *)src; + while (cnt--) *d++ = *s++; +} + +/* Fill memory */ +static +void mem_set (void* dst, int val, int cnt) { + char *d = (char*)dst; + while (cnt--) *d++ = (char)val; +} + +/* Compare memory to memory */ +static +int mem_cmp (const void* dst, const void* src, int cnt) { + const char *d = (const char *)dst, *s = (const char *)src; + int r = 0; + while (cnt-- && (r = *d++ - *s++) == 0) ; + return r; +} + +/* Check if chr is contained in the string */ +static +int chk_chr (const char* str, int chr) { + while (*str && *str != chr) str++; + return *str; +} + + + +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +#if _FS_REENTRANT + +static +BOOL lock_fs ( + FATFS *fs /* File system object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static +void unlock_fs ( + FATFS *fs, /* File system object */ + FRESULT res /* Result code to be returned */ +) +{ + if (res != FR_NOT_ENABLED && + res != FR_INVALID_DRIVE && + res != FR_INVALID_OBJECT && + res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Change window offset */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT move_window ( + FATFS *fs, /* File system object */ + DWORD sector /* Sector number to make apperance in the fs->win[] */ +) /* Move to zero only writes back dirty window */ +{ + DWORD wsect; + + + wsect = fs->winsect; + if (wsect != sector) { /* Changed current window */ +#if !_FS_READONLY + if (fs->wflag) { /* Write back dirty window if needed */ + if (disk_write(fs->drive, fs->win, wsect, 1) != RES_OK) + return FR_DISK_ERR; + fs->wflag = 0; + if (wsect < (fs->fatbase + fs->sects_fat)) { /* In FAT area */ + BYTE nf; + for (nf = fs->n_fats; nf >= 2; nf--) { /* Refrect the change to FAT copy */ + wsect += fs->sects_fat; + disk_write(fs->drive, fs->win, wsect, 1); + } + } + } +#endif + if (sector) { + if (disk_read(fs->drive, fs->win, sector, 1) != RES_OK) + return FR_DISK_ERR; + fs->winsect = sector; + } + } + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Clean-up cached data */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT sync ( /* FR_OK: successful, FR_DISK_ERR: failed */ + FATFS *fs /* File system object */ +) +{ + FRESULT res; + + + res = move_window(fs, 0); + if (res == FR_OK) { + /* Update FSInfo sector if needed */ + if (fs->fs_type == FS_FAT32 && fs->fsi_flag) { + fs->winsect = 0; + mem_set(fs->win, 0, 512); + ST_WORD(fs->win+BS_55AA, 0xAA55); + ST_DWORD(fs->win+FSI_LeadSig, 0x41615252); + ST_DWORD(fs->win+FSI_StrucSig, 0x61417272); + ST_DWORD(fs->win+FSI_Free_Count, fs->free_clust); + ST_DWORD(fs->win+FSI_Nxt_Free, fs->last_clust); + disk_write(fs->drive, fs->win, fs->fsi_sector, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the physical drive */ + if (disk_ioctl(fs->drive, CTRL_SYNC, (void*)NULL) != RES_OK) + res = FR_DISK_ERR; + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Get a cluster status */ +/*-----------------------------------------------------------------------*/ + +static +DWORD get_cluster ( /* 0xFFFFFFFF:Disk error, 1:Interal error, Else:Cluster status */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to get the link information */ +) +{ + WORD wc, bc; + DWORD fsect; + + + if (clst < 2 || clst >= fs->max_clust) /* Check cluster address range */ + return 1; + + fsect = fs->fatbase; + switch (fs->fs_type) { + case FS_FAT12 : + bc = (WORD)clst * 3 / 2; + if (move_window(fs, fsect + (bc / SS(fs)))) break; + wc = fs->win[bc & (SS(fs) - 1)]; bc++; + if (move_window(fs, fsect + (bc / SS(fs)))) break; + wc |= (WORD)fs->win[bc & (SS(fs) - 1)] << 8; + return (clst & 1) ? (wc >> 4) : (wc & 0xFFF); + + case FS_FAT16 : + if (move_window(fs, fsect + (clst / (SS(fs) / 2)))) break; + return LD_WORD(&fs->win[((WORD)clst * 2) & (SS(fs) - 1)]); + + case FS_FAT32 : + if (move_window(fs, fsect + (clst / (SS(fs) / 4)))) break; + return LD_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)]) & 0x0FFFFFFF; + } + + return 0xFFFFFFFF; /* An error occured at the disk I/O layer */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change a cluster status */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT put_cluster ( + FATFS *fs, /* File system object */ + DWORD clst, /* Cluster# to be changed (must be 2 to fs->max_clust-1) */ + DWORD val /* New value to mark the cluster */ +) +{ + WORD bc; + BYTE *p; + DWORD fsect; + FRESULT res; + + + if (clst < 2 || clst >= fs->max_clust) { /* Check cluster address range */ + res = FR_INT_ERR; + + } else { + fsect = fs->fatbase; + switch (fs->fs_type) { + case FS_FAT12 : + bc = (WORD)clst * 3 / 2; + res = move_window(fs, fsect + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc & (SS(fs) - 1)]; + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; + bc++; + fs->wflag = 1; + res = move_window(fs, fsect + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc & (SS(fs) - 1)]; + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); + break; + + case FS_FAT16 : + res = move_window(fs, fsect + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + ST_WORD(&fs->win[((WORD)clst * 2) & (SS(fs) - 1)], (WORD)val); + break; + + case FS_FAT32 : + res = move_window(fs, fsect + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + ST_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)], val); + break; + + default : + res = FR_INT_ERR; + } + fs->wflag = 1; + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT remove_chain ( + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to remove chain from */ +) +{ + FRESULT res; + DWORD nxt; + + + if (clst < 2 || clst >= fs->max_clust) { /* Check cluster address range */ + res = FR_INT_ERR; + + } else { + res = FR_OK; + while (clst < fs->max_clust) { /* Not a last link? */ + nxt = get_cluster(fs, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) { res = FR_INT_ERR; break; } /* Internal error? */ + if (nxt == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } /* Disk error? */ + res = put_cluster(fs, clst, 0); /* Mark the cluster "empty" */ + if (res != FR_OK) break; + if (fs->free_clust != 0xFFFFFFFF) { /* Update FSInfo */ + fs->free_clust++; + fs->fsi_flag = 1; + } + clst = nxt; /* Next cluster */ + } + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Stretch or create a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to stretch. 0 means create a new chain. */ +) +{ + DWORD cs, ncl, scl, mcl; + + + mcl = fs->max_clust; + if (clst == 0) { /* Create new chain */ + scl = fs->last_clust; /* Get suggested start point */ + if (scl == 0 || scl >= mcl) scl = 1; + } + else { /* Stretch existing chain */ + cs = get_cluster(fs, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* It is an invalid cluster */ + if (cs < mcl) return cs; /* It is already followed by next cluster */ + scl = clst; + } + + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= mcl) { /* Wrap around */ + ncl = 2; + if (ncl > scl) return 0; /* No free custer */ + } + cs = get_cluster(fs, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster */ + if (cs == 0xFFFFFFFF || cs == 1)/* An error occured */ + return cs; + if (ncl == scl) return 0; /* No free custer */ + } + + if (put_cluster(fs, ncl, 0x0FFFFFFF)) /* Mark the new cluster "in use" */ + return 0xFFFFFFFF; + if (clst != 0) { /* Link it to previous one if needed */ + if (put_cluster(fs, clst, ncl)) + return 0xFFFFFFFF; + } + + fs->last_clust = ncl; /* Update FSINFO */ + if (fs->free_clust != 0xFFFFFFFF) { + fs->free_clust--; + fs->fsi_flag = 1; + } + + return ncl; /* Return new cluster number */ +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Get sector# from cluster# */ +/*-----------------------------------------------------------------------*/ + +static +DWORD clust2sect ( /* !=0: sector number, 0: failed - invalid cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; + if (clst >= (fs->max_clust - 2)) return 0; /* Invalid cluster# */ + return clst * fs->csize + fs->database; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Seek directory index */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_seek ( + DIR *dj, /* Pointer to directory object */ + WORD idx /* Directory index number */ +) +{ + DWORD clst; + WORD ic; + + + dj->index = idx; + clst = dj->sclust; + if (clst == 1 || clst >= dj->fs->max_clust) /* Check start cluster range */ + return FR_INT_ERR; + + if (clst == 0) { /* Static table */ + if (idx >= dj->fs->n_rootdir) /* Index is out of range */ + return FR_INT_ERR; + dj->sect = dj->fs->dirbase + idx / (SS(dj->fs) / 32); + } + else { /* Dynamic table */ + ic = SS(dj->fs) / 32 * dj->fs->csize; /* Indexes per cluster */ + while (idx >= ic) { /* Follow cluster chain */ + clst = get_cluster(dj->fs, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= dj->fs->max_clust) /* Reached to end of table or int error */ + return FR_INT_ERR; + idx -= ic; + } + dj->clust = clst; + dj->sect = clust2sect(dj->fs, clst) + idx / (SS(dj->fs) / 32); + } + dj->dir = dj->fs->win + (idx % (SS(dj->fs) / 32)) * 32; + + return FR_OK; /* Seek succeeded */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Move directory index next */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:EOT and could not streach */ + DIR *dj, /* Pointer to directory object */ + BOOL streach /* FALSE: Do not streach table, TRUE: Streach table if needed */ +) +{ + DWORD clst; + WORD i; + + + i = dj->index + 1; + if (!i || !dj->sect) /* Report EOT when index has reached 65535 */ + return FR_NO_FILE; + + if (!(i % (SS(dj->fs) / 32))) { /* Sector changed? */ + dj->sect++; /* Next sector */ + + if (dj->sclust == 0) { /* Static table */ + if (i >= dj->fs->n_rootdir) /* Report EOT when end of table */ + return FR_NO_FILE; + } + else { /* Dynamic table */ + if (((i / (SS(dj->fs) / 32)) & (dj->fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_cluster(dj->fs, dj->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; + if (clst >= dj->fs->max_clust) { /* When it reached end of dinamic table */ +#if !_FS_READONLY + BYTE c; + if (!streach) return FR_NO_FILE; /* When do not streach, report EOT */ + clst = create_chain(dj->fs, dj->clust); /* Streach cluster chain */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; + /* Clean-up streached table */ + if (move_window(dj->fs, 0)) return FR_DISK_ERR; /* Flush active window */ + mem_set(dj->fs->win, 0, SS(dj->fs)); /* Clear window buffer */ + dj->fs->winsect = clust2sect(dj->fs, clst); /* Cluster start sector */ + for (c = 0; c < dj->fs->csize; c++) { /* Fill the new cluster with 0 */ + dj->fs->wflag = 1; + if (move_window(dj->fs, 0)) return FR_DISK_ERR; + dj->fs->winsect++; + } + dj->fs->winsect -= c; /* Rewind window address */ +#else + return FR_NO_FILE; /* Report EOT */ +#endif + } + dj->clust = clst; /* Initialize data for new cluster */ + dj->sect = clust2sect(dj->fs, clst); + } + } + } + + dj->index = i; + dj->dir = dj->fs->win + (i % (SS(dj->fs) / 32)) * 32; + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Test/Pick/Fit an LFN segment from/to directory entry */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static +const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* Offset of LFN chars in the directory entry */ + + +static +BOOL test_lfn ( /* TRUE:Matched, FALSE:Not matched */ + WCHAR *lfnbuf, /* Pointer to the LFN to be compared */ + BYTE *dir /* Pointer to the directory entry containing a part of LFN */ +) +{ + int i, s; + WCHAR wc1, wc2; + + + i = ((dir[LDIR_Ord] & 0xBF) - 1) * 13; /* Offset in the LFN buffer */ + s = 0; + do { + if (i >= _MAX_LFN) return FALSE; /* Out of buffer range? */ + wc1 = LD_WORD(dir+LfnOfs[s]); /* Get both characters to compare */ + wc2 = lfnbuf[i++]; + if (IsLower(wc1)) wc1 -= 0x20; /* Compare it (ignore case) */ + if (IsLower(wc2)) wc2 -= 0x20; + if (wc1 != wc2) return FALSE; + } while (++s < 13 && wc1); /* Repeat until last char or a NUL char is processed */ + + return TRUE; /* The LFN entry matched */ +} + + + +static +BOOL pick_lfn ( /* TRUE:Succeeded, FALSE:Buffer overflow */ + WCHAR *lfnbuf, /* Pointer to the Unicode-LFN buffer */ + BYTE *dir /* Pointer to the directory entry */ +) +{ + int i, s; + WCHAR wchr; + + + i = ((dir[LDIR_Ord] & 0xBF) - 1) * 13; /* Offset in the LFN buffer */ + s = 0; + do { + wchr = LD_WORD(dir+LfnOfs[s]); /* Get an LFN char */ + if (!wchr) break; /* End of LFN? */ + if (i >= _MAX_LFN) return FALSE; /* Buffer overflow */ + lfnbuf[i++] = wchr; /* Store it */ + } while (++s < 13); /* Repeat until last char is copied */ + if (dir[LDIR_Ord] & 0x40) lfnbuf[i] = 0; /* Put terminator if last LFN entry */ + + return TRUE; +} + + +#if !_FS_READONLY +static +void fit_lfn ( + const WCHAR *lfnbuf, /* Pointer to the LFN buffer */ + BYTE *dir, /* Pointer to the directory entry */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* SFN sum */ +) +{ + int i, s; + WCHAR wchr; + + + dir[LDIR_Chksum] = sum; /* Set check sum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + ST_WORD(dir+LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Offset in the LFN buffer */ + s = wchr = 0; + do { + if (wchr != 0xFFFF) wchr = lfnbuf[i++]; /* Get an effective char */ + ST_WORD(dir+LfnOfs[s], wchr); /* Put it */ + if (!wchr) wchr = 0xFFFF; /* Padding chars following last char */ + } while (++s < 13); + if (wchr == 0xFFFF || !lfnbuf[i]) ord |= 0x40;/* Bottom LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Create numbered name */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +void gen_numname ( + BYTE *dst, /* Pointer to genartated SFN */ + const BYTE *src, /* Pointer to source SFN to be modified */ + const WCHAR *lfn, /* Pointer to LFN */ + WORD num /* Sequense number */ +) +{ + char ns[8]; + int i, j; + + + mem_cpy(dst, src, 11); + + if (num > 5) { /* On many collisions, generate a hash number instead of sequencial number */ + do num = (num >> 1) + (num << 15) + (WORD)*lfn++; while (*lfn); + } + + /* itoa */ + i = 7; + do { + ns[i--] = (num % 10) + '0'; + num /= 10; + } while (num); + ns[i] = '~'; + + /* Append the number */ + for (j = 0; j < i && dst[j] != ' '; j++) { + if (IsDBCS1(dst[j])) { + if (j == i - 1) break; + j++; + } + } + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Calculate sum of an SFN */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static +BYTE sum_sfn ( + const BYTE *dir /* Ptr to directory entry */ +) +{ + BYTE sum = 0; + int n = 11; + + do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n); + return sum; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_find ( + DIR *dj /* Pointer to the directory object linked to the file name */ +) +{ + FRESULT res; + BYTE a, c, lfen, ord, sum, *dir; + + + res = dir_seek(dj, 0); /* Rewind directory object */ + if (res != FR_OK) return res; + + ord = sum = 0xFF; lfen = *(dj->fn+11) & 1; + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ + a = dir[DIR_Attr] & AM_MASK; +#if _USE_LFN /* LFN configuration */ + if (c == 0xE5 || c == '.' || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (dj->lfn) { + if (c & 0x40) { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= 0xBF; ord = c; /* LFN start order */ + dj->lfn_idx = dj->index; + } + /* Check LFN validity. Compare LFN if it is out of 8.3 format */ + ord = (c == ord && sum == dir[LDIR_Chksum] && (!lfen || test_lfn(dj->lfn, dir))) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (ord || sum != sum_sfn(dir)) { /* Did not LFN match? */ + dj->lfn_idx = 0xFFFF; + ord = 0xFF; + } + if (lfen) { /* Match LFN if it is out of 8.3 format */ + if (ord == 0) break; + } else { /* Match SFN if LFN is in 8.3 format */ + if (!mem_cmp(dir, dj->fn, 11)) break; + } + } + } +#else /* Non LFN configuration */ + if (c != 0xE5 && c != '.' && !(a & AM_VOL) && !mem_cmp(dir, dj->fn, 11)) /* Is it a valid entry? */ + break; +#endif + res = dir_next(dj, FALSE); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 2 +static +FRESULT dir_read ( + DIR *dj /* Pointer to the directory object to store read object name */ +) +{ + FRESULT res; + BYTE a, c, ord, sum, *dir; + + + ord = sum = 0xFF; + res = FR_NO_FILE; + while (dj->sect) { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ + a = dir[DIR_Attr] & AM_MASK; +#if _USE_LFN /* LFN configuration */ + if (c == 0xE5 || c == '.' || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (c & 0x40) { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= 0xBF; ord = c; + dj->lfn_idx = dj->index; + } + /* Check LFN validity and capture it */ + ord = (c == ord && sum == dir[LDIR_Chksum] && pick_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord || sum != sum_sfn(dir)) /* Is there a valid LFN entry? */ + dj->lfn_idx = 0xFFFF; /* No LFN. */ + break; + } + } +#else /* Non LFN configuration */ + if (c != 0xE5 && c != '.' && !(a & AM_VOL)) /* Is it a valid entry? */ + break; +#endif + res = dir_next(dj, FALSE); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dj->sect = 0; + + return res; +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many SFN collision, FR_DISK_ERR:Disk error */ + DIR *dj /* Target directory with object name to be created */ +) +{ + FRESULT res; + BYTE c, *dir; + +#if _USE_LFN /* LFN configuration */ + WORD n, ne, is; + BYTE sn[12], *fn, sum; + WCHAR *lfn; + + fn = dj->fn; lfn = dj->lfn; + mem_cpy(sn, fn, 12); + if (sn[11] & 1) { /* When LFN is out of 8.3 format, generate a numbered name */ + fn[11] = 0; dj->lfn = NULL; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(fn, sn, lfn, n); /* Generate a numbered name */ + res = dir_find(dj); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + fn[11] = sn[11]; dj->lfn = lfn; + } + if (sn[11] & 2) { /* When eliminate LFN, reserve only an SFN entry. */ + ne = 1; + } else { /* Otherwise reserve an SFN + LFN entries. */ + for (ne = 0; lfn[ne]; ne++) ; + ne = (ne + 25) / 13; + } + + /* Reserve contiguous entries */ + res = dir_seek(dj, 0); + if (res != FR_OK) return res; + n = is = 0; + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + c = *dj->dir; /* Check the entry status */ + if (c == 0xE5 || c == 0) { /* Is it a blank entry? */ + if (n == 0) is = dj->index; /* First index of the contigulus entry */ + if (++n == ne) break; /* A contiguous entry that requiered count is found */ + } else { + n = 0; /* Not a blank entry. Restart to search */ + } + res = dir_next(dj, TRUE); /* Next entry with table streach */ + } while (res == FR_OK); + + if (res == FR_OK && ne > 1) { /* Initialize LFN entry if needed */ + res = dir_seek(dj, is); + if (res == FR_OK) { + sum = sum_sfn(dj->fn); /* Sum of the SFN tied to the LFN */ + ne--; + do { /* Store LFN entries in bottom first */ + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + fit_lfn(dj->lfn, dj->dir, (BYTE)ne, sum); + dj->fs->wflag = 1; + res = dir_next(dj, FALSE); /* Next entry */ + } while (res == FR_OK && --ne); + } + } + +#else /* Non LFN configuration */ + res = dir_seek(dj, 0); + if (res == FR_OK) { + do { /* Find a blank entry for the SFN */ + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + c = *dj->dir; + if (c == 0xE5 || c == 0) break; /* Is it a blank entry? */ + res = dir_next(dj, TRUE); /* Next entry with table streach */ + } while (res == FR_OK); + } +#endif + + if (res == FR_OK) { /* Initialize the SFN entry */ + res = move_window(dj->fs, dj->sect); + if (res == FR_OK) { + dir = dj->dir; + mem_set(dir, 0, 32); /* Clean the entry */ + mem_cpy(dir, dj->fn, 11); /* Put SFN */ + dir[DIR_NTres] = *(dj->fn+11) & 0x18; /* Put NT flag */ + dj->fs->wflag = 1; + } + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY && !_FS_MINIMIZE +static +FRESULT dir_remove ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ + DIR *dj /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; + +#if _USE_LFN /* LFN configuration */ + WORD i; + + i = dj->index; /* SFN index */ + res = dir_seek(dj, (WORD)((dj->lfn_idx == 0xFFFF) ? i : dj->lfn_idx)); /* Goto the SFN or top of the LFN entries */ + if (res == FR_OK) { + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + *dj->dir = 0xE5; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + if (dj->index >= i) break; /* When SFN is deleted, all entries of the object is deleted. */ + res = dir_next(dj, FALSE); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } + +#else /* Non LFN configuration */ + res = dir_seek(dj, dj->index); + if (res == FR_OK) { + res = move_window(dj->fs, dj->sect); + if (res == FR_OK) { + *dj->dir = 0xE5; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + } + } +#endif + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Pick a segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT create_name ( + DIR *dj, /* Pointer to the directory object */ + const char **path /* Pointer to pointer to the segment in the path string */ +) +{ +#if _USE_LFN + BYTE c, b, cf, *sfn; + WCHAR w, *lfn; + int i, ni, si, di; + const char *p; + + /* Create LFN in Unicode */ + si = di = 0; + p = *path; + lfn = dj->lfn; + for (;;) { + w = (BYTE)p[si++]; /* Get a character */ + if (w < ' ' || w == '/' || w == '\\') break; /* Break on end of segment */ + if (IsDBCS1(w)) { /* If it is DBC 1st byte */ + c = p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(c)) /* Reject invalid DBC */ + return FR_INVALID_NAME; + w = (w << 8) + c; + } else { + if (chk_chr("\"*:<>\?|\x7F", w)) /* Reject unallowable chars for LFN */ + return FR_INVALID_NAME; + } + w = ff_convert(w, 1); /* Convert OEM to Unicode, store it */ + if (!w || di >= _MAX_LFN) /* Reject invalid code or too long name */ + return FR_INVALID_NAME; + lfn[di++] = w; + } + *path = &p[si]; /* Rerurn pointer to the next segment */ + cf = (w < ' ') ? 4 : 0; /* Set last segment flag if end of path */ + + while (di) { /* Strip trailing spaces and dots */ + w = lfn[di - 1]; + if (w != ' ' && w != '.') break; + di--; + } + if (!di) return FR_INVALID_NAME; /* Reject null string */ + + lfn[di] = 0; /* LFN is created */ + + /* Create SFN in directory form */ + sfn = dj->fn; + mem_set(sfn, ' ', 11); + for (si = 0; lfn[si] == ' ' || lfn[si] == '.'; si++) ; /* Strip leading spaces and dots */ + if (si) cf |= 1; + while (di && lfn[di - 1] != '.') di--; /* Find extension (di<=si: no extension) */ + + b = i = 0; ni = 8; + for (;;) { + w = lfn[si++]; /* Get an LFN char */ + if (w == 0) break; /* Break when enf of the LFN */ + if (w == ' ' || (w == '.' && si != di)) { /* Remove spaces and dots */ + cf |= 1; continue; + } + if (i >= ni || si == di) { /* Here is extension or end of SFN */ + if (ni == 11) { /* Extension is longer than 3 bytes */ + cf |= 1; break; + } + if (si != di) cf |= 1; /* File name is longer than 8 bytes */ + if (si > di) break; /* No extension */ + si = di; i = 8; ni = 11; /* Enter extension section */ + b <<= 2; continue; + } + w = ff_convert(w, 0); /* Unicode -> OEM code */ + if (w >= 0x80) cf |= 0x20; /* If there is any extended char, force create an LFN */ + if (w >= 0x100) { /* Double byte char */ + if (i >= ni - 1) { + cf |= 1; i = ni; continue; + } + sfn[i++] = (BYTE)(w >> 8); + } else { /* Single byte char */ + if (chk_chr("+,;[=]", w)) { /* Replace unallowable chars for SFN */ + w = '_'; cf |= 1; + } else { + if (IsUpper(w)) { /* Large capital */ + b |= 2; + } else { + if (IsLower(w)) { /* Small capital */ + b |= 1; w -= 0x20; + } + } + } + } + sfn[i++] = (BYTE)w; + } + if (sfn[0] == 0xE5) sfn[0] = 0x05; /* When first char collides with 0xE5, replace it with 0x05 */ + + if (ni == 8) b <<= 2; + if ((cf & 0x21) == 0) { /* When LFN is in 8.3 format without extended char, NT flags are created */ + if ((b & 0x03) == 0x01) cf |= 0x10; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) cf |= 0x08; /* NT flag (Filename has only small capital) */ + if ((b & 0x0C) != 0x0C && (b & 0x03) != 0x03) cf |= 2; /* Eliminate LFN when non composite capitals */ + } + + sfn[11] = cf; /* SFN is created */ + +#else + BYTE c, d, b, *sfn; + int ni, si, i; + const char *p; + + /* Create file name in directory form */ + sfn = dj->fn; + mem_set(sfn, ' ', 11); + si = i = b = 0; ni = 8; + p = *path; + for (;;) { + c = p[si++]; + if (c < ' ' || c == '/' || c == '\\') break; /* Break on end of segment */ + if (c == '.' || i >= ni) { + if (ni != 8 || c != '.') return FR_INVALID_NAME; + i = 8; ni = 11; + b <<= 2; continue; + } + if (c >= 0x80) b |= 3; /* If there is any extended char, eliminate NT flag */ + if (IsDBCS1(c)) { /* If it is DBC 1st byte */ + d = p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(d) || i >= ni - 1) /* Reject invalid DBC */ + return FR_INVALID_NAME; + sfn[i++] = c; + sfn[i++] = d; + } else { + if (chk_chr(" +,;[=]\"*:<>\?|\x7F", c)) /* Reject unallowable chrs for SFN */ + return FR_INVALID_NAME; + if (IsUpper(c)) { + b |= 2; + } else { + if (IsLower(c)) { + b |= 1; c -= 0x20; + } + } + sfn[i++] = c; + } + } + *path = &p[si]; /* Rerurn pointer to the next segment */ + c = (c < ' ') ? 4 : 0; /* Set last segment flag if end of path */ + + if (!i) return FR_INVALID_NAME; /* Reject null string */ + if (sfn[0] == 0xE5) sfn[0] = 0x05; /* When first char collides with 0xE5, replace it with 0x05 */ + + if (ni == 8) b <<= 2; + if ((b & 0x03) == 0x01) c |= 0x10; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) c |= 0x08; /* NT flag (Filename has only small capital) */ + + sfn[11] = c; /* Store NT flag, File name is created */ +#endif + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 +static +void get_fileinfo ( /* No return code */ + DIR *dj, /* Pointer to the directory object */ + FILINFO *fno /* Pointer to store the file information */ +) +{ + int i; + BYTE c, nt, *dir; + char *p; + + + p = fno->fname; + if (dj->sect) { + dir = dj->dir; + nt = dir[DIR_NTres]; /* NT flag */ + for (i = 0; i < 8; i++) { /* Copy file name body */ + c = dir[i]; + if (c == ' ') break; + if (c == 0x05) c = 0xE5; + if ((nt & 0x08) && IsUpper(c)) c += 0x20; + *p++ = c; + } + if (dir[8] != ' ') { /* Copy file name extension */ + *p++ = '.'; + for (i = 8; i < 11; i++) { + c = dir[i]; + if (c == ' ') break; + if ((nt & 0x10) && IsUpper(c)) c += 0x20; + *p++ = c; + } + } + fno->fattrib = dir[DIR_Attr]; /* Attribute */ + fno->fsize = LD_DWORD(dir+DIR_FileSize); /* Size */ + fno->fdate = LD_WORD(dir+DIR_WrtDate); /* Date */ + fno->ftime = LD_WORD(dir+DIR_WrtTime); /* Time */ + } + *p = 0; + +#if _USE_LFN + p = fno->lfname; + if (p) { + WCHAR wchr, *lfn; + + i = 0; + if (dj->sect && dj->lfn_idx != 0xFFFF) {/* Get LFN if available */ + lfn = dj->lfn; + while ((wchr = *lfn++) != 0) { /* Get an LFN char */ + wchr = ff_convert(wchr, 0); /* Unicode -> OEM code */ + if (!wchr) { i = 0; break; } /* Conversion error, no LFN */ + if (_DF1S && wchr >= 0x100) /* Put 1st byte if it is a DBC */ + p[i++] = (char)(wchr >> 8); + p[i++] = (char)wchr; + if (i >= fno->lfsize) { i = 0; break; } /* Buffer overrun, no LFN */ + } + } + p[i] = 0; /* Terminator */ + } +#endif +} +#endif /* _FS_MINIMIZE <= 1 */ + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR *dj, /* Directory object to return last directory and found object */ + const char *path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE *dir, last; + + + if (*path == '/' || *path == '\\' ) path++; /* Strip heading separator */ + + dj->sclust = /* Set start directory (root dir) */ + (dj->fs->fs_type == FS_FAT32) ? dj->fs->dirbase : 0; + + if ((BYTE)*path < ' ') { /* Null path means the root directory */ + res = dir_seek(dj, 0); + dj->dir = NULL; + + } else { /* Follow path */ + for (;;) { + res = create_name(dj, &path); /* Get a segment */ + if (res != FR_OK) break; + res = dir_find(dj); /* Find it */ + last = *(dj->fn+11) & 4; + if (res != FR_OK) { /* Could not find the object */ + if (res == FR_NO_FILE && !last) + res = FR_NO_PATH; + break; + } + if (last) break; /* Last segment match. Function completed. */ + dir = dj->dir; /* There is next segment. Follow the sub directory */ + if (!(dir[DIR_Attr] & AM_DIR)) { /* Cannot follow because it is a file */ + res = FR_NO_PATH; break; + } + dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load boot record and check if it is an FAT boot record */ +/*-----------------------------------------------------------------------*/ + +static +BYTE check_fs ( /* 0:The FAT boot record, 1:Valid boot record but not an FAT, 2:Not a boot record, 3:Error */ + FATFS *fs, /* File system object */ + DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */ +) +{ + if (disk_read(fs->drive, fs->win, sect, 1) != RES_OK) /* Load boot record */ + return 3; + if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55) /* Check record signature (always placed at offset 510 even if the sector size is >512) */ + return 2; + + if (!mem_cmp(&fs->win[BS_FilSysType], "FAT", 3)) /* Check FAT signature */ + return 0; + if (!mem_cmp(&fs->win[BS_FilSysType32], "FAT32", 5) && !(fs->win[BPB_ExtFlags] & 0x80)) + return 0; + + return 1; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Make sure that the file system is valid */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT auto_mount ( /* FR_OK(0): successful, !=0: any error occured */ + const char **path, /* Pointer to pointer to the path name (drive number) */ + FATFS **rfs, /* Pointer to pointer to the found file system object */ + BYTE chk_wp /* !=0: Check media write protection for write access */ +) +{ + FRESULT res; + BYTE vol, fmt, *tbl; + DSTATUS stat; + DWORD bsect, fsize, tsect, mclst; + const char *p = *path; + FATFS *fs; + + + /* Get logical drive number from the path name */ + vol = p[0] - '0'; /* Is there a drive number? */ + if (vol <= 9 && p[1] == ':') { + p += 2; /* Found a drive number, get and strip it */ + *path = p; /* Return pointer to the path name */ + } else { + vol = 0; /* No drive number is given, use drive number 0 as default */ + } + + /* Check if the logical drive number is valid or not */ + if (vol >= _DRIVES) return FR_INVALID_DRIVE; /* Is the drive number valid? */ + *rfs = fs = FatFs[vol]; /* Returen pointer to the corresponding file system object */ + if (!fs) return FR_NOT_ENABLED; /* Is the file system object registered? */ + + ENTER_FF(fs); /* Lock file system */ + + if (fs->fs_type) { /* If the logical drive has been mounted */ + stat = disk_status(fs->drive); + if (!(stat & STA_NOINIT)) { /* and physical drive is kept initialized (has not been changed), */ +#if !_FS_READONLY + if (chk_wp && (stat & STA_PROTECT)) /* Check write protection if needed */ + return FR_WRITE_PROTECTED; +#endif + return FR_OK; /* The file system object is valid */ + } + } + + /* The logical drive must be re-mounted. Following code attempts to mount the volume */ + + fs->fs_type = 0; /* Clear the file system object */ + fs->drive = LD2PD(vol); /* Bind the logical drive and a physical drive */ + stat = disk_initialize(fs->drive); /* Initialize low level disk I/O layer */ + if (stat & STA_NOINIT) /* Check if the drive is ready */ + return FR_NOT_READY; +#if _MAX_SS != 512 /* Get disk sector size if needed */ + if (disk_ioctl(fs->drive, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS) + return FR_NO_FILESYSTEM; +#endif +#if !_FS_READONLY + if (chk_wp && (stat & STA_PROTECT)) /* Check write protection if needed */ + return FR_WRITE_PROTECTED; +#endif + /* Search FAT partition on the drive */ + fmt = check_fs(fs, bsect = 0); /* Check sector 0 as an SFD format */ + if (fmt == 1) { /* Not an FAT boot record, it may be patitioned */ + /* Check a partition listed in top of the partition table */ + tbl = &fs->win[MBR_Table + LD2PT(vol) * 16]; /* Partition table */ + if (tbl[4]) { /* Is the partition existing? */ + bsect = LD_DWORD(&tbl[8]); /* Partition offset in LBA */ + fmt = check_fs(fs, bsect); /* Check the partition */ + } + } + if (fmt == 3) return FR_DISK_ERR; + if (fmt || LD_WORD(fs->win+BPB_BytsPerSec) != SS(fs)) /* No valid FAT patition is found */ + return FR_NO_FILESYSTEM; + + /* Initialize the file system object */ + fsize = LD_WORD(fs->win+BPB_FATSz16); /* Number of sectors per FAT */ + if (!fsize) fsize = LD_DWORD(fs->win+BPB_FATSz32); + fs->sects_fat = fsize; + fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FAT copies */ + fsize *= fs->n_fats; /* (Number of sectors in FAT area) */ + fs->fatbase = bsect + LD_WORD(fs->win+BPB_RsvdSecCnt); /* FAT start sector (lba) */ + fs->csize = fs->win[BPB_SecPerClus]; /* Number of sectors per cluster */ + fs->n_rootdir = LD_WORD(fs->win+BPB_RootEntCnt); /* Nmuber of root directory entries */ + tsect = LD_WORD(fs->win+BPB_TotSec16); /* Number of sectors on the file system */ + if (!tsect) tsect = LD_DWORD(fs->win+BPB_TotSec32); + fs->max_clust = mclst = (tsect /* Last cluster# + 1 */ + - LD_WORD(fs->win+BPB_RsvdSecCnt) - fsize - fs->n_rootdir / (SS(fs)/32) + ) / fs->csize + 2; + + fmt = FS_FAT12; /* Determine the FAT sub type */ + if (mclst >= 0xFF7) fmt = FS_FAT16; /* Number of clusters >= 0xFF5 */ + if (mclst >= 0xFFF7) fmt = FS_FAT32; /* Number of clusters >= 0xFFF5 */ + + if (fmt == FS_FAT32) + fs->dirbase = LD_DWORD(fs->win+BPB_RootClus); /* Root directory start cluster */ + else + fs->dirbase = fs->fatbase + fsize; /* Root directory start sector (lba) */ + fs->database = fs->fatbase + fsize + fs->n_rootdir / (SS(fs)/32); /* Data start sector (lba) */ + +#if !_FS_READONLY + /* Initialize allocation information */ + fs->free_clust = 0xFFFFFFFF; + fs->wflag = 0; + /* Get fsinfo if needed */ + if (fmt == FS_FAT32) { + fs->fsi_sector = bsect + LD_WORD(fs->win+BPB_FSInfo); + fs->fsi_flag = 0; + if (disk_read(fs->drive, fs->win, fs->fsi_sector, 1) == RES_OK && + LD_WORD(fs->win+BS_55AA) == 0xAA55 && + LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 && + LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) { + fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free); + fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count); + } + } +#endif + fs->winsect = 0; + fs->fs_type = fmt; /* FAT syb-type */ + fs->id = ++Fsid; /* File system mount ID */ + res = FR_OK; + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/dir object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT validate ( /* FR_OK(0): The object is valid, !=0: Invalid */ + FATFS *fs, /* Pointer to the file system object */ + WORD id /* Member id of the target object to be checked */ +) +{ + if (!fs || !fs->fs_type || fs->id != id) + return FR_INVALID_OBJECT; + + ENTER_FF(fs); /* Lock file system */ + + if (disk_status(fs->drive) & STA_NOINIT) + return FR_NOT_READY; + + return FR_OK; +} + + + + +/*-------------------------------------------------------------------------- + + Public Functions + +--------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Locical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + BYTE vol, /* Logical drive number to be mounted/unmounted */ + FATFS *fs /* Pointer to new file system object (NULL for unmount)*/ +) +{ + FATFS *rfs; + + + if (vol >= _DRIVES) /* Check if the drive number is valid */ + return FR_INVALID_DRIVE; + rfs = FatFs[vol]; /* Get current state */ + + if (rfs) { +#if _FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(fs->sobj)) return FR_INT_ERR; +#endif + rfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if _FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj(vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL *fp, /* Pointer to the blank file object */ + const char *path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + fp->fs = NULL; /* Clear file object */ +#if !_FS_READONLY + mode &= (FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW); + res = auto_mount(&path, &dj.fs, (BYTE)(mode & (FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW))); +#else + mode &= FA_READ; + res = auto_mount(&path, &dj.fs, 0); +#endif + if (res != FR_OK) LEAVE_FF(dj.fs, res); + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + +#if !_FS_READONLY + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + DWORD ps, cl; + + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) + res = dir_register(&dj); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + mode |= FA_CREATE_ALWAYS; + dir = dj.dir; + } + else { /* Any object is already existing */ + if (mode & FA_CREATE_NEW) /* Cannot create new */ + LEAVE_FF(dj.fs, FR_EXIST); + dir = dj.dir; + if (!dir || (dir[DIR_Attr] & (AM_RDO | AM_DIR))) /* Cannot overwrite it (R/O or DIR) */ + LEAVE_FF(dj.fs, FR_DENIED); + if (mode & FA_CREATE_ALWAYS) { /* Resize it to zero if needed */ + cl = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); /* Get start cluster */ + ST_WORD(dir+DIR_FstClusHI, 0); /* cluster = 0 */ + ST_WORD(dir+DIR_FstClusLO, 0); + ST_DWORD(dir+DIR_FileSize, 0); /* size = 0 */ + dj.fs->wflag = 1; + ps = dj.fs->winsect; /* Remove the cluster chain */ + if (cl) { + res = remove_chain(dj.fs, cl); + if (res) LEAVE_FF(dj.fs, res); + dj.fs->last_clust = cl - 1; /* Reuse the cluster hole */ + } + res = move_window(dj.fs, ps); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + } + } + if (mode & FA_CREATE_ALWAYS) { + dir[DIR_Attr] = 0; /* Reset attribute */ + ps = get_fattime(); + ST_DWORD(dir+DIR_CrtTime, ps); /* Created time */ + dj.fs->wflag = 1; + mode |= FA__WRITTEN; /* Set file changed flag */ + } + } + /* Open an existing file */ + else { +#endif /* !_FS_READONLY */ + if (res != FR_OK) LEAVE_FF(dj.fs, res); /* Follow failed */ + dir = dj.dir; + if (!dir || (dir[DIR_Attr] & AM_DIR)) /* It is a directory */ + LEAVE_FF(dj.fs, FR_NO_FILE); +#if !_FS_READONLY + if ((mode & FA_WRITE) && (dir[DIR_Attr] & AM_RDO)) /* R/O violation */ + LEAVE_FF(dj.fs, FR_DENIED); + } + fp->dir_sect = dj.fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dj.dir; +#endif + fp->flag = mode; /* File access mode */ + fp->org_clust = /* File start cluster */ + ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + fp->fsize = LD_DWORD(dir+DIR_FileSize); /* File size */ + fp->fptr = 0; fp->csect = 255; /* File pointer */ + fp->dsect = 0; + fp->fs = dj.fs; fp->id = dj.fs->id; /* Owner file system object of the file */ + + LEAVE_FF(dj.fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL *fp, /* Pointer to the file object */ + void *buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT *br /* Pointer to number of bytes read */ +) +{ + FRESULT res; + DWORD clst, sect, remain; + UINT rcnt, cc; + BYTE *rbuff = buff; + + + *br = 0; + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_READ)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + remain = fp->fsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr; /* Repeat until all data transferred */ + rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->org_clust : get_cluster(fp->fs, fp->curr_clust); + if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector offset in the cluster */ + } + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += fp->csect; + cc = btr / SS(fp->fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Read maximum contiguous sectors directly */ + if (fp->csect + cc > fp->fs->csize) /* Clip at cluster boundary */ + cc = fp->fs->csize - fp->csect; + if (disk_read(fp->fs->drive, rbuff, sect, (BYTE)cc) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->csect += (BYTE)cc; /* Next sector address in the cluster */ + rcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Write sector I/O buffer if needed */ + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA__DIRTY; + } +#endif + if (fp->dsect != sect) { /* Fill sector buffer with file data */ + if (disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + } +#endif + fp->dsect = sect; + fp->csect++; /* Next sector address in the cluster */ + } + rcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Get partial sector data from sector buffer */ + if (rcnt > btr) rcnt = btr; +#if _FS_TINY + if (move_window(fp->fs, fp->dsect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + mem_cpy(rbuff, &fp->fs->win[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ +#else + mem_cpy(rbuff, &fp->buf[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ +#endif + } + + + LEAVE_FF(fp->fs, FR_OK); +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL *fp, /* Pointer to the file object */ + const void *buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT *bw /* Pointer to number of bytes written */ +) +{ + FRESULT res; + DWORD clst, sect; + UINT wcnt, cc; + const BYTE *wbuff = buff; + + + *bw = 0; + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_WRITE)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + if (fp->fsize + btw < fp->fsize) btw = 0; /* File size cannot reach 4GB */ + + for ( ; btw; /* Repeat until all data transferred */ + wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->org_clust; /* Follow from the origin */ + if (clst == 0) /* When there is no cluster chain, */ + fp->org_clust = clst = create_chain(fp->fs, 0); /* Create a new cluster chain */ + } else { /* Middle or end of the file */ + clst = create_chain(fp->fs, fp->curr_clust); /* Follow or streach cluster chain */ + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector address in the cluster */ + } +#if _FS_TINY + if (fp->fs->winsect == fp->dsect && move_window(fp->fs, 0)) /* Write back data buffer prior to following direct transfer */ + ABORT(fp->fs, FR_DISK_ERR); +#else + if (fp->flag & FA__DIRTY) { /* Write back data buffer prior to following direct transfer */ + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA__DIRTY; + } +#endif + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += fp->csect; + cc = btw / SS(fp->fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Write maximum contiguous sectors directly */ + if (fp->csect + cc > fp->fs->csize) /* Clip at cluster boundary */ + cc = fp->fs->csize - fp->csect; + if (disk_write(fp->fs->drive, wbuff, sect, (BYTE)cc) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#if _FS_TINY + if (fp->fs->winsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */ + mem_cpy(fp->fs->win, wbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), SS(fp->fs)); + fp->fs->wflag = 0; + } +#else + if (fp->dsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */ + mem_cpy(fp->buf, wbuff + ((fp->dsect - sect) * SS(fp->fs)), SS(fp->fs)); + fp->flag &= ~FA__DIRTY; + } +#endif + fp->csect += (BYTE)cc; /* Next sector address in the cluster */ + wcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ + continue; + } +#if _FS_TINY + if (fp->fptr >= fp->fsize) { /* Avoid silly buffer filling at growing edge */ + if (move_window(fp->fs, 0)) ABORT(fp->fs, FR_DISK_ERR); + fp->fs->winsect = sect; + } +#else + if (fp->dsect != sect) { /* Fill sector buffer with file data */ + if (fp->fptr < fp->fsize && + disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + } +#endif + fp->dsect = sect; + fp->csect++; /* Next sector address in the cluster */ + } + wcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Put partial sector into file I/O buffer */ + if (wcnt > btw) wcnt = btw; +#if _FS_TINY + if (move_window(fp->fs, fp->dsect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + mem_cpy(&fp->fs->win[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ + fp->fs->wflag = 1; +#else + mem_cpy(&fp->buf[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ + fp->flag |= FA__DIRTY; +#endif + } + + if (fp->fptr > fp->fsize) fp->fsize = fp->fptr; /* Update file size if needed */ + fp->flag |= FA__WRITTEN; /* Set file changed flag */ + + LEAVE_FF(fp->fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL *fp /* Pointer to the file object */ +) +{ + FRESULT res; + DWORD tim; + BYTE *dir; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res == FR_OK) { + if (fp->flag & FA__WRITTEN) { /* Has the file been written? */ +#if !_FS_TINY /* Write-back dirty buffer */ + if (fp->flag & FA__DIRTY) { + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + LEAVE_FF(fp->fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA__DIRTY; + } +#endif + /* Update the directory entry */ + res = move_window(fp->fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ + ST_DWORD(dir+DIR_FileSize, fp->fsize); /* Update file size */ + ST_WORD(dir+DIR_FstClusLO, fp->org_clust); /* Update start cluster */ + ST_WORD(dir+DIR_FstClusHI, fp->org_clust >> 16); + tim = get_fattime(); /* Updated time */ + ST_DWORD(dir+DIR_WrtTime, tim); + fp->flag &= (BYTE)~FA__WRITTEN; + fp->fs->wflag = 1; + res = sync(fp->fs); + } + } + } + + LEAVE_FF(fp->fs, res); +} + +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL *fp /* Pointer to the file object to be closed */ +) +{ + FRESULT res; + + +#if _FS_READONLY + res = validate(fp->fs, fp->id); + if (res == FR_OK) fp->fs = NULL; + LEAVE_FF(fp->fs, res); +#else + res = f_sync(fp); + if (res == FR_OK) fp->fs = NULL; + return res; +#endif +} + + + + +#if _FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File R/W Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL *fp, /* Pointer to the file object */ + DWORD ofs /* File pointer from top of file */ +) +{ + FRESULT res; + DWORD clst, bcs, nsect, ifptr; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (ofs > fp->fsize /* In read-only mode, clip offset with the file size */ +#if !_FS_READONLY + && !(fp->flag & FA_WRITE) +#endif + ) ofs = fp->fsize; + + ifptr = fp->fptr; + fp->fptr = 0; fp->csect = 255; + nsect = 0; + if (ofs > 0) { + bcs = (DWORD)fp->fs->csize * SS(fp->fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->curr_clust; + } else { /* When seek to back cluster, */ + clst = fp->org_clust; /* start from the first cluster */ +#if !_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(fp->fs, 0); + if (clst == 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->org_clust = clst; + } +#endif + fp->curr_clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ +#if !_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + clst = create_chain(fp->fs, clst); /* Force streached if in write mode */ + if (clst == 0) { /* When disk gets full, clip file size */ + ofs = bcs; break; + } + } else +#endif + clst = get_cluster(fp->fs, clst); /* Follow cluster chain if not in write mode */ + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fp->fs->max_clust) ABORT(fp->fs, FR_INT_ERR); + fp->curr_clust = clst; + fp->fptr += bcs; + ofs -= bcs; + } + fp->fptr += ofs; + fp->csect = (BYTE)(ofs / SS(fp->fs)); /* Sector offset in the cluster */ + if (ofs % SS(fp->fs)) { + nsect = clust2sect(fp->fs, clst); /* Current sector */ + if (!nsect) ABORT(fp->fs, FR_INT_ERR); + nsect += fp->csect; + fp->csect++; + } + } + } + if (nsect && nsect != fp->dsect && fp->fptr % SS(fp->fs)) { +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Write-back dirty buffer if needed */ + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA__DIRTY; + } +#endif + if (disk_read(fp->fs->drive, fp->buf, nsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#endif + fp->dsect = nsect; + } +#if !_FS_READONLY + if (fp->fptr > fp->fsize) { /* Set changed flag if the file size is extended */ + fp->fsize = fp->fptr; + fp->flag |= FA__WRITTEN; + } +#endif + + LEAVE_FF(fp->fs, res); +} + + + + +#if _FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directroy Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR *dj, /* Pointer to directory object to create */ + const char *path /* Pointer to the directory path */ +) +{ + FRESULT res; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = auto_mount(&path, &dj->fs, 0); + if (res == FR_OK) { + INITBUF((*dj), sfn, lfn); + res = follow_path(dj, path); /* Follow the path to the directory */ + if (res == FR_OK) { /* Follow completed */ + dir = dj->dir; + if (dir) { /* It is not the root dir */ + if (dir[DIR_Attr] & AM_DIR) { /* The object is a directory */ + dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + } else { /* The object is not a directory */ + res = FR_NO_PATH; + } + } else { /* It is the root dir */ + dj->sclust = (dj->fs->fs_type == FS_FAT32) ? dj->fs->dirbase : 0; + } + if (res == FR_OK) res = dir_seek(dj, 0); + dj->id = dj->fs->id; + } else { + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + } + + LEAVE_FF(dj->fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entry in Sequense */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR *dj, /* Pointer to the open directory object */ + FILINFO *fno /* Pointer to file information to return */ +) +{ + FRESULT res; + NAMEBUF(sfn, lfn); + + + res = validate(dj->fs, dj->id); /* Check validity of the object */ + if (res == FR_OK) { + INITBUF((*dj), sfn, lfn); + if (!fno) { + res = dir_seek(dj, 0); + } else { + res = dir_read(dj); + if (res == FR_NO_FILE) { + dj->sect = 0; + res = FR_OK; + } + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dj, fno); /* Get the object information */ + res = dir_next(dj, FALSE); /* Increment index for next */ + if (res == FR_NO_FILE) { + dj->sect = 0; + res = FR_OK; + } + } + } + } + + LEAVE_FF(dj->fs, res); +} + + + +#if _FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const char *path, /* Pointer to the file path */ + FILINFO *fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + + + res = auto_mount(&path, &dj.fs, 0); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follwo completed */ + if (dj.dir) /* Found an object */ + get_fileinfo(&dj, fno); + else /* It is root dir */ + res = FR_INVALID_NAME; + } + } + + LEAVE_FF(dj.fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL *fp /* Pointer to the file object */ +) +{ + FRESULT res; + DWORD ncl; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_WRITE)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + + if (fp->fsize > fp->fptr) { + fp->fsize = fp->fptr; /* Set file size to current R/W point */ + fp->flag |= FA__WRITTEN; + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(fp->fs, fp->org_clust); + fp->org_clust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_cluster(fp->fs, fp->curr_clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fp->fs->max_clust) { + res = put_cluster(fp->fs, fp->curr_clust, 0x0FFFFFFF); + if (res == FR_OK) res = remove_chain(fp->fs, ncl); + } + } + } + if (res != FR_OK) fp->flag |= FA__ERROR; + + LEAVE_FF(fp->fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const char *path, /* Pointer to the logical drive number (root dir) */ + DWORD *nclst, /* Pointer to the variable to return number of free clusters */ + FATFS **fatfs /* Pointer to pointer to corresponding file system object to return */ +) +{ + FRESULT res; + DWORD n, clst, sect; + BYTE fat, f, *p; + + + /* Get drive number */ + res = auto_mount(&path, fatfs, 0); + if (res != FR_OK) LEAVE_FF(*fatfs, res); + + /* If number of free cluster is valid, return it without cluster scan. */ + if ((*fatfs)->free_clust <= (*fatfs)->max_clust - 2) { + *nclst = (*fatfs)->free_clust; + LEAVE_FF(*fatfs, FR_OK); + } + + /* Get number of free clusters */ + fat = (*fatfs)->fs_type; + n = 0; + if (fat == FS_FAT12) { + clst = 2; + do { + if ((WORD)get_cluster(*fatfs, clst) == 0) n++; + } while (++clst < (*fatfs)->max_clust); + } else { + clst = (*fatfs)->max_clust; + sect = (*fatfs)->fatbase; + f = 0; p = 0; + do { + if (!f) { + res = move_window(*fatfs, sect++); + if (res != FR_OK) + LEAVE_FF(*fatfs, res); + p = (*fatfs)->win; + } + if (fat == FS_FAT16) { + if (LD_WORD(p) == 0) n++; + p += 2; f += 1; + } else { + if (LD_DWORD(p) == 0) n++; + p += 4; f += 2; + } + } while (--clst); + } + (*fatfs)->free_clust = n; + if (fat == FS_FAT32) (*fatfs)->fsi_flag = 1; + *nclst = n; + + LEAVE_FF(*fatfs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File or Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const char *path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + NAMEBUF(sfn, lfn); + BYTE *dir; + DWORD dclst; + + + res = auto_mount(&path, &dj.fs, 1); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res != FR_OK) LEAVE_FF(dj.fs, res); /* Follow failed */ + + dir = dj.dir; + if (!dir) /* Is it the root directory? */ + LEAVE_FF(dj.fs, FR_INVALID_NAME); + if (dir[DIR_Attr] & AM_RDO) /* Is it a R/O object? */ + LEAVE_FF(dj.fs, FR_DENIED); + dclst = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + + if (dir[DIR_Attr] & AM_DIR) { /* It is a sub-directory */ + if (dclst < 2) LEAVE_FF(dj.fs, FR_INT_ERR); + mem_cpy(&sdj, &dj, sizeof(DIR)); /* Check if the sub-dir is empty or not */ + sdj.sclust = dclst; + res = dir_seek(&sdj, 0); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + res = dir_read(&sdj); + if (res == FR_OK) res = FR_DENIED; /* Not empty sub-dir */ + if (res != FR_NO_FILE) LEAVE_FF(dj.fs, res); + } + + res = dir_remove(&dj); /* Remove directory entry */ + if (res == FR_OK) { + if (dclst) + res = remove_chain(dj.fs, dclst); /* Remove the cluster chain */ + if (res == FR_OK) res = sync(dj.fs); + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const char *path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir, n; + DWORD dsect, dclst, pclst, tim; + + + res = auto_mount(&path, &dj.fs, 1); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Any file or directory is already existing */ + if (res != FR_NO_FILE) /* Any error occured */ + LEAVE_FF(dj.fs, res); + + dclst = create_chain(dj.fs, 0); /* Allocate a new cluster for new directory table */ + res = FR_OK; + if (dclst == 0) res = FR_DENIED; + if (dclst == 1) res = FR_INT_ERR; + if (dclst == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) + res = move_window(dj.fs, 0); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + dsect = clust2sect(dj.fs, dclst); + + dir = dj.fs->win; /* Initialize the new directory table */ + mem_set(dir, 0, SS(dj.fs)); + mem_set(dir+DIR_Name, ' ', 8+3); /* Create "." entry */ + dir[DIR_Name] = '.'; + dir[DIR_Attr] = AM_DIR; + tim = get_fattime(); + ST_DWORD(dir+DIR_WrtTime, tim); + ST_WORD(dir+DIR_FstClusLO, dclst); + ST_WORD(dir+DIR_FstClusHI, dclst >> 16); + mem_cpy(dir+32, dir, 32); /* Create ".." entry */ + dir[33] = '.'; + pclst = dj.sclust; + if (dj.fs->fs_type == FS_FAT32 && pclst == dj.fs->dirbase) + pclst = 0; + ST_WORD(dir+32+DIR_FstClusLO, pclst); + ST_WORD(dir+32+DIR_FstClusHI, pclst >> 16); + for (n = 0; n < dj.fs->csize; n++) { /* Write dot entries and clear left sectors */ + dj.fs->winsect = dsect++; + dj.fs->wflag = 1; + res = move_window(dj.fs, 0); + if (res) LEAVE_FF(dj.fs, res); + mem_set(dir, 0, SS(dj.fs)); + } + + res = dir_register(&dj); + if (res != FR_OK) { + remove_chain(dj.fs, dclst); + } else { + dir = dj.dir; + dir[DIR_Attr] = AM_DIR; /* Attribute */ + ST_DWORD(dir+DIR_WrtTime, tim); /* Crated time */ + ST_WORD(dir+DIR_FstClusLO, dclst); /* Table start cluster */ + ST_WORD(dir+DIR_FstClusHI, dclst >> 16); + dj.fs->wflag = 1; + res = sync(dj.fs); + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change File Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const char *path, /* Pointer to the file path */ + BYTE value, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = auto_mount(&path, &dj.fs, 1); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { + dir = dj.dir; + if (!dir) { /* Is it a root directory? */ + res = FR_INVALID_NAME; + } else { /* File or sub directory */ + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ + dir[DIR_Attr] = (value & mask) | (dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + dj.fs->wflag = 1; + res = sync(dj.fs); + } + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const char *path, /* Pointer to the file/directory name */ + const FILINFO *fno /* Pointer to the timestamp to be set */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = auto_mount(&path, &dj.fs, 1); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { + dir = dj.dir; + if (!dir) { /* Root directory */ + res = FR_INVALID_NAME; + } else { /* File or sub-directory */ + ST_WORD(dir+DIR_WrtTime, fno->ftime); + ST_WORD(dir+DIR_WrtDate, fno->fdate); + dj.fs->wflag = 1; + res = sync(dj.fs); + } + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const char *path_old, /* Pointer to the old name */ + const char *path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR dj_old, dj_new; + NAMEBUF(sfn, lfn); + BYTE buf[21], *dir; + DWORD dw; + + + INITBUF(dj_old, sfn, lfn); + res = auto_mount(&path_old, &dj_old.fs, 1); + if (res == FR_OK) { + dj_new.fs = dj_old.fs; + res = follow_path(&dj_old, path_old); /* Check old object */ + } + if (res != FR_OK) LEAVE_FF(dj_old.fs, res); /* The old object is not found */ + + if (!dj_old.dir) LEAVE_FF(dj_old.fs, FR_NO_FILE); /* Is root dir? */ + mem_cpy(buf, dj_old.dir+DIR_Attr, 21); /* Save the object information */ + + mem_cpy(&dj_new, &dj_old, sizeof(DIR)); + res = follow_path(&dj_new, path_new); /* Check new object */ + if (res == FR_OK) res = FR_EXIST; /* The new object name is already existing */ + if (res == FR_NO_FILE) { /* Is it a valid path and no name collision? */ + res = dir_register(&dj_new); /* Register the new object */ + if (res == FR_OK) { + dir = dj_new.dir; /* Copy object information into new entry */ + mem_cpy(dir+13, buf+2, 19); + dir[DIR_Attr] = buf[0]; + dj_old.fs->wflag = 1; + if (dir[DIR_Attr] & AM_DIR) { /* Update .. entry in the directory if needed */ + dw = clust2sect(dj_new.fs, (DWORD)LD_WORD(dir+DIR_FstClusHI) | LD_WORD(dir+DIR_FstClusLO)); + if (!dw) { + res = FR_INT_ERR; + } else { + res = move_window(dj_new.fs, dw); + dir = dj_new.fs->win+32; + if (res == FR_OK && dir[1] == '.') { + dw = (dj_new.fs->fs_type == FS_FAT32 && dj_new.sclust == dj_new.fs->dirbase) ? 0 : dj_new.sclust; + ST_WORD(dir+DIR_FstClusLO, dw); + ST_WORD(dir+DIR_FstClusHI, dw >> 16); + dj_new.fs->wflag = 1; + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj_old); /* Remove old entry */ + if (res == FR_OK) + res = sync(dj_old.fs); + } + } + } + + LEAVE_FF(dj_old.fs, res); +} + +#endif /* !_FS_READONLY */ +#endif /* _FS_MINIMIZE == 0 */ +#endif /* _FS_MINIMIZE <= 1 */ +#endif /* _FS_MINIMIZE <= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Forward data to the stream directly (Available on only _FS_TINY cfg) */ +/*-----------------------------------------------------------------------*/ +#if _USE_FORWARD && _FS_TINY + +FRESULT f_forward ( + FIL *fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btr, /* Number of bytes to forward */ + UINT *bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + DWORD remain, clst, sect; + UINT rcnt; + + + *bf = 0; + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check error flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_READ)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + + remain = fp->fsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr && (*func)(NULL, 0); /* Repeat until all data transferred or stream becomes busy */ + fp->fptr += rcnt, *bf += rcnt, btr -= rcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->org_clust : get_cluster(fp->fs, fp->curr_clust); + if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector address in the cluster */ + } + fp->csect++; /* Next sector address in the cluster */ + } + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current data sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += fp->csect - 1; + if (move_window(fp->fs, sect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + fp->dsect = sect; + rcnt = SS(fp->fs) - (WORD)(fp->fptr % SS(fp->fs)); /* Forward data from sector window */ + if (rcnt > btr) rcnt = btr; + rcnt = (*func)(&fp->fs->win[(WORD)fp->fptr % SS(fp->fs)], rcnt); + if (!rcnt) ABORT(fp->fs, FR_INT_ERR); + } + + LEAVE_FF(fp->fs, FR_OK); +} +#endif /* _USE_FORWARD */ + + + +#if _USE_MKFS && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Create File System on the Drive */ +/*-----------------------------------------------------------------------*/ +#define N_ROOTDIR 512 /* Multiple of 32 and <= 2048 */ +#define N_FATS 1 /* 1 or 2 */ +#define MAX_SECTOR 131072000UL /* Maximum partition size */ +#define MIN_SECTOR 2000UL /* Minimum partition size */ + + +FRESULT f_mkfs ( + BYTE drv, /* Logical drive number */ + BYTE partition, /* Partitioning rule 0:FDISK, 1:SFD */ + WORD allocsize /* Allocation unit size [bytes] */ +) +{ + static const DWORD sstbl[] = { 2048000, 1024000, 512000, 256000, 128000, 64000, 32000, 16000, 8000, 4000, 0 }; + static const WORD cstbl[] = { 32768, 16384, 8192, 4096, 2048, 16384, 8192, 4096, 2048, 1024, 512 }; + BYTE fmt, m, *tbl; + DWORD b_part, b_fat, b_dir, b_data; /* Area offset (LBA) */ + DWORD n_part, n_rsv, n_fat, n_dir; /* Area size */ + DWORD n_clst, n; + WORD as; + FATFS *fs; + DSTATUS stat; + + + /* Check validity of the parameters */ + if (drv >= _DRIVES) return FR_INVALID_DRIVE; + if (partition >= 2) return FR_MKFS_ABORTED; + + /* Check mounted drive and clear work area */ + fs = FatFs[drv]; + if (!fs) return FR_NOT_ENABLED; + fs->fs_type = 0; + drv = LD2PD(drv); + + /* Get disk statics */ + stat = disk_initialize(drv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; + if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_part) != RES_OK || n_part < MIN_SECTOR) + return FR_MKFS_ABORTED; + if (n_part > MAX_SECTOR) n_part = MAX_SECTOR; + b_part = (!partition) ? 63 : 0; /* Boot sector */ + n_part -= b_part; +#if _MAX_SS == 512 + if (!allocsize) { /* Auto selection of cluster size */ + for (n = 0; n_part < sstbl[n]; n++) ; + allocsize = cstbl[n]; + } +#endif + for (as = 512; as <= 32768U && as != allocsize; as <<= 1); + if (as != allocsize) return FR_MKFS_ABORTED; +#if _MAX_SS != 512 /* Check disk sector size */ + if (disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK + || SS(fs) > _MAX_SS + || SS(fs) > allocsize) + return FR_MKFS_ABORTED; +#endif + allocsize /= SS(fs); /* Number of sectors per cluster */ + + /* Pre-compute number of clusters and FAT type */ + n_clst = n_part / allocsize; + fmt = FS_FAT12; + if (n_clst >= 0xFF5) fmt = FS_FAT16; + if (n_clst >= 0xFFF5) fmt = FS_FAT32; + + /* Determine offset and size of FAT structure */ + switch (fmt) { + case FS_FAT12: + n_fat = ((n_clst * 3 + 1) / 2 + 3 + SS(fs) - 1) / SS(fs); + n_rsv = 1 + partition; + n_dir = N_ROOTDIR * 32 / SS(fs); + break; + case FS_FAT16: + n_fat = ((n_clst * 2) + 4 + SS(fs) - 1) / SS(fs); + n_rsv = 1 + partition; + n_dir = N_ROOTDIR * 32 / SS(fs); + break; + default: + n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); + n_rsv = 33 - partition; + n_dir = 0; + } + b_fat = b_part + n_rsv; /* FATs start sector */ + b_dir = b_fat + n_fat * N_FATS; /* Directory start sector */ + b_data = b_dir + n_dir; /* Data start sector */ + + /* Align data start sector to erase block boundary (for flash memory media) */ + if (disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK) return FR_MKFS_ABORTED; + n = (b_data + n - 1) & ~(n - 1); + n_fat += (n - b_data) / N_FATS; + /* b_dir and b_data are no longer used below */ + + /* Determine number of cluster and final check of validity of the FAT type */ + n_clst = (n_part - n_rsv - n_fat * N_FATS - n_dir) / allocsize; + if ( (fmt == FS_FAT16 && n_clst < 0xFF5) + || (fmt == FS_FAT32 && n_clst < 0xFFF5)) + return FR_MKFS_ABORTED; + + /* Create partition table if needed */ + if (!partition) { + DWORD n_disk = b_part + n_part; + + tbl = fs->win+MBR_Table; + ST_DWORD(tbl, 0x00010180); /* Partition start in CHS */ + if (n_disk < 63UL * 255 * 1024) { /* Partition end in CHS */ + n_disk = n_disk / 63 / 255; + tbl[7] = (BYTE)n_disk; + tbl[6] = (BYTE)((n_disk >> 2) | 63); + } else { + ST_WORD(&tbl[6], 0xFFFF); + } + tbl[5] = 254; + if (fmt != FS_FAT32) /* System ID */ + tbl[4] = (n_part < 0x10000) ? 0x04 : 0x06; + else + tbl[4] = 0x0c; + ST_DWORD(tbl+8, 63); /* Partition start in LBA */ + ST_DWORD(tbl+12, n_part); /* Partition size in LBA */ + ST_WORD(tbl+64, 0xAA55); /* Signature */ + if (disk_write(drv, fs->win, 0, 1) != RES_OK) + return FR_DISK_ERR; + } + + /* Create boot record */ + tbl = fs->win; /* Clear buffer */ + mem_set(tbl, 0, SS(fs)); + ST_DWORD(tbl+BS_jmpBoot, 0x90FEEB); /* Boot code (jmp $, nop) */ + ST_WORD(tbl+BPB_BytsPerSec, SS(fs)); /* Sector size */ + tbl[BPB_SecPerClus] = (BYTE)allocsize; /* Sectors per cluster */ + ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ + tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ + ST_WORD(tbl+BPB_RootEntCnt, SS(fs) / 32 * n_dir); /* Number of rootdir entries */ + if (n_part < 0x10000) { /* Number of total sectors */ + ST_WORD(tbl+BPB_TotSec16, n_part); + } else { + ST_DWORD(tbl+BPB_TotSec32, n_part); + } + tbl[BPB_Media] = 0xF8; /* Media descripter */ + ST_WORD(tbl+BPB_SecPerTrk, 63); /* Number of sectors per track */ + ST_WORD(tbl+BPB_NumHeads, 255); /* Number of heads */ + ST_DWORD(tbl+BPB_HiddSec, b_part); /* Hidden sectors */ + n = get_fattime(); /* Use current time as a VSN */ + if (fmt != FS_FAT32) { + ST_DWORD(tbl+BS_VolID, n); /* Volume serial number */ + ST_WORD(tbl+BPB_FATSz16, n_fat); /* Number of secters per FAT */ + tbl[BS_DrvNum] = 0x80; /* Drive number */ + tbl[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab, "NO NAME FAT ", 19); /* Volume lavel, FAT signature */ + } else { + ST_DWORD(tbl+BS_VolID32, n); /* Volume serial number */ + ST_DWORD(tbl+BPB_FATSz32, n_fat); /* Number of secters per FAT */ + ST_DWORD(tbl+BPB_RootClus, 2); /* Root directory cluster (2) */ + ST_WORD(tbl+BPB_FSInfo, 1); /* FSInfo record offset (bs+1) */ + ST_WORD(tbl+BPB_BkBootSec, 6); /* Backup boot record offset (bs+6) */ + tbl[BS_DrvNum32] = 0x80; /* Drive number */ + tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab32, "NO NAME FAT32 ", 19); /* Volume lavel, FAT signature */ + } + ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature */ + if (disk_write(drv, tbl, b_part+0, 1) != RES_OK) + return FR_DISK_ERR; + if (fmt == FS_FAT32) + disk_write(drv, tbl, b_part+6, 1); + + /* Initialize FAT area */ + for (m = 0; m < N_FATS; m++) { + mem_set(tbl, 0, SS(fs)); /* 1st sector of the FAT */ + if (fmt != FS_FAT32) { + n = (fmt == FS_FAT12) ? 0x00FFFFF8 : 0xFFFFFFF8; + ST_DWORD(tbl, n); /* Reserve cluster #0-1 (FAT12/16) */ + } else { + ST_DWORD(tbl+0, 0xFFFFFFF8); /* Reserve cluster #0-1 (FAT32) */ + ST_DWORD(tbl+4, 0xFFFFFFFF); + ST_DWORD(tbl+8, 0x0FFFFFFF); /* Reserve cluster #2 for root dir */ + } + if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + return FR_DISK_ERR; + mem_set(tbl, 0, SS(fs)); /* Following FAT entries are filled by zero */ + for (n = 1; n < n_fat; n++) { + if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + return FR_DISK_ERR; + } + } + + /* Initialize Root directory */ + m = (BYTE)((fmt == FS_FAT32) ? allocsize : n_dir); + do { + if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + return FR_DISK_ERR; + } while (--m); + + /* Create FSInfo record if needed */ + if (fmt == FS_FAT32) { + ST_WORD(tbl+BS_55AA, 0xAA55); + ST_DWORD(tbl+FSI_LeadSig, 0x41615252); + ST_DWORD(tbl+FSI_StrucSig, 0x61417272); + ST_DWORD(tbl+FSI_Free_Count, n_clst - 1); + ST_DWORD(tbl+FSI_Nxt_Free, 0xFFFFFFFF); + disk_write(drv, tbl, b_part+1, 1); + disk_write(drv, tbl, b_part+7, 1); + } + + return (disk_ioctl(drv, CTRL_SYNC, (void*)NULL) == RES_OK) ? FR_OK : FR_DISK_ERR; +} + +#endif /* _USE_MKFS && !_FS_READONLY */ + + + + +#if _USE_STRFUNC +/*-----------------------------------------------------------------------*/ +/* Get a string from the file */ +/*-----------------------------------------------------------------------*/ +char* f_gets ( + char* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer */ + FIL* fil /* Pointer to the file object */ +) +{ + int i = 0; + char *p = buff; + UINT rc; + + + while (i < len - 1) { /* Read bytes until buffer gets filled */ + f_read(fil, p, 1, &rc); + if (rc != 1) break; /* Break when no data to read */ +#if _USE_STRFUNC >= 2 + if (*p == '\r') continue; /* Strip '\r' */ +#endif + i++; + if (*p++ == '\n') break; /* Break when reached end of line */ + } + *p = 0; + return i ? buff : NULL; /* When no data read (eof or error), return with error. */ +} + + + +#if !_FS_READONLY +#include +/*-----------------------------------------------------------------------*/ +/* Put a character to the file */ +/*-----------------------------------------------------------------------*/ +int f_putc ( + int chr, /* A character to be output */ + FIL* fil /* Ponter to the file object */ +) +{ + UINT bw; + char c; + + +#if _USE_STRFUNC >= 2 + if (chr == '\n') f_putc ('\r', fil); /* LF -> CRLF conversion */ +#endif + if (!fil) { /* Special value may be used to switch the destination to any other device */ + /* put_console(chr); */ + return chr; + } + c = (char)chr; + f_write(fil, &c, 1, &bw); /* Write a byte to the file */ + return bw ? chr : EOF; /* Return the result */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a string to the file */ +/*-----------------------------------------------------------------------*/ +int f_puts ( + const char* str, /* Pointer to the string to be output */ + FIL* fil /* Pointer to the file object */ +) +{ + int n; + + + for (n = 0; *str; str++, n++) { + if (f_putc(*str, fil) == EOF) return EOF; + } + return n; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a formatted string to the file */ +/*-----------------------------------------------------------------------*/ +int f_printf ( + FIL* fil, /* Pointer to the file object */ + const char* str, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + UCHAR c, f, r; + ULONG val; + char s[16]; + int i, w, res, cc; + + + va_start(arp, str); + + for (cc = res = 0; cc != EOF; res += cc) { + c = *str++; + if (c == 0) break; /* End of string */ + if (c != '%') { /* Non escape cahracter */ + cc = f_putc(c, fil); + if (cc != EOF) cc = 1; + continue; + } + w = f = 0; + c = *str++; + if (c == '0') { /* Flag: '0' padding */ + f = 1; c = *str++; + } + while (c >= '0' && c <= '9') { /* Precision */ + w = w * 10 + (c - '0'); + c = *str++; + } + if (c == 'l') { /* Prefix: Size is long int */ + f |= 2; c = *str++; + } + if (c == 's') { /* Type is string */ + cc = f_puts(va_arg(arp, char*), fil); + continue; + } + if (c == 'c') { /* Type is character */ + cc = f_putc(va_arg(arp, int), fil); + if (cc != EOF) cc = 1; + continue; + } + r = 0; + if (c == 'd') r = 10; /* Type is signed decimal */ + if (c == 'u') r = 10; /* Type is unsigned decimal */ + if (c == 'X') r = 16; /* Type is unsigned hexdecimal */ + if (r == 0) break; /* Unknown type */ + if (f & 2) { /* Get the value */ + val = (ULONG)va_arg(arp, long); + } else { + val = (c == 'd') ? (ULONG)(long)va_arg(arp, int) : (ULONG)va_arg(arp, unsigned int); + } + /* Put numeral string */ + if (c == 'd') { + if (val & 0x80000000) { + val = 0 - val; + f |= 4; + } + } + i = sizeof(s) - 1; s[i] = 0; + do { + c = (UCHAR)(val % r + '0'); + if (c > '9') c += 7; + s[--i] = c; + val /= r; + } while (i && val); + if (i && (f & 4)) s[--i] = '-'; + w = sizeof(s) - 1 - w; + while (i && i > w) s[--i] = (f & 1) ? '0' : ' '; + cc = f_puts(&s[i], fil); + } + + va_end(arp); + return (cc == EOF) ? cc : res; +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_STRFUNC */ diff --git a/2.5/bertos/fs/fatfs/ff.h b/2.5/bertos/fs/fatfs/ff.h new file mode 100644 index 00000000..5461efe9 --- /dev/null +++ b/2.5/bertos/fs/fatfs/ff.h @@ -0,0 +1,570 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module include file R0.07a (C)ChaN, 2009 +/----------------------------------------------------------------------------/ +/ FatFs module is an open source software to implement FAT file system to +/ small embedded systems. This is a free software and is opened for education, +/ research and commercial developments under license policy of following trems. +/ +/ Copyright (C) 2009, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial use UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/----------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------/ +/ FatFs Configuration Options +/ +/ CAUTION! Do not forget to make clean the project after any changes to +/ the configuration options. +/ +/----------------------------------------------------------------------------*/ +#ifndef _FATFS +#define _FATFS + +#include "integer.h" +#include "cfg/cfg_fat.h" + +#ifndef _WORD_ACCESS +#define _WORD_ACCESS 0 +#endif +/* The _WORD_ACCESS option defines which access method is used to the word +/ data in the FAT structure. +/ +/ 0: Byte-by-byte access. Always compatible with all platforms. +/ 1: Word access. Do not choose this unless following condition is met. +/ +/ When the byte order on the memory is big-endian or address miss-aligned +/ word access results incorrect behavior, the _WORD_ACCESS must be set to 0. +/ If it is not the case, the value can also be set to 1 to improve the +/ performance and code efficiency. */ + +#ifndef _FS_READONLY +#define _FS_READONLY 0 +#endif +/* Setting _FS_READONLY to 1 defines read only configuration. This removes +/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, +/ f_truncate and useless f_getfree. */ + +#ifndef _FS_MINIMIZE +#define _FS_MINIMIZE 0 +#endif +/* The _FS_MINIMIZE option defines minimization level to remove some functions. +/ +/ 0: Full function. +/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename +/ are removed. +/ 2: f_opendir and f_readdir are removed in addition to level 1. +/ 3: f_lseek is removed in addition to level 2. */ + +#ifndef _FS_TINY +#define _FS_TINY 0 +#endif +/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system +/ object instead of the sector buffer in the individual file object for file +/ data transfer. This reduces memory consumption 512 bytes each file object. */ + +#ifndef _USE_STRFUNC +#define _USE_STRFUNC 0 +#endif +/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ + +#ifndef _USE_MKFS +#define _USE_MKFS 0 +#endif +/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ + + +#ifndef _USE_FORWARD +#define _USE_FORWARD 0 +#endif +/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ + + +#ifndef _DRIVES +#define _DRIVES 1 +#endif +/* Number of volumes (logical drives) to be used. */ + +#ifndef _MAX_SS +#define _MAX_SS 512 +#endif +/* Maximum sector size to be handled. (512/1024/2048/4096) */ +/* 512 for memroy card and hard disk, 1024 for floppy disk, 2048 for MO disk */ + +#ifndef _MULTI_PARTITION +#define _MULTI_PARTITION 0 +#endif +/* When _MULTI_PARTITION is set to 0, each volume is bound to the same physical +/ drive number and can mount only first primaly partition. When it is set to 1, +/ each volume is tied to the partitions listed in Drives[]. */ + +#ifndef _CODE_PAGE +#define _CODE_PAGE 932 +#endif +/* The _CODE_PAGE specifies the OEM code page to be used on the target system. +/ When it is non LFN configuration, there is no difference between SBCS code +/ pages. When LFN is enabled, the code page must always be set correctly. +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 775 - Baltic +/ 850 - Multilingual Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 858 - Multilingual Latin 1 + Euro +/ 862 - Hebrew +/ 866 - Russian +/ 874 - Thai +/ 932 - Japanese Shift-JIS (DBCS) +/ 936 - Simplified Chinese GBK (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese Big5 (DBCS) +/ 1258 - Vietnam +*/ + +#ifndef _USE_LFN +#define _USE_LFN 0 +#endif +#ifndef _MAX_LFN +#define _MAX_LFN 255 /* Maximum LFN length to handle (max:255) */ +#endif +/* The _USE_LFN option switches the LFN support. +/ +/ 0: Disable LFN. +/ 1: Enable LFN with static working buffer on the bss. NOT REENTRANT. +/ 2: Enable LFN with dynamic working buffer on the caller's STACK. +/ +/ The working buffer occupies (_MAX_LFN + 1) * 2 bytes. When enable LFN, +/ a Unicode - OEM code conversion function ff_convert() must be added to +/ the project. */ + +#ifndef _FS_REENTRANT +#define _FS_REENTRANT 0 +#endif +#ifndef _TIMEOUT +#define _TIMEOUT 1000 /* Timeout period in unit of time ticks */ +#endif +#ifndef _SYNC_t +#define _SYNC_t HANDLE /* Type of sync object used on the OS. */ + /* e.g. HANDLE, OS_EVENT*, ID and etc.. */ +#endif +/* To make the FatFs module re-entrant, set _FS_REENTRANT to 1 and add user +/ provided synchronization handlers, ff_req_grant, ff_rel_grant, +/ ff_del_syncobj and ff_cre_syncobj function to the project. */ + + + +/* End of configuration options. Do not change followings without care. */ +/*--------------------------------------------------------------------------*/ + + + +/* Definitions corresponds to multiple sector size */ + +#if _MAX_SS == 512 +#define SS(fs) 512 +#else +#if _MAX_SS == 1024 || _MAX_SS == 2048 || _MAX_SS == 4096 +#define SS(fs) ((fs)->s_size) +#else +#error Sector size must be 512, 1024, 2048 or 4096. +#endif +#endif + + + +/* File system object structure */ + +typedef struct _FATFS { + BYTE fs_type; /* FAT sub type */ + BYTE drive; /* Physical drive number */ + BYTE csize; /* Number of sectors per cluster */ + BYTE n_fats; /* Number of FAT copies */ + BYTE wflag; /* win[] dirty flag (1:must be written back) */ + BYTE pad1; + WORD id; /* File system mount ID */ + WORD n_rootdir; /* Number of root directory entries (0 on FAT32) */ +#if _FS_REENTRANT + _SYNC_t sobj; /* Identifier of sync object */ +#endif +#if _MAX_SS != 512U + WORD s_size; /* Sector size */ +#endif +#if !_FS_READONLY + BYTE fsi_flag; /* fsinfo dirty flag (1:must be written back) */ + BYTE pad2; + DWORD last_clust; /* Last allocated cluster */ + DWORD free_clust; /* Number of free clusters */ + DWORD fsi_sector; /* fsinfo sector */ +#endif + DWORD sects_fat; /* Sectors per fat */ + DWORD max_clust; /* Maximum cluster# + 1. Number of clusters is max_clust - 2 */ + DWORD fatbase; /* FAT start sector */ + DWORD dirbase; /* Root directory start sector (Cluster# on FAT32) */ + DWORD database; /* Data start sector */ + DWORD winsect; /* Current sector appearing in the win[] */ + BYTE win[_MAX_SS];/* Disk access window for Directory/FAT */ +} FATFS; + + + +/* Directory object structure */ + +typedef struct _DIR { + WORD id; /* Owner file system mount ID */ + WORD index; /* Current index number */ + FATFS* fs; /* Pointer to the owner file system object */ + DWORD sclust; /* Table start cluster (0:Static table) */ + DWORD clust; /* Current cluster */ + DWORD sect; /* Current sector */ + BYTE* dir; /* Pointer to the current SFN entry in the win[] */ + BYTE* fn; /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */ +#if _USE_LFN + WCHAR* lfn; /* Pointer to the LFN working buffer */ + WORD lfn_idx; /* Last matched LFN index (0xFFFF:No LFN) */ +#endif +} DIR; + + + +/* File object structure */ + +typedef struct _FIL { + FATFS* fs; /* Pointer to the owner file system object */ + WORD id; /* Owner file system mount ID */ + BYTE flag; /* File status flags */ + BYTE csect; /* Sector address in the cluster */ + DWORD fptr; /* File R/W pointer */ + DWORD fsize; /* File size */ + DWORD org_clust; /* File start cluster */ + DWORD curr_clust; /* Current cluster */ + DWORD dsect; /* Current data sector */ +#if !_FS_READONLY + DWORD dir_sect; /* Sector containing the directory entry */ + BYTE* dir_ptr; /* Ponter to the directory entry in the window */ +#endif +#if !_FS_TINY + BYTE buf[_MAX_SS];/* File R/W buffer */ +#endif +} FIL; + + + +/* File status structure */ + +typedef struct _FILINFO { + DWORD fsize; /* File size */ + WORD fdate; /* Last modified date */ + WORD ftime; /* Last modified time */ + BYTE fattrib; /* Attribute */ + char fname[13]; /* Short file name (8.3 format) */ +#if _USE_LFN + char *lfname; /* Pointer to the LFN buffer */ + int lfsize; /* Size of LFN buffer [bytes] */ +#endif +} FILINFO; + + + +/* DBCS code ranges */ + +#if _CODE_PAGE == 932 /* CP932 (Japanese Shift-JIS) */ +#define _DF1S 0x81 /* DBC 1st byte range 1 start */ +#define _DF1E 0x9F /* DBC 1st byte range 1 end */ +#define _DF2S 0xE0 /* DBC 1st byte range 2 start */ +#define _DF2E 0xFC /* DBC 1st byte range 2 end */ +#define _DS1S 0x40 /* DBC 2nd byte range 1 start */ +#define _DS1E 0x7E /* DBC 2nd byte range 1 end */ +#define _DS2S 0x80 /* DBC 2nd byte range 2 start */ +#define _DS2E 0xFC /* DBC 2nd byte range 2 end */ + +#elif _CODE_PAGE == 936 /* CP936 (Simplified Chinese GBK) */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0x80 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 949 /* CP949 (Korean) */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x41 +#define _DS1E 0x5A +#define _DS2S 0x61 +#define _DS2E 0x7A +#define _DS3S 0x81 +#define _DS3E 0xFE + +#elif _CODE_PAGE == 950 /* CP950 (Traditional Chinese Big5) */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0xA1 +#define _DS2E 0xFE + +#else /* SBCS code pages */ +#define _DF1S 0 + +#endif + + + +/* Character code support macros */ + +#define IsUpper(c) (((c)>='A')&&((c)<='Z')) +#define IsLower(c) (((c)>='a')&&((c)<='z')) +#define IsDigit(c) (((c)>='0')&&((c)<='9')) + +#if _DF1S /* DBCS configuration */ + +#if _DF2S /* Two 1st byte areas */ +#define IsDBCS1(c) (((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E)) +#else /* One 1st byte area */ +#define IsDBCS1(c) ((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) +#endif + +#if _DS3S /* Three 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E)) +#else /* Two 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E)) +#endif + +#else /* SBCS configuration */ + +#define IsDBCS1(c) 0 +#define IsDBCS2(c) 0 + +#endif /* _DF1S */ + + + +/* Definitions corresponds to multi partition */ + +#if _MULTI_PARTITION /* Multiple partition configuration */ + +typedef struct _PARTITION { + BYTE pd; /* Physical drive# */ + BYTE pt; /* Partition # (0-3) */ +} PARTITION; + +extern +const PARTITION Drives[]; /* Logical drive# to physical location conversion table */ +#define LD2PD(drv) (Drives[drv].pd) /* Get physical drive# */ +#define LD2PT(drv) (Drives[drv].pt) /* Get partition# */ + +#else /* Single partition configuration */ + +#define LD2PD(drv) (drv) /* Physical drive# is equal to the logical drive# */ +#define LD2PT(drv) 0 /* Always mounts the 1st partition */ + +#endif + + + +/* File function return code (FRESULT) */ + +typedef enum { + FR_OK = 0, /* 0 */ + FR_DISK_ERR, /* 1 */ + FR_INT_ERR, /* 2 */ + FR_NOT_READY, /* 3 */ + FR_NO_FILE, /* 4 */ + FR_NO_PATH, /* 5 */ + FR_INVALID_NAME, /* 6 */ + FR_DENIED, /* 7 */ + FR_EXIST, /* 8 */ + FR_INVALID_OBJECT, /* 9 */ + FR_WRITE_PROTECTED, /* 10 */ + FR_INVALID_DRIVE, /* 11 */ + FR_NOT_ENABLED, /* 12 */ + FR_NO_FILESYSTEM, /* 13 */ + FR_MKFS_ABORTED, /* 14 */ + FR_TIMEOUT /* 15 */ +} FRESULT; + + + +/*--------------------------------------------------------------*/ +/* FatFs module application interface */ + +FRESULT f_mount (BYTE, FATFS*); /* Mount/Unmount a logical drive */ +FRESULT f_open (FIL*, const char*, BYTE); /* Open or create a file */ +FRESULT f_read (FIL*, void*, UINT, UINT*); /* Read data from a file */ +FRESULT f_write (FIL*, const void*, UINT, UINT*); /* Write data to a file */ +FRESULT f_lseek (FIL*, DWORD); /* Move file pointer of a file object */ +FRESULT f_close (FIL*); /* Close an open file object */ +FRESULT f_opendir (DIR*, const char*); /* Open an existing directory */ +FRESULT f_readdir (DIR*, FILINFO*); /* Read a directory item */ +FRESULT f_stat (const char*, FILINFO*); /* Get file status */ +FRESULT f_getfree (const char*, DWORD*, FATFS**); /* Get number of free clusters on the drive */ +FRESULT f_truncate (FIL*); /* Truncate file */ +FRESULT f_sync (FIL*); /* Flush cached data of a writing file */ +FRESULT f_unlink (const char*); /* Delete an existing file or directory */ +FRESULT f_mkdir (const char*); /* Create a new directory */ +FRESULT f_chmod (const char*, BYTE, BYTE); /* Change attriburte of the file/dir */ +FRESULT f_utime (const char*, const FILINFO*); /* Change timestamp of the file/dir */ +FRESULT f_rename (const char*, const char*); /* Rename/Move a file or directory */ +FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream */ +FRESULT f_mkfs (BYTE, BYTE, WORD); /* Create a file system on the drive */ + +#if _USE_STRFUNC +int f_putc (int, FIL*); /* Put a character to the file */ +int f_puts (const char*, FIL*); /* Put a string to the file */ +int f_printf (FIL*, const char*, ...); /* Put a formatted string to the file */ +char* f_gets (char*, int, FIL*); /* Get a string from the file */ +#define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0) +#define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0) +#ifndef EOF +#define EOF -1 +#endif +#endif + + + +/*--------------------------------------------------------------*/ +/* User defined functions */ + +/* Real time clock */ +#if !_FS_READONLY +DWORD get_fattime (void); /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */ + /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */ +#endif + +/* Unicode - OEM code conversion */ +#if _USE_LFN +WCHAR ff_convert (WCHAR, UINT); +#endif + +/* Sync functions */ +#if _FS_REENTRANT +BOOL ff_cre_syncobj(BYTE, _SYNC_t*); +BOOL ff_del_syncobj(_SYNC_t); +BOOL ff_req_grant(_SYNC_t); +void ff_rel_grant(_SYNC_t); +#endif + + + +/*--------------------------------------------------------------*/ +/* Flags and offset address */ + + +/* File access control and file status flags (FIL.flag) */ + +#define FA_READ 0x01 +#define FA_OPEN_EXISTING 0x00 +#if _FS_READONLY == 0 +#define FA_WRITE 0x02 +#define FA_CREATE_NEW 0x04 +#define FA_CREATE_ALWAYS 0x08 +#define FA_OPEN_ALWAYS 0x10 +#define FA__WRITTEN 0x20 +#define FA__DIRTY 0x40 +#endif +#define FA__ERROR 0x80 + + +/* FAT sub type (FATFS.fs_type) */ + +#define FS_FAT12 1 +#define FS_FAT16 2 +#define FS_FAT32 3 + + +/* File attribute bits for directory entry */ + +#define AM_RDO 0x01 /* Read only */ +#define AM_HID 0x02 /* Hidden */ +#define AM_SYS 0x04 /* System */ +#define AM_VOL 0x08 /* Volume label */ +#define AM_LFN 0x0F /* LFN entry */ +#define AM_DIR 0x10 /* Directory */ +#define AM_ARC 0x20 /* Archive */ +#define AM_MASK 0x3F /* Mask of defined bits */ + + +/* FatFs refers the members in the FAT structures with byte offset instead +/ of structure member because there are incompatibility of the packing option +/ between various compilers. */ + +#define BS_jmpBoot 0 +#define BS_OEMName 3 +#define BPB_BytsPerSec 11 +#define BPB_SecPerClus 13 +#define BPB_RsvdSecCnt 14 +#define BPB_NumFATs 16 +#define BPB_RootEntCnt 17 +#define BPB_TotSec16 19 +#define BPB_Media 21 +#define BPB_FATSz16 22 +#define BPB_SecPerTrk 24 +#define BPB_NumHeads 26 +#define BPB_HiddSec 28 +#define BPB_TotSec32 32 +#define BS_55AA 510 + +#define BS_DrvNum 36 +#define BS_BootSig 38 +#define BS_VolID 39 +#define BS_VolLab 43 +#define BS_FilSysType 54 + +#define BPB_FATSz32 36 +#define BPB_ExtFlags 40 +#define BPB_FSVer 42 +#define BPB_RootClus 44 +#define BPB_FSInfo 48 +#define BPB_BkBootSec 50 +#define BS_DrvNum32 64 +#define BS_BootSig32 66 +#define BS_VolID32 67 +#define BS_VolLab32 71 +#define BS_FilSysType32 82 + +#define FSI_LeadSig 0 +#define FSI_StrucSig 484 +#define FSI_Free_Count 488 +#define FSI_Nxt_Free 492 + +#define MBR_Table 446 + +#define DIR_Name 0 +#define DIR_Attr 11 +#define DIR_NTres 12 +#define DIR_CrtTime 14 +#define DIR_CrtDate 16 +#define DIR_FstClusHI 20 +#define DIR_WrtTime 22 +#define DIR_WrtDate 24 +#define DIR_FstClusLO 26 +#define DIR_FileSize 28 +#define LDIR_Ord 0 +#define LDIR_Attr 11 +#define LDIR_Type 12 +#define LDIR_Chksum 13 +#define LDIR_FstClusLO 26 + + + +/*--------------------------------*/ +/* Multi-byte word access macros */ + +#if _WORD_ACCESS == 1 /* Enable word access to the FAT structure */ +#define LD_WORD(ptr) (WORD)(*(WORD*)(BYTE*)(ptr)) +#define LD_DWORD(ptr) (DWORD)(*(DWORD*)(BYTE*)(ptr)) +#define ST_WORD(ptr,val) *(WORD*)(BYTE*)(ptr)=(WORD)(val) +#define ST_DWORD(ptr,val) *(DWORD*)(BYTE*)(ptr)=(DWORD)(val) +#else /* Use byte-by-byte access to the FAT structure */ +#define LD_WORD(ptr) (WORD)(((WORD)*(BYTE*)((ptr)+1)<<8)|(WORD)*(BYTE*)(ptr)) +#define LD_DWORD(ptr) (DWORD)(((DWORD)*(BYTE*)((ptr)+3)<<24)|((DWORD)*(BYTE*)((ptr)+2)<<16)|((WORD)*(BYTE*)((ptr)+1)<<8)|*(BYTE*)(ptr)) +#define ST_WORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8) +#define ST_DWORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>24) +#endif + + +#endif /* _FATFS */ diff --git a/2.5/bertos/fs/fatfs/integer.h b/2.5/bertos/fs/fatfs/integer.h new file mode 100644 index 00000000..32ccfd48 --- /dev/null +++ b/2.5/bertos/fs/fatfs/integer.h @@ -0,0 +1,39 @@ +/*-------------------------------------------*/ +/* Integer type definitions for FatFs module */ +/*-------------------------------------------*/ + +#ifndef _INTEGER + +#include + +#if 0 +#include +#else + +/* These types must be 16-bit, 32-bit or larger integer */ +typedef int INT; +typedef unsigned UINT; + +/* These types must be 8-bit integer */ +typedef int8_t CHAR; +typedef uint8_t UCHAR; +typedef uint8_t BYTE; + +/* These types must be 16-bit integer */ +typedef int16_t SHORT; +typedef uint16_t USHORT; +typedef uint16_t WORD; +typedef uint16_t WCHAR; + +/* These types must be 32-bit integer */ +typedef int32_t LONG; +typedef uint32_t ULONG; +typedef uint32_t DWORD; + +/* Boolean type */ +typedef enum { FALSE = 0, TRUE } BOOL; + +#endif + +#define _INTEGER +#endif diff --git a/2.5/bertos/fs/fatfs/option/cc932.c b/2.5/bertos/fs/fatfs/option/cc932.c new file mode 100644 index 00000000..8f7cd89a --- /dev/null +++ b/2.5/bertos/fs/fatfs/option/cc932.c @@ -0,0 +1,3784 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ +/* */ +/* CP932 (Japanese Shift-JIS) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + +#define _TINY_TABLE 0 + +#if _USE_LFN && _CODE_PAGE == 932 + + +static +const WCHAR uni2sjis[] = { +/* Unicode - Sjis, Unicode - Sjis, Unicode - Sjis, Unicode - Sjis, */ + 0x00A7, 0x8198, 0x00A8, 0x814E, 0x00B0, 0x818B, 0x00B1, 0x817D, + 0x00B4, 0x814C, 0x00B6, 0x81F7, 0x00D7, 0x817E, 0x00F7, 0x8180, + 0x0391, 0x839F, 0x0392, 0x83A0, 0x0393, 0x83A1, 0x0394, 0x83A2, + 0x0395, 0x83A3, 0x0396, 0x83A4, 0x0397, 0x83A5, 0x0398, 0x83A6, + 0x0399, 0x83A7, 0x039A, 0x83A8, 0x039B, 0x83A9, 0x039C, 0x83AA, + 0x039D, 0x83AB, 0x039E, 0x83AC, 0x039F, 0x83AD, 0x03A0, 0x83AE, + 0x03A1, 0x83AF, 0x03A3, 0x83B0, 0x03A4, 0x83B1, 0x03A5, 0x83B2, + 0x03A6, 0x83B3, 0x03A7, 0x83B4, 0x03A8, 0x83B5, 0x03A9, 0x83B6, + 0x03B1, 0x83BF, 0x03B2, 0x83C0, 0x03B3, 0x83C1, 0x03B4, 0x83C2, + 0x03B5, 0x83C3, 0x03B6, 0x83C4, 0x03B7, 0x83C5, 0x03B8, 0x83C6, + 0x03B9, 0x83C7, 0x03BA, 0x83C8, 0x03BB, 0x83C9, 0x03BC, 0x83CA, + 0x03BD, 0x83CB, 0x03BE, 0x83CC, 0x03BF, 0x83CD, 0x03C0, 0x83CE, + 0x03C1, 0x83CF, 0x03C3, 0x83D0, 0x03C4, 0x83D1, 0x03C5, 0x83D2, + 0x03C6, 0x83D3, 0x03C7, 0x83D4, 0x03C8, 0x83D5, 0x03C9, 0x83D6, + 0x0401, 0x8446, 0x0410, 0x8440, 0x0411, 0x8441, 0x0412, 0x8442, + 0x0413, 0x8443, 0x0414, 0x8444, 0x0415, 0x8445, 0x0416, 0x8447, + 0x0417, 0x8448, 0x0418, 0x8449, 0x0419, 0x844A, 0x041A, 0x844B, + 0x041B, 0x844C, 0x041C, 0x844D, 0x041D, 0x844E, 0x041E, 0x844F, + 0x041F, 0x8450, 0x0420, 0x8451, 0x0421, 0x8452, 0x0422, 0x8453, + 0x0423, 0x8454, 0x0424, 0x8455, 0x0425, 0x8456, 0x0426, 0x8457, + 0x0427, 0x8458, 0x0428, 0x8459, 0x0429, 0x845A, 0x042A, 0x845B, + 0x042B, 0x845C, 0x042C, 0x845D, 0x042D, 0x845E, 0x042E, 0x845F, + 0x042F, 0x8460, 0x0430, 0x8470, 0x0431, 0x8471, 0x0432, 0x8472, + 0x0433, 0x8473, 0x0434, 0x8474, 0x0435, 0x8475, 0x0436, 0x8477, + 0x0437, 0x8478, 0x0438, 0x8479, 0x0439, 0x847A, 0x043A, 0x847B, + 0x043B, 0x847C, 0x043C, 0x847D, 0x043D, 0x847E, 0x043E, 0x8480, + 0x043F, 0x8481, 0x0440, 0x8482, 0x0441, 0x8483, 0x0442, 0x8484, + 0x0443, 0x8485, 0x0444, 0x8486, 0x0445, 0x8487, 0x0446, 0x8488, + 0x0447, 0x8489, 0x0448, 0x848A, 0x0449, 0x848B, 0x044A, 0x848C, + 0x044B, 0x848D, 0x044C, 0x848E, 0x044D, 0x848F, 0x044E, 0x8490, + 0x044F, 0x8491, 0x0451, 0x8476, 0x2010, 0x815D, 0x2015, 0x815C, + 0x2018, 0x8165, 0x2019, 0x8166, 0x201C, 0x8167, 0x201D, 0x8168, + 0x2020, 0x81F5, 0x2021, 0x81F6, 0x2025, 0x8164, 0x2026, 0x8163, + 0x2030, 0x81F1, 0x2032, 0x818C, 0x2033, 0x818D, 0x203B, 0x81A6, + 0x2103, 0x818E, 0x2116, 0x8782, 0x2121, 0x8784, 0x212B, 0x81F0, + 0x2160, 0x8754, 0x2161, 0x8755, 0x2162, 0x8756, 0x2163, 0x8757, + 0x2164, 0x8758, 0x2165, 0x8759, 0x2166, 0x875A, 0x2167, 0x875B, + 0x2168, 0x875C, 0x2169, 0x875D, 0x2170, 0xFA40, 0x2171, 0xFA41, + 0x2172, 0xFA42, 0x2173, 0xFA43, 0x2174, 0xFA44, 0x2175, 0xFA45, + 0x2176, 0xFA46, 0x2177, 0xFA47, 0x2178, 0xFA48, 0x2179, 0xFA49, + 0x2190, 0x81A9, 0x2191, 0x81AA, 0x2192, 0x81A8, 0x2193, 0x81AB, + 0x21D2, 0x81CB, 0x21D4, 0x81CC, 0x2200, 0x81CD, 0x2202, 0x81DD, + 0x2203, 0x81CE, 0x2207, 0x81DE, 0x2208, 0x81B8, 0x220B, 0x81B9, + 0x2211, 0x8794, 0x221A, 0x81E3, 0x221D, 0x81E5, 0x221E, 0x8187, + 0x221F, 0x8798, 0x2220, 0x81DA, 0x2225, 0x8161, 0x2227, 0x81C8, + 0x2228, 0x81C9, 0x2229, 0x81BF, 0x222A, 0x81BE, 0x222B, 0x81E7, + 0x222C, 0x81E8, 0x222E, 0x8793, 0x2234, 0x8188, 0x2235, 0x81E6, + 0x223D, 0x81E4, 0x2252, 0x81E0, 0x2260, 0x8182, 0x2261, 0x81DF, + 0x2266, 0x8185, 0x2267, 0x8186, 0x226A, 0x81E1, 0x226B, 0x81E2, + 0x2282, 0x81BC, 0x2283, 0x81BD, 0x2286, 0x81BA, 0x2287, 0x81BB, + 0x22A5, 0x81DB, 0x22BF, 0x8799, 0x2312, 0x81DC, 0x2460, 0x8740, + 0x2461, 0x8741, 0x2462, 0x8742, 0x2463, 0x8743, 0x2464, 0x8744, + 0x2465, 0x8745, 0x2466, 0x8746, 0x2467, 0x8747, 0x2468, 0x8748, + 0x2469, 0x8749, 0x246A, 0x874A, 0x246B, 0x874B, 0x246C, 0x874C, + 0x246D, 0x874D, 0x246E, 0x874E, 0x246F, 0x874F, 0x2470, 0x8750, + 0x2471, 0x8751, 0x2472, 0x8752, 0x2473, 0x8753, 0x2500, 0x849F, + 0x2501, 0x84AA, 0x2502, 0x84A0, 0x2503, 0x84AB, 0x250C, 0x84A1, + 0x250F, 0x84AC, 0x2510, 0x84A2, 0x2513, 0x84AD, 0x2514, 0x84A4, + 0x2517, 0x84AF, 0x2518, 0x84A3, 0x251B, 0x84AE, 0x251C, 0x84A5, + 0x251D, 0x84BA, 0x2520, 0x84B5, 0x2523, 0x84B0, 0x2524, 0x84A7, + 0x2525, 0x84BC, 0x2528, 0x84B7, 0x252B, 0x84B2, 0x252C, 0x84A6, + 0x252F, 0x84B6, 0x2530, 0x84BB, 0x2533, 0x84B1, 0x2534, 0x84A8, + 0x2537, 0x84B8, 0x2538, 0x84BD, 0x253B, 0x84B3, 0x253C, 0x84A9, + 0x253F, 0x84B9, 0x2542, 0x84BE, 0x254B, 0x84B4, 0x25A0, 0x81A1, + 0x25A1, 0x81A0, 0x25B2, 0x81A3, 0x25B3, 0x81A2, 0x25BC, 0x81A5, + 0x25BD, 0x81A4, 0x25C6, 0x819F, 0x25C7, 0x819E, 0x25CB, 0x819B, + 0x25CE, 0x819D, 0x25CF, 0x819C, 0x25EF, 0x81FC, 0x2605, 0x819A, + 0x2606, 0x8199, 0x2640, 0x818A, 0x2642, 0x8189, 0x266A, 0x81F4, + 0x266D, 0x81F3, 0x266F, 0x81F2, 0x3000, 0x8140, 0x3001, 0x8141, + 0x3002, 0x8142, 0x3003, 0x8156, 0x3005, 0x8158, 0x3006, 0x8159, + 0x3007, 0x815A, 0x3008, 0x8171, 0x3009, 0x8172, 0x300A, 0x8173, + 0x300B, 0x8174, 0x300C, 0x8175, 0x300D, 0x8176, 0x300E, 0x8177, + 0x300F, 0x8178, 0x3010, 0x8179, 0x3011, 0x817A, 0x3012, 0x81A7, + 0x3013, 0x81AC, 0x3014, 0x816B, 0x3015, 0x816C, 0x301D, 0x8780, + 0x301F, 0x8781, 0x3041, 0x829F, 0x3042, 0x82A0, 0x3043, 0x82A1, + 0x3044, 0x82A2, 0x3045, 0x82A3, 0x3046, 0x82A4, 0x3047, 0x82A5, + 0x3048, 0x82A6, 0x3049, 0x82A7, 0x304A, 0x82A8, 0x304B, 0x82A9, + 0x304C, 0x82AA, 0x304D, 0x82AB, 0x304E, 0x82AC, 0x304F, 0x82AD, + 0x3050, 0x82AE, 0x3051, 0x82AF, 0x3052, 0x82B0, 0x3053, 0x82B1, + 0x3054, 0x82B2, 0x3055, 0x82B3, 0x3056, 0x82B4, 0x3057, 0x82B5, + 0x3058, 0x82B6, 0x3059, 0x82B7, 0x305A, 0x82B8, 0x305B, 0x82B9, + 0x305C, 0x82BA, 0x305D, 0x82BB, 0x305E, 0x82BC, 0x305F, 0x82BD, + 0x3060, 0x82BE, 0x3061, 0x82BF, 0x3062, 0x82C0, 0x3063, 0x82C1, + 0x3064, 0x82C2, 0x3065, 0x82C3, 0x3066, 0x82C4, 0x3067, 0x82C5, + 0x3068, 0x82C6, 0x3069, 0x82C7, 0x306A, 0x82C8, 0x306B, 0x82C9, + 0x306C, 0x82CA, 0x306D, 0x82CB, 0x306E, 0x82CC, 0x306F, 0x82CD, + 0x3070, 0x82CE, 0x3071, 0x82CF, 0x3072, 0x82D0, 0x3073, 0x82D1, + 0x3074, 0x82D2, 0x3075, 0x82D3, 0x3076, 0x82D4, 0x3077, 0x82D5, + 0x3078, 0x82D6, 0x3079, 0x82D7, 0x307A, 0x82D8, 0x307B, 0x82D9, + 0x307C, 0x82DA, 0x307D, 0x82DB, 0x307E, 0x82DC, 0x307F, 0x82DD, + 0x3080, 0x82DE, 0x3081, 0x82DF, 0x3082, 0x82E0, 0x3083, 0x82E1, + 0x3084, 0x82E2, 0x3085, 0x82E3, 0x3086, 0x82E4, 0x3087, 0x82E5, + 0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9, + 0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED, + 0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1, + 0x3094, 0x8394, 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, + 0x309E, 0x8155, 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, + 0x30A4, 0x8343, 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, + 0x30A8, 0x8347, 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, + 0x30AC, 0x834B, 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, + 0x30B0, 0x834F, 0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, + 0x30B4, 0x8353, 0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, + 0x30B8, 0x8357, 0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, + 0x30BC, 0x835B, 0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, + 0x30C0, 0x835F, 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, + 0x30C4, 0x8363, 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, + 0x30C8, 0x8367, 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, + 0x30CC, 0x836B, 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, + 0x30D0, 0x836F, 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, + 0x30D4, 0x8373, 0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, + 0x30D8, 0x8377, 0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, + 0x30DC, 0x837B, 0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, + 0x30E0, 0x8380, 0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, + 0x30E4, 0x8384, 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, + 0x30E8, 0x8388, 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, + 0x30EC, 0x838C, 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, + 0x30F0, 0x8390, 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, + 0x30F4, 0x8394, 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, + 0x30FC, 0x815B, 0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, + 0x3232, 0x878B, 0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, + 0x32A6, 0x8787, 0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, + 0x330D, 0x8769, 0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, + 0x3323, 0x876B, 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, + 0x3336, 0x8766, 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, + 0x334D, 0x8762, 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, + 0x337C, 0x878F, 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, + 0x338F, 0x8773, 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, + 0x33A1, 0x8775, 0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, + 0x4E01, 0x929A, 0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, + 0x4E09, 0x8E4F, 0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, + 0x4E0E, 0x975E, 0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, + 0x4E15, 0x98A1, 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, + 0x4E19, 0x95B8, 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, + 0x4E28, 0xFA68, 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, + 0x4E32, 0x8BF8, 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, + 0x4E3B, 0x8EE5, 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, + 0x4E43, 0x9454, 0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, + 0x4E4E, 0x8CC1, 0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, + 0x4E57, 0x8FE6, 0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, + 0x4E5E, 0x8CEE, 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, + 0x4E73, 0x93FB, 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, + 0x4E85, 0x98AB, 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, + 0x4E8A, 0x98AD, 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, + 0x4E91, 0x895D, 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, + 0x4E98, 0x986A, 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, + 0x4E9E, 0x98B1, 0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, + 0x4EA2, 0x98B4, 0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, + 0x4EA8, 0x8B9C, 0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, + 0x4EAE, 0x97BA, 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, + 0x4EBA, 0x906C, 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, + 0x4EC4, 0x98BA, 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, + 0x4ECB, 0x89EE, 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, + 0x4ED4, 0x8E65, 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, + 0x4ED8, 0x9574, 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, + 0x4EDF, 0x98C0, 0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, + 0x4EE5, 0x88C8, 0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, + 0x4EF2, 0x9287, 0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, + 0x4EFC, 0xFA6A, 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, + 0x4F09, 0x98C2, 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, + 0x4F0F, 0x959A, 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, + 0x4F1C, 0x98E5, 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, + 0x4F34, 0x94BA, 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, + 0x4F3A, 0x8E66, 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, + 0x4F46, 0x9241, 0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, + 0x4F4F, 0x8F5A, 0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, + 0x4F55, 0x89BD, 0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, + 0x4F5A, 0x98C3, 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, + 0x4F5E, 0x9B43, 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, + 0x4F73, 0x89C0, 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, + 0x4F7C, 0x8CF1, 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, + 0x4F88, 0x98CA, 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, + 0x4F8F, 0x98CB, 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, + 0x4F96, 0x98D3, 0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, + 0x4F9D, 0x88CB, 0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, + 0x4FAD, 0x9699, 0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, + 0x4FB6, 0x97B5, 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, + 0x4FC4, 0x89E2, 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, + 0x4FCE, 0x98D7, 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, + 0x4FD7, 0x91AD, 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, + 0x4FDD, 0x95DB, 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, + 0x4FE4, 0x98DD, 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, + 0x4FF3, 0x946F, 0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, + 0x4FFA, 0x89B4, 0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, + 0x5006, 0x98ED, 0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, + 0x500F, 0xE0C5, 0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, + 0x5016, 0x8CF4, 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, + 0x501F, 0x8ED8, 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, + 0x5024, 0x926C, 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, + 0x5029, 0x98E8, 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, + 0x502D, 0x9860, 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, + 0x5042, 0xFA7A, 0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, + 0x5048, 0x98F3, 0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, + 0x5055, 0x98F1, 0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, + 0x5065, 0x8C92, 0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, + 0x5074, 0x91A4, 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, + 0x507D, 0x8B55, 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, + 0x5091, 0x8C86, 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, + 0x509A, 0x98F9, 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, + 0x50B3, 0x9942, 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, + 0x50BE, 0x8C58, 0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, + 0x50CA, 0x9941, 0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, + 0x50D5, 0x966C, 0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, + 0x50DE, 0x9945, 0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, + 0x50ED, 0x9947, 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, + 0x50F9, 0x994A, 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, + 0x5102, 0x994E, 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, + 0x5114, 0x9951, 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, + 0x511A, 0x9952, 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, + 0x5132, 0x96D7, 0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, + 0x513C, 0x9956, 0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, + 0x5143, 0x8CB3, 0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, + 0x5147, 0x8BA2, 0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, + 0x514B, 0x8D8E, 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, + 0x5150, 0x8E99, 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, + 0x515C, 0x8A95, 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, + 0x5168, 0x9153, 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, + 0x516C, 0x8CF6, 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, + 0x5175, 0x95BA, 0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, + 0x517C, 0x8C93, 0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, + 0x5186, 0x897E, 0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, + 0x518D, 0x8DC4, 0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, + 0x5192, 0x9660, 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, + 0x5197, 0x8FE7, 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, + 0x51A2, 0x996E, 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, + 0x51A8, 0x9579, 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, + 0x51AC, 0x937E, 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, + 0x51B3, 0x9972, 0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, + 0x51B7, 0x97E2, 0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, + 0x51C5, 0x9978, 0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, + 0x51CC, 0x97BD, 0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, + 0x51DC, 0xEAA3, 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, + 0x51E6, 0x8F88, 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, + 0x51EC, 0xFA83, 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, + 0x51F5, 0x9981, 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, + 0x51FA, 0x8F6F, 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, + 0x5203, 0x906E, 0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, + 0x5208, 0x8AA0, 0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, + 0x5211, 0x8C59, 0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, + 0x521D, 0x8F89, 0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, + 0x5229, 0x9798, 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, + 0x5233, 0x998A, 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, + 0x5239, 0x998B, 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, + 0x5244, 0x998D, 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, + 0x524C, 0x998F, 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, + 0x5256, 0x9655, 0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, + 0x5264, 0x8DDC, 0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, + 0x526F, 0x959B, 0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, + 0x5273, 0x9995, 0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, + 0x527F, 0x9996, 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, + 0x5289, 0x97AB, 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, + 0x5294, 0x9999, 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, + 0x52A0, 0x89C1, 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, + 0x52AA, 0x9377, 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, + 0x52AF, 0xFB77, 0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, + 0x52B9, 0x8CF8, 0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, + 0x52C1, 0x99A4, 0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, + 0x52C9, 0x95D7, 0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, + 0x52D7, 0x99A6, 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, + 0x52DD, 0x8F9F, 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, + 0x52E2, 0x90A8, 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, + 0x52E7, 0x8AA9, 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, + 0x52F8, 0x99AE, 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, + 0x52FF, 0x96DC, 0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, + 0x5305, 0x95EF, 0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, + 0x530D, 0x99B3, 0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, + 0x5316, 0x89BB, 0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, + 0x531D, 0x9178, 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, + 0x5324, 0xFA8B, 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, + 0x5333, 0x99BB, 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, + 0x533B, 0x88E3, 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, + 0x5343, 0x90E7, 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, + 0x5348, 0x8CDF, 0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, + 0x5351, 0x94DA, 0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, + 0x5357, 0x93EC, 0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, + 0x535E, 0x99C4, 0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, + 0x536E, 0x99C6, 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, + 0x5372, 0xFA8C, 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, + 0x5377, 0x99C9, 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, + 0x5382, 0x99CA, 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, + 0x5398, 0x97D0, 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, + 0x53A5, 0x99CE, 0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, + 0x53AD, 0x897D, 0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, + 0x53B3, 0x8CB5, 0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, + 0x53C3, 0x99D2, 0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, + 0x53CB, 0x9746, 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, + 0x53D4, 0x8F66, 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, + 0x53DB, 0x94BE, 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, + 0x53E2, 0x9170, 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, + 0x53E8, 0x99D9, 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, + 0x53EC, 0x8FA2, 0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, + 0x53F0, 0x91E4, 0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, + 0x53F6, 0x8A90, 0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, + 0x5401, 0x99DC, 0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, + 0x5409, 0x8B67, 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, + 0x540D, 0x96BC, 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, + 0x5411, 0x8CFC, 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, + 0x5420, 0x9669, 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, + 0x542C, 0x99DF, 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, + 0x5438, 0x8B7A, 0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, + 0x543D, 0x99DD, 0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, + 0x5446, 0x95F0, 0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, + 0x544E, 0x99E6, 0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, + 0x546A, 0x8EF4, 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, + 0x5475, 0x99E8, 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, + 0x547C, 0x8CC4, 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, + 0x5486, 0x99F4, 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, + 0x548E, 0x99E9, 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, + 0x549C, 0xFA91, 0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, + 0x54A8, 0x99FC, 0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, + 0x54AF, 0x9A5D, 0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, + 0x54BC, 0x9A44, 0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, + 0x54C1, 0x9569, 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, + 0x54C8, 0x99FB, 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, + 0x54E2, 0x9A4E, 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, + 0x54E9, 0x9689, 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, + 0x54FA, 0x9A4D, 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, + 0x5506, 0x8DB4, 0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, + 0x5514, 0x9A49, 0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, + 0x5531, 0x8FA5, 0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, + 0x553E, 0x91C1, 0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, + 0x5546, 0x8FA4, 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, + 0x5556, 0x9A56, 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, + 0x5563, 0x9A51, 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, + 0x5580, 0x9A5C, 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, + 0x5587, 0x9A68, 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, + 0x5598, 0x9A62, 0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, + 0x559D, 0x8A85, 0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, + 0x55A8, 0x9A69, 0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, + 0x55AC, 0x8BAA, 0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, + 0x55C4, 0x9A6D, 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, + 0x55DA, 0x9A6A, 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, + 0x55E4, 0x9A6F, 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, + 0x55FE, 0x9A74, 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, + 0x5616, 0x9A73, 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, + 0x5629, 0x89DC, 0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, + 0x5634, 0x9A7B, 0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, + 0x564C, 0x9158, 0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, + 0x5664, 0x9A81, 0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, + 0x566C, 0x9A83, 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, + 0x5680, 0x9A86, 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, + 0x568F, 0x9A8A, 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, + 0x56A5, 0x9A8B, 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, + 0x56BC, 0x9A90, 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, + 0x56C3, 0x9A92, 0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, + 0x56D3, 0x9A97, 0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, + 0x56DB, 0x8E6C, 0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, + 0x56EE, 0x9A99, 0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, + 0x56F9, 0x9A9A, 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, + 0x5700, 0x9A9B, 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, + 0x5709, 0x9A9E, 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, + 0x5712, 0x8980, 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, + 0x571C, 0x9AA6, 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, + 0x5728, 0x8DDD, 0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, + 0x5738, 0x9AA9, 0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, + 0x5747, 0x8BCF, 0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, + 0x5750, 0x8DBF, 0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, + 0x5764, 0x8DA3, 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, + 0x576A, 0x92D8, 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, + 0x5789, 0x9AB3, 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, + 0x57A2, 0x8D43, 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, + 0x57AC, 0xFA98, 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, + 0x57C3, 0x9ABA, 0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, + 0x57CB, 0x9684, 0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, + 0x57D4, 0x9ABC, 0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, + 0x57E0, 0x9575, 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, + 0x57F9, 0x947C, 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, + 0x5802, 0x93B0, 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, + 0x580B, 0x9AC2, 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, + 0x5821, 0x9AC6, 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, + 0x5830, 0x8981, 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, + 0x583A, 0x8DE4, 0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, + 0x584A, 0x89F2, 0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, + 0x5854, 0x9383, 0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, + 0x585A, 0x92CB, 0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, + 0x586B, 0x9355, 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, + 0x5879, 0x9ACD, 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, + 0x5893, 0x95E6, 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, + 0x589F, 0x9AD0, 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, + 0x58B2, 0xFA9E, 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, + 0x58BA, 0x9AD2, 0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, + 0x58C5, 0x9AD7, 0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, + 0x58D1, 0x9AD9, 0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, + 0x58D8, 0x9ADC, 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, + 0x58DF, 0x9AE0, 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, + 0x58EC, 0x9070, 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, + 0x58F1, 0x88EB, 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, + 0x58FA, 0x9AE2, 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, + 0x5902, 0x9AE7, 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, + 0x590F, 0x89C4, 0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, + 0x5918, 0x99C7, 0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, + 0x591C, 0x96E9, 0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, + 0x5929, 0x9356, 0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, + 0x592D, 0x9AEE, 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, + 0x5937, 0x88CE, 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, + 0x5947, 0x8AEF, 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, + 0x594F, 0x9174, 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, + 0x5954, 0x967A, 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, + 0x595A, 0x9AF6, 0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, + 0x5962, 0x9AF8, 0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, + 0x5968, 0x8FA7, 0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, + 0x596E, 0x95B1, 0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, + 0x597D, 0x8D44, 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, + 0x5984, 0x96CF, 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, + 0x5996, 0x9764, 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, + 0x59A3, 0x9B45, 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, + 0x59AC, 0x9369, 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, + 0x59BB, 0x8DC8, 0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, + 0x59CB, 0x8E6E, 0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, + 0x59D4, 0x88CF, 0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, + 0x59E5, 0x8957, 0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, + 0x59EB, 0x9550, 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, + 0x5A01, 0x88D0, 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, + 0x5A18, 0x96BA, 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, + 0x5A20, 0x9050, 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, + 0x5A35, 0x9B56, 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, + 0x5A41, 0x984B, 0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, + 0x5A62, 0x9B58, 0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, + 0x5A7F, 0x96B9, 0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, + 0x5ABC, 0x9B5B, 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, + 0x5AC2, 0x9B5E, 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, + 0x5AD0, 0x9B6B, 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, + 0x5AE3, 0x9B60, 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, + 0x5AFB, 0x9B66, 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, + 0x5B16, 0x9B69, 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, + 0x5B30, 0x8964, 0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, + 0x5B40, 0x9B71, 0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, + 0x5B51, 0x9B72, 0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, + 0x5B57, 0x8E9A, 0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, + 0x5B5C, 0x8E79, 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, + 0x5B64, 0x8CC7, 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, + 0x5B6B, 0x91B7, 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, + 0x5B75, 0x9B7A, 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, + 0x5B83, 0x9B80, 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, + 0x5B89, 0x88C0, 0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, + 0x5B8F, 0x8D47, 0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, + 0x5B99, 0x9288, 0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, + 0x5B9D, 0x95F3, 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, + 0x5BA4, 0x8EBA, 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, + 0x5BB0, 0x8DC9, 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, + 0x5BB6, 0x89C6, 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, + 0x5BC0, 0xFAA7, 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, + 0x5BC5, 0x93D0, 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, + 0x5BCC, 0x9578, 0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, + 0x5BD4, 0x9B86, 0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, + 0x5BDE, 0x9B8B, 0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, + 0x5BE4, 0x9B88, 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, + 0x5BE8, 0x9ECB, 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, + 0x5BEE, 0x97BE, 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, + 0x5BF6, 0x9B8F, 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, + 0x5BFF, 0x8EF5, 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, + 0x5C05, 0x9B91, 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, + 0x5C09, 0x88D1, 0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, + 0x5C0E, 0x93B1, 0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, + 0x5C16, 0x90EB, 0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, + 0x5C22, 0x9B97, 0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, + 0x5C31, 0x8F41, 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, + 0x5C3B, 0x904B, 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, + 0x5C3F, 0x9441, 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, + 0x5C46, 0x9B9C, 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, + 0x5C4D, 0x8E72, 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, + 0x5C51, 0x8BFB, 0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, + 0x5C60, 0x936A, 0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, + 0x5C6C, 0x9BA2, 0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, + 0x5C76, 0x9BA5, 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, + 0x5C91, 0x9BA8, 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, + 0x5CA8, 0x915A, 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, + 0x5CB1, 0x91D0, 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, + 0x5CB8, 0x8ADD, 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, + 0x5CBE, 0x9BB1, 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, + 0x5CE0, 0x93BB, 0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, + 0x5CEA, 0x9BB9, 0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, + 0x5CF5, 0xFAAE, 0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, + 0x5CFD, 0x9BB5, 0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, + 0x5D11, 0x9BC0, 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, + 0x5D17, 0x9BBC, 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, + 0x5D1B, 0x9BBF, 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, + 0x5D29, 0x95F6, 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, + 0x5D4E, 0x9BC8, 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, + 0x5D5C, 0x9BBD, 0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, + 0x5D6F, 0x8DB5, 0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, + 0x5D84, 0x9BCE, 0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, + 0x5D90, 0x9BD5, 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, + 0x5DAE, 0x9BD3, 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, + 0x5DBA, 0x97E4, 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, + 0x5DCC, 0x8ADE, 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, + 0x5DD3, 0x9BDA, 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, + 0x5DDE, 0x8F42, 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, + 0x5DE6, 0x8DB6, 0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, + 0x5DEE, 0x8DB7, 0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, + 0x5DF4, 0x9462, 0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, + 0x5DFD, 0x9246, 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, + 0x5E06, 0x94BF, 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, + 0x5E16, 0x929F, 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, + 0x5E1D, 0x92E9, 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, + 0x5E2F, 0x91D1, 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, + 0x5E37, 0x9BE7, 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, + 0x5E43, 0x9BE9, 0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, + 0x5E4C, 0x9679, 0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, + 0x5E57, 0x9BEC, 0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, + 0x5E63, 0x95BC, 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, + 0x5E74, 0x944E, 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, + 0x5E79, 0x8AB2, 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, + 0x5E7D, 0x9748, 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, + 0x5E83, 0x8D4C, 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, + 0x5E8F, 0x8F98, 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, + 0x5E9A, 0x8D4D, 0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, + 0x5EA7, 0x8DC0, 0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, + 0x5EB6, 0x8F8E, 0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, + 0x5EC2, 0x9BF9, 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, + 0x5ECA, 0x984C, 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, + 0x5ED6, 0x9C40, 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, + 0x5EDF, 0x955F, 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, + 0x5EE3, 0x9C41, 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, + 0x5EF0, 0x9C4C, 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, + 0x5EF6, 0x8984, 0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, + 0x5EFB, 0x89F4, 0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, + 0x5F01, 0x95D9, 0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, + 0x5F0A, 0x95BE, 0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, + 0x5F0F, 0x8EAE, 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, + 0x5F14, 0x92A2, 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, + 0x5F18, 0x8D4F, 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, + 0x5F25, 0x96ED, 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, + 0x5F2D, 0x9C58, 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, + 0x5F35, 0x92A3, 0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, + 0x5F3E, 0x9265, 0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, + 0x5F4A, 0x8BAE, 0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, + 0x5F53, 0x9396, 0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, + 0x5F5C, 0x9C53, 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, + 0x5F66, 0x9546, 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, + 0x5F6B, 0x92A4, 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, + 0x5F71, 0x8965, 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, + 0x5F7C, 0x94DE, 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, + 0x5F82, 0x9C68, 0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, + 0x5F87, 0x9C6D, 0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, + 0x5F8C, 0x8CE3, 0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, + 0x5F93, 0x8F5D, 0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, + 0x5F9E, 0x9C6E, 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, + 0x5FA9, 0x959C, 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, + 0x5FB3, 0x93BF, 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, + 0x5FBC, 0x9C74, 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, + 0x5FCC, 0x8AF5, 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, + 0x5FD8, 0x9659, 0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, + 0x5FDE, 0xFABB, 0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, + 0x5FF0, 0x9CAB, 0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, + 0x5FFB, 0x9C76, 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, + 0x600F, 0x9C89, 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, + 0x6016, 0x957C, 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, + 0x601D, 0x8E76, 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, + 0x6026, 0x9C88, 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, + 0x602A, 0x89F6, 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, + 0x603A, 0x9C8A, 0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, + 0x6046, 0x9C91, 0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, + 0x6050, 0x8BB0, 0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, + 0x605A, 0x9C8B, 0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, + 0x6062, 0x89F8, 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, + 0x6068, 0x8DA6, 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, + 0x606C, 0x9C97, 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, + 0x6075, 0x8C62, 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, + 0x6084, 0x9C9F, 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, + 0x608B, 0x9CA5, 0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, + 0x6094, 0x89F7, 0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, + 0x609B, 0x9CA0, 0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, + 0x60A6, 0x8978, 0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, + 0x60B2, 0x94DF, 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, + 0x60B6, 0x96E3, 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, + 0x60C5, 0x8FEE, 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, + 0x60D3, 0x9CA9, 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, + 0x60DC, 0x90C9, 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, + 0x60E1, 0x9CA6, 0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, + 0x60F0, 0x91C4, 0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, + 0x60F4, 0x9CB6, 0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, + 0x60FA, 0x9CB7, 0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, + 0x6103, 0x9CB8, 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, + 0x610D, 0x9CBC, 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, + 0x6115, 0x9CB1, 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, + 0x6120, 0xFAC1, 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, + 0x612C, 0x9CC5, 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, + 0x613C, 0x9CC4, 0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, + 0x6142, 0x9CC8, 0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, + 0x614A, 0x9CC2, 0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, + 0x614E, 0x9054, 0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, + 0x6159, 0x9CCD, 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, + 0x6162, 0x969D, 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, + 0x6168, 0x8A53, 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, + 0x6170, 0x88D4, 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, + 0x6175, 0x9CD7, 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, + 0x6182, 0x974A, 0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, + 0x6190, 0x97F7, 0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, + 0x6198, 0xFAC6, 0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, + 0x61A7, 0x93B2, 0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, + 0x61AE, 0x9CE1, 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, + 0x61BE, 0x8AB6, 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, + 0x61C8, 0x9CE6, 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, + 0x61CC, 0x9CE2, 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, + 0x61E6, 0x9CED, 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, + 0x61F7, 0x9CE5, 0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, + 0x61FD, 0x9CF3, 0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, + 0x6208, 0x9CF7, 0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, + 0x620D, 0x9CF9, 0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, + 0x6212, 0x89FA, 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, + 0x621A, 0x90CA, 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, + 0x621F, 0x8C81, 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, + 0x622E, 0x9D43, 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, + 0x6233, 0x9D46, 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, + 0x623F, 0x965B, 0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, + 0x6248, 0xE7BB, 0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, + 0x624E, 0x9D48, 0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, + 0x625B, 0x9D4B, 0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, + 0x6268, 0x9D4D, 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, + 0x6279, 0x94E1, 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, + 0x6280, 0x8B5A, 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, + 0x6289, 0x9D50, 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, + 0x6293, 0x9D53, 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, + 0x6297, 0x8D52, 0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, + 0x629E, 0x91F0, 0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, + 0x62B1, 0x95F8, 0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, + 0x62BC, 0x899F, 0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, + 0x62C6, 0x9D5D, 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, + 0x62CA, 0x9D62, 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, + 0x62D0, 0x89FB, 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, + 0x62D4, 0x9D55, 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, + 0x62DB, 0x8FB5, 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, + 0x62E1, 0x8A67, 0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, + 0x62EF, 0x9D6D, 0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, + 0x62F6, 0x8E41, 0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, + 0x6301, 0x8E9D, 0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, + 0x6309, 0x88C2, 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, + 0x631F, 0x8BB2, 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, + 0x632F, 0x9055, 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, + 0x633F, 0x917D, 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, + 0x634F, 0x9D73, 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, + 0x635C, 0x917B, 0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, + 0x636B, 0x9D7E, 0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, + 0x6377, 0x8FB7, 0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, + 0x6383, 0x917C, 0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, + 0x638E, 0x9D75, 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, + 0x6398, 0x8C40, 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, + 0x63A1, 0x8DCC, 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, + 0x63A7, 0x8D54, 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, + 0x63AB, 0x9D77, 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, + 0x63B5, 0x9D7D, 0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, + 0x63C3, 0x91B5, 0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, + 0x63CF, 0x9560, 0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, + 0x63DA, 0x9767, 0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, + 0x63E9, 0x9D82, 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, + 0x63F6, 0x9D88, 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, + 0x640F, 0x9D93, 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, + 0x641C, 0x9D72, 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, + 0x642D, 0x938B, 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, + 0x643E, 0x8DEF, 0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, + 0x6460, 0xFACA, 0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, + 0x6476, 0x9D96, 0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, + 0x6488, 0x9D9D, 0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, + 0x649A, 0x9451, 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, + 0x64A5, 0x9D9B, 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, + 0x64AE, 0x8E42, 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, + 0x64BB, 0x9DA3, 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, + 0x64C5, 0x9DA1, 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, + 0x64D2, 0x9DA0, 0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, + 0x64E0, 0x9DA9, 0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, + 0x64E6, 0x8E43, 0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, + 0x64F1, 0x9DA6, 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, + 0x64FA, 0x9DB2, 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, + 0x6505, 0x9DB7, 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, + 0x6523, 0x9DB9, 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, + 0x652C, 0x9DAE, 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, + 0x6536, 0x9DBE, 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, + 0x653B, 0x8D55, 0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, + 0x6548, 0x9DC1, 0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, + 0x6551, 0x8B7E, 0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, + 0x6558, 0x9DC5, 0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, + 0x6562, 0x8AB8, 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, + 0x6570, 0x9094, 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, + 0x6577, 0x957E, 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, + 0x6587, 0x95B6, 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, + 0x658E, 0x8DD6, 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, + 0x6599, 0x97BF, 0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, + 0x65A1, 0x88B4, 0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, + 0x65AB, 0x9DCF, 0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, + 0x65B0, 0x9056, 0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, + 0x65BD, 0x8E7B, 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, + 0x65C5, 0x97B7, 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, + 0x65CF, 0x91B0, 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, + 0x65DB, 0x9DD7, 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, + 0x65E5, 0x93FA, 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, + 0x65E9, 0x9181, 0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, + 0x65FA, 0x89A0, 0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, + 0x6603, 0x9DDE, 0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, + 0x660A, 0x9DDD, 0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, + 0x6613, 0x88D5, 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, + 0x661E, 0xFAD3, 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, + 0x6625, 0x8F74, 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, + 0x662E, 0xFAD2, 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, + 0x6635, 0x9DE1, 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, + 0x663F, 0x9E45, 0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, + 0x6644, 0x9DE6, 0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, + 0x6652, 0x8E4E, 0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, + 0x665E, 0x9DE9, 0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, + 0x6665, 0xFAD5, 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, + 0x6669, 0x94D3, 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, + 0x6673, 0xFAD9, 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, + 0x6681, 0x8BC5, 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, + 0x6688, 0x9DF2, 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, + 0x6696, 0x9267, 0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, + 0x669D, 0x9DF7, 0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, + 0x66AB, 0x8E62, 0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, + 0x66B8, 0x9E41, 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, + 0x66BF, 0xFADD, 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, + 0x66C9, 0x9DFA, 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, + 0x66DC, 0x976A, 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, + 0x66E9, 0x9E47, 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, + 0x66F4, 0x8D58, 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, + 0x66F9, 0x9182, 0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, + 0x66FD, 0x915D, 0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, + 0x6703, 0x98F0, 0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, + 0x670D, 0x959E, 0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, + 0x6715, 0x92BD, 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, + 0x671D, 0x92A9, 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, + 0x6727, 0x9E4F, 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, + 0x672C, 0x967B, 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, + 0x6734, 0x9670, 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, + 0x673A, 0x8AF7, 0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, + 0x6746, 0x9E57, 0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, + 0x6750, 0x8DDE, 0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, + 0x6759, 0x9E5A, 0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, + 0x6760, 0x9E59, 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, + 0x6764, 0x9E5C, 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, + 0x676D, 0x8D59, 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, + 0x6772, 0x9DDC, 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, + 0x677C, 0x9E60, 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, + 0x6787, 0x94F8, 0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, + 0x6790, 0x90CD, 0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, + 0x679C, 0x89CA, 0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, + 0x67A2, 0x9095, 0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, + 0x67B3, 0x9E6B, 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, + 0x67B8, 0x9E6D, 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, + 0x67C1, 0x91C6, 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, + 0x67CE, 0x9E74, 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, + 0x67D3, 0x90F5, 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, + 0x67DD, 0x9E70, 0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, + 0x67E7, 0x9E76, 0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, + 0x67EF, 0x9E68, 0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, + 0x67F5, 0x8DF2, 0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, + 0x6801, 0xFAE5, 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, + 0x6813, 0x90F0, 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, + 0x6821, 0x8D5A, 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, + 0x682B, 0x9E81, 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, + 0x6839, 0x8DAA, 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, + 0x6841, 0x8C85, 0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, + 0x6846, 0x9E79, 0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, + 0x6850, 0x8BCB, 0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, + 0x6854, 0x8B6A, 0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, + 0x685F, 0x8E56, 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, + 0x6876, 0x89B1, 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, + 0x6881, 0x97C0, 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, + 0x688F, 0x9E87, 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, + 0x689B, 0x9E8B, 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, + 0x68A2, 0x8FBD, 0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, + 0x68AD, 0x9E88, 0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, + 0x68B3, 0x9E80, 0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, + 0x68BA, 0x9E92, 0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, + 0x68C8, 0xFA64, 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, + 0x68CD, 0x9E9E, 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, + 0x68D5, 0x9EA1, 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, + 0x68DF, 0x938F, 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, + 0x68E7, 0x9EA0, 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, + 0x68F9, 0x9EA8, 0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, + 0x6904, 0x9EA4, 0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, + 0x690C, 0x9E9D, 0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, + 0x6912, 0x9EA3, 0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, + 0x691C, 0x8C9F, 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, + 0x6925, 0x9EA7, 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, + 0x6930, 0x9EBD, 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, + 0x693D, 0x9EBB, 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, + 0x6954, 0x9EB6, 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, + 0x695C, 0x9EB3, 0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, + 0x6961, 0x9EBE, 0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, + 0x696B, 0x9EB5, 0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, + 0x6973, 0x9480, 0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, + 0x6978, 0x9EB4, 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, + 0x697E, 0x9EB7, 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, + 0x698E, 0x897C, 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, + 0x6998, 0xFAEB, 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, + 0x69A7, 0x9ED0, 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, + 0x69B4, 0x9ED6, 0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, + 0x69C1, 0x9EC7, 0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, + 0x69CB, 0x8D5C, 0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, + 0x69D0, 0x9EC5, 0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, + 0x69DD, 0x9ECD, 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, + 0x69E8, 0x9ED8, 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, + 0x69F9, 0x9EDD, 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, + 0x6A02, 0x9ED9, 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, + 0x6A0C, 0x9EEC, 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, + 0x6A17, 0x9294, 0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, + 0x6A1F, 0x8FBE, 0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, + 0x6A29, 0x8CA0, 0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, + 0x6A30, 0xFAED, 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, + 0x6A39, 0x8EF7, 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, + 0x6A46, 0xFAEF, 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, + 0x6A58, 0x8B6B, 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, + 0x6A62, 0x9EF1, 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, + 0x6A73, 0xFAF0, 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, + 0x6A80, 0x9268, 0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, + 0x6A90, 0x9EF7, 0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, + 0x6AA2, 0x9EFB, 0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, + 0x6AAE, 0x9E8D, 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, + 0x6AC1, 0x9EE8, 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, + 0x6AD3, 0x9845, 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, + 0x6ADF, 0x9F4A, 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, + 0x6AEA, 0x9F4D, 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, + 0x6B05, 0x9F4F, 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, + 0x6B1D, 0x8954, 0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, + 0x6B23, 0x8BD3, 0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, + 0x6B38, 0x9F56, 0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, + 0x6B3E, 0x8ABC, 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, + 0x6B4C, 0x89CC, 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, + 0x6B54, 0x9F60, 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, + 0x6B61, 0x9F63, 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, + 0x6B66, 0x9590, 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, + 0x6B73, 0x8DCE, 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, + 0x6B7B, 0x8E80, 0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, + 0x6B84, 0x9F68, 0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, + 0x6B8B, 0x8E63, 0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, + 0x6B98, 0x9F6B, 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, + 0x6BAB, 0x9F70, 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, + 0x6BB3, 0x9F74, 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, + 0x6BBA, 0x8E45, 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, + 0x6BC0, 0x9ACA, 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, + 0x6BCD, 0x95EA, 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, + 0x6BD4, 0x94E4, 0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, + 0x6BDF, 0x9F7A, 0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, + 0x6BF3, 0x9F7D, 0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, + 0x6C13, 0x9F82, 0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, + 0x6C23, 0x9F86, 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, + 0x6C38, 0x8969, 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, + 0x6C41, 0x8F60, 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, + 0x6C55, 0x9F88, 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, + 0x6C5D, 0x93F0, 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, + 0x6C62, 0x9F89, 0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, + 0x6C70, 0x91BF, 0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, + 0x6C7D, 0x8B44, 0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, + 0x6C83, 0x9780, 0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, + 0x6C8D, 0x9F8C, 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, + 0x6C96, 0x89AB, 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, + 0x6CA1, 0x9676, 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, + 0x6CB1, 0x9F9D, 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, + 0x6CBA, 0x9F9F, 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, + 0x6CBE, 0x9F9E, 0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, + 0x6CC5, 0x9F9A, 0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, + 0x6CD3, 0x9F97, 0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, + 0x6CDA, 0xFAF9, 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, + 0x6CE2, 0x9467, 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, + 0x6CEA, 0x9FA3, 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, + 0x6CF3, 0x896A, 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, + 0x6D12, 0x9FAD, 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, + 0x6D1E, 0x93B4, 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, + 0x6D2A, 0x8D5E, 0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, + 0x6D35, 0x9FAB, 0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, + 0x6D3D, 0x9FA8, 0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, + 0x6D45, 0x90F3, 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, + 0x6D63, 0x9FAF, 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, + 0x6D6A, 0x9851, 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, + 0x6D74, 0x9781, 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, + 0x6D85, 0x9FB8, 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, + 0x6D8E, 0x9FB5, 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, + 0x6D99, 0x97DC, 0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, + 0x6DAF, 0x8A55, 0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, + 0x6DBC, 0x97C1, 0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, + 0x6DC7, 0x9FBD, 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, + 0x6DD1, 0x8F69, 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, + 0x6DD9, 0x9FC8, 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, + 0x6DE6, 0x9FBE, 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, + 0x6DEC, 0x9FC1, 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, + 0x6DF3, 0x8F7E, 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, + 0x6DF9, 0x9FB9, 0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, + 0x6E05, 0x90B4, 0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, + 0x6E0A, 0x9FBB, 0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, + 0x6E19, 0x9FD0, 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, + 0x6E1F, 0x9FD9, 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, + 0x6E24, 0x9FDD, 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, + 0x6E29, 0x89B7, 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, + 0x6E2E, 0x9FCF, 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, + 0x6E3A, 0x9FDB, 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, + 0x6E4A, 0x96A9, 0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, + 0x6E58, 0x8FC3, 0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, + 0x6E67, 0x974E, 0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, + 0x6E72, 0x9FD1, 0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, + 0x6E80, 0x969E, 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, + 0x6E90, 0x8CB9, 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, + 0x6E9D, 0x8D61, 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, + 0x6EAA, 0x9FE2, 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, + 0x6EB7, 0x9FE5, 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, + 0x6EC2, 0x9FEF, 0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, + 0x6ECB, 0x8EA0, 0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, + 0x6ED4, 0x9FEB, 0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, + 0x6EEC, 0x9FF4, 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, + 0x6EF7, 0xE042, 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, + 0x6F01, 0x8B99, 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, + 0x6F0F, 0x9852, 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, + 0x6F15, 0x9186, 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, + 0x6F2B, 0x969F, 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, + 0x6F38, 0x9151, 0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, + 0x6F45, 0x8AC1, 0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, + 0x6F5C, 0x90F6, 0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, + 0x6F6D, 0xE04B, 0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, + 0x6F74, 0xE06B, 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, + 0x6F80, 0xE047, 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, + 0x6F86, 0xE043, 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, + 0x6F97, 0x8AC0, 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, + 0x6FAA, 0xE059, 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, + 0x6FB9, 0xE057, 0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, + 0x6FC3, 0x945A, 0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, + 0x6FD8, 0xE05E, 0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, + 0x6FE1, 0x9447, 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, + 0x6FEE, 0xE060, 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, + 0x6FF5, 0xFB4D, 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, + 0x7001, 0xE066, 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, + 0x700B, 0xE063, 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, + 0x7018, 0xE06D, 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, + 0x701E, 0x93D2, 0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, + 0x7028, 0xFB50, 0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, + 0x703E, 0xE070, 0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, + 0x7063, 0xE073, 0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, + 0x7078, 0x8B84, 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, + 0x7089, 0x9846, 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, + 0x7099, 0xE074, 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, + 0x70AE, 0xE07B, 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, + 0x70B9, 0x935F, 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, + 0x70CB, 0xE07D, 0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, + 0x70DF, 0xE07C, 0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, + 0x7104, 0xFB54, 0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, + 0x7119, 0xE084, 0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, + 0x7126, 0x8FC5, 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, + 0x7147, 0xFB57, 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, + 0x7155, 0xE086, 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, + 0x7162, 0xE089, 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, + 0x7167, 0x8FC6, 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, + 0x717D, 0x90F8, 0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, + 0x718F, 0xE08D, 0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, + 0x719F, 0x8F6E, 0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, + 0x71B9, 0xE094, 0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, + 0x71C8, 0x9395, 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, + 0x71D2, 0xE096, 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, + 0x71DF, 0x9A7A, 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, + 0x71E7, 0xE09C, 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, + 0x71F5, 0xE09D, 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, + 0x71FE, 0xFB5A, 0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, + 0x7210, 0xE0A2, 0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, + 0x722C, 0xE0A6, 0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, + 0x7235, 0x8EDD, 0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, + 0x723C, 0xE0AA, 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, + 0x7240, 0xE0AC, 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, + 0x724B, 0xE0AE, 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, + 0x7259, 0x89E5, 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, + 0x7261, 0x89B2, 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, + 0x7272, 0x90B5, 0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, + 0x727E, 0xE0B1, 0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, + 0x7287, 0xE0B4, 0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, + 0x72A2, 0xE0B7, 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, + 0x72B1, 0xFB5B, 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, + 0x72BE, 0xFB5C, 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, + 0x72C6, 0xE0BC, 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, + 0x72D7, 0x8BE7, 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, + 0x72E1, 0xE0C2, 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, + 0x72ED, 0x8BB7, 0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, + 0x72FC, 0x9854, 0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, + 0x7317, 0xE0C6, 0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, + 0x731F, 0x97C2, 0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, + 0x732A, 0x9296, 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, + 0x7334, 0xE0CB, 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, + 0x733F, 0x898E, 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, + 0x734F, 0xE0D1, 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, + 0x736A, 0xE0D4, 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, + 0x7377, 0xFB5F, 0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, + 0x7384, 0x8CBA, 0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, + 0x7396, 0x8BE8, 0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, + 0x73BB, 0xE0DE, 0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, + 0x73C8, 0xE0DB, 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, + 0x73CE, 0xE0DD, 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, + 0x73E0, 0x8EEC, 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, + 0x73ED, 0x94C7, 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, + 0x73F8, 0xE0E7, 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, + 0x7406, 0x979D, 0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, + 0x7425, 0xE0E6, 0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, + 0x742E, 0xFB6A, 0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, + 0x7435, 0x94FA, 0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, + 0x7441, 0xE0EE, 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, + 0x745B, 0x896C, 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, + 0x7460, 0x97DA, 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, + 0x7469, 0xE0F0, 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, + 0x7473, 0x8DBA, 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, + 0x7489, 0xFB6C, 0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, + 0x74A2, 0xE0E3, 0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, + 0x74CA, 0xE0F9, 0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, + 0x74E0, 0xE140, 0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, + 0x74E7, 0xE142, 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, + 0x74F1, 0xE147, 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, + 0x74F8, 0xE148, 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, + 0x7505, 0xE14C, 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, + 0x7511, 0x8D99, 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, + 0x751A, 0x9072, 0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, + 0x7523, 0x8E59, 0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, + 0x752B, 0x95E1, 0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, + 0x7531, 0x9752, 0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, + 0x7538, 0x99B2, 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, + 0x7544, 0xE156, 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, + 0x754B, 0x9DC0, 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, + 0x7551, 0x94A8, 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, + 0x755B, 0xE15A, 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, + 0x7562, 0x954C, 0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, + 0x7567, 0xE15F, 0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, + 0x756D, 0xE161, 0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, + 0x7574, 0xE166, 0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, + 0x757F, 0x8B45, 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, + 0x7589, 0xE168, 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, + 0x758F, 0x9160, 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, + 0x759D, 0xE16C, 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, + 0x75B1, 0xE176, 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, + 0x75B8, 0xE174, 0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, + 0x75BE, 0x8EBE, 0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, + 0x75C7, 0x8FC7, 0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, + 0x75D4, 0x8EA4, 0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, + 0x75DB, 0x92C9, 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, + 0x75E9, 0x9189, 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, + 0x75F4, 0x9273, 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, + 0x75FF, 0xE17E, 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, + 0x760D, 0xE187, 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, + 0x7622, 0xE18D, 0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, + 0x7634, 0xE18F, 0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, + 0x7647, 0xE192, 0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, + 0x7656, 0x95C8, 0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, + 0x7662, 0xE198, 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, + 0x766A, 0xE19B, 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, + 0x7676, 0xE1A0, 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, + 0x767C, 0xE1A2, 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, + 0x7682, 0xFB70, 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, + 0x7687, 0x8D63, 0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, + 0x7690, 0x8E48, 0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, + 0x769A, 0xE1AB, 0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, + 0x76A6, 0xFB74, 0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, + 0x76B7, 0xEA89, 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, + 0x76BF, 0x8E4D, 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, + 0x76C8, 0x896D, 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, + 0x76D6, 0xE1B3, 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, + 0x76DE, 0xE1B5, 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, + 0x76E4, 0x94D5, 0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, + 0x76EE, 0x96DA, 0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, + 0x76FB, 0xE1BB, 0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, + 0x7707, 0xE1BD, 0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, + 0x770C, 0x8CA7, 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, + 0x7720, 0x96B0, 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, + 0x7729, 0xE1BF, 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, + 0x773C, 0x8AE1, 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, + 0x775A, 0xE1C8, 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, + 0x7765, 0xE1CC, 0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, + 0x7779, 0xE1CF, 0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, + 0x778E, 0xE1D0, 0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, + 0x77A5, 0x95CB, 0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, + 0x77B3, 0x93B5, 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, + 0x77BC, 0xE1D9, 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, + 0x77CD, 0xE1DD, 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, + 0x77DC, 0xE1E0, 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, + 0x77E7, 0x948A, 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, + 0x77EF, 0x8BB8, 0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, + 0x780C, 0xE1E4, 0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, + 0x7820, 0xE1E7, 0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, + 0x7827, 0x8B6D, 0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, + 0x783F, 0x8D7B, 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, + 0x7864, 0xFB7A, 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, + 0x7872, 0x94A1, 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, + 0x7881, 0x8CE9, 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, + 0x788D, 0x8A56, 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, + 0x7895, 0x8DEA, 0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, + 0x78A7, 0x95C9, 0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, + 0x78B5, 0xE1F1, 0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, + 0x78C1, 0x8EA5, 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, + 0x78CB, 0xE1F6, 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, + 0x78DA, 0xE241, 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, + 0x78EF, 0x88E9, 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, + 0x7907, 0xE244, 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, + 0x7919, 0xE247, 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, + 0x792C, 0xE248, 0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, + 0x793E, 0x8ED0, 0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, + 0x7948, 0x8B46, 0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, + 0x7955, 0xE24F, 0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, + 0x795D, 0x8F6A, 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, + 0x7962, 0x9449, 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, + 0x7977, 0x9398, 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, + 0x7981, 0x8BD6, 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, + 0x798D, 0x89D0, 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, + 0x799B, 0xFB83, 0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, + 0x79AA, 0xE257, 0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, + 0x79B9, 0xE25A, 0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, + 0x79BF, 0x93C3, 0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, + 0x79CB, 0x8F48, 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, + 0x79D8, 0x94E9, 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, + 0x79E4, 0x9489, 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, + 0x79EC, 0xE25F, 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, + 0x7A08, 0xE262, 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, + 0x7A14, 0x96AB, 0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, + 0x7A1A, 0x9274, 0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, + 0x7A2E, 0x8EED, 0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, + 0x7A3B, 0xE26A, 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, + 0x7A3F, 0x8D65, 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, + 0x7A46, 0x9673, 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, + 0x7A4F, 0x89B8, 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, + 0x7A62, 0xE271, 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, + 0x7A70, 0xE274, 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, + 0x7A7A, 0x8BF3, 0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, + 0x7A83, 0x90DE, 0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, + 0x7A93, 0x918B, 0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, + 0x7A98, 0xE27A, 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, + 0x7AAE, 0x8B87, 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, + 0x7ABA, 0x894D, 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, + 0x7AC5, 0xE281, 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, + 0x7ACB, 0x97A7, 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, + 0x7AD2, 0x9AF2, 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, + 0x7ADA, 0xE28C, 0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, + 0x7AE0, 0x8FCD, 0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, + 0x7AE5, 0x93B6, 0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, + 0x7AEB, 0xFB87, 0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, + 0x7AF6, 0x8BA3, 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, + 0x7AFF, 0x8AC6, 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, + 0x7B08, 0x8B88, 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, + 0x7B11, 0x8FCE, 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, + 0x7B1E, 0xE29A, 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, + 0x7B28, 0xE29C, 0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, + 0x7B36, 0xE29D, 0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, + 0x7B48, 0x94A4, 0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, + 0x7B4D, 0xE2A1, 0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, + 0x7B52, 0x939B, 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, + 0x7B65, 0xE2A6, 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, + 0x7B70, 0xE2A9, 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, + 0x7B7A, 0xE29F, 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, + 0x7B8D, 0xE2B0, 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, + 0x7B95, 0x96A5, 0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, + 0x7B9A, 0xE2B2, 0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, + 0x7B9F, 0xE2AF, 0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, + 0x7BB1, 0x94A0, 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, + 0x7BC1, 0xE2B9, 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, + 0x7BC9, 0x927A, 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, + 0x7BDD, 0xE2BE, 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, + 0x7BE6, 0xE2C2, 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, + 0x7BF6, 0xE2CC, 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, + 0x7C0D, 0xE2CB, 0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, + 0x7C14, 0xE2C1, 0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, + 0x7C23, 0xE2CD, 0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, + 0x7C37, 0xE2D1, 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, + 0x7C3F, 0x95EB, 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, + 0x7C4D, 0x90D0, 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, + 0x7C56, 0xE2DD, 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, + 0x7C64, 0xE2DC, 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, + 0x7C75, 0xE2E0, 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, + 0x7C83, 0xE2E1, 0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, + 0x7C90, 0xE2E2, 0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, + 0x7C98, 0x9453, 0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, + 0x7CA2, 0xE2E5, 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, + 0x7CA8, 0xE2E8, 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, + 0x7CB1, 0xE2EB, 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, + 0x7CBD, 0xE2EE, 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, + 0x7CC5, 0xE2F0, 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, + 0x7CD6, 0x939C, 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, + 0x7CDF, 0x918C, 0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, + 0x7CEF, 0xE2F7, 0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, + 0x7CF8, 0x8E85, 0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, + 0x7D00, 0x8B49, 0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, + 0x7D06, 0xE2FC, 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, + 0x7D10, 0x9552, 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, + 0x7D18, 0x8D68, 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, + 0x7D1C, 0xE341, 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, + 0x7D2B, 0x8E87, 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, + 0x7D30, 0x8DD7, 0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, + 0x7D39, 0x8FD0, 0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, + 0x7D43, 0x8CBC, 0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, + 0x7D48, 0xFB8A, 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, + 0x7D4F, 0xE351, 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, + 0x7D5C, 0xFB8B, 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, + 0x7D63, 0xE352, 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, + 0x7D71, 0x939D, 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, + 0x7D76, 0x90E2, 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, + 0x7D8F, 0xE356, 0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, + 0x7D9B, 0xE358, 0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, + 0x7DA2, 0xE361, 0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, + 0x7DAD, 0x88DB, 0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, + 0x7DB1, 0x8D6A, 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, + 0x7DB7, 0xFB8C, 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, + 0x7DBD, 0xE35E, 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, + 0x7DCA, 0x8BD9, 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, + 0x7DD2, 0x8F8F, 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, + 0x7DDA, 0x90FC, 0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, + 0x7DE0, 0x92F7, 0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, + 0x7DE9, 0x8AC9, 0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, + 0x7DF4, 0x97FB, 0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, + 0x7E05, 0xE36E, 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, + 0x7E12, 0xE372, 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, + 0x7E21, 0xE371, 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, + 0x7E2B, 0x9644, 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, + 0x7E35, 0xE37B, 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, + 0x7E3B, 0xE37A, 0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, + 0x7E43, 0xE37D, 0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, + 0x7E4D, 0x8F4A, 0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, + 0x7E56, 0xE384, 0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, + 0x7E5E, 0xE385, 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, + 0x7E6A, 0xE389, 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, + 0x7E7B, 0xE38C, 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, + 0x7E82, 0x8E5B, 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, + 0x7E8A, 0xFA5C, 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, + 0x7E90, 0xE396, 0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, + 0x7E96, 0xE399, 0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, + 0x7F38, 0xE39D, 0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, + 0x7F4C, 0xE3A0, 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, + 0x7F51, 0xE3A4, 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, + 0x7F5F, 0xE3A8, 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, + 0x7F69, 0xE3AB, 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, + 0x7F70, 0x94B1, 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, + 0x7F78, 0xE3AD, 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, + 0x7F85, 0x9785, 0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, + 0x7F8A, 0x9772, 0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, + 0x7F9A, 0xE3B7, 0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, + 0x7FA3, 0xE3B8, 0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, + 0x7FAE, 0xE3BC, 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, + 0x7FB8, 0xE3BE, 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, + 0x7FC5, 0xE3C0, 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, + 0x7FD2, 0x8F4B, 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, + 0x7FE1, 0xE3C5, 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, + 0x7FF0, 0x8ACB, 0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, + 0x7FFC, 0x9783, 0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, + 0x8004, 0xE3CC, 0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, + 0x800C, 0x8EA7, 0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, + 0x8017, 0x96D5, 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, + 0x8021, 0xE3D2, 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, + 0x803B, 0xE3D5, 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, + 0x804A, 0xE3D6, 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, + 0x805A, 0xE3DA, 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, + 0x8062, 0xE3DC, 0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, + 0x8072, 0xE3DF, 0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, + 0x8077, 0x9045, 0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, + 0x807F, 0xE3E4, 0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, + 0x8087, 0x94A3, 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, + 0x8093, 0xE3E9, 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, + 0x809B, 0xE3E8, 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, + 0x80A5, 0x94EC, 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, + 0x80AD, 0xE3EB, 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, + 0x80B4, 0x8DE6, 0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, + 0x80C6, 0x925F, 0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, + 0x80D9, 0xE3F0, 0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, + 0x80DE, 0x9645, 0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, + 0x80EF, 0xE3F6, 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, + 0x80FC, 0xE445, 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, + 0x8106, 0x90C6, 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, + 0x810A, 0x90D2, 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, + 0x8129, 0xE3F9, 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, + 0x8139, 0x92AF, 0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, + 0x814E, 0x9074, 0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, + 0x8154, 0x8D6F, 0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, + 0x8166, 0xE449, 0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, + 0x8171, 0xE446, 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, + 0x817A, 0x9142, 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, + 0x8183, 0xE44B, 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, + 0x8193, 0xE455, 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, + 0x819D, 0x9547, 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, + 0x81A8, 0x9663, 0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, + 0x81B5, 0xE458, 0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, + 0x81BE, 0xE459, 0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, + 0x81C6, 0x89B0, 0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, + 0x81D1, 0xE461, 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, + 0x81DA, 0xE465, 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, + 0x81E5, 0x89E7, 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, + 0x81ED, 0x8F4C, 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, + 0x81FB, 0xE46A, 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, + 0x8202, 0xE46D, 0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, + 0x8209, 0x9DA8, 0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, + 0x820E, 0x8EC9, 0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, + 0x8217, 0x95DC, 0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, + 0x821E, 0x9591, 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, + 0x822B, 0xE475, 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, + 0x8235, 0x91C7, 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, + 0x8239, 0x9144, 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, + 0x8259, 0xE479, 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, + 0x8262, 0xE480, 0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, + 0x826A, 0xE482, 0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, + 0x8271, 0xE485, 0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, + 0x8278, 0xE487, 0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, + 0x8292, 0xE48A, 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, + 0x82A5, 0x8A48, 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, + 0x82AD, 0x946D, 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, + 0x82B8, 0x8C7C, 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, + 0x82C5, 0x8AA1, 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, + 0x82D4, 0x91DB, 0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, + 0x82DC, 0xE49C, 0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, + 0x82E3, 0xE490, 0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, + 0x82EB, 0x93CF, 0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, + 0x82F9, 0xE499, 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, + 0x8302, 0x96CE, 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, + 0x8306, 0xE49B, 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, + 0x8317, 0xE4AA, 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, + 0x8328, 0x88EF, 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, + 0x8332, 0xE4A2, 0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, + 0x8338, 0x91F9, 0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, + 0x8349, 0x9190, 0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, + 0x8352, 0x8D72, 0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, + 0x8375, 0xE4B9, 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, + 0x837F, 0xFB95, 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, + 0x838A, 0xE4B5, 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, + 0x839A, 0xE4AD, 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, + 0x83A2, 0xE4B0, 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, + 0x83B1, 0x9789, 0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, + 0x83C5, 0x909B, 0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, + 0x83CE, 0xE4C0, 0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, + 0x83DC, 0x8DD8, 0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, + 0x83EB, 0xE4BF, 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, + 0x83F2, 0xE4C9, 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, + 0x83FB, 0xE4D0, 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, + 0x8407, 0xE4C7, 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, + 0x840E, 0x88DE, 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, + 0x8429, 0x948B, 0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, + 0x8435, 0xE4E0, 0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, + 0x8446, 0xE4DC, 0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, + 0x8457, 0x9298, 0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, + 0x8463, 0x939F, 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, + 0x846C, 0x9192, 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, + 0x8471, 0x944B, 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, + 0x847A, 0x9598, 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, + 0x8490, 0x8F4E, 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, + 0x849F, 0xE4E5, 0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, + 0x84B4, 0xFB99, 0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, + 0x84BC, 0x9193, 0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, + 0x84C6, 0xE4EC, 0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, + 0x84CD, 0xE4E7, 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, + 0x84D9, 0xE4E6, 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, + 0x84EE, 0x9840, 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, + 0x8500, 0x8EC1, 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, + 0x8514, 0xE4F7, 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, + 0x851A, 0x8955, 0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, + 0x852C, 0xE4F4, 0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, + 0x8540, 0xE4F9, 0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, + 0x8549, 0x8FD4, 0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, + 0x8553, 0xFB9A, 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, + 0x8559, 0xFB9B, 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, + 0x8569, 0x93A0, 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, + 0x8577, 0xE550, 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, + 0x8587, 0xE54E, 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, + 0x8591, 0xE547, 0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, + 0x859B, 0xE54C, 0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, + 0x85A8, 0xE549, 0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, + 0x85AC, 0x96F2, 0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, + 0x85B9, 0xE556, 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, + 0x85CD, 0x9795, 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, + 0x85DC, 0xE55B, 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, + 0x85E9, 0x94CB, 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, + 0x85FA, 0xE561, 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, + 0x8606, 0xE562, 0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, + 0x8613, 0xE55E, 0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, + 0x8622, 0xE563, 0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, + 0x863F, 0xE566, 0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, + 0x8654, 0xE569, 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, + 0x865E, 0x8BF1, 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, + 0x8671, 0xE56C, 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, + 0x868B, 0xE571, 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, + 0x86A3, 0xE56E, 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, + 0x86AB, 0xE57A, 0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, + 0x86C4, 0xE575, 0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, + 0x86CB, 0x9260, 0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, + 0x86D9, 0x8A5E, 0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, + 0x86E4, 0x94B8, 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, + 0x86EE, 0x94D8, 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, + 0x86FB, 0xE588, 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, + 0x8703, 0xE587, 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, + 0x870A, 0xE58D, 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, + 0x8718, 0x9277, 0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, + 0x8729, 0xE593, 0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, + 0x873F, 0xE58F, 0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, + 0x874E, 0xE599, 0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, + 0x8759, 0xE59E, 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, + 0x8766, 0x89DA, 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, + 0x8774, 0xE59A, 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, + 0x8782, 0xE5A5, 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, + 0x87AB, 0xE5AC, 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, + 0x87BB, 0xE5B1, 0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, + 0x87C6, 0xE5B0, 0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, + 0x87D2, 0xE5BB, 0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, + 0x87F6, 0xE5B8, 0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, + 0x87FE, 0xE5B7, 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, + 0x880E, 0xE5BA, 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, + 0x8816, 0xE5BD, 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, + 0x8827, 0xE5C4, 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, + 0x883B, 0xE5C5, 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, + 0x8846, 0x8F4F, 0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, + 0x8853, 0x8F70, 0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, + 0x885D, 0x8FD5, 0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, + 0x8863, 0x88DF, 0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, + 0x8872, 0xE5D3, 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, + 0x887E, 0xE5CE, 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, + 0x8888, 0x8C55, 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, + 0x8896, 0x91B3, 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, + 0x88A2, 0xE5D9, 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, + 0x88B0, 0xE5DC, 0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, + 0x88B7, 0x88BF, 0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, + 0x88C3, 0xE5DF, 0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, + 0x88D4, 0xE5E1, 0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, + 0x88DC, 0x95E2, 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, + 0x88E8, 0xE5E9, 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, + 0x88F5, 0xFBA2, 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, + 0x88FD, 0x90BB, 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, + 0x8907, 0x95A1, 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, + 0x8912, 0x964A, 0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, + 0x891E, 0xE5F0, 0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, + 0x8936, 0xE5F7, 0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, + 0x8943, 0xE5EF, 0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, + 0x8956, 0x89A6, 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, + 0x8964, 0xE641, 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, + 0x896F, 0xE644, 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, + 0x897E, 0xE647, 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, + 0x8986, 0x95A2, 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, + 0x898B, 0x8CA9, 0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, + 0x8997, 0x9460, 0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, + 0x89A6, 0xE64F, 0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, + 0x89AC, 0xE650, 0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, + 0x89BA, 0xE653, 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, + 0x89D2, 0x8A70, 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, + 0x89E3, 0x89F0, 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, + 0x89F8, 0xE65C, 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, + 0x8A08, 0x8C76, 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, + 0x8A10, 0xE65F, 0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, + 0x8A17, 0x91F5, 0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, + 0x8A1F, 0x8FD7, 0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, + 0x8A2D, 0x90DD, 0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, + 0x8A36, 0xE664, 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, + 0x8A3C, 0x8FD8, 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, + 0x8A50, 0x8DBC, 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, + 0x8A55, 0x955D, 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, + 0x8A62, 0xE66D, 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, + 0x8A6B, 0x986C, 0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, + 0x8A70, 0x8B6C, 0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, + 0x8A79, 0xFBA5, 0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, + 0x8A85, 0xE66E, 0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, + 0x8A8D, 0x9446, 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, + 0x8A98, 0x9755, 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, + 0x8AA1, 0xE672, 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, + 0x8AA6, 0xE675, 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, + 0x8AAD, 0x93C7, 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, + 0x8ABC, 0x8B62, 0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, + 0x8AC4, 0xE678, 0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, + 0x8ACD, 0xE679, 0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, + 0x8ADA, 0xE67B, 0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, + 0x8ADF, 0xFBA8, 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, + 0x8AE4, 0xE680, 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, + 0x8AED, 0x9740, 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, + 0x8AF6, 0xFBAA, 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, + 0x8AFE, 0x91F8, 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, + 0x8B04, 0x93A3, 0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, + 0x8B10, 0xE68D, 0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, + 0x8B19, 0x8CAA, 0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, + 0x8B20, 0xE68F, 0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, + 0x8B2B, 0xE693, 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, + 0x8B3E, 0xE694, 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, + 0x8B4E, 0xE699, 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, + 0x8B58, 0x8EAF, 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, + 0x8B5F, 0xE69F, 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, + 0x8B6F, 0xE6A1, 0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, + 0x8B74, 0xE6A2, 0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, + 0x8B80, 0xE6A4, 0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, + 0x8B8E, 0xE6A6, 0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, + 0x8B96, 0xE6A9, 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, + 0x8C3A, 0xE6AC, 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, + 0x8C48, 0xE6AF, 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, + 0x8C50, 0xE6B2, 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, + 0x8C62, 0xE6B4, 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, + 0x8C78, 0xE6B6, 0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, + 0x8C82, 0xE6B8, 0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, + 0x8C8C, 0x9665, 0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, + 0x8C98, 0xE6C0, 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, + 0x8CA1, 0x8DE0, 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, + 0x8CA9, 0x94CC, 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, + 0x8CAD, 0xE6C2, 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, + 0x8CB2, 0xE6C5, 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, + 0x8CB7, 0x9483, 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, + 0x8CBD, 0xE6C4, 0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, + 0x8CC2, 0x9847, 0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, + 0x8CC8, 0xE6C9, 0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, + 0x8CD1, 0x93F6, 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, + 0x8CDC, 0x8E92, 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, + 0x8CE3, 0xE6CC, 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, + 0x8CED, 0x9371, 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, + 0x8CFB, 0xE6D0, 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, + 0x8D05, 0xE6D2, 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, + 0x8D0B, 0x8AE4, 0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, + 0x8D12, 0xFBAF, 0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, + 0x8D64, 0x90D4, 0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, + 0x8D6D, 0xE6DE, 0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, + 0x8D74, 0x958B, 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, + 0x8D85, 0x92B4, 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, + 0x8DA8, 0x9096, 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, + 0x8DC2, 0xE6E3, 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, + 0x8DD6, 0xE6E8, 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, + 0x8DDF, 0xE6EE, 0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, + 0x8DEA, 0xE6EC, 0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, + 0x8DF5, 0x9148, 0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, + 0x8E09, 0xE6F2, 0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, + 0x8E1D, 0xE6F4, 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, + 0x8E30, 0xE6FA, 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, + 0x8E44, 0x92FB, 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, + 0x8E4A, 0xE6FC, 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, + 0x8E59, 0xE745, 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, + 0x8E64, 0xE746, 0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, + 0x8E7C, 0xE74D, 0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, + 0x8E87, 0xE74F, 0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, + 0x8E91, 0xE755, 0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, + 0x8EA1, 0xE759, 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, + 0x8EAF, 0x8BEB, 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, + 0x8EC5, 0xE75F, 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, + 0x8ECB, 0xE761, 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, + 0x8ED2, 0x8CAC, 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, + 0x8EE3, 0xE763, 0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, + 0x8EFC, 0xE764, 0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, + 0x8F05, 0xE769, 0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, + 0x8F12, 0xE76B, 0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, + 0x8F19, 0xE76C, 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, + 0x8F1F, 0xE76F, 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, + 0x8F2F, 0x8F53, 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, + 0x8F3B, 0xE774, 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, + 0x8F44, 0x8A8D, 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, + 0x8F4C, 0xE779, 0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, + 0x8F5C, 0xE77E, 0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, + 0x8F63, 0xE781, 0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, + 0x8F9E, 0x8EAB, 0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, + 0x8FA8, 0x999E, 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, + 0x8FB0, 0x9243, 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, + 0x8FBA, 0x95D3, 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, + 0x8FC2, 0x8949, 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, + 0x8FD1, 0x8BDF, 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, + 0x8FE5, 0xE78A, 0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, + 0x8FEB, 0x9497, 0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, + 0x8FF4, 0xE78F, 0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, + 0x8FFA, 0xE792, 0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, + 0x9003, 0x93A6, 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, + 0x900D, 0xE796, 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, + 0x9011, 0xE793, 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, + 0x9016, 0xE798, 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, + 0x901D, 0x90C0, 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, + 0x9021, 0xE795, 0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, + 0x902E, 0x91DF, 0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, + 0x9036, 0xE79B, 0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, + 0x903E, 0xE7A5, 0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, + 0x9047, 0x8BF6, 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, + 0x904D, 0x95D5, 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, + 0x9051, 0xE7A1, 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, + 0x9055, 0x88E1, 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, + 0x905C, 0x91BB, 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, + 0x9063, 0x8CAD, 0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, + 0x9069, 0x934B, 0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, + 0x9072, 0xE7AD, 0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, + 0x9078, 0x9149, 0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, + 0x907F, 0x94F0, 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, + 0x9083, 0xE284, 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, + 0x908A, 0xE7B2, 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, + 0x90A6, 0x964D, 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, + 0x90B1, 0xE7B7, 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, + 0x90CA, 0x8D78, 0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, + 0x90E1, 0x8C53, 0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, + 0x90ED, 0x8A73, 0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, + 0x9102, 0xE7BD, 0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, + 0x9127, 0xFBB9, 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, + 0x9149, 0x93D1, 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, + 0x914D, 0x947A, 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, + 0x9156, 0xE7C3, 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, + 0x9165, 0xE7C6, 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, + 0x9172, 0xE7C9, 0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, + 0x9178, 0x8E5F, 0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, + 0x918B, 0xE7CA, 0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, + 0x9197, 0x94AE, 0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, + 0x91AA, 0xE7D0, 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, + 0x91B5, 0xE7D1, 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, + 0x91C1, 0xE7D5, 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, + 0x91C9, 0xE7D6, 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, + 0x91CE, 0x96EC, 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, + 0x91D6, 0xE7D9, 0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, + 0x91DB, 0xE7DC, 0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, + 0x91DF, 0xE7DA, 0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, + 0x91E5, 0xFBC0, 0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, + 0x91EE, 0xFBBE, 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, + 0x91FF, 0xE7E1, 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, + 0x920E, 0x8A62, 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, + 0x9215, 0xE7E4, 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, + 0x9234, 0x97E9, 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, + 0x923C, 0xFBC6, 0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, + 0x9245, 0xE7E8, 0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, + 0x924E, 0xFBC7, 0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, + 0x9259, 0xFBC8, 0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, + 0x9262, 0x94AB, 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, + 0x9271, 0x8D7A, 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, + 0x9280, 0x8BE2, 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, + 0x9291, 0x914C, 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, + 0x9298, 0x96C1, 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, + 0x92A7, 0xFBCC, 0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, + 0x92CF, 0xE7F5, 0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, + 0x92D5, 0xFBD4, 0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, + 0x92E4, 0x8F9B, 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, + 0x92ED, 0x8973, 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, + 0x92F9, 0xFA65, 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, + 0x92FF, 0xFBDC, 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, + 0x9310, 0x908D, 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, + 0x931D, 0xFBDD, 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, + 0x9322, 0xE841, 0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, + 0x9328, 0x9564, 0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, + 0x932F, 0x8DF6, 0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, + 0x933B, 0xE846, 0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, + 0x934D, 0x9374, 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, + 0x935B, 0x9262, 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, + 0x936E, 0xE84A, 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, + 0x937E, 0x8FDF, 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, + 0x9397, 0x9199, 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, + 0x93AC, 0xE84D, 0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, + 0x93B9, 0xE850, 0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, + 0x93D0, 0xE858, 0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, + 0x93D8, 0xE855, 0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, + 0x93E4, 0xE85A, 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, + 0x9403, 0xE85E, 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, + 0x9414, 0xE85C, 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, + 0x9421, 0xE864, 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, + 0x9436, 0xE861, 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, + 0x9444, 0xE868, 0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, + 0x9452, 0xE867, 0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, + 0x945E, 0xE86C, 0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, + 0x9470, 0xE86F, 0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, + 0x947D, 0xE872, 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, + 0x9577, 0x92B7, 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, + 0x9587, 0xE879, 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, + 0x958F, 0x895B, 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, + 0x9594, 0xE87B, 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, + 0x95A0, 0xE880, 0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, + 0x95A5, 0x94B4, 0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, + 0x95B2, 0x897B, 0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, + 0x95BE, 0xE887, 0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, + 0x95CC, 0xE88C, 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, + 0x95D6, 0xE88F, 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, + 0x95E2, 0xE893, 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, + 0x9628, 0xE895, 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, + 0x9632, 0x9668, 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, + 0x9642, 0xE898, 0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, + 0x964D, 0x8D7E, 0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, + 0x965C, 0xE89D, 0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, + 0x9662, 0x8940, 0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, + 0x9666, 0xE8A1, 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, + 0x9672, 0xE8A2, 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, + 0x9677, 0xE89C, 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, + 0x9685, 0x8BF7, 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, + 0x968B, 0xE440, 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, + 0x9694, 0x8A75, 0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, + 0x9699, 0x8C84, 0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, + 0x96A0, 0x8942, 0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, + 0x96AA, 0xE8A8, 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, + 0x96B2, 0xE8AB, 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, + 0x96B8, 0xE8AF, 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, + 0x96C0, 0x909D, 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, + 0x96C6, 0x8F57, 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, + 0x96CC, 0x8E93, 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, + 0x96D5, 0xE8B8, 0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, + 0x96DC, 0xE8B6, 0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, + 0x96EA, 0x90E1, 0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, + 0x96F6, 0x97EB, 0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, + 0x9700, 0x8EF9, 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, + 0x9708, 0xE8BC, 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, + 0x970F, 0xE8C0, 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, + 0x9719, 0xE8C2, 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, + 0x9727, 0x96B6, 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, + 0x9733, 0xFBED, 0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, + 0x973D, 0xE8C7, 0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, + 0x9744, 0xE8C9, 0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, + 0x974D, 0xFBF0, 0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, + 0x9755, 0xFBF3, 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, + 0x975E, 0x94F1, 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, + 0x9764, 0xE8D0, 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, + 0x976B, 0xE8D4, 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, + 0x9779, 0xE8D6, 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, + 0x9784, 0x8A93, 0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, + 0x978D, 0x88C6, 0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, + 0x979C, 0xE8DF, 0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, + 0x97A8, 0xE8E0, 0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, + 0x97B4, 0xE8E4, 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, + 0x97CB, 0xE8E8, 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, + 0x97EE, 0x9442, 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, + 0x97F6, 0xE8EE, 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, + 0x9802, 0x92B8, 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, + 0x9808, 0x907B, 0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, + 0x9811, 0x8AE6, 0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, + 0x9818, 0x97CC, 0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, + 0x982C, 0x966A, 0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, + 0x9838, 0xE8F2, 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, + 0x9846, 0xE8F7, 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, + 0x984E, 0x8A7B, 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, + 0x9857, 0xFBF4, 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, + 0x9865, 0xFBF5, 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, + 0x9870, 0xE8FC, 0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, + 0x98A8, 0x9597, 0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, + 0x98B6, 0xE946, 0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, + 0x98DB, 0x94F2, 0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, + 0x98E9, 0xE94A, 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, + 0x98EF, 0x94D1, 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, + 0x98FD, 0x964F, 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, + 0x9909, 0xE94D, 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, + 0x9912, 0xE94E, 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, + 0x991D, 0xE952, 0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, + 0x9924, 0xE954, 0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, + 0x992E, 0xE957, 0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, + 0x9945, 0xE95C, 0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, + 0x9950, 0xE95D, 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, + 0x9957, 0x8BC0, 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, + 0x9999, 0x8D81, 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, + 0x99AC, 0x946E, 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, + 0x99B4, 0x93E9, 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, + 0x99C5, 0x8977, 0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, + 0x99D1, 0xE96D, 0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, + 0x99DB, 0xE96A, 0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, + 0x99ED, 0xE96E, 0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, + 0x99F8, 0xE973, 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, + 0x9A05, 0xE976, 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, + 0x9A13, 0x8CB1, 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, + 0x9A30, 0x93AB, 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, + 0x9A42, 0xE97C, 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, + 0x9A4E, 0xFBFB, 0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, + 0x9A5B, 0xE983, 0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, + 0x9A65, 0xE987, 0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, + 0x9AA8, 0x8D9C, 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, + 0x9ABC, 0xE98E, 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, + 0x9AD1, 0xE991, 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, + 0x9AD9, 0xFBFC, 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, + 0x9AE2, 0xE996, 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, + 0x9AEB, 0xE99A, 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, + 0x9AF1, 0xE99D, 0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, + 0x9B06, 0xE9A0, 0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, + 0x9B22, 0xE9A4, 0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, + 0x9B28, 0xE9A8, 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, + 0x9B2F, 0xE9AC, 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, + 0x9B3C, 0x8B53, 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, + 0x9B44, 0xE9AE, 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, + 0x9B4F, 0xE9B0, 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, + 0x9B5A, 0x8B9B, 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, + 0x9B75, 0xFC41, 0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, + 0x9B91, 0xE9B8, 0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, + 0x9B97, 0xE9BA, 0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, + 0x9BAA, 0x968E, 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, + 0x9BB1, 0xFC44, 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, + 0x9BC0, 0xE9BF, 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, + 0x9BCF, 0xE9C3, 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, + 0x9BD6, 0x8E49, 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, + 0x9BE3, 0xE9C6, 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, + 0x9BF1, 0xE9CD, 0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, + 0x9C04, 0xE9D8, 0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, + 0x9C0A, 0xE9D7, 0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, + 0x9C12, 0xE9D6, 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, + 0x9C1B, 0xE9DA, 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, + 0x9C2D, 0x9568, 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, + 0x9C32, 0xE9E0, 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, + 0x9C3E, 0xE9E2, 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, + 0x9C52, 0x9690, 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, + 0x9C67, 0xE9E5, 0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, + 0x9CE7, 0xE9E8, 0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, + 0x9CF0, 0xE9EA, 0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, + 0x9D03, 0xE9EE, 0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, + 0x9D09, 0xE9EB, 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, + 0x9D1B, 0x8995, 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, + 0x9D28, 0x8A9B, 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, + 0x9D3B, 0x8D83, 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, + 0x9D44, 0xE9F5, 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, + 0x9D51, 0xEA43, 0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, + 0x9D5E, 0xEA41, 0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, + 0x9D6B, 0xFC48, 0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, + 0x9D72, 0xEA46, 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, + 0x9D8F, 0x8C7B, 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, + 0x9DAB, 0xEA49, 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, + 0x9DB8, 0xEA53, 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, + 0x9DC2, 0xEA57, 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, + 0x9DD3, 0xEA59, 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, + 0x9DEF, 0xEA5D, 0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, + 0x9DFA, 0x8DEB, 0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, + 0x9E1B, 0xEA60, 0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, + 0x9E79, 0xEA63, 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, + 0x9E88, 0xEA66, 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, + 0x9E92, 0xEA69, 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, + 0x9E9D, 0xEA6C, 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, + 0x9EA9, 0xEA6E, 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, + 0x9EB9, 0x8D8D, 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, + 0x9EBE, 0x9F80, 0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, + 0x9ECD, 0x8B6F, 0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, + 0x9ED1, 0xFC4B, 0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, + 0x9ED9, 0x96D9, 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, + 0x9EDE, 0xEA79, 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, + 0x9EEF, 0xEA7E, 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, + 0x9EF9, 0xEA83, 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, + 0x9F07, 0xEA87, 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, + 0x9F15, 0xEA8A, 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, + 0x9F3B, 0x9540, 0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, + 0x9F4E, 0xE6D8, 0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, + 0x9F5F, 0xEA92, 0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, + 0x9F63, 0xEA91, 0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, + 0x9F6C, 0xEA97, 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, + 0x9F8D, 0x97B4, 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, + 0x9FA0, 0xEA9E, 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, + 0xFA0F, 0xFA9B, 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, + 0xFA13, 0xFAE8, 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, + 0xFA17, 0xFB75, 0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, + 0xFA1B, 0xFB82, 0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, + 0xFA1F, 0xFB9D, 0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, + 0xFA23, 0xFBB1, 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, + 0xFA27, 0xFBD3, 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, + 0xFA2B, 0xFBF7, 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, + 0xFF02, 0xFA57, 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, + 0xFF06, 0x8195, 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, + 0xFF0A, 0x8196, 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, + 0xFF0E, 0x8144, 0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, + 0xFF12, 0x8251, 0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, + 0xFF16, 0x8255, 0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, + 0xFF1A, 0x8146, 0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, + 0xFF1E, 0x8184, 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, + 0xFF22, 0x8261, 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, + 0xFF26, 0x8265, 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, + 0xFF2A, 0x8269, 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, + 0xFF2E, 0x826D, 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, + 0xFF32, 0x8271, 0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, + 0xFF36, 0x8275, 0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, + 0xFF3A, 0x8279, 0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, + 0xFF3E, 0x814F, 0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, + 0xFF42, 0x8282, 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, + 0xFF46, 0x8286, 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, + 0xFF4A, 0x828A, 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, + 0xFF4E, 0x828E, 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, + 0xFF52, 0x8292, 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, + 0xFF56, 0x8296, 0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, + 0xFF5A, 0x829A, 0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, + 0xFF5E, 0x8160, 0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, + 0xFF64, 0x00A4, 0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, + 0xFF68, 0x00A8, 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, + 0xFF6C, 0x00AC, 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, + 0xFF70, 0x00B0, 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, + 0xFF74, 0x00B4, 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, + 0xFF78, 0x00B8, 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, + 0xFF7C, 0x00BC, 0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, + 0xFF80, 0x00C0, 0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, + 0xFF84, 0x00C4, 0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, + 0xFF88, 0x00C8, 0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, + 0xFF8C, 0x00CC, 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, + 0xFF90, 0x00D0, 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, + 0xFF94, 0x00D4, 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, + 0xFF98, 0x00D8, 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, + 0xFF9C, 0x00DC, 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, + 0xFFE0, 0x8191, 0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, + 0xFFE4, 0xFA55, 0xFFE5, 0x818F, 0, 0 +}; + +#if !_TINY_TABLE +static +const WCHAR sjis2uni[] = { +/* SJIS - Unicode, SJIS - Unicode, SJIS - Unicode, SJIS - Unicode, */ + 0x00A1, 0xFF61, 0x00A2, 0xFF62, 0x00A3, 0xFF63, 0x00A4, 0xFF64, + 0x00A5, 0xFF65, 0x00A6, 0xFF66, 0x00A7, 0xFF67, 0x00A8, 0xFF68, + 0x00A9, 0xFF69, 0x00AA, 0xFF6A, 0x00AB, 0xFF6B, 0x00AC, 0xFF6C, + 0x00AD, 0xFF6D, 0x00AE, 0xFF6E, 0x00AF, 0xFF6F, 0x00B0, 0xFF70, + 0x00B1, 0xFF71, 0x00B2, 0xFF72, 0x00B3, 0xFF73, 0x00B4, 0xFF74, + 0x00B5, 0xFF75, 0x00B6, 0xFF76, 0x00B7, 0xFF77, 0x00B8, 0xFF78, + 0x00B9, 0xFF79, 0x00BA, 0xFF7A, 0x00BB, 0xFF7B, 0x00BC, 0xFF7C, + 0x00BD, 0xFF7D, 0x00BE, 0xFF7E, 0x00BF, 0xFF7F, 0x00C0, 0xFF80, + 0x00C1, 0xFF81, 0x00C2, 0xFF82, 0x00C3, 0xFF83, 0x00C4, 0xFF84, + 0x00C5, 0xFF85, 0x00C6, 0xFF86, 0x00C7, 0xFF87, 0x00C8, 0xFF88, + 0x00C9, 0xFF89, 0x00CA, 0xFF8A, 0x00CB, 0xFF8B, 0x00CC, 0xFF8C, + 0x00CD, 0xFF8D, 0x00CE, 0xFF8E, 0x00CF, 0xFF8F, 0x00D0, 0xFF90, + 0x00D1, 0xFF91, 0x00D2, 0xFF92, 0x00D3, 0xFF93, 0x00D4, 0xFF94, + 0x00D5, 0xFF95, 0x00D6, 0xFF96, 0x00D7, 0xFF97, 0x00D8, 0xFF98, + 0x00D9, 0xFF99, 0x00DA, 0xFF9A, 0x00DB, 0xFF9B, 0x00DC, 0xFF9C, + 0x00DD, 0xFF9D, 0x00DE, 0xFF9E, 0x00DF, 0xFF9F, 0x8140, 0x3000, + 0x8141, 0x3001, 0x8142, 0x3002, 0x8143, 0xFF0C, 0x8144, 0xFF0E, + 0x8145, 0x30FB, 0x8146, 0xFF1A, 0x8147, 0xFF1B, 0x8148, 0xFF1F, + 0x8149, 0xFF01, 0x814A, 0x309B, 0x814B, 0x309C, 0x814C, 0x00B4, + 0x814D, 0xFF40, 0x814E, 0x00A8, 0x814F, 0xFF3E, 0x8150, 0xFFE3, + 0x8151, 0xFF3F, 0x8152, 0x30FD, 0x8153, 0x30FE, 0x8154, 0x309D, + 0x8155, 0x309E, 0x8156, 0x3003, 0x8157, 0x4EDD, 0x8158, 0x3005, + 0x8159, 0x3006, 0x815A, 0x3007, 0x815B, 0x30FC, 0x815C, 0x2015, + 0x815D, 0x2010, 0x815E, 0xFF0F, 0x815F, 0xFF3C, 0x8160, 0xFF5E, + 0x8161, 0x2225, 0x8162, 0xFF5C, 0x8163, 0x2026, 0x8164, 0x2025, + 0x8165, 0x2018, 0x8166, 0x2019, 0x8167, 0x201C, 0x8168, 0x201D, + 0x8169, 0xFF08, 0x816A, 0xFF09, 0x816B, 0x3014, 0x816C, 0x3015, + 0x816D, 0xFF3B, 0x816E, 0xFF3D, 0x816F, 0xFF5B, 0x8170, 0xFF5D, + 0x8171, 0x3008, 0x8172, 0x3009, 0x8173, 0x300A, 0x8174, 0x300B, + 0x8175, 0x300C, 0x8176, 0x300D, 0x8177, 0x300E, 0x8178, 0x300F, + 0x8179, 0x3010, 0x817A, 0x3011, 0x817B, 0xFF0B, 0x817C, 0xFF0D, + 0x817D, 0x00B1, 0x817E, 0x00D7, 0x8180, 0x00F7, 0x8181, 0xFF1D, + 0x8182, 0x2260, 0x8183, 0xFF1C, 0x8184, 0xFF1E, 0x8185, 0x2266, + 0x8186, 0x2267, 0x8187, 0x221E, 0x8188, 0x2234, 0x8189, 0x2642, + 0x818A, 0x2640, 0x818B, 0x00B0, 0x818C, 0x2032, 0x818D, 0x2033, + 0x818E, 0x2103, 0x818F, 0xFFE5, 0x8190, 0xFF04, 0x8191, 0xFFE0, + 0x8192, 0xFFE1, 0x8193, 0xFF05, 0x8194, 0xFF03, 0x8195, 0xFF06, + 0x8196, 0xFF0A, 0x8197, 0xFF20, 0x8198, 0x00A7, 0x8199, 0x2606, + 0x819A, 0x2605, 0x819B, 0x25CB, 0x819C, 0x25CF, 0x819D, 0x25CE, + 0x819E, 0x25C7, 0x819F, 0x25C6, 0x81A0, 0x25A1, 0x81A1, 0x25A0, + 0x81A2, 0x25B3, 0x81A3, 0x25B2, 0x81A4, 0x25BD, 0x81A5, 0x25BC, + 0x81A6, 0x203B, 0x81A7, 0x3012, 0x81A8, 0x2192, 0x81A9, 0x2190, + 0x81AA, 0x2191, 0x81AB, 0x2193, 0x81AC, 0x3013, 0x81B8, 0x2208, + 0x81B9, 0x220B, 0x81BA, 0x2286, 0x81BB, 0x2287, 0x81BC, 0x2282, + 0x81BD, 0x2283, 0x81BE, 0x222A, 0x81BF, 0x2229, 0x81C8, 0x2227, + 0x81C9, 0x2228, 0x81CA, 0xFFE2, 0x81CB, 0x21D2, 0x81CC, 0x21D4, + 0x81CD, 0x2200, 0x81CE, 0x2203, 0x81DA, 0x2220, 0x81DB, 0x22A5, + 0x81DC, 0x2312, 0x81DD, 0x2202, 0x81DE, 0x2207, 0x81DF, 0x2261, + 0x81E0, 0x2252, 0x81E1, 0x226A, 0x81E2, 0x226B, 0x81E3, 0x221A, + 0x81E4, 0x223D, 0x81E5, 0x221D, 0x81E6, 0x2235, 0x81E7, 0x222B, + 0x81E8, 0x222C, 0x81F0, 0x212B, 0x81F1, 0x2030, 0x81F2, 0x266F, + 0x81F3, 0x266D, 0x81F4, 0x266A, 0x81F5, 0x2020, 0x81F6, 0x2021, + 0x81F7, 0x00B6, 0x81FC, 0x25EF, 0x824F, 0xFF10, 0x8250, 0xFF11, + 0x8251, 0xFF12, 0x8252, 0xFF13, 0x8253, 0xFF14, 0x8254, 0xFF15, + 0x8255, 0xFF16, 0x8256, 0xFF17, 0x8257, 0xFF18, 0x8258, 0xFF19, + 0x8260, 0xFF21, 0x8261, 0xFF22, 0x8262, 0xFF23, 0x8263, 0xFF24, + 0x8264, 0xFF25, 0x8265, 0xFF26, 0x8266, 0xFF27, 0x8267, 0xFF28, + 0x8268, 0xFF29, 0x8269, 0xFF2A, 0x826A, 0xFF2B, 0x826B, 0xFF2C, + 0x826C, 0xFF2D, 0x826D, 0xFF2E, 0x826E, 0xFF2F, 0x826F, 0xFF30, + 0x8270, 0xFF31, 0x8271, 0xFF32, 0x8272, 0xFF33, 0x8273, 0xFF34, + 0x8274, 0xFF35, 0x8275, 0xFF36, 0x8276, 0xFF37, 0x8277, 0xFF38, + 0x8278, 0xFF39, 0x8279, 0xFF3A, 0x8281, 0xFF41, 0x8282, 0xFF42, + 0x8283, 0xFF43, 0x8284, 0xFF44, 0x8285, 0xFF45, 0x8286, 0xFF46, + 0x8287, 0xFF47, 0x8288, 0xFF48, 0x8289, 0xFF49, 0x828A, 0xFF4A, + 0x828B, 0xFF4B, 0x828C, 0xFF4C, 0x828D, 0xFF4D, 0x828E, 0xFF4E, + 0x828F, 0xFF4F, 0x8290, 0xFF50, 0x8291, 0xFF51, 0x8292, 0xFF52, + 0x8293, 0xFF53, 0x8294, 0xFF54, 0x8295, 0xFF55, 0x8296, 0xFF56, + 0x8297, 0xFF57, 0x8298, 0xFF58, 0x8299, 0xFF59, 0x829A, 0xFF5A, + 0x829F, 0x3041, 0x82A0, 0x3042, 0x82A1, 0x3043, 0x82A2, 0x3044, + 0x82A3, 0x3045, 0x82A4, 0x3046, 0x82A5, 0x3047, 0x82A6, 0x3048, + 0x82A7, 0x3049, 0x82A8, 0x304A, 0x82A9, 0x304B, 0x82AA, 0x304C, + 0x82AB, 0x304D, 0x82AC, 0x304E, 0x82AD, 0x304F, 0x82AE, 0x3050, + 0x82AF, 0x3051, 0x82B0, 0x3052, 0x82B1, 0x3053, 0x82B2, 0x3054, + 0x82B3, 0x3055, 0x82B4, 0x3056, 0x82B5, 0x3057, 0x82B6, 0x3058, + 0x82B7, 0x3059, 0x82B8, 0x305A, 0x82B9, 0x305B, 0x82BA, 0x305C, + 0x82BB, 0x305D, 0x82BC, 0x305E, 0x82BD, 0x305F, 0x82BE, 0x3060, + 0x82BF, 0x3061, 0x82C0, 0x3062, 0x82C1, 0x3063, 0x82C2, 0x3064, + 0x82C3, 0x3065, 0x82C4, 0x3066, 0x82C5, 0x3067, 0x82C6, 0x3068, + 0x82C7, 0x3069, 0x82C8, 0x306A, 0x82C9, 0x306B, 0x82CA, 0x306C, + 0x82CB, 0x306D, 0x82CC, 0x306E, 0x82CD, 0x306F, 0x82CE, 0x3070, + 0x82CF, 0x3071, 0x82D0, 0x3072, 0x82D1, 0x3073, 0x82D2, 0x3074, + 0x82D3, 0x3075, 0x82D4, 0x3076, 0x82D5, 0x3077, 0x82D6, 0x3078, + 0x82D7, 0x3079, 0x82D8, 0x307A, 0x82D9, 0x307B, 0x82DA, 0x307C, + 0x82DB, 0x307D, 0x82DC, 0x307E, 0x82DD, 0x307F, 0x82DE, 0x3080, + 0x82DF, 0x3081, 0x82E0, 0x3082, 0x82E1, 0x3083, 0x82E2, 0x3084, + 0x82E3, 0x3085, 0x82E4, 0x3086, 0x82E5, 0x3087, 0x82E6, 0x3088, + 0x82E7, 0x3089, 0x82E8, 0x308A, 0x82E9, 0x308B, 0x82EA, 0x308C, + 0x82EB, 0x308D, 0x82EC, 0x308E, 0x82ED, 0x308F, 0x82EE, 0x3090, + 0x82EF, 0x3091, 0x82F0, 0x3092, 0x82F1, 0x3093, 0x8340, 0x30A1, + 0x8341, 0x30A2, 0x8342, 0x30A3, 0x8343, 0x30A4, 0x8344, 0x30A5, + 0x8345, 0x30A6, 0x8346, 0x30A7, 0x8347, 0x30A8, 0x8348, 0x30A9, + 0x8349, 0x30AA, 0x834A, 0x30AB, 0x834B, 0x30AC, 0x834C, 0x30AD, + 0x834D, 0x30AE, 0x834E, 0x30AF, 0x834F, 0x30B0, 0x8350, 0x30B1, + 0x8351, 0x30B2, 0x8352, 0x30B3, 0x8353, 0x30B4, 0x8354, 0x30B5, + 0x8355, 0x30B6, 0x8356, 0x30B7, 0x8357, 0x30B8, 0x8358, 0x30B9, + 0x8359, 0x30BA, 0x835A, 0x30BB, 0x835B, 0x30BC, 0x835C, 0x30BD, + 0x835D, 0x30BE, 0x835E, 0x30BF, 0x835F, 0x30C0, 0x8360, 0x30C1, + 0x8361, 0x30C2, 0x8362, 0x30C3, 0x8363, 0x30C4, 0x8364, 0x30C5, + 0x8365, 0x30C6, 0x8366, 0x30C7, 0x8367, 0x30C8, 0x8368, 0x30C9, + 0x8369, 0x30CA, 0x836A, 0x30CB, 0x836B, 0x30CC, 0x836C, 0x30CD, + 0x836D, 0x30CE, 0x836E, 0x30CF, 0x836F, 0x30D0, 0x8370, 0x30D1, + 0x8371, 0x30D2, 0x8372, 0x30D3, 0x8373, 0x30D4, 0x8374, 0x30D5, + 0x8375, 0x30D6, 0x8376, 0x30D7, 0x8377, 0x30D8, 0x8378, 0x30D9, + 0x8379, 0x30DA, 0x837A, 0x30DB, 0x837B, 0x30DC, 0x837C, 0x30DD, + 0x837D, 0x30DE, 0x837E, 0x30DF, 0x8380, 0x30E0, 0x8381, 0x30E1, + 0x8382, 0x30E2, 0x8383, 0x30E3, 0x8384, 0x30E4, 0x8385, 0x30E5, + 0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9, + 0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED, + 0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1, + 0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x3094, 0x8394, 0x30F4, + 0x8395, 0x30F5, 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, + 0x83A1, 0x0393, 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, + 0x83A5, 0x0397, 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, + 0x83A9, 0x039B, 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, + 0x83AD, 0x039F, 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, + 0x83B1, 0x03A4, 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, + 0x83B5, 0x03A8, 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, + 0x83C1, 0x03B3, 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, + 0x83C5, 0x03B7, 0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, + 0x83C9, 0x03BB, 0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, + 0x83CD, 0x03BF, 0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, + 0x83D1, 0x03C4, 0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, + 0x83D5, 0x03C8, 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, + 0x8442, 0x0412, 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, + 0x8446, 0x0401, 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, + 0x844A, 0x0419, 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, + 0x844E, 0x041D, 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, + 0x8452, 0x0421, 0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, + 0x8456, 0x0425, 0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, + 0x845A, 0x0429, 0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, + 0x845E, 0x042D, 0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, + 0x8471, 0x0431, 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, + 0x8475, 0x0435, 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, + 0x8479, 0x0438, 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, + 0x847D, 0x043C, 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, + 0x8482, 0x0440, 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, + 0x8486, 0x0444, 0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, + 0x848A, 0x0448, 0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, + 0x848E, 0x044C, 0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, + 0x849F, 0x2500, 0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, + 0x84A3, 0x2518, 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, + 0x84A7, 0x2524, 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, + 0x84AB, 0x2503, 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, + 0x84AF, 0x2517, 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, + 0x84B3, 0x253B, 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, + 0x84B7, 0x2528, 0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, + 0x84BB, 0x2530, 0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, + 0x8740, 0x2460, 0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, + 0x8744, 0x2464, 0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, + 0x8748, 0x2468, 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, + 0x874C, 0x246C, 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, + 0x8750, 0x2470, 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, + 0x8754, 0x2160, 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, + 0x8758, 0x2164, 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, + 0x875C, 0x2168, 0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, + 0x8761, 0x3322, 0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, + 0x8765, 0x3303, 0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, + 0x8769, 0x330D, 0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, + 0x876D, 0x334A, 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, + 0x8771, 0x339E, 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, + 0x8775, 0x33A1, 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, + 0x8782, 0x2116, 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, + 0x8786, 0x32A5, 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, + 0x878A, 0x3231, 0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, + 0x878E, 0x337D, 0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, + 0x8798, 0x221F, 0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, + 0x88A1, 0x5A03, 0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, + 0x88A5, 0x6328, 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, + 0x88A9, 0x831C, 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, + 0x88AD, 0x6E25, 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, + 0x88B1, 0x9BF5, 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, + 0x88B5, 0x6271, 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, + 0x88B9, 0x98F4, 0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, + 0x88BD, 0x6216, 0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, + 0x88C1, 0x5EB5, 0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, + 0x88C5, 0x95C7, 0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, + 0x88C9, 0x4F0A, 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, + 0x88CD, 0x56F2, 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, + 0x88D1, 0x5C09, 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, + 0x88D5, 0x6613, 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, + 0x88D9, 0x7570, 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, + 0x88DD, 0x80C3, 0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, + 0x88E1, 0x9055, 0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, + 0x88E5, 0x4EA5, 0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, + 0x88E9, 0x78EF, 0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, + 0x88ED, 0x9038, 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, + 0x88F1, 0x9C2F, 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, + 0x88F5, 0x54E1, 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, + 0x88F9, 0x98F2, 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, + 0x8940, 0x9662, 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, + 0x8944, 0x540B, 0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, + 0x8948, 0x7FBD, 0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, + 0x894C, 0x9D5C, 0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, + 0x8950, 0x81FC, 0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, + 0x8954, 0x6B1D, 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, + 0x8958, 0x53A9, 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, + 0x895C, 0x5642, 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, + 0x8960, 0x834F, 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, + 0x8964, 0x5B30, 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, + 0x8968, 0x6804, 0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, + 0x896C, 0x745B, 0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, + 0x8970, 0x82F1, 0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, + 0x8974, 0x6DB2, 0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, + 0x8978, 0x60A6, 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, + 0x897C, 0x698E, 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, + 0x8981, 0x5830, 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, + 0x8985, 0x6028, 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, + 0x8989, 0x6F14, 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, + 0x898D, 0x71D5, 0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, + 0x8991, 0x82D1, 0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, + 0x8995, 0x9D1B, 0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, + 0x8999, 0x7525, 0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, + 0x899D, 0x5F80, 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, + 0x89A1, 0x6A2A, 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, + 0x89A5, 0x7FC1, 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, + 0x89A9, 0x9EC4, 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, + 0x89AD, 0x5104, 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, + 0x89B1, 0x6876, 0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, + 0x89B5, 0x5378, 0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, + 0x89B9, 0x97F3, 0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, + 0x89BD, 0x4F55, 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, + 0x89C1, 0x52A0, 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, + 0x89C5, 0x5AC1, 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, + 0x89C9, 0x6687, 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, + 0x89CD, 0x6CB3, 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, + 0x89D1, 0x79BE, 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, + 0x89D5, 0x82DB, 0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, + 0x89D9, 0x83D3, 0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, + 0x89DD, 0x8CA8, 0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, + 0x89E1, 0x868A, 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, + 0x89E5, 0x7259, 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, + 0x89E9, 0x86FE, 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, + 0x89ED, 0x99D5, 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, + 0x89F1, 0x56DE, 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, + 0x89F5, 0x5FEB, 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, + 0x89F9, 0x61D0, 0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, + 0x8A40, 0x9B41, 0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, + 0x8A44, 0x7070, 0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, + 0x8A48, 0x82A5, 0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, + 0x8A4C, 0x8C9D, 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, + 0x8A50, 0x54B3, 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, + 0x8A54, 0x6982, 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, + 0x8A58, 0x8857, 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, + 0x8A5C, 0x6D6C, 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, + 0x8A60, 0x67FF, 0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, + 0x8A64, 0x5687, 0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, + 0x8A68, 0x64B9, 0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, + 0x8A6C, 0x7372, 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, + 0x8A70, 0x89D2, 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, + 0x8A74, 0x95A3, 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, + 0x8A78, 0x5CB3, 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, + 0x8A7C, 0x639B, 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, + 0x8A81, 0x68B6, 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, + 0x8A85, 0x559D, 0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, + 0x8A89, 0x6E07, 0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, + 0x8A8D, 0x8F44, 0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, + 0x8A91, 0x691B, 0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, + 0x8A95, 0x515C, 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, + 0x8A99, 0x938C, 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, + 0x8A9D, 0x8305, 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, + 0x8AA1, 0x82C5, 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, + 0x8AA5, 0x51A0, 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, + 0x8AA9, 0x52E7, 0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, + 0x8AAD, 0x59E6, 0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, + 0x8AB1, 0x5E72, 0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, + 0x8AB5, 0x6163, 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, + 0x8AB9, 0x67D1, 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, + 0x8ABD, 0x6B53, 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, + 0x8AC1, 0x6F45, 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, + 0x8AC5, 0x770B, 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, + 0x8AC9, 0x7DE9, 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, + 0x8ACD, 0x8266, 0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, + 0x8AD1, 0x8CAB, 0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, + 0x8AD5, 0x9591, 0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, + 0x8AD9, 0x9928, 0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, + 0x8ADD, 0x5CB8, 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, + 0x8AE1, 0x773C, 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, + 0x8AE5, 0x96C1, 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, + 0x8AE9, 0x4F01, 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, + 0x8AED, 0x5668, 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, + 0x8AF1, 0x5BC4, 0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, + 0x8AF5, 0x5FCC, 0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, + 0x8AF9, 0x65E2, 0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, + 0x8B40, 0x6A5F, 0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, + 0x8B44, 0x6C7D, 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, + 0x8B48, 0x7A00, 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, + 0x8B4C, 0x8A18, 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, + 0x8B50, 0x8F1D, 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, + 0x8B54, 0x4E80, 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, + 0x8B58, 0x5B9C, 0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, + 0x8B5C, 0x6B3A, 0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, + 0x8B60, 0x7FA9, 0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, + 0x8B64, 0x63AC, 0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, + 0x8B68, 0x5403, 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, + 0x8B6C, 0x8A70, 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, + 0x8B70, 0x5374, 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, + 0x8B74, 0x9006, 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, + 0x8B78, 0x4F11, 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, + 0x8B7C, 0x5F13, 0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, + 0x8B81, 0x6C42, 0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, + 0x8B85, 0x7403, 0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, + 0x8B89, 0x7D1A, 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, + 0x8B8D, 0x725B, 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, + 0x8B91, 0x62D2, 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, + 0x8B95, 0x865A, 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, + 0x8B99, 0x6F01, 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, + 0x8B9D, 0x4EAB, 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, + 0x8BA1, 0x50D1, 0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, + 0x8BA5, 0x51F6, 0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, + 0x8BA9, 0x53EB, 0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, + 0x8BAD, 0x5F37, 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, + 0x8BB1, 0x606D, 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, + 0x8BB5, 0x6CC1, 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, + 0x8BB9, 0x80F8, 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, + 0x8BBD, 0x90F7, 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, + 0x8BC1, 0x9A5A, 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, + 0x8BC5, 0x6681, 0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, + 0x8BC9, 0x6975, 0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, + 0x8BCD, 0x50C5, 0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, + 0x8BD1, 0x9326, 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, + 0x8BD5, 0x7434, 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, + 0x8BD9, 0x7DCA, 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, + 0x8BDD, 0x895F, 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, + 0x8BE1, 0x541F, 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, + 0x8BE5, 0x53E5, 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, + 0x8BE9, 0x77E9, 0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, + 0x8BED, 0x99C8, 0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, + 0x8BF1, 0x865E, 0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, + 0x8BF5, 0x5BD3, 0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, + 0x8BF9, 0x6ADB, 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, + 0x8C40, 0x6398, 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, + 0x8C44, 0x8F61, 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, + 0x8C48, 0x7C82, 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, + 0x8C4C, 0x936C, 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, + 0x8C50, 0x8A13, 0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, + 0x8C54, 0x5366, 0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, + 0x8C58, 0x50BE, 0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, + 0x8C5C, 0x572D, 0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, + 0x8C60, 0x5F62, 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, + 0x8C64, 0x6167, 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, + 0x8C68, 0x656C, 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, + 0x8C6C, 0x7566, 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, + 0x8C70, 0x7D99, 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, + 0x8C74, 0x834A, 0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, + 0x8C78, 0x8B66, 0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, + 0x8C7C, 0x82B8, 0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, + 0x8C81, 0x621F, 0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, + 0x8C85, 0x6841, 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, + 0x8C89, 0x6F54, 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, + 0x8C8D, 0x8A23, 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, + 0x8C91, 0x5026, 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, + 0x8C95, 0x5263, 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, + 0x8C99, 0x5ACC, 0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, + 0x8C9D, 0x62F3, 0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, + 0x8CA1, 0x727D, 0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, + 0x8CA5, 0x786F, 0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, + 0x8CA9, 0x898B, 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, + 0x8CAD, 0x9063, 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, + 0x8CB1, 0x9A13, 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, + 0x8CB5, 0x53B3, 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, + 0x8CB9, 0x6E90, 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, + 0x8CBD, 0x8237, 0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, + 0x8CC1, 0x4E4E, 0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, + 0x8CC5, 0x56FA, 0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, + 0x8CC9, 0x5EAB, 0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, + 0x8CCD, 0x67AF, 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, + 0x8CD1, 0x88B4, 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, + 0x8CD5, 0x864E, 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, + 0x8CD9, 0x96C7, 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, + 0x8CDD, 0x4E92, 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, + 0x8CE1, 0x543E, 0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, + 0x8CE5, 0x609F, 0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, + 0x8CE9, 0x7881, 0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, + 0x8CED, 0x9190, 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, + 0x8CF1, 0x4F7C, 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, + 0x8CF5, 0x5149, 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, + 0x8CF9, 0x52FE, 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, + 0x8D40, 0x540E, 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, + 0x8D44, 0x597D, 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, + 0x8D48, 0x5DE5, 0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, + 0x8D4C, 0x5E83, 0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, + 0x8D50, 0x6052, 0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, + 0x8D54, 0x63A7, 0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, + 0x8D58, 0x66F4, 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, + 0x8D5C, 0x69CB, 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, + 0x8D60, 0x6E2F, 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, + 0x8D64, 0x786C, 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, + 0x8D68, 0x7D18, 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, + 0x8D6C, 0x8003, 0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, + 0x8D70, 0x818F, 0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, + 0x8D74, 0x8861, 0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, + 0x8D78, 0x90CA, 0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, + 0x8D7C, 0x92FC, 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, + 0x8D81, 0x9999, 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, + 0x8D85, 0x52AB, 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, + 0x8D89, 0x62F7, 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, + 0x8D8D, 0x9EB9, 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, + 0x8D91, 0x56FD, 0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, + 0x8D95, 0x9ED2, 0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, + 0x8D99, 0x7511, 0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, + 0x8D9D, 0x72DB, 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, + 0x8DA1, 0x4ECA, 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, + 0x8DA5, 0x5A5A, 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, + 0x8DA9, 0x6606, 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, + 0x8DAD, 0x75D5, 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, + 0x8DB1, 0x4E9B, 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, + 0x8DB5, 0x5D6F, 0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, + 0x8DB9, 0x6C99, 0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, + 0x8DBD, 0x9396, 0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, + 0x8DC1, 0x632B, 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, + 0x8DC5, 0x6700, 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, + 0x8DC9, 0x5BB0, 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, + 0x8DCD, 0x683D, 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, + 0x8DD1, 0x91C7, 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, + 0x8DD5, 0x796D, 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, + 0x8DD9, 0x88C1, 0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, + 0x8DDD, 0x5728, 0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, + 0x8DE1, 0x51B4, 0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, + 0x8DE5, 0x698A, 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, + 0x8DE9, 0x57FC, 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, + 0x8DED, 0x524A, 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, + 0x8DF1, 0x6714, 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, + 0x8DF5, 0x7D22, 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, + 0x8DF9, 0x7B39, 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, + 0x8E40, 0x5BDF, 0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, + 0x8E44, 0x672D, 0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, + 0x8E48, 0x7690, 0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, + 0x8E4C, 0x9BAB, 0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, + 0x8E50, 0x5098, 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, + 0x8E54, 0x6492, 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, + 0x8E58, 0x73CA, 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, + 0x8E5C, 0x8695, 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, + 0x8E60, 0x9910, 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, + 0x8E64, 0x4ED5, 0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, + 0x8E68, 0x523A, 0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, + 0x8E6C, 0x56DB, 0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, + 0x8E70, 0x59FF, 0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, + 0x8E74, 0x5E2B, 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, + 0x8E78, 0x652F, 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, + 0x8E7C, 0x65E8, 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, + 0x8E81, 0x6C0F, 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, + 0x8E85, 0x7CF8, 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, + 0x8E89, 0x8102, 0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, + 0x8E8D, 0x8A69, 0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, + 0x8E91, 0x8CC7, 0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, + 0x8E95, 0x6B6F, 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, + 0x8E99, 0x5150, 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, + 0x8E9D, 0x6301, 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, + 0x8EA1, 0x6CBB, 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, + 0x8EA5, 0x78C1, 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, + 0x8EA9, 0x81EA, 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, + 0x8EAD, 0x9E7F, 0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, + 0x8EB1, 0x7AFA, 0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, + 0x8EB5, 0x4E03, 0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, + 0x8EB9, 0x5AC9, 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, + 0x8EBD, 0x6F06, 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, + 0x8EC1, 0x8500, 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, + 0x8EC5, 0x829D, 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, + 0x8EC9, 0x820E, 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, + 0x8ECD, 0x8D66, 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, + 0x8ED1, 0x7D17, 0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, + 0x8ED5, 0x906E, 0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, + 0x8ED9, 0x52FA, 0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, + 0x8EDD, 0x7235, 0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, + 0x8EE1, 0x82E5, 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, + 0x8EE5, 0x4E3B, 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, + 0x8EE9, 0x6731, 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, + 0x8EED, 0x7A2E, 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, + 0x8EF1, 0x9996, 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, + 0x8EF5, 0x5BFF, 0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, + 0x8EF9, 0x9700, 0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, + 0x8F40, 0x5B97, 0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, + 0x8F44, 0x6101, 0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, + 0x8F48, 0x79CB, 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, + 0x8F4C, 0x81ED, 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, + 0x8F50, 0x8972, 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, + 0x8F54, 0x9031, 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, + 0x8F58, 0x919C, 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, + 0x8F5C, 0x5341, 0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, + 0x8F60, 0x6C41, 0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, + 0x8F64, 0x91CD, 0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, + 0x8F68, 0x5BBF, 0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, + 0x8F6C, 0x7C9B, 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, + 0x8F70, 0x8853, 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, + 0x8F74, 0x6625, 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, + 0x8F78, 0x99FF, 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, + 0x8F7C, 0x696F, 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, + 0x8F81, 0x6F64, 0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, + 0x8F85, 0x9075, 0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, + 0x8F89, 0x521D, 0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, + 0x8F8D, 0x6E1A, 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, + 0x8F91, 0x66F8, 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, + 0x8F95, 0x52A9, 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, + 0x8F99, 0x5F90, 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, + 0x8F9D, 0x50B7, 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, + 0x8FA1, 0x5347, 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, + 0x8FA5, 0x5531, 0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, + 0x8FA9, 0x5A3C, 0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, + 0x8FAD, 0x5C11, 0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, + 0x8FB1, 0x5EE0, 0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, + 0x8FB5, 0x62DB, 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, + 0x8FB9, 0x660C, 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, + 0x8FBD, 0x68A2, 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, + 0x8FC1, 0x6D88, 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, + 0x8FC5, 0x7126, 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, + 0x8FC9, 0x785D, 0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, + 0x8FCD, 0x7AE0, 0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, + 0x8FD1, 0x8096, 0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, + 0x8FD5, 0x885D, 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, + 0x8FD9, 0x8A54, 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, + 0x8FDD, 0x91A4, 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, + 0x8FE1, 0x969C, 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, + 0x8FE5, 0x4E1E, 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, + 0x8FE9, 0x57CE, 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, + 0x8FED, 0x5E38, 0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, + 0x8FF1, 0x6756, 0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, + 0x8FF5, 0x7A63, 0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, + 0x8FF9, 0x9320, 0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, + 0x9040, 0x62ED, 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, + 0x9044, 0x7E54, 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, + 0x9048, 0x98DF, 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, + 0x904C, 0x4F38, 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, + 0x9050, 0x5A20, 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, + 0x9054, 0x614E, 0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, + 0x9058, 0x68EE, 0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, + 0x905C, 0x7533, 0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, + 0x9060, 0x79E6, 0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, + 0x9064, 0x85AA, 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, + 0x9068, 0x8F9B, 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, + 0x906C, 0x4EBA, 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, + 0x9070, 0x58EC, 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, + 0x9074, 0x814E, 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, + 0x9078, 0x976D, 0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, + 0x907C, 0x9162, 0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, + 0x9081, 0x5439, 0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, + 0x9085, 0x6C34, 0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, + 0x9089, 0x7FE0, 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, + 0x908D, 0x9310, 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, + 0x9091, 0x9AC4, 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, + 0x9095, 0x67A2, 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, + 0x9099, 0x6749, 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, + 0x909D, 0x96C0, 0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, + 0x90A1, 0x5BF8, 0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, + 0x90A5, 0x662F, 0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, + 0x90A9, 0x59D3, 0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, + 0x90AD, 0x653F, 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, + 0x90B1, 0x68F2, 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, + 0x90B5, 0x7272, 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, + 0x90B9, 0x8056, 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, + 0x90BD, 0x8AA0, 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, + 0x90C1, 0x9192, 0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, + 0x90C5, 0x7A0E, 0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, + 0x90C9, 0x60DC, 0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, + 0x90CD, 0x6790, 0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, + 0x90D1, 0x7E3E, 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, + 0x90D5, 0x8DE1, 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, + 0x90D9, 0x62D9, 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, + 0x90DD, 0x8A2D, 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, + 0x90E1, 0x96EA, 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, + 0x90E5, 0x4ED9, 0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, + 0x90E9, 0x5BA3, 0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, + 0x90ED, 0x6226, 0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, + 0x90F1, 0x6834, 0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, + 0x90F5, 0x67D3, 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, + 0x90F9, 0x65CB, 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, + 0x9140, 0x7E4A, 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, + 0x9144, 0x8239, 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, + 0x9148, 0x8DF5, 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, + 0x914C, 0x9291, 0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, + 0x9150, 0x5584, 0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, + 0x9154, 0x7985, 0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, + 0x9158, 0x564C, 0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, + 0x915C, 0x66FE, 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, + 0x9160, 0x758F, 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, + 0x9164, 0x79DF, 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, + 0x9168, 0x8607, 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, + 0x916C, 0x9F20, 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, + 0x9170, 0x53E2, 0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, + 0x9174, 0x594F, 0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, + 0x9178, 0x531D, 0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, + 0x917C, 0x6383, 0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, + 0x9181, 0x65E9, 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, + 0x9185, 0x69FD, 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, + 0x9189, 0x75E9, 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, + 0x918D, 0x7DCF, 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, + 0x9191, 0x8358, 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, + 0x9195, 0x88C5, 0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, + 0x9199, 0x9397, 0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, + 0x919D, 0x5897, 0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, + 0x91A1, 0x8D08, 0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, + 0x91A5, 0x5247, 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, + 0x91A9, 0x675F, 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, + 0x91AD, 0x4FD7, 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, + 0x91B1, 0x7D9A, 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, + 0x91B5, 0x63C3, 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, + 0x91B9, 0x640D, 0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, + 0x91BD, 0x591A, 0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, + 0x91C1, 0x553E, 0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, + 0x91C5, 0x6253, 0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, + 0x91C9, 0x9640, 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, + 0x91CD, 0x5806, 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, + 0x91D1, 0x5E2F, 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, + 0x91D5, 0x6234, 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, + 0x91D9, 0x80CE, 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, + 0x91DD, 0x8CB8, 0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, + 0x91E1, 0x9EDB, 0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, + 0x91E5, 0x5927, 0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, + 0x91E9, 0x9DF9, 0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, + 0x91ED, 0x5544, 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, + 0x91F1, 0x62D3, 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, + 0x91F5, 0x8A17, 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, + 0x91F9, 0x8338, 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, + 0x9240, 0x53E9, 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, + 0x9244, 0x596A, 0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, + 0x9248, 0x8FBF, 0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, + 0x924C, 0x9C48, 0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, + 0x9250, 0x5358, 0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, + 0x9254, 0x63A2, 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, + 0x9258, 0x6E5B, 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, + 0x925C, 0x7BAA, 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, + 0x9260, 0x86CB, 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, + 0x9264, 0x58C7, 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, + 0x9268, 0x6A80, 0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, + 0x926C, 0x5024, 0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, + 0x9270, 0x6065, 0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, + 0x9274, 0x7A1A, 0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, + 0x9278, 0x9045, 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, + 0x927C, 0x7AF9, 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, + 0x9281, 0x79E9, 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, + 0x9285, 0x7740, 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, + 0x9289, 0x5FE0, 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, + 0x928D, 0x6CE8, 0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, + 0x9291, 0x914E, 0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, + 0x9295, 0x7026, 0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, + 0x9299, 0x8CAF, 0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, + 0x929D, 0x558B, 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, + 0x92A1, 0x5E81, 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, + 0x92A5, 0x5FB4, 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, + 0x92A9, 0x671D, 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, + 0x92AD, 0x773A, 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, + 0x92B1, 0x8776, 0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, + 0x92B5, 0x8DF3, 0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, + 0x92B9, 0x9CE5, 0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, + 0x92BD, 0x6715, 0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, + 0x92C1, 0x93AE, 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, + 0x92C5, 0x690E, 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, + 0x92C9, 0x75DB, 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, + 0x92CD, 0x63B4, 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, + 0x92D1, 0x67D8, 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, + 0x92D5, 0x9354, 0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, + 0x92D9, 0x58F7, 0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, + 0x92DD, 0x540A, 0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, + 0x92E1, 0x4F4E, 0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, + 0x92E5, 0x8C9E, 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, + 0x92E9, 0x5E1D, 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, + 0x92ED, 0x5F1F, 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, + 0x92F1, 0x63D0, 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, + 0x92F5, 0x798E, 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, + 0x92F9, 0x8A02, 0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, + 0x9340, 0x90B8, 0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, + 0x9344, 0x6CE5, 0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, + 0x9348, 0x6EF4, 0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, + 0x934C, 0x93D1, 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, + 0x9350, 0x64A4, 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, + 0x9354, 0x5178, 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, + 0x9358, 0x5E97, 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, + 0x935C, 0x8CBC, 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, + 0x9360, 0x4F1D, 0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, + 0x9364, 0x96FB, 0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, + 0x9368, 0x5857, 0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, + 0x936C, 0x6597, 0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, + 0x9370, 0x83DF, 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, + 0x9374, 0x934D, 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, + 0x9378, 0x5EA6, 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, + 0x937C, 0x5012, 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, + 0x9381, 0x5200, 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, + 0x9385, 0x5957, 0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, + 0x9389, 0x60BC, 0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, + 0x938D, 0x6843, 0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, + 0x9391, 0x6DD8, 0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, + 0x9395, 0x71C8, 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, + 0x9399, 0x7B49, 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, + 0x939D, 0x7D71, 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, + 0x93A1, 0x85E4, 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, + 0x93A5, 0x8E0F, 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, + 0x93A9, 0x9676, 0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, + 0x93AD, 0x50CD, 0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, + 0x93B1, 0x5C0E, 0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, + 0x93B5, 0x77B3, 0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, + 0x93B9, 0x9053, 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, + 0x93BD, 0x533F, 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, + 0x93C1, 0x7279, 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, + 0x93C5, 0x6BD2, 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, + 0x93C9, 0x6A61, 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, + 0x93CD, 0x5C4A, 0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, + 0x93D1, 0x9149, 0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, + 0x93D5, 0x60C7, 0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, + 0x93D9, 0x9041, 0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, + 0x93DD, 0x920D, 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, + 0x93E1, 0x4E4D, 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, + 0x93E5, 0x7058, 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, + 0x93E9, 0x99B4, 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, + 0x93ED, 0x6960, 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, + 0x93F1, 0x4E8C, 0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, + 0x93F5, 0x5302, 0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, + 0x93F9, 0x5EFF, 0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, + 0x9440, 0x5982, 0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, + 0x9444, 0x598A, 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, + 0x9448, 0x79B0, 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, + 0x944C, 0x732B, 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, + 0x9450, 0x637B, 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, + 0x9454, 0x4E43, 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, + 0x9458, 0x56A2, 0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, + 0x945C, 0x80FD, 0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, + 0x9460, 0x8997, 0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, + 0x9464, 0x64AD, 0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, + 0x9468, 0x6D3E, 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, + 0x946C, 0x7F75, 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, + 0x9470, 0x5EC3, 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, + 0x9474, 0x676F, 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, + 0x9478, 0x80BA, 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, + 0x947C, 0x57F9, 0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, + 0x9481, 0x7164, 0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, + 0x9485, 0x8CE0, 0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, + 0x9489, 0x79E4, 0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, + 0x948D, 0x5265, 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, + 0x9491, 0x6CCA, 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, + 0x9495, 0x8236, 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, + 0x9499, 0x6F20, 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, + 0x949D, 0x99C1, 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, + 0x94A1, 0x7872, 0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, + 0x94A5, 0x6AE8, 0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, + 0x94A9, 0x7560, 0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, + 0x94AD, 0x767A, 0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, + 0x94B1, 0x7F70, 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, + 0x94B5, 0x9CE9, 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, + 0x94B9, 0x96BC, 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, + 0x94BD, 0x53CD, 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, + 0x94C1, 0x6591, 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, + 0x94C5, 0x7248, 0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, + 0x94C9, 0x7E41, 0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, + 0x94CD, 0x7BC4, 0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, + 0x94D1, 0x98EF, 0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, + 0x94D5, 0x76E4, 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, + 0x94D9, 0x532A, 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, + 0x94DD, 0x5E87, 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, + 0x94E1, 0x6279, 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, + 0x94E5, 0x6CCC, 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, + 0x94E9, 0x79D8, 0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, + 0x94ED, 0x88AB, 0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, + 0x94F1, 0x975E, 0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, + 0x94F5, 0x5099, 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, + 0x94F9, 0x6BD8, 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, + 0x9540, 0x9F3B, 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, + 0x9544, 0x758B, 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, + 0x9548, 0x83F1, 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, + 0x954C, 0x7562, 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, + 0x9550, 0x59EB, 0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, + 0x9554, 0x8B2C, 0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, + 0x9558, 0x6C37, 0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, + 0x955C, 0x8868, 0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, + 0x9560, 0x63CF, 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, + 0x9564, 0x9328, 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, + 0x9568, 0x9C2D, 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, + 0x956C, 0x6D5C, 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, + 0x9570, 0x983B, 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, + 0x9574, 0x4ED8, 0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, + 0x9578, 0x5BCC, 0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, + 0x957C, 0x6016, 0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, + 0x9581, 0x666E, 0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, + 0x9585, 0x8150, 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, + 0x9589, 0x8CA0, 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, + 0x958D, 0x9644, 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, + 0x9591, 0x821E, 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, + 0x9595, 0x5C01, 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, + 0x9599, 0x8557, 0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, + 0x959D, 0x5E45, 0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, + 0x95A1, 0x8907, 0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, + 0x95A5, 0x6255, 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, + 0x95A9, 0x9B92, 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, + 0x95AD, 0x58B3, 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, + 0x95B1, 0x596E, 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, + 0x95B5, 0x96F0, 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, + 0x95B9, 0x4F75, 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, + 0x95BD, 0x5E73, 0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, + 0x95C1, 0x853D, 0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, + 0x95C5, 0x9801, 0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, + 0x95C9, 0x78A7, 0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, + 0x95CD, 0x7B86, 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, + 0x95D1, 0x7BC7, 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, + 0x95D5, 0x904D, 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, + 0x95D9, 0x5F01, 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, + 0x95DD, 0x92EA, 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, + 0x95E1, 0x752B, 0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, + 0x95E5, 0x52DF, 0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, + 0x95E9, 0x66AE, 0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, + 0x95ED, 0x5023, 0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, + 0x95F1, 0x5831, 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, + 0x95F5, 0x5CEF, 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, + 0x95F9, 0x6367, 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, + 0x9640, 0x6CD5, 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, + 0x9644, 0x7E2B, 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, + 0x9648, 0x84EC, 0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, + 0x964C, 0x8C4A, 0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, + 0x9650, 0x9CF3, 0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, + 0x9654, 0x508D, 0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, + 0x9658, 0x5E3D, 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, + 0x965C, 0x66B4, 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, + 0x9660, 0x5192, 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, + 0x9664, 0x8B00, 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, + 0x9668, 0x9632, 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, + 0x966C, 0x50D5, 0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, + 0x9670, 0x6734, 0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, + 0x9674, 0x91E6, 0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, + 0x9678, 0x5800, 0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, + 0x967C, 0x7FFB, 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, + 0x9681, 0x78E8, 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, + 0x9685, 0x59B9, 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, + 0x9689, 0x54E9, 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, + 0x968D, 0x6795, 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, + 0x9691, 0x685D, 0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, + 0x9695, 0x62B9, 0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, + 0x9699, 0x4FAD, 0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, + 0x969D, 0x6162, 0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, + 0x96A1, 0x5473, 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, + 0x96A5, 0x7B95, 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, + 0x96A9, 0x6E4A, 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, + 0x96AD, 0x5999, 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, + 0x96B1, 0x52D9, 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, + 0x96B5, 0x77DB, 0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, + 0x96B9, 0x5A7F, 0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, + 0x96BD, 0x547D, 0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, + 0x96C1, 0x9298, 0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, + 0x96C5, 0x6EC5, 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, + 0x96C9, 0x7DEC, 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, + 0x96CD, 0x6A21, 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, + 0x96D1, 0x6BDB, 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, + 0x96D5, 0x8017, 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, + 0x96D9, 0x9ED9, 0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, + 0x96DD, 0x9905, 0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, + 0x96E1, 0x8CB0, 0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, + 0x96E5, 0x9580, 0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, + 0x96E9, 0x591C, 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, + 0x96ED, 0x5F25, 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, + 0x96F1, 0x7D04, 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, + 0x96F5, 0x9756, 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, + 0x96F9, 0x6109, 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, + 0x9740, 0x8AED, 0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, + 0x9744, 0x512A, 0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, + 0x9748, 0x5E7D, 0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, + 0x974C, 0x6709, 0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, + 0x9750, 0x7336, 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, + 0x9754, 0x88D5, 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, + 0x9758, 0x90F5, 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, + 0x975C, 0x4E88, 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, + 0x9760, 0x8F3F, 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, + 0x9764, 0x5996, 0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, + 0x9768, 0x63FA, 0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, + 0x976C, 0x69D8, 0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, + 0x9770, 0x7528, 0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, + 0x9774, 0x8449, 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, + 0x9778, 0x8E0A, 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, + 0x977C, 0x617E, 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, + 0x9781, 0x6D74, 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, + 0x9785, 0x7F85, 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, + 0x9789, 0x83B1, 0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, + 0x978D, 0x7D61, 0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, + 0x9791, 0x5375, 0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, + 0x9795, 0x85CD, 0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, + 0x9799, 0x540F, 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, + 0x979D, 0x7406, 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, + 0x97A1, 0x88E1, 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, + 0x97A5, 0x5F8B, 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, + 0x97A9, 0x63A0, 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, + 0x97AD, 0x6E9C, 0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, + 0x97B1, 0x7C92, 0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, + 0x97B5, 0x4FB6, 0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, + 0x97B9, 0x4E86, 0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, + 0x97BD, 0x51CC, 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, + 0x97C1, 0x6DBC, 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, + 0x97C5, 0x7A1C, 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, + 0x97C9, 0x907C, 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, + 0x97CD, 0x529B, 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, + 0x97D1, 0x6797, 0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, + 0x97D5, 0x81E8, 0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, + 0x97D9, 0x9E9F, 0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, + 0x97DD, 0x7D2F, 0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, + 0x97E1, 0x4F8B, 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, + 0x97E5, 0x601C, 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, + 0x97E9, 0x9234, 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, + 0x97ED, 0x9E97, 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, + 0x97F1, 0x5217, 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, + 0x97F5, 0x5EC9, 0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, + 0x97F9, 0x7149, 0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, + 0x9840, 0x84EE, 0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, + 0x9844, 0x9B6F, 0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, + 0x9848, 0x8DEF, 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, + 0x984C, 0x5ECA, 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, + 0x9850, 0x6994, 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, + 0x9854, 0x72FC, 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, + 0x9858, 0x874B, 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, + 0x985C, 0x7984, 0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, + 0x9860, 0x502D, 0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, + 0x9864, 0x8CC4, 0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, + 0x9868, 0x9DF2, 0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, + 0x986C, 0x8A6B, 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, + 0x9870, 0x6E7E, 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, + 0x98A0, 0x4E10, 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, + 0x98A4, 0x4E36, 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, + 0x98A8, 0x4E56, 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, + 0x98AC, 0x8C6B, 0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, + 0x98B0, 0x4E8E, 0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, + 0x98B4, 0x4EA2, 0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, + 0x98B8, 0x4ECE, 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, + 0x98BC, 0x4EC2, 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, + 0x98C0, 0x4EDF, 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, + 0x98C4, 0x4F30, 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, + 0x98C8, 0x4F47, 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, + 0x98CC, 0x4F98, 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, + 0x98D0, 0x4F91, 0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, + 0x98D4, 0x5118, 0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, + 0x98D8, 0x4FD8, 0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, + 0x98DC, 0x4FD0, 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, + 0x98E0, 0x5028, 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, + 0x98E4, 0x5005, 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, + 0x98E8, 0x5029, 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, + 0x98EC, 0x5011, 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, + 0x98F0, 0x6703, 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, + 0x98F4, 0x505A, 0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, + 0x98F8, 0x5080, 0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, + 0x98FC, 0x50B2, 0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, + 0x9943, 0x50C2, 0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, + 0x9947, 0x50ED, 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, + 0x994B, 0x50F5, 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, + 0x994F, 0x5116, 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, + 0x9953, 0x5121, 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, + 0x9957, 0x513B, 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, + 0x995B, 0x514C, 0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, + 0x995F, 0x5169, 0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, + 0x9963, 0x5182, 0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, + 0x9967, 0x518F, 0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, + 0x996B, 0x5196, 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, + 0x996F, 0x51A9, 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, + 0x9973, 0x51B1, 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, + 0x9977, 0x51BD, 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, + 0x997B, 0x51E0, 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, + 0x9980, 0x51F0, 0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, + 0x9984, 0x520B, 0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, + 0x9988, 0x522A, 0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, + 0x998C, 0x524F, 0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, + 0x9990, 0x525E, 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, + 0x9994, 0x5269, 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, + 0x9998, 0x528D, 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, + 0x999C, 0x5288, 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, + 0x99A0, 0x52AC, 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, + 0x99A4, 0x52C1, 0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, + 0x99A8, 0x52E3, 0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, + 0x99AC, 0x52F3, 0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, + 0x99B0, 0x5306, 0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, + 0x99B4, 0x5310, 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, + 0x99B8, 0x5323, 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, + 0x99BC, 0x5338, 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, + 0x99C0, 0x4E17, 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, + 0x99C4, 0x535E, 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, + 0x99C8, 0x537B, 0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, + 0x99CC, 0x53A0, 0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, + 0x99D0, 0x53B0, 0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, + 0x99D4, 0x96D9, 0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, + 0x99D8, 0x53EE, 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, + 0x99DC, 0x5401, 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, + 0x99E0, 0x542D, 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, + 0x99E4, 0x5429, 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, + 0x99E8, 0x5475, 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, + 0x99EC, 0x5477, 0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, + 0x99F0, 0x5480, 0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, + 0x99F4, 0x5486, 0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, + 0x99F8, 0x54A5, 0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, + 0x99FC, 0x54A8, 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, + 0x9A43, 0x54BE, 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, + 0x9A47, 0x54E6, 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, + 0x9A4B, 0x54EE, 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, + 0x9A4F, 0x5539, 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, + 0x9A53, 0x552E, 0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, + 0x9A57, 0x5557, 0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, + 0x9A5B, 0x5599, 0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, + 0x9A5F, 0x559F, 0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, + 0x9A63, 0x559E, 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, + 0x9A67, 0x55A9, 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, + 0x9A6B, 0x55C5, 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, + 0x9A6F, 0x55E4, 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, + 0x9A73, 0x5616, 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, + 0x9A77, 0x55F9, 0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, + 0x9A7B, 0x5634, 0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, + 0x9A80, 0x566B, 0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, + 0x9A84, 0x566A, 0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, + 0x9A88, 0x56A0, 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, + 0x9A8C, 0x56AE, 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, + 0x9A90, 0x56BC, 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, + 0x9A94, 0x56C8, 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, + 0x9A98, 0x56D7, 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, + 0x9A9C, 0x56FF, 0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, + 0x9AA0, 0x570B, 0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, + 0x9AA4, 0x5716, 0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, + 0x9AA8, 0x5737, 0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, + 0x9AAC, 0x5740, 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, + 0x9AB0, 0x5788, 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, + 0x9AB4, 0x5793, 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, + 0x9AB8, 0x57AA, 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, + 0x9ABC, 0x57D4, 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, + 0x9AC0, 0x57D6, 0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, + 0x9AC4, 0x581D, 0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, + 0x9AC8, 0x584B, 0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, + 0x9ACC, 0x583D, 0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, + 0x9AD0, 0x589F, 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, + 0x9AD4, 0x58BB, 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, + 0x9AD8, 0x58D3, 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, + 0x9ADC, 0x58D8, 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, + 0x9AE0, 0x58DF, 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, + 0x9AE4, 0x58FB, 0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, + 0x9AE8, 0x590A, 0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, + 0x9AEC, 0x5925, 0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, + 0x9AF0, 0x5938, 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, + 0x9AF4, 0x5950, 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, + 0x9AF8, 0x5962, 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, + 0x9AFC, 0x5969, 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, + 0x9B43, 0x4F5E, 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, + 0x9B47, 0x59C6, 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, + 0x9B4B, 0x59D9, 0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, + 0x9B4F, 0x5A11, 0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, + 0x9B53, 0x5A40, 0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, + 0x9B57, 0x5A36, 0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, + 0x9B5B, 0x5ABC, 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, + 0x9B5F, 0x5ABD, 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, + 0x9B63, 0x5AE9, 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, + 0x9B67, 0x5B0C, 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, + 0x9B6B, 0x5AD0, 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, + 0x9B6F, 0x5B43, 0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, + 0x9B73, 0x5B55, 0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, + 0x9B77, 0x5B69, 0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, + 0x9B7B, 0x5B78, 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, + 0x9B80, 0x5B83, 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, + 0x9B84, 0x5BC7, 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, + 0x9B88, 0x5BE4, 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, + 0x9B8C, 0x5BE5, 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, + 0x9B90, 0x5BF3, 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, + 0x9B94, 0x5C0D, 0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, + 0x9B98, 0x5C28, 0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, + 0x9B9C, 0x5C46, 0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, + 0x9BA0, 0x5C4F, 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, + 0x9BA4, 0x4E62, 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, + 0x9BA8, 0x5C91, 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, + 0x9BAC, 0x5CBB, 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, + 0x9BB0, 0x5CC5, 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, + 0x9BB4, 0x5CE9, 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, + 0x9BB8, 0x5D8C, 0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, + 0x9BBC, 0x5D17, 0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, + 0x9BC0, 0x5D11, 0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, + 0x9BC4, 0x5D19, 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, + 0x9BC8, 0x5D4E, 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, + 0x9BCC, 0x5D76, 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, + 0x9BD0, 0x5DA2, 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, + 0x9BD4, 0x5DBD, 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, + 0x9BD8, 0x5DC9, 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, + 0x9BDC, 0x5DD6, 0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, + 0x9BE0, 0x5DF5, 0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, + 0x9BE4, 0x5E11, 0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, + 0x9BE8, 0x5E44, 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, + 0x9BEC, 0x5E57, 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, + 0x9BF0, 0x5E64, 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, + 0x9BF4, 0x5E7A, 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, + 0x9BF8, 0x5EC1, 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, + 0x9BFC, 0x5ECF, 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, + 0x9C43, 0x5EDA, 0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, + 0x9C47, 0x5EE8, 0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, + 0x9C4B, 0x5EF3, 0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, + 0x9C4F, 0x5EFE, 0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, + 0x9C53, 0x5F5C, 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, + 0x9C57, 0x5F29, 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, + 0x9C5B, 0x5F48, 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, + 0x9C5F, 0x5F51, 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, + 0x9C63, 0x5F61, 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, + 0x9C67, 0x5F83, 0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, + 0x9C6B, 0x5F88, 0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, + 0x9C6F, 0x5F99, 0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, + 0x9C73, 0x5FAD, 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, + 0x9C77, 0x5FE4, 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, + 0x9C7B, 0x60B3, 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, + 0x9C80, 0x6019, 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, + 0x9C84, 0x6031, 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, + 0x9C88, 0x6026, 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, + 0x9C8C, 0x6041, 0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, + 0x9C90, 0x604A, 0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, + 0x9C94, 0x6043, 0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, + 0x9C98, 0x606B, 0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, + 0x9C9C, 0x60E7, 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, + 0x9CA0, 0x609B, 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, + 0x9CA4, 0x60A7, 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, + 0x9CA8, 0x60E0, 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, + 0x9CAC, 0x60BD, 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, + 0x9CB0, 0x614D, 0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, + 0x9CB4, 0x60F7, 0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, + 0x9CB8, 0x6103, 0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, + 0x9CBC, 0x610D, 0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, + 0x9CC0, 0x6128, 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, + 0x9CC4, 0x613C, 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, + 0x9CC8, 0x6142, 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, + 0x9CCC, 0x6158, 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, + 0x9CD0, 0x6174, 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, + 0x9CD4, 0x615F, 0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, + 0x9CD8, 0x6199, 0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, + 0x9CDC, 0x6194, 0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, + 0x9CE0, 0x61AB, 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, + 0x9CE4, 0x61C9, 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, + 0x9CE8, 0x61C6, 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, + 0x9CEC, 0x61CD, 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, + 0x9CF0, 0x61FA, 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, + 0x9CF4, 0x61FC, 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, + 0x9CF8, 0x6209, 0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, + 0x9CFC, 0x621B, 0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, + 0x9D43, 0x622E, 0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, + 0x9D47, 0x6241, 0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, + 0x9D4B, 0x625B, 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, + 0x9D4F, 0x6282, 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, + 0x9D53, 0x6293, 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, + 0x9D57, 0x6294, 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, + 0x9D5B, 0x62CF, 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, + 0x9D5F, 0x62C8, 0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, + 0x9D63, 0x62C2, 0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, + 0x9D67, 0x630C, 0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, + 0x9D6B, 0x6302, 0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, + 0x9D6F, 0x6350, 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, + 0x9D73, 0x634F, 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, + 0x9D77, 0x63AB, 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, + 0x9D7B, 0x6389, 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, + 0x9D80, 0x6369, 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, + 0x9D84, 0x63C6, 0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, + 0x9D88, 0x63F6, 0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, + 0x9D8C, 0x6406, 0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, + 0x9D90, 0x651D, 0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, + 0x9D94, 0x6467, 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, + 0x9D98, 0x652A, 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, + 0x9D9C, 0x64A9, 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, + 0x9DA0, 0x64D2, 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, + 0x9DA4, 0x64D8, 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, + 0x9DA8, 0x8209, 0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, + 0x9DAC, 0x64E3, 0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, + 0x9DB0, 0x64F4, 0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, + 0x9DB4, 0x64FD, 0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, + 0x9DB8, 0x6524, 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, + 0x9DBC, 0x6535, 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, + 0x9DC0, 0x754B, 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, + 0x9DC4, 0x654D, 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, + 0x9DC8, 0x6572, 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, + 0x9DCC, 0x8B8A, 0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, + 0x9DD0, 0x65B7, 0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, + 0x9DD4, 0x65C4, 0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, + 0x9DD8, 0x65D9, 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, + 0x9DDC, 0x6772, 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, + 0x9DE0, 0x6773, 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, + 0x9DE4, 0x661C, 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, + 0x9DE8, 0x6641, 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, + 0x9DEC, 0x6667, 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, + 0x9DF0, 0x6670, 0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, + 0x9DF4, 0x6689, 0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, + 0x9DF8, 0x66C1, 0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, + 0x9DFC, 0x66BC, 0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, + 0x9E43, 0x66DA, 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, + 0x9E47, 0x66E9, 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, + 0x9E4B, 0x670F, 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, + 0x9E4F, 0x6727, 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, + 0x9E53, 0x6736, 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, + 0x9E57, 0x6746, 0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, + 0x9E5B, 0x6763, 0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, + 0x9E5F, 0x67A9, 0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, + 0x9E63, 0x678B, 0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, + 0x9E67, 0x67B7, 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, + 0x9E6B, 0x67B3, 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, + 0x9E6F, 0x67DE, 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, + 0x9E73, 0x67B9, 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, + 0x9E77, 0x6A9C, 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, + 0x9E7B, 0x6840, 0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, + 0x9E80, 0x68B3, 0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, + 0x9E84, 0x6877, 0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, + 0x9E88, 0x68AD, 0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, + 0x9E8C, 0x6883, 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, + 0x9E90, 0x68B5, 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, + 0x9E94, 0x688D, 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, + 0x9E98, 0x6908, 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, + 0x9E9C, 0x68E1, 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, + 0x9EA0, 0x68E7, 0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, + 0x9EA4, 0x6904, 0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, + 0x9EA8, 0x68F9, 0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, + 0x9EAC, 0x692A, 0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, + 0x9EB0, 0x68C6, 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, + 0x9EB4, 0x6978, 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, + 0x9EB8, 0x696E, 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, + 0x9EBC, 0x6959, 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, + 0x9EC0, 0x695D, 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, + 0x9EC4, 0x69AE, 0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, + 0x9EC8, 0x69D3, 0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, + 0x9ECC, 0x69CA, 0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, + 0x9ED0, 0x69A7, 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, + 0x9ED4, 0x699C, 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, + 0x9ED8, 0x69E8, 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, + 0x9EDC, 0x6B0A, 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, + 0x9EE0, 0x6A05, 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, + 0x9EE4, 0x6A14, 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, + 0x9EE8, 0x6AC1, 0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, + 0x9EEC, 0x6A0C, 0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, + 0x9EF0, 0x6A47, 0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, + 0x9EF4, 0x6A48, 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, + 0x9EF8, 0x6A8D, 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, + 0x9EFC, 0x6AA3, 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, + 0x9F43, 0x6AC3, 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, + 0x9F47, 0x6AAC, 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, + 0x9F4B, 0x6AAA, 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, + 0x9F4F, 0x6B05, 0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, + 0x9F53, 0x6B16, 0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, + 0x9F57, 0x6B37, 0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, + 0x9F5B, 0x6B47, 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, + 0x9F5F, 0x6B59, 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, + 0x9F63, 0x6B61, 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, + 0x9F67, 0x6B80, 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, + 0x9F6B, 0x6B98, 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, + 0x9F6F, 0x6BAA, 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, + 0x9F73, 0x6BB1, 0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, + 0x9F77, 0x6BC6, 0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, + 0x9F7B, 0x6BEC, 0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, + 0x9F80, 0x9EBE, 0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, + 0x9F84, 0x6C1B, 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, + 0x9F88, 0x6C55, 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, + 0x9F8C, 0x6C8D, 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, + 0x9F90, 0x6C7E, 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, + 0x9F94, 0x6C90, 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, + 0x9F98, 0x6CBD, 0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, + 0x9F9C, 0x6CAE, 0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, + 0x9FA0, 0x6CDB, 0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, + 0x9FA4, 0x6D1F, 0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, + 0x9FA8, 0x6D3D, 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, + 0x9FAC, 0x6D33, 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, + 0x9FB0, 0x6D93, 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, + 0x9FB4, 0x6D59, 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, + 0x9FB8, 0x6D85, 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, + 0x9FBC, 0x6DB5, 0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, + 0x9FC0, 0x6DC6, 0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, + 0x9FC4, 0x6DE8, 0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, + 0x9FC8, 0x6DD9, 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, + 0x9FCC, 0x6DEE, 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, + 0x9FD0, 0x6E19, 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, + 0x9FD4, 0x6E23, 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, + 0x9FD8, 0x6E4D, 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, + 0x9FDC, 0x6E4E, 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, + 0x9FE0, 0x6E38, 0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, + 0x9FE4, 0x6EC9, 0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, + 0x9FE8, 0x6EAF, 0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, + 0x9FEC, 0x6ED5, 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, + 0x9FF0, 0x6E9F, 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, + 0x9FF4, 0x6EEC, 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, + 0x9FF8, 0x6EF2, 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, + 0x9FFC, 0x6ECC, 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, + 0xE043, 0x6F86, 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, + 0xE047, 0x6F80, 0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, + 0xE04B, 0x6F6D, 0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, + 0xE04F, 0x6F8E, 0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, + 0xE053, 0x6FB3, 0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, + 0xE057, 0x6FB9, 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, + 0xE05B, 0x6FD5, 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, + 0xE05F, 0x6FF1, 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, + 0xE063, 0x700B, 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, + 0xE067, 0x700F, 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, + 0xE06B, 0x6F74, 0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, + 0xE06F, 0x7030, 0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, + 0xE073, 0x7063, 0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, + 0xE077, 0x70F1, 0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, + 0xE07B, 0x70AE, 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, + 0xE080, 0x70D9, 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, + 0xE084, 0x7119, 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, + 0xE088, 0x7166, 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, + 0xE08C, 0x716C, 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, + 0xE090, 0x7195, 0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, + 0xE094, 0x71B9, 0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, + 0xE098, 0x71D4, 0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, + 0xE09C, 0x71E7, 0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, + 0xE0A0, 0x71FF, 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, + 0xE0A4, 0x7228, 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, + 0xE0A8, 0x7232, 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, + 0xE0AC, 0x7240, 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, + 0xE0B0, 0x7274, 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, + 0xE0B4, 0x7287, 0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, + 0xE0B8, 0x72A7, 0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, + 0xE0BC, 0x72C6, 0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, + 0xE0C0, 0x72E2, 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, + 0xE0C4, 0x72F7, 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, + 0xE0C8, 0x731C, 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, + 0xE0CC, 0x732F, 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, + 0xE0D0, 0x734E, 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, + 0xE0D4, 0x736A, 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, + 0xE0D8, 0x7375, 0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, + 0xE0DC, 0x73B3, 0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, + 0xE0E0, 0x73E5, 0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, + 0xE0E4, 0x7405, 0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, + 0xE0E8, 0x7432, 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, + 0xE0EC, 0x745F, 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, + 0xE0F0, 0x7469, 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, + 0xE0F4, 0x7476, 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, + 0xE0F8, 0x74A7, 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, + 0xE0FC, 0x73F1, 0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, + 0xE143, 0x74E9, 0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, + 0xE147, 0x74F1, 0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, + 0xE14B, 0x7503, 0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, + 0xE14F, 0x750D, 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, + 0xE153, 0x7526, 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, + 0xE157, 0x754D, 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, + 0xE15B, 0x7546, 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, + 0xE15F, 0x7567, 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, + 0xE163, 0x7576, 0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, + 0xE167, 0x758A, 0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, + 0xE16B, 0x759A, 0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, + 0xE16F, 0x75C2, 0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, + 0xE173, 0x75BD, 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, + 0xE177, 0x75CD, 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, + 0xE17B, 0x75E3, 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, + 0xE180, 0x75FC, 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, + 0xE184, 0x75F2, 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, + 0xE188, 0x7609, 0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, + 0xE18C, 0x7621, 0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, + 0xE190, 0x7630, 0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, + 0xE194, 0x7646, 0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, + 0xE198, 0x7662, 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, + 0xE19C, 0x7667, 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, + 0xE1A0, 0x7676, 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, + 0xE1A4, 0x7683, 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, + 0xE1A8, 0x7696, 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, + 0xE1AC, 0x76B0, 0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, + 0xE1B0, 0x76BA, 0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, + 0xE1B4, 0x76D2, 0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, + 0xE1B8, 0x76E7, 0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, + 0xE1BC, 0x7708, 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, + 0xE1C0, 0x7724, 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, + 0xE1C4, 0x771B, 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, + 0xE1C8, 0x775A, 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, + 0xE1CC, 0x7765, 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, + 0xE1D0, 0x778E, 0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, + 0xE1D4, 0x779E, 0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, + 0xE1D8, 0x77BF, 0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, + 0xE1DC, 0x77C7, 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, + 0xE1E0, 0x77DC, 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, + 0xE1E4, 0x780C, 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, + 0xE1E8, 0x792A, 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, + 0xE1EC, 0x7886, 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, + 0xE1F0, 0x78A3, 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, + 0xE1F4, 0x78D1, 0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, + 0xE1F8, 0x78BE, 0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, + 0xE1FC, 0x78EC, 0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, + 0xE243, 0x78F4, 0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, + 0xE247, 0x7919, 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, + 0xE24B, 0x7960, 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, + 0xE24F, 0x7955, 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, + 0xE253, 0x798A, 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, + 0xE257, 0x79AA, 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, + 0xE25B, 0x79BA, 0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, + 0xE25F, 0x79EC, 0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, + 0xE263, 0x7A0D, 0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, + 0xE267, 0x7A1F, 0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, + 0xE26B, 0x7A3E, 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, + 0xE26F, 0x7A49, 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, + 0xE273, 0x9F9D, 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, + 0xE277, 0x7A88, 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, + 0xE27B, 0x7A96, 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, + 0xE280, 0x7AB6, 0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, + 0xE284, 0x9083, 0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, + 0xE288, 0x7ACF, 0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, + 0xE28C, 0x7ADA, 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, + 0xE290, 0x7AE6, 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, + 0xE294, 0x7B0F, 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, + 0xE298, 0x7B18, 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, + 0xE29C, 0x7B28, 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, + 0xE2A0, 0x7B04, 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, + 0xE2A4, 0x7B45, 0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, + 0xE2A8, 0x7B67, 0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, + 0xE2AC, 0x7B6E, 0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, + 0xE2B0, 0x7B8D, 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, + 0xE2B4, 0x7B92, 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, + 0xE2B8, 0x7BCB, 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, + 0xE2BC, 0x7BB4, 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, + 0xE2C0, 0x7C11, 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, + 0xE2C4, 0x7C60, 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, + 0xE2C8, 0x7BF3, 0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, + 0xE2CC, 0x7BF6, 0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, + 0xE2D0, 0x7C1F, 0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, + 0xE2D4, 0x7C4C, 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, + 0xE2D8, 0x7C40, 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, + 0xE2DC, 0x7C64, 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, + 0xE2E0, 0x7C75, 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, + 0xE2E4, 0x7CAD, 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, + 0xE2E8, 0x7CA8, 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, + 0xE2EC, 0x7CAE, 0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, + 0xE2F0, 0x7CC5, 0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, + 0xE2F4, 0x7CDC, 0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, + 0xE2F8, 0x7CF2, 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, + 0xE2FC, 0x7D06, 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, + 0xE343, 0x7D0A, 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, + 0xE347, 0x7D32, 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, + 0xE34B, 0x7D73, 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, + 0xE34F, 0x7D68, 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, + 0xE353, 0x7D93, 0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, + 0xE357, 0x7D7D, 0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, + 0xE35B, 0x7DA3, 0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, + 0xE35F, 0x7DAB, 0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, + 0xE363, 0x7DDC, 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, + 0xE367, 0x7DD8, 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, + 0xE36B, 0x7DFB, 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, + 0xE36F, 0x7E0A, 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, + 0xE373, 0x7E31, 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, + 0xE377, 0x7E22, 0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, + 0xE37B, 0x7E35, 0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, + 0xE380, 0x7E32, 0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, + 0xE384, 0x7E56, 0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, + 0xE388, 0x7E79, 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, + 0xE38C, 0x7E7B, 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, + 0xE390, 0x8FAE, 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, + 0xE394, 0x7E8C, 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, + 0xE398, 0x7E94, 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, + 0xE39C, 0x7E9C, 0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, + 0xE3A0, 0x7F4C, 0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, + 0xE3A4, 0x7F51, 0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, + 0xE3A8, 0x7F5F, 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, + 0xE3AC, 0x7F67, 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, + 0xE3B0, 0x7F83, 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, + 0xE3B4, 0x7F94, 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, + 0xE3B8, 0x7FA3, 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, + 0xE3BC, 0x7FAE, 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, + 0xE3C0, 0x7FC5, 0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, + 0xE3C4, 0x7FD4, 0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, + 0xE3C8, 0x7FF3, 0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, + 0xE3CC, 0x8004, 0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, + 0xE3D0, 0x8019, 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, + 0xE3D4, 0x803F, 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, + 0xE3D8, 0x8052, 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, + 0xE3DC, 0x8062, 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, + 0xE3E0, 0x8070, 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, + 0xE3E4, 0x807F, 0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, + 0xE3E8, 0x809B, 0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, + 0xE3EC, 0x5190, 0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, + 0xE3F0, 0x80D9, 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, + 0xE3F4, 0x80D6, 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, + 0xE3F8, 0x811B, 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, + 0xE3FC, 0x814B, 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, + 0xE443, 0x8153, 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, + 0xE447, 0x816E, 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, + 0xE44B, 0x8183, 0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, + 0xE44F, 0x8182, 0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, + 0xE453, 0x81A3, 0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, + 0xE457, 0x81B0, 0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, + 0xE45B, 0x81BD, 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, + 0xE45F, 0x81C9, 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, + 0xE463, 0x81D8, 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, + 0xE467, 0x81E0, 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, + 0xE46B, 0x81FE, 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, + 0xE46F, 0x8207, 0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, + 0xE473, 0x8216, 0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, + 0xE477, 0x8233, 0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, + 0xE47B, 0x825D, 0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, + 0xE480, 0x8262, 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, + 0xE484, 0x822E, 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, + 0xE488, 0x827E, 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, + 0xE48C, 0x829F, 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, + 0xE490, 0x82E3, 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, + 0xE494, 0x82F3, 0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, + 0xE498, 0x82FB, 0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, + 0xE49C, 0x82DC, 0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, + 0xE4A0, 0x8334, 0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, + 0xE4A4, 0x8340, 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, + 0xE4A8, 0x832F, 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, + 0xE4AC, 0x8385, 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, + 0xE4B0, 0x83A2, 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, + 0xE4B4, 0x8387, 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, + 0xE4B8, 0x8373, 0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, + 0xE4BC, 0x83A8, 0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, + 0xE4C0, 0x83CE, 0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, + 0xE4C4, 0x840B, 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, + 0xE4C8, 0x83E0, 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, + 0xE4CC, 0x8420, 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, + 0xE4D0, 0x83FB, 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, + 0xE4D4, 0x855A, 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, + 0xE4D8, 0x84AD, 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, + 0xE4DC, 0x8446, 0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, + 0xE4E0, 0x8435, 0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, + 0xE4E4, 0x84BF, 0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, + 0xE4E8, 0x84BB, 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, + 0xE4EC, 0x84C6, 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, + 0xE4F0, 0x84FF, 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, + 0xE4F4, 0x852C, 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, + 0xE4F8, 0x84FC, 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, + 0xE4FC, 0x8548, 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, + 0xE543, 0x8555, 0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, + 0xE547, 0x8591, 0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, + 0xE54B, 0x8594, 0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, + 0xE54F, 0x859C, 0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, + 0xE553, 0x85C9, 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, + 0xE557, 0x85D0, 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, + 0xE55B, 0x85DC, 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, + 0xE55F, 0x860B, 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, + 0xE563, 0x8622, 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, + 0xE567, 0x864D, 0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, + 0xE56B, 0x8667, 0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, + 0xE56F, 0x86A9, 0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, + 0xE573, 0x86B6, 0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, + 0xE577, 0x86B0, 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, + 0xE57B, 0x86D4, 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, + 0xE580, 0x86DF, 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, + 0xE584, 0x8706, 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, + 0xE588, 0x86FB, 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, + 0xE58C, 0x86F9, 0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, + 0xE590, 0x8737, 0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, + 0xE594, 0x871A, 0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, + 0xE598, 0x874C, 0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, + 0xE59C, 0x8768, 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, + 0xE5A0, 0x8763, 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, + 0xE5A4, 0x879F, 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, + 0xE5A8, 0x87BD, 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, + 0xE5AC, 0x87AB, 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, + 0xE5B0, 0x87C6, 0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, + 0xE5B4, 0x87E0, 0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, + 0xE5B8, 0x87F6, 0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, + 0xE5BC, 0x8811, 0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, + 0xE5C0, 0x8821, 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, + 0xE5C4, 0x8827, 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, + 0xE5C8, 0x8852, 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, + 0xE5CC, 0x886B, 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, + 0xE5D0, 0x8875, 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, + 0xE5D4, 0x8882, 0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, + 0xE5D8, 0x8899, 0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, + 0xE5DC, 0x88B0, 0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, + 0xE5E0, 0x88C4, 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, + 0xE5E4, 0x88DD, 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, + 0xE5E8, 0x88F4, 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, + 0xE5EC, 0x890C, 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, + 0xE5F0, 0x891E, 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, + 0xE5F4, 0x8941, 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, + 0xE5F8, 0x8938, 0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, + 0xE5FC, 0x895E, 0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, + 0xE643, 0x896A, 0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, + 0xE647, 0x897E, 0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, + 0xE64B, 0x8993, 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, + 0xE64F, 0x89A6, 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, + 0xE653, 0x89BA, 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, + 0xE657, 0x89DA, 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, + 0xE65B, 0x89F4, 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, + 0xE65F, 0x8A10, 0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, + 0xE663, 0x8A25, 0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, + 0xE667, 0x8A52, 0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, + 0xE66B, 0x8A6D, 0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, + 0xE66F, 0x8A82, 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, + 0xE673, 0x8A91, 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, + 0xE677, 0x8AA3, 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, + 0xE67B, 0x8ADA, 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, + 0xE680, 0x8AE4, 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, + 0xE684, 0x8AE2, 0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, + 0xE688, 0x8B0C, 0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, + 0xE68C, 0x8B16, 0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, + 0xE690, 0x8B33, 0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, + 0xE694, 0x8B3E, 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, + 0xE698, 0x8B4F, 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, + 0xE69C, 0x8B5B, 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, + 0xE6A0, 0x8B6C, 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, + 0xE6A4, 0x8B80, 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, + 0xE6A8, 0x8B93, 0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, + 0xE6AC, 0x8C3A, 0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, + 0xE6B0, 0x8C4C, 0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, + 0xE6B4, 0x8C62, 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, + 0xE6B8, 0x8C82, 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, + 0xE6BC, 0x8C8D, 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, + 0xE6C0, 0x8C98, 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, + 0xE6C4, 0x8CBD, 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, + 0xE6C8, 0x8CB6, 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, + 0xE6CC, 0x8CE3, 0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, + 0xE6D0, 0x8CFB, 0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, + 0xE6D4, 0x8D07, 0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, + 0xE6D8, 0x9F4E, 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, + 0xE6DC, 0x8D16, 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, + 0xE6E0, 0x8D73, 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, + 0xE6E4, 0x8DBE, 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, + 0xE6E8, 0x8DD6, 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, + 0xE6EC, 0x8DEA, 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, + 0xE6F0, 0x8DFC, 0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, + 0xE6F4, 0x8E1D, 0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, + 0xE6F8, 0x8E42, 0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, + 0xE6FC, 0x8E4A, 0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, + 0xE743, 0x8E50, 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, + 0xE747, 0x8E60, 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, + 0xE74B, 0x8E76, 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, + 0xE74F, 0x8E87, 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, + 0xE753, 0x8E8A, 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, + 0xE757, 0x8E99, 0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, + 0xE75B, 0x8EB0, 0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, + 0xE75F, 0x8EC5, 0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, + 0xE763, 0x8EE3, 0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, + 0xE767, 0x8EFE, 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, + 0xE76B, 0x8F12, 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, + 0xE76F, 0x8F1F, 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, + 0xE773, 0x8F33, 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, + 0xE777, 0x8F42, 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, + 0xE77B, 0x8F46, 0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, + 0xE780, 0x8F62, 0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, + 0xE784, 0x8F9F, 0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, + 0xE788, 0x8FB7, 0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, + 0xE78C, 0x8FEA, 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, + 0xE790, 0x9005, 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, + 0xE794, 0x9015, 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, + 0xE798, 0x9016, 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, + 0xE79C, 0x9035, 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, + 0xE7A0, 0x9050, 0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, + 0xE7A4, 0x9049, 0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, + 0xE7A8, 0x905E, 0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, + 0xE7AC, 0x96A8, 0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, + 0xE7B0, 0x9081, 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, + 0xE7B4, 0x908F, 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, + 0xE7B8, 0x90B5, 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, + 0xE7BC, 0x90DB, 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, + 0xE7C0, 0x9132, 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, + 0xE7C4, 0x9158, 0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, + 0xE7C8, 0x9173, 0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, + 0xE7CC, 0x9182, 0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, + 0xE7D0, 0x91AA, 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, + 0xE7D4, 0x91C0, 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, + 0xE7D8, 0x91D0, 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, + 0xE7DC, 0x91DB, 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, + 0xE7E0, 0x921E, 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, + 0xE7E4, 0x9215, 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, + 0xE7E8, 0x9245, 0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, + 0xE7EC, 0x9295, 0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, + 0xE7F0, 0x929C, 0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, + 0xE7F4, 0x925A, 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, + 0xE7F8, 0x92E9, 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, + 0xE7FC, 0x932E, 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, + 0xE843, 0x9323, 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, + 0xE847, 0x935C, 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, + 0xE84B, 0x9356, 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, + 0xE84F, 0x9394, 0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, + 0xE853, 0x93E8, 0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, + 0xE857, 0x93DD, 0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, + 0xE85B, 0x941A, 0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, + 0xE85F, 0x9407, 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, + 0xE863, 0x9435, 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, + 0xE867, 0x9452, 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, + 0xE86B, 0x9462, 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, + 0xE86F, 0x9470, 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, + 0xE873, 0x945A, 0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, + 0xE877, 0x947F, 0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, + 0xE87B, 0x9594, 0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, + 0xE880, 0x95A0, 0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, + 0xE884, 0x95BC, 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, + 0xE888, 0x95CA, 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, + 0xE88C, 0x95CC, 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, + 0xE890, 0x95DC, 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, + 0xE894, 0x9621, 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, + 0xE898, 0x9642, 0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, + 0xE89C, 0x9677, 0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, + 0xE8A0, 0x965F, 0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, + 0xE8A4, 0x968D, 0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, + 0xE8A8, 0x96AA, 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, + 0xE8AC, 0x96B0, 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, + 0xE8B0, 0x96B9, 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, + 0xE8B4, 0x96CD, 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, + 0xE8B8, 0x96D5, 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, + 0xE8BC, 0x9708, 0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, + 0xE8C0, 0x970F, 0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, + 0xE8C4, 0x972A, 0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, + 0xE8C8, 0x973E, 0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, + 0xE8CC, 0x9742, 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, + 0xE8D0, 0x9764, 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, + 0xE8D4, 0x976B, 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, + 0xE8D8, 0x977C, 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, + 0xE8DC, 0x978B, 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, + 0xE8E0, 0x97A8, 0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, + 0xE8E4, 0x97B4, 0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, + 0xE8E8, 0x97CB, 0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, + 0xE8EC, 0x97F2, 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, + 0xE8F0, 0x980F, 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, + 0xE8F4, 0x9821, 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, + 0xE8F8, 0x984F, 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, + 0xE8FC, 0x9870, 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, + 0xE943, 0x98AA, 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, + 0xE947, 0x98C4, 0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, + 0xE94B, 0x98EB, 0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, + 0xE94F, 0x9914, 0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, + 0xE953, 0x991E, 0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, + 0xE957, 0x992E, 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, + 0xE95B, 0x9949, 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, + 0xE95F, 0x9951, 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, + 0xE963, 0x9997, 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, + 0xE967, 0x99AE, 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, + 0xE96B, 0x99DD, 0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, + 0xE96F, 0x99EE, 0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, + 0xE973, 0x99F8, 0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, + 0xE977, 0x99E2, 0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, + 0xE97B, 0x9A45, 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, + 0xE980, 0x9A3E, 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, + 0xE984, 0x9A57, 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, + 0xE988, 0x9A64, 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, + 0xE98C, 0x9AAD, 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, + 0xE990, 0x9ACF, 0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, + 0xE994, 0x9ADE, 0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, + 0xE998, 0x9AE6, 0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, + 0xE99C, 0x9AF4, 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, + 0xE9A0, 0x9B06, 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, + 0xE9A4, 0x9B22, 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, + 0xE9A8, 0x9B28, 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, + 0xE9AC, 0x9B2F, 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, + 0xE9B0, 0x9B4F, 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, + 0xE9B4, 0x9B58, 0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, + 0xE9B8, 0x9B91, 0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, + 0xE9BC, 0x9BA0, 0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, + 0xE9C0, 0x9BCA, 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, + 0xE9C4, 0x9BD1, 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, + 0xE9C8, 0x9BE4, 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, + 0xE9CC, 0x9BF2, 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, + 0xE9D0, 0x9C14, 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, + 0xE9D4, 0x9C06, 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, + 0xE9D8, 0x9C04, 0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, + 0xE9DC, 0x9C24, 0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, + 0xE9E0, 0x9C32, 0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, + 0xE9E4, 0x9C60, 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, + 0xE9E8, 0x9CE7, 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, + 0xE9EC, 0x9D08, 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, + 0xE9F0, 0x9D2A, 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, + 0xE9F4, 0x9D1F, 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, + 0xE9F8, 0x9D41, 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, + 0xE9FC, 0x9D48, 0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, + 0xEA43, 0x9D51, 0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, + 0xEA47, 0x9D89, 0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, + 0xEA4B, 0x9D7A, 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, + 0xEA4F, 0x9DB2, 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, + 0xEA53, 0x9DB8, 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, + 0xEA57, 0x9DC2, 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, + 0xEA5B, 0x9DE6, 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, + 0xEA5F, 0x9E1A, 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, + 0xEA63, 0x9E79, 0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, + 0xEA67, 0x9E8B, 0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, + 0xEA6B, 0x9E91, 0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, + 0xEA6F, 0x9EB8, 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, + 0xEA73, 0x9ECC, 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, + 0xEA77, 0x9ED4, 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, + 0xEA7B, 0x9EE0, 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, + 0xEA80, 0x9EF4, 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, + 0xEA84, 0x9EFB, 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, + 0xEA88, 0x9F08, 0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, + 0xEA8C, 0x9F2C, 0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, + 0xEA90, 0x9F54, 0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, + 0xEA94, 0x9F61, 0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, + 0xEA98, 0x9F6A, 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, + 0xEA9C, 0x9F95, 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, + 0xEAA0, 0x69C7, 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, + 0xEAA4, 0x7199, 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, + 0xFA43, 0x2173, 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, + 0xFA47, 0x2177, 0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, + 0xFA56, 0xFF07, 0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, + 0xFA5E, 0x9348, 0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, + 0xFA62, 0x70BB, 0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, + 0xFA66, 0x66FB, 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, + 0xFA6A, 0x4EFC, 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, + 0xFA6E, 0x4F56, 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, + 0xFA72, 0x4F94, 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, + 0xFA76, 0x4FFF, 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, + 0xFA7A, 0x5042, 0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, + 0xFA7E, 0x514A, 0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, + 0xFA83, 0x51EC, 0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, + 0xFA87, 0x52C0, 0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, + 0xFA8B, 0x5324, 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, + 0xFA8F, 0x53DD, 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, + 0xFA93, 0x54A9, 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, + 0xFA97, 0x5765, 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, + 0xFA9B, 0xFA0F, 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, + 0xFA9F, 0x590B, 0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, + 0xFAA3, 0x5963, 0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, + 0xFAA7, 0x5BC0, 0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, + 0xFAAB, 0x5C1E, 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, + 0xFAAF, 0x5D27, 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, + 0xFAB3, 0x5D6D, 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, + 0xFAB7, 0x5F21, 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, + 0xFABB, 0x5FDE, 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, + 0xFABF, 0x60DE, 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, + 0xFAC3, 0x6111, 0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, + 0xFAC7, 0x6213, 0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, + 0xFACB, 0x649D, 0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, + 0xFACF, 0x6615, 0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, + 0xFAD3, 0x661E, 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, + 0xFAD7, 0x6659, 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, + 0xFADB, 0x66A0, 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, + 0xFADF, 0x670E, 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, + 0xFAE3, 0x6852, 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, + 0xFAE7, 0x68CF, 0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, + 0xFAEB, 0x6998, 0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, + 0xFAEF, 0x6A46, 0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, + 0xFAF3, 0x6AE4, 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, + 0xFAF7, 0x6C86, 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, + 0xFAFB, 0x6D87, 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, + 0xFB42, 0x6DCF, 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, + 0xFB46, 0x6E39, 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, + 0xFB4A, 0x6EBF, 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, + 0xFB4E, 0x7005, 0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, + 0xFB52, 0x70AB, 0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, + 0xFB56, 0x7146, 0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, + 0xFB5A, 0x71FE, 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, + 0xFB5E, 0xFA16, 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, + 0xFB62, 0x73D6, 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, + 0xFB66, 0x73F5, 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, + 0xFB6A, 0x742E, 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, + 0xFB6E, 0x7501, 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, + 0xFB72, 0x769E, 0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, + 0xFB76, 0x7746, 0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, + 0xFB7A, 0x7864, 0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, + 0xFB7E, 0xFA19, 0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, + 0xFB83, 0x799B, 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, + 0xFB87, 0x7AEB, 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, + 0xFB8B, 0x7D5C, 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, + 0xFB8F, 0x7E52, 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, + 0xFB93, 0x8301, 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, + 0xFB97, 0x83F6, 0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, + 0xFB9B, 0x8559, 0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, + 0xFB9F, 0xFA20, 0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, + 0xFBA3, 0x8A12, 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, + 0xFBA7, 0x8ABE, 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, + 0xFBAB, 0x8B53, 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, + 0xFBAF, 0x8D12, 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, + 0xFBB3, 0xFA24, 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, + 0xFBB7, 0xFA26, 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, + 0xFBBB, 0x91D7, 0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, + 0xFBBF, 0x91E4, 0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, + 0xFBC3, 0x920A, 0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, + 0xFBC7, 0x924E, 0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, + 0xFBCB, 0x9267, 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, + 0xFBCF, 0x92E7, 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, + 0xFBD3, 0xFA27, 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, + 0xFBD7, 0x9325, 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, + 0xFBDB, 0x931E, 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, + 0xFBDF, 0x9370, 0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, + 0xFBE3, 0x93DE, 0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, + 0xFBE7, 0x9448, 0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, + 0xFBEB, 0x969D, 0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, + 0xFBEF, 0x9743, 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, + 0xFBF3, 0x9755, 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, + 0xFBF7, 0xFA2B, 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, + 0xFBFB, 0x9A4E, 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, + 0xFC42, 0x9B72, 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, + 0xFC46, 0x9C00, 0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, + 0xFC4A, 0x9E19, 0xFC4B, 0x9ED1, 0, 0 +}; +#endif + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR src, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (src <= 0x80) { /* ASCII */ + c = src; + } else { +#if !_TINY_TABLE + if (dir) { /* OEMCP to unicode */ + p = sjis2uni; + hi = sizeof(sjis2uni) / 4 - 1; + } else { /* Unicode to OEMCP */ + p = uni2sjis; + hi = sizeof(uni2sjis) / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (src == p[i * 2]) break; + if (src > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; +#else + if (dir) { /* OEMCP to unicode (Incremental search)*/ + p = &uni2sjis[1]; + do { + c = *p; + p += 2; + p -= 3; + c = *p; + } while (c && c != src); + } else { /* Unicode to OEMCP */ + li = 0; hi = sizeof(uni2sjis) / 4 - 1; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (src == uni2sjis[i * 2]) break; + if (src > uni2sjis[i * 2]) + li = i; + else + hi = i; + } + c = n ? uni2sjis[i * 2 + 1] : 0; + } +#endif + } + + return c; +} +#else +#error This file is not needed in current configuration. + +#endif diff --git a/2.5/bertos/fs/fatfs/option/cc936.c b/2.5/bertos/fs/fatfs/option/cc936.c new file mode 100644 index 00000000..4238d91d --- /dev/null +++ b/2.5/bertos/fs/fatfs/option/cc936.c @@ -0,0 +1,10960 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ +/* */ +/* CP936 (Simplified Chinese GBK) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + + +#if _USE_LFN && _CODE_PAGE == 936 + + +static +const WCHAR uni2oem[] = { +/* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ + 0x00A4, 0xA1E8, 0x00A7, 0xA1EC, 0x00A8, 0xA1A7, 0x00B0, 0xA1E3, + 0x00B1, 0xA1C0, 0x00B7, 0xA1A4, 0x00D7, 0xA1C1, 0x00E0, 0xA8A4, + 0x00E1, 0xA8A2, 0x00E8, 0xA8A8, 0x00E9, 0xA8A6, 0x00EA, 0xA8BA, + 0x00EC, 0xA8AC, 0x00ED, 0xA8AA, 0x00F2, 0xA8B0, 0x00F3, 0xA8AE, + 0x00F7, 0xA1C2, 0x00F9, 0xA8B4, 0x00FA, 0xA8B2, 0x00FC, 0xA8B9, + 0x0101, 0xA8A1, 0x0113, 0xA8A5, 0x011B, 0xA8A7, 0x012B, 0xA8A9, + 0x0144, 0xA8BD, 0x0148, 0xA8BE, 0x014D, 0xA8AD, 0x016B, 0xA8B1, + 0x01CE, 0xA8A3, 0x01D0, 0xA8AB, 0x01D2, 0xA8AF, 0x01D4, 0xA8B3, + 0x01D6, 0xA8B5, 0x01D8, 0xA8B6, 0x01DA, 0xA8B7, 0x01DC, 0xA8B8, + 0x0251, 0xA8BB, 0x0261, 0xA8C0, 0x02C7, 0xA1A6, 0x02C9, 0xA1A5, + 0x02CA, 0xA840, 0x02CB, 0xA841, 0x02D9, 0xA842, 0x0391, 0xA6A1, + 0x0392, 0xA6A2, 0x0393, 0xA6A3, 0x0394, 0xA6A4, 0x0395, 0xA6A5, + 0x0396, 0xA6A6, 0x0397, 0xA6A7, 0x0398, 0xA6A8, 0x0399, 0xA6A9, + 0x039A, 0xA6AA, 0x039B, 0xA6AB, 0x039C, 0xA6AC, 0x039D, 0xA6AD, + 0x039E, 0xA6AE, 0x039F, 0xA6AF, 0x03A0, 0xA6B0, 0x03A1, 0xA6B1, + 0x03A3, 0xA6B2, 0x03A4, 0xA6B3, 0x03A5, 0xA6B4, 0x03A6, 0xA6B5, + 0x03A7, 0xA6B6, 0x03A8, 0xA6B7, 0x03A9, 0xA6B8, 0x03B1, 0xA6C1, + 0x03B2, 0xA6C2, 0x03B3, 0xA6C3, 0x03B4, 0xA6C4, 0x03B5, 0xA6C5, + 0x03B6, 0xA6C6, 0x03B7, 0xA6C7, 0x03B8, 0xA6C8, 0x03B9, 0xA6C9, + 0x03BA, 0xA6CA, 0x03BB, 0xA6CB, 0x03BC, 0xA6CC, 0x03BD, 0xA6CD, + 0x03BE, 0xA6CE, 0x03BF, 0xA6CF, 0x03C0, 0xA6D0, 0x03C1, 0xA6D1, + 0x03C3, 0xA6D2, 0x03C4, 0xA6D3, 0x03C5, 0xA6D4, 0x03C6, 0xA6D5, + 0x03C7, 0xA6D6, 0x03C8, 0xA6D7, 0x03C9, 0xA6D8, 0x0401, 0xA7A7, + 0x0410, 0xA7A1, 0x0411, 0xA7A2, 0x0412, 0xA7A3, 0x0413, 0xA7A4, + 0x0414, 0xA7A5, 0x0415, 0xA7A6, 0x0416, 0xA7A8, 0x0417, 0xA7A9, + 0x0418, 0xA7AA, 0x0419, 0xA7AB, 0x041A, 0xA7AC, 0x041B, 0xA7AD, + 0x041C, 0xA7AE, 0x041D, 0xA7AF, 0x041E, 0xA7B0, 0x041F, 0xA7B1, + 0x0420, 0xA7B2, 0x0421, 0xA7B3, 0x0422, 0xA7B4, 0x0423, 0xA7B5, + 0x0424, 0xA7B6, 0x0425, 0xA7B7, 0x0426, 0xA7B8, 0x0427, 0xA7B9, + 0x0428, 0xA7BA, 0x0429, 0xA7BB, 0x042A, 0xA7BC, 0x042B, 0xA7BD, + 0x042C, 0xA7BE, 0x042D, 0xA7BF, 0x042E, 0xA7C0, 0x042F, 0xA7C1, + 0x0430, 0xA7D1, 0x0431, 0xA7D2, 0x0432, 0xA7D3, 0x0433, 0xA7D4, + 0x0434, 0xA7D5, 0x0435, 0xA7D6, 0x0436, 0xA7D8, 0x0437, 0xA7D9, + 0x0438, 0xA7DA, 0x0439, 0xA7DB, 0x043A, 0xA7DC, 0x043B, 0xA7DD, + 0x043C, 0xA7DE, 0x043D, 0xA7DF, 0x043E, 0xA7E0, 0x043F, 0xA7E1, + 0x0440, 0xA7E2, 0x0441, 0xA7E3, 0x0442, 0xA7E4, 0x0443, 0xA7E5, + 0x0444, 0xA7E6, 0x0445, 0xA7E7, 0x0446, 0xA7E8, 0x0447, 0xA7E9, + 0x0448, 0xA7EA, 0x0449, 0xA7EB, 0x044A, 0xA7EC, 0x044B, 0xA7ED, + 0x044C, 0xA7EE, 0x044D, 0xA7EF, 0x044E, 0xA7F0, 0x044F, 0xA7F1, + 0x0451, 0xA7D7, 0x2010, 0xA95C, 0x2013, 0xA843, 0x2014, 0xA1AA, + 0x2015, 0xA844, 0x2016, 0xA1AC, 0x2018, 0xA1AE, 0x2019, 0xA1AF, + 0x201C, 0xA1B0, 0x201D, 0xA1B1, 0x2025, 0xA845, 0x2026, 0xA1AD, + 0x2030, 0xA1EB, 0x2032, 0xA1E4, 0x2033, 0xA1E5, 0x2035, 0xA846, + 0x203B, 0xA1F9, 0x20AC, 0x0080, 0x2103, 0xA1E6, 0x2105, 0xA847, + 0x2109, 0xA848, 0x2116, 0xA1ED, 0x2121, 0xA959, 0x2160, 0xA2F1, + 0x2161, 0xA2F2, 0x2162, 0xA2F3, 0x2163, 0xA2F4, 0x2164, 0xA2F5, + 0x2165, 0xA2F6, 0x2166, 0xA2F7, 0x2167, 0xA2F8, 0x2168, 0xA2F9, + 0x2169, 0xA2FA, 0x216A, 0xA2FB, 0x216B, 0xA2FC, 0x2170, 0xA2A1, + 0x2171, 0xA2A2, 0x2172, 0xA2A3, 0x2173, 0xA2A4, 0x2174, 0xA2A5, + 0x2175, 0xA2A6, 0x2176, 0xA2A7, 0x2177, 0xA2A8, 0x2178, 0xA2A9, + 0x2179, 0xA2AA, 0x2190, 0xA1FB, 0x2191, 0xA1FC, 0x2192, 0xA1FA, + 0x2193, 0xA1FD, 0x2196, 0xA849, 0x2197, 0xA84A, 0x2198, 0xA84B, + 0x2199, 0xA84C, 0x2208, 0xA1CA, 0x220F, 0xA1C7, 0x2211, 0xA1C6, + 0x2215, 0xA84D, 0x221A, 0xA1CC, 0x221D, 0xA1D8, 0x221E, 0xA1DE, + 0x221F, 0xA84E, 0x2220, 0xA1CF, 0x2223, 0xA84F, 0x2225, 0xA1CE, + 0x2227, 0xA1C4, 0x2228, 0xA1C5, 0x2229, 0xA1C9, 0x222A, 0xA1C8, + 0x222B, 0xA1D2, 0x222E, 0xA1D3, 0x2234, 0xA1E0, 0x2235, 0xA1DF, + 0x2236, 0xA1C3, 0x2237, 0xA1CB, 0x223D, 0xA1D7, 0x2248, 0xA1D6, + 0x224C, 0xA1D5, 0x2252, 0xA850, 0x2260, 0xA1D9, 0x2261, 0xA1D4, + 0x2264, 0xA1DC, 0x2265, 0xA1DD, 0x2266, 0xA851, 0x2267, 0xA852, + 0x226E, 0xA1DA, 0x226F, 0xA1DB, 0x2295, 0xA892, 0x2299, 0xA1D1, + 0x22A5, 0xA1CD, 0x22BF, 0xA853, 0x2312, 0xA1D0, 0x2460, 0xA2D9, + 0x2461, 0xA2DA, 0x2462, 0xA2DB, 0x2463, 0xA2DC, 0x2464, 0xA2DD, + 0x2465, 0xA2DE, 0x2466, 0xA2DF, 0x2467, 0xA2E0, 0x2468, 0xA2E1, + 0x2469, 0xA2E2, 0x2474, 0xA2C5, 0x2475, 0xA2C6, 0x2476, 0xA2C7, + 0x2477, 0xA2C8, 0x2478, 0xA2C9, 0x2479, 0xA2CA, 0x247A, 0xA2CB, + 0x247B, 0xA2CC, 0x247C, 0xA2CD, 0x247D, 0xA2CE, 0x247E, 0xA2CF, + 0x247F, 0xA2D0, 0x2480, 0xA2D1, 0x2481, 0xA2D2, 0x2482, 0xA2D3, + 0x2483, 0xA2D4, 0x2484, 0xA2D5, 0x2485, 0xA2D6, 0x2486, 0xA2D7, + 0x2487, 0xA2D8, 0x2488, 0xA2B1, 0x2489, 0xA2B2, 0x248A, 0xA2B3, + 0x248B, 0xA2B4, 0x248C, 0xA2B5, 0x248D, 0xA2B6, 0x248E, 0xA2B7, + 0x248F, 0xA2B8, 0x2490, 0xA2B9, 0x2491, 0xA2BA, 0x2492, 0xA2BB, + 0x2493, 0xA2BC, 0x2494, 0xA2BD, 0x2495, 0xA2BE, 0x2496, 0xA2BF, + 0x2497, 0xA2C0, 0x2498, 0xA2C1, 0x2499, 0xA2C2, 0x249A, 0xA2C3, + 0x249B, 0xA2C4, 0x2500, 0xA9A4, 0x2501, 0xA9A5, 0x2502, 0xA9A6, + 0x2503, 0xA9A7, 0x2504, 0xA9A8, 0x2505, 0xA9A9, 0x2506, 0xA9AA, + 0x2507, 0xA9AB, 0x2508, 0xA9AC, 0x2509, 0xA9AD, 0x250A, 0xA9AE, + 0x250B, 0xA9AF, 0x250C, 0xA9B0, 0x250D, 0xA9B1, 0x250E, 0xA9B2, + 0x250F, 0xA9B3, 0x2510, 0xA9B4, 0x2511, 0xA9B5, 0x2512, 0xA9B6, + 0x2513, 0xA9B7, 0x2514, 0xA9B8, 0x2515, 0xA9B9, 0x2516, 0xA9BA, + 0x2517, 0xA9BB, 0x2518, 0xA9BC, 0x2519, 0xA9BD, 0x251A, 0xA9BE, + 0x251B, 0xA9BF, 0x251C, 0xA9C0, 0x251D, 0xA9C1, 0x251E, 0xA9C2, + 0x251F, 0xA9C3, 0x2520, 0xA9C4, 0x2521, 0xA9C5, 0x2522, 0xA9C6, + 0x2523, 0xA9C7, 0x2524, 0xA9C8, 0x2525, 0xA9C9, 0x2526, 0xA9CA, + 0x2527, 0xA9CB, 0x2528, 0xA9CC, 0x2529, 0xA9CD, 0x252A, 0xA9CE, + 0x252B, 0xA9CF, 0x252C, 0xA9D0, 0x252D, 0xA9D1, 0x252E, 0xA9D2, + 0x252F, 0xA9D3, 0x2530, 0xA9D4, 0x2531, 0xA9D5, 0x2532, 0xA9D6, + 0x2533, 0xA9D7, 0x2534, 0xA9D8, 0x2535, 0xA9D9, 0x2536, 0xA9DA, + 0x2537, 0xA9DB, 0x2538, 0xA9DC, 0x2539, 0xA9DD, 0x253A, 0xA9DE, + 0x253B, 0xA9DF, 0x253C, 0xA9E0, 0x253D, 0xA9E1, 0x253E, 0xA9E2, + 0x253F, 0xA9E3, 0x2540, 0xA9E4, 0x2541, 0xA9E5, 0x2542, 0xA9E6, + 0x2543, 0xA9E7, 0x2544, 0xA9E8, 0x2545, 0xA9E9, 0x2546, 0xA9EA, + 0x2547, 0xA9EB, 0x2548, 0xA9EC, 0x2549, 0xA9ED, 0x254A, 0xA9EE, + 0x254B, 0xA9EF, 0x2550, 0xA854, 0x2551, 0xA855, 0x2552, 0xA856, + 0x2553, 0xA857, 0x2554, 0xA858, 0x2555, 0xA859, 0x2556, 0xA85A, + 0x2557, 0xA85B, 0x2558, 0xA85C, 0x2559, 0xA85D, 0x255A, 0xA85E, + 0x255B, 0xA85F, 0x255C, 0xA860, 0x255D, 0xA861, 0x255E, 0xA862, + 0x255F, 0xA863, 0x2560, 0xA864, 0x2561, 0xA865, 0x2562, 0xA866, + 0x2563, 0xA867, 0x2564, 0xA868, 0x2565, 0xA869, 0x2566, 0xA86A, + 0x2567, 0xA86B, 0x2568, 0xA86C, 0x2569, 0xA86D, 0x256A, 0xA86E, + 0x256B, 0xA86F, 0x256C, 0xA870, 0x256D, 0xA871, 0x256E, 0xA872, + 0x256F, 0xA873, 0x2570, 0xA874, 0x2571, 0xA875, 0x2572, 0xA876, + 0x2573, 0xA877, 0x2581, 0xA878, 0x2582, 0xA879, 0x2583, 0xA87A, + 0x2584, 0xA87B, 0x2585, 0xA87C, 0x2586, 0xA87D, 0x2587, 0xA87E, + 0x2588, 0xA880, 0x2589, 0xA881, 0x258A, 0xA882, 0x258B, 0xA883, + 0x258C, 0xA884, 0x258D, 0xA885, 0x258E, 0xA886, 0x258F, 0xA887, + 0x2593, 0xA888, 0x2594, 0xA889, 0x2595, 0xA88A, 0x25A0, 0xA1F6, + 0x25A1, 0xA1F5, 0x25B2, 0xA1F8, 0x25B3, 0xA1F7, 0x25BC, 0xA88B, + 0x25BD, 0xA88C, 0x25C6, 0xA1F4, 0x25C7, 0xA1F3, 0x25CB, 0xA1F0, + 0x25CE, 0xA1F2, 0x25CF, 0xA1F1, 0x25E2, 0xA88D, 0x25E3, 0xA88E, + 0x25E4, 0xA88F, 0x25E5, 0xA890, 0x2605, 0xA1EF, 0x2606, 0xA1EE, + 0x2609, 0xA891, 0x2640, 0xA1E2, 0x2642, 0xA1E1, 0x3000, 0xA1A1, + 0x3001, 0xA1A2, 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3005, 0xA1A9, + 0x3006, 0xA965, 0x3007, 0xA996, 0x3008, 0xA1B4, 0x3009, 0xA1B5, + 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, + 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BE, 0x3011, 0xA1BF, + 0x3012, 0xA893, 0x3013, 0xA1FE, 0x3014, 0xA1B2, 0x3015, 0xA1B3, + 0x3016, 0xA1BC, 0x3017, 0xA1BD, 0x301D, 0xA894, 0x301E, 0xA895, + 0x3021, 0xA940, 0x3022, 0xA941, 0x3023, 0xA942, 0x3024, 0xA943, + 0x3025, 0xA944, 0x3026, 0xA945, 0x3027, 0xA946, 0x3028, 0xA947, + 0x3029, 0xA948, 0x3041, 0xA4A1, 0x3042, 0xA4A2, 0x3043, 0xA4A3, + 0x3044, 0xA4A4, 0x3045, 0xA4A5, 0x3046, 0xA4A6, 0x3047, 0xA4A7, + 0x3048, 0xA4A8, 0x3049, 0xA4A9, 0x304A, 0xA4AA, 0x304B, 0xA4AB, + 0x304C, 0xA4AC, 0x304D, 0xA4AD, 0x304E, 0xA4AE, 0x304F, 0xA4AF, + 0x3050, 0xA4B0, 0x3051, 0xA4B1, 0x3052, 0xA4B2, 0x3053, 0xA4B3, + 0x3054, 0xA4B4, 0x3055, 0xA4B5, 0x3056, 0xA4B6, 0x3057, 0xA4B7, + 0x3058, 0xA4B8, 0x3059, 0xA4B9, 0x305A, 0xA4BA, 0x305B, 0xA4BB, + 0x305C, 0xA4BC, 0x305D, 0xA4BD, 0x305E, 0xA4BE, 0x305F, 0xA4BF, + 0x3060, 0xA4C0, 0x3061, 0xA4C1, 0x3062, 0xA4C2, 0x3063, 0xA4C3, + 0x3064, 0xA4C4, 0x3065, 0xA4C5, 0x3066, 0xA4C6, 0x3067, 0xA4C7, + 0x3068, 0xA4C8, 0x3069, 0xA4C9, 0x306A, 0xA4CA, 0x306B, 0xA4CB, + 0x306C, 0xA4CC, 0x306D, 0xA4CD, 0x306E, 0xA4CE, 0x306F, 0xA4CF, + 0x3070, 0xA4D0, 0x3071, 0xA4D1, 0x3072, 0xA4D2, 0x3073, 0xA4D3, + 0x3074, 0xA4D4, 0x3075, 0xA4D5, 0x3076, 0xA4D6, 0x3077, 0xA4D7, + 0x3078, 0xA4D8, 0x3079, 0xA4D9, 0x307A, 0xA4DA, 0x307B, 0xA4DB, + 0x307C, 0xA4DC, 0x307D, 0xA4DD, 0x307E, 0xA4DE, 0x307F, 0xA4DF, + 0x3080, 0xA4E0, 0x3081, 0xA4E1, 0x3082, 0xA4E2, 0x3083, 0xA4E3, + 0x3084, 0xA4E4, 0x3085, 0xA4E5, 0x3086, 0xA4E6, 0x3087, 0xA4E7, + 0x3088, 0xA4E8, 0x3089, 0xA4E9, 0x308A, 0xA4EA, 0x308B, 0xA4EB, + 0x308C, 0xA4EC, 0x308D, 0xA4ED, 0x308E, 0xA4EE, 0x308F, 0xA4EF, + 0x3090, 0xA4F0, 0x3091, 0xA4F1, 0x3092, 0xA4F2, 0x3093, 0xA4F3, + 0x309B, 0xA961, 0x309C, 0xA962, 0x309D, 0xA966, 0x309E, 0xA967, + 0x30A1, 0xA5A1, 0x30A2, 0xA5A2, 0x30A3, 0xA5A3, 0x30A4, 0xA5A4, + 0x30A5, 0xA5A5, 0x30A6, 0xA5A6, 0x30A7, 0xA5A7, 0x30A8, 0xA5A8, + 0x30A9, 0xA5A9, 0x30AA, 0xA5AA, 0x30AB, 0xA5AB, 0x30AC, 0xA5AC, + 0x30AD, 0xA5AD, 0x30AE, 0xA5AE, 0x30AF, 0xA5AF, 0x30B0, 0xA5B0, + 0x30B1, 0xA5B1, 0x30B2, 0xA5B2, 0x30B3, 0xA5B3, 0x30B4, 0xA5B4, + 0x30B5, 0xA5B5, 0x30B6, 0xA5B6, 0x30B7, 0xA5B7, 0x30B8, 0xA5B8, + 0x30B9, 0xA5B9, 0x30BA, 0xA5BA, 0x30BB, 0xA5BB, 0x30BC, 0xA5BC, + 0x30BD, 0xA5BD, 0x30BE, 0xA5BE, 0x30BF, 0xA5BF, 0x30C0, 0xA5C0, + 0x30C1, 0xA5C1, 0x30C2, 0xA5C2, 0x30C3, 0xA5C3, 0x30C4, 0xA5C4, + 0x30C5, 0xA5C5, 0x30C6, 0xA5C6, 0x30C7, 0xA5C7, 0x30C8, 0xA5C8, + 0x30C9, 0xA5C9, 0x30CA, 0xA5CA, 0x30CB, 0xA5CB, 0x30CC, 0xA5CC, + 0x30CD, 0xA5CD, 0x30CE, 0xA5CE, 0x30CF, 0xA5CF, 0x30D0, 0xA5D0, + 0x30D1, 0xA5D1, 0x30D2, 0xA5D2, 0x30D3, 0xA5D3, 0x30D4, 0xA5D4, + 0x30D5, 0xA5D5, 0x30D6, 0xA5D6, 0x30D7, 0xA5D7, 0x30D8, 0xA5D8, + 0x30D9, 0xA5D9, 0x30DA, 0xA5DA, 0x30DB, 0xA5DB, 0x30DC, 0xA5DC, + 0x30DD, 0xA5DD, 0x30DE, 0xA5DE, 0x30DF, 0xA5DF, 0x30E0, 0xA5E0, + 0x30E1, 0xA5E1, 0x30E2, 0xA5E2, 0x30E3, 0xA5E3, 0x30E4, 0xA5E4, + 0x30E5, 0xA5E5, 0x30E6, 0xA5E6, 0x30E7, 0xA5E7, 0x30E8, 0xA5E8, + 0x30E9, 0xA5E9, 0x30EA, 0xA5EA, 0x30EB, 0xA5EB, 0x30EC, 0xA5EC, + 0x30ED, 0xA5ED, 0x30EE, 0xA5EE, 0x30EF, 0xA5EF, 0x30F0, 0xA5F0, + 0x30F1, 0xA5F1, 0x30F2, 0xA5F2, 0x30F3, 0xA5F3, 0x30F4, 0xA5F4, + 0x30F5, 0xA5F5, 0x30F6, 0xA5F6, 0x30FC, 0xA960, 0x30FD, 0xA963, + 0x30FE, 0xA964, 0x3105, 0xA8C5, 0x3106, 0xA8C6, 0x3107, 0xA8C7, + 0x3108, 0xA8C8, 0x3109, 0xA8C9, 0x310A, 0xA8CA, 0x310B, 0xA8CB, + 0x310C, 0xA8CC, 0x310D, 0xA8CD, 0x310E, 0xA8CE, 0x310F, 0xA8CF, + 0x3110, 0xA8D0, 0x3111, 0xA8D1, 0x3112, 0xA8D2, 0x3113, 0xA8D3, + 0x3114, 0xA8D4, 0x3115, 0xA8D5, 0x3116, 0xA8D6, 0x3117, 0xA8D7, + 0x3118, 0xA8D8, 0x3119, 0xA8D9, 0x311A, 0xA8DA, 0x311B, 0xA8DB, + 0x311C, 0xA8DC, 0x311D, 0xA8DD, 0x311E, 0xA8DE, 0x311F, 0xA8DF, + 0x3120, 0xA8E0, 0x3121, 0xA8E1, 0x3122, 0xA8E2, 0x3123, 0xA8E3, + 0x3124, 0xA8E4, 0x3125, 0xA8E5, 0x3126, 0xA8E6, 0x3127, 0xA8E7, + 0x3128, 0xA8E8, 0x3129, 0xA8E9, 0x3220, 0xA2E5, 0x3221, 0xA2E6, + 0x3222, 0xA2E7, 0x3223, 0xA2E8, 0x3224, 0xA2E9, 0x3225, 0xA2EA, + 0x3226, 0xA2EB, 0x3227, 0xA2EC, 0x3228, 0xA2ED, 0x3229, 0xA2EE, + 0x3231, 0xA95A, 0x32A3, 0xA949, 0x338E, 0xA94A, 0x338F, 0xA94B, + 0x339C, 0xA94C, 0x339D, 0xA94D, 0x339E, 0xA94E, 0x33A1, 0xA94F, + 0x33C4, 0xA950, 0x33CE, 0xA951, 0x33D1, 0xA952, 0x33D2, 0xA953, + 0x33D5, 0xA954, 0x4E00, 0xD2BB, 0x4E01, 0xB6A1, 0x4E02, 0x8140, + 0x4E03, 0xC6DF, 0x4E04, 0x8141, 0x4E05, 0x8142, 0x4E06, 0x8143, + 0x4E07, 0xCDF2, 0x4E08, 0xD5C9, 0x4E09, 0xC8FD, 0x4E0A, 0xC9CF, + 0x4E0B, 0xCFC2, 0x4E0C, 0xD8A2, 0x4E0D, 0xB2BB, 0x4E0E, 0xD3EB, + 0x4E0F, 0x8144, 0x4E10, 0xD8A4, 0x4E11, 0xB3F3, 0x4E12, 0x8145, + 0x4E13, 0xD7A8, 0x4E14, 0xC7D2, 0x4E15, 0xD8A7, 0x4E16, 0xCAC0, + 0x4E17, 0x8146, 0x4E18, 0xC7F0, 0x4E19, 0xB1FB, 0x4E1A, 0xD2B5, + 0x4E1B, 0xB4D4, 0x4E1C, 0xB6AB, 0x4E1D, 0xCBBF, 0x4E1E, 0xD8A9, + 0x4E1F, 0x8147, 0x4E20, 0x8148, 0x4E21, 0x8149, 0x4E22, 0xB6AA, + 0x4E23, 0x814A, 0x4E24, 0xC1BD, 0x4E25, 0xD1CF, 0x4E26, 0x814B, + 0x4E27, 0xC9A5, 0x4E28, 0xD8AD, 0x4E29, 0x814C, 0x4E2A, 0xB8F6, + 0x4E2B, 0xD1BE, 0x4E2C, 0xE3DC, 0x4E2D, 0xD6D0, 0x4E2E, 0x814D, + 0x4E2F, 0x814E, 0x4E30, 0xB7E1, 0x4E31, 0x814F, 0x4E32, 0xB4AE, + 0x4E33, 0x8150, 0x4E34, 0xC1D9, 0x4E35, 0x8151, 0x4E36, 0xD8BC, + 0x4E37, 0x8152, 0x4E38, 0xCDE8, 0x4E39, 0xB5A4, 0x4E3A, 0xCEAA, + 0x4E3B, 0xD6F7, 0x4E3C, 0x8153, 0x4E3D, 0xC0F6, 0x4E3E, 0xBED9, + 0x4E3F, 0xD8AF, 0x4E40, 0x8154, 0x4E41, 0x8155, 0x4E42, 0x8156, + 0x4E43, 0xC4CB, 0x4E44, 0x8157, 0x4E45, 0xBEC3, 0x4E46, 0x8158, + 0x4E47, 0xD8B1, 0x4E48, 0xC3B4, 0x4E49, 0xD2E5, 0x4E4A, 0x8159, + 0x4E4B, 0xD6AE, 0x4E4C, 0xCEDA, 0x4E4D, 0xD5A7, 0x4E4E, 0xBAF5, + 0x4E4F, 0xB7A6, 0x4E50, 0xC0D6, 0x4E51, 0x815A, 0x4E52, 0xC6B9, + 0x4E53, 0xC5D2, 0x4E54, 0xC7C7, 0x4E55, 0x815B, 0x4E56, 0xB9D4, + 0x4E57, 0x815C, 0x4E58, 0xB3CB, 0x4E59, 0xD2D2, 0x4E5A, 0x815D, + 0x4E5B, 0x815E, 0x4E5C, 0xD8BF, 0x4E5D, 0xBEC5, 0x4E5E, 0xC6F2, + 0x4E5F, 0xD2B2, 0x4E60, 0xCFB0, 0x4E61, 0xCFE7, 0x4E62, 0x815F, + 0x4E63, 0x8160, 0x4E64, 0x8161, 0x4E65, 0x8162, 0x4E66, 0xCAE9, + 0x4E67, 0x8163, 0x4E68, 0x8164, 0x4E69, 0xD8C0, 0x4E6A, 0x8165, + 0x4E6B, 0x8166, 0x4E6C, 0x8167, 0x4E6D, 0x8168, 0x4E6E, 0x8169, + 0x4E6F, 0x816A, 0x4E70, 0xC2F2, 0x4E71, 0xC2D2, 0x4E72, 0x816B, + 0x4E73, 0xC8E9, 0x4E74, 0x816C, 0x4E75, 0x816D, 0x4E76, 0x816E, + 0x4E77, 0x816F, 0x4E78, 0x8170, 0x4E79, 0x8171, 0x4E7A, 0x8172, + 0x4E7B, 0x8173, 0x4E7C, 0x8174, 0x4E7D, 0x8175, 0x4E7E, 0xC7AC, + 0x4E7F, 0x8176, 0x4E80, 0x8177, 0x4E81, 0x8178, 0x4E82, 0x8179, + 0x4E83, 0x817A, 0x4E84, 0x817B, 0x4E85, 0x817C, 0x4E86, 0xC1CB, + 0x4E87, 0x817D, 0x4E88, 0xD3E8, 0x4E89, 0xD5F9, 0x4E8A, 0x817E, + 0x4E8B, 0xCAC2, 0x4E8C, 0xB6FE, 0x4E8D, 0xD8A1, 0x4E8E, 0xD3DA, + 0x4E8F, 0xBFF7, 0x4E90, 0x8180, 0x4E91, 0xD4C6, 0x4E92, 0xBBA5, + 0x4E93, 0xD8C1, 0x4E94, 0xCEE5, 0x4E95, 0xBEAE, 0x4E96, 0x8181, + 0x4E97, 0x8182, 0x4E98, 0xD8A8, 0x4E99, 0x8183, 0x4E9A, 0xD1C7, + 0x4E9B, 0xD0A9, 0x4E9C, 0x8184, 0x4E9D, 0x8185, 0x4E9E, 0x8186, + 0x4E9F, 0xD8BD, 0x4EA0, 0xD9EF, 0x4EA1, 0xCDF6, 0x4EA2, 0xBFBA, + 0x4EA3, 0x8187, 0x4EA4, 0xBDBB, 0x4EA5, 0xBAA5, 0x4EA6, 0xD2E0, + 0x4EA7, 0xB2FA, 0x4EA8, 0xBAE0, 0x4EA9, 0xC4B6, 0x4EAA, 0x8188, + 0x4EAB, 0xCFED, 0x4EAC, 0xBEA9, 0x4EAD, 0xCDA4, 0x4EAE, 0xC1C1, + 0x4EAF, 0x8189, 0x4EB0, 0x818A, 0x4EB1, 0x818B, 0x4EB2, 0xC7D7, + 0x4EB3, 0xD9F1, 0x4EB4, 0x818C, 0x4EB5, 0xD9F4, 0x4EB6, 0x818D, + 0x4EB7, 0x818E, 0x4EB8, 0x818F, 0x4EB9, 0x8190, 0x4EBA, 0xC8CB, + 0x4EBB, 0xD8E9, 0x4EBC, 0x8191, 0x4EBD, 0x8192, 0x4EBE, 0x8193, + 0x4EBF, 0xD2DA, 0x4EC0, 0xCAB2, 0x4EC1, 0xC8CA, 0x4EC2, 0xD8EC, + 0x4EC3, 0xD8EA, 0x4EC4, 0xD8C6, 0x4EC5, 0xBDF6, 0x4EC6, 0xC6CD, + 0x4EC7, 0xB3F0, 0x4EC8, 0x8194, 0x4EC9, 0xD8EB, 0x4ECA, 0xBDF1, + 0x4ECB, 0xBDE9, 0x4ECC, 0x8195, 0x4ECD, 0xC8D4, 0x4ECE, 0xB4D3, + 0x4ECF, 0x8196, 0x4ED0, 0x8197, 0x4ED1, 0xC2D8, 0x4ED2, 0x8198, + 0x4ED3, 0xB2D6, 0x4ED4, 0xD7D0, 0x4ED5, 0xCACB, 0x4ED6, 0xCBFB, + 0x4ED7, 0xD5CC, 0x4ED8, 0xB8B6, 0x4ED9, 0xCFC9, 0x4EDA, 0x8199, + 0x4EDB, 0x819A, 0x4EDC, 0x819B, 0x4EDD, 0xD9DA, 0x4EDE, 0xD8F0, + 0x4EDF, 0xC7AA, 0x4EE0, 0x819C, 0x4EE1, 0xD8EE, 0x4EE2, 0x819D, + 0x4EE3, 0xB4FA, 0x4EE4, 0xC1EE, 0x4EE5, 0xD2D4, 0x4EE6, 0x819E, + 0x4EE7, 0x819F, 0x4EE8, 0xD8ED, 0x4EE9, 0x81A0, 0x4EEA, 0xD2C7, + 0x4EEB, 0xD8EF, 0x4EEC, 0xC3C7, 0x4EED, 0x81A1, 0x4EEE, 0x81A2, + 0x4EEF, 0x81A3, 0x4EF0, 0xD1F6, 0x4EF1, 0x81A4, 0x4EF2, 0xD6D9, + 0x4EF3, 0xD8F2, 0x4EF4, 0x81A5, 0x4EF5, 0xD8F5, 0x4EF6, 0xBCFE, + 0x4EF7, 0xBCDB, 0x4EF8, 0x81A6, 0x4EF9, 0x81A7, 0x4EFA, 0x81A8, + 0x4EFB, 0xC8CE, 0x4EFC, 0x81A9, 0x4EFD, 0xB7DD, 0x4EFE, 0x81AA, + 0x4EFF, 0xB7C2, 0x4F00, 0x81AB, 0x4F01, 0xC6F3, 0x4F02, 0x81AC, + 0x4F03, 0x81AD, 0x4F04, 0x81AE, 0x4F05, 0x81AF, 0x4F06, 0x81B0, + 0x4F07, 0x81B1, 0x4F08, 0x81B2, 0x4F09, 0xD8F8, 0x4F0A, 0xD2C1, + 0x4F0B, 0x81B3, 0x4F0C, 0x81B4, 0x4F0D, 0xCEE9, 0x4F0E, 0xBCBF, + 0x4F0F, 0xB7FC, 0x4F10, 0xB7A5, 0x4F11, 0xD0DD, 0x4F12, 0x81B5, + 0x4F13, 0x81B6, 0x4F14, 0x81B7, 0x4F15, 0x81B8, 0x4F16, 0x81B9, + 0x4F17, 0xD6DA, 0x4F18, 0xD3C5, 0x4F19, 0xBBEF, 0x4F1A, 0xBBE1, + 0x4F1B, 0xD8F1, 0x4F1C, 0x81BA, 0x4F1D, 0x81BB, 0x4F1E, 0xC9A1, + 0x4F1F, 0xCEB0, 0x4F20, 0xB4AB, 0x4F21, 0x81BC, 0x4F22, 0xD8F3, + 0x4F23, 0x81BD, 0x4F24, 0xC9CB, 0x4F25, 0xD8F6, 0x4F26, 0xC2D7, + 0x4F27, 0xD8F7, 0x4F28, 0x81BE, 0x4F29, 0x81BF, 0x4F2A, 0xCEB1, + 0x4F2B, 0xD8F9, 0x4F2C, 0x81C0, 0x4F2D, 0x81C1, 0x4F2E, 0x81C2, + 0x4F2F, 0xB2AE, 0x4F30, 0xB9C0, 0x4F31, 0x81C3, 0x4F32, 0xD9A3, + 0x4F33, 0x81C4, 0x4F34, 0xB0E9, 0x4F35, 0x81C5, 0x4F36, 0xC1E6, + 0x4F37, 0x81C6, 0x4F38, 0xC9EC, 0x4F39, 0x81C7, 0x4F3A, 0xCBC5, + 0x4F3B, 0x81C8, 0x4F3C, 0xCBC6, 0x4F3D, 0xD9A4, 0x4F3E, 0x81C9, + 0x4F3F, 0x81CA, 0x4F40, 0x81CB, 0x4F41, 0x81CC, 0x4F42, 0x81CD, + 0x4F43, 0xB5E8, 0x4F44, 0x81CE, 0x4F45, 0x81CF, 0x4F46, 0xB5AB, + 0x4F47, 0x81D0, 0x4F48, 0x81D1, 0x4F49, 0x81D2, 0x4F4A, 0x81D3, + 0x4F4B, 0x81D4, 0x4F4C, 0x81D5, 0x4F4D, 0xCEBB, 0x4F4E, 0xB5CD, + 0x4F4F, 0xD7A1, 0x4F50, 0xD7F4, 0x4F51, 0xD3D3, 0x4F52, 0x81D6, + 0x4F53, 0xCCE5, 0x4F54, 0x81D7, 0x4F55, 0xBACE, 0x4F56, 0x81D8, + 0x4F57, 0xD9A2, 0x4F58, 0xD9DC, 0x4F59, 0xD3E0, 0x4F5A, 0xD8FD, + 0x4F5B, 0xB7F0, 0x4F5C, 0xD7F7, 0x4F5D, 0xD8FE, 0x4F5E, 0xD8FA, + 0x4F5F, 0xD9A1, 0x4F60, 0xC4E3, 0x4F61, 0x81D9, 0x4F62, 0x81DA, + 0x4F63, 0xD3B6, 0x4F64, 0xD8F4, 0x4F65, 0xD9DD, 0x4F66, 0x81DB, + 0x4F67, 0xD8FB, 0x4F68, 0x81DC, 0x4F69, 0xC5E5, 0x4F6A, 0x81DD, + 0x4F6B, 0x81DE, 0x4F6C, 0xC0D0, 0x4F6D, 0x81DF, 0x4F6E, 0x81E0, + 0x4F6F, 0xD1F0, 0x4F70, 0xB0DB, 0x4F71, 0x81E1, 0x4F72, 0x81E2, + 0x4F73, 0xBCD1, 0x4F74, 0xD9A6, 0x4F75, 0x81E3, 0x4F76, 0xD9A5, + 0x4F77, 0x81E4, 0x4F78, 0x81E5, 0x4F79, 0x81E6, 0x4F7A, 0x81E7, + 0x4F7B, 0xD9AC, 0x4F7C, 0xD9AE, 0x4F7D, 0x81E8, 0x4F7E, 0xD9AB, + 0x4F7F, 0xCAB9, 0x4F80, 0x81E9, 0x4F81, 0x81EA, 0x4F82, 0x81EB, + 0x4F83, 0xD9A9, 0x4F84, 0xD6B6, 0x4F85, 0x81EC, 0x4F86, 0x81ED, + 0x4F87, 0x81EE, 0x4F88, 0xB3DE, 0x4F89, 0xD9A8, 0x4F8A, 0x81EF, + 0x4F8B, 0xC0FD, 0x4F8C, 0x81F0, 0x4F8D, 0xCACC, 0x4F8E, 0x81F1, + 0x4F8F, 0xD9AA, 0x4F90, 0x81F2, 0x4F91, 0xD9A7, 0x4F92, 0x81F3, + 0x4F93, 0x81F4, 0x4F94, 0xD9B0, 0x4F95, 0x81F5, 0x4F96, 0x81F6, + 0x4F97, 0xB6B1, 0x4F98, 0x81F7, 0x4F99, 0x81F8, 0x4F9A, 0x81F9, + 0x4F9B, 0xB9A9, 0x4F9C, 0x81FA, 0x4F9D, 0xD2C0, 0x4F9E, 0x81FB, + 0x4F9F, 0x81FC, 0x4FA0, 0xCFC0, 0x4FA1, 0x81FD, 0x4FA2, 0x81FE, + 0x4FA3, 0xC2C2, 0x4FA4, 0x8240, 0x4FA5, 0xBDC4, 0x4FA6, 0xD5EC, + 0x4FA7, 0xB2E0, 0x4FA8, 0xC7C8, 0x4FA9, 0xBFEB, 0x4FAA, 0xD9AD, + 0x4FAB, 0x8241, 0x4FAC, 0xD9AF, 0x4FAD, 0x8242, 0x4FAE, 0xCEEA, + 0x4FAF, 0xBAEE, 0x4FB0, 0x8243, 0x4FB1, 0x8244, 0x4FB2, 0x8245, + 0x4FB3, 0x8246, 0x4FB4, 0x8247, 0x4FB5, 0xC7D6, 0x4FB6, 0x8248, + 0x4FB7, 0x8249, 0x4FB8, 0x824A, 0x4FB9, 0x824B, 0x4FBA, 0x824C, + 0x4FBB, 0x824D, 0x4FBC, 0x824E, 0x4FBD, 0x824F, 0x4FBE, 0x8250, + 0x4FBF, 0xB1E3, 0x4FC0, 0x8251, 0x4FC1, 0x8252, 0x4FC2, 0x8253, + 0x4FC3, 0xB4D9, 0x4FC4, 0xB6ED, 0x4FC5, 0xD9B4, 0x4FC6, 0x8254, + 0x4FC7, 0x8255, 0x4FC8, 0x8256, 0x4FC9, 0x8257, 0x4FCA, 0xBFA1, + 0x4FCB, 0x8258, 0x4FCC, 0x8259, 0x4FCD, 0x825A, 0x4FCE, 0xD9DE, + 0x4FCF, 0xC7CE, 0x4FD0, 0xC0FE, 0x4FD1, 0xD9B8, 0x4FD2, 0x825B, + 0x4FD3, 0x825C, 0x4FD4, 0x825D, 0x4FD5, 0x825E, 0x4FD6, 0x825F, + 0x4FD7, 0xCBD7, 0x4FD8, 0xB7FD, 0x4FD9, 0x8260, 0x4FDA, 0xD9B5, + 0x4FDB, 0x8261, 0x4FDC, 0xD9B7, 0x4FDD, 0xB1A3, 0x4FDE, 0xD3E1, + 0x4FDF, 0xD9B9, 0x4FE0, 0x8262, 0x4FE1, 0xD0C5, 0x4FE2, 0x8263, + 0x4FE3, 0xD9B6, 0x4FE4, 0x8264, 0x4FE5, 0x8265, 0x4FE6, 0xD9B1, + 0x4FE7, 0x8266, 0x4FE8, 0xD9B2, 0x4FE9, 0xC1A9, 0x4FEA, 0xD9B3, + 0x4FEB, 0x8267, 0x4FEC, 0x8268, 0x4FED, 0xBCF3, 0x4FEE, 0xD0DE, + 0x4FEF, 0xB8A9, 0x4FF0, 0x8269, 0x4FF1, 0xBEE3, 0x4FF2, 0x826A, + 0x4FF3, 0xD9BD, 0x4FF4, 0x826B, 0x4FF5, 0x826C, 0x4FF6, 0x826D, + 0x4FF7, 0x826E, 0x4FF8, 0xD9BA, 0x4FF9, 0x826F, 0x4FFA, 0xB0B3, + 0x4FFB, 0x8270, 0x4FFC, 0x8271, 0x4FFD, 0x8272, 0x4FFE, 0xD9C2, + 0x4FFF, 0x8273, 0x5000, 0x8274, 0x5001, 0x8275, 0x5002, 0x8276, + 0x5003, 0x8277, 0x5004, 0x8278, 0x5005, 0x8279, 0x5006, 0x827A, + 0x5007, 0x827B, 0x5008, 0x827C, 0x5009, 0x827D, 0x500A, 0x827E, + 0x500B, 0x8280, 0x500C, 0xD9C4, 0x500D, 0xB1B6, 0x500E, 0x8281, + 0x500F, 0xD9BF, 0x5010, 0x8282, 0x5011, 0x8283, 0x5012, 0xB5B9, + 0x5013, 0x8284, 0x5014, 0xBEF3, 0x5015, 0x8285, 0x5016, 0x8286, + 0x5017, 0x8287, 0x5018, 0xCCC8, 0x5019, 0xBAF2, 0x501A, 0xD2D0, + 0x501B, 0x8288, 0x501C, 0xD9C3, 0x501D, 0x8289, 0x501E, 0x828A, + 0x501F, 0xBDE8, 0x5020, 0x828B, 0x5021, 0xB3AB, 0x5022, 0x828C, + 0x5023, 0x828D, 0x5024, 0x828E, 0x5025, 0xD9C5, 0x5026, 0xBEEB, + 0x5027, 0x828F, 0x5028, 0xD9C6, 0x5029, 0xD9BB, 0x502A, 0xC4DF, + 0x502B, 0x8290, 0x502C, 0xD9BE, 0x502D, 0xD9C1, 0x502E, 0xD9C0, + 0x502F, 0x8291, 0x5030, 0x8292, 0x5031, 0x8293, 0x5032, 0x8294, + 0x5033, 0x8295, 0x5034, 0x8296, 0x5035, 0x8297, 0x5036, 0x8298, + 0x5037, 0x8299, 0x5038, 0x829A, 0x5039, 0x829B, 0x503A, 0xD5AE, + 0x503B, 0x829C, 0x503C, 0xD6B5, 0x503D, 0x829D, 0x503E, 0xC7E3, + 0x503F, 0x829E, 0x5040, 0x829F, 0x5041, 0x82A0, 0x5042, 0x82A1, + 0x5043, 0xD9C8, 0x5044, 0x82A2, 0x5045, 0x82A3, 0x5046, 0x82A4, + 0x5047, 0xBCD9, 0x5048, 0xD9CA, 0x5049, 0x82A5, 0x504A, 0x82A6, + 0x504B, 0x82A7, 0x504C, 0xD9BC, 0x504D, 0x82A8, 0x504E, 0xD9CB, + 0x504F, 0xC6AB, 0x5050, 0x82A9, 0x5051, 0x82AA, 0x5052, 0x82AB, + 0x5053, 0x82AC, 0x5054, 0x82AD, 0x5055, 0xD9C9, 0x5056, 0x82AE, + 0x5057, 0x82AF, 0x5058, 0x82B0, 0x5059, 0x82B1, 0x505A, 0xD7F6, + 0x505B, 0x82B2, 0x505C, 0xCDA3, 0x505D, 0x82B3, 0x505E, 0x82B4, + 0x505F, 0x82B5, 0x5060, 0x82B6, 0x5061, 0x82B7, 0x5062, 0x82B8, + 0x5063, 0x82B9, 0x5064, 0x82BA, 0x5065, 0xBDA1, 0x5066, 0x82BB, + 0x5067, 0x82BC, 0x5068, 0x82BD, 0x5069, 0x82BE, 0x506A, 0x82BF, + 0x506B, 0x82C0, 0x506C, 0xD9CC, 0x506D, 0x82C1, 0x506E, 0x82C2, + 0x506F, 0x82C3, 0x5070, 0x82C4, 0x5071, 0x82C5, 0x5072, 0x82C6, + 0x5073, 0x82C7, 0x5074, 0x82C8, 0x5075, 0x82C9, 0x5076, 0xC5BC, + 0x5077, 0xCDB5, 0x5078, 0x82CA, 0x5079, 0x82CB, 0x507A, 0x82CC, + 0x507B, 0xD9CD, 0x507C, 0x82CD, 0x507D, 0x82CE, 0x507E, 0xD9C7, + 0x507F, 0xB3A5, 0x5080, 0xBFFE, 0x5081, 0x82CF, 0x5082, 0x82D0, + 0x5083, 0x82D1, 0x5084, 0x82D2, 0x5085, 0xB8B5, 0x5086, 0x82D3, + 0x5087, 0x82D4, 0x5088, 0xC0FC, 0x5089, 0x82D5, 0x508A, 0x82D6, + 0x508B, 0x82D7, 0x508C, 0x82D8, 0x508D, 0xB0F8, 0x508E, 0x82D9, + 0x508F, 0x82DA, 0x5090, 0x82DB, 0x5091, 0x82DC, 0x5092, 0x82DD, + 0x5093, 0x82DE, 0x5094, 0x82DF, 0x5095, 0x82E0, 0x5096, 0x82E1, + 0x5097, 0x82E2, 0x5098, 0x82E3, 0x5099, 0x82E4, 0x509A, 0x82E5, + 0x509B, 0x82E6, 0x509C, 0x82E7, 0x509D, 0x82E8, 0x509E, 0x82E9, + 0x509F, 0x82EA, 0x50A0, 0x82EB, 0x50A1, 0x82EC, 0x50A2, 0x82ED, + 0x50A3, 0xB4F6, 0x50A4, 0x82EE, 0x50A5, 0xD9CE, 0x50A6, 0x82EF, + 0x50A7, 0xD9CF, 0x50A8, 0xB4A2, 0x50A9, 0xD9D0, 0x50AA, 0x82F0, + 0x50AB, 0x82F1, 0x50AC, 0xB4DF, 0x50AD, 0x82F2, 0x50AE, 0x82F3, + 0x50AF, 0x82F4, 0x50B0, 0x82F5, 0x50B1, 0x82F6, 0x50B2, 0xB0C1, + 0x50B3, 0x82F7, 0x50B4, 0x82F8, 0x50B5, 0x82F9, 0x50B6, 0x82FA, + 0x50B7, 0x82FB, 0x50B8, 0x82FC, 0x50B9, 0x82FD, 0x50BA, 0xD9D1, + 0x50BB, 0xC9B5, 0x50BC, 0x82FE, 0x50BD, 0x8340, 0x50BE, 0x8341, + 0x50BF, 0x8342, 0x50C0, 0x8343, 0x50C1, 0x8344, 0x50C2, 0x8345, + 0x50C3, 0x8346, 0x50C4, 0x8347, 0x50C5, 0x8348, 0x50C6, 0x8349, + 0x50C7, 0x834A, 0x50C8, 0x834B, 0x50C9, 0x834C, 0x50CA, 0x834D, + 0x50CB, 0x834E, 0x50CC, 0x834F, 0x50CD, 0x8350, 0x50CE, 0x8351, + 0x50CF, 0xCFF1, 0x50D0, 0x8352, 0x50D1, 0x8353, 0x50D2, 0x8354, + 0x50D3, 0x8355, 0x50D4, 0x8356, 0x50D5, 0x8357, 0x50D6, 0xD9D2, + 0x50D7, 0x8358, 0x50D8, 0x8359, 0x50D9, 0x835A, 0x50DA, 0xC1C5, + 0x50DB, 0x835B, 0x50DC, 0x835C, 0x50DD, 0x835D, 0x50DE, 0x835E, + 0x50DF, 0x835F, 0x50E0, 0x8360, 0x50E1, 0x8361, 0x50E2, 0x8362, + 0x50E3, 0x8363, 0x50E4, 0x8364, 0x50E5, 0x8365, 0x50E6, 0xD9D6, + 0x50E7, 0xC9AE, 0x50E8, 0x8366, 0x50E9, 0x8367, 0x50EA, 0x8368, + 0x50EB, 0x8369, 0x50EC, 0xD9D5, 0x50ED, 0xD9D4, 0x50EE, 0xD9D7, + 0x50EF, 0x836A, 0x50F0, 0x836B, 0x50F1, 0x836C, 0x50F2, 0x836D, + 0x50F3, 0xCBDB, 0x50F4, 0x836E, 0x50F5, 0xBDA9, 0x50F6, 0x836F, + 0x50F7, 0x8370, 0x50F8, 0x8371, 0x50F9, 0x8372, 0x50FA, 0x8373, + 0x50FB, 0xC6A7, 0x50FC, 0x8374, 0x50FD, 0x8375, 0x50FE, 0x8376, + 0x50FF, 0x8377, 0x5100, 0x8378, 0x5101, 0x8379, 0x5102, 0x837A, + 0x5103, 0x837B, 0x5104, 0x837C, 0x5105, 0x837D, 0x5106, 0xD9D3, + 0x5107, 0xD9D8, 0x5108, 0x837E, 0x5109, 0x8380, 0x510A, 0x8381, + 0x510B, 0xD9D9, 0x510C, 0x8382, 0x510D, 0x8383, 0x510E, 0x8384, + 0x510F, 0x8385, 0x5110, 0x8386, 0x5111, 0x8387, 0x5112, 0xC8E5, + 0x5113, 0x8388, 0x5114, 0x8389, 0x5115, 0x838A, 0x5116, 0x838B, + 0x5117, 0x838C, 0x5118, 0x838D, 0x5119, 0x838E, 0x511A, 0x838F, + 0x511B, 0x8390, 0x511C, 0x8391, 0x511D, 0x8392, 0x511E, 0x8393, + 0x511F, 0x8394, 0x5120, 0x8395, 0x5121, 0xC0DC, 0x5122, 0x8396, + 0x5123, 0x8397, 0x5124, 0x8398, 0x5125, 0x8399, 0x5126, 0x839A, + 0x5127, 0x839B, 0x5128, 0x839C, 0x5129, 0x839D, 0x512A, 0x839E, + 0x512B, 0x839F, 0x512C, 0x83A0, 0x512D, 0x83A1, 0x512E, 0x83A2, + 0x512F, 0x83A3, 0x5130, 0x83A4, 0x5131, 0x83A5, 0x5132, 0x83A6, + 0x5133, 0x83A7, 0x5134, 0x83A8, 0x5135, 0x83A9, 0x5136, 0x83AA, + 0x5137, 0x83AB, 0x5138, 0x83AC, 0x5139, 0x83AD, 0x513A, 0x83AE, + 0x513B, 0x83AF, 0x513C, 0x83B0, 0x513D, 0x83B1, 0x513E, 0x83B2, + 0x513F, 0xB6F9, 0x5140, 0xD8A3, 0x5141, 0xD4CA, 0x5142, 0x83B3, + 0x5143, 0xD4AA, 0x5144, 0xD0D6, 0x5145, 0xB3E4, 0x5146, 0xD5D7, + 0x5147, 0x83B4, 0x5148, 0xCFC8, 0x5149, 0xB9E2, 0x514A, 0x83B5, + 0x514B, 0xBFCB, 0x514C, 0x83B6, 0x514D, 0xC3E2, 0x514E, 0x83B7, + 0x514F, 0x83B8, 0x5150, 0x83B9, 0x5151, 0xB6D2, 0x5152, 0x83BA, + 0x5153, 0x83BB, 0x5154, 0xCDC3, 0x5155, 0xD9EE, 0x5156, 0xD9F0, + 0x5157, 0x83BC, 0x5158, 0x83BD, 0x5159, 0x83BE, 0x515A, 0xB5B3, + 0x515B, 0x83BF, 0x515C, 0xB6B5, 0x515D, 0x83C0, 0x515E, 0x83C1, + 0x515F, 0x83C2, 0x5160, 0x83C3, 0x5161, 0x83C4, 0x5162, 0xBEA4, + 0x5163, 0x83C5, 0x5164, 0x83C6, 0x5165, 0xC8EB, 0x5166, 0x83C7, + 0x5167, 0x83C8, 0x5168, 0xC8AB, 0x5169, 0x83C9, 0x516A, 0x83CA, + 0x516B, 0xB0CB, 0x516C, 0xB9AB, 0x516D, 0xC1F9, 0x516E, 0xD9E2, + 0x516F, 0x83CB, 0x5170, 0xC0BC, 0x5171, 0xB9B2, 0x5172, 0x83CC, + 0x5173, 0xB9D8, 0x5174, 0xD0CB, 0x5175, 0xB1F8, 0x5176, 0xC6E4, + 0x5177, 0xBEDF, 0x5178, 0xB5E4, 0x5179, 0xD7C8, 0x517A, 0x83CD, + 0x517B, 0xD1F8, 0x517C, 0xBCE6, 0x517D, 0xCADE, 0x517E, 0x83CE, + 0x517F, 0x83CF, 0x5180, 0xBCBD, 0x5181, 0xD9E6, 0x5182, 0xD8E7, + 0x5183, 0x83D0, 0x5184, 0x83D1, 0x5185, 0xC4DA, 0x5186, 0x83D2, + 0x5187, 0x83D3, 0x5188, 0xB8D4, 0x5189, 0xC8BD, 0x518A, 0x83D4, + 0x518B, 0x83D5, 0x518C, 0xB2E1, 0x518D, 0xD4D9, 0x518E, 0x83D6, + 0x518F, 0x83D7, 0x5190, 0x83D8, 0x5191, 0x83D9, 0x5192, 0xC3B0, + 0x5193, 0x83DA, 0x5194, 0x83DB, 0x5195, 0xC3E1, 0x5196, 0xDAA2, + 0x5197, 0xC8DF, 0x5198, 0x83DC, 0x5199, 0xD0B4, 0x519A, 0x83DD, + 0x519B, 0xBEFC, 0x519C, 0xC5A9, 0x519D, 0x83DE, 0x519E, 0x83DF, + 0x519F, 0x83E0, 0x51A0, 0xB9DA, 0x51A1, 0x83E1, 0x51A2, 0xDAA3, + 0x51A3, 0x83E2, 0x51A4, 0xD4A9, 0x51A5, 0xDAA4, 0x51A6, 0x83E3, + 0x51A7, 0x83E4, 0x51A8, 0x83E5, 0x51A9, 0x83E6, 0x51AA, 0x83E7, + 0x51AB, 0xD9FB, 0x51AC, 0xB6AC, 0x51AD, 0x83E8, 0x51AE, 0x83E9, + 0x51AF, 0xB7EB, 0x51B0, 0xB1F9, 0x51B1, 0xD9FC, 0x51B2, 0xB3E5, + 0x51B3, 0xBEF6, 0x51B4, 0x83EA, 0x51B5, 0xBFF6, 0x51B6, 0xD2B1, + 0x51B7, 0xC0E4, 0x51B8, 0x83EB, 0x51B9, 0x83EC, 0x51BA, 0x83ED, + 0x51BB, 0xB6B3, 0x51BC, 0xD9FE, 0x51BD, 0xD9FD, 0x51BE, 0x83EE, + 0x51BF, 0x83EF, 0x51C0, 0xBEBB, 0x51C1, 0x83F0, 0x51C2, 0x83F1, + 0x51C3, 0x83F2, 0x51C4, 0xC6E0, 0x51C5, 0x83F3, 0x51C6, 0xD7BC, + 0x51C7, 0xDAA1, 0x51C8, 0x83F4, 0x51C9, 0xC1B9, 0x51CA, 0x83F5, + 0x51CB, 0xB5F2, 0x51CC, 0xC1E8, 0x51CD, 0x83F6, 0x51CE, 0x83F7, + 0x51CF, 0xBCF5, 0x51D0, 0x83F8, 0x51D1, 0xB4D5, 0x51D2, 0x83F9, + 0x51D3, 0x83FA, 0x51D4, 0x83FB, 0x51D5, 0x83FC, 0x51D6, 0x83FD, + 0x51D7, 0x83FE, 0x51D8, 0x8440, 0x51D9, 0x8441, 0x51DA, 0x8442, + 0x51DB, 0xC1DD, 0x51DC, 0x8443, 0x51DD, 0xC4FD, 0x51DE, 0x8444, + 0x51DF, 0x8445, 0x51E0, 0xBCB8, 0x51E1, 0xB7B2, 0x51E2, 0x8446, + 0x51E3, 0x8447, 0x51E4, 0xB7EF, 0x51E5, 0x8448, 0x51E6, 0x8449, + 0x51E7, 0x844A, 0x51E8, 0x844B, 0x51E9, 0x844C, 0x51EA, 0x844D, + 0x51EB, 0xD9EC, 0x51EC, 0x844E, 0x51ED, 0xC6BE, 0x51EE, 0x844F, + 0x51EF, 0xBFAD, 0x51F0, 0xBBCB, 0x51F1, 0x8450, 0x51F2, 0x8451, + 0x51F3, 0xB5CA, 0x51F4, 0x8452, 0x51F5, 0xDBC9, 0x51F6, 0xD0D7, + 0x51F7, 0x8453, 0x51F8, 0xCDB9, 0x51F9, 0xB0BC, 0x51FA, 0xB3F6, + 0x51FB, 0xBBF7, 0x51FC, 0xDBCA, 0x51FD, 0xBAAF, 0x51FE, 0x8454, + 0x51FF, 0xD4E4, 0x5200, 0xB5B6, 0x5201, 0xB5F3, 0x5202, 0xD8D6, + 0x5203, 0xC8D0, 0x5204, 0x8455, 0x5205, 0x8456, 0x5206, 0xB7D6, + 0x5207, 0xC7D0, 0x5208, 0xD8D7, 0x5209, 0x8457, 0x520A, 0xBFAF, + 0x520B, 0x8458, 0x520C, 0x8459, 0x520D, 0xDBBB, 0x520E, 0xD8D8, + 0x520F, 0x845A, 0x5210, 0x845B, 0x5211, 0xD0CC, 0x5212, 0xBBAE, + 0x5213, 0x845C, 0x5214, 0x845D, 0x5215, 0x845E, 0x5216, 0xEBBE, + 0x5217, 0xC1D0, 0x5218, 0xC1F5, 0x5219, 0xD4F2, 0x521A, 0xB8D5, + 0x521B, 0xB4B4, 0x521C, 0x845F, 0x521D, 0xB3F5, 0x521E, 0x8460, + 0x521F, 0x8461, 0x5220, 0xC9BE, 0x5221, 0x8462, 0x5222, 0x8463, + 0x5223, 0x8464, 0x5224, 0xC5D0, 0x5225, 0x8465, 0x5226, 0x8466, + 0x5227, 0x8467, 0x5228, 0xC5D9, 0x5229, 0xC0FB, 0x522A, 0x8468, + 0x522B, 0xB1F0, 0x522C, 0x8469, 0x522D, 0xD8D9, 0x522E, 0xB9CE, + 0x522F, 0x846A, 0x5230, 0xB5BD, 0x5231, 0x846B, 0x5232, 0x846C, + 0x5233, 0xD8DA, 0x5234, 0x846D, 0x5235, 0x846E, 0x5236, 0xD6C6, + 0x5237, 0xCBA2, 0x5238, 0xC8AF, 0x5239, 0xC9B2, 0x523A, 0xB4CC, + 0x523B, 0xBFCC, 0x523C, 0x846F, 0x523D, 0xB9F4, 0x523E, 0x8470, + 0x523F, 0xD8DB, 0x5240, 0xD8DC, 0x5241, 0xB6E7, 0x5242, 0xBCC1, + 0x5243, 0xCCEA, 0x5244, 0x8471, 0x5245, 0x8472, 0x5246, 0x8473, + 0x5247, 0x8474, 0x5248, 0x8475, 0x5249, 0x8476, 0x524A, 0xCFF7, + 0x524B, 0x8477, 0x524C, 0xD8DD, 0x524D, 0xC7B0, 0x524E, 0x8478, + 0x524F, 0x8479, 0x5250, 0xB9D0, 0x5251, 0xBDA3, 0x5252, 0x847A, + 0x5253, 0x847B, 0x5254, 0xCCDE, 0x5255, 0x847C, 0x5256, 0xC6CA, + 0x5257, 0x847D, 0x5258, 0x847E, 0x5259, 0x8480, 0x525A, 0x8481, + 0x525B, 0x8482, 0x525C, 0xD8E0, 0x525D, 0x8483, 0x525E, 0xD8DE, + 0x525F, 0x8484, 0x5260, 0x8485, 0x5261, 0xD8DF, 0x5262, 0x8486, + 0x5263, 0x8487, 0x5264, 0x8488, 0x5265, 0xB0FE, 0x5266, 0x8489, + 0x5267, 0xBEE7, 0x5268, 0x848A, 0x5269, 0xCAA3, 0x526A, 0xBCF4, + 0x526B, 0x848B, 0x526C, 0x848C, 0x526D, 0x848D, 0x526E, 0x848E, + 0x526F, 0xB8B1, 0x5270, 0x848F, 0x5271, 0x8490, 0x5272, 0xB8EE, + 0x5273, 0x8491, 0x5274, 0x8492, 0x5275, 0x8493, 0x5276, 0x8494, + 0x5277, 0x8495, 0x5278, 0x8496, 0x5279, 0x8497, 0x527A, 0x8498, + 0x527B, 0x8499, 0x527C, 0x849A, 0x527D, 0xD8E2, 0x527E, 0x849B, + 0x527F, 0xBDCB, 0x5280, 0x849C, 0x5281, 0xD8E4, 0x5282, 0xD8E3, + 0x5283, 0x849D, 0x5284, 0x849E, 0x5285, 0x849F, 0x5286, 0x84A0, + 0x5287, 0x84A1, 0x5288, 0xC5FC, 0x5289, 0x84A2, 0x528A, 0x84A3, + 0x528B, 0x84A4, 0x528C, 0x84A5, 0x528D, 0x84A6, 0x528E, 0x84A7, + 0x528F, 0x84A8, 0x5290, 0xD8E5, 0x5291, 0x84A9, 0x5292, 0x84AA, + 0x5293, 0xD8E6, 0x5294, 0x84AB, 0x5295, 0x84AC, 0x5296, 0x84AD, + 0x5297, 0x84AE, 0x5298, 0x84AF, 0x5299, 0x84B0, 0x529A, 0x84B1, + 0x529B, 0xC1A6, 0x529C, 0x84B2, 0x529D, 0xC8B0, 0x529E, 0xB0EC, + 0x529F, 0xB9A6, 0x52A0, 0xBCD3, 0x52A1, 0xCEF1, 0x52A2, 0xDBBD, + 0x52A3, 0xC1D3, 0x52A4, 0x84B3, 0x52A5, 0x84B4, 0x52A6, 0x84B5, + 0x52A7, 0x84B6, 0x52A8, 0xB6AF, 0x52A9, 0xD6FA, 0x52AA, 0xC5AC, + 0x52AB, 0xBDD9, 0x52AC, 0xDBBE, 0x52AD, 0xDBBF, 0x52AE, 0x84B7, + 0x52AF, 0x84B8, 0x52B0, 0x84B9, 0x52B1, 0xC0F8, 0x52B2, 0xBEA2, + 0x52B3, 0xC0CD, 0x52B4, 0x84BA, 0x52B5, 0x84BB, 0x52B6, 0x84BC, + 0x52B7, 0x84BD, 0x52B8, 0x84BE, 0x52B9, 0x84BF, 0x52BA, 0x84C0, + 0x52BB, 0x84C1, 0x52BC, 0x84C2, 0x52BD, 0x84C3, 0x52BE, 0xDBC0, + 0x52BF, 0xCAC6, 0x52C0, 0x84C4, 0x52C1, 0x84C5, 0x52C2, 0x84C6, + 0x52C3, 0xB2AA, 0x52C4, 0x84C7, 0x52C5, 0x84C8, 0x52C6, 0x84C9, + 0x52C7, 0xD3C2, 0x52C8, 0x84CA, 0x52C9, 0xC3E3, 0x52CA, 0x84CB, + 0x52CB, 0xD1AB, 0x52CC, 0x84CC, 0x52CD, 0x84CD, 0x52CE, 0x84CE, + 0x52CF, 0x84CF, 0x52D0, 0xDBC2, 0x52D1, 0x84D0, 0x52D2, 0xC0D5, + 0x52D3, 0x84D1, 0x52D4, 0x84D2, 0x52D5, 0x84D3, 0x52D6, 0xDBC3, + 0x52D7, 0x84D4, 0x52D8, 0xBFB1, 0x52D9, 0x84D5, 0x52DA, 0x84D6, + 0x52DB, 0x84D7, 0x52DC, 0x84D8, 0x52DD, 0x84D9, 0x52DE, 0x84DA, + 0x52DF, 0xC4BC, 0x52E0, 0x84DB, 0x52E1, 0x84DC, 0x52E2, 0x84DD, + 0x52E3, 0x84DE, 0x52E4, 0xC7DA, 0x52E5, 0x84DF, 0x52E6, 0x84E0, + 0x52E7, 0x84E1, 0x52E8, 0x84E2, 0x52E9, 0x84E3, 0x52EA, 0x84E4, + 0x52EB, 0x84E5, 0x52EC, 0x84E6, 0x52ED, 0x84E7, 0x52EE, 0x84E8, + 0x52EF, 0x84E9, 0x52F0, 0xDBC4, 0x52F1, 0x84EA, 0x52F2, 0x84EB, + 0x52F3, 0x84EC, 0x52F4, 0x84ED, 0x52F5, 0x84EE, 0x52F6, 0x84EF, + 0x52F7, 0x84F0, 0x52F8, 0x84F1, 0x52F9, 0xD9E8, 0x52FA, 0xC9D7, + 0x52FB, 0x84F2, 0x52FC, 0x84F3, 0x52FD, 0x84F4, 0x52FE, 0xB9B4, + 0x52FF, 0xCEF0, 0x5300, 0xD4C8, 0x5301, 0x84F5, 0x5302, 0x84F6, + 0x5303, 0x84F7, 0x5304, 0x84F8, 0x5305, 0xB0FC, 0x5306, 0xB4D2, + 0x5307, 0x84F9, 0x5308, 0xD0D9, 0x5309, 0x84FA, 0x530A, 0x84FB, + 0x530B, 0x84FC, 0x530C, 0x84FD, 0x530D, 0xD9E9, 0x530E, 0x84FE, + 0x530F, 0xDECB, 0x5310, 0xD9EB, 0x5311, 0x8540, 0x5312, 0x8541, + 0x5313, 0x8542, 0x5314, 0x8543, 0x5315, 0xD8B0, 0x5316, 0xBBAF, + 0x5317, 0xB1B1, 0x5318, 0x8544, 0x5319, 0xB3D7, 0x531A, 0xD8CE, + 0x531B, 0x8545, 0x531C, 0x8546, 0x531D, 0xD4D1, 0x531E, 0x8547, + 0x531F, 0x8548, 0x5320, 0xBDB3, 0x5321, 0xBFEF, 0x5322, 0x8549, + 0x5323, 0xCFBB, 0x5324, 0x854A, 0x5325, 0x854B, 0x5326, 0xD8D0, + 0x5327, 0x854C, 0x5328, 0x854D, 0x5329, 0x854E, 0x532A, 0xB7CB, + 0x532B, 0x854F, 0x532C, 0x8550, 0x532D, 0x8551, 0x532E, 0xD8D1, + 0x532F, 0x8552, 0x5330, 0x8553, 0x5331, 0x8554, 0x5332, 0x8555, + 0x5333, 0x8556, 0x5334, 0x8557, 0x5335, 0x8558, 0x5336, 0x8559, + 0x5337, 0x855A, 0x5338, 0x855B, 0x5339, 0xC6A5, 0x533A, 0xC7F8, + 0x533B, 0xD2BD, 0x533C, 0x855C, 0x533D, 0x855D, 0x533E, 0xD8D2, + 0x533F, 0xC4E4, 0x5340, 0x855E, 0x5341, 0xCAAE, 0x5342, 0x855F, + 0x5343, 0xC7A7, 0x5344, 0x8560, 0x5345, 0xD8A6, 0x5346, 0x8561, + 0x5347, 0xC9FD, 0x5348, 0xCEE7, 0x5349, 0xBBDC, 0x534A, 0xB0EB, + 0x534B, 0x8562, 0x534C, 0x8563, 0x534D, 0x8564, 0x534E, 0xBBAA, + 0x534F, 0xD0AD, 0x5350, 0x8565, 0x5351, 0xB1B0, 0x5352, 0xD7E4, + 0x5353, 0xD7BF, 0x5354, 0x8566, 0x5355, 0xB5A5, 0x5356, 0xC2F4, + 0x5357, 0xC4CF, 0x5358, 0x8567, 0x5359, 0x8568, 0x535A, 0xB2A9, + 0x535B, 0x8569, 0x535C, 0xB2B7, 0x535D, 0x856A, 0x535E, 0xB1E5, + 0x535F, 0xDFB2, 0x5360, 0xD5BC, 0x5361, 0xBFA8, 0x5362, 0xC2AC, + 0x5363, 0xD8D5, 0x5364, 0xC2B1, 0x5365, 0x856B, 0x5366, 0xD8D4, + 0x5367, 0xCED4, 0x5368, 0x856C, 0x5369, 0xDAE0, 0x536A, 0x856D, + 0x536B, 0xCEC0, 0x536C, 0x856E, 0x536D, 0x856F, 0x536E, 0xD8B4, + 0x536F, 0xC3AE, 0x5370, 0xD3A1, 0x5371, 0xCEA3, 0x5372, 0x8570, + 0x5373, 0xBCB4, 0x5374, 0xC8B4, 0x5375, 0xC2D1, 0x5376, 0x8571, + 0x5377, 0xBEED, 0x5378, 0xD0B6, 0x5379, 0x8572, 0x537A, 0xDAE1, + 0x537B, 0x8573, 0x537C, 0x8574, 0x537D, 0x8575, 0x537E, 0x8576, + 0x537F, 0xC7E4, 0x5380, 0x8577, 0x5381, 0x8578, 0x5382, 0xB3A7, + 0x5383, 0x8579, 0x5384, 0xB6F2, 0x5385, 0xCCFC, 0x5386, 0xC0FA, + 0x5387, 0x857A, 0x5388, 0x857B, 0x5389, 0xC0F7, 0x538A, 0x857C, + 0x538B, 0xD1B9, 0x538C, 0xD1E1, 0x538D, 0xD8C7, 0x538E, 0x857D, + 0x538F, 0x857E, 0x5390, 0x8580, 0x5391, 0x8581, 0x5392, 0x8582, + 0x5393, 0x8583, 0x5394, 0x8584, 0x5395, 0xB2DE, 0x5396, 0x8585, + 0x5397, 0x8586, 0x5398, 0xC0E5, 0x5399, 0x8587, 0x539A, 0xBAF1, + 0x539B, 0x8588, 0x539C, 0x8589, 0x539D, 0xD8C8, 0x539E, 0x858A, + 0x539F, 0xD4AD, 0x53A0, 0x858B, 0x53A1, 0x858C, 0x53A2, 0xCFE1, + 0x53A3, 0xD8C9, 0x53A4, 0x858D, 0x53A5, 0xD8CA, 0x53A6, 0xCFC3, + 0x53A7, 0x858E, 0x53A8, 0xB3F8, 0x53A9, 0xBEC7, 0x53AA, 0x858F, + 0x53AB, 0x8590, 0x53AC, 0x8591, 0x53AD, 0x8592, 0x53AE, 0xD8CB, + 0x53AF, 0x8593, 0x53B0, 0x8594, 0x53B1, 0x8595, 0x53B2, 0x8596, + 0x53B3, 0x8597, 0x53B4, 0x8598, 0x53B5, 0x8599, 0x53B6, 0xDBCC, + 0x53B7, 0x859A, 0x53B8, 0x859B, 0x53B9, 0x859C, 0x53BA, 0x859D, + 0x53BB, 0xC8A5, 0x53BC, 0x859E, 0x53BD, 0x859F, 0x53BE, 0x85A0, + 0x53BF, 0xCFD8, 0x53C0, 0x85A1, 0x53C1, 0xC8FE, 0x53C2, 0xB2CE, + 0x53C3, 0x85A2, 0x53C4, 0x85A3, 0x53C5, 0x85A4, 0x53C6, 0x85A5, + 0x53C7, 0x85A6, 0x53C8, 0xD3D6, 0x53C9, 0xB2E6, 0x53CA, 0xBCB0, + 0x53CB, 0xD3D1, 0x53CC, 0xCBAB, 0x53CD, 0xB7B4, 0x53CE, 0x85A7, + 0x53CF, 0x85A8, 0x53D0, 0x85A9, 0x53D1, 0xB7A2, 0x53D2, 0x85AA, + 0x53D3, 0x85AB, 0x53D4, 0xCAE5, 0x53D5, 0x85AC, 0x53D6, 0xC8A1, + 0x53D7, 0xCADC, 0x53D8, 0xB1E4, 0x53D9, 0xD0F0, 0x53DA, 0x85AD, + 0x53DB, 0xC5D1, 0x53DC, 0x85AE, 0x53DD, 0x85AF, 0x53DE, 0x85B0, + 0x53DF, 0xDBC5, 0x53E0, 0xB5FE, 0x53E1, 0x85B1, 0x53E2, 0x85B2, + 0x53E3, 0xBFDA, 0x53E4, 0xB9C5, 0x53E5, 0xBEE4, 0x53E6, 0xC1ED, + 0x53E7, 0x85B3, 0x53E8, 0xDFB6, 0x53E9, 0xDFB5, 0x53EA, 0xD6BB, + 0x53EB, 0xBDD0, 0x53EC, 0xD5D9, 0x53ED, 0xB0C8, 0x53EE, 0xB6A3, + 0x53EF, 0xBFC9, 0x53F0, 0xCCA8, 0x53F1, 0xDFB3, 0x53F2, 0xCAB7, + 0x53F3, 0xD3D2, 0x53F4, 0x85B4, 0x53F5, 0xD8CF, 0x53F6, 0xD2B6, + 0x53F7, 0xBAC5, 0x53F8, 0xCBBE, 0x53F9, 0xCCBE, 0x53FA, 0x85B5, + 0x53FB, 0xDFB7, 0x53FC, 0xB5F0, 0x53FD, 0xDFB4, 0x53FE, 0x85B6, + 0x53FF, 0x85B7, 0x5400, 0x85B8, 0x5401, 0xD3F5, 0x5402, 0x85B9, + 0x5403, 0xB3D4, 0x5404, 0xB8F7, 0x5405, 0x85BA, 0x5406, 0xDFBA, + 0x5407, 0x85BB, 0x5408, 0xBACF, 0x5409, 0xBCAA, 0x540A, 0xB5F5, + 0x540B, 0x85BC, 0x540C, 0xCDAC, 0x540D, 0xC3FB, 0x540E, 0xBAF3, + 0x540F, 0xC0F4, 0x5410, 0xCDC2, 0x5411, 0xCFF2, 0x5412, 0xDFB8, + 0x5413, 0xCFC5, 0x5414, 0x85BD, 0x5415, 0xC2C0, 0x5416, 0xDFB9, + 0x5417, 0xC2F0, 0x5418, 0x85BE, 0x5419, 0x85BF, 0x541A, 0x85C0, + 0x541B, 0xBEFD, 0x541C, 0x85C1, 0x541D, 0xC1DF, 0x541E, 0xCDCC, + 0x541F, 0xD2F7, 0x5420, 0xB7CD, 0x5421, 0xDFC1, 0x5422, 0x85C2, + 0x5423, 0xDFC4, 0x5424, 0x85C3, 0x5425, 0x85C4, 0x5426, 0xB7F1, + 0x5427, 0xB0C9, 0x5428, 0xB6D6, 0x5429, 0xB7D4, 0x542A, 0x85C5, + 0x542B, 0xBAAC, 0x542C, 0xCCFD, 0x542D, 0xBFD4, 0x542E, 0xCBB1, + 0x542F, 0xC6F4, 0x5430, 0x85C6, 0x5431, 0xD6A8, 0x5432, 0xDFC5, + 0x5433, 0x85C7, 0x5434, 0xCEE2, 0x5435, 0xB3B3, 0x5436, 0x85C8, + 0x5437, 0x85C9, 0x5438, 0xCEFC, 0x5439, 0xB4B5, 0x543A, 0x85CA, + 0x543B, 0xCEC7, 0x543C, 0xBAF0, 0x543D, 0x85CB, 0x543E, 0xCEE1, + 0x543F, 0x85CC, 0x5440, 0xD1BD, 0x5441, 0x85CD, 0x5442, 0x85CE, + 0x5443, 0xDFC0, 0x5444, 0x85CF, 0x5445, 0x85D0, 0x5446, 0xB4F4, + 0x5447, 0x85D1, 0x5448, 0xB3CA, 0x5449, 0x85D2, 0x544A, 0xB8E6, + 0x544B, 0xDFBB, 0x544C, 0x85D3, 0x544D, 0x85D4, 0x544E, 0x85D5, + 0x544F, 0x85D6, 0x5450, 0xC4C5, 0x5451, 0x85D7, 0x5452, 0xDFBC, + 0x5453, 0xDFBD, 0x5454, 0xDFBE, 0x5455, 0xC5BB, 0x5456, 0xDFBF, + 0x5457, 0xDFC2, 0x5458, 0xD4B1, 0x5459, 0xDFC3, 0x545A, 0x85D8, + 0x545B, 0xC7BA, 0x545C, 0xCED8, 0x545D, 0x85D9, 0x545E, 0x85DA, + 0x545F, 0x85DB, 0x5460, 0x85DC, 0x5461, 0x85DD, 0x5462, 0xC4D8, + 0x5463, 0x85DE, 0x5464, 0xDFCA, 0x5465, 0x85DF, 0x5466, 0xDFCF, + 0x5467, 0x85E0, 0x5468, 0xD6DC, 0x5469, 0x85E1, 0x546A, 0x85E2, + 0x546B, 0x85E3, 0x546C, 0x85E4, 0x546D, 0x85E5, 0x546E, 0x85E6, + 0x546F, 0x85E7, 0x5470, 0x85E8, 0x5471, 0xDFC9, 0x5472, 0xDFDA, + 0x5473, 0xCEB6, 0x5474, 0x85E9, 0x5475, 0xBAC7, 0x5476, 0xDFCE, + 0x5477, 0xDFC8, 0x5478, 0xC5DE, 0x5479, 0x85EA, 0x547A, 0x85EB, + 0x547B, 0xC9EB, 0x547C, 0xBAF4, 0x547D, 0xC3FC, 0x547E, 0x85EC, + 0x547F, 0x85ED, 0x5480, 0xBED7, 0x5481, 0x85EE, 0x5482, 0xDFC6, + 0x5483, 0x85EF, 0x5484, 0xDFCD, 0x5485, 0x85F0, 0x5486, 0xC5D8, + 0x5487, 0x85F1, 0x5488, 0x85F2, 0x5489, 0x85F3, 0x548A, 0x85F4, + 0x548B, 0xD5A6, 0x548C, 0xBACD, 0x548D, 0x85F5, 0x548E, 0xBECC, + 0x548F, 0xD3BD, 0x5490, 0xB8C0, 0x5491, 0x85F6, 0x5492, 0xD6E4, + 0x5493, 0x85F7, 0x5494, 0xDFC7, 0x5495, 0xB9BE, 0x5496, 0xBFA7, + 0x5497, 0x85F8, 0x5498, 0x85F9, 0x5499, 0xC1FC, 0x549A, 0xDFCB, + 0x549B, 0xDFCC, 0x549C, 0x85FA, 0x549D, 0xDFD0, 0x549E, 0x85FB, + 0x549F, 0x85FC, 0x54A0, 0x85FD, 0x54A1, 0x85FE, 0x54A2, 0x8640, + 0x54A3, 0xDFDB, 0x54A4, 0xDFE5, 0x54A5, 0x8641, 0x54A6, 0xDFD7, + 0x54A7, 0xDFD6, 0x54A8, 0xD7C9, 0x54A9, 0xDFE3, 0x54AA, 0xDFE4, + 0x54AB, 0xE5EB, 0x54AC, 0xD2A7, 0x54AD, 0xDFD2, 0x54AE, 0x8642, + 0x54AF, 0xBFA9, 0x54B0, 0x8643, 0x54B1, 0xD4DB, 0x54B2, 0x8644, + 0x54B3, 0xBFC8, 0x54B4, 0xDFD4, 0x54B5, 0x8645, 0x54B6, 0x8646, + 0x54B7, 0x8647, 0x54B8, 0xCFCC, 0x54B9, 0x8648, 0x54BA, 0x8649, + 0x54BB, 0xDFDD, 0x54BC, 0x864A, 0x54BD, 0xD1CA, 0x54BE, 0x864B, + 0x54BF, 0xDFDE, 0x54C0, 0xB0A7, 0x54C1, 0xC6B7, 0x54C2, 0xDFD3, + 0x54C3, 0x864C, 0x54C4, 0xBAE5, 0x54C5, 0x864D, 0x54C6, 0xB6DF, + 0x54C7, 0xCDDB, 0x54C8, 0xB9FE, 0x54C9, 0xD4D5, 0x54CA, 0x864E, + 0x54CB, 0x864F, 0x54CC, 0xDFDF, 0x54CD, 0xCFEC, 0x54CE, 0xB0A5, + 0x54CF, 0xDFE7, 0x54D0, 0xDFD1, 0x54D1, 0xD1C6, 0x54D2, 0xDFD5, + 0x54D3, 0xDFD8, 0x54D4, 0xDFD9, 0x54D5, 0xDFDC, 0x54D6, 0x8650, + 0x54D7, 0xBBA9, 0x54D8, 0x8651, 0x54D9, 0xDFE0, 0x54DA, 0xDFE1, + 0x54DB, 0x8652, 0x54DC, 0xDFE2, 0x54DD, 0xDFE6, 0x54DE, 0xDFE8, + 0x54DF, 0xD3B4, 0x54E0, 0x8653, 0x54E1, 0x8654, 0x54E2, 0x8655, + 0x54E3, 0x8656, 0x54E4, 0x8657, 0x54E5, 0xB8E7, 0x54E6, 0xC5B6, + 0x54E7, 0xDFEA, 0x54E8, 0xC9DA, 0x54E9, 0xC1A8, 0x54EA, 0xC4C4, + 0x54EB, 0x8658, 0x54EC, 0x8659, 0x54ED, 0xBFDE, 0x54EE, 0xCFF8, + 0x54EF, 0x865A, 0x54F0, 0x865B, 0x54F1, 0x865C, 0x54F2, 0xD5DC, + 0x54F3, 0xDFEE, 0x54F4, 0x865D, 0x54F5, 0x865E, 0x54F6, 0x865F, + 0x54F7, 0x8660, 0x54F8, 0x8661, 0x54F9, 0x8662, 0x54FA, 0xB2B8, + 0x54FB, 0x8663, 0x54FC, 0xBADF, 0x54FD, 0xDFEC, 0x54FE, 0x8664, + 0x54FF, 0xDBC1, 0x5500, 0x8665, 0x5501, 0xD1E4, 0x5502, 0x8666, + 0x5503, 0x8667, 0x5504, 0x8668, 0x5505, 0x8669, 0x5506, 0xCBF4, + 0x5507, 0xB4BD, 0x5508, 0x866A, 0x5509, 0xB0A6, 0x550A, 0x866B, + 0x550B, 0x866C, 0x550C, 0x866D, 0x550D, 0x866E, 0x550E, 0x866F, + 0x550F, 0xDFF1, 0x5510, 0xCCC6, 0x5511, 0xDFF2, 0x5512, 0x8670, + 0x5513, 0x8671, 0x5514, 0xDFED, 0x5515, 0x8672, 0x5516, 0x8673, + 0x5517, 0x8674, 0x5518, 0x8675, 0x5519, 0x8676, 0x551A, 0x8677, + 0x551B, 0xDFE9, 0x551C, 0x8678, 0x551D, 0x8679, 0x551E, 0x867A, + 0x551F, 0x867B, 0x5520, 0xDFEB, 0x5521, 0x867C, 0x5522, 0xDFEF, + 0x5523, 0xDFF0, 0x5524, 0xBBBD, 0x5525, 0x867D, 0x5526, 0x867E, + 0x5527, 0xDFF3, 0x5528, 0x8680, 0x5529, 0x8681, 0x552A, 0xDFF4, + 0x552B, 0x8682, 0x552C, 0xBBA3, 0x552D, 0x8683, 0x552E, 0xCADB, + 0x552F, 0xCEA8, 0x5530, 0xE0A7, 0x5531, 0xB3AA, 0x5532, 0x8684, + 0x5533, 0xE0A6, 0x5534, 0x8685, 0x5535, 0x8686, 0x5536, 0x8687, + 0x5537, 0xE0A1, 0x5538, 0x8688, 0x5539, 0x8689, 0x553A, 0x868A, + 0x553B, 0x868B, 0x553C, 0xDFFE, 0x553D, 0x868C, 0x553E, 0xCDD9, + 0x553F, 0xDFFC, 0x5540, 0x868D, 0x5541, 0xDFFA, 0x5542, 0x868E, + 0x5543, 0xBFD0, 0x5544, 0xD7C4, 0x5545, 0x868F, 0x5546, 0xC9CC, + 0x5547, 0x8690, 0x5548, 0x8691, 0x5549, 0xDFF8, 0x554A, 0xB0A1, + 0x554B, 0x8692, 0x554C, 0x8693, 0x554D, 0x8694, 0x554E, 0x8695, + 0x554F, 0x8696, 0x5550, 0xDFFD, 0x5551, 0x8697, 0x5552, 0x8698, + 0x5553, 0x8699, 0x5554, 0x869A, 0x5555, 0xDFFB, 0x5556, 0xE0A2, + 0x5557, 0x869B, 0x5558, 0x869C, 0x5559, 0x869D, 0x555A, 0x869E, + 0x555B, 0x869F, 0x555C, 0xE0A8, 0x555D, 0x86A0, 0x555E, 0x86A1, + 0x555F, 0x86A2, 0x5560, 0x86A3, 0x5561, 0xB7C8, 0x5562, 0x86A4, + 0x5563, 0x86A5, 0x5564, 0xC6A1, 0x5565, 0xC9B6, 0x5566, 0xC0B2, + 0x5567, 0xDFF5, 0x5568, 0x86A6, 0x5569, 0x86A7, 0x556A, 0xC5BE, + 0x556B, 0x86A8, 0x556C, 0xD8C4, 0x556D, 0xDFF9, 0x556E, 0xC4F6, + 0x556F, 0x86A9, 0x5570, 0x86AA, 0x5571, 0x86AB, 0x5572, 0x86AC, + 0x5573, 0x86AD, 0x5574, 0x86AE, 0x5575, 0xE0A3, 0x5576, 0xE0A4, + 0x5577, 0xE0A5, 0x5578, 0xD0A5, 0x5579, 0x86AF, 0x557A, 0x86B0, + 0x557B, 0xE0B4, 0x557C, 0xCCE4, 0x557D, 0x86B1, 0x557E, 0xE0B1, + 0x557F, 0x86B2, 0x5580, 0xBFA6, 0x5581, 0xE0AF, 0x5582, 0xCEB9, + 0x5583, 0xE0AB, 0x5584, 0xC9C6, 0x5585, 0x86B3, 0x5586, 0x86B4, + 0x5587, 0xC0AE, 0x5588, 0xE0AE, 0x5589, 0xBAED, 0x558A, 0xBAB0, + 0x558B, 0xE0A9, 0x558C, 0x86B5, 0x558D, 0x86B6, 0x558E, 0x86B7, + 0x558F, 0xDFF6, 0x5590, 0x86B8, 0x5591, 0xE0B3, 0x5592, 0x86B9, + 0x5593, 0x86BA, 0x5594, 0xE0B8, 0x5595, 0x86BB, 0x5596, 0x86BC, + 0x5597, 0x86BD, 0x5598, 0xB4AD, 0x5599, 0xE0B9, 0x559A, 0x86BE, + 0x559B, 0x86BF, 0x559C, 0xCFB2, 0x559D, 0xBAC8, 0x559E, 0x86C0, + 0x559F, 0xE0B0, 0x55A0, 0x86C1, 0x55A1, 0x86C2, 0x55A2, 0x86C3, + 0x55A3, 0x86C4, 0x55A4, 0x86C5, 0x55A5, 0x86C6, 0x55A6, 0x86C7, + 0x55A7, 0xD0FA, 0x55A8, 0x86C8, 0x55A9, 0x86C9, 0x55AA, 0x86CA, + 0x55AB, 0x86CB, 0x55AC, 0x86CC, 0x55AD, 0x86CD, 0x55AE, 0x86CE, + 0x55AF, 0x86CF, 0x55B0, 0x86D0, 0x55B1, 0xE0AC, 0x55B2, 0x86D1, + 0x55B3, 0xD4FB, 0x55B4, 0x86D2, 0x55B5, 0xDFF7, 0x55B6, 0x86D3, + 0x55B7, 0xC5E7, 0x55B8, 0x86D4, 0x55B9, 0xE0AD, 0x55BA, 0x86D5, + 0x55BB, 0xD3F7, 0x55BC, 0x86D6, 0x55BD, 0xE0B6, 0x55BE, 0xE0B7, + 0x55BF, 0x86D7, 0x55C0, 0x86D8, 0x55C1, 0x86D9, 0x55C2, 0x86DA, + 0x55C3, 0x86DB, 0x55C4, 0xE0C4, 0x55C5, 0xD0E1, 0x55C6, 0x86DC, + 0x55C7, 0x86DD, 0x55C8, 0x86DE, 0x55C9, 0xE0BC, 0x55CA, 0x86DF, + 0x55CB, 0x86E0, 0x55CC, 0xE0C9, 0x55CD, 0xE0CA, 0x55CE, 0x86E1, + 0x55CF, 0x86E2, 0x55D0, 0x86E3, 0x55D1, 0xE0BE, 0x55D2, 0xE0AA, + 0x55D3, 0xC9A4, 0x55D4, 0xE0C1, 0x55D5, 0x86E4, 0x55D6, 0xE0B2, + 0x55D7, 0x86E5, 0x55D8, 0x86E6, 0x55D9, 0x86E7, 0x55DA, 0x86E8, + 0x55DB, 0x86E9, 0x55DC, 0xCAC8, 0x55DD, 0xE0C3, 0x55DE, 0x86EA, + 0x55DF, 0xE0B5, 0x55E0, 0x86EB, 0x55E1, 0xCECB, 0x55E2, 0x86EC, + 0x55E3, 0xCBC3, 0x55E4, 0xE0CD, 0x55E5, 0xE0C6, 0x55E6, 0xE0C2, + 0x55E7, 0x86ED, 0x55E8, 0xE0CB, 0x55E9, 0x86EE, 0x55EA, 0xE0BA, + 0x55EB, 0xE0BF, 0x55EC, 0xE0C0, 0x55ED, 0x86EF, 0x55EE, 0x86F0, + 0x55EF, 0xE0C5, 0x55F0, 0x86F1, 0x55F1, 0x86F2, 0x55F2, 0xE0C7, + 0x55F3, 0xE0C8, 0x55F4, 0x86F3, 0x55F5, 0xE0CC, 0x55F6, 0x86F4, + 0x55F7, 0xE0BB, 0x55F8, 0x86F5, 0x55F9, 0x86F6, 0x55FA, 0x86F7, + 0x55FB, 0x86F8, 0x55FC, 0x86F9, 0x55FD, 0xCBD4, 0x55FE, 0xE0D5, + 0x55FF, 0x86FA, 0x5600, 0xE0D6, 0x5601, 0xE0D2, 0x5602, 0x86FB, + 0x5603, 0x86FC, 0x5604, 0x86FD, 0x5605, 0x86FE, 0x5606, 0x8740, + 0x5607, 0x8741, 0x5608, 0xE0D0, 0x5609, 0xBCCE, 0x560A, 0x8742, + 0x560B, 0x8743, 0x560C, 0xE0D1, 0x560D, 0x8744, 0x560E, 0xB8C2, + 0x560F, 0xD8C5, 0x5610, 0x8745, 0x5611, 0x8746, 0x5612, 0x8747, + 0x5613, 0x8748, 0x5614, 0x8749, 0x5615, 0x874A, 0x5616, 0x874B, + 0x5617, 0x874C, 0x5618, 0xD0EA, 0x5619, 0x874D, 0x561A, 0x874E, + 0x561B, 0xC2EF, 0x561C, 0x874F, 0x561D, 0x8750, 0x561E, 0xE0CF, + 0x561F, 0xE0BD, 0x5620, 0x8751, 0x5621, 0x8752, 0x5622, 0x8753, + 0x5623, 0xE0D4, 0x5624, 0xE0D3, 0x5625, 0x8754, 0x5626, 0x8755, + 0x5627, 0xE0D7, 0x5628, 0x8756, 0x5629, 0x8757, 0x562A, 0x8758, + 0x562B, 0x8759, 0x562C, 0xE0DC, 0x562D, 0xE0D8, 0x562E, 0x875A, + 0x562F, 0x875B, 0x5630, 0x875C, 0x5631, 0xD6F6, 0x5632, 0xB3B0, + 0x5633, 0x875D, 0x5634, 0xD7EC, 0x5635, 0x875E, 0x5636, 0xCBBB, + 0x5637, 0x875F, 0x5638, 0x8760, 0x5639, 0xE0DA, 0x563A, 0x8761, + 0x563B, 0xCEFB, 0x563C, 0x8762, 0x563D, 0x8763, 0x563E, 0x8764, + 0x563F, 0xBAD9, 0x5640, 0x8765, 0x5641, 0x8766, 0x5642, 0x8767, + 0x5643, 0x8768, 0x5644, 0x8769, 0x5645, 0x876A, 0x5646, 0x876B, + 0x5647, 0x876C, 0x5648, 0x876D, 0x5649, 0x876E, 0x564A, 0x876F, + 0x564B, 0x8770, 0x564C, 0xE0E1, 0x564D, 0xE0DD, 0x564E, 0xD2AD, + 0x564F, 0x8771, 0x5650, 0x8772, 0x5651, 0x8773, 0x5652, 0x8774, + 0x5653, 0x8775, 0x5654, 0xE0E2, 0x5655, 0x8776, 0x5656, 0x8777, + 0x5657, 0xE0DB, 0x5658, 0xE0D9, 0x5659, 0xE0DF, 0x565A, 0x8778, + 0x565B, 0x8779, 0x565C, 0xE0E0, 0x565D, 0x877A, 0x565E, 0x877B, + 0x565F, 0x877C, 0x5660, 0x877D, 0x5661, 0x877E, 0x5662, 0xE0DE, + 0x5663, 0x8780, 0x5664, 0xE0E4, 0x5665, 0x8781, 0x5666, 0x8782, + 0x5667, 0x8783, 0x5668, 0xC6F7, 0x5669, 0xD8AC, 0x566A, 0xD4EB, + 0x566B, 0xE0E6, 0x566C, 0xCAC9, 0x566D, 0x8784, 0x566E, 0x8785, + 0x566F, 0x8786, 0x5670, 0x8787, 0x5671, 0xE0E5, 0x5672, 0x8788, + 0x5673, 0x8789, 0x5674, 0x878A, 0x5675, 0x878B, 0x5676, 0xB8C1, + 0x5677, 0x878C, 0x5678, 0x878D, 0x5679, 0x878E, 0x567A, 0x878F, + 0x567B, 0xE0E7, 0x567C, 0xE0E8, 0x567D, 0x8790, 0x567E, 0x8791, + 0x567F, 0x8792, 0x5680, 0x8793, 0x5681, 0x8794, 0x5682, 0x8795, + 0x5683, 0x8796, 0x5684, 0x8797, 0x5685, 0xE0E9, 0x5686, 0xE0E3, + 0x5687, 0x8798, 0x5688, 0x8799, 0x5689, 0x879A, 0x568A, 0x879B, + 0x568B, 0x879C, 0x568C, 0x879D, 0x568D, 0x879E, 0x568E, 0xBABF, + 0x568F, 0xCCE7, 0x5690, 0x879F, 0x5691, 0x87A0, 0x5692, 0x87A1, + 0x5693, 0xE0EA, 0x5694, 0x87A2, 0x5695, 0x87A3, 0x5696, 0x87A4, + 0x5697, 0x87A5, 0x5698, 0x87A6, 0x5699, 0x87A7, 0x569A, 0x87A8, + 0x569B, 0x87A9, 0x569C, 0x87AA, 0x569D, 0x87AB, 0x569E, 0x87AC, + 0x569F, 0x87AD, 0x56A0, 0x87AE, 0x56A1, 0x87AF, 0x56A2, 0x87B0, + 0x56A3, 0xCFF9, 0x56A4, 0x87B1, 0x56A5, 0x87B2, 0x56A6, 0x87B3, + 0x56A7, 0x87B4, 0x56A8, 0x87B5, 0x56A9, 0x87B6, 0x56AA, 0x87B7, + 0x56AB, 0x87B8, 0x56AC, 0x87B9, 0x56AD, 0x87BA, 0x56AE, 0x87BB, + 0x56AF, 0xE0EB, 0x56B0, 0x87BC, 0x56B1, 0x87BD, 0x56B2, 0x87BE, + 0x56B3, 0x87BF, 0x56B4, 0x87C0, 0x56B5, 0x87C1, 0x56B6, 0x87C2, + 0x56B7, 0xC8C2, 0x56B8, 0x87C3, 0x56B9, 0x87C4, 0x56BA, 0x87C5, + 0x56BB, 0x87C6, 0x56BC, 0xBDC0, 0x56BD, 0x87C7, 0x56BE, 0x87C8, + 0x56BF, 0x87C9, 0x56C0, 0x87CA, 0x56C1, 0x87CB, 0x56C2, 0x87CC, + 0x56C3, 0x87CD, 0x56C4, 0x87CE, 0x56C5, 0x87CF, 0x56C6, 0x87D0, + 0x56C7, 0x87D1, 0x56C8, 0x87D2, 0x56C9, 0x87D3, 0x56CA, 0xC4D2, + 0x56CB, 0x87D4, 0x56CC, 0x87D5, 0x56CD, 0x87D6, 0x56CE, 0x87D7, + 0x56CF, 0x87D8, 0x56D0, 0x87D9, 0x56D1, 0x87DA, 0x56D2, 0x87DB, + 0x56D3, 0x87DC, 0x56D4, 0xE0EC, 0x56D5, 0x87DD, 0x56D6, 0x87DE, + 0x56D7, 0xE0ED, 0x56D8, 0x87DF, 0x56D9, 0x87E0, 0x56DA, 0xC7F4, + 0x56DB, 0xCBC4, 0x56DC, 0x87E1, 0x56DD, 0xE0EE, 0x56DE, 0xBBD8, + 0x56DF, 0xD8B6, 0x56E0, 0xD2F2, 0x56E1, 0xE0EF, 0x56E2, 0xCDC5, + 0x56E3, 0x87E2, 0x56E4, 0xB6DA, 0x56E5, 0x87E3, 0x56E6, 0x87E4, + 0x56E7, 0x87E5, 0x56E8, 0x87E6, 0x56E9, 0x87E7, 0x56EA, 0x87E8, + 0x56EB, 0xE0F1, 0x56EC, 0x87E9, 0x56ED, 0xD4B0, 0x56EE, 0x87EA, + 0x56EF, 0x87EB, 0x56F0, 0xC0A7, 0x56F1, 0xB4D1, 0x56F2, 0x87EC, + 0x56F3, 0x87ED, 0x56F4, 0xCEA7, 0x56F5, 0xE0F0, 0x56F6, 0x87EE, + 0x56F7, 0x87EF, 0x56F8, 0x87F0, 0x56F9, 0xE0F2, 0x56FA, 0xB9CC, + 0x56FB, 0x87F1, 0x56FC, 0x87F2, 0x56FD, 0xB9FA, 0x56FE, 0xCDBC, + 0x56FF, 0xE0F3, 0x5700, 0x87F3, 0x5701, 0x87F4, 0x5702, 0x87F5, + 0x5703, 0xC6D4, 0x5704, 0xE0F4, 0x5705, 0x87F6, 0x5706, 0xD4B2, + 0x5707, 0x87F7, 0x5708, 0xC8A6, 0x5709, 0xE0F6, 0x570A, 0xE0F5, + 0x570B, 0x87F8, 0x570C, 0x87F9, 0x570D, 0x87FA, 0x570E, 0x87FB, + 0x570F, 0x87FC, 0x5710, 0x87FD, 0x5711, 0x87FE, 0x5712, 0x8840, + 0x5713, 0x8841, 0x5714, 0x8842, 0x5715, 0x8843, 0x5716, 0x8844, + 0x5717, 0x8845, 0x5718, 0x8846, 0x5719, 0x8847, 0x571A, 0x8848, + 0x571B, 0x8849, 0x571C, 0xE0F7, 0x571D, 0x884A, 0x571E, 0x884B, + 0x571F, 0xCDC1, 0x5720, 0x884C, 0x5721, 0x884D, 0x5722, 0x884E, + 0x5723, 0xCAA5, 0x5724, 0x884F, 0x5725, 0x8850, 0x5726, 0x8851, + 0x5727, 0x8852, 0x5728, 0xD4DA, 0x5729, 0xDBD7, 0x572A, 0xDBD9, + 0x572B, 0x8853, 0x572C, 0xDBD8, 0x572D, 0xB9E7, 0x572E, 0xDBDC, + 0x572F, 0xDBDD, 0x5730, 0xB5D8, 0x5731, 0x8854, 0x5732, 0x8855, + 0x5733, 0xDBDA, 0x5734, 0x8856, 0x5735, 0x8857, 0x5736, 0x8858, + 0x5737, 0x8859, 0x5738, 0x885A, 0x5739, 0xDBDB, 0x573A, 0xB3A1, + 0x573B, 0xDBDF, 0x573C, 0x885B, 0x573D, 0x885C, 0x573E, 0xBBF8, + 0x573F, 0x885D, 0x5740, 0xD6B7, 0x5741, 0x885E, 0x5742, 0xDBE0, + 0x5743, 0x885F, 0x5744, 0x8860, 0x5745, 0x8861, 0x5746, 0x8862, + 0x5747, 0xBEF9, 0x5748, 0x8863, 0x5749, 0x8864, 0x574A, 0xB7BB, + 0x574B, 0x8865, 0x574C, 0xDBD0, 0x574D, 0xCCAE, 0x574E, 0xBFB2, + 0x574F, 0xBBB5, 0x5750, 0xD7F8, 0x5751, 0xBFD3, 0x5752, 0x8866, + 0x5753, 0x8867, 0x5754, 0x8868, 0x5755, 0x8869, 0x5756, 0x886A, + 0x5757, 0xBFE9, 0x5758, 0x886B, 0x5759, 0x886C, 0x575A, 0xBCE1, + 0x575B, 0xCCB3, 0x575C, 0xDBDE, 0x575D, 0xB0D3, 0x575E, 0xCEEB, + 0x575F, 0xB7D8, 0x5760, 0xD7B9, 0x5761, 0xC6C2, 0x5762, 0x886D, + 0x5763, 0x886E, 0x5764, 0xC0A4, 0x5765, 0x886F, 0x5766, 0xCCB9, + 0x5767, 0x8870, 0x5768, 0xDBE7, 0x5769, 0xDBE1, 0x576A, 0xC6BA, + 0x576B, 0xDBE3, 0x576C, 0x8871, 0x576D, 0xDBE8, 0x576E, 0x8872, + 0x576F, 0xC5F7, 0x5770, 0x8873, 0x5771, 0x8874, 0x5772, 0x8875, + 0x5773, 0xDBEA, 0x5774, 0x8876, 0x5775, 0x8877, 0x5776, 0xDBE9, + 0x5777, 0xBFC0, 0x5778, 0x8878, 0x5779, 0x8879, 0x577A, 0x887A, + 0x577B, 0xDBE6, 0x577C, 0xDBE5, 0x577D, 0x887B, 0x577E, 0x887C, + 0x577F, 0x887D, 0x5780, 0x887E, 0x5781, 0x8880, 0x5782, 0xB4B9, + 0x5783, 0xC0AC, 0x5784, 0xC2A2, 0x5785, 0xDBE2, 0x5786, 0xDBE4, + 0x5787, 0x8881, 0x5788, 0x8882, 0x5789, 0x8883, 0x578A, 0x8884, + 0x578B, 0xD0CD, 0x578C, 0xDBED, 0x578D, 0x8885, 0x578E, 0x8886, + 0x578F, 0x8887, 0x5790, 0x8888, 0x5791, 0x8889, 0x5792, 0xC0DD, + 0x5793, 0xDBF2, 0x5794, 0x888A, 0x5795, 0x888B, 0x5796, 0x888C, + 0x5797, 0x888D, 0x5798, 0x888E, 0x5799, 0x888F, 0x579A, 0x8890, + 0x579B, 0xB6E2, 0x579C, 0x8891, 0x579D, 0x8892, 0x579E, 0x8893, + 0x579F, 0x8894, 0x57A0, 0xDBF3, 0x57A1, 0xDBD2, 0x57A2, 0xB9B8, + 0x57A3, 0xD4AB, 0x57A4, 0xDBEC, 0x57A5, 0x8895, 0x57A6, 0xBFD1, + 0x57A7, 0xDBF0, 0x57A8, 0x8896, 0x57A9, 0xDBD1, 0x57AA, 0x8897, + 0x57AB, 0xB5E6, 0x57AC, 0x8898, 0x57AD, 0xDBEB, 0x57AE, 0xBFE5, + 0x57AF, 0x8899, 0x57B0, 0x889A, 0x57B1, 0x889B, 0x57B2, 0xDBEE, + 0x57B3, 0x889C, 0x57B4, 0xDBF1, 0x57B5, 0x889D, 0x57B6, 0x889E, + 0x57B7, 0x889F, 0x57B8, 0xDBF9, 0x57B9, 0x88A0, 0x57BA, 0x88A1, + 0x57BB, 0x88A2, 0x57BC, 0x88A3, 0x57BD, 0x88A4, 0x57BE, 0x88A5, + 0x57BF, 0x88A6, 0x57C0, 0x88A7, 0x57C1, 0x88A8, 0x57C2, 0xB9A1, + 0x57C3, 0xB0A3, 0x57C4, 0x88A9, 0x57C5, 0x88AA, 0x57C6, 0x88AB, + 0x57C7, 0x88AC, 0x57C8, 0x88AD, 0x57C9, 0x88AE, 0x57CA, 0x88AF, + 0x57CB, 0xC2F1, 0x57CC, 0x88B0, 0x57CD, 0x88B1, 0x57CE, 0xB3C7, + 0x57CF, 0xDBEF, 0x57D0, 0x88B2, 0x57D1, 0x88B3, 0x57D2, 0xDBF8, + 0x57D3, 0x88B4, 0x57D4, 0xC6D2, 0x57D5, 0xDBF4, 0x57D6, 0x88B5, + 0x57D7, 0x88B6, 0x57D8, 0xDBF5, 0x57D9, 0xDBF7, 0x57DA, 0xDBF6, + 0x57DB, 0x88B7, 0x57DC, 0x88B8, 0x57DD, 0xDBFE, 0x57DE, 0x88B9, + 0x57DF, 0xD3F2, 0x57E0, 0xB2BA, 0x57E1, 0x88BA, 0x57E2, 0x88BB, + 0x57E3, 0x88BC, 0x57E4, 0xDBFD, 0x57E5, 0x88BD, 0x57E6, 0x88BE, + 0x57E7, 0x88BF, 0x57E8, 0x88C0, 0x57E9, 0x88C1, 0x57EA, 0x88C2, + 0x57EB, 0x88C3, 0x57EC, 0x88C4, 0x57ED, 0xDCA4, 0x57EE, 0x88C5, + 0x57EF, 0xDBFB, 0x57F0, 0x88C6, 0x57F1, 0x88C7, 0x57F2, 0x88C8, + 0x57F3, 0x88C9, 0x57F4, 0xDBFA, 0x57F5, 0x88CA, 0x57F6, 0x88CB, + 0x57F7, 0x88CC, 0x57F8, 0xDBFC, 0x57F9, 0xC5E0, 0x57FA, 0xBBF9, + 0x57FB, 0x88CD, 0x57FC, 0x88CE, 0x57FD, 0xDCA3, 0x57FE, 0x88CF, + 0x57FF, 0x88D0, 0x5800, 0xDCA5, 0x5801, 0x88D1, 0x5802, 0xCCC3, + 0x5803, 0x88D2, 0x5804, 0x88D3, 0x5805, 0x88D4, 0x5806, 0xB6D1, + 0x5807, 0xDDC0, 0x5808, 0x88D5, 0x5809, 0x88D6, 0x580A, 0x88D7, + 0x580B, 0xDCA1, 0x580C, 0x88D8, 0x580D, 0xDCA2, 0x580E, 0x88D9, + 0x580F, 0x88DA, 0x5810, 0x88DB, 0x5811, 0xC7B5, 0x5812, 0x88DC, + 0x5813, 0x88DD, 0x5814, 0x88DE, 0x5815, 0xB6E9, 0x5816, 0x88DF, + 0x5817, 0x88E0, 0x5818, 0x88E1, 0x5819, 0xDCA7, 0x581A, 0x88E2, + 0x581B, 0x88E3, 0x581C, 0x88E4, 0x581D, 0x88E5, 0x581E, 0xDCA6, + 0x581F, 0x88E6, 0x5820, 0xDCA9, 0x5821, 0xB1A4, 0x5822, 0x88E7, + 0x5823, 0x88E8, 0x5824, 0xB5CC, 0x5825, 0x88E9, 0x5826, 0x88EA, + 0x5827, 0x88EB, 0x5828, 0x88EC, 0x5829, 0x88ED, 0x582A, 0xBFB0, + 0x582B, 0x88EE, 0x582C, 0x88EF, 0x582D, 0x88F0, 0x582E, 0x88F1, + 0x582F, 0x88F2, 0x5830, 0xD1DF, 0x5831, 0x88F3, 0x5832, 0x88F4, + 0x5833, 0x88F5, 0x5834, 0x88F6, 0x5835, 0xB6C2, 0x5836, 0x88F7, + 0x5837, 0x88F8, 0x5838, 0x88F9, 0x5839, 0x88FA, 0x583A, 0x88FB, + 0x583B, 0x88FC, 0x583C, 0x88FD, 0x583D, 0x88FE, 0x583E, 0x8940, + 0x583F, 0x8941, 0x5840, 0x8942, 0x5841, 0x8943, 0x5842, 0x8944, + 0x5843, 0x8945, 0x5844, 0xDCA8, 0x5845, 0x8946, 0x5846, 0x8947, + 0x5847, 0x8948, 0x5848, 0x8949, 0x5849, 0x894A, 0x584A, 0x894B, + 0x584B, 0x894C, 0x584C, 0xCBFA, 0x584D, 0xEBF3, 0x584E, 0x894D, + 0x584F, 0x894E, 0x5850, 0x894F, 0x5851, 0xCBDC, 0x5852, 0x8950, + 0x5853, 0x8951, 0x5854, 0xCBFE, 0x5855, 0x8952, 0x5856, 0x8953, + 0x5857, 0x8954, 0x5858, 0xCCC1, 0x5859, 0x8955, 0x585A, 0x8956, + 0x585B, 0x8957, 0x585C, 0x8958, 0x585D, 0x8959, 0x585E, 0xC8FB, + 0x585F, 0x895A, 0x5860, 0x895B, 0x5861, 0x895C, 0x5862, 0x895D, + 0x5863, 0x895E, 0x5864, 0x895F, 0x5865, 0xDCAA, 0x5866, 0x8960, + 0x5867, 0x8961, 0x5868, 0x8962, 0x5869, 0x8963, 0x586A, 0x8964, + 0x586B, 0xCCEE, 0x586C, 0xDCAB, 0x586D, 0x8965, 0x586E, 0x8966, + 0x586F, 0x8967, 0x5870, 0x8968, 0x5871, 0x8969, 0x5872, 0x896A, + 0x5873, 0x896B, 0x5874, 0x896C, 0x5875, 0x896D, 0x5876, 0x896E, + 0x5877, 0x896F, 0x5878, 0x8970, 0x5879, 0x8971, 0x587A, 0x8972, + 0x587B, 0x8973, 0x587C, 0x8974, 0x587D, 0x8975, 0x587E, 0xDBD3, + 0x587F, 0x8976, 0x5880, 0xDCAF, 0x5881, 0xDCAC, 0x5882, 0x8977, + 0x5883, 0xBEB3, 0x5884, 0x8978, 0x5885, 0xCAFB, 0x5886, 0x8979, + 0x5887, 0x897A, 0x5888, 0x897B, 0x5889, 0xDCAD, 0x588A, 0x897C, + 0x588B, 0x897D, 0x588C, 0x897E, 0x588D, 0x8980, 0x588E, 0x8981, + 0x588F, 0x8982, 0x5890, 0x8983, 0x5891, 0x8984, 0x5892, 0xC9CA, + 0x5893, 0xC4B9, 0x5894, 0x8985, 0x5895, 0x8986, 0x5896, 0x8987, + 0x5897, 0x8988, 0x5898, 0x8989, 0x5899, 0xC7BD, 0x589A, 0xDCAE, + 0x589B, 0x898A, 0x589C, 0x898B, 0x589D, 0x898C, 0x589E, 0xD4F6, + 0x589F, 0xD0E6, 0x58A0, 0x898D, 0x58A1, 0x898E, 0x58A2, 0x898F, + 0x58A3, 0x8990, 0x58A4, 0x8991, 0x58A5, 0x8992, 0x58A6, 0x8993, + 0x58A7, 0x8994, 0x58A8, 0xC4AB, 0x58A9, 0xB6D5, 0x58AA, 0x8995, + 0x58AB, 0x8996, 0x58AC, 0x8997, 0x58AD, 0x8998, 0x58AE, 0x8999, + 0x58AF, 0x899A, 0x58B0, 0x899B, 0x58B1, 0x899C, 0x58B2, 0x899D, + 0x58B3, 0x899E, 0x58B4, 0x899F, 0x58B5, 0x89A0, 0x58B6, 0x89A1, + 0x58B7, 0x89A2, 0x58B8, 0x89A3, 0x58B9, 0x89A4, 0x58BA, 0x89A5, + 0x58BB, 0x89A6, 0x58BC, 0xDBD4, 0x58BD, 0x89A7, 0x58BE, 0x89A8, + 0x58BF, 0x89A9, 0x58C0, 0x89AA, 0x58C1, 0xB1DA, 0x58C2, 0x89AB, + 0x58C3, 0x89AC, 0x58C4, 0x89AD, 0x58C5, 0xDBD5, 0x58C6, 0x89AE, + 0x58C7, 0x89AF, 0x58C8, 0x89B0, 0x58C9, 0x89B1, 0x58CA, 0x89B2, + 0x58CB, 0x89B3, 0x58CC, 0x89B4, 0x58CD, 0x89B5, 0x58CE, 0x89B6, + 0x58CF, 0x89B7, 0x58D0, 0x89B8, 0x58D1, 0xDBD6, 0x58D2, 0x89B9, + 0x58D3, 0x89BA, 0x58D4, 0x89BB, 0x58D5, 0xBABE, 0x58D6, 0x89BC, + 0x58D7, 0x89BD, 0x58D8, 0x89BE, 0x58D9, 0x89BF, 0x58DA, 0x89C0, + 0x58DB, 0x89C1, 0x58DC, 0x89C2, 0x58DD, 0x89C3, 0x58DE, 0x89C4, + 0x58DF, 0x89C5, 0x58E0, 0x89C6, 0x58E1, 0x89C7, 0x58E2, 0x89C8, + 0x58E3, 0x89C9, 0x58E4, 0xC8C0, 0x58E5, 0x89CA, 0x58E6, 0x89CB, + 0x58E7, 0x89CC, 0x58E8, 0x89CD, 0x58E9, 0x89CE, 0x58EA, 0x89CF, + 0x58EB, 0xCABF, 0x58EC, 0xC8C9, 0x58ED, 0x89D0, 0x58EE, 0xD7B3, + 0x58EF, 0x89D1, 0x58F0, 0xC9F9, 0x58F1, 0x89D2, 0x58F2, 0x89D3, + 0x58F3, 0xBFC7, 0x58F4, 0x89D4, 0x58F5, 0x89D5, 0x58F6, 0xBAF8, + 0x58F7, 0x89D6, 0x58F8, 0x89D7, 0x58F9, 0xD2BC, 0x58FA, 0x89D8, + 0x58FB, 0x89D9, 0x58FC, 0x89DA, 0x58FD, 0x89DB, 0x58FE, 0x89DC, + 0x58FF, 0x89DD, 0x5900, 0x89DE, 0x5901, 0x89DF, 0x5902, 0xE2BA, + 0x5903, 0x89E0, 0x5904, 0xB4A6, 0x5905, 0x89E1, 0x5906, 0x89E2, + 0x5907, 0xB1B8, 0x5908, 0x89E3, 0x5909, 0x89E4, 0x590A, 0x89E5, + 0x590B, 0x89E6, 0x590C, 0x89E7, 0x590D, 0xB8B4, 0x590E, 0x89E8, + 0x590F, 0xCFC4, 0x5910, 0x89E9, 0x5911, 0x89EA, 0x5912, 0x89EB, + 0x5913, 0x89EC, 0x5914, 0xD9E7, 0x5915, 0xCFA6, 0x5916, 0xCDE2, + 0x5917, 0x89ED, 0x5918, 0x89EE, 0x5919, 0xD9ED, 0x591A, 0xB6E0, + 0x591B, 0x89EF, 0x591C, 0xD2B9, 0x591D, 0x89F0, 0x591E, 0x89F1, + 0x591F, 0xB9BB, 0x5920, 0x89F2, 0x5921, 0x89F3, 0x5922, 0x89F4, + 0x5923, 0x89F5, 0x5924, 0xE2B9, 0x5925, 0xE2B7, 0x5926, 0x89F6, + 0x5927, 0xB4F3, 0x5928, 0x89F7, 0x5929, 0xCCEC, 0x592A, 0xCCAB, + 0x592B, 0xB7F2, 0x592C, 0x89F8, 0x592D, 0xD8B2, 0x592E, 0xD1EB, + 0x592F, 0xBABB, 0x5930, 0x89F9, 0x5931, 0xCAA7, 0x5932, 0x89FA, + 0x5933, 0x89FB, 0x5934, 0xCDB7, 0x5935, 0x89FC, 0x5936, 0x89FD, + 0x5937, 0xD2C4, 0x5938, 0xBFE4, 0x5939, 0xBCD0, 0x593A, 0xB6E1, + 0x593B, 0x89FE, 0x593C, 0xDEC5, 0x593D, 0x8A40, 0x593E, 0x8A41, + 0x593F, 0x8A42, 0x5940, 0x8A43, 0x5941, 0xDEC6, 0x5942, 0xDBBC, + 0x5943, 0x8A44, 0x5944, 0xD1D9, 0x5945, 0x8A45, 0x5946, 0x8A46, + 0x5947, 0xC6E6, 0x5948, 0xC4CE, 0x5949, 0xB7EE, 0x594A, 0x8A47, + 0x594B, 0xB7DC, 0x594C, 0x8A48, 0x594D, 0x8A49, 0x594E, 0xBFFC, + 0x594F, 0xD7E0, 0x5950, 0x8A4A, 0x5951, 0xC6F5, 0x5952, 0x8A4B, + 0x5953, 0x8A4C, 0x5954, 0xB1BC, 0x5955, 0xDEC8, 0x5956, 0xBDB1, + 0x5957, 0xCCD7, 0x5958, 0xDECA, 0x5959, 0x8A4D, 0x595A, 0xDEC9, + 0x595B, 0x8A4E, 0x595C, 0x8A4F, 0x595D, 0x8A50, 0x595E, 0x8A51, + 0x595F, 0x8A52, 0x5960, 0xB5EC, 0x5961, 0x8A53, 0x5962, 0xC9DD, + 0x5963, 0x8A54, 0x5964, 0x8A55, 0x5965, 0xB0C2, 0x5966, 0x8A56, + 0x5967, 0x8A57, 0x5968, 0x8A58, 0x5969, 0x8A59, 0x596A, 0x8A5A, + 0x596B, 0x8A5B, 0x596C, 0x8A5C, 0x596D, 0x8A5D, 0x596E, 0x8A5E, + 0x596F, 0x8A5F, 0x5970, 0x8A60, 0x5971, 0x8A61, 0x5972, 0x8A62, + 0x5973, 0xC5AE, 0x5974, 0xC5AB, 0x5975, 0x8A63, 0x5976, 0xC4CC, + 0x5977, 0x8A64, 0x5978, 0xBCE9, 0x5979, 0xCBFD, 0x597A, 0x8A65, + 0x597B, 0x8A66, 0x597C, 0x8A67, 0x597D, 0xBAC3, 0x597E, 0x8A68, + 0x597F, 0x8A69, 0x5980, 0x8A6A, 0x5981, 0xE5F9, 0x5982, 0xC8E7, + 0x5983, 0xE5FA, 0x5984, 0xCDFD, 0x5985, 0x8A6B, 0x5986, 0xD7B1, + 0x5987, 0xB8BE, 0x5988, 0xC2E8, 0x5989, 0x8A6C, 0x598A, 0xC8D1, + 0x598B, 0x8A6D, 0x598C, 0x8A6E, 0x598D, 0xE5FB, 0x598E, 0x8A6F, + 0x598F, 0x8A70, 0x5990, 0x8A71, 0x5991, 0x8A72, 0x5992, 0xB6CA, + 0x5993, 0xBCCB, 0x5994, 0x8A73, 0x5995, 0x8A74, 0x5996, 0xD1FD, + 0x5997, 0xE6A1, 0x5998, 0x8A75, 0x5999, 0xC3EE, 0x599A, 0x8A76, + 0x599B, 0x8A77, 0x599C, 0x8A78, 0x599D, 0x8A79, 0x599E, 0xE6A4, + 0x599F, 0x8A7A, 0x59A0, 0x8A7B, 0x59A1, 0x8A7C, 0x59A2, 0x8A7D, + 0x59A3, 0xE5FE, 0x59A4, 0xE6A5, 0x59A5, 0xCDD7, 0x59A6, 0x8A7E, + 0x59A7, 0x8A80, 0x59A8, 0xB7C1, 0x59A9, 0xE5FC, 0x59AA, 0xE5FD, + 0x59AB, 0xE6A3, 0x59AC, 0x8A81, 0x59AD, 0x8A82, 0x59AE, 0xC4DD, + 0x59AF, 0xE6A8, 0x59B0, 0x8A83, 0x59B1, 0x8A84, 0x59B2, 0xE6A7, + 0x59B3, 0x8A85, 0x59B4, 0x8A86, 0x59B5, 0x8A87, 0x59B6, 0x8A88, + 0x59B7, 0x8A89, 0x59B8, 0x8A8A, 0x59B9, 0xC3C3, 0x59BA, 0x8A8B, + 0x59BB, 0xC6DE, 0x59BC, 0x8A8C, 0x59BD, 0x8A8D, 0x59BE, 0xE6AA, + 0x59BF, 0x8A8E, 0x59C0, 0x8A8F, 0x59C1, 0x8A90, 0x59C2, 0x8A91, + 0x59C3, 0x8A92, 0x59C4, 0x8A93, 0x59C5, 0x8A94, 0x59C6, 0xC4B7, + 0x59C7, 0x8A95, 0x59C8, 0x8A96, 0x59C9, 0x8A97, 0x59CA, 0xE6A2, + 0x59CB, 0xCABC, 0x59CC, 0x8A98, 0x59CD, 0x8A99, 0x59CE, 0x8A9A, + 0x59CF, 0x8A9B, 0x59D0, 0xBDE3, 0x59D1, 0xB9C3, 0x59D2, 0xE6A6, + 0x59D3, 0xD0D5, 0x59D4, 0xCEAF, 0x59D5, 0x8A9C, 0x59D6, 0x8A9D, + 0x59D7, 0xE6A9, 0x59D8, 0xE6B0, 0x59D9, 0x8A9E, 0x59DA, 0xD2A6, + 0x59DB, 0x8A9F, 0x59DC, 0xBDAA, 0x59DD, 0xE6AD, 0x59DE, 0x8AA0, + 0x59DF, 0x8AA1, 0x59E0, 0x8AA2, 0x59E1, 0x8AA3, 0x59E2, 0x8AA4, + 0x59E3, 0xE6AF, 0x59E4, 0x8AA5, 0x59E5, 0xC0D1, 0x59E6, 0x8AA6, + 0x59E7, 0x8AA7, 0x59E8, 0xD2CC, 0x59E9, 0x8AA8, 0x59EA, 0x8AA9, + 0x59EB, 0x8AAA, 0x59EC, 0xBCA7, 0x59ED, 0x8AAB, 0x59EE, 0x8AAC, + 0x59EF, 0x8AAD, 0x59F0, 0x8AAE, 0x59F1, 0x8AAF, 0x59F2, 0x8AB0, + 0x59F3, 0x8AB1, 0x59F4, 0x8AB2, 0x59F5, 0x8AB3, 0x59F6, 0x8AB4, + 0x59F7, 0x8AB5, 0x59F8, 0x8AB6, 0x59F9, 0xE6B1, 0x59FA, 0x8AB7, + 0x59FB, 0xD2F6, 0x59FC, 0x8AB8, 0x59FD, 0x8AB9, 0x59FE, 0x8ABA, + 0x59FF, 0xD7CB, 0x5A00, 0x8ABB, 0x5A01, 0xCDFE, 0x5A02, 0x8ABC, + 0x5A03, 0xCDDE, 0x5A04, 0xC2A6, 0x5A05, 0xE6AB, 0x5A06, 0xE6AC, + 0x5A07, 0xBDBF, 0x5A08, 0xE6AE, 0x5A09, 0xE6B3, 0x5A0A, 0x8ABD, + 0x5A0B, 0x8ABE, 0x5A0C, 0xE6B2, 0x5A0D, 0x8ABF, 0x5A0E, 0x8AC0, + 0x5A0F, 0x8AC1, 0x5A10, 0x8AC2, 0x5A11, 0xE6B6, 0x5A12, 0x8AC3, + 0x5A13, 0xE6B8, 0x5A14, 0x8AC4, 0x5A15, 0x8AC5, 0x5A16, 0x8AC6, + 0x5A17, 0x8AC7, 0x5A18, 0xC4EF, 0x5A19, 0x8AC8, 0x5A1A, 0x8AC9, + 0x5A1B, 0x8ACA, 0x5A1C, 0xC4C8, 0x5A1D, 0x8ACB, 0x5A1E, 0x8ACC, + 0x5A1F, 0xBEEA, 0x5A20, 0xC9EF, 0x5A21, 0x8ACD, 0x5A22, 0x8ACE, + 0x5A23, 0xE6B7, 0x5A24, 0x8ACF, 0x5A25, 0xB6F0, 0x5A26, 0x8AD0, + 0x5A27, 0x8AD1, 0x5A28, 0x8AD2, 0x5A29, 0xC3E4, 0x5A2A, 0x8AD3, + 0x5A2B, 0x8AD4, 0x5A2C, 0x8AD5, 0x5A2D, 0x8AD6, 0x5A2E, 0x8AD7, + 0x5A2F, 0x8AD8, 0x5A30, 0x8AD9, 0x5A31, 0xD3E9, 0x5A32, 0xE6B4, + 0x5A33, 0x8ADA, 0x5A34, 0xE6B5, 0x5A35, 0x8ADB, 0x5A36, 0xC8A2, + 0x5A37, 0x8ADC, 0x5A38, 0x8ADD, 0x5A39, 0x8ADE, 0x5A3A, 0x8ADF, + 0x5A3B, 0x8AE0, 0x5A3C, 0xE6BD, 0x5A3D, 0x8AE1, 0x5A3E, 0x8AE2, + 0x5A3F, 0x8AE3, 0x5A40, 0xE6B9, 0x5A41, 0x8AE4, 0x5A42, 0x8AE5, + 0x5A43, 0x8AE6, 0x5A44, 0x8AE7, 0x5A45, 0x8AE8, 0x5A46, 0xC6C5, + 0x5A47, 0x8AE9, 0x5A48, 0x8AEA, 0x5A49, 0xCDF1, 0x5A4A, 0xE6BB, + 0x5A4B, 0x8AEB, 0x5A4C, 0x8AEC, 0x5A4D, 0x8AED, 0x5A4E, 0x8AEE, + 0x5A4F, 0x8AEF, 0x5A50, 0x8AF0, 0x5A51, 0x8AF1, 0x5A52, 0x8AF2, + 0x5A53, 0x8AF3, 0x5A54, 0x8AF4, 0x5A55, 0xE6BC, 0x5A56, 0x8AF5, + 0x5A57, 0x8AF6, 0x5A58, 0x8AF7, 0x5A59, 0x8AF8, 0x5A5A, 0xBBE9, + 0x5A5B, 0x8AF9, 0x5A5C, 0x8AFA, 0x5A5D, 0x8AFB, 0x5A5E, 0x8AFC, + 0x5A5F, 0x8AFD, 0x5A60, 0x8AFE, 0x5A61, 0x8B40, 0x5A62, 0xE6BE, + 0x5A63, 0x8B41, 0x5A64, 0x8B42, 0x5A65, 0x8B43, 0x5A66, 0x8B44, + 0x5A67, 0xE6BA, 0x5A68, 0x8B45, 0x5A69, 0x8B46, 0x5A6A, 0xC0B7, + 0x5A6B, 0x8B47, 0x5A6C, 0x8B48, 0x5A6D, 0x8B49, 0x5A6E, 0x8B4A, + 0x5A6F, 0x8B4B, 0x5A70, 0x8B4C, 0x5A71, 0x8B4D, 0x5A72, 0x8B4E, + 0x5A73, 0x8B4F, 0x5A74, 0xD3A4, 0x5A75, 0xE6BF, 0x5A76, 0xC9F4, + 0x5A77, 0xE6C3, 0x5A78, 0x8B50, 0x5A79, 0x8B51, 0x5A7A, 0xE6C4, + 0x5A7B, 0x8B52, 0x5A7C, 0x8B53, 0x5A7D, 0x8B54, 0x5A7E, 0x8B55, + 0x5A7F, 0xD0F6, 0x5A80, 0x8B56, 0x5A81, 0x8B57, 0x5A82, 0x8B58, + 0x5A83, 0x8B59, 0x5A84, 0x8B5A, 0x5A85, 0x8B5B, 0x5A86, 0x8B5C, + 0x5A87, 0x8B5D, 0x5A88, 0x8B5E, 0x5A89, 0x8B5F, 0x5A8A, 0x8B60, + 0x5A8B, 0x8B61, 0x5A8C, 0x8B62, 0x5A8D, 0x8B63, 0x5A8E, 0x8B64, + 0x5A8F, 0x8B65, 0x5A90, 0x8B66, 0x5A91, 0x8B67, 0x5A92, 0xC3BD, + 0x5A93, 0x8B68, 0x5A94, 0x8B69, 0x5A95, 0x8B6A, 0x5A96, 0x8B6B, + 0x5A97, 0x8B6C, 0x5A98, 0x8B6D, 0x5A99, 0x8B6E, 0x5A9A, 0xC3C4, + 0x5A9B, 0xE6C2, 0x5A9C, 0x8B6F, 0x5A9D, 0x8B70, 0x5A9E, 0x8B71, + 0x5A9F, 0x8B72, 0x5AA0, 0x8B73, 0x5AA1, 0x8B74, 0x5AA2, 0x8B75, + 0x5AA3, 0x8B76, 0x5AA4, 0x8B77, 0x5AA5, 0x8B78, 0x5AA6, 0x8B79, + 0x5AA7, 0x8B7A, 0x5AA8, 0x8B7B, 0x5AA9, 0x8B7C, 0x5AAA, 0xE6C1, + 0x5AAB, 0x8B7D, 0x5AAC, 0x8B7E, 0x5AAD, 0x8B80, 0x5AAE, 0x8B81, + 0x5AAF, 0x8B82, 0x5AB0, 0x8B83, 0x5AB1, 0x8B84, 0x5AB2, 0xE6C7, + 0x5AB3, 0xCFB1, 0x5AB4, 0x8B85, 0x5AB5, 0xEBF4, 0x5AB6, 0x8B86, + 0x5AB7, 0x8B87, 0x5AB8, 0xE6CA, 0x5AB9, 0x8B88, 0x5ABA, 0x8B89, + 0x5ABB, 0x8B8A, 0x5ABC, 0x8B8B, 0x5ABD, 0x8B8C, 0x5ABE, 0xE6C5, + 0x5ABF, 0x8B8D, 0x5AC0, 0x8B8E, 0x5AC1, 0xBCDE, 0x5AC2, 0xC9A9, + 0x5AC3, 0x8B8F, 0x5AC4, 0x8B90, 0x5AC5, 0x8B91, 0x5AC6, 0x8B92, + 0x5AC7, 0x8B93, 0x5AC8, 0x8B94, 0x5AC9, 0xBCB5, 0x5ACA, 0x8B95, + 0x5ACB, 0x8B96, 0x5ACC, 0xCFD3, 0x5ACD, 0x8B97, 0x5ACE, 0x8B98, + 0x5ACF, 0x8B99, 0x5AD0, 0x8B9A, 0x5AD1, 0x8B9B, 0x5AD2, 0xE6C8, + 0x5AD3, 0x8B9C, 0x5AD4, 0xE6C9, 0x5AD5, 0x8B9D, 0x5AD6, 0xE6CE, + 0x5AD7, 0x8B9E, 0x5AD8, 0xE6D0, 0x5AD9, 0x8B9F, 0x5ADA, 0x8BA0, + 0x5ADB, 0x8BA1, 0x5ADC, 0xE6D1, 0x5ADD, 0x8BA2, 0x5ADE, 0x8BA3, + 0x5ADF, 0x8BA4, 0x5AE0, 0xE6CB, 0x5AE1, 0xB5D5, 0x5AE2, 0x8BA5, + 0x5AE3, 0xE6CC, 0x5AE4, 0x8BA6, 0x5AE5, 0x8BA7, 0x5AE6, 0xE6CF, + 0x5AE7, 0x8BA8, 0x5AE8, 0x8BA9, 0x5AE9, 0xC4DB, 0x5AEA, 0x8BAA, + 0x5AEB, 0xE6C6, 0x5AEC, 0x8BAB, 0x5AED, 0x8BAC, 0x5AEE, 0x8BAD, + 0x5AEF, 0x8BAE, 0x5AF0, 0x8BAF, 0x5AF1, 0xE6CD, 0x5AF2, 0x8BB0, + 0x5AF3, 0x8BB1, 0x5AF4, 0x8BB2, 0x5AF5, 0x8BB3, 0x5AF6, 0x8BB4, + 0x5AF7, 0x8BB5, 0x5AF8, 0x8BB6, 0x5AF9, 0x8BB7, 0x5AFA, 0x8BB8, + 0x5AFB, 0x8BB9, 0x5AFC, 0x8BBA, 0x5AFD, 0x8BBB, 0x5AFE, 0x8BBC, + 0x5AFF, 0x8BBD, 0x5B00, 0x8BBE, 0x5B01, 0x8BBF, 0x5B02, 0x8BC0, + 0x5B03, 0x8BC1, 0x5B04, 0x8BC2, 0x5B05, 0x8BC3, 0x5B06, 0x8BC4, + 0x5B07, 0x8BC5, 0x5B08, 0x8BC6, 0x5B09, 0xE6D2, 0x5B0A, 0x8BC7, + 0x5B0B, 0x8BC8, 0x5B0C, 0x8BC9, 0x5B0D, 0x8BCA, 0x5B0E, 0x8BCB, + 0x5B0F, 0x8BCC, 0x5B10, 0x8BCD, 0x5B11, 0x8BCE, 0x5B12, 0x8BCF, + 0x5B13, 0x8BD0, 0x5B14, 0x8BD1, 0x5B15, 0x8BD2, 0x5B16, 0xE6D4, + 0x5B17, 0xE6D3, 0x5B18, 0x8BD3, 0x5B19, 0x8BD4, 0x5B1A, 0x8BD5, + 0x5B1B, 0x8BD6, 0x5B1C, 0x8BD7, 0x5B1D, 0x8BD8, 0x5B1E, 0x8BD9, + 0x5B1F, 0x8BDA, 0x5B20, 0x8BDB, 0x5B21, 0x8BDC, 0x5B22, 0x8BDD, + 0x5B23, 0x8BDE, 0x5B24, 0x8BDF, 0x5B25, 0x8BE0, 0x5B26, 0x8BE1, + 0x5B27, 0x8BE2, 0x5B28, 0x8BE3, 0x5B29, 0x8BE4, 0x5B2A, 0x8BE5, + 0x5B2B, 0x8BE6, 0x5B2C, 0x8BE7, 0x5B2D, 0x8BE8, 0x5B2E, 0x8BE9, + 0x5B2F, 0x8BEA, 0x5B30, 0x8BEB, 0x5B31, 0x8BEC, 0x5B32, 0xE6D5, + 0x5B33, 0x8BED, 0x5B34, 0xD9F8, 0x5B35, 0x8BEE, 0x5B36, 0x8BEF, + 0x5B37, 0xE6D6, 0x5B38, 0x8BF0, 0x5B39, 0x8BF1, 0x5B3A, 0x8BF2, + 0x5B3B, 0x8BF3, 0x5B3C, 0x8BF4, 0x5B3D, 0x8BF5, 0x5B3E, 0x8BF6, + 0x5B3F, 0x8BF7, 0x5B40, 0xE6D7, 0x5B41, 0x8BF8, 0x5B42, 0x8BF9, + 0x5B43, 0x8BFA, 0x5B44, 0x8BFB, 0x5B45, 0x8BFC, 0x5B46, 0x8BFD, + 0x5B47, 0x8BFE, 0x5B48, 0x8C40, 0x5B49, 0x8C41, 0x5B4A, 0x8C42, + 0x5B4B, 0x8C43, 0x5B4C, 0x8C44, 0x5B4D, 0x8C45, 0x5B4E, 0x8C46, + 0x5B4F, 0x8C47, 0x5B50, 0xD7D3, 0x5B51, 0xE6DD, 0x5B52, 0x8C48, + 0x5B53, 0xE6DE, 0x5B54, 0xBFD7, 0x5B55, 0xD4D0, 0x5B56, 0x8C49, + 0x5B57, 0xD7D6, 0x5B58, 0xB4E6, 0x5B59, 0xCBEF, 0x5B5A, 0xE6DA, + 0x5B5B, 0xD8C3, 0x5B5C, 0xD7CE, 0x5B5D, 0xD0A2, 0x5B5E, 0x8C4A, + 0x5B5F, 0xC3CF, 0x5B60, 0x8C4B, 0x5B61, 0x8C4C, 0x5B62, 0xE6DF, + 0x5B63, 0xBCBE, 0x5B64, 0xB9C2, 0x5B65, 0xE6DB, 0x5B66, 0xD1A7, + 0x5B67, 0x8C4D, 0x5B68, 0x8C4E, 0x5B69, 0xBAA2, 0x5B6A, 0xC2CF, + 0x5B6B, 0x8C4F, 0x5B6C, 0xD8AB, 0x5B6D, 0x8C50, 0x5B6E, 0x8C51, + 0x5B6F, 0x8C52, 0x5B70, 0xCAEB, 0x5B71, 0xE5EE, 0x5B72, 0x8C53, + 0x5B73, 0xE6DC, 0x5B74, 0x8C54, 0x5B75, 0xB7F5, 0x5B76, 0x8C55, + 0x5B77, 0x8C56, 0x5B78, 0x8C57, 0x5B79, 0x8C58, 0x5B7A, 0xC8E6, + 0x5B7B, 0x8C59, 0x5B7C, 0x8C5A, 0x5B7D, 0xC4F5, 0x5B7E, 0x8C5B, + 0x5B7F, 0x8C5C, 0x5B80, 0xE5B2, 0x5B81, 0xC4FE, 0x5B82, 0x8C5D, + 0x5B83, 0xCBFC, 0x5B84, 0xE5B3, 0x5B85, 0xD5AC, 0x5B86, 0x8C5E, + 0x5B87, 0xD3EE, 0x5B88, 0xCAD8, 0x5B89, 0xB0B2, 0x5B8A, 0x8C5F, + 0x5B8B, 0xCBCE, 0x5B8C, 0xCDEA, 0x5B8D, 0x8C60, 0x5B8E, 0x8C61, + 0x5B8F, 0xBAEA, 0x5B90, 0x8C62, 0x5B91, 0x8C63, 0x5B92, 0x8C64, + 0x5B93, 0xE5B5, 0x5B94, 0x8C65, 0x5B95, 0xE5B4, 0x5B96, 0x8C66, + 0x5B97, 0xD7DA, 0x5B98, 0xB9D9, 0x5B99, 0xD6E6, 0x5B9A, 0xB6A8, + 0x5B9B, 0xCDF0, 0x5B9C, 0xD2CB, 0x5B9D, 0xB1A6, 0x5B9E, 0xCAB5, + 0x5B9F, 0x8C67, 0x5BA0, 0xB3E8, 0x5BA1, 0xC9F3, 0x5BA2, 0xBFCD, + 0x5BA3, 0xD0FB, 0x5BA4, 0xCAD2, 0x5BA5, 0xE5B6, 0x5BA6, 0xBBC2, + 0x5BA7, 0x8C68, 0x5BA8, 0x8C69, 0x5BA9, 0x8C6A, 0x5BAA, 0xCFDC, + 0x5BAB, 0xB9AC, 0x5BAC, 0x8C6B, 0x5BAD, 0x8C6C, 0x5BAE, 0x8C6D, + 0x5BAF, 0x8C6E, 0x5BB0, 0xD4D7, 0x5BB1, 0x8C6F, 0x5BB2, 0x8C70, + 0x5BB3, 0xBAA6, 0x5BB4, 0xD1E7, 0x5BB5, 0xCFFC, 0x5BB6, 0xBCD2, + 0x5BB7, 0x8C71, 0x5BB8, 0xE5B7, 0x5BB9, 0xC8DD, 0x5BBA, 0x8C72, + 0x5BBB, 0x8C73, 0x5BBC, 0x8C74, 0x5BBD, 0xBFED, 0x5BBE, 0xB1F6, + 0x5BBF, 0xCBDE, 0x5BC0, 0x8C75, 0x5BC1, 0x8C76, 0x5BC2, 0xBCC5, + 0x5BC3, 0x8C77, 0x5BC4, 0xBCC4, 0x5BC5, 0xD2FA, 0x5BC6, 0xC3DC, + 0x5BC7, 0xBFDC, 0x5BC8, 0x8C78, 0x5BC9, 0x8C79, 0x5BCA, 0x8C7A, + 0x5BCB, 0x8C7B, 0x5BCC, 0xB8BB, 0x5BCD, 0x8C7C, 0x5BCE, 0x8C7D, + 0x5BCF, 0x8C7E, 0x5BD0, 0xC3C2, 0x5BD1, 0x8C80, 0x5BD2, 0xBAAE, + 0x5BD3, 0xD4A2, 0x5BD4, 0x8C81, 0x5BD5, 0x8C82, 0x5BD6, 0x8C83, + 0x5BD7, 0x8C84, 0x5BD8, 0x8C85, 0x5BD9, 0x8C86, 0x5BDA, 0x8C87, + 0x5BDB, 0x8C88, 0x5BDC, 0x8C89, 0x5BDD, 0xC7DE, 0x5BDE, 0xC4AF, + 0x5BDF, 0xB2EC, 0x5BE0, 0x8C8A, 0x5BE1, 0xB9D1, 0x5BE2, 0x8C8B, + 0x5BE3, 0x8C8C, 0x5BE4, 0xE5BB, 0x5BE5, 0xC1C8, 0x5BE6, 0x8C8D, + 0x5BE7, 0x8C8E, 0x5BE8, 0xD5AF, 0x5BE9, 0x8C8F, 0x5BEA, 0x8C90, + 0x5BEB, 0x8C91, 0x5BEC, 0x8C92, 0x5BED, 0x8C93, 0x5BEE, 0xE5BC, + 0x5BEF, 0x8C94, 0x5BF0, 0xE5BE, 0x5BF1, 0x8C95, 0x5BF2, 0x8C96, + 0x5BF3, 0x8C97, 0x5BF4, 0x8C98, 0x5BF5, 0x8C99, 0x5BF6, 0x8C9A, + 0x5BF7, 0x8C9B, 0x5BF8, 0xB4E7, 0x5BF9, 0xB6D4, 0x5BFA, 0xCBC2, + 0x5BFB, 0xD1B0, 0x5BFC, 0xB5BC, 0x5BFD, 0x8C9C, 0x5BFE, 0x8C9D, + 0x5BFF, 0xCAD9, 0x5C00, 0x8C9E, 0x5C01, 0xB7E2, 0x5C02, 0x8C9F, + 0x5C03, 0x8CA0, 0x5C04, 0xC9E4, 0x5C05, 0x8CA1, 0x5C06, 0xBDAB, + 0x5C07, 0x8CA2, 0x5C08, 0x8CA3, 0x5C09, 0xCEBE, 0x5C0A, 0xD7F0, + 0x5C0B, 0x8CA4, 0x5C0C, 0x8CA5, 0x5C0D, 0x8CA6, 0x5C0E, 0x8CA7, + 0x5C0F, 0xD0A1, 0x5C10, 0x8CA8, 0x5C11, 0xC9D9, 0x5C12, 0x8CA9, + 0x5C13, 0x8CAA, 0x5C14, 0xB6FB, 0x5C15, 0xE6D8, 0x5C16, 0xBCE2, + 0x5C17, 0x8CAB, 0x5C18, 0xB3BE, 0x5C19, 0x8CAC, 0x5C1A, 0xC9D0, + 0x5C1B, 0x8CAD, 0x5C1C, 0xE6D9, 0x5C1D, 0xB3A2, 0x5C1E, 0x8CAE, + 0x5C1F, 0x8CAF, 0x5C20, 0x8CB0, 0x5C21, 0x8CB1, 0x5C22, 0xDECC, + 0x5C23, 0x8CB2, 0x5C24, 0xD3C8, 0x5C25, 0xDECD, 0x5C26, 0x8CB3, + 0x5C27, 0xD2A2, 0x5C28, 0x8CB4, 0x5C29, 0x8CB5, 0x5C2A, 0x8CB6, + 0x5C2B, 0x8CB7, 0x5C2C, 0xDECE, 0x5C2D, 0x8CB8, 0x5C2E, 0x8CB9, + 0x5C2F, 0x8CBA, 0x5C30, 0x8CBB, 0x5C31, 0xBECD, 0x5C32, 0x8CBC, + 0x5C33, 0x8CBD, 0x5C34, 0xDECF, 0x5C35, 0x8CBE, 0x5C36, 0x8CBF, + 0x5C37, 0x8CC0, 0x5C38, 0xCAAC, 0x5C39, 0xD2FC, 0x5C3A, 0xB3DF, + 0x5C3B, 0xE5EA, 0x5C3C, 0xC4E1, 0x5C3D, 0xBEA1, 0x5C3E, 0xCEB2, + 0x5C3F, 0xC4F2, 0x5C40, 0xBED6, 0x5C41, 0xC6A8, 0x5C42, 0xB2E3, + 0x5C43, 0x8CC1, 0x5C44, 0x8CC2, 0x5C45, 0xBED3, 0x5C46, 0x8CC3, + 0x5C47, 0x8CC4, 0x5C48, 0xC7FC, 0x5C49, 0xCCEB, 0x5C4A, 0xBDEC, + 0x5C4B, 0xCEDD, 0x5C4C, 0x8CC5, 0x5C4D, 0x8CC6, 0x5C4E, 0xCABA, + 0x5C4F, 0xC6C1, 0x5C50, 0xE5EC, 0x5C51, 0xD0BC, 0x5C52, 0x8CC7, + 0x5C53, 0x8CC8, 0x5C54, 0x8CC9, 0x5C55, 0xD5B9, 0x5C56, 0x8CCA, + 0x5C57, 0x8CCB, 0x5C58, 0x8CCC, 0x5C59, 0xE5ED, 0x5C5A, 0x8CCD, + 0x5C5B, 0x8CCE, 0x5C5C, 0x8CCF, 0x5C5D, 0x8CD0, 0x5C5E, 0xCAF4, + 0x5C5F, 0x8CD1, 0x5C60, 0xCDC0, 0x5C61, 0xC2C5, 0x5C62, 0x8CD2, + 0x5C63, 0xE5EF, 0x5C64, 0x8CD3, 0x5C65, 0xC2C4, 0x5C66, 0xE5F0, + 0x5C67, 0x8CD4, 0x5C68, 0x8CD5, 0x5C69, 0x8CD6, 0x5C6A, 0x8CD7, + 0x5C6B, 0x8CD8, 0x5C6C, 0x8CD9, 0x5C6D, 0x8CDA, 0x5C6E, 0xE5F8, + 0x5C6F, 0xCDCD, 0x5C70, 0x8CDB, 0x5C71, 0xC9BD, 0x5C72, 0x8CDC, + 0x5C73, 0x8CDD, 0x5C74, 0x8CDE, 0x5C75, 0x8CDF, 0x5C76, 0x8CE0, + 0x5C77, 0x8CE1, 0x5C78, 0x8CE2, 0x5C79, 0xD2D9, 0x5C7A, 0xE1A8, + 0x5C7B, 0x8CE3, 0x5C7C, 0x8CE4, 0x5C7D, 0x8CE5, 0x5C7E, 0x8CE6, + 0x5C7F, 0xD3EC, 0x5C80, 0x8CE7, 0x5C81, 0xCBEA, 0x5C82, 0xC6F1, + 0x5C83, 0x8CE8, 0x5C84, 0x8CE9, 0x5C85, 0x8CEA, 0x5C86, 0x8CEB, + 0x5C87, 0x8CEC, 0x5C88, 0xE1AC, 0x5C89, 0x8CED, 0x5C8A, 0x8CEE, + 0x5C8B, 0x8CEF, 0x5C8C, 0xE1A7, 0x5C8D, 0xE1A9, 0x5C8E, 0x8CF0, + 0x5C8F, 0x8CF1, 0x5C90, 0xE1AA, 0x5C91, 0xE1AF, 0x5C92, 0x8CF2, + 0x5C93, 0x8CF3, 0x5C94, 0xB2ED, 0x5C95, 0x8CF4, 0x5C96, 0xE1AB, + 0x5C97, 0xB8DA, 0x5C98, 0xE1AD, 0x5C99, 0xE1AE, 0x5C9A, 0xE1B0, + 0x5C9B, 0xB5BA, 0x5C9C, 0xE1B1, 0x5C9D, 0x8CF5, 0x5C9E, 0x8CF6, + 0x5C9F, 0x8CF7, 0x5CA0, 0x8CF8, 0x5CA1, 0x8CF9, 0x5CA2, 0xE1B3, + 0x5CA3, 0xE1B8, 0x5CA4, 0x8CFA, 0x5CA5, 0x8CFB, 0x5CA6, 0x8CFC, + 0x5CA7, 0x8CFD, 0x5CA8, 0x8CFE, 0x5CA9, 0xD1D2, 0x5CAA, 0x8D40, + 0x5CAB, 0xE1B6, 0x5CAC, 0xE1B5, 0x5CAD, 0xC1EB, 0x5CAE, 0x8D41, + 0x5CAF, 0x8D42, 0x5CB0, 0x8D43, 0x5CB1, 0xE1B7, 0x5CB2, 0x8D44, + 0x5CB3, 0xD4C0, 0x5CB4, 0x8D45, 0x5CB5, 0xE1B2, 0x5CB6, 0x8D46, + 0x5CB7, 0xE1BA, 0x5CB8, 0xB0B6, 0x5CB9, 0x8D47, 0x5CBA, 0x8D48, + 0x5CBB, 0x8D49, 0x5CBC, 0x8D4A, 0x5CBD, 0xE1B4, 0x5CBE, 0x8D4B, + 0x5CBF, 0xBFF9, 0x5CC0, 0x8D4C, 0x5CC1, 0xE1B9, 0x5CC2, 0x8D4D, + 0x5CC3, 0x8D4E, 0x5CC4, 0xE1BB, 0x5CC5, 0x8D4F, 0x5CC6, 0x8D50, + 0x5CC7, 0x8D51, 0x5CC8, 0x8D52, 0x5CC9, 0x8D53, 0x5CCA, 0x8D54, + 0x5CCB, 0xE1BE, 0x5CCC, 0x8D55, 0x5CCD, 0x8D56, 0x5CCE, 0x8D57, + 0x5CCF, 0x8D58, 0x5CD0, 0x8D59, 0x5CD1, 0x8D5A, 0x5CD2, 0xE1BC, + 0x5CD3, 0x8D5B, 0x5CD4, 0x8D5C, 0x5CD5, 0x8D5D, 0x5CD6, 0x8D5E, + 0x5CD7, 0x8D5F, 0x5CD8, 0x8D60, 0x5CD9, 0xD6C5, 0x5CDA, 0x8D61, + 0x5CDB, 0x8D62, 0x5CDC, 0x8D63, 0x5CDD, 0x8D64, 0x5CDE, 0x8D65, + 0x5CDF, 0x8D66, 0x5CE0, 0x8D67, 0x5CE1, 0xCFBF, 0x5CE2, 0x8D68, + 0x5CE3, 0x8D69, 0x5CE4, 0xE1BD, 0x5CE5, 0xE1BF, 0x5CE6, 0xC2CD, + 0x5CE7, 0x8D6A, 0x5CE8, 0xB6EB, 0x5CE9, 0x8D6B, 0x5CEA, 0xD3F8, + 0x5CEB, 0x8D6C, 0x5CEC, 0x8D6D, 0x5CED, 0xC7CD, 0x5CEE, 0x8D6E, + 0x5CEF, 0x8D6F, 0x5CF0, 0xB7E5, 0x5CF1, 0x8D70, 0x5CF2, 0x8D71, + 0x5CF3, 0x8D72, 0x5CF4, 0x8D73, 0x5CF5, 0x8D74, 0x5CF6, 0x8D75, + 0x5CF7, 0x8D76, 0x5CF8, 0x8D77, 0x5CF9, 0x8D78, 0x5CFA, 0x8D79, + 0x5CFB, 0xBEFE, 0x5CFC, 0x8D7A, 0x5CFD, 0x8D7B, 0x5CFE, 0x8D7C, + 0x5CFF, 0x8D7D, 0x5D00, 0x8D7E, 0x5D01, 0x8D80, 0x5D02, 0xE1C0, + 0x5D03, 0xE1C1, 0x5D04, 0x8D81, 0x5D05, 0x8D82, 0x5D06, 0xE1C7, + 0x5D07, 0xB3E7, 0x5D08, 0x8D83, 0x5D09, 0x8D84, 0x5D0A, 0x8D85, + 0x5D0B, 0x8D86, 0x5D0C, 0x8D87, 0x5D0D, 0x8D88, 0x5D0E, 0xC6E9, + 0x5D0F, 0x8D89, 0x5D10, 0x8D8A, 0x5D11, 0x8D8B, 0x5D12, 0x8D8C, + 0x5D13, 0x8D8D, 0x5D14, 0xB4DE, 0x5D15, 0x8D8E, 0x5D16, 0xD1C2, + 0x5D17, 0x8D8F, 0x5D18, 0x8D90, 0x5D19, 0x8D91, 0x5D1A, 0x8D92, + 0x5D1B, 0xE1C8, 0x5D1C, 0x8D93, 0x5D1D, 0x8D94, 0x5D1E, 0xE1C6, + 0x5D1F, 0x8D95, 0x5D20, 0x8D96, 0x5D21, 0x8D97, 0x5D22, 0x8D98, + 0x5D23, 0x8D99, 0x5D24, 0xE1C5, 0x5D25, 0x8D9A, 0x5D26, 0xE1C3, + 0x5D27, 0xE1C2, 0x5D28, 0x8D9B, 0x5D29, 0xB1C0, 0x5D2A, 0x8D9C, + 0x5D2B, 0x8D9D, 0x5D2C, 0x8D9E, 0x5D2D, 0xD5B8, 0x5D2E, 0xE1C4, + 0x5D2F, 0x8D9F, 0x5D30, 0x8DA0, 0x5D31, 0x8DA1, 0x5D32, 0x8DA2, + 0x5D33, 0x8DA3, 0x5D34, 0xE1CB, 0x5D35, 0x8DA4, 0x5D36, 0x8DA5, + 0x5D37, 0x8DA6, 0x5D38, 0x8DA7, 0x5D39, 0x8DA8, 0x5D3A, 0x8DA9, + 0x5D3B, 0x8DAA, 0x5D3C, 0x8DAB, 0x5D3D, 0xE1CC, 0x5D3E, 0xE1CA, + 0x5D3F, 0x8DAC, 0x5D40, 0x8DAD, 0x5D41, 0x8DAE, 0x5D42, 0x8DAF, + 0x5D43, 0x8DB0, 0x5D44, 0x8DB1, 0x5D45, 0x8DB2, 0x5D46, 0x8DB3, + 0x5D47, 0xEFFA, 0x5D48, 0x8DB4, 0x5D49, 0x8DB5, 0x5D4A, 0xE1D3, + 0x5D4B, 0xE1D2, 0x5D4C, 0xC7B6, 0x5D4D, 0x8DB6, 0x5D4E, 0x8DB7, + 0x5D4F, 0x8DB8, 0x5D50, 0x8DB9, 0x5D51, 0x8DBA, 0x5D52, 0x8DBB, + 0x5D53, 0x8DBC, 0x5D54, 0x8DBD, 0x5D55, 0x8DBE, 0x5D56, 0x8DBF, + 0x5D57, 0x8DC0, 0x5D58, 0xE1C9, 0x5D59, 0x8DC1, 0x5D5A, 0x8DC2, + 0x5D5B, 0xE1CE, 0x5D5C, 0x8DC3, 0x5D5D, 0xE1D0, 0x5D5E, 0x8DC4, + 0x5D5F, 0x8DC5, 0x5D60, 0x8DC6, 0x5D61, 0x8DC7, 0x5D62, 0x8DC8, + 0x5D63, 0x8DC9, 0x5D64, 0x8DCA, 0x5D65, 0x8DCB, 0x5D66, 0x8DCC, + 0x5D67, 0x8DCD, 0x5D68, 0x8DCE, 0x5D69, 0xE1D4, 0x5D6A, 0x8DCF, + 0x5D6B, 0xE1D1, 0x5D6C, 0xE1CD, 0x5D6D, 0x8DD0, 0x5D6E, 0x8DD1, + 0x5D6F, 0xE1CF, 0x5D70, 0x8DD2, 0x5D71, 0x8DD3, 0x5D72, 0x8DD4, + 0x5D73, 0x8DD5, 0x5D74, 0xE1D5, 0x5D75, 0x8DD6, 0x5D76, 0x8DD7, + 0x5D77, 0x8DD8, 0x5D78, 0x8DD9, 0x5D79, 0x8DDA, 0x5D7A, 0x8DDB, + 0x5D7B, 0x8DDC, 0x5D7C, 0x8DDD, 0x5D7D, 0x8DDE, 0x5D7E, 0x8DDF, + 0x5D7F, 0x8DE0, 0x5D80, 0x8DE1, 0x5D81, 0x8DE2, 0x5D82, 0xE1D6, + 0x5D83, 0x8DE3, 0x5D84, 0x8DE4, 0x5D85, 0x8DE5, 0x5D86, 0x8DE6, + 0x5D87, 0x8DE7, 0x5D88, 0x8DE8, 0x5D89, 0x8DE9, 0x5D8A, 0x8DEA, + 0x5D8B, 0x8DEB, 0x5D8C, 0x8DEC, 0x5D8D, 0x8DED, 0x5D8E, 0x8DEE, + 0x5D8F, 0x8DEF, 0x5D90, 0x8DF0, 0x5D91, 0x8DF1, 0x5D92, 0x8DF2, + 0x5D93, 0x8DF3, 0x5D94, 0x8DF4, 0x5D95, 0x8DF5, 0x5D96, 0x8DF6, + 0x5D97, 0x8DF7, 0x5D98, 0x8DF8, 0x5D99, 0xE1D7, 0x5D9A, 0x8DF9, + 0x5D9B, 0x8DFA, 0x5D9C, 0x8DFB, 0x5D9D, 0xE1D8, 0x5D9E, 0x8DFC, + 0x5D9F, 0x8DFD, 0x5DA0, 0x8DFE, 0x5DA1, 0x8E40, 0x5DA2, 0x8E41, + 0x5DA3, 0x8E42, 0x5DA4, 0x8E43, 0x5DA5, 0x8E44, 0x5DA6, 0x8E45, + 0x5DA7, 0x8E46, 0x5DA8, 0x8E47, 0x5DA9, 0x8E48, 0x5DAA, 0x8E49, + 0x5DAB, 0x8E4A, 0x5DAC, 0x8E4B, 0x5DAD, 0x8E4C, 0x5DAE, 0x8E4D, + 0x5DAF, 0x8E4E, 0x5DB0, 0x8E4F, 0x5DB1, 0x8E50, 0x5DB2, 0x8E51, + 0x5DB3, 0x8E52, 0x5DB4, 0x8E53, 0x5DB5, 0x8E54, 0x5DB6, 0x8E55, + 0x5DB7, 0xE1DA, 0x5DB8, 0x8E56, 0x5DB9, 0x8E57, 0x5DBA, 0x8E58, + 0x5DBB, 0x8E59, 0x5DBC, 0x8E5A, 0x5DBD, 0x8E5B, 0x5DBE, 0x8E5C, + 0x5DBF, 0x8E5D, 0x5DC0, 0x8E5E, 0x5DC1, 0x8E5F, 0x5DC2, 0x8E60, + 0x5DC3, 0x8E61, 0x5DC4, 0x8E62, 0x5DC5, 0xE1DB, 0x5DC6, 0x8E63, + 0x5DC7, 0x8E64, 0x5DC8, 0x8E65, 0x5DC9, 0x8E66, 0x5DCA, 0x8E67, + 0x5DCB, 0x8E68, 0x5DCC, 0x8E69, 0x5DCD, 0xCEA1, 0x5DCE, 0x8E6A, + 0x5DCF, 0x8E6B, 0x5DD0, 0x8E6C, 0x5DD1, 0x8E6D, 0x5DD2, 0x8E6E, + 0x5DD3, 0x8E6F, 0x5DD4, 0x8E70, 0x5DD5, 0x8E71, 0x5DD6, 0x8E72, + 0x5DD7, 0x8E73, 0x5DD8, 0x8E74, 0x5DD9, 0x8E75, 0x5DDA, 0x8E76, + 0x5DDB, 0xE7DD, 0x5DDC, 0x8E77, 0x5DDD, 0xB4A8, 0x5DDE, 0xD6DD, + 0x5DDF, 0x8E78, 0x5DE0, 0x8E79, 0x5DE1, 0xD1B2, 0x5DE2, 0xB3B2, + 0x5DE3, 0x8E7A, 0x5DE4, 0x8E7B, 0x5DE5, 0xB9A4, 0x5DE6, 0xD7F3, + 0x5DE7, 0xC7C9, 0x5DE8, 0xBEDE, 0x5DE9, 0xB9AE, 0x5DEA, 0x8E7C, + 0x5DEB, 0xCED7, 0x5DEC, 0x8E7D, 0x5DED, 0x8E7E, 0x5DEE, 0xB2EE, + 0x5DEF, 0xDBCF, 0x5DF0, 0x8E80, 0x5DF1, 0xBCBA, 0x5DF2, 0xD2D1, + 0x5DF3, 0xCBC8, 0x5DF4, 0xB0CD, 0x5DF5, 0x8E81, 0x5DF6, 0x8E82, + 0x5DF7, 0xCFEF, 0x5DF8, 0x8E83, 0x5DF9, 0x8E84, 0x5DFA, 0x8E85, + 0x5DFB, 0x8E86, 0x5DFC, 0x8E87, 0x5DFD, 0xD9E3, 0x5DFE, 0xBDED, + 0x5DFF, 0x8E88, 0x5E00, 0x8E89, 0x5E01, 0xB1D2, 0x5E02, 0xCAD0, + 0x5E03, 0xB2BC, 0x5E04, 0x8E8A, 0x5E05, 0xCBA7, 0x5E06, 0xB7AB, + 0x5E07, 0x8E8B, 0x5E08, 0xCAA6, 0x5E09, 0x8E8C, 0x5E0A, 0x8E8D, + 0x5E0B, 0x8E8E, 0x5E0C, 0xCFA3, 0x5E0D, 0x8E8F, 0x5E0E, 0x8E90, + 0x5E0F, 0xE0F8, 0x5E10, 0xD5CA, 0x5E11, 0xE0FB, 0x5E12, 0x8E91, + 0x5E13, 0x8E92, 0x5E14, 0xE0FA, 0x5E15, 0xC5C1, 0x5E16, 0xCCFB, + 0x5E17, 0x8E93, 0x5E18, 0xC1B1, 0x5E19, 0xE0F9, 0x5E1A, 0xD6E3, + 0x5E1B, 0xB2AF, 0x5E1C, 0xD6C4, 0x5E1D, 0xB5DB, 0x5E1E, 0x8E94, + 0x5E1F, 0x8E95, 0x5E20, 0x8E96, 0x5E21, 0x8E97, 0x5E22, 0x8E98, + 0x5E23, 0x8E99, 0x5E24, 0x8E9A, 0x5E25, 0x8E9B, 0x5E26, 0xB4F8, + 0x5E27, 0xD6A1, 0x5E28, 0x8E9C, 0x5E29, 0x8E9D, 0x5E2A, 0x8E9E, + 0x5E2B, 0x8E9F, 0x5E2C, 0x8EA0, 0x5E2D, 0xCFAF, 0x5E2E, 0xB0EF, + 0x5E2F, 0x8EA1, 0x5E30, 0x8EA2, 0x5E31, 0xE0FC, 0x5E32, 0x8EA3, + 0x5E33, 0x8EA4, 0x5E34, 0x8EA5, 0x5E35, 0x8EA6, 0x5E36, 0x8EA7, + 0x5E37, 0xE1A1, 0x5E38, 0xB3A3, 0x5E39, 0x8EA8, 0x5E3A, 0x8EA9, + 0x5E3B, 0xE0FD, 0x5E3C, 0xE0FE, 0x5E3D, 0xC3B1, 0x5E3E, 0x8EAA, + 0x5E3F, 0x8EAB, 0x5E40, 0x8EAC, 0x5E41, 0x8EAD, 0x5E42, 0xC3DD, + 0x5E43, 0x8EAE, 0x5E44, 0xE1A2, 0x5E45, 0xB7F9, 0x5E46, 0x8EAF, + 0x5E47, 0x8EB0, 0x5E48, 0x8EB1, 0x5E49, 0x8EB2, 0x5E4A, 0x8EB3, + 0x5E4B, 0x8EB4, 0x5E4C, 0xBBCF, 0x5E4D, 0x8EB5, 0x5E4E, 0x8EB6, + 0x5E4F, 0x8EB7, 0x5E50, 0x8EB8, 0x5E51, 0x8EB9, 0x5E52, 0x8EBA, + 0x5E53, 0x8EBB, 0x5E54, 0xE1A3, 0x5E55, 0xC4BB, 0x5E56, 0x8EBC, + 0x5E57, 0x8EBD, 0x5E58, 0x8EBE, 0x5E59, 0x8EBF, 0x5E5A, 0x8EC0, + 0x5E5B, 0xE1A4, 0x5E5C, 0x8EC1, 0x5E5D, 0x8EC2, 0x5E5E, 0xE1A5, + 0x5E5F, 0x8EC3, 0x5E60, 0x8EC4, 0x5E61, 0xE1A6, 0x5E62, 0xB4B1, + 0x5E63, 0x8EC5, 0x5E64, 0x8EC6, 0x5E65, 0x8EC7, 0x5E66, 0x8EC8, + 0x5E67, 0x8EC9, 0x5E68, 0x8ECA, 0x5E69, 0x8ECB, 0x5E6A, 0x8ECC, + 0x5E6B, 0x8ECD, 0x5E6C, 0x8ECE, 0x5E6D, 0x8ECF, 0x5E6E, 0x8ED0, + 0x5E6F, 0x8ED1, 0x5E70, 0x8ED2, 0x5E71, 0x8ED3, 0x5E72, 0xB8C9, + 0x5E73, 0xC6BD, 0x5E74, 0xC4EA, 0x5E75, 0x8ED4, 0x5E76, 0xB2A2, + 0x5E77, 0x8ED5, 0x5E78, 0xD0D2, 0x5E79, 0x8ED6, 0x5E7A, 0xE7DB, + 0x5E7B, 0xBBC3, 0x5E7C, 0xD3D7, 0x5E7D, 0xD3C4, 0x5E7E, 0x8ED7, + 0x5E7F, 0xB9E3, 0x5E80, 0xE2CF, 0x5E81, 0x8ED8, 0x5E82, 0x8ED9, + 0x5E83, 0x8EDA, 0x5E84, 0xD7AF, 0x5E85, 0x8EDB, 0x5E86, 0xC7EC, + 0x5E87, 0xB1D3, 0x5E88, 0x8EDC, 0x5E89, 0x8EDD, 0x5E8A, 0xB4B2, + 0x5E8B, 0xE2D1, 0x5E8C, 0x8EDE, 0x5E8D, 0x8EDF, 0x5E8E, 0x8EE0, + 0x5E8F, 0xD0F2, 0x5E90, 0xC2AE, 0x5E91, 0xE2D0, 0x5E92, 0x8EE1, + 0x5E93, 0xBFE2, 0x5E94, 0xD3A6, 0x5E95, 0xB5D7, 0x5E96, 0xE2D2, + 0x5E97, 0xB5EA, 0x5E98, 0x8EE2, 0x5E99, 0xC3ED, 0x5E9A, 0xB8FD, + 0x5E9B, 0x8EE3, 0x5E9C, 0xB8AE, 0x5E9D, 0x8EE4, 0x5E9E, 0xC5D3, + 0x5E9F, 0xB7CF, 0x5EA0, 0xE2D4, 0x5EA1, 0x8EE5, 0x5EA2, 0x8EE6, + 0x5EA3, 0x8EE7, 0x5EA4, 0x8EE8, 0x5EA5, 0xE2D3, 0x5EA6, 0xB6C8, + 0x5EA7, 0xD7F9, 0x5EA8, 0x8EE9, 0x5EA9, 0x8EEA, 0x5EAA, 0x8EEB, + 0x5EAB, 0x8EEC, 0x5EAC, 0x8EED, 0x5EAD, 0xCDA5, 0x5EAE, 0x8EEE, + 0x5EAF, 0x8EEF, 0x5EB0, 0x8EF0, 0x5EB1, 0x8EF1, 0x5EB2, 0x8EF2, + 0x5EB3, 0xE2D8, 0x5EB4, 0x8EF3, 0x5EB5, 0xE2D6, 0x5EB6, 0xCAFC, + 0x5EB7, 0xBFB5, 0x5EB8, 0xD3B9, 0x5EB9, 0xE2D5, 0x5EBA, 0x8EF4, + 0x5EBB, 0x8EF5, 0x5EBC, 0x8EF6, 0x5EBD, 0x8EF7, 0x5EBE, 0xE2D7, + 0x5EBF, 0x8EF8, 0x5EC0, 0x8EF9, 0x5EC1, 0x8EFA, 0x5EC2, 0x8EFB, + 0x5EC3, 0x8EFC, 0x5EC4, 0x8EFD, 0x5EC5, 0x8EFE, 0x5EC6, 0x8F40, + 0x5EC7, 0x8F41, 0x5EC8, 0x8F42, 0x5EC9, 0xC1AE, 0x5ECA, 0xC0C8, + 0x5ECB, 0x8F43, 0x5ECC, 0x8F44, 0x5ECD, 0x8F45, 0x5ECE, 0x8F46, + 0x5ECF, 0x8F47, 0x5ED0, 0x8F48, 0x5ED1, 0xE2DB, 0x5ED2, 0xE2DA, + 0x5ED3, 0xC0AA, 0x5ED4, 0x8F49, 0x5ED5, 0x8F4A, 0x5ED6, 0xC1CE, + 0x5ED7, 0x8F4B, 0x5ED8, 0x8F4C, 0x5ED9, 0x8F4D, 0x5EDA, 0x8F4E, + 0x5EDB, 0xE2DC, 0x5EDC, 0x8F4F, 0x5EDD, 0x8F50, 0x5EDE, 0x8F51, + 0x5EDF, 0x8F52, 0x5EE0, 0x8F53, 0x5EE1, 0x8F54, 0x5EE2, 0x8F55, + 0x5EE3, 0x8F56, 0x5EE4, 0x8F57, 0x5EE5, 0x8F58, 0x5EE6, 0x8F59, + 0x5EE7, 0x8F5A, 0x5EE8, 0xE2DD, 0x5EE9, 0x8F5B, 0x5EEA, 0xE2DE, + 0x5EEB, 0x8F5C, 0x5EEC, 0x8F5D, 0x5EED, 0x8F5E, 0x5EEE, 0x8F5F, + 0x5EEF, 0x8F60, 0x5EF0, 0x8F61, 0x5EF1, 0x8F62, 0x5EF2, 0x8F63, + 0x5EF3, 0x8F64, 0x5EF4, 0xDBC8, 0x5EF5, 0x8F65, 0x5EF6, 0xD1D3, + 0x5EF7, 0xCDA2, 0x5EF8, 0x8F66, 0x5EF9, 0x8F67, 0x5EFA, 0xBDA8, + 0x5EFB, 0x8F68, 0x5EFC, 0x8F69, 0x5EFD, 0x8F6A, 0x5EFE, 0xDEC3, + 0x5EFF, 0xD8A5, 0x5F00, 0xBFAA, 0x5F01, 0xDBCD, 0x5F02, 0xD2EC, + 0x5F03, 0xC6FA, 0x5F04, 0xC5AA, 0x5F05, 0x8F6B, 0x5F06, 0x8F6C, + 0x5F07, 0x8F6D, 0x5F08, 0xDEC4, 0x5F09, 0x8F6E, 0x5F0A, 0xB1D7, + 0x5F0B, 0xDFAE, 0x5F0C, 0x8F6F, 0x5F0D, 0x8F70, 0x5F0E, 0x8F71, + 0x5F0F, 0xCABD, 0x5F10, 0x8F72, 0x5F11, 0xDFB1, 0x5F12, 0x8F73, + 0x5F13, 0xB9AD, 0x5F14, 0x8F74, 0x5F15, 0xD2FD, 0x5F16, 0x8F75, + 0x5F17, 0xB8A5, 0x5F18, 0xBAEB, 0x5F19, 0x8F76, 0x5F1A, 0x8F77, + 0x5F1B, 0xB3DA, 0x5F1C, 0x8F78, 0x5F1D, 0x8F79, 0x5F1E, 0x8F7A, + 0x5F1F, 0xB5DC, 0x5F20, 0xD5C5, 0x5F21, 0x8F7B, 0x5F22, 0x8F7C, + 0x5F23, 0x8F7D, 0x5F24, 0x8F7E, 0x5F25, 0xC3D6, 0x5F26, 0xCFD2, + 0x5F27, 0xBBA1, 0x5F28, 0x8F80, 0x5F29, 0xE5F3, 0x5F2A, 0xE5F2, + 0x5F2B, 0x8F81, 0x5F2C, 0x8F82, 0x5F2D, 0xE5F4, 0x5F2E, 0x8F83, + 0x5F2F, 0xCDE4, 0x5F30, 0x8F84, 0x5F31, 0xC8F5, 0x5F32, 0x8F85, + 0x5F33, 0x8F86, 0x5F34, 0x8F87, 0x5F35, 0x8F88, 0x5F36, 0x8F89, + 0x5F37, 0x8F8A, 0x5F38, 0x8F8B, 0x5F39, 0xB5AF, 0x5F3A, 0xC7BF, + 0x5F3B, 0x8F8C, 0x5F3C, 0xE5F6, 0x5F3D, 0x8F8D, 0x5F3E, 0x8F8E, + 0x5F3F, 0x8F8F, 0x5F40, 0xECB0, 0x5F41, 0x8F90, 0x5F42, 0x8F91, + 0x5F43, 0x8F92, 0x5F44, 0x8F93, 0x5F45, 0x8F94, 0x5F46, 0x8F95, + 0x5F47, 0x8F96, 0x5F48, 0x8F97, 0x5F49, 0x8F98, 0x5F4A, 0x8F99, + 0x5F4B, 0x8F9A, 0x5F4C, 0x8F9B, 0x5F4D, 0x8F9C, 0x5F4E, 0x8F9D, + 0x5F4F, 0x8F9E, 0x5F50, 0xE5E6, 0x5F51, 0x8F9F, 0x5F52, 0xB9E9, + 0x5F53, 0xB5B1, 0x5F54, 0x8FA0, 0x5F55, 0xC2BC, 0x5F56, 0xE5E8, + 0x5F57, 0xE5E7, 0x5F58, 0xE5E9, 0x5F59, 0x8FA1, 0x5F5A, 0x8FA2, + 0x5F5B, 0x8FA3, 0x5F5C, 0x8FA4, 0x5F5D, 0xD2CD, 0x5F5E, 0x8FA5, + 0x5F5F, 0x8FA6, 0x5F60, 0x8FA7, 0x5F61, 0xE1EA, 0x5F62, 0xD0CE, + 0x5F63, 0x8FA8, 0x5F64, 0xCDAE, 0x5F65, 0x8FA9, 0x5F66, 0xD1E5, + 0x5F67, 0x8FAA, 0x5F68, 0x8FAB, 0x5F69, 0xB2CA, 0x5F6A, 0xB1EB, + 0x5F6B, 0x8FAC, 0x5F6C, 0xB1F2, 0x5F6D, 0xC5ED, 0x5F6E, 0x8FAD, + 0x5F6F, 0x8FAE, 0x5F70, 0xD5C3, 0x5F71, 0xD3B0, 0x5F72, 0x8FAF, + 0x5F73, 0xE1DC, 0x5F74, 0x8FB0, 0x5F75, 0x8FB1, 0x5F76, 0x8FB2, + 0x5F77, 0xE1DD, 0x5F78, 0x8FB3, 0x5F79, 0xD2DB, 0x5F7A, 0x8FB4, + 0x5F7B, 0xB3B9, 0x5F7C, 0xB1CB, 0x5F7D, 0x8FB5, 0x5F7E, 0x8FB6, + 0x5F7F, 0x8FB7, 0x5F80, 0xCDF9, 0x5F81, 0xD5F7, 0x5F82, 0xE1DE, + 0x5F83, 0x8FB8, 0x5F84, 0xBEB6, 0x5F85, 0xB4FD, 0x5F86, 0x8FB9, + 0x5F87, 0xE1DF, 0x5F88, 0xBADC, 0x5F89, 0xE1E0, 0x5F8A, 0xBBB2, + 0x5F8B, 0xC2C9, 0x5F8C, 0xE1E1, 0x5F8D, 0x8FBA, 0x5F8E, 0x8FBB, + 0x5F8F, 0x8FBC, 0x5F90, 0xD0EC, 0x5F91, 0x8FBD, 0x5F92, 0xCDBD, + 0x5F93, 0x8FBE, 0x5F94, 0x8FBF, 0x5F95, 0xE1E2, 0x5F96, 0x8FC0, + 0x5F97, 0xB5C3, 0x5F98, 0xC5C7, 0x5F99, 0xE1E3, 0x5F9A, 0x8FC1, + 0x5F9B, 0x8FC2, 0x5F9C, 0xE1E4, 0x5F9D, 0x8FC3, 0x5F9E, 0x8FC4, + 0x5F9F, 0x8FC5, 0x5FA0, 0x8FC6, 0x5FA1, 0xD3F9, 0x5FA2, 0x8FC7, + 0x5FA3, 0x8FC8, 0x5FA4, 0x8FC9, 0x5FA5, 0x8FCA, 0x5FA6, 0x8FCB, + 0x5FA7, 0x8FCC, 0x5FA8, 0xE1E5, 0x5FA9, 0x8FCD, 0x5FAA, 0xD1AD, + 0x5FAB, 0x8FCE, 0x5FAC, 0x8FCF, 0x5FAD, 0xE1E6, 0x5FAE, 0xCEA2, + 0x5FAF, 0x8FD0, 0x5FB0, 0x8FD1, 0x5FB1, 0x8FD2, 0x5FB2, 0x8FD3, + 0x5FB3, 0x8FD4, 0x5FB4, 0x8FD5, 0x5FB5, 0xE1E7, 0x5FB6, 0x8FD6, + 0x5FB7, 0xB5C2, 0x5FB8, 0x8FD7, 0x5FB9, 0x8FD8, 0x5FBA, 0x8FD9, + 0x5FBB, 0x8FDA, 0x5FBC, 0xE1E8, 0x5FBD, 0xBBD5, 0x5FBE, 0x8FDB, + 0x5FBF, 0x8FDC, 0x5FC0, 0x8FDD, 0x5FC1, 0x8FDE, 0x5FC2, 0x8FDF, + 0x5FC3, 0xD0C4, 0x5FC4, 0xE2E0, 0x5FC5, 0xB1D8, 0x5FC6, 0xD2E4, + 0x5FC7, 0x8FE0, 0x5FC8, 0x8FE1, 0x5FC9, 0xE2E1, 0x5FCA, 0x8FE2, + 0x5FCB, 0x8FE3, 0x5FCC, 0xBCC9, 0x5FCD, 0xC8CC, 0x5FCE, 0x8FE4, + 0x5FCF, 0xE2E3, 0x5FD0, 0xECFE, 0x5FD1, 0xECFD, 0x5FD2, 0xDFAF, + 0x5FD3, 0x8FE5, 0x5FD4, 0x8FE6, 0x5FD5, 0x8FE7, 0x5FD6, 0xE2E2, + 0x5FD7, 0xD6BE, 0x5FD8, 0xCDFC, 0x5FD9, 0xC3A6, 0x5FDA, 0x8FE8, + 0x5FDB, 0x8FE9, 0x5FDC, 0x8FEA, 0x5FDD, 0xE3C3, 0x5FDE, 0x8FEB, + 0x5FDF, 0x8FEC, 0x5FE0, 0xD6D2, 0x5FE1, 0xE2E7, 0x5FE2, 0x8FED, + 0x5FE3, 0x8FEE, 0x5FE4, 0xE2E8, 0x5FE5, 0x8FEF, 0x5FE6, 0x8FF0, + 0x5FE7, 0xD3C7, 0x5FE8, 0x8FF1, 0x5FE9, 0x8FF2, 0x5FEA, 0xE2EC, + 0x5FEB, 0xBFEC, 0x5FEC, 0x8FF3, 0x5FED, 0xE2ED, 0x5FEE, 0xE2E5, + 0x5FEF, 0x8FF4, 0x5FF0, 0x8FF5, 0x5FF1, 0xB3C0, 0x5FF2, 0x8FF6, + 0x5FF3, 0x8FF7, 0x5FF4, 0x8FF8, 0x5FF5, 0xC4EE, 0x5FF6, 0x8FF9, + 0x5FF7, 0x8FFA, 0x5FF8, 0xE2EE, 0x5FF9, 0x8FFB, 0x5FFA, 0x8FFC, + 0x5FFB, 0xD0C3, 0x5FFC, 0x8FFD, 0x5FFD, 0xBAF6, 0x5FFE, 0xE2E9, + 0x5FFF, 0xB7DE, 0x6000, 0xBBB3, 0x6001, 0xCCAC, 0x6002, 0xCBCB, + 0x6003, 0xE2E4, 0x6004, 0xE2E6, 0x6005, 0xE2EA, 0x6006, 0xE2EB, + 0x6007, 0x8FFE, 0x6008, 0x9040, 0x6009, 0x9041, 0x600A, 0xE2F7, + 0x600B, 0x9042, 0x600C, 0x9043, 0x600D, 0xE2F4, 0x600E, 0xD4F5, + 0x600F, 0xE2F3, 0x6010, 0x9044, 0x6011, 0x9045, 0x6012, 0xC5AD, + 0x6013, 0x9046, 0x6014, 0xD5FA, 0x6015, 0xC5C2, 0x6016, 0xB2C0, + 0x6017, 0x9047, 0x6018, 0x9048, 0x6019, 0xE2EF, 0x601A, 0x9049, + 0x601B, 0xE2F2, 0x601C, 0xC1AF, 0x601D, 0xCBBC, 0x601E, 0x904A, + 0x601F, 0x904B, 0x6020, 0xB5A1, 0x6021, 0xE2F9, 0x6022, 0x904C, + 0x6023, 0x904D, 0x6024, 0x904E, 0x6025, 0xBCB1, 0x6026, 0xE2F1, + 0x6027, 0xD0D4, 0x6028, 0xD4B9, 0x6029, 0xE2F5, 0x602A, 0xB9D6, + 0x602B, 0xE2F6, 0x602C, 0x904F, 0x602D, 0x9050, 0x602E, 0x9051, + 0x602F, 0xC7D3, 0x6030, 0x9052, 0x6031, 0x9053, 0x6032, 0x9054, + 0x6033, 0x9055, 0x6034, 0x9056, 0x6035, 0xE2F0, 0x6036, 0x9057, + 0x6037, 0x9058, 0x6038, 0x9059, 0x6039, 0x905A, 0x603A, 0x905B, + 0x603B, 0xD7DC, 0x603C, 0xEDA1, 0x603D, 0x905C, 0x603E, 0x905D, + 0x603F, 0xE2F8, 0x6040, 0x905E, 0x6041, 0xEDA5, 0x6042, 0xE2FE, + 0x6043, 0xCAD1, 0x6044, 0x905F, 0x6045, 0x9060, 0x6046, 0x9061, + 0x6047, 0x9062, 0x6048, 0x9063, 0x6049, 0x9064, 0x604A, 0x9065, + 0x604B, 0xC1B5, 0x604C, 0x9066, 0x604D, 0xBBD0, 0x604E, 0x9067, + 0x604F, 0x9068, 0x6050, 0xBFD6, 0x6051, 0x9069, 0x6052, 0xBAE3, + 0x6053, 0x906A, 0x6054, 0x906B, 0x6055, 0xCBA1, 0x6056, 0x906C, + 0x6057, 0x906D, 0x6058, 0x906E, 0x6059, 0xEDA6, 0x605A, 0xEDA3, + 0x605B, 0x906F, 0x605C, 0x9070, 0x605D, 0xEDA2, 0x605E, 0x9071, + 0x605F, 0x9072, 0x6060, 0x9073, 0x6061, 0x9074, 0x6062, 0xBBD6, + 0x6063, 0xEDA7, 0x6064, 0xD0F4, 0x6065, 0x9075, 0x6066, 0x9076, + 0x6067, 0xEDA4, 0x6068, 0xBADE, 0x6069, 0xB6F7, 0x606A, 0xE3A1, + 0x606B, 0xB6B2, 0x606C, 0xCCF1, 0x606D, 0xB9A7, 0x606E, 0x9077, + 0x606F, 0xCFA2, 0x6070, 0xC7A1, 0x6071, 0x9078, 0x6072, 0x9079, + 0x6073, 0xBFD2, 0x6074, 0x907A, 0x6075, 0x907B, 0x6076, 0xB6F1, + 0x6077, 0x907C, 0x6078, 0xE2FA, 0x6079, 0xE2FB, 0x607A, 0xE2FD, + 0x607B, 0xE2FC, 0x607C, 0xC4D5, 0x607D, 0xE3A2, 0x607E, 0x907D, + 0x607F, 0xD3C1, 0x6080, 0x907E, 0x6081, 0x9080, 0x6082, 0x9081, + 0x6083, 0xE3A7, 0x6084, 0xC7C4, 0x6085, 0x9082, 0x6086, 0x9083, + 0x6087, 0x9084, 0x6088, 0x9085, 0x6089, 0xCFA4, 0x608A, 0x9086, + 0x608B, 0x9087, 0x608C, 0xE3A9, 0x608D, 0xBAB7, 0x608E, 0x9088, + 0x608F, 0x9089, 0x6090, 0x908A, 0x6091, 0x908B, 0x6092, 0xE3A8, + 0x6093, 0x908C, 0x6094, 0xBBDA, 0x6095, 0x908D, 0x6096, 0xE3A3, + 0x6097, 0x908E, 0x6098, 0x908F, 0x6099, 0x9090, 0x609A, 0xE3A4, + 0x609B, 0xE3AA, 0x609C, 0x9091, 0x609D, 0xE3A6, 0x609E, 0x9092, + 0x609F, 0xCEF2, 0x60A0, 0xD3C6, 0x60A1, 0x9093, 0x60A2, 0x9094, + 0x60A3, 0xBBBC, 0x60A4, 0x9095, 0x60A5, 0x9096, 0x60A6, 0xD4C3, + 0x60A7, 0x9097, 0x60A8, 0xC4FA, 0x60A9, 0x9098, 0x60AA, 0x9099, + 0x60AB, 0xEDA8, 0x60AC, 0xD0FC, 0x60AD, 0xE3A5, 0x60AE, 0x909A, + 0x60AF, 0xC3F5, 0x60B0, 0x909B, 0x60B1, 0xE3AD, 0x60B2, 0xB1AF, + 0x60B3, 0x909C, 0x60B4, 0xE3B2, 0x60B5, 0x909D, 0x60B6, 0x909E, + 0x60B7, 0x909F, 0x60B8, 0xBCC2, 0x60B9, 0x90A0, 0x60BA, 0x90A1, + 0x60BB, 0xE3AC, 0x60BC, 0xB5BF, 0x60BD, 0x90A2, 0x60BE, 0x90A3, + 0x60BF, 0x90A4, 0x60C0, 0x90A5, 0x60C1, 0x90A6, 0x60C2, 0x90A7, + 0x60C3, 0x90A8, 0x60C4, 0x90A9, 0x60C5, 0xC7E9, 0x60C6, 0xE3B0, + 0x60C7, 0x90AA, 0x60C8, 0x90AB, 0x60C9, 0x90AC, 0x60CA, 0xBEAA, + 0x60CB, 0xCDEF, 0x60CC, 0x90AD, 0x60CD, 0x90AE, 0x60CE, 0x90AF, + 0x60CF, 0x90B0, 0x60D0, 0x90B1, 0x60D1, 0xBBF3, 0x60D2, 0x90B2, + 0x60D3, 0x90B3, 0x60D4, 0x90B4, 0x60D5, 0xCCE8, 0x60D6, 0x90B5, + 0x60D7, 0x90B6, 0x60D8, 0xE3AF, 0x60D9, 0x90B7, 0x60DA, 0xE3B1, + 0x60DB, 0x90B8, 0x60DC, 0xCFA7, 0x60DD, 0xE3AE, 0x60DE, 0x90B9, + 0x60DF, 0xCEA9, 0x60E0, 0xBBDD, 0x60E1, 0x90BA, 0x60E2, 0x90BB, + 0x60E3, 0x90BC, 0x60E4, 0x90BD, 0x60E5, 0x90BE, 0x60E6, 0xB5EB, + 0x60E7, 0xBEE5, 0x60E8, 0xB2D2, 0x60E9, 0xB3CD, 0x60EA, 0x90BF, + 0x60EB, 0xB1B9, 0x60EC, 0xE3AB, 0x60ED, 0xB2D1, 0x60EE, 0xB5AC, + 0x60EF, 0xB9DF, 0x60F0, 0xB6E8, 0x60F1, 0x90C0, 0x60F2, 0x90C1, + 0x60F3, 0xCFEB, 0x60F4, 0xE3B7, 0x60F5, 0x90C2, 0x60F6, 0xBBCC, + 0x60F7, 0x90C3, 0x60F8, 0x90C4, 0x60F9, 0xC8C7, 0x60FA, 0xD0CA, + 0x60FB, 0x90C5, 0x60FC, 0x90C6, 0x60FD, 0x90C7, 0x60FE, 0x90C8, + 0x60FF, 0x90C9, 0x6100, 0xE3B8, 0x6101, 0xB3EE, 0x6102, 0x90CA, + 0x6103, 0x90CB, 0x6104, 0x90CC, 0x6105, 0x90CD, 0x6106, 0xEDA9, + 0x6107, 0x90CE, 0x6108, 0xD3FA, 0x6109, 0xD3E4, 0x610A, 0x90CF, + 0x610B, 0x90D0, 0x610C, 0x90D1, 0x610D, 0xEDAA, 0x610E, 0xE3B9, + 0x610F, 0xD2E2, 0x6110, 0x90D2, 0x6111, 0x90D3, 0x6112, 0x90D4, + 0x6113, 0x90D5, 0x6114, 0x90D6, 0x6115, 0xE3B5, 0x6116, 0x90D7, + 0x6117, 0x90D8, 0x6118, 0x90D9, 0x6119, 0x90DA, 0x611A, 0xD3DE, + 0x611B, 0x90DB, 0x611C, 0x90DC, 0x611D, 0x90DD, 0x611E, 0x90DE, + 0x611F, 0xB8D0, 0x6120, 0xE3B3, 0x6121, 0x90DF, 0x6122, 0x90E0, + 0x6123, 0xE3B6, 0x6124, 0xB7DF, 0x6125, 0x90E1, 0x6126, 0xE3B4, + 0x6127, 0xC0A2, 0x6128, 0x90E2, 0x6129, 0x90E3, 0x612A, 0x90E4, + 0x612B, 0xE3BA, 0x612C, 0x90E5, 0x612D, 0x90E6, 0x612E, 0x90E7, + 0x612F, 0x90E8, 0x6130, 0x90E9, 0x6131, 0x90EA, 0x6132, 0x90EB, + 0x6133, 0x90EC, 0x6134, 0x90ED, 0x6135, 0x90EE, 0x6136, 0x90EF, + 0x6137, 0x90F0, 0x6138, 0x90F1, 0x6139, 0x90F2, 0x613A, 0x90F3, + 0x613B, 0x90F4, 0x613C, 0x90F5, 0x613D, 0x90F6, 0x613E, 0x90F7, + 0x613F, 0xD4B8, 0x6140, 0x90F8, 0x6141, 0x90F9, 0x6142, 0x90FA, + 0x6143, 0x90FB, 0x6144, 0x90FC, 0x6145, 0x90FD, 0x6146, 0x90FE, + 0x6147, 0x9140, 0x6148, 0xB4C8, 0x6149, 0x9141, 0x614A, 0xE3BB, + 0x614B, 0x9142, 0x614C, 0xBBC5, 0x614D, 0x9143, 0x614E, 0xC9F7, + 0x614F, 0x9144, 0x6150, 0x9145, 0x6151, 0xC9E5, 0x6152, 0x9146, + 0x6153, 0x9147, 0x6154, 0x9148, 0x6155, 0xC4BD, 0x6156, 0x9149, + 0x6157, 0x914A, 0x6158, 0x914B, 0x6159, 0x914C, 0x615A, 0x914D, + 0x615B, 0x914E, 0x615C, 0x914F, 0x615D, 0xEDAB, 0x615E, 0x9150, + 0x615F, 0x9151, 0x6160, 0x9152, 0x6161, 0x9153, 0x6162, 0xC2FD, + 0x6163, 0x9154, 0x6164, 0x9155, 0x6165, 0x9156, 0x6166, 0x9157, + 0x6167, 0xBBDB, 0x6168, 0xBFAE, 0x6169, 0x9158, 0x616A, 0x9159, + 0x616B, 0x915A, 0x616C, 0x915B, 0x616D, 0x915C, 0x616E, 0x915D, + 0x616F, 0x915E, 0x6170, 0xCEBF, 0x6171, 0x915F, 0x6172, 0x9160, + 0x6173, 0x9161, 0x6174, 0x9162, 0x6175, 0xE3BC, 0x6176, 0x9163, + 0x6177, 0xBFB6, 0x6178, 0x9164, 0x6179, 0x9165, 0x617A, 0x9166, + 0x617B, 0x9167, 0x617C, 0x9168, 0x617D, 0x9169, 0x617E, 0x916A, + 0x617F, 0x916B, 0x6180, 0x916C, 0x6181, 0x916D, 0x6182, 0x916E, + 0x6183, 0x916F, 0x6184, 0x9170, 0x6185, 0x9171, 0x6186, 0x9172, + 0x6187, 0x9173, 0x6188, 0x9174, 0x6189, 0x9175, 0x618A, 0x9176, + 0x618B, 0xB1EF, 0x618C, 0x9177, 0x618D, 0x9178, 0x618E, 0xD4F7, + 0x618F, 0x9179, 0x6190, 0x917A, 0x6191, 0x917B, 0x6192, 0x917C, + 0x6193, 0x917D, 0x6194, 0xE3BE, 0x6195, 0x917E, 0x6196, 0x9180, + 0x6197, 0x9181, 0x6198, 0x9182, 0x6199, 0x9183, 0x619A, 0x9184, + 0x619B, 0x9185, 0x619C, 0x9186, 0x619D, 0xEDAD, 0x619E, 0x9187, + 0x619F, 0x9188, 0x61A0, 0x9189, 0x61A1, 0x918A, 0x61A2, 0x918B, + 0x61A3, 0x918C, 0x61A4, 0x918D, 0x61A5, 0x918E, 0x61A6, 0x918F, + 0x61A7, 0xE3BF, 0x61A8, 0xBAA9, 0x61A9, 0xEDAC, 0x61AA, 0x9190, + 0x61AB, 0x9191, 0x61AC, 0xE3BD, 0x61AD, 0x9192, 0x61AE, 0x9193, + 0x61AF, 0x9194, 0x61B0, 0x9195, 0x61B1, 0x9196, 0x61B2, 0x9197, + 0x61B3, 0x9198, 0x61B4, 0x9199, 0x61B5, 0x919A, 0x61B6, 0x919B, + 0x61B7, 0xE3C0, 0x61B8, 0x919C, 0x61B9, 0x919D, 0x61BA, 0x919E, + 0x61BB, 0x919F, 0x61BC, 0x91A0, 0x61BD, 0x91A1, 0x61BE, 0xBAB6, + 0x61BF, 0x91A2, 0x61C0, 0x91A3, 0x61C1, 0x91A4, 0x61C2, 0xB6AE, + 0x61C3, 0x91A5, 0x61C4, 0x91A6, 0x61C5, 0x91A7, 0x61C6, 0x91A8, + 0x61C7, 0x91A9, 0x61C8, 0xD0B8, 0x61C9, 0x91AA, 0x61CA, 0xB0C3, + 0x61CB, 0xEDAE, 0x61CC, 0x91AB, 0x61CD, 0x91AC, 0x61CE, 0x91AD, + 0x61CF, 0x91AE, 0x61D0, 0x91AF, 0x61D1, 0xEDAF, 0x61D2, 0xC0C1, + 0x61D3, 0x91B0, 0x61D4, 0xE3C1, 0x61D5, 0x91B1, 0x61D6, 0x91B2, + 0x61D7, 0x91B3, 0x61D8, 0x91B4, 0x61D9, 0x91B5, 0x61DA, 0x91B6, + 0x61DB, 0x91B7, 0x61DC, 0x91B8, 0x61DD, 0x91B9, 0x61DE, 0x91BA, + 0x61DF, 0x91BB, 0x61E0, 0x91BC, 0x61E1, 0x91BD, 0x61E2, 0x91BE, + 0x61E3, 0x91BF, 0x61E4, 0x91C0, 0x61E5, 0x91C1, 0x61E6, 0xC5B3, + 0x61E7, 0x91C2, 0x61E8, 0x91C3, 0x61E9, 0x91C4, 0x61EA, 0x91C5, + 0x61EB, 0x91C6, 0x61EC, 0x91C7, 0x61ED, 0x91C8, 0x61EE, 0x91C9, + 0x61EF, 0x91CA, 0x61F0, 0x91CB, 0x61F1, 0x91CC, 0x61F2, 0x91CD, + 0x61F3, 0x91CE, 0x61F4, 0x91CF, 0x61F5, 0xE3C2, 0x61F6, 0x91D0, + 0x61F7, 0x91D1, 0x61F8, 0x91D2, 0x61F9, 0x91D3, 0x61FA, 0x91D4, + 0x61FB, 0x91D5, 0x61FC, 0x91D6, 0x61FD, 0x91D7, 0x61FE, 0x91D8, + 0x61FF, 0xDCB2, 0x6200, 0x91D9, 0x6201, 0x91DA, 0x6202, 0x91DB, + 0x6203, 0x91DC, 0x6204, 0x91DD, 0x6205, 0x91DE, 0x6206, 0xEDB0, + 0x6207, 0x91DF, 0x6208, 0xB8EA, 0x6209, 0x91E0, 0x620A, 0xCEEC, + 0x620B, 0xEAA7, 0x620C, 0xD0E7, 0x620D, 0xCAF9, 0x620E, 0xC8D6, + 0x620F, 0xCFB7, 0x6210, 0xB3C9, 0x6211, 0xCED2, 0x6212, 0xBDE4, + 0x6213, 0x91E1, 0x6214, 0x91E2, 0x6215, 0xE3DE, 0x6216, 0xBBF2, + 0x6217, 0xEAA8, 0x6218, 0xD5BD, 0x6219, 0x91E3, 0x621A, 0xC6DD, + 0x621B, 0xEAA9, 0x621C, 0x91E4, 0x621D, 0x91E5, 0x621E, 0x91E6, + 0x621F, 0xEAAA, 0x6220, 0x91E7, 0x6221, 0xEAAC, 0x6222, 0xEAAB, + 0x6223, 0x91E8, 0x6224, 0xEAAE, 0x6225, 0xEAAD, 0x6226, 0x91E9, + 0x6227, 0x91EA, 0x6228, 0x91EB, 0x6229, 0x91EC, 0x622A, 0xBDD8, + 0x622B, 0x91ED, 0x622C, 0xEAAF, 0x622D, 0x91EE, 0x622E, 0xC2BE, + 0x622F, 0x91EF, 0x6230, 0x91F0, 0x6231, 0x91F1, 0x6232, 0x91F2, + 0x6233, 0xB4C1, 0x6234, 0xB4F7, 0x6235, 0x91F3, 0x6236, 0x91F4, + 0x6237, 0xBBA7, 0x6238, 0x91F5, 0x6239, 0x91F6, 0x623A, 0x91F7, + 0x623B, 0x91F8, 0x623C, 0x91F9, 0x623D, 0xECE6, 0x623E, 0xECE5, + 0x623F, 0xB7BF, 0x6240, 0xCBF9, 0x6241, 0xB1E2, 0x6242, 0x91FA, + 0x6243, 0xECE7, 0x6244, 0x91FB, 0x6245, 0x91FC, 0x6246, 0x91FD, + 0x6247, 0xC9C8, 0x6248, 0xECE8, 0x6249, 0xECE9, 0x624A, 0x91FE, + 0x624B, 0xCAD6, 0x624C, 0xDED0, 0x624D, 0xB2C5, 0x624E, 0xD4FA, + 0x624F, 0x9240, 0x6250, 0x9241, 0x6251, 0xC6CB, 0x6252, 0xB0C7, + 0x6253, 0xB4F2, 0x6254, 0xC8D3, 0x6255, 0x9242, 0x6256, 0x9243, + 0x6257, 0x9244, 0x6258, 0xCDD0, 0x6259, 0x9245, 0x625A, 0x9246, + 0x625B, 0xBFB8, 0x625C, 0x9247, 0x625D, 0x9248, 0x625E, 0x9249, + 0x625F, 0x924A, 0x6260, 0x924B, 0x6261, 0x924C, 0x6262, 0x924D, + 0x6263, 0xBFDB, 0x6264, 0x924E, 0x6265, 0x924F, 0x6266, 0xC7A4, + 0x6267, 0xD6B4, 0x6268, 0x9250, 0x6269, 0xC0A9, 0x626A, 0xDED1, + 0x626B, 0xC9A8, 0x626C, 0xD1EF, 0x626D, 0xC5A4, 0x626E, 0xB0E7, + 0x626F, 0xB3B6, 0x6270, 0xC8C5, 0x6271, 0x9251, 0x6272, 0x9252, + 0x6273, 0xB0E2, 0x6274, 0x9253, 0x6275, 0x9254, 0x6276, 0xB7F6, + 0x6277, 0x9255, 0x6278, 0x9256, 0x6279, 0xC5FA, 0x627A, 0x9257, + 0x627B, 0x9258, 0x627C, 0xB6F3, 0x627D, 0x9259, 0x627E, 0xD5D2, + 0x627F, 0xB3D0, 0x6280, 0xBCBC, 0x6281, 0x925A, 0x6282, 0x925B, + 0x6283, 0x925C, 0x6284, 0xB3AD, 0x6285, 0x925D, 0x6286, 0x925E, + 0x6287, 0x925F, 0x6288, 0x9260, 0x6289, 0xBEF1, 0x628A, 0xB0D1, + 0x628B, 0x9261, 0x628C, 0x9262, 0x628D, 0x9263, 0x628E, 0x9264, + 0x628F, 0x9265, 0x6290, 0x9266, 0x6291, 0xD2D6, 0x6292, 0xCAE3, + 0x6293, 0xD7A5, 0x6294, 0x9267, 0x6295, 0xCDB6, 0x6296, 0xB6B6, + 0x6297, 0xBFB9, 0x6298, 0xD5DB, 0x6299, 0x9268, 0x629A, 0xB8A7, + 0x629B, 0xC5D7, 0x629C, 0x9269, 0x629D, 0x926A, 0x629E, 0x926B, + 0x629F, 0xDED2, 0x62A0, 0xBFD9, 0x62A1, 0xC2D5, 0x62A2, 0xC7C0, + 0x62A3, 0x926C, 0x62A4, 0xBBA4, 0x62A5, 0xB1A8, 0x62A6, 0x926D, + 0x62A7, 0x926E, 0x62A8, 0xC5EA, 0x62A9, 0x926F, 0x62AA, 0x9270, + 0x62AB, 0xC5FB, 0x62AC, 0xCCA7, 0x62AD, 0x9271, 0x62AE, 0x9272, + 0x62AF, 0x9273, 0x62B0, 0x9274, 0x62B1, 0xB1A7, 0x62B2, 0x9275, + 0x62B3, 0x9276, 0x62B4, 0x9277, 0x62B5, 0xB5D6, 0x62B6, 0x9278, + 0x62B7, 0x9279, 0x62B8, 0x927A, 0x62B9, 0xC4A8, 0x62BA, 0x927B, + 0x62BB, 0xDED3, 0x62BC, 0xD1BA, 0x62BD, 0xB3E9, 0x62BE, 0x927C, + 0x62BF, 0xC3F2, 0x62C0, 0x927D, 0x62C1, 0x927E, 0x62C2, 0xB7F7, + 0x62C3, 0x9280, 0x62C4, 0xD6F4, 0x62C5, 0xB5A3, 0x62C6, 0xB2F0, + 0x62C7, 0xC4B4, 0x62C8, 0xC4E9, 0x62C9, 0xC0AD, 0x62CA, 0xDED4, + 0x62CB, 0x9281, 0x62CC, 0xB0E8, 0x62CD, 0xC5C4, 0x62CE, 0xC1E0, + 0x62CF, 0x9282, 0x62D0, 0xB9D5, 0x62D1, 0x9283, 0x62D2, 0xBEDC, + 0x62D3, 0xCDD8, 0x62D4, 0xB0CE, 0x62D5, 0x9284, 0x62D6, 0xCDCF, + 0x62D7, 0xDED6, 0x62D8, 0xBED0, 0x62D9, 0xD7BE, 0x62DA, 0xDED5, + 0x62DB, 0xD5D0, 0x62DC, 0xB0DD, 0x62DD, 0x9285, 0x62DE, 0x9286, + 0x62DF, 0xC4E2, 0x62E0, 0x9287, 0x62E1, 0x9288, 0x62E2, 0xC2A3, + 0x62E3, 0xBCF0, 0x62E4, 0x9289, 0x62E5, 0xD3B5, 0x62E6, 0xC0B9, + 0x62E7, 0xC5A1, 0x62E8, 0xB2A6, 0x62E9, 0xD4F1, 0x62EA, 0x928A, + 0x62EB, 0x928B, 0x62EC, 0xC0A8, 0x62ED, 0xCAC3, 0x62EE, 0xDED7, + 0x62EF, 0xD5FC, 0x62F0, 0x928C, 0x62F1, 0xB9B0, 0x62F2, 0x928D, + 0x62F3, 0xC8AD, 0x62F4, 0xCBA9, 0x62F5, 0x928E, 0x62F6, 0xDED9, + 0x62F7, 0xBFBD, 0x62F8, 0x928F, 0x62F9, 0x9290, 0x62FA, 0x9291, + 0x62FB, 0x9292, 0x62FC, 0xC6B4, 0x62FD, 0xD7A7, 0x62FE, 0xCAB0, + 0x62FF, 0xC4C3, 0x6300, 0x9293, 0x6301, 0xB3D6, 0x6302, 0xB9D2, + 0x6303, 0x9294, 0x6304, 0x9295, 0x6305, 0x9296, 0x6306, 0x9297, + 0x6307, 0xD6B8, 0x6308, 0xEAFC, 0x6309, 0xB0B4, 0x630A, 0x9298, + 0x630B, 0x9299, 0x630C, 0x929A, 0x630D, 0x929B, 0x630E, 0xBFE6, + 0x630F, 0x929C, 0x6310, 0x929D, 0x6311, 0xCCF4, 0x6312, 0x929E, + 0x6313, 0x929F, 0x6314, 0x92A0, 0x6315, 0x92A1, 0x6316, 0xCDDA, + 0x6317, 0x92A2, 0x6318, 0x92A3, 0x6319, 0x92A4, 0x631A, 0xD6BF, + 0x631B, 0xC2CE, 0x631C, 0x92A5, 0x631D, 0xCECE, 0x631E, 0xCCA2, + 0x631F, 0xD0AE, 0x6320, 0xC4D3, 0x6321, 0xB5B2, 0x6322, 0xDED8, + 0x6323, 0xD5F5, 0x6324, 0xBCB7, 0x6325, 0xBBD3, 0x6326, 0x92A6, + 0x6327, 0x92A7, 0x6328, 0xB0A4, 0x6329, 0x92A8, 0x632A, 0xC5B2, + 0x632B, 0xB4EC, 0x632C, 0x92A9, 0x632D, 0x92AA, 0x632E, 0x92AB, + 0x632F, 0xD5F1, 0x6330, 0x92AC, 0x6331, 0x92AD, 0x6332, 0xEAFD, + 0x6333, 0x92AE, 0x6334, 0x92AF, 0x6335, 0x92B0, 0x6336, 0x92B1, + 0x6337, 0x92B2, 0x6338, 0x92B3, 0x6339, 0xDEDA, 0x633A, 0xCDA6, + 0x633B, 0x92B4, 0x633C, 0x92B5, 0x633D, 0xCDEC, 0x633E, 0x92B6, + 0x633F, 0x92B7, 0x6340, 0x92B8, 0x6341, 0x92B9, 0x6342, 0xCEE6, + 0x6343, 0xDEDC, 0x6344, 0x92BA, 0x6345, 0xCDB1, 0x6346, 0xC0A6, + 0x6347, 0x92BB, 0x6348, 0x92BC, 0x6349, 0xD7BD, 0x634A, 0x92BD, + 0x634B, 0xDEDB, 0x634C, 0xB0C6, 0x634D, 0xBAB4, 0x634E, 0xC9D3, + 0x634F, 0xC4F3, 0x6350, 0xBEE8, 0x6351, 0x92BE, 0x6352, 0x92BF, + 0x6353, 0x92C0, 0x6354, 0x92C1, 0x6355, 0xB2B6, 0x6356, 0x92C2, + 0x6357, 0x92C3, 0x6358, 0x92C4, 0x6359, 0x92C5, 0x635A, 0x92C6, + 0x635B, 0x92C7, 0x635C, 0x92C8, 0x635D, 0x92C9, 0x635E, 0xC0CC, + 0x635F, 0xCBF0, 0x6360, 0x92CA, 0x6361, 0xBCF1, 0x6362, 0xBBBB, + 0x6363, 0xB5B7, 0x6364, 0x92CB, 0x6365, 0x92CC, 0x6366, 0x92CD, + 0x6367, 0xC5F5, 0x6368, 0x92CE, 0x6369, 0xDEE6, 0x636A, 0x92CF, + 0x636B, 0x92D0, 0x636C, 0x92D1, 0x636D, 0xDEE3, 0x636E, 0xBEDD, + 0x636F, 0x92D2, 0x6370, 0x92D3, 0x6371, 0xDEDF, 0x6372, 0x92D4, + 0x6373, 0x92D5, 0x6374, 0x92D6, 0x6375, 0x92D7, 0x6376, 0xB4B7, + 0x6377, 0xBDDD, 0x6378, 0x92D8, 0x6379, 0x92D9, 0x637A, 0xDEE0, + 0x637B, 0xC4ED, 0x637C, 0x92DA, 0x637D, 0x92DB, 0x637E, 0x92DC, + 0x637F, 0x92DD, 0x6380, 0xCFC6, 0x6381, 0x92DE, 0x6382, 0xB5E0, + 0x6383, 0x92DF, 0x6384, 0x92E0, 0x6385, 0x92E1, 0x6386, 0x92E2, + 0x6387, 0xB6DE, 0x6388, 0xCADA, 0x6389, 0xB5F4, 0x638A, 0xDEE5, + 0x638B, 0x92E3, 0x638C, 0xD5C6, 0x638D, 0x92E4, 0x638E, 0xDEE1, + 0x638F, 0xCCCD, 0x6390, 0xC6FE, 0x6391, 0x92E5, 0x6392, 0xC5C5, + 0x6393, 0x92E6, 0x6394, 0x92E7, 0x6395, 0x92E8, 0x6396, 0xD2B4, + 0x6397, 0x92E9, 0x6398, 0xBEF2, 0x6399, 0x92EA, 0x639A, 0x92EB, + 0x639B, 0x92EC, 0x639C, 0x92ED, 0x639D, 0x92EE, 0x639E, 0x92EF, + 0x639F, 0x92F0, 0x63A0, 0xC2D3, 0x63A1, 0x92F1, 0x63A2, 0xCCBD, + 0x63A3, 0xB3B8, 0x63A4, 0x92F2, 0x63A5, 0xBDD3, 0x63A6, 0x92F3, + 0x63A7, 0xBFD8, 0x63A8, 0xCDC6, 0x63A9, 0xD1DA, 0x63AA, 0xB4EB, + 0x63AB, 0x92F4, 0x63AC, 0xDEE4, 0x63AD, 0xDEDD, 0x63AE, 0xDEE7, + 0x63AF, 0x92F5, 0x63B0, 0xEAFE, 0x63B1, 0x92F6, 0x63B2, 0x92F7, + 0x63B3, 0xC2B0, 0x63B4, 0xDEE2, 0x63B5, 0x92F8, 0x63B6, 0x92F9, + 0x63B7, 0xD6C0, 0x63B8, 0xB5A7, 0x63B9, 0x92FA, 0x63BA, 0xB2F4, + 0x63BB, 0x92FB, 0x63BC, 0xDEE8, 0x63BD, 0x92FC, 0x63BE, 0xDEF2, + 0x63BF, 0x92FD, 0x63C0, 0x92FE, 0x63C1, 0x9340, 0x63C2, 0x9341, + 0x63C3, 0x9342, 0x63C4, 0xDEED, 0x63C5, 0x9343, 0x63C6, 0xDEF1, + 0x63C7, 0x9344, 0x63C8, 0x9345, 0x63C9, 0xC8E0, 0x63CA, 0x9346, + 0x63CB, 0x9347, 0x63CC, 0x9348, 0x63CD, 0xD7E1, 0x63CE, 0xDEEF, + 0x63CF, 0xC3E8, 0x63D0, 0xCCE1, 0x63D1, 0x9349, 0x63D2, 0xB2E5, + 0x63D3, 0x934A, 0x63D4, 0x934B, 0x63D5, 0x934C, 0x63D6, 0xD2BE, + 0x63D7, 0x934D, 0x63D8, 0x934E, 0x63D9, 0x934F, 0x63DA, 0x9350, + 0x63DB, 0x9351, 0x63DC, 0x9352, 0x63DD, 0x9353, 0x63DE, 0xDEEE, + 0x63DF, 0x9354, 0x63E0, 0xDEEB, 0x63E1, 0xCED5, 0x63E2, 0x9355, + 0x63E3, 0xB4A7, 0x63E4, 0x9356, 0x63E5, 0x9357, 0x63E6, 0x9358, + 0x63E7, 0x9359, 0x63E8, 0x935A, 0x63E9, 0xBFAB, 0x63EA, 0xBEBE, + 0x63EB, 0x935B, 0x63EC, 0x935C, 0x63ED, 0xBDD2, 0x63EE, 0x935D, + 0x63EF, 0x935E, 0x63F0, 0x935F, 0x63F1, 0x9360, 0x63F2, 0xDEE9, + 0x63F3, 0x9361, 0x63F4, 0xD4AE, 0x63F5, 0x9362, 0x63F6, 0xDEDE, + 0x63F7, 0x9363, 0x63F8, 0xDEEA, 0x63F9, 0x9364, 0x63FA, 0x9365, + 0x63FB, 0x9366, 0x63FC, 0x9367, 0x63FD, 0xC0BF, 0x63FE, 0x9368, + 0x63FF, 0xDEEC, 0x6400, 0xB2F3, 0x6401, 0xB8E9, 0x6402, 0xC2A7, + 0x6403, 0x9369, 0x6404, 0x936A, 0x6405, 0xBDC1, 0x6406, 0x936B, + 0x6407, 0x936C, 0x6408, 0x936D, 0x6409, 0x936E, 0x640A, 0x936F, + 0x640B, 0xDEF5, 0x640C, 0xDEF8, 0x640D, 0x9370, 0x640E, 0x9371, + 0x640F, 0xB2AB, 0x6410, 0xB4A4, 0x6411, 0x9372, 0x6412, 0x9373, + 0x6413, 0xB4EA, 0x6414, 0xC9A6, 0x6415, 0x9374, 0x6416, 0x9375, + 0x6417, 0x9376, 0x6418, 0x9377, 0x6419, 0x9378, 0x641A, 0x9379, + 0x641B, 0xDEF6, 0x641C, 0xCBD1, 0x641D, 0x937A, 0x641E, 0xB8E3, + 0x641F, 0x937B, 0x6420, 0xDEF7, 0x6421, 0xDEFA, 0x6422, 0x937C, + 0x6423, 0x937D, 0x6424, 0x937E, 0x6425, 0x9380, 0x6426, 0xDEF9, + 0x6427, 0x9381, 0x6428, 0x9382, 0x6429, 0x9383, 0x642A, 0xCCC2, + 0x642B, 0x9384, 0x642C, 0xB0E1, 0x642D, 0xB4EE, 0x642E, 0x9385, + 0x642F, 0x9386, 0x6430, 0x9387, 0x6431, 0x9388, 0x6432, 0x9389, + 0x6433, 0x938A, 0x6434, 0xE5BA, 0x6435, 0x938B, 0x6436, 0x938C, + 0x6437, 0x938D, 0x6438, 0x938E, 0x6439, 0x938F, 0x643A, 0xD0AF, + 0x643B, 0x9390, 0x643C, 0x9391, 0x643D, 0xB2EB, 0x643E, 0x9392, + 0x643F, 0xEBA1, 0x6440, 0x9393, 0x6441, 0xDEF4, 0x6442, 0x9394, + 0x6443, 0x9395, 0x6444, 0xC9E3, 0x6445, 0xDEF3, 0x6446, 0xB0DA, + 0x6447, 0xD2A1, 0x6448, 0xB1F7, 0x6449, 0x9396, 0x644A, 0xCCAF, + 0x644B, 0x9397, 0x644C, 0x9398, 0x644D, 0x9399, 0x644E, 0x939A, + 0x644F, 0x939B, 0x6450, 0x939C, 0x6451, 0x939D, 0x6452, 0xDEF0, + 0x6453, 0x939E, 0x6454, 0xCBA4, 0x6455, 0x939F, 0x6456, 0x93A0, + 0x6457, 0x93A1, 0x6458, 0xD5AA, 0x6459, 0x93A2, 0x645A, 0x93A3, + 0x645B, 0x93A4, 0x645C, 0x93A5, 0x645D, 0x93A6, 0x645E, 0xDEFB, + 0x645F, 0x93A7, 0x6460, 0x93A8, 0x6461, 0x93A9, 0x6462, 0x93AA, + 0x6463, 0x93AB, 0x6464, 0x93AC, 0x6465, 0x93AD, 0x6466, 0x93AE, + 0x6467, 0xB4DD, 0x6468, 0x93AF, 0x6469, 0xC4A6, 0x646A, 0x93B0, + 0x646B, 0x93B1, 0x646C, 0x93B2, 0x646D, 0xDEFD, 0x646E, 0x93B3, + 0x646F, 0x93B4, 0x6470, 0x93B5, 0x6471, 0x93B6, 0x6472, 0x93B7, + 0x6473, 0x93B8, 0x6474, 0x93B9, 0x6475, 0x93BA, 0x6476, 0x93BB, + 0x6477, 0x93BC, 0x6478, 0xC3FE, 0x6479, 0xC4A1, 0x647A, 0xDFA1, + 0x647B, 0x93BD, 0x647C, 0x93BE, 0x647D, 0x93BF, 0x647E, 0x93C0, + 0x647F, 0x93C1, 0x6480, 0x93C2, 0x6481, 0x93C3, 0x6482, 0xC1CC, + 0x6483, 0x93C4, 0x6484, 0xDEFC, 0x6485, 0xBEEF, 0x6486, 0x93C5, + 0x6487, 0xC6B2, 0x6488, 0x93C6, 0x6489, 0x93C7, 0x648A, 0x93C8, + 0x648B, 0x93C9, 0x648C, 0x93CA, 0x648D, 0x93CB, 0x648E, 0x93CC, + 0x648F, 0x93CD, 0x6490, 0x93CE, 0x6491, 0xB3C5, 0x6492, 0xC8F6, + 0x6493, 0x93CF, 0x6494, 0x93D0, 0x6495, 0xCBBA, 0x6496, 0xDEFE, + 0x6497, 0x93D1, 0x6498, 0x93D2, 0x6499, 0xDFA4, 0x649A, 0x93D3, + 0x649B, 0x93D4, 0x649C, 0x93D5, 0x649D, 0x93D6, 0x649E, 0xD7B2, + 0x649F, 0x93D7, 0x64A0, 0x93D8, 0x64A1, 0x93D9, 0x64A2, 0x93DA, + 0x64A3, 0x93DB, 0x64A4, 0xB3B7, 0x64A5, 0x93DC, 0x64A6, 0x93DD, + 0x64A7, 0x93DE, 0x64A8, 0x93DF, 0x64A9, 0xC1C3, 0x64AA, 0x93E0, + 0x64AB, 0x93E1, 0x64AC, 0xC7CB, 0x64AD, 0xB2A5, 0x64AE, 0xB4E9, + 0x64AF, 0x93E2, 0x64B0, 0xD7AB, 0x64B1, 0x93E3, 0x64B2, 0x93E4, + 0x64B3, 0x93E5, 0x64B4, 0x93E6, 0x64B5, 0xC4EC, 0x64B6, 0x93E7, + 0x64B7, 0xDFA2, 0x64B8, 0xDFA3, 0x64B9, 0x93E8, 0x64BA, 0xDFA5, + 0x64BB, 0x93E9, 0x64BC, 0xBAB3, 0x64BD, 0x93EA, 0x64BE, 0x93EB, + 0x64BF, 0x93EC, 0x64C0, 0xDFA6, 0x64C1, 0x93ED, 0x64C2, 0xC0DE, + 0x64C3, 0x93EE, 0x64C4, 0x93EF, 0x64C5, 0xC9C3, 0x64C6, 0x93F0, + 0x64C7, 0x93F1, 0x64C8, 0x93F2, 0x64C9, 0x93F3, 0x64CA, 0x93F4, + 0x64CB, 0x93F5, 0x64CC, 0x93F6, 0x64CD, 0xB2D9, 0x64CE, 0xC7E6, + 0x64CF, 0x93F7, 0x64D0, 0xDFA7, 0x64D1, 0x93F8, 0x64D2, 0xC7DC, + 0x64D3, 0x93F9, 0x64D4, 0x93FA, 0x64D5, 0x93FB, 0x64D6, 0x93FC, + 0x64D7, 0xDFA8, 0x64D8, 0xEBA2, 0x64D9, 0x93FD, 0x64DA, 0x93FE, + 0x64DB, 0x9440, 0x64DC, 0x9441, 0x64DD, 0x9442, 0x64DE, 0xCBD3, + 0x64DF, 0x9443, 0x64E0, 0x9444, 0x64E1, 0x9445, 0x64E2, 0xDFAA, + 0x64E3, 0x9446, 0x64E4, 0xDFA9, 0x64E5, 0x9447, 0x64E6, 0xB2C1, + 0x64E7, 0x9448, 0x64E8, 0x9449, 0x64E9, 0x944A, 0x64EA, 0x944B, + 0x64EB, 0x944C, 0x64EC, 0x944D, 0x64ED, 0x944E, 0x64EE, 0x944F, + 0x64EF, 0x9450, 0x64F0, 0x9451, 0x64F1, 0x9452, 0x64F2, 0x9453, + 0x64F3, 0x9454, 0x64F4, 0x9455, 0x64F5, 0x9456, 0x64F6, 0x9457, + 0x64F7, 0x9458, 0x64F8, 0x9459, 0x64F9, 0x945A, 0x64FA, 0x945B, + 0x64FB, 0x945C, 0x64FC, 0x945D, 0x64FD, 0x945E, 0x64FE, 0x945F, + 0x64FF, 0x9460, 0x6500, 0xC5CA, 0x6501, 0x9461, 0x6502, 0x9462, + 0x6503, 0x9463, 0x6504, 0x9464, 0x6505, 0x9465, 0x6506, 0x9466, + 0x6507, 0x9467, 0x6508, 0x9468, 0x6509, 0xDFAB, 0x650A, 0x9469, + 0x650B, 0x946A, 0x650C, 0x946B, 0x650D, 0x946C, 0x650E, 0x946D, + 0x650F, 0x946E, 0x6510, 0x946F, 0x6511, 0x9470, 0x6512, 0xD4DC, + 0x6513, 0x9471, 0x6514, 0x9472, 0x6515, 0x9473, 0x6516, 0x9474, + 0x6517, 0x9475, 0x6518, 0xC8C1, 0x6519, 0x9476, 0x651A, 0x9477, + 0x651B, 0x9478, 0x651C, 0x9479, 0x651D, 0x947A, 0x651E, 0x947B, + 0x651F, 0x947C, 0x6520, 0x947D, 0x6521, 0x947E, 0x6522, 0x9480, + 0x6523, 0x9481, 0x6524, 0x9482, 0x6525, 0xDFAC, 0x6526, 0x9483, + 0x6527, 0x9484, 0x6528, 0x9485, 0x6529, 0x9486, 0x652A, 0x9487, + 0x652B, 0xBEF0, 0x652C, 0x9488, 0x652D, 0x9489, 0x652E, 0xDFAD, + 0x652F, 0xD6A7, 0x6530, 0x948A, 0x6531, 0x948B, 0x6532, 0x948C, + 0x6533, 0x948D, 0x6534, 0xEAB7, 0x6535, 0xEBB6, 0x6536, 0xCAD5, + 0x6537, 0x948E, 0x6538, 0xD8FC, 0x6539, 0xB8C4, 0x653A, 0x948F, + 0x653B, 0xB9A5, 0x653C, 0x9490, 0x653D, 0x9491, 0x653E, 0xB7C5, + 0x653F, 0xD5FE, 0x6540, 0x9492, 0x6541, 0x9493, 0x6542, 0x9494, + 0x6543, 0x9495, 0x6544, 0x9496, 0x6545, 0xB9CA, 0x6546, 0x9497, + 0x6547, 0x9498, 0x6548, 0xD0A7, 0x6549, 0xF4CD, 0x654A, 0x9499, + 0x654B, 0x949A, 0x654C, 0xB5D0, 0x654D, 0x949B, 0x654E, 0x949C, + 0x654F, 0xC3F4, 0x6550, 0x949D, 0x6551, 0xBEC8, 0x6552, 0x949E, + 0x6553, 0x949F, 0x6554, 0x94A0, 0x6555, 0xEBB7, 0x6556, 0xB0BD, + 0x6557, 0x94A1, 0x6558, 0x94A2, 0x6559, 0xBDCC, 0x655A, 0x94A3, + 0x655B, 0xC1B2, 0x655C, 0x94A4, 0x655D, 0xB1D6, 0x655E, 0xB3A8, + 0x655F, 0x94A5, 0x6560, 0x94A6, 0x6561, 0x94A7, 0x6562, 0xB8D2, + 0x6563, 0xC9A2, 0x6564, 0x94A8, 0x6565, 0x94A9, 0x6566, 0xB6D8, + 0x6567, 0x94AA, 0x6568, 0x94AB, 0x6569, 0x94AC, 0x656A, 0x94AD, + 0x656B, 0xEBB8, 0x656C, 0xBEB4, 0x656D, 0x94AE, 0x656E, 0x94AF, + 0x656F, 0x94B0, 0x6570, 0xCAFD, 0x6571, 0x94B1, 0x6572, 0xC7C3, + 0x6573, 0x94B2, 0x6574, 0xD5FB, 0x6575, 0x94B3, 0x6576, 0x94B4, + 0x6577, 0xB7F3, 0x6578, 0x94B5, 0x6579, 0x94B6, 0x657A, 0x94B7, + 0x657B, 0x94B8, 0x657C, 0x94B9, 0x657D, 0x94BA, 0x657E, 0x94BB, + 0x657F, 0x94BC, 0x6580, 0x94BD, 0x6581, 0x94BE, 0x6582, 0x94BF, + 0x6583, 0x94C0, 0x6584, 0x94C1, 0x6585, 0x94C2, 0x6586, 0x94C3, + 0x6587, 0xCEC4, 0x6588, 0x94C4, 0x6589, 0x94C5, 0x658A, 0x94C6, + 0x658B, 0xD5AB, 0x658C, 0xB1F3, 0x658D, 0x94C7, 0x658E, 0x94C8, + 0x658F, 0x94C9, 0x6590, 0xECB3, 0x6591, 0xB0DF, 0x6592, 0x94CA, + 0x6593, 0xECB5, 0x6594, 0x94CB, 0x6595, 0x94CC, 0x6596, 0x94CD, + 0x6597, 0xB6B7, 0x6598, 0x94CE, 0x6599, 0xC1CF, 0x659A, 0x94CF, + 0x659B, 0xF5FA, 0x659C, 0xD0B1, 0x659D, 0x94D0, 0x659E, 0x94D1, + 0x659F, 0xD5E5, 0x65A0, 0x94D2, 0x65A1, 0xCED3, 0x65A2, 0x94D3, + 0x65A3, 0x94D4, 0x65A4, 0xBDEF, 0x65A5, 0xB3E2, 0x65A6, 0x94D5, + 0x65A7, 0xB8AB, 0x65A8, 0x94D6, 0x65A9, 0xD5B6, 0x65AA, 0x94D7, + 0x65AB, 0xEDBD, 0x65AC, 0x94D8, 0x65AD, 0xB6CF, 0x65AE, 0x94D9, + 0x65AF, 0xCBB9, 0x65B0, 0xD0C2, 0x65B1, 0x94DA, 0x65B2, 0x94DB, + 0x65B3, 0x94DC, 0x65B4, 0x94DD, 0x65B5, 0x94DE, 0x65B6, 0x94DF, + 0x65B7, 0x94E0, 0x65B8, 0x94E1, 0x65B9, 0xB7BD, 0x65BA, 0x94E2, + 0x65BB, 0x94E3, 0x65BC, 0xECB6, 0x65BD, 0xCAA9, 0x65BE, 0x94E4, + 0x65BF, 0x94E5, 0x65C0, 0x94E6, 0x65C1, 0xC5D4, 0x65C2, 0x94E7, + 0x65C3, 0xECB9, 0x65C4, 0xECB8, 0x65C5, 0xC2C3, 0x65C6, 0xECB7, + 0x65C7, 0x94E8, 0x65C8, 0x94E9, 0x65C9, 0x94EA, 0x65CA, 0x94EB, + 0x65CB, 0xD0FD, 0x65CC, 0xECBA, 0x65CD, 0x94EC, 0x65CE, 0xECBB, + 0x65CF, 0xD7E5, 0x65D0, 0x94ED, 0x65D1, 0x94EE, 0x65D2, 0xECBC, + 0x65D3, 0x94EF, 0x65D4, 0x94F0, 0x65D5, 0x94F1, 0x65D6, 0xECBD, + 0x65D7, 0xC6EC, 0x65D8, 0x94F2, 0x65D9, 0x94F3, 0x65DA, 0x94F4, + 0x65DB, 0x94F5, 0x65DC, 0x94F6, 0x65DD, 0x94F7, 0x65DE, 0x94F8, + 0x65DF, 0x94F9, 0x65E0, 0xCEDE, 0x65E1, 0x94FA, 0x65E2, 0xBCC8, + 0x65E3, 0x94FB, 0x65E4, 0x94FC, 0x65E5, 0xC8D5, 0x65E6, 0xB5A9, + 0x65E7, 0xBEC9, 0x65E8, 0xD6BC, 0x65E9, 0xD4E7, 0x65EA, 0x94FD, + 0x65EB, 0x94FE, 0x65EC, 0xD1AE, 0x65ED, 0xD0F1, 0x65EE, 0xEAB8, + 0x65EF, 0xEAB9, 0x65F0, 0xEABA, 0x65F1, 0xBAB5, 0x65F2, 0x9540, + 0x65F3, 0x9541, 0x65F4, 0x9542, 0x65F5, 0x9543, 0x65F6, 0xCAB1, + 0x65F7, 0xBFF5, 0x65F8, 0x9544, 0x65F9, 0x9545, 0x65FA, 0xCDFA, + 0x65FB, 0x9546, 0x65FC, 0x9547, 0x65FD, 0x9548, 0x65FE, 0x9549, + 0x65FF, 0x954A, 0x6600, 0xEAC0, 0x6601, 0x954B, 0x6602, 0xB0BA, + 0x6603, 0xEABE, 0x6604, 0x954C, 0x6605, 0x954D, 0x6606, 0xC0A5, + 0x6607, 0x954E, 0x6608, 0x954F, 0x6609, 0x9550, 0x660A, 0xEABB, + 0x660B, 0x9551, 0x660C, 0xB2FD, 0x660D, 0x9552, 0x660E, 0xC3F7, + 0x660F, 0xBBE8, 0x6610, 0x9553, 0x6611, 0x9554, 0x6612, 0x9555, + 0x6613, 0xD2D7, 0x6614, 0xCEF4, 0x6615, 0xEABF, 0x6616, 0x9556, + 0x6617, 0x9557, 0x6618, 0x9558, 0x6619, 0xEABC, 0x661A, 0x9559, + 0x661B, 0x955A, 0x661C, 0x955B, 0x661D, 0xEAC3, 0x661E, 0x955C, + 0x661F, 0xD0C7, 0x6620, 0xD3B3, 0x6621, 0x955D, 0x6622, 0x955E, + 0x6623, 0x955F, 0x6624, 0x9560, 0x6625, 0xB4BA, 0x6626, 0x9561, + 0x6627, 0xC3C1, 0x6628, 0xD7F2, 0x6629, 0x9562, 0x662A, 0x9563, + 0x662B, 0x9564, 0x662C, 0x9565, 0x662D, 0xD5D1, 0x662E, 0x9566, + 0x662F, 0xCAC7, 0x6630, 0x9567, 0x6631, 0xEAC5, 0x6632, 0x9568, + 0x6633, 0x9569, 0x6634, 0xEAC4, 0x6635, 0xEAC7, 0x6636, 0xEAC6, + 0x6637, 0x956A, 0x6638, 0x956B, 0x6639, 0x956C, 0x663A, 0x956D, + 0x663B, 0x956E, 0x663C, 0xD6E7, 0x663D, 0x956F, 0x663E, 0xCFD4, + 0x663F, 0x9570, 0x6640, 0x9571, 0x6641, 0xEACB, 0x6642, 0x9572, + 0x6643, 0xBBCE, 0x6644, 0x9573, 0x6645, 0x9574, 0x6646, 0x9575, + 0x6647, 0x9576, 0x6648, 0x9577, 0x6649, 0x9578, 0x664A, 0x9579, + 0x664B, 0xBDFA, 0x664C, 0xC9CE, 0x664D, 0x957A, 0x664E, 0x957B, + 0x664F, 0xEACC, 0x6650, 0x957C, 0x6651, 0x957D, 0x6652, 0xC9B9, + 0x6653, 0xCFFE, 0x6654, 0xEACA, 0x6655, 0xD4CE, 0x6656, 0xEACD, + 0x6657, 0xEACF, 0x6658, 0x957E, 0x6659, 0x9580, 0x665A, 0xCDED, + 0x665B, 0x9581, 0x665C, 0x9582, 0x665D, 0x9583, 0x665E, 0x9584, + 0x665F, 0xEAC9, 0x6660, 0x9585, 0x6661, 0xEACE, 0x6662, 0x9586, + 0x6663, 0x9587, 0x6664, 0xCEEE, 0x6665, 0x9588, 0x6666, 0xBBDE, + 0x6667, 0x9589, 0x6668, 0xB3BF, 0x6669, 0x958A, 0x666A, 0x958B, + 0x666B, 0x958C, 0x666C, 0x958D, 0x666D, 0x958E, 0x666E, 0xC6D5, + 0x666F, 0xBEB0, 0x6670, 0xCEFA, 0x6671, 0x958F, 0x6672, 0x9590, + 0x6673, 0x9591, 0x6674, 0xC7E7, 0x6675, 0x9592, 0x6676, 0xBEA7, + 0x6677, 0xEAD0, 0x6678, 0x9593, 0x6679, 0x9594, 0x667A, 0xD6C7, + 0x667B, 0x9595, 0x667C, 0x9596, 0x667D, 0x9597, 0x667E, 0xC1C0, + 0x667F, 0x9598, 0x6680, 0x9599, 0x6681, 0x959A, 0x6682, 0xD4DD, + 0x6683, 0x959B, 0x6684, 0xEAD1, 0x6685, 0x959C, 0x6686, 0x959D, + 0x6687, 0xCFBE, 0x6688, 0x959E, 0x6689, 0x959F, 0x668A, 0x95A0, + 0x668B, 0x95A1, 0x668C, 0xEAD2, 0x668D, 0x95A2, 0x668E, 0x95A3, + 0x668F, 0x95A4, 0x6690, 0x95A5, 0x6691, 0xCAEE, 0x6692, 0x95A6, + 0x6693, 0x95A7, 0x6694, 0x95A8, 0x6695, 0x95A9, 0x6696, 0xC5AF, + 0x6697, 0xB0B5, 0x6698, 0x95AA, 0x6699, 0x95AB, 0x669A, 0x95AC, + 0x669B, 0x95AD, 0x669C, 0x95AE, 0x669D, 0xEAD4, 0x669E, 0x95AF, + 0x669F, 0x95B0, 0x66A0, 0x95B1, 0x66A1, 0x95B2, 0x66A2, 0x95B3, + 0x66A3, 0x95B4, 0x66A4, 0x95B5, 0x66A5, 0x95B6, 0x66A6, 0x95B7, + 0x66A7, 0xEAD3, 0x66A8, 0xF4DF, 0x66A9, 0x95B8, 0x66AA, 0x95B9, + 0x66AB, 0x95BA, 0x66AC, 0x95BB, 0x66AD, 0x95BC, 0x66AE, 0xC4BA, + 0x66AF, 0x95BD, 0x66B0, 0x95BE, 0x66B1, 0x95BF, 0x66B2, 0x95C0, + 0x66B3, 0x95C1, 0x66B4, 0xB1A9, 0x66B5, 0x95C2, 0x66B6, 0x95C3, + 0x66B7, 0x95C4, 0x66B8, 0x95C5, 0x66B9, 0xE5DF, 0x66BA, 0x95C6, + 0x66BB, 0x95C7, 0x66BC, 0x95C8, 0x66BD, 0x95C9, 0x66BE, 0xEAD5, + 0x66BF, 0x95CA, 0x66C0, 0x95CB, 0x66C1, 0x95CC, 0x66C2, 0x95CD, + 0x66C3, 0x95CE, 0x66C4, 0x95CF, 0x66C5, 0x95D0, 0x66C6, 0x95D1, + 0x66C7, 0x95D2, 0x66C8, 0x95D3, 0x66C9, 0x95D4, 0x66CA, 0x95D5, + 0x66CB, 0x95D6, 0x66CC, 0x95D7, 0x66CD, 0x95D8, 0x66CE, 0x95D9, + 0x66CF, 0x95DA, 0x66D0, 0x95DB, 0x66D1, 0x95DC, 0x66D2, 0x95DD, + 0x66D3, 0x95DE, 0x66D4, 0x95DF, 0x66D5, 0x95E0, 0x66D6, 0x95E1, + 0x66D7, 0x95E2, 0x66D8, 0x95E3, 0x66D9, 0xCAEF, 0x66DA, 0x95E4, + 0x66DB, 0xEAD6, 0x66DC, 0xEAD7, 0x66DD, 0xC6D8, 0x66DE, 0x95E5, + 0x66DF, 0x95E6, 0x66E0, 0x95E7, 0x66E1, 0x95E8, 0x66E2, 0x95E9, + 0x66E3, 0x95EA, 0x66E4, 0x95EB, 0x66E5, 0x95EC, 0x66E6, 0xEAD8, + 0x66E7, 0x95ED, 0x66E8, 0x95EE, 0x66E9, 0xEAD9, 0x66EA, 0x95EF, + 0x66EB, 0x95F0, 0x66EC, 0x95F1, 0x66ED, 0x95F2, 0x66EE, 0x95F3, + 0x66EF, 0x95F4, 0x66F0, 0xD4BB, 0x66F1, 0x95F5, 0x66F2, 0xC7FA, + 0x66F3, 0xD2B7, 0x66F4, 0xB8FC, 0x66F5, 0x95F6, 0x66F6, 0x95F7, + 0x66F7, 0xEAC2, 0x66F8, 0x95F8, 0x66F9, 0xB2DC, 0x66FA, 0x95F9, + 0x66FB, 0x95FA, 0x66FC, 0xC2FC, 0x66FD, 0x95FB, 0x66FE, 0xD4F8, + 0x66FF, 0xCCE6, 0x6700, 0xD7EE, 0x6701, 0x95FC, 0x6702, 0x95FD, + 0x6703, 0x95FE, 0x6704, 0x9640, 0x6705, 0x9641, 0x6706, 0x9642, + 0x6707, 0x9643, 0x6708, 0xD4C2, 0x6709, 0xD3D0, 0x670A, 0xEBC3, + 0x670B, 0xC5F3, 0x670C, 0x9644, 0x670D, 0xB7FE, 0x670E, 0x9645, + 0x670F, 0x9646, 0x6710, 0xEBD4, 0x6711, 0x9647, 0x6712, 0x9648, + 0x6713, 0x9649, 0x6714, 0xCBB7, 0x6715, 0xEBDE, 0x6716, 0x964A, + 0x6717, 0xC0CA, 0x6718, 0x964B, 0x6719, 0x964C, 0x671A, 0x964D, + 0x671B, 0xCDFB, 0x671C, 0x964E, 0x671D, 0xB3AF, 0x671E, 0x964F, + 0x671F, 0xC6DA, 0x6720, 0x9650, 0x6721, 0x9651, 0x6722, 0x9652, + 0x6723, 0x9653, 0x6724, 0x9654, 0x6725, 0x9655, 0x6726, 0xEBFC, + 0x6727, 0x9656, 0x6728, 0xC4BE, 0x6729, 0x9657, 0x672A, 0xCEB4, + 0x672B, 0xC4A9, 0x672C, 0xB1BE, 0x672D, 0xD4FD, 0x672E, 0x9658, + 0x672F, 0xCAF5, 0x6730, 0x9659, 0x6731, 0xD6EC, 0x6732, 0x965A, + 0x6733, 0x965B, 0x6734, 0xC6D3, 0x6735, 0xB6E4, 0x6736, 0x965C, + 0x6737, 0x965D, 0x6738, 0x965E, 0x6739, 0x965F, 0x673A, 0xBBFA, + 0x673B, 0x9660, 0x673C, 0x9661, 0x673D, 0xD0E0, 0x673E, 0x9662, + 0x673F, 0x9663, 0x6740, 0xC9B1, 0x6741, 0x9664, 0x6742, 0xD4D3, + 0x6743, 0xC8A8, 0x6744, 0x9665, 0x6745, 0x9666, 0x6746, 0xB8CB, + 0x6747, 0x9667, 0x6748, 0xE8BE, 0x6749, 0xC9BC, 0x674A, 0x9668, + 0x674B, 0x9669, 0x674C, 0xE8BB, 0x674D, 0x966A, 0x674E, 0xC0EE, + 0x674F, 0xD0D3, 0x6750, 0xB2C4, 0x6751, 0xB4E5, 0x6752, 0x966B, + 0x6753, 0xE8BC, 0x6754, 0x966C, 0x6755, 0x966D, 0x6756, 0xD5C8, + 0x6757, 0x966E, 0x6758, 0x966F, 0x6759, 0x9670, 0x675A, 0x9671, + 0x675B, 0x9672, 0x675C, 0xB6C5, 0x675D, 0x9673, 0x675E, 0xE8BD, + 0x675F, 0xCAF8, 0x6760, 0xB8DC, 0x6761, 0xCCF5, 0x6762, 0x9674, + 0x6763, 0x9675, 0x6764, 0x9676, 0x6765, 0xC0B4, 0x6766, 0x9677, + 0x6767, 0x9678, 0x6768, 0xD1EE, 0x6769, 0xE8BF, 0x676A, 0xE8C2, + 0x676B, 0x9679, 0x676C, 0x967A, 0x676D, 0xBABC, 0x676E, 0x967B, + 0x676F, 0xB1AD, 0x6770, 0xBDDC, 0x6771, 0x967C, 0x6772, 0xEABD, + 0x6773, 0xE8C3, 0x6774, 0x967D, 0x6775, 0xE8C6, 0x6776, 0x967E, + 0x6777, 0xE8CB, 0x6778, 0x9680, 0x6779, 0x9681, 0x677A, 0x9682, + 0x677B, 0x9683, 0x677C, 0xE8CC, 0x677D, 0x9684, 0x677E, 0xCBC9, + 0x677F, 0xB0E5, 0x6780, 0x9685, 0x6781, 0xBCAB, 0x6782, 0x9686, + 0x6783, 0x9687, 0x6784, 0xB9B9, 0x6785, 0x9688, 0x6786, 0x9689, + 0x6787, 0xE8C1, 0x6788, 0x968A, 0x6789, 0xCDF7, 0x678A, 0x968B, + 0x678B, 0xE8CA, 0x678C, 0x968C, 0x678D, 0x968D, 0x678E, 0x968E, + 0x678F, 0x968F, 0x6790, 0xCEF6, 0x6791, 0x9690, 0x6792, 0x9691, + 0x6793, 0x9692, 0x6794, 0x9693, 0x6795, 0xD5ED, 0x6796, 0x9694, + 0x6797, 0xC1D6, 0x6798, 0xE8C4, 0x6799, 0x9695, 0x679A, 0xC3B6, + 0x679B, 0x9696, 0x679C, 0xB9FB, 0x679D, 0xD6A6, 0x679E, 0xE8C8, + 0x679F, 0x9697, 0x67A0, 0x9698, 0x67A1, 0x9699, 0x67A2, 0xCAE0, + 0x67A3, 0xD4E6, 0x67A4, 0x969A, 0x67A5, 0xE8C0, 0x67A6, 0x969B, + 0x67A7, 0xE8C5, 0x67A8, 0xE8C7, 0x67A9, 0x969C, 0x67AA, 0xC7B9, + 0x67AB, 0xB7E3, 0x67AC, 0x969D, 0x67AD, 0xE8C9, 0x67AE, 0x969E, + 0x67AF, 0xBFDD, 0x67B0, 0xE8D2, 0x67B1, 0x969F, 0x67B2, 0x96A0, + 0x67B3, 0xE8D7, 0x67B4, 0x96A1, 0x67B5, 0xE8D5, 0x67B6, 0xBCDC, + 0x67B7, 0xBCCF, 0x67B8, 0xE8DB, 0x67B9, 0x96A2, 0x67BA, 0x96A3, + 0x67BB, 0x96A4, 0x67BC, 0x96A5, 0x67BD, 0x96A6, 0x67BE, 0x96A7, + 0x67BF, 0x96A8, 0x67C0, 0x96A9, 0x67C1, 0xE8DE, 0x67C2, 0x96AA, + 0x67C3, 0xE8DA, 0x67C4, 0xB1FA, 0x67C5, 0x96AB, 0x67C6, 0x96AC, + 0x67C7, 0x96AD, 0x67C8, 0x96AE, 0x67C9, 0x96AF, 0x67CA, 0x96B0, + 0x67CB, 0x96B1, 0x67CC, 0x96B2, 0x67CD, 0x96B3, 0x67CE, 0x96B4, + 0x67CF, 0xB0D8, 0x67D0, 0xC4B3, 0x67D1, 0xB8CC, 0x67D2, 0xC6E2, + 0x67D3, 0xC8BE, 0x67D4, 0xC8E1, 0x67D5, 0x96B5, 0x67D6, 0x96B6, + 0x67D7, 0x96B7, 0x67D8, 0xE8CF, 0x67D9, 0xE8D4, 0x67DA, 0xE8D6, + 0x67DB, 0x96B8, 0x67DC, 0xB9F1, 0x67DD, 0xE8D8, 0x67DE, 0xD7F5, + 0x67DF, 0x96B9, 0x67E0, 0xC4FB, 0x67E1, 0x96BA, 0x67E2, 0xE8DC, + 0x67E3, 0x96BB, 0x67E4, 0x96BC, 0x67E5, 0xB2E9, 0x67E6, 0x96BD, + 0x67E7, 0x96BE, 0x67E8, 0x96BF, 0x67E9, 0xE8D1, 0x67EA, 0x96C0, + 0x67EB, 0x96C1, 0x67EC, 0xBCED, 0x67ED, 0x96C2, 0x67EE, 0x96C3, + 0x67EF, 0xBFC2, 0x67F0, 0xE8CD, 0x67F1, 0xD6F9, 0x67F2, 0x96C4, + 0x67F3, 0xC1F8, 0x67F4, 0xB2F1, 0x67F5, 0x96C5, 0x67F6, 0x96C6, + 0x67F7, 0x96C7, 0x67F8, 0x96C8, 0x67F9, 0x96C9, 0x67FA, 0x96CA, + 0x67FB, 0x96CB, 0x67FC, 0x96CC, 0x67FD, 0xE8DF, 0x67FE, 0x96CD, + 0x67FF, 0xCAC1, 0x6800, 0xE8D9, 0x6801, 0x96CE, 0x6802, 0x96CF, + 0x6803, 0x96D0, 0x6804, 0x96D1, 0x6805, 0xD5A4, 0x6806, 0x96D2, + 0x6807, 0xB1EA, 0x6808, 0xD5BB, 0x6809, 0xE8CE, 0x680A, 0xE8D0, + 0x680B, 0xB6B0, 0x680C, 0xE8D3, 0x680D, 0x96D3, 0x680E, 0xE8DD, + 0x680F, 0xC0B8, 0x6810, 0x96D4, 0x6811, 0xCAF7, 0x6812, 0x96D5, + 0x6813, 0xCBA8, 0x6814, 0x96D6, 0x6815, 0x96D7, 0x6816, 0xC6DC, + 0x6817, 0xC0F5, 0x6818, 0x96D8, 0x6819, 0x96D9, 0x681A, 0x96DA, + 0x681B, 0x96DB, 0x681C, 0x96DC, 0x681D, 0xE8E9, 0x681E, 0x96DD, + 0x681F, 0x96DE, 0x6820, 0x96DF, 0x6821, 0xD0A3, 0x6822, 0x96E0, + 0x6823, 0x96E1, 0x6824, 0x96E2, 0x6825, 0x96E3, 0x6826, 0x96E4, + 0x6827, 0x96E5, 0x6828, 0x96E6, 0x6829, 0xE8F2, 0x682A, 0xD6EA, + 0x682B, 0x96E7, 0x682C, 0x96E8, 0x682D, 0x96E9, 0x682E, 0x96EA, + 0x682F, 0x96EB, 0x6830, 0x96EC, 0x6831, 0x96ED, 0x6832, 0xE8E0, + 0x6833, 0xE8E1, 0x6834, 0x96EE, 0x6835, 0x96EF, 0x6836, 0x96F0, + 0x6837, 0xD1F9, 0x6838, 0xBACB, 0x6839, 0xB8F9, 0x683A, 0x96F1, + 0x683B, 0x96F2, 0x683C, 0xB8F1, 0x683D, 0xD4D4, 0x683E, 0xE8EF, + 0x683F, 0x96F3, 0x6840, 0xE8EE, 0x6841, 0xE8EC, 0x6842, 0xB9F0, + 0x6843, 0xCCD2, 0x6844, 0xE8E6, 0x6845, 0xCEA6, 0x6846, 0xBFF2, + 0x6847, 0x96F4, 0x6848, 0xB0B8, 0x6849, 0xE8F1, 0x684A, 0xE8F0, + 0x684B, 0x96F5, 0x684C, 0xD7C0, 0x684D, 0x96F6, 0x684E, 0xE8E4, + 0x684F, 0x96F7, 0x6850, 0xCDA9, 0x6851, 0xC9A3, 0x6852, 0x96F8, + 0x6853, 0xBBB8, 0x6854, 0xBDDB, 0x6855, 0xE8EA, 0x6856, 0x96F9, + 0x6857, 0x96FA, 0x6858, 0x96FB, 0x6859, 0x96FC, 0x685A, 0x96FD, + 0x685B, 0x96FE, 0x685C, 0x9740, 0x685D, 0x9741, 0x685E, 0x9742, + 0x685F, 0x9743, 0x6860, 0xE8E2, 0x6861, 0xE8E3, 0x6862, 0xE8E5, + 0x6863, 0xB5B5, 0x6864, 0xE8E7, 0x6865, 0xC7C5, 0x6866, 0xE8EB, + 0x6867, 0xE8ED, 0x6868, 0xBDB0, 0x6869, 0xD7AE, 0x686A, 0x9744, + 0x686B, 0xE8F8, 0x686C, 0x9745, 0x686D, 0x9746, 0x686E, 0x9747, + 0x686F, 0x9748, 0x6870, 0x9749, 0x6871, 0x974A, 0x6872, 0x974B, + 0x6873, 0x974C, 0x6874, 0xE8F5, 0x6875, 0x974D, 0x6876, 0xCDB0, + 0x6877, 0xE8F6, 0x6878, 0x974E, 0x6879, 0x974F, 0x687A, 0x9750, + 0x687B, 0x9751, 0x687C, 0x9752, 0x687D, 0x9753, 0x687E, 0x9754, + 0x687F, 0x9755, 0x6880, 0x9756, 0x6881, 0xC1BA, 0x6882, 0x9757, + 0x6883, 0xE8E8, 0x6884, 0x9758, 0x6885, 0xC3B7, 0x6886, 0xB0F0, + 0x6887, 0x9759, 0x6888, 0x975A, 0x6889, 0x975B, 0x688A, 0x975C, + 0x688B, 0x975D, 0x688C, 0x975E, 0x688D, 0x975F, 0x688E, 0x9760, + 0x688F, 0xE8F4, 0x6890, 0x9761, 0x6891, 0x9762, 0x6892, 0x9763, + 0x6893, 0xE8F7, 0x6894, 0x9764, 0x6895, 0x9765, 0x6896, 0x9766, + 0x6897, 0xB9A3, 0x6898, 0x9767, 0x6899, 0x9768, 0x689A, 0x9769, + 0x689B, 0x976A, 0x689C, 0x976B, 0x689D, 0x976C, 0x689E, 0x976D, + 0x689F, 0x976E, 0x68A0, 0x976F, 0x68A1, 0x9770, 0x68A2, 0xC9D2, + 0x68A3, 0x9771, 0x68A4, 0x9772, 0x68A5, 0x9773, 0x68A6, 0xC3CE, + 0x68A7, 0xCEE0, 0x68A8, 0xC0E6, 0x68A9, 0x9774, 0x68AA, 0x9775, + 0x68AB, 0x9776, 0x68AC, 0x9777, 0x68AD, 0xCBF3, 0x68AE, 0x9778, + 0x68AF, 0xCCDD, 0x68B0, 0xD0B5, 0x68B1, 0x9779, 0x68B2, 0x977A, + 0x68B3, 0xCAE1, 0x68B4, 0x977B, 0x68B5, 0xE8F3, 0x68B6, 0x977C, + 0x68B7, 0x977D, 0x68B8, 0x977E, 0x68B9, 0x9780, 0x68BA, 0x9781, + 0x68BB, 0x9782, 0x68BC, 0x9783, 0x68BD, 0x9784, 0x68BE, 0x9785, + 0x68BF, 0x9786, 0x68C0, 0xBCEC, 0x68C1, 0x9787, 0x68C2, 0xE8F9, + 0x68C3, 0x9788, 0x68C4, 0x9789, 0x68C5, 0x978A, 0x68C6, 0x978B, + 0x68C7, 0x978C, 0x68C8, 0x978D, 0x68C9, 0xC3DE, 0x68CA, 0x978E, + 0x68CB, 0xC6E5, 0x68CC, 0x978F, 0x68CD, 0xB9F7, 0x68CE, 0x9790, + 0x68CF, 0x9791, 0x68D0, 0x9792, 0x68D1, 0x9793, 0x68D2, 0xB0F4, + 0x68D3, 0x9794, 0x68D4, 0x9795, 0x68D5, 0xD7D8, 0x68D6, 0x9796, + 0x68D7, 0x9797, 0x68D8, 0xBCAC, 0x68D9, 0x9798, 0x68DA, 0xC5EF, + 0x68DB, 0x9799, 0x68DC, 0x979A, 0x68DD, 0x979B, 0x68DE, 0x979C, + 0x68DF, 0x979D, 0x68E0, 0xCCC4, 0x68E1, 0x979E, 0x68E2, 0x979F, + 0x68E3, 0xE9A6, 0x68E4, 0x97A0, 0x68E5, 0x97A1, 0x68E6, 0x97A2, + 0x68E7, 0x97A3, 0x68E8, 0x97A4, 0x68E9, 0x97A5, 0x68EA, 0x97A6, + 0x68EB, 0x97A7, 0x68EC, 0x97A8, 0x68ED, 0x97A9, 0x68EE, 0xC9AD, + 0x68EF, 0x97AA, 0x68F0, 0xE9A2, 0x68F1, 0xC0E2, 0x68F2, 0x97AB, + 0x68F3, 0x97AC, 0x68F4, 0x97AD, 0x68F5, 0xBFC3, 0x68F6, 0x97AE, + 0x68F7, 0x97AF, 0x68F8, 0x97B0, 0x68F9, 0xE8FE, 0x68FA, 0xB9D7, + 0x68FB, 0x97B1, 0x68FC, 0xE8FB, 0x68FD, 0x97B2, 0x68FE, 0x97B3, + 0x68FF, 0x97B4, 0x6900, 0x97B5, 0x6901, 0xE9A4, 0x6902, 0x97B6, + 0x6903, 0x97B7, 0x6904, 0x97B8, 0x6905, 0xD2CE, 0x6906, 0x97B9, + 0x6907, 0x97BA, 0x6908, 0x97BB, 0x6909, 0x97BC, 0x690A, 0x97BD, + 0x690B, 0xE9A3, 0x690C, 0x97BE, 0x690D, 0xD6B2, 0x690E, 0xD7B5, + 0x690F, 0x97BF, 0x6910, 0xE9A7, 0x6911, 0x97C0, 0x6912, 0xBDB7, + 0x6913, 0x97C1, 0x6914, 0x97C2, 0x6915, 0x97C3, 0x6916, 0x97C4, + 0x6917, 0x97C5, 0x6918, 0x97C6, 0x6919, 0x97C7, 0x691A, 0x97C8, + 0x691B, 0x97C9, 0x691C, 0x97CA, 0x691D, 0x97CB, 0x691E, 0x97CC, + 0x691F, 0xE8FC, 0x6920, 0xE8FD, 0x6921, 0x97CD, 0x6922, 0x97CE, + 0x6923, 0x97CF, 0x6924, 0xE9A1, 0x6925, 0x97D0, 0x6926, 0x97D1, + 0x6927, 0x97D2, 0x6928, 0x97D3, 0x6929, 0x97D4, 0x692A, 0x97D5, + 0x692B, 0x97D6, 0x692C, 0x97D7, 0x692D, 0xCDD6, 0x692E, 0x97D8, + 0x692F, 0x97D9, 0x6930, 0xD2AC, 0x6931, 0x97DA, 0x6932, 0x97DB, + 0x6933, 0x97DC, 0x6934, 0xE9B2, 0x6935, 0x97DD, 0x6936, 0x97DE, + 0x6937, 0x97DF, 0x6938, 0x97E0, 0x6939, 0xE9A9, 0x693A, 0x97E1, + 0x693B, 0x97E2, 0x693C, 0x97E3, 0x693D, 0xB4AA, 0x693E, 0x97E4, + 0x693F, 0xB4BB, 0x6940, 0x97E5, 0x6941, 0x97E6, 0x6942, 0xE9AB, + 0x6943, 0x97E7, 0x6944, 0x97E8, 0x6945, 0x97E9, 0x6946, 0x97EA, + 0x6947, 0x97EB, 0x6948, 0x97EC, 0x6949, 0x97ED, 0x694A, 0x97EE, + 0x694B, 0x97EF, 0x694C, 0x97F0, 0x694D, 0x97F1, 0x694E, 0x97F2, + 0x694F, 0x97F3, 0x6950, 0x97F4, 0x6951, 0x97F5, 0x6952, 0x97F6, + 0x6953, 0x97F7, 0x6954, 0xD0A8, 0x6955, 0x97F8, 0x6956, 0x97F9, + 0x6957, 0xE9A5, 0x6958, 0x97FA, 0x6959, 0x97FB, 0x695A, 0xB3FE, + 0x695B, 0x97FC, 0x695C, 0x97FD, 0x695D, 0xE9AC, 0x695E, 0xC0E3, + 0x695F, 0x97FE, 0x6960, 0xE9AA, 0x6961, 0x9840, 0x6962, 0x9841, + 0x6963, 0xE9B9, 0x6964, 0x9842, 0x6965, 0x9843, 0x6966, 0xE9B8, + 0x6967, 0x9844, 0x6968, 0x9845, 0x6969, 0x9846, 0x696A, 0x9847, + 0x696B, 0xE9AE, 0x696C, 0x9848, 0x696D, 0x9849, 0x696E, 0xE8FA, + 0x696F, 0x984A, 0x6970, 0x984B, 0x6971, 0xE9A8, 0x6972, 0x984C, + 0x6973, 0x984D, 0x6974, 0x984E, 0x6975, 0x984F, 0x6976, 0x9850, + 0x6977, 0xBFAC, 0x6978, 0xE9B1, 0x6979, 0xE9BA, 0x697A, 0x9851, + 0x697B, 0x9852, 0x697C, 0xC2A5, 0x697D, 0x9853, 0x697E, 0x9854, + 0x697F, 0x9855, 0x6980, 0xE9AF, 0x6981, 0x9856, 0x6982, 0xB8C5, + 0x6983, 0x9857, 0x6984, 0xE9AD, 0x6985, 0x9858, 0x6986, 0xD3DC, + 0x6987, 0xE9B4, 0x6988, 0xE9B5, 0x6989, 0xE9B7, 0x698A, 0x9859, + 0x698B, 0x985A, 0x698C, 0x985B, 0x698D, 0xE9C7, 0x698E, 0x985C, + 0x698F, 0x985D, 0x6990, 0x985E, 0x6991, 0x985F, 0x6992, 0x9860, + 0x6993, 0x9861, 0x6994, 0xC0C6, 0x6995, 0xE9C5, 0x6996, 0x9862, + 0x6997, 0x9863, 0x6998, 0xE9B0, 0x6999, 0x9864, 0x699A, 0x9865, + 0x699B, 0xE9BB, 0x699C, 0xB0F1, 0x699D, 0x9866, 0x699E, 0x9867, + 0x699F, 0x9868, 0x69A0, 0x9869, 0x69A1, 0x986A, 0x69A2, 0x986B, + 0x69A3, 0x986C, 0x69A4, 0x986D, 0x69A5, 0x986E, 0x69A6, 0x986F, + 0x69A7, 0xE9BC, 0x69A8, 0xD5A5, 0x69A9, 0x9870, 0x69AA, 0x9871, + 0x69AB, 0xE9BE, 0x69AC, 0x9872, 0x69AD, 0xE9BF, 0x69AE, 0x9873, + 0x69AF, 0x9874, 0x69B0, 0x9875, 0x69B1, 0xE9C1, 0x69B2, 0x9876, + 0x69B3, 0x9877, 0x69B4, 0xC1F1, 0x69B5, 0x9878, 0x69B6, 0x9879, + 0x69B7, 0xC8B6, 0x69B8, 0x987A, 0x69B9, 0x987B, 0x69BA, 0x987C, + 0x69BB, 0xE9BD, 0x69BC, 0x987D, 0x69BD, 0x987E, 0x69BE, 0x9880, + 0x69BF, 0x9881, 0x69C0, 0x9882, 0x69C1, 0xE9C2, 0x69C2, 0x9883, + 0x69C3, 0x9884, 0x69C4, 0x9885, 0x69C5, 0x9886, 0x69C6, 0x9887, + 0x69C7, 0x9888, 0x69C8, 0x9889, 0x69C9, 0x988A, 0x69CA, 0xE9C3, + 0x69CB, 0x988B, 0x69CC, 0xE9B3, 0x69CD, 0x988C, 0x69CE, 0xE9B6, + 0x69CF, 0x988D, 0x69D0, 0xBBB1, 0x69D1, 0x988E, 0x69D2, 0x988F, + 0x69D3, 0x9890, 0x69D4, 0xE9C0, 0x69D5, 0x9891, 0x69D6, 0x9892, + 0x69D7, 0x9893, 0x69D8, 0x9894, 0x69D9, 0x9895, 0x69DA, 0x9896, + 0x69DB, 0xBCF7, 0x69DC, 0x9897, 0x69DD, 0x9898, 0x69DE, 0x9899, + 0x69DF, 0xE9C4, 0x69E0, 0xE9C6, 0x69E1, 0x989A, 0x69E2, 0x989B, + 0x69E3, 0x989C, 0x69E4, 0x989D, 0x69E5, 0x989E, 0x69E6, 0x989F, + 0x69E7, 0x98A0, 0x69E8, 0x98A1, 0x69E9, 0x98A2, 0x69EA, 0x98A3, + 0x69EB, 0x98A4, 0x69EC, 0x98A5, 0x69ED, 0xE9CA, 0x69EE, 0x98A6, + 0x69EF, 0x98A7, 0x69F0, 0x98A8, 0x69F1, 0x98A9, 0x69F2, 0xE9CE, + 0x69F3, 0x98AA, 0x69F4, 0x98AB, 0x69F5, 0x98AC, 0x69F6, 0x98AD, + 0x69F7, 0x98AE, 0x69F8, 0x98AF, 0x69F9, 0x98B0, 0x69FA, 0x98B1, + 0x69FB, 0x98B2, 0x69FC, 0x98B3, 0x69FD, 0xB2DB, 0x69FE, 0x98B4, + 0x69FF, 0xE9C8, 0x6A00, 0x98B5, 0x6A01, 0x98B6, 0x6A02, 0x98B7, + 0x6A03, 0x98B8, 0x6A04, 0x98B9, 0x6A05, 0x98BA, 0x6A06, 0x98BB, + 0x6A07, 0x98BC, 0x6A08, 0x98BD, 0x6A09, 0x98BE, 0x6A0A, 0xB7AE, + 0x6A0B, 0x98BF, 0x6A0C, 0x98C0, 0x6A0D, 0x98C1, 0x6A0E, 0x98C2, + 0x6A0F, 0x98C3, 0x6A10, 0x98C4, 0x6A11, 0x98C5, 0x6A12, 0x98C6, + 0x6A13, 0x98C7, 0x6A14, 0x98C8, 0x6A15, 0x98C9, 0x6A16, 0x98CA, + 0x6A17, 0xE9CB, 0x6A18, 0xE9CC, 0x6A19, 0x98CB, 0x6A1A, 0x98CC, + 0x6A1B, 0x98CD, 0x6A1C, 0x98CE, 0x6A1D, 0x98CF, 0x6A1E, 0x98D0, + 0x6A1F, 0xD5C1, 0x6A20, 0x98D1, 0x6A21, 0xC4A3, 0x6A22, 0x98D2, + 0x6A23, 0x98D3, 0x6A24, 0x98D4, 0x6A25, 0x98D5, 0x6A26, 0x98D6, + 0x6A27, 0x98D7, 0x6A28, 0xE9D8, 0x6A29, 0x98D8, 0x6A2A, 0xBAE1, + 0x6A2B, 0x98D9, 0x6A2C, 0x98DA, 0x6A2D, 0x98DB, 0x6A2E, 0x98DC, + 0x6A2F, 0xE9C9, 0x6A30, 0x98DD, 0x6A31, 0xD3A3, 0x6A32, 0x98DE, + 0x6A33, 0x98DF, 0x6A34, 0x98E0, 0x6A35, 0xE9D4, 0x6A36, 0x98E1, + 0x6A37, 0x98E2, 0x6A38, 0x98E3, 0x6A39, 0x98E4, 0x6A3A, 0x98E5, + 0x6A3B, 0x98E6, 0x6A3C, 0x98E7, 0x6A3D, 0xE9D7, 0x6A3E, 0xE9D0, + 0x6A3F, 0x98E8, 0x6A40, 0x98E9, 0x6A41, 0x98EA, 0x6A42, 0x98EB, + 0x6A43, 0x98EC, 0x6A44, 0xE9CF, 0x6A45, 0x98ED, 0x6A46, 0x98EE, + 0x6A47, 0xC7C1, 0x6A48, 0x98EF, 0x6A49, 0x98F0, 0x6A4A, 0x98F1, + 0x6A4B, 0x98F2, 0x6A4C, 0x98F3, 0x6A4D, 0x98F4, 0x6A4E, 0x98F5, + 0x6A4F, 0x98F6, 0x6A50, 0xE9D2, 0x6A51, 0x98F7, 0x6A52, 0x98F8, + 0x6A53, 0x98F9, 0x6A54, 0x98FA, 0x6A55, 0x98FB, 0x6A56, 0x98FC, + 0x6A57, 0x98FD, 0x6A58, 0xE9D9, 0x6A59, 0xB3C8, 0x6A5A, 0x98FE, + 0x6A5B, 0xE9D3, 0x6A5C, 0x9940, 0x6A5D, 0x9941, 0x6A5E, 0x9942, + 0x6A5F, 0x9943, 0x6A60, 0x9944, 0x6A61, 0xCFF0, 0x6A62, 0x9945, + 0x6A63, 0x9946, 0x6A64, 0x9947, 0x6A65, 0xE9CD, 0x6A66, 0x9948, + 0x6A67, 0x9949, 0x6A68, 0x994A, 0x6A69, 0x994B, 0x6A6A, 0x994C, + 0x6A6B, 0x994D, 0x6A6C, 0x994E, 0x6A6D, 0x994F, 0x6A6E, 0x9950, + 0x6A6F, 0x9951, 0x6A70, 0x9952, 0x6A71, 0xB3F7, 0x6A72, 0x9953, + 0x6A73, 0x9954, 0x6A74, 0x9955, 0x6A75, 0x9956, 0x6A76, 0x9957, + 0x6A77, 0x9958, 0x6A78, 0x9959, 0x6A79, 0xE9D6, 0x6A7A, 0x995A, + 0x6A7B, 0x995B, 0x6A7C, 0xE9DA, 0x6A7D, 0x995C, 0x6A7E, 0x995D, + 0x6A7F, 0x995E, 0x6A80, 0xCCB4, 0x6A81, 0x995F, 0x6A82, 0x9960, + 0x6A83, 0x9961, 0x6A84, 0xCFAD, 0x6A85, 0x9962, 0x6A86, 0x9963, + 0x6A87, 0x9964, 0x6A88, 0x9965, 0x6A89, 0x9966, 0x6A8A, 0x9967, + 0x6A8B, 0x9968, 0x6A8C, 0x9969, 0x6A8D, 0x996A, 0x6A8E, 0xE9D5, + 0x6A8F, 0x996B, 0x6A90, 0xE9DC, 0x6A91, 0xE9DB, 0x6A92, 0x996C, + 0x6A93, 0x996D, 0x6A94, 0x996E, 0x6A95, 0x996F, 0x6A96, 0x9970, + 0x6A97, 0xE9DE, 0x6A98, 0x9971, 0x6A99, 0x9972, 0x6A9A, 0x9973, + 0x6A9B, 0x9974, 0x6A9C, 0x9975, 0x6A9D, 0x9976, 0x6A9E, 0x9977, + 0x6A9F, 0x9978, 0x6AA0, 0xE9D1, 0x6AA1, 0x9979, 0x6AA2, 0x997A, + 0x6AA3, 0x997B, 0x6AA4, 0x997C, 0x6AA5, 0x997D, 0x6AA6, 0x997E, + 0x6AA7, 0x9980, 0x6AA8, 0x9981, 0x6AA9, 0xE9DD, 0x6AAA, 0x9982, + 0x6AAB, 0xE9DF, 0x6AAC, 0xC3CA, 0x6AAD, 0x9983, 0x6AAE, 0x9984, + 0x6AAF, 0x9985, 0x6AB0, 0x9986, 0x6AB1, 0x9987, 0x6AB2, 0x9988, + 0x6AB3, 0x9989, 0x6AB4, 0x998A, 0x6AB5, 0x998B, 0x6AB6, 0x998C, + 0x6AB7, 0x998D, 0x6AB8, 0x998E, 0x6AB9, 0x998F, 0x6ABA, 0x9990, + 0x6ABB, 0x9991, 0x6ABC, 0x9992, 0x6ABD, 0x9993, 0x6ABE, 0x9994, + 0x6ABF, 0x9995, 0x6AC0, 0x9996, 0x6AC1, 0x9997, 0x6AC2, 0x9998, + 0x6AC3, 0x9999, 0x6AC4, 0x999A, 0x6AC5, 0x999B, 0x6AC6, 0x999C, + 0x6AC7, 0x999D, 0x6AC8, 0x999E, 0x6AC9, 0x999F, 0x6ACA, 0x99A0, + 0x6ACB, 0x99A1, 0x6ACC, 0x99A2, 0x6ACD, 0x99A3, 0x6ACE, 0x99A4, + 0x6ACF, 0x99A5, 0x6AD0, 0x99A6, 0x6AD1, 0x99A7, 0x6AD2, 0x99A8, + 0x6AD3, 0x99A9, 0x6AD4, 0x99AA, 0x6AD5, 0x99AB, 0x6AD6, 0x99AC, + 0x6AD7, 0x99AD, 0x6AD8, 0x99AE, 0x6AD9, 0x99AF, 0x6ADA, 0x99B0, + 0x6ADB, 0x99B1, 0x6ADC, 0x99B2, 0x6ADD, 0x99B3, 0x6ADE, 0x99B4, + 0x6ADF, 0x99B5, 0x6AE0, 0x99B6, 0x6AE1, 0x99B7, 0x6AE2, 0x99B8, + 0x6AE3, 0x99B9, 0x6AE4, 0x99BA, 0x6AE5, 0x99BB, 0x6AE6, 0x99BC, + 0x6AE7, 0x99BD, 0x6AE8, 0x99BE, 0x6AE9, 0x99BF, 0x6AEA, 0x99C0, + 0x6AEB, 0x99C1, 0x6AEC, 0x99C2, 0x6AED, 0x99C3, 0x6AEE, 0x99C4, + 0x6AEF, 0x99C5, 0x6AF0, 0x99C6, 0x6AF1, 0x99C7, 0x6AF2, 0x99C8, + 0x6AF3, 0x99C9, 0x6AF4, 0x99CA, 0x6AF5, 0x99CB, 0x6AF6, 0x99CC, + 0x6AF7, 0x99CD, 0x6AF8, 0x99CE, 0x6AF9, 0x99CF, 0x6AFA, 0x99D0, + 0x6AFB, 0x99D1, 0x6AFC, 0x99D2, 0x6AFD, 0x99D3, 0x6AFE, 0x99D4, + 0x6AFF, 0x99D5, 0x6B00, 0x99D6, 0x6B01, 0x99D7, 0x6B02, 0x99D8, + 0x6B03, 0x99D9, 0x6B04, 0x99DA, 0x6B05, 0x99DB, 0x6B06, 0x99DC, + 0x6B07, 0x99DD, 0x6B08, 0x99DE, 0x6B09, 0x99DF, 0x6B0A, 0x99E0, + 0x6B0B, 0x99E1, 0x6B0C, 0x99E2, 0x6B0D, 0x99E3, 0x6B0E, 0x99E4, + 0x6B0F, 0x99E5, 0x6B10, 0x99E6, 0x6B11, 0x99E7, 0x6B12, 0x99E8, + 0x6B13, 0x99E9, 0x6B14, 0x99EA, 0x6B15, 0x99EB, 0x6B16, 0x99EC, + 0x6B17, 0x99ED, 0x6B18, 0x99EE, 0x6B19, 0x99EF, 0x6B1A, 0x99F0, + 0x6B1B, 0x99F1, 0x6B1C, 0x99F2, 0x6B1D, 0x99F3, 0x6B1E, 0x99F4, + 0x6B1F, 0x99F5, 0x6B20, 0xC7B7, 0x6B21, 0xB4CE, 0x6B22, 0xBBB6, + 0x6B23, 0xD0C0, 0x6B24, 0xECA3, 0x6B25, 0x99F6, 0x6B26, 0x99F7, + 0x6B27, 0xC5B7, 0x6B28, 0x99F8, 0x6B29, 0x99F9, 0x6B2A, 0x99FA, + 0x6B2B, 0x99FB, 0x6B2C, 0x99FC, 0x6B2D, 0x99FD, 0x6B2E, 0x99FE, + 0x6B2F, 0x9A40, 0x6B30, 0x9A41, 0x6B31, 0x9A42, 0x6B32, 0xD3FB, + 0x6B33, 0x9A43, 0x6B34, 0x9A44, 0x6B35, 0x9A45, 0x6B36, 0x9A46, + 0x6B37, 0xECA4, 0x6B38, 0x9A47, 0x6B39, 0xECA5, 0x6B3A, 0xC6DB, + 0x6B3B, 0x9A48, 0x6B3C, 0x9A49, 0x6B3D, 0x9A4A, 0x6B3E, 0xBFEE, + 0x6B3F, 0x9A4B, 0x6B40, 0x9A4C, 0x6B41, 0x9A4D, 0x6B42, 0x9A4E, + 0x6B43, 0xECA6, 0x6B44, 0x9A4F, 0x6B45, 0x9A50, 0x6B46, 0xECA7, + 0x6B47, 0xD0AA, 0x6B48, 0x9A51, 0x6B49, 0xC7B8, 0x6B4A, 0x9A52, + 0x6B4B, 0x9A53, 0x6B4C, 0xB8E8, 0x6B4D, 0x9A54, 0x6B4E, 0x9A55, + 0x6B4F, 0x9A56, 0x6B50, 0x9A57, 0x6B51, 0x9A58, 0x6B52, 0x9A59, + 0x6B53, 0x9A5A, 0x6B54, 0x9A5B, 0x6B55, 0x9A5C, 0x6B56, 0x9A5D, + 0x6B57, 0x9A5E, 0x6B58, 0x9A5F, 0x6B59, 0xECA8, 0x6B5A, 0x9A60, + 0x6B5B, 0x9A61, 0x6B5C, 0x9A62, 0x6B5D, 0x9A63, 0x6B5E, 0x9A64, + 0x6B5F, 0x9A65, 0x6B60, 0x9A66, 0x6B61, 0x9A67, 0x6B62, 0xD6B9, + 0x6B63, 0xD5FD, 0x6B64, 0xB4CB, 0x6B65, 0xB2BD, 0x6B66, 0xCEE4, + 0x6B67, 0xC6E7, 0x6B68, 0x9A68, 0x6B69, 0x9A69, 0x6B6A, 0xCDE1, + 0x6B6B, 0x9A6A, 0x6B6C, 0x9A6B, 0x6B6D, 0x9A6C, 0x6B6E, 0x9A6D, + 0x6B6F, 0x9A6E, 0x6B70, 0x9A6F, 0x6B71, 0x9A70, 0x6B72, 0x9A71, + 0x6B73, 0x9A72, 0x6B74, 0x9A73, 0x6B75, 0x9A74, 0x6B76, 0x9A75, + 0x6B77, 0x9A76, 0x6B78, 0x9A77, 0x6B79, 0xB4F5, 0x6B7A, 0x9A78, + 0x6B7B, 0xCBC0, 0x6B7C, 0xBCDF, 0x6B7D, 0x9A79, 0x6B7E, 0x9A7A, + 0x6B7F, 0x9A7B, 0x6B80, 0x9A7C, 0x6B81, 0xE9E2, 0x6B82, 0xE9E3, + 0x6B83, 0xD1EA, 0x6B84, 0xE9E5, 0x6B85, 0x9A7D, 0x6B86, 0xB4F9, + 0x6B87, 0xE9E4, 0x6B88, 0x9A7E, 0x6B89, 0xD1B3, 0x6B8A, 0xCAE2, + 0x6B8B, 0xB2D0, 0x6B8C, 0x9A80, 0x6B8D, 0xE9E8, 0x6B8E, 0x9A81, + 0x6B8F, 0x9A82, 0x6B90, 0x9A83, 0x6B91, 0x9A84, 0x6B92, 0xE9E6, + 0x6B93, 0xE9E7, 0x6B94, 0x9A85, 0x6B95, 0x9A86, 0x6B96, 0xD6B3, + 0x6B97, 0x9A87, 0x6B98, 0x9A88, 0x6B99, 0x9A89, 0x6B9A, 0xE9E9, + 0x6B9B, 0xE9EA, 0x6B9C, 0x9A8A, 0x6B9D, 0x9A8B, 0x6B9E, 0x9A8C, + 0x6B9F, 0x9A8D, 0x6BA0, 0x9A8E, 0x6BA1, 0xE9EB, 0x6BA2, 0x9A8F, + 0x6BA3, 0x9A90, 0x6BA4, 0x9A91, 0x6BA5, 0x9A92, 0x6BA6, 0x9A93, + 0x6BA7, 0x9A94, 0x6BA8, 0x9A95, 0x6BA9, 0x9A96, 0x6BAA, 0xE9EC, + 0x6BAB, 0x9A97, 0x6BAC, 0x9A98, 0x6BAD, 0x9A99, 0x6BAE, 0x9A9A, + 0x6BAF, 0x9A9B, 0x6BB0, 0x9A9C, 0x6BB1, 0x9A9D, 0x6BB2, 0x9A9E, + 0x6BB3, 0xECAF, 0x6BB4, 0xC5B9, 0x6BB5, 0xB6CE, 0x6BB6, 0x9A9F, + 0x6BB7, 0xD2F3, 0x6BB8, 0x9AA0, 0x6BB9, 0x9AA1, 0x6BBA, 0x9AA2, + 0x6BBB, 0x9AA3, 0x6BBC, 0x9AA4, 0x6BBD, 0x9AA5, 0x6BBE, 0x9AA6, + 0x6BBF, 0xB5EE, 0x6BC0, 0x9AA7, 0x6BC1, 0xBBD9, 0x6BC2, 0xECB1, + 0x6BC3, 0x9AA8, 0x6BC4, 0x9AA9, 0x6BC5, 0xD2E3, 0x6BC6, 0x9AAA, + 0x6BC7, 0x9AAB, 0x6BC8, 0x9AAC, 0x6BC9, 0x9AAD, 0x6BCA, 0x9AAE, + 0x6BCB, 0xCEE3, 0x6BCC, 0x9AAF, 0x6BCD, 0xC4B8, 0x6BCE, 0x9AB0, + 0x6BCF, 0xC3BF, 0x6BD0, 0x9AB1, 0x6BD1, 0x9AB2, 0x6BD2, 0xB6BE, + 0x6BD3, 0xD8B9, 0x6BD4, 0xB1C8, 0x6BD5, 0xB1CF, 0x6BD6, 0xB1D1, + 0x6BD7, 0xC5FE, 0x6BD8, 0x9AB3, 0x6BD9, 0xB1D0, 0x6BDA, 0x9AB4, + 0x6BDB, 0xC3AB, 0x6BDC, 0x9AB5, 0x6BDD, 0x9AB6, 0x6BDE, 0x9AB7, + 0x6BDF, 0x9AB8, 0x6BE0, 0x9AB9, 0x6BE1, 0xD5B1, 0x6BE2, 0x9ABA, + 0x6BE3, 0x9ABB, 0x6BE4, 0x9ABC, 0x6BE5, 0x9ABD, 0x6BE6, 0x9ABE, + 0x6BE7, 0x9ABF, 0x6BE8, 0x9AC0, 0x6BE9, 0x9AC1, 0x6BEA, 0xEBA4, + 0x6BEB, 0xBAC1, 0x6BEC, 0x9AC2, 0x6BED, 0x9AC3, 0x6BEE, 0x9AC4, + 0x6BEF, 0xCCBA, 0x6BF0, 0x9AC5, 0x6BF1, 0x9AC6, 0x6BF2, 0x9AC7, + 0x6BF3, 0xEBA5, 0x6BF4, 0x9AC8, 0x6BF5, 0xEBA7, 0x6BF6, 0x9AC9, + 0x6BF7, 0x9ACA, 0x6BF8, 0x9ACB, 0x6BF9, 0xEBA8, 0x6BFA, 0x9ACC, + 0x6BFB, 0x9ACD, 0x6BFC, 0x9ACE, 0x6BFD, 0xEBA6, 0x6BFE, 0x9ACF, + 0x6BFF, 0x9AD0, 0x6C00, 0x9AD1, 0x6C01, 0x9AD2, 0x6C02, 0x9AD3, + 0x6C03, 0x9AD4, 0x6C04, 0x9AD5, 0x6C05, 0xEBA9, 0x6C06, 0xEBAB, + 0x6C07, 0xEBAA, 0x6C08, 0x9AD6, 0x6C09, 0x9AD7, 0x6C0A, 0x9AD8, + 0x6C0B, 0x9AD9, 0x6C0C, 0x9ADA, 0x6C0D, 0xEBAC, 0x6C0E, 0x9ADB, + 0x6C0F, 0xCACF, 0x6C10, 0xD8B5, 0x6C11, 0xC3F1, 0x6C12, 0x9ADC, + 0x6C13, 0xC3A5, 0x6C14, 0xC6F8, 0x6C15, 0xEBAD, 0x6C16, 0xC4CA, + 0x6C17, 0x9ADD, 0x6C18, 0xEBAE, 0x6C19, 0xEBAF, 0x6C1A, 0xEBB0, + 0x6C1B, 0xB7D5, 0x6C1C, 0x9ADE, 0x6C1D, 0x9ADF, 0x6C1E, 0x9AE0, + 0x6C1F, 0xB7FA, 0x6C20, 0x9AE1, 0x6C21, 0xEBB1, 0x6C22, 0xC7E2, + 0x6C23, 0x9AE2, 0x6C24, 0xEBB3, 0x6C25, 0x9AE3, 0x6C26, 0xBAA4, + 0x6C27, 0xD1F5, 0x6C28, 0xB0B1, 0x6C29, 0xEBB2, 0x6C2A, 0xEBB4, + 0x6C2B, 0x9AE4, 0x6C2C, 0x9AE5, 0x6C2D, 0x9AE6, 0x6C2E, 0xB5AA, + 0x6C2F, 0xC2C8, 0x6C30, 0xC7E8, 0x6C31, 0x9AE7, 0x6C32, 0xEBB5, + 0x6C33, 0x9AE8, 0x6C34, 0xCBAE, 0x6C35, 0xE3DF, 0x6C36, 0x9AE9, + 0x6C37, 0x9AEA, 0x6C38, 0xD3C0, 0x6C39, 0x9AEB, 0x6C3A, 0x9AEC, + 0x6C3B, 0x9AED, 0x6C3C, 0x9AEE, 0x6C3D, 0xD9DB, 0x6C3E, 0x9AEF, + 0x6C3F, 0x9AF0, 0x6C40, 0xCDA1, 0x6C41, 0xD6AD, 0x6C42, 0xC7F3, + 0x6C43, 0x9AF1, 0x6C44, 0x9AF2, 0x6C45, 0x9AF3, 0x6C46, 0xD9E0, + 0x6C47, 0xBBE3, 0x6C48, 0x9AF4, 0x6C49, 0xBABA, 0x6C4A, 0xE3E2, + 0x6C4B, 0x9AF5, 0x6C4C, 0x9AF6, 0x6C4D, 0x9AF7, 0x6C4E, 0x9AF8, + 0x6C4F, 0x9AF9, 0x6C50, 0xCFAB, 0x6C51, 0x9AFA, 0x6C52, 0x9AFB, + 0x6C53, 0x9AFC, 0x6C54, 0xE3E0, 0x6C55, 0xC9C7, 0x6C56, 0x9AFD, + 0x6C57, 0xBAB9, 0x6C58, 0x9AFE, 0x6C59, 0x9B40, 0x6C5A, 0x9B41, + 0x6C5B, 0xD1B4, 0x6C5C, 0xE3E1, 0x6C5D, 0xC8EA, 0x6C5E, 0xB9AF, + 0x6C5F, 0xBDAD, 0x6C60, 0xB3D8, 0x6C61, 0xCEDB, 0x6C62, 0x9B42, + 0x6C63, 0x9B43, 0x6C64, 0xCCC0, 0x6C65, 0x9B44, 0x6C66, 0x9B45, + 0x6C67, 0x9B46, 0x6C68, 0xE3E8, 0x6C69, 0xE3E9, 0x6C6A, 0xCDF4, + 0x6C6B, 0x9B47, 0x6C6C, 0x9B48, 0x6C6D, 0x9B49, 0x6C6E, 0x9B4A, + 0x6C6F, 0x9B4B, 0x6C70, 0xCCAD, 0x6C71, 0x9B4C, 0x6C72, 0xBCB3, + 0x6C73, 0x9B4D, 0x6C74, 0xE3EA, 0x6C75, 0x9B4E, 0x6C76, 0xE3EB, + 0x6C77, 0x9B4F, 0x6C78, 0x9B50, 0x6C79, 0xD0DA, 0x6C7A, 0x9B51, + 0x6C7B, 0x9B52, 0x6C7C, 0x9B53, 0x6C7D, 0xC6FB, 0x6C7E, 0xB7DA, + 0x6C7F, 0x9B54, 0x6C80, 0x9B55, 0x6C81, 0xC7DF, 0x6C82, 0xD2CA, + 0x6C83, 0xCED6, 0x6C84, 0x9B56, 0x6C85, 0xE3E4, 0x6C86, 0xE3EC, + 0x6C87, 0x9B57, 0x6C88, 0xC9F2, 0x6C89, 0xB3C1, 0x6C8A, 0x9B58, + 0x6C8B, 0x9B59, 0x6C8C, 0xE3E7, 0x6C8D, 0x9B5A, 0x6C8E, 0x9B5B, + 0x6C8F, 0xC6E3, 0x6C90, 0xE3E5, 0x6C91, 0x9B5C, 0x6C92, 0x9B5D, + 0x6C93, 0xEDB3, 0x6C94, 0xE3E6, 0x6C95, 0x9B5E, 0x6C96, 0x9B5F, + 0x6C97, 0x9B60, 0x6C98, 0x9B61, 0x6C99, 0xC9B3, 0x6C9A, 0x9B62, + 0x6C9B, 0xC5E6, 0x6C9C, 0x9B63, 0x6C9D, 0x9B64, 0x6C9E, 0x9B65, + 0x6C9F, 0xB9B5, 0x6CA0, 0x9B66, 0x6CA1, 0xC3BB, 0x6CA2, 0x9B67, + 0x6CA3, 0xE3E3, 0x6CA4, 0xC5BD, 0x6CA5, 0xC1A4, 0x6CA6, 0xC2D9, + 0x6CA7, 0xB2D7, 0x6CA8, 0x9B68, 0x6CA9, 0xE3ED, 0x6CAA, 0xBBA6, + 0x6CAB, 0xC4AD, 0x6CAC, 0x9B69, 0x6CAD, 0xE3F0, 0x6CAE, 0xBEDA, + 0x6CAF, 0x9B6A, 0x6CB0, 0x9B6B, 0x6CB1, 0xE3FB, 0x6CB2, 0xE3F5, + 0x6CB3, 0xBAD3, 0x6CB4, 0x9B6C, 0x6CB5, 0x9B6D, 0x6CB6, 0x9B6E, + 0x6CB7, 0x9B6F, 0x6CB8, 0xB7D0, 0x6CB9, 0xD3CD, 0x6CBA, 0x9B70, + 0x6CBB, 0xD6CE, 0x6CBC, 0xD5D3, 0x6CBD, 0xB9C1, 0x6CBE, 0xD5B4, + 0x6CBF, 0xD1D8, 0x6CC0, 0x9B71, 0x6CC1, 0x9B72, 0x6CC2, 0x9B73, + 0x6CC3, 0x9B74, 0x6CC4, 0xD0B9, 0x6CC5, 0xC7F6, 0x6CC6, 0x9B75, + 0x6CC7, 0x9B76, 0x6CC8, 0x9B77, 0x6CC9, 0xC8AA, 0x6CCA, 0xB2B4, + 0x6CCB, 0x9B78, 0x6CCC, 0xC3DA, 0x6CCD, 0x9B79, 0x6CCE, 0x9B7A, + 0x6CCF, 0x9B7B, 0x6CD0, 0xE3EE, 0x6CD1, 0x9B7C, 0x6CD2, 0x9B7D, + 0x6CD3, 0xE3FC, 0x6CD4, 0xE3EF, 0x6CD5, 0xB7A8, 0x6CD6, 0xE3F7, + 0x6CD7, 0xE3F4, 0x6CD8, 0x9B7E, 0x6CD9, 0x9B80, 0x6CDA, 0x9B81, + 0x6CDB, 0xB7BA, 0x6CDC, 0x9B82, 0x6CDD, 0x9B83, 0x6CDE, 0xC5A2, + 0x6CDF, 0x9B84, 0x6CE0, 0xE3F6, 0x6CE1, 0xC5DD, 0x6CE2, 0xB2A8, + 0x6CE3, 0xC6FC, 0x6CE4, 0x9B85, 0x6CE5, 0xC4E0, 0x6CE6, 0x9B86, + 0x6CE7, 0x9B87, 0x6CE8, 0xD7A2, 0x6CE9, 0x9B88, 0x6CEA, 0xC0E1, + 0x6CEB, 0xE3F9, 0x6CEC, 0x9B89, 0x6CED, 0x9B8A, 0x6CEE, 0xE3FA, + 0x6CEF, 0xE3FD, 0x6CF0, 0xCCA9, 0x6CF1, 0xE3F3, 0x6CF2, 0x9B8B, + 0x6CF3, 0xD3BE, 0x6CF4, 0x9B8C, 0x6CF5, 0xB1C3, 0x6CF6, 0xEDB4, + 0x6CF7, 0xE3F1, 0x6CF8, 0xE3F2, 0x6CF9, 0x9B8D, 0x6CFA, 0xE3F8, + 0x6CFB, 0xD0BA, 0x6CFC, 0xC6C3, 0x6CFD, 0xD4F3, 0x6CFE, 0xE3FE, + 0x6CFF, 0x9B8E, 0x6D00, 0x9B8F, 0x6D01, 0xBDE0, 0x6D02, 0x9B90, + 0x6D03, 0x9B91, 0x6D04, 0xE4A7, 0x6D05, 0x9B92, 0x6D06, 0x9B93, + 0x6D07, 0xE4A6, 0x6D08, 0x9B94, 0x6D09, 0x9B95, 0x6D0A, 0x9B96, + 0x6D0B, 0xD1F3, 0x6D0C, 0xE4A3, 0x6D0D, 0x9B97, 0x6D0E, 0xE4A9, + 0x6D0F, 0x9B98, 0x6D10, 0x9B99, 0x6D11, 0x9B9A, 0x6D12, 0xC8F7, + 0x6D13, 0x9B9B, 0x6D14, 0x9B9C, 0x6D15, 0x9B9D, 0x6D16, 0x9B9E, + 0x6D17, 0xCFB4, 0x6D18, 0x9B9F, 0x6D19, 0xE4A8, 0x6D1A, 0xE4AE, + 0x6D1B, 0xC2E5, 0x6D1C, 0x9BA0, 0x6D1D, 0x9BA1, 0x6D1E, 0xB6B4, + 0x6D1F, 0x9BA2, 0x6D20, 0x9BA3, 0x6D21, 0x9BA4, 0x6D22, 0x9BA5, + 0x6D23, 0x9BA6, 0x6D24, 0x9BA7, 0x6D25, 0xBDF2, 0x6D26, 0x9BA8, + 0x6D27, 0xE4A2, 0x6D28, 0x9BA9, 0x6D29, 0x9BAA, 0x6D2A, 0xBAE9, + 0x6D2B, 0xE4AA, 0x6D2C, 0x9BAB, 0x6D2D, 0x9BAC, 0x6D2E, 0xE4AC, + 0x6D2F, 0x9BAD, 0x6D30, 0x9BAE, 0x6D31, 0xB6FD, 0x6D32, 0xD6DE, + 0x6D33, 0xE4B2, 0x6D34, 0x9BAF, 0x6D35, 0xE4AD, 0x6D36, 0x9BB0, + 0x6D37, 0x9BB1, 0x6D38, 0x9BB2, 0x6D39, 0xE4A1, 0x6D3A, 0x9BB3, + 0x6D3B, 0xBBEE, 0x6D3C, 0xCDDD, 0x6D3D, 0xC7A2, 0x6D3E, 0xC5C9, + 0x6D3F, 0x9BB4, 0x6D40, 0x9BB5, 0x6D41, 0xC1F7, 0x6D42, 0x9BB6, + 0x6D43, 0xE4A4, 0x6D44, 0x9BB7, 0x6D45, 0xC7B3, 0x6D46, 0xBDAC, + 0x6D47, 0xBDBD, 0x6D48, 0xE4A5, 0x6D49, 0x9BB8, 0x6D4A, 0xD7C7, + 0x6D4B, 0xB2E2, 0x6D4C, 0x9BB9, 0x6D4D, 0xE4AB, 0x6D4E, 0xBCC3, + 0x6D4F, 0xE4AF, 0x6D50, 0x9BBA, 0x6D51, 0xBBEB, 0x6D52, 0xE4B0, + 0x6D53, 0xC5A8, 0x6D54, 0xE4B1, 0x6D55, 0x9BBB, 0x6D56, 0x9BBC, + 0x6D57, 0x9BBD, 0x6D58, 0x9BBE, 0x6D59, 0xD5E3, 0x6D5A, 0xBFA3, + 0x6D5B, 0x9BBF, 0x6D5C, 0xE4BA, 0x6D5D, 0x9BC0, 0x6D5E, 0xE4B7, + 0x6D5F, 0x9BC1, 0x6D60, 0xE4BB, 0x6D61, 0x9BC2, 0x6D62, 0x9BC3, + 0x6D63, 0xE4BD, 0x6D64, 0x9BC4, 0x6D65, 0x9BC5, 0x6D66, 0xC6D6, + 0x6D67, 0x9BC6, 0x6D68, 0x9BC7, 0x6D69, 0xBAC6, 0x6D6A, 0xC0CB, + 0x6D6B, 0x9BC8, 0x6D6C, 0x9BC9, 0x6D6D, 0x9BCA, 0x6D6E, 0xB8A1, + 0x6D6F, 0xE4B4, 0x6D70, 0x9BCB, 0x6D71, 0x9BCC, 0x6D72, 0x9BCD, + 0x6D73, 0x9BCE, 0x6D74, 0xD4A1, 0x6D75, 0x9BCF, 0x6D76, 0x9BD0, + 0x6D77, 0xBAA3, 0x6D78, 0xBDFE, 0x6D79, 0x9BD1, 0x6D7A, 0x9BD2, + 0x6D7B, 0x9BD3, 0x6D7C, 0xE4BC, 0x6D7D, 0x9BD4, 0x6D7E, 0x9BD5, + 0x6D7F, 0x9BD6, 0x6D80, 0x9BD7, 0x6D81, 0x9BD8, 0x6D82, 0xCDBF, + 0x6D83, 0x9BD9, 0x6D84, 0x9BDA, 0x6D85, 0xC4F9, 0x6D86, 0x9BDB, + 0x6D87, 0x9BDC, 0x6D88, 0xCFFB, 0x6D89, 0xC9E6, 0x6D8A, 0x9BDD, + 0x6D8B, 0x9BDE, 0x6D8C, 0xD3BF, 0x6D8D, 0x9BDF, 0x6D8E, 0xCFD1, + 0x6D8F, 0x9BE0, 0x6D90, 0x9BE1, 0x6D91, 0xE4B3, 0x6D92, 0x9BE2, + 0x6D93, 0xE4B8, 0x6D94, 0xE4B9, 0x6D95, 0xCCE9, 0x6D96, 0x9BE3, + 0x6D97, 0x9BE4, 0x6D98, 0x9BE5, 0x6D99, 0x9BE6, 0x6D9A, 0x9BE7, + 0x6D9B, 0xCCCE, 0x6D9C, 0x9BE8, 0x6D9D, 0xC0D4, 0x6D9E, 0xE4B5, + 0x6D9F, 0xC1B0, 0x6DA0, 0xE4B6, 0x6DA1, 0xCED0, 0x6DA2, 0x9BE9, + 0x6DA3, 0xBBC1, 0x6DA4, 0xB5D3, 0x6DA5, 0x9BEA, 0x6DA6, 0xC8F3, + 0x6DA7, 0xBDA7, 0x6DA8, 0xD5C7, 0x6DA9, 0xC9AC, 0x6DAA, 0xB8A2, + 0x6DAB, 0xE4CA, 0x6DAC, 0x9BEB, 0x6DAD, 0x9BEC, 0x6DAE, 0xE4CC, + 0x6DAF, 0xD1C4, 0x6DB0, 0x9BED, 0x6DB1, 0x9BEE, 0x6DB2, 0xD2BA, + 0x6DB3, 0x9BEF, 0x6DB4, 0x9BF0, 0x6DB5, 0xBAAD, 0x6DB6, 0x9BF1, + 0x6DB7, 0x9BF2, 0x6DB8, 0xBAD4, 0x6DB9, 0x9BF3, 0x6DBA, 0x9BF4, + 0x6DBB, 0x9BF5, 0x6DBC, 0x9BF6, 0x6DBD, 0x9BF7, 0x6DBE, 0x9BF8, + 0x6DBF, 0xE4C3, 0x6DC0, 0xB5ED, 0x6DC1, 0x9BF9, 0x6DC2, 0x9BFA, + 0x6DC3, 0x9BFB, 0x6DC4, 0xD7CD, 0x6DC5, 0xE4C0, 0x6DC6, 0xCFFD, + 0x6DC7, 0xE4BF, 0x6DC8, 0x9BFC, 0x6DC9, 0x9BFD, 0x6DCA, 0x9BFE, + 0x6DCB, 0xC1DC, 0x6DCC, 0xCCCA, 0x6DCD, 0x9C40, 0x6DCE, 0x9C41, + 0x6DCF, 0x9C42, 0x6DD0, 0x9C43, 0x6DD1, 0xCAE7, 0x6DD2, 0x9C44, + 0x6DD3, 0x9C45, 0x6DD4, 0x9C46, 0x6DD5, 0x9C47, 0x6DD6, 0xC4D7, + 0x6DD7, 0x9C48, 0x6DD8, 0xCCD4, 0x6DD9, 0xE4C8, 0x6DDA, 0x9C49, + 0x6DDB, 0x9C4A, 0x6DDC, 0x9C4B, 0x6DDD, 0xE4C7, 0x6DDE, 0xE4C1, + 0x6DDF, 0x9C4C, 0x6DE0, 0xE4C4, 0x6DE1, 0xB5AD, 0x6DE2, 0x9C4D, + 0x6DE3, 0x9C4E, 0x6DE4, 0xD3D9, 0x6DE5, 0x9C4F, 0x6DE6, 0xE4C6, + 0x6DE7, 0x9C50, 0x6DE8, 0x9C51, 0x6DE9, 0x9C52, 0x6DEA, 0x9C53, + 0x6DEB, 0xD2F9, 0x6DEC, 0xB4E3, 0x6DED, 0x9C54, 0x6DEE, 0xBBB4, + 0x6DEF, 0x9C55, 0x6DF0, 0x9C56, 0x6DF1, 0xC9EE, 0x6DF2, 0x9C57, + 0x6DF3, 0xB4BE, 0x6DF4, 0x9C58, 0x6DF5, 0x9C59, 0x6DF6, 0x9C5A, + 0x6DF7, 0xBBEC, 0x6DF8, 0x9C5B, 0x6DF9, 0xD1CD, 0x6DFA, 0x9C5C, + 0x6DFB, 0xCCED, 0x6DFC, 0xEDB5, 0x6DFD, 0x9C5D, 0x6DFE, 0x9C5E, + 0x6DFF, 0x9C5F, 0x6E00, 0x9C60, 0x6E01, 0x9C61, 0x6E02, 0x9C62, + 0x6E03, 0x9C63, 0x6E04, 0x9C64, 0x6E05, 0xC7E5, 0x6E06, 0x9C65, + 0x6E07, 0x9C66, 0x6E08, 0x9C67, 0x6E09, 0x9C68, 0x6E0A, 0xD4A8, + 0x6E0B, 0x9C69, 0x6E0C, 0xE4CB, 0x6E0D, 0xD7D5, 0x6E0E, 0xE4C2, + 0x6E0F, 0x9C6A, 0x6E10, 0xBDA5, 0x6E11, 0xE4C5, 0x6E12, 0x9C6B, + 0x6E13, 0x9C6C, 0x6E14, 0xD3E6, 0x6E15, 0x9C6D, 0x6E16, 0xE4C9, + 0x6E17, 0xC9F8, 0x6E18, 0x9C6E, 0x6E19, 0x9C6F, 0x6E1A, 0xE4BE, + 0x6E1B, 0x9C70, 0x6E1C, 0x9C71, 0x6E1D, 0xD3E5, 0x6E1E, 0x9C72, + 0x6E1F, 0x9C73, 0x6E20, 0xC7FE, 0x6E21, 0xB6C9, 0x6E22, 0x9C74, + 0x6E23, 0xD4FC, 0x6E24, 0xB2B3, 0x6E25, 0xE4D7, 0x6E26, 0x9C75, + 0x6E27, 0x9C76, 0x6E28, 0x9C77, 0x6E29, 0xCEC2, 0x6E2A, 0x9C78, + 0x6E2B, 0xE4CD, 0x6E2C, 0x9C79, 0x6E2D, 0xCEBC, 0x6E2E, 0x9C7A, + 0x6E2F, 0xB8DB, 0x6E30, 0x9C7B, 0x6E31, 0x9C7C, 0x6E32, 0xE4D6, + 0x6E33, 0x9C7D, 0x6E34, 0xBFCA, 0x6E35, 0x9C7E, 0x6E36, 0x9C80, + 0x6E37, 0x9C81, 0x6E38, 0xD3CE, 0x6E39, 0x9C82, 0x6E3A, 0xC3EC, + 0x6E3B, 0x9C83, 0x6E3C, 0x9C84, 0x6E3D, 0x9C85, 0x6E3E, 0x9C86, + 0x6E3F, 0x9C87, 0x6E40, 0x9C88, 0x6E41, 0x9C89, 0x6E42, 0x9C8A, + 0x6E43, 0xC5C8, 0x6E44, 0xE4D8, 0x6E45, 0x9C8B, 0x6E46, 0x9C8C, + 0x6E47, 0x9C8D, 0x6E48, 0x9C8E, 0x6E49, 0x9C8F, 0x6E4A, 0x9C90, + 0x6E4B, 0x9C91, 0x6E4C, 0x9C92, 0x6E4D, 0xCDC4, 0x6E4E, 0xE4CF, + 0x6E4F, 0x9C93, 0x6E50, 0x9C94, 0x6E51, 0x9C95, 0x6E52, 0x9C96, + 0x6E53, 0xE4D4, 0x6E54, 0xE4D5, 0x6E55, 0x9C97, 0x6E56, 0xBAFE, + 0x6E57, 0x9C98, 0x6E58, 0xCFE6, 0x6E59, 0x9C99, 0x6E5A, 0x9C9A, + 0x6E5B, 0xD5BF, 0x6E5C, 0x9C9B, 0x6E5D, 0x9C9C, 0x6E5E, 0x9C9D, + 0x6E5F, 0xE4D2, 0x6E60, 0x9C9E, 0x6E61, 0x9C9F, 0x6E62, 0x9CA0, + 0x6E63, 0x9CA1, 0x6E64, 0x9CA2, 0x6E65, 0x9CA3, 0x6E66, 0x9CA4, + 0x6E67, 0x9CA5, 0x6E68, 0x9CA6, 0x6E69, 0x9CA7, 0x6E6A, 0x9CA8, + 0x6E6B, 0xE4D0, 0x6E6C, 0x9CA9, 0x6E6D, 0x9CAA, 0x6E6E, 0xE4CE, + 0x6E6F, 0x9CAB, 0x6E70, 0x9CAC, 0x6E71, 0x9CAD, 0x6E72, 0x9CAE, + 0x6E73, 0x9CAF, 0x6E74, 0x9CB0, 0x6E75, 0x9CB1, 0x6E76, 0x9CB2, + 0x6E77, 0x9CB3, 0x6E78, 0x9CB4, 0x6E79, 0x9CB5, 0x6E7A, 0x9CB6, + 0x6E7B, 0x9CB7, 0x6E7C, 0x9CB8, 0x6E7D, 0x9CB9, 0x6E7E, 0xCDE5, + 0x6E7F, 0xCAAA, 0x6E80, 0x9CBA, 0x6E81, 0x9CBB, 0x6E82, 0x9CBC, + 0x6E83, 0xC0A3, 0x6E84, 0x9CBD, 0x6E85, 0xBDA6, 0x6E86, 0xE4D3, + 0x6E87, 0x9CBE, 0x6E88, 0x9CBF, 0x6E89, 0xB8C8, 0x6E8A, 0x9CC0, + 0x6E8B, 0x9CC1, 0x6E8C, 0x9CC2, 0x6E8D, 0x9CC3, 0x6E8E, 0x9CC4, + 0x6E8F, 0xE4E7, 0x6E90, 0xD4B4, 0x6E91, 0x9CC5, 0x6E92, 0x9CC6, + 0x6E93, 0x9CC7, 0x6E94, 0x9CC8, 0x6E95, 0x9CC9, 0x6E96, 0x9CCA, + 0x6E97, 0x9CCB, 0x6E98, 0xE4DB, 0x6E99, 0x9CCC, 0x6E9A, 0x9CCD, + 0x6E9B, 0x9CCE, 0x6E9C, 0xC1EF, 0x6E9D, 0x9CCF, 0x6E9E, 0x9CD0, + 0x6E9F, 0xE4E9, 0x6EA0, 0x9CD1, 0x6EA1, 0x9CD2, 0x6EA2, 0xD2E7, + 0x6EA3, 0x9CD3, 0x6EA4, 0x9CD4, 0x6EA5, 0xE4DF, 0x6EA6, 0x9CD5, + 0x6EA7, 0xE4E0, 0x6EA8, 0x9CD6, 0x6EA9, 0x9CD7, 0x6EAA, 0xCFAA, + 0x6EAB, 0x9CD8, 0x6EAC, 0x9CD9, 0x6EAD, 0x9CDA, 0x6EAE, 0x9CDB, + 0x6EAF, 0xCBDD, 0x6EB0, 0x9CDC, 0x6EB1, 0xE4DA, 0x6EB2, 0xE4D1, + 0x6EB3, 0x9CDD, 0x6EB4, 0xE4E5, 0x6EB5, 0x9CDE, 0x6EB6, 0xC8DC, + 0x6EB7, 0xE4E3, 0x6EB8, 0x9CDF, 0x6EB9, 0x9CE0, 0x6EBA, 0xC4E7, + 0x6EBB, 0xE4E2, 0x6EBC, 0x9CE1, 0x6EBD, 0xE4E1, 0x6EBE, 0x9CE2, + 0x6EBF, 0x9CE3, 0x6EC0, 0x9CE4, 0x6EC1, 0xB3FC, 0x6EC2, 0xE4E8, + 0x6EC3, 0x9CE5, 0x6EC4, 0x9CE6, 0x6EC5, 0x9CE7, 0x6EC6, 0x9CE8, + 0x6EC7, 0xB5E1, 0x6EC8, 0x9CE9, 0x6EC9, 0x9CEA, 0x6ECA, 0x9CEB, + 0x6ECB, 0xD7CC, 0x6ECC, 0x9CEC, 0x6ECD, 0x9CED, 0x6ECE, 0x9CEE, + 0x6ECF, 0xE4E6, 0x6ED0, 0x9CEF, 0x6ED1, 0xBBAC, 0x6ED2, 0x9CF0, + 0x6ED3, 0xD7D2, 0x6ED4, 0xCCCF, 0x6ED5, 0xEBF8, 0x6ED6, 0x9CF1, + 0x6ED7, 0xE4E4, 0x6ED8, 0x9CF2, 0x6ED9, 0x9CF3, 0x6EDA, 0xB9F6, + 0x6EDB, 0x9CF4, 0x6EDC, 0x9CF5, 0x6EDD, 0x9CF6, 0x6EDE, 0xD6CD, + 0x6EDF, 0xE4D9, 0x6EE0, 0xE4DC, 0x6EE1, 0xC2FA, 0x6EE2, 0xE4DE, + 0x6EE3, 0x9CF7, 0x6EE4, 0xC2CB, 0x6EE5, 0xC0C4, 0x6EE6, 0xC2D0, + 0x6EE7, 0x9CF8, 0x6EE8, 0xB1F5, 0x6EE9, 0xCCB2, 0x6EEA, 0x9CF9, + 0x6EEB, 0x9CFA, 0x6EEC, 0x9CFB, 0x6EED, 0x9CFC, 0x6EEE, 0x9CFD, + 0x6EEF, 0x9CFE, 0x6EF0, 0x9D40, 0x6EF1, 0x9D41, 0x6EF2, 0x9D42, + 0x6EF3, 0x9D43, 0x6EF4, 0xB5CE, 0x6EF5, 0x9D44, 0x6EF6, 0x9D45, + 0x6EF7, 0x9D46, 0x6EF8, 0x9D47, 0x6EF9, 0xE4EF, 0x6EFA, 0x9D48, + 0x6EFB, 0x9D49, 0x6EFC, 0x9D4A, 0x6EFD, 0x9D4B, 0x6EFE, 0x9D4C, + 0x6EFF, 0x9D4D, 0x6F00, 0x9D4E, 0x6F01, 0x9D4F, 0x6F02, 0xC6AF, + 0x6F03, 0x9D50, 0x6F04, 0x9D51, 0x6F05, 0x9D52, 0x6F06, 0xC6E1, + 0x6F07, 0x9D53, 0x6F08, 0x9D54, 0x6F09, 0xE4F5, 0x6F0A, 0x9D55, + 0x6F0B, 0x9D56, 0x6F0C, 0x9D57, 0x6F0D, 0x9D58, 0x6F0E, 0x9D59, + 0x6F0F, 0xC2A9, 0x6F10, 0x9D5A, 0x6F11, 0x9D5B, 0x6F12, 0x9D5C, + 0x6F13, 0xC0EC, 0x6F14, 0xD1DD, 0x6F15, 0xE4EE, 0x6F16, 0x9D5D, + 0x6F17, 0x9D5E, 0x6F18, 0x9D5F, 0x6F19, 0x9D60, 0x6F1A, 0x9D61, + 0x6F1B, 0x9D62, 0x6F1C, 0x9D63, 0x6F1D, 0x9D64, 0x6F1E, 0x9D65, + 0x6F1F, 0x9D66, 0x6F20, 0xC4AE, 0x6F21, 0x9D67, 0x6F22, 0x9D68, + 0x6F23, 0x9D69, 0x6F24, 0xE4ED, 0x6F25, 0x9D6A, 0x6F26, 0x9D6B, + 0x6F27, 0x9D6C, 0x6F28, 0x9D6D, 0x6F29, 0xE4F6, 0x6F2A, 0xE4F4, + 0x6F2B, 0xC2FE, 0x6F2C, 0x9D6E, 0x6F2D, 0xE4DD, 0x6F2E, 0x9D6F, + 0x6F2F, 0xE4F0, 0x6F30, 0x9D70, 0x6F31, 0xCAFE, 0x6F32, 0x9D71, + 0x6F33, 0xD5C4, 0x6F34, 0x9D72, 0x6F35, 0x9D73, 0x6F36, 0xE4F1, + 0x6F37, 0x9D74, 0x6F38, 0x9D75, 0x6F39, 0x9D76, 0x6F3A, 0x9D77, + 0x6F3B, 0x9D78, 0x6F3C, 0x9D79, 0x6F3D, 0x9D7A, 0x6F3E, 0xD1FA, + 0x6F3F, 0x9D7B, 0x6F40, 0x9D7C, 0x6F41, 0x9D7D, 0x6F42, 0x9D7E, + 0x6F43, 0x9D80, 0x6F44, 0x9D81, 0x6F45, 0x9D82, 0x6F46, 0xE4EB, + 0x6F47, 0xE4EC, 0x6F48, 0x9D83, 0x6F49, 0x9D84, 0x6F4A, 0x9D85, + 0x6F4B, 0xE4F2, 0x6F4C, 0x9D86, 0x6F4D, 0xCEAB, 0x6F4E, 0x9D87, + 0x6F4F, 0x9D88, 0x6F50, 0x9D89, 0x6F51, 0x9D8A, 0x6F52, 0x9D8B, + 0x6F53, 0x9D8C, 0x6F54, 0x9D8D, 0x6F55, 0x9D8E, 0x6F56, 0x9D8F, + 0x6F57, 0x9D90, 0x6F58, 0xC5CB, 0x6F59, 0x9D91, 0x6F5A, 0x9D92, + 0x6F5B, 0x9D93, 0x6F5C, 0xC7B1, 0x6F5D, 0x9D94, 0x6F5E, 0xC2BA, + 0x6F5F, 0x9D95, 0x6F60, 0x9D96, 0x6F61, 0x9D97, 0x6F62, 0xE4EA, + 0x6F63, 0x9D98, 0x6F64, 0x9D99, 0x6F65, 0x9D9A, 0x6F66, 0xC1CA, + 0x6F67, 0x9D9B, 0x6F68, 0x9D9C, 0x6F69, 0x9D9D, 0x6F6A, 0x9D9E, + 0x6F6B, 0x9D9F, 0x6F6C, 0x9DA0, 0x6F6D, 0xCCB6, 0x6F6E, 0xB3B1, + 0x6F6F, 0x9DA1, 0x6F70, 0x9DA2, 0x6F71, 0x9DA3, 0x6F72, 0xE4FB, + 0x6F73, 0x9DA4, 0x6F74, 0xE4F3, 0x6F75, 0x9DA5, 0x6F76, 0x9DA6, + 0x6F77, 0x9DA7, 0x6F78, 0xE4FA, 0x6F79, 0x9DA8, 0x6F7A, 0xE4FD, + 0x6F7B, 0x9DA9, 0x6F7C, 0xE4FC, 0x6F7D, 0x9DAA, 0x6F7E, 0x9DAB, + 0x6F7F, 0x9DAC, 0x6F80, 0x9DAD, 0x6F81, 0x9DAE, 0x6F82, 0x9DAF, + 0x6F83, 0x9DB0, 0x6F84, 0xB3CE, 0x6F85, 0x9DB1, 0x6F86, 0x9DB2, + 0x6F87, 0x9DB3, 0x6F88, 0xB3BA, 0x6F89, 0xE4F7, 0x6F8A, 0x9DB4, + 0x6F8B, 0x9DB5, 0x6F8C, 0xE4F9, 0x6F8D, 0xE4F8, 0x6F8E, 0xC5EC, + 0x6F8F, 0x9DB6, 0x6F90, 0x9DB7, 0x6F91, 0x9DB8, 0x6F92, 0x9DB9, + 0x6F93, 0x9DBA, 0x6F94, 0x9DBB, 0x6F95, 0x9DBC, 0x6F96, 0x9DBD, + 0x6F97, 0x9DBE, 0x6F98, 0x9DBF, 0x6F99, 0x9DC0, 0x6F9A, 0x9DC1, + 0x6F9B, 0x9DC2, 0x6F9C, 0xC0BD, 0x6F9D, 0x9DC3, 0x6F9E, 0x9DC4, + 0x6F9F, 0x9DC5, 0x6FA0, 0x9DC6, 0x6FA1, 0xD4E8, 0x6FA2, 0x9DC7, + 0x6FA3, 0x9DC8, 0x6FA4, 0x9DC9, 0x6FA5, 0x9DCA, 0x6FA6, 0x9DCB, + 0x6FA7, 0xE5A2, 0x6FA8, 0x9DCC, 0x6FA9, 0x9DCD, 0x6FAA, 0x9DCE, + 0x6FAB, 0x9DCF, 0x6FAC, 0x9DD0, 0x6FAD, 0x9DD1, 0x6FAE, 0x9DD2, + 0x6FAF, 0x9DD3, 0x6FB0, 0x9DD4, 0x6FB1, 0x9DD5, 0x6FB2, 0x9DD6, + 0x6FB3, 0xB0C4, 0x6FB4, 0x9DD7, 0x6FB5, 0x9DD8, 0x6FB6, 0xE5A4, + 0x6FB7, 0x9DD9, 0x6FB8, 0x9DDA, 0x6FB9, 0xE5A3, 0x6FBA, 0x9DDB, + 0x6FBB, 0x9DDC, 0x6FBC, 0x9DDD, 0x6FBD, 0x9DDE, 0x6FBE, 0x9DDF, + 0x6FBF, 0x9DE0, 0x6FC0, 0xBCA4, 0x6FC1, 0x9DE1, 0x6FC2, 0xE5A5, + 0x6FC3, 0x9DE2, 0x6FC4, 0x9DE3, 0x6FC5, 0x9DE4, 0x6FC6, 0x9DE5, + 0x6FC7, 0x9DE6, 0x6FC8, 0x9DE7, 0x6FC9, 0xE5A1, 0x6FCA, 0x9DE8, + 0x6FCB, 0x9DE9, 0x6FCC, 0x9DEA, 0x6FCD, 0x9DEB, 0x6FCE, 0x9DEC, + 0x6FCF, 0x9DED, 0x6FD0, 0x9DEE, 0x6FD1, 0xE4FE, 0x6FD2, 0xB1F4, + 0x6FD3, 0x9DEF, 0x6FD4, 0x9DF0, 0x6FD5, 0x9DF1, 0x6FD6, 0x9DF2, + 0x6FD7, 0x9DF3, 0x6FD8, 0x9DF4, 0x6FD9, 0x9DF5, 0x6FDA, 0x9DF6, + 0x6FDB, 0x9DF7, 0x6FDC, 0x9DF8, 0x6FDD, 0x9DF9, 0x6FDE, 0xE5A8, + 0x6FDF, 0x9DFA, 0x6FE0, 0xE5A9, 0x6FE1, 0xE5A6, 0x6FE2, 0x9DFB, + 0x6FE3, 0x9DFC, 0x6FE4, 0x9DFD, 0x6FE5, 0x9DFE, 0x6FE6, 0x9E40, + 0x6FE7, 0x9E41, 0x6FE8, 0x9E42, 0x6FE9, 0x9E43, 0x6FEA, 0x9E44, + 0x6FEB, 0x9E45, 0x6FEC, 0x9E46, 0x6FED, 0x9E47, 0x6FEE, 0xE5A7, + 0x6FEF, 0xE5AA, 0x6FF0, 0x9E48, 0x6FF1, 0x9E49, 0x6FF2, 0x9E4A, + 0x6FF3, 0x9E4B, 0x6FF4, 0x9E4C, 0x6FF5, 0x9E4D, 0x6FF6, 0x9E4E, + 0x6FF7, 0x9E4F, 0x6FF8, 0x9E50, 0x6FF9, 0x9E51, 0x6FFA, 0x9E52, + 0x6FFB, 0x9E53, 0x6FFC, 0x9E54, 0x6FFD, 0x9E55, 0x6FFE, 0x9E56, + 0x6FFF, 0x9E57, 0x7000, 0x9E58, 0x7001, 0x9E59, 0x7002, 0x9E5A, + 0x7003, 0x9E5B, 0x7004, 0x9E5C, 0x7005, 0x9E5D, 0x7006, 0x9E5E, + 0x7007, 0x9E5F, 0x7008, 0x9E60, 0x7009, 0x9E61, 0x700A, 0x9E62, + 0x700B, 0x9E63, 0x700C, 0x9E64, 0x700D, 0x9E65, 0x700E, 0x9E66, + 0x700F, 0x9E67, 0x7010, 0x9E68, 0x7011, 0xC6D9, 0x7012, 0x9E69, + 0x7013, 0x9E6A, 0x7014, 0x9E6B, 0x7015, 0x9E6C, 0x7016, 0x9E6D, + 0x7017, 0x9E6E, 0x7018, 0x9E6F, 0x7019, 0x9E70, 0x701A, 0xE5AB, + 0x701B, 0xE5AD, 0x701C, 0x9E71, 0x701D, 0x9E72, 0x701E, 0x9E73, + 0x701F, 0x9E74, 0x7020, 0x9E75, 0x7021, 0x9E76, 0x7022, 0x9E77, + 0x7023, 0xE5AC, 0x7024, 0x9E78, 0x7025, 0x9E79, 0x7026, 0x9E7A, + 0x7027, 0x9E7B, 0x7028, 0x9E7C, 0x7029, 0x9E7D, 0x702A, 0x9E7E, + 0x702B, 0x9E80, 0x702C, 0x9E81, 0x702D, 0x9E82, 0x702E, 0x9E83, + 0x702F, 0x9E84, 0x7030, 0x9E85, 0x7031, 0x9E86, 0x7032, 0x9E87, + 0x7033, 0x9E88, 0x7034, 0x9E89, 0x7035, 0xE5AF, 0x7036, 0x9E8A, + 0x7037, 0x9E8B, 0x7038, 0x9E8C, 0x7039, 0xE5AE, 0x703A, 0x9E8D, + 0x703B, 0x9E8E, 0x703C, 0x9E8F, 0x703D, 0x9E90, 0x703E, 0x9E91, + 0x703F, 0x9E92, 0x7040, 0x9E93, 0x7041, 0x9E94, 0x7042, 0x9E95, + 0x7043, 0x9E96, 0x7044, 0x9E97, 0x7045, 0x9E98, 0x7046, 0x9E99, + 0x7047, 0x9E9A, 0x7048, 0x9E9B, 0x7049, 0x9E9C, 0x704A, 0x9E9D, + 0x704B, 0x9E9E, 0x704C, 0xB9E0, 0x704D, 0x9E9F, 0x704E, 0x9EA0, + 0x704F, 0xE5B0, 0x7050, 0x9EA1, 0x7051, 0x9EA2, 0x7052, 0x9EA3, + 0x7053, 0x9EA4, 0x7054, 0x9EA5, 0x7055, 0x9EA6, 0x7056, 0x9EA7, + 0x7057, 0x9EA8, 0x7058, 0x9EA9, 0x7059, 0x9EAA, 0x705A, 0x9EAB, + 0x705B, 0x9EAC, 0x705C, 0x9EAD, 0x705D, 0x9EAE, 0x705E, 0xE5B1, + 0x705F, 0x9EAF, 0x7060, 0x9EB0, 0x7061, 0x9EB1, 0x7062, 0x9EB2, + 0x7063, 0x9EB3, 0x7064, 0x9EB4, 0x7065, 0x9EB5, 0x7066, 0x9EB6, + 0x7067, 0x9EB7, 0x7068, 0x9EB8, 0x7069, 0x9EB9, 0x706A, 0x9EBA, + 0x706B, 0xBBF0, 0x706C, 0xECE1, 0x706D, 0xC3F0, 0x706E, 0x9EBB, + 0x706F, 0xB5C6, 0x7070, 0xBBD2, 0x7071, 0x9EBC, 0x7072, 0x9EBD, + 0x7073, 0x9EBE, 0x7074, 0x9EBF, 0x7075, 0xC1E9, 0x7076, 0xD4EE, + 0x7077, 0x9EC0, 0x7078, 0xBEC4, 0x7079, 0x9EC1, 0x707A, 0x9EC2, + 0x707B, 0x9EC3, 0x707C, 0xD7C6, 0x707D, 0x9EC4, 0x707E, 0xD4D6, + 0x707F, 0xB2D3, 0x7080, 0xECBE, 0x7081, 0x9EC5, 0x7082, 0x9EC6, + 0x7083, 0x9EC7, 0x7084, 0x9EC8, 0x7085, 0xEAC1, 0x7086, 0x9EC9, + 0x7087, 0x9ECA, 0x7088, 0x9ECB, 0x7089, 0xC2AF, 0x708A, 0xB4B6, + 0x708B, 0x9ECC, 0x708C, 0x9ECD, 0x708D, 0x9ECE, 0x708E, 0xD1D7, + 0x708F, 0x9ECF, 0x7090, 0x9ED0, 0x7091, 0x9ED1, 0x7092, 0xB3B4, + 0x7093, 0x9ED2, 0x7094, 0xC8B2, 0x7095, 0xBFBB, 0x7096, 0xECC0, + 0x7097, 0x9ED3, 0x7098, 0x9ED4, 0x7099, 0xD6CB, 0x709A, 0x9ED5, + 0x709B, 0x9ED6, 0x709C, 0xECBF, 0x709D, 0xECC1, 0x709E, 0x9ED7, + 0x709F, 0x9ED8, 0x70A0, 0x9ED9, 0x70A1, 0x9EDA, 0x70A2, 0x9EDB, + 0x70A3, 0x9EDC, 0x70A4, 0x9EDD, 0x70A5, 0x9EDE, 0x70A6, 0x9EDF, + 0x70A7, 0x9EE0, 0x70A8, 0x9EE1, 0x70A9, 0x9EE2, 0x70AA, 0x9EE3, + 0x70AB, 0xECC5, 0x70AC, 0xBEE6, 0x70AD, 0xCCBF, 0x70AE, 0xC5DA, + 0x70AF, 0xBEBC, 0x70B0, 0x9EE4, 0x70B1, 0xECC6, 0x70B2, 0x9EE5, + 0x70B3, 0xB1FE, 0x70B4, 0x9EE6, 0x70B5, 0x9EE7, 0x70B6, 0x9EE8, + 0x70B7, 0xECC4, 0x70B8, 0xD5A8, 0x70B9, 0xB5E3, 0x70BA, 0x9EE9, + 0x70BB, 0xECC2, 0x70BC, 0xC1B6, 0x70BD, 0xB3E3, 0x70BE, 0x9EEA, + 0x70BF, 0x9EEB, 0x70C0, 0xECC3, 0x70C1, 0xCBB8, 0x70C2, 0xC0C3, + 0x70C3, 0xCCFE, 0x70C4, 0x9EEC, 0x70C5, 0x9EED, 0x70C6, 0x9EEE, + 0x70C7, 0x9EEF, 0x70C8, 0xC1D2, 0x70C9, 0x9EF0, 0x70CA, 0xECC8, + 0x70CB, 0x9EF1, 0x70CC, 0x9EF2, 0x70CD, 0x9EF3, 0x70CE, 0x9EF4, + 0x70CF, 0x9EF5, 0x70D0, 0x9EF6, 0x70D1, 0x9EF7, 0x70D2, 0x9EF8, + 0x70D3, 0x9EF9, 0x70D4, 0x9EFA, 0x70D5, 0x9EFB, 0x70D6, 0x9EFC, + 0x70D7, 0x9EFD, 0x70D8, 0xBAE6, 0x70D9, 0xC0D3, 0x70DA, 0x9EFE, + 0x70DB, 0xD6F2, 0x70DC, 0x9F40, 0x70DD, 0x9F41, 0x70DE, 0x9F42, + 0x70DF, 0xD1CC, 0x70E0, 0x9F43, 0x70E1, 0x9F44, 0x70E2, 0x9F45, + 0x70E3, 0x9F46, 0x70E4, 0xBFBE, 0x70E5, 0x9F47, 0x70E6, 0xB7B3, + 0x70E7, 0xC9D5, 0x70E8, 0xECC7, 0x70E9, 0xBBE2, 0x70EA, 0x9F48, + 0x70EB, 0xCCCC, 0x70EC, 0xBDFD, 0x70ED, 0xC8C8, 0x70EE, 0x9F49, + 0x70EF, 0xCFA9, 0x70F0, 0x9F4A, 0x70F1, 0x9F4B, 0x70F2, 0x9F4C, + 0x70F3, 0x9F4D, 0x70F4, 0x9F4E, 0x70F5, 0x9F4F, 0x70F6, 0x9F50, + 0x70F7, 0xCDE9, 0x70F8, 0x9F51, 0x70F9, 0xC5EB, 0x70FA, 0x9F52, + 0x70FB, 0x9F53, 0x70FC, 0x9F54, 0x70FD, 0xB7E9, 0x70FE, 0x9F55, + 0x70FF, 0x9F56, 0x7100, 0x9F57, 0x7101, 0x9F58, 0x7102, 0x9F59, + 0x7103, 0x9F5A, 0x7104, 0x9F5B, 0x7105, 0x9F5C, 0x7106, 0x9F5D, + 0x7107, 0x9F5E, 0x7108, 0x9F5F, 0x7109, 0xD1C9, 0x710A, 0xBAB8, + 0x710B, 0x9F60, 0x710C, 0x9F61, 0x710D, 0x9F62, 0x710E, 0x9F63, + 0x710F, 0x9F64, 0x7110, 0xECC9, 0x7111, 0x9F65, 0x7112, 0x9F66, + 0x7113, 0xECCA, 0x7114, 0x9F67, 0x7115, 0xBBC0, 0x7116, 0xECCB, + 0x7117, 0x9F68, 0x7118, 0xECE2, 0x7119, 0xB1BA, 0x711A, 0xB7D9, + 0x711B, 0x9F69, 0x711C, 0x9F6A, 0x711D, 0x9F6B, 0x711E, 0x9F6C, + 0x711F, 0x9F6D, 0x7120, 0x9F6E, 0x7121, 0x9F6F, 0x7122, 0x9F70, + 0x7123, 0x9F71, 0x7124, 0x9F72, 0x7125, 0x9F73, 0x7126, 0xBDB9, + 0x7127, 0x9F74, 0x7128, 0x9F75, 0x7129, 0x9F76, 0x712A, 0x9F77, + 0x712B, 0x9F78, 0x712C, 0x9F79, 0x712D, 0x9F7A, 0x712E, 0x9F7B, + 0x712F, 0xECCC, 0x7130, 0xD1E6, 0x7131, 0xECCD, 0x7132, 0x9F7C, + 0x7133, 0x9F7D, 0x7134, 0x9F7E, 0x7135, 0x9F80, 0x7136, 0xC8BB, + 0x7137, 0x9F81, 0x7138, 0x9F82, 0x7139, 0x9F83, 0x713A, 0x9F84, + 0x713B, 0x9F85, 0x713C, 0x9F86, 0x713D, 0x9F87, 0x713E, 0x9F88, + 0x713F, 0x9F89, 0x7140, 0x9F8A, 0x7141, 0x9F8B, 0x7142, 0x9F8C, + 0x7143, 0x9F8D, 0x7144, 0x9F8E, 0x7145, 0xECD1, 0x7146, 0x9F8F, + 0x7147, 0x9F90, 0x7148, 0x9F91, 0x7149, 0x9F92, 0x714A, 0xECD3, + 0x714B, 0x9F93, 0x714C, 0xBBCD, 0x714D, 0x9F94, 0x714E, 0xBCE5, + 0x714F, 0x9F95, 0x7150, 0x9F96, 0x7151, 0x9F97, 0x7152, 0x9F98, + 0x7153, 0x9F99, 0x7154, 0x9F9A, 0x7155, 0x9F9B, 0x7156, 0x9F9C, + 0x7157, 0x9F9D, 0x7158, 0x9F9E, 0x7159, 0x9F9F, 0x715A, 0x9FA0, + 0x715B, 0x9FA1, 0x715C, 0xECCF, 0x715D, 0x9FA2, 0x715E, 0xC9B7, + 0x715F, 0x9FA3, 0x7160, 0x9FA4, 0x7161, 0x9FA5, 0x7162, 0x9FA6, + 0x7163, 0x9FA7, 0x7164, 0xC3BA, 0x7165, 0x9FA8, 0x7166, 0xECE3, + 0x7167, 0xD5D5, 0x7168, 0xECD0, 0x7169, 0x9FA9, 0x716A, 0x9FAA, + 0x716B, 0x9FAB, 0x716C, 0x9FAC, 0x716D, 0x9FAD, 0x716E, 0xD6F3, + 0x716F, 0x9FAE, 0x7170, 0x9FAF, 0x7171, 0x9FB0, 0x7172, 0xECD2, + 0x7173, 0xECCE, 0x7174, 0x9FB1, 0x7175, 0x9FB2, 0x7176, 0x9FB3, + 0x7177, 0x9FB4, 0x7178, 0xECD4, 0x7179, 0x9FB5, 0x717A, 0xECD5, + 0x717B, 0x9FB6, 0x717C, 0x9FB7, 0x717D, 0xC9BF, 0x717E, 0x9FB8, + 0x717F, 0x9FB9, 0x7180, 0x9FBA, 0x7181, 0x9FBB, 0x7182, 0x9FBC, + 0x7183, 0x9FBD, 0x7184, 0xCFA8, 0x7185, 0x9FBE, 0x7186, 0x9FBF, + 0x7187, 0x9FC0, 0x7188, 0x9FC1, 0x7189, 0x9FC2, 0x718A, 0xD0DC, + 0x718B, 0x9FC3, 0x718C, 0x9FC4, 0x718D, 0x9FC5, 0x718E, 0x9FC6, + 0x718F, 0xD1AC, 0x7190, 0x9FC7, 0x7191, 0x9FC8, 0x7192, 0x9FC9, + 0x7193, 0x9FCA, 0x7194, 0xC8DB, 0x7195, 0x9FCB, 0x7196, 0x9FCC, + 0x7197, 0x9FCD, 0x7198, 0xECD6, 0x7199, 0xCEF5, 0x719A, 0x9FCE, + 0x719B, 0x9FCF, 0x719C, 0x9FD0, 0x719D, 0x9FD1, 0x719E, 0x9FD2, + 0x719F, 0xCAEC, 0x71A0, 0xECDA, 0x71A1, 0x9FD3, 0x71A2, 0x9FD4, + 0x71A3, 0x9FD5, 0x71A4, 0x9FD6, 0x71A5, 0x9FD7, 0x71A6, 0x9FD8, + 0x71A7, 0x9FD9, 0x71A8, 0xECD9, 0x71A9, 0x9FDA, 0x71AA, 0x9FDB, + 0x71AB, 0x9FDC, 0x71AC, 0xB0BE, 0x71AD, 0x9FDD, 0x71AE, 0x9FDE, + 0x71AF, 0x9FDF, 0x71B0, 0x9FE0, 0x71B1, 0x9FE1, 0x71B2, 0x9FE2, + 0x71B3, 0xECD7, 0x71B4, 0x9FE3, 0x71B5, 0xECD8, 0x71B6, 0x9FE4, + 0x71B7, 0x9FE5, 0x71B8, 0x9FE6, 0x71B9, 0xECE4, 0x71BA, 0x9FE7, + 0x71BB, 0x9FE8, 0x71BC, 0x9FE9, 0x71BD, 0x9FEA, 0x71BE, 0x9FEB, + 0x71BF, 0x9FEC, 0x71C0, 0x9FED, 0x71C1, 0x9FEE, 0x71C2, 0x9FEF, + 0x71C3, 0xC8BC, 0x71C4, 0x9FF0, 0x71C5, 0x9FF1, 0x71C6, 0x9FF2, + 0x71C7, 0x9FF3, 0x71C8, 0x9FF4, 0x71C9, 0x9FF5, 0x71CA, 0x9FF6, + 0x71CB, 0x9FF7, 0x71CC, 0x9FF8, 0x71CD, 0x9FF9, 0x71CE, 0xC1C7, + 0x71CF, 0x9FFA, 0x71D0, 0x9FFB, 0x71D1, 0x9FFC, 0x71D2, 0x9FFD, + 0x71D3, 0x9FFE, 0x71D4, 0xECDC, 0x71D5, 0xD1E0, 0x71D6, 0xA040, + 0x71D7, 0xA041, 0x71D8, 0xA042, 0x71D9, 0xA043, 0x71DA, 0xA044, + 0x71DB, 0xA045, 0x71DC, 0xA046, 0x71DD, 0xA047, 0x71DE, 0xA048, + 0x71DF, 0xA049, 0x71E0, 0xECDB, 0x71E1, 0xA04A, 0x71E2, 0xA04B, + 0x71E3, 0xA04C, 0x71E4, 0xA04D, 0x71E5, 0xD4EF, 0x71E6, 0xA04E, + 0x71E7, 0xECDD, 0x71E8, 0xA04F, 0x71E9, 0xA050, 0x71EA, 0xA051, + 0x71EB, 0xA052, 0x71EC, 0xA053, 0x71ED, 0xA054, 0x71EE, 0xDBC6, + 0x71EF, 0xA055, 0x71F0, 0xA056, 0x71F1, 0xA057, 0x71F2, 0xA058, + 0x71F3, 0xA059, 0x71F4, 0xA05A, 0x71F5, 0xA05B, 0x71F6, 0xA05C, + 0x71F7, 0xA05D, 0x71F8, 0xA05E, 0x71F9, 0xECDE, 0x71FA, 0xA05F, + 0x71FB, 0xA060, 0x71FC, 0xA061, 0x71FD, 0xA062, 0x71FE, 0xA063, + 0x71FF, 0xA064, 0x7200, 0xA065, 0x7201, 0xA066, 0x7202, 0xA067, + 0x7203, 0xA068, 0x7204, 0xA069, 0x7205, 0xA06A, 0x7206, 0xB1AC, + 0x7207, 0xA06B, 0x7208, 0xA06C, 0x7209, 0xA06D, 0x720A, 0xA06E, + 0x720B, 0xA06F, 0x720C, 0xA070, 0x720D, 0xA071, 0x720E, 0xA072, + 0x720F, 0xA073, 0x7210, 0xA074, 0x7211, 0xA075, 0x7212, 0xA076, + 0x7213, 0xA077, 0x7214, 0xA078, 0x7215, 0xA079, 0x7216, 0xA07A, + 0x7217, 0xA07B, 0x7218, 0xA07C, 0x7219, 0xA07D, 0x721A, 0xA07E, + 0x721B, 0xA080, 0x721C, 0xA081, 0x721D, 0xECDF, 0x721E, 0xA082, + 0x721F, 0xA083, 0x7220, 0xA084, 0x7221, 0xA085, 0x7222, 0xA086, + 0x7223, 0xA087, 0x7224, 0xA088, 0x7225, 0xA089, 0x7226, 0xA08A, + 0x7227, 0xA08B, 0x7228, 0xECE0, 0x7229, 0xA08C, 0x722A, 0xD7A6, + 0x722B, 0xA08D, 0x722C, 0xC5C0, 0x722D, 0xA08E, 0x722E, 0xA08F, + 0x722F, 0xA090, 0x7230, 0xEBBC, 0x7231, 0xB0AE, 0x7232, 0xA091, + 0x7233, 0xA092, 0x7234, 0xA093, 0x7235, 0xBEF4, 0x7236, 0xB8B8, + 0x7237, 0xD2AF, 0x7238, 0xB0D6, 0x7239, 0xB5F9, 0x723A, 0xA094, + 0x723B, 0xD8B3, 0x723C, 0xA095, 0x723D, 0xCBAC, 0x723E, 0xA096, + 0x723F, 0xE3DD, 0x7240, 0xA097, 0x7241, 0xA098, 0x7242, 0xA099, + 0x7243, 0xA09A, 0x7244, 0xA09B, 0x7245, 0xA09C, 0x7246, 0xA09D, + 0x7247, 0xC6AC, 0x7248, 0xB0E6, 0x7249, 0xA09E, 0x724A, 0xA09F, + 0x724B, 0xA0A0, 0x724C, 0xC5C6, 0x724D, 0xEBB9, 0x724E, 0xA0A1, + 0x724F, 0xA0A2, 0x7250, 0xA0A3, 0x7251, 0xA0A4, 0x7252, 0xEBBA, + 0x7253, 0xA0A5, 0x7254, 0xA0A6, 0x7255, 0xA0A7, 0x7256, 0xEBBB, + 0x7257, 0xA0A8, 0x7258, 0xA0A9, 0x7259, 0xD1C0, 0x725A, 0xA0AA, + 0x725B, 0xC5A3, 0x725C, 0xA0AB, 0x725D, 0xEAF2, 0x725E, 0xA0AC, + 0x725F, 0xC4B2, 0x7260, 0xA0AD, 0x7261, 0xC4B5, 0x7262, 0xC0CE, + 0x7263, 0xA0AE, 0x7264, 0xA0AF, 0x7265, 0xA0B0, 0x7266, 0xEAF3, + 0x7267, 0xC4C1, 0x7268, 0xA0B1, 0x7269, 0xCEEF, 0x726A, 0xA0B2, + 0x726B, 0xA0B3, 0x726C, 0xA0B4, 0x726D, 0xA0B5, 0x726E, 0xEAF0, + 0x726F, 0xEAF4, 0x7270, 0xA0B6, 0x7271, 0xA0B7, 0x7272, 0xC9FC, + 0x7273, 0xA0B8, 0x7274, 0xA0B9, 0x7275, 0xC7A3, 0x7276, 0xA0BA, + 0x7277, 0xA0BB, 0x7278, 0xA0BC, 0x7279, 0xCCD8, 0x727A, 0xCEFE, + 0x727B, 0xA0BD, 0x727C, 0xA0BE, 0x727D, 0xA0BF, 0x727E, 0xEAF5, + 0x727F, 0xEAF6, 0x7280, 0xCFAC, 0x7281, 0xC0E7, 0x7282, 0xA0C0, + 0x7283, 0xA0C1, 0x7284, 0xEAF7, 0x7285, 0xA0C2, 0x7286, 0xA0C3, + 0x7287, 0xA0C4, 0x7288, 0xA0C5, 0x7289, 0xA0C6, 0x728A, 0xB6BF, + 0x728B, 0xEAF8, 0x728C, 0xA0C7, 0x728D, 0xEAF9, 0x728E, 0xA0C8, + 0x728F, 0xEAFA, 0x7290, 0xA0C9, 0x7291, 0xA0CA, 0x7292, 0xEAFB, + 0x7293, 0xA0CB, 0x7294, 0xA0CC, 0x7295, 0xA0CD, 0x7296, 0xA0CE, + 0x7297, 0xA0CF, 0x7298, 0xA0D0, 0x7299, 0xA0D1, 0x729A, 0xA0D2, + 0x729B, 0xA0D3, 0x729C, 0xA0D4, 0x729D, 0xA0D5, 0x729E, 0xA0D6, + 0x729F, 0xEAF1, 0x72A0, 0xA0D7, 0x72A1, 0xA0D8, 0x72A2, 0xA0D9, + 0x72A3, 0xA0DA, 0x72A4, 0xA0DB, 0x72A5, 0xA0DC, 0x72A6, 0xA0DD, + 0x72A7, 0xA0DE, 0x72A8, 0xA0DF, 0x72A9, 0xA0E0, 0x72AA, 0xA0E1, + 0x72AB, 0xA0E2, 0x72AC, 0xC8AE, 0x72AD, 0xE1EB, 0x72AE, 0xA0E3, + 0x72AF, 0xB7B8, 0x72B0, 0xE1EC, 0x72B1, 0xA0E4, 0x72B2, 0xA0E5, + 0x72B3, 0xA0E6, 0x72B4, 0xE1ED, 0x72B5, 0xA0E7, 0x72B6, 0xD7B4, + 0x72B7, 0xE1EE, 0x72B8, 0xE1EF, 0x72B9, 0xD3CC, 0x72BA, 0xA0E8, + 0x72BB, 0xA0E9, 0x72BC, 0xA0EA, 0x72BD, 0xA0EB, 0x72BE, 0xA0EC, + 0x72BF, 0xA0ED, 0x72C0, 0xA0EE, 0x72C1, 0xE1F1, 0x72C2, 0xBFF1, + 0x72C3, 0xE1F0, 0x72C4, 0xB5D2, 0x72C5, 0xA0EF, 0x72C6, 0xA0F0, + 0x72C7, 0xA0F1, 0x72C8, 0xB1B7, 0x72C9, 0xA0F2, 0x72CA, 0xA0F3, + 0x72CB, 0xA0F4, 0x72CC, 0xA0F5, 0x72CD, 0xE1F3, 0x72CE, 0xE1F2, + 0x72CF, 0xA0F6, 0x72D0, 0xBAFC, 0x72D1, 0xA0F7, 0x72D2, 0xE1F4, + 0x72D3, 0xA0F8, 0x72D4, 0xA0F9, 0x72D5, 0xA0FA, 0x72D6, 0xA0FB, + 0x72D7, 0xB9B7, 0x72D8, 0xA0FC, 0x72D9, 0xBED1, 0x72DA, 0xA0FD, + 0x72DB, 0xA0FE, 0x72DC, 0xAA40, 0x72DD, 0xAA41, 0x72DE, 0xC4FC, + 0x72DF, 0xAA42, 0x72E0, 0xBADD, 0x72E1, 0xBDC6, 0x72E2, 0xAA43, + 0x72E3, 0xAA44, 0x72E4, 0xAA45, 0x72E5, 0xAA46, 0x72E6, 0xAA47, + 0x72E7, 0xAA48, 0x72E8, 0xE1F5, 0x72E9, 0xE1F7, 0x72EA, 0xAA49, + 0x72EB, 0xAA4A, 0x72EC, 0xB6C0, 0x72ED, 0xCFC1, 0x72EE, 0xCAA8, + 0x72EF, 0xE1F6, 0x72F0, 0xD5F8, 0x72F1, 0xD3FC, 0x72F2, 0xE1F8, + 0x72F3, 0xE1FC, 0x72F4, 0xE1F9, 0x72F5, 0xAA4B, 0x72F6, 0xAA4C, + 0x72F7, 0xE1FA, 0x72F8, 0xC0EA, 0x72F9, 0xAA4D, 0x72FA, 0xE1FE, + 0x72FB, 0xE2A1, 0x72FC, 0xC0C7, 0x72FD, 0xAA4E, 0x72FE, 0xAA4F, + 0x72FF, 0xAA50, 0x7300, 0xAA51, 0x7301, 0xE1FB, 0x7302, 0xAA52, + 0x7303, 0xE1FD, 0x7304, 0xAA53, 0x7305, 0xAA54, 0x7306, 0xAA55, + 0x7307, 0xAA56, 0x7308, 0xAA57, 0x7309, 0xAA58, 0x730A, 0xE2A5, + 0x730B, 0xAA59, 0x730C, 0xAA5A, 0x730D, 0xAA5B, 0x730E, 0xC1D4, + 0x730F, 0xAA5C, 0x7310, 0xAA5D, 0x7311, 0xAA5E, 0x7312, 0xAA5F, + 0x7313, 0xE2A3, 0x7314, 0xAA60, 0x7315, 0xE2A8, 0x7316, 0xB2FE, + 0x7317, 0xE2A2, 0x7318, 0xAA61, 0x7319, 0xAA62, 0x731A, 0xAA63, + 0x731B, 0xC3CD, 0x731C, 0xB2C2, 0x731D, 0xE2A7, 0x731E, 0xE2A6, + 0x731F, 0xAA64, 0x7320, 0xAA65, 0x7321, 0xE2A4, 0x7322, 0xE2A9, + 0x7323, 0xAA66, 0x7324, 0xAA67, 0x7325, 0xE2AB, 0x7326, 0xAA68, + 0x7327, 0xAA69, 0x7328, 0xAA6A, 0x7329, 0xD0C9, 0x732A, 0xD6ED, + 0x732B, 0xC3A8, 0x732C, 0xE2AC, 0x732D, 0xAA6B, 0x732E, 0xCFD7, + 0x732F, 0xAA6C, 0x7330, 0xAA6D, 0x7331, 0xE2AE, 0x7332, 0xAA6E, + 0x7333, 0xAA6F, 0x7334, 0xBAEF, 0x7335, 0xAA70, 0x7336, 0xAA71, + 0x7337, 0xE9E0, 0x7338, 0xE2AD, 0x7339, 0xE2AA, 0x733A, 0xAA72, + 0x733B, 0xAA73, 0x733C, 0xAA74, 0x733D, 0xAA75, 0x733E, 0xBBAB, + 0x733F, 0xD4B3, 0x7340, 0xAA76, 0x7341, 0xAA77, 0x7342, 0xAA78, + 0x7343, 0xAA79, 0x7344, 0xAA7A, 0x7345, 0xAA7B, 0x7346, 0xAA7C, + 0x7347, 0xAA7D, 0x7348, 0xAA7E, 0x7349, 0xAA80, 0x734A, 0xAA81, + 0x734B, 0xAA82, 0x734C, 0xAA83, 0x734D, 0xE2B0, 0x734E, 0xAA84, + 0x734F, 0xAA85, 0x7350, 0xE2AF, 0x7351, 0xAA86, 0x7352, 0xE9E1, + 0x7353, 0xAA87, 0x7354, 0xAA88, 0x7355, 0xAA89, 0x7356, 0xAA8A, + 0x7357, 0xE2B1, 0x7358, 0xAA8B, 0x7359, 0xAA8C, 0x735A, 0xAA8D, + 0x735B, 0xAA8E, 0x735C, 0xAA8F, 0x735D, 0xAA90, 0x735E, 0xAA91, + 0x735F, 0xAA92, 0x7360, 0xE2B2, 0x7361, 0xAA93, 0x7362, 0xAA94, + 0x7363, 0xAA95, 0x7364, 0xAA96, 0x7365, 0xAA97, 0x7366, 0xAA98, + 0x7367, 0xAA99, 0x7368, 0xAA9A, 0x7369, 0xAA9B, 0x736A, 0xAA9C, + 0x736B, 0xAA9D, 0x736C, 0xE2B3, 0x736D, 0xCCA1, 0x736E, 0xAA9E, + 0x736F, 0xE2B4, 0x7370, 0xAA9F, 0x7371, 0xAAA0, 0x7372, 0xAB40, + 0x7373, 0xAB41, 0x7374, 0xAB42, 0x7375, 0xAB43, 0x7376, 0xAB44, + 0x7377, 0xAB45, 0x7378, 0xAB46, 0x7379, 0xAB47, 0x737A, 0xAB48, + 0x737B, 0xAB49, 0x737C, 0xAB4A, 0x737D, 0xAB4B, 0x737E, 0xE2B5, + 0x737F, 0xAB4C, 0x7380, 0xAB4D, 0x7381, 0xAB4E, 0x7382, 0xAB4F, + 0x7383, 0xAB50, 0x7384, 0xD0FE, 0x7385, 0xAB51, 0x7386, 0xAB52, + 0x7387, 0xC2CA, 0x7388, 0xAB53, 0x7389, 0xD3F1, 0x738A, 0xAB54, + 0x738B, 0xCDF5, 0x738C, 0xAB55, 0x738D, 0xAB56, 0x738E, 0xE7E0, + 0x738F, 0xAB57, 0x7390, 0xAB58, 0x7391, 0xE7E1, 0x7392, 0xAB59, + 0x7393, 0xAB5A, 0x7394, 0xAB5B, 0x7395, 0xAB5C, 0x7396, 0xBEC1, + 0x7397, 0xAB5D, 0x7398, 0xAB5E, 0x7399, 0xAB5F, 0x739A, 0xAB60, + 0x739B, 0xC2EA, 0x739C, 0xAB61, 0x739D, 0xAB62, 0x739E, 0xAB63, + 0x739F, 0xE7E4, 0x73A0, 0xAB64, 0x73A1, 0xAB65, 0x73A2, 0xE7E3, + 0x73A3, 0xAB66, 0x73A4, 0xAB67, 0x73A5, 0xAB68, 0x73A6, 0xAB69, + 0x73A7, 0xAB6A, 0x73A8, 0xAB6B, 0x73A9, 0xCDE6, 0x73AA, 0xAB6C, + 0x73AB, 0xC3B5, 0x73AC, 0xAB6D, 0x73AD, 0xAB6E, 0x73AE, 0xE7E2, + 0x73AF, 0xBBB7, 0x73B0, 0xCFD6, 0x73B1, 0xAB6F, 0x73B2, 0xC1E1, + 0x73B3, 0xE7E9, 0x73B4, 0xAB70, 0x73B5, 0xAB71, 0x73B6, 0xAB72, + 0x73B7, 0xE7E8, 0x73B8, 0xAB73, 0x73B9, 0xAB74, 0x73BA, 0xE7F4, + 0x73BB, 0xB2A3, 0x73BC, 0xAB75, 0x73BD, 0xAB76, 0x73BE, 0xAB77, + 0x73BF, 0xAB78, 0x73C0, 0xE7EA, 0x73C1, 0xAB79, 0x73C2, 0xE7E6, + 0x73C3, 0xAB7A, 0x73C4, 0xAB7B, 0x73C5, 0xAB7C, 0x73C6, 0xAB7D, + 0x73C7, 0xAB7E, 0x73C8, 0xE7EC, 0x73C9, 0xE7EB, 0x73CA, 0xC9BA, + 0x73CB, 0xAB80, 0x73CC, 0xAB81, 0x73CD, 0xD5E4, 0x73CE, 0xAB82, + 0x73CF, 0xE7E5, 0x73D0, 0xB7A9, 0x73D1, 0xE7E7, 0x73D2, 0xAB83, + 0x73D3, 0xAB84, 0x73D4, 0xAB85, 0x73D5, 0xAB86, 0x73D6, 0xAB87, + 0x73D7, 0xAB88, 0x73D8, 0xAB89, 0x73D9, 0xE7EE, 0x73DA, 0xAB8A, + 0x73DB, 0xAB8B, 0x73DC, 0xAB8C, 0x73DD, 0xAB8D, 0x73DE, 0xE7F3, + 0x73DF, 0xAB8E, 0x73E0, 0xD6E9, 0x73E1, 0xAB8F, 0x73E2, 0xAB90, + 0x73E3, 0xAB91, 0x73E4, 0xAB92, 0x73E5, 0xE7ED, 0x73E6, 0xAB93, + 0x73E7, 0xE7F2, 0x73E8, 0xAB94, 0x73E9, 0xE7F1, 0x73EA, 0xAB95, + 0x73EB, 0xAB96, 0x73EC, 0xAB97, 0x73ED, 0xB0E0, 0x73EE, 0xAB98, + 0x73EF, 0xAB99, 0x73F0, 0xAB9A, 0x73F1, 0xAB9B, 0x73F2, 0xE7F5, + 0x73F3, 0xAB9C, 0x73F4, 0xAB9D, 0x73F5, 0xAB9E, 0x73F6, 0xAB9F, + 0x73F7, 0xABA0, 0x73F8, 0xAC40, 0x73F9, 0xAC41, 0x73FA, 0xAC42, + 0x73FB, 0xAC43, 0x73FC, 0xAC44, 0x73FD, 0xAC45, 0x73FE, 0xAC46, + 0x73FF, 0xAC47, 0x7400, 0xAC48, 0x7401, 0xAC49, 0x7402, 0xAC4A, + 0x7403, 0xC7F2, 0x7404, 0xAC4B, 0x7405, 0xC0C5, 0x7406, 0xC0ED, + 0x7407, 0xAC4C, 0x7408, 0xAC4D, 0x7409, 0xC1F0, 0x740A, 0xE7F0, + 0x740B, 0xAC4E, 0x740C, 0xAC4F, 0x740D, 0xAC50, 0x740E, 0xAC51, + 0x740F, 0xE7F6, 0x7410, 0xCBF6, 0x7411, 0xAC52, 0x7412, 0xAC53, + 0x7413, 0xAC54, 0x7414, 0xAC55, 0x7415, 0xAC56, 0x7416, 0xAC57, + 0x7417, 0xAC58, 0x7418, 0xAC59, 0x7419, 0xAC5A, 0x741A, 0xE8A2, + 0x741B, 0xE8A1, 0x741C, 0xAC5B, 0x741D, 0xAC5C, 0x741E, 0xAC5D, + 0x741F, 0xAC5E, 0x7420, 0xAC5F, 0x7421, 0xAC60, 0x7422, 0xD7C1, + 0x7423, 0xAC61, 0x7424, 0xAC62, 0x7425, 0xE7FA, 0x7426, 0xE7F9, + 0x7427, 0xAC63, 0x7428, 0xE7FB, 0x7429, 0xAC64, 0x742A, 0xE7F7, + 0x742B, 0xAC65, 0x742C, 0xE7FE, 0x742D, 0xAC66, 0x742E, 0xE7FD, + 0x742F, 0xAC67, 0x7430, 0xE7FC, 0x7431, 0xAC68, 0x7432, 0xAC69, + 0x7433, 0xC1D5, 0x7434, 0xC7D9, 0x7435, 0xC5FD, 0x7436, 0xC5C3, + 0x7437, 0xAC6A, 0x7438, 0xAC6B, 0x7439, 0xAC6C, 0x743A, 0xAC6D, + 0x743B, 0xAC6E, 0x743C, 0xC7ED, 0x743D, 0xAC6F, 0x743E, 0xAC70, + 0x743F, 0xAC71, 0x7440, 0xAC72, 0x7441, 0xE8A3, 0x7442, 0xAC73, + 0x7443, 0xAC74, 0x7444, 0xAC75, 0x7445, 0xAC76, 0x7446, 0xAC77, + 0x7447, 0xAC78, 0x7448, 0xAC79, 0x7449, 0xAC7A, 0x744A, 0xAC7B, + 0x744B, 0xAC7C, 0x744C, 0xAC7D, 0x744D, 0xAC7E, 0x744E, 0xAC80, + 0x744F, 0xAC81, 0x7450, 0xAC82, 0x7451, 0xAC83, 0x7452, 0xAC84, + 0x7453, 0xAC85, 0x7454, 0xAC86, 0x7455, 0xE8A6, 0x7456, 0xAC87, + 0x7457, 0xE8A5, 0x7458, 0xAC88, 0x7459, 0xE8A7, 0x745A, 0xBAF7, + 0x745B, 0xE7F8, 0x745C, 0xE8A4, 0x745D, 0xAC89, 0x745E, 0xC8F0, + 0x745F, 0xC9AA, 0x7460, 0xAC8A, 0x7461, 0xAC8B, 0x7462, 0xAC8C, + 0x7463, 0xAC8D, 0x7464, 0xAC8E, 0x7465, 0xAC8F, 0x7466, 0xAC90, + 0x7467, 0xAC91, 0x7468, 0xAC92, 0x7469, 0xAC93, 0x746A, 0xAC94, + 0x746B, 0xAC95, 0x746C, 0xAC96, 0x746D, 0xE8A9, 0x746E, 0xAC97, + 0x746F, 0xAC98, 0x7470, 0xB9E5, 0x7471, 0xAC99, 0x7472, 0xAC9A, + 0x7473, 0xAC9B, 0x7474, 0xAC9C, 0x7475, 0xAC9D, 0x7476, 0xD1FE, + 0x7477, 0xE8A8, 0x7478, 0xAC9E, 0x7479, 0xAC9F, 0x747A, 0xACA0, + 0x747B, 0xAD40, 0x747C, 0xAD41, 0x747D, 0xAD42, 0x747E, 0xE8AA, + 0x747F, 0xAD43, 0x7480, 0xE8AD, 0x7481, 0xE8AE, 0x7482, 0xAD44, + 0x7483, 0xC1A7, 0x7484, 0xAD45, 0x7485, 0xAD46, 0x7486, 0xAD47, + 0x7487, 0xE8AF, 0x7488, 0xAD48, 0x7489, 0xAD49, 0x748A, 0xAD4A, + 0x748B, 0xE8B0, 0x748C, 0xAD4B, 0x748D, 0xAD4C, 0x748E, 0xE8AC, + 0x748F, 0xAD4D, 0x7490, 0xE8B4, 0x7491, 0xAD4E, 0x7492, 0xAD4F, + 0x7493, 0xAD50, 0x7494, 0xAD51, 0x7495, 0xAD52, 0x7496, 0xAD53, + 0x7497, 0xAD54, 0x7498, 0xAD55, 0x7499, 0xAD56, 0x749A, 0xAD57, + 0x749B, 0xAD58, 0x749C, 0xE8AB, 0x749D, 0xAD59, 0x749E, 0xE8B1, + 0x749F, 0xAD5A, 0x74A0, 0xAD5B, 0x74A1, 0xAD5C, 0x74A2, 0xAD5D, + 0x74A3, 0xAD5E, 0x74A4, 0xAD5F, 0x74A5, 0xAD60, 0x74A6, 0xAD61, + 0x74A7, 0xE8B5, 0x74A8, 0xE8B2, 0x74A9, 0xE8B3, 0x74AA, 0xAD62, + 0x74AB, 0xAD63, 0x74AC, 0xAD64, 0x74AD, 0xAD65, 0x74AE, 0xAD66, + 0x74AF, 0xAD67, 0x74B0, 0xAD68, 0x74B1, 0xAD69, 0x74B2, 0xAD6A, + 0x74B3, 0xAD6B, 0x74B4, 0xAD6C, 0x74B5, 0xAD6D, 0x74B6, 0xAD6E, + 0x74B7, 0xAD6F, 0x74B8, 0xAD70, 0x74B9, 0xAD71, 0x74BA, 0xE8B7, + 0x74BB, 0xAD72, 0x74BC, 0xAD73, 0x74BD, 0xAD74, 0x74BE, 0xAD75, + 0x74BF, 0xAD76, 0x74C0, 0xAD77, 0x74C1, 0xAD78, 0x74C2, 0xAD79, + 0x74C3, 0xAD7A, 0x74C4, 0xAD7B, 0x74C5, 0xAD7C, 0x74C6, 0xAD7D, + 0x74C7, 0xAD7E, 0x74C8, 0xAD80, 0x74C9, 0xAD81, 0x74CA, 0xAD82, + 0x74CB, 0xAD83, 0x74CC, 0xAD84, 0x74CD, 0xAD85, 0x74CE, 0xAD86, + 0x74CF, 0xAD87, 0x74D0, 0xAD88, 0x74D1, 0xAD89, 0x74D2, 0xE8B6, + 0x74D3, 0xAD8A, 0x74D4, 0xAD8B, 0x74D5, 0xAD8C, 0x74D6, 0xAD8D, + 0x74D7, 0xAD8E, 0x74D8, 0xAD8F, 0x74D9, 0xAD90, 0x74DA, 0xAD91, + 0x74DB, 0xAD92, 0x74DC, 0xB9CF, 0x74DD, 0xAD93, 0x74DE, 0xF0AC, + 0x74DF, 0xAD94, 0x74E0, 0xF0AD, 0x74E1, 0xAD95, 0x74E2, 0xC6B0, + 0x74E3, 0xB0EA, 0x74E4, 0xC8BF, 0x74E5, 0xAD96, 0x74E6, 0xCDDF, + 0x74E7, 0xAD97, 0x74E8, 0xAD98, 0x74E9, 0xAD99, 0x74EA, 0xAD9A, + 0x74EB, 0xAD9B, 0x74EC, 0xAD9C, 0x74ED, 0xAD9D, 0x74EE, 0xCECD, + 0x74EF, 0xEAB1, 0x74F0, 0xAD9E, 0x74F1, 0xAD9F, 0x74F2, 0xADA0, + 0x74F3, 0xAE40, 0x74F4, 0xEAB2, 0x74F5, 0xAE41, 0x74F6, 0xC6BF, + 0x74F7, 0xB4C9, 0x74F8, 0xAE42, 0x74F9, 0xAE43, 0x74FA, 0xAE44, + 0x74FB, 0xAE45, 0x74FC, 0xAE46, 0x74FD, 0xAE47, 0x74FE, 0xAE48, + 0x74FF, 0xEAB3, 0x7500, 0xAE49, 0x7501, 0xAE4A, 0x7502, 0xAE4B, + 0x7503, 0xAE4C, 0x7504, 0xD5E7, 0x7505, 0xAE4D, 0x7506, 0xAE4E, + 0x7507, 0xAE4F, 0x7508, 0xAE50, 0x7509, 0xAE51, 0x750A, 0xAE52, + 0x750B, 0xAE53, 0x750C, 0xAE54, 0x750D, 0xDDF9, 0x750E, 0xAE55, + 0x750F, 0xEAB4, 0x7510, 0xAE56, 0x7511, 0xEAB5, 0x7512, 0xAE57, + 0x7513, 0xEAB6, 0x7514, 0xAE58, 0x7515, 0xAE59, 0x7516, 0xAE5A, + 0x7517, 0xAE5B, 0x7518, 0xB8CA, 0x7519, 0xDFB0, 0x751A, 0xC9F5, + 0x751B, 0xAE5C, 0x751C, 0xCCF0, 0x751D, 0xAE5D, 0x751E, 0xAE5E, + 0x751F, 0xC9FA, 0x7520, 0xAE5F, 0x7521, 0xAE60, 0x7522, 0xAE61, + 0x7523, 0xAE62, 0x7524, 0xAE63, 0x7525, 0xC9FB, 0x7526, 0xAE64, + 0x7527, 0xAE65, 0x7528, 0xD3C3, 0x7529, 0xCBA6, 0x752A, 0xAE66, + 0x752B, 0xB8A6, 0x752C, 0xF0AE, 0x752D, 0xB1C2, 0x752E, 0xAE67, + 0x752F, 0xE5B8, 0x7530, 0xCCEF, 0x7531, 0xD3C9, 0x7532, 0xBCD7, + 0x7533, 0xC9EA, 0x7534, 0xAE68, 0x7535, 0xB5E7, 0x7536, 0xAE69, + 0x7537, 0xC4D0, 0x7538, 0xB5E9, 0x7539, 0xAE6A, 0x753A, 0xEEAE, + 0x753B, 0xBBAD, 0x753C, 0xAE6B, 0x753D, 0xAE6C, 0x753E, 0xE7DE, + 0x753F, 0xAE6D, 0x7540, 0xEEAF, 0x7541, 0xAE6E, 0x7542, 0xAE6F, + 0x7543, 0xAE70, 0x7544, 0xAE71, 0x7545, 0xB3A9, 0x7546, 0xAE72, + 0x7547, 0xAE73, 0x7548, 0xEEB2, 0x7549, 0xAE74, 0x754A, 0xAE75, + 0x754B, 0xEEB1, 0x754C, 0xBDE7, 0x754D, 0xAE76, 0x754E, 0xEEB0, + 0x754F, 0xCEB7, 0x7550, 0xAE77, 0x7551, 0xAE78, 0x7552, 0xAE79, + 0x7553, 0xAE7A, 0x7554, 0xC5CF, 0x7555, 0xAE7B, 0x7556, 0xAE7C, + 0x7557, 0xAE7D, 0x7558, 0xAE7E, 0x7559, 0xC1F4, 0x755A, 0xDBCE, + 0x755B, 0xEEB3, 0x755C, 0xD0F3, 0x755D, 0xAE80, 0x755E, 0xAE81, + 0x755F, 0xAE82, 0x7560, 0xAE83, 0x7561, 0xAE84, 0x7562, 0xAE85, + 0x7563, 0xAE86, 0x7564, 0xAE87, 0x7565, 0xC2D4, 0x7566, 0xC6E8, + 0x7567, 0xAE88, 0x7568, 0xAE89, 0x7569, 0xAE8A, 0x756A, 0xB7AC, + 0x756B, 0xAE8B, 0x756C, 0xAE8C, 0x756D, 0xAE8D, 0x756E, 0xAE8E, + 0x756F, 0xAE8F, 0x7570, 0xAE90, 0x7571, 0xAE91, 0x7572, 0xEEB4, + 0x7573, 0xAE92, 0x7574, 0xB3EB, 0x7575, 0xAE93, 0x7576, 0xAE94, + 0x7577, 0xAE95, 0x7578, 0xBBFB, 0x7579, 0xEEB5, 0x757A, 0xAE96, + 0x757B, 0xAE97, 0x757C, 0xAE98, 0x757D, 0xAE99, 0x757E, 0xAE9A, + 0x757F, 0xE7DC, 0x7580, 0xAE9B, 0x7581, 0xAE9C, 0x7582, 0xAE9D, + 0x7583, 0xEEB6, 0x7584, 0xAE9E, 0x7585, 0xAE9F, 0x7586, 0xBDAE, + 0x7587, 0xAEA0, 0x7588, 0xAF40, 0x7589, 0xAF41, 0x758A, 0xAF42, + 0x758B, 0xF1E2, 0x758C, 0xAF43, 0x758D, 0xAF44, 0x758E, 0xAF45, + 0x758F, 0xCAE8, 0x7590, 0xAF46, 0x7591, 0xD2C9, 0x7592, 0xF0DA, + 0x7593, 0xAF47, 0x7594, 0xF0DB, 0x7595, 0xAF48, 0x7596, 0xF0DC, + 0x7597, 0xC1C6, 0x7598, 0xAF49, 0x7599, 0xB8ED, 0x759A, 0xBECE, + 0x759B, 0xAF4A, 0x759C, 0xAF4B, 0x759D, 0xF0DE, 0x759E, 0xAF4C, + 0x759F, 0xC5B1, 0x75A0, 0xF0DD, 0x75A1, 0xD1F1, 0x75A2, 0xAF4D, + 0x75A3, 0xF0E0, 0x75A4, 0xB0CC, 0x75A5, 0xBDEA, 0x75A6, 0xAF4E, + 0x75A7, 0xAF4F, 0x75A8, 0xAF50, 0x75A9, 0xAF51, 0x75AA, 0xAF52, + 0x75AB, 0xD2DF, 0x75AC, 0xF0DF, 0x75AD, 0xAF53, 0x75AE, 0xB4AF, + 0x75AF, 0xB7E8, 0x75B0, 0xF0E6, 0x75B1, 0xF0E5, 0x75B2, 0xC6A3, + 0x75B3, 0xF0E1, 0x75B4, 0xF0E2, 0x75B5, 0xB4C3, 0x75B6, 0xAF54, + 0x75B7, 0xAF55, 0x75B8, 0xF0E3, 0x75B9, 0xD5EE, 0x75BA, 0xAF56, + 0x75BB, 0xAF57, 0x75BC, 0xCCDB, 0x75BD, 0xBED2, 0x75BE, 0xBCB2, + 0x75BF, 0xAF58, 0x75C0, 0xAF59, 0x75C1, 0xAF5A, 0x75C2, 0xF0E8, + 0x75C3, 0xF0E7, 0x75C4, 0xF0E4, 0x75C5, 0xB2A1, 0x75C6, 0xAF5B, + 0x75C7, 0xD6A2, 0x75C8, 0xD3B8, 0x75C9, 0xBEB7, 0x75CA, 0xC8AC, + 0x75CB, 0xAF5C, 0x75CC, 0xAF5D, 0x75CD, 0xF0EA, 0x75CE, 0xAF5E, + 0x75CF, 0xAF5F, 0x75D0, 0xAF60, 0x75D1, 0xAF61, 0x75D2, 0xD1F7, + 0x75D3, 0xAF62, 0x75D4, 0xD6CC, 0x75D5, 0xBADB, 0x75D6, 0xF0E9, + 0x75D7, 0xAF63, 0x75D8, 0xB6BB, 0x75D9, 0xAF64, 0x75DA, 0xAF65, + 0x75DB, 0xCDB4, 0x75DC, 0xAF66, 0x75DD, 0xAF67, 0x75DE, 0xC6A6, + 0x75DF, 0xAF68, 0x75E0, 0xAF69, 0x75E1, 0xAF6A, 0x75E2, 0xC1A1, + 0x75E3, 0xF0EB, 0x75E4, 0xF0EE, 0x75E5, 0xAF6B, 0x75E6, 0xF0ED, + 0x75E7, 0xF0F0, 0x75E8, 0xF0EC, 0x75E9, 0xAF6C, 0x75EA, 0xBBBE, + 0x75EB, 0xF0EF, 0x75EC, 0xAF6D, 0x75ED, 0xAF6E, 0x75EE, 0xAF6F, + 0x75EF, 0xAF70, 0x75F0, 0xCCB5, 0x75F1, 0xF0F2, 0x75F2, 0xAF71, + 0x75F3, 0xAF72, 0x75F4, 0xB3D5, 0x75F5, 0xAF73, 0x75F6, 0xAF74, + 0x75F7, 0xAF75, 0x75F8, 0xAF76, 0x75F9, 0xB1D4, 0x75FA, 0xAF77, + 0x75FB, 0xAF78, 0x75FC, 0xF0F3, 0x75FD, 0xAF79, 0x75FE, 0xAF7A, + 0x75FF, 0xF0F4, 0x7600, 0xF0F6, 0x7601, 0xB4E1, 0x7602, 0xAF7B, + 0x7603, 0xF0F1, 0x7604, 0xAF7C, 0x7605, 0xF0F7, 0x7606, 0xAF7D, + 0x7607, 0xAF7E, 0x7608, 0xAF80, 0x7609, 0xAF81, 0x760A, 0xF0FA, + 0x760B, 0xAF82, 0x760C, 0xF0F8, 0x760D, 0xAF83, 0x760E, 0xAF84, + 0x760F, 0xAF85, 0x7610, 0xF0F5, 0x7611, 0xAF86, 0x7612, 0xAF87, + 0x7613, 0xAF88, 0x7614, 0xAF89, 0x7615, 0xF0FD, 0x7616, 0xAF8A, + 0x7617, 0xF0F9, 0x7618, 0xF0FC, 0x7619, 0xF0FE, 0x761A, 0xAF8B, + 0x761B, 0xF1A1, 0x761C, 0xAF8C, 0x761D, 0xAF8D, 0x761E, 0xAF8E, + 0x761F, 0xCEC1, 0x7620, 0xF1A4, 0x7621, 0xAF8F, 0x7622, 0xF1A3, + 0x7623, 0xAF90, 0x7624, 0xC1F6, 0x7625, 0xF0FB, 0x7626, 0xCADD, + 0x7627, 0xAF91, 0x7628, 0xAF92, 0x7629, 0xB4F1, 0x762A, 0xB1F1, + 0x762B, 0xCCB1, 0x762C, 0xAF93, 0x762D, 0xF1A6, 0x762E, 0xAF94, + 0x762F, 0xAF95, 0x7630, 0xF1A7, 0x7631, 0xAF96, 0x7632, 0xAF97, + 0x7633, 0xF1AC, 0x7634, 0xD5CE, 0x7635, 0xF1A9, 0x7636, 0xAF98, + 0x7637, 0xAF99, 0x7638, 0xC8B3, 0x7639, 0xAF9A, 0x763A, 0xAF9B, + 0x763B, 0xAF9C, 0x763C, 0xF1A2, 0x763D, 0xAF9D, 0x763E, 0xF1AB, + 0x763F, 0xF1A8, 0x7640, 0xF1A5, 0x7641, 0xAF9E, 0x7642, 0xAF9F, + 0x7643, 0xF1AA, 0x7644, 0xAFA0, 0x7645, 0xB040, 0x7646, 0xB041, + 0x7647, 0xB042, 0x7648, 0xB043, 0x7649, 0xB044, 0x764A, 0xB045, + 0x764B, 0xB046, 0x764C, 0xB0A9, 0x764D, 0xF1AD, 0x764E, 0xB047, + 0x764F, 0xB048, 0x7650, 0xB049, 0x7651, 0xB04A, 0x7652, 0xB04B, + 0x7653, 0xB04C, 0x7654, 0xF1AF, 0x7655, 0xB04D, 0x7656, 0xF1B1, + 0x7657, 0xB04E, 0x7658, 0xB04F, 0x7659, 0xB050, 0x765A, 0xB051, + 0x765B, 0xB052, 0x765C, 0xF1B0, 0x765D, 0xB053, 0x765E, 0xF1AE, + 0x765F, 0xB054, 0x7660, 0xB055, 0x7661, 0xB056, 0x7662, 0xB057, + 0x7663, 0xD1A2, 0x7664, 0xB058, 0x7665, 0xB059, 0x7666, 0xB05A, + 0x7667, 0xB05B, 0x7668, 0xB05C, 0x7669, 0xB05D, 0x766A, 0xB05E, + 0x766B, 0xF1B2, 0x766C, 0xB05F, 0x766D, 0xB060, 0x766E, 0xB061, + 0x766F, 0xF1B3, 0x7670, 0xB062, 0x7671, 0xB063, 0x7672, 0xB064, + 0x7673, 0xB065, 0x7674, 0xB066, 0x7675, 0xB067, 0x7676, 0xB068, + 0x7677, 0xB069, 0x7678, 0xB9EF, 0x7679, 0xB06A, 0x767A, 0xB06B, + 0x767B, 0xB5C7, 0x767C, 0xB06C, 0x767D, 0xB0D7, 0x767E, 0xB0D9, + 0x767F, 0xB06D, 0x7680, 0xB06E, 0x7681, 0xB06F, 0x7682, 0xD4ED, + 0x7683, 0xB070, 0x7684, 0xB5C4, 0x7685, 0xB071, 0x7686, 0xBDD4, + 0x7687, 0xBBCA, 0x7688, 0xF0A7, 0x7689, 0xB072, 0x768A, 0xB073, + 0x768B, 0xB8DE, 0x768C, 0xB074, 0x768D, 0xB075, 0x768E, 0xF0A8, + 0x768F, 0xB076, 0x7690, 0xB077, 0x7691, 0xB0A8, 0x7692, 0xB078, + 0x7693, 0xF0A9, 0x7694, 0xB079, 0x7695, 0xB07A, 0x7696, 0xCDEE, + 0x7697, 0xB07B, 0x7698, 0xB07C, 0x7699, 0xF0AA, 0x769A, 0xB07D, + 0x769B, 0xB07E, 0x769C, 0xB080, 0x769D, 0xB081, 0x769E, 0xB082, + 0x769F, 0xB083, 0x76A0, 0xB084, 0x76A1, 0xB085, 0x76A2, 0xB086, + 0x76A3, 0xB087, 0x76A4, 0xF0AB, 0x76A5, 0xB088, 0x76A6, 0xB089, + 0x76A7, 0xB08A, 0x76A8, 0xB08B, 0x76A9, 0xB08C, 0x76AA, 0xB08D, + 0x76AB, 0xB08E, 0x76AC, 0xB08F, 0x76AD, 0xB090, 0x76AE, 0xC6A4, + 0x76AF, 0xB091, 0x76B0, 0xB092, 0x76B1, 0xD6E5, 0x76B2, 0xF1E4, + 0x76B3, 0xB093, 0x76B4, 0xF1E5, 0x76B5, 0xB094, 0x76B6, 0xB095, + 0x76B7, 0xB096, 0x76B8, 0xB097, 0x76B9, 0xB098, 0x76BA, 0xB099, + 0x76BB, 0xB09A, 0x76BC, 0xB09B, 0x76BD, 0xB09C, 0x76BE, 0xB09D, + 0x76BF, 0xC3F3, 0x76C0, 0xB09E, 0x76C1, 0xB09F, 0x76C2, 0xD3DB, + 0x76C3, 0xB0A0, 0x76C4, 0xB140, 0x76C5, 0xD6D1, 0x76C6, 0xC5E8, + 0x76C7, 0xB141, 0x76C8, 0xD3AF, 0x76C9, 0xB142, 0x76CA, 0xD2E6, + 0x76CB, 0xB143, 0x76CC, 0xB144, 0x76CD, 0xEEC1, 0x76CE, 0xB0BB, + 0x76CF, 0xD5B5, 0x76D0, 0xD1CE, 0x76D1, 0xBCE0, 0x76D2, 0xBAD0, + 0x76D3, 0xB145, 0x76D4, 0xBFF8, 0x76D5, 0xB146, 0x76D6, 0xB8C7, + 0x76D7, 0xB5C1, 0x76D8, 0xC5CC, 0x76D9, 0xB147, 0x76DA, 0xB148, + 0x76DB, 0xCAA2, 0x76DC, 0xB149, 0x76DD, 0xB14A, 0x76DE, 0xB14B, + 0x76DF, 0xC3CB, 0x76E0, 0xB14C, 0x76E1, 0xB14D, 0x76E2, 0xB14E, + 0x76E3, 0xB14F, 0x76E4, 0xB150, 0x76E5, 0xEEC2, 0x76E6, 0xB151, + 0x76E7, 0xB152, 0x76E8, 0xB153, 0x76E9, 0xB154, 0x76EA, 0xB155, + 0x76EB, 0xB156, 0x76EC, 0xB157, 0x76ED, 0xB158, 0x76EE, 0xC4BF, + 0x76EF, 0xB6A2, 0x76F0, 0xB159, 0x76F1, 0xEDEC, 0x76F2, 0xC3A4, + 0x76F3, 0xB15A, 0x76F4, 0xD6B1, 0x76F5, 0xB15B, 0x76F6, 0xB15C, + 0x76F7, 0xB15D, 0x76F8, 0xCFE0, 0x76F9, 0xEDEF, 0x76FA, 0xB15E, + 0x76FB, 0xB15F, 0x76FC, 0xC5CE, 0x76FD, 0xB160, 0x76FE, 0xB6DC, + 0x76FF, 0xB161, 0x7700, 0xB162, 0x7701, 0xCAA1, 0x7702, 0xB163, + 0x7703, 0xB164, 0x7704, 0xEDED, 0x7705, 0xB165, 0x7706, 0xB166, + 0x7707, 0xEDF0, 0x7708, 0xEDF1, 0x7709, 0xC3BC, 0x770A, 0xB167, + 0x770B, 0xBFB4, 0x770C, 0xB168, 0x770D, 0xEDEE, 0x770E, 0xB169, + 0x770F, 0xB16A, 0x7710, 0xB16B, 0x7711, 0xB16C, 0x7712, 0xB16D, + 0x7713, 0xB16E, 0x7714, 0xB16F, 0x7715, 0xB170, 0x7716, 0xB171, + 0x7717, 0xB172, 0x7718, 0xB173, 0x7719, 0xEDF4, 0x771A, 0xEDF2, + 0x771B, 0xB174, 0x771C, 0xB175, 0x771D, 0xB176, 0x771E, 0xB177, + 0x771F, 0xD5E6, 0x7720, 0xC3DF, 0x7721, 0xB178, 0x7722, 0xEDF3, + 0x7723, 0xB179, 0x7724, 0xB17A, 0x7725, 0xB17B, 0x7726, 0xEDF6, + 0x7727, 0xB17C, 0x7728, 0xD5A3, 0x7729, 0xD1A3, 0x772A, 0xB17D, + 0x772B, 0xB17E, 0x772C, 0xB180, 0x772D, 0xEDF5, 0x772E, 0xB181, + 0x772F, 0xC3D0, 0x7730, 0xB182, 0x7731, 0xB183, 0x7732, 0xB184, + 0x7733, 0xB185, 0x7734, 0xB186, 0x7735, 0xEDF7, 0x7736, 0xBFF4, + 0x7737, 0xBEEC, 0x7738, 0xEDF8, 0x7739, 0xB187, 0x773A, 0xCCF7, + 0x773B, 0xB188, 0x773C, 0xD1DB, 0x773D, 0xB189, 0x773E, 0xB18A, + 0x773F, 0xB18B, 0x7740, 0xD7C5, 0x7741, 0xD5F6, 0x7742, 0xB18C, + 0x7743, 0xEDFC, 0x7744, 0xB18D, 0x7745, 0xB18E, 0x7746, 0xB18F, + 0x7747, 0xEDFB, 0x7748, 0xB190, 0x7749, 0xB191, 0x774A, 0xB192, + 0x774B, 0xB193, 0x774C, 0xB194, 0x774D, 0xB195, 0x774E, 0xB196, + 0x774F, 0xB197, 0x7750, 0xEDF9, 0x7751, 0xEDFA, 0x7752, 0xB198, + 0x7753, 0xB199, 0x7754, 0xB19A, 0x7755, 0xB19B, 0x7756, 0xB19C, + 0x7757, 0xB19D, 0x7758, 0xB19E, 0x7759, 0xB19F, 0x775A, 0xEDFD, + 0x775B, 0xBEA6, 0x775C, 0xB1A0, 0x775D, 0xB240, 0x775E, 0xB241, + 0x775F, 0xB242, 0x7760, 0xB243, 0x7761, 0xCBAF, 0x7762, 0xEEA1, + 0x7763, 0xB6BD, 0x7764, 0xB244, 0x7765, 0xEEA2, 0x7766, 0xC4C0, + 0x7767, 0xB245, 0x7768, 0xEDFE, 0x7769, 0xB246, 0x776A, 0xB247, + 0x776B, 0xBDDE, 0x776C, 0xB2C7, 0x776D, 0xB248, 0x776E, 0xB249, + 0x776F, 0xB24A, 0x7770, 0xB24B, 0x7771, 0xB24C, 0x7772, 0xB24D, + 0x7773, 0xB24E, 0x7774, 0xB24F, 0x7775, 0xB250, 0x7776, 0xB251, + 0x7777, 0xB252, 0x7778, 0xB253, 0x7779, 0xB6C3, 0x777A, 0xB254, + 0x777B, 0xB255, 0x777C, 0xB256, 0x777D, 0xEEA5, 0x777E, 0xD8BA, + 0x777F, 0xEEA3, 0x7780, 0xEEA6, 0x7781, 0xB257, 0x7782, 0xB258, + 0x7783, 0xB259, 0x7784, 0xC3E9, 0x7785, 0xB3F2, 0x7786, 0xB25A, + 0x7787, 0xB25B, 0x7788, 0xB25C, 0x7789, 0xB25D, 0x778A, 0xB25E, + 0x778B, 0xB25F, 0x778C, 0xEEA7, 0x778D, 0xEEA4, 0x778E, 0xCFB9, + 0x778F, 0xB260, 0x7790, 0xB261, 0x7791, 0xEEA8, 0x7792, 0xC2F7, + 0x7793, 0xB262, 0x7794, 0xB263, 0x7795, 0xB264, 0x7796, 0xB265, + 0x7797, 0xB266, 0x7798, 0xB267, 0x7799, 0xB268, 0x779A, 0xB269, + 0x779B, 0xB26A, 0x779C, 0xB26B, 0x779D, 0xB26C, 0x779E, 0xB26D, + 0x779F, 0xEEA9, 0x77A0, 0xEEAA, 0x77A1, 0xB26E, 0x77A2, 0xDEAB, + 0x77A3, 0xB26F, 0x77A4, 0xB270, 0x77A5, 0xC6B3, 0x77A6, 0xB271, + 0x77A7, 0xC7C6, 0x77A8, 0xB272, 0x77A9, 0xD6F5, 0x77AA, 0xB5C9, + 0x77AB, 0xB273, 0x77AC, 0xCBB2, 0x77AD, 0xB274, 0x77AE, 0xB275, + 0x77AF, 0xB276, 0x77B0, 0xEEAB, 0x77B1, 0xB277, 0x77B2, 0xB278, + 0x77B3, 0xCDAB, 0x77B4, 0xB279, 0x77B5, 0xEEAC, 0x77B6, 0xB27A, + 0x77B7, 0xB27B, 0x77B8, 0xB27C, 0x77B9, 0xB27D, 0x77BA, 0xB27E, + 0x77BB, 0xD5B0, 0x77BC, 0xB280, 0x77BD, 0xEEAD, 0x77BE, 0xB281, + 0x77BF, 0xF6C4, 0x77C0, 0xB282, 0x77C1, 0xB283, 0x77C2, 0xB284, + 0x77C3, 0xB285, 0x77C4, 0xB286, 0x77C5, 0xB287, 0x77C6, 0xB288, + 0x77C7, 0xB289, 0x77C8, 0xB28A, 0x77C9, 0xB28B, 0x77CA, 0xB28C, + 0x77CB, 0xB28D, 0x77CC, 0xB28E, 0x77CD, 0xDBC7, 0x77CE, 0xB28F, + 0x77CF, 0xB290, 0x77D0, 0xB291, 0x77D1, 0xB292, 0x77D2, 0xB293, + 0x77D3, 0xB294, 0x77D4, 0xB295, 0x77D5, 0xB296, 0x77D6, 0xB297, + 0x77D7, 0xB4A3, 0x77D8, 0xB298, 0x77D9, 0xB299, 0x77DA, 0xB29A, + 0x77DB, 0xC3AC, 0x77DC, 0xF1E6, 0x77DD, 0xB29B, 0x77DE, 0xB29C, + 0x77DF, 0xB29D, 0x77E0, 0xB29E, 0x77E1, 0xB29F, 0x77E2, 0xCAB8, + 0x77E3, 0xD2D3, 0x77E4, 0xB2A0, 0x77E5, 0xD6AA, 0x77E6, 0xB340, + 0x77E7, 0xEFF2, 0x77E8, 0xB341, 0x77E9, 0xBED8, 0x77EA, 0xB342, + 0x77EB, 0xBDC3, 0x77EC, 0xEFF3, 0x77ED, 0xB6CC, 0x77EE, 0xB0AB, + 0x77EF, 0xB343, 0x77F0, 0xB344, 0x77F1, 0xB345, 0x77F2, 0xB346, + 0x77F3, 0xCAAF, 0x77F4, 0xB347, 0x77F5, 0xB348, 0x77F6, 0xEDB6, + 0x77F7, 0xB349, 0x77F8, 0xEDB7, 0x77F9, 0xB34A, 0x77FA, 0xB34B, + 0x77FB, 0xB34C, 0x77FC, 0xB34D, 0x77FD, 0xCEF9, 0x77FE, 0xB7AF, + 0x77FF, 0xBFF3, 0x7800, 0xEDB8, 0x7801, 0xC2EB, 0x7802, 0xC9B0, + 0x7803, 0xB34E, 0x7804, 0xB34F, 0x7805, 0xB350, 0x7806, 0xB351, + 0x7807, 0xB352, 0x7808, 0xB353, 0x7809, 0xEDB9, 0x780A, 0xB354, + 0x780B, 0xB355, 0x780C, 0xC6F6, 0x780D, 0xBFB3, 0x780E, 0xB356, + 0x780F, 0xB357, 0x7810, 0xB358, 0x7811, 0xEDBC, 0x7812, 0xC5F8, + 0x7813, 0xB359, 0x7814, 0xD1D0, 0x7815, 0xB35A, 0x7816, 0xD7A9, + 0x7817, 0xEDBA, 0x7818, 0xEDBB, 0x7819, 0xB35B, 0x781A, 0xD1E2, + 0x781B, 0xB35C, 0x781C, 0xEDBF, 0x781D, 0xEDC0, 0x781E, 0xB35D, + 0x781F, 0xEDC4, 0x7820, 0xB35E, 0x7821, 0xB35F, 0x7822, 0xB360, + 0x7823, 0xEDC8, 0x7824, 0xB361, 0x7825, 0xEDC6, 0x7826, 0xEDCE, + 0x7827, 0xD5E8, 0x7828, 0xB362, 0x7829, 0xEDC9, 0x782A, 0xB363, + 0x782B, 0xB364, 0x782C, 0xEDC7, 0x782D, 0xEDBE, 0x782E, 0xB365, + 0x782F, 0xB366, 0x7830, 0xC5E9, 0x7831, 0xB367, 0x7832, 0xB368, + 0x7833, 0xB369, 0x7834, 0xC6C6, 0x7835, 0xB36A, 0x7836, 0xB36B, + 0x7837, 0xC9E9, 0x7838, 0xD4D2, 0x7839, 0xEDC1, 0x783A, 0xEDC2, + 0x783B, 0xEDC3, 0x783C, 0xEDC5, 0x783D, 0xB36C, 0x783E, 0xC0F9, + 0x783F, 0xB36D, 0x7840, 0xB4A1, 0x7841, 0xB36E, 0x7842, 0xB36F, + 0x7843, 0xB370, 0x7844, 0xB371, 0x7845, 0xB9E8, 0x7846, 0xB372, + 0x7847, 0xEDD0, 0x7848, 0xB373, 0x7849, 0xB374, 0x784A, 0xB375, + 0x784B, 0xB376, 0x784C, 0xEDD1, 0x784D, 0xB377, 0x784E, 0xEDCA, + 0x784F, 0xB378, 0x7850, 0xEDCF, 0x7851, 0xB379, 0x7852, 0xCEF8, + 0x7853, 0xB37A, 0x7854, 0xB37B, 0x7855, 0xCBB6, 0x7856, 0xEDCC, + 0x7857, 0xEDCD, 0x7858, 0xB37C, 0x7859, 0xB37D, 0x785A, 0xB37E, + 0x785B, 0xB380, 0x785C, 0xB381, 0x785D, 0xCFF5, 0x785E, 0xB382, + 0x785F, 0xB383, 0x7860, 0xB384, 0x7861, 0xB385, 0x7862, 0xB386, + 0x7863, 0xB387, 0x7864, 0xB388, 0x7865, 0xB389, 0x7866, 0xB38A, + 0x7867, 0xB38B, 0x7868, 0xB38C, 0x7869, 0xB38D, 0x786A, 0xEDD2, + 0x786B, 0xC1F2, 0x786C, 0xD3B2, 0x786D, 0xEDCB, 0x786E, 0xC8B7, + 0x786F, 0xB38E, 0x7870, 0xB38F, 0x7871, 0xB390, 0x7872, 0xB391, + 0x7873, 0xB392, 0x7874, 0xB393, 0x7875, 0xB394, 0x7876, 0xB395, + 0x7877, 0xBCEF, 0x7878, 0xB396, 0x7879, 0xB397, 0x787A, 0xB398, + 0x787B, 0xB399, 0x787C, 0xC5F0, 0x787D, 0xB39A, 0x787E, 0xB39B, + 0x787F, 0xB39C, 0x7880, 0xB39D, 0x7881, 0xB39E, 0x7882, 0xB39F, + 0x7883, 0xB3A0, 0x7884, 0xB440, 0x7885, 0xB441, 0x7886, 0xB442, + 0x7887, 0xEDD6, 0x7888, 0xB443, 0x7889, 0xB5EF, 0x788A, 0xB444, + 0x788B, 0xB445, 0x788C, 0xC2B5, 0x788D, 0xB0AD, 0x788E, 0xCBE9, + 0x788F, 0xB446, 0x7890, 0xB447, 0x7891, 0xB1AE, 0x7892, 0xB448, + 0x7893, 0xEDD4, 0x7894, 0xB449, 0x7895, 0xB44A, 0x7896, 0xB44B, + 0x7897, 0xCDEB, 0x7898, 0xB5E2, 0x7899, 0xB44C, 0x789A, 0xEDD5, + 0x789B, 0xEDD3, 0x789C, 0xEDD7, 0x789D, 0xB44D, 0x789E, 0xB44E, + 0x789F, 0xB5FA, 0x78A0, 0xB44F, 0x78A1, 0xEDD8, 0x78A2, 0xB450, + 0x78A3, 0xEDD9, 0x78A4, 0xB451, 0x78A5, 0xEDDC, 0x78A6, 0xB452, + 0x78A7, 0xB1CC, 0x78A8, 0xB453, 0x78A9, 0xB454, 0x78AA, 0xB455, + 0x78AB, 0xB456, 0x78AC, 0xB457, 0x78AD, 0xB458, 0x78AE, 0xB459, + 0x78AF, 0xB45A, 0x78B0, 0xC5F6, 0x78B1, 0xBCEE, 0x78B2, 0xEDDA, + 0x78B3, 0xCCBC, 0x78B4, 0xB2EA, 0x78B5, 0xB45B, 0x78B6, 0xB45C, + 0x78B7, 0xB45D, 0x78B8, 0xB45E, 0x78B9, 0xEDDB, 0x78BA, 0xB45F, + 0x78BB, 0xB460, 0x78BC, 0xB461, 0x78BD, 0xB462, 0x78BE, 0xC4EB, + 0x78BF, 0xB463, 0x78C0, 0xB464, 0x78C1, 0xB4C5, 0x78C2, 0xB465, + 0x78C3, 0xB466, 0x78C4, 0xB467, 0x78C5, 0xB0F5, 0x78C6, 0xB468, + 0x78C7, 0xB469, 0x78C8, 0xB46A, 0x78C9, 0xEDDF, 0x78CA, 0xC0DA, + 0x78CB, 0xB4E8, 0x78CC, 0xB46B, 0x78CD, 0xB46C, 0x78CE, 0xB46D, + 0x78CF, 0xB46E, 0x78D0, 0xC5CD, 0x78D1, 0xB46F, 0x78D2, 0xB470, + 0x78D3, 0xB471, 0x78D4, 0xEDDD, 0x78D5, 0xBFC4, 0x78D6, 0xB472, + 0x78D7, 0xB473, 0x78D8, 0xB474, 0x78D9, 0xEDDE, 0x78DA, 0xB475, + 0x78DB, 0xB476, 0x78DC, 0xB477, 0x78DD, 0xB478, 0x78DE, 0xB479, + 0x78DF, 0xB47A, 0x78E0, 0xB47B, 0x78E1, 0xB47C, 0x78E2, 0xB47D, + 0x78E3, 0xB47E, 0x78E4, 0xB480, 0x78E5, 0xB481, 0x78E6, 0xB482, + 0x78E7, 0xB483, 0x78E8, 0xC4A5, 0x78E9, 0xB484, 0x78EA, 0xB485, + 0x78EB, 0xB486, 0x78EC, 0xEDE0, 0x78ED, 0xB487, 0x78EE, 0xB488, + 0x78EF, 0xB489, 0x78F0, 0xB48A, 0x78F1, 0xB48B, 0x78F2, 0xEDE1, + 0x78F3, 0xB48C, 0x78F4, 0xEDE3, 0x78F5, 0xB48D, 0x78F6, 0xB48E, + 0x78F7, 0xC1D7, 0x78F8, 0xB48F, 0x78F9, 0xB490, 0x78FA, 0xBBC7, + 0x78FB, 0xB491, 0x78FC, 0xB492, 0x78FD, 0xB493, 0x78FE, 0xB494, + 0x78FF, 0xB495, 0x7900, 0xB496, 0x7901, 0xBDB8, 0x7902, 0xB497, + 0x7903, 0xB498, 0x7904, 0xB499, 0x7905, 0xEDE2, 0x7906, 0xB49A, + 0x7907, 0xB49B, 0x7908, 0xB49C, 0x7909, 0xB49D, 0x790A, 0xB49E, + 0x790B, 0xB49F, 0x790C, 0xB4A0, 0x790D, 0xB540, 0x790E, 0xB541, + 0x790F, 0xB542, 0x7910, 0xB543, 0x7911, 0xB544, 0x7912, 0xB545, + 0x7913, 0xEDE4, 0x7914, 0xB546, 0x7915, 0xB547, 0x7916, 0xB548, + 0x7917, 0xB549, 0x7918, 0xB54A, 0x7919, 0xB54B, 0x791A, 0xB54C, + 0x791B, 0xB54D, 0x791C, 0xB54E, 0x791D, 0xB54F, 0x791E, 0xEDE6, + 0x791F, 0xB550, 0x7920, 0xB551, 0x7921, 0xB552, 0x7922, 0xB553, + 0x7923, 0xB554, 0x7924, 0xEDE5, 0x7925, 0xB555, 0x7926, 0xB556, + 0x7927, 0xB557, 0x7928, 0xB558, 0x7929, 0xB559, 0x792A, 0xB55A, + 0x792B, 0xB55B, 0x792C, 0xB55C, 0x792D, 0xB55D, 0x792E, 0xB55E, + 0x792F, 0xB55F, 0x7930, 0xB560, 0x7931, 0xB561, 0x7932, 0xB562, + 0x7933, 0xB563, 0x7934, 0xEDE7, 0x7935, 0xB564, 0x7936, 0xB565, + 0x7937, 0xB566, 0x7938, 0xB567, 0x7939, 0xB568, 0x793A, 0xCABE, + 0x793B, 0xECEA, 0x793C, 0xC0F1, 0x793D, 0xB569, 0x793E, 0xC9E7, + 0x793F, 0xB56A, 0x7940, 0xECEB, 0x7941, 0xC6EE, 0x7942, 0xB56B, + 0x7943, 0xB56C, 0x7944, 0xB56D, 0x7945, 0xB56E, 0x7946, 0xECEC, + 0x7947, 0xB56F, 0x7948, 0xC6ED, 0x7949, 0xECED, 0x794A, 0xB570, + 0x794B, 0xB571, 0x794C, 0xB572, 0x794D, 0xB573, 0x794E, 0xB574, + 0x794F, 0xB575, 0x7950, 0xB576, 0x7951, 0xB577, 0x7952, 0xB578, + 0x7953, 0xECF0, 0x7954, 0xB579, 0x7955, 0xB57A, 0x7956, 0xD7E6, + 0x7957, 0xECF3, 0x7958, 0xB57B, 0x7959, 0xB57C, 0x795A, 0xECF1, + 0x795B, 0xECEE, 0x795C, 0xECEF, 0x795D, 0xD7A3, 0x795E, 0xC9F1, + 0x795F, 0xCBEE, 0x7960, 0xECF4, 0x7961, 0xB57D, 0x7962, 0xECF2, + 0x7963, 0xB57E, 0x7964, 0xB580, 0x7965, 0xCFE9, 0x7966, 0xB581, + 0x7967, 0xECF6, 0x7968, 0xC6B1, 0x7969, 0xB582, 0x796A, 0xB583, + 0x796B, 0xB584, 0x796C, 0xB585, 0x796D, 0xBCC0, 0x796E, 0xB586, + 0x796F, 0xECF5, 0x7970, 0xB587, 0x7971, 0xB588, 0x7972, 0xB589, + 0x7973, 0xB58A, 0x7974, 0xB58B, 0x7975, 0xB58C, 0x7976, 0xB58D, + 0x7977, 0xB5BB, 0x7978, 0xBBF6, 0x7979, 0xB58E, 0x797A, 0xECF7, + 0x797B, 0xB58F, 0x797C, 0xB590, 0x797D, 0xB591, 0x797E, 0xB592, + 0x797F, 0xB593, 0x7980, 0xD9F7, 0x7981, 0xBDFB, 0x7982, 0xB594, + 0x7983, 0xB595, 0x7984, 0xC2BB, 0x7985, 0xECF8, 0x7986, 0xB596, + 0x7987, 0xB597, 0x7988, 0xB598, 0x7989, 0xB599, 0x798A, 0xECF9, + 0x798B, 0xB59A, 0x798C, 0xB59B, 0x798D, 0xB59C, 0x798E, 0xB59D, + 0x798F, 0xB8A3, 0x7990, 0xB59E, 0x7991, 0xB59F, 0x7992, 0xB5A0, + 0x7993, 0xB640, 0x7994, 0xB641, 0x7995, 0xB642, 0x7996, 0xB643, + 0x7997, 0xB644, 0x7998, 0xB645, 0x7999, 0xB646, 0x799A, 0xECFA, + 0x799B, 0xB647, 0x799C, 0xB648, 0x799D, 0xB649, 0x799E, 0xB64A, + 0x799F, 0xB64B, 0x79A0, 0xB64C, 0x79A1, 0xB64D, 0x79A2, 0xB64E, + 0x79A3, 0xB64F, 0x79A4, 0xB650, 0x79A5, 0xB651, 0x79A6, 0xB652, + 0x79A7, 0xECFB, 0x79A8, 0xB653, 0x79A9, 0xB654, 0x79AA, 0xB655, + 0x79AB, 0xB656, 0x79AC, 0xB657, 0x79AD, 0xB658, 0x79AE, 0xB659, + 0x79AF, 0xB65A, 0x79B0, 0xB65B, 0x79B1, 0xB65C, 0x79B2, 0xB65D, + 0x79B3, 0xECFC, 0x79B4, 0xB65E, 0x79B5, 0xB65F, 0x79B6, 0xB660, + 0x79B7, 0xB661, 0x79B8, 0xB662, 0x79B9, 0xD3ED, 0x79BA, 0xD8AE, + 0x79BB, 0xC0EB, 0x79BC, 0xB663, 0x79BD, 0xC7DD, 0x79BE, 0xBACC, + 0x79BF, 0xB664, 0x79C0, 0xD0E3, 0x79C1, 0xCBBD, 0x79C2, 0xB665, + 0x79C3, 0xCDBA, 0x79C4, 0xB666, 0x79C5, 0xB667, 0x79C6, 0xB8D1, + 0x79C7, 0xB668, 0x79C8, 0xB669, 0x79C9, 0xB1FC, 0x79CA, 0xB66A, + 0x79CB, 0xC7EF, 0x79CC, 0xB66B, 0x79CD, 0xD6D6, 0x79CE, 0xB66C, + 0x79CF, 0xB66D, 0x79D0, 0xB66E, 0x79D1, 0xBFC6, 0x79D2, 0xC3EB, + 0x79D3, 0xB66F, 0x79D4, 0xB670, 0x79D5, 0xEFF5, 0x79D6, 0xB671, + 0x79D7, 0xB672, 0x79D8, 0xC3D8, 0x79D9, 0xB673, 0x79DA, 0xB674, + 0x79DB, 0xB675, 0x79DC, 0xB676, 0x79DD, 0xB677, 0x79DE, 0xB678, + 0x79DF, 0xD7E2, 0x79E0, 0xB679, 0x79E1, 0xB67A, 0x79E2, 0xB67B, + 0x79E3, 0xEFF7, 0x79E4, 0xB3D3, 0x79E5, 0xB67C, 0x79E6, 0xC7D8, + 0x79E7, 0xD1ED, 0x79E8, 0xB67D, 0x79E9, 0xD6C8, 0x79EA, 0xB67E, + 0x79EB, 0xEFF8, 0x79EC, 0xB680, 0x79ED, 0xEFF6, 0x79EE, 0xB681, + 0x79EF, 0xBBFD, 0x79F0, 0xB3C6, 0x79F1, 0xB682, 0x79F2, 0xB683, + 0x79F3, 0xB684, 0x79F4, 0xB685, 0x79F5, 0xB686, 0x79F6, 0xB687, + 0x79F7, 0xB688, 0x79F8, 0xBDD5, 0x79F9, 0xB689, 0x79FA, 0xB68A, + 0x79FB, 0xD2C6, 0x79FC, 0xB68B, 0x79FD, 0xBBE0, 0x79FE, 0xB68C, + 0x79FF, 0xB68D, 0x7A00, 0xCFA1, 0x7A01, 0xB68E, 0x7A02, 0xEFFC, + 0x7A03, 0xEFFB, 0x7A04, 0xB68F, 0x7A05, 0xB690, 0x7A06, 0xEFF9, + 0x7A07, 0xB691, 0x7A08, 0xB692, 0x7A09, 0xB693, 0x7A0A, 0xB694, + 0x7A0B, 0xB3CC, 0x7A0C, 0xB695, 0x7A0D, 0xC9D4, 0x7A0E, 0xCBB0, + 0x7A0F, 0xB696, 0x7A10, 0xB697, 0x7A11, 0xB698, 0x7A12, 0xB699, + 0x7A13, 0xB69A, 0x7A14, 0xEFFE, 0x7A15, 0xB69B, 0x7A16, 0xB69C, + 0x7A17, 0xB0DE, 0x7A18, 0xB69D, 0x7A19, 0xB69E, 0x7A1A, 0xD6C9, + 0x7A1B, 0xB69F, 0x7A1C, 0xB6A0, 0x7A1D, 0xB740, 0x7A1E, 0xEFFD, + 0x7A1F, 0xB741, 0x7A20, 0xB3ED, 0x7A21, 0xB742, 0x7A22, 0xB743, + 0x7A23, 0xF6D5, 0x7A24, 0xB744, 0x7A25, 0xB745, 0x7A26, 0xB746, + 0x7A27, 0xB747, 0x7A28, 0xB748, 0x7A29, 0xB749, 0x7A2A, 0xB74A, + 0x7A2B, 0xB74B, 0x7A2C, 0xB74C, 0x7A2D, 0xB74D, 0x7A2E, 0xB74E, + 0x7A2F, 0xB74F, 0x7A30, 0xB750, 0x7A31, 0xB751, 0x7A32, 0xB752, + 0x7A33, 0xCEC8, 0x7A34, 0xB753, 0x7A35, 0xB754, 0x7A36, 0xB755, + 0x7A37, 0xF0A2, 0x7A38, 0xB756, 0x7A39, 0xF0A1, 0x7A3A, 0xB757, + 0x7A3B, 0xB5BE, 0x7A3C, 0xBCDA, 0x7A3D, 0xBBFC, 0x7A3E, 0xB758, + 0x7A3F, 0xB8E5, 0x7A40, 0xB759, 0x7A41, 0xB75A, 0x7A42, 0xB75B, + 0x7A43, 0xB75C, 0x7A44, 0xB75D, 0x7A45, 0xB75E, 0x7A46, 0xC4C2, + 0x7A47, 0xB75F, 0x7A48, 0xB760, 0x7A49, 0xB761, 0x7A4A, 0xB762, + 0x7A4B, 0xB763, 0x7A4C, 0xB764, 0x7A4D, 0xB765, 0x7A4E, 0xB766, + 0x7A4F, 0xB767, 0x7A50, 0xB768, 0x7A51, 0xF0A3, 0x7A52, 0xB769, + 0x7A53, 0xB76A, 0x7A54, 0xB76B, 0x7A55, 0xB76C, 0x7A56, 0xB76D, + 0x7A57, 0xCBEB, 0x7A58, 0xB76E, 0x7A59, 0xB76F, 0x7A5A, 0xB770, + 0x7A5B, 0xB771, 0x7A5C, 0xB772, 0x7A5D, 0xB773, 0x7A5E, 0xB774, + 0x7A5F, 0xB775, 0x7A60, 0xB776, 0x7A61, 0xB777, 0x7A62, 0xB778, + 0x7A63, 0xB779, 0x7A64, 0xB77A, 0x7A65, 0xB77B, 0x7A66, 0xB77C, + 0x7A67, 0xB77D, 0x7A68, 0xB77E, 0x7A69, 0xB780, 0x7A6A, 0xB781, + 0x7A6B, 0xB782, 0x7A6C, 0xB783, 0x7A6D, 0xB784, 0x7A6E, 0xB785, + 0x7A6F, 0xB786, 0x7A70, 0xF0A6, 0x7A71, 0xB787, 0x7A72, 0xB788, + 0x7A73, 0xB789, 0x7A74, 0xD1A8, 0x7A75, 0xB78A, 0x7A76, 0xBEBF, + 0x7A77, 0xC7EE, 0x7A78, 0xF1B6, 0x7A79, 0xF1B7, 0x7A7A, 0xBFD5, + 0x7A7B, 0xB78B, 0x7A7C, 0xB78C, 0x7A7D, 0xB78D, 0x7A7E, 0xB78E, + 0x7A7F, 0xB4A9, 0x7A80, 0xF1B8, 0x7A81, 0xCDBB, 0x7A82, 0xB78F, + 0x7A83, 0xC7D4, 0x7A84, 0xD5AD, 0x7A85, 0xB790, 0x7A86, 0xF1B9, + 0x7A87, 0xB791, 0x7A88, 0xF1BA, 0x7A89, 0xB792, 0x7A8A, 0xB793, + 0x7A8B, 0xB794, 0x7A8C, 0xB795, 0x7A8D, 0xC7CF, 0x7A8E, 0xB796, + 0x7A8F, 0xB797, 0x7A90, 0xB798, 0x7A91, 0xD2A4, 0x7A92, 0xD6CF, + 0x7A93, 0xB799, 0x7A94, 0xB79A, 0x7A95, 0xF1BB, 0x7A96, 0xBDD1, + 0x7A97, 0xB4B0, 0x7A98, 0xBEBD, 0x7A99, 0xB79B, 0x7A9A, 0xB79C, + 0x7A9B, 0xB79D, 0x7A9C, 0xB4DC, 0x7A9D, 0xCED1, 0x7A9E, 0xB79E, + 0x7A9F, 0xBFDF, 0x7AA0, 0xF1BD, 0x7AA1, 0xB79F, 0x7AA2, 0xB7A0, + 0x7AA3, 0xB840, 0x7AA4, 0xB841, 0x7AA5, 0xBFFA, 0x7AA6, 0xF1BC, + 0x7AA7, 0xB842, 0x7AA8, 0xF1BF, 0x7AA9, 0xB843, 0x7AAA, 0xB844, + 0x7AAB, 0xB845, 0x7AAC, 0xF1BE, 0x7AAD, 0xF1C0, 0x7AAE, 0xB846, + 0x7AAF, 0xB847, 0x7AB0, 0xB848, 0x7AB1, 0xB849, 0x7AB2, 0xB84A, + 0x7AB3, 0xF1C1, 0x7AB4, 0xB84B, 0x7AB5, 0xB84C, 0x7AB6, 0xB84D, + 0x7AB7, 0xB84E, 0x7AB8, 0xB84F, 0x7AB9, 0xB850, 0x7ABA, 0xB851, + 0x7ABB, 0xB852, 0x7ABC, 0xB853, 0x7ABD, 0xB854, 0x7ABE, 0xB855, + 0x7ABF, 0xC1FE, 0x7AC0, 0xB856, 0x7AC1, 0xB857, 0x7AC2, 0xB858, + 0x7AC3, 0xB859, 0x7AC4, 0xB85A, 0x7AC5, 0xB85B, 0x7AC6, 0xB85C, + 0x7AC7, 0xB85D, 0x7AC8, 0xB85E, 0x7AC9, 0xB85F, 0x7ACA, 0xB860, + 0x7ACB, 0xC1A2, 0x7ACC, 0xB861, 0x7ACD, 0xB862, 0x7ACE, 0xB863, + 0x7ACF, 0xB864, 0x7AD0, 0xB865, 0x7AD1, 0xB866, 0x7AD2, 0xB867, + 0x7AD3, 0xB868, 0x7AD4, 0xB869, 0x7AD5, 0xB86A, 0x7AD6, 0xCAFA, + 0x7AD7, 0xB86B, 0x7AD8, 0xB86C, 0x7AD9, 0xD5BE, 0x7ADA, 0xB86D, + 0x7ADB, 0xB86E, 0x7ADC, 0xB86F, 0x7ADD, 0xB870, 0x7ADE, 0xBEBA, + 0x7ADF, 0xBEB9, 0x7AE0, 0xD5C2, 0x7AE1, 0xB871, 0x7AE2, 0xB872, + 0x7AE3, 0xBFA2, 0x7AE4, 0xB873, 0x7AE5, 0xCDAF, 0x7AE6, 0xF1B5, + 0x7AE7, 0xB874, 0x7AE8, 0xB875, 0x7AE9, 0xB876, 0x7AEA, 0xB877, + 0x7AEB, 0xB878, 0x7AEC, 0xB879, 0x7AED, 0xBDDF, 0x7AEE, 0xB87A, + 0x7AEF, 0xB6CB, 0x7AF0, 0xB87B, 0x7AF1, 0xB87C, 0x7AF2, 0xB87D, + 0x7AF3, 0xB87E, 0x7AF4, 0xB880, 0x7AF5, 0xB881, 0x7AF6, 0xB882, + 0x7AF7, 0xB883, 0x7AF8, 0xB884, 0x7AF9, 0xD6F1, 0x7AFA, 0xF3C3, + 0x7AFB, 0xB885, 0x7AFC, 0xB886, 0x7AFD, 0xF3C4, 0x7AFE, 0xB887, + 0x7AFF, 0xB8CD, 0x7B00, 0xB888, 0x7B01, 0xB889, 0x7B02, 0xB88A, + 0x7B03, 0xF3C6, 0x7B04, 0xF3C7, 0x7B05, 0xB88B, 0x7B06, 0xB0CA, + 0x7B07, 0xB88C, 0x7B08, 0xF3C5, 0x7B09, 0xB88D, 0x7B0A, 0xF3C9, + 0x7B0B, 0xCBF1, 0x7B0C, 0xB88E, 0x7B0D, 0xB88F, 0x7B0E, 0xB890, + 0x7B0F, 0xF3CB, 0x7B10, 0xB891, 0x7B11, 0xD0A6, 0x7B12, 0xB892, + 0x7B13, 0xB893, 0x7B14, 0xB1CA, 0x7B15, 0xF3C8, 0x7B16, 0xB894, + 0x7B17, 0xB895, 0x7B18, 0xB896, 0x7B19, 0xF3CF, 0x7B1A, 0xB897, + 0x7B1B, 0xB5D1, 0x7B1C, 0xB898, 0x7B1D, 0xB899, 0x7B1E, 0xF3D7, + 0x7B1F, 0xB89A, 0x7B20, 0xF3D2, 0x7B21, 0xB89B, 0x7B22, 0xB89C, + 0x7B23, 0xB89D, 0x7B24, 0xF3D4, 0x7B25, 0xF3D3, 0x7B26, 0xB7FB, + 0x7B27, 0xB89E, 0x7B28, 0xB1BF, 0x7B29, 0xB89F, 0x7B2A, 0xF3CE, + 0x7B2B, 0xF3CA, 0x7B2C, 0xB5DA, 0x7B2D, 0xB8A0, 0x7B2E, 0xF3D0, + 0x7B2F, 0xB940, 0x7B30, 0xB941, 0x7B31, 0xF3D1, 0x7B32, 0xB942, + 0x7B33, 0xF3D5, 0x7B34, 0xB943, 0x7B35, 0xB944, 0x7B36, 0xB945, + 0x7B37, 0xB946, 0x7B38, 0xF3CD, 0x7B39, 0xB947, 0x7B3A, 0xBCE3, + 0x7B3B, 0xB948, 0x7B3C, 0xC1FD, 0x7B3D, 0xB949, 0x7B3E, 0xF3D6, + 0x7B3F, 0xB94A, 0x7B40, 0xB94B, 0x7B41, 0xB94C, 0x7B42, 0xB94D, + 0x7B43, 0xB94E, 0x7B44, 0xB94F, 0x7B45, 0xF3DA, 0x7B46, 0xB950, + 0x7B47, 0xF3CC, 0x7B48, 0xB951, 0x7B49, 0xB5C8, 0x7B4A, 0xB952, + 0x7B4B, 0xBDEE, 0x7B4C, 0xF3DC, 0x7B4D, 0xB953, 0x7B4E, 0xB954, + 0x7B4F, 0xB7A4, 0x7B50, 0xBFF0, 0x7B51, 0xD6FE, 0x7B52, 0xCDB2, + 0x7B53, 0xB955, 0x7B54, 0xB4F0, 0x7B55, 0xB956, 0x7B56, 0xB2DF, + 0x7B57, 0xB957, 0x7B58, 0xF3D8, 0x7B59, 0xB958, 0x7B5A, 0xF3D9, + 0x7B5B, 0xC9B8, 0x7B5C, 0xB959, 0x7B5D, 0xF3DD, 0x7B5E, 0xB95A, + 0x7B5F, 0xB95B, 0x7B60, 0xF3DE, 0x7B61, 0xB95C, 0x7B62, 0xF3E1, + 0x7B63, 0xB95D, 0x7B64, 0xB95E, 0x7B65, 0xB95F, 0x7B66, 0xB960, + 0x7B67, 0xB961, 0x7B68, 0xB962, 0x7B69, 0xB963, 0x7B6A, 0xB964, + 0x7B6B, 0xB965, 0x7B6C, 0xB966, 0x7B6D, 0xB967, 0x7B6E, 0xF3DF, + 0x7B6F, 0xB968, 0x7B70, 0xB969, 0x7B71, 0xF3E3, 0x7B72, 0xF3E2, + 0x7B73, 0xB96A, 0x7B74, 0xB96B, 0x7B75, 0xF3DB, 0x7B76, 0xB96C, + 0x7B77, 0xBFEA, 0x7B78, 0xB96D, 0x7B79, 0xB3EF, 0x7B7A, 0xB96E, + 0x7B7B, 0xF3E0, 0x7B7C, 0xB96F, 0x7B7D, 0xB970, 0x7B7E, 0xC7A9, + 0x7B7F, 0xB971, 0x7B80, 0xBCF2, 0x7B81, 0xB972, 0x7B82, 0xB973, + 0x7B83, 0xB974, 0x7B84, 0xB975, 0x7B85, 0xF3EB, 0x7B86, 0xB976, + 0x7B87, 0xB977, 0x7B88, 0xB978, 0x7B89, 0xB979, 0x7B8A, 0xB97A, + 0x7B8B, 0xB97B, 0x7B8C, 0xB97C, 0x7B8D, 0xB9BF, 0x7B8E, 0xB97D, + 0x7B8F, 0xB97E, 0x7B90, 0xF3E4, 0x7B91, 0xB980, 0x7B92, 0xB981, + 0x7B93, 0xB982, 0x7B94, 0xB2AD, 0x7B95, 0xBBFE, 0x7B96, 0xB983, + 0x7B97, 0xCBE3, 0x7B98, 0xB984, 0x7B99, 0xB985, 0x7B9A, 0xB986, + 0x7B9B, 0xB987, 0x7B9C, 0xF3ED, 0x7B9D, 0xF3E9, 0x7B9E, 0xB988, + 0x7B9F, 0xB989, 0x7BA0, 0xB98A, 0x7BA1, 0xB9DC, 0x7BA2, 0xF3EE, + 0x7BA3, 0xB98B, 0x7BA4, 0xB98C, 0x7BA5, 0xB98D, 0x7BA6, 0xF3E5, + 0x7BA7, 0xF3E6, 0x7BA8, 0xF3EA, 0x7BA9, 0xC2E1, 0x7BAA, 0xF3EC, + 0x7BAB, 0xF3EF, 0x7BAC, 0xF3E8, 0x7BAD, 0xBCFD, 0x7BAE, 0xB98E, + 0x7BAF, 0xB98F, 0x7BB0, 0xB990, 0x7BB1, 0xCFE4, 0x7BB2, 0xB991, + 0x7BB3, 0xB992, 0x7BB4, 0xF3F0, 0x7BB5, 0xB993, 0x7BB6, 0xB994, + 0x7BB7, 0xB995, 0x7BB8, 0xF3E7, 0x7BB9, 0xB996, 0x7BBA, 0xB997, + 0x7BBB, 0xB998, 0x7BBC, 0xB999, 0x7BBD, 0xB99A, 0x7BBE, 0xB99B, + 0x7BBF, 0xB99C, 0x7BC0, 0xB99D, 0x7BC1, 0xF3F2, 0x7BC2, 0xB99E, + 0x7BC3, 0xB99F, 0x7BC4, 0xB9A0, 0x7BC5, 0xBA40, 0x7BC6, 0xD7AD, + 0x7BC7, 0xC6AA, 0x7BC8, 0xBA41, 0x7BC9, 0xBA42, 0x7BCA, 0xBA43, + 0x7BCB, 0xBA44, 0x7BCC, 0xF3F3, 0x7BCD, 0xBA45, 0x7BCE, 0xBA46, + 0x7BCF, 0xBA47, 0x7BD0, 0xBA48, 0x7BD1, 0xF3F1, 0x7BD2, 0xBA49, + 0x7BD3, 0xC2A8, 0x7BD4, 0xBA4A, 0x7BD5, 0xBA4B, 0x7BD6, 0xBA4C, + 0x7BD7, 0xBA4D, 0x7BD8, 0xBA4E, 0x7BD9, 0xB8DD, 0x7BDA, 0xF3F5, + 0x7BDB, 0xBA4F, 0x7BDC, 0xBA50, 0x7BDD, 0xF3F4, 0x7BDE, 0xBA51, + 0x7BDF, 0xBA52, 0x7BE0, 0xBA53, 0x7BE1, 0xB4DB, 0x7BE2, 0xBA54, + 0x7BE3, 0xBA55, 0x7BE4, 0xBA56, 0x7BE5, 0xF3F6, 0x7BE6, 0xF3F7, + 0x7BE7, 0xBA57, 0x7BE8, 0xBA58, 0x7BE9, 0xBA59, 0x7BEA, 0xF3F8, + 0x7BEB, 0xBA5A, 0x7BEC, 0xBA5B, 0x7BED, 0xBA5C, 0x7BEE, 0xC0BA, + 0x7BEF, 0xBA5D, 0x7BF0, 0xBA5E, 0x7BF1, 0xC0E9, 0x7BF2, 0xBA5F, + 0x7BF3, 0xBA60, 0x7BF4, 0xBA61, 0x7BF5, 0xBA62, 0x7BF6, 0xBA63, + 0x7BF7, 0xC5F1, 0x7BF8, 0xBA64, 0x7BF9, 0xBA65, 0x7BFA, 0xBA66, + 0x7BFB, 0xBA67, 0x7BFC, 0xF3FB, 0x7BFD, 0xBA68, 0x7BFE, 0xF3FA, + 0x7BFF, 0xBA69, 0x7C00, 0xBA6A, 0x7C01, 0xBA6B, 0x7C02, 0xBA6C, + 0x7C03, 0xBA6D, 0x7C04, 0xBA6E, 0x7C05, 0xBA6F, 0x7C06, 0xBA70, + 0x7C07, 0xB4D8, 0x7C08, 0xBA71, 0x7C09, 0xBA72, 0x7C0A, 0xBA73, + 0x7C0B, 0xF3FE, 0x7C0C, 0xF3F9, 0x7C0D, 0xBA74, 0x7C0E, 0xBA75, + 0x7C0F, 0xF3FC, 0x7C10, 0xBA76, 0x7C11, 0xBA77, 0x7C12, 0xBA78, + 0x7C13, 0xBA79, 0x7C14, 0xBA7A, 0x7C15, 0xBA7B, 0x7C16, 0xF3FD, + 0x7C17, 0xBA7C, 0x7C18, 0xBA7D, 0x7C19, 0xBA7E, 0x7C1A, 0xBA80, + 0x7C1B, 0xBA81, 0x7C1C, 0xBA82, 0x7C1D, 0xBA83, 0x7C1E, 0xBA84, + 0x7C1F, 0xF4A1, 0x7C20, 0xBA85, 0x7C21, 0xBA86, 0x7C22, 0xBA87, + 0x7C23, 0xBA88, 0x7C24, 0xBA89, 0x7C25, 0xBA8A, 0x7C26, 0xF4A3, + 0x7C27, 0xBBC9, 0x7C28, 0xBA8B, 0x7C29, 0xBA8C, 0x7C2A, 0xF4A2, + 0x7C2B, 0xBA8D, 0x7C2C, 0xBA8E, 0x7C2D, 0xBA8F, 0x7C2E, 0xBA90, + 0x7C2F, 0xBA91, 0x7C30, 0xBA92, 0x7C31, 0xBA93, 0x7C32, 0xBA94, + 0x7C33, 0xBA95, 0x7C34, 0xBA96, 0x7C35, 0xBA97, 0x7C36, 0xBA98, + 0x7C37, 0xBA99, 0x7C38, 0xF4A4, 0x7C39, 0xBA9A, 0x7C3A, 0xBA9B, + 0x7C3B, 0xBA9C, 0x7C3C, 0xBA9D, 0x7C3D, 0xBA9E, 0x7C3E, 0xBA9F, + 0x7C3F, 0xB2BE, 0x7C40, 0xF4A6, 0x7C41, 0xF4A5, 0x7C42, 0xBAA0, + 0x7C43, 0xBB40, 0x7C44, 0xBB41, 0x7C45, 0xBB42, 0x7C46, 0xBB43, + 0x7C47, 0xBB44, 0x7C48, 0xBB45, 0x7C49, 0xBB46, 0x7C4A, 0xBB47, + 0x7C4B, 0xBB48, 0x7C4C, 0xBB49, 0x7C4D, 0xBCAE, 0x7C4E, 0xBB4A, + 0x7C4F, 0xBB4B, 0x7C50, 0xBB4C, 0x7C51, 0xBB4D, 0x7C52, 0xBB4E, + 0x7C53, 0xBB4F, 0x7C54, 0xBB50, 0x7C55, 0xBB51, 0x7C56, 0xBB52, + 0x7C57, 0xBB53, 0x7C58, 0xBB54, 0x7C59, 0xBB55, 0x7C5A, 0xBB56, + 0x7C5B, 0xBB57, 0x7C5C, 0xBB58, 0x7C5D, 0xBB59, 0x7C5E, 0xBB5A, + 0x7C5F, 0xBB5B, 0x7C60, 0xBB5C, 0x7C61, 0xBB5D, 0x7C62, 0xBB5E, + 0x7C63, 0xBB5F, 0x7C64, 0xBB60, 0x7C65, 0xBB61, 0x7C66, 0xBB62, + 0x7C67, 0xBB63, 0x7C68, 0xBB64, 0x7C69, 0xBB65, 0x7C6A, 0xBB66, + 0x7C6B, 0xBB67, 0x7C6C, 0xBB68, 0x7C6D, 0xBB69, 0x7C6E, 0xBB6A, + 0x7C6F, 0xBB6B, 0x7C70, 0xBB6C, 0x7C71, 0xBB6D, 0x7C72, 0xBB6E, + 0x7C73, 0xC3D7, 0x7C74, 0xD9E1, 0x7C75, 0xBB6F, 0x7C76, 0xBB70, + 0x7C77, 0xBB71, 0x7C78, 0xBB72, 0x7C79, 0xBB73, 0x7C7A, 0xBB74, + 0x7C7B, 0xC0E0, 0x7C7C, 0xF4CC, 0x7C7D, 0xD7D1, 0x7C7E, 0xBB75, + 0x7C7F, 0xBB76, 0x7C80, 0xBB77, 0x7C81, 0xBB78, 0x7C82, 0xBB79, + 0x7C83, 0xBB7A, 0x7C84, 0xBB7B, 0x7C85, 0xBB7C, 0x7C86, 0xBB7D, + 0x7C87, 0xBB7E, 0x7C88, 0xBB80, 0x7C89, 0xB7DB, 0x7C8A, 0xBB81, + 0x7C8B, 0xBB82, 0x7C8C, 0xBB83, 0x7C8D, 0xBB84, 0x7C8E, 0xBB85, + 0x7C8F, 0xBB86, 0x7C90, 0xBB87, 0x7C91, 0xF4CE, 0x7C92, 0xC1A3, + 0x7C93, 0xBB88, 0x7C94, 0xBB89, 0x7C95, 0xC6C9, 0x7C96, 0xBB8A, + 0x7C97, 0xB4D6, 0x7C98, 0xD5B3, 0x7C99, 0xBB8B, 0x7C9A, 0xBB8C, + 0x7C9B, 0xBB8D, 0x7C9C, 0xF4D0, 0x7C9D, 0xF4CF, 0x7C9E, 0xF4D1, + 0x7C9F, 0xCBDA, 0x7CA0, 0xBB8E, 0x7CA1, 0xBB8F, 0x7CA2, 0xF4D2, + 0x7CA3, 0xBB90, 0x7CA4, 0xD4C1, 0x7CA5, 0xD6E0, 0x7CA6, 0xBB91, + 0x7CA7, 0xBB92, 0x7CA8, 0xBB93, 0x7CA9, 0xBB94, 0x7CAA, 0xB7E0, + 0x7CAB, 0xBB95, 0x7CAC, 0xBB96, 0x7CAD, 0xBB97, 0x7CAE, 0xC1B8, + 0x7CAF, 0xBB98, 0x7CB0, 0xBB99, 0x7CB1, 0xC1BB, 0x7CB2, 0xF4D3, + 0x7CB3, 0xBEAC, 0x7CB4, 0xBB9A, 0x7CB5, 0xBB9B, 0x7CB6, 0xBB9C, + 0x7CB7, 0xBB9D, 0x7CB8, 0xBB9E, 0x7CB9, 0xB4E2, 0x7CBA, 0xBB9F, + 0x7CBB, 0xBBA0, 0x7CBC, 0xF4D4, 0x7CBD, 0xF4D5, 0x7CBE, 0xBEAB, + 0x7CBF, 0xBC40, 0x7CC0, 0xBC41, 0x7CC1, 0xF4D6, 0x7CC2, 0xBC42, + 0x7CC3, 0xBC43, 0x7CC4, 0xBC44, 0x7CC5, 0xF4DB, 0x7CC6, 0xBC45, + 0x7CC7, 0xF4D7, 0x7CC8, 0xF4DA, 0x7CC9, 0xBC46, 0x7CCA, 0xBAFD, + 0x7CCB, 0xBC47, 0x7CCC, 0xF4D8, 0x7CCD, 0xF4D9, 0x7CCE, 0xBC48, + 0x7CCF, 0xBC49, 0x7CD0, 0xBC4A, 0x7CD1, 0xBC4B, 0x7CD2, 0xBC4C, + 0x7CD3, 0xBC4D, 0x7CD4, 0xBC4E, 0x7CD5, 0xB8E2, 0x7CD6, 0xCCC7, + 0x7CD7, 0xF4DC, 0x7CD8, 0xBC4F, 0x7CD9, 0xB2DA, 0x7CDA, 0xBC50, + 0x7CDB, 0xBC51, 0x7CDC, 0xC3D3, 0x7CDD, 0xBC52, 0x7CDE, 0xBC53, + 0x7CDF, 0xD4E3, 0x7CE0, 0xBFB7, 0x7CE1, 0xBC54, 0x7CE2, 0xBC55, + 0x7CE3, 0xBC56, 0x7CE4, 0xBC57, 0x7CE5, 0xBC58, 0x7CE6, 0xBC59, + 0x7CE7, 0xBC5A, 0x7CE8, 0xF4DD, 0x7CE9, 0xBC5B, 0x7CEA, 0xBC5C, + 0x7CEB, 0xBC5D, 0x7CEC, 0xBC5E, 0x7CED, 0xBC5F, 0x7CEE, 0xBC60, + 0x7CEF, 0xC5B4, 0x7CF0, 0xBC61, 0x7CF1, 0xBC62, 0x7CF2, 0xBC63, + 0x7CF3, 0xBC64, 0x7CF4, 0xBC65, 0x7CF5, 0xBC66, 0x7CF6, 0xBC67, + 0x7CF7, 0xBC68, 0x7CF8, 0xF4E9, 0x7CF9, 0xBC69, 0x7CFA, 0xBC6A, + 0x7CFB, 0xCFB5, 0x7CFC, 0xBC6B, 0x7CFD, 0xBC6C, 0x7CFE, 0xBC6D, + 0x7CFF, 0xBC6E, 0x7D00, 0xBC6F, 0x7D01, 0xBC70, 0x7D02, 0xBC71, + 0x7D03, 0xBC72, 0x7D04, 0xBC73, 0x7D05, 0xBC74, 0x7D06, 0xBC75, + 0x7D07, 0xBC76, 0x7D08, 0xBC77, 0x7D09, 0xBC78, 0x7D0A, 0xCEC9, + 0x7D0B, 0xBC79, 0x7D0C, 0xBC7A, 0x7D0D, 0xBC7B, 0x7D0E, 0xBC7C, + 0x7D0F, 0xBC7D, 0x7D10, 0xBC7E, 0x7D11, 0xBC80, 0x7D12, 0xBC81, + 0x7D13, 0xBC82, 0x7D14, 0xBC83, 0x7D15, 0xBC84, 0x7D16, 0xBC85, + 0x7D17, 0xBC86, 0x7D18, 0xBC87, 0x7D19, 0xBC88, 0x7D1A, 0xBC89, + 0x7D1B, 0xBC8A, 0x7D1C, 0xBC8B, 0x7D1D, 0xBC8C, 0x7D1E, 0xBC8D, + 0x7D1F, 0xBC8E, 0x7D20, 0xCBD8, 0x7D21, 0xBC8F, 0x7D22, 0xCBF7, + 0x7D23, 0xBC90, 0x7D24, 0xBC91, 0x7D25, 0xBC92, 0x7D26, 0xBC93, + 0x7D27, 0xBDF4, 0x7D28, 0xBC94, 0x7D29, 0xBC95, 0x7D2A, 0xBC96, + 0x7D2B, 0xD7CF, 0x7D2C, 0xBC97, 0x7D2D, 0xBC98, 0x7D2E, 0xBC99, + 0x7D2F, 0xC0DB, 0x7D30, 0xBC9A, 0x7D31, 0xBC9B, 0x7D32, 0xBC9C, + 0x7D33, 0xBC9D, 0x7D34, 0xBC9E, 0x7D35, 0xBC9F, 0x7D36, 0xBCA0, + 0x7D37, 0xBD40, 0x7D38, 0xBD41, 0x7D39, 0xBD42, 0x7D3A, 0xBD43, + 0x7D3B, 0xBD44, 0x7D3C, 0xBD45, 0x7D3D, 0xBD46, 0x7D3E, 0xBD47, + 0x7D3F, 0xBD48, 0x7D40, 0xBD49, 0x7D41, 0xBD4A, 0x7D42, 0xBD4B, + 0x7D43, 0xBD4C, 0x7D44, 0xBD4D, 0x7D45, 0xBD4E, 0x7D46, 0xBD4F, + 0x7D47, 0xBD50, 0x7D48, 0xBD51, 0x7D49, 0xBD52, 0x7D4A, 0xBD53, + 0x7D4B, 0xBD54, 0x7D4C, 0xBD55, 0x7D4D, 0xBD56, 0x7D4E, 0xBD57, + 0x7D4F, 0xBD58, 0x7D50, 0xBD59, 0x7D51, 0xBD5A, 0x7D52, 0xBD5B, + 0x7D53, 0xBD5C, 0x7D54, 0xBD5D, 0x7D55, 0xBD5E, 0x7D56, 0xBD5F, + 0x7D57, 0xBD60, 0x7D58, 0xBD61, 0x7D59, 0xBD62, 0x7D5A, 0xBD63, + 0x7D5B, 0xBD64, 0x7D5C, 0xBD65, 0x7D5D, 0xBD66, 0x7D5E, 0xBD67, + 0x7D5F, 0xBD68, 0x7D60, 0xBD69, 0x7D61, 0xBD6A, 0x7D62, 0xBD6B, + 0x7D63, 0xBD6C, 0x7D64, 0xBD6D, 0x7D65, 0xBD6E, 0x7D66, 0xBD6F, + 0x7D67, 0xBD70, 0x7D68, 0xBD71, 0x7D69, 0xBD72, 0x7D6A, 0xBD73, + 0x7D6B, 0xBD74, 0x7D6C, 0xBD75, 0x7D6D, 0xBD76, 0x7D6E, 0xD0F5, + 0x7D6F, 0xBD77, 0x7D70, 0xBD78, 0x7D71, 0xBD79, 0x7D72, 0xBD7A, + 0x7D73, 0xBD7B, 0x7D74, 0xBD7C, 0x7D75, 0xBD7D, 0x7D76, 0xBD7E, + 0x7D77, 0xF4EA, 0x7D78, 0xBD80, 0x7D79, 0xBD81, 0x7D7A, 0xBD82, + 0x7D7B, 0xBD83, 0x7D7C, 0xBD84, 0x7D7D, 0xBD85, 0x7D7E, 0xBD86, + 0x7D7F, 0xBD87, 0x7D80, 0xBD88, 0x7D81, 0xBD89, 0x7D82, 0xBD8A, + 0x7D83, 0xBD8B, 0x7D84, 0xBD8C, 0x7D85, 0xBD8D, 0x7D86, 0xBD8E, + 0x7D87, 0xBD8F, 0x7D88, 0xBD90, 0x7D89, 0xBD91, 0x7D8A, 0xBD92, + 0x7D8B, 0xBD93, 0x7D8C, 0xBD94, 0x7D8D, 0xBD95, 0x7D8E, 0xBD96, + 0x7D8F, 0xBD97, 0x7D90, 0xBD98, 0x7D91, 0xBD99, 0x7D92, 0xBD9A, + 0x7D93, 0xBD9B, 0x7D94, 0xBD9C, 0x7D95, 0xBD9D, 0x7D96, 0xBD9E, + 0x7D97, 0xBD9F, 0x7D98, 0xBDA0, 0x7D99, 0xBE40, 0x7D9A, 0xBE41, + 0x7D9B, 0xBE42, 0x7D9C, 0xBE43, 0x7D9D, 0xBE44, 0x7D9E, 0xBE45, + 0x7D9F, 0xBE46, 0x7DA0, 0xBE47, 0x7DA1, 0xBE48, 0x7DA2, 0xBE49, + 0x7DA3, 0xBE4A, 0x7DA4, 0xBE4B, 0x7DA5, 0xBE4C, 0x7DA6, 0xF4EB, + 0x7DA7, 0xBE4D, 0x7DA8, 0xBE4E, 0x7DA9, 0xBE4F, 0x7DAA, 0xBE50, + 0x7DAB, 0xBE51, 0x7DAC, 0xBE52, 0x7DAD, 0xBE53, 0x7DAE, 0xF4EC, + 0x7DAF, 0xBE54, 0x7DB0, 0xBE55, 0x7DB1, 0xBE56, 0x7DB2, 0xBE57, + 0x7DB3, 0xBE58, 0x7DB4, 0xBE59, 0x7DB5, 0xBE5A, 0x7DB6, 0xBE5B, + 0x7DB7, 0xBE5C, 0x7DB8, 0xBE5D, 0x7DB9, 0xBE5E, 0x7DBA, 0xBE5F, + 0x7DBB, 0xBE60, 0x7DBC, 0xBE61, 0x7DBD, 0xBE62, 0x7DBE, 0xBE63, + 0x7DBF, 0xBE64, 0x7DC0, 0xBE65, 0x7DC1, 0xBE66, 0x7DC2, 0xBE67, + 0x7DC3, 0xBE68, 0x7DC4, 0xBE69, 0x7DC5, 0xBE6A, 0x7DC6, 0xBE6B, + 0x7DC7, 0xBE6C, 0x7DC8, 0xBE6D, 0x7DC9, 0xBE6E, 0x7DCA, 0xBE6F, + 0x7DCB, 0xBE70, 0x7DCC, 0xBE71, 0x7DCD, 0xBE72, 0x7DCE, 0xBE73, + 0x7DCF, 0xBE74, 0x7DD0, 0xBE75, 0x7DD1, 0xBE76, 0x7DD2, 0xBE77, + 0x7DD3, 0xBE78, 0x7DD4, 0xBE79, 0x7DD5, 0xBE7A, 0x7DD6, 0xBE7B, + 0x7DD7, 0xBE7C, 0x7DD8, 0xBE7D, 0x7DD9, 0xBE7E, 0x7DDA, 0xBE80, + 0x7DDB, 0xBE81, 0x7DDC, 0xBE82, 0x7DDD, 0xBE83, 0x7DDE, 0xBE84, + 0x7DDF, 0xBE85, 0x7DE0, 0xBE86, 0x7DE1, 0xBE87, 0x7DE2, 0xBE88, + 0x7DE3, 0xBE89, 0x7DE4, 0xBE8A, 0x7DE5, 0xBE8B, 0x7DE6, 0xBE8C, + 0x7DE7, 0xBE8D, 0x7DE8, 0xBE8E, 0x7DE9, 0xBE8F, 0x7DEA, 0xBE90, + 0x7DEB, 0xBE91, 0x7DEC, 0xBE92, 0x7DED, 0xBE93, 0x7DEE, 0xBE94, + 0x7DEF, 0xBE95, 0x7DF0, 0xBE96, 0x7DF1, 0xBE97, 0x7DF2, 0xBE98, + 0x7DF3, 0xBE99, 0x7DF4, 0xBE9A, 0x7DF5, 0xBE9B, 0x7DF6, 0xBE9C, + 0x7DF7, 0xBE9D, 0x7DF8, 0xBE9E, 0x7DF9, 0xBE9F, 0x7DFA, 0xBEA0, + 0x7DFB, 0xBF40, 0x7DFC, 0xBF41, 0x7DFD, 0xBF42, 0x7DFE, 0xBF43, + 0x7DFF, 0xBF44, 0x7E00, 0xBF45, 0x7E01, 0xBF46, 0x7E02, 0xBF47, + 0x7E03, 0xBF48, 0x7E04, 0xBF49, 0x7E05, 0xBF4A, 0x7E06, 0xBF4B, + 0x7E07, 0xBF4C, 0x7E08, 0xBF4D, 0x7E09, 0xBF4E, 0x7E0A, 0xBF4F, + 0x7E0B, 0xBF50, 0x7E0C, 0xBF51, 0x7E0D, 0xBF52, 0x7E0E, 0xBF53, + 0x7E0F, 0xBF54, 0x7E10, 0xBF55, 0x7E11, 0xBF56, 0x7E12, 0xBF57, + 0x7E13, 0xBF58, 0x7E14, 0xBF59, 0x7E15, 0xBF5A, 0x7E16, 0xBF5B, + 0x7E17, 0xBF5C, 0x7E18, 0xBF5D, 0x7E19, 0xBF5E, 0x7E1A, 0xBF5F, + 0x7E1B, 0xBF60, 0x7E1C, 0xBF61, 0x7E1D, 0xBF62, 0x7E1E, 0xBF63, + 0x7E1F, 0xBF64, 0x7E20, 0xBF65, 0x7E21, 0xBF66, 0x7E22, 0xBF67, + 0x7E23, 0xBF68, 0x7E24, 0xBF69, 0x7E25, 0xBF6A, 0x7E26, 0xBF6B, + 0x7E27, 0xBF6C, 0x7E28, 0xBF6D, 0x7E29, 0xBF6E, 0x7E2A, 0xBF6F, + 0x7E2B, 0xBF70, 0x7E2C, 0xBF71, 0x7E2D, 0xBF72, 0x7E2E, 0xBF73, + 0x7E2F, 0xBF74, 0x7E30, 0xBF75, 0x7E31, 0xBF76, 0x7E32, 0xBF77, + 0x7E33, 0xBF78, 0x7E34, 0xBF79, 0x7E35, 0xBF7A, 0x7E36, 0xBF7B, + 0x7E37, 0xBF7C, 0x7E38, 0xBF7D, 0x7E39, 0xBF7E, 0x7E3A, 0xBF80, + 0x7E3B, 0xF7E3, 0x7E3C, 0xBF81, 0x7E3D, 0xBF82, 0x7E3E, 0xBF83, + 0x7E3F, 0xBF84, 0x7E40, 0xBF85, 0x7E41, 0xB7B1, 0x7E42, 0xBF86, + 0x7E43, 0xBF87, 0x7E44, 0xBF88, 0x7E45, 0xBF89, 0x7E46, 0xBF8A, + 0x7E47, 0xF4ED, 0x7E48, 0xBF8B, 0x7E49, 0xBF8C, 0x7E4A, 0xBF8D, + 0x7E4B, 0xBF8E, 0x7E4C, 0xBF8F, 0x7E4D, 0xBF90, 0x7E4E, 0xBF91, + 0x7E4F, 0xBF92, 0x7E50, 0xBF93, 0x7E51, 0xBF94, 0x7E52, 0xBF95, + 0x7E53, 0xBF96, 0x7E54, 0xBF97, 0x7E55, 0xBF98, 0x7E56, 0xBF99, + 0x7E57, 0xBF9A, 0x7E58, 0xBF9B, 0x7E59, 0xBF9C, 0x7E5A, 0xBF9D, + 0x7E5B, 0xBF9E, 0x7E5C, 0xBF9F, 0x7E5D, 0xBFA0, 0x7E5E, 0xC040, + 0x7E5F, 0xC041, 0x7E60, 0xC042, 0x7E61, 0xC043, 0x7E62, 0xC044, + 0x7E63, 0xC045, 0x7E64, 0xC046, 0x7E65, 0xC047, 0x7E66, 0xC048, + 0x7E67, 0xC049, 0x7E68, 0xC04A, 0x7E69, 0xC04B, 0x7E6A, 0xC04C, + 0x7E6B, 0xC04D, 0x7E6C, 0xC04E, 0x7E6D, 0xC04F, 0x7E6E, 0xC050, + 0x7E6F, 0xC051, 0x7E70, 0xC052, 0x7E71, 0xC053, 0x7E72, 0xC054, + 0x7E73, 0xC055, 0x7E74, 0xC056, 0x7E75, 0xC057, 0x7E76, 0xC058, + 0x7E77, 0xC059, 0x7E78, 0xC05A, 0x7E79, 0xC05B, 0x7E7A, 0xC05C, + 0x7E7B, 0xC05D, 0x7E7C, 0xC05E, 0x7E7D, 0xC05F, 0x7E7E, 0xC060, + 0x7E7F, 0xC061, 0x7E80, 0xC062, 0x7E81, 0xC063, 0x7E82, 0xD7EB, + 0x7E83, 0xC064, 0x7E84, 0xC065, 0x7E85, 0xC066, 0x7E86, 0xC067, + 0x7E87, 0xC068, 0x7E88, 0xC069, 0x7E89, 0xC06A, 0x7E8A, 0xC06B, + 0x7E8B, 0xC06C, 0x7E8C, 0xC06D, 0x7E8D, 0xC06E, 0x7E8E, 0xC06F, + 0x7E8F, 0xC070, 0x7E90, 0xC071, 0x7E91, 0xC072, 0x7E92, 0xC073, + 0x7E93, 0xC074, 0x7E94, 0xC075, 0x7E95, 0xC076, 0x7E96, 0xC077, + 0x7E97, 0xC078, 0x7E98, 0xC079, 0x7E99, 0xC07A, 0x7E9A, 0xC07B, + 0x7E9B, 0xF4EE, 0x7E9C, 0xC07C, 0x7E9D, 0xC07D, 0x7E9E, 0xC07E, + 0x7E9F, 0xE6F9, 0x7EA0, 0xBEC0, 0x7EA1, 0xE6FA, 0x7EA2, 0xBAEC, + 0x7EA3, 0xE6FB, 0x7EA4, 0xCFCB, 0x7EA5, 0xE6FC, 0x7EA6, 0xD4BC, + 0x7EA7, 0xBCB6, 0x7EA8, 0xE6FD, 0x7EA9, 0xE6FE, 0x7EAA, 0xBCCD, + 0x7EAB, 0xC8D2, 0x7EAC, 0xCEB3, 0x7EAD, 0xE7A1, 0x7EAE, 0xC080, + 0x7EAF, 0xB4BF, 0x7EB0, 0xE7A2, 0x7EB1, 0xC9B4, 0x7EB2, 0xB8D9, + 0x7EB3, 0xC4C9, 0x7EB4, 0xC081, 0x7EB5, 0xD7DD, 0x7EB6, 0xC2DA, + 0x7EB7, 0xB7D7, 0x7EB8, 0xD6BD, 0x7EB9, 0xCEC6, 0x7EBA, 0xB7C4, + 0x7EBB, 0xC082, 0x7EBC, 0xC083, 0x7EBD, 0xC5A6, 0x7EBE, 0xE7A3, + 0x7EBF, 0xCFDF, 0x7EC0, 0xE7A4, 0x7EC1, 0xE7A5, 0x7EC2, 0xE7A6, + 0x7EC3, 0xC1B7, 0x7EC4, 0xD7E9, 0x7EC5, 0xC9F0, 0x7EC6, 0xCFB8, + 0x7EC7, 0xD6AF, 0x7EC8, 0xD6D5, 0x7EC9, 0xE7A7, 0x7ECA, 0xB0ED, + 0x7ECB, 0xE7A8, 0x7ECC, 0xE7A9, 0x7ECD, 0xC9DC, 0x7ECE, 0xD2EF, + 0x7ECF, 0xBEAD, 0x7ED0, 0xE7AA, 0x7ED1, 0xB0F3, 0x7ED2, 0xC8DE, + 0x7ED3, 0xBDE1, 0x7ED4, 0xE7AB, 0x7ED5, 0xC8C6, 0x7ED6, 0xC084, + 0x7ED7, 0xE7AC, 0x7ED8, 0xBBE6, 0x7ED9, 0xB8F8, 0x7EDA, 0xD1A4, + 0x7EDB, 0xE7AD, 0x7EDC, 0xC2E7, 0x7EDD, 0xBEF8, 0x7EDE, 0xBDCA, + 0x7EDF, 0xCDB3, 0x7EE0, 0xE7AE, 0x7EE1, 0xE7AF, 0x7EE2, 0xBEEE, + 0x7EE3, 0xD0E5, 0x7EE4, 0xC085, 0x7EE5, 0xCBE7, 0x7EE6, 0xCCD0, + 0x7EE7, 0xBCCC, 0x7EE8, 0xE7B0, 0x7EE9, 0xBCA8, 0x7EEA, 0xD0F7, + 0x7EEB, 0xE7B1, 0x7EEC, 0xC086, 0x7EED, 0xD0F8, 0x7EEE, 0xE7B2, + 0x7EEF, 0xE7B3, 0x7EF0, 0xB4C2, 0x7EF1, 0xE7B4, 0x7EF2, 0xE7B5, + 0x7EF3, 0xC9FE, 0x7EF4, 0xCEAC, 0x7EF5, 0xC3E0, 0x7EF6, 0xE7B7, + 0x7EF7, 0xB1C1, 0x7EF8, 0xB3F1, 0x7EF9, 0xC087, 0x7EFA, 0xE7B8, + 0x7EFB, 0xE7B9, 0x7EFC, 0xD7DB, 0x7EFD, 0xD5C0, 0x7EFE, 0xE7BA, + 0x7EFF, 0xC2CC, 0x7F00, 0xD7BA, 0x7F01, 0xE7BB, 0x7F02, 0xE7BC, + 0x7F03, 0xE7BD, 0x7F04, 0xBCEA, 0x7F05, 0xC3E5, 0x7F06, 0xC0C2, + 0x7F07, 0xE7BE, 0x7F08, 0xE7BF, 0x7F09, 0xBCA9, 0x7F0A, 0xC088, + 0x7F0B, 0xE7C0, 0x7F0C, 0xE7C1, 0x7F0D, 0xE7B6, 0x7F0E, 0xB6D0, + 0x7F0F, 0xE7C2, 0x7F10, 0xC089, 0x7F11, 0xE7C3, 0x7F12, 0xE7C4, + 0x7F13, 0xBBBA, 0x7F14, 0xB5DE, 0x7F15, 0xC2C6, 0x7F16, 0xB1E0, + 0x7F17, 0xE7C5, 0x7F18, 0xD4B5, 0x7F19, 0xE7C6, 0x7F1A, 0xB8BF, + 0x7F1B, 0xE7C8, 0x7F1C, 0xE7C7, 0x7F1D, 0xB7EC, 0x7F1E, 0xC08A, + 0x7F1F, 0xE7C9, 0x7F20, 0xB2F8, 0x7F21, 0xE7CA, 0x7F22, 0xE7CB, + 0x7F23, 0xE7CC, 0x7F24, 0xE7CD, 0x7F25, 0xE7CE, 0x7F26, 0xE7CF, + 0x7F27, 0xE7D0, 0x7F28, 0xD3A7, 0x7F29, 0xCBF5, 0x7F2A, 0xE7D1, + 0x7F2B, 0xE7D2, 0x7F2C, 0xE7D3, 0x7F2D, 0xE7D4, 0x7F2E, 0xC9C9, + 0x7F2F, 0xE7D5, 0x7F30, 0xE7D6, 0x7F31, 0xE7D7, 0x7F32, 0xE7D8, + 0x7F33, 0xE7D9, 0x7F34, 0xBDC9, 0x7F35, 0xE7DA, 0x7F36, 0xF3BE, + 0x7F37, 0xC08B, 0x7F38, 0xB8D7, 0x7F39, 0xC08C, 0x7F3A, 0xC8B1, + 0x7F3B, 0xC08D, 0x7F3C, 0xC08E, 0x7F3D, 0xC08F, 0x7F3E, 0xC090, + 0x7F3F, 0xC091, 0x7F40, 0xC092, 0x7F41, 0xC093, 0x7F42, 0xF3BF, + 0x7F43, 0xC094, 0x7F44, 0xF3C0, 0x7F45, 0xF3C1, 0x7F46, 0xC095, + 0x7F47, 0xC096, 0x7F48, 0xC097, 0x7F49, 0xC098, 0x7F4A, 0xC099, + 0x7F4B, 0xC09A, 0x7F4C, 0xC09B, 0x7F4D, 0xC09C, 0x7F4E, 0xC09D, + 0x7F4F, 0xC09E, 0x7F50, 0xB9DE, 0x7F51, 0xCDF8, 0x7F52, 0xC09F, + 0x7F53, 0xC0A0, 0x7F54, 0xD8E8, 0x7F55, 0xBAB1, 0x7F56, 0xC140, + 0x7F57, 0xC2DE, 0x7F58, 0xEEB7, 0x7F59, 0xC141, 0x7F5A, 0xB7A3, + 0x7F5B, 0xC142, 0x7F5C, 0xC143, 0x7F5D, 0xC144, 0x7F5E, 0xC145, + 0x7F5F, 0xEEB9, 0x7F60, 0xC146, 0x7F61, 0xEEB8, 0x7F62, 0xB0D5, + 0x7F63, 0xC147, 0x7F64, 0xC148, 0x7F65, 0xC149, 0x7F66, 0xC14A, + 0x7F67, 0xC14B, 0x7F68, 0xEEBB, 0x7F69, 0xD5D6, 0x7F6A, 0xD7EF, + 0x7F6B, 0xC14C, 0x7F6C, 0xC14D, 0x7F6D, 0xC14E, 0x7F6E, 0xD6C3, + 0x7F6F, 0xC14F, 0x7F70, 0xC150, 0x7F71, 0xEEBD, 0x7F72, 0xCAF0, + 0x7F73, 0xC151, 0x7F74, 0xEEBC, 0x7F75, 0xC152, 0x7F76, 0xC153, + 0x7F77, 0xC154, 0x7F78, 0xC155, 0x7F79, 0xEEBE, 0x7F7A, 0xC156, + 0x7F7B, 0xC157, 0x7F7C, 0xC158, 0x7F7D, 0xC159, 0x7F7E, 0xEEC0, + 0x7F7F, 0xC15A, 0x7F80, 0xC15B, 0x7F81, 0xEEBF, 0x7F82, 0xC15C, + 0x7F83, 0xC15D, 0x7F84, 0xC15E, 0x7F85, 0xC15F, 0x7F86, 0xC160, + 0x7F87, 0xC161, 0x7F88, 0xC162, 0x7F89, 0xC163, 0x7F8A, 0xD1F2, + 0x7F8B, 0xC164, 0x7F8C, 0xC7BC, 0x7F8D, 0xC165, 0x7F8E, 0xC3C0, + 0x7F8F, 0xC166, 0x7F90, 0xC167, 0x7F91, 0xC168, 0x7F92, 0xC169, + 0x7F93, 0xC16A, 0x7F94, 0xB8E1, 0x7F95, 0xC16B, 0x7F96, 0xC16C, + 0x7F97, 0xC16D, 0x7F98, 0xC16E, 0x7F99, 0xC16F, 0x7F9A, 0xC1E7, + 0x7F9B, 0xC170, 0x7F9C, 0xC171, 0x7F9D, 0xF4C6, 0x7F9E, 0xD0DF, + 0x7F9F, 0xF4C7, 0x7FA0, 0xC172, 0x7FA1, 0xCFDB, 0x7FA2, 0xC173, + 0x7FA3, 0xC174, 0x7FA4, 0xC8BA, 0x7FA5, 0xC175, 0x7FA6, 0xC176, + 0x7FA7, 0xF4C8, 0x7FA8, 0xC177, 0x7FA9, 0xC178, 0x7FAA, 0xC179, + 0x7FAB, 0xC17A, 0x7FAC, 0xC17B, 0x7FAD, 0xC17C, 0x7FAE, 0xC17D, + 0x7FAF, 0xF4C9, 0x7FB0, 0xF4CA, 0x7FB1, 0xC17E, 0x7FB2, 0xF4CB, + 0x7FB3, 0xC180, 0x7FB4, 0xC181, 0x7FB5, 0xC182, 0x7FB6, 0xC183, + 0x7FB7, 0xC184, 0x7FB8, 0xD9FA, 0x7FB9, 0xB8FE, 0x7FBA, 0xC185, + 0x7FBB, 0xC186, 0x7FBC, 0xE5F1, 0x7FBD, 0xD3F0, 0x7FBE, 0xC187, + 0x7FBF, 0xF4E0, 0x7FC0, 0xC188, 0x7FC1, 0xCECC, 0x7FC2, 0xC189, + 0x7FC3, 0xC18A, 0x7FC4, 0xC18B, 0x7FC5, 0xB3E1, 0x7FC6, 0xC18C, + 0x7FC7, 0xC18D, 0x7FC8, 0xC18E, 0x7FC9, 0xC18F, 0x7FCA, 0xF1B4, + 0x7FCB, 0xC190, 0x7FCC, 0xD2EE, 0x7FCD, 0xC191, 0x7FCE, 0xF4E1, + 0x7FCF, 0xC192, 0x7FD0, 0xC193, 0x7FD1, 0xC194, 0x7FD2, 0xC195, + 0x7FD3, 0xC196, 0x7FD4, 0xCFE8, 0x7FD5, 0xF4E2, 0x7FD6, 0xC197, + 0x7FD7, 0xC198, 0x7FD8, 0xC7CC, 0x7FD9, 0xC199, 0x7FDA, 0xC19A, + 0x7FDB, 0xC19B, 0x7FDC, 0xC19C, 0x7FDD, 0xC19D, 0x7FDE, 0xC19E, + 0x7FDF, 0xB5D4, 0x7FE0, 0xB4E4, 0x7FE1, 0xF4E4, 0x7FE2, 0xC19F, + 0x7FE3, 0xC1A0, 0x7FE4, 0xC240, 0x7FE5, 0xF4E3, 0x7FE6, 0xF4E5, + 0x7FE7, 0xC241, 0x7FE8, 0xC242, 0x7FE9, 0xF4E6, 0x7FEA, 0xC243, + 0x7FEB, 0xC244, 0x7FEC, 0xC245, 0x7FED, 0xC246, 0x7FEE, 0xF4E7, + 0x7FEF, 0xC247, 0x7FF0, 0xBAB2, 0x7FF1, 0xB0BF, 0x7FF2, 0xC248, + 0x7FF3, 0xF4E8, 0x7FF4, 0xC249, 0x7FF5, 0xC24A, 0x7FF6, 0xC24B, + 0x7FF7, 0xC24C, 0x7FF8, 0xC24D, 0x7FF9, 0xC24E, 0x7FFA, 0xC24F, + 0x7FFB, 0xB7AD, 0x7FFC, 0xD2ED, 0x7FFD, 0xC250, 0x7FFE, 0xC251, + 0x7FFF, 0xC252, 0x8000, 0xD2AB, 0x8001, 0xC0CF, 0x8002, 0xC253, + 0x8003, 0xBFBC, 0x8004, 0xEBA3, 0x8005, 0xD5DF, 0x8006, 0xEAC8, + 0x8007, 0xC254, 0x8008, 0xC255, 0x8009, 0xC256, 0x800A, 0xC257, + 0x800B, 0xF1F3, 0x800C, 0xB6F8, 0x800D, 0xCBA3, 0x800E, 0xC258, + 0x800F, 0xC259, 0x8010, 0xC4CD, 0x8011, 0xC25A, 0x8012, 0xF1E7, + 0x8013, 0xC25B, 0x8014, 0xF1E8, 0x8015, 0xB8FB, 0x8016, 0xF1E9, + 0x8017, 0xBAC4, 0x8018, 0xD4C5, 0x8019, 0xB0D2, 0x801A, 0xC25C, + 0x801B, 0xC25D, 0x801C, 0xF1EA, 0x801D, 0xC25E, 0x801E, 0xC25F, + 0x801F, 0xC260, 0x8020, 0xF1EB, 0x8021, 0xC261, 0x8022, 0xF1EC, + 0x8023, 0xC262, 0x8024, 0xC263, 0x8025, 0xF1ED, 0x8026, 0xF1EE, + 0x8027, 0xF1EF, 0x8028, 0xF1F1, 0x8029, 0xF1F0, 0x802A, 0xC5D5, + 0x802B, 0xC264, 0x802C, 0xC265, 0x802D, 0xC266, 0x802E, 0xC267, + 0x802F, 0xC268, 0x8030, 0xC269, 0x8031, 0xF1F2, 0x8032, 0xC26A, + 0x8033, 0xB6FA, 0x8034, 0xC26B, 0x8035, 0xF1F4, 0x8036, 0xD2AE, + 0x8037, 0xDEC7, 0x8038, 0xCBCA, 0x8039, 0xC26C, 0x803A, 0xC26D, + 0x803B, 0xB3DC, 0x803C, 0xC26E, 0x803D, 0xB5A2, 0x803E, 0xC26F, + 0x803F, 0xB9A2, 0x8040, 0xC270, 0x8041, 0xC271, 0x8042, 0xC4F4, + 0x8043, 0xF1F5, 0x8044, 0xC272, 0x8045, 0xC273, 0x8046, 0xF1F6, + 0x8047, 0xC274, 0x8048, 0xC275, 0x8049, 0xC276, 0x804A, 0xC1C4, + 0x804B, 0xC1FB, 0x804C, 0xD6B0, 0x804D, 0xF1F7, 0x804E, 0xC277, + 0x804F, 0xC278, 0x8050, 0xC279, 0x8051, 0xC27A, 0x8052, 0xF1F8, + 0x8053, 0xC27B, 0x8054, 0xC1AA, 0x8055, 0xC27C, 0x8056, 0xC27D, + 0x8057, 0xC27E, 0x8058, 0xC6B8, 0x8059, 0xC280, 0x805A, 0xBEDB, + 0x805B, 0xC281, 0x805C, 0xC282, 0x805D, 0xC283, 0x805E, 0xC284, + 0x805F, 0xC285, 0x8060, 0xC286, 0x8061, 0xC287, 0x8062, 0xC288, + 0x8063, 0xC289, 0x8064, 0xC28A, 0x8065, 0xC28B, 0x8066, 0xC28C, + 0x8067, 0xC28D, 0x8068, 0xC28E, 0x8069, 0xF1F9, 0x806A, 0xB4CF, + 0x806B, 0xC28F, 0x806C, 0xC290, 0x806D, 0xC291, 0x806E, 0xC292, + 0x806F, 0xC293, 0x8070, 0xC294, 0x8071, 0xF1FA, 0x8072, 0xC295, + 0x8073, 0xC296, 0x8074, 0xC297, 0x8075, 0xC298, 0x8076, 0xC299, + 0x8077, 0xC29A, 0x8078, 0xC29B, 0x8079, 0xC29C, 0x807A, 0xC29D, + 0x807B, 0xC29E, 0x807C, 0xC29F, 0x807D, 0xC2A0, 0x807E, 0xC340, + 0x807F, 0xEDB2, 0x8080, 0xEDB1, 0x8081, 0xC341, 0x8082, 0xC342, + 0x8083, 0xCBE0, 0x8084, 0xD2DE, 0x8085, 0xC343, 0x8086, 0xCBC1, + 0x8087, 0xD5D8, 0x8088, 0xC344, 0x8089, 0xC8E2, 0x808A, 0xC345, + 0x808B, 0xC0DF, 0x808C, 0xBCA1, 0x808D, 0xC346, 0x808E, 0xC347, + 0x808F, 0xC348, 0x8090, 0xC349, 0x8091, 0xC34A, 0x8092, 0xC34B, + 0x8093, 0xEBC1, 0x8094, 0xC34C, 0x8095, 0xC34D, 0x8096, 0xD0A4, + 0x8097, 0xC34E, 0x8098, 0xD6E2, 0x8099, 0xC34F, 0x809A, 0xB6C7, + 0x809B, 0xB8D8, 0x809C, 0xEBC0, 0x809D, 0xB8CE, 0x809E, 0xC350, + 0x809F, 0xEBBF, 0x80A0, 0xB3A6, 0x80A1, 0xB9C9, 0x80A2, 0xD6AB, + 0x80A3, 0xC351, 0x80A4, 0xB7F4, 0x80A5, 0xB7CA, 0x80A6, 0xC352, + 0x80A7, 0xC353, 0x80A8, 0xC354, 0x80A9, 0xBCE7, 0x80AA, 0xB7BE, + 0x80AB, 0xEBC6, 0x80AC, 0xC355, 0x80AD, 0xEBC7, 0x80AE, 0xB0B9, + 0x80AF, 0xBFCF, 0x80B0, 0xC356, 0x80B1, 0xEBC5, 0x80B2, 0xD3FD, + 0x80B3, 0xC357, 0x80B4, 0xEBC8, 0x80B5, 0xC358, 0x80B6, 0xC359, + 0x80B7, 0xEBC9, 0x80B8, 0xC35A, 0x80B9, 0xC35B, 0x80BA, 0xB7CE, + 0x80BB, 0xC35C, 0x80BC, 0xEBC2, 0x80BD, 0xEBC4, 0x80BE, 0xC9F6, + 0x80BF, 0xD6D7, 0x80C0, 0xD5CD, 0x80C1, 0xD0B2, 0x80C2, 0xEBCF, + 0x80C3, 0xCEB8, 0x80C4, 0xEBD0, 0x80C5, 0xC35D, 0x80C6, 0xB5A8, + 0x80C7, 0xC35E, 0x80C8, 0xC35F, 0x80C9, 0xC360, 0x80CA, 0xC361, + 0x80CB, 0xC362, 0x80CC, 0xB1B3, 0x80CD, 0xEBD2, 0x80CE, 0xCCA5, + 0x80CF, 0xC363, 0x80D0, 0xC364, 0x80D1, 0xC365, 0x80D2, 0xC366, + 0x80D3, 0xC367, 0x80D4, 0xC368, 0x80D5, 0xC369, 0x80D6, 0xC5D6, + 0x80D7, 0xEBD3, 0x80D8, 0xC36A, 0x80D9, 0xEBD1, 0x80DA, 0xC5DF, + 0x80DB, 0xEBCE, 0x80DC, 0xCAA4, 0x80DD, 0xEBD5, 0x80DE, 0xB0FB, + 0x80DF, 0xC36B, 0x80E0, 0xC36C, 0x80E1, 0xBAFA, 0x80E2, 0xC36D, + 0x80E3, 0xC36E, 0x80E4, 0xD8B7, 0x80E5, 0xF1E3, 0x80E6, 0xC36F, + 0x80E7, 0xEBCA, 0x80E8, 0xEBCB, 0x80E9, 0xEBCC, 0x80EA, 0xEBCD, + 0x80EB, 0xEBD6, 0x80EC, 0xE6C0, 0x80ED, 0xEBD9, 0x80EE, 0xC370, + 0x80EF, 0xBFE8, 0x80F0, 0xD2C8, 0x80F1, 0xEBD7, 0x80F2, 0xEBDC, + 0x80F3, 0xB8EC, 0x80F4, 0xEBD8, 0x80F5, 0xC371, 0x80F6, 0xBDBA, + 0x80F7, 0xC372, 0x80F8, 0xD0D8, 0x80F9, 0xC373, 0x80FA, 0xB0B7, + 0x80FB, 0xC374, 0x80FC, 0xEBDD, 0x80FD, 0xC4DC, 0x80FE, 0xC375, + 0x80FF, 0xC376, 0x8100, 0xC377, 0x8101, 0xC378, 0x8102, 0xD6AC, + 0x8103, 0xC379, 0x8104, 0xC37A, 0x8105, 0xC37B, 0x8106, 0xB4E0, + 0x8107, 0xC37C, 0x8108, 0xC37D, 0x8109, 0xC2F6, 0x810A, 0xBCB9, + 0x810B, 0xC37E, 0x810C, 0xC380, 0x810D, 0xEBDA, 0x810E, 0xEBDB, + 0x810F, 0xD4E0, 0x8110, 0xC6EA, 0x8111, 0xC4D4, 0x8112, 0xEBDF, + 0x8113, 0xC5A7, 0x8114, 0xD9F5, 0x8115, 0xC381, 0x8116, 0xB2B1, + 0x8117, 0xC382, 0x8118, 0xEBE4, 0x8119, 0xC383, 0x811A, 0xBDC5, + 0x811B, 0xC384, 0x811C, 0xC385, 0x811D, 0xC386, 0x811E, 0xEBE2, + 0x811F, 0xC387, 0x8120, 0xC388, 0x8121, 0xC389, 0x8122, 0xC38A, + 0x8123, 0xC38B, 0x8124, 0xC38C, 0x8125, 0xC38D, 0x8126, 0xC38E, + 0x8127, 0xC38F, 0x8128, 0xC390, 0x8129, 0xC391, 0x812A, 0xC392, + 0x812B, 0xC393, 0x812C, 0xEBE3, 0x812D, 0xC394, 0x812E, 0xC395, + 0x812F, 0xB8AC, 0x8130, 0xC396, 0x8131, 0xCDD1, 0x8132, 0xEBE5, + 0x8133, 0xC397, 0x8134, 0xC398, 0x8135, 0xC399, 0x8136, 0xEBE1, + 0x8137, 0xC39A, 0x8138, 0xC1B3, 0x8139, 0xC39B, 0x813A, 0xC39C, + 0x813B, 0xC39D, 0x813C, 0xC39E, 0x813D, 0xC39F, 0x813E, 0xC6A2, + 0x813F, 0xC3A0, 0x8140, 0xC440, 0x8141, 0xC441, 0x8142, 0xC442, + 0x8143, 0xC443, 0x8144, 0xC444, 0x8145, 0xC445, 0x8146, 0xCCF3, + 0x8147, 0xC446, 0x8148, 0xEBE6, 0x8149, 0xC447, 0x814A, 0xC0B0, + 0x814B, 0xD2B8, 0x814C, 0xEBE7, 0x814D, 0xC448, 0x814E, 0xC449, + 0x814F, 0xC44A, 0x8150, 0xB8AF, 0x8151, 0xB8AD, 0x8152, 0xC44B, + 0x8153, 0xEBE8, 0x8154, 0xC7BB, 0x8155, 0xCDF3, 0x8156, 0xC44C, + 0x8157, 0xC44D, 0x8158, 0xC44E, 0x8159, 0xEBEA, 0x815A, 0xEBEB, + 0x815B, 0xC44F, 0x815C, 0xC450, 0x815D, 0xC451, 0x815E, 0xC452, + 0x815F, 0xC453, 0x8160, 0xEBED, 0x8161, 0xC454, 0x8162, 0xC455, + 0x8163, 0xC456, 0x8164, 0xC457, 0x8165, 0xD0C8, 0x8166, 0xC458, + 0x8167, 0xEBF2, 0x8168, 0xC459, 0x8169, 0xEBEE, 0x816A, 0xC45A, + 0x816B, 0xC45B, 0x816C, 0xC45C, 0x816D, 0xEBF1, 0x816E, 0xC8F9, + 0x816F, 0xC45D, 0x8170, 0xD1FC, 0x8171, 0xEBEC, 0x8172, 0xC45E, + 0x8173, 0xC45F, 0x8174, 0xEBE9, 0x8175, 0xC460, 0x8176, 0xC461, + 0x8177, 0xC462, 0x8178, 0xC463, 0x8179, 0xB8B9, 0x817A, 0xCFD9, + 0x817B, 0xC4E5, 0x817C, 0xEBEF, 0x817D, 0xEBF0, 0x817E, 0xCCDA, + 0x817F, 0xCDC8, 0x8180, 0xB0F2, 0x8181, 0xC464, 0x8182, 0xEBF6, + 0x8183, 0xC465, 0x8184, 0xC466, 0x8185, 0xC467, 0x8186, 0xC468, + 0x8187, 0xC469, 0x8188, 0xEBF5, 0x8189, 0xC46A, 0x818A, 0xB2B2, + 0x818B, 0xC46B, 0x818C, 0xC46C, 0x818D, 0xC46D, 0x818E, 0xC46E, + 0x818F, 0xB8E0, 0x8190, 0xC46F, 0x8191, 0xEBF7, 0x8192, 0xC470, + 0x8193, 0xC471, 0x8194, 0xC472, 0x8195, 0xC473, 0x8196, 0xC474, + 0x8197, 0xC475, 0x8198, 0xB1EC, 0x8199, 0xC476, 0x819A, 0xC477, + 0x819B, 0xCCC5, 0x819C, 0xC4A4, 0x819D, 0xCFA5, 0x819E, 0xC478, + 0x819F, 0xC479, 0x81A0, 0xC47A, 0x81A1, 0xC47B, 0x81A2, 0xC47C, + 0x81A3, 0xEBF9, 0x81A4, 0xC47D, 0x81A5, 0xC47E, 0x81A6, 0xECA2, + 0x81A7, 0xC480, 0x81A8, 0xC5F2, 0x81A9, 0xC481, 0x81AA, 0xEBFA, + 0x81AB, 0xC482, 0x81AC, 0xC483, 0x81AD, 0xC484, 0x81AE, 0xC485, + 0x81AF, 0xC486, 0x81B0, 0xC487, 0x81B1, 0xC488, 0x81B2, 0xC489, + 0x81B3, 0xC9C5, 0x81B4, 0xC48A, 0x81B5, 0xC48B, 0x81B6, 0xC48C, + 0x81B7, 0xC48D, 0x81B8, 0xC48E, 0x81B9, 0xC48F, 0x81BA, 0xE2DF, + 0x81BB, 0xEBFE, 0x81BC, 0xC490, 0x81BD, 0xC491, 0x81BE, 0xC492, + 0x81BF, 0xC493, 0x81C0, 0xCDCE, 0x81C1, 0xECA1, 0x81C2, 0xB1DB, + 0x81C3, 0xD3B7, 0x81C4, 0xC494, 0x81C5, 0xC495, 0x81C6, 0xD2DC, + 0x81C7, 0xC496, 0x81C8, 0xC497, 0x81C9, 0xC498, 0x81CA, 0xEBFD, + 0x81CB, 0xC499, 0x81CC, 0xEBFB, 0x81CD, 0xC49A, 0x81CE, 0xC49B, + 0x81CF, 0xC49C, 0x81D0, 0xC49D, 0x81D1, 0xC49E, 0x81D2, 0xC49F, + 0x81D3, 0xC4A0, 0x81D4, 0xC540, 0x81D5, 0xC541, 0x81D6, 0xC542, + 0x81D7, 0xC543, 0x81D8, 0xC544, 0x81D9, 0xC545, 0x81DA, 0xC546, + 0x81DB, 0xC547, 0x81DC, 0xC548, 0x81DD, 0xC549, 0x81DE, 0xC54A, + 0x81DF, 0xC54B, 0x81E0, 0xC54C, 0x81E1, 0xC54D, 0x81E2, 0xC54E, + 0x81E3, 0xB3BC, 0x81E4, 0xC54F, 0x81E5, 0xC550, 0x81E6, 0xC551, + 0x81E7, 0xEAB0, 0x81E8, 0xC552, 0x81E9, 0xC553, 0x81EA, 0xD7D4, + 0x81EB, 0xC554, 0x81EC, 0xF4AB, 0x81ED, 0xB3F4, 0x81EE, 0xC555, + 0x81EF, 0xC556, 0x81F0, 0xC557, 0x81F1, 0xC558, 0x81F2, 0xC559, + 0x81F3, 0xD6C1, 0x81F4, 0xD6C2, 0x81F5, 0xC55A, 0x81F6, 0xC55B, + 0x81F7, 0xC55C, 0x81F8, 0xC55D, 0x81F9, 0xC55E, 0x81FA, 0xC55F, + 0x81FB, 0xD5E9, 0x81FC, 0xBECA, 0x81FD, 0xC560, 0x81FE, 0xF4A7, + 0x81FF, 0xC561, 0x8200, 0xD2A8, 0x8201, 0xF4A8, 0x8202, 0xF4A9, + 0x8203, 0xC562, 0x8204, 0xF4AA, 0x8205, 0xBECB, 0x8206, 0xD3DF, + 0x8207, 0xC563, 0x8208, 0xC564, 0x8209, 0xC565, 0x820A, 0xC566, + 0x820B, 0xC567, 0x820C, 0xC9E0, 0x820D, 0xC9E1, 0x820E, 0xC568, + 0x820F, 0xC569, 0x8210, 0xF3C2, 0x8211, 0xC56A, 0x8212, 0xCAE6, + 0x8213, 0xC56B, 0x8214, 0xCCF2, 0x8215, 0xC56C, 0x8216, 0xC56D, + 0x8217, 0xC56E, 0x8218, 0xC56F, 0x8219, 0xC570, 0x821A, 0xC571, + 0x821B, 0xE2B6, 0x821C, 0xCBB4, 0x821D, 0xC572, 0x821E, 0xCEE8, + 0x821F, 0xD6DB, 0x8220, 0xC573, 0x8221, 0xF4AD, 0x8222, 0xF4AE, + 0x8223, 0xF4AF, 0x8224, 0xC574, 0x8225, 0xC575, 0x8226, 0xC576, + 0x8227, 0xC577, 0x8228, 0xF4B2, 0x8229, 0xC578, 0x822A, 0xBABD, + 0x822B, 0xF4B3, 0x822C, 0xB0E3, 0x822D, 0xF4B0, 0x822E, 0xC579, + 0x822F, 0xF4B1, 0x8230, 0xBDA2, 0x8231, 0xB2D5, 0x8232, 0xC57A, + 0x8233, 0xF4B6, 0x8234, 0xF4B7, 0x8235, 0xB6E6, 0x8236, 0xB2B0, + 0x8237, 0xCFCF, 0x8238, 0xF4B4, 0x8239, 0xB4AC, 0x823A, 0xC57B, + 0x823B, 0xF4B5, 0x823C, 0xC57C, 0x823D, 0xC57D, 0x823E, 0xF4B8, + 0x823F, 0xC57E, 0x8240, 0xC580, 0x8241, 0xC581, 0x8242, 0xC582, + 0x8243, 0xC583, 0x8244, 0xF4B9, 0x8245, 0xC584, 0x8246, 0xC585, + 0x8247, 0xCDA7, 0x8248, 0xC586, 0x8249, 0xF4BA, 0x824A, 0xC587, + 0x824B, 0xF4BB, 0x824C, 0xC588, 0x824D, 0xC589, 0x824E, 0xC58A, + 0x824F, 0xF4BC, 0x8250, 0xC58B, 0x8251, 0xC58C, 0x8252, 0xC58D, + 0x8253, 0xC58E, 0x8254, 0xC58F, 0x8255, 0xC590, 0x8256, 0xC591, + 0x8257, 0xC592, 0x8258, 0xCBD2, 0x8259, 0xC593, 0x825A, 0xF4BD, + 0x825B, 0xC594, 0x825C, 0xC595, 0x825D, 0xC596, 0x825E, 0xC597, + 0x825F, 0xF4BE, 0x8260, 0xC598, 0x8261, 0xC599, 0x8262, 0xC59A, + 0x8263, 0xC59B, 0x8264, 0xC59C, 0x8265, 0xC59D, 0x8266, 0xC59E, + 0x8267, 0xC59F, 0x8268, 0xF4BF, 0x8269, 0xC5A0, 0x826A, 0xC640, + 0x826B, 0xC641, 0x826C, 0xC642, 0x826D, 0xC643, 0x826E, 0xF4DE, + 0x826F, 0xC1BC, 0x8270, 0xBCE8, 0x8271, 0xC644, 0x8272, 0xC9AB, + 0x8273, 0xD1DE, 0x8274, 0xE5F5, 0x8275, 0xC645, 0x8276, 0xC646, + 0x8277, 0xC647, 0x8278, 0xC648, 0x8279, 0xDCB3, 0x827A, 0xD2D5, + 0x827B, 0xC649, 0x827C, 0xC64A, 0x827D, 0xDCB4, 0x827E, 0xB0AC, + 0x827F, 0xDCB5, 0x8280, 0xC64B, 0x8281, 0xC64C, 0x8282, 0xBDDA, + 0x8283, 0xC64D, 0x8284, 0xDCB9, 0x8285, 0xC64E, 0x8286, 0xC64F, + 0x8287, 0xC650, 0x8288, 0xD8C2, 0x8289, 0xC651, 0x828A, 0xDCB7, + 0x828B, 0xD3F3, 0x828C, 0xC652, 0x828D, 0xC9D6, 0x828E, 0xDCBA, + 0x828F, 0xDCB6, 0x8290, 0xC653, 0x8291, 0xDCBB, 0x8292, 0xC3A2, + 0x8293, 0xC654, 0x8294, 0xC655, 0x8295, 0xC656, 0x8296, 0xC657, + 0x8297, 0xDCBC, 0x8298, 0xDCC5, 0x8299, 0xDCBD, 0x829A, 0xC658, + 0x829B, 0xC659, 0x829C, 0xCEDF, 0x829D, 0xD6A5, 0x829E, 0xC65A, + 0x829F, 0xDCCF, 0x82A0, 0xC65B, 0x82A1, 0xDCCD, 0x82A2, 0xC65C, + 0x82A3, 0xC65D, 0x82A4, 0xDCD2, 0x82A5, 0xBDE6, 0x82A6, 0xC2AB, + 0x82A7, 0xC65E, 0x82A8, 0xDCB8, 0x82A9, 0xDCCB, 0x82AA, 0xDCCE, + 0x82AB, 0xDCBE, 0x82AC, 0xB7D2, 0x82AD, 0xB0C5, 0x82AE, 0xDCC7, + 0x82AF, 0xD0BE, 0x82B0, 0xDCC1, 0x82B1, 0xBBA8, 0x82B2, 0xC65F, + 0x82B3, 0xB7BC, 0x82B4, 0xDCCC, 0x82B5, 0xC660, 0x82B6, 0xC661, + 0x82B7, 0xDCC6, 0x82B8, 0xDCBF, 0x82B9, 0xC7DB, 0x82BA, 0xC662, + 0x82BB, 0xC663, 0x82BC, 0xC664, 0x82BD, 0xD1BF, 0x82BE, 0xDCC0, + 0x82BF, 0xC665, 0x82C0, 0xC666, 0x82C1, 0xDCCA, 0x82C2, 0xC667, + 0x82C3, 0xC668, 0x82C4, 0xDCD0, 0x82C5, 0xC669, 0x82C6, 0xC66A, + 0x82C7, 0xCEAD, 0x82C8, 0xDCC2, 0x82C9, 0xC66B, 0x82CA, 0xDCC3, + 0x82CB, 0xDCC8, 0x82CC, 0xDCC9, 0x82CD, 0xB2D4, 0x82CE, 0xDCD1, + 0x82CF, 0xCBD5, 0x82D0, 0xC66C, 0x82D1, 0xD4B7, 0x82D2, 0xDCDB, + 0x82D3, 0xDCDF, 0x82D4, 0xCCA6, 0x82D5, 0xDCE6, 0x82D6, 0xC66D, + 0x82D7, 0xC3E7, 0x82D8, 0xDCDC, 0x82D9, 0xC66E, 0x82DA, 0xC66F, + 0x82DB, 0xBFC1, 0x82DC, 0xDCD9, 0x82DD, 0xC670, 0x82DE, 0xB0FA, + 0x82DF, 0xB9B6, 0x82E0, 0xDCE5, 0x82E1, 0xDCD3, 0x82E2, 0xC671, + 0x82E3, 0xDCC4, 0x82E4, 0xDCD6, 0x82E5, 0xC8F4, 0x82E6, 0xBFE0, + 0x82E7, 0xC672, 0x82E8, 0xC673, 0x82E9, 0xC674, 0x82EA, 0xC675, + 0x82EB, 0xC9BB, 0x82EC, 0xC676, 0x82ED, 0xC677, 0x82EE, 0xC678, + 0x82EF, 0xB1BD, 0x82F0, 0xC679, 0x82F1, 0xD3A2, 0x82F2, 0xC67A, + 0x82F3, 0xC67B, 0x82F4, 0xDCDA, 0x82F5, 0xC67C, 0x82F6, 0xC67D, + 0x82F7, 0xDCD5, 0x82F8, 0xC67E, 0x82F9, 0xC6BB, 0x82FA, 0xC680, + 0x82FB, 0xDCDE, 0x82FC, 0xC681, 0x82FD, 0xC682, 0x82FE, 0xC683, + 0x82FF, 0xC684, 0x8300, 0xC685, 0x8301, 0xD7C2, 0x8302, 0xC3AF, + 0x8303, 0xB7B6, 0x8304, 0xC7D1, 0x8305, 0xC3A9, 0x8306, 0xDCE2, + 0x8307, 0xDCD8, 0x8308, 0xDCEB, 0x8309, 0xDCD4, 0x830A, 0xC686, + 0x830B, 0xC687, 0x830C, 0xDCDD, 0x830D, 0xC688, 0x830E, 0xBEA5, + 0x830F, 0xDCD7, 0x8310, 0xC689, 0x8311, 0xDCE0, 0x8312, 0xC68A, + 0x8313, 0xC68B, 0x8314, 0xDCE3, 0x8315, 0xDCE4, 0x8316, 0xC68C, + 0x8317, 0xDCF8, 0x8318, 0xC68D, 0x8319, 0xC68E, 0x831A, 0xDCE1, + 0x831B, 0xDDA2, 0x831C, 0xDCE7, 0x831D, 0xC68F, 0x831E, 0xC690, + 0x831F, 0xC691, 0x8320, 0xC692, 0x8321, 0xC693, 0x8322, 0xC694, + 0x8323, 0xC695, 0x8324, 0xC696, 0x8325, 0xC697, 0x8326, 0xC698, + 0x8327, 0xBCEB, 0x8328, 0xB4C4, 0x8329, 0xC699, 0x832A, 0xC69A, + 0x832B, 0xC3A3, 0x832C, 0xB2E7, 0x832D, 0xDCFA, 0x832E, 0xC69B, + 0x832F, 0xDCF2, 0x8330, 0xC69C, 0x8331, 0xDCEF, 0x8332, 0xC69D, + 0x8333, 0xDCFC, 0x8334, 0xDCEE, 0x8335, 0xD2F0, 0x8336, 0xB2E8, + 0x8337, 0xC69E, 0x8338, 0xC8D7, 0x8339, 0xC8E3, 0x833A, 0xDCFB, + 0x833B, 0xC69F, 0x833C, 0xDCED, 0x833D, 0xC6A0, 0x833E, 0xC740, + 0x833F, 0xC741, 0x8340, 0xDCF7, 0x8341, 0xC742, 0x8342, 0xC743, + 0x8343, 0xDCF5, 0x8344, 0xC744, 0x8345, 0xC745, 0x8346, 0xBEA3, + 0x8347, 0xDCF4, 0x8348, 0xC746, 0x8349, 0xB2DD, 0x834A, 0xC747, + 0x834B, 0xC748, 0x834C, 0xC749, 0x834D, 0xC74A, 0x834E, 0xC74B, + 0x834F, 0xDCF3, 0x8350, 0xBCF6, 0x8351, 0xDCE8, 0x8352, 0xBBC4, + 0x8353, 0xC74C, 0x8354, 0xC0F3, 0x8355, 0xC74D, 0x8356, 0xC74E, + 0x8357, 0xC74F, 0x8358, 0xC750, 0x8359, 0xC751, 0x835A, 0xBCD4, + 0x835B, 0xDCE9, 0x835C, 0xDCEA, 0x835D, 0xC752, 0x835E, 0xDCF1, + 0x835F, 0xDCF6, 0x8360, 0xDCF9, 0x8361, 0xB5B4, 0x8362, 0xC753, + 0x8363, 0xC8D9, 0x8364, 0xBBE7, 0x8365, 0xDCFE, 0x8366, 0xDCFD, + 0x8367, 0xD3AB, 0x8368, 0xDDA1, 0x8369, 0xDDA3, 0x836A, 0xDDA5, + 0x836B, 0xD2F1, 0x836C, 0xDDA4, 0x836D, 0xDDA6, 0x836E, 0xDDA7, + 0x836F, 0xD2A9, 0x8370, 0xC754, 0x8371, 0xC755, 0x8372, 0xC756, + 0x8373, 0xC757, 0x8374, 0xC758, 0x8375, 0xC759, 0x8376, 0xC75A, + 0x8377, 0xBAC9, 0x8378, 0xDDA9, 0x8379, 0xC75B, 0x837A, 0xC75C, + 0x837B, 0xDDB6, 0x837C, 0xDDB1, 0x837D, 0xDDB4, 0x837E, 0xC75D, + 0x837F, 0xC75E, 0x8380, 0xC75F, 0x8381, 0xC760, 0x8382, 0xC761, + 0x8383, 0xC762, 0x8384, 0xC763, 0x8385, 0xDDB0, 0x8386, 0xC6CE, + 0x8387, 0xC764, 0x8388, 0xC765, 0x8389, 0xC0F2, 0x838A, 0xC766, + 0x838B, 0xC767, 0x838C, 0xC768, 0x838D, 0xC769, 0x838E, 0xC9AF, + 0x838F, 0xC76A, 0x8390, 0xC76B, 0x8391, 0xC76C, 0x8392, 0xDCEC, + 0x8393, 0xDDAE, 0x8394, 0xC76D, 0x8395, 0xC76E, 0x8396, 0xC76F, + 0x8397, 0xC770, 0x8398, 0xDDB7, 0x8399, 0xC771, 0x839A, 0xC772, + 0x839B, 0xDCF0, 0x839C, 0xDDAF, 0x839D, 0xC773, 0x839E, 0xDDB8, + 0x839F, 0xC774, 0x83A0, 0xDDAC, 0x83A1, 0xC775, 0x83A2, 0xC776, + 0x83A3, 0xC777, 0x83A4, 0xC778, 0x83A5, 0xC779, 0x83A6, 0xC77A, + 0x83A7, 0xC77B, 0x83A8, 0xDDB9, 0x83A9, 0xDDB3, 0x83AA, 0xDDAD, + 0x83AB, 0xC4AA, 0x83AC, 0xC77C, 0x83AD, 0xC77D, 0x83AE, 0xC77E, + 0x83AF, 0xC780, 0x83B0, 0xDDA8, 0x83B1, 0xC0B3, 0x83B2, 0xC1AB, + 0x83B3, 0xDDAA, 0x83B4, 0xDDAB, 0x83B5, 0xC781, 0x83B6, 0xDDB2, + 0x83B7, 0xBBF1, 0x83B8, 0xDDB5, 0x83B9, 0xD3A8, 0x83BA, 0xDDBA, + 0x83BB, 0xC782, 0x83BC, 0xDDBB, 0x83BD, 0xC3A7, 0x83BE, 0xC783, + 0x83BF, 0xC784, 0x83C0, 0xDDD2, 0x83C1, 0xDDBC, 0x83C2, 0xC785, + 0x83C3, 0xC786, 0x83C4, 0xC787, 0x83C5, 0xDDD1, 0x83C6, 0xC788, + 0x83C7, 0xB9BD, 0x83C8, 0xC789, 0x83C9, 0xC78A, 0x83CA, 0xBED5, + 0x83CB, 0xC78B, 0x83CC, 0xBEFA, 0x83CD, 0xC78C, 0x83CE, 0xC78D, + 0x83CF, 0xBACA, 0x83D0, 0xC78E, 0x83D1, 0xC78F, 0x83D2, 0xC790, + 0x83D3, 0xC791, 0x83D4, 0xDDCA, 0x83D5, 0xC792, 0x83D6, 0xDDC5, + 0x83D7, 0xC793, 0x83D8, 0xDDBF, 0x83D9, 0xC794, 0x83DA, 0xC795, + 0x83DB, 0xC796, 0x83DC, 0xB2CB, 0x83DD, 0xDDC3, 0x83DE, 0xC797, + 0x83DF, 0xDDCB, 0x83E0, 0xB2A4, 0x83E1, 0xDDD5, 0x83E2, 0xC798, + 0x83E3, 0xC799, 0x83E4, 0xC79A, 0x83E5, 0xDDBE, 0x83E6, 0xC79B, + 0x83E7, 0xC79C, 0x83E8, 0xC79D, 0x83E9, 0xC6D0, 0x83EA, 0xDDD0, + 0x83EB, 0xC79E, 0x83EC, 0xC79F, 0x83ED, 0xC7A0, 0x83EE, 0xC840, + 0x83EF, 0xC841, 0x83F0, 0xDDD4, 0x83F1, 0xC1E2, 0x83F2, 0xB7C6, + 0x83F3, 0xC842, 0x83F4, 0xC843, 0x83F5, 0xC844, 0x83F6, 0xC845, + 0x83F7, 0xC846, 0x83F8, 0xDDCE, 0x83F9, 0xDDCF, 0x83FA, 0xC847, + 0x83FB, 0xC848, 0x83FC, 0xC849, 0x83FD, 0xDDC4, 0x83FE, 0xC84A, + 0x83FF, 0xC84B, 0x8400, 0xC84C, 0x8401, 0xDDBD, 0x8402, 0xC84D, + 0x8403, 0xDDCD, 0x8404, 0xCCD1, 0x8405, 0xC84E, 0x8406, 0xDDC9, + 0x8407, 0xC84F, 0x8408, 0xC850, 0x8409, 0xC851, 0x840A, 0xC852, + 0x840B, 0xDDC2, 0x840C, 0xC3C8, 0x840D, 0xC6BC, 0x840E, 0xCEAE, + 0x840F, 0xDDCC, 0x8410, 0xC853, 0x8411, 0xDDC8, 0x8412, 0xC854, + 0x8413, 0xC855, 0x8414, 0xC856, 0x8415, 0xC857, 0x8416, 0xC858, + 0x8417, 0xC859, 0x8418, 0xDDC1, 0x8419, 0xC85A, 0x841A, 0xC85B, + 0x841B, 0xC85C, 0x841C, 0xDDC6, 0x841D, 0xC2DC, 0x841E, 0xC85D, + 0x841F, 0xC85E, 0x8420, 0xC85F, 0x8421, 0xC860, 0x8422, 0xC861, + 0x8423, 0xC862, 0x8424, 0xD3A9, 0x8425, 0xD3AA, 0x8426, 0xDDD3, + 0x8427, 0xCFF4, 0x8428, 0xC8F8, 0x8429, 0xC863, 0x842A, 0xC864, + 0x842B, 0xC865, 0x842C, 0xC866, 0x842D, 0xC867, 0x842E, 0xC868, + 0x842F, 0xC869, 0x8430, 0xC86A, 0x8431, 0xDDE6, 0x8432, 0xC86B, + 0x8433, 0xC86C, 0x8434, 0xC86D, 0x8435, 0xC86E, 0x8436, 0xC86F, + 0x8437, 0xC870, 0x8438, 0xDDC7, 0x8439, 0xC871, 0x843A, 0xC872, + 0x843B, 0xC873, 0x843C, 0xDDE0, 0x843D, 0xC2E4, 0x843E, 0xC874, + 0x843F, 0xC875, 0x8440, 0xC876, 0x8441, 0xC877, 0x8442, 0xC878, + 0x8443, 0xC879, 0x8444, 0xC87A, 0x8445, 0xC87B, 0x8446, 0xDDE1, + 0x8447, 0xC87C, 0x8448, 0xC87D, 0x8449, 0xC87E, 0x844A, 0xC880, + 0x844B, 0xC881, 0x844C, 0xC882, 0x844D, 0xC883, 0x844E, 0xC884, + 0x844F, 0xC885, 0x8450, 0xC886, 0x8451, 0xDDD7, 0x8452, 0xC887, + 0x8453, 0xC888, 0x8454, 0xC889, 0x8455, 0xC88A, 0x8456, 0xC88B, + 0x8457, 0xD6F8, 0x8458, 0xC88C, 0x8459, 0xDDD9, 0x845A, 0xDDD8, + 0x845B, 0xB8F0, 0x845C, 0xDDD6, 0x845D, 0xC88D, 0x845E, 0xC88E, + 0x845F, 0xC88F, 0x8460, 0xC890, 0x8461, 0xC6CF, 0x8462, 0xC891, + 0x8463, 0xB6AD, 0x8464, 0xC892, 0x8465, 0xC893, 0x8466, 0xC894, + 0x8467, 0xC895, 0x8468, 0xC896, 0x8469, 0xDDE2, 0x846A, 0xC897, + 0x846B, 0xBAF9, 0x846C, 0xD4E1, 0x846D, 0xDDE7, 0x846E, 0xC898, + 0x846F, 0xC899, 0x8470, 0xC89A, 0x8471, 0xB4D0, 0x8472, 0xC89B, + 0x8473, 0xDDDA, 0x8474, 0xC89C, 0x8475, 0xBFFB, 0x8476, 0xDDE3, + 0x8477, 0xC89D, 0x8478, 0xDDDF, 0x8479, 0xC89E, 0x847A, 0xDDDD, + 0x847B, 0xC89F, 0x847C, 0xC8A0, 0x847D, 0xC940, 0x847E, 0xC941, + 0x847F, 0xC942, 0x8480, 0xC943, 0x8481, 0xC944, 0x8482, 0xB5D9, + 0x8483, 0xC945, 0x8484, 0xC946, 0x8485, 0xC947, 0x8486, 0xC948, + 0x8487, 0xDDDB, 0x8488, 0xDDDC, 0x8489, 0xDDDE, 0x848A, 0xC949, + 0x848B, 0xBDAF, 0x848C, 0xDDE4, 0x848D, 0xC94A, 0x848E, 0xDDE5, + 0x848F, 0xC94B, 0x8490, 0xC94C, 0x8491, 0xC94D, 0x8492, 0xC94E, + 0x8493, 0xC94F, 0x8494, 0xC950, 0x8495, 0xC951, 0x8496, 0xC952, + 0x8497, 0xDDF5, 0x8498, 0xC953, 0x8499, 0xC3C9, 0x849A, 0xC954, + 0x849B, 0xC955, 0x849C, 0xCBE2, 0x849D, 0xC956, 0x849E, 0xC957, + 0x849F, 0xC958, 0x84A0, 0xC959, 0x84A1, 0xDDF2, 0x84A2, 0xC95A, + 0x84A3, 0xC95B, 0x84A4, 0xC95C, 0x84A5, 0xC95D, 0x84A6, 0xC95E, + 0x84A7, 0xC95F, 0x84A8, 0xC960, 0x84A9, 0xC961, 0x84AA, 0xC962, + 0x84AB, 0xC963, 0x84AC, 0xC964, 0x84AD, 0xC965, 0x84AE, 0xC966, + 0x84AF, 0xD8E1, 0x84B0, 0xC967, 0x84B1, 0xC968, 0x84B2, 0xC6D1, + 0x84B3, 0xC969, 0x84B4, 0xDDF4, 0x84B5, 0xC96A, 0x84B6, 0xC96B, + 0x84B7, 0xC96C, 0x84B8, 0xD5F4, 0x84B9, 0xDDF3, 0x84BA, 0xDDF0, + 0x84BB, 0xC96D, 0x84BC, 0xC96E, 0x84BD, 0xDDEC, 0x84BE, 0xC96F, + 0x84BF, 0xDDEF, 0x84C0, 0xC970, 0x84C1, 0xDDE8, 0x84C2, 0xC971, + 0x84C3, 0xC972, 0x84C4, 0xD0EE, 0x84C5, 0xC973, 0x84C6, 0xC974, + 0x84C7, 0xC975, 0x84C8, 0xC976, 0x84C9, 0xC8D8, 0x84CA, 0xDDEE, + 0x84CB, 0xC977, 0x84CC, 0xC978, 0x84CD, 0xDDE9, 0x84CE, 0xC979, + 0x84CF, 0xC97A, 0x84D0, 0xDDEA, 0x84D1, 0xCBF2, 0x84D2, 0xC97B, + 0x84D3, 0xDDED, 0x84D4, 0xC97C, 0x84D5, 0xC97D, 0x84D6, 0xB1CD, + 0x84D7, 0xC97E, 0x84D8, 0xC980, 0x84D9, 0xC981, 0x84DA, 0xC982, + 0x84DB, 0xC983, 0x84DC, 0xC984, 0x84DD, 0xC0B6, 0x84DE, 0xC985, + 0x84DF, 0xBCBB, 0x84E0, 0xDDF1, 0x84E1, 0xC986, 0x84E2, 0xC987, + 0x84E3, 0xDDF7, 0x84E4, 0xC988, 0x84E5, 0xDDF6, 0x84E6, 0xDDEB, + 0x84E7, 0xC989, 0x84E8, 0xC98A, 0x84E9, 0xC98B, 0x84EA, 0xC98C, + 0x84EB, 0xC98D, 0x84EC, 0xC5EE, 0x84ED, 0xC98E, 0x84EE, 0xC98F, + 0x84EF, 0xC990, 0x84F0, 0xDDFB, 0x84F1, 0xC991, 0x84F2, 0xC992, + 0x84F3, 0xC993, 0x84F4, 0xC994, 0x84F5, 0xC995, 0x84F6, 0xC996, + 0x84F7, 0xC997, 0x84F8, 0xC998, 0x84F9, 0xC999, 0x84FA, 0xC99A, + 0x84FB, 0xC99B, 0x84FC, 0xDEA4, 0x84FD, 0xC99C, 0x84FE, 0xC99D, + 0x84FF, 0xDEA3, 0x8500, 0xC99E, 0x8501, 0xC99F, 0x8502, 0xC9A0, + 0x8503, 0xCA40, 0x8504, 0xCA41, 0x8505, 0xCA42, 0x8506, 0xCA43, + 0x8507, 0xCA44, 0x8508, 0xCA45, 0x8509, 0xCA46, 0x850A, 0xCA47, + 0x850B, 0xCA48, 0x850C, 0xDDF8, 0x850D, 0xCA49, 0x850E, 0xCA4A, + 0x850F, 0xCA4B, 0x8510, 0xCA4C, 0x8511, 0xC3EF, 0x8512, 0xCA4D, + 0x8513, 0xC2FB, 0x8514, 0xCA4E, 0x8515, 0xCA4F, 0x8516, 0xCA50, + 0x8517, 0xD5E1, 0x8518, 0xCA51, 0x8519, 0xCA52, 0x851A, 0xCEB5, + 0x851B, 0xCA53, 0x851C, 0xCA54, 0x851D, 0xCA55, 0x851E, 0xCA56, + 0x851F, 0xDDFD, 0x8520, 0xCA57, 0x8521, 0xB2CC, 0x8522, 0xCA58, + 0x8523, 0xCA59, 0x8524, 0xCA5A, 0x8525, 0xCA5B, 0x8526, 0xCA5C, + 0x8527, 0xCA5D, 0x8528, 0xCA5E, 0x8529, 0xCA5F, 0x852A, 0xCA60, + 0x852B, 0xC4E8, 0x852C, 0xCADF, 0x852D, 0xCA61, 0x852E, 0xCA62, + 0x852F, 0xCA63, 0x8530, 0xCA64, 0x8531, 0xCA65, 0x8532, 0xCA66, + 0x8533, 0xCA67, 0x8534, 0xCA68, 0x8535, 0xCA69, 0x8536, 0xCA6A, + 0x8537, 0xC7BE, 0x8538, 0xDDFA, 0x8539, 0xDDFC, 0x853A, 0xDDFE, + 0x853B, 0xDEA2, 0x853C, 0xB0AA, 0x853D, 0xB1CE, 0x853E, 0xCA6B, + 0x853F, 0xCA6C, 0x8540, 0xCA6D, 0x8541, 0xCA6E, 0x8542, 0xCA6F, + 0x8543, 0xDEAC, 0x8544, 0xCA70, 0x8545, 0xCA71, 0x8546, 0xCA72, + 0x8547, 0xCA73, 0x8548, 0xDEA6, 0x8549, 0xBDB6, 0x854A, 0xC8EF, + 0x854B, 0xCA74, 0x854C, 0xCA75, 0x854D, 0xCA76, 0x854E, 0xCA77, + 0x854F, 0xCA78, 0x8550, 0xCA79, 0x8551, 0xCA7A, 0x8552, 0xCA7B, + 0x8553, 0xCA7C, 0x8554, 0xCA7D, 0x8555, 0xCA7E, 0x8556, 0xDEA1, + 0x8557, 0xCA80, 0x8558, 0xCA81, 0x8559, 0xDEA5, 0x855A, 0xCA82, + 0x855B, 0xCA83, 0x855C, 0xCA84, 0x855D, 0xCA85, 0x855E, 0xDEA9, + 0x855F, 0xCA86, 0x8560, 0xCA87, 0x8561, 0xCA88, 0x8562, 0xCA89, + 0x8563, 0xCA8A, 0x8564, 0xDEA8, 0x8565, 0xCA8B, 0x8566, 0xCA8C, + 0x8567, 0xCA8D, 0x8568, 0xDEA7, 0x8569, 0xCA8E, 0x856A, 0xCA8F, + 0x856B, 0xCA90, 0x856C, 0xCA91, 0x856D, 0xCA92, 0x856E, 0xCA93, + 0x856F, 0xCA94, 0x8570, 0xCA95, 0x8571, 0xCA96, 0x8572, 0xDEAD, + 0x8573, 0xCA97, 0x8574, 0xD4CC, 0x8575, 0xCA98, 0x8576, 0xCA99, + 0x8577, 0xCA9A, 0x8578, 0xCA9B, 0x8579, 0xDEB3, 0x857A, 0xDEAA, + 0x857B, 0xDEAE, 0x857C, 0xCA9C, 0x857D, 0xCA9D, 0x857E, 0xC0D9, + 0x857F, 0xCA9E, 0x8580, 0xCA9F, 0x8581, 0xCAA0, 0x8582, 0xCB40, + 0x8583, 0xCB41, 0x8584, 0xB1A1, 0x8585, 0xDEB6, 0x8586, 0xCB42, + 0x8587, 0xDEB1, 0x8588, 0xCB43, 0x8589, 0xCB44, 0x858A, 0xCB45, + 0x858B, 0xCB46, 0x858C, 0xCB47, 0x858D, 0xCB48, 0x858E, 0xCB49, + 0x858F, 0xDEB2, 0x8590, 0xCB4A, 0x8591, 0xCB4B, 0x8592, 0xCB4C, + 0x8593, 0xCB4D, 0x8594, 0xCB4E, 0x8595, 0xCB4F, 0x8596, 0xCB50, + 0x8597, 0xCB51, 0x8598, 0xCB52, 0x8599, 0xCB53, 0x859A, 0xCB54, + 0x859B, 0xD1A6, 0x859C, 0xDEB5, 0x859D, 0xCB55, 0x859E, 0xCB56, + 0x859F, 0xCB57, 0x85A0, 0xCB58, 0x85A1, 0xCB59, 0x85A2, 0xCB5A, + 0x85A3, 0xCB5B, 0x85A4, 0xDEAF, 0x85A5, 0xCB5C, 0x85A6, 0xCB5D, + 0x85A7, 0xCB5E, 0x85A8, 0xDEB0, 0x85A9, 0xCB5F, 0x85AA, 0xD0BD, + 0x85AB, 0xCB60, 0x85AC, 0xCB61, 0x85AD, 0xCB62, 0x85AE, 0xDEB4, + 0x85AF, 0xCAED, 0x85B0, 0xDEB9, 0x85B1, 0xCB63, 0x85B2, 0xCB64, + 0x85B3, 0xCB65, 0x85B4, 0xCB66, 0x85B5, 0xCB67, 0x85B6, 0xCB68, + 0x85B7, 0xDEB8, 0x85B8, 0xCB69, 0x85B9, 0xDEB7, 0x85BA, 0xCB6A, + 0x85BB, 0xCB6B, 0x85BC, 0xCB6C, 0x85BD, 0xCB6D, 0x85BE, 0xCB6E, + 0x85BF, 0xCB6F, 0x85C0, 0xCB70, 0x85C1, 0xDEBB, 0x85C2, 0xCB71, + 0x85C3, 0xCB72, 0x85C4, 0xCB73, 0x85C5, 0xCB74, 0x85C6, 0xCB75, + 0x85C7, 0xCB76, 0x85C8, 0xCB77, 0x85C9, 0xBDE5, 0x85CA, 0xCB78, + 0x85CB, 0xCB79, 0x85CC, 0xCB7A, 0x85CD, 0xCB7B, 0x85CE, 0xCB7C, + 0x85CF, 0xB2D8, 0x85D0, 0xC3EA, 0x85D1, 0xCB7D, 0x85D2, 0xCB7E, + 0x85D3, 0xDEBA, 0x85D4, 0xCB80, 0x85D5, 0xC5BA, 0x85D6, 0xCB81, + 0x85D7, 0xCB82, 0x85D8, 0xCB83, 0x85D9, 0xCB84, 0x85DA, 0xCB85, + 0x85DB, 0xCB86, 0x85DC, 0xDEBC, 0x85DD, 0xCB87, 0x85DE, 0xCB88, + 0x85DF, 0xCB89, 0x85E0, 0xCB8A, 0x85E1, 0xCB8B, 0x85E2, 0xCB8C, + 0x85E3, 0xCB8D, 0x85E4, 0xCCD9, 0x85E5, 0xCB8E, 0x85E6, 0xCB8F, + 0x85E7, 0xCB90, 0x85E8, 0xCB91, 0x85E9, 0xB7AA, 0x85EA, 0xCB92, + 0x85EB, 0xCB93, 0x85EC, 0xCB94, 0x85ED, 0xCB95, 0x85EE, 0xCB96, + 0x85EF, 0xCB97, 0x85F0, 0xCB98, 0x85F1, 0xCB99, 0x85F2, 0xCB9A, + 0x85F3, 0xCB9B, 0x85F4, 0xCB9C, 0x85F5, 0xCB9D, 0x85F6, 0xCB9E, + 0x85F7, 0xCB9F, 0x85F8, 0xCBA0, 0x85F9, 0xCC40, 0x85FA, 0xCC41, + 0x85FB, 0xD4E5, 0x85FC, 0xCC42, 0x85FD, 0xCC43, 0x85FE, 0xCC44, + 0x85FF, 0xDEBD, 0x8600, 0xCC45, 0x8601, 0xCC46, 0x8602, 0xCC47, + 0x8603, 0xCC48, 0x8604, 0xCC49, 0x8605, 0xDEBF, 0x8606, 0xCC4A, + 0x8607, 0xCC4B, 0x8608, 0xCC4C, 0x8609, 0xCC4D, 0x860A, 0xCC4E, + 0x860B, 0xCC4F, 0x860C, 0xCC50, 0x860D, 0xCC51, 0x860E, 0xCC52, + 0x860F, 0xCC53, 0x8610, 0xCC54, 0x8611, 0xC4A2, 0x8612, 0xCC55, + 0x8613, 0xCC56, 0x8614, 0xCC57, 0x8615, 0xCC58, 0x8616, 0xDEC1, + 0x8617, 0xCC59, 0x8618, 0xCC5A, 0x8619, 0xCC5B, 0x861A, 0xCC5C, + 0x861B, 0xCC5D, 0x861C, 0xCC5E, 0x861D, 0xCC5F, 0x861E, 0xCC60, + 0x861F, 0xCC61, 0x8620, 0xCC62, 0x8621, 0xCC63, 0x8622, 0xCC64, + 0x8623, 0xCC65, 0x8624, 0xCC66, 0x8625, 0xCC67, 0x8626, 0xCC68, + 0x8627, 0xDEBE, 0x8628, 0xCC69, 0x8629, 0xDEC0, 0x862A, 0xCC6A, + 0x862B, 0xCC6B, 0x862C, 0xCC6C, 0x862D, 0xCC6D, 0x862E, 0xCC6E, + 0x862F, 0xCC6F, 0x8630, 0xCC70, 0x8631, 0xCC71, 0x8632, 0xCC72, + 0x8633, 0xCC73, 0x8634, 0xCC74, 0x8635, 0xCC75, 0x8636, 0xCC76, + 0x8637, 0xCC77, 0x8638, 0xD5BA, 0x8639, 0xCC78, 0x863A, 0xCC79, + 0x863B, 0xCC7A, 0x863C, 0xDEC2, 0x863D, 0xCC7B, 0x863E, 0xCC7C, + 0x863F, 0xCC7D, 0x8640, 0xCC7E, 0x8641, 0xCC80, 0x8642, 0xCC81, + 0x8643, 0xCC82, 0x8644, 0xCC83, 0x8645, 0xCC84, 0x8646, 0xCC85, + 0x8647, 0xCC86, 0x8648, 0xCC87, 0x8649, 0xCC88, 0x864A, 0xCC89, + 0x864B, 0xCC8A, 0x864C, 0xCC8B, 0x864D, 0xF2AE, 0x864E, 0xBBA2, + 0x864F, 0xC2B2, 0x8650, 0xC5B0, 0x8651, 0xC2C7, 0x8652, 0xCC8C, + 0x8653, 0xCC8D, 0x8654, 0xF2AF, 0x8655, 0xCC8E, 0x8656, 0xCC8F, + 0x8657, 0xCC90, 0x8658, 0xCC91, 0x8659, 0xCC92, 0x865A, 0xD0E9, + 0x865B, 0xCC93, 0x865C, 0xCC94, 0x865D, 0xCC95, 0x865E, 0xD3DD, + 0x865F, 0xCC96, 0x8660, 0xCC97, 0x8661, 0xCC98, 0x8662, 0xEBBD, + 0x8663, 0xCC99, 0x8664, 0xCC9A, 0x8665, 0xCC9B, 0x8666, 0xCC9C, + 0x8667, 0xCC9D, 0x8668, 0xCC9E, 0x8669, 0xCC9F, 0x866A, 0xCCA0, + 0x866B, 0xB3E6, 0x866C, 0xF2B0, 0x866D, 0xCD40, 0x866E, 0xF2B1, + 0x866F, 0xCD41, 0x8670, 0xCD42, 0x8671, 0xCAAD, 0x8672, 0xCD43, + 0x8673, 0xCD44, 0x8674, 0xCD45, 0x8675, 0xCD46, 0x8676, 0xCD47, + 0x8677, 0xCD48, 0x8678, 0xCD49, 0x8679, 0xBAE7, 0x867A, 0xF2B3, + 0x867B, 0xF2B5, 0x867C, 0xF2B4, 0x867D, 0xCBE4, 0x867E, 0xCFBA, + 0x867F, 0xF2B2, 0x8680, 0xCAB4, 0x8681, 0xD2CF, 0x8682, 0xC2EC, + 0x8683, 0xCD4A, 0x8684, 0xCD4B, 0x8685, 0xCD4C, 0x8686, 0xCD4D, + 0x8687, 0xCD4E, 0x8688, 0xCD4F, 0x8689, 0xCD50, 0x868A, 0xCEC3, + 0x868B, 0xF2B8, 0x868C, 0xB0F6, 0x868D, 0xF2B7, 0x868E, 0xCD51, + 0x868F, 0xCD52, 0x8690, 0xCD53, 0x8691, 0xCD54, 0x8692, 0xCD55, + 0x8693, 0xF2BE, 0x8694, 0xCD56, 0x8695, 0xB2CF, 0x8696, 0xCD57, + 0x8697, 0xCD58, 0x8698, 0xCD59, 0x8699, 0xCD5A, 0x869A, 0xCD5B, + 0x869B, 0xCD5C, 0x869C, 0xD1C1, 0x869D, 0xF2BA, 0x869E, 0xCD5D, + 0x869F, 0xCD5E, 0x86A0, 0xCD5F, 0x86A1, 0xCD60, 0x86A2, 0xCD61, + 0x86A3, 0xF2BC, 0x86A4, 0xD4E9, 0x86A5, 0xCD62, 0x86A6, 0xCD63, + 0x86A7, 0xF2BB, 0x86A8, 0xF2B6, 0x86A9, 0xF2BF, 0x86AA, 0xF2BD, + 0x86AB, 0xCD64, 0x86AC, 0xF2B9, 0x86AD, 0xCD65, 0x86AE, 0xCD66, + 0x86AF, 0xF2C7, 0x86B0, 0xF2C4, 0x86B1, 0xF2C6, 0x86B2, 0xCD67, + 0x86B3, 0xCD68, 0x86B4, 0xF2CA, 0x86B5, 0xF2C2, 0x86B6, 0xF2C0, + 0x86B7, 0xCD69, 0x86B8, 0xCD6A, 0x86B9, 0xCD6B, 0x86BA, 0xF2C5, + 0x86BB, 0xCD6C, 0x86BC, 0xCD6D, 0x86BD, 0xCD6E, 0x86BE, 0xCD6F, + 0x86BF, 0xCD70, 0x86C0, 0xD6FB, 0x86C1, 0xCD71, 0x86C2, 0xCD72, + 0x86C3, 0xCD73, 0x86C4, 0xF2C1, 0x86C5, 0xCD74, 0x86C6, 0xC7F9, + 0x86C7, 0xC9DF, 0x86C8, 0xCD75, 0x86C9, 0xF2C8, 0x86CA, 0xB9C6, + 0x86CB, 0xB5B0, 0x86CC, 0xCD76, 0x86CD, 0xCD77, 0x86CE, 0xF2C3, + 0x86CF, 0xF2C9, 0x86D0, 0xF2D0, 0x86D1, 0xF2D6, 0x86D2, 0xCD78, + 0x86D3, 0xCD79, 0x86D4, 0xBBD7, 0x86D5, 0xCD7A, 0x86D6, 0xCD7B, + 0x86D7, 0xCD7C, 0x86D8, 0xF2D5, 0x86D9, 0xCDDC, 0x86DA, 0xCD7D, + 0x86DB, 0xD6EB, 0x86DC, 0xCD7E, 0x86DD, 0xCD80, 0x86DE, 0xF2D2, + 0x86DF, 0xF2D4, 0x86E0, 0xCD81, 0x86E1, 0xCD82, 0x86E2, 0xCD83, + 0x86E3, 0xCD84, 0x86E4, 0xB8F2, 0x86E5, 0xCD85, 0x86E6, 0xCD86, + 0x86E7, 0xCD87, 0x86E8, 0xCD88, 0x86E9, 0xF2CB, 0x86EA, 0xCD89, + 0x86EB, 0xCD8A, 0x86EC, 0xCD8B, 0x86ED, 0xF2CE, 0x86EE, 0xC2F9, + 0x86EF, 0xCD8C, 0x86F0, 0xD5DD, 0x86F1, 0xF2CC, 0x86F2, 0xF2CD, + 0x86F3, 0xF2CF, 0x86F4, 0xF2D3, 0x86F5, 0xCD8D, 0x86F6, 0xCD8E, + 0x86F7, 0xCD8F, 0x86F8, 0xF2D9, 0x86F9, 0xD3BC, 0x86FA, 0xCD90, + 0x86FB, 0xCD91, 0x86FC, 0xCD92, 0x86FD, 0xCD93, 0x86FE, 0xB6EA, + 0x86FF, 0xCD94, 0x8700, 0xCAF1, 0x8701, 0xCD95, 0x8702, 0xB7E4, + 0x8703, 0xF2D7, 0x8704, 0xCD96, 0x8705, 0xCD97, 0x8706, 0xCD98, + 0x8707, 0xF2D8, 0x8708, 0xF2DA, 0x8709, 0xF2DD, 0x870A, 0xF2DB, + 0x870B, 0xCD99, 0x870C, 0xCD9A, 0x870D, 0xF2DC, 0x870E, 0xCD9B, + 0x870F, 0xCD9C, 0x8710, 0xCD9D, 0x8711, 0xCD9E, 0x8712, 0xD1D1, + 0x8713, 0xF2D1, 0x8714, 0xCD9F, 0x8715, 0xCDC9, 0x8716, 0xCDA0, + 0x8717, 0xCECF, 0x8718, 0xD6A9, 0x8719, 0xCE40, 0x871A, 0xF2E3, + 0x871B, 0xCE41, 0x871C, 0xC3DB, 0x871D, 0xCE42, 0x871E, 0xF2E0, + 0x871F, 0xCE43, 0x8720, 0xCE44, 0x8721, 0xC0AF, 0x8722, 0xF2EC, + 0x8723, 0xF2DE, 0x8724, 0xCE45, 0x8725, 0xF2E1, 0x8726, 0xCE46, + 0x8727, 0xCE47, 0x8728, 0xCE48, 0x8729, 0xF2E8, 0x872A, 0xCE49, + 0x872B, 0xCE4A, 0x872C, 0xCE4B, 0x872D, 0xCE4C, 0x872E, 0xF2E2, + 0x872F, 0xCE4D, 0x8730, 0xCE4E, 0x8731, 0xF2E7, 0x8732, 0xCE4F, + 0x8733, 0xCE50, 0x8734, 0xF2E6, 0x8735, 0xCE51, 0x8736, 0xCE52, + 0x8737, 0xF2E9, 0x8738, 0xCE53, 0x8739, 0xCE54, 0x873A, 0xCE55, + 0x873B, 0xF2DF, 0x873C, 0xCE56, 0x873D, 0xCE57, 0x873E, 0xF2E4, + 0x873F, 0xF2EA, 0x8740, 0xCE58, 0x8741, 0xCE59, 0x8742, 0xCE5A, + 0x8743, 0xCE5B, 0x8744, 0xCE5C, 0x8745, 0xCE5D, 0x8746, 0xCE5E, + 0x8747, 0xD3AC, 0x8748, 0xF2E5, 0x8749, 0xB2F5, 0x874A, 0xCE5F, + 0x874B, 0xCE60, 0x874C, 0xF2F2, 0x874D, 0xCE61, 0x874E, 0xD0AB, + 0x874F, 0xCE62, 0x8750, 0xCE63, 0x8751, 0xCE64, 0x8752, 0xCE65, + 0x8753, 0xF2F5, 0x8754, 0xCE66, 0x8755, 0xCE67, 0x8756, 0xCE68, + 0x8757, 0xBBC8, 0x8758, 0xCE69, 0x8759, 0xF2F9, 0x875A, 0xCE6A, + 0x875B, 0xCE6B, 0x875C, 0xCE6C, 0x875D, 0xCE6D, 0x875E, 0xCE6E, + 0x875F, 0xCE6F, 0x8760, 0xF2F0, 0x8761, 0xCE70, 0x8762, 0xCE71, + 0x8763, 0xF2F6, 0x8764, 0xF2F8, 0x8765, 0xF2FA, 0x8766, 0xCE72, + 0x8767, 0xCE73, 0x8768, 0xCE74, 0x8769, 0xCE75, 0x876A, 0xCE76, + 0x876B, 0xCE77, 0x876C, 0xCE78, 0x876D, 0xCE79, 0x876E, 0xF2F3, + 0x876F, 0xCE7A, 0x8770, 0xF2F1, 0x8771, 0xCE7B, 0x8772, 0xCE7C, + 0x8773, 0xCE7D, 0x8774, 0xBAFB, 0x8775, 0xCE7E, 0x8776, 0xB5FB, + 0x8777, 0xCE80, 0x8778, 0xCE81, 0x8779, 0xCE82, 0x877A, 0xCE83, + 0x877B, 0xF2EF, 0x877C, 0xF2F7, 0x877D, 0xF2ED, 0x877E, 0xF2EE, + 0x877F, 0xCE84, 0x8780, 0xCE85, 0x8781, 0xCE86, 0x8782, 0xF2EB, + 0x8783, 0xF3A6, 0x8784, 0xCE87, 0x8785, 0xF3A3, 0x8786, 0xCE88, + 0x8787, 0xCE89, 0x8788, 0xF3A2, 0x8789, 0xCE8A, 0x878A, 0xCE8B, + 0x878B, 0xF2F4, 0x878C, 0xCE8C, 0x878D, 0xC8DA, 0x878E, 0xCE8D, + 0x878F, 0xCE8E, 0x8790, 0xCE8F, 0x8791, 0xCE90, 0x8792, 0xCE91, + 0x8793, 0xF2FB, 0x8794, 0xCE92, 0x8795, 0xCE93, 0x8796, 0xCE94, + 0x8797, 0xF3A5, 0x8798, 0xCE95, 0x8799, 0xCE96, 0x879A, 0xCE97, + 0x879B, 0xCE98, 0x879C, 0xCE99, 0x879D, 0xCE9A, 0x879E, 0xCE9B, + 0x879F, 0xC3F8, 0x87A0, 0xCE9C, 0x87A1, 0xCE9D, 0x87A2, 0xCE9E, + 0x87A3, 0xCE9F, 0x87A4, 0xCEA0, 0x87A5, 0xCF40, 0x87A6, 0xCF41, + 0x87A7, 0xCF42, 0x87A8, 0xF2FD, 0x87A9, 0xCF43, 0x87AA, 0xCF44, + 0x87AB, 0xF3A7, 0x87AC, 0xF3A9, 0x87AD, 0xF3A4, 0x87AE, 0xCF45, + 0x87AF, 0xF2FC, 0x87B0, 0xCF46, 0x87B1, 0xCF47, 0x87B2, 0xCF48, + 0x87B3, 0xF3AB, 0x87B4, 0xCF49, 0x87B5, 0xF3AA, 0x87B6, 0xCF4A, + 0x87B7, 0xCF4B, 0x87B8, 0xCF4C, 0x87B9, 0xCF4D, 0x87BA, 0xC2DD, + 0x87BB, 0xCF4E, 0x87BC, 0xCF4F, 0x87BD, 0xF3AE, 0x87BE, 0xCF50, + 0x87BF, 0xCF51, 0x87C0, 0xF3B0, 0x87C1, 0xCF52, 0x87C2, 0xCF53, + 0x87C3, 0xCF54, 0x87C4, 0xCF55, 0x87C5, 0xCF56, 0x87C6, 0xF3A1, + 0x87C7, 0xCF57, 0x87C8, 0xCF58, 0x87C9, 0xCF59, 0x87CA, 0xF3B1, + 0x87CB, 0xF3AC, 0x87CC, 0xCF5A, 0x87CD, 0xCF5B, 0x87CE, 0xCF5C, + 0x87CF, 0xCF5D, 0x87D0, 0xCF5E, 0x87D1, 0xF3AF, 0x87D2, 0xF2FE, + 0x87D3, 0xF3AD, 0x87D4, 0xCF5F, 0x87D5, 0xCF60, 0x87D6, 0xCF61, + 0x87D7, 0xCF62, 0x87D8, 0xCF63, 0x87D9, 0xCF64, 0x87DA, 0xCF65, + 0x87DB, 0xF3B2, 0x87DC, 0xCF66, 0x87DD, 0xCF67, 0x87DE, 0xCF68, + 0x87DF, 0xCF69, 0x87E0, 0xF3B4, 0x87E1, 0xCF6A, 0x87E2, 0xCF6B, + 0x87E3, 0xCF6C, 0x87E4, 0xCF6D, 0x87E5, 0xF3A8, 0x87E6, 0xCF6E, + 0x87E7, 0xCF6F, 0x87E8, 0xCF70, 0x87E9, 0xCF71, 0x87EA, 0xF3B3, + 0x87EB, 0xCF72, 0x87EC, 0xCF73, 0x87ED, 0xCF74, 0x87EE, 0xF3B5, + 0x87EF, 0xCF75, 0x87F0, 0xCF76, 0x87F1, 0xCF77, 0x87F2, 0xCF78, + 0x87F3, 0xCF79, 0x87F4, 0xCF7A, 0x87F5, 0xCF7B, 0x87F6, 0xCF7C, + 0x87F7, 0xCF7D, 0x87F8, 0xCF7E, 0x87F9, 0xD0B7, 0x87FA, 0xCF80, + 0x87FB, 0xCF81, 0x87FC, 0xCF82, 0x87FD, 0xCF83, 0x87FE, 0xF3B8, + 0x87FF, 0xCF84, 0x8800, 0xCF85, 0x8801, 0xCF86, 0x8802, 0xCF87, + 0x8803, 0xD9F9, 0x8804, 0xCF88, 0x8805, 0xCF89, 0x8806, 0xCF8A, + 0x8807, 0xCF8B, 0x8808, 0xCF8C, 0x8809, 0xCF8D, 0x880A, 0xF3B9, + 0x880B, 0xCF8E, 0x880C, 0xCF8F, 0x880D, 0xCF90, 0x880E, 0xCF91, + 0x880F, 0xCF92, 0x8810, 0xCF93, 0x8811, 0xCF94, 0x8812, 0xCF95, + 0x8813, 0xF3B7, 0x8814, 0xCF96, 0x8815, 0xC8E4, 0x8816, 0xF3B6, + 0x8817, 0xCF97, 0x8818, 0xCF98, 0x8819, 0xCF99, 0x881A, 0xCF9A, + 0x881B, 0xF3BA, 0x881C, 0xCF9B, 0x881D, 0xCF9C, 0x881E, 0xCF9D, + 0x881F, 0xCF9E, 0x8820, 0xCF9F, 0x8821, 0xF3BB, 0x8822, 0xB4C0, + 0x8823, 0xCFA0, 0x8824, 0xD040, 0x8825, 0xD041, 0x8826, 0xD042, + 0x8827, 0xD043, 0x8828, 0xD044, 0x8829, 0xD045, 0x882A, 0xD046, + 0x882B, 0xD047, 0x882C, 0xD048, 0x882D, 0xD049, 0x882E, 0xD04A, + 0x882F, 0xD04B, 0x8830, 0xD04C, 0x8831, 0xD04D, 0x8832, 0xEEC3, + 0x8833, 0xD04E, 0x8834, 0xD04F, 0x8835, 0xD050, 0x8836, 0xD051, + 0x8837, 0xD052, 0x8838, 0xD053, 0x8839, 0xF3BC, 0x883A, 0xD054, + 0x883B, 0xD055, 0x883C, 0xF3BD, 0x883D, 0xD056, 0x883E, 0xD057, + 0x883F, 0xD058, 0x8840, 0xD1AA, 0x8841, 0xD059, 0x8842, 0xD05A, + 0x8843, 0xD05B, 0x8844, 0xF4AC, 0x8845, 0xD0C6, 0x8846, 0xD05C, + 0x8847, 0xD05D, 0x8848, 0xD05E, 0x8849, 0xD05F, 0x884A, 0xD060, + 0x884B, 0xD061, 0x884C, 0xD0D0, 0x884D, 0xD1DC, 0x884E, 0xD062, + 0x884F, 0xD063, 0x8850, 0xD064, 0x8851, 0xD065, 0x8852, 0xD066, + 0x8853, 0xD067, 0x8854, 0xCFCE, 0x8855, 0xD068, 0x8856, 0xD069, + 0x8857, 0xBDD6, 0x8858, 0xD06A, 0x8859, 0xD1C3, 0x885A, 0xD06B, + 0x885B, 0xD06C, 0x885C, 0xD06D, 0x885D, 0xD06E, 0x885E, 0xD06F, + 0x885F, 0xD070, 0x8860, 0xD071, 0x8861, 0xBAE2, 0x8862, 0xE1E9, + 0x8863, 0xD2C2, 0x8864, 0xF1C2, 0x8865, 0xB2B9, 0x8866, 0xD072, + 0x8867, 0xD073, 0x8868, 0xB1ED, 0x8869, 0xF1C3, 0x886A, 0xD074, + 0x886B, 0xC9C0, 0x886C, 0xB3C4, 0x886D, 0xD075, 0x886E, 0xD9F2, + 0x886F, 0xD076, 0x8870, 0xCBA5, 0x8871, 0xD077, 0x8872, 0xF1C4, + 0x8873, 0xD078, 0x8874, 0xD079, 0x8875, 0xD07A, 0x8876, 0xD07B, + 0x8877, 0xD6D4, 0x8878, 0xD07C, 0x8879, 0xD07D, 0x887A, 0xD07E, + 0x887B, 0xD080, 0x887C, 0xD081, 0x887D, 0xF1C5, 0x887E, 0xF4C0, + 0x887F, 0xF1C6, 0x8880, 0xD082, 0x8881, 0xD4AC, 0x8882, 0xF1C7, + 0x8883, 0xD083, 0x8884, 0xB0C0, 0x8885, 0xF4C1, 0x8886, 0xD084, + 0x8887, 0xD085, 0x8888, 0xF4C2, 0x8889, 0xD086, 0x888A, 0xD087, + 0x888B, 0xB4FC, 0x888C, 0xD088, 0x888D, 0xC5DB, 0x888E, 0xD089, + 0x888F, 0xD08A, 0x8890, 0xD08B, 0x8891, 0xD08C, 0x8892, 0xCCBB, + 0x8893, 0xD08D, 0x8894, 0xD08E, 0x8895, 0xD08F, 0x8896, 0xD0E4, + 0x8897, 0xD090, 0x8898, 0xD091, 0x8899, 0xD092, 0x889A, 0xD093, + 0x889B, 0xD094, 0x889C, 0xCDE0, 0x889D, 0xD095, 0x889E, 0xD096, + 0x889F, 0xD097, 0x88A0, 0xD098, 0x88A1, 0xD099, 0x88A2, 0xF1C8, + 0x88A3, 0xD09A, 0x88A4, 0xD9F3, 0x88A5, 0xD09B, 0x88A6, 0xD09C, + 0x88A7, 0xD09D, 0x88A8, 0xD09E, 0x88A9, 0xD09F, 0x88AA, 0xD0A0, + 0x88AB, 0xB1BB, 0x88AC, 0xD140, 0x88AD, 0xCFAE, 0x88AE, 0xD141, + 0x88AF, 0xD142, 0x88B0, 0xD143, 0x88B1, 0xB8A4, 0x88B2, 0xD144, + 0x88B3, 0xD145, 0x88B4, 0xD146, 0x88B5, 0xD147, 0x88B6, 0xD148, + 0x88B7, 0xF1CA, 0x88B8, 0xD149, 0x88B9, 0xD14A, 0x88BA, 0xD14B, + 0x88BB, 0xD14C, 0x88BC, 0xF1CB, 0x88BD, 0xD14D, 0x88BE, 0xD14E, + 0x88BF, 0xD14F, 0x88C0, 0xD150, 0x88C1, 0xB2C3, 0x88C2, 0xC1D1, + 0x88C3, 0xD151, 0x88C4, 0xD152, 0x88C5, 0xD7B0, 0x88C6, 0xF1C9, + 0x88C7, 0xD153, 0x88C8, 0xD154, 0x88C9, 0xF1CC, 0x88CA, 0xD155, + 0x88CB, 0xD156, 0x88CC, 0xD157, 0x88CD, 0xD158, 0x88CE, 0xF1CE, + 0x88CF, 0xD159, 0x88D0, 0xD15A, 0x88D1, 0xD15B, 0x88D2, 0xD9F6, + 0x88D3, 0xD15C, 0x88D4, 0xD2E1, 0x88D5, 0xD4A3, 0x88D6, 0xD15D, + 0x88D7, 0xD15E, 0x88D8, 0xF4C3, 0x88D9, 0xC8B9, 0x88DA, 0xD15F, + 0x88DB, 0xD160, 0x88DC, 0xD161, 0x88DD, 0xD162, 0x88DE, 0xD163, + 0x88DF, 0xF4C4, 0x88E0, 0xD164, 0x88E1, 0xD165, 0x88E2, 0xF1CD, + 0x88E3, 0xF1CF, 0x88E4, 0xBFE3, 0x88E5, 0xF1D0, 0x88E6, 0xD166, + 0x88E7, 0xD167, 0x88E8, 0xF1D4, 0x88E9, 0xD168, 0x88EA, 0xD169, + 0x88EB, 0xD16A, 0x88EC, 0xD16B, 0x88ED, 0xD16C, 0x88EE, 0xD16D, + 0x88EF, 0xD16E, 0x88F0, 0xF1D6, 0x88F1, 0xF1D1, 0x88F2, 0xD16F, + 0x88F3, 0xC9D1, 0x88F4, 0xC5E1, 0x88F5, 0xD170, 0x88F6, 0xD171, + 0x88F7, 0xD172, 0x88F8, 0xC2E3, 0x88F9, 0xB9FC, 0x88FA, 0xD173, + 0x88FB, 0xD174, 0x88FC, 0xF1D3, 0x88FD, 0xD175, 0x88FE, 0xF1D5, + 0x88FF, 0xD176, 0x8900, 0xD177, 0x8901, 0xD178, 0x8902, 0xB9D3, + 0x8903, 0xD179, 0x8904, 0xD17A, 0x8905, 0xD17B, 0x8906, 0xD17C, + 0x8907, 0xD17D, 0x8908, 0xD17E, 0x8909, 0xD180, 0x890A, 0xF1DB, + 0x890B, 0xD181, 0x890C, 0xD182, 0x890D, 0xD183, 0x890E, 0xD184, + 0x890F, 0xD185, 0x8910, 0xBAD6, 0x8911, 0xD186, 0x8912, 0xB0FD, + 0x8913, 0xF1D9, 0x8914, 0xD187, 0x8915, 0xD188, 0x8916, 0xD189, + 0x8917, 0xD18A, 0x8918, 0xD18B, 0x8919, 0xF1D8, 0x891A, 0xF1D2, + 0x891B, 0xF1DA, 0x891C, 0xD18C, 0x891D, 0xD18D, 0x891E, 0xD18E, + 0x891F, 0xD18F, 0x8920, 0xD190, 0x8921, 0xF1D7, 0x8922, 0xD191, + 0x8923, 0xD192, 0x8924, 0xD193, 0x8925, 0xC8EC, 0x8926, 0xD194, + 0x8927, 0xD195, 0x8928, 0xD196, 0x8929, 0xD197, 0x892A, 0xCDCA, + 0x892B, 0xF1DD, 0x892C, 0xD198, 0x892D, 0xD199, 0x892E, 0xD19A, + 0x892F, 0xD19B, 0x8930, 0xE5BD, 0x8931, 0xD19C, 0x8932, 0xD19D, + 0x8933, 0xD19E, 0x8934, 0xF1DC, 0x8935, 0xD19F, 0x8936, 0xF1DE, + 0x8937, 0xD1A0, 0x8938, 0xD240, 0x8939, 0xD241, 0x893A, 0xD242, + 0x893B, 0xD243, 0x893C, 0xD244, 0x893D, 0xD245, 0x893E, 0xD246, + 0x893F, 0xD247, 0x8940, 0xD248, 0x8941, 0xF1DF, 0x8942, 0xD249, + 0x8943, 0xD24A, 0x8944, 0xCFE5, 0x8945, 0xD24B, 0x8946, 0xD24C, + 0x8947, 0xD24D, 0x8948, 0xD24E, 0x8949, 0xD24F, 0x894A, 0xD250, + 0x894B, 0xD251, 0x894C, 0xD252, 0x894D, 0xD253, 0x894E, 0xD254, + 0x894F, 0xD255, 0x8950, 0xD256, 0x8951, 0xD257, 0x8952, 0xD258, + 0x8953, 0xD259, 0x8954, 0xD25A, 0x8955, 0xD25B, 0x8956, 0xD25C, + 0x8957, 0xD25D, 0x8958, 0xD25E, 0x8959, 0xD25F, 0x895A, 0xD260, + 0x895B, 0xD261, 0x895C, 0xD262, 0x895D, 0xD263, 0x895E, 0xF4C5, + 0x895F, 0xBDF3, 0x8960, 0xD264, 0x8961, 0xD265, 0x8962, 0xD266, + 0x8963, 0xD267, 0x8964, 0xD268, 0x8965, 0xD269, 0x8966, 0xF1E0, + 0x8967, 0xD26A, 0x8968, 0xD26B, 0x8969, 0xD26C, 0x896A, 0xD26D, + 0x896B, 0xD26E, 0x896C, 0xD26F, 0x896D, 0xD270, 0x896E, 0xD271, + 0x896F, 0xD272, 0x8970, 0xD273, 0x8971, 0xD274, 0x8972, 0xD275, + 0x8973, 0xD276, 0x8974, 0xD277, 0x8975, 0xD278, 0x8976, 0xD279, + 0x8977, 0xD27A, 0x8978, 0xD27B, 0x8979, 0xD27C, 0x897A, 0xD27D, + 0x897B, 0xF1E1, 0x897C, 0xD27E, 0x897D, 0xD280, 0x897E, 0xD281, + 0x897F, 0xCEF7, 0x8980, 0xD282, 0x8981, 0xD2AA, 0x8982, 0xD283, + 0x8983, 0xF1FB, 0x8984, 0xD284, 0x8985, 0xD285, 0x8986, 0xB8B2, + 0x8987, 0xD286, 0x8988, 0xD287, 0x8989, 0xD288, 0x898A, 0xD289, + 0x898B, 0xD28A, 0x898C, 0xD28B, 0x898D, 0xD28C, 0x898E, 0xD28D, + 0x898F, 0xD28E, 0x8990, 0xD28F, 0x8991, 0xD290, 0x8992, 0xD291, + 0x8993, 0xD292, 0x8994, 0xD293, 0x8995, 0xD294, 0x8996, 0xD295, + 0x8997, 0xD296, 0x8998, 0xD297, 0x8999, 0xD298, 0x899A, 0xD299, + 0x899B, 0xD29A, 0x899C, 0xD29B, 0x899D, 0xD29C, 0x899E, 0xD29D, + 0x899F, 0xD29E, 0x89A0, 0xD29F, 0x89A1, 0xD2A0, 0x89A2, 0xD340, + 0x89A3, 0xD341, 0x89A4, 0xD342, 0x89A5, 0xD343, 0x89A6, 0xD344, + 0x89A7, 0xD345, 0x89A8, 0xD346, 0x89A9, 0xD347, 0x89AA, 0xD348, + 0x89AB, 0xD349, 0x89AC, 0xD34A, 0x89AD, 0xD34B, 0x89AE, 0xD34C, + 0x89AF, 0xD34D, 0x89B0, 0xD34E, 0x89B1, 0xD34F, 0x89B2, 0xD350, + 0x89B3, 0xD351, 0x89B4, 0xD352, 0x89B5, 0xD353, 0x89B6, 0xD354, + 0x89B7, 0xD355, 0x89B8, 0xD356, 0x89B9, 0xD357, 0x89BA, 0xD358, + 0x89BB, 0xD359, 0x89BC, 0xD35A, 0x89BD, 0xD35B, 0x89BE, 0xD35C, + 0x89BF, 0xD35D, 0x89C0, 0xD35E, 0x89C1, 0xBCFB, 0x89C2, 0xB9DB, + 0x89C3, 0xD35F, 0x89C4, 0xB9E6, 0x89C5, 0xC3D9, 0x89C6, 0xCAD3, + 0x89C7, 0xEAE8, 0x89C8, 0xC0C0, 0x89C9, 0xBEF5, 0x89CA, 0xEAE9, + 0x89CB, 0xEAEA, 0x89CC, 0xEAEB, 0x89CD, 0xD360, 0x89CE, 0xEAEC, + 0x89CF, 0xEAED, 0x89D0, 0xEAEE, 0x89D1, 0xEAEF, 0x89D2, 0xBDC7, + 0x89D3, 0xD361, 0x89D4, 0xD362, 0x89D5, 0xD363, 0x89D6, 0xF5FB, + 0x89D7, 0xD364, 0x89D8, 0xD365, 0x89D9, 0xD366, 0x89DA, 0xF5FD, + 0x89DB, 0xD367, 0x89DC, 0xF5FE, 0x89DD, 0xD368, 0x89DE, 0xF5FC, + 0x89DF, 0xD369, 0x89E0, 0xD36A, 0x89E1, 0xD36B, 0x89E2, 0xD36C, + 0x89E3, 0xBDE2, 0x89E4, 0xD36D, 0x89E5, 0xF6A1, 0x89E6, 0xB4A5, + 0x89E7, 0xD36E, 0x89E8, 0xD36F, 0x89E9, 0xD370, 0x89EA, 0xD371, + 0x89EB, 0xF6A2, 0x89EC, 0xD372, 0x89ED, 0xD373, 0x89EE, 0xD374, + 0x89EF, 0xF6A3, 0x89F0, 0xD375, 0x89F1, 0xD376, 0x89F2, 0xD377, + 0x89F3, 0xECB2, 0x89F4, 0xD378, 0x89F5, 0xD379, 0x89F6, 0xD37A, + 0x89F7, 0xD37B, 0x89F8, 0xD37C, 0x89F9, 0xD37D, 0x89FA, 0xD37E, + 0x89FB, 0xD380, 0x89FC, 0xD381, 0x89FD, 0xD382, 0x89FE, 0xD383, + 0x89FF, 0xD384, 0x8A00, 0xD1D4, 0x8A01, 0xD385, 0x8A02, 0xD386, + 0x8A03, 0xD387, 0x8A04, 0xD388, 0x8A05, 0xD389, 0x8A06, 0xD38A, + 0x8A07, 0xD9EA, 0x8A08, 0xD38B, 0x8A09, 0xD38C, 0x8A0A, 0xD38D, + 0x8A0B, 0xD38E, 0x8A0C, 0xD38F, 0x8A0D, 0xD390, 0x8A0E, 0xD391, + 0x8A0F, 0xD392, 0x8A10, 0xD393, 0x8A11, 0xD394, 0x8A12, 0xD395, + 0x8A13, 0xD396, 0x8A14, 0xD397, 0x8A15, 0xD398, 0x8A16, 0xD399, + 0x8A17, 0xD39A, 0x8A18, 0xD39B, 0x8A19, 0xD39C, 0x8A1A, 0xD39D, + 0x8A1B, 0xD39E, 0x8A1C, 0xD39F, 0x8A1D, 0xD3A0, 0x8A1E, 0xD440, + 0x8A1F, 0xD441, 0x8A20, 0xD442, 0x8A21, 0xD443, 0x8A22, 0xD444, + 0x8A23, 0xD445, 0x8A24, 0xD446, 0x8A25, 0xD447, 0x8A26, 0xD448, + 0x8A27, 0xD449, 0x8A28, 0xD44A, 0x8A29, 0xD44B, 0x8A2A, 0xD44C, + 0x8A2B, 0xD44D, 0x8A2C, 0xD44E, 0x8A2D, 0xD44F, 0x8A2E, 0xD450, + 0x8A2F, 0xD451, 0x8A30, 0xD452, 0x8A31, 0xD453, 0x8A32, 0xD454, + 0x8A33, 0xD455, 0x8A34, 0xD456, 0x8A35, 0xD457, 0x8A36, 0xD458, + 0x8A37, 0xD459, 0x8A38, 0xD45A, 0x8A39, 0xD45B, 0x8A3A, 0xD45C, + 0x8A3B, 0xD45D, 0x8A3C, 0xD45E, 0x8A3D, 0xD45F, 0x8A3E, 0xF6A4, + 0x8A3F, 0xD460, 0x8A40, 0xD461, 0x8A41, 0xD462, 0x8A42, 0xD463, + 0x8A43, 0xD464, 0x8A44, 0xD465, 0x8A45, 0xD466, 0x8A46, 0xD467, + 0x8A47, 0xD468, 0x8A48, 0xEEBA, 0x8A49, 0xD469, 0x8A4A, 0xD46A, + 0x8A4B, 0xD46B, 0x8A4C, 0xD46C, 0x8A4D, 0xD46D, 0x8A4E, 0xD46E, + 0x8A4F, 0xD46F, 0x8A50, 0xD470, 0x8A51, 0xD471, 0x8A52, 0xD472, + 0x8A53, 0xD473, 0x8A54, 0xD474, 0x8A55, 0xD475, 0x8A56, 0xD476, + 0x8A57, 0xD477, 0x8A58, 0xD478, 0x8A59, 0xD479, 0x8A5A, 0xD47A, + 0x8A5B, 0xD47B, 0x8A5C, 0xD47C, 0x8A5D, 0xD47D, 0x8A5E, 0xD47E, + 0x8A5F, 0xD480, 0x8A60, 0xD481, 0x8A61, 0xD482, 0x8A62, 0xD483, + 0x8A63, 0xD484, 0x8A64, 0xD485, 0x8A65, 0xD486, 0x8A66, 0xD487, + 0x8A67, 0xD488, 0x8A68, 0xD489, 0x8A69, 0xD48A, 0x8A6A, 0xD48B, + 0x8A6B, 0xD48C, 0x8A6C, 0xD48D, 0x8A6D, 0xD48E, 0x8A6E, 0xD48F, + 0x8A6F, 0xD490, 0x8A70, 0xD491, 0x8A71, 0xD492, 0x8A72, 0xD493, + 0x8A73, 0xD494, 0x8A74, 0xD495, 0x8A75, 0xD496, 0x8A76, 0xD497, + 0x8A77, 0xD498, 0x8A78, 0xD499, 0x8A79, 0xD5B2, 0x8A7A, 0xD49A, + 0x8A7B, 0xD49B, 0x8A7C, 0xD49C, 0x8A7D, 0xD49D, 0x8A7E, 0xD49E, + 0x8A7F, 0xD49F, 0x8A80, 0xD4A0, 0x8A81, 0xD540, 0x8A82, 0xD541, + 0x8A83, 0xD542, 0x8A84, 0xD543, 0x8A85, 0xD544, 0x8A86, 0xD545, + 0x8A87, 0xD546, 0x8A88, 0xD547, 0x8A89, 0xD3FE, 0x8A8A, 0xCCDC, + 0x8A8B, 0xD548, 0x8A8C, 0xD549, 0x8A8D, 0xD54A, 0x8A8E, 0xD54B, + 0x8A8F, 0xD54C, 0x8A90, 0xD54D, 0x8A91, 0xD54E, 0x8A92, 0xD54F, + 0x8A93, 0xCAC4, 0x8A94, 0xD550, 0x8A95, 0xD551, 0x8A96, 0xD552, + 0x8A97, 0xD553, 0x8A98, 0xD554, 0x8A99, 0xD555, 0x8A9A, 0xD556, + 0x8A9B, 0xD557, 0x8A9C, 0xD558, 0x8A9D, 0xD559, 0x8A9E, 0xD55A, + 0x8A9F, 0xD55B, 0x8AA0, 0xD55C, 0x8AA1, 0xD55D, 0x8AA2, 0xD55E, + 0x8AA3, 0xD55F, 0x8AA4, 0xD560, 0x8AA5, 0xD561, 0x8AA6, 0xD562, + 0x8AA7, 0xD563, 0x8AA8, 0xD564, 0x8AA9, 0xD565, 0x8AAA, 0xD566, + 0x8AAB, 0xD567, 0x8AAC, 0xD568, 0x8AAD, 0xD569, 0x8AAE, 0xD56A, + 0x8AAF, 0xD56B, 0x8AB0, 0xD56C, 0x8AB1, 0xD56D, 0x8AB2, 0xD56E, + 0x8AB3, 0xD56F, 0x8AB4, 0xD570, 0x8AB5, 0xD571, 0x8AB6, 0xD572, + 0x8AB7, 0xD573, 0x8AB8, 0xD574, 0x8AB9, 0xD575, 0x8ABA, 0xD576, + 0x8ABB, 0xD577, 0x8ABC, 0xD578, 0x8ABD, 0xD579, 0x8ABE, 0xD57A, + 0x8ABF, 0xD57B, 0x8AC0, 0xD57C, 0x8AC1, 0xD57D, 0x8AC2, 0xD57E, + 0x8AC3, 0xD580, 0x8AC4, 0xD581, 0x8AC5, 0xD582, 0x8AC6, 0xD583, + 0x8AC7, 0xD584, 0x8AC8, 0xD585, 0x8AC9, 0xD586, 0x8ACA, 0xD587, + 0x8ACB, 0xD588, 0x8ACC, 0xD589, 0x8ACD, 0xD58A, 0x8ACE, 0xD58B, + 0x8ACF, 0xD58C, 0x8AD0, 0xD58D, 0x8AD1, 0xD58E, 0x8AD2, 0xD58F, + 0x8AD3, 0xD590, 0x8AD4, 0xD591, 0x8AD5, 0xD592, 0x8AD6, 0xD593, + 0x8AD7, 0xD594, 0x8AD8, 0xD595, 0x8AD9, 0xD596, 0x8ADA, 0xD597, + 0x8ADB, 0xD598, 0x8ADC, 0xD599, 0x8ADD, 0xD59A, 0x8ADE, 0xD59B, + 0x8ADF, 0xD59C, 0x8AE0, 0xD59D, 0x8AE1, 0xD59E, 0x8AE2, 0xD59F, + 0x8AE3, 0xD5A0, 0x8AE4, 0xD640, 0x8AE5, 0xD641, 0x8AE6, 0xD642, + 0x8AE7, 0xD643, 0x8AE8, 0xD644, 0x8AE9, 0xD645, 0x8AEA, 0xD646, + 0x8AEB, 0xD647, 0x8AEC, 0xD648, 0x8AED, 0xD649, 0x8AEE, 0xD64A, + 0x8AEF, 0xD64B, 0x8AF0, 0xD64C, 0x8AF1, 0xD64D, 0x8AF2, 0xD64E, + 0x8AF3, 0xD64F, 0x8AF4, 0xD650, 0x8AF5, 0xD651, 0x8AF6, 0xD652, + 0x8AF7, 0xD653, 0x8AF8, 0xD654, 0x8AF9, 0xD655, 0x8AFA, 0xD656, + 0x8AFB, 0xD657, 0x8AFC, 0xD658, 0x8AFD, 0xD659, 0x8AFE, 0xD65A, + 0x8AFF, 0xD65B, 0x8B00, 0xD65C, 0x8B01, 0xD65D, 0x8B02, 0xD65E, + 0x8B03, 0xD65F, 0x8B04, 0xD660, 0x8B05, 0xD661, 0x8B06, 0xD662, + 0x8B07, 0xE5C0, 0x8B08, 0xD663, 0x8B09, 0xD664, 0x8B0A, 0xD665, + 0x8B0B, 0xD666, 0x8B0C, 0xD667, 0x8B0D, 0xD668, 0x8B0E, 0xD669, + 0x8B0F, 0xD66A, 0x8B10, 0xD66B, 0x8B11, 0xD66C, 0x8B12, 0xD66D, + 0x8B13, 0xD66E, 0x8B14, 0xD66F, 0x8B15, 0xD670, 0x8B16, 0xD671, + 0x8B17, 0xD672, 0x8B18, 0xD673, 0x8B19, 0xD674, 0x8B1A, 0xD675, + 0x8B1B, 0xD676, 0x8B1C, 0xD677, 0x8B1D, 0xD678, 0x8B1E, 0xD679, + 0x8B1F, 0xD67A, 0x8B20, 0xD67B, 0x8B21, 0xD67C, 0x8B22, 0xD67D, + 0x8B23, 0xD67E, 0x8B24, 0xD680, 0x8B25, 0xD681, 0x8B26, 0xF6A5, + 0x8B27, 0xD682, 0x8B28, 0xD683, 0x8B29, 0xD684, 0x8B2A, 0xD685, + 0x8B2B, 0xD686, 0x8B2C, 0xD687, 0x8B2D, 0xD688, 0x8B2E, 0xD689, + 0x8B2F, 0xD68A, 0x8B30, 0xD68B, 0x8B31, 0xD68C, 0x8B32, 0xD68D, + 0x8B33, 0xD68E, 0x8B34, 0xD68F, 0x8B35, 0xD690, 0x8B36, 0xD691, + 0x8B37, 0xD692, 0x8B38, 0xD693, 0x8B39, 0xD694, 0x8B3A, 0xD695, + 0x8B3B, 0xD696, 0x8B3C, 0xD697, 0x8B3D, 0xD698, 0x8B3E, 0xD699, + 0x8B3F, 0xD69A, 0x8B40, 0xD69B, 0x8B41, 0xD69C, 0x8B42, 0xD69D, + 0x8B43, 0xD69E, 0x8B44, 0xD69F, 0x8B45, 0xD6A0, 0x8B46, 0xD740, + 0x8B47, 0xD741, 0x8B48, 0xD742, 0x8B49, 0xD743, 0x8B4A, 0xD744, + 0x8B4B, 0xD745, 0x8B4C, 0xD746, 0x8B4D, 0xD747, 0x8B4E, 0xD748, + 0x8B4F, 0xD749, 0x8B50, 0xD74A, 0x8B51, 0xD74B, 0x8B52, 0xD74C, + 0x8B53, 0xD74D, 0x8B54, 0xD74E, 0x8B55, 0xD74F, 0x8B56, 0xD750, + 0x8B57, 0xD751, 0x8B58, 0xD752, 0x8B59, 0xD753, 0x8B5A, 0xD754, + 0x8B5B, 0xD755, 0x8B5C, 0xD756, 0x8B5D, 0xD757, 0x8B5E, 0xD758, + 0x8B5F, 0xD759, 0x8B60, 0xD75A, 0x8B61, 0xD75B, 0x8B62, 0xD75C, + 0x8B63, 0xD75D, 0x8B64, 0xD75E, 0x8B65, 0xD75F, 0x8B66, 0xBEAF, + 0x8B67, 0xD760, 0x8B68, 0xD761, 0x8B69, 0xD762, 0x8B6A, 0xD763, + 0x8B6B, 0xD764, 0x8B6C, 0xC6A9, 0x8B6D, 0xD765, 0x8B6E, 0xD766, + 0x8B6F, 0xD767, 0x8B70, 0xD768, 0x8B71, 0xD769, 0x8B72, 0xD76A, + 0x8B73, 0xD76B, 0x8B74, 0xD76C, 0x8B75, 0xD76D, 0x8B76, 0xD76E, + 0x8B77, 0xD76F, 0x8B78, 0xD770, 0x8B79, 0xD771, 0x8B7A, 0xD772, + 0x8B7B, 0xD773, 0x8B7C, 0xD774, 0x8B7D, 0xD775, 0x8B7E, 0xD776, + 0x8B7F, 0xD777, 0x8B80, 0xD778, 0x8B81, 0xD779, 0x8B82, 0xD77A, + 0x8B83, 0xD77B, 0x8B84, 0xD77C, 0x8B85, 0xD77D, 0x8B86, 0xD77E, + 0x8B87, 0xD780, 0x8B88, 0xD781, 0x8B89, 0xD782, 0x8B8A, 0xD783, + 0x8B8B, 0xD784, 0x8B8C, 0xD785, 0x8B8D, 0xD786, 0x8B8E, 0xD787, + 0x8B8F, 0xD788, 0x8B90, 0xD789, 0x8B91, 0xD78A, 0x8B92, 0xD78B, + 0x8B93, 0xD78C, 0x8B94, 0xD78D, 0x8B95, 0xD78E, 0x8B96, 0xD78F, + 0x8B97, 0xD790, 0x8B98, 0xD791, 0x8B99, 0xD792, 0x8B9A, 0xD793, + 0x8B9B, 0xD794, 0x8B9C, 0xD795, 0x8B9D, 0xD796, 0x8B9E, 0xD797, + 0x8B9F, 0xD798, 0x8BA0, 0xDAA5, 0x8BA1, 0xBCC6, 0x8BA2, 0xB6A9, + 0x8BA3, 0xB8BC, 0x8BA4, 0xC8CF, 0x8BA5, 0xBCA5, 0x8BA6, 0xDAA6, + 0x8BA7, 0xDAA7, 0x8BA8, 0xCCD6, 0x8BA9, 0xC8C3, 0x8BAA, 0xDAA8, + 0x8BAB, 0xC6FD, 0x8BAC, 0xD799, 0x8BAD, 0xD1B5, 0x8BAE, 0xD2E9, + 0x8BAF, 0xD1B6, 0x8BB0, 0xBCC7, 0x8BB1, 0xD79A, 0x8BB2, 0xBDB2, + 0x8BB3, 0xBBE4, 0x8BB4, 0xDAA9, 0x8BB5, 0xDAAA, 0x8BB6, 0xD1C8, + 0x8BB7, 0xDAAB, 0x8BB8, 0xD0ED, 0x8BB9, 0xB6EF, 0x8BBA, 0xC2DB, + 0x8BBB, 0xD79B, 0x8BBC, 0xCBCF, 0x8BBD, 0xB7ED, 0x8BBE, 0xC9E8, + 0x8BBF, 0xB7C3, 0x8BC0, 0xBEF7, 0x8BC1, 0xD6A4, 0x8BC2, 0xDAAC, + 0x8BC3, 0xDAAD, 0x8BC4, 0xC6C0, 0x8BC5, 0xD7E7, 0x8BC6, 0xCAB6, + 0x8BC7, 0xD79C, 0x8BC8, 0xD5A9, 0x8BC9, 0xCBDF, 0x8BCA, 0xD5EF, + 0x8BCB, 0xDAAE, 0x8BCC, 0xD6DF, 0x8BCD, 0xB4CA, 0x8BCE, 0xDAB0, + 0x8BCF, 0xDAAF, 0x8BD0, 0xD79D, 0x8BD1, 0xD2EB, 0x8BD2, 0xDAB1, + 0x8BD3, 0xDAB2, 0x8BD4, 0xDAB3, 0x8BD5, 0xCAD4, 0x8BD6, 0xDAB4, + 0x8BD7, 0xCAAB, 0x8BD8, 0xDAB5, 0x8BD9, 0xDAB6, 0x8BDA, 0xB3CF, + 0x8BDB, 0xD6EF, 0x8BDC, 0xDAB7, 0x8BDD, 0xBBB0, 0x8BDE, 0xB5AE, + 0x8BDF, 0xDAB8, 0x8BE0, 0xDAB9, 0x8BE1, 0xB9EE, 0x8BE2, 0xD1AF, + 0x8BE3, 0xD2E8, 0x8BE4, 0xDABA, 0x8BE5, 0xB8C3, 0x8BE6, 0xCFEA, + 0x8BE7, 0xB2EF, 0x8BE8, 0xDABB, 0x8BE9, 0xDABC, 0x8BEA, 0xD79E, + 0x8BEB, 0xBDEB, 0x8BEC, 0xCEDC, 0x8BED, 0xD3EF, 0x8BEE, 0xDABD, + 0x8BEF, 0xCEF3, 0x8BF0, 0xDABE, 0x8BF1, 0xD3D5, 0x8BF2, 0xBBE5, + 0x8BF3, 0xDABF, 0x8BF4, 0xCBB5, 0x8BF5, 0xCBD0, 0x8BF6, 0xDAC0, + 0x8BF7, 0xC7EB, 0x8BF8, 0xD6EE, 0x8BF9, 0xDAC1, 0x8BFA, 0xC5B5, + 0x8BFB, 0xB6C1, 0x8BFC, 0xDAC2, 0x8BFD, 0xB7CC, 0x8BFE, 0xBFCE, + 0x8BFF, 0xDAC3, 0x8C00, 0xDAC4, 0x8C01, 0xCBAD, 0x8C02, 0xDAC5, + 0x8C03, 0xB5F7, 0x8C04, 0xDAC6, 0x8C05, 0xC1C2, 0x8C06, 0xD7BB, + 0x8C07, 0xDAC7, 0x8C08, 0xCCB8, 0x8C09, 0xD79F, 0x8C0A, 0xD2EA, + 0x8C0B, 0xC4B1, 0x8C0C, 0xDAC8, 0x8C0D, 0xB5FD, 0x8C0E, 0xBBD1, + 0x8C0F, 0xDAC9, 0x8C10, 0xD0B3, 0x8C11, 0xDACA, 0x8C12, 0xDACB, + 0x8C13, 0xCEBD, 0x8C14, 0xDACC, 0x8C15, 0xDACD, 0x8C16, 0xDACE, + 0x8C17, 0xB2F7, 0x8C18, 0xDAD1, 0x8C19, 0xDACF, 0x8C1A, 0xD1E8, + 0x8C1B, 0xDAD0, 0x8C1C, 0xC3D5, 0x8C1D, 0xDAD2, 0x8C1E, 0xD7A0, + 0x8C1F, 0xDAD3, 0x8C20, 0xDAD4, 0x8C21, 0xDAD5, 0x8C22, 0xD0BB, + 0x8C23, 0xD2A5, 0x8C24, 0xB0F9, 0x8C25, 0xDAD6, 0x8C26, 0xC7AB, + 0x8C27, 0xDAD7, 0x8C28, 0xBDF7, 0x8C29, 0xC3A1, 0x8C2A, 0xDAD8, + 0x8C2B, 0xDAD9, 0x8C2C, 0xC3FD, 0x8C2D, 0xCCB7, 0x8C2E, 0xDADA, + 0x8C2F, 0xDADB, 0x8C30, 0xC0BE, 0x8C31, 0xC6D7, 0x8C32, 0xDADC, + 0x8C33, 0xDADD, 0x8C34, 0xC7B4, 0x8C35, 0xDADE, 0x8C36, 0xDADF, + 0x8C37, 0xB9C8, 0x8C38, 0xD840, 0x8C39, 0xD841, 0x8C3A, 0xD842, + 0x8C3B, 0xD843, 0x8C3C, 0xD844, 0x8C3D, 0xD845, 0x8C3E, 0xD846, + 0x8C3F, 0xD847, 0x8C40, 0xD848, 0x8C41, 0xBBED, 0x8C42, 0xD849, + 0x8C43, 0xD84A, 0x8C44, 0xD84B, 0x8C45, 0xD84C, 0x8C46, 0xB6B9, + 0x8C47, 0xF4F8, 0x8C48, 0xD84D, 0x8C49, 0xF4F9, 0x8C4A, 0xD84E, + 0x8C4B, 0xD84F, 0x8C4C, 0xCDE3, 0x8C4D, 0xD850, 0x8C4E, 0xD851, + 0x8C4F, 0xD852, 0x8C50, 0xD853, 0x8C51, 0xD854, 0x8C52, 0xD855, + 0x8C53, 0xD856, 0x8C54, 0xD857, 0x8C55, 0xF5B9, 0x8C56, 0xD858, + 0x8C57, 0xD859, 0x8C58, 0xD85A, 0x8C59, 0xD85B, 0x8C5A, 0xEBE0, + 0x8C5B, 0xD85C, 0x8C5C, 0xD85D, 0x8C5D, 0xD85E, 0x8C5E, 0xD85F, + 0x8C5F, 0xD860, 0x8C60, 0xD861, 0x8C61, 0xCFF3, 0x8C62, 0xBBBF, + 0x8C63, 0xD862, 0x8C64, 0xD863, 0x8C65, 0xD864, 0x8C66, 0xD865, + 0x8C67, 0xD866, 0x8C68, 0xD867, 0x8C69, 0xD868, 0x8C6A, 0xBAC0, + 0x8C6B, 0xD4A5, 0x8C6C, 0xD869, 0x8C6D, 0xD86A, 0x8C6E, 0xD86B, + 0x8C6F, 0xD86C, 0x8C70, 0xD86D, 0x8C71, 0xD86E, 0x8C72, 0xD86F, + 0x8C73, 0xE1D9, 0x8C74, 0xD870, 0x8C75, 0xD871, 0x8C76, 0xD872, + 0x8C77, 0xD873, 0x8C78, 0xF5F4, 0x8C79, 0xB1AA, 0x8C7A, 0xB2F2, + 0x8C7B, 0xD874, 0x8C7C, 0xD875, 0x8C7D, 0xD876, 0x8C7E, 0xD877, + 0x8C7F, 0xD878, 0x8C80, 0xD879, 0x8C81, 0xD87A, 0x8C82, 0xF5F5, + 0x8C83, 0xD87B, 0x8C84, 0xD87C, 0x8C85, 0xF5F7, 0x8C86, 0xD87D, + 0x8C87, 0xD87E, 0x8C88, 0xD880, 0x8C89, 0xBAD1, 0x8C8A, 0xF5F6, + 0x8C8B, 0xD881, 0x8C8C, 0xC3B2, 0x8C8D, 0xD882, 0x8C8E, 0xD883, + 0x8C8F, 0xD884, 0x8C90, 0xD885, 0x8C91, 0xD886, 0x8C92, 0xD887, + 0x8C93, 0xD888, 0x8C94, 0xF5F9, 0x8C95, 0xD889, 0x8C96, 0xD88A, + 0x8C97, 0xD88B, 0x8C98, 0xF5F8, 0x8C99, 0xD88C, 0x8C9A, 0xD88D, + 0x8C9B, 0xD88E, 0x8C9C, 0xD88F, 0x8C9D, 0xD890, 0x8C9E, 0xD891, + 0x8C9F, 0xD892, 0x8CA0, 0xD893, 0x8CA1, 0xD894, 0x8CA2, 0xD895, + 0x8CA3, 0xD896, 0x8CA4, 0xD897, 0x8CA5, 0xD898, 0x8CA6, 0xD899, + 0x8CA7, 0xD89A, 0x8CA8, 0xD89B, 0x8CA9, 0xD89C, 0x8CAA, 0xD89D, + 0x8CAB, 0xD89E, 0x8CAC, 0xD89F, 0x8CAD, 0xD8A0, 0x8CAE, 0xD940, + 0x8CAF, 0xD941, 0x8CB0, 0xD942, 0x8CB1, 0xD943, 0x8CB2, 0xD944, + 0x8CB3, 0xD945, 0x8CB4, 0xD946, 0x8CB5, 0xD947, 0x8CB6, 0xD948, + 0x8CB7, 0xD949, 0x8CB8, 0xD94A, 0x8CB9, 0xD94B, 0x8CBA, 0xD94C, + 0x8CBB, 0xD94D, 0x8CBC, 0xD94E, 0x8CBD, 0xD94F, 0x8CBE, 0xD950, + 0x8CBF, 0xD951, 0x8CC0, 0xD952, 0x8CC1, 0xD953, 0x8CC2, 0xD954, + 0x8CC3, 0xD955, 0x8CC4, 0xD956, 0x8CC5, 0xD957, 0x8CC6, 0xD958, + 0x8CC7, 0xD959, 0x8CC8, 0xD95A, 0x8CC9, 0xD95B, 0x8CCA, 0xD95C, + 0x8CCB, 0xD95D, 0x8CCC, 0xD95E, 0x8CCD, 0xD95F, 0x8CCE, 0xD960, + 0x8CCF, 0xD961, 0x8CD0, 0xD962, 0x8CD1, 0xD963, 0x8CD2, 0xD964, + 0x8CD3, 0xD965, 0x8CD4, 0xD966, 0x8CD5, 0xD967, 0x8CD6, 0xD968, + 0x8CD7, 0xD969, 0x8CD8, 0xD96A, 0x8CD9, 0xD96B, 0x8CDA, 0xD96C, + 0x8CDB, 0xD96D, 0x8CDC, 0xD96E, 0x8CDD, 0xD96F, 0x8CDE, 0xD970, + 0x8CDF, 0xD971, 0x8CE0, 0xD972, 0x8CE1, 0xD973, 0x8CE2, 0xD974, + 0x8CE3, 0xD975, 0x8CE4, 0xD976, 0x8CE5, 0xD977, 0x8CE6, 0xD978, + 0x8CE7, 0xD979, 0x8CE8, 0xD97A, 0x8CE9, 0xD97B, 0x8CEA, 0xD97C, + 0x8CEB, 0xD97D, 0x8CEC, 0xD97E, 0x8CED, 0xD980, 0x8CEE, 0xD981, + 0x8CEF, 0xD982, 0x8CF0, 0xD983, 0x8CF1, 0xD984, 0x8CF2, 0xD985, + 0x8CF3, 0xD986, 0x8CF4, 0xD987, 0x8CF5, 0xD988, 0x8CF6, 0xD989, + 0x8CF7, 0xD98A, 0x8CF8, 0xD98B, 0x8CF9, 0xD98C, 0x8CFA, 0xD98D, + 0x8CFB, 0xD98E, 0x8CFC, 0xD98F, 0x8CFD, 0xD990, 0x8CFE, 0xD991, + 0x8CFF, 0xD992, 0x8D00, 0xD993, 0x8D01, 0xD994, 0x8D02, 0xD995, + 0x8D03, 0xD996, 0x8D04, 0xD997, 0x8D05, 0xD998, 0x8D06, 0xD999, + 0x8D07, 0xD99A, 0x8D08, 0xD99B, 0x8D09, 0xD99C, 0x8D0A, 0xD99D, + 0x8D0B, 0xD99E, 0x8D0C, 0xD99F, 0x8D0D, 0xD9A0, 0x8D0E, 0xDA40, + 0x8D0F, 0xDA41, 0x8D10, 0xDA42, 0x8D11, 0xDA43, 0x8D12, 0xDA44, + 0x8D13, 0xDA45, 0x8D14, 0xDA46, 0x8D15, 0xDA47, 0x8D16, 0xDA48, + 0x8D17, 0xDA49, 0x8D18, 0xDA4A, 0x8D19, 0xDA4B, 0x8D1A, 0xDA4C, + 0x8D1B, 0xDA4D, 0x8D1C, 0xDA4E, 0x8D1D, 0xB1B4, 0x8D1E, 0xD5EA, + 0x8D1F, 0xB8BA, 0x8D20, 0xDA4F, 0x8D21, 0xB9B1, 0x8D22, 0xB2C6, + 0x8D23, 0xD4F0, 0x8D24, 0xCFCD, 0x8D25, 0xB0DC, 0x8D26, 0xD5CB, + 0x8D27, 0xBBF5, 0x8D28, 0xD6CA, 0x8D29, 0xB7B7, 0x8D2A, 0xCCB0, + 0x8D2B, 0xC6B6, 0x8D2C, 0xB1E1, 0x8D2D, 0xB9BA, 0x8D2E, 0xD6FC, + 0x8D2F, 0xB9E1, 0x8D30, 0xB7A1, 0x8D31, 0xBCFA, 0x8D32, 0xEADA, + 0x8D33, 0xEADB, 0x8D34, 0xCCF9, 0x8D35, 0xB9F3, 0x8D36, 0xEADC, + 0x8D37, 0xB4FB, 0x8D38, 0xC3B3, 0x8D39, 0xB7D1, 0x8D3A, 0xBAD8, + 0x8D3B, 0xEADD, 0x8D3C, 0xD4F4, 0x8D3D, 0xEADE, 0x8D3E, 0xBCD6, + 0x8D3F, 0xBBDF, 0x8D40, 0xEADF, 0x8D41, 0xC1DE, 0x8D42, 0xC2B8, + 0x8D43, 0xD4DF, 0x8D44, 0xD7CA, 0x8D45, 0xEAE0, 0x8D46, 0xEAE1, + 0x8D47, 0xEAE4, 0x8D48, 0xEAE2, 0x8D49, 0xEAE3, 0x8D4A, 0xC9DE, + 0x8D4B, 0xB8B3, 0x8D4C, 0xB6C4, 0x8D4D, 0xEAE5, 0x8D4E, 0xCAEA, + 0x8D4F, 0xC9CD, 0x8D50, 0xB4CD, 0x8D51, 0xDA50, 0x8D52, 0xDA51, + 0x8D53, 0xE2D9, 0x8D54, 0xC5E2, 0x8D55, 0xEAE6, 0x8D56, 0xC0B5, + 0x8D57, 0xDA52, 0x8D58, 0xD7B8, 0x8D59, 0xEAE7, 0x8D5A, 0xD7AC, + 0x8D5B, 0xC8FC, 0x8D5C, 0xD8D3, 0x8D5D, 0xD8CD, 0x8D5E, 0xD4DE, + 0x8D5F, 0xDA53, 0x8D60, 0xD4F9, 0x8D61, 0xC9C4, 0x8D62, 0xD3AE, + 0x8D63, 0xB8D3, 0x8D64, 0xB3E0, 0x8D65, 0xDA54, 0x8D66, 0xC9E2, + 0x8D67, 0xF4F6, 0x8D68, 0xDA55, 0x8D69, 0xDA56, 0x8D6A, 0xDA57, + 0x8D6B, 0xBAD5, 0x8D6C, 0xDA58, 0x8D6D, 0xF4F7, 0x8D6E, 0xDA59, + 0x8D6F, 0xDA5A, 0x8D70, 0xD7DF, 0x8D71, 0xDA5B, 0x8D72, 0xDA5C, + 0x8D73, 0xF4F1, 0x8D74, 0xB8B0, 0x8D75, 0xD5D4, 0x8D76, 0xB8CF, + 0x8D77, 0xC6F0, 0x8D78, 0xDA5D, 0x8D79, 0xDA5E, 0x8D7A, 0xDA5F, + 0x8D7B, 0xDA60, 0x8D7C, 0xDA61, 0x8D7D, 0xDA62, 0x8D7E, 0xDA63, + 0x8D7F, 0xDA64, 0x8D80, 0xDA65, 0x8D81, 0xB3C3, 0x8D82, 0xDA66, + 0x8D83, 0xDA67, 0x8D84, 0xF4F2, 0x8D85, 0xB3AC, 0x8D86, 0xDA68, + 0x8D87, 0xDA69, 0x8D88, 0xDA6A, 0x8D89, 0xDA6B, 0x8D8A, 0xD4BD, + 0x8D8B, 0xC7F7, 0x8D8C, 0xDA6C, 0x8D8D, 0xDA6D, 0x8D8E, 0xDA6E, + 0x8D8F, 0xDA6F, 0x8D90, 0xDA70, 0x8D91, 0xF4F4, 0x8D92, 0xDA71, + 0x8D93, 0xDA72, 0x8D94, 0xF4F3, 0x8D95, 0xDA73, 0x8D96, 0xDA74, + 0x8D97, 0xDA75, 0x8D98, 0xDA76, 0x8D99, 0xDA77, 0x8D9A, 0xDA78, + 0x8D9B, 0xDA79, 0x8D9C, 0xDA7A, 0x8D9D, 0xDA7B, 0x8D9E, 0xDA7C, + 0x8D9F, 0xCCCB, 0x8DA0, 0xDA7D, 0x8DA1, 0xDA7E, 0x8DA2, 0xDA80, + 0x8DA3, 0xC8A4, 0x8DA4, 0xDA81, 0x8DA5, 0xDA82, 0x8DA6, 0xDA83, + 0x8DA7, 0xDA84, 0x8DA8, 0xDA85, 0x8DA9, 0xDA86, 0x8DAA, 0xDA87, + 0x8DAB, 0xDA88, 0x8DAC, 0xDA89, 0x8DAD, 0xDA8A, 0x8DAE, 0xDA8B, + 0x8DAF, 0xDA8C, 0x8DB0, 0xDA8D, 0x8DB1, 0xF4F5, 0x8DB2, 0xDA8E, + 0x8DB3, 0xD7E3, 0x8DB4, 0xC5BF, 0x8DB5, 0xF5C0, 0x8DB6, 0xDA8F, + 0x8DB7, 0xDA90, 0x8DB8, 0xF5BB, 0x8DB9, 0xDA91, 0x8DBA, 0xF5C3, + 0x8DBB, 0xDA92, 0x8DBC, 0xF5C2, 0x8DBD, 0xDA93, 0x8DBE, 0xD6BA, + 0x8DBF, 0xF5C1, 0x8DC0, 0xDA94, 0x8DC1, 0xDA95, 0x8DC2, 0xDA96, + 0x8DC3, 0xD4BE, 0x8DC4, 0xF5C4, 0x8DC5, 0xDA97, 0x8DC6, 0xF5CC, + 0x8DC7, 0xDA98, 0x8DC8, 0xDA99, 0x8DC9, 0xDA9A, 0x8DCA, 0xDA9B, + 0x8DCB, 0xB0CF, 0x8DCC, 0xB5F8, 0x8DCD, 0xDA9C, 0x8DCE, 0xF5C9, + 0x8DCF, 0xF5CA, 0x8DD0, 0xDA9D, 0x8DD1, 0xC5DC, 0x8DD2, 0xDA9E, + 0x8DD3, 0xDA9F, 0x8DD4, 0xDAA0, 0x8DD5, 0xDB40, 0x8DD6, 0xF5C5, + 0x8DD7, 0xF5C6, 0x8DD8, 0xDB41, 0x8DD9, 0xDB42, 0x8DDA, 0xF5C7, + 0x8DDB, 0xF5CB, 0x8DDC, 0xDB43, 0x8DDD, 0xBEE0, 0x8DDE, 0xF5C8, + 0x8DDF, 0xB8FA, 0x8DE0, 0xDB44, 0x8DE1, 0xDB45, 0x8DE2, 0xDB46, + 0x8DE3, 0xF5D0, 0x8DE4, 0xF5D3, 0x8DE5, 0xDB47, 0x8DE6, 0xDB48, + 0x8DE7, 0xDB49, 0x8DE8, 0xBFE7, 0x8DE9, 0xDB4A, 0x8DEA, 0xB9F2, + 0x8DEB, 0xF5BC, 0x8DEC, 0xF5CD, 0x8DED, 0xDB4B, 0x8DEE, 0xDB4C, + 0x8DEF, 0xC2B7, 0x8DF0, 0xDB4D, 0x8DF1, 0xDB4E, 0x8DF2, 0xDB4F, + 0x8DF3, 0xCCF8, 0x8DF4, 0xDB50, 0x8DF5, 0xBCF9, 0x8DF6, 0xDB51, + 0x8DF7, 0xF5CE, 0x8DF8, 0xF5CF, 0x8DF9, 0xF5D1, 0x8DFA, 0xB6E5, + 0x8DFB, 0xF5D2, 0x8DFC, 0xDB52, 0x8DFD, 0xF5D5, 0x8DFE, 0xDB53, + 0x8DFF, 0xDB54, 0x8E00, 0xDB55, 0x8E01, 0xDB56, 0x8E02, 0xDB57, + 0x8E03, 0xDB58, 0x8E04, 0xDB59, 0x8E05, 0xF5BD, 0x8E06, 0xDB5A, + 0x8E07, 0xDB5B, 0x8E08, 0xDB5C, 0x8E09, 0xF5D4, 0x8E0A, 0xD3BB, + 0x8E0B, 0xDB5D, 0x8E0C, 0xB3EC, 0x8E0D, 0xDB5E, 0x8E0E, 0xDB5F, + 0x8E0F, 0xCCA4, 0x8E10, 0xDB60, 0x8E11, 0xDB61, 0x8E12, 0xDB62, + 0x8E13, 0xDB63, 0x8E14, 0xF5D6, 0x8E15, 0xDB64, 0x8E16, 0xDB65, + 0x8E17, 0xDB66, 0x8E18, 0xDB67, 0x8E19, 0xDB68, 0x8E1A, 0xDB69, + 0x8E1B, 0xDB6A, 0x8E1C, 0xDB6B, 0x8E1D, 0xF5D7, 0x8E1E, 0xBEE1, + 0x8E1F, 0xF5D8, 0x8E20, 0xDB6C, 0x8E21, 0xDB6D, 0x8E22, 0xCCDF, + 0x8E23, 0xF5DB, 0x8E24, 0xDB6E, 0x8E25, 0xDB6F, 0x8E26, 0xDB70, + 0x8E27, 0xDB71, 0x8E28, 0xDB72, 0x8E29, 0xB2C8, 0x8E2A, 0xD7D9, + 0x8E2B, 0xDB73, 0x8E2C, 0xF5D9, 0x8E2D, 0xDB74, 0x8E2E, 0xF5DA, + 0x8E2F, 0xF5DC, 0x8E30, 0xDB75, 0x8E31, 0xF5E2, 0x8E32, 0xDB76, + 0x8E33, 0xDB77, 0x8E34, 0xDB78, 0x8E35, 0xF5E0, 0x8E36, 0xDB79, + 0x8E37, 0xDB7A, 0x8E38, 0xDB7B, 0x8E39, 0xF5DF, 0x8E3A, 0xF5DD, + 0x8E3B, 0xDB7C, 0x8E3C, 0xDB7D, 0x8E3D, 0xF5E1, 0x8E3E, 0xDB7E, + 0x8E3F, 0xDB80, 0x8E40, 0xF5DE, 0x8E41, 0xF5E4, 0x8E42, 0xF5E5, + 0x8E43, 0xDB81, 0x8E44, 0xCCE3, 0x8E45, 0xDB82, 0x8E46, 0xDB83, + 0x8E47, 0xE5BF, 0x8E48, 0xB5B8, 0x8E49, 0xF5E3, 0x8E4A, 0xF5E8, + 0x8E4B, 0xCCA3, 0x8E4C, 0xDB84, 0x8E4D, 0xDB85, 0x8E4E, 0xDB86, + 0x8E4F, 0xDB87, 0x8E50, 0xDB88, 0x8E51, 0xF5E6, 0x8E52, 0xF5E7, + 0x8E53, 0xDB89, 0x8E54, 0xDB8A, 0x8E55, 0xDB8B, 0x8E56, 0xDB8C, + 0x8E57, 0xDB8D, 0x8E58, 0xDB8E, 0x8E59, 0xF5BE, 0x8E5A, 0xDB8F, + 0x8E5B, 0xDB90, 0x8E5C, 0xDB91, 0x8E5D, 0xDB92, 0x8E5E, 0xDB93, + 0x8E5F, 0xDB94, 0x8E60, 0xDB95, 0x8E61, 0xDB96, 0x8E62, 0xDB97, + 0x8E63, 0xDB98, 0x8E64, 0xDB99, 0x8E65, 0xDB9A, 0x8E66, 0xB1C4, + 0x8E67, 0xDB9B, 0x8E68, 0xDB9C, 0x8E69, 0xF5BF, 0x8E6A, 0xDB9D, + 0x8E6B, 0xDB9E, 0x8E6C, 0xB5C5, 0x8E6D, 0xB2E4, 0x8E6E, 0xDB9F, + 0x8E6F, 0xF5EC, 0x8E70, 0xF5E9, 0x8E71, 0xDBA0, 0x8E72, 0xB6D7, + 0x8E73, 0xDC40, 0x8E74, 0xF5ED, 0x8E75, 0xDC41, 0x8E76, 0xF5EA, + 0x8E77, 0xDC42, 0x8E78, 0xDC43, 0x8E79, 0xDC44, 0x8E7A, 0xDC45, + 0x8E7B, 0xDC46, 0x8E7C, 0xF5EB, 0x8E7D, 0xDC47, 0x8E7E, 0xDC48, + 0x8E7F, 0xB4DA, 0x8E80, 0xDC49, 0x8E81, 0xD4EA, 0x8E82, 0xDC4A, + 0x8E83, 0xDC4B, 0x8E84, 0xDC4C, 0x8E85, 0xF5EE, 0x8E86, 0xDC4D, + 0x8E87, 0xB3F9, 0x8E88, 0xDC4E, 0x8E89, 0xDC4F, 0x8E8A, 0xDC50, + 0x8E8B, 0xDC51, 0x8E8C, 0xDC52, 0x8E8D, 0xDC53, 0x8E8E, 0xDC54, + 0x8E8F, 0xF5EF, 0x8E90, 0xF5F1, 0x8E91, 0xDC55, 0x8E92, 0xDC56, + 0x8E93, 0xDC57, 0x8E94, 0xF5F0, 0x8E95, 0xDC58, 0x8E96, 0xDC59, + 0x8E97, 0xDC5A, 0x8E98, 0xDC5B, 0x8E99, 0xDC5C, 0x8E9A, 0xDC5D, + 0x8E9B, 0xDC5E, 0x8E9C, 0xF5F2, 0x8E9D, 0xDC5F, 0x8E9E, 0xF5F3, + 0x8E9F, 0xDC60, 0x8EA0, 0xDC61, 0x8EA1, 0xDC62, 0x8EA2, 0xDC63, + 0x8EA3, 0xDC64, 0x8EA4, 0xDC65, 0x8EA5, 0xDC66, 0x8EA6, 0xDC67, + 0x8EA7, 0xDC68, 0x8EA8, 0xDC69, 0x8EA9, 0xDC6A, 0x8EAA, 0xDC6B, + 0x8EAB, 0xC9ED, 0x8EAC, 0xB9AA, 0x8EAD, 0xDC6C, 0x8EAE, 0xDC6D, + 0x8EAF, 0xC7FB, 0x8EB0, 0xDC6E, 0x8EB1, 0xDC6F, 0x8EB2, 0xB6E3, + 0x8EB3, 0xDC70, 0x8EB4, 0xDC71, 0x8EB5, 0xDC72, 0x8EB6, 0xDC73, + 0x8EB7, 0xDC74, 0x8EB8, 0xDC75, 0x8EB9, 0xDC76, 0x8EBA, 0xCCC9, + 0x8EBB, 0xDC77, 0x8EBC, 0xDC78, 0x8EBD, 0xDC79, 0x8EBE, 0xDC7A, + 0x8EBF, 0xDC7B, 0x8EC0, 0xDC7C, 0x8EC1, 0xDC7D, 0x8EC2, 0xDC7E, + 0x8EC3, 0xDC80, 0x8EC4, 0xDC81, 0x8EC5, 0xDC82, 0x8EC6, 0xDC83, + 0x8EC7, 0xDC84, 0x8EC8, 0xDC85, 0x8EC9, 0xDC86, 0x8ECA, 0xDC87, + 0x8ECB, 0xDC88, 0x8ECC, 0xDC89, 0x8ECD, 0xDC8A, 0x8ECE, 0xEAA6, + 0x8ECF, 0xDC8B, 0x8ED0, 0xDC8C, 0x8ED1, 0xDC8D, 0x8ED2, 0xDC8E, + 0x8ED3, 0xDC8F, 0x8ED4, 0xDC90, 0x8ED5, 0xDC91, 0x8ED6, 0xDC92, + 0x8ED7, 0xDC93, 0x8ED8, 0xDC94, 0x8ED9, 0xDC95, 0x8EDA, 0xDC96, + 0x8EDB, 0xDC97, 0x8EDC, 0xDC98, 0x8EDD, 0xDC99, 0x8EDE, 0xDC9A, + 0x8EDF, 0xDC9B, 0x8EE0, 0xDC9C, 0x8EE1, 0xDC9D, 0x8EE2, 0xDC9E, + 0x8EE3, 0xDC9F, 0x8EE4, 0xDCA0, 0x8EE5, 0xDD40, 0x8EE6, 0xDD41, + 0x8EE7, 0xDD42, 0x8EE8, 0xDD43, 0x8EE9, 0xDD44, 0x8EEA, 0xDD45, + 0x8EEB, 0xDD46, 0x8EEC, 0xDD47, 0x8EED, 0xDD48, 0x8EEE, 0xDD49, + 0x8EEF, 0xDD4A, 0x8EF0, 0xDD4B, 0x8EF1, 0xDD4C, 0x8EF2, 0xDD4D, + 0x8EF3, 0xDD4E, 0x8EF4, 0xDD4F, 0x8EF5, 0xDD50, 0x8EF6, 0xDD51, + 0x8EF7, 0xDD52, 0x8EF8, 0xDD53, 0x8EF9, 0xDD54, 0x8EFA, 0xDD55, + 0x8EFB, 0xDD56, 0x8EFC, 0xDD57, 0x8EFD, 0xDD58, 0x8EFE, 0xDD59, + 0x8EFF, 0xDD5A, 0x8F00, 0xDD5B, 0x8F01, 0xDD5C, 0x8F02, 0xDD5D, + 0x8F03, 0xDD5E, 0x8F04, 0xDD5F, 0x8F05, 0xDD60, 0x8F06, 0xDD61, + 0x8F07, 0xDD62, 0x8F08, 0xDD63, 0x8F09, 0xDD64, 0x8F0A, 0xDD65, + 0x8F0B, 0xDD66, 0x8F0C, 0xDD67, 0x8F0D, 0xDD68, 0x8F0E, 0xDD69, + 0x8F0F, 0xDD6A, 0x8F10, 0xDD6B, 0x8F11, 0xDD6C, 0x8F12, 0xDD6D, + 0x8F13, 0xDD6E, 0x8F14, 0xDD6F, 0x8F15, 0xDD70, 0x8F16, 0xDD71, + 0x8F17, 0xDD72, 0x8F18, 0xDD73, 0x8F19, 0xDD74, 0x8F1A, 0xDD75, + 0x8F1B, 0xDD76, 0x8F1C, 0xDD77, 0x8F1D, 0xDD78, 0x8F1E, 0xDD79, + 0x8F1F, 0xDD7A, 0x8F20, 0xDD7B, 0x8F21, 0xDD7C, 0x8F22, 0xDD7D, + 0x8F23, 0xDD7E, 0x8F24, 0xDD80, 0x8F25, 0xDD81, 0x8F26, 0xDD82, + 0x8F27, 0xDD83, 0x8F28, 0xDD84, 0x8F29, 0xDD85, 0x8F2A, 0xDD86, + 0x8F2B, 0xDD87, 0x8F2C, 0xDD88, 0x8F2D, 0xDD89, 0x8F2E, 0xDD8A, + 0x8F2F, 0xDD8B, 0x8F30, 0xDD8C, 0x8F31, 0xDD8D, 0x8F32, 0xDD8E, + 0x8F33, 0xDD8F, 0x8F34, 0xDD90, 0x8F35, 0xDD91, 0x8F36, 0xDD92, + 0x8F37, 0xDD93, 0x8F38, 0xDD94, 0x8F39, 0xDD95, 0x8F3A, 0xDD96, + 0x8F3B, 0xDD97, 0x8F3C, 0xDD98, 0x8F3D, 0xDD99, 0x8F3E, 0xDD9A, + 0x8F3F, 0xDD9B, 0x8F40, 0xDD9C, 0x8F41, 0xDD9D, 0x8F42, 0xDD9E, + 0x8F43, 0xDD9F, 0x8F44, 0xDDA0, 0x8F45, 0xDE40, 0x8F46, 0xDE41, + 0x8F47, 0xDE42, 0x8F48, 0xDE43, 0x8F49, 0xDE44, 0x8F4A, 0xDE45, + 0x8F4B, 0xDE46, 0x8F4C, 0xDE47, 0x8F4D, 0xDE48, 0x8F4E, 0xDE49, + 0x8F4F, 0xDE4A, 0x8F50, 0xDE4B, 0x8F51, 0xDE4C, 0x8F52, 0xDE4D, + 0x8F53, 0xDE4E, 0x8F54, 0xDE4F, 0x8F55, 0xDE50, 0x8F56, 0xDE51, + 0x8F57, 0xDE52, 0x8F58, 0xDE53, 0x8F59, 0xDE54, 0x8F5A, 0xDE55, + 0x8F5B, 0xDE56, 0x8F5C, 0xDE57, 0x8F5D, 0xDE58, 0x8F5E, 0xDE59, + 0x8F5F, 0xDE5A, 0x8F60, 0xDE5B, 0x8F61, 0xDE5C, 0x8F62, 0xDE5D, + 0x8F63, 0xDE5E, 0x8F64, 0xDE5F, 0x8F65, 0xDE60, 0x8F66, 0xB3B5, + 0x8F67, 0xD4FE, 0x8F68, 0xB9EC, 0x8F69, 0xD0F9, 0x8F6A, 0xDE61, + 0x8F6B, 0xE9ED, 0x8F6C, 0xD7AA, 0x8F6D, 0xE9EE, 0x8F6E, 0xC2D6, + 0x8F6F, 0xC8ED, 0x8F70, 0xBAE4, 0x8F71, 0xE9EF, 0x8F72, 0xE9F0, + 0x8F73, 0xE9F1, 0x8F74, 0xD6E1, 0x8F75, 0xE9F2, 0x8F76, 0xE9F3, + 0x8F77, 0xE9F5, 0x8F78, 0xE9F4, 0x8F79, 0xE9F6, 0x8F7A, 0xE9F7, + 0x8F7B, 0xC7E1, 0x8F7C, 0xE9F8, 0x8F7D, 0xD4D8, 0x8F7E, 0xE9F9, + 0x8F7F, 0xBDCE, 0x8F80, 0xDE62, 0x8F81, 0xE9FA, 0x8F82, 0xE9FB, + 0x8F83, 0xBDCF, 0x8F84, 0xE9FC, 0x8F85, 0xB8A8, 0x8F86, 0xC1BE, + 0x8F87, 0xE9FD, 0x8F88, 0xB1B2, 0x8F89, 0xBBD4, 0x8F8A, 0xB9F5, + 0x8F8B, 0xE9FE, 0x8F8C, 0xDE63, 0x8F8D, 0xEAA1, 0x8F8E, 0xEAA2, + 0x8F8F, 0xEAA3, 0x8F90, 0xB7F8, 0x8F91, 0xBCAD, 0x8F92, 0xDE64, + 0x8F93, 0xCAE4, 0x8F94, 0xE0CE, 0x8F95, 0xD4AF, 0x8F96, 0xCFBD, + 0x8F97, 0xD5B7, 0x8F98, 0xEAA4, 0x8F99, 0xD5DE, 0x8F9A, 0xEAA5, + 0x8F9B, 0xD0C1, 0x8F9C, 0xB9BC, 0x8F9D, 0xDE65, 0x8F9E, 0xB4C7, + 0x8F9F, 0xB1D9, 0x8FA0, 0xDE66, 0x8FA1, 0xDE67, 0x8FA2, 0xDE68, + 0x8FA3, 0xC0B1, 0x8FA4, 0xDE69, 0x8FA5, 0xDE6A, 0x8FA6, 0xDE6B, + 0x8FA7, 0xDE6C, 0x8FA8, 0xB1E6, 0x8FA9, 0xB1E7, 0x8FAA, 0xDE6D, + 0x8FAB, 0xB1E8, 0x8FAC, 0xDE6E, 0x8FAD, 0xDE6F, 0x8FAE, 0xDE70, + 0x8FAF, 0xDE71, 0x8FB0, 0xB3BD, 0x8FB1, 0xC8E8, 0x8FB2, 0xDE72, + 0x8FB3, 0xDE73, 0x8FB4, 0xDE74, 0x8FB5, 0xDE75, 0x8FB6, 0xE5C1, + 0x8FB7, 0xDE76, 0x8FB8, 0xDE77, 0x8FB9, 0xB1DF, 0x8FBA, 0xDE78, + 0x8FBB, 0xDE79, 0x8FBC, 0xDE7A, 0x8FBD, 0xC1C9, 0x8FBE, 0xB4EF, + 0x8FBF, 0xDE7B, 0x8FC0, 0xDE7C, 0x8FC1, 0xC7A8, 0x8FC2, 0xD3D8, + 0x8FC3, 0xDE7D, 0x8FC4, 0xC6F9, 0x8FC5, 0xD1B8, 0x8FC6, 0xDE7E, + 0x8FC7, 0xB9FD, 0x8FC8, 0xC2F5, 0x8FC9, 0xDE80, 0x8FCA, 0xDE81, + 0x8FCB, 0xDE82, 0x8FCC, 0xDE83, 0x8FCD, 0xDE84, 0x8FCE, 0xD3AD, + 0x8FCF, 0xDE85, 0x8FD0, 0xD4CB, 0x8FD1, 0xBDFC, 0x8FD2, 0xDE86, + 0x8FD3, 0xE5C2, 0x8FD4, 0xB7B5, 0x8FD5, 0xE5C3, 0x8FD6, 0xDE87, + 0x8FD7, 0xDE88, 0x8FD8, 0xBBB9, 0x8FD9, 0xD5E2, 0x8FDA, 0xDE89, + 0x8FDB, 0xBDF8, 0x8FDC, 0xD4B6, 0x8FDD, 0xCEA5, 0x8FDE, 0xC1AC, + 0x8FDF, 0xB3D9, 0x8FE0, 0xDE8A, 0x8FE1, 0xDE8B, 0x8FE2, 0xCCF6, + 0x8FE3, 0xDE8C, 0x8FE4, 0xE5C6, 0x8FE5, 0xE5C4, 0x8FE6, 0xE5C8, + 0x8FE7, 0xDE8D, 0x8FE8, 0xE5CA, 0x8FE9, 0xE5C7, 0x8FEA, 0xB5CF, + 0x8FEB, 0xC6C8, 0x8FEC, 0xDE8E, 0x8FED, 0xB5FC, 0x8FEE, 0xE5C5, + 0x8FEF, 0xDE8F, 0x8FF0, 0xCAF6, 0x8FF1, 0xDE90, 0x8FF2, 0xDE91, + 0x8FF3, 0xE5C9, 0x8FF4, 0xDE92, 0x8FF5, 0xDE93, 0x8FF6, 0xDE94, + 0x8FF7, 0xC3D4, 0x8FF8, 0xB1C5, 0x8FF9, 0xBCA3, 0x8FFA, 0xDE95, + 0x8FFB, 0xDE96, 0x8FFC, 0xDE97, 0x8FFD, 0xD7B7, 0x8FFE, 0xDE98, + 0x8FFF, 0xDE99, 0x9000, 0xCDCB, 0x9001, 0xCBCD, 0x9002, 0xCACA, + 0x9003, 0xCCD3, 0x9004, 0xE5CC, 0x9005, 0xE5CB, 0x9006, 0xC4E6, + 0x9007, 0xDE9A, 0x9008, 0xDE9B, 0x9009, 0xD1A1, 0x900A, 0xD1B7, + 0x900B, 0xE5CD, 0x900C, 0xDE9C, 0x900D, 0xE5D0, 0x900E, 0xDE9D, + 0x900F, 0xCDB8, 0x9010, 0xD6F0, 0x9011, 0xE5CF, 0x9012, 0xB5DD, + 0x9013, 0xDE9E, 0x9014, 0xCDBE, 0x9015, 0xDE9F, 0x9016, 0xE5D1, + 0x9017, 0xB6BA, 0x9018, 0xDEA0, 0x9019, 0xDF40, 0x901A, 0xCDA8, + 0x901B, 0xB9E4, 0x901C, 0xDF41, 0x901D, 0xCAC5, 0x901E, 0xB3D1, + 0x901F, 0xCBD9, 0x9020, 0xD4EC, 0x9021, 0xE5D2, 0x9022, 0xB7EA, + 0x9023, 0xDF42, 0x9024, 0xDF43, 0x9025, 0xDF44, 0x9026, 0xE5CE, + 0x9027, 0xDF45, 0x9028, 0xDF46, 0x9029, 0xDF47, 0x902A, 0xDF48, + 0x902B, 0xDF49, 0x902C, 0xDF4A, 0x902D, 0xE5D5, 0x902E, 0xB4FE, + 0x902F, 0xE5D6, 0x9030, 0xDF4B, 0x9031, 0xDF4C, 0x9032, 0xDF4D, + 0x9033, 0xDF4E, 0x9034, 0xDF4F, 0x9035, 0xE5D3, 0x9036, 0xE5D4, + 0x9037, 0xDF50, 0x9038, 0xD2DD, 0x9039, 0xDF51, 0x903A, 0xDF52, + 0x903B, 0xC2DF, 0x903C, 0xB1C6, 0x903D, 0xDF53, 0x903E, 0xD3E2, + 0x903F, 0xDF54, 0x9040, 0xDF55, 0x9041, 0xB6DD, 0x9042, 0xCBEC, + 0x9043, 0xDF56, 0x9044, 0xE5D7, 0x9045, 0xDF57, 0x9046, 0xDF58, + 0x9047, 0xD3F6, 0x9048, 0xDF59, 0x9049, 0xDF5A, 0x904A, 0xDF5B, + 0x904B, 0xDF5C, 0x904C, 0xDF5D, 0x904D, 0xB1E9, 0x904E, 0xDF5E, + 0x904F, 0xB6F4, 0x9050, 0xE5DA, 0x9051, 0xE5D8, 0x9052, 0xE5D9, + 0x9053, 0xB5C0, 0x9054, 0xDF5F, 0x9055, 0xDF60, 0x9056, 0xDF61, + 0x9057, 0xD2C5, 0x9058, 0xE5DC, 0x9059, 0xDF62, 0x905A, 0xDF63, + 0x905B, 0xE5DE, 0x905C, 0xDF64, 0x905D, 0xDF65, 0x905E, 0xDF66, + 0x905F, 0xDF67, 0x9060, 0xDF68, 0x9061, 0xDF69, 0x9062, 0xE5DD, + 0x9063, 0xC7B2, 0x9064, 0xDF6A, 0x9065, 0xD2A3, 0x9066, 0xDF6B, + 0x9067, 0xDF6C, 0x9068, 0xE5DB, 0x9069, 0xDF6D, 0x906A, 0xDF6E, + 0x906B, 0xDF6F, 0x906C, 0xDF70, 0x906D, 0xD4E2, 0x906E, 0xD5DA, + 0x906F, 0xDF71, 0x9070, 0xDF72, 0x9071, 0xDF73, 0x9072, 0xDF74, + 0x9073, 0xDF75, 0x9074, 0xE5E0, 0x9075, 0xD7F1, 0x9076, 0xDF76, + 0x9077, 0xDF77, 0x9078, 0xDF78, 0x9079, 0xDF79, 0x907A, 0xDF7A, + 0x907B, 0xDF7B, 0x907C, 0xDF7C, 0x907D, 0xE5E1, 0x907E, 0xDF7D, + 0x907F, 0xB1DC, 0x9080, 0xD1FB, 0x9081, 0xDF7E, 0x9082, 0xE5E2, + 0x9083, 0xE5E4, 0x9084, 0xDF80, 0x9085, 0xDF81, 0x9086, 0xDF82, + 0x9087, 0xDF83, 0x9088, 0xE5E3, 0x9089, 0xDF84, 0x908A, 0xDF85, + 0x908B, 0xE5E5, 0x908C, 0xDF86, 0x908D, 0xDF87, 0x908E, 0xDF88, + 0x908F, 0xDF89, 0x9090, 0xDF8A, 0x9091, 0xD2D8, 0x9092, 0xDF8B, + 0x9093, 0xB5CB, 0x9094, 0xDF8C, 0x9095, 0xE7DF, 0x9096, 0xDF8D, + 0x9097, 0xDAF5, 0x9098, 0xDF8E, 0x9099, 0xDAF8, 0x909A, 0xDF8F, + 0x909B, 0xDAF6, 0x909C, 0xDF90, 0x909D, 0xDAF7, 0x909E, 0xDF91, + 0x909F, 0xDF92, 0x90A0, 0xDF93, 0x90A1, 0xDAFA, 0x90A2, 0xD0CF, + 0x90A3, 0xC4C7, 0x90A4, 0xDF94, 0x90A5, 0xDF95, 0x90A6, 0xB0EE, + 0x90A7, 0xDF96, 0x90A8, 0xDF97, 0x90A9, 0xDF98, 0x90AA, 0xD0B0, + 0x90AB, 0xDF99, 0x90AC, 0xDAF9, 0x90AD, 0xDF9A, 0x90AE, 0xD3CA, + 0x90AF, 0xBAAA, 0x90B0, 0xDBA2, 0x90B1, 0xC7F1, 0x90B2, 0xDF9B, + 0x90B3, 0xDAFC, 0x90B4, 0xDAFB, 0x90B5, 0xC9DB, 0x90B6, 0xDAFD, + 0x90B7, 0xDF9C, 0x90B8, 0xDBA1, 0x90B9, 0xD7DE, 0x90BA, 0xDAFE, + 0x90BB, 0xC1DA, 0x90BC, 0xDF9D, 0x90BD, 0xDF9E, 0x90BE, 0xDBA5, + 0x90BF, 0xDF9F, 0x90C0, 0xDFA0, 0x90C1, 0xD3F4, 0x90C2, 0xE040, + 0x90C3, 0xE041, 0x90C4, 0xDBA7, 0x90C5, 0xDBA4, 0x90C6, 0xE042, + 0x90C7, 0xDBA8, 0x90C8, 0xE043, 0x90C9, 0xE044, 0x90CA, 0xBDBC, + 0x90CB, 0xE045, 0x90CC, 0xE046, 0x90CD, 0xE047, 0x90CE, 0xC0C9, + 0x90CF, 0xDBA3, 0x90D0, 0xDBA6, 0x90D1, 0xD6A3, 0x90D2, 0xE048, + 0x90D3, 0xDBA9, 0x90D4, 0xE049, 0x90D5, 0xE04A, 0x90D6, 0xE04B, + 0x90D7, 0xDBAD, 0x90D8, 0xE04C, 0x90D9, 0xE04D, 0x90DA, 0xE04E, + 0x90DB, 0xDBAE, 0x90DC, 0xDBAC, 0x90DD, 0xBAC2, 0x90DE, 0xE04F, + 0x90DF, 0xE050, 0x90E0, 0xE051, 0x90E1, 0xBFA4, 0x90E2, 0xDBAB, + 0x90E3, 0xE052, 0x90E4, 0xE053, 0x90E5, 0xE054, 0x90E6, 0xDBAA, + 0x90E7, 0xD4C7, 0x90E8, 0xB2BF, 0x90E9, 0xE055, 0x90EA, 0xE056, + 0x90EB, 0xDBAF, 0x90EC, 0xE057, 0x90ED, 0xB9F9, 0x90EE, 0xE058, + 0x90EF, 0xDBB0, 0x90F0, 0xE059, 0x90F1, 0xE05A, 0x90F2, 0xE05B, + 0x90F3, 0xE05C, 0x90F4, 0xB3BB, 0x90F5, 0xE05D, 0x90F6, 0xE05E, + 0x90F7, 0xE05F, 0x90F8, 0xB5A6, 0x90F9, 0xE060, 0x90FA, 0xE061, + 0x90FB, 0xE062, 0x90FC, 0xE063, 0x90FD, 0xB6BC, 0x90FE, 0xDBB1, + 0x90FF, 0xE064, 0x9100, 0xE065, 0x9101, 0xE066, 0x9102, 0xB6F5, + 0x9103, 0xE067, 0x9104, 0xDBB2, 0x9105, 0xE068, 0x9106, 0xE069, + 0x9107, 0xE06A, 0x9108, 0xE06B, 0x9109, 0xE06C, 0x910A, 0xE06D, + 0x910B, 0xE06E, 0x910C, 0xE06F, 0x910D, 0xE070, 0x910E, 0xE071, + 0x910F, 0xE072, 0x9110, 0xE073, 0x9111, 0xE074, 0x9112, 0xE075, + 0x9113, 0xE076, 0x9114, 0xE077, 0x9115, 0xE078, 0x9116, 0xE079, + 0x9117, 0xE07A, 0x9118, 0xE07B, 0x9119, 0xB1C9, 0x911A, 0xE07C, + 0x911B, 0xE07D, 0x911C, 0xE07E, 0x911D, 0xE080, 0x911E, 0xDBB4, + 0x911F, 0xE081, 0x9120, 0xE082, 0x9121, 0xE083, 0x9122, 0xDBB3, + 0x9123, 0xDBB5, 0x9124, 0xE084, 0x9125, 0xE085, 0x9126, 0xE086, + 0x9127, 0xE087, 0x9128, 0xE088, 0x9129, 0xE089, 0x912A, 0xE08A, + 0x912B, 0xE08B, 0x912C, 0xE08C, 0x912D, 0xE08D, 0x912E, 0xE08E, + 0x912F, 0xDBB7, 0x9130, 0xE08F, 0x9131, 0xDBB6, 0x9132, 0xE090, + 0x9133, 0xE091, 0x9134, 0xE092, 0x9135, 0xE093, 0x9136, 0xE094, + 0x9137, 0xE095, 0x9138, 0xE096, 0x9139, 0xDBB8, 0x913A, 0xE097, + 0x913B, 0xE098, 0x913C, 0xE099, 0x913D, 0xE09A, 0x913E, 0xE09B, + 0x913F, 0xE09C, 0x9140, 0xE09D, 0x9141, 0xE09E, 0x9142, 0xE09F, + 0x9143, 0xDBB9, 0x9144, 0xE0A0, 0x9145, 0xE140, 0x9146, 0xDBBA, + 0x9147, 0xE141, 0x9148, 0xE142, 0x9149, 0xD3CF, 0x914A, 0xF4FA, + 0x914B, 0xC7F5, 0x914C, 0xD7C3, 0x914D, 0xC5E4, 0x914E, 0xF4FC, + 0x914F, 0xF4FD, 0x9150, 0xF4FB, 0x9151, 0xE143, 0x9152, 0xBEC6, + 0x9153, 0xE144, 0x9154, 0xE145, 0x9155, 0xE146, 0x9156, 0xE147, + 0x9157, 0xD0EF, 0x9158, 0xE148, 0x9159, 0xE149, 0x915A, 0xB7D3, + 0x915B, 0xE14A, 0x915C, 0xE14B, 0x915D, 0xD4CD, 0x915E, 0xCCAA, + 0x915F, 0xE14C, 0x9160, 0xE14D, 0x9161, 0xF5A2, 0x9162, 0xF5A1, + 0x9163, 0xBAA8, 0x9164, 0xF4FE, 0x9165, 0xCBD6, 0x9166, 0xE14E, + 0x9167, 0xE14F, 0x9168, 0xE150, 0x9169, 0xF5A4, 0x916A, 0xC0D2, + 0x916B, 0xE151, 0x916C, 0xB3EA, 0x916D, 0xE152, 0x916E, 0xCDAA, + 0x916F, 0xF5A5, 0x9170, 0xF5A3, 0x9171, 0xBDB4, 0x9172, 0xF5A8, + 0x9173, 0xE153, 0x9174, 0xF5A9, 0x9175, 0xBDCD, 0x9176, 0xC3B8, + 0x9177, 0xBFE1, 0x9178, 0xCBE1, 0x9179, 0xF5AA, 0x917A, 0xE154, + 0x917B, 0xE155, 0x917C, 0xE156, 0x917D, 0xF5A6, 0x917E, 0xF5A7, + 0x917F, 0xC4F0, 0x9180, 0xE157, 0x9181, 0xE158, 0x9182, 0xE159, + 0x9183, 0xE15A, 0x9184, 0xE15B, 0x9185, 0xF5AC, 0x9186, 0xE15C, + 0x9187, 0xB4BC, 0x9188, 0xE15D, 0x9189, 0xD7ED, 0x918A, 0xE15E, + 0x918B, 0xB4D7, 0x918C, 0xF5AB, 0x918D, 0xF5AE, 0x918E, 0xE15F, + 0x918F, 0xE160, 0x9190, 0xF5AD, 0x9191, 0xF5AF, 0x9192, 0xD0D1, + 0x9193, 0xE161, 0x9194, 0xE162, 0x9195, 0xE163, 0x9196, 0xE164, + 0x9197, 0xE165, 0x9198, 0xE166, 0x9199, 0xE167, 0x919A, 0xC3D1, + 0x919B, 0xC8A9, 0x919C, 0xE168, 0x919D, 0xE169, 0x919E, 0xE16A, + 0x919F, 0xE16B, 0x91A0, 0xE16C, 0x91A1, 0xE16D, 0x91A2, 0xF5B0, + 0x91A3, 0xF5B1, 0x91A4, 0xE16E, 0x91A5, 0xE16F, 0x91A6, 0xE170, + 0x91A7, 0xE171, 0x91A8, 0xE172, 0x91A9, 0xE173, 0x91AA, 0xF5B2, + 0x91AB, 0xE174, 0x91AC, 0xE175, 0x91AD, 0xF5B3, 0x91AE, 0xF5B4, + 0x91AF, 0xF5B5, 0x91B0, 0xE176, 0x91B1, 0xE177, 0x91B2, 0xE178, + 0x91B3, 0xE179, 0x91B4, 0xF5B7, 0x91B5, 0xF5B6, 0x91B6, 0xE17A, + 0x91B7, 0xE17B, 0x91B8, 0xE17C, 0x91B9, 0xE17D, 0x91BA, 0xF5B8, + 0x91BB, 0xE17E, 0x91BC, 0xE180, 0x91BD, 0xE181, 0x91BE, 0xE182, + 0x91BF, 0xE183, 0x91C0, 0xE184, 0x91C1, 0xE185, 0x91C2, 0xE186, + 0x91C3, 0xE187, 0x91C4, 0xE188, 0x91C5, 0xE189, 0x91C6, 0xE18A, + 0x91C7, 0xB2C9, 0x91C8, 0xE18B, 0x91C9, 0xD3D4, 0x91CA, 0xCACD, + 0x91CB, 0xE18C, 0x91CC, 0xC0EF, 0x91CD, 0xD6D8, 0x91CE, 0xD2B0, + 0x91CF, 0xC1BF, 0x91D0, 0xE18D, 0x91D1, 0xBDF0, 0x91D2, 0xE18E, + 0x91D3, 0xE18F, 0x91D4, 0xE190, 0x91D5, 0xE191, 0x91D6, 0xE192, + 0x91D7, 0xE193, 0x91D8, 0xE194, 0x91D9, 0xE195, 0x91DA, 0xE196, + 0x91DB, 0xE197, 0x91DC, 0xB8AA, 0x91DD, 0xE198, 0x91DE, 0xE199, + 0x91DF, 0xE19A, 0x91E0, 0xE19B, 0x91E1, 0xE19C, 0x91E2, 0xE19D, + 0x91E3, 0xE19E, 0x91E4, 0xE19F, 0x91E5, 0xE1A0, 0x91E6, 0xE240, + 0x91E7, 0xE241, 0x91E8, 0xE242, 0x91E9, 0xE243, 0x91EA, 0xE244, + 0x91EB, 0xE245, 0x91EC, 0xE246, 0x91ED, 0xE247, 0x91EE, 0xE248, + 0x91EF, 0xE249, 0x91F0, 0xE24A, 0x91F1, 0xE24B, 0x91F2, 0xE24C, + 0x91F3, 0xE24D, 0x91F4, 0xE24E, 0x91F5, 0xE24F, 0x91F6, 0xE250, + 0x91F7, 0xE251, 0x91F8, 0xE252, 0x91F9, 0xE253, 0x91FA, 0xE254, + 0x91FB, 0xE255, 0x91FC, 0xE256, 0x91FD, 0xE257, 0x91FE, 0xE258, + 0x91FF, 0xE259, 0x9200, 0xE25A, 0x9201, 0xE25B, 0x9202, 0xE25C, + 0x9203, 0xE25D, 0x9204, 0xE25E, 0x9205, 0xE25F, 0x9206, 0xE260, + 0x9207, 0xE261, 0x9208, 0xE262, 0x9209, 0xE263, 0x920A, 0xE264, + 0x920B, 0xE265, 0x920C, 0xE266, 0x920D, 0xE267, 0x920E, 0xE268, + 0x920F, 0xE269, 0x9210, 0xE26A, 0x9211, 0xE26B, 0x9212, 0xE26C, + 0x9213, 0xE26D, 0x9214, 0xE26E, 0x9215, 0xE26F, 0x9216, 0xE270, + 0x9217, 0xE271, 0x9218, 0xE272, 0x9219, 0xE273, 0x921A, 0xE274, + 0x921B, 0xE275, 0x921C, 0xE276, 0x921D, 0xE277, 0x921E, 0xE278, + 0x921F, 0xE279, 0x9220, 0xE27A, 0x9221, 0xE27B, 0x9222, 0xE27C, + 0x9223, 0xE27D, 0x9224, 0xE27E, 0x9225, 0xE280, 0x9226, 0xE281, + 0x9227, 0xE282, 0x9228, 0xE283, 0x9229, 0xE284, 0x922A, 0xE285, + 0x922B, 0xE286, 0x922C, 0xE287, 0x922D, 0xE288, 0x922E, 0xE289, + 0x922F, 0xE28A, 0x9230, 0xE28B, 0x9231, 0xE28C, 0x9232, 0xE28D, + 0x9233, 0xE28E, 0x9234, 0xE28F, 0x9235, 0xE290, 0x9236, 0xE291, + 0x9237, 0xE292, 0x9238, 0xE293, 0x9239, 0xE294, 0x923A, 0xE295, + 0x923B, 0xE296, 0x923C, 0xE297, 0x923D, 0xE298, 0x923E, 0xE299, + 0x923F, 0xE29A, 0x9240, 0xE29B, 0x9241, 0xE29C, 0x9242, 0xE29D, + 0x9243, 0xE29E, 0x9244, 0xE29F, 0x9245, 0xE2A0, 0x9246, 0xE340, + 0x9247, 0xE341, 0x9248, 0xE342, 0x9249, 0xE343, 0x924A, 0xE344, + 0x924B, 0xE345, 0x924C, 0xE346, 0x924D, 0xE347, 0x924E, 0xE348, + 0x924F, 0xE349, 0x9250, 0xE34A, 0x9251, 0xE34B, 0x9252, 0xE34C, + 0x9253, 0xE34D, 0x9254, 0xE34E, 0x9255, 0xE34F, 0x9256, 0xE350, + 0x9257, 0xE351, 0x9258, 0xE352, 0x9259, 0xE353, 0x925A, 0xE354, + 0x925B, 0xE355, 0x925C, 0xE356, 0x925D, 0xE357, 0x925E, 0xE358, + 0x925F, 0xE359, 0x9260, 0xE35A, 0x9261, 0xE35B, 0x9262, 0xE35C, + 0x9263, 0xE35D, 0x9264, 0xE35E, 0x9265, 0xE35F, 0x9266, 0xE360, + 0x9267, 0xE361, 0x9268, 0xE362, 0x9269, 0xE363, 0x926A, 0xE364, + 0x926B, 0xE365, 0x926C, 0xE366, 0x926D, 0xE367, 0x926E, 0xE368, + 0x926F, 0xE369, 0x9270, 0xE36A, 0x9271, 0xE36B, 0x9272, 0xE36C, + 0x9273, 0xE36D, 0x9274, 0xBCF8, 0x9275, 0xE36E, 0x9276, 0xE36F, + 0x9277, 0xE370, 0x9278, 0xE371, 0x9279, 0xE372, 0x927A, 0xE373, + 0x927B, 0xE374, 0x927C, 0xE375, 0x927D, 0xE376, 0x927E, 0xE377, + 0x927F, 0xE378, 0x9280, 0xE379, 0x9281, 0xE37A, 0x9282, 0xE37B, + 0x9283, 0xE37C, 0x9284, 0xE37D, 0x9285, 0xE37E, 0x9286, 0xE380, + 0x9287, 0xE381, 0x9288, 0xE382, 0x9289, 0xE383, 0x928A, 0xE384, + 0x928B, 0xE385, 0x928C, 0xE386, 0x928D, 0xE387, 0x928E, 0xF6C6, + 0x928F, 0xE388, 0x9290, 0xE389, 0x9291, 0xE38A, 0x9292, 0xE38B, + 0x9293, 0xE38C, 0x9294, 0xE38D, 0x9295, 0xE38E, 0x9296, 0xE38F, + 0x9297, 0xE390, 0x9298, 0xE391, 0x9299, 0xE392, 0x929A, 0xE393, + 0x929B, 0xE394, 0x929C, 0xE395, 0x929D, 0xE396, 0x929E, 0xE397, + 0x929F, 0xE398, 0x92A0, 0xE399, 0x92A1, 0xE39A, 0x92A2, 0xE39B, + 0x92A3, 0xE39C, 0x92A4, 0xE39D, 0x92A5, 0xE39E, 0x92A6, 0xE39F, + 0x92A7, 0xE3A0, 0x92A8, 0xE440, 0x92A9, 0xE441, 0x92AA, 0xE442, + 0x92AB, 0xE443, 0x92AC, 0xE444, 0x92AD, 0xE445, 0x92AE, 0xF6C7, + 0x92AF, 0xE446, 0x92B0, 0xE447, 0x92B1, 0xE448, 0x92B2, 0xE449, + 0x92B3, 0xE44A, 0x92B4, 0xE44B, 0x92B5, 0xE44C, 0x92B6, 0xE44D, + 0x92B7, 0xE44E, 0x92B8, 0xE44F, 0x92B9, 0xE450, 0x92BA, 0xE451, + 0x92BB, 0xE452, 0x92BC, 0xE453, 0x92BD, 0xE454, 0x92BE, 0xE455, + 0x92BF, 0xE456, 0x92C0, 0xE457, 0x92C1, 0xE458, 0x92C2, 0xE459, + 0x92C3, 0xE45A, 0x92C4, 0xE45B, 0x92C5, 0xE45C, 0x92C6, 0xE45D, + 0x92C7, 0xE45E, 0x92C8, 0xF6C8, 0x92C9, 0xE45F, 0x92CA, 0xE460, + 0x92CB, 0xE461, 0x92CC, 0xE462, 0x92CD, 0xE463, 0x92CE, 0xE464, + 0x92CF, 0xE465, 0x92D0, 0xE466, 0x92D1, 0xE467, 0x92D2, 0xE468, + 0x92D3, 0xE469, 0x92D4, 0xE46A, 0x92D5, 0xE46B, 0x92D6, 0xE46C, + 0x92D7, 0xE46D, 0x92D8, 0xE46E, 0x92D9, 0xE46F, 0x92DA, 0xE470, + 0x92DB, 0xE471, 0x92DC, 0xE472, 0x92DD, 0xE473, 0x92DE, 0xE474, + 0x92DF, 0xE475, 0x92E0, 0xE476, 0x92E1, 0xE477, 0x92E2, 0xE478, + 0x92E3, 0xE479, 0x92E4, 0xE47A, 0x92E5, 0xE47B, 0x92E6, 0xE47C, + 0x92E7, 0xE47D, 0x92E8, 0xE47E, 0x92E9, 0xE480, 0x92EA, 0xE481, + 0x92EB, 0xE482, 0x92EC, 0xE483, 0x92ED, 0xE484, 0x92EE, 0xE485, + 0x92EF, 0xE486, 0x92F0, 0xE487, 0x92F1, 0xE488, 0x92F2, 0xE489, + 0x92F3, 0xE48A, 0x92F4, 0xE48B, 0x92F5, 0xE48C, 0x92F6, 0xE48D, + 0x92F7, 0xE48E, 0x92F8, 0xE48F, 0x92F9, 0xE490, 0x92FA, 0xE491, + 0x92FB, 0xE492, 0x92FC, 0xE493, 0x92FD, 0xE494, 0x92FE, 0xE495, + 0x92FF, 0xE496, 0x9300, 0xE497, 0x9301, 0xE498, 0x9302, 0xE499, + 0x9303, 0xE49A, 0x9304, 0xE49B, 0x9305, 0xE49C, 0x9306, 0xE49D, + 0x9307, 0xE49E, 0x9308, 0xE49F, 0x9309, 0xE4A0, 0x930A, 0xE540, + 0x930B, 0xE541, 0x930C, 0xE542, 0x930D, 0xE543, 0x930E, 0xE544, + 0x930F, 0xE545, 0x9310, 0xE546, 0x9311, 0xE547, 0x9312, 0xE548, + 0x9313, 0xE549, 0x9314, 0xE54A, 0x9315, 0xE54B, 0x9316, 0xE54C, + 0x9317, 0xE54D, 0x9318, 0xE54E, 0x9319, 0xE54F, 0x931A, 0xE550, + 0x931B, 0xE551, 0x931C, 0xE552, 0x931D, 0xE553, 0x931E, 0xE554, + 0x931F, 0xE555, 0x9320, 0xE556, 0x9321, 0xE557, 0x9322, 0xE558, + 0x9323, 0xE559, 0x9324, 0xE55A, 0x9325, 0xE55B, 0x9326, 0xE55C, + 0x9327, 0xE55D, 0x9328, 0xE55E, 0x9329, 0xE55F, 0x932A, 0xE560, + 0x932B, 0xE561, 0x932C, 0xE562, 0x932D, 0xE563, 0x932E, 0xE564, + 0x932F, 0xE565, 0x9330, 0xE566, 0x9331, 0xE567, 0x9332, 0xE568, + 0x9333, 0xE569, 0x9334, 0xE56A, 0x9335, 0xE56B, 0x9336, 0xE56C, + 0x9337, 0xE56D, 0x9338, 0xE56E, 0x9339, 0xE56F, 0x933A, 0xE570, + 0x933B, 0xE571, 0x933C, 0xE572, 0x933D, 0xE573, 0x933E, 0xF6C9, + 0x933F, 0xE574, 0x9340, 0xE575, 0x9341, 0xE576, 0x9342, 0xE577, + 0x9343, 0xE578, 0x9344, 0xE579, 0x9345, 0xE57A, 0x9346, 0xE57B, + 0x9347, 0xE57C, 0x9348, 0xE57D, 0x9349, 0xE57E, 0x934A, 0xE580, + 0x934B, 0xE581, 0x934C, 0xE582, 0x934D, 0xE583, 0x934E, 0xE584, + 0x934F, 0xE585, 0x9350, 0xE586, 0x9351, 0xE587, 0x9352, 0xE588, + 0x9353, 0xE589, 0x9354, 0xE58A, 0x9355, 0xE58B, 0x9356, 0xE58C, + 0x9357, 0xE58D, 0x9358, 0xE58E, 0x9359, 0xE58F, 0x935A, 0xE590, + 0x935B, 0xE591, 0x935C, 0xE592, 0x935D, 0xE593, 0x935E, 0xE594, + 0x935F, 0xE595, 0x9360, 0xE596, 0x9361, 0xE597, 0x9362, 0xE598, + 0x9363, 0xE599, 0x9364, 0xE59A, 0x9365, 0xE59B, 0x9366, 0xE59C, + 0x9367, 0xE59D, 0x9368, 0xE59E, 0x9369, 0xE59F, 0x936A, 0xF6CA, + 0x936B, 0xE5A0, 0x936C, 0xE640, 0x936D, 0xE641, 0x936E, 0xE642, + 0x936F, 0xE643, 0x9370, 0xE644, 0x9371, 0xE645, 0x9372, 0xE646, + 0x9373, 0xE647, 0x9374, 0xE648, 0x9375, 0xE649, 0x9376, 0xE64A, + 0x9377, 0xE64B, 0x9378, 0xE64C, 0x9379, 0xE64D, 0x937A, 0xE64E, + 0x937B, 0xE64F, 0x937C, 0xE650, 0x937D, 0xE651, 0x937E, 0xE652, + 0x937F, 0xE653, 0x9380, 0xE654, 0x9381, 0xE655, 0x9382, 0xE656, + 0x9383, 0xE657, 0x9384, 0xE658, 0x9385, 0xE659, 0x9386, 0xE65A, + 0x9387, 0xE65B, 0x9388, 0xE65C, 0x9389, 0xE65D, 0x938A, 0xE65E, + 0x938B, 0xE65F, 0x938C, 0xE660, 0x938D, 0xE661, 0x938E, 0xE662, + 0x938F, 0xF6CC, 0x9390, 0xE663, 0x9391, 0xE664, 0x9392, 0xE665, + 0x9393, 0xE666, 0x9394, 0xE667, 0x9395, 0xE668, 0x9396, 0xE669, + 0x9397, 0xE66A, 0x9398, 0xE66B, 0x9399, 0xE66C, 0x939A, 0xE66D, + 0x939B, 0xE66E, 0x939C, 0xE66F, 0x939D, 0xE670, 0x939E, 0xE671, + 0x939F, 0xE672, 0x93A0, 0xE673, 0x93A1, 0xE674, 0x93A2, 0xE675, + 0x93A3, 0xE676, 0x93A4, 0xE677, 0x93A5, 0xE678, 0x93A6, 0xE679, + 0x93A7, 0xE67A, 0x93A8, 0xE67B, 0x93A9, 0xE67C, 0x93AA, 0xE67D, + 0x93AB, 0xE67E, 0x93AC, 0xE680, 0x93AD, 0xE681, 0x93AE, 0xE682, + 0x93AF, 0xE683, 0x93B0, 0xE684, 0x93B1, 0xE685, 0x93B2, 0xE686, + 0x93B3, 0xE687, 0x93B4, 0xE688, 0x93B5, 0xE689, 0x93B6, 0xE68A, + 0x93B7, 0xE68B, 0x93B8, 0xE68C, 0x93B9, 0xE68D, 0x93BA, 0xE68E, + 0x93BB, 0xE68F, 0x93BC, 0xE690, 0x93BD, 0xE691, 0x93BE, 0xE692, + 0x93BF, 0xE693, 0x93C0, 0xE694, 0x93C1, 0xE695, 0x93C2, 0xE696, + 0x93C3, 0xE697, 0x93C4, 0xE698, 0x93C5, 0xE699, 0x93C6, 0xE69A, + 0x93C7, 0xE69B, 0x93C8, 0xE69C, 0x93C9, 0xE69D, 0x93CA, 0xF6CB, + 0x93CB, 0xE69E, 0x93CC, 0xE69F, 0x93CD, 0xE6A0, 0x93CE, 0xE740, + 0x93CF, 0xE741, 0x93D0, 0xE742, 0x93D1, 0xE743, 0x93D2, 0xE744, + 0x93D3, 0xE745, 0x93D4, 0xE746, 0x93D5, 0xE747, 0x93D6, 0xF7E9, + 0x93D7, 0xE748, 0x93D8, 0xE749, 0x93D9, 0xE74A, 0x93DA, 0xE74B, + 0x93DB, 0xE74C, 0x93DC, 0xE74D, 0x93DD, 0xE74E, 0x93DE, 0xE74F, + 0x93DF, 0xE750, 0x93E0, 0xE751, 0x93E1, 0xE752, 0x93E2, 0xE753, + 0x93E3, 0xE754, 0x93E4, 0xE755, 0x93E5, 0xE756, 0x93E6, 0xE757, + 0x93E7, 0xE758, 0x93E8, 0xE759, 0x93E9, 0xE75A, 0x93EA, 0xE75B, + 0x93EB, 0xE75C, 0x93EC, 0xE75D, 0x93ED, 0xE75E, 0x93EE, 0xE75F, + 0x93EF, 0xE760, 0x93F0, 0xE761, 0x93F1, 0xE762, 0x93F2, 0xE763, + 0x93F3, 0xE764, 0x93F4, 0xE765, 0x93F5, 0xE766, 0x93F6, 0xE767, + 0x93F7, 0xE768, 0x93F8, 0xE769, 0x93F9, 0xE76A, 0x93FA, 0xE76B, + 0x93FB, 0xE76C, 0x93FC, 0xE76D, 0x93FD, 0xE76E, 0x93FE, 0xE76F, + 0x93FF, 0xE770, 0x9400, 0xE771, 0x9401, 0xE772, 0x9402, 0xE773, + 0x9403, 0xE774, 0x9404, 0xE775, 0x9405, 0xE776, 0x9406, 0xE777, + 0x9407, 0xE778, 0x9408, 0xE779, 0x9409, 0xE77A, 0x940A, 0xE77B, + 0x940B, 0xE77C, 0x940C, 0xE77D, 0x940D, 0xE77E, 0x940E, 0xE780, + 0x940F, 0xE781, 0x9410, 0xE782, 0x9411, 0xE783, 0x9412, 0xE784, + 0x9413, 0xE785, 0x9414, 0xE786, 0x9415, 0xE787, 0x9416, 0xE788, + 0x9417, 0xE789, 0x9418, 0xE78A, 0x9419, 0xE78B, 0x941A, 0xE78C, + 0x941B, 0xE78D, 0x941C, 0xE78E, 0x941D, 0xE78F, 0x941E, 0xE790, + 0x941F, 0xE791, 0x9420, 0xE792, 0x9421, 0xE793, 0x9422, 0xE794, + 0x9423, 0xE795, 0x9424, 0xE796, 0x9425, 0xE797, 0x9426, 0xE798, + 0x9427, 0xE799, 0x9428, 0xE79A, 0x9429, 0xE79B, 0x942A, 0xE79C, + 0x942B, 0xE79D, 0x942C, 0xE79E, 0x942D, 0xE79F, 0x942E, 0xE7A0, + 0x942F, 0xE840, 0x9430, 0xE841, 0x9431, 0xE842, 0x9432, 0xE843, + 0x9433, 0xE844, 0x9434, 0xE845, 0x9435, 0xE846, 0x9436, 0xE847, + 0x9437, 0xE848, 0x9438, 0xE849, 0x9439, 0xE84A, 0x943A, 0xE84B, + 0x943B, 0xE84C, 0x943C, 0xE84D, 0x943D, 0xE84E, 0x943E, 0xF6CD, + 0x943F, 0xE84F, 0x9440, 0xE850, 0x9441, 0xE851, 0x9442, 0xE852, + 0x9443, 0xE853, 0x9444, 0xE854, 0x9445, 0xE855, 0x9446, 0xE856, + 0x9447, 0xE857, 0x9448, 0xE858, 0x9449, 0xE859, 0x944A, 0xE85A, + 0x944B, 0xE85B, 0x944C, 0xE85C, 0x944D, 0xE85D, 0x944E, 0xE85E, + 0x944F, 0xE85F, 0x9450, 0xE860, 0x9451, 0xE861, 0x9452, 0xE862, + 0x9453, 0xE863, 0x9454, 0xE864, 0x9455, 0xE865, 0x9456, 0xE866, + 0x9457, 0xE867, 0x9458, 0xE868, 0x9459, 0xE869, 0x945A, 0xE86A, + 0x945B, 0xE86B, 0x945C, 0xE86C, 0x945D, 0xE86D, 0x945E, 0xE86E, + 0x945F, 0xE86F, 0x9460, 0xE870, 0x9461, 0xE871, 0x9462, 0xE872, + 0x9463, 0xE873, 0x9464, 0xE874, 0x9465, 0xE875, 0x9466, 0xE876, + 0x9467, 0xE877, 0x9468, 0xE878, 0x9469, 0xE879, 0x946A, 0xE87A, + 0x946B, 0xF6CE, 0x946C, 0xE87B, 0x946D, 0xE87C, 0x946E, 0xE87D, + 0x946F, 0xE87E, 0x9470, 0xE880, 0x9471, 0xE881, 0x9472, 0xE882, + 0x9473, 0xE883, 0x9474, 0xE884, 0x9475, 0xE885, 0x9476, 0xE886, + 0x9477, 0xE887, 0x9478, 0xE888, 0x9479, 0xE889, 0x947A, 0xE88A, + 0x947B, 0xE88B, 0x947C, 0xE88C, 0x947D, 0xE88D, 0x947E, 0xE88E, + 0x947F, 0xE88F, 0x9480, 0xE890, 0x9481, 0xE891, 0x9482, 0xE892, + 0x9483, 0xE893, 0x9484, 0xE894, 0x9485, 0xEEC4, 0x9486, 0xEEC5, + 0x9487, 0xEEC6, 0x9488, 0xD5EB, 0x9489, 0xB6A4, 0x948A, 0xEEC8, + 0x948B, 0xEEC7, 0x948C, 0xEEC9, 0x948D, 0xEECA, 0x948E, 0xC7A5, + 0x948F, 0xEECB, 0x9490, 0xEECC, 0x9491, 0xE895, 0x9492, 0xB7B0, + 0x9493, 0xB5F6, 0x9494, 0xEECD, 0x9495, 0xEECF, 0x9496, 0xE896, + 0x9497, 0xEECE, 0x9498, 0xE897, 0x9499, 0xB8C6, 0x949A, 0xEED0, + 0x949B, 0xEED1, 0x949C, 0xEED2, 0x949D, 0xB6DB, 0x949E, 0xB3AE, + 0x949F, 0xD6D3, 0x94A0, 0xC4C6, 0x94A1, 0xB1B5, 0x94A2, 0xB8D6, + 0x94A3, 0xEED3, 0x94A4, 0xEED4, 0x94A5, 0xD4BF, 0x94A6, 0xC7D5, + 0x94A7, 0xBEFB, 0x94A8, 0xCED9, 0x94A9, 0xB9B3, 0x94AA, 0xEED6, + 0x94AB, 0xEED5, 0x94AC, 0xEED8, 0x94AD, 0xEED7, 0x94AE, 0xC5A5, + 0x94AF, 0xEED9, 0x94B0, 0xEEDA, 0x94B1, 0xC7AE, 0x94B2, 0xEEDB, + 0x94B3, 0xC7AF, 0x94B4, 0xEEDC, 0x94B5, 0xB2A7, 0x94B6, 0xEEDD, + 0x94B7, 0xEEDE, 0x94B8, 0xEEDF, 0x94B9, 0xEEE0, 0x94BA, 0xEEE1, + 0x94BB, 0xD7EA, 0x94BC, 0xEEE2, 0x94BD, 0xEEE3, 0x94BE, 0xBCD8, + 0x94BF, 0xEEE4, 0x94C0, 0xD3CB, 0x94C1, 0xCCFA, 0x94C2, 0xB2AC, + 0x94C3, 0xC1E5, 0x94C4, 0xEEE5, 0x94C5, 0xC7A6, 0x94C6, 0xC3AD, + 0x94C7, 0xE898, 0x94C8, 0xEEE6, 0x94C9, 0xEEE7, 0x94CA, 0xEEE8, + 0x94CB, 0xEEE9, 0x94CC, 0xEEEA, 0x94CD, 0xEEEB, 0x94CE, 0xEEEC, + 0x94CF, 0xE899, 0x94D0, 0xEEED, 0x94D1, 0xEEEE, 0x94D2, 0xEEEF, + 0x94D3, 0xE89A, 0x94D4, 0xE89B, 0x94D5, 0xEEF0, 0x94D6, 0xEEF1, + 0x94D7, 0xEEF2, 0x94D8, 0xEEF4, 0x94D9, 0xEEF3, 0x94DA, 0xE89C, + 0x94DB, 0xEEF5, 0x94DC, 0xCDAD, 0x94DD, 0xC2C1, 0x94DE, 0xEEF6, + 0x94DF, 0xEEF7, 0x94E0, 0xEEF8, 0x94E1, 0xD5A1, 0x94E2, 0xEEF9, + 0x94E3, 0xCFB3, 0x94E4, 0xEEFA, 0x94E5, 0xEEFB, 0x94E6, 0xE89D, + 0x94E7, 0xEEFC, 0x94E8, 0xEEFD, 0x94E9, 0xEFA1, 0x94EA, 0xEEFE, + 0x94EB, 0xEFA2, 0x94EC, 0xB8F5, 0x94ED, 0xC3FA, 0x94EE, 0xEFA3, + 0x94EF, 0xEFA4, 0x94F0, 0xBDC2, 0x94F1, 0xD2BF, 0x94F2, 0xB2F9, + 0x94F3, 0xEFA5, 0x94F4, 0xEFA6, 0x94F5, 0xEFA7, 0x94F6, 0xD2F8, + 0x94F7, 0xEFA8, 0x94F8, 0xD6FD, 0x94F9, 0xEFA9, 0x94FA, 0xC6CC, + 0x94FB, 0xE89E, 0x94FC, 0xEFAA, 0x94FD, 0xEFAB, 0x94FE, 0xC1B4, + 0x94FF, 0xEFAC, 0x9500, 0xCFFA, 0x9501, 0xCBF8, 0x9502, 0xEFAE, + 0x9503, 0xEFAD, 0x9504, 0xB3FA, 0x9505, 0xB9F8, 0x9506, 0xEFAF, + 0x9507, 0xEFB0, 0x9508, 0xD0E2, 0x9509, 0xEFB1, 0x950A, 0xEFB2, + 0x950B, 0xB7E6, 0x950C, 0xD0BF, 0x950D, 0xEFB3, 0x950E, 0xEFB4, + 0x950F, 0xEFB5, 0x9510, 0xC8F1, 0x9511, 0xCCE0, 0x9512, 0xEFB6, + 0x9513, 0xEFB7, 0x9514, 0xEFB8, 0x9515, 0xEFB9, 0x9516, 0xEFBA, + 0x9517, 0xD5E0, 0x9518, 0xEFBB, 0x9519, 0xB4ED, 0x951A, 0xC3AA, + 0x951B, 0xEFBC, 0x951C, 0xE89F, 0x951D, 0xEFBD, 0x951E, 0xEFBE, + 0x951F, 0xEFBF, 0x9520, 0xE8A0, 0x9521, 0xCEFD, 0x9522, 0xEFC0, + 0x9523, 0xC2E0, 0x9524, 0xB4B8, 0x9525, 0xD7B6, 0x9526, 0xBDF5, + 0x9527, 0xE940, 0x9528, 0xCFC7, 0x9529, 0xEFC3, 0x952A, 0xEFC1, + 0x952B, 0xEFC2, 0x952C, 0xEFC4, 0x952D, 0xB6A7, 0x952E, 0xBCFC, + 0x952F, 0xBEE2, 0x9530, 0xC3CC, 0x9531, 0xEFC5, 0x9532, 0xEFC6, + 0x9533, 0xE941, 0x9534, 0xEFC7, 0x9535, 0xEFCF, 0x9536, 0xEFC8, + 0x9537, 0xEFC9, 0x9538, 0xEFCA, 0x9539, 0xC7C2, 0x953A, 0xEFF1, + 0x953B, 0xB6CD, 0x953C, 0xEFCB, 0x953D, 0xE942, 0x953E, 0xEFCC, + 0x953F, 0xEFCD, 0x9540, 0xB6C6, 0x9541, 0xC3BE, 0x9542, 0xEFCE, + 0x9543, 0xE943, 0x9544, 0xEFD0, 0x9545, 0xEFD1, 0x9546, 0xEFD2, + 0x9547, 0xD5F2, 0x9548, 0xE944, 0x9549, 0xEFD3, 0x954A, 0xC4F7, + 0x954B, 0xE945, 0x954C, 0xEFD4, 0x954D, 0xC4F8, 0x954E, 0xEFD5, + 0x954F, 0xEFD6, 0x9550, 0xB8E4, 0x9551, 0xB0F7, 0x9552, 0xEFD7, + 0x9553, 0xEFD8, 0x9554, 0xEFD9, 0x9555, 0xE946, 0x9556, 0xEFDA, + 0x9557, 0xEFDB, 0x9558, 0xEFDC, 0x9559, 0xEFDD, 0x955A, 0xE947, + 0x955B, 0xEFDE, 0x955C, 0xBEB5, 0x955D, 0xEFE1, 0x955E, 0xEFDF, + 0x955F, 0xEFE0, 0x9560, 0xE948, 0x9561, 0xEFE2, 0x9562, 0xEFE3, + 0x9563, 0xC1CD, 0x9564, 0xEFE4, 0x9565, 0xEFE5, 0x9566, 0xEFE6, + 0x9567, 0xEFE7, 0x9568, 0xEFE8, 0x9569, 0xEFE9, 0x956A, 0xEFEA, + 0x956B, 0xEFEB, 0x956C, 0xEFEC, 0x956D, 0xC0D8, 0x956E, 0xE949, + 0x956F, 0xEFED, 0x9570, 0xC1AD, 0x9571, 0xEFEE, 0x9572, 0xEFEF, + 0x9573, 0xEFF0, 0x9574, 0xE94A, 0x9575, 0xE94B, 0x9576, 0xCFE2, + 0x9577, 0xE94C, 0x9578, 0xE94D, 0x9579, 0xE94E, 0x957A, 0xE94F, + 0x957B, 0xE950, 0x957C, 0xE951, 0x957D, 0xE952, 0x957E, 0xE953, + 0x957F, 0xB3A4, 0x9580, 0xE954, 0x9581, 0xE955, 0x9582, 0xE956, + 0x9583, 0xE957, 0x9584, 0xE958, 0x9585, 0xE959, 0x9586, 0xE95A, + 0x9587, 0xE95B, 0x9588, 0xE95C, 0x9589, 0xE95D, 0x958A, 0xE95E, + 0x958B, 0xE95F, 0x958C, 0xE960, 0x958D, 0xE961, 0x958E, 0xE962, + 0x958F, 0xE963, 0x9590, 0xE964, 0x9591, 0xE965, 0x9592, 0xE966, + 0x9593, 0xE967, 0x9594, 0xE968, 0x9595, 0xE969, 0x9596, 0xE96A, + 0x9597, 0xE96B, 0x9598, 0xE96C, 0x9599, 0xE96D, 0x959A, 0xE96E, + 0x959B, 0xE96F, 0x959C, 0xE970, 0x959D, 0xE971, 0x959E, 0xE972, + 0x959F, 0xE973, 0x95A0, 0xE974, 0x95A1, 0xE975, 0x95A2, 0xE976, + 0x95A3, 0xE977, 0x95A4, 0xE978, 0x95A5, 0xE979, 0x95A6, 0xE97A, + 0x95A7, 0xE97B, 0x95A8, 0xE97C, 0x95A9, 0xE97D, 0x95AA, 0xE97E, + 0x95AB, 0xE980, 0x95AC, 0xE981, 0x95AD, 0xE982, 0x95AE, 0xE983, + 0x95AF, 0xE984, 0x95B0, 0xE985, 0x95B1, 0xE986, 0x95B2, 0xE987, + 0x95B3, 0xE988, 0x95B4, 0xE989, 0x95B5, 0xE98A, 0x95B6, 0xE98B, + 0x95B7, 0xE98C, 0x95B8, 0xE98D, 0x95B9, 0xE98E, 0x95BA, 0xE98F, + 0x95BB, 0xE990, 0x95BC, 0xE991, 0x95BD, 0xE992, 0x95BE, 0xE993, + 0x95BF, 0xE994, 0x95C0, 0xE995, 0x95C1, 0xE996, 0x95C2, 0xE997, + 0x95C3, 0xE998, 0x95C4, 0xE999, 0x95C5, 0xE99A, 0x95C6, 0xE99B, + 0x95C7, 0xE99C, 0x95C8, 0xE99D, 0x95C9, 0xE99E, 0x95CA, 0xE99F, + 0x95CB, 0xE9A0, 0x95CC, 0xEA40, 0x95CD, 0xEA41, 0x95CE, 0xEA42, + 0x95CF, 0xEA43, 0x95D0, 0xEA44, 0x95D1, 0xEA45, 0x95D2, 0xEA46, + 0x95D3, 0xEA47, 0x95D4, 0xEA48, 0x95D5, 0xEA49, 0x95D6, 0xEA4A, + 0x95D7, 0xEA4B, 0x95D8, 0xEA4C, 0x95D9, 0xEA4D, 0x95DA, 0xEA4E, + 0x95DB, 0xEA4F, 0x95DC, 0xEA50, 0x95DD, 0xEA51, 0x95DE, 0xEA52, + 0x95DF, 0xEA53, 0x95E0, 0xEA54, 0x95E1, 0xEA55, 0x95E2, 0xEA56, + 0x95E3, 0xEA57, 0x95E4, 0xEA58, 0x95E5, 0xEA59, 0x95E6, 0xEA5A, + 0x95E7, 0xEA5B, 0x95E8, 0xC3C5, 0x95E9, 0xE3C5, 0x95EA, 0xC9C1, + 0x95EB, 0xE3C6, 0x95EC, 0xEA5C, 0x95ED, 0xB1D5, 0x95EE, 0xCECA, + 0x95EF, 0xB4B3, 0x95F0, 0xC8F2, 0x95F1, 0xE3C7, 0x95F2, 0xCFD0, + 0x95F3, 0xE3C8, 0x95F4, 0xBCE4, 0x95F5, 0xE3C9, 0x95F6, 0xE3CA, + 0x95F7, 0xC3C6, 0x95F8, 0xD5A2, 0x95F9, 0xC4D6, 0x95FA, 0xB9EB, + 0x95FB, 0xCEC5, 0x95FC, 0xE3CB, 0x95FD, 0xC3F6, 0x95FE, 0xE3CC, + 0x95FF, 0xEA5D, 0x9600, 0xB7A7, 0x9601, 0xB8F3, 0x9602, 0xBAD2, + 0x9603, 0xE3CD, 0x9604, 0xE3CE, 0x9605, 0xD4C4, 0x9606, 0xE3CF, + 0x9607, 0xEA5E, 0x9608, 0xE3D0, 0x9609, 0xD1CB, 0x960A, 0xE3D1, + 0x960B, 0xE3D2, 0x960C, 0xE3D3, 0x960D, 0xE3D4, 0x960E, 0xD1D6, + 0x960F, 0xE3D5, 0x9610, 0xB2FB, 0x9611, 0xC0BB, 0x9612, 0xE3D6, + 0x9613, 0xEA5F, 0x9614, 0xC0AB, 0x9615, 0xE3D7, 0x9616, 0xE3D8, + 0x9617, 0xE3D9, 0x9618, 0xEA60, 0x9619, 0xE3DA, 0x961A, 0xE3DB, + 0x961B, 0xEA61, 0x961C, 0xB8B7, 0x961D, 0xDAE2, 0x961E, 0xEA62, + 0x961F, 0xB6D3, 0x9620, 0xEA63, 0x9621, 0xDAE4, 0x9622, 0xDAE3, + 0x9623, 0xEA64, 0x9624, 0xEA65, 0x9625, 0xEA66, 0x9626, 0xEA67, + 0x9627, 0xEA68, 0x9628, 0xEA69, 0x9629, 0xEA6A, 0x962A, 0xDAE6, + 0x962B, 0xEA6B, 0x962C, 0xEA6C, 0x962D, 0xEA6D, 0x962E, 0xC8EE, + 0x962F, 0xEA6E, 0x9630, 0xEA6F, 0x9631, 0xDAE5, 0x9632, 0xB7C0, + 0x9633, 0xD1F4, 0x9634, 0xD2F5, 0x9635, 0xD5F3, 0x9636, 0xBDD7, + 0x9637, 0xEA70, 0x9638, 0xEA71, 0x9639, 0xEA72, 0x963A, 0xEA73, + 0x963B, 0xD7E8, 0x963C, 0xDAE8, 0x963D, 0xDAE7, 0x963E, 0xEA74, + 0x963F, 0xB0A2, 0x9640, 0xCDD3, 0x9641, 0xEA75, 0x9642, 0xDAE9, + 0x9643, 0xEA76, 0x9644, 0xB8BD, 0x9645, 0xBCCA, 0x9646, 0xC2BD, + 0x9647, 0xC2A4, 0x9648, 0xB3C2, 0x9649, 0xDAEA, 0x964A, 0xEA77, + 0x964B, 0xC2AA, 0x964C, 0xC4B0, 0x964D, 0xBDB5, 0x964E, 0xEA78, + 0x964F, 0xEA79, 0x9650, 0xCFDE, 0x9651, 0xEA7A, 0x9652, 0xEA7B, + 0x9653, 0xEA7C, 0x9654, 0xDAEB, 0x9655, 0xC9C2, 0x9656, 0xEA7D, + 0x9657, 0xEA7E, 0x9658, 0xEA80, 0x9659, 0xEA81, 0x965A, 0xEA82, + 0x965B, 0xB1DD, 0x965C, 0xEA83, 0x965D, 0xEA84, 0x965E, 0xEA85, + 0x965F, 0xDAEC, 0x9660, 0xEA86, 0x9661, 0xB6B8, 0x9662, 0xD4BA, + 0x9663, 0xEA87, 0x9664, 0xB3FD, 0x9665, 0xEA88, 0x9666, 0xEA89, + 0x9667, 0xDAED, 0x9668, 0xD4C9, 0x9669, 0xCFD5, 0x966A, 0xC5E3, + 0x966B, 0xEA8A, 0x966C, 0xDAEE, 0x966D, 0xEA8B, 0x966E, 0xEA8C, + 0x966F, 0xEA8D, 0x9670, 0xEA8E, 0x9671, 0xEA8F, 0x9672, 0xDAEF, + 0x9673, 0xEA90, 0x9674, 0xDAF0, 0x9675, 0xC1EA, 0x9676, 0xCCD5, + 0x9677, 0xCFDD, 0x9678, 0xEA91, 0x9679, 0xEA92, 0x967A, 0xEA93, + 0x967B, 0xEA94, 0x967C, 0xEA95, 0x967D, 0xEA96, 0x967E, 0xEA97, + 0x967F, 0xEA98, 0x9680, 0xEA99, 0x9681, 0xEA9A, 0x9682, 0xEA9B, + 0x9683, 0xEA9C, 0x9684, 0xEA9D, 0x9685, 0xD3E7, 0x9686, 0xC2A1, + 0x9687, 0xEA9E, 0x9688, 0xDAF1, 0x9689, 0xEA9F, 0x968A, 0xEAA0, + 0x968B, 0xCBE5, 0x968C, 0xEB40, 0x968D, 0xDAF2, 0x968E, 0xEB41, + 0x968F, 0xCBE6, 0x9690, 0xD2FE, 0x9691, 0xEB42, 0x9692, 0xEB43, + 0x9693, 0xEB44, 0x9694, 0xB8F4, 0x9695, 0xEB45, 0x9696, 0xEB46, + 0x9697, 0xDAF3, 0x9698, 0xB0AF, 0x9699, 0xCFB6, 0x969A, 0xEB47, + 0x969B, 0xEB48, 0x969C, 0xD5CF, 0x969D, 0xEB49, 0x969E, 0xEB4A, + 0x969F, 0xEB4B, 0x96A0, 0xEB4C, 0x96A1, 0xEB4D, 0x96A2, 0xEB4E, + 0x96A3, 0xEB4F, 0x96A4, 0xEB50, 0x96A5, 0xEB51, 0x96A6, 0xEB52, + 0x96A7, 0xCBED, 0x96A8, 0xEB53, 0x96A9, 0xEB54, 0x96AA, 0xEB55, + 0x96AB, 0xEB56, 0x96AC, 0xEB57, 0x96AD, 0xEB58, 0x96AE, 0xEB59, + 0x96AF, 0xEB5A, 0x96B0, 0xDAF4, 0x96B1, 0xEB5B, 0x96B2, 0xEB5C, + 0x96B3, 0xE3C4, 0x96B4, 0xEB5D, 0x96B5, 0xEB5E, 0x96B6, 0xC1A5, + 0x96B7, 0xEB5F, 0x96B8, 0xEB60, 0x96B9, 0xF6BF, 0x96BA, 0xEB61, + 0x96BB, 0xEB62, 0x96BC, 0xF6C0, 0x96BD, 0xF6C1, 0x96BE, 0xC4D1, + 0x96BF, 0xEB63, 0x96C0, 0xC8B8, 0x96C1, 0xD1E3, 0x96C2, 0xEB64, + 0x96C3, 0xEB65, 0x96C4, 0xD0DB, 0x96C5, 0xD1C5, 0x96C6, 0xBCAF, + 0x96C7, 0xB9CD, 0x96C8, 0xEB66, 0x96C9, 0xEFF4, 0x96CA, 0xEB67, + 0x96CB, 0xEB68, 0x96CC, 0xB4C6, 0x96CD, 0xD3BA, 0x96CE, 0xF6C2, + 0x96CF, 0xB3FB, 0x96D0, 0xEB69, 0x96D1, 0xEB6A, 0x96D2, 0xF6C3, + 0x96D3, 0xEB6B, 0x96D4, 0xEB6C, 0x96D5, 0xB5F1, 0x96D6, 0xEB6D, + 0x96D7, 0xEB6E, 0x96D8, 0xEB6F, 0x96D9, 0xEB70, 0x96DA, 0xEB71, + 0x96DB, 0xEB72, 0x96DC, 0xEB73, 0x96DD, 0xEB74, 0x96DE, 0xEB75, + 0x96DF, 0xEB76, 0x96E0, 0xF6C5, 0x96E1, 0xEB77, 0x96E2, 0xEB78, + 0x96E3, 0xEB79, 0x96E4, 0xEB7A, 0x96E5, 0xEB7B, 0x96E6, 0xEB7C, + 0x96E7, 0xEB7D, 0x96E8, 0xD3EA, 0x96E9, 0xF6A7, 0x96EA, 0xD1A9, + 0x96EB, 0xEB7E, 0x96EC, 0xEB80, 0x96ED, 0xEB81, 0x96EE, 0xEB82, + 0x96EF, 0xF6A9, 0x96F0, 0xEB83, 0x96F1, 0xEB84, 0x96F2, 0xEB85, + 0x96F3, 0xF6A8, 0x96F4, 0xEB86, 0x96F5, 0xEB87, 0x96F6, 0xC1E3, + 0x96F7, 0xC0D7, 0x96F8, 0xEB88, 0x96F9, 0xB1A2, 0x96FA, 0xEB89, + 0x96FB, 0xEB8A, 0x96FC, 0xEB8B, 0x96FD, 0xEB8C, 0x96FE, 0xCEED, + 0x96FF, 0xEB8D, 0x9700, 0xD0E8, 0x9701, 0xF6AB, 0x9702, 0xEB8E, + 0x9703, 0xEB8F, 0x9704, 0xCFF6, 0x9705, 0xEB90, 0x9706, 0xF6AA, + 0x9707, 0xD5F0, 0x9708, 0xF6AC, 0x9709, 0xC3B9, 0x970A, 0xEB91, + 0x970B, 0xEB92, 0x970C, 0xEB93, 0x970D, 0xBBF4, 0x970E, 0xF6AE, + 0x970F, 0xF6AD, 0x9710, 0xEB94, 0x9711, 0xEB95, 0x9712, 0xEB96, + 0x9713, 0xC4DE, 0x9714, 0xEB97, 0x9715, 0xEB98, 0x9716, 0xC1D8, + 0x9717, 0xEB99, 0x9718, 0xEB9A, 0x9719, 0xEB9B, 0x971A, 0xEB9C, + 0x971B, 0xEB9D, 0x971C, 0xCBAA, 0x971D, 0xEB9E, 0x971E, 0xCFBC, + 0x971F, 0xEB9F, 0x9720, 0xEBA0, 0x9721, 0xEC40, 0x9722, 0xEC41, + 0x9723, 0xEC42, 0x9724, 0xEC43, 0x9725, 0xEC44, 0x9726, 0xEC45, + 0x9727, 0xEC46, 0x9728, 0xEC47, 0x9729, 0xEC48, 0x972A, 0xF6AF, + 0x972B, 0xEC49, 0x972C, 0xEC4A, 0x972D, 0xF6B0, 0x972E, 0xEC4B, + 0x972F, 0xEC4C, 0x9730, 0xF6B1, 0x9731, 0xEC4D, 0x9732, 0xC2B6, + 0x9733, 0xEC4E, 0x9734, 0xEC4F, 0x9735, 0xEC50, 0x9736, 0xEC51, + 0x9737, 0xEC52, 0x9738, 0xB0D4, 0x9739, 0xC5F9, 0x973A, 0xEC53, + 0x973B, 0xEC54, 0x973C, 0xEC55, 0x973D, 0xEC56, 0x973E, 0xF6B2, + 0x973F, 0xEC57, 0x9740, 0xEC58, 0x9741, 0xEC59, 0x9742, 0xEC5A, + 0x9743, 0xEC5B, 0x9744, 0xEC5C, 0x9745, 0xEC5D, 0x9746, 0xEC5E, + 0x9747, 0xEC5F, 0x9748, 0xEC60, 0x9749, 0xEC61, 0x974A, 0xEC62, + 0x974B, 0xEC63, 0x974C, 0xEC64, 0x974D, 0xEC65, 0x974E, 0xEC66, + 0x974F, 0xEC67, 0x9750, 0xEC68, 0x9751, 0xEC69, 0x9752, 0xC7E0, + 0x9753, 0xF6A6, 0x9754, 0xEC6A, 0x9755, 0xEC6B, 0x9756, 0xBEB8, + 0x9757, 0xEC6C, 0x9758, 0xEC6D, 0x9759, 0xBEB2, 0x975A, 0xEC6E, + 0x975B, 0xB5E5, 0x975C, 0xEC6F, 0x975D, 0xEC70, 0x975E, 0xB7C7, + 0x975F, 0xEC71, 0x9760, 0xBFBF, 0x9761, 0xC3D2, 0x9762, 0xC3E6, + 0x9763, 0xEC72, 0x9764, 0xEC73, 0x9765, 0xD8CC, 0x9766, 0xEC74, + 0x9767, 0xEC75, 0x9768, 0xEC76, 0x9769, 0xB8EF, 0x976A, 0xEC77, + 0x976B, 0xEC78, 0x976C, 0xEC79, 0x976D, 0xEC7A, 0x976E, 0xEC7B, + 0x976F, 0xEC7C, 0x9770, 0xEC7D, 0x9771, 0xEC7E, 0x9772, 0xEC80, + 0x9773, 0xBDF9, 0x9774, 0xD1A5, 0x9775, 0xEC81, 0x9776, 0xB0D0, + 0x9777, 0xEC82, 0x9778, 0xEC83, 0x9779, 0xEC84, 0x977A, 0xEC85, + 0x977B, 0xEC86, 0x977C, 0xF7B0, 0x977D, 0xEC87, 0x977E, 0xEC88, + 0x977F, 0xEC89, 0x9780, 0xEC8A, 0x9781, 0xEC8B, 0x9782, 0xEC8C, + 0x9783, 0xEC8D, 0x9784, 0xEC8E, 0x9785, 0xF7B1, 0x9786, 0xEC8F, + 0x9787, 0xEC90, 0x9788, 0xEC91, 0x9789, 0xEC92, 0x978A, 0xEC93, + 0x978B, 0xD0AC, 0x978C, 0xEC94, 0x978D, 0xB0B0, 0x978E, 0xEC95, + 0x978F, 0xEC96, 0x9790, 0xEC97, 0x9791, 0xF7B2, 0x9792, 0xF7B3, + 0x9793, 0xEC98, 0x9794, 0xF7B4, 0x9795, 0xEC99, 0x9796, 0xEC9A, + 0x9797, 0xEC9B, 0x9798, 0xC7CA, 0x9799, 0xEC9C, 0x979A, 0xEC9D, + 0x979B, 0xEC9E, 0x979C, 0xEC9F, 0x979D, 0xECA0, 0x979E, 0xED40, + 0x979F, 0xED41, 0x97A0, 0xBECF, 0x97A1, 0xED42, 0x97A2, 0xED43, + 0x97A3, 0xF7B7, 0x97A4, 0xED44, 0x97A5, 0xED45, 0x97A6, 0xED46, + 0x97A7, 0xED47, 0x97A8, 0xED48, 0x97A9, 0xED49, 0x97AA, 0xED4A, + 0x97AB, 0xF7B6, 0x97AC, 0xED4B, 0x97AD, 0xB1DE, 0x97AE, 0xED4C, + 0x97AF, 0xF7B5, 0x97B0, 0xED4D, 0x97B1, 0xED4E, 0x97B2, 0xF7B8, + 0x97B3, 0xED4F, 0x97B4, 0xF7B9, 0x97B5, 0xED50, 0x97B6, 0xED51, + 0x97B7, 0xED52, 0x97B8, 0xED53, 0x97B9, 0xED54, 0x97BA, 0xED55, + 0x97BB, 0xED56, 0x97BC, 0xED57, 0x97BD, 0xED58, 0x97BE, 0xED59, + 0x97BF, 0xED5A, 0x97C0, 0xED5B, 0x97C1, 0xED5C, 0x97C2, 0xED5D, + 0x97C3, 0xED5E, 0x97C4, 0xED5F, 0x97C5, 0xED60, 0x97C6, 0xED61, + 0x97C7, 0xED62, 0x97C8, 0xED63, 0x97C9, 0xED64, 0x97CA, 0xED65, + 0x97CB, 0xED66, 0x97CC, 0xED67, 0x97CD, 0xED68, 0x97CE, 0xED69, + 0x97CF, 0xED6A, 0x97D0, 0xED6B, 0x97D1, 0xED6C, 0x97D2, 0xED6D, + 0x97D3, 0xED6E, 0x97D4, 0xED6F, 0x97D5, 0xED70, 0x97D6, 0xED71, + 0x97D7, 0xED72, 0x97D8, 0xED73, 0x97D9, 0xED74, 0x97DA, 0xED75, + 0x97DB, 0xED76, 0x97DC, 0xED77, 0x97DD, 0xED78, 0x97DE, 0xED79, + 0x97DF, 0xED7A, 0x97E0, 0xED7B, 0x97E1, 0xED7C, 0x97E2, 0xED7D, + 0x97E3, 0xED7E, 0x97E4, 0xED80, 0x97E5, 0xED81, 0x97E6, 0xCEA4, + 0x97E7, 0xC8CD, 0x97E8, 0xED82, 0x97E9, 0xBAAB, 0x97EA, 0xE8B8, + 0x97EB, 0xE8B9, 0x97EC, 0xE8BA, 0x97ED, 0xBEC2, 0x97EE, 0xED83, + 0x97EF, 0xED84, 0x97F0, 0xED85, 0x97F1, 0xED86, 0x97F2, 0xED87, + 0x97F3, 0xD2F4, 0x97F4, 0xED88, 0x97F5, 0xD4CF, 0x97F6, 0xC9D8, + 0x97F7, 0xED89, 0x97F8, 0xED8A, 0x97F9, 0xED8B, 0x97FA, 0xED8C, + 0x97FB, 0xED8D, 0x97FC, 0xED8E, 0x97FD, 0xED8F, 0x97FE, 0xED90, + 0x97FF, 0xED91, 0x9800, 0xED92, 0x9801, 0xED93, 0x9802, 0xED94, + 0x9803, 0xED95, 0x9804, 0xED96, 0x9805, 0xED97, 0x9806, 0xED98, + 0x9807, 0xED99, 0x9808, 0xED9A, 0x9809, 0xED9B, 0x980A, 0xED9C, + 0x980B, 0xED9D, 0x980C, 0xED9E, 0x980D, 0xED9F, 0x980E, 0xEDA0, + 0x980F, 0xEE40, 0x9810, 0xEE41, 0x9811, 0xEE42, 0x9812, 0xEE43, + 0x9813, 0xEE44, 0x9814, 0xEE45, 0x9815, 0xEE46, 0x9816, 0xEE47, + 0x9817, 0xEE48, 0x9818, 0xEE49, 0x9819, 0xEE4A, 0x981A, 0xEE4B, + 0x981B, 0xEE4C, 0x981C, 0xEE4D, 0x981D, 0xEE4E, 0x981E, 0xEE4F, + 0x981F, 0xEE50, 0x9820, 0xEE51, 0x9821, 0xEE52, 0x9822, 0xEE53, + 0x9823, 0xEE54, 0x9824, 0xEE55, 0x9825, 0xEE56, 0x9826, 0xEE57, + 0x9827, 0xEE58, 0x9828, 0xEE59, 0x9829, 0xEE5A, 0x982A, 0xEE5B, + 0x982B, 0xEE5C, 0x982C, 0xEE5D, 0x982D, 0xEE5E, 0x982E, 0xEE5F, + 0x982F, 0xEE60, 0x9830, 0xEE61, 0x9831, 0xEE62, 0x9832, 0xEE63, + 0x9833, 0xEE64, 0x9834, 0xEE65, 0x9835, 0xEE66, 0x9836, 0xEE67, + 0x9837, 0xEE68, 0x9838, 0xEE69, 0x9839, 0xEE6A, 0x983A, 0xEE6B, + 0x983B, 0xEE6C, 0x983C, 0xEE6D, 0x983D, 0xEE6E, 0x983E, 0xEE6F, + 0x983F, 0xEE70, 0x9840, 0xEE71, 0x9841, 0xEE72, 0x9842, 0xEE73, + 0x9843, 0xEE74, 0x9844, 0xEE75, 0x9845, 0xEE76, 0x9846, 0xEE77, + 0x9847, 0xEE78, 0x9848, 0xEE79, 0x9849, 0xEE7A, 0x984A, 0xEE7B, + 0x984B, 0xEE7C, 0x984C, 0xEE7D, 0x984D, 0xEE7E, 0x984E, 0xEE80, + 0x984F, 0xEE81, 0x9850, 0xEE82, 0x9851, 0xEE83, 0x9852, 0xEE84, + 0x9853, 0xEE85, 0x9854, 0xEE86, 0x9855, 0xEE87, 0x9856, 0xEE88, + 0x9857, 0xEE89, 0x9858, 0xEE8A, 0x9859, 0xEE8B, 0x985A, 0xEE8C, + 0x985B, 0xEE8D, 0x985C, 0xEE8E, 0x985D, 0xEE8F, 0x985E, 0xEE90, + 0x985F, 0xEE91, 0x9860, 0xEE92, 0x9861, 0xEE93, 0x9862, 0xEE94, + 0x9863, 0xEE95, 0x9864, 0xEE96, 0x9865, 0xEE97, 0x9866, 0xEE98, + 0x9867, 0xEE99, 0x9868, 0xEE9A, 0x9869, 0xEE9B, 0x986A, 0xEE9C, + 0x986B, 0xEE9D, 0x986C, 0xEE9E, 0x986D, 0xEE9F, 0x986E, 0xEEA0, + 0x986F, 0xEF40, 0x9870, 0xEF41, 0x9871, 0xEF42, 0x9872, 0xEF43, + 0x9873, 0xEF44, 0x9874, 0xEF45, 0x9875, 0xD2B3, 0x9876, 0xB6A5, + 0x9877, 0xC7EA, 0x9878, 0xF1FC, 0x9879, 0xCFEE, 0x987A, 0xCBB3, + 0x987B, 0xD0EB, 0x987C, 0xE7EF, 0x987D, 0xCDE7, 0x987E, 0xB9CB, + 0x987F, 0xB6D9, 0x9880, 0xF1FD, 0x9881, 0xB0E4, 0x9882, 0xCBCC, + 0x9883, 0xF1FE, 0x9884, 0xD4A4, 0x9885, 0xC2AD, 0x9886, 0xC1EC, + 0x9887, 0xC6C4, 0x9888, 0xBEB1, 0x9889, 0xF2A1, 0x988A, 0xBCD5, + 0x988B, 0xEF46, 0x988C, 0xF2A2, 0x988D, 0xF2A3, 0x988E, 0xEF47, + 0x988F, 0xF2A4, 0x9890, 0xD2C3, 0x9891, 0xC6B5, 0x9892, 0xEF48, + 0x9893, 0xCDC7, 0x9894, 0xF2A5, 0x9895, 0xEF49, 0x9896, 0xD3B1, + 0x9897, 0xBFC5, 0x9898, 0xCCE2, 0x9899, 0xEF4A, 0x989A, 0xF2A6, + 0x989B, 0xF2A7, 0x989C, 0xD1D5, 0x989D, 0xB6EE, 0x989E, 0xF2A8, + 0x989F, 0xF2A9, 0x98A0, 0xB5DF, 0x98A1, 0xF2AA, 0x98A2, 0xF2AB, + 0x98A3, 0xEF4B, 0x98A4, 0xB2FC, 0x98A5, 0xF2AC, 0x98A6, 0xF2AD, + 0x98A7, 0xC8A7, 0x98A8, 0xEF4C, 0x98A9, 0xEF4D, 0x98AA, 0xEF4E, + 0x98AB, 0xEF4F, 0x98AC, 0xEF50, 0x98AD, 0xEF51, 0x98AE, 0xEF52, + 0x98AF, 0xEF53, 0x98B0, 0xEF54, 0x98B1, 0xEF55, 0x98B2, 0xEF56, + 0x98B3, 0xEF57, 0x98B4, 0xEF58, 0x98B5, 0xEF59, 0x98B6, 0xEF5A, + 0x98B7, 0xEF5B, 0x98B8, 0xEF5C, 0x98B9, 0xEF5D, 0x98BA, 0xEF5E, + 0x98BB, 0xEF5F, 0x98BC, 0xEF60, 0x98BD, 0xEF61, 0x98BE, 0xEF62, + 0x98BF, 0xEF63, 0x98C0, 0xEF64, 0x98C1, 0xEF65, 0x98C2, 0xEF66, + 0x98C3, 0xEF67, 0x98C4, 0xEF68, 0x98C5, 0xEF69, 0x98C6, 0xEF6A, + 0x98C7, 0xEF6B, 0x98C8, 0xEF6C, 0x98C9, 0xEF6D, 0x98CA, 0xEF6E, + 0x98CB, 0xEF6F, 0x98CC, 0xEF70, 0x98CD, 0xEF71, 0x98CE, 0xB7E7, + 0x98CF, 0xEF72, 0x98D0, 0xEF73, 0x98D1, 0xECA9, 0x98D2, 0xECAA, + 0x98D3, 0xECAB, 0x98D4, 0xEF74, 0x98D5, 0xECAC, 0x98D6, 0xEF75, + 0x98D7, 0xEF76, 0x98D8, 0xC6AE, 0x98D9, 0xECAD, 0x98DA, 0xECAE, + 0x98DB, 0xEF77, 0x98DC, 0xEF78, 0x98DD, 0xEF79, 0x98DE, 0xB7C9, + 0x98DF, 0xCAB3, 0x98E0, 0xEF7A, 0x98E1, 0xEF7B, 0x98E2, 0xEF7C, + 0x98E3, 0xEF7D, 0x98E4, 0xEF7E, 0x98E5, 0xEF80, 0x98E6, 0xEF81, + 0x98E7, 0xE2B8, 0x98E8, 0xF7CF, 0x98E9, 0xEF82, 0x98EA, 0xEF83, + 0x98EB, 0xEF84, 0x98EC, 0xEF85, 0x98ED, 0xEF86, 0x98EE, 0xEF87, + 0x98EF, 0xEF88, 0x98F0, 0xEF89, 0x98F1, 0xEF8A, 0x98F2, 0xEF8B, + 0x98F3, 0xEF8C, 0x98F4, 0xEF8D, 0x98F5, 0xEF8E, 0x98F6, 0xEF8F, + 0x98F7, 0xEF90, 0x98F8, 0xEF91, 0x98F9, 0xEF92, 0x98FA, 0xEF93, + 0x98FB, 0xEF94, 0x98FC, 0xEF95, 0x98FD, 0xEF96, 0x98FE, 0xEF97, + 0x98FF, 0xEF98, 0x9900, 0xEF99, 0x9901, 0xEF9A, 0x9902, 0xEF9B, + 0x9903, 0xEF9C, 0x9904, 0xEF9D, 0x9905, 0xEF9E, 0x9906, 0xEF9F, + 0x9907, 0xEFA0, 0x9908, 0xF040, 0x9909, 0xF041, 0x990A, 0xF042, + 0x990B, 0xF043, 0x990C, 0xF044, 0x990D, 0xF7D0, 0x990E, 0xF045, + 0x990F, 0xF046, 0x9910, 0xB2CD, 0x9911, 0xF047, 0x9912, 0xF048, + 0x9913, 0xF049, 0x9914, 0xF04A, 0x9915, 0xF04B, 0x9916, 0xF04C, + 0x9917, 0xF04D, 0x9918, 0xF04E, 0x9919, 0xF04F, 0x991A, 0xF050, + 0x991B, 0xF051, 0x991C, 0xF052, 0x991D, 0xF053, 0x991E, 0xF054, + 0x991F, 0xF055, 0x9920, 0xF056, 0x9921, 0xF057, 0x9922, 0xF058, + 0x9923, 0xF059, 0x9924, 0xF05A, 0x9925, 0xF05B, 0x9926, 0xF05C, + 0x9927, 0xF05D, 0x9928, 0xF05E, 0x9929, 0xF05F, 0x992A, 0xF060, + 0x992B, 0xF061, 0x992C, 0xF062, 0x992D, 0xF063, 0x992E, 0xF7D1, + 0x992F, 0xF064, 0x9930, 0xF065, 0x9931, 0xF066, 0x9932, 0xF067, + 0x9933, 0xF068, 0x9934, 0xF069, 0x9935, 0xF06A, 0x9936, 0xF06B, + 0x9937, 0xF06C, 0x9938, 0xF06D, 0x9939, 0xF06E, 0x993A, 0xF06F, + 0x993B, 0xF070, 0x993C, 0xF071, 0x993D, 0xF072, 0x993E, 0xF073, + 0x993F, 0xF074, 0x9940, 0xF075, 0x9941, 0xF076, 0x9942, 0xF077, + 0x9943, 0xF078, 0x9944, 0xF079, 0x9945, 0xF07A, 0x9946, 0xF07B, + 0x9947, 0xF07C, 0x9948, 0xF07D, 0x9949, 0xF07E, 0x994A, 0xF080, + 0x994B, 0xF081, 0x994C, 0xF082, 0x994D, 0xF083, 0x994E, 0xF084, + 0x994F, 0xF085, 0x9950, 0xF086, 0x9951, 0xF087, 0x9952, 0xF088, + 0x9953, 0xF089, 0x9954, 0xF7D3, 0x9955, 0xF7D2, 0x9956, 0xF08A, + 0x9957, 0xF08B, 0x9958, 0xF08C, 0x9959, 0xF08D, 0x995A, 0xF08E, + 0x995B, 0xF08F, 0x995C, 0xF090, 0x995D, 0xF091, 0x995E, 0xF092, + 0x995F, 0xF093, 0x9960, 0xF094, 0x9961, 0xF095, 0x9962, 0xF096, + 0x9963, 0xE2BB, 0x9964, 0xF097, 0x9965, 0xBCA2, 0x9966, 0xF098, + 0x9967, 0xE2BC, 0x9968, 0xE2BD, 0x9969, 0xE2BE, 0x996A, 0xE2BF, + 0x996B, 0xE2C0, 0x996C, 0xE2C1, 0x996D, 0xB7B9, 0x996E, 0xD2FB, + 0x996F, 0xBDA4, 0x9970, 0xCACE, 0x9971, 0xB1A5, 0x9972, 0xCBC7, + 0x9973, 0xF099, 0x9974, 0xE2C2, 0x9975, 0xB6FC, 0x9976, 0xC8C4, + 0x9977, 0xE2C3, 0x9978, 0xF09A, 0x9979, 0xF09B, 0x997A, 0xBDC8, + 0x997B, 0xF09C, 0x997C, 0xB1FD, 0x997D, 0xE2C4, 0x997E, 0xF09D, + 0x997F, 0xB6F6, 0x9980, 0xE2C5, 0x9981, 0xC4D9, 0x9982, 0xF09E, + 0x9983, 0xF09F, 0x9984, 0xE2C6, 0x9985, 0xCFDA, 0x9986, 0xB9DD, + 0x9987, 0xE2C7, 0x9988, 0xC0A1, 0x9989, 0xF0A0, 0x998A, 0xE2C8, + 0x998B, 0xB2F6, 0x998C, 0xF140, 0x998D, 0xE2C9, 0x998E, 0xF141, + 0x998F, 0xC1F3, 0x9990, 0xE2CA, 0x9991, 0xE2CB, 0x9992, 0xC2F8, + 0x9993, 0xE2CC, 0x9994, 0xE2CD, 0x9995, 0xE2CE, 0x9996, 0xCAD7, + 0x9997, 0xD8B8, 0x9998, 0xD9E5, 0x9999, 0xCFE3, 0x999A, 0xF142, + 0x999B, 0xF143, 0x999C, 0xF144, 0x999D, 0xF145, 0x999E, 0xF146, + 0x999F, 0xF147, 0x99A0, 0xF148, 0x99A1, 0xF149, 0x99A2, 0xF14A, + 0x99A3, 0xF14B, 0x99A4, 0xF14C, 0x99A5, 0xF0A5, 0x99A6, 0xF14D, + 0x99A7, 0xF14E, 0x99A8, 0xDCB0, 0x99A9, 0xF14F, 0x99AA, 0xF150, + 0x99AB, 0xF151, 0x99AC, 0xF152, 0x99AD, 0xF153, 0x99AE, 0xF154, + 0x99AF, 0xF155, 0x99B0, 0xF156, 0x99B1, 0xF157, 0x99B2, 0xF158, + 0x99B3, 0xF159, 0x99B4, 0xF15A, 0x99B5, 0xF15B, 0x99B6, 0xF15C, + 0x99B7, 0xF15D, 0x99B8, 0xF15E, 0x99B9, 0xF15F, 0x99BA, 0xF160, + 0x99BB, 0xF161, 0x99BC, 0xF162, 0x99BD, 0xF163, 0x99BE, 0xF164, + 0x99BF, 0xF165, 0x99C0, 0xF166, 0x99C1, 0xF167, 0x99C2, 0xF168, + 0x99C3, 0xF169, 0x99C4, 0xF16A, 0x99C5, 0xF16B, 0x99C6, 0xF16C, + 0x99C7, 0xF16D, 0x99C8, 0xF16E, 0x99C9, 0xF16F, 0x99CA, 0xF170, + 0x99CB, 0xF171, 0x99CC, 0xF172, 0x99CD, 0xF173, 0x99CE, 0xF174, + 0x99CF, 0xF175, 0x99D0, 0xF176, 0x99D1, 0xF177, 0x99D2, 0xF178, + 0x99D3, 0xF179, 0x99D4, 0xF17A, 0x99D5, 0xF17B, 0x99D6, 0xF17C, + 0x99D7, 0xF17D, 0x99D8, 0xF17E, 0x99D9, 0xF180, 0x99DA, 0xF181, + 0x99DB, 0xF182, 0x99DC, 0xF183, 0x99DD, 0xF184, 0x99DE, 0xF185, + 0x99DF, 0xF186, 0x99E0, 0xF187, 0x99E1, 0xF188, 0x99E2, 0xF189, + 0x99E3, 0xF18A, 0x99E4, 0xF18B, 0x99E5, 0xF18C, 0x99E6, 0xF18D, + 0x99E7, 0xF18E, 0x99E8, 0xF18F, 0x99E9, 0xF190, 0x99EA, 0xF191, + 0x99EB, 0xF192, 0x99EC, 0xF193, 0x99ED, 0xF194, 0x99EE, 0xF195, + 0x99EF, 0xF196, 0x99F0, 0xF197, 0x99F1, 0xF198, 0x99F2, 0xF199, + 0x99F3, 0xF19A, 0x99F4, 0xF19B, 0x99F5, 0xF19C, 0x99F6, 0xF19D, + 0x99F7, 0xF19E, 0x99F8, 0xF19F, 0x99F9, 0xF1A0, 0x99FA, 0xF240, + 0x99FB, 0xF241, 0x99FC, 0xF242, 0x99FD, 0xF243, 0x99FE, 0xF244, + 0x99FF, 0xF245, 0x9A00, 0xF246, 0x9A01, 0xF247, 0x9A02, 0xF248, + 0x9A03, 0xF249, 0x9A04, 0xF24A, 0x9A05, 0xF24B, 0x9A06, 0xF24C, + 0x9A07, 0xF24D, 0x9A08, 0xF24E, 0x9A09, 0xF24F, 0x9A0A, 0xF250, + 0x9A0B, 0xF251, 0x9A0C, 0xF252, 0x9A0D, 0xF253, 0x9A0E, 0xF254, + 0x9A0F, 0xF255, 0x9A10, 0xF256, 0x9A11, 0xF257, 0x9A12, 0xF258, + 0x9A13, 0xF259, 0x9A14, 0xF25A, 0x9A15, 0xF25B, 0x9A16, 0xF25C, + 0x9A17, 0xF25D, 0x9A18, 0xF25E, 0x9A19, 0xF25F, 0x9A1A, 0xF260, + 0x9A1B, 0xF261, 0x9A1C, 0xF262, 0x9A1D, 0xF263, 0x9A1E, 0xF264, + 0x9A1F, 0xF265, 0x9A20, 0xF266, 0x9A21, 0xF267, 0x9A22, 0xF268, + 0x9A23, 0xF269, 0x9A24, 0xF26A, 0x9A25, 0xF26B, 0x9A26, 0xF26C, + 0x9A27, 0xF26D, 0x9A28, 0xF26E, 0x9A29, 0xF26F, 0x9A2A, 0xF270, + 0x9A2B, 0xF271, 0x9A2C, 0xF272, 0x9A2D, 0xF273, 0x9A2E, 0xF274, + 0x9A2F, 0xF275, 0x9A30, 0xF276, 0x9A31, 0xF277, 0x9A32, 0xF278, + 0x9A33, 0xF279, 0x9A34, 0xF27A, 0x9A35, 0xF27B, 0x9A36, 0xF27C, + 0x9A37, 0xF27D, 0x9A38, 0xF27E, 0x9A39, 0xF280, 0x9A3A, 0xF281, + 0x9A3B, 0xF282, 0x9A3C, 0xF283, 0x9A3D, 0xF284, 0x9A3E, 0xF285, + 0x9A3F, 0xF286, 0x9A40, 0xF287, 0x9A41, 0xF288, 0x9A42, 0xF289, + 0x9A43, 0xF28A, 0x9A44, 0xF28B, 0x9A45, 0xF28C, 0x9A46, 0xF28D, + 0x9A47, 0xF28E, 0x9A48, 0xF28F, 0x9A49, 0xF290, 0x9A4A, 0xF291, + 0x9A4B, 0xF292, 0x9A4C, 0xF293, 0x9A4D, 0xF294, 0x9A4E, 0xF295, + 0x9A4F, 0xF296, 0x9A50, 0xF297, 0x9A51, 0xF298, 0x9A52, 0xF299, + 0x9A53, 0xF29A, 0x9A54, 0xF29B, 0x9A55, 0xF29C, 0x9A56, 0xF29D, + 0x9A57, 0xF29E, 0x9A58, 0xF29F, 0x9A59, 0xF2A0, 0x9A5A, 0xF340, + 0x9A5B, 0xF341, 0x9A5C, 0xF342, 0x9A5D, 0xF343, 0x9A5E, 0xF344, + 0x9A5F, 0xF345, 0x9A60, 0xF346, 0x9A61, 0xF347, 0x9A62, 0xF348, + 0x9A63, 0xF349, 0x9A64, 0xF34A, 0x9A65, 0xF34B, 0x9A66, 0xF34C, + 0x9A67, 0xF34D, 0x9A68, 0xF34E, 0x9A69, 0xF34F, 0x9A6A, 0xF350, + 0x9A6B, 0xF351, 0x9A6C, 0xC2ED, 0x9A6D, 0xD4A6, 0x9A6E, 0xCDD4, + 0x9A6F, 0xD1B1, 0x9A70, 0xB3DB, 0x9A71, 0xC7FD, 0x9A72, 0xF352, + 0x9A73, 0xB2B5, 0x9A74, 0xC2BF, 0x9A75, 0xE6E0, 0x9A76, 0xCABB, + 0x9A77, 0xE6E1, 0x9A78, 0xE6E2, 0x9A79, 0xBED4, 0x9A7A, 0xE6E3, + 0x9A7B, 0xD7A4, 0x9A7C, 0xCDD5, 0x9A7D, 0xE6E5, 0x9A7E, 0xBCDD, + 0x9A7F, 0xE6E4, 0x9A80, 0xE6E6, 0x9A81, 0xE6E7, 0x9A82, 0xC2EE, + 0x9A83, 0xF353, 0x9A84, 0xBDBE, 0x9A85, 0xE6E8, 0x9A86, 0xC2E6, + 0x9A87, 0xBAA7, 0x9A88, 0xE6E9, 0x9A89, 0xF354, 0x9A8A, 0xE6EA, + 0x9A8B, 0xB3D2, 0x9A8C, 0xD1E9, 0x9A8D, 0xF355, 0x9A8E, 0xF356, + 0x9A8F, 0xBFA5, 0x9A90, 0xE6EB, 0x9A91, 0xC6EF, 0x9A92, 0xE6EC, + 0x9A93, 0xE6ED, 0x9A94, 0xF357, 0x9A95, 0xF358, 0x9A96, 0xE6EE, + 0x9A97, 0xC6AD, 0x9A98, 0xE6EF, 0x9A99, 0xF359, 0x9A9A, 0xC9A7, + 0x9A9B, 0xE6F0, 0x9A9C, 0xE6F1, 0x9A9D, 0xE6F2, 0x9A9E, 0xE5B9, + 0x9A9F, 0xE6F3, 0x9AA0, 0xE6F4, 0x9AA1, 0xC2E2, 0x9AA2, 0xE6F5, + 0x9AA3, 0xE6F6, 0x9AA4, 0xD6E8, 0x9AA5, 0xE6F7, 0x9AA6, 0xF35A, + 0x9AA7, 0xE6F8, 0x9AA8, 0xB9C7, 0x9AA9, 0xF35B, 0x9AAA, 0xF35C, + 0x9AAB, 0xF35D, 0x9AAC, 0xF35E, 0x9AAD, 0xF35F, 0x9AAE, 0xF360, + 0x9AAF, 0xF361, 0x9AB0, 0xF7BB, 0x9AB1, 0xF7BA, 0x9AB2, 0xF362, + 0x9AB3, 0xF363, 0x9AB4, 0xF364, 0x9AB5, 0xF365, 0x9AB6, 0xF7BE, + 0x9AB7, 0xF7BC, 0x9AB8, 0xBAA1, 0x9AB9, 0xF366, 0x9ABA, 0xF7BF, + 0x9ABB, 0xF367, 0x9ABC, 0xF7C0, 0x9ABD, 0xF368, 0x9ABE, 0xF369, + 0x9ABF, 0xF36A, 0x9AC0, 0xF7C2, 0x9AC1, 0xF7C1, 0x9AC2, 0xF7C4, + 0x9AC3, 0xF36B, 0x9AC4, 0xF36C, 0x9AC5, 0xF7C3, 0x9AC6, 0xF36D, + 0x9AC7, 0xF36E, 0x9AC8, 0xF36F, 0x9AC9, 0xF370, 0x9ACA, 0xF371, + 0x9ACB, 0xF7C5, 0x9ACC, 0xF7C6, 0x9ACD, 0xF372, 0x9ACE, 0xF373, + 0x9ACF, 0xF374, 0x9AD0, 0xF375, 0x9AD1, 0xF7C7, 0x9AD2, 0xF376, + 0x9AD3, 0xCBE8, 0x9AD4, 0xF377, 0x9AD5, 0xF378, 0x9AD6, 0xF379, + 0x9AD7, 0xF37A, 0x9AD8, 0xB8DF, 0x9AD9, 0xF37B, 0x9ADA, 0xF37C, + 0x9ADB, 0xF37D, 0x9ADC, 0xF37E, 0x9ADD, 0xF380, 0x9ADE, 0xF381, + 0x9ADF, 0xF7D4, 0x9AE0, 0xF382, 0x9AE1, 0xF7D5, 0x9AE2, 0xF383, + 0x9AE3, 0xF384, 0x9AE4, 0xF385, 0x9AE5, 0xF386, 0x9AE6, 0xF7D6, + 0x9AE7, 0xF387, 0x9AE8, 0xF388, 0x9AE9, 0xF389, 0x9AEA, 0xF38A, + 0x9AEB, 0xF7D8, 0x9AEC, 0xF38B, 0x9AED, 0xF7DA, 0x9AEE, 0xF38C, + 0x9AEF, 0xF7D7, 0x9AF0, 0xF38D, 0x9AF1, 0xF38E, 0x9AF2, 0xF38F, + 0x9AF3, 0xF390, 0x9AF4, 0xF391, 0x9AF5, 0xF392, 0x9AF6, 0xF393, + 0x9AF7, 0xF394, 0x9AF8, 0xF395, 0x9AF9, 0xF7DB, 0x9AFA, 0xF396, + 0x9AFB, 0xF7D9, 0x9AFC, 0xF397, 0x9AFD, 0xF398, 0x9AFE, 0xF399, + 0x9AFF, 0xF39A, 0x9B00, 0xF39B, 0x9B01, 0xF39C, 0x9B02, 0xF39D, + 0x9B03, 0xD7D7, 0x9B04, 0xF39E, 0x9B05, 0xF39F, 0x9B06, 0xF3A0, + 0x9B07, 0xF440, 0x9B08, 0xF7DC, 0x9B09, 0xF441, 0x9B0A, 0xF442, + 0x9B0B, 0xF443, 0x9B0C, 0xF444, 0x9B0D, 0xF445, 0x9B0E, 0xF446, + 0x9B0F, 0xF7DD, 0x9B10, 0xF447, 0x9B11, 0xF448, 0x9B12, 0xF449, + 0x9B13, 0xF7DE, 0x9B14, 0xF44A, 0x9B15, 0xF44B, 0x9B16, 0xF44C, + 0x9B17, 0xF44D, 0x9B18, 0xF44E, 0x9B19, 0xF44F, 0x9B1A, 0xF450, + 0x9B1B, 0xF451, 0x9B1C, 0xF452, 0x9B1D, 0xF453, 0x9B1E, 0xF454, + 0x9B1F, 0xF7DF, 0x9B20, 0xF455, 0x9B21, 0xF456, 0x9B22, 0xF457, + 0x9B23, 0xF7E0, 0x9B24, 0xF458, 0x9B25, 0xF459, 0x9B26, 0xF45A, + 0x9B27, 0xF45B, 0x9B28, 0xF45C, 0x9B29, 0xF45D, 0x9B2A, 0xF45E, + 0x9B2B, 0xF45F, 0x9B2C, 0xF460, 0x9B2D, 0xF461, 0x9B2E, 0xF462, + 0x9B2F, 0xDBCB, 0x9B30, 0xF463, 0x9B31, 0xF464, 0x9B32, 0xD8AA, + 0x9B33, 0xF465, 0x9B34, 0xF466, 0x9B35, 0xF467, 0x9B36, 0xF468, + 0x9B37, 0xF469, 0x9B38, 0xF46A, 0x9B39, 0xF46B, 0x9B3A, 0xF46C, + 0x9B3B, 0xE5F7, 0x9B3C, 0xB9ED, 0x9B3D, 0xF46D, 0x9B3E, 0xF46E, + 0x9B3F, 0xF46F, 0x9B40, 0xF470, 0x9B41, 0xBFFD, 0x9B42, 0xBBEA, + 0x9B43, 0xF7C9, 0x9B44, 0xC6C7, 0x9B45, 0xF7C8, 0x9B46, 0xF471, + 0x9B47, 0xF7CA, 0x9B48, 0xF7CC, 0x9B49, 0xF7CB, 0x9B4A, 0xF472, + 0x9B4B, 0xF473, 0x9B4C, 0xF474, 0x9B4D, 0xF7CD, 0x9B4E, 0xF475, + 0x9B4F, 0xCEBA, 0x9B50, 0xF476, 0x9B51, 0xF7CE, 0x9B52, 0xF477, + 0x9B53, 0xF478, 0x9B54, 0xC4A7, 0x9B55, 0xF479, 0x9B56, 0xF47A, + 0x9B57, 0xF47B, 0x9B58, 0xF47C, 0x9B59, 0xF47D, 0x9B5A, 0xF47E, + 0x9B5B, 0xF480, 0x9B5C, 0xF481, 0x9B5D, 0xF482, 0x9B5E, 0xF483, + 0x9B5F, 0xF484, 0x9B60, 0xF485, 0x9B61, 0xF486, 0x9B62, 0xF487, + 0x9B63, 0xF488, 0x9B64, 0xF489, 0x9B65, 0xF48A, 0x9B66, 0xF48B, + 0x9B67, 0xF48C, 0x9B68, 0xF48D, 0x9B69, 0xF48E, 0x9B6A, 0xF48F, + 0x9B6B, 0xF490, 0x9B6C, 0xF491, 0x9B6D, 0xF492, 0x9B6E, 0xF493, + 0x9B6F, 0xF494, 0x9B70, 0xF495, 0x9B71, 0xF496, 0x9B72, 0xF497, + 0x9B73, 0xF498, 0x9B74, 0xF499, 0x9B75, 0xF49A, 0x9B76, 0xF49B, + 0x9B77, 0xF49C, 0x9B78, 0xF49D, 0x9B79, 0xF49E, 0x9B7A, 0xF49F, + 0x9B7B, 0xF4A0, 0x9B7C, 0xF540, 0x9B7D, 0xF541, 0x9B7E, 0xF542, + 0x9B7F, 0xF543, 0x9B80, 0xF544, 0x9B81, 0xF545, 0x9B82, 0xF546, + 0x9B83, 0xF547, 0x9B84, 0xF548, 0x9B85, 0xF549, 0x9B86, 0xF54A, + 0x9B87, 0xF54B, 0x9B88, 0xF54C, 0x9B89, 0xF54D, 0x9B8A, 0xF54E, + 0x9B8B, 0xF54F, 0x9B8C, 0xF550, 0x9B8D, 0xF551, 0x9B8E, 0xF552, + 0x9B8F, 0xF553, 0x9B90, 0xF554, 0x9B91, 0xF555, 0x9B92, 0xF556, + 0x9B93, 0xF557, 0x9B94, 0xF558, 0x9B95, 0xF559, 0x9B96, 0xF55A, + 0x9B97, 0xF55B, 0x9B98, 0xF55C, 0x9B99, 0xF55D, 0x9B9A, 0xF55E, + 0x9B9B, 0xF55F, 0x9B9C, 0xF560, 0x9B9D, 0xF561, 0x9B9E, 0xF562, + 0x9B9F, 0xF563, 0x9BA0, 0xF564, 0x9BA1, 0xF565, 0x9BA2, 0xF566, + 0x9BA3, 0xF567, 0x9BA4, 0xF568, 0x9BA5, 0xF569, 0x9BA6, 0xF56A, + 0x9BA7, 0xF56B, 0x9BA8, 0xF56C, 0x9BA9, 0xF56D, 0x9BAA, 0xF56E, + 0x9BAB, 0xF56F, 0x9BAC, 0xF570, 0x9BAD, 0xF571, 0x9BAE, 0xF572, + 0x9BAF, 0xF573, 0x9BB0, 0xF574, 0x9BB1, 0xF575, 0x9BB2, 0xF576, + 0x9BB3, 0xF577, 0x9BB4, 0xF578, 0x9BB5, 0xF579, 0x9BB6, 0xF57A, + 0x9BB7, 0xF57B, 0x9BB8, 0xF57C, 0x9BB9, 0xF57D, 0x9BBA, 0xF57E, + 0x9BBB, 0xF580, 0x9BBC, 0xF581, 0x9BBD, 0xF582, 0x9BBE, 0xF583, + 0x9BBF, 0xF584, 0x9BC0, 0xF585, 0x9BC1, 0xF586, 0x9BC2, 0xF587, + 0x9BC3, 0xF588, 0x9BC4, 0xF589, 0x9BC5, 0xF58A, 0x9BC6, 0xF58B, + 0x9BC7, 0xF58C, 0x9BC8, 0xF58D, 0x9BC9, 0xF58E, 0x9BCA, 0xF58F, + 0x9BCB, 0xF590, 0x9BCC, 0xF591, 0x9BCD, 0xF592, 0x9BCE, 0xF593, + 0x9BCF, 0xF594, 0x9BD0, 0xF595, 0x9BD1, 0xF596, 0x9BD2, 0xF597, + 0x9BD3, 0xF598, 0x9BD4, 0xF599, 0x9BD5, 0xF59A, 0x9BD6, 0xF59B, + 0x9BD7, 0xF59C, 0x9BD8, 0xF59D, 0x9BD9, 0xF59E, 0x9BDA, 0xF59F, + 0x9BDB, 0xF5A0, 0x9BDC, 0xF640, 0x9BDD, 0xF641, 0x9BDE, 0xF642, + 0x9BDF, 0xF643, 0x9BE0, 0xF644, 0x9BE1, 0xF645, 0x9BE2, 0xF646, + 0x9BE3, 0xF647, 0x9BE4, 0xF648, 0x9BE5, 0xF649, 0x9BE6, 0xF64A, + 0x9BE7, 0xF64B, 0x9BE8, 0xF64C, 0x9BE9, 0xF64D, 0x9BEA, 0xF64E, + 0x9BEB, 0xF64F, 0x9BEC, 0xF650, 0x9BED, 0xF651, 0x9BEE, 0xF652, + 0x9BEF, 0xF653, 0x9BF0, 0xF654, 0x9BF1, 0xF655, 0x9BF2, 0xF656, + 0x9BF3, 0xF657, 0x9BF4, 0xF658, 0x9BF5, 0xF659, 0x9BF6, 0xF65A, + 0x9BF7, 0xF65B, 0x9BF8, 0xF65C, 0x9BF9, 0xF65D, 0x9BFA, 0xF65E, + 0x9BFB, 0xF65F, 0x9BFC, 0xF660, 0x9BFD, 0xF661, 0x9BFE, 0xF662, + 0x9BFF, 0xF663, 0x9C00, 0xF664, 0x9C01, 0xF665, 0x9C02, 0xF666, + 0x9C03, 0xF667, 0x9C04, 0xF668, 0x9C05, 0xF669, 0x9C06, 0xF66A, + 0x9C07, 0xF66B, 0x9C08, 0xF66C, 0x9C09, 0xF66D, 0x9C0A, 0xF66E, + 0x9C0B, 0xF66F, 0x9C0C, 0xF670, 0x9C0D, 0xF671, 0x9C0E, 0xF672, + 0x9C0F, 0xF673, 0x9C10, 0xF674, 0x9C11, 0xF675, 0x9C12, 0xF676, + 0x9C13, 0xF677, 0x9C14, 0xF678, 0x9C15, 0xF679, 0x9C16, 0xF67A, + 0x9C17, 0xF67B, 0x9C18, 0xF67C, 0x9C19, 0xF67D, 0x9C1A, 0xF67E, + 0x9C1B, 0xF680, 0x9C1C, 0xF681, 0x9C1D, 0xF682, 0x9C1E, 0xF683, + 0x9C1F, 0xF684, 0x9C20, 0xF685, 0x9C21, 0xF686, 0x9C22, 0xF687, + 0x9C23, 0xF688, 0x9C24, 0xF689, 0x9C25, 0xF68A, 0x9C26, 0xF68B, + 0x9C27, 0xF68C, 0x9C28, 0xF68D, 0x9C29, 0xF68E, 0x9C2A, 0xF68F, + 0x9C2B, 0xF690, 0x9C2C, 0xF691, 0x9C2D, 0xF692, 0x9C2E, 0xF693, + 0x9C2F, 0xF694, 0x9C30, 0xF695, 0x9C31, 0xF696, 0x9C32, 0xF697, + 0x9C33, 0xF698, 0x9C34, 0xF699, 0x9C35, 0xF69A, 0x9C36, 0xF69B, + 0x9C37, 0xF69C, 0x9C38, 0xF69D, 0x9C39, 0xF69E, 0x9C3A, 0xF69F, + 0x9C3B, 0xF6A0, 0x9C3C, 0xF740, 0x9C3D, 0xF741, 0x9C3E, 0xF742, + 0x9C3F, 0xF743, 0x9C40, 0xF744, 0x9C41, 0xF745, 0x9C42, 0xF746, + 0x9C43, 0xF747, 0x9C44, 0xF748, 0x9C45, 0xF749, 0x9C46, 0xF74A, + 0x9C47, 0xF74B, 0x9C48, 0xF74C, 0x9C49, 0xF74D, 0x9C4A, 0xF74E, + 0x9C4B, 0xF74F, 0x9C4C, 0xF750, 0x9C4D, 0xF751, 0x9C4E, 0xF752, + 0x9C4F, 0xF753, 0x9C50, 0xF754, 0x9C51, 0xF755, 0x9C52, 0xF756, + 0x9C53, 0xF757, 0x9C54, 0xF758, 0x9C55, 0xF759, 0x9C56, 0xF75A, + 0x9C57, 0xF75B, 0x9C58, 0xF75C, 0x9C59, 0xF75D, 0x9C5A, 0xF75E, + 0x9C5B, 0xF75F, 0x9C5C, 0xF760, 0x9C5D, 0xF761, 0x9C5E, 0xF762, + 0x9C5F, 0xF763, 0x9C60, 0xF764, 0x9C61, 0xF765, 0x9C62, 0xF766, + 0x9C63, 0xF767, 0x9C64, 0xF768, 0x9C65, 0xF769, 0x9C66, 0xF76A, + 0x9C67, 0xF76B, 0x9C68, 0xF76C, 0x9C69, 0xF76D, 0x9C6A, 0xF76E, + 0x9C6B, 0xF76F, 0x9C6C, 0xF770, 0x9C6D, 0xF771, 0x9C6E, 0xF772, + 0x9C6F, 0xF773, 0x9C70, 0xF774, 0x9C71, 0xF775, 0x9C72, 0xF776, + 0x9C73, 0xF777, 0x9C74, 0xF778, 0x9C75, 0xF779, 0x9C76, 0xF77A, + 0x9C77, 0xF77B, 0x9C78, 0xF77C, 0x9C79, 0xF77D, 0x9C7A, 0xF77E, + 0x9C7B, 0xF780, 0x9C7C, 0xD3E3, 0x9C7D, 0xF781, 0x9C7E, 0xF782, + 0x9C7F, 0xF6CF, 0x9C80, 0xF783, 0x9C81, 0xC2B3, 0x9C82, 0xF6D0, + 0x9C83, 0xF784, 0x9C84, 0xF785, 0x9C85, 0xF6D1, 0x9C86, 0xF6D2, + 0x9C87, 0xF6D3, 0x9C88, 0xF6D4, 0x9C89, 0xF786, 0x9C8A, 0xF787, + 0x9C8B, 0xF6D6, 0x9C8C, 0xF788, 0x9C8D, 0xB1AB, 0x9C8E, 0xF6D7, + 0x9C8F, 0xF789, 0x9C90, 0xF6D8, 0x9C91, 0xF6D9, 0x9C92, 0xF6DA, + 0x9C93, 0xF78A, 0x9C94, 0xF6DB, 0x9C95, 0xF6DC, 0x9C96, 0xF78B, + 0x9C97, 0xF78C, 0x9C98, 0xF78D, 0x9C99, 0xF78E, 0x9C9A, 0xF6DD, + 0x9C9B, 0xF6DE, 0x9C9C, 0xCFCA, 0x9C9D, 0xF78F, 0x9C9E, 0xF6DF, + 0x9C9F, 0xF6E0, 0x9CA0, 0xF6E1, 0x9CA1, 0xF6E2, 0x9CA2, 0xF6E3, + 0x9CA3, 0xF6E4, 0x9CA4, 0xC0F0, 0x9CA5, 0xF6E5, 0x9CA6, 0xF6E6, + 0x9CA7, 0xF6E7, 0x9CA8, 0xF6E8, 0x9CA9, 0xF6E9, 0x9CAA, 0xF790, + 0x9CAB, 0xF6EA, 0x9CAC, 0xF791, 0x9CAD, 0xF6EB, 0x9CAE, 0xF6EC, + 0x9CAF, 0xF792, 0x9CB0, 0xF6ED, 0x9CB1, 0xF6EE, 0x9CB2, 0xF6EF, + 0x9CB3, 0xF6F0, 0x9CB4, 0xF6F1, 0x9CB5, 0xF6F2, 0x9CB6, 0xF6F3, + 0x9CB7, 0xF6F4, 0x9CB8, 0xBEA8, 0x9CB9, 0xF793, 0x9CBA, 0xF6F5, + 0x9CBB, 0xF6F6, 0x9CBC, 0xF6F7, 0x9CBD, 0xF6F8, 0x9CBE, 0xF794, + 0x9CBF, 0xF795, 0x9CC0, 0xF796, 0x9CC1, 0xF797, 0x9CC2, 0xF798, + 0x9CC3, 0xC8FA, 0x9CC4, 0xF6F9, 0x9CC5, 0xF6FA, 0x9CC6, 0xF6FB, + 0x9CC7, 0xF6FC, 0x9CC8, 0xF799, 0x9CC9, 0xF79A, 0x9CCA, 0xF6FD, + 0x9CCB, 0xF6FE, 0x9CCC, 0xF7A1, 0x9CCD, 0xF7A2, 0x9CCE, 0xF7A3, + 0x9CCF, 0xF7A4, 0x9CD0, 0xF7A5, 0x9CD1, 0xF79B, 0x9CD2, 0xF79C, + 0x9CD3, 0xF7A6, 0x9CD4, 0xF7A7, 0x9CD5, 0xF7A8, 0x9CD6, 0xB1EE, + 0x9CD7, 0xF7A9, 0x9CD8, 0xF7AA, 0x9CD9, 0xF7AB, 0x9CDA, 0xF79D, + 0x9CDB, 0xF79E, 0x9CDC, 0xF7AC, 0x9CDD, 0xF7AD, 0x9CDE, 0xC1DB, + 0x9CDF, 0xF7AE, 0x9CE0, 0xF79F, 0x9CE1, 0xF7A0, 0x9CE2, 0xF7AF, + 0x9CE3, 0xF840, 0x9CE4, 0xF841, 0x9CE5, 0xF842, 0x9CE6, 0xF843, + 0x9CE7, 0xF844, 0x9CE8, 0xF845, 0x9CE9, 0xF846, 0x9CEA, 0xF847, + 0x9CEB, 0xF848, 0x9CEC, 0xF849, 0x9CED, 0xF84A, 0x9CEE, 0xF84B, + 0x9CEF, 0xF84C, 0x9CF0, 0xF84D, 0x9CF1, 0xF84E, 0x9CF2, 0xF84F, + 0x9CF3, 0xF850, 0x9CF4, 0xF851, 0x9CF5, 0xF852, 0x9CF6, 0xF853, + 0x9CF7, 0xF854, 0x9CF8, 0xF855, 0x9CF9, 0xF856, 0x9CFA, 0xF857, + 0x9CFB, 0xF858, 0x9CFC, 0xF859, 0x9CFD, 0xF85A, 0x9CFE, 0xF85B, + 0x9CFF, 0xF85C, 0x9D00, 0xF85D, 0x9D01, 0xF85E, 0x9D02, 0xF85F, + 0x9D03, 0xF860, 0x9D04, 0xF861, 0x9D05, 0xF862, 0x9D06, 0xF863, + 0x9D07, 0xF864, 0x9D08, 0xF865, 0x9D09, 0xF866, 0x9D0A, 0xF867, + 0x9D0B, 0xF868, 0x9D0C, 0xF869, 0x9D0D, 0xF86A, 0x9D0E, 0xF86B, + 0x9D0F, 0xF86C, 0x9D10, 0xF86D, 0x9D11, 0xF86E, 0x9D12, 0xF86F, + 0x9D13, 0xF870, 0x9D14, 0xF871, 0x9D15, 0xF872, 0x9D16, 0xF873, + 0x9D17, 0xF874, 0x9D18, 0xF875, 0x9D19, 0xF876, 0x9D1A, 0xF877, + 0x9D1B, 0xF878, 0x9D1C, 0xF879, 0x9D1D, 0xF87A, 0x9D1E, 0xF87B, + 0x9D1F, 0xF87C, 0x9D20, 0xF87D, 0x9D21, 0xF87E, 0x9D22, 0xF880, + 0x9D23, 0xF881, 0x9D24, 0xF882, 0x9D25, 0xF883, 0x9D26, 0xF884, + 0x9D27, 0xF885, 0x9D28, 0xF886, 0x9D29, 0xF887, 0x9D2A, 0xF888, + 0x9D2B, 0xF889, 0x9D2C, 0xF88A, 0x9D2D, 0xF88B, 0x9D2E, 0xF88C, + 0x9D2F, 0xF88D, 0x9D30, 0xF88E, 0x9D31, 0xF88F, 0x9D32, 0xF890, + 0x9D33, 0xF891, 0x9D34, 0xF892, 0x9D35, 0xF893, 0x9D36, 0xF894, + 0x9D37, 0xF895, 0x9D38, 0xF896, 0x9D39, 0xF897, 0x9D3A, 0xF898, + 0x9D3B, 0xF899, 0x9D3C, 0xF89A, 0x9D3D, 0xF89B, 0x9D3E, 0xF89C, + 0x9D3F, 0xF89D, 0x9D40, 0xF89E, 0x9D41, 0xF89F, 0x9D42, 0xF8A0, + 0x9D43, 0xF940, 0x9D44, 0xF941, 0x9D45, 0xF942, 0x9D46, 0xF943, + 0x9D47, 0xF944, 0x9D48, 0xF945, 0x9D49, 0xF946, 0x9D4A, 0xF947, + 0x9D4B, 0xF948, 0x9D4C, 0xF949, 0x9D4D, 0xF94A, 0x9D4E, 0xF94B, + 0x9D4F, 0xF94C, 0x9D50, 0xF94D, 0x9D51, 0xF94E, 0x9D52, 0xF94F, + 0x9D53, 0xF950, 0x9D54, 0xF951, 0x9D55, 0xF952, 0x9D56, 0xF953, + 0x9D57, 0xF954, 0x9D58, 0xF955, 0x9D59, 0xF956, 0x9D5A, 0xF957, + 0x9D5B, 0xF958, 0x9D5C, 0xF959, 0x9D5D, 0xF95A, 0x9D5E, 0xF95B, + 0x9D5F, 0xF95C, 0x9D60, 0xF95D, 0x9D61, 0xF95E, 0x9D62, 0xF95F, + 0x9D63, 0xF960, 0x9D64, 0xF961, 0x9D65, 0xF962, 0x9D66, 0xF963, + 0x9D67, 0xF964, 0x9D68, 0xF965, 0x9D69, 0xF966, 0x9D6A, 0xF967, + 0x9D6B, 0xF968, 0x9D6C, 0xF969, 0x9D6D, 0xF96A, 0x9D6E, 0xF96B, + 0x9D6F, 0xF96C, 0x9D70, 0xF96D, 0x9D71, 0xF96E, 0x9D72, 0xF96F, + 0x9D73, 0xF970, 0x9D74, 0xF971, 0x9D75, 0xF972, 0x9D76, 0xF973, + 0x9D77, 0xF974, 0x9D78, 0xF975, 0x9D79, 0xF976, 0x9D7A, 0xF977, + 0x9D7B, 0xF978, 0x9D7C, 0xF979, 0x9D7D, 0xF97A, 0x9D7E, 0xF97B, + 0x9D7F, 0xF97C, 0x9D80, 0xF97D, 0x9D81, 0xF97E, 0x9D82, 0xF980, + 0x9D83, 0xF981, 0x9D84, 0xF982, 0x9D85, 0xF983, 0x9D86, 0xF984, + 0x9D87, 0xF985, 0x9D88, 0xF986, 0x9D89, 0xF987, 0x9D8A, 0xF988, + 0x9D8B, 0xF989, 0x9D8C, 0xF98A, 0x9D8D, 0xF98B, 0x9D8E, 0xF98C, + 0x9D8F, 0xF98D, 0x9D90, 0xF98E, 0x9D91, 0xF98F, 0x9D92, 0xF990, + 0x9D93, 0xF991, 0x9D94, 0xF992, 0x9D95, 0xF993, 0x9D96, 0xF994, + 0x9D97, 0xF995, 0x9D98, 0xF996, 0x9D99, 0xF997, 0x9D9A, 0xF998, + 0x9D9B, 0xF999, 0x9D9C, 0xF99A, 0x9D9D, 0xF99B, 0x9D9E, 0xF99C, + 0x9D9F, 0xF99D, 0x9DA0, 0xF99E, 0x9DA1, 0xF99F, 0x9DA2, 0xF9A0, + 0x9DA3, 0xFA40, 0x9DA4, 0xFA41, 0x9DA5, 0xFA42, 0x9DA6, 0xFA43, + 0x9DA7, 0xFA44, 0x9DA8, 0xFA45, 0x9DA9, 0xFA46, 0x9DAA, 0xFA47, + 0x9DAB, 0xFA48, 0x9DAC, 0xFA49, 0x9DAD, 0xFA4A, 0x9DAE, 0xFA4B, + 0x9DAF, 0xFA4C, 0x9DB0, 0xFA4D, 0x9DB1, 0xFA4E, 0x9DB2, 0xFA4F, + 0x9DB3, 0xFA50, 0x9DB4, 0xFA51, 0x9DB5, 0xFA52, 0x9DB6, 0xFA53, + 0x9DB7, 0xFA54, 0x9DB8, 0xFA55, 0x9DB9, 0xFA56, 0x9DBA, 0xFA57, + 0x9DBB, 0xFA58, 0x9DBC, 0xFA59, 0x9DBD, 0xFA5A, 0x9DBE, 0xFA5B, + 0x9DBF, 0xFA5C, 0x9DC0, 0xFA5D, 0x9DC1, 0xFA5E, 0x9DC2, 0xFA5F, + 0x9DC3, 0xFA60, 0x9DC4, 0xFA61, 0x9DC5, 0xFA62, 0x9DC6, 0xFA63, + 0x9DC7, 0xFA64, 0x9DC8, 0xFA65, 0x9DC9, 0xFA66, 0x9DCA, 0xFA67, + 0x9DCB, 0xFA68, 0x9DCC, 0xFA69, 0x9DCD, 0xFA6A, 0x9DCE, 0xFA6B, + 0x9DCF, 0xFA6C, 0x9DD0, 0xFA6D, 0x9DD1, 0xFA6E, 0x9DD2, 0xFA6F, + 0x9DD3, 0xFA70, 0x9DD4, 0xFA71, 0x9DD5, 0xFA72, 0x9DD6, 0xFA73, + 0x9DD7, 0xFA74, 0x9DD8, 0xFA75, 0x9DD9, 0xFA76, 0x9DDA, 0xFA77, + 0x9DDB, 0xFA78, 0x9DDC, 0xFA79, 0x9DDD, 0xFA7A, 0x9DDE, 0xFA7B, + 0x9DDF, 0xFA7C, 0x9DE0, 0xFA7D, 0x9DE1, 0xFA7E, 0x9DE2, 0xFA80, + 0x9DE3, 0xFA81, 0x9DE4, 0xFA82, 0x9DE5, 0xFA83, 0x9DE6, 0xFA84, + 0x9DE7, 0xFA85, 0x9DE8, 0xFA86, 0x9DE9, 0xFA87, 0x9DEA, 0xFA88, + 0x9DEB, 0xFA89, 0x9DEC, 0xFA8A, 0x9DED, 0xFA8B, 0x9DEE, 0xFA8C, + 0x9DEF, 0xFA8D, 0x9DF0, 0xFA8E, 0x9DF1, 0xFA8F, 0x9DF2, 0xFA90, + 0x9DF3, 0xFA91, 0x9DF4, 0xFA92, 0x9DF5, 0xFA93, 0x9DF6, 0xFA94, + 0x9DF7, 0xFA95, 0x9DF8, 0xFA96, 0x9DF9, 0xFA97, 0x9DFA, 0xFA98, + 0x9DFB, 0xFA99, 0x9DFC, 0xFA9A, 0x9DFD, 0xFA9B, 0x9DFE, 0xFA9C, + 0x9DFF, 0xFA9D, 0x9E00, 0xFA9E, 0x9E01, 0xFA9F, 0x9E02, 0xFAA0, + 0x9E03, 0xFB40, 0x9E04, 0xFB41, 0x9E05, 0xFB42, 0x9E06, 0xFB43, + 0x9E07, 0xFB44, 0x9E08, 0xFB45, 0x9E09, 0xFB46, 0x9E0A, 0xFB47, + 0x9E0B, 0xFB48, 0x9E0C, 0xFB49, 0x9E0D, 0xFB4A, 0x9E0E, 0xFB4B, + 0x9E0F, 0xFB4C, 0x9E10, 0xFB4D, 0x9E11, 0xFB4E, 0x9E12, 0xFB4F, + 0x9E13, 0xFB50, 0x9E14, 0xFB51, 0x9E15, 0xFB52, 0x9E16, 0xFB53, + 0x9E17, 0xFB54, 0x9E18, 0xFB55, 0x9E19, 0xFB56, 0x9E1A, 0xFB57, + 0x9E1B, 0xFB58, 0x9E1C, 0xFB59, 0x9E1D, 0xFB5A, 0x9E1E, 0xFB5B, + 0x9E1F, 0xC4F1, 0x9E20, 0xF0AF, 0x9E21, 0xBCA6, 0x9E22, 0xF0B0, + 0x9E23, 0xC3F9, 0x9E24, 0xFB5C, 0x9E25, 0xC5B8, 0x9E26, 0xD1BB, + 0x9E27, 0xFB5D, 0x9E28, 0xF0B1, 0x9E29, 0xF0B2, 0x9E2A, 0xF0B3, + 0x9E2B, 0xF0B4, 0x9E2C, 0xF0B5, 0x9E2D, 0xD1BC, 0x9E2E, 0xFB5E, + 0x9E2F, 0xD1EC, 0x9E30, 0xFB5F, 0x9E31, 0xF0B7, 0x9E32, 0xF0B6, + 0x9E33, 0xD4A7, 0x9E34, 0xFB60, 0x9E35, 0xCDD2, 0x9E36, 0xF0B8, + 0x9E37, 0xF0BA, 0x9E38, 0xF0B9, 0x9E39, 0xF0BB, 0x9E3A, 0xF0BC, + 0x9E3B, 0xFB61, 0x9E3C, 0xFB62, 0x9E3D, 0xB8EB, 0x9E3E, 0xF0BD, + 0x9E3F, 0xBAE8, 0x9E40, 0xFB63, 0x9E41, 0xF0BE, 0x9E42, 0xF0BF, + 0x9E43, 0xBEE9, 0x9E44, 0xF0C0, 0x9E45, 0xB6EC, 0x9E46, 0xF0C1, + 0x9E47, 0xF0C2, 0x9E48, 0xF0C3, 0x9E49, 0xF0C4, 0x9E4A, 0xC8B5, + 0x9E4B, 0xF0C5, 0x9E4C, 0xF0C6, 0x9E4D, 0xFB64, 0x9E4E, 0xF0C7, + 0x9E4F, 0xC5F4, 0x9E50, 0xFB65, 0x9E51, 0xF0C8, 0x9E52, 0xFB66, + 0x9E53, 0xFB67, 0x9E54, 0xFB68, 0x9E55, 0xF0C9, 0x9E56, 0xFB69, + 0x9E57, 0xF0CA, 0x9E58, 0xF7BD, 0x9E59, 0xFB6A, 0x9E5A, 0xF0CB, + 0x9E5B, 0xF0CC, 0x9E5C, 0xF0CD, 0x9E5D, 0xFB6B, 0x9E5E, 0xF0CE, + 0x9E5F, 0xFB6C, 0x9E60, 0xFB6D, 0x9E61, 0xFB6E, 0x9E62, 0xFB6F, + 0x9E63, 0xF0CF, 0x9E64, 0xBAD7, 0x9E65, 0xFB70, 0x9E66, 0xF0D0, + 0x9E67, 0xF0D1, 0x9E68, 0xF0D2, 0x9E69, 0xF0D3, 0x9E6A, 0xF0D4, + 0x9E6B, 0xF0D5, 0x9E6C, 0xF0D6, 0x9E6D, 0xF0D8, 0x9E6E, 0xFB71, + 0x9E6F, 0xFB72, 0x9E70, 0xD3A5, 0x9E71, 0xF0D7, 0x9E72, 0xFB73, + 0x9E73, 0xF0D9, 0x9E74, 0xFB74, 0x9E75, 0xFB75, 0x9E76, 0xFB76, + 0x9E77, 0xFB77, 0x9E78, 0xFB78, 0x9E79, 0xFB79, 0x9E7A, 0xFB7A, + 0x9E7B, 0xFB7B, 0x9E7C, 0xFB7C, 0x9E7D, 0xFB7D, 0x9E7E, 0xF5BA, + 0x9E7F, 0xC2B9, 0x9E80, 0xFB7E, 0x9E81, 0xFB80, 0x9E82, 0xF7E4, + 0x9E83, 0xFB81, 0x9E84, 0xFB82, 0x9E85, 0xFB83, 0x9E86, 0xFB84, + 0x9E87, 0xF7E5, 0x9E88, 0xF7E6, 0x9E89, 0xFB85, 0x9E8A, 0xFB86, + 0x9E8B, 0xF7E7, 0x9E8C, 0xFB87, 0x9E8D, 0xFB88, 0x9E8E, 0xFB89, + 0x9E8F, 0xFB8A, 0x9E90, 0xFB8B, 0x9E91, 0xFB8C, 0x9E92, 0xF7E8, + 0x9E93, 0xC2B4, 0x9E94, 0xFB8D, 0x9E95, 0xFB8E, 0x9E96, 0xFB8F, + 0x9E97, 0xFB90, 0x9E98, 0xFB91, 0x9E99, 0xFB92, 0x9E9A, 0xFB93, + 0x9E9B, 0xFB94, 0x9E9C, 0xFB95, 0x9E9D, 0xF7EA, 0x9E9E, 0xFB96, + 0x9E9F, 0xF7EB, 0x9EA0, 0xFB97, 0x9EA1, 0xFB98, 0x9EA2, 0xFB99, + 0x9EA3, 0xFB9A, 0x9EA4, 0xFB9B, 0x9EA5, 0xFB9C, 0x9EA6, 0xC2F3, + 0x9EA7, 0xFB9D, 0x9EA8, 0xFB9E, 0x9EA9, 0xFB9F, 0x9EAA, 0xFBA0, + 0x9EAB, 0xFC40, 0x9EAC, 0xFC41, 0x9EAD, 0xFC42, 0x9EAE, 0xFC43, + 0x9EAF, 0xFC44, 0x9EB0, 0xFC45, 0x9EB1, 0xFC46, 0x9EB2, 0xFC47, + 0x9EB3, 0xFC48, 0x9EB4, 0xF4F0, 0x9EB5, 0xFC49, 0x9EB6, 0xFC4A, + 0x9EB7, 0xFC4B, 0x9EB8, 0xF4EF, 0x9EB9, 0xFC4C, 0x9EBA, 0xFC4D, + 0x9EBB, 0xC2E9, 0x9EBC, 0xFC4E, 0x9EBD, 0xF7E1, 0x9EBE, 0xF7E2, + 0x9EBF, 0xFC4F, 0x9EC0, 0xFC50, 0x9EC1, 0xFC51, 0x9EC2, 0xFC52, + 0x9EC3, 0xFC53, 0x9EC4, 0xBBC6, 0x9EC5, 0xFC54, 0x9EC6, 0xFC55, + 0x9EC7, 0xFC56, 0x9EC8, 0xFC57, 0x9EC9, 0xD9E4, 0x9ECA, 0xFC58, + 0x9ECB, 0xFC59, 0x9ECC, 0xFC5A, 0x9ECD, 0xCAF2, 0x9ECE, 0xC0E8, + 0x9ECF, 0xF0A4, 0x9ED0, 0xFC5B, 0x9ED1, 0xBADA, 0x9ED2, 0xFC5C, + 0x9ED3, 0xFC5D, 0x9ED4, 0xC7AD, 0x9ED5, 0xFC5E, 0x9ED6, 0xFC5F, + 0x9ED7, 0xFC60, 0x9ED8, 0xC4AC, 0x9ED9, 0xFC61, 0x9EDA, 0xFC62, + 0x9EDB, 0xF7EC, 0x9EDC, 0xF7ED, 0x9EDD, 0xF7EE, 0x9EDE, 0xFC63, + 0x9EDF, 0xF7F0, 0x9EE0, 0xF7EF, 0x9EE1, 0xFC64, 0x9EE2, 0xF7F1, + 0x9EE3, 0xFC65, 0x9EE4, 0xFC66, 0x9EE5, 0xF7F4, 0x9EE6, 0xFC67, + 0x9EE7, 0xF7F3, 0x9EE8, 0xFC68, 0x9EE9, 0xF7F2, 0x9EEA, 0xF7F5, + 0x9EEB, 0xFC69, 0x9EEC, 0xFC6A, 0x9EED, 0xFC6B, 0x9EEE, 0xFC6C, + 0x9EEF, 0xF7F6, 0x9EF0, 0xFC6D, 0x9EF1, 0xFC6E, 0x9EF2, 0xFC6F, + 0x9EF3, 0xFC70, 0x9EF4, 0xFC71, 0x9EF5, 0xFC72, 0x9EF6, 0xFC73, + 0x9EF7, 0xFC74, 0x9EF8, 0xFC75, 0x9EF9, 0xEDE9, 0x9EFA, 0xFC76, + 0x9EFB, 0xEDEA, 0x9EFC, 0xEDEB, 0x9EFD, 0xFC77, 0x9EFE, 0xF6BC, + 0x9EFF, 0xFC78, 0x9F00, 0xFC79, 0x9F01, 0xFC7A, 0x9F02, 0xFC7B, + 0x9F03, 0xFC7C, 0x9F04, 0xFC7D, 0x9F05, 0xFC7E, 0x9F06, 0xFC80, + 0x9F07, 0xFC81, 0x9F08, 0xFC82, 0x9F09, 0xFC83, 0x9F0A, 0xFC84, + 0x9F0B, 0xF6BD, 0x9F0C, 0xFC85, 0x9F0D, 0xF6BE, 0x9F0E, 0xB6A6, + 0x9F0F, 0xFC86, 0x9F10, 0xD8BE, 0x9F11, 0xFC87, 0x9F12, 0xFC88, + 0x9F13, 0xB9C4, 0x9F14, 0xFC89, 0x9F15, 0xFC8A, 0x9F16, 0xFC8B, + 0x9F17, 0xD8BB, 0x9F18, 0xFC8C, 0x9F19, 0xDCB1, 0x9F1A, 0xFC8D, + 0x9F1B, 0xFC8E, 0x9F1C, 0xFC8F, 0x9F1D, 0xFC90, 0x9F1E, 0xFC91, + 0x9F1F, 0xFC92, 0x9F20, 0xCAF3, 0x9F21, 0xFC93, 0x9F22, 0xF7F7, + 0x9F23, 0xFC94, 0x9F24, 0xFC95, 0x9F25, 0xFC96, 0x9F26, 0xFC97, + 0x9F27, 0xFC98, 0x9F28, 0xFC99, 0x9F29, 0xFC9A, 0x9F2A, 0xFC9B, + 0x9F2B, 0xFC9C, 0x9F2C, 0xF7F8, 0x9F2D, 0xFC9D, 0x9F2E, 0xFC9E, + 0x9F2F, 0xF7F9, 0x9F30, 0xFC9F, 0x9F31, 0xFCA0, 0x9F32, 0xFD40, + 0x9F33, 0xFD41, 0x9F34, 0xFD42, 0x9F35, 0xFD43, 0x9F36, 0xFD44, + 0x9F37, 0xF7FB, 0x9F38, 0xFD45, 0x9F39, 0xF7FA, 0x9F3A, 0xFD46, + 0x9F3B, 0xB1C7, 0x9F3C, 0xFD47, 0x9F3D, 0xF7FC, 0x9F3E, 0xF7FD, + 0x9F3F, 0xFD48, 0x9F40, 0xFD49, 0x9F41, 0xFD4A, 0x9F42, 0xFD4B, + 0x9F43, 0xFD4C, 0x9F44, 0xF7FE, 0x9F45, 0xFD4D, 0x9F46, 0xFD4E, + 0x9F47, 0xFD4F, 0x9F48, 0xFD50, 0x9F49, 0xFD51, 0x9F4A, 0xFD52, + 0x9F4B, 0xFD53, 0x9F4C, 0xFD54, 0x9F4D, 0xFD55, 0x9F4E, 0xFD56, + 0x9F4F, 0xFD57, 0x9F50, 0xC6EB, 0x9F51, 0xECB4, 0x9F52, 0xFD58, + 0x9F53, 0xFD59, 0x9F54, 0xFD5A, 0x9F55, 0xFD5B, 0x9F56, 0xFD5C, + 0x9F57, 0xFD5D, 0x9F58, 0xFD5E, 0x9F59, 0xFD5F, 0x9F5A, 0xFD60, + 0x9F5B, 0xFD61, 0x9F5C, 0xFD62, 0x9F5D, 0xFD63, 0x9F5E, 0xFD64, + 0x9F5F, 0xFD65, 0x9F60, 0xFD66, 0x9F61, 0xFD67, 0x9F62, 0xFD68, + 0x9F63, 0xFD69, 0x9F64, 0xFD6A, 0x9F65, 0xFD6B, 0x9F66, 0xFD6C, + 0x9F67, 0xFD6D, 0x9F68, 0xFD6E, 0x9F69, 0xFD6F, 0x9F6A, 0xFD70, + 0x9F6B, 0xFD71, 0x9F6C, 0xFD72, 0x9F6D, 0xFD73, 0x9F6E, 0xFD74, + 0x9F6F, 0xFD75, 0x9F70, 0xFD76, 0x9F71, 0xFD77, 0x9F72, 0xFD78, + 0x9F73, 0xFD79, 0x9F74, 0xFD7A, 0x9F75, 0xFD7B, 0x9F76, 0xFD7C, + 0x9F77, 0xFD7D, 0x9F78, 0xFD7E, 0x9F79, 0xFD80, 0x9F7A, 0xFD81, + 0x9F7B, 0xFD82, 0x9F7C, 0xFD83, 0x9F7D, 0xFD84, 0x9F7E, 0xFD85, + 0x9F7F, 0xB3DD, 0x9F80, 0xF6B3, 0x9F81, 0xFD86, 0x9F82, 0xFD87, + 0x9F83, 0xF6B4, 0x9F84, 0xC1E4, 0x9F85, 0xF6B5, 0x9F86, 0xF6B6, + 0x9F87, 0xF6B7, 0x9F88, 0xF6B8, 0x9F89, 0xF6B9, 0x9F8A, 0xF6BA, + 0x9F8B, 0xC8A3, 0x9F8C, 0xF6BB, 0x9F8D, 0xFD88, 0x9F8E, 0xFD89, + 0x9F8F, 0xFD8A, 0x9F90, 0xFD8B, 0x9F91, 0xFD8C, 0x9F92, 0xFD8D, + 0x9F93, 0xFD8E, 0x9F94, 0xFD8F, 0x9F95, 0xFD90, 0x9F96, 0xFD91, + 0x9F97, 0xFD92, 0x9F98, 0xFD93, 0x9F99, 0xC1FA, 0x9F9A, 0xB9A8, + 0x9F9B, 0xEDE8, 0x9F9C, 0xFD94, 0x9F9D, 0xFD95, 0x9F9E, 0xFD96, + 0x9F9F, 0xB9EA, 0x9FA0, 0xD9DF, 0x9FA1, 0xFD97, 0x9FA2, 0xFD98, + 0x9FA3, 0xFD99, 0x9FA4, 0xFD9A, 0x9FA5, 0xFD9B, 0xF92C, 0xFD9C, + 0xF979, 0xFD9D, 0xF995, 0xFD9E, 0xF9E7, 0xFD9F, 0xF9F1, 0xFDA0, + 0xFA0C, 0xFE40, 0xFA0D, 0xFE41, 0xFA0E, 0xFE42, 0xFA0F, 0xFE43, + 0xFA11, 0xFE44, 0xFA13, 0xFE45, 0xFA14, 0xFE46, 0xFA18, 0xFE47, + 0xFA1F, 0xFE48, 0xFA20, 0xFE49, 0xFA21, 0xFE4A, 0xFA23, 0xFE4B, + 0xFA24, 0xFE4C, 0xFA27, 0xFE4D, 0xFA28, 0xFE4E, 0xFA29, 0xFE4F, + 0xFE30, 0xA955, 0xFE31, 0xA6F2, 0xFE33, 0xA6F4, 0xFE34, 0xA6F5, + 0xFE35, 0xA6E0, 0xFE36, 0xA6E1, 0xFE37, 0xA6F0, 0xFE38, 0xA6F1, + 0xFE39, 0xA6E2, 0xFE3A, 0xA6E3, 0xFE3B, 0xA6EE, 0xFE3C, 0xA6EF, + 0xFE3D, 0xA6E6, 0xFE3E, 0xA6E7, 0xFE3F, 0xA6E4, 0xFE40, 0xA6E5, + 0xFE41, 0xA6E8, 0xFE42, 0xA6E9, 0xFE43, 0xA6EA, 0xFE44, 0xA6EB, + 0xFE49, 0xA968, 0xFE4A, 0xA969, 0xFE4B, 0xA96A, 0xFE4C, 0xA96B, + 0xFE4D, 0xA96C, 0xFE4E, 0xA96D, 0xFE4F, 0xA96E, 0xFE50, 0xA96F, + 0xFE51, 0xA970, 0xFE52, 0xA971, 0xFE54, 0xA972, 0xFE55, 0xA973, + 0xFE56, 0xA974, 0xFE57, 0xA975, 0xFE59, 0xA976, 0xFE5A, 0xA977, + 0xFE5B, 0xA978, 0xFE5C, 0xA979, 0xFE5D, 0xA97A, 0xFE5E, 0xA97B, + 0xFE5F, 0xA97C, 0xFE60, 0xA97D, 0xFE61, 0xA97E, 0xFE62, 0xA980, + 0xFE63, 0xA981, 0xFE64, 0xA982, 0xFE65, 0xA983, 0xFE66, 0xA984, + 0xFE68, 0xA985, 0xFE69, 0xA986, 0xFE6A, 0xA987, 0xFE6B, 0xA988, + 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA1E7, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, + 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, + 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, + 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, + 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, + 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, + 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, + 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA3DC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, + 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, + 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, + 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, + 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA1AB, 0xFFE0, 0xA1E9, 0xFFE1, 0xA1EA, + 0xFFE2, 0xA956, 0xFFE3, 0xA3FE, 0xFFE4, 0xA957, 0xFFE5, 0xA3A4, + 0, 0 +}; + +static +const WCHAR oem2uni[] = { +/* OEM - Unicode, OEM - Unicode, OEM - Unicode, OEM - Unicode */ + 0x0080, 0x20AC, 0x8140, 0x4E02, 0x8141, 0x4E04, 0x8142, 0x4E05, + 0x8143, 0x4E06, 0x8144, 0x4E0F, 0x8145, 0x4E12, 0x8146, 0x4E17, + 0x8147, 0x4E1F, 0x8148, 0x4E20, 0x8149, 0x4E21, 0x814A, 0x4E23, + 0x814B, 0x4E26, 0x814C, 0x4E29, 0x814D, 0x4E2E, 0x814E, 0x4E2F, + 0x814F, 0x4E31, 0x8150, 0x4E33, 0x8151, 0x4E35, 0x8152, 0x4E37, + 0x8153, 0x4E3C, 0x8154, 0x4E40, 0x8155, 0x4E41, 0x8156, 0x4E42, + 0x8157, 0x4E44, 0x8158, 0x4E46, 0x8159, 0x4E4A, 0x815A, 0x4E51, + 0x815B, 0x4E55, 0x815C, 0x4E57, 0x815D, 0x4E5A, 0x815E, 0x4E5B, + 0x815F, 0x4E62, 0x8160, 0x4E63, 0x8161, 0x4E64, 0x8162, 0x4E65, + 0x8163, 0x4E67, 0x8164, 0x4E68, 0x8165, 0x4E6A, 0x8166, 0x4E6B, + 0x8167, 0x4E6C, 0x8168, 0x4E6D, 0x8169, 0x4E6E, 0x816A, 0x4E6F, + 0x816B, 0x4E72, 0x816C, 0x4E74, 0x816D, 0x4E75, 0x816E, 0x4E76, + 0x816F, 0x4E77, 0x8170, 0x4E78, 0x8171, 0x4E79, 0x8172, 0x4E7A, + 0x8173, 0x4E7B, 0x8174, 0x4E7C, 0x8175, 0x4E7D, 0x8176, 0x4E7F, + 0x8177, 0x4E80, 0x8178, 0x4E81, 0x8179, 0x4E82, 0x817A, 0x4E83, + 0x817B, 0x4E84, 0x817C, 0x4E85, 0x817D, 0x4E87, 0x817E, 0x4E8A, + 0x8180, 0x4E90, 0x8181, 0x4E96, 0x8182, 0x4E97, 0x8183, 0x4E99, + 0x8184, 0x4E9C, 0x8185, 0x4E9D, 0x8186, 0x4E9E, 0x8187, 0x4EA3, + 0x8188, 0x4EAA, 0x8189, 0x4EAF, 0x818A, 0x4EB0, 0x818B, 0x4EB1, + 0x818C, 0x4EB4, 0x818D, 0x4EB6, 0x818E, 0x4EB7, 0x818F, 0x4EB8, + 0x8190, 0x4EB9, 0x8191, 0x4EBC, 0x8192, 0x4EBD, 0x8193, 0x4EBE, + 0x8194, 0x4EC8, 0x8195, 0x4ECC, 0x8196, 0x4ECF, 0x8197, 0x4ED0, + 0x8198, 0x4ED2, 0x8199, 0x4EDA, 0x819A, 0x4EDB, 0x819B, 0x4EDC, + 0x819C, 0x4EE0, 0x819D, 0x4EE2, 0x819E, 0x4EE6, 0x819F, 0x4EE7, + 0x81A0, 0x4EE9, 0x81A1, 0x4EED, 0x81A2, 0x4EEE, 0x81A3, 0x4EEF, + 0x81A4, 0x4EF1, 0x81A5, 0x4EF4, 0x81A6, 0x4EF8, 0x81A7, 0x4EF9, + 0x81A8, 0x4EFA, 0x81A9, 0x4EFC, 0x81AA, 0x4EFE, 0x81AB, 0x4F00, + 0x81AC, 0x4F02, 0x81AD, 0x4F03, 0x81AE, 0x4F04, 0x81AF, 0x4F05, + 0x81B0, 0x4F06, 0x81B1, 0x4F07, 0x81B2, 0x4F08, 0x81B3, 0x4F0B, + 0x81B4, 0x4F0C, 0x81B5, 0x4F12, 0x81B6, 0x4F13, 0x81B7, 0x4F14, + 0x81B8, 0x4F15, 0x81B9, 0x4F16, 0x81BA, 0x4F1C, 0x81BB, 0x4F1D, + 0x81BC, 0x4F21, 0x81BD, 0x4F23, 0x81BE, 0x4F28, 0x81BF, 0x4F29, + 0x81C0, 0x4F2C, 0x81C1, 0x4F2D, 0x81C2, 0x4F2E, 0x81C3, 0x4F31, + 0x81C4, 0x4F33, 0x81C5, 0x4F35, 0x81C6, 0x4F37, 0x81C7, 0x4F39, + 0x81C8, 0x4F3B, 0x81C9, 0x4F3E, 0x81CA, 0x4F3F, 0x81CB, 0x4F40, + 0x81CC, 0x4F41, 0x81CD, 0x4F42, 0x81CE, 0x4F44, 0x81CF, 0x4F45, + 0x81D0, 0x4F47, 0x81D1, 0x4F48, 0x81D2, 0x4F49, 0x81D3, 0x4F4A, + 0x81D4, 0x4F4B, 0x81D5, 0x4F4C, 0x81D6, 0x4F52, 0x81D7, 0x4F54, + 0x81D8, 0x4F56, 0x81D9, 0x4F61, 0x81DA, 0x4F62, 0x81DB, 0x4F66, + 0x81DC, 0x4F68, 0x81DD, 0x4F6A, 0x81DE, 0x4F6B, 0x81DF, 0x4F6D, + 0x81E0, 0x4F6E, 0x81E1, 0x4F71, 0x81E2, 0x4F72, 0x81E3, 0x4F75, + 0x81E4, 0x4F77, 0x81E5, 0x4F78, 0x81E6, 0x4F79, 0x81E7, 0x4F7A, + 0x81E8, 0x4F7D, 0x81E9, 0x4F80, 0x81EA, 0x4F81, 0x81EB, 0x4F82, + 0x81EC, 0x4F85, 0x81ED, 0x4F86, 0x81EE, 0x4F87, 0x81EF, 0x4F8A, + 0x81F0, 0x4F8C, 0x81F1, 0x4F8E, 0x81F2, 0x4F90, 0x81F3, 0x4F92, + 0x81F4, 0x4F93, 0x81F5, 0x4F95, 0x81F6, 0x4F96, 0x81F7, 0x4F98, + 0x81F8, 0x4F99, 0x81F9, 0x4F9A, 0x81FA, 0x4F9C, 0x81FB, 0x4F9E, + 0x81FC, 0x4F9F, 0x81FD, 0x4FA1, 0x81FE, 0x4FA2, 0x8240, 0x4FA4, + 0x8241, 0x4FAB, 0x8242, 0x4FAD, 0x8243, 0x4FB0, 0x8244, 0x4FB1, + 0x8245, 0x4FB2, 0x8246, 0x4FB3, 0x8247, 0x4FB4, 0x8248, 0x4FB6, + 0x8249, 0x4FB7, 0x824A, 0x4FB8, 0x824B, 0x4FB9, 0x824C, 0x4FBA, + 0x824D, 0x4FBB, 0x824E, 0x4FBC, 0x824F, 0x4FBD, 0x8250, 0x4FBE, + 0x8251, 0x4FC0, 0x8252, 0x4FC1, 0x8253, 0x4FC2, 0x8254, 0x4FC6, + 0x8255, 0x4FC7, 0x8256, 0x4FC8, 0x8257, 0x4FC9, 0x8258, 0x4FCB, + 0x8259, 0x4FCC, 0x825A, 0x4FCD, 0x825B, 0x4FD2, 0x825C, 0x4FD3, + 0x825D, 0x4FD4, 0x825E, 0x4FD5, 0x825F, 0x4FD6, 0x8260, 0x4FD9, + 0x8261, 0x4FDB, 0x8262, 0x4FE0, 0x8263, 0x4FE2, 0x8264, 0x4FE4, + 0x8265, 0x4FE5, 0x8266, 0x4FE7, 0x8267, 0x4FEB, 0x8268, 0x4FEC, + 0x8269, 0x4FF0, 0x826A, 0x4FF2, 0x826B, 0x4FF4, 0x826C, 0x4FF5, + 0x826D, 0x4FF6, 0x826E, 0x4FF7, 0x826F, 0x4FF9, 0x8270, 0x4FFB, + 0x8271, 0x4FFC, 0x8272, 0x4FFD, 0x8273, 0x4FFF, 0x8274, 0x5000, + 0x8275, 0x5001, 0x8276, 0x5002, 0x8277, 0x5003, 0x8278, 0x5004, + 0x8279, 0x5005, 0x827A, 0x5006, 0x827B, 0x5007, 0x827C, 0x5008, + 0x827D, 0x5009, 0x827E, 0x500A, 0x8280, 0x500B, 0x8281, 0x500E, + 0x8282, 0x5010, 0x8283, 0x5011, 0x8284, 0x5013, 0x8285, 0x5015, + 0x8286, 0x5016, 0x8287, 0x5017, 0x8288, 0x501B, 0x8289, 0x501D, + 0x828A, 0x501E, 0x828B, 0x5020, 0x828C, 0x5022, 0x828D, 0x5023, + 0x828E, 0x5024, 0x828F, 0x5027, 0x8290, 0x502B, 0x8291, 0x502F, + 0x8292, 0x5030, 0x8293, 0x5031, 0x8294, 0x5032, 0x8295, 0x5033, + 0x8296, 0x5034, 0x8297, 0x5035, 0x8298, 0x5036, 0x8299, 0x5037, + 0x829A, 0x5038, 0x829B, 0x5039, 0x829C, 0x503B, 0x829D, 0x503D, + 0x829E, 0x503F, 0x829F, 0x5040, 0x82A0, 0x5041, 0x82A1, 0x5042, + 0x82A2, 0x5044, 0x82A3, 0x5045, 0x82A4, 0x5046, 0x82A5, 0x5049, + 0x82A6, 0x504A, 0x82A7, 0x504B, 0x82A8, 0x504D, 0x82A9, 0x5050, + 0x82AA, 0x5051, 0x82AB, 0x5052, 0x82AC, 0x5053, 0x82AD, 0x5054, + 0x82AE, 0x5056, 0x82AF, 0x5057, 0x82B0, 0x5058, 0x82B1, 0x5059, + 0x82B2, 0x505B, 0x82B3, 0x505D, 0x82B4, 0x505E, 0x82B5, 0x505F, + 0x82B6, 0x5060, 0x82B7, 0x5061, 0x82B8, 0x5062, 0x82B9, 0x5063, + 0x82BA, 0x5064, 0x82BB, 0x5066, 0x82BC, 0x5067, 0x82BD, 0x5068, + 0x82BE, 0x5069, 0x82BF, 0x506A, 0x82C0, 0x506B, 0x82C1, 0x506D, + 0x82C2, 0x506E, 0x82C3, 0x506F, 0x82C4, 0x5070, 0x82C5, 0x5071, + 0x82C6, 0x5072, 0x82C7, 0x5073, 0x82C8, 0x5074, 0x82C9, 0x5075, + 0x82CA, 0x5078, 0x82CB, 0x5079, 0x82CC, 0x507A, 0x82CD, 0x507C, + 0x82CE, 0x507D, 0x82CF, 0x5081, 0x82D0, 0x5082, 0x82D1, 0x5083, + 0x82D2, 0x5084, 0x82D3, 0x5086, 0x82D4, 0x5087, 0x82D5, 0x5089, + 0x82D6, 0x508A, 0x82D7, 0x508B, 0x82D8, 0x508C, 0x82D9, 0x508E, + 0x82DA, 0x508F, 0x82DB, 0x5090, 0x82DC, 0x5091, 0x82DD, 0x5092, + 0x82DE, 0x5093, 0x82DF, 0x5094, 0x82E0, 0x5095, 0x82E1, 0x5096, + 0x82E2, 0x5097, 0x82E3, 0x5098, 0x82E4, 0x5099, 0x82E5, 0x509A, + 0x82E6, 0x509B, 0x82E7, 0x509C, 0x82E8, 0x509D, 0x82E9, 0x509E, + 0x82EA, 0x509F, 0x82EB, 0x50A0, 0x82EC, 0x50A1, 0x82ED, 0x50A2, + 0x82EE, 0x50A4, 0x82EF, 0x50A6, 0x82F0, 0x50AA, 0x82F1, 0x50AB, + 0x82F2, 0x50AD, 0x82F3, 0x50AE, 0x82F4, 0x50AF, 0x82F5, 0x50B0, + 0x82F6, 0x50B1, 0x82F7, 0x50B3, 0x82F8, 0x50B4, 0x82F9, 0x50B5, + 0x82FA, 0x50B6, 0x82FB, 0x50B7, 0x82FC, 0x50B8, 0x82FD, 0x50B9, + 0x82FE, 0x50BC, 0x8340, 0x50BD, 0x8341, 0x50BE, 0x8342, 0x50BF, + 0x8343, 0x50C0, 0x8344, 0x50C1, 0x8345, 0x50C2, 0x8346, 0x50C3, + 0x8347, 0x50C4, 0x8348, 0x50C5, 0x8349, 0x50C6, 0x834A, 0x50C7, + 0x834B, 0x50C8, 0x834C, 0x50C9, 0x834D, 0x50CA, 0x834E, 0x50CB, + 0x834F, 0x50CC, 0x8350, 0x50CD, 0x8351, 0x50CE, 0x8352, 0x50D0, + 0x8353, 0x50D1, 0x8354, 0x50D2, 0x8355, 0x50D3, 0x8356, 0x50D4, + 0x8357, 0x50D5, 0x8358, 0x50D7, 0x8359, 0x50D8, 0x835A, 0x50D9, + 0x835B, 0x50DB, 0x835C, 0x50DC, 0x835D, 0x50DD, 0x835E, 0x50DE, + 0x835F, 0x50DF, 0x8360, 0x50E0, 0x8361, 0x50E1, 0x8362, 0x50E2, + 0x8363, 0x50E3, 0x8364, 0x50E4, 0x8365, 0x50E5, 0x8366, 0x50E8, + 0x8367, 0x50E9, 0x8368, 0x50EA, 0x8369, 0x50EB, 0x836A, 0x50EF, + 0x836B, 0x50F0, 0x836C, 0x50F1, 0x836D, 0x50F2, 0x836E, 0x50F4, + 0x836F, 0x50F6, 0x8370, 0x50F7, 0x8371, 0x50F8, 0x8372, 0x50F9, + 0x8373, 0x50FA, 0x8374, 0x50FC, 0x8375, 0x50FD, 0x8376, 0x50FE, + 0x8377, 0x50FF, 0x8378, 0x5100, 0x8379, 0x5101, 0x837A, 0x5102, + 0x837B, 0x5103, 0x837C, 0x5104, 0x837D, 0x5105, 0x837E, 0x5108, + 0x8380, 0x5109, 0x8381, 0x510A, 0x8382, 0x510C, 0x8383, 0x510D, + 0x8384, 0x510E, 0x8385, 0x510F, 0x8386, 0x5110, 0x8387, 0x5111, + 0x8388, 0x5113, 0x8389, 0x5114, 0x838A, 0x5115, 0x838B, 0x5116, + 0x838C, 0x5117, 0x838D, 0x5118, 0x838E, 0x5119, 0x838F, 0x511A, + 0x8390, 0x511B, 0x8391, 0x511C, 0x8392, 0x511D, 0x8393, 0x511E, + 0x8394, 0x511F, 0x8395, 0x5120, 0x8396, 0x5122, 0x8397, 0x5123, + 0x8398, 0x5124, 0x8399, 0x5125, 0x839A, 0x5126, 0x839B, 0x5127, + 0x839C, 0x5128, 0x839D, 0x5129, 0x839E, 0x512A, 0x839F, 0x512B, + 0x83A0, 0x512C, 0x83A1, 0x512D, 0x83A2, 0x512E, 0x83A3, 0x512F, + 0x83A4, 0x5130, 0x83A5, 0x5131, 0x83A6, 0x5132, 0x83A7, 0x5133, + 0x83A8, 0x5134, 0x83A9, 0x5135, 0x83AA, 0x5136, 0x83AB, 0x5137, + 0x83AC, 0x5138, 0x83AD, 0x5139, 0x83AE, 0x513A, 0x83AF, 0x513B, + 0x83B0, 0x513C, 0x83B1, 0x513D, 0x83B2, 0x513E, 0x83B3, 0x5142, + 0x83B4, 0x5147, 0x83B5, 0x514A, 0x83B6, 0x514C, 0x83B7, 0x514E, + 0x83B8, 0x514F, 0x83B9, 0x5150, 0x83BA, 0x5152, 0x83BB, 0x5153, + 0x83BC, 0x5157, 0x83BD, 0x5158, 0x83BE, 0x5159, 0x83BF, 0x515B, + 0x83C0, 0x515D, 0x83C1, 0x515E, 0x83C2, 0x515F, 0x83C3, 0x5160, + 0x83C4, 0x5161, 0x83C5, 0x5163, 0x83C6, 0x5164, 0x83C7, 0x5166, + 0x83C8, 0x5167, 0x83C9, 0x5169, 0x83CA, 0x516A, 0x83CB, 0x516F, + 0x83CC, 0x5172, 0x83CD, 0x517A, 0x83CE, 0x517E, 0x83CF, 0x517F, + 0x83D0, 0x5183, 0x83D1, 0x5184, 0x83D2, 0x5186, 0x83D3, 0x5187, + 0x83D4, 0x518A, 0x83D5, 0x518B, 0x83D6, 0x518E, 0x83D7, 0x518F, + 0x83D8, 0x5190, 0x83D9, 0x5191, 0x83DA, 0x5193, 0x83DB, 0x5194, + 0x83DC, 0x5198, 0x83DD, 0x519A, 0x83DE, 0x519D, 0x83DF, 0x519E, + 0x83E0, 0x519F, 0x83E1, 0x51A1, 0x83E2, 0x51A3, 0x83E3, 0x51A6, + 0x83E4, 0x51A7, 0x83E5, 0x51A8, 0x83E6, 0x51A9, 0x83E7, 0x51AA, + 0x83E8, 0x51AD, 0x83E9, 0x51AE, 0x83EA, 0x51B4, 0x83EB, 0x51B8, + 0x83EC, 0x51B9, 0x83ED, 0x51BA, 0x83EE, 0x51BE, 0x83EF, 0x51BF, + 0x83F0, 0x51C1, 0x83F1, 0x51C2, 0x83F2, 0x51C3, 0x83F3, 0x51C5, + 0x83F4, 0x51C8, 0x83F5, 0x51CA, 0x83F6, 0x51CD, 0x83F7, 0x51CE, + 0x83F8, 0x51D0, 0x83F9, 0x51D2, 0x83FA, 0x51D3, 0x83FB, 0x51D4, + 0x83FC, 0x51D5, 0x83FD, 0x51D6, 0x83FE, 0x51D7, 0x8440, 0x51D8, + 0x8441, 0x51D9, 0x8442, 0x51DA, 0x8443, 0x51DC, 0x8444, 0x51DE, + 0x8445, 0x51DF, 0x8446, 0x51E2, 0x8447, 0x51E3, 0x8448, 0x51E5, + 0x8449, 0x51E6, 0x844A, 0x51E7, 0x844B, 0x51E8, 0x844C, 0x51E9, + 0x844D, 0x51EA, 0x844E, 0x51EC, 0x844F, 0x51EE, 0x8450, 0x51F1, + 0x8451, 0x51F2, 0x8452, 0x51F4, 0x8453, 0x51F7, 0x8454, 0x51FE, + 0x8455, 0x5204, 0x8456, 0x5205, 0x8457, 0x5209, 0x8458, 0x520B, + 0x8459, 0x520C, 0x845A, 0x520F, 0x845B, 0x5210, 0x845C, 0x5213, + 0x845D, 0x5214, 0x845E, 0x5215, 0x845F, 0x521C, 0x8460, 0x521E, + 0x8461, 0x521F, 0x8462, 0x5221, 0x8463, 0x5222, 0x8464, 0x5223, + 0x8465, 0x5225, 0x8466, 0x5226, 0x8467, 0x5227, 0x8468, 0x522A, + 0x8469, 0x522C, 0x846A, 0x522F, 0x846B, 0x5231, 0x846C, 0x5232, + 0x846D, 0x5234, 0x846E, 0x5235, 0x846F, 0x523C, 0x8470, 0x523E, + 0x8471, 0x5244, 0x8472, 0x5245, 0x8473, 0x5246, 0x8474, 0x5247, + 0x8475, 0x5248, 0x8476, 0x5249, 0x8477, 0x524B, 0x8478, 0x524E, + 0x8479, 0x524F, 0x847A, 0x5252, 0x847B, 0x5253, 0x847C, 0x5255, + 0x847D, 0x5257, 0x847E, 0x5258, 0x8480, 0x5259, 0x8481, 0x525A, + 0x8482, 0x525B, 0x8483, 0x525D, 0x8484, 0x525F, 0x8485, 0x5260, + 0x8486, 0x5262, 0x8487, 0x5263, 0x8488, 0x5264, 0x8489, 0x5266, + 0x848A, 0x5268, 0x848B, 0x526B, 0x848C, 0x526C, 0x848D, 0x526D, + 0x848E, 0x526E, 0x848F, 0x5270, 0x8490, 0x5271, 0x8491, 0x5273, + 0x8492, 0x5274, 0x8493, 0x5275, 0x8494, 0x5276, 0x8495, 0x5277, + 0x8496, 0x5278, 0x8497, 0x5279, 0x8498, 0x527A, 0x8499, 0x527B, + 0x849A, 0x527C, 0x849B, 0x527E, 0x849C, 0x5280, 0x849D, 0x5283, + 0x849E, 0x5284, 0x849F, 0x5285, 0x84A0, 0x5286, 0x84A1, 0x5287, + 0x84A2, 0x5289, 0x84A3, 0x528A, 0x84A4, 0x528B, 0x84A5, 0x528C, + 0x84A6, 0x528D, 0x84A7, 0x528E, 0x84A8, 0x528F, 0x84A9, 0x5291, + 0x84AA, 0x5292, 0x84AB, 0x5294, 0x84AC, 0x5295, 0x84AD, 0x5296, + 0x84AE, 0x5297, 0x84AF, 0x5298, 0x84B0, 0x5299, 0x84B1, 0x529A, + 0x84B2, 0x529C, 0x84B3, 0x52A4, 0x84B4, 0x52A5, 0x84B5, 0x52A6, + 0x84B6, 0x52A7, 0x84B7, 0x52AE, 0x84B8, 0x52AF, 0x84B9, 0x52B0, + 0x84BA, 0x52B4, 0x84BB, 0x52B5, 0x84BC, 0x52B6, 0x84BD, 0x52B7, + 0x84BE, 0x52B8, 0x84BF, 0x52B9, 0x84C0, 0x52BA, 0x84C1, 0x52BB, + 0x84C2, 0x52BC, 0x84C3, 0x52BD, 0x84C4, 0x52C0, 0x84C5, 0x52C1, + 0x84C6, 0x52C2, 0x84C7, 0x52C4, 0x84C8, 0x52C5, 0x84C9, 0x52C6, + 0x84CA, 0x52C8, 0x84CB, 0x52CA, 0x84CC, 0x52CC, 0x84CD, 0x52CD, + 0x84CE, 0x52CE, 0x84CF, 0x52CF, 0x84D0, 0x52D1, 0x84D1, 0x52D3, + 0x84D2, 0x52D4, 0x84D3, 0x52D5, 0x84D4, 0x52D7, 0x84D5, 0x52D9, + 0x84D6, 0x52DA, 0x84D7, 0x52DB, 0x84D8, 0x52DC, 0x84D9, 0x52DD, + 0x84DA, 0x52DE, 0x84DB, 0x52E0, 0x84DC, 0x52E1, 0x84DD, 0x52E2, + 0x84DE, 0x52E3, 0x84DF, 0x52E5, 0x84E0, 0x52E6, 0x84E1, 0x52E7, + 0x84E2, 0x52E8, 0x84E3, 0x52E9, 0x84E4, 0x52EA, 0x84E5, 0x52EB, + 0x84E6, 0x52EC, 0x84E7, 0x52ED, 0x84E8, 0x52EE, 0x84E9, 0x52EF, + 0x84EA, 0x52F1, 0x84EB, 0x52F2, 0x84EC, 0x52F3, 0x84ED, 0x52F4, + 0x84EE, 0x52F5, 0x84EF, 0x52F6, 0x84F0, 0x52F7, 0x84F1, 0x52F8, + 0x84F2, 0x52FB, 0x84F3, 0x52FC, 0x84F4, 0x52FD, 0x84F5, 0x5301, + 0x84F6, 0x5302, 0x84F7, 0x5303, 0x84F8, 0x5304, 0x84F9, 0x5307, + 0x84FA, 0x5309, 0x84FB, 0x530A, 0x84FC, 0x530B, 0x84FD, 0x530C, + 0x84FE, 0x530E, 0x8540, 0x5311, 0x8541, 0x5312, 0x8542, 0x5313, + 0x8543, 0x5314, 0x8544, 0x5318, 0x8545, 0x531B, 0x8546, 0x531C, + 0x8547, 0x531E, 0x8548, 0x531F, 0x8549, 0x5322, 0x854A, 0x5324, + 0x854B, 0x5325, 0x854C, 0x5327, 0x854D, 0x5328, 0x854E, 0x5329, + 0x854F, 0x532B, 0x8550, 0x532C, 0x8551, 0x532D, 0x8552, 0x532F, + 0x8553, 0x5330, 0x8554, 0x5331, 0x8555, 0x5332, 0x8556, 0x5333, + 0x8557, 0x5334, 0x8558, 0x5335, 0x8559, 0x5336, 0x855A, 0x5337, + 0x855B, 0x5338, 0x855C, 0x533C, 0x855D, 0x533D, 0x855E, 0x5340, + 0x855F, 0x5342, 0x8560, 0x5344, 0x8561, 0x5346, 0x8562, 0x534B, + 0x8563, 0x534C, 0x8564, 0x534D, 0x8565, 0x5350, 0x8566, 0x5354, + 0x8567, 0x5358, 0x8568, 0x5359, 0x8569, 0x535B, 0x856A, 0x535D, + 0x856B, 0x5365, 0x856C, 0x5368, 0x856D, 0x536A, 0x856E, 0x536C, + 0x856F, 0x536D, 0x8570, 0x5372, 0x8571, 0x5376, 0x8572, 0x5379, + 0x8573, 0x537B, 0x8574, 0x537C, 0x8575, 0x537D, 0x8576, 0x537E, + 0x8577, 0x5380, 0x8578, 0x5381, 0x8579, 0x5383, 0x857A, 0x5387, + 0x857B, 0x5388, 0x857C, 0x538A, 0x857D, 0x538E, 0x857E, 0x538F, + 0x8580, 0x5390, 0x8581, 0x5391, 0x8582, 0x5392, 0x8583, 0x5393, + 0x8584, 0x5394, 0x8585, 0x5396, 0x8586, 0x5397, 0x8587, 0x5399, + 0x8588, 0x539B, 0x8589, 0x539C, 0x858A, 0x539E, 0x858B, 0x53A0, + 0x858C, 0x53A1, 0x858D, 0x53A4, 0x858E, 0x53A7, 0x858F, 0x53AA, + 0x8590, 0x53AB, 0x8591, 0x53AC, 0x8592, 0x53AD, 0x8593, 0x53AF, + 0x8594, 0x53B0, 0x8595, 0x53B1, 0x8596, 0x53B2, 0x8597, 0x53B3, + 0x8598, 0x53B4, 0x8599, 0x53B5, 0x859A, 0x53B7, 0x859B, 0x53B8, + 0x859C, 0x53B9, 0x859D, 0x53BA, 0x859E, 0x53BC, 0x859F, 0x53BD, + 0x85A0, 0x53BE, 0x85A1, 0x53C0, 0x85A2, 0x53C3, 0x85A3, 0x53C4, + 0x85A4, 0x53C5, 0x85A5, 0x53C6, 0x85A6, 0x53C7, 0x85A7, 0x53CE, + 0x85A8, 0x53CF, 0x85A9, 0x53D0, 0x85AA, 0x53D2, 0x85AB, 0x53D3, + 0x85AC, 0x53D5, 0x85AD, 0x53DA, 0x85AE, 0x53DC, 0x85AF, 0x53DD, + 0x85B0, 0x53DE, 0x85B1, 0x53E1, 0x85B2, 0x53E2, 0x85B3, 0x53E7, + 0x85B4, 0x53F4, 0x85B5, 0x53FA, 0x85B6, 0x53FE, 0x85B7, 0x53FF, + 0x85B8, 0x5400, 0x85B9, 0x5402, 0x85BA, 0x5405, 0x85BB, 0x5407, + 0x85BC, 0x540B, 0x85BD, 0x5414, 0x85BE, 0x5418, 0x85BF, 0x5419, + 0x85C0, 0x541A, 0x85C1, 0x541C, 0x85C2, 0x5422, 0x85C3, 0x5424, + 0x85C4, 0x5425, 0x85C5, 0x542A, 0x85C6, 0x5430, 0x85C7, 0x5433, + 0x85C8, 0x5436, 0x85C9, 0x5437, 0x85CA, 0x543A, 0x85CB, 0x543D, + 0x85CC, 0x543F, 0x85CD, 0x5441, 0x85CE, 0x5442, 0x85CF, 0x5444, + 0x85D0, 0x5445, 0x85D1, 0x5447, 0x85D2, 0x5449, 0x85D3, 0x544C, + 0x85D4, 0x544D, 0x85D5, 0x544E, 0x85D6, 0x544F, 0x85D7, 0x5451, + 0x85D8, 0x545A, 0x85D9, 0x545D, 0x85DA, 0x545E, 0x85DB, 0x545F, + 0x85DC, 0x5460, 0x85DD, 0x5461, 0x85DE, 0x5463, 0x85DF, 0x5465, + 0x85E0, 0x5467, 0x85E1, 0x5469, 0x85E2, 0x546A, 0x85E3, 0x546B, + 0x85E4, 0x546C, 0x85E5, 0x546D, 0x85E6, 0x546E, 0x85E7, 0x546F, + 0x85E8, 0x5470, 0x85E9, 0x5474, 0x85EA, 0x5479, 0x85EB, 0x547A, + 0x85EC, 0x547E, 0x85ED, 0x547F, 0x85EE, 0x5481, 0x85EF, 0x5483, + 0x85F0, 0x5485, 0x85F1, 0x5487, 0x85F2, 0x5488, 0x85F3, 0x5489, + 0x85F4, 0x548A, 0x85F5, 0x548D, 0x85F6, 0x5491, 0x85F7, 0x5493, + 0x85F8, 0x5497, 0x85F9, 0x5498, 0x85FA, 0x549C, 0x85FB, 0x549E, + 0x85FC, 0x549F, 0x85FD, 0x54A0, 0x85FE, 0x54A1, 0x8640, 0x54A2, + 0x8641, 0x54A5, 0x8642, 0x54AE, 0x8643, 0x54B0, 0x8644, 0x54B2, + 0x8645, 0x54B5, 0x8646, 0x54B6, 0x8647, 0x54B7, 0x8648, 0x54B9, + 0x8649, 0x54BA, 0x864A, 0x54BC, 0x864B, 0x54BE, 0x864C, 0x54C3, + 0x864D, 0x54C5, 0x864E, 0x54CA, 0x864F, 0x54CB, 0x8650, 0x54D6, + 0x8651, 0x54D8, 0x8652, 0x54DB, 0x8653, 0x54E0, 0x8654, 0x54E1, + 0x8655, 0x54E2, 0x8656, 0x54E3, 0x8657, 0x54E4, 0x8658, 0x54EB, + 0x8659, 0x54EC, 0x865A, 0x54EF, 0x865B, 0x54F0, 0x865C, 0x54F1, + 0x865D, 0x54F4, 0x865E, 0x54F5, 0x865F, 0x54F6, 0x8660, 0x54F7, + 0x8661, 0x54F8, 0x8662, 0x54F9, 0x8663, 0x54FB, 0x8664, 0x54FE, + 0x8665, 0x5500, 0x8666, 0x5502, 0x8667, 0x5503, 0x8668, 0x5504, + 0x8669, 0x5505, 0x866A, 0x5508, 0x866B, 0x550A, 0x866C, 0x550B, + 0x866D, 0x550C, 0x866E, 0x550D, 0x866F, 0x550E, 0x8670, 0x5512, + 0x8671, 0x5513, 0x8672, 0x5515, 0x8673, 0x5516, 0x8674, 0x5517, + 0x8675, 0x5518, 0x8676, 0x5519, 0x8677, 0x551A, 0x8678, 0x551C, + 0x8679, 0x551D, 0x867A, 0x551E, 0x867B, 0x551F, 0x867C, 0x5521, + 0x867D, 0x5525, 0x867E, 0x5526, 0x8680, 0x5528, 0x8681, 0x5529, + 0x8682, 0x552B, 0x8683, 0x552D, 0x8684, 0x5532, 0x8685, 0x5534, + 0x8686, 0x5535, 0x8687, 0x5536, 0x8688, 0x5538, 0x8689, 0x5539, + 0x868A, 0x553A, 0x868B, 0x553B, 0x868C, 0x553D, 0x868D, 0x5540, + 0x868E, 0x5542, 0x868F, 0x5545, 0x8690, 0x5547, 0x8691, 0x5548, + 0x8692, 0x554B, 0x8693, 0x554C, 0x8694, 0x554D, 0x8695, 0x554E, + 0x8696, 0x554F, 0x8697, 0x5551, 0x8698, 0x5552, 0x8699, 0x5553, + 0x869A, 0x5554, 0x869B, 0x5557, 0x869C, 0x5558, 0x869D, 0x5559, + 0x869E, 0x555A, 0x869F, 0x555B, 0x86A0, 0x555D, 0x86A1, 0x555E, + 0x86A2, 0x555F, 0x86A3, 0x5560, 0x86A4, 0x5562, 0x86A5, 0x5563, + 0x86A6, 0x5568, 0x86A7, 0x5569, 0x86A8, 0x556B, 0x86A9, 0x556F, + 0x86AA, 0x5570, 0x86AB, 0x5571, 0x86AC, 0x5572, 0x86AD, 0x5573, + 0x86AE, 0x5574, 0x86AF, 0x5579, 0x86B0, 0x557A, 0x86B1, 0x557D, + 0x86B2, 0x557F, 0x86B3, 0x5585, 0x86B4, 0x5586, 0x86B5, 0x558C, + 0x86B6, 0x558D, 0x86B7, 0x558E, 0x86B8, 0x5590, 0x86B9, 0x5592, + 0x86BA, 0x5593, 0x86BB, 0x5595, 0x86BC, 0x5596, 0x86BD, 0x5597, + 0x86BE, 0x559A, 0x86BF, 0x559B, 0x86C0, 0x559E, 0x86C1, 0x55A0, + 0x86C2, 0x55A1, 0x86C3, 0x55A2, 0x86C4, 0x55A3, 0x86C5, 0x55A4, + 0x86C6, 0x55A5, 0x86C7, 0x55A6, 0x86C8, 0x55A8, 0x86C9, 0x55A9, + 0x86CA, 0x55AA, 0x86CB, 0x55AB, 0x86CC, 0x55AC, 0x86CD, 0x55AD, + 0x86CE, 0x55AE, 0x86CF, 0x55AF, 0x86D0, 0x55B0, 0x86D1, 0x55B2, + 0x86D2, 0x55B4, 0x86D3, 0x55B6, 0x86D4, 0x55B8, 0x86D5, 0x55BA, + 0x86D6, 0x55BC, 0x86D7, 0x55BF, 0x86D8, 0x55C0, 0x86D9, 0x55C1, + 0x86DA, 0x55C2, 0x86DB, 0x55C3, 0x86DC, 0x55C6, 0x86DD, 0x55C7, + 0x86DE, 0x55C8, 0x86DF, 0x55CA, 0x86E0, 0x55CB, 0x86E1, 0x55CE, + 0x86E2, 0x55CF, 0x86E3, 0x55D0, 0x86E4, 0x55D5, 0x86E5, 0x55D7, + 0x86E6, 0x55D8, 0x86E7, 0x55D9, 0x86E8, 0x55DA, 0x86E9, 0x55DB, + 0x86EA, 0x55DE, 0x86EB, 0x55E0, 0x86EC, 0x55E2, 0x86ED, 0x55E7, + 0x86EE, 0x55E9, 0x86EF, 0x55ED, 0x86F0, 0x55EE, 0x86F1, 0x55F0, + 0x86F2, 0x55F1, 0x86F3, 0x55F4, 0x86F4, 0x55F6, 0x86F5, 0x55F8, + 0x86F6, 0x55F9, 0x86F7, 0x55FA, 0x86F8, 0x55FB, 0x86F9, 0x55FC, + 0x86FA, 0x55FF, 0x86FB, 0x5602, 0x86FC, 0x5603, 0x86FD, 0x5604, + 0x86FE, 0x5605, 0x8740, 0x5606, 0x8741, 0x5607, 0x8742, 0x560A, + 0x8743, 0x560B, 0x8744, 0x560D, 0x8745, 0x5610, 0x8746, 0x5611, + 0x8747, 0x5612, 0x8748, 0x5613, 0x8749, 0x5614, 0x874A, 0x5615, + 0x874B, 0x5616, 0x874C, 0x5617, 0x874D, 0x5619, 0x874E, 0x561A, + 0x874F, 0x561C, 0x8750, 0x561D, 0x8751, 0x5620, 0x8752, 0x5621, + 0x8753, 0x5622, 0x8754, 0x5625, 0x8755, 0x5626, 0x8756, 0x5628, + 0x8757, 0x5629, 0x8758, 0x562A, 0x8759, 0x562B, 0x875A, 0x562E, + 0x875B, 0x562F, 0x875C, 0x5630, 0x875D, 0x5633, 0x875E, 0x5635, + 0x875F, 0x5637, 0x8760, 0x5638, 0x8761, 0x563A, 0x8762, 0x563C, + 0x8763, 0x563D, 0x8764, 0x563E, 0x8765, 0x5640, 0x8766, 0x5641, + 0x8767, 0x5642, 0x8768, 0x5643, 0x8769, 0x5644, 0x876A, 0x5645, + 0x876B, 0x5646, 0x876C, 0x5647, 0x876D, 0x5648, 0x876E, 0x5649, + 0x876F, 0x564A, 0x8770, 0x564B, 0x8771, 0x564F, 0x8772, 0x5650, + 0x8773, 0x5651, 0x8774, 0x5652, 0x8775, 0x5653, 0x8776, 0x5655, + 0x8777, 0x5656, 0x8778, 0x565A, 0x8779, 0x565B, 0x877A, 0x565D, + 0x877B, 0x565E, 0x877C, 0x565F, 0x877D, 0x5660, 0x877E, 0x5661, + 0x8780, 0x5663, 0x8781, 0x5665, 0x8782, 0x5666, 0x8783, 0x5667, + 0x8784, 0x566D, 0x8785, 0x566E, 0x8786, 0x566F, 0x8787, 0x5670, + 0x8788, 0x5672, 0x8789, 0x5673, 0x878A, 0x5674, 0x878B, 0x5675, + 0x878C, 0x5677, 0x878D, 0x5678, 0x878E, 0x5679, 0x878F, 0x567A, + 0x8790, 0x567D, 0x8791, 0x567E, 0x8792, 0x567F, 0x8793, 0x5680, + 0x8794, 0x5681, 0x8795, 0x5682, 0x8796, 0x5683, 0x8797, 0x5684, + 0x8798, 0x5687, 0x8799, 0x5688, 0x879A, 0x5689, 0x879B, 0x568A, + 0x879C, 0x568B, 0x879D, 0x568C, 0x879E, 0x568D, 0x879F, 0x5690, + 0x87A0, 0x5691, 0x87A1, 0x5692, 0x87A2, 0x5694, 0x87A3, 0x5695, + 0x87A4, 0x5696, 0x87A5, 0x5697, 0x87A6, 0x5698, 0x87A7, 0x5699, + 0x87A8, 0x569A, 0x87A9, 0x569B, 0x87AA, 0x569C, 0x87AB, 0x569D, + 0x87AC, 0x569E, 0x87AD, 0x569F, 0x87AE, 0x56A0, 0x87AF, 0x56A1, + 0x87B0, 0x56A2, 0x87B1, 0x56A4, 0x87B2, 0x56A5, 0x87B3, 0x56A6, + 0x87B4, 0x56A7, 0x87B5, 0x56A8, 0x87B6, 0x56A9, 0x87B7, 0x56AA, + 0x87B8, 0x56AB, 0x87B9, 0x56AC, 0x87BA, 0x56AD, 0x87BB, 0x56AE, + 0x87BC, 0x56B0, 0x87BD, 0x56B1, 0x87BE, 0x56B2, 0x87BF, 0x56B3, + 0x87C0, 0x56B4, 0x87C1, 0x56B5, 0x87C2, 0x56B6, 0x87C3, 0x56B8, + 0x87C4, 0x56B9, 0x87C5, 0x56BA, 0x87C6, 0x56BB, 0x87C7, 0x56BD, + 0x87C8, 0x56BE, 0x87C9, 0x56BF, 0x87CA, 0x56C0, 0x87CB, 0x56C1, + 0x87CC, 0x56C2, 0x87CD, 0x56C3, 0x87CE, 0x56C4, 0x87CF, 0x56C5, + 0x87D0, 0x56C6, 0x87D1, 0x56C7, 0x87D2, 0x56C8, 0x87D3, 0x56C9, + 0x87D4, 0x56CB, 0x87D5, 0x56CC, 0x87D6, 0x56CD, 0x87D7, 0x56CE, + 0x87D8, 0x56CF, 0x87D9, 0x56D0, 0x87DA, 0x56D1, 0x87DB, 0x56D2, + 0x87DC, 0x56D3, 0x87DD, 0x56D5, 0x87DE, 0x56D6, 0x87DF, 0x56D8, + 0x87E0, 0x56D9, 0x87E1, 0x56DC, 0x87E2, 0x56E3, 0x87E3, 0x56E5, + 0x87E4, 0x56E6, 0x87E5, 0x56E7, 0x87E6, 0x56E8, 0x87E7, 0x56E9, + 0x87E8, 0x56EA, 0x87E9, 0x56EC, 0x87EA, 0x56EE, 0x87EB, 0x56EF, + 0x87EC, 0x56F2, 0x87ED, 0x56F3, 0x87EE, 0x56F6, 0x87EF, 0x56F7, + 0x87F0, 0x56F8, 0x87F1, 0x56FB, 0x87F2, 0x56FC, 0x87F3, 0x5700, + 0x87F4, 0x5701, 0x87F5, 0x5702, 0x87F6, 0x5705, 0x87F7, 0x5707, + 0x87F8, 0x570B, 0x87F9, 0x570C, 0x87FA, 0x570D, 0x87FB, 0x570E, + 0x87FC, 0x570F, 0x87FD, 0x5710, 0x87FE, 0x5711, 0x8840, 0x5712, + 0x8841, 0x5713, 0x8842, 0x5714, 0x8843, 0x5715, 0x8844, 0x5716, + 0x8845, 0x5717, 0x8846, 0x5718, 0x8847, 0x5719, 0x8848, 0x571A, + 0x8849, 0x571B, 0x884A, 0x571D, 0x884B, 0x571E, 0x884C, 0x5720, + 0x884D, 0x5721, 0x884E, 0x5722, 0x884F, 0x5724, 0x8850, 0x5725, + 0x8851, 0x5726, 0x8852, 0x5727, 0x8853, 0x572B, 0x8854, 0x5731, + 0x8855, 0x5732, 0x8856, 0x5734, 0x8857, 0x5735, 0x8858, 0x5736, + 0x8859, 0x5737, 0x885A, 0x5738, 0x885B, 0x573C, 0x885C, 0x573D, + 0x885D, 0x573F, 0x885E, 0x5741, 0x885F, 0x5743, 0x8860, 0x5744, + 0x8861, 0x5745, 0x8862, 0x5746, 0x8863, 0x5748, 0x8864, 0x5749, + 0x8865, 0x574B, 0x8866, 0x5752, 0x8867, 0x5753, 0x8868, 0x5754, + 0x8869, 0x5755, 0x886A, 0x5756, 0x886B, 0x5758, 0x886C, 0x5759, + 0x886D, 0x5762, 0x886E, 0x5763, 0x886F, 0x5765, 0x8870, 0x5767, + 0x8871, 0x576C, 0x8872, 0x576E, 0x8873, 0x5770, 0x8874, 0x5771, + 0x8875, 0x5772, 0x8876, 0x5774, 0x8877, 0x5775, 0x8878, 0x5778, + 0x8879, 0x5779, 0x887A, 0x577A, 0x887B, 0x577D, 0x887C, 0x577E, + 0x887D, 0x577F, 0x887E, 0x5780, 0x8880, 0x5781, 0x8881, 0x5787, + 0x8882, 0x5788, 0x8883, 0x5789, 0x8884, 0x578A, 0x8885, 0x578D, + 0x8886, 0x578E, 0x8887, 0x578F, 0x8888, 0x5790, 0x8889, 0x5791, + 0x888A, 0x5794, 0x888B, 0x5795, 0x888C, 0x5796, 0x888D, 0x5797, + 0x888E, 0x5798, 0x888F, 0x5799, 0x8890, 0x579A, 0x8891, 0x579C, + 0x8892, 0x579D, 0x8893, 0x579E, 0x8894, 0x579F, 0x8895, 0x57A5, + 0x8896, 0x57A8, 0x8897, 0x57AA, 0x8898, 0x57AC, 0x8899, 0x57AF, + 0x889A, 0x57B0, 0x889B, 0x57B1, 0x889C, 0x57B3, 0x889D, 0x57B5, + 0x889E, 0x57B6, 0x889F, 0x57B7, 0x88A0, 0x57B9, 0x88A1, 0x57BA, + 0x88A2, 0x57BB, 0x88A3, 0x57BC, 0x88A4, 0x57BD, 0x88A5, 0x57BE, + 0x88A6, 0x57BF, 0x88A7, 0x57C0, 0x88A8, 0x57C1, 0x88A9, 0x57C4, + 0x88AA, 0x57C5, 0x88AB, 0x57C6, 0x88AC, 0x57C7, 0x88AD, 0x57C8, + 0x88AE, 0x57C9, 0x88AF, 0x57CA, 0x88B0, 0x57CC, 0x88B1, 0x57CD, + 0x88B2, 0x57D0, 0x88B3, 0x57D1, 0x88B4, 0x57D3, 0x88B5, 0x57D6, + 0x88B6, 0x57D7, 0x88B7, 0x57DB, 0x88B8, 0x57DC, 0x88B9, 0x57DE, + 0x88BA, 0x57E1, 0x88BB, 0x57E2, 0x88BC, 0x57E3, 0x88BD, 0x57E5, + 0x88BE, 0x57E6, 0x88BF, 0x57E7, 0x88C0, 0x57E8, 0x88C1, 0x57E9, + 0x88C2, 0x57EA, 0x88C3, 0x57EB, 0x88C4, 0x57EC, 0x88C5, 0x57EE, + 0x88C6, 0x57F0, 0x88C7, 0x57F1, 0x88C8, 0x57F2, 0x88C9, 0x57F3, + 0x88CA, 0x57F5, 0x88CB, 0x57F6, 0x88CC, 0x57F7, 0x88CD, 0x57FB, + 0x88CE, 0x57FC, 0x88CF, 0x57FE, 0x88D0, 0x57FF, 0x88D1, 0x5801, + 0x88D2, 0x5803, 0x88D3, 0x5804, 0x88D4, 0x5805, 0x88D5, 0x5808, + 0x88D6, 0x5809, 0x88D7, 0x580A, 0x88D8, 0x580C, 0x88D9, 0x580E, + 0x88DA, 0x580F, 0x88DB, 0x5810, 0x88DC, 0x5812, 0x88DD, 0x5813, + 0x88DE, 0x5814, 0x88DF, 0x5816, 0x88E0, 0x5817, 0x88E1, 0x5818, + 0x88E2, 0x581A, 0x88E3, 0x581B, 0x88E4, 0x581C, 0x88E5, 0x581D, + 0x88E6, 0x581F, 0x88E7, 0x5822, 0x88E8, 0x5823, 0x88E9, 0x5825, + 0x88EA, 0x5826, 0x88EB, 0x5827, 0x88EC, 0x5828, 0x88ED, 0x5829, + 0x88EE, 0x582B, 0x88EF, 0x582C, 0x88F0, 0x582D, 0x88F1, 0x582E, + 0x88F2, 0x582F, 0x88F3, 0x5831, 0x88F4, 0x5832, 0x88F5, 0x5833, + 0x88F6, 0x5834, 0x88F7, 0x5836, 0x88F8, 0x5837, 0x88F9, 0x5838, + 0x88FA, 0x5839, 0x88FB, 0x583A, 0x88FC, 0x583B, 0x88FD, 0x583C, + 0x88FE, 0x583D, 0x8940, 0x583E, 0x8941, 0x583F, 0x8942, 0x5840, + 0x8943, 0x5841, 0x8944, 0x5842, 0x8945, 0x5843, 0x8946, 0x5845, + 0x8947, 0x5846, 0x8948, 0x5847, 0x8949, 0x5848, 0x894A, 0x5849, + 0x894B, 0x584A, 0x894C, 0x584B, 0x894D, 0x584E, 0x894E, 0x584F, + 0x894F, 0x5850, 0x8950, 0x5852, 0x8951, 0x5853, 0x8952, 0x5855, + 0x8953, 0x5856, 0x8954, 0x5857, 0x8955, 0x5859, 0x8956, 0x585A, + 0x8957, 0x585B, 0x8958, 0x585C, 0x8959, 0x585D, 0x895A, 0x585F, + 0x895B, 0x5860, 0x895C, 0x5861, 0x895D, 0x5862, 0x895E, 0x5863, + 0x895F, 0x5864, 0x8960, 0x5866, 0x8961, 0x5867, 0x8962, 0x5868, + 0x8963, 0x5869, 0x8964, 0x586A, 0x8965, 0x586D, 0x8966, 0x586E, + 0x8967, 0x586F, 0x8968, 0x5870, 0x8969, 0x5871, 0x896A, 0x5872, + 0x896B, 0x5873, 0x896C, 0x5874, 0x896D, 0x5875, 0x896E, 0x5876, + 0x896F, 0x5877, 0x8970, 0x5878, 0x8971, 0x5879, 0x8972, 0x587A, + 0x8973, 0x587B, 0x8974, 0x587C, 0x8975, 0x587D, 0x8976, 0x587F, + 0x8977, 0x5882, 0x8978, 0x5884, 0x8979, 0x5886, 0x897A, 0x5887, + 0x897B, 0x5888, 0x897C, 0x588A, 0x897D, 0x588B, 0x897E, 0x588C, + 0x8980, 0x588D, 0x8981, 0x588E, 0x8982, 0x588F, 0x8983, 0x5890, + 0x8984, 0x5891, 0x8985, 0x5894, 0x8986, 0x5895, 0x8987, 0x5896, + 0x8988, 0x5897, 0x8989, 0x5898, 0x898A, 0x589B, 0x898B, 0x589C, + 0x898C, 0x589D, 0x898D, 0x58A0, 0x898E, 0x58A1, 0x898F, 0x58A2, + 0x8990, 0x58A3, 0x8991, 0x58A4, 0x8992, 0x58A5, 0x8993, 0x58A6, + 0x8994, 0x58A7, 0x8995, 0x58AA, 0x8996, 0x58AB, 0x8997, 0x58AC, + 0x8998, 0x58AD, 0x8999, 0x58AE, 0x899A, 0x58AF, 0x899B, 0x58B0, + 0x899C, 0x58B1, 0x899D, 0x58B2, 0x899E, 0x58B3, 0x899F, 0x58B4, + 0x89A0, 0x58B5, 0x89A1, 0x58B6, 0x89A2, 0x58B7, 0x89A3, 0x58B8, + 0x89A4, 0x58B9, 0x89A5, 0x58BA, 0x89A6, 0x58BB, 0x89A7, 0x58BD, + 0x89A8, 0x58BE, 0x89A9, 0x58BF, 0x89AA, 0x58C0, 0x89AB, 0x58C2, + 0x89AC, 0x58C3, 0x89AD, 0x58C4, 0x89AE, 0x58C6, 0x89AF, 0x58C7, + 0x89B0, 0x58C8, 0x89B1, 0x58C9, 0x89B2, 0x58CA, 0x89B3, 0x58CB, + 0x89B4, 0x58CC, 0x89B5, 0x58CD, 0x89B6, 0x58CE, 0x89B7, 0x58CF, + 0x89B8, 0x58D0, 0x89B9, 0x58D2, 0x89BA, 0x58D3, 0x89BB, 0x58D4, + 0x89BC, 0x58D6, 0x89BD, 0x58D7, 0x89BE, 0x58D8, 0x89BF, 0x58D9, + 0x89C0, 0x58DA, 0x89C1, 0x58DB, 0x89C2, 0x58DC, 0x89C3, 0x58DD, + 0x89C4, 0x58DE, 0x89C5, 0x58DF, 0x89C6, 0x58E0, 0x89C7, 0x58E1, + 0x89C8, 0x58E2, 0x89C9, 0x58E3, 0x89CA, 0x58E5, 0x89CB, 0x58E6, + 0x89CC, 0x58E7, 0x89CD, 0x58E8, 0x89CE, 0x58E9, 0x89CF, 0x58EA, + 0x89D0, 0x58ED, 0x89D1, 0x58EF, 0x89D2, 0x58F1, 0x89D3, 0x58F2, + 0x89D4, 0x58F4, 0x89D5, 0x58F5, 0x89D6, 0x58F7, 0x89D7, 0x58F8, + 0x89D8, 0x58FA, 0x89D9, 0x58FB, 0x89DA, 0x58FC, 0x89DB, 0x58FD, + 0x89DC, 0x58FE, 0x89DD, 0x58FF, 0x89DE, 0x5900, 0x89DF, 0x5901, + 0x89E0, 0x5903, 0x89E1, 0x5905, 0x89E2, 0x5906, 0x89E3, 0x5908, + 0x89E4, 0x5909, 0x89E5, 0x590A, 0x89E6, 0x590B, 0x89E7, 0x590C, + 0x89E8, 0x590E, 0x89E9, 0x5910, 0x89EA, 0x5911, 0x89EB, 0x5912, + 0x89EC, 0x5913, 0x89ED, 0x5917, 0x89EE, 0x5918, 0x89EF, 0x591B, + 0x89F0, 0x591D, 0x89F1, 0x591E, 0x89F2, 0x5920, 0x89F3, 0x5921, + 0x89F4, 0x5922, 0x89F5, 0x5923, 0x89F6, 0x5926, 0x89F7, 0x5928, + 0x89F8, 0x592C, 0x89F9, 0x5930, 0x89FA, 0x5932, 0x89FB, 0x5933, + 0x89FC, 0x5935, 0x89FD, 0x5936, 0x89FE, 0x593B, 0x8A40, 0x593D, + 0x8A41, 0x593E, 0x8A42, 0x593F, 0x8A43, 0x5940, 0x8A44, 0x5943, + 0x8A45, 0x5945, 0x8A46, 0x5946, 0x8A47, 0x594A, 0x8A48, 0x594C, + 0x8A49, 0x594D, 0x8A4A, 0x5950, 0x8A4B, 0x5952, 0x8A4C, 0x5953, + 0x8A4D, 0x5959, 0x8A4E, 0x595B, 0x8A4F, 0x595C, 0x8A50, 0x595D, + 0x8A51, 0x595E, 0x8A52, 0x595F, 0x8A53, 0x5961, 0x8A54, 0x5963, + 0x8A55, 0x5964, 0x8A56, 0x5966, 0x8A57, 0x5967, 0x8A58, 0x5968, + 0x8A59, 0x5969, 0x8A5A, 0x596A, 0x8A5B, 0x596B, 0x8A5C, 0x596C, + 0x8A5D, 0x596D, 0x8A5E, 0x596E, 0x8A5F, 0x596F, 0x8A60, 0x5970, + 0x8A61, 0x5971, 0x8A62, 0x5972, 0x8A63, 0x5975, 0x8A64, 0x5977, + 0x8A65, 0x597A, 0x8A66, 0x597B, 0x8A67, 0x597C, 0x8A68, 0x597E, + 0x8A69, 0x597F, 0x8A6A, 0x5980, 0x8A6B, 0x5985, 0x8A6C, 0x5989, + 0x8A6D, 0x598B, 0x8A6E, 0x598C, 0x8A6F, 0x598E, 0x8A70, 0x598F, + 0x8A71, 0x5990, 0x8A72, 0x5991, 0x8A73, 0x5994, 0x8A74, 0x5995, + 0x8A75, 0x5998, 0x8A76, 0x599A, 0x8A77, 0x599B, 0x8A78, 0x599C, + 0x8A79, 0x599D, 0x8A7A, 0x599F, 0x8A7B, 0x59A0, 0x8A7C, 0x59A1, + 0x8A7D, 0x59A2, 0x8A7E, 0x59A6, 0x8A80, 0x59A7, 0x8A81, 0x59AC, + 0x8A82, 0x59AD, 0x8A83, 0x59B0, 0x8A84, 0x59B1, 0x8A85, 0x59B3, + 0x8A86, 0x59B4, 0x8A87, 0x59B5, 0x8A88, 0x59B6, 0x8A89, 0x59B7, + 0x8A8A, 0x59B8, 0x8A8B, 0x59BA, 0x8A8C, 0x59BC, 0x8A8D, 0x59BD, + 0x8A8E, 0x59BF, 0x8A8F, 0x59C0, 0x8A90, 0x59C1, 0x8A91, 0x59C2, + 0x8A92, 0x59C3, 0x8A93, 0x59C4, 0x8A94, 0x59C5, 0x8A95, 0x59C7, + 0x8A96, 0x59C8, 0x8A97, 0x59C9, 0x8A98, 0x59CC, 0x8A99, 0x59CD, + 0x8A9A, 0x59CE, 0x8A9B, 0x59CF, 0x8A9C, 0x59D5, 0x8A9D, 0x59D6, + 0x8A9E, 0x59D9, 0x8A9F, 0x59DB, 0x8AA0, 0x59DE, 0x8AA1, 0x59DF, + 0x8AA2, 0x59E0, 0x8AA3, 0x59E1, 0x8AA4, 0x59E2, 0x8AA5, 0x59E4, + 0x8AA6, 0x59E6, 0x8AA7, 0x59E7, 0x8AA8, 0x59E9, 0x8AA9, 0x59EA, + 0x8AAA, 0x59EB, 0x8AAB, 0x59ED, 0x8AAC, 0x59EE, 0x8AAD, 0x59EF, + 0x8AAE, 0x59F0, 0x8AAF, 0x59F1, 0x8AB0, 0x59F2, 0x8AB1, 0x59F3, + 0x8AB2, 0x59F4, 0x8AB3, 0x59F5, 0x8AB4, 0x59F6, 0x8AB5, 0x59F7, + 0x8AB6, 0x59F8, 0x8AB7, 0x59FA, 0x8AB8, 0x59FC, 0x8AB9, 0x59FD, + 0x8ABA, 0x59FE, 0x8ABB, 0x5A00, 0x8ABC, 0x5A02, 0x8ABD, 0x5A0A, + 0x8ABE, 0x5A0B, 0x8ABF, 0x5A0D, 0x8AC0, 0x5A0E, 0x8AC1, 0x5A0F, + 0x8AC2, 0x5A10, 0x8AC3, 0x5A12, 0x8AC4, 0x5A14, 0x8AC5, 0x5A15, + 0x8AC6, 0x5A16, 0x8AC7, 0x5A17, 0x8AC8, 0x5A19, 0x8AC9, 0x5A1A, + 0x8ACA, 0x5A1B, 0x8ACB, 0x5A1D, 0x8ACC, 0x5A1E, 0x8ACD, 0x5A21, + 0x8ACE, 0x5A22, 0x8ACF, 0x5A24, 0x8AD0, 0x5A26, 0x8AD1, 0x5A27, + 0x8AD2, 0x5A28, 0x8AD3, 0x5A2A, 0x8AD4, 0x5A2B, 0x8AD5, 0x5A2C, + 0x8AD6, 0x5A2D, 0x8AD7, 0x5A2E, 0x8AD8, 0x5A2F, 0x8AD9, 0x5A30, + 0x8ADA, 0x5A33, 0x8ADB, 0x5A35, 0x8ADC, 0x5A37, 0x8ADD, 0x5A38, + 0x8ADE, 0x5A39, 0x8ADF, 0x5A3A, 0x8AE0, 0x5A3B, 0x8AE1, 0x5A3D, + 0x8AE2, 0x5A3E, 0x8AE3, 0x5A3F, 0x8AE4, 0x5A41, 0x8AE5, 0x5A42, + 0x8AE6, 0x5A43, 0x8AE7, 0x5A44, 0x8AE8, 0x5A45, 0x8AE9, 0x5A47, + 0x8AEA, 0x5A48, 0x8AEB, 0x5A4B, 0x8AEC, 0x5A4C, 0x8AED, 0x5A4D, + 0x8AEE, 0x5A4E, 0x8AEF, 0x5A4F, 0x8AF0, 0x5A50, 0x8AF1, 0x5A51, + 0x8AF2, 0x5A52, 0x8AF3, 0x5A53, 0x8AF4, 0x5A54, 0x8AF5, 0x5A56, + 0x8AF6, 0x5A57, 0x8AF7, 0x5A58, 0x8AF8, 0x5A59, 0x8AF9, 0x5A5B, + 0x8AFA, 0x5A5C, 0x8AFB, 0x5A5D, 0x8AFC, 0x5A5E, 0x8AFD, 0x5A5F, + 0x8AFE, 0x5A60, 0x8B40, 0x5A61, 0x8B41, 0x5A63, 0x8B42, 0x5A64, + 0x8B43, 0x5A65, 0x8B44, 0x5A66, 0x8B45, 0x5A68, 0x8B46, 0x5A69, + 0x8B47, 0x5A6B, 0x8B48, 0x5A6C, 0x8B49, 0x5A6D, 0x8B4A, 0x5A6E, + 0x8B4B, 0x5A6F, 0x8B4C, 0x5A70, 0x8B4D, 0x5A71, 0x8B4E, 0x5A72, + 0x8B4F, 0x5A73, 0x8B50, 0x5A78, 0x8B51, 0x5A79, 0x8B52, 0x5A7B, + 0x8B53, 0x5A7C, 0x8B54, 0x5A7D, 0x8B55, 0x5A7E, 0x8B56, 0x5A80, + 0x8B57, 0x5A81, 0x8B58, 0x5A82, 0x8B59, 0x5A83, 0x8B5A, 0x5A84, + 0x8B5B, 0x5A85, 0x8B5C, 0x5A86, 0x8B5D, 0x5A87, 0x8B5E, 0x5A88, + 0x8B5F, 0x5A89, 0x8B60, 0x5A8A, 0x8B61, 0x5A8B, 0x8B62, 0x5A8C, + 0x8B63, 0x5A8D, 0x8B64, 0x5A8E, 0x8B65, 0x5A8F, 0x8B66, 0x5A90, + 0x8B67, 0x5A91, 0x8B68, 0x5A93, 0x8B69, 0x5A94, 0x8B6A, 0x5A95, + 0x8B6B, 0x5A96, 0x8B6C, 0x5A97, 0x8B6D, 0x5A98, 0x8B6E, 0x5A99, + 0x8B6F, 0x5A9C, 0x8B70, 0x5A9D, 0x8B71, 0x5A9E, 0x8B72, 0x5A9F, + 0x8B73, 0x5AA0, 0x8B74, 0x5AA1, 0x8B75, 0x5AA2, 0x8B76, 0x5AA3, + 0x8B77, 0x5AA4, 0x8B78, 0x5AA5, 0x8B79, 0x5AA6, 0x8B7A, 0x5AA7, + 0x8B7B, 0x5AA8, 0x8B7C, 0x5AA9, 0x8B7D, 0x5AAB, 0x8B7E, 0x5AAC, + 0x8B80, 0x5AAD, 0x8B81, 0x5AAE, 0x8B82, 0x5AAF, 0x8B83, 0x5AB0, + 0x8B84, 0x5AB1, 0x8B85, 0x5AB4, 0x8B86, 0x5AB6, 0x8B87, 0x5AB7, + 0x8B88, 0x5AB9, 0x8B89, 0x5ABA, 0x8B8A, 0x5ABB, 0x8B8B, 0x5ABC, + 0x8B8C, 0x5ABD, 0x8B8D, 0x5ABF, 0x8B8E, 0x5AC0, 0x8B8F, 0x5AC3, + 0x8B90, 0x5AC4, 0x8B91, 0x5AC5, 0x8B92, 0x5AC6, 0x8B93, 0x5AC7, + 0x8B94, 0x5AC8, 0x8B95, 0x5ACA, 0x8B96, 0x5ACB, 0x8B97, 0x5ACD, + 0x8B98, 0x5ACE, 0x8B99, 0x5ACF, 0x8B9A, 0x5AD0, 0x8B9B, 0x5AD1, + 0x8B9C, 0x5AD3, 0x8B9D, 0x5AD5, 0x8B9E, 0x5AD7, 0x8B9F, 0x5AD9, + 0x8BA0, 0x5ADA, 0x8BA1, 0x5ADB, 0x8BA2, 0x5ADD, 0x8BA3, 0x5ADE, + 0x8BA4, 0x5ADF, 0x8BA5, 0x5AE2, 0x8BA6, 0x5AE4, 0x8BA7, 0x5AE5, + 0x8BA8, 0x5AE7, 0x8BA9, 0x5AE8, 0x8BAA, 0x5AEA, 0x8BAB, 0x5AEC, + 0x8BAC, 0x5AED, 0x8BAD, 0x5AEE, 0x8BAE, 0x5AEF, 0x8BAF, 0x5AF0, + 0x8BB0, 0x5AF2, 0x8BB1, 0x5AF3, 0x8BB2, 0x5AF4, 0x8BB3, 0x5AF5, + 0x8BB4, 0x5AF6, 0x8BB5, 0x5AF7, 0x8BB6, 0x5AF8, 0x8BB7, 0x5AF9, + 0x8BB8, 0x5AFA, 0x8BB9, 0x5AFB, 0x8BBA, 0x5AFC, 0x8BBB, 0x5AFD, + 0x8BBC, 0x5AFE, 0x8BBD, 0x5AFF, 0x8BBE, 0x5B00, 0x8BBF, 0x5B01, + 0x8BC0, 0x5B02, 0x8BC1, 0x5B03, 0x8BC2, 0x5B04, 0x8BC3, 0x5B05, + 0x8BC4, 0x5B06, 0x8BC5, 0x5B07, 0x8BC6, 0x5B08, 0x8BC7, 0x5B0A, + 0x8BC8, 0x5B0B, 0x8BC9, 0x5B0C, 0x8BCA, 0x5B0D, 0x8BCB, 0x5B0E, + 0x8BCC, 0x5B0F, 0x8BCD, 0x5B10, 0x8BCE, 0x5B11, 0x8BCF, 0x5B12, + 0x8BD0, 0x5B13, 0x8BD1, 0x5B14, 0x8BD2, 0x5B15, 0x8BD3, 0x5B18, + 0x8BD4, 0x5B19, 0x8BD5, 0x5B1A, 0x8BD6, 0x5B1B, 0x8BD7, 0x5B1C, + 0x8BD8, 0x5B1D, 0x8BD9, 0x5B1E, 0x8BDA, 0x5B1F, 0x8BDB, 0x5B20, + 0x8BDC, 0x5B21, 0x8BDD, 0x5B22, 0x8BDE, 0x5B23, 0x8BDF, 0x5B24, + 0x8BE0, 0x5B25, 0x8BE1, 0x5B26, 0x8BE2, 0x5B27, 0x8BE3, 0x5B28, + 0x8BE4, 0x5B29, 0x8BE5, 0x5B2A, 0x8BE6, 0x5B2B, 0x8BE7, 0x5B2C, + 0x8BE8, 0x5B2D, 0x8BE9, 0x5B2E, 0x8BEA, 0x5B2F, 0x8BEB, 0x5B30, + 0x8BEC, 0x5B31, 0x8BED, 0x5B33, 0x8BEE, 0x5B35, 0x8BEF, 0x5B36, + 0x8BF0, 0x5B38, 0x8BF1, 0x5B39, 0x8BF2, 0x5B3A, 0x8BF3, 0x5B3B, + 0x8BF4, 0x5B3C, 0x8BF5, 0x5B3D, 0x8BF6, 0x5B3E, 0x8BF7, 0x5B3F, + 0x8BF8, 0x5B41, 0x8BF9, 0x5B42, 0x8BFA, 0x5B43, 0x8BFB, 0x5B44, + 0x8BFC, 0x5B45, 0x8BFD, 0x5B46, 0x8BFE, 0x5B47, 0x8C40, 0x5B48, + 0x8C41, 0x5B49, 0x8C42, 0x5B4A, 0x8C43, 0x5B4B, 0x8C44, 0x5B4C, + 0x8C45, 0x5B4D, 0x8C46, 0x5B4E, 0x8C47, 0x5B4F, 0x8C48, 0x5B52, + 0x8C49, 0x5B56, 0x8C4A, 0x5B5E, 0x8C4B, 0x5B60, 0x8C4C, 0x5B61, + 0x8C4D, 0x5B67, 0x8C4E, 0x5B68, 0x8C4F, 0x5B6B, 0x8C50, 0x5B6D, + 0x8C51, 0x5B6E, 0x8C52, 0x5B6F, 0x8C53, 0x5B72, 0x8C54, 0x5B74, + 0x8C55, 0x5B76, 0x8C56, 0x5B77, 0x8C57, 0x5B78, 0x8C58, 0x5B79, + 0x8C59, 0x5B7B, 0x8C5A, 0x5B7C, 0x8C5B, 0x5B7E, 0x8C5C, 0x5B7F, + 0x8C5D, 0x5B82, 0x8C5E, 0x5B86, 0x8C5F, 0x5B8A, 0x8C60, 0x5B8D, + 0x8C61, 0x5B8E, 0x8C62, 0x5B90, 0x8C63, 0x5B91, 0x8C64, 0x5B92, + 0x8C65, 0x5B94, 0x8C66, 0x5B96, 0x8C67, 0x5B9F, 0x8C68, 0x5BA7, + 0x8C69, 0x5BA8, 0x8C6A, 0x5BA9, 0x8C6B, 0x5BAC, 0x8C6C, 0x5BAD, + 0x8C6D, 0x5BAE, 0x8C6E, 0x5BAF, 0x8C6F, 0x5BB1, 0x8C70, 0x5BB2, + 0x8C71, 0x5BB7, 0x8C72, 0x5BBA, 0x8C73, 0x5BBB, 0x8C74, 0x5BBC, + 0x8C75, 0x5BC0, 0x8C76, 0x5BC1, 0x8C77, 0x5BC3, 0x8C78, 0x5BC8, + 0x8C79, 0x5BC9, 0x8C7A, 0x5BCA, 0x8C7B, 0x5BCB, 0x8C7C, 0x5BCD, + 0x8C7D, 0x5BCE, 0x8C7E, 0x5BCF, 0x8C80, 0x5BD1, 0x8C81, 0x5BD4, + 0x8C82, 0x5BD5, 0x8C83, 0x5BD6, 0x8C84, 0x5BD7, 0x8C85, 0x5BD8, + 0x8C86, 0x5BD9, 0x8C87, 0x5BDA, 0x8C88, 0x5BDB, 0x8C89, 0x5BDC, + 0x8C8A, 0x5BE0, 0x8C8B, 0x5BE2, 0x8C8C, 0x5BE3, 0x8C8D, 0x5BE6, + 0x8C8E, 0x5BE7, 0x8C8F, 0x5BE9, 0x8C90, 0x5BEA, 0x8C91, 0x5BEB, + 0x8C92, 0x5BEC, 0x8C93, 0x5BED, 0x8C94, 0x5BEF, 0x8C95, 0x5BF1, + 0x8C96, 0x5BF2, 0x8C97, 0x5BF3, 0x8C98, 0x5BF4, 0x8C99, 0x5BF5, + 0x8C9A, 0x5BF6, 0x8C9B, 0x5BF7, 0x8C9C, 0x5BFD, 0x8C9D, 0x5BFE, + 0x8C9E, 0x5C00, 0x8C9F, 0x5C02, 0x8CA0, 0x5C03, 0x8CA1, 0x5C05, + 0x8CA2, 0x5C07, 0x8CA3, 0x5C08, 0x8CA4, 0x5C0B, 0x8CA5, 0x5C0C, + 0x8CA6, 0x5C0D, 0x8CA7, 0x5C0E, 0x8CA8, 0x5C10, 0x8CA9, 0x5C12, + 0x8CAA, 0x5C13, 0x8CAB, 0x5C17, 0x8CAC, 0x5C19, 0x8CAD, 0x5C1B, + 0x8CAE, 0x5C1E, 0x8CAF, 0x5C1F, 0x8CB0, 0x5C20, 0x8CB1, 0x5C21, + 0x8CB2, 0x5C23, 0x8CB3, 0x5C26, 0x8CB4, 0x5C28, 0x8CB5, 0x5C29, + 0x8CB6, 0x5C2A, 0x8CB7, 0x5C2B, 0x8CB8, 0x5C2D, 0x8CB9, 0x5C2E, + 0x8CBA, 0x5C2F, 0x8CBB, 0x5C30, 0x8CBC, 0x5C32, 0x8CBD, 0x5C33, + 0x8CBE, 0x5C35, 0x8CBF, 0x5C36, 0x8CC0, 0x5C37, 0x8CC1, 0x5C43, + 0x8CC2, 0x5C44, 0x8CC3, 0x5C46, 0x8CC4, 0x5C47, 0x8CC5, 0x5C4C, + 0x8CC6, 0x5C4D, 0x8CC7, 0x5C52, 0x8CC8, 0x5C53, 0x8CC9, 0x5C54, + 0x8CCA, 0x5C56, 0x8CCB, 0x5C57, 0x8CCC, 0x5C58, 0x8CCD, 0x5C5A, + 0x8CCE, 0x5C5B, 0x8CCF, 0x5C5C, 0x8CD0, 0x5C5D, 0x8CD1, 0x5C5F, + 0x8CD2, 0x5C62, 0x8CD3, 0x5C64, 0x8CD4, 0x5C67, 0x8CD5, 0x5C68, + 0x8CD6, 0x5C69, 0x8CD7, 0x5C6A, 0x8CD8, 0x5C6B, 0x8CD9, 0x5C6C, + 0x8CDA, 0x5C6D, 0x8CDB, 0x5C70, 0x8CDC, 0x5C72, 0x8CDD, 0x5C73, + 0x8CDE, 0x5C74, 0x8CDF, 0x5C75, 0x8CE0, 0x5C76, 0x8CE1, 0x5C77, + 0x8CE2, 0x5C78, 0x8CE3, 0x5C7B, 0x8CE4, 0x5C7C, 0x8CE5, 0x5C7D, + 0x8CE6, 0x5C7E, 0x8CE7, 0x5C80, 0x8CE8, 0x5C83, 0x8CE9, 0x5C84, + 0x8CEA, 0x5C85, 0x8CEB, 0x5C86, 0x8CEC, 0x5C87, 0x8CED, 0x5C89, + 0x8CEE, 0x5C8A, 0x8CEF, 0x5C8B, 0x8CF0, 0x5C8E, 0x8CF1, 0x5C8F, + 0x8CF2, 0x5C92, 0x8CF3, 0x5C93, 0x8CF4, 0x5C95, 0x8CF5, 0x5C9D, + 0x8CF6, 0x5C9E, 0x8CF7, 0x5C9F, 0x8CF8, 0x5CA0, 0x8CF9, 0x5CA1, + 0x8CFA, 0x5CA4, 0x8CFB, 0x5CA5, 0x8CFC, 0x5CA6, 0x8CFD, 0x5CA7, + 0x8CFE, 0x5CA8, 0x8D40, 0x5CAA, 0x8D41, 0x5CAE, 0x8D42, 0x5CAF, + 0x8D43, 0x5CB0, 0x8D44, 0x5CB2, 0x8D45, 0x5CB4, 0x8D46, 0x5CB6, + 0x8D47, 0x5CB9, 0x8D48, 0x5CBA, 0x8D49, 0x5CBB, 0x8D4A, 0x5CBC, + 0x8D4B, 0x5CBE, 0x8D4C, 0x5CC0, 0x8D4D, 0x5CC2, 0x8D4E, 0x5CC3, + 0x8D4F, 0x5CC5, 0x8D50, 0x5CC6, 0x8D51, 0x5CC7, 0x8D52, 0x5CC8, + 0x8D53, 0x5CC9, 0x8D54, 0x5CCA, 0x8D55, 0x5CCC, 0x8D56, 0x5CCD, + 0x8D57, 0x5CCE, 0x8D58, 0x5CCF, 0x8D59, 0x5CD0, 0x8D5A, 0x5CD1, + 0x8D5B, 0x5CD3, 0x8D5C, 0x5CD4, 0x8D5D, 0x5CD5, 0x8D5E, 0x5CD6, + 0x8D5F, 0x5CD7, 0x8D60, 0x5CD8, 0x8D61, 0x5CDA, 0x8D62, 0x5CDB, + 0x8D63, 0x5CDC, 0x8D64, 0x5CDD, 0x8D65, 0x5CDE, 0x8D66, 0x5CDF, + 0x8D67, 0x5CE0, 0x8D68, 0x5CE2, 0x8D69, 0x5CE3, 0x8D6A, 0x5CE7, + 0x8D6B, 0x5CE9, 0x8D6C, 0x5CEB, 0x8D6D, 0x5CEC, 0x8D6E, 0x5CEE, + 0x8D6F, 0x5CEF, 0x8D70, 0x5CF1, 0x8D71, 0x5CF2, 0x8D72, 0x5CF3, + 0x8D73, 0x5CF4, 0x8D74, 0x5CF5, 0x8D75, 0x5CF6, 0x8D76, 0x5CF7, + 0x8D77, 0x5CF8, 0x8D78, 0x5CF9, 0x8D79, 0x5CFA, 0x8D7A, 0x5CFC, + 0x8D7B, 0x5CFD, 0x8D7C, 0x5CFE, 0x8D7D, 0x5CFF, 0x8D7E, 0x5D00, + 0x8D80, 0x5D01, 0x8D81, 0x5D04, 0x8D82, 0x5D05, 0x8D83, 0x5D08, + 0x8D84, 0x5D09, 0x8D85, 0x5D0A, 0x8D86, 0x5D0B, 0x8D87, 0x5D0C, + 0x8D88, 0x5D0D, 0x8D89, 0x5D0F, 0x8D8A, 0x5D10, 0x8D8B, 0x5D11, + 0x8D8C, 0x5D12, 0x8D8D, 0x5D13, 0x8D8E, 0x5D15, 0x8D8F, 0x5D17, + 0x8D90, 0x5D18, 0x8D91, 0x5D19, 0x8D92, 0x5D1A, 0x8D93, 0x5D1C, + 0x8D94, 0x5D1D, 0x8D95, 0x5D1F, 0x8D96, 0x5D20, 0x8D97, 0x5D21, + 0x8D98, 0x5D22, 0x8D99, 0x5D23, 0x8D9A, 0x5D25, 0x8D9B, 0x5D28, + 0x8D9C, 0x5D2A, 0x8D9D, 0x5D2B, 0x8D9E, 0x5D2C, 0x8D9F, 0x5D2F, + 0x8DA0, 0x5D30, 0x8DA1, 0x5D31, 0x8DA2, 0x5D32, 0x8DA3, 0x5D33, + 0x8DA4, 0x5D35, 0x8DA5, 0x5D36, 0x8DA6, 0x5D37, 0x8DA7, 0x5D38, + 0x8DA8, 0x5D39, 0x8DA9, 0x5D3A, 0x8DAA, 0x5D3B, 0x8DAB, 0x5D3C, + 0x8DAC, 0x5D3F, 0x8DAD, 0x5D40, 0x8DAE, 0x5D41, 0x8DAF, 0x5D42, + 0x8DB0, 0x5D43, 0x8DB1, 0x5D44, 0x8DB2, 0x5D45, 0x8DB3, 0x5D46, + 0x8DB4, 0x5D48, 0x8DB5, 0x5D49, 0x8DB6, 0x5D4D, 0x8DB7, 0x5D4E, + 0x8DB8, 0x5D4F, 0x8DB9, 0x5D50, 0x8DBA, 0x5D51, 0x8DBB, 0x5D52, + 0x8DBC, 0x5D53, 0x8DBD, 0x5D54, 0x8DBE, 0x5D55, 0x8DBF, 0x5D56, + 0x8DC0, 0x5D57, 0x8DC1, 0x5D59, 0x8DC2, 0x5D5A, 0x8DC3, 0x5D5C, + 0x8DC4, 0x5D5E, 0x8DC5, 0x5D5F, 0x8DC6, 0x5D60, 0x8DC7, 0x5D61, + 0x8DC8, 0x5D62, 0x8DC9, 0x5D63, 0x8DCA, 0x5D64, 0x8DCB, 0x5D65, + 0x8DCC, 0x5D66, 0x8DCD, 0x5D67, 0x8DCE, 0x5D68, 0x8DCF, 0x5D6A, + 0x8DD0, 0x5D6D, 0x8DD1, 0x5D6E, 0x8DD2, 0x5D70, 0x8DD3, 0x5D71, + 0x8DD4, 0x5D72, 0x8DD5, 0x5D73, 0x8DD6, 0x5D75, 0x8DD7, 0x5D76, + 0x8DD8, 0x5D77, 0x8DD9, 0x5D78, 0x8DDA, 0x5D79, 0x8DDB, 0x5D7A, + 0x8DDC, 0x5D7B, 0x8DDD, 0x5D7C, 0x8DDE, 0x5D7D, 0x8DDF, 0x5D7E, + 0x8DE0, 0x5D7F, 0x8DE1, 0x5D80, 0x8DE2, 0x5D81, 0x8DE3, 0x5D83, + 0x8DE4, 0x5D84, 0x8DE5, 0x5D85, 0x8DE6, 0x5D86, 0x8DE7, 0x5D87, + 0x8DE8, 0x5D88, 0x8DE9, 0x5D89, 0x8DEA, 0x5D8A, 0x8DEB, 0x5D8B, + 0x8DEC, 0x5D8C, 0x8DED, 0x5D8D, 0x8DEE, 0x5D8E, 0x8DEF, 0x5D8F, + 0x8DF0, 0x5D90, 0x8DF1, 0x5D91, 0x8DF2, 0x5D92, 0x8DF3, 0x5D93, + 0x8DF4, 0x5D94, 0x8DF5, 0x5D95, 0x8DF6, 0x5D96, 0x8DF7, 0x5D97, + 0x8DF8, 0x5D98, 0x8DF9, 0x5D9A, 0x8DFA, 0x5D9B, 0x8DFB, 0x5D9C, + 0x8DFC, 0x5D9E, 0x8DFD, 0x5D9F, 0x8DFE, 0x5DA0, 0x8E40, 0x5DA1, + 0x8E41, 0x5DA2, 0x8E42, 0x5DA3, 0x8E43, 0x5DA4, 0x8E44, 0x5DA5, + 0x8E45, 0x5DA6, 0x8E46, 0x5DA7, 0x8E47, 0x5DA8, 0x8E48, 0x5DA9, + 0x8E49, 0x5DAA, 0x8E4A, 0x5DAB, 0x8E4B, 0x5DAC, 0x8E4C, 0x5DAD, + 0x8E4D, 0x5DAE, 0x8E4E, 0x5DAF, 0x8E4F, 0x5DB0, 0x8E50, 0x5DB1, + 0x8E51, 0x5DB2, 0x8E52, 0x5DB3, 0x8E53, 0x5DB4, 0x8E54, 0x5DB5, + 0x8E55, 0x5DB6, 0x8E56, 0x5DB8, 0x8E57, 0x5DB9, 0x8E58, 0x5DBA, + 0x8E59, 0x5DBB, 0x8E5A, 0x5DBC, 0x8E5B, 0x5DBD, 0x8E5C, 0x5DBE, + 0x8E5D, 0x5DBF, 0x8E5E, 0x5DC0, 0x8E5F, 0x5DC1, 0x8E60, 0x5DC2, + 0x8E61, 0x5DC3, 0x8E62, 0x5DC4, 0x8E63, 0x5DC6, 0x8E64, 0x5DC7, + 0x8E65, 0x5DC8, 0x8E66, 0x5DC9, 0x8E67, 0x5DCA, 0x8E68, 0x5DCB, + 0x8E69, 0x5DCC, 0x8E6A, 0x5DCE, 0x8E6B, 0x5DCF, 0x8E6C, 0x5DD0, + 0x8E6D, 0x5DD1, 0x8E6E, 0x5DD2, 0x8E6F, 0x5DD3, 0x8E70, 0x5DD4, + 0x8E71, 0x5DD5, 0x8E72, 0x5DD6, 0x8E73, 0x5DD7, 0x8E74, 0x5DD8, + 0x8E75, 0x5DD9, 0x8E76, 0x5DDA, 0x8E77, 0x5DDC, 0x8E78, 0x5DDF, + 0x8E79, 0x5DE0, 0x8E7A, 0x5DE3, 0x8E7B, 0x5DE4, 0x8E7C, 0x5DEA, + 0x8E7D, 0x5DEC, 0x8E7E, 0x5DED, 0x8E80, 0x5DF0, 0x8E81, 0x5DF5, + 0x8E82, 0x5DF6, 0x8E83, 0x5DF8, 0x8E84, 0x5DF9, 0x8E85, 0x5DFA, + 0x8E86, 0x5DFB, 0x8E87, 0x5DFC, 0x8E88, 0x5DFF, 0x8E89, 0x5E00, + 0x8E8A, 0x5E04, 0x8E8B, 0x5E07, 0x8E8C, 0x5E09, 0x8E8D, 0x5E0A, + 0x8E8E, 0x5E0B, 0x8E8F, 0x5E0D, 0x8E90, 0x5E0E, 0x8E91, 0x5E12, + 0x8E92, 0x5E13, 0x8E93, 0x5E17, 0x8E94, 0x5E1E, 0x8E95, 0x5E1F, + 0x8E96, 0x5E20, 0x8E97, 0x5E21, 0x8E98, 0x5E22, 0x8E99, 0x5E23, + 0x8E9A, 0x5E24, 0x8E9B, 0x5E25, 0x8E9C, 0x5E28, 0x8E9D, 0x5E29, + 0x8E9E, 0x5E2A, 0x8E9F, 0x5E2B, 0x8EA0, 0x5E2C, 0x8EA1, 0x5E2F, + 0x8EA2, 0x5E30, 0x8EA3, 0x5E32, 0x8EA4, 0x5E33, 0x8EA5, 0x5E34, + 0x8EA6, 0x5E35, 0x8EA7, 0x5E36, 0x8EA8, 0x5E39, 0x8EA9, 0x5E3A, + 0x8EAA, 0x5E3E, 0x8EAB, 0x5E3F, 0x8EAC, 0x5E40, 0x8EAD, 0x5E41, + 0x8EAE, 0x5E43, 0x8EAF, 0x5E46, 0x8EB0, 0x5E47, 0x8EB1, 0x5E48, + 0x8EB2, 0x5E49, 0x8EB3, 0x5E4A, 0x8EB4, 0x5E4B, 0x8EB5, 0x5E4D, + 0x8EB6, 0x5E4E, 0x8EB7, 0x5E4F, 0x8EB8, 0x5E50, 0x8EB9, 0x5E51, + 0x8EBA, 0x5E52, 0x8EBB, 0x5E53, 0x8EBC, 0x5E56, 0x8EBD, 0x5E57, + 0x8EBE, 0x5E58, 0x8EBF, 0x5E59, 0x8EC0, 0x5E5A, 0x8EC1, 0x5E5C, + 0x8EC2, 0x5E5D, 0x8EC3, 0x5E5F, 0x8EC4, 0x5E60, 0x8EC5, 0x5E63, + 0x8EC6, 0x5E64, 0x8EC7, 0x5E65, 0x8EC8, 0x5E66, 0x8EC9, 0x5E67, + 0x8ECA, 0x5E68, 0x8ECB, 0x5E69, 0x8ECC, 0x5E6A, 0x8ECD, 0x5E6B, + 0x8ECE, 0x5E6C, 0x8ECF, 0x5E6D, 0x8ED0, 0x5E6E, 0x8ED1, 0x5E6F, + 0x8ED2, 0x5E70, 0x8ED3, 0x5E71, 0x8ED4, 0x5E75, 0x8ED5, 0x5E77, + 0x8ED6, 0x5E79, 0x8ED7, 0x5E7E, 0x8ED8, 0x5E81, 0x8ED9, 0x5E82, + 0x8EDA, 0x5E83, 0x8EDB, 0x5E85, 0x8EDC, 0x5E88, 0x8EDD, 0x5E89, + 0x8EDE, 0x5E8C, 0x8EDF, 0x5E8D, 0x8EE0, 0x5E8E, 0x8EE1, 0x5E92, + 0x8EE2, 0x5E98, 0x8EE3, 0x5E9B, 0x8EE4, 0x5E9D, 0x8EE5, 0x5EA1, + 0x8EE6, 0x5EA2, 0x8EE7, 0x5EA3, 0x8EE8, 0x5EA4, 0x8EE9, 0x5EA8, + 0x8EEA, 0x5EA9, 0x8EEB, 0x5EAA, 0x8EEC, 0x5EAB, 0x8EED, 0x5EAC, + 0x8EEE, 0x5EAE, 0x8EEF, 0x5EAF, 0x8EF0, 0x5EB0, 0x8EF1, 0x5EB1, + 0x8EF2, 0x5EB2, 0x8EF3, 0x5EB4, 0x8EF4, 0x5EBA, 0x8EF5, 0x5EBB, + 0x8EF6, 0x5EBC, 0x8EF7, 0x5EBD, 0x8EF8, 0x5EBF, 0x8EF9, 0x5EC0, + 0x8EFA, 0x5EC1, 0x8EFB, 0x5EC2, 0x8EFC, 0x5EC3, 0x8EFD, 0x5EC4, + 0x8EFE, 0x5EC5, 0x8F40, 0x5EC6, 0x8F41, 0x5EC7, 0x8F42, 0x5EC8, + 0x8F43, 0x5ECB, 0x8F44, 0x5ECC, 0x8F45, 0x5ECD, 0x8F46, 0x5ECE, + 0x8F47, 0x5ECF, 0x8F48, 0x5ED0, 0x8F49, 0x5ED4, 0x8F4A, 0x5ED5, + 0x8F4B, 0x5ED7, 0x8F4C, 0x5ED8, 0x8F4D, 0x5ED9, 0x8F4E, 0x5EDA, + 0x8F4F, 0x5EDC, 0x8F50, 0x5EDD, 0x8F51, 0x5EDE, 0x8F52, 0x5EDF, + 0x8F53, 0x5EE0, 0x8F54, 0x5EE1, 0x8F55, 0x5EE2, 0x8F56, 0x5EE3, + 0x8F57, 0x5EE4, 0x8F58, 0x5EE5, 0x8F59, 0x5EE6, 0x8F5A, 0x5EE7, + 0x8F5B, 0x5EE9, 0x8F5C, 0x5EEB, 0x8F5D, 0x5EEC, 0x8F5E, 0x5EED, + 0x8F5F, 0x5EEE, 0x8F60, 0x5EEF, 0x8F61, 0x5EF0, 0x8F62, 0x5EF1, + 0x8F63, 0x5EF2, 0x8F64, 0x5EF3, 0x8F65, 0x5EF5, 0x8F66, 0x5EF8, + 0x8F67, 0x5EF9, 0x8F68, 0x5EFB, 0x8F69, 0x5EFC, 0x8F6A, 0x5EFD, + 0x8F6B, 0x5F05, 0x8F6C, 0x5F06, 0x8F6D, 0x5F07, 0x8F6E, 0x5F09, + 0x8F6F, 0x5F0C, 0x8F70, 0x5F0D, 0x8F71, 0x5F0E, 0x8F72, 0x5F10, + 0x8F73, 0x5F12, 0x8F74, 0x5F14, 0x8F75, 0x5F16, 0x8F76, 0x5F19, + 0x8F77, 0x5F1A, 0x8F78, 0x5F1C, 0x8F79, 0x5F1D, 0x8F7A, 0x5F1E, + 0x8F7B, 0x5F21, 0x8F7C, 0x5F22, 0x8F7D, 0x5F23, 0x8F7E, 0x5F24, + 0x8F80, 0x5F28, 0x8F81, 0x5F2B, 0x8F82, 0x5F2C, 0x8F83, 0x5F2E, + 0x8F84, 0x5F30, 0x8F85, 0x5F32, 0x8F86, 0x5F33, 0x8F87, 0x5F34, + 0x8F88, 0x5F35, 0x8F89, 0x5F36, 0x8F8A, 0x5F37, 0x8F8B, 0x5F38, + 0x8F8C, 0x5F3B, 0x8F8D, 0x5F3D, 0x8F8E, 0x5F3E, 0x8F8F, 0x5F3F, + 0x8F90, 0x5F41, 0x8F91, 0x5F42, 0x8F92, 0x5F43, 0x8F93, 0x5F44, + 0x8F94, 0x5F45, 0x8F95, 0x5F46, 0x8F96, 0x5F47, 0x8F97, 0x5F48, + 0x8F98, 0x5F49, 0x8F99, 0x5F4A, 0x8F9A, 0x5F4B, 0x8F9B, 0x5F4C, + 0x8F9C, 0x5F4D, 0x8F9D, 0x5F4E, 0x8F9E, 0x5F4F, 0x8F9F, 0x5F51, + 0x8FA0, 0x5F54, 0x8FA1, 0x5F59, 0x8FA2, 0x5F5A, 0x8FA3, 0x5F5B, + 0x8FA4, 0x5F5C, 0x8FA5, 0x5F5E, 0x8FA6, 0x5F5F, 0x8FA7, 0x5F60, + 0x8FA8, 0x5F63, 0x8FA9, 0x5F65, 0x8FAA, 0x5F67, 0x8FAB, 0x5F68, + 0x8FAC, 0x5F6B, 0x8FAD, 0x5F6E, 0x8FAE, 0x5F6F, 0x8FAF, 0x5F72, + 0x8FB0, 0x5F74, 0x8FB1, 0x5F75, 0x8FB2, 0x5F76, 0x8FB3, 0x5F78, + 0x8FB4, 0x5F7A, 0x8FB5, 0x5F7D, 0x8FB6, 0x5F7E, 0x8FB7, 0x5F7F, + 0x8FB8, 0x5F83, 0x8FB9, 0x5F86, 0x8FBA, 0x5F8D, 0x8FBB, 0x5F8E, + 0x8FBC, 0x5F8F, 0x8FBD, 0x5F91, 0x8FBE, 0x5F93, 0x8FBF, 0x5F94, + 0x8FC0, 0x5F96, 0x8FC1, 0x5F9A, 0x8FC2, 0x5F9B, 0x8FC3, 0x5F9D, + 0x8FC4, 0x5F9E, 0x8FC5, 0x5F9F, 0x8FC6, 0x5FA0, 0x8FC7, 0x5FA2, + 0x8FC8, 0x5FA3, 0x8FC9, 0x5FA4, 0x8FCA, 0x5FA5, 0x8FCB, 0x5FA6, + 0x8FCC, 0x5FA7, 0x8FCD, 0x5FA9, 0x8FCE, 0x5FAB, 0x8FCF, 0x5FAC, + 0x8FD0, 0x5FAF, 0x8FD1, 0x5FB0, 0x8FD2, 0x5FB1, 0x8FD3, 0x5FB2, + 0x8FD4, 0x5FB3, 0x8FD5, 0x5FB4, 0x8FD6, 0x5FB6, 0x8FD7, 0x5FB8, + 0x8FD8, 0x5FB9, 0x8FD9, 0x5FBA, 0x8FDA, 0x5FBB, 0x8FDB, 0x5FBE, + 0x8FDC, 0x5FBF, 0x8FDD, 0x5FC0, 0x8FDE, 0x5FC1, 0x8FDF, 0x5FC2, + 0x8FE0, 0x5FC7, 0x8FE1, 0x5FC8, 0x8FE2, 0x5FCA, 0x8FE3, 0x5FCB, + 0x8FE4, 0x5FCE, 0x8FE5, 0x5FD3, 0x8FE6, 0x5FD4, 0x8FE7, 0x5FD5, + 0x8FE8, 0x5FDA, 0x8FE9, 0x5FDB, 0x8FEA, 0x5FDC, 0x8FEB, 0x5FDE, + 0x8FEC, 0x5FDF, 0x8FED, 0x5FE2, 0x8FEE, 0x5FE3, 0x8FEF, 0x5FE5, + 0x8FF0, 0x5FE6, 0x8FF1, 0x5FE8, 0x8FF2, 0x5FE9, 0x8FF3, 0x5FEC, + 0x8FF4, 0x5FEF, 0x8FF5, 0x5FF0, 0x8FF6, 0x5FF2, 0x8FF7, 0x5FF3, + 0x8FF8, 0x5FF4, 0x8FF9, 0x5FF6, 0x8FFA, 0x5FF7, 0x8FFB, 0x5FF9, + 0x8FFC, 0x5FFA, 0x8FFD, 0x5FFC, 0x8FFE, 0x6007, 0x9040, 0x6008, + 0x9041, 0x6009, 0x9042, 0x600B, 0x9043, 0x600C, 0x9044, 0x6010, + 0x9045, 0x6011, 0x9046, 0x6013, 0x9047, 0x6017, 0x9048, 0x6018, + 0x9049, 0x601A, 0x904A, 0x601E, 0x904B, 0x601F, 0x904C, 0x6022, + 0x904D, 0x6023, 0x904E, 0x6024, 0x904F, 0x602C, 0x9050, 0x602D, + 0x9051, 0x602E, 0x9052, 0x6030, 0x9053, 0x6031, 0x9054, 0x6032, + 0x9055, 0x6033, 0x9056, 0x6034, 0x9057, 0x6036, 0x9058, 0x6037, + 0x9059, 0x6038, 0x905A, 0x6039, 0x905B, 0x603A, 0x905C, 0x603D, + 0x905D, 0x603E, 0x905E, 0x6040, 0x905F, 0x6044, 0x9060, 0x6045, + 0x9061, 0x6046, 0x9062, 0x6047, 0x9063, 0x6048, 0x9064, 0x6049, + 0x9065, 0x604A, 0x9066, 0x604C, 0x9067, 0x604E, 0x9068, 0x604F, + 0x9069, 0x6051, 0x906A, 0x6053, 0x906B, 0x6054, 0x906C, 0x6056, + 0x906D, 0x6057, 0x906E, 0x6058, 0x906F, 0x605B, 0x9070, 0x605C, + 0x9071, 0x605E, 0x9072, 0x605F, 0x9073, 0x6060, 0x9074, 0x6061, + 0x9075, 0x6065, 0x9076, 0x6066, 0x9077, 0x606E, 0x9078, 0x6071, + 0x9079, 0x6072, 0x907A, 0x6074, 0x907B, 0x6075, 0x907C, 0x6077, + 0x907D, 0x607E, 0x907E, 0x6080, 0x9080, 0x6081, 0x9081, 0x6082, + 0x9082, 0x6085, 0x9083, 0x6086, 0x9084, 0x6087, 0x9085, 0x6088, + 0x9086, 0x608A, 0x9087, 0x608B, 0x9088, 0x608E, 0x9089, 0x608F, + 0x908A, 0x6090, 0x908B, 0x6091, 0x908C, 0x6093, 0x908D, 0x6095, + 0x908E, 0x6097, 0x908F, 0x6098, 0x9090, 0x6099, 0x9091, 0x609C, + 0x9092, 0x609E, 0x9093, 0x60A1, 0x9094, 0x60A2, 0x9095, 0x60A4, + 0x9096, 0x60A5, 0x9097, 0x60A7, 0x9098, 0x60A9, 0x9099, 0x60AA, + 0x909A, 0x60AE, 0x909B, 0x60B0, 0x909C, 0x60B3, 0x909D, 0x60B5, + 0x909E, 0x60B6, 0x909F, 0x60B7, 0x90A0, 0x60B9, 0x90A1, 0x60BA, + 0x90A2, 0x60BD, 0x90A3, 0x60BE, 0x90A4, 0x60BF, 0x90A5, 0x60C0, + 0x90A6, 0x60C1, 0x90A7, 0x60C2, 0x90A8, 0x60C3, 0x90A9, 0x60C4, + 0x90AA, 0x60C7, 0x90AB, 0x60C8, 0x90AC, 0x60C9, 0x90AD, 0x60CC, + 0x90AE, 0x60CD, 0x90AF, 0x60CE, 0x90B0, 0x60CF, 0x90B1, 0x60D0, + 0x90B2, 0x60D2, 0x90B3, 0x60D3, 0x90B4, 0x60D4, 0x90B5, 0x60D6, + 0x90B6, 0x60D7, 0x90B7, 0x60D9, 0x90B8, 0x60DB, 0x90B9, 0x60DE, + 0x90BA, 0x60E1, 0x90BB, 0x60E2, 0x90BC, 0x60E3, 0x90BD, 0x60E4, + 0x90BE, 0x60E5, 0x90BF, 0x60EA, 0x90C0, 0x60F1, 0x90C1, 0x60F2, + 0x90C2, 0x60F5, 0x90C3, 0x60F7, 0x90C4, 0x60F8, 0x90C5, 0x60FB, + 0x90C6, 0x60FC, 0x90C7, 0x60FD, 0x90C8, 0x60FE, 0x90C9, 0x60FF, + 0x90CA, 0x6102, 0x90CB, 0x6103, 0x90CC, 0x6104, 0x90CD, 0x6105, + 0x90CE, 0x6107, 0x90CF, 0x610A, 0x90D0, 0x610B, 0x90D1, 0x610C, + 0x90D2, 0x6110, 0x90D3, 0x6111, 0x90D4, 0x6112, 0x90D5, 0x6113, + 0x90D6, 0x6114, 0x90D7, 0x6116, 0x90D8, 0x6117, 0x90D9, 0x6118, + 0x90DA, 0x6119, 0x90DB, 0x611B, 0x90DC, 0x611C, 0x90DD, 0x611D, + 0x90DE, 0x611E, 0x90DF, 0x6121, 0x90E0, 0x6122, 0x90E1, 0x6125, + 0x90E2, 0x6128, 0x90E3, 0x6129, 0x90E4, 0x612A, 0x90E5, 0x612C, + 0x90E6, 0x612D, 0x90E7, 0x612E, 0x90E8, 0x612F, 0x90E9, 0x6130, + 0x90EA, 0x6131, 0x90EB, 0x6132, 0x90EC, 0x6133, 0x90ED, 0x6134, + 0x90EE, 0x6135, 0x90EF, 0x6136, 0x90F0, 0x6137, 0x90F1, 0x6138, + 0x90F2, 0x6139, 0x90F3, 0x613A, 0x90F4, 0x613B, 0x90F5, 0x613C, + 0x90F6, 0x613D, 0x90F7, 0x613E, 0x90F8, 0x6140, 0x90F9, 0x6141, + 0x90FA, 0x6142, 0x90FB, 0x6143, 0x90FC, 0x6144, 0x90FD, 0x6145, + 0x90FE, 0x6146, 0x9140, 0x6147, 0x9141, 0x6149, 0x9142, 0x614B, + 0x9143, 0x614D, 0x9144, 0x614F, 0x9145, 0x6150, 0x9146, 0x6152, + 0x9147, 0x6153, 0x9148, 0x6154, 0x9149, 0x6156, 0x914A, 0x6157, + 0x914B, 0x6158, 0x914C, 0x6159, 0x914D, 0x615A, 0x914E, 0x615B, + 0x914F, 0x615C, 0x9150, 0x615E, 0x9151, 0x615F, 0x9152, 0x6160, + 0x9153, 0x6161, 0x9154, 0x6163, 0x9155, 0x6164, 0x9156, 0x6165, + 0x9157, 0x6166, 0x9158, 0x6169, 0x9159, 0x616A, 0x915A, 0x616B, + 0x915B, 0x616C, 0x915C, 0x616D, 0x915D, 0x616E, 0x915E, 0x616F, + 0x915F, 0x6171, 0x9160, 0x6172, 0x9161, 0x6173, 0x9162, 0x6174, + 0x9163, 0x6176, 0x9164, 0x6178, 0x9165, 0x6179, 0x9166, 0x617A, + 0x9167, 0x617B, 0x9168, 0x617C, 0x9169, 0x617D, 0x916A, 0x617E, + 0x916B, 0x617F, 0x916C, 0x6180, 0x916D, 0x6181, 0x916E, 0x6182, + 0x916F, 0x6183, 0x9170, 0x6184, 0x9171, 0x6185, 0x9172, 0x6186, + 0x9173, 0x6187, 0x9174, 0x6188, 0x9175, 0x6189, 0x9176, 0x618A, + 0x9177, 0x618C, 0x9178, 0x618D, 0x9179, 0x618F, 0x917A, 0x6190, + 0x917B, 0x6191, 0x917C, 0x6192, 0x917D, 0x6193, 0x917E, 0x6195, + 0x9180, 0x6196, 0x9181, 0x6197, 0x9182, 0x6198, 0x9183, 0x6199, + 0x9184, 0x619A, 0x9185, 0x619B, 0x9186, 0x619C, 0x9187, 0x619E, + 0x9188, 0x619F, 0x9189, 0x61A0, 0x918A, 0x61A1, 0x918B, 0x61A2, + 0x918C, 0x61A3, 0x918D, 0x61A4, 0x918E, 0x61A5, 0x918F, 0x61A6, + 0x9190, 0x61AA, 0x9191, 0x61AB, 0x9192, 0x61AD, 0x9193, 0x61AE, + 0x9194, 0x61AF, 0x9195, 0x61B0, 0x9196, 0x61B1, 0x9197, 0x61B2, + 0x9198, 0x61B3, 0x9199, 0x61B4, 0x919A, 0x61B5, 0x919B, 0x61B6, + 0x919C, 0x61B8, 0x919D, 0x61B9, 0x919E, 0x61BA, 0x919F, 0x61BB, + 0x91A0, 0x61BC, 0x91A1, 0x61BD, 0x91A2, 0x61BF, 0x91A3, 0x61C0, + 0x91A4, 0x61C1, 0x91A5, 0x61C3, 0x91A6, 0x61C4, 0x91A7, 0x61C5, + 0x91A8, 0x61C6, 0x91A9, 0x61C7, 0x91AA, 0x61C9, 0x91AB, 0x61CC, + 0x91AC, 0x61CD, 0x91AD, 0x61CE, 0x91AE, 0x61CF, 0x91AF, 0x61D0, + 0x91B0, 0x61D3, 0x91B1, 0x61D5, 0x91B2, 0x61D6, 0x91B3, 0x61D7, + 0x91B4, 0x61D8, 0x91B5, 0x61D9, 0x91B6, 0x61DA, 0x91B7, 0x61DB, + 0x91B8, 0x61DC, 0x91B9, 0x61DD, 0x91BA, 0x61DE, 0x91BB, 0x61DF, + 0x91BC, 0x61E0, 0x91BD, 0x61E1, 0x91BE, 0x61E2, 0x91BF, 0x61E3, + 0x91C0, 0x61E4, 0x91C1, 0x61E5, 0x91C2, 0x61E7, 0x91C3, 0x61E8, + 0x91C4, 0x61E9, 0x91C5, 0x61EA, 0x91C6, 0x61EB, 0x91C7, 0x61EC, + 0x91C8, 0x61ED, 0x91C9, 0x61EE, 0x91CA, 0x61EF, 0x91CB, 0x61F0, + 0x91CC, 0x61F1, 0x91CD, 0x61F2, 0x91CE, 0x61F3, 0x91CF, 0x61F4, + 0x91D0, 0x61F6, 0x91D1, 0x61F7, 0x91D2, 0x61F8, 0x91D3, 0x61F9, + 0x91D4, 0x61FA, 0x91D5, 0x61FB, 0x91D6, 0x61FC, 0x91D7, 0x61FD, + 0x91D8, 0x61FE, 0x91D9, 0x6200, 0x91DA, 0x6201, 0x91DB, 0x6202, + 0x91DC, 0x6203, 0x91DD, 0x6204, 0x91DE, 0x6205, 0x91DF, 0x6207, + 0x91E0, 0x6209, 0x91E1, 0x6213, 0x91E2, 0x6214, 0x91E3, 0x6219, + 0x91E4, 0x621C, 0x91E5, 0x621D, 0x91E6, 0x621E, 0x91E7, 0x6220, + 0x91E8, 0x6223, 0x91E9, 0x6226, 0x91EA, 0x6227, 0x91EB, 0x6228, + 0x91EC, 0x6229, 0x91ED, 0x622B, 0x91EE, 0x622D, 0x91EF, 0x622F, + 0x91F0, 0x6230, 0x91F1, 0x6231, 0x91F2, 0x6232, 0x91F3, 0x6235, + 0x91F4, 0x6236, 0x91F5, 0x6238, 0x91F6, 0x6239, 0x91F7, 0x623A, + 0x91F8, 0x623B, 0x91F9, 0x623C, 0x91FA, 0x6242, 0x91FB, 0x6244, + 0x91FC, 0x6245, 0x91FD, 0x6246, 0x91FE, 0x624A, 0x9240, 0x624F, + 0x9241, 0x6250, 0x9242, 0x6255, 0x9243, 0x6256, 0x9244, 0x6257, + 0x9245, 0x6259, 0x9246, 0x625A, 0x9247, 0x625C, 0x9248, 0x625D, + 0x9249, 0x625E, 0x924A, 0x625F, 0x924B, 0x6260, 0x924C, 0x6261, + 0x924D, 0x6262, 0x924E, 0x6264, 0x924F, 0x6265, 0x9250, 0x6268, + 0x9251, 0x6271, 0x9252, 0x6272, 0x9253, 0x6274, 0x9254, 0x6275, + 0x9255, 0x6277, 0x9256, 0x6278, 0x9257, 0x627A, 0x9258, 0x627B, + 0x9259, 0x627D, 0x925A, 0x6281, 0x925B, 0x6282, 0x925C, 0x6283, + 0x925D, 0x6285, 0x925E, 0x6286, 0x925F, 0x6287, 0x9260, 0x6288, + 0x9261, 0x628B, 0x9262, 0x628C, 0x9263, 0x628D, 0x9264, 0x628E, + 0x9265, 0x628F, 0x9266, 0x6290, 0x9267, 0x6294, 0x9268, 0x6299, + 0x9269, 0x629C, 0x926A, 0x629D, 0x926B, 0x629E, 0x926C, 0x62A3, + 0x926D, 0x62A6, 0x926E, 0x62A7, 0x926F, 0x62A9, 0x9270, 0x62AA, + 0x9271, 0x62AD, 0x9272, 0x62AE, 0x9273, 0x62AF, 0x9274, 0x62B0, + 0x9275, 0x62B2, 0x9276, 0x62B3, 0x9277, 0x62B4, 0x9278, 0x62B6, + 0x9279, 0x62B7, 0x927A, 0x62B8, 0x927B, 0x62BA, 0x927C, 0x62BE, + 0x927D, 0x62C0, 0x927E, 0x62C1, 0x9280, 0x62C3, 0x9281, 0x62CB, + 0x9282, 0x62CF, 0x9283, 0x62D1, 0x9284, 0x62D5, 0x9285, 0x62DD, + 0x9286, 0x62DE, 0x9287, 0x62E0, 0x9288, 0x62E1, 0x9289, 0x62E4, + 0x928A, 0x62EA, 0x928B, 0x62EB, 0x928C, 0x62F0, 0x928D, 0x62F2, + 0x928E, 0x62F5, 0x928F, 0x62F8, 0x9290, 0x62F9, 0x9291, 0x62FA, + 0x9292, 0x62FB, 0x9293, 0x6300, 0x9294, 0x6303, 0x9295, 0x6304, + 0x9296, 0x6305, 0x9297, 0x6306, 0x9298, 0x630A, 0x9299, 0x630B, + 0x929A, 0x630C, 0x929B, 0x630D, 0x929C, 0x630F, 0x929D, 0x6310, + 0x929E, 0x6312, 0x929F, 0x6313, 0x92A0, 0x6314, 0x92A1, 0x6315, + 0x92A2, 0x6317, 0x92A3, 0x6318, 0x92A4, 0x6319, 0x92A5, 0x631C, + 0x92A6, 0x6326, 0x92A7, 0x6327, 0x92A8, 0x6329, 0x92A9, 0x632C, + 0x92AA, 0x632D, 0x92AB, 0x632E, 0x92AC, 0x6330, 0x92AD, 0x6331, + 0x92AE, 0x6333, 0x92AF, 0x6334, 0x92B0, 0x6335, 0x92B1, 0x6336, + 0x92B2, 0x6337, 0x92B3, 0x6338, 0x92B4, 0x633B, 0x92B5, 0x633C, + 0x92B6, 0x633E, 0x92B7, 0x633F, 0x92B8, 0x6340, 0x92B9, 0x6341, + 0x92BA, 0x6344, 0x92BB, 0x6347, 0x92BC, 0x6348, 0x92BD, 0x634A, + 0x92BE, 0x6351, 0x92BF, 0x6352, 0x92C0, 0x6353, 0x92C1, 0x6354, + 0x92C2, 0x6356, 0x92C3, 0x6357, 0x92C4, 0x6358, 0x92C5, 0x6359, + 0x92C6, 0x635A, 0x92C7, 0x635B, 0x92C8, 0x635C, 0x92C9, 0x635D, + 0x92CA, 0x6360, 0x92CB, 0x6364, 0x92CC, 0x6365, 0x92CD, 0x6366, + 0x92CE, 0x6368, 0x92CF, 0x636A, 0x92D0, 0x636B, 0x92D1, 0x636C, + 0x92D2, 0x636F, 0x92D3, 0x6370, 0x92D4, 0x6372, 0x92D5, 0x6373, + 0x92D6, 0x6374, 0x92D7, 0x6375, 0x92D8, 0x6378, 0x92D9, 0x6379, + 0x92DA, 0x637C, 0x92DB, 0x637D, 0x92DC, 0x637E, 0x92DD, 0x637F, + 0x92DE, 0x6381, 0x92DF, 0x6383, 0x92E0, 0x6384, 0x92E1, 0x6385, + 0x92E2, 0x6386, 0x92E3, 0x638B, 0x92E4, 0x638D, 0x92E5, 0x6391, + 0x92E6, 0x6393, 0x92E7, 0x6394, 0x92E8, 0x6395, 0x92E9, 0x6397, + 0x92EA, 0x6399, 0x92EB, 0x639A, 0x92EC, 0x639B, 0x92ED, 0x639C, + 0x92EE, 0x639D, 0x92EF, 0x639E, 0x92F0, 0x639F, 0x92F1, 0x63A1, + 0x92F2, 0x63A4, 0x92F3, 0x63A6, 0x92F4, 0x63AB, 0x92F5, 0x63AF, + 0x92F6, 0x63B1, 0x92F7, 0x63B2, 0x92F8, 0x63B5, 0x92F9, 0x63B6, + 0x92FA, 0x63B9, 0x92FB, 0x63BB, 0x92FC, 0x63BD, 0x92FD, 0x63BF, + 0x92FE, 0x63C0, 0x9340, 0x63C1, 0x9341, 0x63C2, 0x9342, 0x63C3, + 0x9343, 0x63C5, 0x9344, 0x63C7, 0x9345, 0x63C8, 0x9346, 0x63CA, + 0x9347, 0x63CB, 0x9348, 0x63CC, 0x9349, 0x63D1, 0x934A, 0x63D3, + 0x934B, 0x63D4, 0x934C, 0x63D5, 0x934D, 0x63D7, 0x934E, 0x63D8, + 0x934F, 0x63D9, 0x9350, 0x63DA, 0x9351, 0x63DB, 0x9352, 0x63DC, + 0x9353, 0x63DD, 0x9354, 0x63DF, 0x9355, 0x63E2, 0x9356, 0x63E4, + 0x9357, 0x63E5, 0x9358, 0x63E6, 0x9359, 0x63E7, 0x935A, 0x63E8, + 0x935B, 0x63EB, 0x935C, 0x63EC, 0x935D, 0x63EE, 0x935E, 0x63EF, + 0x935F, 0x63F0, 0x9360, 0x63F1, 0x9361, 0x63F3, 0x9362, 0x63F5, + 0x9363, 0x63F7, 0x9364, 0x63F9, 0x9365, 0x63FA, 0x9366, 0x63FB, + 0x9367, 0x63FC, 0x9368, 0x63FE, 0x9369, 0x6403, 0x936A, 0x6404, + 0x936B, 0x6406, 0x936C, 0x6407, 0x936D, 0x6408, 0x936E, 0x6409, + 0x936F, 0x640A, 0x9370, 0x640D, 0x9371, 0x640E, 0x9372, 0x6411, + 0x9373, 0x6412, 0x9374, 0x6415, 0x9375, 0x6416, 0x9376, 0x6417, + 0x9377, 0x6418, 0x9378, 0x6419, 0x9379, 0x641A, 0x937A, 0x641D, + 0x937B, 0x641F, 0x937C, 0x6422, 0x937D, 0x6423, 0x937E, 0x6424, + 0x9380, 0x6425, 0x9381, 0x6427, 0x9382, 0x6428, 0x9383, 0x6429, + 0x9384, 0x642B, 0x9385, 0x642E, 0x9386, 0x642F, 0x9387, 0x6430, + 0x9388, 0x6431, 0x9389, 0x6432, 0x938A, 0x6433, 0x938B, 0x6435, + 0x938C, 0x6436, 0x938D, 0x6437, 0x938E, 0x6438, 0x938F, 0x6439, + 0x9390, 0x643B, 0x9391, 0x643C, 0x9392, 0x643E, 0x9393, 0x6440, + 0x9394, 0x6442, 0x9395, 0x6443, 0x9396, 0x6449, 0x9397, 0x644B, + 0x9398, 0x644C, 0x9399, 0x644D, 0x939A, 0x644E, 0x939B, 0x644F, + 0x939C, 0x6450, 0x939D, 0x6451, 0x939E, 0x6453, 0x939F, 0x6455, + 0x93A0, 0x6456, 0x93A1, 0x6457, 0x93A2, 0x6459, 0x93A3, 0x645A, + 0x93A4, 0x645B, 0x93A5, 0x645C, 0x93A6, 0x645D, 0x93A7, 0x645F, + 0x93A8, 0x6460, 0x93A9, 0x6461, 0x93AA, 0x6462, 0x93AB, 0x6463, + 0x93AC, 0x6464, 0x93AD, 0x6465, 0x93AE, 0x6466, 0x93AF, 0x6468, + 0x93B0, 0x646A, 0x93B1, 0x646B, 0x93B2, 0x646C, 0x93B3, 0x646E, + 0x93B4, 0x646F, 0x93B5, 0x6470, 0x93B6, 0x6471, 0x93B7, 0x6472, + 0x93B8, 0x6473, 0x93B9, 0x6474, 0x93BA, 0x6475, 0x93BB, 0x6476, + 0x93BC, 0x6477, 0x93BD, 0x647B, 0x93BE, 0x647C, 0x93BF, 0x647D, + 0x93C0, 0x647E, 0x93C1, 0x647F, 0x93C2, 0x6480, 0x93C3, 0x6481, + 0x93C4, 0x6483, 0x93C5, 0x6486, 0x93C6, 0x6488, 0x93C7, 0x6489, + 0x93C8, 0x648A, 0x93C9, 0x648B, 0x93CA, 0x648C, 0x93CB, 0x648D, + 0x93CC, 0x648E, 0x93CD, 0x648F, 0x93CE, 0x6490, 0x93CF, 0x6493, + 0x93D0, 0x6494, 0x93D1, 0x6497, 0x93D2, 0x6498, 0x93D3, 0x649A, + 0x93D4, 0x649B, 0x93D5, 0x649C, 0x93D6, 0x649D, 0x93D7, 0x649F, + 0x93D8, 0x64A0, 0x93D9, 0x64A1, 0x93DA, 0x64A2, 0x93DB, 0x64A3, + 0x93DC, 0x64A5, 0x93DD, 0x64A6, 0x93DE, 0x64A7, 0x93DF, 0x64A8, + 0x93E0, 0x64AA, 0x93E1, 0x64AB, 0x93E2, 0x64AF, 0x93E3, 0x64B1, + 0x93E4, 0x64B2, 0x93E5, 0x64B3, 0x93E6, 0x64B4, 0x93E7, 0x64B6, + 0x93E8, 0x64B9, 0x93E9, 0x64BB, 0x93EA, 0x64BD, 0x93EB, 0x64BE, + 0x93EC, 0x64BF, 0x93ED, 0x64C1, 0x93EE, 0x64C3, 0x93EF, 0x64C4, + 0x93F0, 0x64C6, 0x93F1, 0x64C7, 0x93F2, 0x64C8, 0x93F3, 0x64C9, + 0x93F4, 0x64CA, 0x93F5, 0x64CB, 0x93F6, 0x64CC, 0x93F7, 0x64CF, + 0x93F8, 0x64D1, 0x93F9, 0x64D3, 0x93FA, 0x64D4, 0x93FB, 0x64D5, + 0x93FC, 0x64D6, 0x93FD, 0x64D9, 0x93FE, 0x64DA, 0x9440, 0x64DB, + 0x9441, 0x64DC, 0x9442, 0x64DD, 0x9443, 0x64DF, 0x9444, 0x64E0, + 0x9445, 0x64E1, 0x9446, 0x64E3, 0x9447, 0x64E5, 0x9448, 0x64E7, + 0x9449, 0x64E8, 0x944A, 0x64E9, 0x944B, 0x64EA, 0x944C, 0x64EB, + 0x944D, 0x64EC, 0x944E, 0x64ED, 0x944F, 0x64EE, 0x9450, 0x64EF, + 0x9451, 0x64F0, 0x9452, 0x64F1, 0x9453, 0x64F2, 0x9454, 0x64F3, + 0x9455, 0x64F4, 0x9456, 0x64F5, 0x9457, 0x64F6, 0x9458, 0x64F7, + 0x9459, 0x64F8, 0x945A, 0x64F9, 0x945B, 0x64FA, 0x945C, 0x64FB, + 0x945D, 0x64FC, 0x945E, 0x64FD, 0x945F, 0x64FE, 0x9460, 0x64FF, + 0x9461, 0x6501, 0x9462, 0x6502, 0x9463, 0x6503, 0x9464, 0x6504, + 0x9465, 0x6505, 0x9466, 0x6506, 0x9467, 0x6507, 0x9468, 0x6508, + 0x9469, 0x650A, 0x946A, 0x650B, 0x946B, 0x650C, 0x946C, 0x650D, + 0x946D, 0x650E, 0x946E, 0x650F, 0x946F, 0x6510, 0x9470, 0x6511, + 0x9471, 0x6513, 0x9472, 0x6514, 0x9473, 0x6515, 0x9474, 0x6516, + 0x9475, 0x6517, 0x9476, 0x6519, 0x9477, 0x651A, 0x9478, 0x651B, + 0x9479, 0x651C, 0x947A, 0x651D, 0x947B, 0x651E, 0x947C, 0x651F, + 0x947D, 0x6520, 0x947E, 0x6521, 0x9480, 0x6522, 0x9481, 0x6523, + 0x9482, 0x6524, 0x9483, 0x6526, 0x9484, 0x6527, 0x9485, 0x6528, + 0x9486, 0x6529, 0x9487, 0x652A, 0x9488, 0x652C, 0x9489, 0x652D, + 0x948A, 0x6530, 0x948B, 0x6531, 0x948C, 0x6532, 0x948D, 0x6533, + 0x948E, 0x6537, 0x948F, 0x653A, 0x9490, 0x653C, 0x9491, 0x653D, + 0x9492, 0x6540, 0x9493, 0x6541, 0x9494, 0x6542, 0x9495, 0x6543, + 0x9496, 0x6544, 0x9497, 0x6546, 0x9498, 0x6547, 0x9499, 0x654A, + 0x949A, 0x654B, 0x949B, 0x654D, 0x949C, 0x654E, 0x949D, 0x6550, + 0x949E, 0x6552, 0x949F, 0x6553, 0x94A0, 0x6554, 0x94A1, 0x6557, + 0x94A2, 0x6558, 0x94A3, 0x655A, 0x94A4, 0x655C, 0x94A5, 0x655F, + 0x94A6, 0x6560, 0x94A7, 0x6561, 0x94A8, 0x6564, 0x94A9, 0x6565, + 0x94AA, 0x6567, 0x94AB, 0x6568, 0x94AC, 0x6569, 0x94AD, 0x656A, + 0x94AE, 0x656D, 0x94AF, 0x656E, 0x94B0, 0x656F, 0x94B1, 0x6571, + 0x94B2, 0x6573, 0x94B3, 0x6575, 0x94B4, 0x6576, 0x94B5, 0x6578, + 0x94B6, 0x6579, 0x94B7, 0x657A, 0x94B8, 0x657B, 0x94B9, 0x657C, + 0x94BA, 0x657D, 0x94BB, 0x657E, 0x94BC, 0x657F, 0x94BD, 0x6580, + 0x94BE, 0x6581, 0x94BF, 0x6582, 0x94C0, 0x6583, 0x94C1, 0x6584, + 0x94C2, 0x6585, 0x94C3, 0x6586, 0x94C4, 0x6588, 0x94C5, 0x6589, + 0x94C6, 0x658A, 0x94C7, 0x658D, 0x94C8, 0x658E, 0x94C9, 0x658F, + 0x94CA, 0x6592, 0x94CB, 0x6594, 0x94CC, 0x6595, 0x94CD, 0x6596, + 0x94CE, 0x6598, 0x94CF, 0x659A, 0x94D0, 0x659D, 0x94D1, 0x659E, + 0x94D2, 0x65A0, 0x94D3, 0x65A2, 0x94D4, 0x65A3, 0x94D5, 0x65A6, + 0x94D6, 0x65A8, 0x94D7, 0x65AA, 0x94D8, 0x65AC, 0x94D9, 0x65AE, + 0x94DA, 0x65B1, 0x94DB, 0x65B2, 0x94DC, 0x65B3, 0x94DD, 0x65B4, + 0x94DE, 0x65B5, 0x94DF, 0x65B6, 0x94E0, 0x65B7, 0x94E1, 0x65B8, + 0x94E2, 0x65BA, 0x94E3, 0x65BB, 0x94E4, 0x65BE, 0x94E5, 0x65BF, + 0x94E6, 0x65C0, 0x94E7, 0x65C2, 0x94E8, 0x65C7, 0x94E9, 0x65C8, + 0x94EA, 0x65C9, 0x94EB, 0x65CA, 0x94EC, 0x65CD, 0x94ED, 0x65D0, + 0x94EE, 0x65D1, 0x94EF, 0x65D3, 0x94F0, 0x65D4, 0x94F1, 0x65D5, + 0x94F2, 0x65D8, 0x94F3, 0x65D9, 0x94F4, 0x65DA, 0x94F5, 0x65DB, + 0x94F6, 0x65DC, 0x94F7, 0x65DD, 0x94F8, 0x65DE, 0x94F9, 0x65DF, + 0x94FA, 0x65E1, 0x94FB, 0x65E3, 0x94FC, 0x65E4, 0x94FD, 0x65EA, + 0x94FE, 0x65EB, 0x9540, 0x65F2, 0x9541, 0x65F3, 0x9542, 0x65F4, + 0x9543, 0x65F5, 0x9544, 0x65F8, 0x9545, 0x65F9, 0x9546, 0x65FB, + 0x9547, 0x65FC, 0x9548, 0x65FD, 0x9549, 0x65FE, 0x954A, 0x65FF, + 0x954B, 0x6601, 0x954C, 0x6604, 0x954D, 0x6605, 0x954E, 0x6607, + 0x954F, 0x6608, 0x9550, 0x6609, 0x9551, 0x660B, 0x9552, 0x660D, + 0x9553, 0x6610, 0x9554, 0x6611, 0x9555, 0x6612, 0x9556, 0x6616, + 0x9557, 0x6617, 0x9558, 0x6618, 0x9559, 0x661A, 0x955A, 0x661B, + 0x955B, 0x661C, 0x955C, 0x661E, 0x955D, 0x6621, 0x955E, 0x6622, + 0x955F, 0x6623, 0x9560, 0x6624, 0x9561, 0x6626, 0x9562, 0x6629, + 0x9563, 0x662A, 0x9564, 0x662B, 0x9565, 0x662C, 0x9566, 0x662E, + 0x9567, 0x6630, 0x9568, 0x6632, 0x9569, 0x6633, 0x956A, 0x6637, + 0x956B, 0x6638, 0x956C, 0x6639, 0x956D, 0x663A, 0x956E, 0x663B, + 0x956F, 0x663D, 0x9570, 0x663F, 0x9571, 0x6640, 0x9572, 0x6642, + 0x9573, 0x6644, 0x9574, 0x6645, 0x9575, 0x6646, 0x9576, 0x6647, + 0x9577, 0x6648, 0x9578, 0x6649, 0x9579, 0x664A, 0x957A, 0x664D, + 0x957B, 0x664E, 0x957C, 0x6650, 0x957D, 0x6651, 0x957E, 0x6658, + 0x9580, 0x6659, 0x9581, 0x665B, 0x9582, 0x665C, 0x9583, 0x665D, + 0x9584, 0x665E, 0x9585, 0x6660, 0x9586, 0x6662, 0x9587, 0x6663, + 0x9588, 0x6665, 0x9589, 0x6667, 0x958A, 0x6669, 0x958B, 0x666A, + 0x958C, 0x666B, 0x958D, 0x666C, 0x958E, 0x666D, 0x958F, 0x6671, + 0x9590, 0x6672, 0x9591, 0x6673, 0x9592, 0x6675, 0x9593, 0x6678, + 0x9594, 0x6679, 0x9595, 0x667B, 0x9596, 0x667C, 0x9597, 0x667D, + 0x9598, 0x667F, 0x9599, 0x6680, 0x959A, 0x6681, 0x959B, 0x6683, + 0x959C, 0x6685, 0x959D, 0x6686, 0x959E, 0x6688, 0x959F, 0x6689, + 0x95A0, 0x668A, 0x95A1, 0x668B, 0x95A2, 0x668D, 0x95A3, 0x668E, + 0x95A4, 0x668F, 0x95A5, 0x6690, 0x95A6, 0x6692, 0x95A7, 0x6693, + 0x95A8, 0x6694, 0x95A9, 0x6695, 0x95AA, 0x6698, 0x95AB, 0x6699, + 0x95AC, 0x669A, 0x95AD, 0x669B, 0x95AE, 0x669C, 0x95AF, 0x669E, + 0x95B0, 0x669F, 0x95B1, 0x66A0, 0x95B2, 0x66A1, 0x95B3, 0x66A2, + 0x95B4, 0x66A3, 0x95B5, 0x66A4, 0x95B6, 0x66A5, 0x95B7, 0x66A6, + 0x95B8, 0x66A9, 0x95B9, 0x66AA, 0x95BA, 0x66AB, 0x95BB, 0x66AC, + 0x95BC, 0x66AD, 0x95BD, 0x66AF, 0x95BE, 0x66B0, 0x95BF, 0x66B1, + 0x95C0, 0x66B2, 0x95C1, 0x66B3, 0x95C2, 0x66B5, 0x95C3, 0x66B6, + 0x95C4, 0x66B7, 0x95C5, 0x66B8, 0x95C6, 0x66BA, 0x95C7, 0x66BB, + 0x95C8, 0x66BC, 0x95C9, 0x66BD, 0x95CA, 0x66BF, 0x95CB, 0x66C0, + 0x95CC, 0x66C1, 0x95CD, 0x66C2, 0x95CE, 0x66C3, 0x95CF, 0x66C4, + 0x95D0, 0x66C5, 0x95D1, 0x66C6, 0x95D2, 0x66C7, 0x95D3, 0x66C8, + 0x95D4, 0x66C9, 0x95D5, 0x66CA, 0x95D6, 0x66CB, 0x95D7, 0x66CC, + 0x95D8, 0x66CD, 0x95D9, 0x66CE, 0x95DA, 0x66CF, 0x95DB, 0x66D0, + 0x95DC, 0x66D1, 0x95DD, 0x66D2, 0x95DE, 0x66D3, 0x95DF, 0x66D4, + 0x95E0, 0x66D5, 0x95E1, 0x66D6, 0x95E2, 0x66D7, 0x95E3, 0x66D8, + 0x95E4, 0x66DA, 0x95E5, 0x66DE, 0x95E6, 0x66DF, 0x95E7, 0x66E0, + 0x95E8, 0x66E1, 0x95E9, 0x66E2, 0x95EA, 0x66E3, 0x95EB, 0x66E4, + 0x95EC, 0x66E5, 0x95ED, 0x66E7, 0x95EE, 0x66E8, 0x95EF, 0x66EA, + 0x95F0, 0x66EB, 0x95F1, 0x66EC, 0x95F2, 0x66ED, 0x95F3, 0x66EE, + 0x95F4, 0x66EF, 0x95F5, 0x66F1, 0x95F6, 0x66F5, 0x95F7, 0x66F6, + 0x95F8, 0x66F8, 0x95F9, 0x66FA, 0x95FA, 0x66FB, 0x95FB, 0x66FD, + 0x95FC, 0x6701, 0x95FD, 0x6702, 0x95FE, 0x6703, 0x9640, 0x6704, + 0x9641, 0x6705, 0x9642, 0x6706, 0x9643, 0x6707, 0x9644, 0x670C, + 0x9645, 0x670E, 0x9646, 0x670F, 0x9647, 0x6711, 0x9648, 0x6712, + 0x9649, 0x6713, 0x964A, 0x6716, 0x964B, 0x6718, 0x964C, 0x6719, + 0x964D, 0x671A, 0x964E, 0x671C, 0x964F, 0x671E, 0x9650, 0x6720, + 0x9651, 0x6721, 0x9652, 0x6722, 0x9653, 0x6723, 0x9654, 0x6724, + 0x9655, 0x6725, 0x9656, 0x6727, 0x9657, 0x6729, 0x9658, 0x672E, + 0x9659, 0x6730, 0x965A, 0x6732, 0x965B, 0x6733, 0x965C, 0x6736, + 0x965D, 0x6737, 0x965E, 0x6738, 0x965F, 0x6739, 0x9660, 0x673B, + 0x9661, 0x673C, 0x9662, 0x673E, 0x9663, 0x673F, 0x9664, 0x6741, + 0x9665, 0x6744, 0x9666, 0x6745, 0x9667, 0x6747, 0x9668, 0x674A, + 0x9669, 0x674B, 0x966A, 0x674D, 0x966B, 0x6752, 0x966C, 0x6754, + 0x966D, 0x6755, 0x966E, 0x6757, 0x966F, 0x6758, 0x9670, 0x6759, + 0x9671, 0x675A, 0x9672, 0x675B, 0x9673, 0x675D, 0x9674, 0x6762, + 0x9675, 0x6763, 0x9676, 0x6764, 0x9677, 0x6766, 0x9678, 0x6767, + 0x9679, 0x676B, 0x967A, 0x676C, 0x967B, 0x676E, 0x967C, 0x6771, + 0x967D, 0x6774, 0x967E, 0x6776, 0x9680, 0x6778, 0x9681, 0x6779, + 0x9682, 0x677A, 0x9683, 0x677B, 0x9684, 0x677D, 0x9685, 0x6780, + 0x9686, 0x6782, 0x9687, 0x6783, 0x9688, 0x6785, 0x9689, 0x6786, + 0x968A, 0x6788, 0x968B, 0x678A, 0x968C, 0x678C, 0x968D, 0x678D, + 0x968E, 0x678E, 0x968F, 0x678F, 0x9690, 0x6791, 0x9691, 0x6792, + 0x9692, 0x6793, 0x9693, 0x6794, 0x9694, 0x6796, 0x9695, 0x6799, + 0x9696, 0x679B, 0x9697, 0x679F, 0x9698, 0x67A0, 0x9699, 0x67A1, + 0x969A, 0x67A4, 0x969B, 0x67A6, 0x969C, 0x67A9, 0x969D, 0x67AC, + 0x969E, 0x67AE, 0x969F, 0x67B1, 0x96A0, 0x67B2, 0x96A1, 0x67B4, + 0x96A2, 0x67B9, 0x96A3, 0x67BA, 0x96A4, 0x67BB, 0x96A5, 0x67BC, + 0x96A6, 0x67BD, 0x96A7, 0x67BE, 0x96A8, 0x67BF, 0x96A9, 0x67C0, + 0x96AA, 0x67C2, 0x96AB, 0x67C5, 0x96AC, 0x67C6, 0x96AD, 0x67C7, + 0x96AE, 0x67C8, 0x96AF, 0x67C9, 0x96B0, 0x67CA, 0x96B1, 0x67CB, + 0x96B2, 0x67CC, 0x96B3, 0x67CD, 0x96B4, 0x67CE, 0x96B5, 0x67D5, + 0x96B6, 0x67D6, 0x96B7, 0x67D7, 0x96B8, 0x67DB, 0x96B9, 0x67DF, + 0x96BA, 0x67E1, 0x96BB, 0x67E3, 0x96BC, 0x67E4, 0x96BD, 0x67E6, + 0x96BE, 0x67E7, 0x96BF, 0x67E8, 0x96C0, 0x67EA, 0x96C1, 0x67EB, + 0x96C2, 0x67ED, 0x96C3, 0x67EE, 0x96C4, 0x67F2, 0x96C5, 0x67F5, + 0x96C6, 0x67F6, 0x96C7, 0x67F7, 0x96C8, 0x67F8, 0x96C9, 0x67F9, + 0x96CA, 0x67FA, 0x96CB, 0x67FB, 0x96CC, 0x67FC, 0x96CD, 0x67FE, + 0x96CE, 0x6801, 0x96CF, 0x6802, 0x96D0, 0x6803, 0x96D1, 0x6804, + 0x96D2, 0x6806, 0x96D3, 0x680D, 0x96D4, 0x6810, 0x96D5, 0x6812, + 0x96D6, 0x6814, 0x96D7, 0x6815, 0x96D8, 0x6818, 0x96D9, 0x6819, + 0x96DA, 0x681A, 0x96DB, 0x681B, 0x96DC, 0x681C, 0x96DD, 0x681E, + 0x96DE, 0x681F, 0x96DF, 0x6820, 0x96E0, 0x6822, 0x96E1, 0x6823, + 0x96E2, 0x6824, 0x96E3, 0x6825, 0x96E4, 0x6826, 0x96E5, 0x6827, + 0x96E6, 0x6828, 0x96E7, 0x682B, 0x96E8, 0x682C, 0x96E9, 0x682D, + 0x96EA, 0x682E, 0x96EB, 0x682F, 0x96EC, 0x6830, 0x96ED, 0x6831, + 0x96EE, 0x6834, 0x96EF, 0x6835, 0x96F0, 0x6836, 0x96F1, 0x683A, + 0x96F2, 0x683B, 0x96F3, 0x683F, 0x96F4, 0x6847, 0x96F5, 0x684B, + 0x96F6, 0x684D, 0x96F7, 0x684F, 0x96F8, 0x6852, 0x96F9, 0x6856, + 0x96FA, 0x6857, 0x96FB, 0x6858, 0x96FC, 0x6859, 0x96FD, 0x685A, + 0x96FE, 0x685B, 0x9740, 0x685C, 0x9741, 0x685D, 0x9742, 0x685E, + 0x9743, 0x685F, 0x9744, 0x686A, 0x9745, 0x686C, 0x9746, 0x686D, + 0x9747, 0x686E, 0x9748, 0x686F, 0x9749, 0x6870, 0x974A, 0x6871, + 0x974B, 0x6872, 0x974C, 0x6873, 0x974D, 0x6875, 0x974E, 0x6878, + 0x974F, 0x6879, 0x9750, 0x687A, 0x9751, 0x687B, 0x9752, 0x687C, + 0x9753, 0x687D, 0x9754, 0x687E, 0x9755, 0x687F, 0x9756, 0x6880, + 0x9757, 0x6882, 0x9758, 0x6884, 0x9759, 0x6887, 0x975A, 0x6888, + 0x975B, 0x6889, 0x975C, 0x688A, 0x975D, 0x688B, 0x975E, 0x688C, + 0x975F, 0x688D, 0x9760, 0x688E, 0x9761, 0x6890, 0x9762, 0x6891, + 0x9763, 0x6892, 0x9764, 0x6894, 0x9765, 0x6895, 0x9766, 0x6896, + 0x9767, 0x6898, 0x9768, 0x6899, 0x9769, 0x689A, 0x976A, 0x689B, + 0x976B, 0x689C, 0x976C, 0x689D, 0x976D, 0x689E, 0x976E, 0x689F, + 0x976F, 0x68A0, 0x9770, 0x68A1, 0x9771, 0x68A3, 0x9772, 0x68A4, + 0x9773, 0x68A5, 0x9774, 0x68A9, 0x9775, 0x68AA, 0x9776, 0x68AB, + 0x9777, 0x68AC, 0x9778, 0x68AE, 0x9779, 0x68B1, 0x977A, 0x68B2, + 0x977B, 0x68B4, 0x977C, 0x68B6, 0x977D, 0x68B7, 0x977E, 0x68B8, + 0x9780, 0x68B9, 0x9781, 0x68BA, 0x9782, 0x68BB, 0x9783, 0x68BC, + 0x9784, 0x68BD, 0x9785, 0x68BE, 0x9786, 0x68BF, 0x9787, 0x68C1, + 0x9788, 0x68C3, 0x9789, 0x68C4, 0x978A, 0x68C5, 0x978B, 0x68C6, + 0x978C, 0x68C7, 0x978D, 0x68C8, 0x978E, 0x68CA, 0x978F, 0x68CC, + 0x9790, 0x68CE, 0x9791, 0x68CF, 0x9792, 0x68D0, 0x9793, 0x68D1, + 0x9794, 0x68D3, 0x9795, 0x68D4, 0x9796, 0x68D6, 0x9797, 0x68D7, + 0x9798, 0x68D9, 0x9799, 0x68DB, 0x979A, 0x68DC, 0x979B, 0x68DD, + 0x979C, 0x68DE, 0x979D, 0x68DF, 0x979E, 0x68E1, 0x979F, 0x68E2, + 0x97A0, 0x68E4, 0x97A1, 0x68E5, 0x97A2, 0x68E6, 0x97A3, 0x68E7, + 0x97A4, 0x68E8, 0x97A5, 0x68E9, 0x97A6, 0x68EA, 0x97A7, 0x68EB, + 0x97A8, 0x68EC, 0x97A9, 0x68ED, 0x97AA, 0x68EF, 0x97AB, 0x68F2, + 0x97AC, 0x68F3, 0x97AD, 0x68F4, 0x97AE, 0x68F6, 0x97AF, 0x68F7, + 0x97B0, 0x68F8, 0x97B1, 0x68FB, 0x97B2, 0x68FD, 0x97B3, 0x68FE, + 0x97B4, 0x68FF, 0x97B5, 0x6900, 0x97B6, 0x6902, 0x97B7, 0x6903, + 0x97B8, 0x6904, 0x97B9, 0x6906, 0x97BA, 0x6907, 0x97BB, 0x6908, + 0x97BC, 0x6909, 0x97BD, 0x690A, 0x97BE, 0x690C, 0x97BF, 0x690F, + 0x97C0, 0x6911, 0x97C1, 0x6913, 0x97C2, 0x6914, 0x97C3, 0x6915, + 0x97C4, 0x6916, 0x97C5, 0x6917, 0x97C6, 0x6918, 0x97C7, 0x6919, + 0x97C8, 0x691A, 0x97C9, 0x691B, 0x97CA, 0x691C, 0x97CB, 0x691D, + 0x97CC, 0x691E, 0x97CD, 0x6921, 0x97CE, 0x6922, 0x97CF, 0x6923, + 0x97D0, 0x6925, 0x97D1, 0x6926, 0x97D2, 0x6927, 0x97D3, 0x6928, + 0x97D4, 0x6929, 0x97D5, 0x692A, 0x97D6, 0x692B, 0x97D7, 0x692C, + 0x97D8, 0x692E, 0x97D9, 0x692F, 0x97DA, 0x6931, 0x97DB, 0x6932, + 0x97DC, 0x6933, 0x97DD, 0x6935, 0x97DE, 0x6936, 0x97DF, 0x6937, + 0x97E0, 0x6938, 0x97E1, 0x693A, 0x97E2, 0x693B, 0x97E3, 0x693C, + 0x97E4, 0x693E, 0x97E5, 0x6940, 0x97E6, 0x6941, 0x97E7, 0x6943, + 0x97E8, 0x6944, 0x97E9, 0x6945, 0x97EA, 0x6946, 0x97EB, 0x6947, + 0x97EC, 0x6948, 0x97ED, 0x6949, 0x97EE, 0x694A, 0x97EF, 0x694B, + 0x97F0, 0x694C, 0x97F1, 0x694D, 0x97F2, 0x694E, 0x97F3, 0x694F, + 0x97F4, 0x6950, 0x97F5, 0x6951, 0x97F6, 0x6952, 0x97F7, 0x6953, + 0x97F8, 0x6955, 0x97F9, 0x6956, 0x97FA, 0x6958, 0x97FB, 0x6959, + 0x97FC, 0x695B, 0x97FD, 0x695C, 0x97FE, 0x695F, 0x9840, 0x6961, + 0x9841, 0x6962, 0x9842, 0x6964, 0x9843, 0x6965, 0x9844, 0x6967, + 0x9845, 0x6968, 0x9846, 0x6969, 0x9847, 0x696A, 0x9848, 0x696C, + 0x9849, 0x696D, 0x984A, 0x696F, 0x984B, 0x6970, 0x984C, 0x6972, + 0x984D, 0x6973, 0x984E, 0x6974, 0x984F, 0x6975, 0x9850, 0x6976, + 0x9851, 0x697A, 0x9852, 0x697B, 0x9853, 0x697D, 0x9854, 0x697E, + 0x9855, 0x697F, 0x9856, 0x6981, 0x9857, 0x6983, 0x9858, 0x6985, + 0x9859, 0x698A, 0x985A, 0x698B, 0x985B, 0x698C, 0x985C, 0x698E, + 0x985D, 0x698F, 0x985E, 0x6990, 0x985F, 0x6991, 0x9860, 0x6992, + 0x9861, 0x6993, 0x9862, 0x6996, 0x9863, 0x6997, 0x9864, 0x6999, + 0x9865, 0x699A, 0x9866, 0x699D, 0x9867, 0x699E, 0x9868, 0x699F, + 0x9869, 0x69A0, 0x986A, 0x69A1, 0x986B, 0x69A2, 0x986C, 0x69A3, + 0x986D, 0x69A4, 0x986E, 0x69A5, 0x986F, 0x69A6, 0x9870, 0x69A9, + 0x9871, 0x69AA, 0x9872, 0x69AC, 0x9873, 0x69AE, 0x9874, 0x69AF, + 0x9875, 0x69B0, 0x9876, 0x69B2, 0x9877, 0x69B3, 0x9878, 0x69B5, + 0x9879, 0x69B6, 0x987A, 0x69B8, 0x987B, 0x69B9, 0x987C, 0x69BA, + 0x987D, 0x69BC, 0x987E, 0x69BD, 0x9880, 0x69BE, 0x9881, 0x69BF, + 0x9882, 0x69C0, 0x9883, 0x69C2, 0x9884, 0x69C3, 0x9885, 0x69C4, + 0x9886, 0x69C5, 0x9887, 0x69C6, 0x9888, 0x69C7, 0x9889, 0x69C8, + 0x988A, 0x69C9, 0x988B, 0x69CB, 0x988C, 0x69CD, 0x988D, 0x69CF, + 0x988E, 0x69D1, 0x988F, 0x69D2, 0x9890, 0x69D3, 0x9891, 0x69D5, + 0x9892, 0x69D6, 0x9893, 0x69D7, 0x9894, 0x69D8, 0x9895, 0x69D9, + 0x9896, 0x69DA, 0x9897, 0x69DC, 0x9898, 0x69DD, 0x9899, 0x69DE, + 0x989A, 0x69E1, 0x989B, 0x69E2, 0x989C, 0x69E3, 0x989D, 0x69E4, + 0x989E, 0x69E5, 0x989F, 0x69E6, 0x98A0, 0x69E7, 0x98A1, 0x69E8, + 0x98A2, 0x69E9, 0x98A3, 0x69EA, 0x98A4, 0x69EB, 0x98A5, 0x69EC, + 0x98A6, 0x69EE, 0x98A7, 0x69EF, 0x98A8, 0x69F0, 0x98A9, 0x69F1, + 0x98AA, 0x69F3, 0x98AB, 0x69F4, 0x98AC, 0x69F5, 0x98AD, 0x69F6, + 0x98AE, 0x69F7, 0x98AF, 0x69F8, 0x98B0, 0x69F9, 0x98B1, 0x69FA, + 0x98B2, 0x69FB, 0x98B3, 0x69FC, 0x98B4, 0x69FE, 0x98B5, 0x6A00, + 0x98B6, 0x6A01, 0x98B7, 0x6A02, 0x98B8, 0x6A03, 0x98B9, 0x6A04, + 0x98BA, 0x6A05, 0x98BB, 0x6A06, 0x98BC, 0x6A07, 0x98BD, 0x6A08, + 0x98BE, 0x6A09, 0x98BF, 0x6A0B, 0x98C0, 0x6A0C, 0x98C1, 0x6A0D, + 0x98C2, 0x6A0E, 0x98C3, 0x6A0F, 0x98C4, 0x6A10, 0x98C5, 0x6A11, + 0x98C6, 0x6A12, 0x98C7, 0x6A13, 0x98C8, 0x6A14, 0x98C9, 0x6A15, + 0x98CA, 0x6A16, 0x98CB, 0x6A19, 0x98CC, 0x6A1A, 0x98CD, 0x6A1B, + 0x98CE, 0x6A1C, 0x98CF, 0x6A1D, 0x98D0, 0x6A1E, 0x98D1, 0x6A20, + 0x98D2, 0x6A22, 0x98D3, 0x6A23, 0x98D4, 0x6A24, 0x98D5, 0x6A25, + 0x98D6, 0x6A26, 0x98D7, 0x6A27, 0x98D8, 0x6A29, 0x98D9, 0x6A2B, + 0x98DA, 0x6A2C, 0x98DB, 0x6A2D, 0x98DC, 0x6A2E, 0x98DD, 0x6A30, + 0x98DE, 0x6A32, 0x98DF, 0x6A33, 0x98E0, 0x6A34, 0x98E1, 0x6A36, + 0x98E2, 0x6A37, 0x98E3, 0x6A38, 0x98E4, 0x6A39, 0x98E5, 0x6A3A, + 0x98E6, 0x6A3B, 0x98E7, 0x6A3C, 0x98E8, 0x6A3F, 0x98E9, 0x6A40, + 0x98EA, 0x6A41, 0x98EB, 0x6A42, 0x98EC, 0x6A43, 0x98ED, 0x6A45, + 0x98EE, 0x6A46, 0x98EF, 0x6A48, 0x98F0, 0x6A49, 0x98F1, 0x6A4A, + 0x98F2, 0x6A4B, 0x98F3, 0x6A4C, 0x98F4, 0x6A4D, 0x98F5, 0x6A4E, + 0x98F6, 0x6A4F, 0x98F7, 0x6A51, 0x98F8, 0x6A52, 0x98F9, 0x6A53, + 0x98FA, 0x6A54, 0x98FB, 0x6A55, 0x98FC, 0x6A56, 0x98FD, 0x6A57, + 0x98FE, 0x6A5A, 0x9940, 0x6A5C, 0x9941, 0x6A5D, 0x9942, 0x6A5E, + 0x9943, 0x6A5F, 0x9944, 0x6A60, 0x9945, 0x6A62, 0x9946, 0x6A63, + 0x9947, 0x6A64, 0x9948, 0x6A66, 0x9949, 0x6A67, 0x994A, 0x6A68, + 0x994B, 0x6A69, 0x994C, 0x6A6A, 0x994D, 0x6A6B, 0x994E, 0x6A6C, + 0x994F, 0x6A6D, 0x9950, 0x6A6E, 0x9951, 0x6A6F, 0x9952, 0x6A70, + 0x9953, 0x6A72, 0x9954, 0x6A73, 0x9955, 0x6A74, 0x9956, 0x6A75, + 0x9957, 0x6A76, 0x9958, 0x6A77, 0x9959, 0x6A78, 0x995A, 0x6A7A, + 0x995B, 0x6A7B, 0x995C, 0x6A7D, 0x995D, 0x6A7E, 0x995E, 0x6A7F, + 0x995F, 0x6A81, 0x9960, 0x6A82, 0x9961, 0x6A83, 0x9962, 0x6A85, + 0x9963, 0x6A86, 0x9964, 0x6A87, 0x9965, 0x6A88, 0x9966, 0x6A89, + 0x9967, 0x6A8A, 0x9968, 0x6A8B, 0x9969, 0x6A8C, 0x996A, 0x6A8D, + 0x996B, 0x6A8F, 0x996C, 0x6A92, 0x996D, 0x6A93, 0x996E, 0x6A94, + 0x996F, 0x6A95, 0x9970, 0x6A96, 0x9971, 0x6A98, 0x9972, 0x6A99, + 0x9973, 0x6A9A, 0x9974, 0x6A9B, 0x9975, 0x6A9C, 0x9976, 0x6A9D, + 0x9977, 0x6A9E, 0x9978, 0x6A9F, 0x9979, 0x6AA1, 0x997A, 0x6AA2, + 0x997B, 0x6AA3, 0x997C, 0x6AA4, 0x997D, 0x6AA5, 0x997E, 0x6AA6, + 0x9980, 0x6AA7, 0x9981, 0x6AA8, 0x9982, 0x6AAA, 0x9983, 0x6AAD, + 0x9984, 0x6AAE, 0x9985, 0x6AAF, 0x9986, 0x6AB0, 0x9987, 0x6AB1, + 0x9988, 0x6AB2, 0x9989, 0x6AB3, 0x998A, 0x6AB4, 0x998B, 0x6AB5, + 0x998C, 0x6AB6, 0x998D, 0x6AB7, 0x998E, 0x6AB8, 0x998F, 0x6AB9, + 0x9990, 0x6ABA, 0x9991, 0x6ABB, 0x9992, 0x6ABC, 0x9993, 0x6ABD, + 0x9994, 0x6ABE, 0x9995, 0x6ABF, 0x9996, 0x6AC0, 0x9997, 0x6AC1, + 0x9998, 0x6AC2, 0x9999, 0x6AC3, 0x999A, 0x6AC4, 0x999B, 0x6AC5, + 0x999C, 0x6AC6, 0x999D, 0x6AC7, 0x999E, 0x6AC8, 0x999F, 0x6AC9, + 0x99A0, 0x6ACA, 0x99A1, 0x6ACB, 0x99A2, 0x6ACC, 0x99A3, 0x6ACD, + 0x99A4, 0x6ACE, 0x99A5, 0x6ACF, 0x99A6, 0x6AD0, 0x99A7, 0x6AD1, + 0x99A8, 0x6AD2, 0x99A9, 0x6AD3, 0x99AA, 0x6AD4, 0x99AB, 0x6AD5, + 0x99AC, 0x6AD6, 0x99AD, 0x6AD7, 0x99AE, 0x6AD8, 0x99AF, 0x6AD9, + 0x99B0, 0x6ADA, 0x99B1, 0x6ADB, 0x99B2, 0x6ADC, 0x99B3, 0x6ADD, + 0x99B4, 0x6ADE, 0x99B5, 0x6ADF, 0x99B6, 0x6AE0, 0x99B7, 0x6AE1, + 0x99B8, 0x6AE2, 0x99B9, 0x6AE3, 0x99BA, 0x6AE4, 0x99BB, 0x6AE5, + 0x99BC, 0x6AE6, 0x99BD, 0x6AE7, 0x99BE, 0x6AE8, 0x99BF, 0x6AE9, + 0x99C0, 0x6AEA, 0x99C1, 0x6AEB, 0x99C2, 0x6AEC, 0x99C3, 0x6AED, + 0x99C4, 0x6AEE, 0x99C5, 0x6AEF, 0x99C6, 0x6AF0, 0x99C7, 0x6AF1, + 0x99C8, 0x6AF2, 0x99C9, 0x6AF3, 0x99CA, 0x6AF4, 0x99CB, 0x6AF5, + 0x99CC, 0x6AF6, 0x99CD, 0x6AF7, 0x99CE, 0x6AF8, 0x99CF, 0x6AF9, + 0x99D0, 0x6AFA, 0x99D1, 0x6AFB, 0x99D2, 0x6AFC, 0x99D3, 0x6AFD, + 0x99D4, 0x6AFE, 0x99D5, 0x6AFF, 0x99D6, 0x6B00, 0x99D7, 0x6B01, + 0x99D8, 0x6B02, 0x99D9, 0x6B03, 0x99DA, 0x6B04, 0x99DB, 0x6B05, + 0x99DC, 0x6B06, 0x99DD, 0x6B07, 0x99DE, 0x6B08, 0x99DF, 0x6B09, + 0x99E0, 0x6B0A, 0x99E1, 0x6B0B, 0x99E2, 0x6B0C, 0x99E3, 0x6B0D, + 0x99E4, 0x6B0E, 0x99E5, 0x6B0F, 0x99E6, 0x6B10, 0x99E7, 0x6B11, + 0x99E8, 0x6B12, 0x99E9, 0x6B13, 0x99EA, 0x6B14, 0x99EB, 0x6B15, + 0x99EC, 0x6B16, 0x99ED, 0x6B17, 0x99EE, 0x6B18, 0x99EF, 0x6B19, + 0x99F0, 0x6B1A, 0x99F1, 0x6B1B, 0x99F2, 0x6B1C, 0x99F3, 0x6B1D, + 0x99F4, 0x6B1E, 0x99F5, 0x6B1F, 0x99F6, 0x6B25, 0x99F7, 0x6B26, + 0x99F8, 0x6B28, 0x99F9, 0x6B29, 0x99FA, 0x6B2A, 0x99FB, 0x6B2B, + 0x99FC, 0x6B2C, 0x99FD, 0x6B2D, 0x99FE, 0x6B2E, 0x9A40, 0x6B2F, + 0x9A41, 0x6B30, 0x9A42, 0x6B31, 0x9A43, 0x6B33, 0x9A44, 0x6B34, + 0x9A45, 0x6B35, 0x9A46, 0x6B36, 0x9A47, 0x6B38, 0x9A48, 0x6B3B, + 0x9A49, 0x6B3C, 0x9A4A, 0x6B3D, 0x9A4B, 0x6B3F, 0x9A4C, 0x6B40, + 0x9A4D, 0x6B41, 0x9A4E, 0x6B42, 0x9A4F, 0x6B44, 0x9A50, 0x6B45, + 0x9A51, 0x6B48, 0x9A52, 0x6B4A, 0x9A53, 0x6B4B, 0x9A54, 0x6B4D, + 0x9A55, 0x6B4E, 0x9A56, 0x6B4F, 0x9A57, 0x6B50, 0x9A58, 0x6B51, + 0x9A59, 0x6B52, 0x9A5A, 0x6B53, 0x9A5B, 0x6B54, 0x9A5C, 0x6B55, + 0x9A5D, 0x6B56, 0x9A5E, 0x6B57, 0x9A5F, 0x6B58, 0x9A60, 0x6B5A, + 0x9A61, 0x6B5B, 0x9A62, 0x6B5C, 0x9A63, 0x6B5D, 0x9A64, 0x6B5E, + 0x9A65, 0x6B5F, 0x9A66, 0x6B60, 0x9A67, 0x6B61, 0x9A68, 0x6B68, + 0x9A69, 0x6B69, 0x9A6A, 0x6B6B, 0x9A6B, 0x6B6C, 0x9A6C, 0x6B6D, + 0x9A6D, 0x6B6E, 0x9A6E, 0x6B6F, 0x9A6F, 0x6B70, 0x9A70, 0x6B71, + 0x9A71, 0x6B72, 0x9A72, 0x6B73, 0x9A73, 0x6B74, 0x9A74, 0x6B75, + 0x9A75, 0x6B76, 0x9A76, 0x6B77, 0x9A77, 0x6B78, 0x9A78, 0x6B7A, + 0x9A79, 0x6B7D, 0x9A7A, 0x6B7E, 0x9A7B, 0x6B7F, 0x9A7C, 0x6B80, + 0x9A7D, 0x6B85, 0x9A7E, 0x6B88, 0x9A80, 0x6B8C, 0x9A81, 0x6B8E, + 0x9A82, 0x6B8F, 0x9A83, 0x6B90, 0x9A84, 0x6B91, 0x9A85, 0x6B94, + 0x9A86, 0x6B95, 0x9A87, 0x6B97, 0x9A88, 0x6B98, 0x9A89, 0x6B99, + 0x9A8A, 0x6B9C, 0x9A8B, 0x6B9D, 0x9A8C, 0x6B9E, 0x9A8D, 0x6B9F, + 0x9A8E, 0x6BA0, 0x9A8F, 0x6BA2, 0x9A90, 0x6BA3, 0x9A91, 0x6BA4, + 0x9A92, 0x6BA5, 0x9A93, 0x6BA6, 0x9A94, 0x6BA7, 0x9A95, 0x6BA8, + 0x9A96, 0x6BA9, 0x9A97, 0x6BAB, 0x9A98, 0x6BAC, 0x9A99, 0x6BAD, + 0x9A9A, 0x6BAE, 0x9A9B, 0x6BAF, 0x9A9C, 0x6BB0, 0x9A9D, 0x6BB1, + 0x9A9E, 0x6BB2, 0x9A9F, 0x6BB6, 0x9AA0, 0x6BB8, 0x9AA1, 0x6BB9, + 0x9AA2, 0x6BBA, 0x9AA3, 0x6BBB, 0x9AA4, 0x6BBC, 0x9AA5, 0x6BBD, + 0x9AA6, 0x6BBE, 0x9AA7, 0x6BC0, 0x9AA8, 0x6BC3, 0x9AA9, 0x6BC4, + 0x9AAA, 0x6BC6, 0x9AAB, 0x6BC7, 0x9AAC, 0x6BC8, 0x9AAD, 0x6BC9, + 0x9AAE, 0x6BCA, 0x9AAF, 0x6BCC, 0x9AB0, 0x6BCE, 0x9AB1, 0x6BD0, + 0x9AB2, 0x6BD1, 0x9AB3, 0x6BD8, 0x9AB4, 0x6BDA, 0x9AB5, 0x6BDC, + 0x9AB6, 0x6BDD, 0x9AB7, 0x6BDE, 0x9AB8, 0x6BDF, 0x9AB9, 0x6BE0, + 0x9ABA, 0x6BE2, 0x9ABB, 0x6BE3, 0x9ABC, 0x6BE4, 0x9ABD, 0x6BE5, + 0x9ABE, 0x6BE6, 0x9ABF, 0x6BE7, 0x9AC0, 0x6BE8, 0x9AC1, 0x6BE9, + 0x9AC2, 0x6BEC, 0x9AC3, 0x6BED, 0x9AC4, 0x6BEE, 0x9AC5, 0x6BF0, + 0x9AC6, 0x6BF1, 0x9AC7, 0x6BF2, 0x9AC8, 0x6BF4, 0x9AC9, 0x6BF6, + 0x9ACA, 0x6BF7, 0x9ACB, 0x6BF8, 0x9ACC, 0x6BFA, 0x9ACD, 0x6BFB, + 0x9ACE, 0x6BFC, 0x9ACF, 0x6BFE, 0x9AD0, 0x6BFF, 0x9AD1, 0x6C00, + 0x9AD2, 0x6C01, 0x9AD3, 0x6C02, 0x9AD4, 0x6C03, 0x9AD5, 0x6C04, + 0x9AD6, 0x6C08, 0x9AD7, 0x6C09, 0x9AD8, 0x6C0A, 0x9AD9, 0x6C0B, + 0x9ADA, 0x6C0C, 0x9ADB, 0x6C0E, 0x9ADC, 0x6C12, 0x9ADD, 0x6C17, + 0x9ADE, 0x6C1C, 0x9ADF, 0x6C1D, 0x9AE0, 0x6C1E, 0x9AE1, 0x6C20, + 0x9AE2, 0x6C23, 0x9AE3, 0x6C25, 0x9AE4, 0x6C2B, 0x9AE5, 0x6C2C, + 0x9AE6, 0x6C2D, 0x9AE7, 0x6C31, 0x9AE8, 0x6C33, 0x9AE9, 0x6C36, + 0x9AEA, 0x6C37, 0x9AEB, 0x6C39, 0x9AEC, 0x6C3A, 0x9AED, 0x6C3B, + 0x9AEE, 0x6C3C, 0x9AEF, 0x6C3E, 0x9AF0, 0x6C3F, 0x9AF1, 0x6C43, + 0x9AF2, 0x6C44, 0x9AF3, 0x6C45, 0x9AF4, 0x6C48, 0x9AF5, 0x6C4B, + 0x9AF6, 0x6C4C, 0x9AF7, 0x6C4D, 0x9AF8, 0x6C4E, 0x9AF9, 0x6C4F, + 0x9AFA, 0x6C51, 0x9AFB, 0x6C52, 0x9AFC, 0x6C53, 0x9AFD, 0x6C56, + 0x9AFE, 0x6C58, 0x9B40, 0x6C59, 0x9B41, 0x6C5A, 0x9B42, 0x6C62, + 0x9B43, 0x6C63, 0x9B44, 0x6C65, 0x9B45, 0x6C66, 0x9B46, 0x6C67, + 0x9B47, 0x6C6B, 0x9B48, 0x6C6C, 0x9B49, 0x6C6D, 0x9B4A, 0x6C6E, + 0x9B4B, 0x6C6F, 0x9B4C, 0x6C71, 0x9B4D, 0x6C73, 0x9B4E, 0x6C75, + 0x9B4F, 0x6C77, 0x9B50, 0x6C78, 0x9B51, 0x6C7A, 0x9B52, 0x6C7B, + 0x9B53, 0x6C7C, 0x9B54, 0x6C7F, 0x9B55, 0x6C80, 0x9B56, 0x6C84, + 0x9B57, 0x6C87, 0x9B58, 0x6C8A, 0x9B59, 0x6C8B, 0x9B5A, 0x6C8D, + 0x9B5B, 0x6C8E, 0x9B5C, 0x6C91, 0x9B5D, 0x6C92, 0x9B5E, 0x6C95, + 0x9B5F, 0x6C96, 0x9B60, 0x6C97, 0x9B61, 0x6C98, 0x9B62, 0x6C9A, + 0x9B63, 0x6C9C, 0x9B64, 0x6C9D, 0x9B65, 0x6C9E, 0x9B66, 0x6CA0, + 0x9B67, 0x6CA2, 0x9B68, 0x6CA8, 0x9B69, 0x6CAC, 0x9B6A, 0x6CAF, + 0x9B6B, 0x6CB0, 0x9B6C, 0x6CB4, 0x9B6D, 0x6CB5, 0x9B6E, 0x6CB6, + 0x9B6F, 0x6CB7, 0x9B70, 0x6CBA, 0x9B71, 0x6CC0, 0x9B72, 0x6CC1, + 0x9B73, 0x6CC2, 0x9B74, 0x6CC3, 0x9B75, 0x6CC6, 0x9B76, 0x6CC7, + 0x9B77, 0x6CC8, 0x9B78, 0x6CCB, 0x9B79, 0x6CCD, 0x9B7A, 0x6CCE, + 0x9B7B, 0x6CCF, 0x9B7C, 0x6CD1, 0x9B7D, 0x6CD2, 0x9B7E, 0x6CD8, + 0x9B80, 0x6CD9, 0x9B81, 0x6CDA, 0x9B82, 0x6CDC, 0x9B83, 0x6CDD, + 0x9B84, 0x6CDF, 0x9B85, 0x6CE4, 0x9B86, 0x6CE6, 0x9B87, 0x6CE7, + 0x9B88, 0x6CE9, 0x9B89, 0x6CEC, 0x9B8A, 0x6CED, 0x9B8B, 0x6CF2, + 0x9B8C, 0x6CF4, 0x9B8D, 0x6CF9, 0x9B8E, 0x6CFF, 0x9B8F, 0x6D00, + 0x9B90, 0x6D02, 0x9B91, 0x6D03, 0x9B92, 0x6D05, 0x9B93, 0x6D06, + 0x9B94, 0x6D08, 0x9B95, 0x6D09, 0x9B96, 0x6D0A, 0x9B97, 0x6D0D, + 0x9B98, 0x6D0F, 0x9B99, 0x6D10, 0x9B9A, 0x6D11, 0x9B9B, 0x6D13, + 0x9B9C, 0x6D14, 0x9B9D, 0x6D15, 0x9B9E, 0x6D16, 0x9B9F, 0x6D18, + 0x9BA0, 0x6D1C, 0x9BA1, 0x6D1D, 0x9BA2, 0x6D1F, 0x9BA3, 0x6D20, + 0x9BA4, 0x6D21, 0x9BA5, 0x6D22, 0x9BA6, 0x6D23, 0x9BA7, 0x6D24, + 0x9BA8, 0x6D26, 0x9BA9, 0x6D28, 0x9BAA, 0x6D29, 0x9BAB, 0x6D2C, + 0x9BAC, 0x6D2D, 0x9BAD, 0x6D2F, 0x9BAE, 0x6D30, 0x9BAF, 0x6D34, + 0x9BB0, 0x6D36, 0x9BB1, 0x6D37, 0x9BB2, 0x6D38, 0x9BB3, 0x6D3A, + 0x9BB4, 0x6D3F, 0x9BB5, 0x6D40, 0x9BB6, 0x6D42, 0x9BB7, 0x6D44, + 0x9BB8, 0x6D49, 0x9BB9, 0x6D4C, 0x9BBA, 0x6D50, 0x9BBB, 0x6D55, + 0x9BBC, 0x6D56, 0x9BBD, 0x6D57, 0x9BBE, 0x6D58, 0x9BBF, 0x6D5B, + 0x9BC0, 0x6D5D, 0x9BC1, 0x6D5F, 0x9BC2, 0x6D61, 0x9BC3, 0x6D62, + 0x9BC4, 0x6D64, 0x9BC5, 0x6D65, 0x9BC6, 0x6D67, 0x9BC7, 0x6D68, + 0x9BC8, 0x6D6B, 0x9BC9, 0x6D6C, 0x9BCA, 0x6D6D, 0x9BCB, 0x6D70, + 0x9BCC, 0x6D71, 0x9BCD, 0x6D72, 0x9BCE, 0x6D73, 0x9BCF, 0x6D75, + 0x9BD0, 0x6D76, 0x9BD1, 0x6D79, 0x9BD2, 0x6D7A, 0x9BD3, 0x6D7B, + 0x9BD4, 0x6D7D, 0x9BD5, 0x6D7E, 0x9BD6, 0x6D7F, 0x9BD7, 0x6D80, + 0x9BD8, 0x6D81, 0x9BD9, 0x6D83, 0x9BDA, 0x6D84, 0x9BDB, 0x6D86, + 0x9BDC, 0x6D87, 0x9BDD, 0x6D8A, 0x9BDE, 0x6D8B, 0x9BDF, 0x6D8D, + 0x9BE0, 0x6D8F, 0x9BE1, 0x6D90, 0x9BE2, 0x6D92, 0x9BE3, 0x6D96, + 0x9BE4, 0x6D97, 0x9BE5, 0x6D98, 0x9BE6, 0x6D99, 0x9BE7, 0x6D9A, + 0x9BE8, 0x6D9C, 0x9BE9, 0x6DA2, 0x9BEA, 0x6DA5, 0x9BEB, 0x6DAC, + 0x9BEC, 0x6DAD, 0x9BED, 0x6DB0, 0x9BEE, 0x6DB1, 0x9BEF, 0x6DB3, + 0x9BF0, 0x6DB4, 0x9BF1, 0x6DB6, 0x9BF2, 0x6DB7, 0x9BF3, 0x6DB9, + 0x9BF4, 0x6DBA, 0x9BF5, 0x6DBB, 0x9BF6, 0x6DBC, 0x9BF7, 0x6DBD, + 0x9BF8, 0x6DBE, 0x9BF9, 0x6DC1, 0x9BFA, 0x6DC2, 0x9BFB, 0x6DC3, + 0x9BFC, 0x6DC8, 0x9BFD, 0x6DC9, 0x9BFE, 0x6DCA, 0x9C40, 0x6DCD, + 0x9C41, 0x6DCE, 0x9C42, 0x6DCF, 0x9C43, 0x6DD0, 0x9C44, 0x6DD2, + 0x9C45, 0x6DD3, 0x9C46, 0x6DD4, 0x9C47, 0x6DD5, 0x9C48, 0x6DD7, + 0x9C49, 0x6DDA, 0x9C4A, 0x6DDB, 0x9C4B, 0x6DDC, 0x9C4C, 0x6DDF, + 0x9C4D, 0x6DE2, 0x9C4E, 0x6DE3, 0x9C4F, 0x6DE5, 0x9C50, 0x6DE7, + 0x9C51, 0x6DE8, 0x9C52, 0x6DE9, 0x9C53, 0x6DEA, 0x9C54, 0x6DED, + 0x9C55, 0x6DEF, 0x9C56, 0x6DF0, 0x9C57, 0x6DF2, 0x9C58, 0x6DF4, + 0x9C59, 0x6DF5, 0x9C5A, 0x6DF6, 0x9C5B, 0x6DF8, 0x9C5C, 0x6DFA, + 0x9C5D, 0x6DFD, 0x9C5E, 0x6DFE, 0x9C5F, 0x6DFF, 0x9C60, 0x6E00, + 0x9C61, 0x6E01, 0x9C62, 0x6E02, 0x9C63, 0x6E03, 0x9C64, 0x6E04, + 0x9C65, 0x6E06, 0x9C66, 0x6E07, 0x9C67, 0x6E08, 0x9C68, 0x6E09, + 0x9C69, 0x6E0B, 0x9C6A, 0x6E0F, 0x9C6B, 0x6E12, 0x9C6C, 0x6E13, + 0x9C6D, 0x6E15, 0x9C6E, 0x6E18, 0x9C6F, 0x6E19, 0x9C70, 0x6E1B, + 0x9C71, 0x6E1C, 0x9C72, 0x6E1E, 0x9C73, 0x6E1F, 0x9C74, 0x6E22, + 0x9C75, 0x6E26, 0x9C76, 0x6E27, 0x9C77, 0x6E28, 0x9C78, 0x6E2A, + 0x9C79, 0x6E2C, 0x9C7A, 0x6E2E, 0x9C7B, 0x6E30, 0x9C7C, 0x6E31, + 0x9C7D, 0x6E33, 0x9C7E, 0x6E35, 0x9C80, 0x6E36, 0x9C81, 0x6E37, + 0x9C82, 0x6E39, 0x9C83, 0x6E3B, 0x9C84, 0x6E3C, 0x9C85, 0x6E3D, + 0x9C86, 0x6E3E, 0x9C87, 0x6E3F, 0x9C88, 0x6E40, 0x9C89, 0x6E41, + 0x9C8A, 0x6E42, 0x9C8B, 0x6E45, 0x9C8C, 0x6E46, 0x9C8D, 0x6E47, + 0x9C8E, 0x6E48, 0x9C8F, 0x6E49, 0x9C90, 0x6E4A, 0x9C91, 0x6E4B, + 0x9C92, 0x6E4C, 0x9C93, 0x6E4F, 0x9C94, 0x6E50, 0x9C95, 0x6E51, + 0x9C96, 0x6E52, 0x9C97, 0x6E55, 0x9C98, 0x6E57, 0x9C99, 0x6E59, + 0x9C9A, 0x6E5A, 0x9C9B, 0x6E5C, 0x9C9C, 0x6E5D, 0x9C9D, 0x6E5E, + 0x9C9E, 0x6E60, 0x9C9F, 0x6E61, 0x9CA0, 0x6E62, 0x9CA1, 0x6E63, + 0x9CA2, 0x6E64, 0x9CA3, 0x6E65, 0x9CA4, 0x6E66, 0x9CA5, 0x6E67, + 0x9CA6, 0x6E68, 0x9CA7, 0x6E69, 0x9CA8, 0x6E6A, 0x9CA9, 0x6E6C, + 0x9CAA, 0x6E6D, 0x9CAB, 0x6E6F, 0x9CAC, 0x6E70, 0x9CAD, 0x6E71, + 0x9CAE, 0x6E72, 0x9CAF, 0x6E73, 0x9CB0, 0x6E74, 0x9CB1, 0x6E75, + 0x9CB2, 0x6E76, 0x9CB3, 0x6E77, 0x9CB4, 0x6E78, 0x9CB5, 0x6E79, + 0x9CB6, 0x6E7A, 0x9CB7, 0x6E7B, 0x9CB8, 0x6E7C, 0x9CB9, 0x6E7D, + 0x9CBA, 0x6E80, 0x9CBB, 0x6E81, 0x9CBC, 0x6E82, 0x9CBD, 0x6E84, + 0x9CBE, 0x6E87, 0x9CBF, 0x6E88, 0x9CC0, 0x6E8A, 0x9CC1, 0x6E8B, + 0x9CC2, 0x6E8C, 0x9CC3, 0x6E8D, 0x9CC4, 0x6E8E, 0x9CC5, 0x6E91, + 0x9CC6, 0x6E92, 0x9CC7, 0x6E93, 0x9CC8, 0x6E94, 0x9CC9, 0x6E95, + 0x9CCA, 0x6E96, 0x9CCB, 0x6E97, 0x9CCC, 0x6E99, 0x9CCD, 0x6E9A, + 0x9CCE, 0x6E9B, 0x9CCF, 0x6E9D, 0x9CD0, 0x6E9E, 0x9CD1, 0x6EA0, + 0x9CD2, 0x6EA1, 0x9CD3, 0x6EA3, 0x9CD4, 0x6EA4, 0x9CD5, 0x6EA6, + 0x9CD6, 0x6EA8, 0x9CD7, 0x6EA9, 0x9CD8, 0x6EAB, 0x9CD9, 0x6EAC, + 0x9CDA, 0x6EAD, 0x9CDB, 0x6EAE, 0x9CDC, 0x6EB0, 0x9CDD, 0x6EB3, + 0x9CDE, 0x6EB5, 0x9CDF, 0x6EB8, 0x9CE0, 0x6EB9, 0x9CE1, 0x6EBC, + 0x9CE2, 0x6EBE, 0x9CE3, 0x6EBF, 0x9CE4, 0x6EC0, 0x9CE5, 0x6EC3, + 0x9CE6, 0x6EC4, 0x9CE7, 0x6EC5, 0x9CE8, 0x6EC6, 0x9CE9, 0x6EC8, + 0x9CEA, 0x6EC9, 0x9CEB, 0x6ECA, 0x9CEC, 0x6ECC, 0x9CED, 0x6ECD, + 0x9CEE, 0x6ECE, 0x9CEF, 0x6ED0, 0x9CF0, 0x6ED2, 0x9CF1, 0x6ED6, + 0x9CF2, 0x6ED8, 0x9CF3, 0x6ED9, 0x9CF4, 0x6EDB, 0x9CF5, 0x6EDC, + 0x9CF6, 0x6EDD, 0x9CF7, 0x6EE3, 0x9CF8, 0x6EE7, 0x9CF9, 0x6EEA, + 0x9CFA, 0x6EEB, 0x9CFB, 0x6EEC, 0x9CFC, 0x6EED, 0x9CFD, 0x6EEE, + 0x9CFE, 0x6EEF, 0x9D40, 0x6EF0, 0x9D41, 0x6EF1, 0x9D42, 0x6EF2, + 0x9D43, 0x6EF3, 0x9D44, 0x6EF5, 0x9D45, 0x6EF6, 0x9D46, 0x6EF7, + 0x9D47, 0x6EF8, 0x9D48, 0x6EFA, 0x9D49, 0x6EFB, 0x9D4A, 0x6EFC, + 0x9D4B, 0x6EFD, 0x9D4C, 0x6EFE, 0x9D4D, 0x6EFF, 0x9D4E, 0x6F00, + 0x9D4F, 0x6F01, 0x9D50, 0x6F03, 0x9D51, 0x6F04, 0x9D52, 0x6F05, + 0x9D53, 0x6F07, 0x9D54, 0x6F08, 0x9D55, 0x6F0A, 0x9D56, 0x6F0B, + 0x9D57, 0x6F0C, 0x9D58, 0x6F0D, 0x9D59, 0x6F0E, 0x9D5A, 0x6F10, + 0x9D5B, 0x6F11, 0x9D5C, 0x6F12, 0x9D5D, 0x6F16, 0x9D5E, 0x6F17, + 0x9D5F, 0x6F18, 0x9D60, 0x6F19, 0x9D61, 0x6F1A, 0x9D62, 0x6F1B, + 0x9D63, 0x6F1C, 0x9D64, 0x6F1D, 0x9D65, 0x6F1E, 0x9D66, 0x6F1F, + 0x9D67, 0x6F21, 0x9D68, 0x6F22, 0x9D69, 0x6F23, 0x9D6A, 0x6F25, + 0x9D6B, 0x6F26, 0x9D6C, 0x6F27, 0x9D6D, 0x6F28, 0x9D6E, 0x6F2C, + 0x9D6F, 0x6F2E, 0x9D70, 0x6F30, 0x9D71, 0x6F32, 0x9D72, 0x6F34, + 0x9D73, 0x6F35, 0x9D74, 0x6F37, 0x9D75, 0x6F38, 0x9D76, 0x6F39, + 0x9D77, 0x6F3A, 0x9D78, 0x6F3B, 0x9D79, 0x6F3C, 0x9D7A, 0x6F3D, + 0x9D7B, 0x6F3F, 0x9D7C, 0x6F40, 0x9D7D, 0x6F41, 0x9D7E, 0x6F42, + 0x9D80, 0x6F43, 0x9D81, 0x6F44, 0x9D82, 0x6F45, 0x9D83, 0x6F48, + 0x9D84, 0x6F49, 0x9D85, 0x6F4A, 0x9D86, 0x6F4C, 0x9D87, 0x6F4E, + 0x9D88, 0x6F4F, 0x9D89, 0x6F50, 0x9D8A, 0x6F51, 0x9D8B, 0x6F52, + 0x9D8C, 0x6F53, 0x9D8D, 0x6F54, 0x9D8E, 0x6F55, 0x9D8F, 0x6F56, + 0x9D90, 0x6F57, 0x9D91, 0x6F59, 0x9D92, 0x6F5A, 0x9D93, 0x6F5B, + 0x9D94, 0x6F5D, 0x9D95, 0x6F5F, 0x9D96, 0x6F60, 0x9D97, 0x6F61, + 0x9D98, 0x6F63, 0x9D99, 0x6F64, 0x9D9A, 0x6F65, 0x9D9B, 0x6F67, + 0x9D9C, 0x6F68, 0x9D9D, 0x6F69, 0x9D9E, 0x6F6A, 0x9D9F, 0x6F6B, + 0x9DA0, 0x6F6C, 0x9DA1, 0x6F6F, 0x9DA2, 0x6F70, 0x9DA3, 0x6F71, + 0x9DA4, 0x6F73, 0x9DA5, 0x6F75, 0x9DA6, 0x6F76, 0x9DA7, 0x6F77, + 0x9DA8, 0x6F79, 0x9DA9, 0x6F7B, 0x9DAA, 0x6F7D, 0x9DAB, 0x6F7E, + 0x9DAC, 0x6F7F, 0x9DAD, 0x6F80, 0x9DAE, 0x6F81, 0x9DAF, 0x6F82, + 0x9DB0, 0x6F83, 0x9DB1, 0x6F85, 0x9DB2, 0x6F86, 0x9DB3, 0x6F87, + 0x9DB4, 0x6F8A, 0x9DB5, 0x6F8B, 0x9DB6, 0x6F8F, 0x9DB7, 0x6F90, + 0x9DB8, 0x6F91, 0x9DB9, 0x6F92, 0x9DBA, 0x6F93, 0x9DBB, 0x6F94, + 0x9DBC, 0x6F95, 0x9DBD, 0x6F96, 0x9DBE, 0x6F97, 0x9DBF, 0x6F98, + 0x9DC0, 0x6F99, 0x9DC1, 0x6F9A, 0x9DC2, 0x6F9B, 0x9DC3, 0x6F9D, + 0x9DC4, 0x6F9E, 0x9DC5, 0x6F9F, 0x9DC6, 0x6FA0, 0x9DC7, 0x6FA2, + 0x9DC8, 0x6FA3, 0x9DC9, 0x6FA4, 0x9DCA, 0x6FA5, 0x9DCB, 0x6FA6, + 0x9DCC, 0x6FA8, 0x9DCD, 0x6FA9, 0x9DCE, 0x6FAA, 0x9DCF, 0x6FAB, + 0x9DD0, 0x6FAC, 0x9DD1, 0x6FAD, 0x9DD2, 0x6FAE, 0x9DD3, 0x6FAF, + 0x9DD4, 0x6FB0, 0x9DD5, 0x6FB1, 0x9DD6, 0x6FB2, 0x9DD7, 0x6FB4, + 0x9DD8, 0x6FB5, 0x9DD9, 0x6FB7, 0x9DDA, 0x6FB8, 0x9DDB, 0x6FBA, + 0x9DDC, 0x6FBB, 0x9DDD, 0x6FBC, 0x9DDE, 0x6FBD, 0x9DDF, 0x6FBE, + 0x9DE0, 0x6FBF, 0x9DE1, 0x6FC1, 0x9DE2, 0x6FC3, 0x9DE3, 0x6FC4, + 0x9DE4, 0x6FC5, 0x9DE5, 0x6FC6, 0x9DE6, 0x6FC7, 0x9DE7, 0x6FC8, + 0x9DE8, 0x6FCA, 0x9DE9, 0x6FCB, 0x9DEA, 0x6FCC, 0x9DEB, 0x6FCD, + 0x9DEC, 0x6FCE, 0x9DED, 0x6FCF, 0x9DEE, 0x6FD0, 0x9DEF, 0x6FD3, + 0x9DF0, 0x6FD4, 0x9DF1, 0x6FD5, 0x9DF2, 0x6FD6, 0x9DF3, 0x6FD7, + 0x9DF4, 0x6FD8, 0x9DF5, 0x6FD9, 0x9DF6, 0x6FDA, 0x9DF7, 0x6FDB, + 0x9DF8, 0x6FDC, 0x9DF9, 0x6FDD, 0x9DFA, 0x6FDF, 0x9DFB, 0x6FE2, + 0x9DFC, 0x6FE3, 0x9DFD, 0x6FE4, 0x9DFE, 0x6FE5, 0x9E40, 0x6FE6, + 0x9E41, 0x6FE7, 0x9E42, 0x6FE8, 0x9E43, 0x6FE9, 0x9E44, 0x6FEA, + 0x9E45, 0x6FEB, 0x9E46, 0x6FEC, 0x9E47, 0x6FED, 0x9E48, 0x6FF0, + 0x9E49, 0x6FF1, 0x9E4A, 0x6FF2, 0x9E4B, 0x6FF3, 0x9E4C, 0x6FF4, + 0x9E4D, 0x6FF5, 0x9E4E, 0x6FF6, 0x9E4F, 0x6FF7, 0x9E50, 0x6FF8, + 0x9E51, 0x6FF9, 0x9E52, 0x6FFA, 0x9E53, 0x6FFB, 0x9E54, 0x6FFC, + 0x9E55, 0x6FFD, 0x9E56, 0x6FFE, 0x9E57, 0x6FFF, 0x9E58, 0x7000, + 0x9E59, 0x7001, 0x9E5A, 0x7002, 0x9E5B, 0x7003, 0x9E5C, 0x7004, + 0x9E5D, 0x7005, 0x9E5E, 0x7006, 0x9E5F, 0x7007, 0x9E60, 0x7008, + 0x9E61, 0x7009, 0x9E62, 0x700A, 0x9E63, 0x700B, 0x9E64, 0x700C, + 0x9E65, 0x700D, 0x9E66, 0x700E, 0x9E67, 0x700F, 0x9E68, 0x7010, + 0x9E69, 0x7012, 0x9E6A, 0x7013, 0x9E6B, 0x7014, 0x9E6C, 0x7015, + 0x9E6D, 0x7016, 0x9E6E, 0x7017, 0x9E6F, 0x7018, 0x9E70, 0x7019, + 0x9E71, 0x701C, 0x9E72, 0x701D, 0x9E73, 0x701E, 0x9E74, 0x701F, + 0x9E75, 0x7020, 0x9E76, 0x7021, 0x9E77, 0x7022, 0x9E78, 0x7024, + 0x9E79, 0x7025, 0x9E7A, 0x7026, 0x9E7B, 0x7027, 0x9E7C, 0x7028, + 0x9E7D, 0x7029, 0x9E7E, 0x702A, 0x9E80, 0x702B, 0x9E81, 0x702C, + 0x9E82, 0x702D, 0x9E83, 0x702E, 0x9E84, 0x702F, 0x9E85, 0x7030, + 0x9E86, 0x7031, 0x9E87, 0x7032, 0x9E88, 0x7033, 0x9E89, 0x7034, + 0x9E8A, 0x7036, 0x9E8B, 0x7037, 0x9E8C, 0x7038, 0x9E8D, 0x703A, + 0x9E8E, 0x703B, 0x9E8F, 0x703C, 0x9E90, 0x703D, 0x9E91, 0x703E, + 0x9E92, 0x703F, 0x9E93, 0x7040, 0x9E94, 0x7041, 0x9E95, 0x7042, + 0x9E96, 0x7043, 0x9E97, 0x7044, 0x9E98, 0x7045, 0x9E99, 0x7046, + 0x9E9A, 0x7047, 0x9E9B, 0x7048, 0x9E9C, 0x7049, 0x9E9D, 0x704A, + 0x9E9E, 0x704B, 0x9E9F, 0x704D, 0x9EA0, 0x704E, 0x9EA1, 0x7050, + 0x9EA2, 0x7051, 0x9EA3, 0x7052, 0x9EA4, 0x7053, 0x9EA5, 0x7054, + 0x9EA6, 0x7055, 0x9EA7, 0x7056, 0x9EA8, 0x7057, 0x9EA9, 0x7058, + 0x9EAA, 0x7059, 0x9EAB, 0x705A, 0x9EAC, 0x705B, 0x9EAD, 0x705C, + 0x9EAE, 0x705D, 0x9EAF, 0x705F, 0x9EB0, 0x7060, 0x9EB1, 0x7061, + 0x9EB2, 0x7062, 0x9EB3, 0x7063, 0x9EB4, 0x7064, 0x9EB5, 0x7065, + 0x9EB6, 0x7066, 0x9EB7, 0x7067, 0x9EB8, 0x7068, 0x9EB9, 0x7069, + 0x9EBA, 0x706A, 0x9EBB, 0x706E, 0x9EBC, 0x7071, 0x9EBD, 0x7072, + 0x9EBE, 0x7073, 0x9EBF, 0x7074, 0x9EC0, 0x7077, 0x9EC1, 0x7079, + 0x9EC2, 0x707A, 0x9EC3, 0x707B, 0x9EC4, 0x707D, 0x9EC5, 0x7081, + 0x9EC6, 0x7082, 0x9EC7, 0x7083, 0x9EC8, 0x7084, 0x9EC9, 0x7086, + 0x9ECA, 0x7087, 0x9ECB, 0x7088, 0x9ECC, 0x708B, 0x9ECD, 0x708C, + 0x9ECE, 0x708D, 0x9ECF, 0x708F, 0x9ED0, 0x7090, 0x9ED1, 0x7091, + 0x9ED2, 0x7093, 0x9ED3, 0x7097, 0x9ED4, 0x7098, 0x9ED5, 0x709A, + 0x9ED6, 0x709B, 0x9ED7, 0x709E, 0x9ED8, 0x709F, 0x9ED9, 0x70A0, + 0x9EDA, 0x70A1, 0x9EDB, 0x70A2, 0x9EDC, 0x70A3, 0x9EDD, 0x70A4, + 0x9EDE, 0x70A5, 0x9EDF, 0x70A6, 0x9EE0, 0x70A7, 0x9EE1, 0x70A8, + 0x9EE2, 0x70A9, 0x9EE3, 0x70AA, 0x9EE4, 0x70B0, 0x9EE5, 0x70B2, + 0x9EE6, 0x70B4, 0x9EE7, 0x70B5, 0x9EE8, 0x70B6, 0x9EE9, 0x70BA, + 0x9EEA, 0x70BE, 0x9EEB, 0x70BF, 0x9EEC, 0x70C4, 0x9EED, 0x70C5, + 0x9EEE, 0x70C6, 0x9EEF, 0x70C7, 0x9EF0, 0x70C9, 0x9EF1, 0x70CB, + 0x9EF2, 0x70CC, 0x9EF3, 0x70CD, 0x9EF4, 0x70CE, 0x9EF5, 0x70CF, + 0x9EF6, 0x70D0, 0x9EF7, 0x70D1, 0x9EF8, 0x70D2, 0x9EF9, 0x70D3, + 0x9EFA, 0x70D4, 0x9EFB, 0x70D5, 0x9EFC, 0x70D6, 0x9EFD, 0x70D7, + 0x9EFE, 0x70DA, 0x9F40, 0x70DC, 0x9F41, 0x70DD, 0x9F42, 0x70DE, + 0x9F43, 0x70E0, 0x9F44, 0x70E1, 0x9F45, 0x70E2, 0x9F46, 0x70E3, + 0x9F47, 0x70E5, 0x9F48, 0x70EA, 0x9F49, 0x70EE, 0x9F4A, 0x70F0, + 0x9F4B, 0x70F1, 0x9F4C, 0x70F2, 0x9F4D, 0x70F3, 0x9F4E, 0x70F4, + 0x9F4F, 0x70F5, 0x9F50, 0x70F6, 0x9F51, 0x70F8, 0x9F52, 0x70FA, + 0x9F53, 0x70FB, 0x9F54, 0x70FC, 0x9F55, 0x70FE, 0x9F56, 0x70FF, + 0x9F57, 0x7100, 0x9F58, 0x7101, 0x9F59, 0x7102, 0x9F5A, 0x7103, + 0x9F5B, 0x7104, 0x9F5C, 0x7105, 0x9F5D, 0x7106, 0x9F5E, 0x7107, + 0x9F5F, 0x7108, 0x9F60, 0x710B, 0x9F61, 0x710C, 0x9F62, 0x710D, + 0x9F63, 0x710E, 0x9F64, 0x710F, 0x9F65, 0x7111, 0x9F66, 0x7112, + 0x9F67, 0x7114, 0x9F68, 0x7117, 0x9F69, 0x711B, 0x9F6A, 0x711C, + 0x9F6B, 0x711D, 0x9F6C, 0x711E, 0x9F6D, 0x711F, 0x9F6E, 0x7120, + 0x9F6F, 0x7121, 0x9F70, 0x7122, 0x9F71, 0x7123, 0x9F72, 0x7124, + 0x9F73, 0x7125, 0x9F74, 0x7127, 0x9F75, 0x7128, 0x9F76, 0x7129, + 0x9F77, 0x712A, 0x9F78, 0x712B, 0x9F79, 0x712C, 0x9F7A, 0x712D, + 0x9F7B, 0x712E, 0x9F7C, 0x7132, 0x9F7D, 0x7133, 0x9F7E, 0x7134, + 0x9F80, 0x7135, 0x9F81, 0x7137, 0x9F82, 0x7138, 0x9F83, 0x7139, + 0x9F84, 0x713A, 0x9F85, 0x713B, 0x9F86, 0x713C, 0x9F87, 0x713D, + 0x9F88, 0x713E, 0x9F89, 0x713F, 0x9F8A, 0x7140, 0x9F8B, 0x7141, + 0x9F8C, 0x7142, 0x9F8D, 0x7143, 0x9F8E, 0x7144, 0x9F8F, 0x7146, + 0x9F90, 0x7147, 0x9F91, 0x7148, 0x9F92, 0x7149, 0x9F93, 0x714B, + 0x9F94, 0x714D, 0x9F95, 0x714F, 0x9F96, 0x7150, 0x9F97, 0x7151, + 0x9F98, 0x7152, 0x9F99, 0x7153, 0x9F9A, 0x7154, 0x9F9B, 0x7155, + 0x9F9C, 0x7156, 0x9F9D, 0x7157, 0x9F9E, 0x7158, 0x9F9F, 0x7159, + 0x9FA0, 0x715A, 0x9FA1, 0x715B, 0x9FA2, 0x715D, 0x9FA3, 0x715F, + 0x9FA4, 0x7160, 0x9FA5, 0x7161, 0x9FA6, 0x7162, 0x9FA7, 0x7163, + 0x9FA8, 0x7165, 0x9FA9, 0x7169, 0x9FAA, 0x716A, 0x9FAB, 0x716B, + 0x9FAC, 0x716C, 0x9FAD, 0x716D, 0x9FAE, 0x716F, 0x9FAF, 0x7170, + 0x9FB0, 0x7171, 0x9FB1, 0x7174, 0x9FB2, 0x7175, 0x9FB3, 0x7176, + 0x9FB4, 0x7177, 0x9FB5, 0x7179, 0x9FB6, 0x717B, 0x9FB7, 0x717C, + 0x9FB8, 0x717E, 0x9FB9, 0x717F, 0x9FBA, 0x7180, 0x9FBB, 0x7181, + 0x9FBC, 0x7182, 0x9FBD, 0x7183, 0x9FBE, 0x7185, 0x9FBF, 0x7186, + 0x9FC0, 0x7187, 0x9FC1, 0x7188, 0x9FC2, 0x7189, 0x9FC3, 0x718B, + 0x9FC4, 0x718C, 0x9FC5, 0x718D, 0x9FC6, 0x718E, 0x9FC7, 0x7190, + 0x9FC8, 0x7191, 0x9FC9, 0x7192, 0x9FCA, 0x7193, 0x9FCB, 0x7195, + 0x9FCC, 0x7196, 0x9FCD, 0x7197, 0x9FCE, 0x719A, 0x9FCF, 0x719B, + 0x9FD0, 0x719C, 0x9FD1, 0x719D, 0x9FD2, 0x719E, 0x9FD3, 0x71A1, + 0x9FD4, 0x71A2, 0x9FD5, 0x71A3, 0x9FD6, 0x71A4, 0x9FD7, 0x71A5, + 0x9FD8, 0x71A6, 0x9FD9, 0x71A7, 0x9FDA, 0x71A9, 0x9FDB, 0x71AA, + 0x9FDC, 0x71AB, 0x9FDD, 0x71AD, 0x9FDE, 0x71AE, 0x9FDF, 0x71AF, + 0x9FE0, 0x71B0, 0x9FE1, 0x71B1, 0x9FE2, 0x71B2, 0x9FE3, 0x71B4, + 0x9FE4, 0x71B6, 0x9FE5, 0x71B7, 0x9FE6, 0x71B8, 0x9FE7, 0x71BA, + 0x9FE8, 0x71BB, 0x9FE9, 0x71BC, 0x9FEA, 0x71BD, 0x9FEB, 0x71BE, + 0x9FEC, 0x71BF, 0x9FED, 0x71C0, 0x9FEE, 0x71C1, 0x9FEF, 0x71C2, + 0x9FF0, 0x71C4, 0x9FF1, 0x71C5, 0x9FF2, 0x71C6, 0x9FF3, 0x71C7, + 0x9FF4, 0x71C8, 0x9FF5, 0x71C9, 0x9FF6, 0x71CA, 0x9FF7, 0x71CB, + 0x9FF8, 0x71CC, 0x9FF9, 0x71CD, 0x9FFA, 0x71CF, 0x9FFB, 0x71D0, + 0x9FFC, 0x71D1, 0x9FFD, 0x71D2, 0x9FFE, 0x71D3, 0xA040, 0x71D6, + 0xA041, 0x71D7, 0xA042, 0x71D8, 0xA043, 0x71D9, 0xA044, 0x71DA, + 0xA045, 0x71DB, 0xA046, 0x71DC, 0xA047, 0x71DD, 0xA048, 0x71DE, + 0xA049, 0x71DF, 0xA04A, 0x71E1, 0xA04B, 0x71E2, 0xA04C, 0x71E3, + 0xA04D, 0x71E4, 0xA04E, 0x71E6, 0xA04F, 0x71E8, 0xA050, 0x71E9, + 0xA051, 0x71EA, 0xA052, 0x71EB, 0xA053, 0x71EC, 0xA054, 0x71ED, + 0xA055, 0x71EF, 0xA056, 0x71F0, 0xA057, 0x71F1, 0xA058, 0x71F2, + 0xA059, 0x71F3, 0xA05A, 0x71F4, 0xA05B, 0x71F5, 0xA05C, 0x71F6, + 0xA05D, 0x71F7, 0xA05E, 0x71F8, 0xA05F, 0x71FA, 0xA060, 0x71FB, + 0xA061, 0x71FC, 0xA062, 0x71FD, 0xA063, 0x71FE, 0xA064, 0x71FF, + 0xA065, 0x7200, 0xA066, 0x7201, 0xA067, 0x7202, 0xA068, 0x7203, + 0xA069, 0x7204, 0xA06A, 0x7205, 0xA06B, 0x7207, 0xA06C, 0x7208, + 0xA06D, 0x7209, 0xA06E, 0x720A, 0xA06F, 0x720B, 0xA070, 0x720C, + 0xA071, 0x720D, 0xA072, 0x720E, 0xA073, 0x720F, 0xA074, 0x7210, + 0xA075, 0x7211, 0xA076, 0x7212, 0xA077, 0x7213, 0xA078, 0x7214, + 0xA079, 0x7215, 0xA07A, 0x7216, 0xA07B, 0x7217, 0xA07C, 0x7218, + 0xA07D, 0x7219, 0xA07E, 0x721A, 0xA080, 0x721B, 0xA081, 0x721C, + 0xA082, 0x721E, 0xA083, 0x721F, 0xA084, 0x7220, 0xA085, 0x7221, + 0xA086, 0x7222, 0xA087, 0x7223, 0xA088, 0x7224, 0xA089, 0x7225, + 0xA08A, 0x7226, 0xA08B, 0x7227, 0xA08C, 0x7229, 0xA08D, 0x722B, + 0xA08E, 0x722D, 0xA08F, 0x722E, 0xA090, 0x722F, 0xA091, 0x7232, + 0xA092, 0x7233, 0xA093, 0x7234, 0xA094, 0x723A, 0xA095, 0x723C, + 0xA096, 0x723E, 0xA097, 0x7240, 0xA098, 0x7241, 0xA099, 0x7242, + 0xA09A, 0x7243, 0xA09B, 0x7244, 0xA09C, 0x7245, 0xA09D, 0x7246, + 0xA09E, 0x7249, 0xA09F, 0x724A, 0xA0A0, 0x724B, 0xA0A1, 0x724E, + 0xA0A2, 0x724F, 0xA0A3, 0x7250, 0xA0A4, 0x7251, 0xA0A5, 0x7253, + 0xA0A6, 0x7254, 0xA0A7, 0x7255, 0xA0A8, 0x7257, 0xA0A9, 0x7258, + 0xA0AA, 0x725A, 0xA0AB, 0x725C, 0xA0AC, 0x725E, 0xA0AD, 0x7260, + 0xA0AE, 0x7263, 0xA0AF, 0x7264, 0xA0B0, 0x7265, 0xA0B1, 0x7268, + 0xA0B2, 0x726A, 0xA0B3, 0x726B, 0xA0B4, 0x726C, 0xA0B5, 0x726D, + 0xA0B6, 0x7270, 0xA0B7, 0x7271, 0xA0B8, 0x7273, 0xA0B9, 0x7274, + 0xA0BA, 0x7276, 0xA0BB, 0x7277, 0xA0BC, 0x7278, 0xA0BD, 0x727B, + 0xA0BE, 0x727C, 0xA0BF, 0x727D, 0xA0C0, 0x7282, 0xA0C1, 0x7283, + 0xA0C2, 0x7285, 0xA0C3, 0x7286, 0xA0C4, 0x7287, 0xA0C5, 0x7288, + 0xA0C6, 0x7289, 0xA0C7, 0x728C, 0xA0C8, 0x728E, 0xA0C9, 0x7290, + 0xA0CA, 0x7291, 0xA0CB, 0x7293, 0xA0CC, 0x7294, 0xA0CD, 0x7295, + 0xA0CE, 0x7296, 0xA0CF, 0x7297, 0xA0D0, 0x7298, 0xA0D1, 0x7299, + 0xA0D2, 0x729A, 0xA0D3, 0x729B, 0xA0D4, 0x729C, 0xA0D5, 0x729D, + 0xA0D6, 0x729E, 0xA0D7, 0x72A0, 0xA0D8, 0x72A1, 0xA0D9, 0x72A2, + 0xA0DA, 0x72A3, 0xA0DB, 0x72A4, 0xA0DC, 0x72A5, 0xA0DD, 0x72A6, + 0xA0DE, 0x72A7, 0xA0DF, 0x72A8, 0xA0E0, 0x72A9, 0xA0E1, 0x72AA, + 0xA0E2, 0x72AB, 0xA0E3, 0x72AE, 0xA0E4, 0x72B1, 0xA0E5, 0x72B2, + 0xA0E6, 0x72B3, 0xA0E7, 0x72B5, 0xA0E8, 0x72BA, 0xA0E9, 0x72BB, + 0xA0EA, 0x72BC, 0xA0EB, 0x72BD, 0xA0EC, 0x72BE, 0xA0ED, 0x72BF, + 0xA0EE, 0x72C0, 0xA0EF, 0x72C5, 0xA0F0, 0x72C6, 0xA0F1, 0x72C7, + 0xA0F2, 0x72C9, 0xA0F3, 0x72CA, 0xA0F4, 0x72CB, 0xA0F5, 0x72CC, + 0xA0F6, 0x72CF, 0xA0F7, 0x72D1, 0xA0F8, 0x72D3, 0xA0F9, 0x72D4, + 0xA0FA, 0x72D5, 0xA0FB, 0x72D6, 0xA0FC, 0x72D8, 0xA0FD, 0x72DA, + 0xA0FE, 0x72DB, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, + 0xA1A4, 0x00B7, 0xA1A5, 0x02C9, 0xA1A6, 0x02C7, 0xA1A7, 0x00A8, + 0xA1A8, 0x3003, 0xA1A9, 0x3005, 0xA1AA, 0x2014, 0xA1AB, 0xFF5E, + 0xA1AC, 0x2016, 0xA1AD, 0x2026, 0xA1AE, 0x2018, 0xA1AF, 0x2019, + 0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, + 0xA1B4, 0x3008, 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, + 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, + 0xA1BC, 0x3016, 0xA1BD, 0x3017, 0xA1BE, 0x3010, 0xA1BF, 0x3011, + 0xA1C0, 0x00B1, 0xA1C1, 0x00D7, 0xA1C2, 0x00F7, 0xA1C3, 0x2236, + 0xA1C4, 0x2227, 0xA1C5, 0x2228, 0xA1C6, 0x2211, 0xA1C7, 0x220F, + 0xA1C8, 0x222A, 0xA1C9, 0x2229, 0xA1CA, 0x2208, 0xA1CB, 0x2237, + 0xA1CC, 0x221A, 0xA1CD, 0x22A5, 0xA1CE, 0x2225, 0xA1CF, 0x2220, + 0xA1D0, 0x2312, 0xA1D1, 0x2299, 0xA1D2, 0x222B, 0xA1D3, 0x222E, + 0xA1D4, 0x2261, 0xA1D5, 0x224C, 0xA1D6, 0x2248, 0xA1D7, 0x223D, + 0xA1D8, 0x221D, 0xA1D9, 0x2260, 0xA1DA, 0x226E, 0xA1DB, 0x226F, + 0xA1DC, 0x2264, 0xA1DD, 0x2265, 0xA1DE, 0x221E, 0xA1DF, 0x2235, + 0xA1E0, 0x2234, 0xA1E1, 0x2642, 0xA1E2, 0x2640, 0xA1E3, 0x00B0, + 0xA1E4, 0x2032, 0xA1E5, 0x2033, 0xA1E6, 0x2103, 0xA1E7, 0xFF04, + 0xA1E8, 0x00A4, 0xA1E9, 0xFFE0, 0xA1EA, 0xFFE1, 0xA1EB, 0x2030, + 0xA1EC, 0x00A7, 0xA1ED, 0x2116, 0xA1EE, 0x2606, 0xA1EF, 0x2605, + 0xA1F0, 0x25CB, 0xA1F1, 0x25CF, 0xA1F2, 0x25CE, 0xA1F3, 0x25C7, + 0xA1F4, 0x25C6, 0xA1F5, 0x25A1, 0xA1F6, 0x25A0, 0xA1F7, 0x25B3, + 0xA1F8, 0x25B2, 0xA1F9, 0x203B, 0xA1FA, 0x2192, 0xA1FB, 0x2190, + 0xA1FC, 0x2191, 0xA1FD, 0x2193, 0xA1FE, 0x3013, 0xA2A1, 0x2170, + 0xA2A2, 0x2171, 0xA2A3, 0x2172, 0xA2A4, 0x2173, 0xA2A5, 0x2174, + 0xA2A6, 0x2175, 0xA2A7, 0x2176, 0xA2A8, 0x2177, 0xA2A9, 0x2178, + 0xA2AA, 0x2179, 0xA2B1, 0x2488, 0xA2B2, 0x2489, 0xA2B3, 0x248A, + 0xA2B4, 0x248B, 0xA2B5, 0x248C, 0xA2B6, 0x248D, 0xA2B7, 0x248E, + 0xA2B8, 0x248F, 0xA2B9, 0x2490, 0xA2BA, 0x2491, 0xA2BB, 0x2492, + 0xA2BC, 0x2493, 0xA2BD, 0x2494, 0xA2BE, 0x2495, 0xA2BF, 0x2496, + 0xA2C0, 0x2497, 0xA2C1, 0x2498, 0xA2C2, 0x2499, 0xA2C3, 0x249A, + 0xA2C4, 0x249B, 0xA2C5, 0x2474, 0xA2C6, 0x2475, 0xA2C7, 0x2476, + 0xA2C8, 0x2477, 0xA2C9, 0x2478, 0xA2CA, 0x2479, 0xA2CB, 0x247A, + 0xA2CC, 0x247B, 0xA2CD, 0x247C, 0xA2CE, 0x247D, 0xA2CF, 0x247E, + 0xA2D0, 0x247F, 0xA2D1, 0x2480, 0xA2D2, 0x2481, 0xA2D3, 0x2482, + 0xA2D4, 0x2483, 0xA2D5, 0x2484, 0xA2D6, 0x2485, 0xA2D7, 0x2486, + 0xA2D8, 0x2487, 0xA2D9, 0x2460, 0xA2DA, 0x2461, 0xA2DB, 0x2462, + 0xA2DC, 0x2463, 0xA2DD, 0x2464, 0xA2DE, 0x2465, 0xA2DF, 0x2466, + 0xA2E0, 0x2467, 0xA2E1, 0x2468, 0xA2E2, 0x2469, 0xA2E5, 0x3220, + 0xA2E6, 0x3221, 0xA2E7, 0x3222, 0xA2E8, 0x3223, 0xA2E9, 0x3224, + 0xA2EA, 0x3225, 0xA2EB, 0x3226, 0xA2EC, 0x3227, 0xA2ED, 0x3228, + 0xA2EE, 0x3229, 0xA2F1, 0x2160, 0xA2F2, 0x2161, 0xA2F3, 0x2162, + 0xA2F4, 0x2163, 0xA2F5, 0x2164, 0xA2F6, 0x2165, 0xA2F7, 0x2166, + 0xA2F8, 0x2167, 0xA2F9, 0x2168, 0xA2FA, 0x2169, 0xA2FB, 0x216A, + 0xA2FC, 0x216B, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, + 0xA3A4, 0xFFE5, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, + 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, + 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, + 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, + 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, + 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, + 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, + 0xA3DC, 0xFF3C, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, + 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, + 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, + 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, + 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA4A1, 0x3041, + 0xA4A2, 0x3042, 0xA4A3, 0x3043, 0xA4A4, 0x3044, 0xA4A5, 0x3045, + 0xA4A6, 0x3046, 0xA4A7, 0x3047, 0xA4A8, 0x3048, 0xA4A9, 0x3049, + 0xA4AA, 0x304A, 0xA4AB, 0x304B, 0xA4AC, 0x304C, 0xA4AD, 0x304D, + 0xA4AE, 0x304E, 0xA4AF, 0x304F, 0xA4B0, 0x3050, 0xA4B1, 0x3051, + 0xA4B2, 0x3052, 0xA4B3, 0x3053, 0xA4B4, 0x3054, 0xA4B5, 0x3055, + 0xA4B6, 0x3056, 0xA4B7, 0x3057, 0xA4B8, 0x3058, 0xA4B9, 0x3059, + 0xA4BA, 0x305A, 0xA4BB, 0x305B, 0xA4BC, 0x305C, 0xA4BD, 0x305D, + 0xA4BE, 0x305E, 0xA4BF, 0x305F, 0xA4C0, 0x3060, 0xA4C1, 0x3061, + 0xA4C2, 0x3062, 0xA4C3, 0x3063, 0xA4C4, 0x3064, 0xA4C5, 0x3065, + 0xA4C6, 0x3066, 0xA4C7, 0x3067, 0xA4C8, 0x3068, 0xA4C9, 0x3069, + 0xA4CA, 0x306A, 0xA4CB, 0x306B, 0xA4CC, 0x306C, 0xA4CD, 0x306D, + 0xA4CE, 0x306E, 0xA4CF, 0x306F, 0xA4D0, 0x3070, 0xA4D1, 0x3071, + 0xA4D2, 0x3072, 0xA4D3, 0x3073, 0xA4D4, 0x3074, 0xA4D5, 0x3075, + 0xA4D6, 0x3076, 0xA4D7, 0x3077, 0xA4D8, 0x3078, 0xA4D9, 0x3079, + 0xA4DA, 0x307A, 0xA4DB, 0x307B, 0xA4DC, 0x307C, 0xA4DD, 0x307D, + 0xA4DE, 0x307E, 0xA4DF, 0x307F, 0xA4E0, 0x3080, 0xA4E1, 0x3081, + 0xA4E2, 0x3082, 0xA4E3, 0x3083, 0xA4E4, 0x3084, 0xA4E5, 0x3085, + 0xA4E6, 0x3086, 0xA4E7, 0x3087, 0xA4E8, 0x3088, 0xA4E9, 0x3089, + 0xA4EA, 0x308A, 0xA4EB, 0x308B, 0xA4EC, 0x308C, 0xA4ED, 0x308D, + 0xA4EE, 0x308E, 0xA4EF, 0x308F, 0xA4F0, 0x3090, 0xA4F1, 0x3091, + 0xA4F2, 0x3092, 0xA4F3, 0x3093, 0xA5A1, 0x30A1, 0xA5A2, 0x30A2, + 0xA5A3, 0x30A3, 0xA5A4, 0x30A4, 0xA5A5, 0x30A5, 0xA5A6, 0x30A6, + 0xA5A7, 0x30A7, 0xA5A8, 0x30A8, 0xA5A9, 0x30A9, 0xA5AA, 0x30AA, + 0xA5AB, 0x30AB, 0xA5AC, 0x30AC, 0xA5AD, 0x30AD, 0xA5AE, 0x30AE, + 0xA5AF, 0x30AF, 0xA5B0, 0x30B0, 0xA5B1, 0x30B1, 0xA5B2, 0x30B2, + 0xA5B3, 0x30B3, 0xA5B4, 0x30B4, 0xA5B5, 0x30B5, 0xA5B6, 0x30B6, + 0xA5B7, 0x30B7, 0xA5B8, 0x30B8, 0xA5B9, 0x30B9, 0xA5BA, 0x30BA, + 0xA5BB, 0x30BB, 0xA5BC, 0x30BC, 0xA5BD, 0x30BD, 0xA5BE, 0x30BE, + 0xA5BF, 0x30BF, 0xA5C0, 0x30C0, 0xA5C1, 0x30C1, 0xA5C2, 0x30C2, + 0xA5C3, 0x30C3, 0xA5C4, 0x30C4, 0xA5C5, 0x30C5, 0xA5C6, 0x30C6, + 0xA5C7, 0x30C7, 0xA5C8, 0x30C8, 0xA5C9, 0x30C9, 0xA5CA, 0x30CA, + 0xA5CB, 0x30CB, 0xA5CC, 0x30CC, 0xA5CD, 0x30CD, 0xA5CE, 0x30CE, + 0xA5CF, 0x30CF, 0xA5D0, 0x30D0, 0xA5D1, 0x30D1, 0xA5D2, 0x30D2, + 0xA5D3, 0x30D3, 0xA5D4, 0x30D4, 0xA5D5, 0x30D5, 0xA5D6, 0x30D6, + 0xA5D7, 0x30D7, 0xA5D8, 0x30D8, 0xA5D9, 0x30D9, 0xA5DA, 0x30DA, + 0xA5DB, 0x30DB, 0xA5DC, 0x30DC, 0xA5DD, 0x30DD, 0xA5DE, 0x30DE, + 0xA5DF, 0x30DF, 0xA5E0, 0x30E0, 0xA5E1, 0x30E1, 0xA5E2, 0x30E2, + 0xA5E3, 0x30E3, 0xA5E4, 0x30E4, 0xA5E5, 0x30E5, 0xA5E6, 0x30E6, + 0xA5E7, 0x30E7, 0xA5E8, 0x30E8, 0xA5E9, 0x30E9, 0xA5EA, 0x30EA, + 0xA5EB, 0x30EB, 0xA5EC, 0x30EC, 0xA5ED, 0x30ED, 0xA5EE, 0x30EE, + 0xA5EF, 0x30EF, 0xA5F0, 0x30F0, 0xA5F1, 0x30F1, 0xA5F2, 0x30F2, + 0xA5F3, 0x30F3, 0xA5F4, 0x30F4, 0xA5F5, 0x30F5, 0xA5F6, 0x30F6, + 0xA6A1, 0x0391, 0xA6A2, 0x0392, 0xA6A3, 0x0393, 0xA6A4, 0x0394, + 0xA6A5, 0x0395, 0xA6A6, 0x0396, 0xA6A7, 0x0397, 0xA6A8, 0x0398, + 0xA6A9, 0x0399, 0xA6AA, 0x039A, 0xA6AB, 0x039B, 0xA6AC, 0x039C, + 0xA6AD, 0x039D, 0xA6AE, 0x039E, 0xA6AF, 0x039F, 0xA6B0, 0x03A0, + 0xA6B1, 0x03A1, 0xA6B2, 0x03A3, 0xA6B3, 0x03A4, 0xA6B4, 0x03A5, + 0xA6B5, 0x03A6, 0xA6B6, 0x03A7, 0xA6B7, 0x03A8, 0xA6B8, 0x03A9, + 0xA6C1, 0x03B1, 0xA6C2, 0x03B2, 0xA6C3, 0x03B3, 0xA6C4, 0x03B4, + 0xA6C5, 0x03B5, 0xA6C6, 0x03B6, 0xA6C7, 0x03B7, 0xA6C8, 0x03B8, + 0xA6C9, 0x03B9, 0xA6CA, 0x03BA, 0xA6CB, 0x03BB, 0xA6CC, 0x03BC, + 0xA6CD, 0x03BD, 0xA6CE, 0x03BE, 0xA6CF, 0x03BF, 0xA6D0, 0x03C0, + 0xA6D1, 0x03C1, 0xA6D2, 0x03C3, 0xA6D3, 0x03C4, 0xA6D4, 0x03C5, + 0xA6D5, 0x03C6, 0xA6D6, 0x03C7, 0xA6D7, 0x03C8, 0xA6D8, 0x03C9, + 0xA6E0, 0xFE35, 0xA6E1, 0xFE36, 0xA6E2, 0xFE39, 0xA6E3, 0xFE3A, + 0xA6E4, 0xFE3F, 0xA6E5, 0xFE40, 0xA6E6, 0xFE3D, 0xA6E7, 0xFE3E, + 0xA6E8, 0xFE41, 0xA6E9, 0xFE42, 0xA6EA, 0xFE43, 0xA6EB, 0xFE44, + 0xA6EE, 0xFE3B, 0xA6EF, 0xFE3C, 0xA6F0, 0xFE37, 0xA6F1, 0xFE38, + 0xA6F2, 0xFE31, 0xA6F4, 0xFE33, 0xA6F5, 0xFE34, 0xA7A1, 0x0410, + 0xA7A2, 0x0411, 0xA7A3, 0x0412, 0xA7A4, 0x0413, 0xA7A5, 0x0414, + 0xA7A6, 0x0415, 0xA7A7, 0x0401, 0xA7A8, 0x0416, 0xA7A9, 0x0417, + 0xA7AA, 0x0418, 0xA7AB, 0x0419, 0xA7AC, 0x041A, 0xA7AD, 0x041B, + 0xA7AE, 0x041C, 0xA7AF, 0x041D, 0xA7B0, 0x041E, 0xA7B1, 0x041F, + 0xA7B2, 0x0420, 0xA7B3, 0x0421, 0xA7B4, 0x0422, 0xA7B5, 0x0423, + 0xA7B6, 0x0424, 0xA7B7, 0x0425, 0xA7B8, 0x0426, 0xA7B9, 0x0427, + 0xA7BA, 0x0428, 0xA7BB, 0x0429, 0xA7BC, 0x042A, 0xA7BD, 0x042B, + 0xA7BE, 0x042C, 0xA7BF, 0x042D, 0xA7C0, 0x042E, 0xA7C1, 0x042F, + 0xA7D1, 0x0430, 0xA7D2, 0x0431, 0xA7D3, 0x0432, 0xA7D4, 0x0433, + 0xA7D5, 0x0434, 0xA7D6, 0x0435, 0xA7D7, 0x0451, 0xA7D8, 0x0436, + 0xA7D9, 0x0437, 0xA7DA, 0x0438, 0xA7DB, 0x0439, 0xA7DC, 0x043A, + 0xA7DD, 0x043B, 0xA7DE, 0x043C, 0xA7DF, 0x043D, 0xA7E0, 0x043E, + 0xA7E1, 0x043F, 0xA7E2, 0x0440, 0xA7E3, 0x0441, 0xA7E4, 0x0442, + 0xA7E5, 0x0443, 0xA7E6, 0x0444, 0xA7E7, 0x0445, 0xA7E8, 0x0446, + 0xA7E9, 0x0447, 0xA7EA, 0x0448, 0xA7EB, 0x0449, 0xA7EC, 0x044A, + 0xA7ED, 0x044B, 0xA7EE, 0x044C, 0xA7EF, 0x044D, 0xA7F0, 0x044E, + 0xA7F1, 0x044F, 0xA840, 0x02CA, 0xA841, 0x02CB, 0xA842, 0x02D9, + 0xA843, 0x2013, 0xA844, 0x2015, 0xA845, 0x2025, 0xA846, 0x2035, + 0xA847, 0x2105, 0xA848, 0x2109, 0xA849, 0x2196, 0xA84A, 0x2197, + 0xA84B, 0x2198, 0xA84C, 0x2199, 0xA84D, 0x2215, 0xA84E, 0x221F, + 0xA84F, 0x2223, 0xA850, 0x2252, 0xA851, 0x2266, 0xA852, 0x2267, + 0xA853, 0x22BF, 0xA854, 0x2550, 0xA855, 0x2551, 0xA856, 0x2552, + 0xA857, 0x2553, 0xA858, 0x2554, 0xA859, 0x2555, 0xA85A, 0x2556, + 0xA85B, 0x2557, 0xA85C, 0x2558, 0xA85D, 0x2559, 0xA85E, 0x255A, + 0xA85F, 0x255B, 0xA860, 0x255C, 0xA861, 0x255D, 0xA862, 0x255E, + 0xA863, 0x255F, 0xA864, 0x2560, 0xA865, 0x2561, 0xA866, 0x2562, + 0xA867, 0x2563, 0xA868, 0x2564, 0xA869, 0x2565, 0xA86A, 0x2566, + 0xA86B, 0x2567, 0xA86C, 0x2568, 0xA86D, 0x2569, 0xA86E, 0x256A, + 0xA86F, 0x256B, 0xA870, 0x256C, 0xA871, 0x256D, 0xA872, 0x256E, + 0xA873, 0x256F, 0xA874, 0x2570, 0xA875, 0x2571, 0xA876, 0x2572, + 0xA877, 0x2573, 0xA878, 0x2581, 0xA879, 0x2582, 0xA87A, 0x2583, + 0xA87B, 0x2584, 0xA87C, 0x2585, 0xA87D, 0x2586, 0xA87E, 0x2587, + 0xA880, 0x2588, 0xA881, 0x2589, 0xA882, 0x258A, 0xA883, 0x258B, + 0xA884, 0x258C, 0xA885, 0x258D, 0xA886, 0x258E, 0xA887, 0x258F, + 0xA888, 0x2593, 0xA889, 0x2594, 0xA88A, 0x2595, 0xA88B, 0x25BC, + 0xA88C, 0x25BD, 0xA88D, 0x25E2, 0xA88E, 0x25E3, 0xA88F, 0x25E4, + 0xA890, 0x25E5, 0xA891, 0x2609, 0xA892, 0x2295, 0xA893, 0x3012, + 0xA894, 0x301D, 0xA895, 0x301E, 0xA8A1, 0x0101, 0xA8A2, 0x00E1, + 0xA8A3, 0x01CE, 0xA8A4, 0x00E0, 0xA8A5, 0x0113, 0xA8A6, 0x00E9, + 0xA8A7, 0x011B, 0xA8A8, 0x00E8, 0xA8A9, 0x012B, 0xA8AA, 0x00ED, + 0xA8AB, 0x01D0, 0xA8AC, 0x00EC, 0xA8AD, 0x014D, 0xA8AE, 0x00F3, + 0xA8AF, 0x01D2, 0xA8B0, 0x00F2, 0xA8B1, 0x016B, 0xA8B2, 0x00FA, + 0xA8B3, 0x01D4, 0xA8B4, 0x00F9, 0xA8B5, 0x01D6, 0xA8B6, 0x01D8, + 0xA8B7, 0x01DA, 0xA8B8, 0x01DC, 0xA8B9, 0x00FC, 0xA8BA, 0x00EA, + 0xA8BB, 0x0251, 0xA8BD, 0x0144, 0xA8BE, 0x0148, 0xA8C0, 0x0261, + 0xA8C5, 0x3105, 0xA8C6, 0x3106, 0xA8C7, 0x3107, 0xA8C8, 0x3108, + 0xA8C9, 0x3109, 0xA8CA, 0x310A, 0xA8CB, 0x310B, 0xA8CC, 0x310C, + 0xA8CD, 0x310D, 0xA8CE, 0x310E, 0xA8CF, 0x310F, 0xA8D0, 0x3110, + 0xA8D1, 0x3111, 0xA8D2, 0x3112, 0xA8D3, 0x3113, 0xA8D4, 0x3114, + 0xA8D5, 0x3115, 0xA8D6, 0x3116, 0xA8D7, 0x3117, 0xA8D8, 0x3118, + 0xA8D9, 0x3119, 0xA8DA, 0x311A, 0xA8DB, 0x311B, 0xA8DC, 0x311C, + 0xA8DD, 0x311D, 0xA8DE, 0x311E, 0xA8DF, 0x311F, 0xA8E0, 0x3120, + 0xA8E1, 0x3121, 0xA8E2, 0x3122, 0xA8E3, 0x3123, 0xA8E4, 0x3124, + 0xA8E5, 0x3125, 0xA8E6, 0x3126, 0xA8E7, 0x3127, 0xA8E8, 0x3128, + 0xA8E9, 0x3129, 0xA940, 0x3021, 0xA941, 0x3022, 0xA942, 0x3023, + 0xA943, 0x3024, 0xA944, 0x3025, 0xA945, 0x3026, 0xA946, 0x3027, + 0xA947, 0x3028, 0xA948, 0x3029, 0xA949, 0x32A3, 0xA94A, 0x338E, + 0xA94B, 0x338F, 0xA94C, 0x339C, 0xA94D, 0x339D, 0xA94E, 0x339E, + 0xA94F, 0x33A1, 0xA950, 0x33C4, 0xA951, 0x33CE, 0xA952, 0x33D1, + 0xA953, 0x33D2, 0xA954, 0x33D5, 0xA955, 0xFE30, 0xA956, 0xFFE2, + 0xA957, 0xFFE4, 0xA959, 0x2121, 0xA95A, 0x3231, 0xA95C, 0x2010, + 0xA960, 0x30FC, 0xA961, 0x309B, 0xA962, 0x309C, 0xA963, 0x30FD, + 0xA964, 0x30FE, 0xA965, 0x3006, 0xA966, 0x309D, 0xA967, 0x309E, + 0xA968, 0xFE49, 0xA969, 0xFE4A, 0xA96A, 0xFE4B, 0xA96B, 0xFE4C, + 0xA96C, 0xFE4D, 0xA96D, 0xFE4E, 0xA96E, 0xFE4F, 0xA96F, 0xFE50, + 0xA970, 0xFE51, 0xA971, 0xFE52, 0xA972, 0xFE54, 0xA973, 0xFE55, + 0xA974, 0xFE56, 0xA975, 0xFE57, 0xA976, 0xFE59, 0xA977, 0xFE5A, + 0xA978, 0xFE5B, 0xA979, 0xFE5C, 0xA97A, 0xFE5D, 0xA97B, 0xFE5E, + 0xA97C, 0xFE5F, 0xA97D, 0xFE60, 0xA97E, 0xFE61, 0xA980, 0xFE62, + 0xA981, 0xFE63, 0xA982, 0xFE64, 0xA983, 0xFE65, 0xA984, 0xFE66, + 0xA985, 0xFE68, 0xA986, 0xFE69, 0xA987, 0xFE6A, 0xA988, 0xFE6B, + 0xA996, 0x3007, 0xA9A4, 0x2500, 0xA9A5, 0x2501, 0xA9A6, 0x2502, + 0xA9A7, 0x2503, 0xA9A8, 0x2504, 0xA9A9, 0x2505, 0xA9AA, 0x2506, + 0xA9AB, 0x2507, 0xA9AC, 0x2508, 0xA9AD, 0x2509, 0xA9AE, 0x250A, + 0xA9AF, 0x250B, 0xA9B0, 0x250C, 0xA9B1, 0x250D, 0xA9B2, 0x250E, + 0xA9B3, 0x250F, 0xA9B4, 0x2510, 0xA9B5, 0x2511, 0xA9B6, 0x2512, + 0xA9B7, 0x2513, 0xA9B8, 0x2514, 0xA9B9, 0x2515, 0xA9BA, 0x2516, + 0xA9BB, 0x2517, 0xA9BC, 0x2518, 0xA9BD, 0x2519, 0xA9BE, 0x251A, + 0xA9BF, 0x251B, 0xA9C0, 0x251C, 0xA9C1, 0x251D, 0xA9C2, 0x251E, + 0xA9C3, 0x251F, 0xA9C4, 0x2520, 0xA9C5, 0x2521, 0xA9C6, 0x2522, + 0xA9C7, 0x2523, 0xA9C8, 0x2524, 0xA9C9, 0x2525, 0xA9CA, 0x2526, + 0xA9CB, 0x2527, 0xA9CC, 0x2528, 0xA9CD, 0x2529, 0xA9CE, 0x252A, + 0xA9CF, 0x252B, 0xA9D0, 0x252C, 0xA9D1, 0x252D, 0xA9D2, 0x252E, + 0xA9D3, 0x252F, 0xA9D4, 0x2530, 0xA9D5, 0x2531, 0xA9D6, 0x2532, + 0xA9D7, 0x2533, 0xA9D8, 0x2534, 0xA9D9, 0x2535, 0xA9DA, 0x2536, + 0xA9DB, 0x2537, 0xA9DC, 0x2538, 0xA9DD, 0x2539, 0xA9DE, 0x253A, + 0xA9DF, 0x253B, 0xA9E0, 0x253C, 0xA9E1, 0x253D, 0xA9E2, 0x253E, + 0xA9E3, 0x253F, 0xA9E4, 0x2540, 0xA9E5, 0x2541, 0xA9E6, 0x2542, + 0xA9E7, 0x2543, 0xA9E8, 0x2544, 0xA9E9, 0x2545, 0xA9EA, 0x2546, + 0xA9EB, 0x2547, 0xA9EC, 0x2548, 0xA9ED, 0x2549, 0xA9EE, 0x254A, + 0xA9EF, 0x254B, 0xAA40, 0x72DC, 0xAA41, 0x72DD, 0xAA42, 0x72DF, + 0xAA43, 0x72E2, 0xAA44, 0x72E3, 0xAA45, 0x72E4, 0xAA46, 0x72E5, + 0xAA47, 0x72E6, 0xAA48, 0x72E7, 0xAA49, 0x72EA, 0xAA4A, 0x72EB, + 0xAA4B, 0x72F5, 0xAA4C, 0x72F6, 0xAA4D, 0x72F9, 0xAA4E, 0x72FD, + 0xAA4F, 0x72FE, 0xAA50, 0x72FF, 0xAA51, 0x7300, 0xAA52, 0x7302, + 0xAA53, 0x7304, 0xAA54, 0x7305, 0xAA55, 0x7306, 0xAA56, 0x7307, + 0xAA57, 0x7308, 0xAA58, 0x7309, 0xAA59, 0x730B, 0xAA5A, 0x730C, + 0xAA5B, 0x730D, 0xAA5C, 0x730F, 0xAA5D, 0x7310, 0xAA5E, 0x7311, + 0xAA5F, 0x7312, 0xAA60, 0x7314, 0xAA61, 0x7318, 0xAA62, 0x7319, + 0xAA63, 0x731A, 0xAA64, 0x731F, 0xAA65, 0x7320, 0xAA66, 0x7323, + 0xAA67, 0x7324, 0xAA68, 0x7326, 0xAA69, 0x7327, 0xAA6A, 0x7328, + 0xAA6B, 0x732D, 0xAA6C, 0x732F, 0xAA6D, 0x7330, 0xAA6E, 0x7332, + 0xAA6F, 0x7333, 0xAA70, 0x7335, 0xAA71, 0x7336, 0xAA72, 0x733A, + 0xAA73, 0x733B, 0xAA74, 0x733C, 0xAA75, 0x733D, 0xAA76, 0x7340, + 0xAA77, 0x7341, 0xAA78, 0x7342, 0xAA79, 0x7343, 0xAA7A, 0x7344, + 0xAA7B, 0x7345, 0xAA7C, 0x7346, 0xAA7D, 0x7347, 0xAA7E, 0x7348, + 0xAA80, 0x7349, 0xAA81, 0x734A, 0xAA82, 0x734B, 0xAA83, 0x734C, + 0xAA84, 0x734E, 0xAA85, 0x734F, 0xAA86, 0x7351, 0xAA87, 0x7353, + 0xAA88, 0x7354, 0xAA89, 0x7355, 0xAA8A, 0x7356, 0xAA8B, 0x7358, + 0xAA8C, 0x7359, 0xAA8D, 0x735A, 0xAA8E, 0x735B, 0xAA8F, 0x735C, + 0xAA90, 0x735D, 0xAA91, 0x735E, 0xAA92, 0x735F, 0xAA93, 0x7361, + 0xAA94, 0x7362, 0xAA95, 0x7363, 0xAA96, 0x7364, 0xAA97, 0x7365, + 0xAA98, 0x7366, 0xAA99, 0x7367, 0xAA9A, 0x7368, 0xAA9B, 0x7369, + 0xAA9C, 0x736A, 0xAA9D, 0x736B, 0xAA9E, 0x736E, 0xAA9F, 0x7370, + 0xAAA0, 0x7371, 0xAB40, 0x7372, 0xAB41, 0x7373, 0xAB42, 0x7374, + 0xAB43, 0x7375, 0xAB44, 0x7376, 0xAB45, 0x7377, 0xAB46, 0x7378, + 0xAB47, 0x7379, 0xAB48, 0x737A, 0xAB49, 0x737B, 0xAB4A, 0x737C, + 0xAB4B, 0x737D, 0xAB4C, 0x737F, 0xAB4D, 0x7380, 0xAB4E, 0x7381, + 0xAB4F, 0x7382, 0xAB50, 0x7383, 0xAB51, 0x7385, 0xAB52, 0x7386, + 0xAB53, 0x7388, 0xAB54, 0x738A, 0xAB55, 0x738C, 0xAB56, 0x738D, + 0xAB57, 0x738F, 0xAB58, 0x7390, 0xAB59, 0x7392, 0xAB5A, 0x7393, + 0xAB5B, 0x7394, 0xAB5C, 0x7395, 0xAB5D, 0x7397, 0xAB5E, 0x7398, + 0xAB5F, 0x7399, 0xAB60, 0x739A, 0xAB61, 0x739C, 0xAB62, 0x739D, + 0xAB63, 0x739E, 0xAB64, 0x73A0, 0xAB65, 0x73A1, 0xAB66, 0x73A3, + 0xAB67, 0x73A4, 0xAB68, 0x73A5, 0xAB69, 0x73A6, 0xAB6A, 0x73A7, + 0xAB6B, 0x73A8, 0xAB6C, 0x73AA, 0xAB6D, 0x73AC, 0xAB6E, 0x73AD, + 0xAB6F, 0x73B1, 0xAB70, 0x73B4, 0xAB71, 0x73B5, 0xAB72, 0x73B6, + 0xAB73, 0x73B8, 0xAB74, 0x73B9, 0xAB75, 0x73BC, 0xAB76, 0x73BD, + 0xAB77, 0x73BE, 0xAB78, 0x73BF, 0xAB79, 0x73C1, 0xAB7A, 0x73C3, + 0xAB7B, 0x73C4, 0xAB7C, 0x73C5, 0xAB7D, 0x73C6, 0xAB7E, 0x73C7, + 0xAB80, 0x73CB, 0xAB81, 0x73CC, 0xAB82, 0x73CE, 0xAB83, 0x73D2, + 0xAB84, 0x73D3, 0xAB85, 0x73D4, 0xAB86, 0x73D5, 0xAB87, 0x73D6, + 0xAB88, 0x73D7, 0xAB89, 0x73D8, 0xAB8A, 0x73DA, 0xAB8B, 0x73DB, + 0xAB8C, 0x73DC, 0xAB8D, 0x73DD, 0xAB8E, 0x73DF, 0xAB8F, 0x73E1, + 0xAB90, 0x73E2, 0xAB91, 0x73E3, 0xAB92, 0x73E4, 0xAB93, 0x73E6, + 0xAB94, 0x73E8, 0xAB95, 0x73EA, 0xAB96, 0x73EB, 0xAB97, 0x73EC, + 0xAB98, 0x73EE, 0xAB99, 0x73EF, 0xAB9A, 0x73F0, 0xAB9B, 0x73F1, + 0xAB9C, 0x73F3, 0xAB9D, 0x73F4, 0xAB9E, 0x73F5, 0xAB9F, 0x73F6, + 0xABA0, 0x73F7, 0xAC40, 0x73F8, 0xAC41, 0x73F9, 0xAC42, 0x73FA, + 0xAC43, 0x73FB, 0xAC44, 0x73FC, 0xAC45, 0x73FD, 0xAC46, 0x73FE, + 0xAC47, 0x73FF, 0xAC48, 0x7400, 0xAC49, 0x7401, 0xAC4A, 0x7402, + 0xAC4B, 0x7404, 0xAC4C, 0x7407, 0xAC4D, 0x7408, 0xAC4E, 0x740B, + 0xAC4F, 0x740C, 0xAC50, 0x740D, 0xAC51, 0x740E, 0xAC52, 0x7411, + 0xAC53, 0x7412, 0xAC54, 0x7413, 0xAC55, 0x7414, 0xAC56, 0x7415, + 0xAC57, 0x7416, 0xAC58, 0x7417, 0xAC59, 0x7418, 0xAC5A, 0x7419, + 0xAC5B, 0x741C, 0xAC5C, 0x741D, 0xAC5D, 0x741E, 0xAC5E, 0x741F, + 0xAC5F, 0x7420, 0xAC60, 0x7421, 0xAC61, 0x7423, 0xAC62, 0x7424, + 0xAC63, 0x7427, 0xAC64, 0x7429, 0xAC65, 0x742B, 0xAC66, 0x742D, + 0xAC67, 0x742F, 0xAC68, 0x7431, 0xAC69, 0x7432, 0xAC6A, 0x7437, + 0xAC6B, 0x7438, 0xAC6C, 0x7439, 0xAC6D, 0x743A, 0xAC6E, 0x743B, + 0xAC6F, 0x743D, 0xAC70, 0x743E, 0xAC71, 0x743F, 0xAC72, 0x7440, + 0xAC73, 0x7442, 0xAC74, 0x7443, 0xAC75, 0x7444, 0xAC76, 0x7445, + 0xAC77, 0x7446, 0xAC78, 0x7447, 0xAC79, 0x7448, 0xAC7A, 0x7449, + 0xAC7B, 0x744A, 0xAC7C, 0x744B, 0xAC7D, 0x744C, 0xAC7E, 0x744D, + 0xAC80, 0x744E, 0xAC81, 0x744F, 0xAC82, 0x7450, 0xAC83, 0x7451, + 0xAC84, 0x7452, 0xAC85, 0x7453, 0xAC86, 0x7454, 0xAC87, 0x7456, + 0xAC88, 0x7458, 0xAC89, 0x745D, 0xAC8A, 0x7460, 0xAC8B, 0x7461, + 0xAC8C, 0x7462, 0xAC8D, 0x7463, 0xAC8E, 0x7464, 0xAC8F, 0x7465, + 0xAC90, 0x7466, 0xAC91, 0x7467, 0xAC92, 0x7468, 0xAC93, 0x7469, + 0xAC94, 0x746A, 0xAC95, 0x746B, 0xAC96, 0x746C, 0xAC97, 0x746E, + 0xAC98, 0x746F, 0xAC99, 0x7471, 0xAC9A, 0x7472, 0xAC9B, 0x7473, + 0xAC9C, 0x7474, 0xAC9D, 0x7475, 0xAC9E, 0x7478, 0xAC9F, 0x7479, + 0xACA0, 0x747A, 0xAD40, 0x747B, 0xAD41, 0x747C, 0xAD42, 0x747D, + 0xAD43, 0x747F, 0xAD44, 0x7482, 0xAD45, 0x7484, 0xAD46, 0x7485, + 0xAD47, 0x7486, 0xAD48, 0x7488, 0xAD49, 0x7489, 0xAD4A, 0x748A, + 0xAD4B, 0x748C, 0xAD4C, 0x748D, 0xAD4D, 0x748F, 0xAD4E, 0x7491, + 0xAD4F, 0x7492, 0xAD50, 0x7493, 0xAD51, 0x7494, 0xAD52, 0x7495, + 0xAD53, 0x7496, 0xAD54, 0x7497, 0xAD55, 0x7498, 0xAD56, 0x7499, + 0xAD57, 0x749A, 0xAD58, 0x749B, 0xAD59, 0x749D, 0xAD5A, 0x749F, + 0xAD5B, 0x74A0, 0xAD5C, 0x74A1, 0xAD5D, 0x74A2, 0xAD5E, 0x74A3, + 0xAD5F, 0x74A4, 0xAD60, 0x74A5, 0xAD61, 0x74A6, 0xAD62, 0x74AA, + 0xAD63, 0x74AB, 0xAD64, 0x74AC, 0xAD65, 0x74AD, 0xAD66, 0x74AE, + 0xAD67, 0x74AF, 0xAD68, 0x74B0, 0xAD69, 0x74B1, 0xAD6A, 0x74B2, + 0xAD6B, 0x74B3, 0xAD6C, 0x74B4, 0xAD6D, 0x74B5, 0xAD6E, 0x74B6, + 0xAD6F, 0x74B7, 0xAD70, 0x74B8, 0xAD71, 0x74B9, 0xAD72, 0x74BB, + 0xAD73, 0x74BC, 0xAD74, 0x74BD, 0xAD75, 0x74BE, 0xAD76, 0x74BF, + 0xAD77, 0x74C0, 0xAD78, 0x74C1, 0xAD79, 0x74C2, 0xAD7A, 0x74C3, + 0xAD7B, 0x74C4, 0xAD7C, 0x74C5, 0xAD7D, 0x74C6, 0xAD7E, 0x74C7, + 0xAD80, 0x74C8, 0xAD81, 0x74C9, 0xAD82, 0x74CA, 0xAD83, 0x74CB, + 0xAD84, 0x74CC, 0xAD85, 0x74CD, 0xAD86, 0x74CE, 0xAD87, 0x74CF, + 0xAD88, 0x74D0, 0xAD89, 0x74D1, 0xAD8A, 0x74D3, 0xAD8B, 0x74D4, + 0xAD8C, 0x74D5, 0xAD8D, 0x74D6, 0xAD8E, 0x74D7, 0xAD8F, 0x74D8, + 0xAD90, 0x74D9, 0xAD91, 0x74DA, 0xAD92, 0x74DB, 0xAD93, 0x74DD, + 0xAD94, 0x74DF, 0xAD95, 0x74E1, 0xAD96, 0x74E5, 0xAD97, 0x74E7, + 0xAD98, 0x74E8, 0xAD99, 0x74E9, 0xAD9A, 0x74EA, 0xAD9B, 0x74EB, + 0xAD9C, 0x74EC, 0xAD9D, 0x74ED, 0xAD9E, 0x74F0, 0xAD9F, 0x74F1, + 0xADA0, 0x74F2, 0xAE40, 0x74F3, 0xAE41, 0x74F5, 0xAE42, 0x74F8, + 0xAE43, 0x74F9, 0xAE44, 0x74FA, 0xAE45, 0x74FB, 0xAE46, 0x74FC, + 0xAE47, 0x74FD, 0xAE48, 0x74FE, 0xAE49, 0x7500, 0xAE4A, 0x7501, + 0xAE4B, 0x7502, 0xAE4C, 0x7503, 0xAE4D, 0x7505, 0xAE4E, 0x7506, + 0xAE4F, 0x7507, 0xAE50, 0x7508, 0xAE51, 0x7509, 0xAE52, 0x750A, + 0xAE53, 0x750B, 0xAE54, 0x750C, 0xAE55, 0x750E, 0xAE56, 0x7510, + 0xAE57, 0x7512, 0xAE58, 0x7514, 0xAE59, 0x7515, 0xAE5A, 0x7516, + 0xAE5B, 0x7517, 0xAE5C, 0x751B, 0xAE5D, 0x751D, 0xAE5E, 0x751E, + 0xAE5F, 0x7520, 0xAE60, 0x7521, 0xAE61, 0x7522, 0xAE62, 0x7523, + 0xAE63, 0x7524, 0xAE64, 0x7526, 0xAE65, 0x7527, 0xAE66, 0x752A, + 0xAE67, 0x752E, 0xAE68, 0x7534, 0xAE69, 0x7536, 0xAE6A, 0x7539, + 0xAE6B, 0x753C, 0xAE6C, 0x753D, 0xAE6D, 0x753F, 0xAE6E, 0x7541, + 0xAE6F, 0x7542, 0xAE70, 0x7543, 0xAE71, 0x7544, 0xAE72, 0x7546, + 0xAE73, 0x7547, 0xAE74, 0x7549, 0xAE75, 0x754A, 0xAE76, 0x754D, + 0xAE77, 0x7550, 0xAE78, 0x7551, 0xAE79, 0x7552, 0xAE7A, 0x7553, + 0xAE7B, 0x7555, 0xAE7C, 0x7556, 0xAE7D, 0x7557, 0xAE7E, 0x7558, + 0xAE80, 0x755D, 0xAE81, 0x755E, 0xAE82, 0x755F, 0xAE83, 0x7560, + 0xAE84, 0x7561, 0xAE85, 0x7562, 0xAE86, 0x7563, 0xAE87, 0x7564, + 0xAE88, 0x7567, 0xAE89, 0x7568, 0xAE8A, 0x7569, 0xAE8B, 0x756B, + 0xAE8C, 0x756C, 0xAE8D, 0x756D, 0xAE8E, 0x756E, 0xAE8F, 0x756F, + 0xAE90, 0x7570, 0xAE91, 0x7571, 0xAE92, 0x7573, 0xAE93, 0x7575, + 0xAE94, 0x7576, 0xAE95, 0x7577, 0xAE96, 0x757A, 0xAE97, 0x757B, + 0xAE98, 0x757C, 0xAE99, 0x757D, 0xAE9A, 0x757E, 0xAE9B, 0x7580, + 0xAE9C, 0x7581, 0xAE9D, 0x7582, 0xAE9E, 0x7584, 0xAE9F, 0x7585, + 0xAEA0, 0x7587, 0xAF40, 0x7588, 0xAF41, 0x7589, 0xAF42, 0x758A, + 0xAF43, 0x758C, 0xAF44, 0x758D, 0xAF45, 0x758E, 0xAF46, 0x7590, + 0xAF47, 0x7593, 0xAF48, 0x7595, 0xAF49, 0x7598, 0xAF4A, 0x759B, + 0xAF4B, 0x759C, 0xAF4C, 0x759E, 0xAF4D, 0x75A2, 0xAF4E, 0x75A6, + 0xAF4F, 0x75A7, 0xAF50, 0x75A8, 0xAF51, 0x75A9, 0xAF52, 0x75AA, + 0xAF53, 0x75AD, 0xAF54, 0x75B6, 0xAF55, 0x75B7, 0xAF56, 0x75BA, + 0xAF57, 0x75BB, 0xAF58, 0x75BF, 0xAF59, 0x75C0, 0xAF5A, 0x75C1, + 0xAF5B, 0x75C6, 0xAF5C, 0x75CB, 0xAF5D, 0x75CC, 0xAF5E, 0x75CE, + 0xAF5F, 0x75CF, 0xAF60, 0x75D0, 0xAF61, 0x75D1, 0xAF62, 0x75D3, + 0xAF63, 0x75D7, 0xAF64, 0x75D9, 0xAF65, 0x75DA, 0xAF66, 0x75DC, + 0xAF67, 0x75DD, 0xAF68, 0x75DF, 0xAF69, 0x75E0, 0xAF6A, 0x75E1, + 0xAF6B, 0x75E5, 0xAF6C, 0x75E9, 0xAF6D, 0x75EC, 0xAF6E, 0x75ED, + 0xAF6F, 0x75EE, 0xAF70, 0x75EF, 0xAF71, 0x75F2, 0xAF72, 0x75F3, + 0xAF73, 0x75F5, 0xAF74, 0x75F6, 0xAF75, 0x75F7, 0xAF76, 0x75F8, + 0xAF77, 0x75FA, 0xAF78, 0x75FB, 0xAF79, 0x75FD, 0xAF7A, 0x75FE, + 0xAF7B, 0x7602, 0xAF7C, 0x7604, 0xAF7D, 0x7606, 0xAF7E, 0x7607, + 0xAF80, 0x7608, 0xAF81, 0x7609, 0xAF82, 0x760B, 0xAF83, 0x760D, + 0xAF84, 0x760E, 0xAF85, 0x760F, 0xAF86, 0x7611, 0xAF87, 0x7612, + 0xAF88, 0x7613, 0xAF89, 0x7614, 0xAF8A, 0x7616, 0xAF8B, 0x761A, + 0xAF8C, 0x761C, 0xAF8D, 0x761D, 0xAF8E, 0x761E, 0xAF8F, 0x7621, + 0xAF90, 0x7623, 0xAF91, 0x7627, 0xAF92, 0x7628, 0xAF93, 0x762C, + 0xAF94, 0x762E, 0xAF95, 0x762F, 0xAF96, 0x7631, 0xAF97, 0x7632, + 0xAF98, 0x7636, 0xAF99, 0x7637, 0xAF9A, 0x7639, 0xAF9B, 0x763A, + 0xAF9C, 0x763B, 0xAF9D, 0x763D, 0xAF9E, 0x7641, 0xAF9F, 0x7642, + 0xAFA0, 0x7644, 0xB040, 0x7645, 0xB041, 0x7646, 0xB042, 0x7647, + 0xB043, 0x7648, 0xB044, 0x7649, 0xB045, 0x764A, 0xB046, 0x764B, + 0xB047, 0x764E, 0xB048, 0x764F, 0xB049, 0x7650, 0xB04A, 0x7651, + 0xB04B, 0x7652, 0xB04C, 0x7653, 0xB04D, 0x7655, 0xB04E, 0x7657, + 0xB04F, 0x7658, 0xB050, 0x7659, 0xB051, 0x765A, 0xB052, 0x765B, + 0xB053, 0x765D, 0xB054, 0x765F, 0xB055, 0x7660, 0xB056, 0x7661, + 0xB057, 0x7662, 0xB058, 0x7664, 0xB059, 0x7665, 0xB05A, 0x7666, + 0xB05B, 0x7667, 0xB05C, 0x7668, 0xB05D, 0x7669, 0xB05E, 0x766A, + 0xB05F, 0x766C, 0xB060, 0x766D, 0xB061, 0x766E, 0xB062, 0x7670, + 0xB063, 0x7671, 0xB064, 0x7672, 0xB065, 0x7673, 0xB066, 0x7674, + 0xB067, 0x7675, 0xB068, 0x7676, 0xB069, 0x7677, 0xB06A, 0x7679, + 0xB06B, 0x767A, 0xB06C, 0x767C, 0xB06D, 0x767F, 0xB06E, 0x7680, + 0xB06F, 0x7681, 0xB070, 0x7683, 0xB071, 0x7685, 0xB072, 0x7689, + 0xB073, 0x768A, 0xB074, 0x768C, 0xB075, 0x768D, 0xB076, 0x768F, + 0xB077, 0x7690, 0xB078, 0x7692, 0xB079, 0x7694, 0xB07A, 0x7695, + 0xB07B, 0x7697, 0xB07C, 0x7698, 0xB07D, 0x769A, 0xB07E, 0x769B, + 0xB080, 0x769C, 0xB081, 0x769D, 0xB082, 0x769E, 0xB083, 0x769F, + 0xB084, 0x76A0, 0xB085, 0x76A1, 0xB086, 0x76A2, 0xB087, 0x76A3, + 0xB088, 0x76A5, 0xB089, 0x76A6, 0xB08A, 0x76A7, 0xB08B, 0x76A8, + 0xB08C, 0x76A9, 0xB08D, 0x76AA, 0xB08E, 0x76AB, 0xB08F, 0x76AC, + 0xB090, 0x76AD, 0xB091, 0x76AF, 0xB092, 0x76B0, 0xB093, 0x76B3, + 0xB094, 0x76B5, 0xB095, 0x76B6, 0xB096, 0x76B7, 0xB097, 0x76B8, + 0xB098, 0x76B9, 0xB099, 0x76BA, 0xB09A, 0x76BB, 0xB09B, 0x76BC, + 0xB09C, 0x76BD, 0xB09D, 0x76BE, 0xB09E, 0x76C0, 0xB09F, 0x76C1, + 0xB0A0, 0x76C3, 0xB0A1, 0x554A, 0xB0A2, 0x963F, 0xB0A3, 0x57C3, + 0xB0A4, 0x6328, 0xB0A5, 0x54CE, 0xB0A6, 0x5509, 0xB0A7, 0x54C0, + 0xB0A8, 0x7691, 0xB0A9, 0x764C, 0xB0AA, 0x853C, 0xB0AB, 0x77EE, + 0xB0AC, 0x827E, 0xB0AD, 0x788D, 0xB0AE, 0x7231, 0xB0AF, 0x9698, + 0xB0B0, 0x978D, 0xB0B1, 0x6C28, 0xB0B2, 0x5B89, 0xB0B3, 0x4FFA, + 0xB0B4, 0x6309, 0xB0B5, 0x6697, 0xB0B6, 0x5CB8, 0xB0B7, 0x80FA, + 0xB0B8, 0x6848, 0xB0B9, 0x80AE, 0xB0BA, 0x6602, 0xB0BB, 0x76CE, + 0xB0BC, 0x51F9, 0xB0BD, 0x6556, 0xB0BE, 0x71AC, 0xB0BF, 0x7FF1, + 0xB0C0, 0x8884, 0xB0C1, 0x50B2, 0xB0C2, 0x5965, 0xB0C3, 0x61CA, + 0xB0C4, 0x6FB3, 0xB0C5, 0x82AD, 0xB0C6, 0x634C, 0xB0C7, 0x6252, + 0xB0C8, 0x53ED, 0xB0C9, 0x5427, 0xB0CA, 0x7B06, 0xB0CB, 0x516B, + 0xB0CC, 0x75A4, 0xB0CD, 0x5DF4, 0xB0CE, 0x62D4, 0xB0CF, 0x8DCB, + 0xB0D0, 0x9776, 0xB0D1, 0x628A, 0xB0D2, 0x8019, 0xB0D3, 0x575D, + 0xB0D4, 0x9738, 0xB0D5, 0x7F62, 0xB0D6, 0x7238, 0xB0D7, 0x767D, + 0xB0D8, 0x67CF, 0xB0D9, 0x767E, 0xB0DA, 0x6446, 0xB0DB, 0x4F70, + 0xB0DC, 0x8D25, 0xB0DD, 0x62DC, 0xB0DE, 0x7A17, 0xB0DF, 0x6591, + 0xB0E0, 0x73ED, 0xB0E1, 0x642C, 0xB0E2, 0x6273, 0xB0E3, 0x822C, + 0xB0E4, 0x9881, 0xB0E5, 0x677F, 0xB0E6, 0x7248, 0xB0E7, 0x626E, + 0xB0E8, 0x62CC, 0xB0E9, 0x4F34, 0xB0EA, 0x74E3, 0xB0EB, 0x534A, + 0xB0EC, 0x529E, 0xB0ED, 0x7ECA, 0xB0EE, 0x90A6, 0xB0EF, 0x5E2E, + 0xB0F0, 0x6886, 0xB0F1, 0x699C, 0xB0F2, 0x8180, 0xB0F3, 0x7ED1, + 0xB0F4, 0x68D2, 0xB0F5, 0x78C5, 0xB0F6, 0x868C, 0xB0F7, 0x9551, + 0xB0F8, 0x508D, 0xB0F9, 0x8C24, 0xB0FA, 0x82DE, 0xB0FB, 0x80DE, + 0xB0FC, 0x5305, 0xB0FD, 0x8912, 0xB0FE, 0x5265, 0xB140, 0x76C4, + 0xB141, 0x76C7, 0xB142, 0x76C9, 0xB143, 0x76CB, 0xB144, 0x76CC, + 0xB145, 0x76D3, 0xB146, 0x76D5, 0xB147, 0x76D9, 0xB148, 0x76DA, + 0xB149, 0x76DC, 0xB14A, 0x76DD, 0xB14B, 0x76DE, 0xB14C, 0x76E0, + 0xB14D, 0x76E1, 0xB14E, 0x76E2, 0xB14F, 0x76E3, 0xB150, 0x76E4, + 0xB151, 0x76E6, 0xB152, 0x76E7, 0xB153, 0x76E8, 0xB154, 0x76E9, + 0xB155, 0x76EA, 0xB156, 0x76EB, 0xB157, 0x76EC, 0xB158, 0x76ED, + 0xB159, 0x76F0, 0xB15A, 0x76F3, 0xB15B, 0x76F5, 0xB15C, 0x76F6, + 0xB15D, 0x76F7, 0xB15E, 0x76FA, 0xB15F, 0x76FB, 0xB160, 0x76FD, + 0xB161, 0x76FF, 0xB162, 0x7700, 0xB163, 0x7702, 0xB164, 0x7703, + 0xB165, 0x7705, 0xB166, 0x7706, 0xB167, 0x770A, 0xB168, 0x770C, + 0xB169, 0x770E, 0xB16A, 0x770F, 0xB16B, 0x7710, 0xB16C, 0x7711, + 0xB16D, 0x7712, 0xB16E, 0x7713, 0xB16F, 0x7714, 0xB170, 0x7715, + 0xB171, 0x7716, 0xB172, 0x7717, 0xB173, 0x7718, 0xB174, 0x771B, + 0xB175, 0x771C, 0xB176, 0x771D, 0xB177, 0x771E, 0xB178, 0x7721, + 0xB179, 0x7723, 0xB17A, 0x7724, 0xB17B, 0x7725, 0xB17C, 0x7727, + 0xB17D, 0x772A, 0xB17E, 0x772B, 0xB180, 0x772C, 0xB181, 0x772E, + 0xB182, 0x7730, 0xB183, 0x7731, 0xB184, 0x7732, 0xB185, 0x7733, + 0xB186, 0x7734, 0xB187, 0x7739, 0xB188, 0x773B, 0xB189, 0x773D, + 0xB18A, 0x773E, 0xB18B, 0x773F, 0xB18C, 0x7742, 0xB18D, 0x7744, + 0xB18E, 0x7745, 0xB18F, 0x7746, 0xB190, 0x7748, 0xB191, 0x7749, + 0xB192, 0x774A, 0xB193, 0x774B, 0xB194, 0x774C, 0xB195, 0x774D, + 0xB196, 0x774E, 0xB197, 0x774F, 0xB198, 0x7752, 0xB199, 0x7753, + 0xB19A, 0x7754, 0xB19B, 0x7755, 0xB19C, 0x7756, 0xB19D, 0x7757, + 0xB19E, 0x7758, 0xB19F, 0x7759, 0xB1A0, 0x775C, 0xB1A1, 0x8584, + 0xB1A2, 0x96F9, 0xB1A3, 0x4FDD, 0xB1A4, 0x5821, 0xB1A5, 0x9971, + 0xB1A6, 0x5B9D, 0xB1A7, 0x62B1, 0xB1A8, 0x62A5, 0xB1A9, 0x66B4, + 0xB1AA, 0x8C79, 0xB1AB, 0x9C8D, 0xB1AC, 0x7206, 0xB1AD, 0x676F, + 0xB1AE, 0x7891, 0xB1AF, 0x60B2, 0xB1B0, 0x5351, 0xB1B1, 0x5317, + 0xB1B2, 0x8F88, 0xB1B3, 0x80CC, 0xB1B4, 0x8D1D, 0xB1B5, 0x94A1, + 0xB1B6, 0x500D, 0xB1B7, 0x72C8, 0xB1B8, 0x5907, 0xB1B9, 0x60EB, + 0xB1BA, 0x7119, 0xB1BB, 0x88AB, 0xB1BC, 0x5954, 0xB1BD, 0x82EF, + 0xB1BE, 0x672C, 0xB1BF, 0x7B28, 0xB1C0, 0x5D29, 0xB1C1, 0x7EF7, + 0xB1C2, 0x752D, 0xB1C3, 0x6CF5, 0xB1C4, 0x8E66, 0xB1C5, 0x8FF8, + 0xB1C6, 0x903C, 0xB1C7, 0x9F3B, 0xB1C8, 0x6BD4, 0xB1C9, 0x9119, + 0xB1CA, 0x7B14, 0xB1CB, 0x5F7C, 0xB1CC, 0x78A7, 0xB1CD, 0x84D6, + 0xB1CE, 0x853D, 0xB1CF, 0x6BD5, 0xB1D0, 0x6BD9, 0xB1D1, 0x6BD6, + 0xB1D2, 0x5E01, 0xB1D3, 0x5E87, 0xB1D4, 0x75F9, 0xB1D5, 0x95ED, + 0xB1D6, 0x655D, 0xB1D7, 0x5F0A, 0xB1D8, 0x5FC5, 0xB1D9, 0x8F9F, + 0xB1DA, 0x58C1, 0xB1DB, 0x81C2, 0xB1DC, 0x907F, 0xB1DD, 0x965B, + 0xB1DE, 0x97AD, 0xB1DF, 0x8FB9, 0xB1E0, 0x7F16, 0xB1E1, 0x8D2C, + 0xB1E2, 0x6241, 0xB1E3, 0x4FBF, 0xB1E4, 0x53D8, 0xB1E5, 0x535E, + 0xB1E6, 0x8FA8, 0xB1E7, 0x8FA9, 0xB1E8, 0x8FAB, 0xB1E9, 0x904D, + 0xB1EA, 0x6807, 0xB1EB, 0x5F6A, 0xB1EC, 0x8198, 0xB1ED, 0x8868, + 0xB1EE, 0x9CD6, 0xB1EF, 0x618B, 0xB1F0, 0x522B, 0xB1F1, 0x762A, + 0xB1F2, 0x5F6C, 0xB1F3, 0x658C, 0xB1F4, 0x6FD2, 0xB1F5, 0x6EE8, + 0xB1F6, 0x5BBE, 0xB1F7, 0x6448, 0xB1F8, 0x5175, 0xB1F9, 0x51B0, + 0xB1FA, 0x67C4, 0xB1FB, 0x4E19, 0xB1FC, 0x79C9, 0xB1FD, 0x997C, + 0xB1FE, 0x70B3, 0xB240, 0x775D, 0xB241, 0x775E, 0xB242, 0x775F, + 0xB243, 0x7760, 0xB244, 0x7764, 0xB245, 0x7767, 0xB246, 0x7769, + 0xB247, 0x776A, 0xB248, 0x776D, 0xB249, 0x776E, 0xB24A, 0x776F, + 0xB24B, 0x7770, 0xB24C, 0x7771, 0xB24D, 0x7772, 0xB24E, 0x7773, + 0xB24F, 0x7774, 0xB250, 0x7775, 0xB251, 0x7776, 0xB252, 0x7777, + 0xB253, 0x7778, 0xB254, 0x777A, 0xB255, 0x777B, 0xB256, 0x777C, + 0xB257, 0x7781, 0xB258, 0x7782, 0xB259, 0x7783, 0xB25A, 0x7786, + 0xB25B, 0x7787, 0xB25C, 0x7788, 0xB25D, 0x7789, 0xB25E, 0x778A, + 0xB25F, 0x778B, 0xB260, 0x778F, 0xB261, 0x7790, 0xB262, 0x7793, + 0xB263, 0x7794, 0xB264, 0x7795, 0xB265, 0x7796, 0xB266, 0x7797, + 0xB267, 0x7798, 0xB268, 0x7799, 0xB269, 0x779A, 0xB26A, 0x779B, + 0xB26B, 0x779C, 0xB26C, 0x779D, 0xB26D, 0x779E, 0xB26E, 0x77A1, + 0xB26F, 0x77A3, 0xB270, 0x77A4, 0xB271, 0x77A6, 0xB272, 0x77A8, + 0xB273, 0x77AB, 0xB274, 0x77AD, 0xB275, 0x77AE, 0xB276, 0x77AF, + 0xB277, 0x77B1, 0xB278, 0x77B2, 0xB279, 0x77B4, 0xB27A, 0x77B6, + 0xB27B, 0x77B7, 0xB27C, 0x77B8, 0xB27D, 0x77B9, 0xB27E, 0x77BA, + 0xB280, 0x77BC, 0xB281, 0x77BE, 0xB282, 0x77C0, 0xB283, 0x77C1, + 0xB284, 0x77C2, 0xB285, 0x77C3, 0xB286, 0x77C4, 0xB287, 0x77C5, + 0xB288, 0x77C6, 0xB289, 0x77C7, 0xB28A, 0x77C8, 0xB28B, 0x77C9, + 0xB28C, 0x77CA, 0xB28D, 0x77CB, 0xB28E, 0x77CC, 0xB28F, 0x77CE, + 0xB290, 0x77CF, 0xB291, 0x77D0, 0xB292, 0x77D1, 0xB293, 0x77D2, + 0xB294, 0x77D3, 0xB295, 0x77D4, 0xB296, 0x77D5, 0xB297, 0x77D6, + 0xB298, 0x77D8, 0xB299, 0x77D9, 0xB29A, 0x77DA, 0xB29B, 0x77DD, + 0xB29C, 0x77DE, 0xB29D, 0x77DF, 0xB29E, 0x77E0, 0xB29F, 0x77E1, + 0xB2A0, 0x77E4, 0xB2A1, 0x75C5, 0xB2A2, 0x5E76, 0xB2A3, 0x73BB, + 0xB2A4, 0x83E0, 0xB2A5, 0x64AD, 0xB2A6, 0x62E8, 0xB2A7, 0x94B5, + 0xB2A8, 0x6CE2, 0xB2A9, 0x535A, 0xB2AA, 0x52C3, 0xB2AB, 0x640F, + 0xB2AC, 0x94C2, 0xB2AD, 0x7B94, 0xB2AE, 0x4F2F, 0xB2AF, 0x5E1B, + 0xB2B0, 0x8236, 0xB2B1, 0x8116, 0xB2B2, 0x818A, 0xB2B3, 0x6E24, + 0xB2B4, 0x6CCA, 0xB2B5, 0x9A73, 0xB2B6, 0x6355, 0xB2B7, 0x535C, + 0xB2B8, 0x54FA, 0xB2B9, 0x8865, 0xB2BA, 0x57E0, 0xB2BB, 0x4E0D, + 0xB2BC, 0x5E03, 0xB2BD, 0x6B65, 0xB2BE, 0x7C3F, 0xB2BF, 0x90E8, + 0xB2C0, 0x6016, 0xB2C1, 0x64E6, 0xB2C2, 0x731C, 0xB2C3, 0x88C1, + 0xB2C4, 0x6750, 0xB2C5, 0x624D, 0xB2C6, 0x8D22, 0xB2C7, 0x776C, + 0xB2C8, 0x8E29, 0xB2C9, 0x91C7, 0xB2CA, 0x5F69, 0xB2CB, 0x83DC, + 0xB2CC, 0x8521, 0xB2CD, 0x9910, 0xB2CE, 0x53C2, 0xB2CF, 0x8695, + 0xB2D0, 0x6B8B, 0xB2D1, 0x60ED, 0xB2D2, 0x60E8, 0xB2D3, 0x707F, + 0xB2D4, 0x82CD, 0xB2D5, 0x8231, 0xB2D6, 0x4ED3, 0xB2D7, 0x6CA7, + 0xB2D8, 0x85CF, 0xB2D9, 0x64CD, 0xB2DA, 0x7CD9, 0xB2DB, 0x69FD, + 0xB2DC, 0x66F9, 0xB2DD, 0x8349, 0xB2DE, 0x5395, 0xB2DF, 0x7B56, + 0xB2E0, 0x4FA7, 0xB2E1, 0x518C, 0xB2E2, 0x6D4B, 0xB2E3, 0x5C42, + 0xB2E4, 0x8E6D, 0xB2E5, 0x63D2, 0xB2E6, 0x53C9, 0xB2E7, 0x832C, + 0xB2E8, 0x8336, 0xB2E9, 0x67E5, 0xB2EA, 0x78B4, 0xB2EB, 0x643D, + 0xB2EC, 0x5BDF, 0xB2ED, 0x5C94, 0xB2EE, 0x5DEE, 0xB2EF, 0x8BE7, + 0xB2F0, 0x62C6, 0xB2F1, 0x67F4, 0xB2F2, 0x8C7A, 0xB2F3, 0x6400, + 0xB2F4, 0x63BA, 0xB2F5, 0x8749, 0xB2F6, 0x998B, 0xB2F7, 0x8C17, + 0xB2F8, 0x7F20, 0xB2F9, 0x94F2, 0xB2FA, 0x4EA7, 0xB2FB, 0x9610, + 0xB2FC, 0x98A4, 0xB2FD, 0x660C, 0xB2FE, 0x7316, 0xB340, 0x77E6, + 0xB341, 0x77E8, 0xB342, 0x77EA, 0xB343, 0x77EF, 0xB344, 0x77F0, + 0xB345, 0x77F1, 0xB346, 0x77F2, 0xB347, 0x77F4, 0xB348, 0x77F5, + 0xB349, 0x77F7, 0xB34A, 0x77F9, 0xB34B, 0x77FA, 0xB34C, 0x77FB, + 0xB34D, 0x77FC, 0xB34E, 0x7803, 0xB34F, 0x7804, 0xB350, 0x7805, + 0xB351, 0x7806, 0xB352, 0x7807, 0xB353, 0x7808, 0xB354, 0x780A, + 0xB355, 0x780B, 0xB356, 0x780E, 0xB357, 0x780F, 0xB358, 0x7810, + 0xB359, 0x7813, 0xB35A, 0x7815, 0xB35B, 0x7819, 0xB35C, 0x781B, + 0xB35D, 0x781E, 0xB35E, 0x7820, 0xB35F, 0x7821, 0xB360, 0x7822, + 0xB361, 0x7824, 0xB362, 0x7828, 0xB363, 0x782A, 0xB364, 0x782B, + 0xB365, 0x782E, 0xB366, 0x782F, 0xB367, 0x7831, 0xB368, 0x7832, + 0xB369, 0x7833, 0xB36A, 0x7835, 0xB36B, 0x7836, 0xB36C, 0x783D, + 0xB36D, 0x783F, 0xB36E, 0x7841, 0xB36F, 0x7842, 0xB370, 0x7843, + 0xB371, 0x7844, 0xB372, 0x7846, 0xB373, 0x7848, 0xB374, 0x7849, + 0xB375, 0x784A, 0xB376, 0x784B, 0xB377, 0x784D, 0xB378, 0x784F, + 0xB379, 0x7851, 0xB37A, 0x7853, 0xB37B, 0x7854, 0xB37C, 0x7858, + 0xB37D, 0x7859, 0xB37E, 0x785A, 0xB380, 0x785B, 0xB381, 0x785C, + 0xB382, 0x785E, 0xB383, 0x785F, 0xB384, 0x7860, 0xB385, 0x7861, + 0xB386, 0x7862, 0xB387, 0x7863, 0xB388, 0x7864, 0xB389, 0x7865, + 0xB38A, 0x7866, 0xB38B, 0x7867, 0xB38C, 0x7868, 0xB38D, 0x7869, + 0xB38E, 0x786F, 0xB38F, 0x7870, 0xB390, 0x7871, 0xB391, 0x7872, + 0xB392, 0x7873, 0xB393, 0x7874, 0xB394, 0x7875, 0xB395, 0x7876, + 0xB396, 0x7878, 0xB397, 0x7879, 0xB398, 0x787A, 0xB399, 0x787B, + 0xB39A, 0x787D, 0xB39B, 0x787E, 0xB39C, 0x787F, 0xB39D, 0x7880, + 0xB39E, 0x7881, 0xB39F, 0x7882, 0xB3A0, 0x7883, 0xB3A1, 0x573A, + 0xB3A2, 0x5C1D, 0xB3A3, 0x5E38, 0xB3A4, 0x957F, 0xB3A5, 0x507F, + 0xB3A6, 0x80A0, 0xB3A7, 0x5382, 0xB3A8, 0x655E, 0xB3A9, 0x7545, + 0xB3AA, 0x5531, 0xB3AB, 0x5021, 0xB3AC, 0x8D85, 0xB3AD, 0x6284, + 0xB3AE, 0x949E, 0xB3AF, 0x671D, 0xB3B0, 0x5632, 0xB3B1, 0x6F6E, + 0xB3B2, 0x5DE2, 0xB3B3, 0x5435, 0xB3B4, 0x7092, 0xB3B5, 0x8F66, + 0xB3B6, 0x626F, 0xB3B7, 0x64A4, 0xB3B8, 0x63A3, 0xB3B9, 0x5F7B, + 0xB3BA, 0x6F88, 0xB3BB, 0x90F4, 0xB3BC, 0x81E3, 0xB3BD, 0x8FB0, + 0xB3BE, 0x5C18, 0xB3BF, 0x6668, 0xB3C0, 0x5FF1, 0xB3C1, 0x6C89, + 0xB3C2, 0x9648, 0xB3C3, 0x8D81, 0xB3C4, 0x886C, 0xB3C5, 0x6491, + 0xB3C6, 0x79F0, 0xB3C7, 0x57CE, 0xB3C8, 0x6A59, 0xB3C9, 0x6210, + 0xB3CA, 0x5448, 0xB3CB, 0x4E58, 0xB3CC, 0x7A0B, 0xB3CD, 0x60E9, + 0xB3CE, 0x6F84, 0xB3CF, 0x8BDA, 0xB3D0, 0x627F, 0xB3D1, 0x901E, + 0xB3D2, 0x9A8B, 0xB3D3, 0x79E4, 0xB3D4, 0x5403, 0xB3D5, 0x75F4, + 0xB3D6, 0x6301, 0xB3D7, 0x5319, 0xB3D8, 0x6C60, 0xB3D9, 0x8FDF, + 0xB3DA, 0x5F1B, 0xB3DB, 0x9A70, 0xB3DC, 0x803B, 0xB3DD, 0x9F7F, + 0xB3DE, 0x4F88, 0xB3DF, 0x5C3A, 0xB3E0, 0x8D64, 0xB3E1, 0x7FC5, + 0xB3E2, 0x65A5, 0xB3E3, 0x70BD, 0xB3E4, 0x5145, 0xB3E5, 0x51B2, + 0xB3E6, 0x866B, 0xB3E7, 0x5D07, 0xB3E8, 0x5BA0, 0xB3E9, 0x62BD, + 0xB3EA, 0x916C, 0xB3EB, 0x7574, 0xB3EC, 0x8E0C, 0xB3ED, 0x7A20, + 0xB3EE, 0x6101, 0xB3EF, 0x7B79, 0xB3F0, 0x4EC7, 0xB3F1, 0x7EF8, + 0xB3F2, 0x7785, 0xB3F3, 0x4E11, 0xB3F4, 0x81ED, 0xB3F5, 0x521D, + 0xB3F6, 0x51FA, 0xB3F7, 0x6A71, 0xB3F8, 0x53A8, 0xB3F9, 0x8E87, + 0xB3FA, 0x9504, 0xB3FB, 0x96CF, 0xB3FC, 0x6EC1, 0xB3FD, 0x9664, + 0xB3FE, 0x695A, 0xB440, 0x7884, 0xB441, 0x7885, 0xB442, 0x7886, + 0xB443, 0x7888, 0xB444, 0x788A, 0xB445, 0x788B, 0xB446, 0x788F, + 0xB447, 0x7890, 0xB448, 0x7892, 0xB449, 0x7894, 0xB44A, 0x7895, + 0xB44B, 0x7896, 0xB44C, 0x7899, 0xB44D, 0x789D, 0xB44E, 0x789E, + 0xB44F, 0x78A0, 0xB450, 0x78A2, 0xB451, 0x78A4, 0xB452, 0x78A6, + 0xB453, 0x78A8, 0xB454, 0x78A9, 0xB455, 0x78AA, 0xB456, 0x78AB, + 0xB457, 0x78AC, 0xB458, 0x78AD, 0xB459, 0x78AE, 0xB45A, 0x78AF, + 0xB45B, 0x78B5, 0xB45C, 0x78B6, 0xB45D, 0x78B7, 0xB45E, 0x78B8, + 0xB45F, 0x78BA, 0xB460, 0x78BB, 0xB461, 0x78BC, 0xB462, 0x78BD, + 0xB463, 0x78BF, 0xB464, 0x78C0, 0xB465, 0x78C2, 0xB466, 0x78C3, + 0xB467, 0x78C4, 0xB468, 0x78C6, 0xB469, 0x78C7, 0xB46A, 0x78C8, + 0xB46B, 0x78CC, 0xB46C, 0x78CD, 0xB46D, 0x78CE, 0xB46E, 0x78CF, + 0xB46F, 0x78D1, 0xB470, 0x78D2, 0xB471, 0x78D3, 0xB472, 0x78D6, + 0xB473, 0x78D7, 0xB474, 0x78D8, 0xB475, 0x78DA, 0xB476, 0x78DB, + 0xB477, 0x78DC, 0xB478, 0x78DD, 0xB479, 0x78DE, 0xB47A, 0x78DF, + 0xB47B, 0x78E0, 0xB47C, 0x78E1, 0xB47D, 0x78E2, 0xB47E, 0x78E3, + 0xB480, 0x78E4, 0xB481, 0x78E5, 0xB482, 0x78E6, 0xB483, 0x78E7, + 0xB484, 0x78E9, 0xB485, 0x78EA, 0xB486, 0x78EB, 0xB487, 0x78ED, + 0xB488, 0x78EE, 0xB489, 0x78EF, 0xB48A, 0x78F0, 0xB48B, 0x78F1, + 0xB48C, 0x78F3, 0xB48D, 0x78F5, 0xB48E, 0x78F6, 0xB48F, 0x78F8, + 0xB490, 0x78F9, 0xB491, 0x78FB, 0xB492, 0x78FC, 0xB493, 0x78FD, + 0xB494, 0x78FE, 0xB495, 0x78FF, 0xB496, 0x7900, 0xB497, 0x7902, + 0xB498, 0x7903, 0xB499, 0x7904, 0xB49A, 0x7906, 0xB49B, 0x7907, + 0xB49C, 0x7908, 0xB49D, 0x7909, 0xB49E, 0x790A, 0xB49F, 0x790B, + 0xB4A0, 0x790C, 0xB4A1, 0x7840, 0xB4A2, 0x50A8, 0xB4A3, 0x77D7, + 0xB4A4, 0x6410, 0xB4A5, 0x89E6, 0xB4A6, 0x5904, 0xB4A7, 0x63E3, + 0xB4A8, 0x5DDD, 0xB4A9, 0x7A7F, 0xB4AA, 0x693D, 0xB4AB, 0x4F20, + 0xB4AC, 0x8239, 0xB4AD, 0x5598, 0xB4AE, 0x4E32, 0xB4AF, 0x75AE, + 0xB4B0, 0x7A97, 0xB4B1, 0x5E62, 0xB4B2, 0x5E8A, 0xB4B3, 0x95EF, + 0xB4B4, 0x521B, 0xB4B5, 0x5439, 0xB4B6, 0x708A, 0xB4B7, 0x6376, + 0xB4B8, 0x9524, 0xB4B9, 0x5782, 0xB4BA, 0x6625, 0xB4BB, 0x693F, + 0xB4BC, 0x9187, 0xB4BD, 0x5507, 0xB4BE, 0x6DF3, 0xB4BF, 0x7EAF, + 0xB4C0, 0x8822, 0xB4C1, 0x6233, 0xB4C2, 0x7EF0, 0xB4C3, 0x75B5, + 0xB4C4, 0x8328, 0xB4C5, 0x78C1, 0xB4C6, 0x96CC, 0xB4C7, 0x8F9E, + 0xB4C8, 0x6148, 0xB4C9, 0x74F7, 0xB4CA, 0x8BCD, 0xB4CB, 0x6B64, + 0xB4CC, 0x523A, 0xB4CD, 0x8D50, 0xB4CE, 0x6B21, 0xB4CF, 0x806A, + 0xB4D0, 0x8471, 0xB4D1, 0x56F1, 0xB4D2, 0x5306, 0xB4D3, 0x4ECE, + 0xB4D4, 0x4E1B, 0xB4D5, 0x51D1, 0xB4D6, 0x7C97, 0xB4D7, 0x918B, + 0xB4D8, 0x7C07, 0xB4D9, 0x4FC3, 0xB4DA, 0x8E7F, 0xB4DB, 0x7BE1, + 0xB4DC, 0x7A9C, 0xB4DD, 0x6467, 0xB4DE, 0x5D14, 0xB4DF, 0x50AC, + 0xB4E0, 0x8106, 0xB4E1, 0x7601, 0xB4E2, 0x7CB9, 0xB4E3, 0x6DEC, + 0xB4E4, 0x7FE0, 0xB4E5, 0x6751, 0xB4E6, 0x5B58, 0xB4E7, 0x5BF8, + 0xB4E8, 0x78CB, 0xB4E9, 0x64AE, 0xB4EA, 0x6413, 0xB4EB, 0x63AA, + 0xB4EC, 0x632B, 0xB4ED, 0x9519, 0xB4EE, 0x642D, 0xB4EF, 0x8FBE, + 0xB4F0, 0x7B54, 0xB4F1, 0x7629, 0xB4F2, 0x6253, 0xB4F3, 0x5927, + 0xB4F4, 0x5446, 0xB4F5, 0x6B79, 0xB4F6, 0x50A3, 0xB4F7, 0x6234, + 0xB4F8, 0x5E26, 0xB4F9, 0x6B86, 0xB4FA, 0x4EE3, 0xB4FB, 0x8D37, + 0xB4FC, 0x888B, 0xB4FD, 0x5F85, 0xB4FE, 0x902E, 0xB540, 0x790D, + 0xB541, 0x790E, 0xB542, 0x790F, 0xB543, 0x7910, 0xB544, 0x7911, + 0xB545, 0x7912, 0xB546, 0x7914, 0xB547, 0x7915, 0xB548, 0x7916, + 0xB549, 0x7917, 0xB54A, 0x7918, 0xB54B, 0x7919, 0xB54C, 0x791A, + 0xB54D, 0x791B, 0xB54E, 0x791C, 0xB54F, 0x791D, 0xB550, 0x791F, + 0xB551, 0x7920, 0xB552, 0x7921, 0xB553, 0x7922, 0xB554, 0x7923, + 0xB555, 0x7925, 0xB556, 0x7926, 0xB557, 0x7927, 0xB558, 0x7928, + 0xB559, 0x7929, 0xB55A, 0x792A, 0xB55B, 0x792B, 0xB55C, 0x792C, + 0xB55D, 0x792D, 0xB55E, 0x792E, 0xB55F, 0x792F, 0xB560, 0x7930, + 0xB561, 0x7931, 0xB562, 0x7932, 0xB563, 0x7933, 0xB564, 0x7935, + 0xB565, 0x7936, 0xB566, 0x7937, 0xB567, 0x7938, 0xB568, 0x7939, + 0xB569, 0x793D, 0xB56A, 0x793F, 0xB56B, 0x7942, 0xB56C, 0x7943, + 0xB56D, 0x7944, 0xB56E, 0x7945, 0xB56F, 0x7947, 0xB570, 0x794A, + 0xB571, 0x794B, 0xB572, 0x794C, 0xB573, 0x794D, 0xB574, 0x794E, + 0xB575, 0x794F, 0xB576, 0x7950, 0xB577, 0x7951, 0xB578, 0x7952, + 0xB579, 0x7954, 0xB57A, 0x7955, 0xB57B, 0x7958, 0xB57C, 0x7959, + 0xB57D, 0x7961, 0xB57E, 0x7963, 0xB580, 0x7964, 0xB581, 0x7966, + 0xB582, 0x7969, 0xB583, 0x796A, 0xB584, 0x796B, 0xB585, 0x796C, + 0xB586, 0x796E, 0xB587, 0x7970, 0xB588, 0x7971, 0xB589, 0x7972, + 0xB58A, 0x7973, 0xB58B, 0x7974, 0xB58C, 0x7975, 0xB58D, 0x7976, + 0xB58E, 0x7979, 0xB58F, 0x797B, 0xB590, 0x797C, 0xB591, 0x797D, + 0xB592, 0x797E, 0xB593, 0x797F, 0xB594, 0x7982, 0xB595, 0x7983, + 0xB596, 0x7986, 0xB597, 0x7987, 0xB598, 0x7988, 0xB599, 0x7989, + 0xB59A, 0x798B, 0xB59B, 0x798C, 0xB59C, 0x798D, 0xB59D, 0x798E, + 0xB59E, 0x7990, 0xB59F, 0x7991, 0xB5A0, 0x7992, 0xB5A1, 0x6020, + 0xB5A2, 0x803D, 0xB5A3, 0x62C5, 0xB5A4, 0x4E39, 0xB5A5, 0x5355, + 0xB5A6, 0x90F8, 0xB5A7, 0x63B8, 0xB5A8, 0x80C6, 0xB5A9, 0x65E6, + 0xB5AA, 0x6C2E, 0xB5AB, 0x4F46, 0xB5AC, 0x60EE, 0xB5AD, 0x6DE1, + 0xB5AE, 0x8BDE, 0xB5AF, 0x5F39, 0xB5B0, 0x86CB, 0xB5B1, 0x5F53, + 0xB5B2, 0x6321, 0xB5B3, 0x515A, 0xB5B4, 0x8361, 0xB5B5, 0x6863, + 0xB5B6, 0x5200, 0xB5B7, 0x6363, 0xB5B8, 0x8E48, 0xB5B9, 0x5012, + 0xB5BA, 0x5C9B, 0xB5BB, 0x7977, 0xB5BC, 0x5BFC, 0xB5BD, 0x5230, + 0xB5BE, 0x7A3B, 0xB5BF, 0x60BC, 0xB5C0, 0x9053, 0xB5C1, 0x76D7, + 0xB5C2, 0x5FB7, 0xB5C3, 0x5F97, 0xB5C4, 0x7684, 0xB5C5, 0x8E6C, + 0xB5C6, 0x706F, 0xB5C7, 0x767B, 0xB5C8, 0x7B49, 0xB5C9, 0x77AA, + 0xB5CA, 0x51F3, 0xB5CB, 0x9093, 0xB5CC, 0x5824, 0xB5CD, 0x4F4E, + 0xB5CE, 0x6EF4, 0xB5CF, 0x8FEA, 0xB5D0, 0x654C, 0xB5D1, 0x7B1B, + 0xB5D2, 0x72C4, 0xB5D3, 0x6DA4, 0xB5D4, 0x7FDF, 0xB5D5, 0x5AE1, + 0xB5D6, 0x62B5, 0xB5D7, 0x5E95, 0xB5D8, 0x5730, 0xB5D9, 0x8482, + 0xB5DA, 0x7B2C, 0xB5DB, 0x5E1D, 0xB5DC, 0x5F1F, 0xB5DD, 0x9012, + 0xB5DE, 0x7F14, 0xB5DF, 0x98A0, 0xB5E0, 0x6382, 0xB5E1, 0x6EC7, + 0xB5E2, 0x7898, 0xB5E3, 0x70B9, 0xB5E4, 0x5178, 0xB5E5, 0x975B, + 0xB5E6, 0x57AB, 0xB5E7, 0x7535, 0xB5E8, 0x4F43, 0xB5E9, 0x7538, + 0xB5EA, 0x5E97, 0xB5EB, 0x60E6, 0xB5EC, 0x5960, 0xB5ED, 0x6DC0, + 0xB5EE, 0x6BBF, 0xB5EF, 0x7889, 0xB5F0, 0x53FC, 0xB5F1, 0x96D5, + 0xB5F2, 0x51CB, 0xB5F3, 0x5201, 0xB5F4, 0x6389, 0xB5F5, 0x540A, + 0xB5F6, 0x9493, 0xB5F7, 0x8C03, 0xB5F8, 0x8DCC, 0xB5F9, 0x7239, + 0xB5FA, 0x789F, 0xB5FB, 0x8776, 0xB5FC, 0x8FED, 0xB5FD, 0x8C0D, + 0xB5FE, 0x53E0, 0xB640, 0x7993, 0xB641, 0x7994, 0xB642, 0x7995, + 0xB643, 0x7996, 0xB644, 0x7997, 0xB645, 0x7998, 0xB646, 0x7999, + 0xB647, 0x799B, 0xB648, 0x799C, 0xB649, 0x799D, 0xB64A, 0x799E, + 0xB64B, 0x799F, 0xB64C, 0x79A0, 0xB64D, 0x79A1, 0xB64E, 0x79A2, + 0xB64F, 0x79A3, 0xB650, 0x79A4, 0xB651, 0x79A5, 0xB652, 0x79A6, + 0xB653, 0x79A8, 0xB654, 0x79A9, 0xB655, 0x79AA, 0xB656, 0x79AB, + 0xB657, 0x79AC, 0xB658, 0x79AD, 0xB659, 0x79AE, 0xB65A, 0x79AF, + 0xB65B, 0x79B0, 0xB65C, 0x79B1, 0xB65D, 0x79B2, 0xB65E, 0x79B4, + 0xB65F, 0x79B5, 0xB660, 0x79B6, 0xB661, 0x79B7, 0xB662, 0x79B8, + 0xB663, 0x79BC, 0xB664, 0x79BF, 0xB665, 0x79C2, 0xB666, 0x79C4, + 0xB667, 0x79C5, 0xB668, 0x79C7, 0xB669, 0x79C8, 0xB66A, 0x79CA, + 0xB66B, 0x79CC, 0xB66C, 0x79CE, 0xB66D, 0x79CF, 0xB66E, 0x79D0, + 0xB66F, 0x79D3, 0xB670, 0x79D4, 0xB671, 0x79D6, 0xB672, 0x79D7, + 0xB673, 0x79D9, 0xB674, 0x79DA, 0xB675, 0x79DB, 0xB676, 0x79DC, + 0xB677, 0x79DD, 0xB678, 0x79DE, 0xB679, 0x79E0, 0xB67A, 0x79E1, + 0xB67B, 0x79E2, 0xB67C, 0x79E5, 0xB67D, 0x79E8, 0xB67E, 0x79EA, + 0xB680, 0x79EC, 0xB681, 0x79EE, 0xB682, 0x79F1, 0xB683, 0x79F2, + 0xB684, 0x79F3, 0xB685, 0x79F4, 0xB686, 0x79F5, 0xB687, 0x79F6, + 0xB688, 0x79F7, 0xB689, 0x79F9, 0xB68A, 0x79FA, 0xB68B, 0x79FC, + 0xB68C, 0x79FE, 0xB68D, 0x79FF, 0xB68E, 0x7A01, 0xB68F, 0x7A04, + 0xB690, 0x7A05, 0xB691, 0x7A07, 0xB692, 0x7A08, 0xB693, 0x7A09, + 0xB694, 0x7A0A, 0xB695, 0x7A0C, 0xB696, 0x7A0F, 0xB697, 0x7A10, + 0xB698, 0x7A11, 0xB699, 0x7A12, 0xB69A, 0x7A13, 0xB69B, 0x7A15, + 0xB69C, 0x7A16, 0xB69D, 0x7A18, 0xB69E, 0x7A19, 0xB69F, 0x7A1B, + 0xB6A0, 0x7A1C, 0xB6A1, 0x4E01, 0xB6A2, 0x76EF, 0xB6A3, 0x53EE, + 0xB6A4, 0x9489, 0xB6A5, 0x9876, 0xB6A6, 0x9F0E, 0xB6A7, 0x952D, + 0xB6A8, 0x5B9A, 0xB6A9, 0x8BA2, 0xB6AA, 0x4E22, 0xB6AB, 0x4E1C, + 0xB6AC, 0x51AC, 0xB6AD, 0x8463, 0xB6AE, 0x61C2, 0xB6AF, 0x52A8, + 0xB6B0, 0x680B, 0xB6B1, 0x4F97, 0xB6B2, 0x606B, 0xB6B3, 0x51BB, + 0xB6B4, 0x6D1E, 0xB6B5, 0x515C, 0xB6B6, 0x6296, 0xB6B7, 0x6597, + 0xB6B8, 0x9661, 0xB6B9, 0x8C46, 0xB6BA, 0x9017, 0xB6BB, 0x75D8, + 0xB6BC, 0x90FD, 0xB6BD, 0x7763, 0xB6BE, 0x6BD2, 0xB6BF, 0x728A, + 0xB6C0, 0x72EC, 0xB6C1, 0x8BFB, 0xB6C2, 0x5835, 0xB6C3, 0x7779, + 0xB6C4, 0x8D4C, 0xB6C5, 0x675C, 0xB6C6, 0x9540, 0xB6C7, 0x809A, + 0xB6C8, 0x5EA6, 0xB6C9, 0x6E21, 0xB6CA, 0x5992, 0xB6CB, 0x7AEF, + 0xB6CC, 0x77ED, 0xB6CD, 0x953B, 0xB6CE, 0x6BB5, 0xB6CF, 0x65AD, + 0xB6D0, 0x7F0E, 0xB6D1, 0x5806, 0xB6D2, 0x5151, 0xB6D3, 0x961F, + 0xB6D4, 0x5BF9, 0xB6D5, 0x58A9, 0xB6D6, 0x5428, 0xB6D7, 0x8E72, + 0xB6D8, 0x6566, 0xB6D9, 0x987F, 0xB6DA, 0x56E4, 0xB6DB, 0x949D, + 0xB6DC, 0x76FE, 0xB6DD, 0x9041, 0xB6DE, 0x6387, 0xB6DF, 0x54C6, + 0xB6E0, 0x591A, 0xB6E1, 0x593A, 0xB6E2, 0x579B, 0xB6E3, 0x8EB2, + 0xB6E4, 0x6735, 0xB6E5, 0x8DFA, 0xB6E6, 0x8235, 0xB6E7, 0x5241, + 0xB6E8, 0x60F0, 0xB6E9, 0x5815, 0xB6EA, 0x86FE, 0xB6EB, 0x5CE8, + 0xB6EC, 0x9E45, 0xB6ED, 0x4FC4, 0xB6EE, 0x989D, 0xB6EF, 0x8BB9, + 0xB6F0, 0x5A25, 0xB6F1, 0x6076, 0xB6F2, 0x5384, 0xB6F3, 0x627C, + 0xB6F4, 0x904F, 0xB6F5, 0x9102, 0xB6F6, 0x997F, 0xB6F7, 0x6069, + 0xB6F8, 0x800C, 0xB6F9, 0x513F, 0xB6FA, 0x8033, 0xB6FB, 0x5C14, + 0xB6FC, 0x9975, 0xB6FD, 0x6D31, 0xB6FE, 0x4E8C, 0xB740, 0x7A1D, + 0xB741, 0x7A1F, 0xB742, 0x7A21, 0xB743, 0x7A22, 0xB744, 0x7A24, + 0xB745, 0x7A25, 0xB746, 0x7A26, 0xB747, 0x7A27, 0xB748, 0x7A28, + 0xB749, 0x7A29, 0xB74A, 0x7A2A, 0xB74B, 0x7A2B, 0xB74C, 0x7A2C, + 0xB74D, 0x7A2D, 0xB74E, 0x7A2E, 0xB74F, 0x7A2F, 0xB750, 0x7A30, + 0xB751, 0x7A31, 0xB752, 0x7A32, 0xB753, 0x7A34, 0xB754, 0x7A35, + 0xB755, 0x7A36, 0xB756, 0x7A38, 0xB757, 0x7A3A, 0xB758, 0x7A3E, + 0xB759, 0x7A40, 0xB75A, 0x7A41, 0xB75B, 0x7A42, 0xB75C, 0x7A43, + 0xB75D, 0x7A44, 0xB75E, 0x7A45, 0xB75F, 0x7A47, 0xB760, 0x7A48, + 0xB761, 0x7A49, 0xB762, 0x7A4A, 0xB763, 0x7A4B, 0xB764, 0x7A4C, + 0xB765, 0x7A4D, 0xB766, 0x7A4E, 0xB767, 0x7A4F, 0xB768, 0x7A50, + 0xB769, 0x7A52, 0xB76A, 0x7A53, 0xB76B, 0x7A54, 0xB76C, 0x7A55, + 0xB76D, 0x7A56, 0xB76E, 0x7A58, 0xB76F, 0x7A59, 0xB770, 0x7A5A, + 0xB771, 0x7A5B, 0xB772, 0x7A5C, 0xB773, 0x7A5D, 0xB774, 0x7A5E, + 0xB775, 0x7A5F, 0xB776, 0x7A60, 0xB777, 0x7A61, 0xB778, 0x7A62, + 0xB779, 0x7A63, 0xB77A, 0x7A64, 0xB77B, 0x7A65, 0xB77C, 0x7A66, + 0xB77D, 0x7A67, 0xB77E, 0x7A68, 0xB780, 0x7A69, 0xB781, 0x7A6A, + 0xB782, 0x7A6B, 0xB783, 0x7A6C, 0xB784, 0x7A6D, 0xB785, 0x7A6E, + 0xB786, 0x7A6F, 0xB787, 0x7A71, 0xB788, 0x7A72, 0xB789, 0x7A73, + 0xB78A, 0x7A75, 0xB78B, 0x7A7B, 0xB78C, 0x7A7C, 0xB78D, 0x7A7D, + 0xB78E, 0x7A7E, 0xB78F, 0x7A82, 0xB790, 0x7A85, 0xB791, 0x7A87, + 0xB792, 0x7A89, 0xB793, 0x7A8A, 0xB794, 0x7A8B, 0xB795, 0x7A8C, + 0xB796, 0x7A8E, 0xB797, 0x7A8F, 0xB798, 0x7A90, 0xB799, 0x7A93, + 0xB79A, 0x7A94, 0xB79B, 0x7A99, 0xB79C, 0x7A9A, 0xB79D, 0x7A9B, + 0xB79E, 0x7A9E, 0xB79F, 0x7AA1, 0xB7A0, 0x7AA2, 0xB7A1, 0x8D30, + 0xB7A2, 0x53D1, 0xB7A3, 0x7F5A, 0xB7A4, 0x7B4F, 0xB7A5, 0x4F10, + 0xB7A6, 0x4E4F, 0xB7A7, 0x9600, 0xB7A8, 0x6CD5, 0xB7A9, 0x73D0, + 0xB7AA, 0x85E9, 0xB7AB, 0x5E06, 0xB7AC, 0x756A, 0xB7AD, 0x7FFB, + 0xB7AE, 0x6A0A, 0xB7AF, 0x77FE, 0xB7B0, 0x9492, 0xB7B1, 0x7E41, + 0xB7B2, 0x51E1, 0xB7B3, 0x70E6, 0xB7B4, 0x53CD, 0xB7B5, 0x8FD4, + 0xB7B6, 0x8303, 0xB7B7, 0x8D29, 0xB7B8, 0x72AF, 0xB7B9, 0x996D, + 0xB7BA, 0x6CDB, 0xB7BB, 0x574A, 0xB7BC, 0x82B3, 0xB7BD, 0x65B9, + 0xB7BE, 0x80AA, 0xB7BF, 0x623F, 0xB7C0, 0x9632, 0xB7C1, 0x59A8, + 0xB7C2, 0x4EFF, 0xB7C3, 0x8BBF, 0xB7C4, 0x7EBA, 0xB7C5, 0x653E, + 0xB7C6, 0x83F2, 0xB7C7, 0x975E, 0xB7C8, 0x5561, 0xB7C9, 0x98DE, + 0xB7CA, 0x80A5, 0xB7CB, 0x532A, 0xB7CC, 0x8BFD, 0xB7CD, 0x5420, + 0xB7CE, 0x80BA, 0xB7CF, 0x5E9F, 0xB7D0, 0x6CB8, 0xB7D1, 0x8D39, + 0xB7D2, 0x82AC, 0xB7D3, 0x915A, 0xB7D4, 0x5429, 0xB7D5, 0x6C1B, + 0xB7D6, 0x5206, 0xB7D7, 0x7EB7, 0xB7D8, 0x575F, 0xB7D9, 0x711A, + 0xB7DA, 0x6C7E, 0xB7DB, 0x7C89, 0xB7DC, 0x594B, 0xB7DD, 0x4EFD, + 0xB7DE, 0x5FFF, 0xB7DF, 0x6124, 0xB7E0, 0x7CAA, 0xB7E1, 0x4E30, + 0xB7E2, 0x5C01, 0xB7E3, 0x67AB, 0xB7E4, 0x8702, 0xB7E5, 0x5CF0, + 0xB7E6, 0x950B, 0xB7E7, 0x98CE, 0xB7E8, 0x75AF, 0xB7E9, 0x70FD, + 0xB7EA, 0x9022, 0xB7EB, 0x51AF, 0xB7EC, 0x7F1D, 0xB7ED, 0x8BBD, + 0xB7EE, 0x5949, 0xB7EF, 0x51E4, 0xB7F0, 0x4F5B, 0xB7F1, 0x5426, + 0xB7F2, 0x592B, 0xB7F3, 0x6577, 0xB7F4, 0x80A4, 0xB7F5, 0x5B75, + 0xB7F6, 0x6276, 0xB7F7, 0x62C2, 0xB7F8, 0x8F90, 0xB7F9, 0x5E45, + 0xB7FA, 0x6C1F, 0xB7FB, 0x7B26, 0xB7FC, 0x4F0F, 0xB7FD, 0x4FD8, + 0xB7FE, 0x670D, 0xB840, 0x7AA3, 0xB841, 0x7AA4, 0xB842, 0x7AA7, + 0xB843, 0x7AA9, 0xB844, 0x7AAA, 0xB845, 0x7AAB, 0xB846, 0x7AAE, + 0xB847, 0x7AAF, 0xB848, 0x7AB0, 0xB849, 0x7AB1, 0xB84A, 0x7AB2, + 0xB84B, 0x7AB4, 0xB84C, 0x7AB5, 0xB84D, 0x7AB6, 0xB84E, 0x7AB7, + 0xB84F, 0x7AB8, 0xB850, 0x7AB9, 0xB851, 0x7ABA, 0xB852, 0x7ABB, + 0xB853, 0x7ABC, 0xB854, 0x7ABD, 0xB855, 0x7ABE, 0xB856, 0x7AC0, + 0xB857, 0x7AC1, 0xB858, 0x7AC2, 0xB859, 0x7AC3, 0xB85A, 0x7AC4, + 0xB85B, 0x7AC5, 0xB85C, 0x7AC6, 0xB85D, 0x7AC7, 0xB85E, 0x7AC8, + 0xB85F, 0x7AC9, 0xB860, 0x7ACA, 0xB861, 0x7ACC, 0xB862, 0x7ACD, + 0xB863, 0x7ACE, 0xB864, 0x7ACF, 0xB865, 0x7AD0, 0xB866, 0x7AD1, + 0xB867, 0x7AD2, 0xB868, 0x7AD3, 0xB869, 0x7AD4, 0xB86A, 0x7AD5, + 0xB86B, 0x7AD7, 0xB86C, 0x7AD8, 0xB86D, 0x7ADA, 0xB86E, 0x7ADB, + 0xB86F, 0x7ADC, 0xB870, 0x7ADD, 0xB871, 0x7AE1, 0xB872, 0x7AE2, + 0xB873, 0x7AE4, 0xB874, 0x7AE7, 0xB875, 0x7AE8, 0xB876, 0x7AE9, + 0xB877, 0x7AEA, 0xB878, 0x7AEB, 0xB879, 0x7AEC, 0xB87A, 0x7AEE, + 0xB87B, 0x7AF0, 0xB87C, 0x7AF1, 0xB87D, 0x7AF2, 0xB87E, 0x7AF3, + 0xB880, 0x7AF4, 0xB881, 0x7AF5, 0xB882, 0x7AF6, 0xB883, 0x7AF7, + 0xB884, 0x7AF8, 0xB885, 0x7AFB, 0xB886, 0x7AFC, 0xB887, 0x7AFE, + 0xB888, 0x7B00, 0xB889, 0x7B01, 0xB88A, 0x7B02, 0xB88B, 0x7B05, + 0xB88C, 0x7B07, 0xB88D, 0x7B09, 0xB88E, 0x7B0C, 0xB88F, 0x7B0D, + 0xB890, 0x7B0E, 0xB891, 0x7B10, 0xB892, 0x7B12, 0xB893, 0x7B13, + 0xB894, 0x7B16, 0xB895, 0x7B17, 0xB896, 0x7B18, 0xB897, 0x7B1A, + 0xB898, 0x7B1C, 0xB899, 0x7B1D, 0xB89A, 0x7B1F, 0xB89B, 0x7B21, + 0xB89C, 0x7B22, 0xB89D, 0x7B23, 0xB89E, 0x7B27, 0xB89F, 0x7B29, + 0xB8A0, 0x7B2D, 0xB8A1, 0x6D6E, 0xB8A2, 0x6DAA, 0xB8A3, 0x798F, + 0xB8A4, 0x88B1, 0xB8A5, 0x5F17, 0xB8A6, 0x752B, 0xB8A7, 0x629A, + 0xB8A8, 0x8F85, 0xB8A9, 0x4FEF, 0xB8AA, 0x91DC, 0xB8AB, 0x65A7, + 0xB8AC, 0x812F, 0xB8AD, 0x8151, 0xB8AE, 0x5E9C, 0xB8AF, 0x8150, + 0xB8B0, 0x8D74, 0xB8B1, 0x526F, 0xB8B2, 0x8986, 0xB8B3, 0x8D4B, + 0xB8B4, 0x590D, 0xB8B5, 0x5085, 0xB8B6, 0x4ED8, 0xB8B7, 0x961C, + 0xB8B8, 0x7236, 0xB8B9, 0x8179, 0xB8BA, 0x8D1F, 0xB8BB, 0x5BCC, + 0xB8BC, 0x8BA3, 0xB8BD, 0x9644, 0xB8BE, 0x5987, 0xB8BF, 0x7F1A, + 0xB8C0, 0x5490, 0xB8C1, 0x5676, 0xB8C2, 0x560E, 0xB8C3, 0x8BE5, + 0xB8C4, 0x6539, 0xB8C5, 0x6982, 0xB8C6, 0x9499, 0xB8C7, 0x76D6, + 0xB8C8, 0x6E89, 0xB8C9, 0x5E72, 0xB8CA, 0x7518, 0xB8CB, 0x6746, + 0xB8CC, 0x67D1, 0xB8CD, 0x7AFF, 0xB8CE, 0x809D, 0xB8CF, 0x8D76, + 0xB8D0, 0x611F, 0xB8D1, 0x79C6, 0xB8D2, 0x6562, 0xB8D3, 0x8D63, + 0xB8D4, 0x5188, 0xB8D5, 0x521A, 0xB8D6, 0x94A2, 0xB8D7, 0x7F38, + 0xB8D8, 0x809B, 0xB8D9, 0x7EB2, 0xB8DA, 0x5C97, 0xB8DB, 0x6E2F, + 0xB8DC, 0x6760, 0xB8DD, 0x7BD9, 0xB8DE, 0x768B, 0xB8DF, 0x9AD8, + 0xB8E0, 0x818F, 0xB8E1, 0x7F94, 0xB8E2, 0x7CD5, 0xB8E3, 0x641E, + 0xB8E4, 0x9550, 0xB8E5, 0x7A3F, 0xB8E6, 0x544A, 0xB8E7, 0x54E5, + 0xB8E8, 0x6B4C, 0xB8E9, 0x6401, 0xB8EA, 0x6208, 0xB8EB, 0x9E3D, + 0xB8EC, 0x80F3, 0xB8ED, 0x7599, 0xB8EE, 0x5272, 0xB8EF, 0x9769, + 0xB8F0, 0x845B, 0xB8F1, 0x683C, 0xB8F2, 0x86E4, 0xB8F3, 0x9601, + 0xB8F4, 0x9694, 0xB8F5, 0x94EC, 0xB8F6, 0x4E2A, 0xB8F7, 0x5404, + 0xB8F8, 0x7ED9, 0xB8F9, 0x6839, 0xB8FA, 0x8DDF, 0xB8FB, 0x8015, + 0xB8FC, 0x66F4, 0xB8FD, 0x5E9A, 0xB8FE, 0x7FB9, 0xB940, 0x7B2F, + 0xB941, 0x7B30, 0xB942, 0x7B32, 0xB943, 0x7B34, 0xB944, 0x7B35, + 0xB945, 0x7B36, 0xB946, 0x7B37, 0xB947, 0x7B39, 0xB948, 0x7B3B, + 0xB949, 0x7B3D, 0xB94A, 0x7B3F, 0xB94B, 0x7B40, 0xB94C, 0x7B41, + 0xB94D, 0x7B42, 0xB94E, 0x7B43, 0xB94F, 0x7B44, 0xB950, 0x7B46, + 0xB951, 0x7B48, 0xB952, 0x7B4A, 0xB953, 0x7B4D, 0xB954, 0x7B4E, + 0xB955, 0x7B53, 0xB956, 0x7B55, 0xB957, 0x7B57, 0xB958, 0x7B59, + 0xB959, 0x7B5C, 0xB95A, 0x7B5E, 0xB95B, 0x7B5F, 0xB95C, 0x7B61, + 0xB95D, 0x7B63, 0xB95E, 0x7B64, 0xB95F, 0x7B65, 0xB960, 0x7B66, + 0xB961, 0x7B67, 0xB962, 0x7B68, 0xB963, 0x7B69, 0xB964, 0x7B6A, + 0xB965, 0x7B6B, 0xB966, 0x7B6C, 0xB967, 0x7B6D, 0xB968, 0x7B6F, + 0xB969, 0x7B70, 0xB96A, 0x7B73, 0xB96B, 0x7B74, 0xB96C, 0x7B76, + 0xB96D, 0x7B78, 0xB96E, 0x7B7A, 0xB96F, 0x7B7C, 0xB970, 0x7B7D, + 0xB971, 0x7B7F, 0xB972, 0x7B81, 0xB973, 0x7B82, 0xB974, 0x7B83, + 0xB975, 0x7B84, 0xB976, 0x7B86, 0xB977, 0x7B87, 0xB978, 0x7B88, + 0xB979, 0x7B89, 0xB97A, 0x7B8A, 0xB97B, 0x7B8B, 0xB97C, 0x7B8C, + 0xB97D, 0x7B8E, 0xB97E, 0x7B8F, 0xB980, 0x7B91, 0xB981, 0x7B92, + 0xB982, 0x7B93, 0xB983, 0x7B96, 0xB984, 0x7B98, 0xB985, 0x7B99, + 0xB986, 0x7B9A, 0xB987, 0x7B9B, 0xB988, 0x7B9E, 0xB989, 0x7B9F, + 0xB98A, 0x7BA0, 0xB98B, 0x7BA3, 0xB98C, 0x7BA4, 0xB98D, 0x7BA5, + 0xB98E, 0x7BAE, 0xB98F, 0x7BAF, 0xB990, 0x7BB0, 0xB991, 0x7BB2, + 0xB992, 0x7BB3, 0xB993, 0x7BB5, 0xB994, 0x7BB6, 0xB995, 0x7BB7, + 0xB996, 0x7BB9, 0xB997, 0x7BBA, 0xB998, 0x7BBB, 0xB999, 0x7BBC, + 0xB99A, 0x7BBD, 0xB99B, 0x7BBE, 0xB99C, 0x7BBF, 0xB99D, 0x7BC0, + 0xB99E, 0x7BC2, 0xB99F, 0x7BC3, 0xB9A0, 0x7BC4, 0xB9A1, 0x57C2, + 0xB9A2, 0x803F, 0xB9A3, 0x6897, 0xB9A4, 0x5DE5, 0xB9A5, 0x653B, + 0xB9A6, 0x529F, 0xB9A7, 0x606D, 0xB9A8, 0x9F9A, 0xB9A9, 0x4F9B, + 0xB9AA, 0x8EAC, 0xB9AB, 0x516C, 0xB9AC, 0x5BAB, 0xB9AD, 0x5F13, + 0xB9AE, 0x5DE9, 0xB9AF, 0x6C5E, 0xB9B0, 0x62F1, 0xB9B1, 0x8D21, + 0xB9B2, 0x5171, 0xB9B3, 0x94A9, 0xB9B4, 0x52FE, 0xB9B5, 0x6C9F, + 0xB9B6, 0x82DF, 0xB9B7, 0x72D7, 0xB9B8, 0x57A2, 0xB9B9, 0x6784, + 0xB9BA, 0x8D2D, 0xB9BB, 0x591F, 0xB9BC, 0x8F9C, 0xB9BD, 0x83C7, + 0xB9BE, 0x5495, 0xB9BF, 0x7B8D, 0xB9C0, 0x4F30, 0xB9C1, 0x6CBD, + 0xB9C2, 0x5B64, 0xB9C3, 0x59D1, 0xB9C4, 0x9F13, 0xB9C5, 0x53E4, + 0xB9C6, 0x86CA, 0xB9C7, 0x9AA8, 0xB9C8, 0x8C37, 0xB9C9, 0x80A1, + 0xB9CA, 0x6545, 0xB9CB, 0x987E, 0xB9CC, 0x56FA, 0xB9CD, 0x96C7, + 0xB9CE, 0x522E, 0xB9CF, 0x74DC, 0xB9D0, 0x5250, 0xB9D1, 0x5BE1, + 0xB9D2, 0x6302, 0xB9D3, 0x8902, 0xB9D4, 0x4E56, 0xB9D5, 0x62D0, + 0xB9D6, 0x602A, 0xB9D7, 0x68FA, 0xB9D8, 0x5173, 0xB9D9, 0x5B98, + 0xB9DA, 0x51A0, 0xB9DB, 0x89C2, 0xB9DC, 0x7BA1, 0xB9DD, 0x9986, + 0xB9DE, 0x7F50, 0xB9DF, 0x60EF, 0xB9E0, 0x704C, 0xB9E1, 0x8D2F, + 0xB9E2, 0x5149, 0xB9E3, 0x5E7F, 0xB9E4, 0x901B, 0xB9E5, 0x7470, + 0xB9E6, 0x89C4, 0xB9E7, 0x572D, 0xB9E8, 0x7845, 0xB9E9, 0x5F52, + 0xB9EA, 0x9F9F, 0xB9EB, 0x95FA, 0xB9EC, 0x8F68, 0xB9ED, 0x9B3C, + 0xB9EE, 0x8BE1, 0xB9EF, 0x7678, 0xB9F0, 0x6842, 0xB9F1, 0x67DC, + 0xB9F2, 0x8DEA, 0xB9F3, 0x8D35, 0xB9F4, 0x523D, 0xB9F5, 0x8F8A, + 0xB9F6, 0x6EDA, 0xB9F7, 0x68CD, 0xB9F8, 0x9505, 0xB9F9, 0x90ED, + 0xB9FA, 0x56FD, 0xB9FB, 0x679C, 0xB9FC, 0x88F9, 0xB9FD, 0x8FC7, + 0xB9FE, 0x54C8, 0xBA40, 0x7BC5, 0xBA41, 0x7BC8, 0xBA42, 0x7BC9, + 0xBA43, 0x7BCA, 0xBA44, 0x7BCB, 0xBA45, 0x7BCD, 0xBA46, 0x7BCE, + 0xBA47, 0x7BCF, 0xBA48, 0x7BD0, 0xBA49, 0x7BD2, 0xBA4A, 0x7BD4, + 0xBA4B, 0x7BD5, 0xBA4C, 0x7BD6, 0xBA4D, 0x7BD7, 0xBA4E, 0x7BD8, + 0xBA4F, 0x7BDB, 0xBA50, 0x7BDC, 0xBA51, 0x7BDE, 0xBA52, 0x7BDF, + 0xBA53, 0x7BE0, 0xBA54, 0x7BE2, 0xBA55, 0x7BE3, 0xBA56, 0x7BE4, + 0xBA57, 0x7BE7, 0xBA58, 0x7BE8, 0xBA59, 0x7BE9, 0xBA5A, 0x7BEB, + 0xBA5B, 0x7BEC, 0xBA5C, 0x7BED, 0xBA5D, 0x7BEF, 0xBA5E, 0x7BF0, + 0xBA5F, 0x7BF2, 0xBA60, 0x7BF3, 0xBA61, 0x7BF4, 0xBA62, 0x7BF5, + 0xBA63, 0x7BF6, 0xBA64, 0x7BF8, 0xBA65, 0x7BF9, 0xBA66, 0x7BFA, + 0xBA67, 0x7BFB, 0xBA68, 0x7BFD, 0xBA69, 0x7BFF, 0xBA6A, 0x7C00, + 0xBA6B, 0x7C01, 0xBA6C, 0x7C02, 0xBA6D, 0x7C03, 0xBA6E, 0x7C04, + 0xBA6F, 0x7C05, 0xBA70, 0x7C06, 0xBA71, 0x7C08, 0xBA72, 0x7C09, + 0xBA73, 0x7C0A, 0xBA74, 0x7C0D, 0xBA75, 0x7C0E, 0xBA76, 0x7C10, + 0xBA77, 0x7C11, 0xBA78, 0x7C12, 0xBA79, 0x7C13, 0xBA7A, 0x7C14, + 0xBA7B, 0x7C15, 0xBA7C, 0x7C17, 0xBA7D, 0x7C18, 0xBA7E, 0x7C19, + 0xBA80, 0x7C1A, 0xBA81, 0x7C1B, 0xBA82, 0x7C1C, 0xBA83, 0x7C1D, + 0xBA84, 0x7C1E, 0xBA85, 0x7C20, 0xBA86, 0x7C21, 0xBA87, 0x7C22, + 0xBA88, 0x7C23, 0xBA89, 0x7C24, 0xBA8A, 0x7C25, 0xBA8B, 0x7C28, + 0xBA8C, 0x7C29, 0xBA8D, 0x7C2B, 0xBA8E, 0x7C2C, 0xBA8F, 0x7C2D, + 0xBA90, 0x7C2E, 0xBA91, 0x7C2F, 0xBA92, 0x7C30, 0xBA93, 0x7C31, + 0xBA94, 0x7C32, 0xBA95, 0x7C33, 0xBA96, 0x7C34, 0xBA97, 0x7C35, + 0xBA98, 0x7C36, 0xBA99, 0x7C37, 0xBA9A, 0x7C39, 0xBA9B, 0x7C3A, + 0xBA9C, 0x7C3B, 0xBA9D, 0x7C3C, 0xBA9E, 0x7C3D, 0xBA9F, 0x7C3E, + 0xBAA0, 0x7C42, 0xBAA1, 0x9AB8, 0xBAA2, 0x5B69, 0xBAA3, 0x6D77, + 0xBAA4, 0x6C26, 0xBAA5, 0x4EA5, 0xBAA6, 0x5BB3, 0xBAA7, 0x9A87, + 0xBAA8, 0x9163, 0xBAA9, 0x61A8, 0xBAAA, 0x90AF, 0xBAAB, 0x97E9, + 0xBAAC, 0x542B, 0xBAAD, 0x6DB5, 0xBAAE, 0x5BD2, 0xBAAF, 0x51FD, + 0xBAB0, 0x558A, 0xBAB1, 0x7F55, 0xBAB2, 0x7FF0, 0xBAB3, 0x64BC, + 0xBAB4, 0x634D, 0xBAB5, 0x65F1, 0xBAB6, 0x61BE, 0xBAB7, 0x608D, + 0xBAB8, 0x710A, 0xBAB9, 0x6C57, 0xBABA, 0x6C49, 0xBABB, 0x592F, + 0xBABC, 0x676D, 0xBABD, 0x822A, 0xBABE, 0x58D5, 0xBABF, 0x568E, + 0xBAC0, 0x8C6A, 0xBAC1, 0x6BEB, 0xBAC2, 0x90DD, 0xBAC3, 0x597D, + 0xBAC4, 0x8017, 0xBAC5, 0x53F7, 0xBAC6, 0x6D69, 0xBAC7, 0x5475, + 0xBAC8, 0x559D, 0xBAC9, 0x8377, 0xBACA, 0x83CF, 0xBACB, 0x6838, + 0xBACC, 0x79BE, 0xBACD, 0x548C, 0xBACE, 0x4F55, 0xBACF, 0x5408, + 0xBAD0, 0x76D2, 0xBAD1, 0x8C89, 0xBAD2, 0x9602, 0xBAD3, 0x6CB3, + 0xBAD4, 0x6DB8, 0xBAD5, 0x8D6B, 0xBAD6, 0x8910, 0xBAD7, 0x9E64, + 0xBAD8, 0x8D3A, 0xBAD9, 0x563F, 0xBADA, 0x9ED1, 0xBADB, 0x75D5, + 0xBADC, 0x5F88, 0xBADD, 0x72E0, 0xBADE, 0x6068, 0xBADF, 0x54FC, + 0xBAE0, 0x4EA8, 0xBAE1, 0x6A2A, 0xBAE2, 0x8861, 0xBAE3, 0x6052, + 0xBAE4, 0x8F70, 0xBAE5, 0x54C4, 0xBAE6, 0x70D8, 0xBAE7, 0x8679, + 0xBAE8, 0x9E3F, 0xBAE9, 0x6D2A, 0xBAEA, 0x5B8F, 0xBAEB, 0x5F18, + 0xBAEC, 0x7EA2, 0xBAED, 0x5589, 0xBAEE, 0x4FAF, 0xBAEF, 0x7334, + 0xBAF0, 0x543C, 0xBAF1, 0x539A, 0xBAF2, 0x5019, 0xBAF3, 0x540E, + 0xBAF4, 0x547C, 0xBAF5, 0x4E4E, 0xBAF6, 0x5FFD, 0xBAF7, 0x745A, + 0xBAF8, 0x58F6, 0xBAF9, 0x846B, 0xBAFA, 0x80E1, 0xBAFB, 0x8774, + 0xBAFC, 0x72D0, 0xBAFD, 0x7CCA, 0xBAFE, 0x6E56, 0xBB40, 0x7C43, + 0xBB41, 0x7C44, 0xBB42, 0x7C45, 0xBB43, 0x7C46, 0xBB44, 0x7C47, + 0xBB45, 0x7C48, 0xBB46, 0x7C49, 0xBB47, 0x7C4A, 0xBB48, 0x7C4B, + 0xBB49, 0x7C4C, 0xBB4A, 0x7C4E, 0xBB4B, 0x7C4F, 0xBB4C, 0x7C50, + 0xBB4D, 0x7C51, 0xBB4E, 0x7C52, 0xBB4F, 0x7C53, 0xBB50, 0x7C54, + 0xBB51, 0x7C55, 0xBB52, 0x7C56, 0xBB53, 0x7C57, 0xBB54, 0x7C58, + 0xBB55, 0x7C59, 0xBB56, 0x7C5A, 0xBB57, 0x7C5B, 0xBB58, 0x7C5C, + 0xBB59, 0x7C5D, 0xBB5A, 0x7C5E, 0xBB5B, 0x7C5F, 0xBB5C, 0x7C60, + 0xBB5D, 0x7C61, 0xBB5E, 0x7C62, 0xBB5F, 0x7C63, 0xBB60, 0x7C64, + 0xBB61, 0x7C65, 0xBB62, 0x7C66, 0xBB63, 0x7C67, 0xBB64, 0x7C68, + 0xBB65, 0x7C69, 0xBB66, 0x7C6A, 0xBB67, 0x7C6B, 0xBB68, 0x7C6C, + 0xBB69, 0x7C6D, 0xBB6A, 0x7C6E, 0xBB6B, 0x7C6F, 0xBB6C, 0x7C70, + 0xBB6D, 0x7C71, 0xBB6E, 0x7C72, 0xBB6F, 0x7C75, 0xBB70, 0x7C76, + 0xBB71, 0x7C77, 0xBB72, 0x7C78, 0xBB73, 0x7C79, 0xBB74, 0x7C7A, + 0xBB75, 0x7C7E, 0xBB76, 0x7C7F, 0xBB77, 0x7C80, 0xBB78, 0x7C81, + 0xBB79, 0x7C82, 0xBB7A, 0x7C83, 0xBB7B, 0x7C84, 0xBB7C, 0x7C85, + 0xBB7D, 0x7C86, 0xBB7E, 0x7C87, 0xBB80, 0x7C88, 0xBB81, 0x7C8A, + 0xBB82, 0x7C8B, 0xBB83, 0x7C8C, 0xBB84, 0x7C8D, 0xBB85, 0x7C8E, + 0xBB86, 0x7C8F, 0xBB87, 0x7C90, 0xBB88, 0x7C93, 0xBB89, 0x7C94, + 0xBB8A, 0x7C96, 0xBB8B, 0x7C99, 0xBB8C, 0x7C9A, 0xBB8D, 0x7C9B, + 0xBB8E, 0x7CA0, 0xBB8F, 0x7CA1, 0xBB90, 0x7CA3, 0xBB91, 0x7CA6, + 0xBB92, 0x7CA7, 0xBB93, 0x7CA8, 0xBB94, 0x7CA9, 0xBB95, 0x7CAB, + 0xBB96, 0x7CAC, 0xBB97, 0x7CAD, 0xBB98, 0x7CAF, 0xBB99, 0x7CB0, + 0xBB9A, 0x7CB4, 0xBB9B, 0x7CB5, 0xBB9C, 0x7CB6, 0xBB9D, 0x7CB7, + 0xBB9E, 0x7CB8, 0xBB9F, 0x7CBA, 0xBBA0, 0x7CBB, 0xBBA1, 0x5F27, + 0xBBA2, 0x864E, 0xBBA3, 0x552C, 0xBBA4, 0x62A4, 0xBBA5, 0x4E92, + 0xBBA6, 0x6CAA, 0xBBA7, 0x6237, 0xBBA8, 0x82B1, 0xBBA9, 0x54D7, + 0xBBAA, 0x534E, 0xBBAB, 0x733E, 0xBBAC, 0x6ED1, 0xBBAD, 0x753B, + 0xBBAE, 0x5212, 0xBBAF, 0x5316, 0xBBB0, 0x8BDD, 0xBBB1, 0x69D0, + 0xBBB2, 0x5F8A, 0xBBB3, 0x6000, 0xBBB4, 0x6DEE, 0xBBB5, 0x574F, + 0xBBB6, 0x6B22, 0xBBB7, 0x73AF, 0xBBB8, 0x6853, 0xBBB9, 0x8FD8, + 0xBBBA, 0x7F13, 0xBBBB, 0x6362, 0xBBBC, 0x60A3, 0xBBBD, 0x5524, + 0xBBBE, 0x75EA, 0xBBBF, 0x8C62, 0xBBC0, 0x7115, 0xBBC1, 0x6DA3, + 0xBBC2, 0x5BA6, 0xBBC3, 0x5E7B, 0xBBC4, 0x8352, 0xBBC5, 0x614C, + 0xBBC6, 0x9EC4, 0xBBC7, 0x78FA, 0xBBC8, 0x8757, 0xBBC9, 0x7C27, + 0xBBCA, 0x7687, 0xBBCB, 0x51F0, 0xBBCC, 0x60F6, 0xBBCD, 0x714C, + 0xBBCE, 0x6643, 0xBBCF, 0x5E4C, 0xBBD0, 0x604D, 0xBBD1, 0x8C0E, + 0xBBD2, 0x7070, 0xBBD3, 0x6325, 0xBBD4, 0x8F89, 0xBBD5, 0x5FBD, + 0xBBD6, 0x6062, 0xBBD7, 0x86D4, 0xBBD8, 0x56DE, 0xBBD9, 0x6BC1, + 0xBBDA, 0x6094, 0xBBDB, 0x6167, 0xBBDC, 0x5349, 0xBBDD, 0x60E0, + 0xBBDE, 0x6666, 0xBBDF, 0x8D3F, 0xBBE0, 0x79FD, 0xBBE1, 0x4F1A, + 0xBBE2, 0x70E9, 0xBBE3, 0x6C47, 0xBBE4, 0x8BB3, 0xBBE5, 0x8BF2, + 0xBBE6, 0x7ED8, 0xBBE7, 0x8364, 0xBBE8, 0x660F, 0xBBE9, 0x5A5A, + 0xBBEA, 0x9B42, 0xBBEB, 0x6D51, 0xBBEC, 0x6DF7, 0xBBED, 0x8C41, + 0xBBEE, 0x6D3B, 0xBBEF, 0x4F19, 0xBBF0, 0x706B, 0xBBF1, 0x83B7, + 0xBBF2, 0x6216, 0xBBF3, 0x60D1, 0xBBF4, 0x970D, 0xBBF5, 0x8D27, + 0xBBF6, 0x7978, 0xBBF7, 0x51FB, 0xBBF8, 0x573E, 0xBBF9, 0x57FA, + 0xBBFA, 0x673A, 0xBBFB, 0x7578, 0xBBFC, 0x7A3D, 0xBBFD, 0x79EF, + 0xBBFE, 0x7B95, 0xBC40, 0x7CBF, 0xBC41, 0x7CC0, 0xBC42, 0x7CC2, + 0xBC43, 0x7CC3, 0xBC44, 0x7CC4, 0xBC45, 0x7CC6, 0xBC46, 0x7CC9, + 0xBC47, 0x7CCB, 0xBC48, 0x7CCE, 0xBC49, 0x7CCF, 0xBC4A, 0x7CD0, + 0xBC4B, 0x7CD1, 0xBC4C, 0x7CD2, 0xBC4D, 0x7CD3, 0xBC4E, 0x7CD4, + 0xBC4F, 0x7CD8, 0xBC50, 0x7CDA, 0xBC51, 0x7CDB, 0xBC52, 0x7CDD, + 0xBC53, 0x7CDE, 0xBC54, 0x7CE1, 0xBC55, 0x7CE2, 0xBC56, 0x7CE3, + 0xBC57, 0x7CE4, 0xBC58, 0x7CE5, 0xBC59, 0x7CE6, 0xBC5A, 0x7CE7, + 0xBC5B, 0x7CE9, 0xBC5C, 0x7CEA, 0xBC5D, 0x7CEB, 0xBC5E, 0x7CEC, + 0xBC5F, 0x7CED, 0xBC60, 0x7CEE, 0xBC61, 0x7CF0, 0xBC62, 0x7CF1, + 0xBC63, 0x7CF2, 0xBC64, 0x7CF3, 0xBC65, 0x7CF4, 0xBC66, 0x7CF5, + 0xBC67, 0x7CF6, 0xBC68, 0x7CF7, 0xBC69, 0x7CF9, 0xBC6A, 0x7CFA, + 0xBC6B, 0x7CFC, 0xBC6C, 0x7CFD, 0xBC6D, 0x7CFE, 0xBC6E, 0x7CFF, + 0xBC6F, 0x7D00, 0xBC70, 0x7D01, 0xBC71, 0x7D02, 0xBC72, 0x7D03, + 0xBC73, 0x7D04, 0xBC74, 0x7D05, 0xBC75, 0x7D06, 0xBC76, 0x7D07, + 0xBC77, 0x7D08, 0xBC78, 0x7D09, 0xBC79, 0x7D0B, 0xBC7A, 0x7D0C, + 0xBC7B, 0x7D0D, 0xBC7C, 0x7D0E, 0xBC7D, 0x7D0F, 0xBC7E, 0x7D10, + 0xBC80, 0x7D11, 0xBC81, 0x7D12, 0xBC82, 0x7D13, 0xBC83, 0x7D14, + 0xBC84, 0x7D15, 0xBC85, 0x7D16, 0xBC86, 0x7D17, 0xBC87, 0x7D18, + 0xBC88, 0x7D19, 0xBC89, 0x7D1A, 0xBC8A, 0x7D1B, 0xBC8B, 0x7D1C, + 0xBC8C, 0x7D1D, 0xBC8D, 0x7D1E, 0xBC8E, 0x7D1F, 0xBC8F, 0x7D21, + 0xBC90, 0x7D23, 0xBC91, 0x7D24, 0xBC92, 0x7D25, 0xBC93, 0x7D26, + 0xBC94, 0x7D28, 0xBC95, 0x7D29, 0xBC96, 0x7D2A, 0xBC97, 0x7D2C, + 0xBC98, 0x7D2D, 0xBC99, 0x7D2E, 0xBC9A, 0x7D30, 0xBC9B, 0x7D31, + 0xBC9C, 0x7D32, 0xBC9D, 0x7D33, 0xBC9E, 0x7D34, 0xBC9F, 0x7D35, + 0xBCA0, 0x7D36, 0xBCA1, 0x808C, 0xBCA2, 0x9965, 0xBCA3, 0x8FF9, + 0xBCA4, 0x6FC0, 0xBCA5, 0x8BA5, 0xBCA6, 0x9E21, 0xBCA7, 0x59EC, + 0xBCA8, 0x7EE9, 0xBCA9, 0x7F09, 0xBCAA, 0x5409, 0xBCAB, 0x6781, + 0xBCAC, 0x68D8, 0xBCAD, 0x8F91, 0xBCAE, 0x7C4D, 0xBCAF, 0x96C6, + 0xBCB0, 0x53CA, 0xBCB1, 0x6025, 0xBCB2, 0x75BE, 0xBCB3, 0x6C72, + 0xBCB4, 0x5373, 0xBCB5, 0x5AC9, 0xBCB6, 0x7EA7, 0xBCB7, 0x6324, + 0xBCB8, 0x51E0, 0xBCB9, 0x810A, 0xBCBA, 0x5DF1, 0xBCBB, 0x84DF, + 0xBCBC, 0x6280, 0xBCBD, 0x5180, 0xBCBE, 0x5B63, 0xBCBF, 0x4F0E, + 0xBCC0, 0x796D, 0xBCC1, 0x5242, 0xBCC2, 0x60B8, 0xBCC3, 0x6D4E, + 0xBCC4, 0x5BC4, 0xBCC5, 0x5BC2, 0xBCC6, 0x8BA1, 0xBCC7, 0x8BB0, + 0xBCC8, 0x65E2, 0xBCC9, 0x5FCC, 0xBCCA, 0x9645, 0xBCCB, 0x5993, + 0xBCCC, 0x7EE7, 0xBCCD, 0x7EAA, 0xBCCE, 0x5609, 0xBCCF, 0x67B7, + 0xBCD0, 0x5939, 0xBCD1, 0x4F73, 0xBCD2, 0x5BB6, 0xBCD3, 0x52A0, + 0xBCD4, 0x835A, 0xBCD5, 0x988A, 0xBCD6, 0x8D3E, 0xBCD7, 0x7532, + 0xBCD8, 0x94BE, 0xBCD9, 0x5047, 0xBCDA, 0x7A3C, 0xBCDB, 0x4EF7, + 0xBCDC, 0x67B6, 0xBCDD, 0x9A7E, 0xBCDE, 0x5AC1, 0xBCDF, 0x6B7C, + 0xBCE0, 0x76D1, 0xBCE1, 0x575A, 0xBCE2, 0x5C16, 0xBCE3, 0x7B3A, + 0xBCE4, 0x95F4, 0xBCE5, 0x714E, 0xBCE6, 0x517C, 0xBCE7, 0x80A9, + 0xBCE8, 0x8270, 0xBCE9, 0x5978, 0xBCEA, 0x7F04, 0xBCEB, 0x8327, + 0xBCEC, 0x68C0, 0xBCED, 0x67EC, 0xBCEE, 0x78B1, 0xBCEF, 0x7877, + 0xBCF0, 0x62E3, 0xBCF1, 0x6361, 0xBCF2, 0x7B80, 0xBCF3, 0x4FED, + 0xBCF4, 0x526A, 0xBCF5, 0x51CF, 0xBCF6, 0x8350, 0xBCF7, 0x69DB, + 0xBCF8, 0x9274, 0xBCF9, 0x8DF5, 0xBCFA, 0x8D31, 0xBCFB, 0x89C1, + 0xBCFC, 0x952E, 0xBCFD, 0x7BAD, 0xBCFE, 0x4EF6, 0xBD40, 0x7D37, + 0xBD41, 0x7D38, 0xBD42, 0x7D39, 0xBD43, 0x7D3A, 0xBD44, 0x7D3B, + 0xBD45, 0x7D3C, 0xBD46, 0x7D3D, 0xBD47, 0x7D3E, 0xBD48, 0x7D3F, + 0xBD49, 0x7D40, 0xBD4A, 0x7D41, 0xBD4B, 0x7D42, 0xBD4C, 0x7D43, + 0xBD4D, 0x7D44, 0xBD4E, 0x7D45, 0xBD4F, 0x7D46, 0xBD50, 0x7D47, + 0xBD51, 0x7D48, 0xBD52, 0x7D49, 0xBD53, 0x7D4A, 0xBD54, 0x7D4B, + 0xBD55, 0x7D4C, 0xBD56, 0x7D4D, 0xBD57, 0x7D4E, 0xBD58, 0x7D4F, + 0xBD59, 0x7D50, 0xBD5A, 0x7D51, 0xBD5B, 0x7D52, 0xBD5C, 0x7D53, + 0xBD5D, 0x7D54, 0xBD5E, 0x7D55, 0xBD5F, 0x7D56, 0xBD60, 0x7D57, + 0xBD61, 0x7D58, 0xBD62, 0x7D59, 0xBD63, 0x7D5A, 0xBD64, 0x7D5B, + 0xBD65, 0x7D5C, 0xBD66, 0x7D5D, 0xBD67, 0x7D5E, 0xBD68, 0x7D5F, + 0xBD69, 0x7D60, 0xBD6A, 0x7D61, 0xBD6B, 0x7D62, 0xBD6C, 0x7D63, + 0xBD6D, 0x7D64, 0xBD6E, 0x7D65, 0xBD6F, 0x7D66, 0xBD70, 0x7D67, + 0xBD71, 0x7D68, 0xBD72, 0x7D69, 0xBD73, 0x7D6A, 0xBD74, 0x7D6B, + 0xBD75, 0x7D6C, 0xBD76, 0x7D6D, 0xBD77, 0x7D6F, 0xBD78, 0x7D70, + 0xBD79, 0x7D71, 0xBD7A, 0x7D72, 0xBD7B, 0x7D73, 0xBD7C, 0x7D74, + 0xBD7D, 0x7D75, 0xBD7E, 0x7D76, 0xBD80, 0x7D78, 0xBD81, 0x7D79, + 0xBD82, 0x7D7A, 0xBD83, 0x7D7B, 0xBD84, 0x7D7C, 0xBD85, 0x7D7D, + 0xBD86, 0x7D7E, 0xBD87, 0x7D7F, 0xBD88, 0x7D80, 0xBD89, 0x7D81, + 0xBD8A, 0x7D82, 0xBD8B, 0x7D83, 0xBD8C, 0x7D84, 0xBD8D, 0x7D85, + 0xBD8E, 0x7D86, 0xBD8F, 0x7D87, 0xBD90, 0x7D88, 0xBD91, 0x7D89, + 0xBD92, 0x7D8A, 0xBD93, 0x7D8B, 0xBD94, 0x7D8C, 0xBD95, 0x7D8D, + 0xBD96, 0x7D8E, 0xBD97, 0x7D8F, 0xBD98, 0x7D90, 0xBD99, 0x7D91, + 0xBD9A, 0x7D92, 0xBD9B, 0x7D93, 0xBD9C, 0x7D94, 0xBD9D, 0x7D95, + 0xBD9E, 0x7D96, 0xBD9F, 0x7D97, 0xBDA0, 0x7D98, 0xBDA1, 0x5065, + 0xBDA2, 0x8230, 0xBDA3, 0x5251, 0xBDA4, 0x996F, 0xBDA5, 0x6E10, + 0xBDA6, 0x6E85, 0xBDA7, 0x6DA7, 0xBDA8, 0x5EFA, 0xBDA9, 0x50F5, + 0xBDAA, 0x59DC, 0xBDAB, 0x5C06, 0xBDAC, 0x6D46, 0xBDAD, 0x6C5F, + 0xBDAE, 0x7586, 0xBDAF, 0x848B, 0xBDB0, 0x6868, 0xBDB1, 0x5956, + 0xBDB2, 0x8BB2, 0xBDB3, 0x5320, 0xBDB4, 0x9171, 0xBDB5, 0x964D, + 0xBDB6, 0x8549, 0xBDB7, 0x6912, 0xBDB8, 0x7901, 0xBDB9, 0x7126, + 0xBDBA, 0x80F6, 0xBDBB, 0x4EA4, 0xBDBC, 0x90CA, 0xBDBD, 0x6D47, + 0xBDBE, 0x9A84, 0xBDBF, 0x5A07, 0xBDC0, 0x56BC, 0xBDC1, 0x6405, + 0xBDC2, 0x94F0, 0xBDC3, 0x77EB, 0xBDC4, 0x4FA5, 0xBDC5, 0x811A, + 0xBDC6, 0x72E1, 0xBDC7, 0x89D2, 0xBDC8, 0x997A, 0xBDC9, 0x7F34, + 0xBDCA, 0x7EDE, 0xBDCB, 0x527F, 0xBDCC, 0x6559, 0xBDCD, 0x9175, + 0xBDCE, 0x8F7F, 0xBDCF, 0x8F83, 0xBDD0, 0x53EB, 0xBDD1, 0x7A96, + 0xBDD2, 0x63ED, 0xBDD3, 0x63A5, 0xBDD4, 0x7686, 0xBDD5, 0x79F8, + 0xBDD6, 0x8857, 0xBDD7, 0x9636, 0xBDD8, 0x622A, 0xBDD9, 0x52AB, + 0xBDDA, 0x8282, 0xBDDB, 0x6854, 0xBDDC, 0x6770, 0xBDDD, 0x6377, + 0xBDDE, 0x776B, 0xBDDF, 0x7AED, 0xBDE0, 0x6D01, 0xBDE1, 0x7ED3, + 0xBDE2, 0x89E3, 0xBDE3, 0x59D0, 0xBDE4, 0x6212, 0xBDE5, 0x85C9, + 0xBDE6, 0x82A5, 0xBDE7, 0x754C, 0xBDE8, 0x501F, 0xBDE9, 0x4ECB, + 0xBDEA, 0x75A5, 0xBDEB, 0x8BEB, 0xBDEC, 0x5C4A, 0xBDED, 0x5DFE, + 0xBDEE, 0x7B4B, 0xBDEF, 0x65A4, 0xBDF0, 0x91D1, 0xBDF1, 0x4ECA, + 0xBDF2, 0x6D25, 0xBDF3, 0x895F, 0xBDF4, 0x7D27, 0xBDF5, 0x9526, + 0xBDF6, 0x4EC5, 0xBDF7, 0x8C28, 0xBDF8, 0x8FDB, 0xBDF9, 0x9773, + 0xBDFA, 0x664B, 0xBDFB, 0x7981, 0xBDFC, 0x8FD1, 0xBDFD, 0x70EC, + 0xBDFE, 0x6D78, 0xBE40, 0x7D99, 0xBE41, 0x7D9A, 0xBE42, 0x7D9B, + 0xBE43, 0x7D9C, 0xBE44, 0x7D9D, 0xBE45, 0x7D9E, 0xBE46, 0x7D9F, + 0xBE47, 0x7DA0, 0xBE48, 0x7DA1, 0xBE49, 0x7DA2, 0xBE4A, 0x7DA3, + 0xBE4B, 0x7DA4, 0xBE4C, 0x7DA5, 0xBE4D, 0x7DA7, 0xBE4E, 0x7DA8, + 0xBE4F, 0x7DA9, 0xBE50, 0x7DAA, 0xBE51, 0x7DAB, 0xBE52, 0x7DAC, + 0xBE53, 0x7DAD, 0xBE54, 0x7DAF, 0xBE55, 0x7DB0, 0xBE56, 0x7DB1, + 0xBE57, 0x7DB2, 0xBE58, 0x7DB3, 0xBE59, 0x7DB4, 0xBE5A, 0x7DB5, + 0xBE5B, 0x7DB6, 0xBE5C, 0x7DB7, 0xBE5D, 0x7DB8, 0xBE5E, 0x7DB9, + 0xBE5F, 0x7DBA, 0xBE60, 0x7DBB, 0xBE61, 0x7DBC, 0xBE62, 0x7DBD, + 0xBE63, 0x7DBE, 0xBE64, 0x7DBF, 0xBE65, 0x7DC0, 0xBE66, 0x7DC1, + 0xBE67, 0x7DC2, 0xBE68, 0x7DC3, 0xBE69, 0x7DC4, 0xBE6A, 0x7DC5, + 0xBE6B, 0x7DC6, 0xBE6C, 0x7DC7, 0xBE6D, 0x7DC8, 0xBE6E, 0x7DC9, + 0xBE6F, 0x7DCA, 0xBE70, 0x7DCB, 0xBE71, 0x7DCC, 0xBE72, 0x7DCD, + 0xBE73, 0x7DCE, 0xBE74, 0x7DCF, 0xBE75, 0x7DD0, 0xBE76, 0x7DD1, + 0xBE77, 0x7DD2, 0xBE78, 0x7DD3, 0xBE79, 0x7DD4, 0xBE7A, 0x7DD5, + 0xBE7B, 0x7DD6, 0xBE7C, 0x7DD7, 0xBE7D, 0x7DD8, 0xBE7E, 0x7DD9, + 0xBE80, 0x7DDA, 0xBE81, 0x7DDB, 0xBE82, 0x7DDC, 0xBE83, 0x7DDD, + 0xBE84, 0x7DDE, 0xBE85, 0x7DDF, 0xBE86, 0x7DE0, 0xBE87, 0x7DE1, + 0xBE88, 0x7DE2, 0xBE89, 0x7DE3, 0xBE8A, 0x7DE4, 0xBE8B, 0x7DE5, + 0xBE8C, 0x7DE6, 0xBE8D, 0x7DE7, 0xBE8E, 0x7DE8, 0xBE8F, 0x7DE9, + 0xBE90, 0x7DEA, 0xBE91, 0x7DEB, 0xBE92, 0x7DEC, 0xBE93, 0x7DED, + 0xBE94, 0x7DEE, 0xBE95, 0x7DEF, 0xBE96, 0x7DF0, 0xBE97, 0x7DF1, + 0xBE98, 0x7DF2, 0xBE99, 0x7DF3, 0xBE9A, 0x7DF4, 0xBE9B, 0x7DF5, + 0xBE9C, 0x7DF6, 0xBE9D, 0x7DF7, 0xBE9E, 0x7DF8, 0xBE9F, 0x7DF9, + 0xBEA0, 0x7DFA, 0xBEA1, 0x5C3D, 0xBEA2, 0x52B2, 0xBEA3, 0x8346, + 0xBEA4, 0x5162, 0xBEA5, 0x830E, 0xBEA6, 0x775B, 0xBEA7, 0x6676, + 0xBEA8, 0x9CB8, 0xBEA9, 0x4EAC, 0xBEAA, 0x60CA, 0xBEAB, 0x7CBE, + 0xBEAC, 0x7CB3, 0xBEAD, 0x7ECF, 0xBEAE, 0x4E95, 0xBEAF, 0x8B66, + 0xBEB0, 0x666F, 0xBEB1, 0x9888, 0xBEB2, 0x9759, 0xBEB3, 0x5883, + 0xBEB4, 0x656C, 0xBEB5, 0x955C, 0xBEB6, 0x5F84, 0xBEB7, 0x75C9, + 0xBEB8, 0x9756, 0xBEB9, 0x7ADF, 0xBEBA, 0x7ADE, 0xBEBB, 0x51C0, + 0xBEBC, 0x70AF, 0xBEBD, 0x7A98, 0xBEBE, 0x63EA, 0xBEBF, 0x7A76, + 0xBEC0, 0x7EA0, 0xBEC1, 0x7396, 0xBEC2, 0x97ED, 0xBEC3, 0x4E45, + 0xBEC4, 0x7078, 0xBEC5, 0x4E5D, 0xBEC6, 0x9152, 0xBEC7, 0x53A9, + 0xBEC8, 0x6551, 0xBEC9, 0x65E7, 0xBECA, 0x81FC, 0xBECB, 0x8205, + 0xBECC, 0x548E, 0xBECD, 0x5C31, 0xBECE, 0x759A, 0xBECF, 0x97A0, + 0xBED0, 0x62D8, 0xBED1, 0x72D9, 0xBED2, 0x75BD, 0xBED3, 0x5C45, + 0xBED4, 0x9A79, 0xBED5, 0x83CA, 0xBED6, 0x5C40, 0xBED7, 0x5480, + 0xBED8, 0x77E9, 0xBED9, 0x4E3E, 0xBEDA, 0x6CAE, 0xBEDB, 0x805A, + 0xBEDC, 0x62D2, 0xBEDD, 0x636E, 0xBEDE, 0x5DE8, 0xBEDF, 0x5177, + 0xBEE0, 0x8DDD, 0xBEE1, 0x8E1E, 0xBEE2, 0x952F, 0xBEE3, 0x4FF1, + 0xBEE4, 0x53E5, 0xBEE5, 0x60E7, 0xBEE6, 0x70AC, 0xBEE7, 0x5267, + 0xBEE8, 0x6350, 0xBEE9, 0x9E43, 0xBEEA, 0x5A1F, 0xBEEB, 0x5026, + 0xBEEC, 0x7737, 0xBEED, 0x5377, 0xBEEE, 0x7EE2, 0xBEEF, 0x6485, + 0xBEF0, 0x652B, 0xBEF1, 0x6289, 0xBEF2, 0x6398, 0xBEF3, 0x5014, + 0xBEF4, 0x7235, 0xBEF5, 0x89C9, 0xBEF6, 0x51B3, 0xBEF7, 0x8BC0, + 0xBEF8, 0x7EDD, 0xBEF9, 0x5747, 0xBEFA, 0x83CC, 0xBEFB, 0x94A7, + 0xBEFC, 0x519B, 0xBEFD, 0x541B, 0xBEFE, 0x5CFB, 0xBF40, 0x7DFB, + 0xBF41, 0x7DFC, 0xBF42, 0x7DFD, 0xBF43, 0x7DFE, 0xBF44, 0x7DFF, + 0xBF45, 0x7E00, 0xBF46, 0x7E01, 0xBF47, 0x7E02, 0xBF48, 0x7E03, + 0xBF49, 0x7E04, 0xBF4A, 0x7E05, 0xBF4B, 0x7E06, 0xBF4C, 0x7E07, + 0xBF4D, 0x7E08, 0xBF4E, 0x7E09, 0xBF4F, 0x7E0A, 0xBF50, 0x7E0B, + 0xBF51, 0x7E0C, 0xBF52, 0x7E0D, 0xBF53, 0x7E0E, 0xBF54, 0x7E0F, + 0xBF55, 0x7E10, 0xBF56, 0x7E11, 0xBF57, 0x7E12, 0xBF58, 0x7E13, + 0xBF59, 0x7E14, 0xBF5A, 0x7E15, 0xBF5B, 0x7E16, 0xBF5C, 0x7E17, + 0xBF5D, 0x7E18, 0xBF5E, 0x7E19, 0xBF5F, 0x7E1A, 0xBF60, 0x7E1B, + 0xBF61, 0x7E1C, 0xBF62, 0x7E1D, 0xBF63, 0x7E1E, 0xBF64, 0x7E1F, + 0xBF65, 0x7E20, 0xBF66, 0x7E21, 0xBF67, 0x7E22, 0xBF68, 0x7E23, + 0xBF69, 0x7E24, 0xBF6A, 0x7E25, 0xBF6B, 0x7E26, 0xBF6C, 0x7E27, + 0xBF6D, 0x7E28, 0xBF6E, 0x7E29, 0xBF6F, 0x7E2A, 0xBF70, 0x7E2B, + 0xBF71, 0x7E2C, 0xBF72, 0x7E2D, 0xBF73, 0x7E2E, 0xBF74, 0x7E2F, + 0xBF75, 0x7E30, 0xBF76, 0x7E31, 0xBF77, 0x7E32, 0xBF78, 0x7E33, + 0xBF79, 0x7E34, 0xBF7A, 0x7E35, 0xBF7B, 0x7E36, 0xBF7C, 0x7E37, + 0xBF7D, 0x7E38, 0xBF7E, 0x7E39, 0xBF80, 0x7E3A, 0xBF81, 0x7E3C, + 0xBF82, 0x7E3D, 0xBF83, 0x7E3E, 0xBF84, 0x7E3F, 0xBF85, 0x7E40, + 0xBF86, 0x7E42, 0xBF87, 0x7E43, 0xBF88, 0x7E44, 0xBF89, 0x7E45, + 0xBF8A, 0x7E46, 0xBF8B, 0x7E48, 0xBF8C, 0x7E49, 0xBF8D, 0x7E4A, + 0xBF8E, 0x7E4B, 0xBF8F, 0x7E4C, 0xBF90, 0x7E4D, 0xBF91, 0x7E4E, + 0xBF92, 0x7E4F, 0xBF93, 0x7E50, 0xBF94, 0x7E51, 0xBF95, 0x7E52, + 0xBF96, 0x7E53, 0xBF97, 0x7E54, 0xBF98, 0x7E55, 0xBF99, 0x7E56, + 0xBF9A, 0x7E57, 0xBF9B, 0x7E58, 0xBF9C, 0x7E59, 0xBF9D, 0x7E5A, + 0xBF9E, 0x7E5B, 0xBF9F, 0x7E5C, 0xBFA0, 0x7E5D, 0xBFA1, 0x4FCA, + 0xBFA2, 0x7AE3, 0xBFA3, 0x6D5A, 0xBFA4, 0x90E1, 0xBFA5, 0x9A8F, + 0xBFA6, 0x5580, 0xBFA7, 0x5496, 0xBFA8, 0x5361, 0xBFA9, 0x54AF, + 0xBFAA, 0x5F00, 0xBFAB, 0x63E9, 0xBFAC, 0x6977, 0xBFAD, 0x51EF, + 0xBFAE, 0x6168, 0xBFAF, 0x520A, 0xBFB0, 0x582A, 0xBFB1, 0x52D8, + 0xBFB2, 0x574E, 0xBFB3, 0x780D, 0xBFB4, 0x770B, 0xBFB5, 0x5EB7, + 0xBFB6, 0x6177, 0xBFB7, 0x7CE0, 0xBFB8, 0x625B, 0xBFB9, 0x6297, + 0xBFBA, 0x4EA2, 0xBFBB, 0x7095, 0xBFBC, 0x8003, 0xBFBD, 0x62F7, + 0xBFBE, 0x70E4, 0xBFBF, 0x9760, 0xBFC0, 0x5777, 0xBFC1, 0x82DB, + 0xBFC2, 0x67EF, 0xBFC3, 0x68F5, 0xBFC4, 0x78D5, 0xBFC5, 0x9897, + 0xBFC6, 0x79D1, 0xBFC7, 0x58F3, 0xBFC8, 0x54B3, 0xBFC9, 0x53EF, + 0xBFCA, 0x6E34, 0xBFCB, 0x514B, 0xBFCC, 0x523B, 0xBFCD, 0x5BA2, + 0xBFCE, 0x8BFE, 0xBFCF, 0x80AF, 0xBFD0, 0x5543, 0xBFD1, 0x57A6, + 0xBFD2, 0x6073, 0xBFD3, 0x5751, 0xBFD4, 0x542D, 0xBFD5, 0x7A7A, + 0xBFD6, 0x6050, 0xBFD7, 0x5B54, 0xBFD8, 0x63A7, 0xBFD9, 0x62A0, + 0xBFDA, 0x53E3, 0xBFDB, 0x6263, 0xBFDC, 0x5BC7, 0xBFDD, 0x67AF, + 0xBFDE, 0x54ED, 0xBFDF, 0x7A9F, 0xBFE0, 0x82E6, 0xBFE1, 0x9177, + 0xBFE2, 0x5E93, 0xBFE3, 0x88E4, 0xBFE4, 0x5938, 0xBFE5, 0x57AE, + 0xBFE6, 0x630E, 0xBFE7, 0x8DE8, 0xBFE8, 0x80EF, 0xBFE9, 0x5757, + 0xBFEA, 0x7B77, 0xBFEB, 0x4FA9, 0xBFEC, 0x5FEB, 0xBFED, 0x5BBD, + 0xBFEE, 0x6B3E, 0xBFEF, 0x5321, 0xBFF0, 0x7B50, 0xBFF1, 0x72C2, + 0xBFF2, 0x6846, 0xBFF3, 0x77FF, 0xBFF4, 0x7736, 0xBFF5, 0x65F7, + 0xBFF6, 0x51B5, 0xBFF7, 0x4E8F, 0xBFF8, 0x76D4, 0xBFF9, 0x5CBF, + 0xBFFA, 0x7AA5, 0xBFFB, 0x8475, 0xBFFC, 0x594E, 0xBFFD, 0x9B41, + 0xBFFE, 0x5080, 0xC040, 0x7E5E, 0xC041, 0x7E5F, 0xC042, 0x7E60, + 0xC043, 0x7E61, 0xC044, 0x7E62, 0xC045, 0x7E63, 0xC046, 0x7E64, + 0xC047, 0x7E65, 0xC048, 0x7E66, 0xC049, 0x7E67, 0xC04A, 0x7E68, + 0xC04B, 0x7E69, 0xC04C, 0x7E6A, 0xC04D, 0x7E6B, 0xC04E, 0x7E6C, + 0xC04F, 0x7E6D, 0xC050, 0x7E6E, 0xC051, 0x7E6F, 0xC052, 0x7E70, + 0xC053, 0x7E71, 0xC054, 0x7E72, 0xC055, 0x7E73, 0xC056, 0x7E74, + 0xC057, 0x7E75, 0xC058, 0x7E76, 0xC059, 0x7E77, 0xC05A, 0x7E78, + 0xC05B, 0x7E79, 0xC05C, 0x7E7A, 0xC05D, 0x7E7B, 0xC05E, 0x7E7C, + 0xC05F, 0x7E7D, 0xC060, 0x7E7E, 0xC061, 0x7E7F, 0xC062, 0x7E80, + 0xC063, 0x7E81, 0xC064, 0x7E83, 0xC065, 0x7E84, 0xC066, 0x7E85, + 0xC067, 0x7E86, 0xC068, 0x7E87, 0xC069, 0x7E88, 0xC06A, 0x7E89, + 0xC06B, 0x7E8A, 0xC06C, 0x7E8B, 0xC06D, 0x7E8C, 0xC06E, 0x7E8D, + 0xC06F, 0x7E8E, 0xC070, 0x7E8F, 0xC071, 0x7E90, 0xC072, 0x7E91, + 0xC073, 0x7E92, 0xC074, 0x7E93, 0xC075, 0x7E94, 0xC076, 0x7E95, + 0xC077, 0x7E96, 0xC078, 0x7E97, 0xC079, 0x7E98, 0xC07A, 0x7E99, + 0xC07B, 0x7E9A, 0xC07C, 0x7E9C, 0xC07D, 0x7E9D, 0xC07E, 0x7E9E, + 0xC080, 0x7EAE, 0xC081, 0x7EB4, 0xC082, 0x7EBB, 0xC083, 0x7EBC, + 0xC084, 0x7ED6, 0xC085, 0x7EE4, 0xC086, 0x7EEC, 0xC087, 0x7EF9, + 0xC088, 0x7F0A, 0xC089, 0x7F10, 0xC08A, 0x7F1E, 0xC08B, 0x7F37, + 0xC08C, 0x7F39, 0xC08D, 0x7F3B, 0xC08E, 0x7F3C, 0xC08F, 0x7F3D, + 0xC090, 0x7F3E, 0xC091, 0x7F3F, 0xC092, 0x7F40, 0xC093, 0x7F41, + 0xC094, 0x7F43, 0xC095, 0x7F46, 0xC096, 0x7F47, 0xC097, 0x7F48, + 0xC098, 0x7F49, 0xC099, 0x7F4A, 0xC09A, 0x7F4B, 0xC09B, 0x7F4C, + 0xC09C, 0x7F4D, 0xC09D, 0x7F4E, 0xC09E, 0x7F4F, 0xC09F, 0x7F52, + 0xC0A0, 0x7F53, 0xC0A1, 0x9988, 0xC0A2, 0x6127, 0xC0A3, 0x6E83, + 0xC0A4, 0x5764, 0xC0A5, 0x6606, 0xC0A6, 0x6346, 0xC0A7, 0x56F0, + 0xC0A8, 0x62EC, 0xC0A9, 0x6269, 0xC0AA, 0x5ED3, 0xC0AB, 0x9614, + 0xC0AC, 0x5783, 0xC0AD, 0x62C9, 0xC0AE, 0x5587, 0xC0AF, 0x8721, + 0xC0B0, 0x814A, 0xC0B1, 0x8FA3, 0xC0B2, 0x5566, 0xC0B3, 0x83B1, + 0xC0B4, 0x6765, 0xC0B5, 0x8D56, 0xC0B6, 0x84DD, 0xC0B7, 0x5A6A, + 0xC0B8, 0x680F, 0xC0B9, 0x62E6, 0xC0BA, 0x7BEE, 0xC0BB, 0x9611, + 0xC0BC, 0x5170, 0xC0BD, 0x6F9C, 0xC0BE, 0x8C30, 0xC0BF, 0x63FD, + 0xC0C0, 0x89C8, 0xC0C1, 0x61D2, 0xC0C2, 0x7F06, 0xC0C3, 0x70C2, + 0xC0C4, 0x6EE5, 0xC0C5, 0x7405, 0xC0C6, 0x6994, 0xC0C7, 0x72FC, + 0xC0C8, 0x5ECA, 0xC0C9, 0x90CE, 0xC0CA, 0x6717, 0xC0CB, 0x6D6A, + 0xC0CC, 0x635E, 0xC0CD, 0x52B3, 0xC0CE, 0x7262, 0xC0CF, 0x8001, + 0xC0D0, 0x4F6C, 0xC0D1, 0x59E5, 0xC0D2, 0x916A, 0xC0D3, 0x70D9, + 0xC0D4, 0x6D9D, 0xC0D5, 0x52D2, 0xC0D6, 0x4E50, 0xC0D7, 0x96F7, + 0xC0D8, 0x956D, 0xC0D9, 0x857E, 0xC0DA, 0x78CA, 0xC0DB, 0x7D2F, + 0xC0DC, 0x5121, 0xC0DD, 0x5792, 0xC0DE, 0x64C2, 0xC0DF, 0x808B, + 0xC0E0, 0x7C7B, 0xC0E1, 0x6CEA, 0xC0E2, 0x68F1, 0xC0E3, 0x695E, + 0xC0E4, 0x51B7, 0xC0E5, 0x5398, 0xC0E6, 0x68A8, 0xC0E7, 0x7281, + 0xC0E8, 0x9ECE, 0xC0E9, 0x7BF1, 0xC0EA, 0x72F8, 0xC0EB, 0x79BB, + 0xC0EC, 0x6F13, 0xC0ED, 0x7406, 0xC0EE, 0x674E, 0xC0EF, 0x91CC, + 0xC0F0, 0x9CA4, 0xC0F1, 0x793C, 0xC0F2, 0x8389, 0xC0F3, 0x8354, + 0xC0F4, 0x540F, 0xC0F5, 0x6817, 0xC0F6, 0x4E3D, 0xC0F7, 0x5389, + 0xC0F8, 0x52B1, 0xC0F9, 0x783E, 0xC0FA, 0x5386, 0xC0FB, 0x5229, + 0xC0FC, 0x5088, 0xC0FD, 0x4F8B, 0xC0FE, 0x4FD0, 0xC140, 0x7F56, + 0xC141, 0x7F59, 0xC142, 0x7F5B, 0xC143, 0x7F5C, 0xC144, 0x7F5D, + 0xC145, 0x7F5E, 0xC146, 0x7F60, 0xC147, 0x7F63, 0xC148, 0x7F64, + 0xC149, 0x7F65, 0xC14A, 0x7F66, 0xC14B, 0x7F67, 0xC14C, 0x7F6B, + 0xC14D, 0x7F6C, 0xC14E, 0x7F6D, 0xC14F, 0x7F6F, 0xC150, 0x7F70, + 0xC151, 0x7F73, 0xC152, 0x7F75, 0xC153, 0x7F76, 0xC154, 0x7F77, + 0xC155, 0x7F78, 0xC156, 0x7F7A, 0xC157, 0x7F7B, 0xC158, 0x7F7C, + 0xC159, 0x7F7D, 0xC15A, 0x7F7F, 0xC15B, 0x7F80, 0xC15C, 0x7F82, + 0xC15D, 0x7F83, 0xC15E, 0x7F84, 0xC15F, 0x7F85, 0xC160, 0x7F86, + 0xC161, 0x7F87, 0xC162, 0x7F88, 0xC163, 0x7F89, 0xC164, 0x7F8B, + 0xC165, 0x7F8D, 0xC166, 0x7F8F, 0xC167, 0x7F90, 0xC168, 0x7F91, + 0xC169, 0x7F92, 0xC16A, 0x7F93, 0xC16B, 0x7F95, 0xC16C, 0x7F96, + 0xC16D, 0x7F97, 0xC16E, 0x7F98, 0xC16F, 0x7F99, 0xC170, 0x7F9B, + 0xC171, 0x7F9C, 0xC172, 0x7FA0, 0xC173, 0x7FA2, 0xC174, 0x7FA3, + 0xC175, 0x7FA5, 0xC176, 0x7FA6, 0xC177, 0x7FA8, 0xC178, 0x7FA9, + 0xC179, 0x7FAA, 0xC17A, 0x7FAB, 0xC17B, 0x7FAC, 0xC17C, 0x7FAD, + 0xC17D, 0x7FAE, 0xC17E, 0x7FB1, 0xC180, 0x7FB3, 0xC181, 0x7FB4, + 0xC182, 0x7FB5, 0xC183, 0x7FB6, 0xC184, 0x7FB7, 0xC185, 0x7FBA, + 0xC186, 0x7FBB, 0xC187, 0x7FBE, 0xC188, 0x7FC0, 0xC189, 0x7FC2, + 0xC18A, 0x7FC3, 0xC18B, 0x7FC4, 0xC18C, 0x7FC6, 0xC18D, 0x7FC7, + 0xC18E, 0x7FC8, 0xC18F, 0x7FC9, 0xC190, 0x7FCB, 0xC191, 0x7FCD, + 0xC192, 0x7FCF, 0xC193, 0x7FD0, 0xC194, 0x7FD1, 0xC195, 0x7FD2, + 0xC196, 0x7FD3, 0xC197, 0x7FD6, 0xC198, 0x7FD7, 0xC199, 0x7FD9, + 0xC19A, 0x7FDA, 0xC19B, 0x7FDB, 0xC19C, 0x7FDC, 0xC19D, 0x7FDD, + 0xC19E, 0x7FDE, 0xC19F, 0x7FE2, 0xC1A0, 0x7FE3, 0xC1A1, 0x75E2, + 0xC1A2, 0x7ACB, 0xC1A3, 0x7C92, 0xC1A4, 0x6CA5, 0xC1A5, 0x96B6, + 0xC1A6, 0x529B, 0xC1A7, 0x7483, 0xC1A8, 0x54E9, 0xC1A9, 0x4FE9, + 0xC1AA, 0x8054, 0xC1AB, 0x83B2, 0xC1AC, 0x8FDE, 0xC1AD, 0x9570, + 0xC1AE, 0x5EC9, 0xC1AF, 0x601C, 0xC1B0, 0x6D9F, 0xC1B1, 0x5E18, + 0xC1B2, 0x655B, 0xC1B3, 0x8138, 0xC1B4, 0x94FE, 0xC1B5, 0x604B, + 0xC1B6, 0x70BC, 0xC1B7, 0x7EC3, 0xC1B8, 0x7CAE, 0xC1B9, 0x51C9, + 0xC1BA, 0x6881, 0xC1BB, 0x7CB1, 0xC1BC, 0x826F, 0xC1BD, 0x4E24, + 0xC1BE, 0x8F86, 0xC1BF, 0x91CF, 0xC1C0, 0x667E, 0xC1C1, 0x4EAE, + 0xC1C2, 0x8C05, 0xC1C3, 0x64A9, 0xC1C4, 0x804A, 0xC1C5, 0x50DA, + 0xC1C6, 0x7597, 0xC1C7, 0x71CE, 0xC1C8, 0x5BE5, 0xC1C9, 0x8FBD, + 0xC1CA, 0x6F66, 0xC1CB, 0x4E86, 0xC1CC, 0x6482, 0xC1CD, 0x9563, + 0xC1CE, 0x5ED6, 0xC1CF, 0x6599, 0xC1D0, 0x5217, 0xC1D1, 0x88C2, + 0xC1D2, 0x70C8, 0xC1D3, 0x52A3, 0xC1D4, 0x730E, 0xC1D5, 0x7433, + 0xC1D6, 0x6797, 0xC1D7, 0x78F7, 0xC1D8, 0x9716, 0xC1D9, 0x4E34, + 0xC1DA, 0x90BB, 0xC1DB, 0x9CDE, 0xC1DC, 0x6DCB, 0xC1DD, 0x51DB, + 0xC1DE, 0x8D41, 0xC1DF, 0x541D, 0xC1E0, 0x62CE, 0xC1E1, 0x73B2, + 0xC1E2, 0x83F1, 0xC1E3, 0x96F6, 0xC1E4, 0x9F84, 0xC1E5, 0x94C3, + 0xC1E6, 0x4F36, 0xC1E7, 0x7F9A, 0xC1E8, 0x51CC, 0xC1E9, 0x7075, + 0xC1EA, 0x9675, 0xC1EB, 0x5CAD, 0xC1EC, 0x9886, 0xC1ED, 0x53E6, + 0xC1EE, 0x4EE4, 0xC1EF, 0x6E9C, 0xC1F0, 0x7409, 0xC1F1, 0x69B4, + 0xC1F2, 0x786B, 0xC1F3, 0x998F, 0xC1F4, 0x7559, 0xC1F5, 0x5218, + 0xC1F6, 0x7624, 0xC1F7, 0x6D41, 0xC1F8, 0x67F3, 0xC1F9, 0x516D, + 0xC1FA, 0x9F99, 0xC1FB, 0x804B, 0xC1FC, 0x5499, 0xC1FD, 0x7B3C, + 0xC1FE, 0x7ABF, 0xC240, 0x7FE4, 0xC241, 0x7FE7, 0xC242, 0x7FE8, + 0xC243, 0x7FEA, 0xC244, 0x7FEB, 0xC245, 0x7FEC, 0xC246, 0x7FED, + 0xC247, 0x7FEF, 0xC248, 0x7FF2, 0xC249, 0x7FF4, 0xC24A, 0x7FF5, + 0xC24B, 0x7FF6, 0xC24C, 0x7FF7, 0xC24D, 0x7FF8, 0xC24E, 0x7FF9, + 0xC24F, 0x7FFA, 0xC250, 0x7FFD, 0xC251, 0x7FFE, 0xC252, 0x7FFF, + 0xC253, 0x8002, 0xC254, 0x8007, 0xC255, 0x8008, 0xC256, 0x8009, + 0xC257, 0x800A, 0xC258, 0x800E, 0xC259, 0x800F, 0xC25A, 0x8011, + 0xC25B, 0x8013, 0xC25C, 0x801A, 0xC25D, 0x801B, 0xC25E, 0x801D, + 0xC25F, 0x801E, 0xC260, 0x801F, 0xC261, 0x8021, 0xC262, 0x8023, + 0xC263, 0x8024, 0xC264, 0x802B, 0xC265, 0x802C, 0xC266, 0x802D, + 0xC267, 0x802E, 0xC268, 0x802F, 0xC269, 0x8030, 0xC26A, 0x8032, + 0xC26B, 0x8034, 0xC26C, 0x8039, 0xC26D, 0x803A, 0xC26E, 0x803C, + 0xC26F, 0x803E, 0xC270, 0x8040, 0xC271, 0x8041, 0xC272, 0x8044, + 0xC273, 0x8045, 0xC274, 0x8047, 0xC275, 0x8048, 0xC276, 0x8049, + 0xC277, 0x804E, 0xC278, 0x804F, 0xC279, 0x8050, 0xC27A, 0x8051, + 0xC27B, 0x8053, 0xC27C, 0x8055, 0xC27D, 0x8056, 0xC27E, 0x8057, + 0xC280, 0x8059, 0xC281, 0x805B, 0xC282, 0x805C, 0xC283, 0x805D, + 0xC284, 0x805E, 0xC285, 0x805F, 0xC286, 0x8060, 0xC287, 0x8061, + 0xC288, 0x8062, 0xC289, 0x8063, 0xC28A, 0x8064, 0xC28B, 0x8065, + 0xC28C, 0x8066, 0xC28D, 0x8067, 0xC28E, 0x8068, 0xC28F, 0x806B, + 0xC290, 0x806C, 0xC291, 0x806D, 0xC292, 0x806E, 0xC293, 0x806F, + 0xC294, 0x8070, 0xC295, 0x8072, 0xC296, 0x8073, 0xC297, 0x8074, + 0xC298, 0x8075, 0xC299, 0x8076, 0xC29A, 0x8077, 0xC29B, 0x8078, + 0xC29C, 0x8079, 0xC29D, 0x807A, 0xC29E, 0x807B, 0xC29F, 0x807C, + 0xC2A0, 0x807D, 0xC2A1, 0x9686, 0xC2A2, 0x5784, 0xC2A3, 0x62E2, + 0xC2A4, 0x9647, 0xC2A5, 0x697C, 0xC2A6, 0x5A04, 0xC2A7, 0x6402, + 0xC2A8, 0x7BD3, 0xC2A9, 0x6F0F, 0xC2AA, 0x964B, 0xC2AB, 0x82A6, + 0xC2AC, 0x5362, 0xC2AD, 0x9885, 0xC2AE, 0x5E90, 0xC2AF, 0x7089, + 0xC2B0, 0x63B3, 0xC2B1, 0x5364, 0xC2B2, 0x864F, 0xC2B3, 0x9C81, + 0xC2B4, 0x9E93, 0xC2B5, 0x788C, 0xC2B6, 0x9732, 0xC2B7, 0x8DEF, + 0xC2B8, 0x8D42, 0xC2B9, 0x9E7F, 0xC2BA, 0x6F5E, 0xC2BB, 0x7984, + 0xC2BC, 0x5F55, 0xC2BD, 0x9646, 0xC2BE, 0x622E, 0xC2BF, 0x9A74, + 0xC2C0, 0x5415, 0xC2C1, 0x94DD, 0xC2C2, 0x4FA3, 0xC2C3, 0x65C5, + 0xC2C4, 0x5C65, 0xC2C5, 0x5C61, 0xC2C6, 0x7F15, 0xC2C7, 0x8651, + 0xC2C8, 0x6C2F, 0xC2C9, 0x5F8B, 0xC2CA, 0x7387, 0xC2CB, 0x6EE4, + 0xC2CC, 0x7EFF, 0xC2CD, 0x5CE6, 0xC2CE, 0x631B, 0xC2CF, 0x5B6A, + 0xC2D0, 0x6EE6, 0xC2D1, 0x5375, 0xC2D2, 0x4E71, 0xC2D3, 0x63A0, + 0xC2D4, 0x7565, 0xC2D5, 0x62A1, 0xC2D6, 0x8F6E, 0xC2D7, 0x4F26, + 0xC2D8, 0x4ED1, 0xC2D9, 0x6CA6, 0xC2DA, 0x7EB6, 0xC2DB, 0x8BBA, + 0xC2DC, 0x841D, 0xC2DD, 0x87BA, 0xC2DE, 0x7F57, 0xC2DF, 0x903B, + 0xC2E0, 0x9523, 0xC2E1, 0x7BA9, 0xC2E2, 0x9AA1, 0xC2E3, 0x88F8, + 0xC2E4, 0x843D, 0xC2E5, 0x6D1B, 0xC2E6, 0x9A86, 0xC2E7, 0x7EDC, + 0xC2E8, 0x5988, 0xC2E9, 0x9EBB, 0xC2EA, 0x739B, 0xC2EB, 0x7801, + 0xC2EC, 0x8682, 0xC2ED, 0x9A6C, 0xC2EE, 0x9A82, 0xC2EF, 0x561B, + 0xC2F0, 0x5417, 0xC2F1, 0x57CB, 0xC2F2, 0x4E70, 0xC2F3, 0x9EA6, + 0xC2F4, 0x5356, 0xC2F5, 0x8FC8, 0xC2F6, 0x8109, 0xC2F7, 0x7792, + 0xC2F8, 0x9992, 0xC2F9, 0x86EE, 0xC2FA, 0x6EE1, 0xC2FB, 0x8513, + 0xC2FC, 0x66FC, 0xC2FD, 0x6162, 0xC2FE, 0x6F2B, 0xC340, 0x807E, + 0xC341, 0x8081, 0xC342, 0x8082, 0xC343, 0x8085, 0xC344, 0x8088, + 0xC345, 0x808A, 0xC346, 0x808D, 0xC347, 0x808E, 0xC348, 0x808F, + 0xC349, 0x8090, 0xC34A, 0x8091, 0xC34B, 0x8092, 0xC34C, 0x8094, + 0xC34D, 0x8095, 0xC34E, 0x8097, 0xC34F, 0x8099, 0xC350, 0x809E, + 0xC351, 0x80A3, 0xC352, 0x80A6, 0xC353, 0x80A7, 0xC354, 0x80A8, + 0xC355, 0x80AC, 0xC356, 0x80B0, 0xC357, 0x80B3, 0xC358, 0x80B5, + 0xC359, 0x80B6, 0xC35A, 0x80B8, 0xC35B, 0x80B9, 0xC35C, 0x80BB, + 0xC35D, 0x80C5, 0xC35E, 0x80C7, 0xC35F, 0x80C8, 0xC360, 0x80C9, + 0xC361, 0x80CA, 0xC362, 0x80CB, 0xC363, 0x80CF, 0xC364, 0x80D0, + 0xC365, 0x80D1, 0xC366, 0x80D2, 0xC367, 0x80D3, 0xC368, 0x80D4, + 0xC369, 0x80D5, 0xC36A, 0x80D8, 0xC36B, 0x80DF, 0xC36C, 0x80E0, + 0xC36D, 0x80E2, 0xC36E, 0x80E3, 0xC36F, 0x80E6, 0xC370, 0x80EE, + 0xC371, 0x80F5, 0xC372, 0x80F7, 0xC373, 0x80F9, 0xC374, 0x80FB, + 0xC375, 0x80FE, 0xC376, 0x80FF, 0xC377, 0x8100, 0xC378, 0x8101, + 0xC379, 0x8103, 0xC37A, 0x8104, 0xC37B, 0x8105, 0xC37C, 0x8107, + 0xC37D, 0x8108, 0xC37E, 0x810B, 0xC380, 0x810C, 0xC381, 0x8115, + 0xC382, 0x8117, 0xC383, 0x8119, 0xC384, 0x811B, 0xC385, 0x811C, + 0xC386, 0x811D, 0xC387, 0x811F, 0xC388, 0x8120, 0xC389, 0x8121, + 0xC38A, 0x8122, 0xC38B, 0x8123, 0xC38C, 0x8124, 0xC38D, 0x8125, + 0xC38E, 0x8126, 0xC38F, 0x8127, 0xC390, 0x8128, 0xC391, 0x8129, + 0xC392, 0x812A, 0xC393, 0x812B, 0xC394, 0x812D, 0xC395, 0x812E, + 0xC396, 0x8130, 0xC397, 0x8133, 0xC398, 0x8134, 0xC399, 0x8135, + 0xC39A, 0x8137, 0xC39B, 0x8139, 0xC39C, 0x813A, 0xC39D, 0x813B, + 0xC39E, 0x813C, 0xC39F, 0x813D, 0xC3A0, 0x813F, 0xC3A1, 0x8C29, + 0xC3A2, 0x8292, 0xC3A3, 0x832B, 0xC3A4, 0x76F2, 0xC3A5, 0x6C13, + 0xC3A6, 0x5FD9, 0xC3A7, 0x83BD, 0xC3A8, 0x732B, 0xC3A9, 0x8305, + 0xC3AA, 0x951A, 0xC3AB, 0x6BDB, 0xC3AC, 0x77DB, 0xC3AD, 0x94C6, + 0xC3AE, 0x536F, 0xC3AF, 0x8302, 0xC3B0, 0x5192, 0xC3B1, 0x5E3D, + 0xC3B2, 0x8C8C, 0xC3B3, 0x8D38, 0xC3B4, 0x4E48, 0xC3B5, 0x73AB, + 0xC3B6, 0x679A, 0xC3B7, 0x6885, 0xC3B8, 0x9176, 0xC3B9, 0x9709, + 0xC3BA, 0x7164, 0xC3BB, 0x6CA1, 0xC3BC, 0x7709, 0xC3BD, 0x5A92, + 0xC3BE, 0x9541, 0xC3BF, 0x6BCF, 0xC3C0, 0x7F8E, 0xC3C1, 0x6627, + 0xC3C2, 0x5BD0, 0xC3C3, 0x59B9, 0xC3C4, 0x5A9A, 0xC3C5, 0x95E8, + 0xC3C6, 0x95F7, 0xC3C7, 0x4EEC, 0xC3C8, 0x840C, 0xC3C9, 0x8499, + 0xC3CA, 0x6AAC, 0xC3CB, 0x76DF, 0xC3CC, 0x9530, 0xC3CD, 0x731B, + 0xC3CE, 0x68A6, 0xC3CF, 0x5B5F, 0xC3D0, 0x772F, 0xC3D1, 0x919A, + 0xC3D2, 0x9761, 0xC3D3, 0x7CDC, 0xC3D4, 0x8FF7, 0xC3D5, 0x8C1C, + 0xC3D6, 0x5F25, 0xC3D7, 0x7C73, 0xC3D8, 0x79D8, 0xC3D9, 0x89C5, + 0xC3DA, 0x6CCC, 0xC3DB, 0x871C, 0xC3DC, 0x5BC6, 0xC3DD, 0x5E42, + 0xC3DE, 0x68C9, 0xC3DF, 0x7720, 0xC3E0, 0x7EF5, 0xC3E1, 0x5195, + 0xC3E2, 0x514D, 0xC3E3, 0x52C9, 0xC3E4, 0x5A29, 0xC3E5, 0x7F05, + 0xC3E6, 0x9762, 0xC3E7, 0x82D7, 0xC3E8, 0x63CF, 0xC3E9, 0x7784, + 0xC3EA, 0x85D0, 0xC3EB, 0x79D2, 0xC3EC, 0x6E3A, 0xC3ED, 0x5E99, + 0xC3EE, 0x5999, 0xC3EF, 0x8511, 0xC3F0, 0x706D, 0xC3F1, 0x6C11, + 0xC3F2, 0x62BF, 0xC3F3, 0x76BF, 0xC3F4, 0x654F, 0xC3F5, 0x60AF, + 0xC3F6, 0x95FD, 0xC3F7, 0x660E, 0xC3F8, 0x879F, 0xC3F9, 0x9E23, + 0xC3FA, 0x94ED, 0xC3FB, 0x540D, 0xC3FC, 0x547D, 0xC3FD, 0x8C2C, + 0xC3FE, 0x6478, 0xC440, 0x8140, 0xC441, 0x8141, 0xC442, 0x8142, + 0xC443, 0x8143, 0xC444, 0x8144, 0xC445, 0x8145, 0xC446, 0x8147, + 0xC447, 0x8149, 0xC448, 0x814D, 0xC449, 0x814E, 0xC44A, 0x814F, + 0xC44B, 0x8152, 0xC44C, 0x8156, 0xC44D, 0x8157, 0xC44E, 0x8158, + 0xC44F, 0x815B, 0xC450, 0x815C, 0xC451, 0x815D, 0xC452, 0x815E, + 0xC453, 0x815F, 0xC454, 0x8161, 0xC455, 0x8162, 0xC456, 0x8163, + 0xC457, 0x8164, 0xC458, 0x8166, 0xC459, 0x8168, 0xC45A, 0x816A, + 0xC45B, 0x816B, 0xC45C, 0x816C, 0xC45D, 0x816F, 0xC45E, 0x8172, + 0xC45F, 0x8173, 0xC460, 0x8175, 0xC461, 0x8176, 0xC462, 0x8177, + 0xC463, 0x8178, 0xC464, 0x8181, 0xC465, 0x8183, 0xC466, 0x8184, + 0xC467, 0x8185, 0xC468, 0x8186, 0xC469, 0x8187, 0xC46A, 0x8189, + 0xC46B, 0x818B, 0xC46C, 0x818C, 0xC46D, 0x818D, 0xC46E, 0x818E, + 0xC46F, 0x8190, 0xC470, 0x8192, 0xC471, 0x8193, 0xC472, 0x8194, + 0xC473, 0x8195, 0xC474, 0x8196, 0xC475, 0x8197, 0xC476, 0x8199, + 0xC477, 0x819A, 0xC478, 0x819E, 0xC479, 0x819F, 0xC47A, 0x81A0, + 0xC47B, 0x81A1, 0xC47C, 0x81A2, 0xC47D, 0x81A4, 0xC47E, 0x81A5, + 0xC480, 0x81A7, 0xC481, 0x81A9, 0xC482, 0x81AB, 0xC483, 0x81AC, + 0xC484, 0x81AD, 0xC485, 0x81AE, 0xC486, 0x81AF, 0xC487, 0x81B0, + 0xC488, 0x81B1, 0xC489, 0x81B2, 0xC48A, 0x81B4, 0xC48B, 0x81B5, + 0xC48C, 0x81B6, 0xC48D, 0x81B7, 0xC48E, 0x81B8, 0xC48F, 0x81B9, + 0xC490, 0x81BC, 0xC491, 0x81BD, 0xC492, 0x81BE, 0xC493, 0x81BF, + 0xC494, 0x81C4, 0xC495, 0x81C5, 0xC496, 0x81C7, 0xC497, 0x81C8, + 0xC498, 0x81C9, 0xC499, 0x81CB, 0xC49A, 0x81CD, 0xC49B, 0x81CE, + 0xC49C, 0x81CF, 0xC49D, 0x81D0, 0xC49E, 0x81D1, 0xC49F, 0x81D2, + 0xC4A0, 0x81D3, 0xC4A1, 0x6479, 0xC4A2, 0x8611, 0xC4A3, 0x6A21, + 0xC4A4, 0x819C, 0xC4A5, 0x78E8, 0xC4A6, 0x6469, 0xC4A7, 0x9B54, + 0xC4A8, 0x62B9, 0xC4A9, 0x672B, 0xC4AA, 0x83AB, 0xC4AB, 0x58A8, + 0xC4AC, 0x9ED8, 0xC4AD, 0x6CAB, 0xC4AE, 0x6F20, 0xC4AF, 0x5BDE, + 0xC4B0, 0x964C, 0xC4B1, 0x8C0B, 0xC4B2, 0x725F, 0xC4B3, 0x67D0, + 0xC4B4, 0x62C7, 0xC4B5, 0x7261, 0xC4B6, 0x4EA9, 0xC4B7, 0x59C6, + 0xC4B8, 0x6BCD, 0xC4B9, 0x5893, 0xC4BA, 0x66AE, 0xC4BB, 0x5E55, + 0xC4BC, 0x52DF, 0xC4BD, 0x6155, 0xC4BE, 0x6728, 0xC4BF, 0x76EE, + 0xC4C0, 0x7766, 0xC4C1, 0x7267, 0xC4C2, 0x7A46, 0xC4C3, 0x62FF, + 0xC4C4, 0x54EA, 0xC4C5, 0x5450, 0xC4C6, 0x94A0, 0xC4C7, 0x90A3, + 0xC4C8, 0x5A1C, 0xC4C9, 0x7EB3, 0xC4CA, 0x6C16, 0xC4CB, 0x4E43, + 0xC4CC, 0x5976, 0xC4CD, 0x8010, 0xC4CE, 0x5948, 0xC4CF, 0x5357, + 0xC4D0, 0x7537, 0xC4D1, 0x96BE, 0xC4D2, 0x56CA, 0xC4D3, 0x6320, + 0xC4D4, 0x8111, 0xC4D5, 0x607C, 0xC4D6, 0x95F9, 0xC4D7, 0x6DD6, + 0xC4D8, 0x5462, 0xC4D9, 0x9981, 0xC4DA, 0x5185, 0xC4DB, 0x5AE9, + 0xC4DC, 0x80FD, 0xC4DD, 0x59AE, 0xC4DE, 0x9713, 0xC4DF, 0x502A, + 0xC4E0, 0x6CE5, 0xC4E1, 0x5C3C, 0xC4E2, 0x62DF, 0xC4E3, 0x4F60, + 0xC4E4, 0x533F, 0xC4E5, 0x817B, 0xC4E6, 0x9006, 0xC4E7, 0x6EBA, + 0xC4E8, 0x852B, 0xC4E9, 0x62C8, 0xC4EA, 0x5E74, 0xC4EB, 0x78BE, + 0xC4EC, 0x64B5, 0xC4ED, 0x637B, 0xC4EE, 0x5FF5, 0xC4EF, 0x5A18, + 0xC4F0, 0x917F, 0xC4F1, 0x9E1F, 0xC4F2, 0x5C3F, 0xC4F3, 0x634F, + 0xC4F4, 0x8042, 0xC4F5, 0x5B7D, 0xC4F6, 0x556E, 0xC4F7, 0x954A, + 0xC4F8, 0x954D, 0xC4F9, 0x6D85, 0xC4FA, 0x60A8, 0xC4FB, 0x67E0, + 0xC4FC, 0x72DE, 0xC4FD, 0x51DD, 0xC4FE, 0x5B81, 0xC540, 0x81D4, + 0xC541, 0x81D5, 0xC542, 0x81D6, 0xC543, 0x81D7, 0xC544, 0x81D8, + 0xC545, 0x81D9, 0xC546, 0x81DA, 0xC547, 0x81DB, 0xC548, 0x81DC, + 0xC549, 0x81DD, 0xC54A, 0x81DE, 0xC54B, 0x81DF, 0xC54C, 0x81E0, + 0xC54D, 0x81E1, 0xC54E, 0x81E2, 0xC54F, 0x81E4, 0xC550, 0x81E5, + 0xC551, 0x81E6, 0xC552, 0x81E8, 0xC553, 0x81E9, 0xC554, 0x81EB, + 0xC555, 0x81EE, 0xC556, 0x81EF, 0xC557, 0x81F0, 0xC558, 0x81F1, + 0xC559, 0x81F2, 0xC55A, 0x81F5, 0xC55B, 0x81F6, 0xC55C, 0x81F7, + 0xC55D, 0x81F8, 0xC55E, 0x81F9, 0xC55F, 0x81FA, 0xC560, 0x81FD, + 0xC561, 0x81FF, 0xC562, 0x8203, 0xC563, 0x8207, 0xC564, 0x8208, + 0xC565, 0x8209, 0xC566, 0x820A, 0xC567, 0x820B, 0xC568, 0x820E, + 0xC569, 0x820F, 0xC56A, 0x8211, 0xC56B, 0x8213, 0xC56C, 0x8215, + 0xC56D, 0x8216, 0xC56E, 0x8217, 0xC56F, 0x8218, 0xC570, 0x8219, + 0xC571, 0x821A, 0xC572, 0x821D, 0xC573, 0x8220, 0xC574, 0x8224, + 0xC575, 0x8225, 0xC576, 0x8226, 0xC577, 0x8227, 0xC578, 0x8229, + 0xC579, 0x822E, 0xC57A, 0x8232, 0xC57B, 0x823A, 0xC57C, 0x823C, + 0xC57D, 0x823D, 0xC57E, 0x823F, 0xC580, 0x8240, 0xC581, 0x8241, + 0xC582, 0x8242, 0xC583, 0x8243, 0xC584, 0x8245, 0xC585, 0x8246, + 0xC586, 0x8248, 0xC587, 0x824A, 0xC588, 0x824C, 0xC589, 0x824D, + 0xC58A, 0x824E, 0xC58B, 0x8250, 0xC58C, 0x8251, 0xC58D, 0x8252, + 0xC58E, 0x8253, 0xC58F, 0x8254, 0xC590, 0x8255, 0xC591, 0x8256, + 0xC592, 0x8257, 0xC593, 0x8259, 0xC594, 0x825B, 0xC595, 0x825C, + 0xC596, 0x825D, 0xC597, 0x825E, 0xC598, 0x8260, 0xC599, 0x8261, + 0xC59A, 0x8262, 0xC59B, 0x8263, 0xC59C, 0x8264, 0xC59D, 0x8265, + 0xC59E, 0x8266, 0xC59F, 0x8267, 0xC5A0, 0x8269, 0xC5A1, 0x62E7, + 0xC5A2, 0x6CDE, 0xC5A3, 0x725B, 0xC5A4, 0x626D, 0xC5A5, 0x94AE, + 0xC5A6, 0x7EBD, 0xC5A7, 0x8113, 0xC5A8, 0x6D53, 0xC5A9, 0x519C, + 0xC5AA, 0x5F04, 0xC5AB, 0x5974, 0xC5AC, 0x52AA, 0xC5AD, 0x6012, + 0xC5AE, 0x5973, 0xC5AF, 0x6696, 0xC5B0, 0x8650, 0xC5B1, 0x759F, + 0xC5B2, 0x632A, 0xC5B3, 0x61E6, 0xC5B4, 0x7CEF, 0xC5B5, 0x8BFA, + 0xC5B6, 0x54E6, 0xC5B7, 0x6B27, 0xC5B8, 0x9E25, 0xC5B9, 0x6BB4, + 0xC5BA, 0x85D5, 0xC5BB, 0x5455, 0xC5BC, 0x5076, 0xC5BD, 0x6CA4, + 0xC5BE, 0x556A, 0xC5BF, 0x8DB4, 0xC5C0, 0x722C, 0xC5C1, 0x5E15, + 0xC5C2, 0x6015, 0xC5C3, 0x7436, 0xC5C4, 0x62CD, 0xC5C5, 0x6392, + 0xC5C6, 0x724C, 0xC5C7, 0x5F98, 0xC5C8, 0x6E43, 0xC5C9, 0x6D3E, + 0xC5CA, 0x6500, 0xC5CB, 0x6F58, 0xC5CC, 0x76D8, 0xC5CD, 0x78D0, + 0xC5CE, 0x76FC, 0xC5CF, 0x7554, 0xC5D0, 0x5224, 0xC5D1, 0x53DB, + 0xC5D2, 0x4E53, 0xC5D3, 0x5E9E, 0xC5D4, 0x65C1, 0xC5D5, 0x802A, + 0xC5D6, 0x80D6, 0xC5D7, 0x629B, 0xC5D8, 0x5486, 0xC5D9, 0x5228, + 0xC5DA, 0x70AE, 0xC5DB, 0x888D, 0xC5DC, 0x8DD1, 0xC5DD, 0x6CE1, + 0xC5DE, 0x5478, 0xC5DF, 0x80DA, 0xC5E0, 0x57F9, 0xC5E1, 0x88F4, + 0xC5E2, 0x8D54, 0xC5E3, 0x966A, 0xC5E4, 0x914D, 0xC5E5, 0x4F69, + 0xC5E6, 0x6C9B, 0xC5E7, 0x55B7, 0xC5E8, 0x76C6, 0xC5E9, 0x7830, + 0xC5EA, 0x62A8, 0xC5EB, 0x70F9, 0xC5EC, 0x6F8E, 0xC5ED, 0x5F6D, + 0xC5EE, 0x84EC, 0xC5EF, 0x68DA, 0xC5F0, 0x787C, 0xC5F1, 0x7BF7, + 0xC5F2, 0x81A8, 0xC5F3, 0x670B, 0xC5F4, 0x9E4F, 0xC5F5, 0x6367, + 0xC5F6, 0x78B0, 0xC5F7, 0x576F, 0xC5F8, 0x7812, 0xC5F9, 0x9739, + 0xC5FA, 0x6279, 0xC5FB, 0x62AB, 0xC5FC, 0x5288, 0xC5FD, 0x7435, + 0xC5FE, 0x6BD7, 0xC640, 0x826A, 0xC641, 0x826B, 0xC642, 0x826C, + 0xC643, 0x826D, 0xC644, 0x8271, 0xC645, 0x8275, 0xC646, 0x8276, + 0xC647, 0x8277, 0xC648, 0x8278, 0xC649, 0x827B, 0xC64A, 0x827C, + 0xC64B, 0x8280, 0xC64C, 0x8281, 0xC64D, 0x8283, 0xC64E, 0x8285, + 0xC64F, 0x8286, 0xC650, 0x8287, 0xC651, 0x8289, 0xC652, 0x828C, + 0xC653, 0x8290, 0xC654, 0x8293, 0xC655, 0x8294, 0xC656, 0x8295, + 0xC657, 0x8296, 0xC658, 0x829A, 0xC659, 0x829B, 0xC65A, 0x829E, + 0xC65B, 0x82A0, 0xC65C, 0x82A2, 0xC65D, 0x82A3, 0xC65E, 0x82A7, + 0xC65F, 0x82B2, 0xC660, 0x82B5, 0xC661, 0x82B6, 0xC662, 0x82BA, + 0xC663, 0x82BB, 0xC664, 0x82BC, 0xC665, 0x82BF, 0xC666, 0x82C0, + 0xC667, 0x82C2, 0xC668, 0x82C3, 0xC669, 0x82C5, 0xC66A, 0x82C6, + 0xC66B, 0x82C9, 0xC66C, 0x82D0, 0xC66D, 0x82D6, 0xC66E, 0x82D9, + 0xC66F, 0x82DA, 0xC670, 0x82DD, 0xC671, 0x82E2, 0xC672, 0x82E7, + 0xC673, 0x82E8, 0xC674, 0x82E9, 0xC675, 0x82EA, 0xC676, 0x82EC, + 0xC677, 0x82ED, 0xC678, 0x82EE, 0xC679, 0x82F0, 0xC67A, 0x82F2, + 0xC67B, 0x82F3, 0xC67C, 0x82F5, 0xC67D, 0x82F6, 0xC67E, 0x82F8, + 0xC680, 0x82FA, 0xC681, 0x82FC, 0xC682, 0x82FD, 0xC683, 0x82FE, + 0xC684, 0x82FF, 0xC685, 0x8300, 0xC686, 0x830A, 0xC687, 0x830B, + 0xC688, 0x830D, 0xC689, 0x8310, 0xC68A, 0x8312, 0xC68B, 0x8313, + 0xC68C, 0x8316, 0xC68D, 0x8318, 0xC68E, 0x8319, 0xC68F, 0x831D, + 0xC690, 0x831E, 0xC691, 0x831F, 0xC692, 0x8320, 0xC693, 0x8321, + 0xC694, 0x8322, 0xC695, 0x8323, 0xC696, 0x8324, 0xC697, 0x8325, + 0xC698, 0x8326, 0xC699, 0x8329, 0xC69A, 0x832A, 0xC69B, 0x832E, + 0xC69C, 0x8330, 0xC69D, 0x8332, 0xC69E, 0x8337, 0xC69F, 0x833B, + 0xC6A0, 0x833D, 0xC6A1, 0x5564, 0xC6A2, 0x813E, 0xC6A3, 0x75B2, + 0xC6A4, 0x76AE, 0xC6A5, 0x5339, 0xC6A6, 0x75DE, 0xC6A7, 0x50FB, + 0xC6A8, 0x5C41, 0xC6A9, 0x8B6C, 0xC6AA, 0x7BC7, 0xC6AB, 0x504F, + 0xC6AC, 0x7247, 0xC6AD, 0x9A97, 0xC6AE, 0x98D8, 0xC6AF, 0x6F02, + 0xC6B0, 0x74E2, 0xC6B1, 0x7968, 0xC6B2, 0x6487, 0xC6B3, 0x77A5, + 0xC6B4, 0x62FC, 0xC6B5, 0x9891, 0xC6B6, 0x8D2B, 0xC6B7, 0x54C1, + 0xC6B8, 0x8058, 0xC6B9, 0x4E52, 0xC6BA, 0x576A, 0xC6BB, 0x82F9, + 0xC6BC, 0x840D, 0xC6BD, 0x5E73, 0xC6BE, 0x51ED, 0xC6BF, 0x74F6, + 0xC6C0, 0x8BC4, 0xC6C1, 0x5C4F, 0xC6C2, 0x5761, 0xC6C3, 0x6CFC, + 0xC6C4, 0x9887, 0xC6C5, 0x5A46, 0xC6C6, 0x7834, 0xC6C7, 0x9B44, + 0xC6C8, 0x8FEB, 0xC6C9, 0x7C95, 0xC6CA, 0x5256, 0xC6CB, 0x6251, + 0xC6CC, 0x94FA, 0xC6CD, 0x4EC6, 0xC6CE, 0x8386, 0xC6CF, 0x8461, + 0xC6D0, 0x83E9, 0xC6D1, 0x84B2, 0xC6D2, 0x57D4, 0xC6D3, 0x6734, + 0xC6D4, 0x5703, 0xC6D5, 0x666E, 0xC6D6, 0x6D66, 0xC6D7, 0x8C31, + 0xC6D8, 0x66DD, 0xC6D9, 0x7011, 0xC6DA, 0x671F, 0xC6DB, 0x6B3A, + 0xC6DC, 0x6816, 0xC6DD, 0x621A, 0xC6DE, 0x59BB, 0xC6DF, 0x4E03, + 0xC6E0, 0x51C4, 0xC6E1, 0x6F06, 0xC6E2, 0x67D2, 0xC6E3, 0x6C8F, + 0xC6E4, 0x5176, 0xC6E5, 0x68CB, 0xC6E6, 0x5947, 0xC6E7, 0x6B67, + 0xC6E8, 0x7566, 0xC6E9, 0x5D0E, 0xC6EA, 0x8110, 0xC6EB, 0x9F50, + 0xC6EC, 0x65D7, 0xC6ED, 0x7948, 0xC6EE, 0x7941, 0xC6EF, 0x9A91, + 0xC6F0, 0x8D77, 0xC6F1, 0x5C82, 0xC6F2, 0x4E5E, 0xC6F3, 0x4F01, + 0xC6F4, 0x542F, 0xC6F5, 0x5951, 0xC6F6, 0x780C, 0xC6F7, 0x5668, + 0xC6F8, 0x6C14, 0xC6F9, 0x8FC4, 0xC6FA, 0x5F03, 0xC6FB, 0x6C7D, + 0xC6FC, 0x6CE3, 0xC6FD, 0x8BAB, 0xC6FE, 0x6390, 0xC740, 0x833E, + 0xC741, 0x833F, 0xC742, 0x8341, 0xC743, 0x8342, 0xC744, 0x8344, + 0xC745, 0x8345, 0xC746, 0x8348, 0xC747, 0x834A, 0xC748, 0x834B, + 0xC749, 0x834C, 0xC74A, 0x834D, 0xC74B, 0x834E, 0xC74C, 0x8353, + 0xC74D, 0x8355, 0xC74E, 0x8356, 0xC74F, 0x8357, 0xC750, 0x8358, + 0xC751, 0x8359, 0xC752, 0x835D, 0xC753, 0x8362, 0xC754, 0x8370, + 0xC755, 0x8371, 0xC756, 0x8372, 0xC757, 0x8373, 0xC758, 0x8374, + 0xC759, 0x8375, 0xC75A, 0x8376, 0xC75B, 0x8379, 0xC75C, 0x837A, + 0xC75D, 0x837E, 0xC75E, 0x837F, 0xC75F, 0x8380, 0xC760, 0x8381, + 0xC761, 0x8382, 0xC762, 0x8383, 0xC763, 0x8384, 0xC764, 0x8387, + 0xC765, 0x8388, 0xC766, 0x838A, 0xC767, 0x838B, 0xC768, 0x838C, + 0xC769, 0x838D, 0xC76A, 0x838F, 0xC76B, 0x8390, 0xC76C, 0x8391, + 0xC76D, 0x8394, 0xC76E, 0x8395, 0xC76F, 0x8396, 0xC770, 0x8397, + 0xC771, 0x8399, 0xC772, 0x839A, 0xC773, 0x839D, 0xC774, 0x839F, + 0xC775, 0x83A1, 0xC776, 0x83A2, 0xC777, 0x83A3, 0xC778, 0x83A4, + 0xC779, 0x83A5, 0xC77A, 0x83A6, 0xC77B, 0x83A7, 0xC77C, 0x83AC, + 0xC77D, 0x83AD, 0xC77E, 0x83AE, 0xC780, 0x83AF, 0xC781, 0x83B5, + 0xC782, 0x83BB, 0xC783, 0x83BE, 0xC784, 0x83BF, 0xC785, 0x83C2, + 0xC786, 0x83C3, 0xC787, 0x83C4, 0xC788, 0x83C6, 0xC789, 0x83C8, + 0xC78A, 0x83C9, 0xC78B, 0x83CB, 0xC78C, 0x83CD, 0xC78D, 0x83CE, + 0xC78E, 0x83D0, 0xC78F, 0x83D1, 0xC790, 0x83D2, 0xC791, 0x83D3, + 0xC792, 0x83D5, 0xC793, 0x83D7, 0xC794, 0x83D9, 0xC795, 0x83DA, + 0xC796, 0x83DB, 0xC797, 0x83DE, 0xC798, 0x83E2, 0xC799, 0x83E3, + 0xC79A, 0x83E4, 0xC79B, 0x83E6, 0xC79C, 0x83E7, 0xC79D, 0x83E8, + 0xC79E, 0x83EB, 0xC79F, 0x83EC, 0xC7A0, 0x83ED, 0xC7A1, 0x6070, + 0xC7A2, 0x6D3D, 0xC7A3, 0x7275, 0xC7A4, 0x6266, 0xC7A5, 0x948E, + 0xC7A6, 0x94C5, 0xC7A7, 0x5343, 0xC7A8, 0x8FC1, 0xC7A9, 0x7B7E, + 0xC7AA, 0x4EDF, 0xC7AB, 0x8C26, 0xC7AC, 0x4E7E, 0xC7AD, 0x9ED4, + 0xC7AE, 0x94B1, 0xC7AF, 0x94B3, 0xC7B0, 0x524D, 0xC7B1, 0x6F5C, + 0xC7B2, 0x9063, 0xC7B3, 0x6D45, 0xC7B4, 0x8C34, 0xC7B5, 0x5811, + 0xC7B6, 0x5D4C, 0xC7B7, 0x6B20, 0xC7B8, 0x6B49, 0xC7B9, 0x67AA, + 0xC7BA, 0x545B, 0xC7BB, 0x8154, 0xC7BC, 0x7F8C, 0xC7BD, 0x5899, + 0xC7BE, 0x8537, 0xC7BF, 0x5F3A, 0xC7C0, 0x62A2, 0xC7C1, 0x6A47, + 0xC7C2, 0x9539, 0xC7C3, 0x6572, 0xC7C4, 0x6084, 0xC7C5, 0x6865, + 0xC7C6, 0x77A7, 0xC7C7, 0x4E54, 0xC7C8, 0x4FA8, 0xC7C9, 0x5DE7, + 0xC7CA, 0x9798, 0xC7CB, 0x64AC, 0xC7CC, 0x7FD8, 0xC7CD, 0x5CED, + 0xC7CE, 0x4FCF, 0xC7CF, 0x7A8D, 0xC7D0, 0x5207, 0xC7D1, 0x8304, + 0xC7D2, 0x4E14, 0xC7D3, 0x602F, 0xC7D4, 0x7A83, 0xC7D5, 0x94A6, + 0xC7D6, 0x4FB5, 0xC7D7, 0x4EB2, 0xC7D8, 0x79E6, 0xC7D9, 0x7434, + 0xC7DA, 0x52E4, 0xC7DB, 0x82B9, 0xC7DC, 0x64D2, 0xC7DD, 0x79BD, + 0xC7DE, 0x5BDD, 0xC7DF, 0x6C81, 0xC7E0, 0x9752, 0xC7E1, 0x8F7B, + 0xC7E2, 0x6C22, 0xC7E3, 0x503E, 0xC7E4, 0x537F, 0xC7E5, 0x6E05, + 0xC7E6, 0x64CE, 0xC7E7, 0x6674, 0xC7E8, 0x6C30, 0xC7E9, 0x60C5, + 0xC7EA, 0x9877, 0xC7EB, 0x8BF7, 0xC7EC, 0x5E86, 0xC7ED, 0x743C, + 0xC7EE, 0x7A77, 0xC7EF, 0x79CB, 0xC7F0, 0x4E18, 0xC7F1, 0x90B1, + 0xC7F2, 0x7403, 0xC7F3, 0x6C42, 0xC7F4, 0x56DA, 0xC7F5, 0x914B, + 0xC7F6, 0x6CC5, 0xC7F7, 0x8D8B, 0xC7F8, 0x533A, 0xC7F9, 0x86C6, + 0xC7FA, 0x66F2, 0xC7FB, 0x8EAF, 0xC7FC, 0x5C48, 0xC7FD, 0x9A71, + 0xC7FE, 0x6E20, 0xC840, 0x83EE, 0xC841, 0x83EF, 0xC842, 0x83F3, + 0xC843, 0x83F4, 0xC844, 0x83F5, 0xC845, 0x83F6, 0xC846, 0x83F7, + 0xC847, 0x83FA, 0xC848, 0x83FB, 0xC849, 0x83FC, 0xC84A, 0x83FE, + 0xC84B, 0x83FF, 0xC84C, 0x8400, 0xC84D, 0x8402, 0xC84E, 0x8405, + 0xC84F, 0x8407, 0xC850, 0x8408, 0xC851, 0x8409, 0xC852, 0x840A, + 0xC853, 0x8410, 0xC854, 0x8412, 0xC855, 0x8413, 0xC856, 0x8414, + 0xC857, 0x8415, 0xC858, 0x8416, 0xC859, 0x8417, 0xC85A, 0x8419, + 0xC85B, 0x841A, 0xC85C, 0x841B, 0xC85D, 0x841E, 0xC85E, 0x841F, + 0xC85F, 0x8420, 0xC860, 0x8421, 0xC861, 0x8422, 0xC862, 0x8423, + 0xC863, 0x8429, 0xC864, 0x842A, 0xC865, 0x842B, 0xC866, 0x842C, + 0xC867, 0x842D, 0xC868, 0x842E, 0xC869, 0x842F, 0xC86A, 0x8430, + 0xC86B, 0x8432, 0xC86C, 0x8433, 0xC86D, 0x8434, 0xC86E, 0x8435, + 0xC86F, 0x8436, 0xC870, 0x8437, 0xC871, 0x8439, 0xC872, 0x843A, + 0xC873, 0x843B, 0xC874, 0x843E, 0xC875, 0x843F, 0xC876, 0x8440, + 0xC877, 0x8441, 0xC878, 0x8442, 0xC879, 0x8443, 0xC87A, 0x8444, + 0xC87B, 0x8445, 0xC87C, 0x8447, 0xC87D, 0x8448, 0xC87E, 0x8449, + 0xC880, 0x844A, 0xC881, 0x844B, 0xC882, 0x844C, 0xC883, 0x844D, + 0xC884, 0x844E, 0xC885, 0x844F, 0xC886, 0x8450, 0xC887, 0x8452, + 0xC888, 0x8453, 0xC889, 0x8454, 0xC88A, 0x8455, 0xC88B, 0x8456, + 0xC88C, 0x8458, 0xC88D, 0x845D, 0xC88E, 0x845E, 0xC88F, 0x845F, + 0xC890, 0x8460, 0xC891, 0x8462, 0xC892, 0x8464, 0xC893, 0x8465, + 0xC894, 0x8466, 0xC895, 0x8467, 0xC896, 0x8468, 0xC897, 0x846A, + 0xC898, 0x846E, 0xC899, 0x846F, 0xC89A, 0x8470, 0xC89B, 0x8472, + 0xC89C, 0x8474, 0xC89D, 0x8477, 0xC89E, 0x8479, 0xC89F, 0x847B, + 0xC8A0, 0x847C, 0xC8A1, 0x53D6, 0xC8A2, 0x5A36, 0xC8A3, 0x9F8B, + 0xC8A4, 0x8DA3, 0xC8A5, 0x53BB, 0xC8A6, 0x5708, 0xC8A7, 0x98A7, + 0xC8A8, 0x6743, 0xC8A9, 0x919B, 0xC8AA, 0x6CC9, 0xC8AB, 0x5168, + 0xC8AC, 0x75CA, 0xC8AD, 0x62F3, 0xC8AE, 0x72AC, 0xC8AF, 0x5238, + 0xC8B0, 0x529D, 0xC8B1, 0x7F3A, 0xC8B2, 0x7094, 0xC8B3, 0x7638, + 0xC8B4, 0x5374, 0xC8B5, 0x9E4A, 0xC8B6, 0x69B7, 0xC8B7, 0x786E, + 0xC8B8, 0x96C0, 0xC8B9, 0x88D9, 0xC8BA, 0x7FA4, 0xC8BB, 0x7136, + 0xC8BC, 0x71C3, 0xC8BD, 0x5189, 0xC8BE, 0x67D3, 0xC8BF, 0x74E4, + 0xC8C0, 0x58E4, 0xC8C1, 0x6518, 0xC8C2, 0x56B7, 0xC8C3, 0x8BA9, + 0xC8C4, 0x9976, 0xC8C5, 0x6270, 0xC8C6, 0x7ED5, 0xC8C7, 0x60F9, + 0xC8C8, 0x70ED, 0xC8C9, 0x58EC, 0xC8CA, 0x4EC1, 0xC8CB, 0x4EBA, + 0xC8CC, 0x5FCD, 0xC8CD, 0x97E7, 0xC8CE, 0x4EFB, 0xC8CF, 0x8BA4, + 0xC8D0, 0x5203, 0xC8D1, 0x598A, 0xC8D2, 0x7EAB, 0xC8D3, 0x6254, + 0xC8D4, 0x4ECD, 0xC8D5, 0x65E5, 0xC8D6, 0x620E, 0xC8D7, 0x8338, + 0xC8D8, 0x84C9, 0xC8D9, 0x8363, 0xC8DA, 0x878D, 0xC8DB, 0x7194, + 0xC8DC, 0x6EB6, 0xC8DD, 0x5BB9, 0xC8DE, 0x7ED2, 0xC8DF, 0x5197, + 0xC8E0, 0x63C9, 0xC8E1, 0x67D4, 0xC8E2, 0x8089, 0xC8E3, 0x8339, + 0xC8E4, 0x8815, 0xC8E5, 0x5112, 0xC8E6, 0x5B7A, 0xC8E7, 0x5982, + 0xC8E8, 0x8FB1, 0xC8E9, 0x4E73, 0xC8EA, 0x6C5D, 0xC8EB, 0x5165, + 0xC8EC, 0x8925, 0xC8ED, 0x8F6F, 0xC8EE, 0x962E, 0xC8EF, 0x854A, + 0xC8F0, 0x745E, 0xC8F1, 0x9510, 0xC8F2, 0x95F0, 0xC8F3, 0x6DA6, + 0xC8F4, 0x82E5, 0xC8F5, 0x5F31, 0xC8F6, 0x6492, 0xC8F7, 0x6D12, + 0xC8F8, 0x8428, 0xC8F9, 0x816E, 0xC8FA, 0x9CC3, 0xC8FB, 0x585E, + 0xC8FC, 0x8D5B, 0xC8FD, 0x4E09, 0xC8FE, 0x53C1, 0xC940, 0x847D, + 0xC941, 0x847E, 0xC942, 0x847F, 0xC943, 0x8480, 0xC944, 0x8481, + 0xC945, 0x8483, 0xC946, 0x8484, 0xC947, 0x8485, 0xC948, 0x8486, + 0xC949, 0x848A, 0xC94A, 0x848D, 0xC94B, 0x848F, 0xC94C, 0x8490, + 0xC94D, 0x8491, 0xC94E, 0x8492, 0xC94F, 0x8493, 0xC950, 0x8494, + 0xC951, 0x8495, 0xC952, 0x8496, 0xC953, 0x8498, 0xC954, 0x849A, + 0xC955, 0x849B, 0xC956, 0x849D, 0xC957, 0x849E, 0xC958, 0x849F, + 0xC959, 0x84A0, 0xC95A, 0x84A2, 0xC95B, 0x84A3, 0xC95C, 0x84A4, + 0xC95D, 0x84A5, 0xC95E, 0x84A6, 0xC95F, 0x84A7, 0xC960, 0x84A8, + 0xC961, 0x84A9, 0xC962, 0x84AA, 0xC963, 0x84AB, 0xC964, 0x84AC, + 0xC965, 0x84AD, 0xC966, 0x84AE, 0xC967, 0x84B0, 0xC968, 0x84B1, + 0xC969, 0x84B3, 0xC96A, 0x84B5, 0xC96B, 0x84B6, 0xC96C, 0x84B7, + 0xC96D, 0x84BB, 0xC96E, 0x84BC, 0xC96F, 0x84BE, 0xC970, 0x84C0, + 0xC971, 0x84C2, 0xC972, 0x84C3, 0xC973, 0x84C5, 0xC974, 0x84C6, + 0xC975, 0x84C7, 0xC976, 0x84C8, 0xC977, 0x84CB, 0xC978, 0x84CC, + 0xC979, 0x84CE, 0xC97A, 0x84CF, 0xC97B, 0x84D2, 0xC97C, 0x84D4, + 0xC97D, 0x84D5, 0xC97E, 0x84D7, 0xC980, 0x84D8, 0xC981, 0x84D9, + 0xC982, 0x84DA, 0xC983, 0x84DB, 0xC984, 0x84DC, 0xC985, 0x84DE, + 0xC986, 0x84E1, 0xC987, 0x84E2, 0xC988, 0x84E4, 0xC989, 0x84E7, + 0xC98A, 0x84E8, 0xC98B, 0x84E9, 0xC98C, 0x84EA, 0xC98D, 0x84EB, + 0xC98E, 0x84ED, 0xC98F, 0x84EE, 0xC990, 0x84EF, 0xC991, 0x84F1, + 0xC992, 0x84F2, 0xC993, 0x84F3, 0xC994, 0x84F4, 0xC995, 0x84F5, + 0xC996, 0x84F6, 0xC997, 0x84F7, 0xC998, 0x84F8, 0xC999, 0x84F9, + 0xC99A, 0x84FA, 0xC99B, 0x84FB, 0xC99C, 0x84FD, 0xC99D, 0x84FE, + 0xC99E, 0x8500, 0xC99F, 0x8501, 0xC9A0, 0x8502, 0xC9A1, 0x4F1E, + 0xC9A2, 0x6563, 0xC9A3, 0x6851, 0xC9A4, 0x55D3, 0xC9A5, 0x4E27, + 0xC9A6, 0x6414, 0xC9A7, 0x9A9A, 0xC9A8, 0x626B, 0xC9A9, 0x5AC2, + 0xC9AA, 0x745F, 0xC9AB, 0x8272, 0xC9AC, 0x6DA9, 0xC9AD, 0x68EE, + 0xC9AE, 0x50E7, 0xC9AF, 0x838E, 0xC9B0, 0x7802, 0xC9B1, 0x6740, + 0xC9B2, 0x5239, 0xC9B3, 0x6C99, 0xC9B4, 0x7EB1, 0xC9B5, 0x50BB, + 0xC9B6, 0x5565, 0xC9B7, 0x715E, 0xC9B8, 0x7B5B, 0xC9B9, 0x6652, + 0xC9BA, 0x73CA, 0xC9BB, 0x82EB, 0xC9BC, 0x6749, 0xC9BD, 0x5C71, + 0xC9BE, 0x5220, 0xC9BF, 0x717D, 0xC9C0, 0x886B, 0xC9C1, 0x95EA, + 0xC9C2, 0x9655, 0xC9C3, 0x64C5, 0xC9C4, 0x8D61, 0xC9C5, 0x81B3, + 0xC9C6, 0x5584, 0xC9C7, 0x6C55, 0xC9C8, 0x6247, 0xC9C9, 0x7F2E, + 0xC9CA, 0x5892, 0xC9CB, 0x4F24, 0xC9CC, 0x5546, 0xC9CD, 0x8D4F, + 0xC9CE, 0x664C, 0xC9CF, 0x4E0A, 0xC9D0, 0x5C1A, 0xC9D1, 0x88F3, + 0xC9D2, 0x68A2, 0xC9D3, 0x634E, 0xC9D4, 0x7A0D, 0xC9D5, 0x70E7, + 0xC9D6, 0x828D, 0xC9D7, 0x52FA, 0xC9D8, 0x97F6, 0xC9D9, 0x5C11, + 0xC9DA, 0x54E8, 0xC9DB, 0x90B5, 0xC9DC, 0x7ECD, 0xC9DD, 0x5962, + 0xC9DE, 0x8D4A, 0xC9DF, 0x86C7, 0xC9E0, 0x820C, 0xC9E1, 0x820D, + 0xC9E2, 0x8D66, 0xC9E3, 0x6444, 0xC9E4, 0x5C04, 0xC9E5, 0x6151, + 0xC9E6, 0x6D89, 0xC9E7, 0x793E, 0xC9E8, 0x8BBE, 0xC9E9, 0x7837, + 0xC9EA, 0x7533, 0xC9EB, 0x547B, 0xC9EC, 0x4F38, 0xC9ED, 0x8EAB, + 0xC9EE, 0x6DF1, 0xC9EF, 0x5A20, 0xC9F0, 0x7EC5, 0xC9F1, 0x795E, + 0xC9F2, 0x6C88, 0xC9F3, 0x5BA1, 0xC9F4, 0x5A76, 0xC9F5, 0x751A, + 0xC9F6, 0x80BE, 0xC9F7, 0x614E, 0xC9F8, 0x6E17, 0xC9F9, 0x58F0, + 0xC9FA, 0x751F, 0xC9FB, 0x7525, 0xC9FC, 0x7272, 0xC9FD, 0x5347, + 0xC9FE, 0x7EF3, 0xCA40, 0x8503, 0xCA41, 0x8504, 0xCA42, 0x8505, + 0xCA43, 0x8506, 0xCA44, 0x8507, 0xCA45, 0x8508, 0xCA46, 0x8509, + 0xCA47, 0x850A, 0xCA48, 0x850B, 0xCA49, 0x850D, 0xCA4A, 0x850E, + 0xCA4B, 0x850F, 0xCA4C, 0x8510, 0xCA4D, 0x8512, 0xCA4E, 0x8514, + 0xCA4F, 0x8515, 0xCA50, 0x8516, 0xCA51, 0x8518, 0xCA52, 0x8519, + 0xCA53, 0x851B, 0xCA54, 0x851C, 0xCA55, 0x851D, 0xCA56, 0x851E, + 0xCA57, 0x8520, 0xCA58, 0x8522, 0xCA59, 0x8523, 0xCA5A, 0x8524, + 0xCA5B, 0x8525, 0xCA5C, 0x8526, 0xCA5D, 0x8527, 0xCA5E, 0x8528, + 0xCA5F, 0x8529, 0xCA60, 0x852A, 0xCA61, 0x852D, 0xCA62, 0x852E, + 0xCA63, 0x852F, 0xCA64, 0x8530, 0xCA65, 0x8531, 0xCA66, 0x8532, + 0xCA67, 0x8533, 0xCA68, 0x8534, 0xCA69, 0x8535, 0xCA6A, 0x8536, + 0xCA6B, 0x853E, 0xCA6C, 0x853F, 0xCA6D, 0x8540, 0xCA6E, 0x8541, + 0xCA6F, 0x8542, 0xCA70, 0x8544, 0xCA71, 0x8545, 0xCA72, 0x8546, + 0xCA73, 0x8547, 0xCA74, 0x854B, 0xCA75, 0x854C, 0xCA76, 0x854D, + 0xCA77, 0x854E, 0xCA78, 0x854F, 0xCA79, 0x8550, 0xCA7A, 0x8551, + 0xCA7B, 0x8552, 0xCA7C, 0x8553, 0xCA7D, 0x8554, 0xCA7E, 0x8555, + 0xCA80, 0x8557, 0xCA81, 0x8558, 0xCA82, 0x855A, 0xCA83, 0x855B, + 0xCA84, 0x855C, 0xCA85, 0x855D, 0xCA86, 0x855F, 0xCA87, 0x8560, + 0xCA88, 0x8561, 0xCA89, 0x8562, 0xCA8A, 0x8563, 0xCA8B, 0x8565, + 0xCA8C, 0x8566, 0xCA8D, 0x8567, 0xCA8E, 0x8569, 0xCA8F, 0x856A, + 0xCA90, 0x856B, 0xCA91, 0x856C, 0xCA92, 0x856D, 0xCA93, 0x856E, + 0xCA94, 0x856F, 0xCA95, 0x8570, 0xCA96, 0x8571, 0xCA97, 0x8573, + 0xCA98, 0x8575, 0xCA99, 0x8576, 0xCA9A, 0x8577, 0xCA9B, 0x8578, + 0xCA9C, 0x857C, 0xCA9D, 0x857D, 0xCA9E, 0x857F, 0xCA9F, 0x8580, + 0xCAA0, 0x8581, 0xCAA1, 0x7701, 0xCAA2, 0x76DB, 0xCAA3, 0x5269, + 0xCAA4, 0x80DC, 0xCAA5, 0x5723, 0xCAA6, 0x5E08, 0xCAA7, 0x5931, + 0xCAA8, 0x72EE, 0xCAA9, 0x65BD, 0xCAAA, 0x6E7F, 0xCAAB, 0x8BD7, + 0xCAAC, 0x5C38, 0xCAAD, 0x8671, 0xCAAE, 0x5341, 0xCAAF, 0x77F3, + 0xCAB0, 0x62FE, 0xCAB1, 0x65F6, 0xCAB2, 0x4EC0, 0xCAB3, 0x98DF, + 0xCAB4, 0x8680, 0xCAB5, 0x5B9E, 0xCAB6, 0x8BC6, 0xCAB7, 0x53F2, + 0xCAB8, 0x77E2, 0xCAB9, 0x4F7F, 0xCABA, 0x5C4E, 0xCABB, 0x9A76, + 0xCABC, 0x59CB, 0xCABD, 0x5F0F, 0xCABE, 0x793A, 0xCABF, 0x58EB, + 0xCAC0, 0x4E16, 0xCAC1, 0x67FF, 0xCAC2, 0x4E8B, 0xCAC3, 0x62ED, + 0xCAC4, 0x8A93, 0xCAC5, 0x901D, 0xCAC6, 0x52BF, 0xCAC7, 0x662F, + 0xCAC8, 0x55DC, 0xCAC9, 0x566C, 0xCACA, 0x9002, 0xCACB, 0x4ED5, + 0xCACC, 0x4F8D, 0xCACD, 0x91CA, 0xCACE, 0x9970, 0xCACF, 0x6C0F, + 0xCAD0, 0x5E02, 0xCAD1, 0x6043, 0xCAD2, 0x5BA4, 0xCAD3, 0x89C6, + 0xCAD4, 0x8BD5, 0xCAD5, 0x6536, 0xCAD6, 0x624B, 0xCAD7, 0x9996, + 0xCAD8, 0x5B88, 0xCAD9, 0x5BFF, 0xCADA, 0x6388, 0xCADB, 0x552E, + 0xCADC, 0x53D7, 0xCADD, 0x7626, 0xCADE, 0x517D, 0xCADF, 0x852C, + 0xCAE0, 0x67A2, 0xCAE1, 0x68B3, 0xCAE2, 0x6B8A, 0xCAE3, 0x6292, + 0xCAE4, 0x8F93, 0xCAE5, 0x53D4, 0xCAE6, 0x8212, 0xCAE7, 0x6DD1, + 0xCAE8, 0x758F, 0xCAE9, 0x4E66, 0xCAEA, 0x8D4E, 0xCAEB, 0x5B70, + 0xCAEC, 0x719F, 0xCAED, 0x85AF, 0xCAEE, 0x6691, 0xCAEF, 0x66D9, + 0xCAF0, 0x7F72, 0xCAF1, 0x8700, 0xCAF2, 0x9ECD, 0xCAF3, 0x9F20, + 0xCAF4, 0x5C5E, 0xCAF5, 0x672F, 0xCAF6, 0x8FF0, 0xCAF7, 0x6811, + 0xCAF8, 0x675F, 0xCAF9, 0x620D, 0xCAFA, 0x7AD6, 0xCAFB, 0x5885, + 0xCAFC, 0x5EB6, 0xCAFD, 0x6570, 0xCAFE, 0x6F31, 0xCB40, 0x8582, + 0xCB41, 0x8583, 0xCB42, 0x8586, 0xCB43, 0x8588, 0xCB44, 0x8589, + 0xCB45, 0x858A, 0xCB46, 0x858B, 0xCB47, 0x858C, 0xCB48, 0x858D, + 0xCB49, 0x858E, 0xCB4A, 0x8590, 0xCB4B, 0x8591, 0xCB4C, 0x8592, + 0xCB4D, 0x8593, 0xCB4E, 0x8594, 0xCB4F, 0x8595, 0xCB50, 0x8596, + 0xCB51, 0x8597, 0xCB52, 0x8598, 0xCB53, 0x8599, 0xCB54, 0x859A, + 0xCB55, 0x859D, 0xCB56, 0x859E, 0xCB57, 0x859F, 0xCB58, 0x85A0, + 0xCB59, 0x85A1, 0xCB5A, 0x85A2, 0xCB5B, 0x85A3, 0xCB5C, 0x85A5, + 0xCB5D, 0x85A6, 0xCB5E, 0x85A7, 0xCB5F, 0x85A9, 0xCB60, 0x85AB, + 0xCB61, 0x85AC, 0xCB62, 0x85AD, 0xCB63, 0x85B1, 0xCB64, 0x85B2, + 0xCB65, 0x85B3, 0xCB66, 0x85B4, 0xCB67, 0x85B5, 0xCB68, 0x85B6, + 0xCB69, 0x85B8, 0xCB6A, 0x85BA, 0xCB6B, 0x85BB, 0xCB6C, 0x85BC, + 0xCB6D, 0x85BD, 0xCB6E, 0x85BE, 0xCB6F, 0x85BF, 0xCB70, 0x85C0, + 0xCB71, 0x85C2, 0xCB72, 0x85C3, 0xCB73, 0x85C4, 0xCB74, 0x85C5, + 0xCB75, 0x85C6, 0xCB76, 0x85C7, 0xCB77, 0x85C8, 0xCB78, 0x85CA, + 0xCB79, 0x85CB, 0xCB7A, 0x85CC, 0xCB7B, 0x85CD, 0xCB7C, 0x85CE, + 0xCB7D, 0x85D1, 0xCB7E, 0x85D2, 0xCB80, 0x85D4, 0xCB81, 0x85D6, + 0xCB82, 0x85D7, 0xCB83, 0x85D8, 0xCB84, 0x85D9, 0xCB85, 0x85DA, + 0xCB86, 0x85DB, 0xCB87, 0x85DD, 0xCB88, 0x85DE, 0xCB89, 0x85DF, + 0xCB8A, 0x85E0, 0xCB8B, 0x85E1, 0xCB8C, 0x85E2, 0xCB8D, 0x85E3, + 0xCB8E, 0x85E5, 0xCB8F, 0x85E6, 0xCB90, 0x85E7, 0xCB91, 0x85E8, + 0xCB92, 0x85EA, 0xCB93, 0x85EB, 0xCB94, 0x85EC, 0xCB95, 0x85ED, + 0xCB96, 0x85EE, 0xCB97, 0x85EF, 0xCB98, 0x85F0, 0xCB99, 0x85F1, + 0xCB9A, 0x85F2, 0xCB9B, 0x85F3, 0xCB9C, 0x85F4, 0xCB9D, 0x85F5, + 0xCB9E, 0x85F6, 0xCB9F, 0x85F7, 0xCBA0, 0x85F8, 0xCBA1, 0x6055, + 0xCBA2, 0x5237, 0xCBA3, 0x800D, 0xCBA4, 0x6454, 0xCBA5, 0x8870, + 0xCBA6, 0x7529, 0xCBA7, 0x5E05, 0xCBA8, 0x6813, 0xCBA9, 0x62F4, + 0xCBAA, 0x971C, 0xCBAB, 0x53CC, 0xCBAC, 0x723D, 0xCBAD, 0x8C01, + 0xCBAE, 0x6C34, 0xCBAF, 0x7761, 0xCBB0, 0x7A0E, 0xCBB1, 0x542E, + 0xCBB2, 0x77AC, 0xCBB3, 0x987A, 0xCBB4, 0x821C, 0xCBB5, 0x8BF4, + 0xCBB6, 0x7855, 0xCBB7, 0x6714, 0xCBB8, 0x70C1, 0xCBB9, 0x65AF, + 0xCBBA, 0x6495, 0xCBBB, 0x5636, 0xCBBC, 0x601D, 0xCBBD, 0x79C1, + 0xCBBE, 0x53F8, 0xCBBF, 0x4E1D, 0xCBC0, 0x6B7B, 0xCBC1, 0x8086, + 0xCBC2, 0x5BFA, 0xCBC3, 0x55E3, 0xCBC4, 0x56DB, 0xCBC5, 0x4F3A, + 0xCBC6, 0x4F3C, 0xCBC7, 0x9972, 0xCBC8, 0x5DF3, 0xCBC9, 0x677E, + 0xCBCA, 0x8038, 0xCBCB, 0x6002, 0xCBCC, 0x9882, 0xCBCD, 0x9001, + 0xCBCE, 0x5B8B, 0xCBCF, 0x8BBC, 0xCBD0, 0x8BF5, 0xCBD1, 0x641C, + 0xCBD2, 0x8258, 0xCBD3, 0x64DE, 0xCBD4, 0x55FD, 0xCBD5, 0x82CF, + 0xCBD6, 0x9165, 0xCBD7, 0x4FD7, 0xCBD8, 0x7D20, 0xCBD9, 0x901F, + 0xCBDA, 0x7C9F, 0xCBDB, 0x50F3, 0xCBDC, 0x5851, 0xCBDD, 0x6EAF, + 0xCBDE, 0x5BBF, 0xCBDF, 0x8BC9, 0xCBE0, 0x8083, 0xCBE1, 0x9178, + 0xCBE2, 0x849C, 0xCBE3, 0x7B97, 0xCBE4, 0x867D, 0xCBE5, 0x968B, + 0xCBE6, 0x968F, 0xCBE7, 0x7EE5, 0xCBE8, 0x9AD3, 0xCBE9, 0x788E, + 0xCBEA, 0x5C81, 0xCBEB, 0x7A57, 0xCBEC, 0x9042, 0xCBED, 0x96A7, + 0xCBEE, 0x795F, 0xCBEF, 0x5B59, 0xCBF0, 0x635F, 0xCBF1, 0x7B0B, + 0xCBF2, 0x84D1, 0xCBF3, 0x68AD, 0xCBF4, 0x5506, 0xCBF5, 0x7F29, + 0xCBF6, 0x7410, 0xCBF7, 0x7D22, 0xCBF8, 0x9501, 0xCBF9, 0x6240, + 0xCBFA, 0x584C, 0xCBFB, 0x4ED6, 0xCBFC, 0x5B83, 0xCBFD, 0x5979, + 0xCBFE, 0x5854, 0xCC40, 0x85F9, 0xCC41, 0x85FA, 0xCC42, 0x85FC, + 0xCC43, 0x85FD, 0xCC44, 0x85FE, 0xCC45, 0x8600, 0xCC46, 0x8601, + 0xCC47, 0x8602, 0xCC48, 0x8603, 0xCC49, 0x8604, 0xCC4A, 0x8606, + 0xCC4B, 0x8607, 0xCC4C, 0x8608, 0xCC4D, 0x8609, 0xCC4E, 0x860A, + 0xCC4F, 0x860B, 0xCC50, 0x860C, 0xCC51, 0x860D, 0xCC52, 0x860E, + 0xCC53, 0x860F, 0xCC54, 0x8610, 0xCC55, 0x8612, 0xCC56, 0x8613, + 0xCC57, 0x8614, 0xCC58, 0x8615, 0xCC59, 0x8617, 0xCC5A, 0x8618, + 0xCC5B, 0x8619, 0xCC5C, 0x861A, 0xCC5D, 0x861B, 0xCC5E, 0x861C, + 0xCC5F, 0x861D, 0xCC60, 0x861E, 0xCC61, 0x861F, 0xCC62, 0x8620, + 0xCC63, 0x8621, 0xCC64, 0x8622, 0xCC65, 0x8623, 0xCC66, 0x8624, + 0xCC67, 0x8625, 0xCC68, 0x8626, 0xCC69, 0x8628, 0xCC6A, 0x862A, + 0xCC6B, 0x862B, 0xCC6C, 0x862C, 0xCC6D, 0x862D, 0xCC6E, 0x862E, + 0xCC6F, 0x862F, 0xCC70, 0x8630, 0xCC71, 0x8631, 0xCC72, 0x8632, + 0xCC73, 0x8633, 0xCC74, 0x8634, 0xCC75, 0x8635, 0xCC76, 0x8636, + 0xCC77, 0x8637, 0xCC78, 0x8639, 0xCC79, 0x863A, 0xCC7A, 0x863B, + 0xCC7B, 0x863D, 0xCC7C, 0x863E, 0xCC7D, 0x863F, 0xCC7E, 0x8640, + 0xCC80, 0x8641, 0xCC81, 0x8642, 0xCC82, 0x8643, 0xCC83, 0x8644, + 0xCC84, 0x8645, 0xCC85, 0x8646, 0xCC86, 0x8647, 0xCC87, 0x8648, + 0xCC88, 0x8649, 0xCC89, 0x864A, 0xCC8A, 0x864B, 0xCC8B, 0x864C, + 0xCC8C, 0x8652, 0xCC8D, 0x8653, 0xCC8E, 0x8655, 0xCC8F, 0x8656, + 0xCC90, 0x8657, 0xCC91, 0x8658, 0xCC92, 0x8659, 0xCC93, 0x865B, + 0xCC94, 0x865C, 0xCC95, 0x865D, 0xCC96, 0x865F, 0xCC97, 0x8660, + 0xCC98, 0x8661, 0xCC99, 0x8663, 0xCC9A, 0x8664, 0xCC9B, 0x8665, + 0xCC9C, 0x8666, 0xCC9D, 0x8667, 0xCC9E, 0x8668, 0xCC9F, 0x8669, + 0xCCA0, 0x866A, 0xCCA1, 0x736D, 0xCCA2, 0x631E, 0xCCA3, 0x8E4B, + 0xCCA4, 0x8E0F, 0xCCA5, 0x80CE, 0xCCA6, 0x82D4, 0xCCA7, 0x62AC, + 0xCCA8, 0x53F0, 0xCCA9, 0x6CF0, 0xCCAA, 0x915E, 0xCCAB, 0x592A, + 0xCCAC, 0x6001, 0xCCAD, 0x6C70, 0xCCAE, 0x574D, 0xCCAF, 0x644A, + 0xCCB0, 0x8D2A, 0xCCB1, 0x762B, 0xCCB2, 0x6EE9, 0xCCB3, 0x575B, + 0xCCB4, 0x6A80, 0xCCB5, 0x75F0, 0xCCB6, 0x6F6D, 0xCCB7, 0x8C2D, + 0xCCB8, 0x8C08, 0xCCB9, 0x5766, 0xCCBA, 0x6BEF, 0xCCBB, 0x8892, + 0xCCBC, 0x78B3, 0xCCBD, 0x63A2, 0xCCBE, 0x53F9, 0xCCBF, 0x70AD, + 0xCCC0, 0x6C64, 0xCCC1, 0x5858, 0xCCC2, 0x642A, 0xCCC3, 0x5802, + 0xCCC4, 0x68E0, 0xCCC5, 0x819B, 0xCCC6, 0x5510, 0xCCC7, 0x7CD6, + 0xCCC8, 0x5018, 0xCCC9, 0x8EBA, 0xCCCA, 0x6DCC, 0xCCCB, 0x8D9F, + 0xCCCC, 0x70EB, 0xCCCD, 0x638F, 0xCCCE, 0x6D9B, 0xCCCF, 0x6ED4, + 0xCCD0, 0x7EE6, 0xCCD1, 0x8404, 0xCCD2, 0x6843, 0xCCD3, 0x9003, + 0xCCD4, 0x6DD8, 0xCCD5, 0x9676, 0xCCD6, 0x8BA8, 0xCCD7, 0x5957, + 0xCCD8, 0x7279, 0xCCD9, 0x85E4, 0xCCDA, 0x817E, 0xCCDB, 0x75BC, + 0xCCDC, 0x8A8A, 0xCCDD, 0x68AF, 0xCCDE, 0x5254, 0xCCDF, 0x8E22, + 0xCCE0, 0x9511, 0xCCE1, 0x63D0, 0xCCE2, 0x9898, 0xCCE3, 0x8E44, + 0xCCE4, 0x557C, 0xCCE5, 0x4F53, 0xCCE6, 0x66FF, 0xCCE7, 0x568F, + 0xCCE8, 0x60D5, 0xCCE9, 0x6D95, 0xCCEA, 0x5243, 0xCCEB, 0x5C49, + 0xCCEC, 0x5929, 0xCCED, 0x6DFB, 0xCCEE, 0x586B, 0xCCEF, 0x7530, + 0xCCF0, 0x751C, 0xCCF1, 0x606C, 0xCCF2, 0x8214, 0xCCF3, 0x8146, + 0xCCF4, 0x6311, 0xCCF5, 0x6761, 0xCCF6, 0x8FE2, 0xCCF7, 0x773A, + 0xCCF8, 0x8DF3, 0xCCF9, 0x8D34, 0xCCFA, 0x94C1, 0xCCFB, 0x5E16, + 0xCCFC, 0x5385, 0xCCFD, 0x542C, 0xCCFE, 0x70C3, 0xCD40, 0x866D, + 0xCD41, 0x866F, 0xCD42, 0x8670, 0xCD43, 0x8672, 0xCD44, 0x8673, + 0xCD45, 0x8674, 0xCD46, 0x8675, 0xCD47, 0x8676, 0xCD48, 0x8677, + 0xCD49, 0x8678, 0xCD4A, 0x8683, 0xCD4B, 0x8684, 0xCD4C, 0x8685, + 0xCD4D, 0x8686, 0xCD4E, 0x8687, 0xCD4F, 0x8688, 0xCD50, 0x8689, + 0xCD51, 0x868E, 0xCD52, 0x868F, 0xCD53, 0x8690, 0xCD54, 0x8691, + 0xCD55, 0x8692, 0xCD56, 0x8694, 0xCD57, 0x8696, 0xCD58, 0x8697, + 0xCD59, 0x8698, 0xCD5A, 0x8699, 0xCD5B, 0x869A, 0xCD5C, 0x869B, + 0xCD5D, 0x869E, 0xCD5E, 0x869F, 0xCD5F, 0x86A0, 0xCD60, 0x86A1, + 0xCD61, 0x86A2, 0xCD62, 0x86A5, 0xCD63, 0x86A6, 0xCD64, 0x86AB, + 0xCD65, 0x86AD, 0xCD66, 0x86AE, 0xCD67, 0x86B2, 0xCD68, 0x86B3, + 0xCD69, 0x86B7, 0xCD6A, 0x86B8, 0xCD6B, 0x86B9, 0xCD6C, 0x86BB, + 0xCD6D, 0x86BC, 0xCD6E, 0x86BD, 0xCD6F, 0x86BE, 0xCD70, 0x86BF, + 0xCD71, 0x86C1, 0xCD72, 0x86C2, 0xCD73, 0x86C3, 0xCD74, 0x86C5, + 0xCD75, 0x86C8, 0xCD76, 0x86CC, 0xCD77, 0x86CD, 0xCD78, 0x86D2, + 0xCD79, 0x86D3, 0xCD7A, 0x86D5, 0xCD7B, 0x86D6, 0xCD7C, 0x86D7, + 0xCD7D, 0x86DA, 0xCD7E, 0x86DC, 0xCD80, 0x86DD, 0xCD81, 0x86E0, + 0xCD82, 0x86E1, 0xCD83, 0x86E2, 0xCD84, 0x86E3, 0xCD85, 0x86E5, + 0xCD86, 0x86E6, 0xCD87, 0x86E7, 0xCD88, 0x86E8, 0xCD89, 0x86EA, + 0xCD8A, 0x86EB, 0xCD8B, 0x86EC, 0xCD8C, 0x86EF, 0xCD8D, 0x86F5, + 0xCD8E, 0x86F6, 0xCD8F, 0x86F7, 0xCD90, 0x86FA, 0xCD91, 0x86FB, + 0xCD92, 0x86FC, 0xCD93, 0x86FD, 0xCD94, 0x86FF, 0xCD95, 0x8701, + 0xCD96, 0x8704, 0xCD97, 0x8705, 0xCD98, 0x8706, 0xCD99, 0x870B, + 0xCD9A, 0x870C, 0xCD9B, 0x870E, 0xCD9C, 0x870F, 0xCD9D, 0x8710, + 0xCD9E, 0x8711, 0xCD9F, 0x8714, 0xCDA0, 0x8716, 0xCDA1, 0x6C40, + 0xCDA2, 0x5EF7, 0xCDA3, 0x505C, 0xCDA4, 0x4EAD, 0xCDA5, 0x5EAD, + 0xCDA6, 0x633A, 0xCDA7, 0x8247, 0xCDA8, 0x901A, 0xCDA9, 0x6850, + 0xCDAA, 0x916E, 0xCDAB, 0x77B3, 0xCDAC, 0x540C, 0xCDAD, 0x94DC, + 0xCDAE, 0x5F64, 0xCDAF, 0x7AE5, 0xCDB0, 0x6876, 0xCDB1, 0x6345, + 0xCDB2, 0x7B52, 0xCDB3, 0x7EDF, 0xCDB4, 0x75DB, 0xCDB5, 0x5077, + 0xCDB6, 0x6295, 0xCDB7, 0x5934, 0xCDB8, 0x900F, 0xCDB9, 0x51F8, + 0xCDBA, 0x79C3, 0xCDBB, 0x7A81, 0xCDBC, 0x56FE, 0xCDBD, 0x5F92, + 0xCDBE, 0x9014, 0xCDBF, 0x6D82, 0xCDC0, 0x5C60, 0xCDC1, 0x571F, + 0xCDC2, 0x5410, 0xCDC3, 0x5154, 0xCDC4, 0x6E4D, 0xCDC5, 0x56E2, + 0xCDC6, 0x63A8, 0xCDC7, 0x9893, 0xCDC8, 0x817F, 0xCDC9, 0x8715, + 0xCDCA, 0x892A, 0xCDCB, 0x9000, 0xCDCC, 0x541E, 0xCDCD, 0x5C6F, + 0xCDCE, 0x81C0, 0xCDCF, 0x62D6, 0xCDD0, 0x6258, 0xCDD1, 0x8131, + 0xCDD2, 0x9E35, 0xCDD3, 0x9640, 0xCDD4, 0x9A6E, 0xCDD5, 0x9A7C, + 0xCDD6, 0x692D, 0xCDD7, 0x59A5, 0xCDD8, 0x62D3, 0xCDD9, 0x553E, + 0xCDDA, 0x6316, 0xCDDB, 0x54C7, 0xCDDC, 0x86D9, 0xCDDD, 0x6D3C, + 0xCDDE, 0x5A03, 0xCDDF, 0x74E6, 0xCDE0, 0x889C, 0xCDE1, 0x6B6A, + 0xCDE2, 0x5916, 0xCDE3, 0x8C4C, 0xCDE4, 0x5F2F, 0xCDE5, 0x6E7E, + 0xCDE6, 0x73A9, 0xCDE7, 0x987D, 0xCDE8, 0x4E38, 0xCDE9, 0x70F7, + 0xCDEA, 0x5B8C, 0xCDEB, 0x7897, 0xCDEC, 0x633D, 0xCDED, 0x665A, + 0xCDEE, 0x7696, 0xCDEF, 0x60CB, 0xCDF0, 0x5B9B, 0xCDF1, 0x5A49, + 0xCDF2, 0x4E07, 0xCDF3, 0x8155, 0xCDF4, 0x6C6A, 0xCDF5, 0x738B, + 0xCDF6, 0x4EA1, 0xCDF7, 0x6789, 0xCDF8, 0x7F51, 0xCDF9, 0x5F80, + 0xCDFA, 0x65FA, 0xCDFB, 0x671B, 0xCDFC, 0x5FD8, 0xCDFD, 0x5984, + 0xCDFE, 0x5A01, 0xCE40, 0x8719, 0xCE41, 0x871B, 0xCE42, 0x871D, + 0xCE43, 0x871F, 0xCE44, 0x8720, 0xCE45, 0x8724, 0xCE46, 0x8726, + 0xCE47, 0x8727, 0xCE48, 0x8728, 0xCE49, 0x872A, 0xCE4A, 0x872B, + 0xCE4B, 0x872C, 0xCE4C, 0x872D, 0xCE4D, 0x872F, 0xCE4E, 0x8730, + 0xCE4F, 0x8732, 0xCE50, 0x8733, 0xCE51, 0x8735, 0xCE52, 0x8736, + 0xCE53, 0x8738, 0xCE54, 0x8739, 0xCE55, 0x873A, 0xCE56, 0x873C, + 0xCE57, 0x873D, 0xCE58, 0x8740, 0xCE59, 0x8741, 0xCE5A, 0x8742, + 0xCE5B, 0x8743, 0xCE5C, 0x8744, 0xCE5D, 0x8745, 0xCE5E, 0x8746, + 0xCE5F, 0x874A, 0xCE60, 0x874B, 0xCE61, 0x874D, 0xCE62, 0x874F, + 0xCE63, 0x8750, 0xCE64, 0x8751, 0xCE65, 0x8752, 0xCE66, 0x8754, + 0xCE67, 0x8755, 0xCE68, 0x8756, 0xCE69, 0x8758, 0xCE6A, 0x875A, + 0xCE6B, 0x875B, 0xCE6C, 0x875C, 0xCE6D, 0x875D, 0xCE6E, 0x875E, + 0xCE6F, 0x875F, 0xCE70, 0x8761, 0xCE71, 0x8762, 0xCE72, 0x8766, + 0xCE73, 0x8767, 0xCE74, 0x8768, 0xCE75, 0x8769, 0xCE76, 0x876A, + 0xCE77, 0x876B, 0xCE78, 0x876C, 0xCE79, 0x876D, 0xCE7A, 0x876F, + 0xCE7B, 0x8771, 0xCE7C, 0x8772, 0xCE7D, 0x8773, 0xCE7E, 0x8775, + 0xCE80, 0x8777, 0xCE81, 0x8778, 0xCE82, 0x8779, 0xCE83, 0x877A, + 0xCE84, 0x877F, 0xCE85, 0x8780, 0xCE86, 0x8781, 0xCE87, 0x8784, + 0xCE88, 0x8786, 0xCE89, 0x8787, 0xCE8A, 0x8789, 0xCE8B, 0x878A, + 0xCE8C, 0x878C, 0xCE8D, 0x878E, 0xCE8E, 0x878F, 0xCE8F, 0x8790, + 0xCE90, 0x8791, 0xCE91, 0x8792, 0xCE92, 0x8794, 0xCE93, 0x8795, + 0xCE94, 0x8796, 0xCE95, 0x8798, 0xCE96, 0x8799, 0xCE97, 0x879A, + 0xCE98, 0x879B, 0xCE99, 0x879C, 0xCE9A, 0x879D, 0xCE9B, 0x879E, + 0xCE9C, 0x87A0, 0xCE9D, 0x87A1, 0xCE9E, 0x87A2, 0xCE9F, 0x87A3, + 0xCEA0, 0x87A4, 0xCEA1, 0x5DCD, 0xCEA2, 0x5FAE, 0xCEA3, 0x5371, + 0xCEA4, 0x97E6, 0xCEA5, 0x8FDD, 0xCEA6, 0x6845, 0xCEA7, 0x56F4, + 0xCEA8, 0x552F, 0xCEA9, 0x60DF, 0xCEAA, 0x4E3A, 0xCEAB, 0x6F4D, + 0xCEAC, 0x7EF4, 0xCEAD, 0x82C7, 0xCEAE, 0x840E, 0xCEAF, 0x59D4, + 0xCEB0, 0x4F1F, 0xCEB1, 0x4F2A, 0xCEB2, 0x5C3E, 0xCEB3, 0x7EAC, + 0xCEB4, 0x672A, 0xCEB5, 0x851A, 0xCEB6, 0x5473, 0xCEB7, 0x754F, + 0xCEB8, 0x80C3, 0xCEB9, 0x5582, 0xCEBA, 0x9B4F, 0xCEBB, 0x4F4D, + 0xCEBC, 0x6E2D, 0xCEBD, 0x8C13, 0xCEBE, 0x5C09, 0xCEBF, 0x6170, + 0xCEC0, 0x536B, 0xCEC1, 0x761F, 0xCEC2, 0x6E29, 0xCEC3, 0x868A, + 0xCEC4, 0x6587, 0xCEC5, 0x95FB, 0xCEC6, 0x7EB9, 0xCEC7, 0x543B, + 0xCEC8, 0x7A33, 0xCEC9, 0x7D0A, 0xCECA, 0x95EE, 0xCECB, 0x55E1, + 0xCECC, 0x7FC1, 0xCECD, 0x74EE, 0xCECE, 0x631D, 0xCECF, 0x8717, + 0xCED0, 0x6DA1, 0xCED1, 0x7A9D, 0xCED2, 0x6211, 0xCED3, 0x65A1, + 0xCED4, 0x5367, 0xCED5, 0x63E1, 0xCED6, 0x6C83, 0xCED7, 0x5DEB, + 0xCED8, 0x545C, 0xCED9, 0x94A8, 0xCEDA, 0x4E4C, 0xCEDB, 0x6C61, + 0xCEDC, 0x8BEC, 0xCEDD, 0x5C4B, 0xCEDE, 0x65E0, 0xCEDF, 0x829C, + 0xCEE0, 0x68A7, 0xCEE1, 0x543E, 0xCEE2, 0x5434, 0xCEE3, 0x6BCB, + 0xCEE4, 0x6B66, 0xCEE5, 0x4E94, 0xCEE6, 0x6342, 0xCEE7, 0x5348, + 0xCEE8, 0x821E, 0xCEE9, 0x4F0D, 0xCEEA, 0x4FAE, 0xCEEB, 0x575E, + 0xCEEC, 0x620A, 0xCEED, 0x96FE, 0xCEEE, 0x6664, 0xCEEF, 0x7269, + 0xCEF0, 0x52FF, 0xCEF1, 0x52A1, 0xCEF2, 0x609F, 0xCEF3, 0x8BEF, + 0xCEF4, 0x6614, 0xCEF5, 0x7199, 0xCEF6, 0x6790, 0xCEF7, 0x897F, + 0xCEF8, 0x7852, 0xCEF9, 0x77FD, 0xCEFA, 0x6670, 0xCEFB, 0x563B, + 0xCEFC, 0x5438, 0xCEFD, 0x9521, 0xCEFE, 0x727A, 0xCF40, 0x87A5, + 0xCF41, 0x87A6, 0xCF42, 0x87A7, 0xCF43, 0x87A9, 0xCF44, 0x87AA, + 0xCF45, 0x87AE, 0xCF46, 0x87B0, 0xCF47, 0x87B1, 0xCF48, 0x87B2, + 0xCF49, 0x87B4, 0xCF4A, 0x87B6, 0xCF4B, 0x87B7, 0xCF4C, 0x87B8, + 0xCF4D, 0x87B9, 0xCF4E, 0x87BB, 0xCF4F, 0x87BC, 0xCF50, 0x87BE, + 0xCF51, 0x87BF, 0xCF52, 0x87C1, 0xCF53, 0x87C2, 0xCF54, 0x87C3, + 0xCF55, 0x87C4, 0xCF56, 0x87C5, 0xCF57, 0x87C7, 0xCF58, 0x87C8, + 0xCF59, 0x87C9, 0xCF5A, 0x87CC, 0xCF5B, 0x87CD, 0xCF5C, 0x87CE, + 0xCF5D, 0x87CF, 0xCF5E, 0x87D0, 0xCF5F, 0x87D4, 0xCF60, 0x87D5, + 0xCF61, 0x87D6, 0xCF62, 0x87D7, 0xCF63, 0x87D8, 0xCF64, 0x87D9, + 0xCF65, 0x87DA, 0xCF66, 0x87DC, 0xCF67, 0x87DD, 0xCF68, 0x87DE, + 0xCF69, 0x87DF, 0xCF6A, 0x87E1, 0xCF6B, 0x87E2, 0xCF6C, 0x87E3, + 0xCF6D, 0x87E4, 0xCF6E, 0x87E6, 0xCF6F, 0x87E7, 0xCF70, 0x87E8, + 0xCF71, 0x87E9, 0xCF72, 0x87EB, 0xCF73, 0x87EC, 0xCF74, 0x87ED, + 0xCF75, 0x87EF, 0xCF76, 0x87F0, 0xCF77, 0x87F1, 0xCF78, 0x87F2, + 0xCF79, 0x87F3, 0xCF7A, 0x87F4, 0xCF7B, 0x87F5, 0xCF7C, 0x87F6, + 0xCF7D, 0x87F7, 0xCF7E, 0x87F8, 0xCF80, 0x87FA, 0xCF81, 0x87FB, + 0xCF82, 0x87FC, 0xCF83, 0x87FD, 0xCF84, 0x87FF, 0xCF85, 0x8800, + 0xCF86, 0x8801, 0xCF87, 0x8802, 0xCF88, 0x8804, 0xCF89, 0x8805, + 0xCF8A, 0x8806, 0xCF8B, 0x8807, 0xCF8C, 0x8808, 0xCF8D, 0x8809, + 0xCF8E, 0x880B, 0xCF8F, 0x880C, 0xCF90, 0x880D, 0xCF91, 0x880E, + 0xCF92, 0x880F, 0xCF93, 0x8810, 0xCF94, 0x8811, 0xCF95, 0x8812, + 0xCF96, 0x8814, 0xCF97, 0x8817, 0xCF98, 0x8818, 0xCF99, 0x8819, + 0xCF9A, 0x881A, 0xCF9B, 0x881C, 0xCF9C, 0x881D, 0xCF9D, 0x881E, + 0xCF9E, 0x881F, 0xCF9F, 0x8820, 0xCFA0, 0x8823, 0xCFA1, 0x7A00, + 0xCFA2, 0x606F, 0xCFA3, 0x5E0C, 0xCFA4, 0x6089, 0xCFA5, 0x819D, + 0xCFA6, 0x5915, 0xCFA7, 0x60DC, 0xCFA8, 0x7184, 0xCFA9, 0x70EF, + 0xCFAA, 0x6EAA, 0xCFAB, 0x6C50, 0xCFAC, 0x7280, 0xCFAD, 0x6A84, + 0xCFAE, 0x88AD, 0xCFAF, 0x5E2D, 0xCFB0, 0x4E60, 0xCFB1, 0x5AB3, + 0xCFB2, 0x559C, 0xCFB3, 0x94E3, 0xCFB4, 0x6D17, 0xCFB5, 0x7CFB, + 0xCFB6, 0x9699, 0xCFB7, 0x620F, 0xCFB8, 0x7EC6, 0xCFB9, 0x778E, + 0xCFBA, 0x867E, 0xCFBB, 0x5323, 0xCFBC, 0x971E, 0xCFBD, 0x8F96, + 0xCFBE, 0x6687, 0xCFBF, 0x5CE1, 0xCFC0, 0x4FA0, 0xCFC1, 0x72ED, + 0xCFC2, 0x4E0B, 0xCFC3, 0x53A6, 0xCFC4, 0x590F, 0xCFC5, 0x5413, + 0xCFC6, 0x6380, 0xCFC7, 0x9528, 0xCFC8, 0x5148, 0xCFC9, 0x4ED9, + 0xCFCA, 0x9C9C, 0xCFCB, 0x7EA4, 0xCFCC, 0x54B8, 0xCFCD, 0x8D24, + 0xCFCE, 0x8854, 0xCFCF, 0x8237, 0xCFD0, 0x95F2, 0xCFD1, 0x6D8E, + 0xCFD2, 0x5F26, 0xCFD3, 0x5ACC, 0xCFD4, 0x663E, 0xCFD5, 0x9669, + 0xCFD6, 0x73B0, 0xCFD7, 0x732E, 0xCFD8, 0x53BF, 0xCFD9, 0x817A, + 0xCFDA, 0x9985, 0xCFDB, 0x7FA1, 0xCFDC, 0x5BAA, 0xCFDD, 0x9677, + 0xCFDE, 0x9650, 0xCFDF, 0x7EBF, 0xCFE0, 0x76F8, 0xCFE1, 0x53A2, + 0xCFE2, 0x9576, 0xCFE3, 0x9999, 0xCFE4, 0x7BB1, 0xCFE5, 0x8944, + 0xCFE6, 0x6E58, 0xCFE7, 0x4E61, 0xCFE8, 0x7FD4, 0xCFE9, 0x7965, + 0xCFEA, 0x8BE6, 0xCFEB, 0x60F3, 0xCFEC, 0x54CD, 0xCFED, 0x4EAB, + 0xCFEE, 0x9879, 0xCFEF, 0x5DF7, 0xCFF0, 0x6A61, 0xCFF1, 0x50CF, + 0xCFF2, 0x5411, 0xCFF3, 0x8C61, 0xCFF4, 0x8427, 0xCFF5, 0x785D, + 0xCFF6, 0x9704, 0xCFF7, 0x524A, 0xCFF8, 0x54EE, 0xCFF9, 0x56A3, + 0xCFFA, 0x9500, 0xCFFB, 0x6D88, 0xCFFC, 0x5BB5, 0xCFFD, 0x6DC6, + 0xCFFE, 0x6653, 0xD040, 0x8824, 0xD041, 0x8825, 0xD042, 0x8826, + 0xD043, 0x8827, 0xD044, 0x8828, 0xD045, 0x8829, 0xD046, 0x882A, + 0xD047, 0x882B, 0xD048, 0x882C, 0xD049, 0x882D, 0xD04A, 0x882E, + 0xD04B, 0x882F, 0xD04C, 0x8830, 0xD04D, 0x8831, 0xD04E, 0x8833, + 0xD04F, 0x8834, 0xD050, 0x8835, 0xD051, 0x8836, 0xD052, 0x8837, + 0xD053, 0x8838, 0xD054, 0x883A, 0xD055, 0x883B, 0xD056, 0x883D, + 0xD057, 0x883E, 0xD058, 0x883F, 0xD059, 0x8841, 0xD05A, 0x8842, + 0xD05B, 0x8843, 0xD05C, 0x8846, 0xD05D, 0x8847, 0xD05E, 0x8848, + 0xD05F, 0x8849, 0xD060, 0x884A, 0xD061, 0x884B, 0xD062, 0x884E, + 0xD063, 0x884F, 0xD064, 0x8850, 0xD065, 0x8851, 0xD066, 0x8852, + 0xD067, 0x8853, 0xD068, 0x8855, 0xD069, 0x8856, 0xD06A, 0x8858, + 0xD06B, 0x885A, 0xD06C, 0x885B, 0xD06D, 0x885C, 0xD06E, 0x885D, + 0xD06F, 0x885E, 0xD070, 0x885F, 0xD071, 0x8860, 0xD072, 0x8866, + 0xD073, 0x8867, 0xD074, 0x886A, 0xD075, 0x886D, 0xD076, 0x886F, + 0xD077, 0x8871, 0xD078, 0x8873, 0xD079, 0x8874, 0xD07A, 0x8875, + 0xD07B, 0x8876, 0xD07C, 0x8878, 0xD07D, 0x8879, 0xD07E, 0x887A, + 0xD080, 0x887B, 0xD081, 0x887C, 0xD082, 0x8880, 0xD083, 0x8883, + 0xD084, 0x8886, 0xD085, 0x8887, 0xD086, 0x8889, 0xD087, 0x888A, + 0xD088, 0x888C, 0xD089, 0x888E, 0xD08A, 0x888F, 0xD08B, 0x8890, + 0xD08C, 0x8891, 0xD08D, 0x8893, 0xD08E, 0x8894, 0xD08F, 0x8895, + 0xD090, 0x8897, 0xD091, 0x8898, 0xD092, 0x8899, 0xD093, 0x889A, + 0xD094, 0x889B, 0xD095, 0x889D, 0xD096, 0x889E, 0xD097, 0x889F, + 0xD098, 0x88A0, 0xD099, 0x88A1, 0xD09A, 0x88A3, 0xD09B, 0x88A5, + 0xD09C, 0x88A6, 0xD09D, 0x88A7, 0xD09E, 0x88A8, 0xD09F, 0x88A9, + 0xD0A0, 0x88AA, 0xD0A1, 0x5C0F, 0xD0A2, 0x5B5D, 0xD0A3, 0x6821, + 0xD0A4, 0x8096, 0xD0A5, 0x5578, 0xD0A6, 0x7B11, 0xD0A7, 0x6548, + 0xD0A8, 0x6954, 0xD0A9, 0x4E9B, 0xD0AA, 0x6B47, 0xD0AB, 0x874E, + 0xD0AC, 0x978B, 0xD0AD, 0x534F, 0xD0AE, 0x631F, 0xD0AF, 0x643A, + 0xD0B0, 0x90AA, 0xD0B1, 0x659C, 0xD0B2, 0x80C1, 0xD0B3, 0x8C10, + 0xD0B4, 0x5199, 0xD0B5, 0x68B0, 0xD0B6, 0x5378, 0xD0B7, 0x87F9, + 0xD0B8, 0x61C8, 0xD0B9, 0x6CC4, 0xD0BA, 0x6CFB, 0xD0BB, 0x8C22, + 0xD0BC, 0x5C51, 0xD0BD, 0x85AA, 0xD0BE, 0x82AF, 0xD0BF, 0x950C, + 0xD0C0, 0x6B23, 0xD0C1, 0x8F9B, 0xD0C2, 0x65B0, 0xD0C3, 0x5FFB, + 0xD0C4, 0x5FC3, 0xD0C5, 0x4FE1, 0xD0C6, 0x8845, 0xD0C7, 0x661F, + 0xD0C8, 0x8165, 0xD0C9, 0x7329, 0xD0CA, 0x60FA, 0xD0CB, 0x5174, + 0xD0CC, 0x5211, 0xD0CD, 0x578B, 0xD0CE, 0x5F62, 0xD0CF, 0x90A2, + 0xD0D0, 0x884C, 0xD0D1, 0x9192, 0xD0D2, 0x5E78, 0xD0D3, 0x674F, + 0xD0D4, 0x6027, 0xD0D5, 0x59D3, 0xD0D6, 0x5144, 0xD0D7, 0x51F6, + 0xD0D8, 0x80F8, 0xD0D9, 0x5308, 0xD0DA, 0x6C79, 0xD0DB, 0x96C4, + 0xD0DC, 0x718A, 0xD0DD, 0x4F11, 0xD0DE, 0x4FEE, 0xD0DF, 0x7F9E, + 0xD0E0, 0x673D, 0xD0E1, 0x55C5, 0xD0E2, 0x9508, 0xD0E3, 0x79C0, + 0xD0E4, 0x8896, 0xD0E5, 0x7EE3, 0xD0E6, 0x589F, 0xD0E7, 0x620C, + 0xD0E8, 0x9700, 0xD0E9, 0x865A, 0xD0EA, 0x5618, 0xD0EB, 0x987B, + 0xD0EC, 0x5F90, 0xD0ED, 0x8BB8, 0xD0EE, 0x84C4, 0xD0EF, 0x9157, + 0xD0F0, 0x53D9, 0xD0F1, 0x65ED, 0xD0F2, 0x5E8F, 0xD0F3, 0x755C, + 0xD0F4, 0x6064, 0xD0F5, 0x7D6E, 0xD0F6, 0x5A7F, 0xD0F7, 0x7EEA, + 0xD0F8, 0x7EED, 0xD0F9, 0x8F69, 0xD0FA, 0x55A7, 0xD0FB, 0x5BA3, + 0xD0FC, 0x60AC, 0xD0FD, 0x65CB, 0xD0FE, 0x7384, 0xD140, 0x88AC, + 0xD141, 0x88AE, 0xD142, 0x88AF, 0xD143, 0x88B0, 0xD144, 0x88B2, + 0xD145, 0x88B3, 0xD146, 0x88B4, 0xD147, 0x88B5, 0xD148, 0x88B6, + 0xD149, 0x88B8, 0xD14A, 0x88B9, 0xD14B, 0x88BA, 0xD14C, 0x88BB, + 0xD14D, 0x88BD, 0xD14E, 0x88BE, 0xD14F, 0x88BF, 0xD150, 0x88C0, + 0xD151, 0x88C3, 0xD152, 0x88C4, 0xD153, 0x88C7, 0xD154, 0x88C8, + 0xD155, 0x88CA, 0xD156, 0x88CB, 0xD157, 0x88CC, 0xD158, 0x88CD, + 0xD159, 0x88CF, 0xD15A, 0x88D0, 0xD15B, 0x88D1, 0xD15C, 0x88D3, + 0xD15D, 0x88D6, 0xD15E, 0x88D7, 0xD15F, 0x88DA, 0xD160, 0x88DB, + 0xD161, 0x88DC, 0xD162, 0x88DD, 0xD163, 0x88DE, 0xD164, 0x88E0, + 0xD165, 0x88E1, 0xD166, 0x88E6, 0xD167, 0x88E7, 0xD168, 0x88E9, + 0xD169, 0x88EA, 0xD16A, 0x88EB, 0xD16B, 0x88EC, 0xD16C, 0x88ED, + 0xD16D, 0x88EE, 0xD16E, 0x88EF, 0xD16F, 0x88F2, 0xD170, 0x88F5, + 0xD171, 0x88F6, 0xD172, 0x88F7, 0xD173, 0x88FA, 0xD174, 0x88FB, + 0xD175, 0x88FD, 0xD176, 0x88FF, 0xD177, 0x8900, 0xD178, 0x8901, + 0xD179, 0x8903, 0xD17A, 0x8904, 0xD17B, 0x8905, 0xD17C, 0x8906, + 0xD17D, 0x8907, 0xD17E, 0x8908, 0xD180, 0x8909, 0xD181, 0x890B, + 0xD182, 0x890C, 0xD183, 0x890D, 0xD184, 0x890E, 0xD185, 0x890F, + 0xD186, 0x8911, 0xD187, 0x8914, 0xD188, 0x8915, 0xD189, 0x8916, + 0xD18A, 0x8917, 0xD18B, 0x8918, 0xD18C, 0x891C, 0xD18D, 0x891D, + 0xD18E, 0x891E, 0xD18F, 0x891F, 0xD190, 0x8920, 0xD191, 0x8922, + 0xD192, 0x8923, 0xD193, 0x8924, 0xD194, 0x8926, 0xD195, 0x8927, + 0xD196, 0x8928, 0xD197, 0x8929, 0xD198, 0x892C, 0xD199, 0x892D, + 0xD19A, 0x892E, 0xD19B, 0x892F, 0xD19C, 0x8931, 0xD19D, 0x8932, + 0xD19E, 0x8933, 0xD19F, 0x8935, 0xD1A0, 0x8937, 0xD1A1, 0x9009, + 0xD1A2, 0x7663, 0xD1A3, 0x7729, 0xD1A4, 0x7EDA, 0xD1A5, 0x9774, + 0xD1A6, 0x859B, 0xD1A7, 0x5B66, 0xD1A8, 0x7A74, 0xD1A9, 0x96EA, + 0xD1AA, 0x8840, 0xD1AB, 0x52CB, 0xD1AC, 0x718F, 0xD1AD, 0x5FAA, + 0xD1AE, 0x65EC, 0xD1AF, 0x8BE2, 0xD1B0, 0x5BFB, 0xD1B1, 0x9A6F, + 0xD1B2, 0x5DE1, 0xD1B3, 0x6B89, 0xD1B4, 0x6C5B, 0xD1B5, 0x8BAD, + 0xD1B6, 0x8BAF, 0xD1B7, 0x900A, 0xD1B8, 0x8FC5, 0xD1B9, 0x538B, + 0xD1BA, 0x62BC, 0xD1BB, 0x9E26, 0xD1BC, 0x9E2D, 0xD1BD, 0x5440, + 0xD1BE, 0x4E2B, 0xD1BF, 0x82BD, 0xD1C0, 0x7259, 0xD1C1, 0x869C, + 0xD1C2, 0x5D16, 0xD1C3, 0x8859, 0xD1C4, 0x6DAF, 0xD1C5, 0x96C5, + 0xD1C6, 0x54D1, 0xD1C7, 0x4E9A, 0xD1C8, 0x8BB6, 0xD1C9, 0x7109, + 0xD1CA, 0x54BD, 0xD1CB, 0x9609, 0xD1CC, 0x70DF, 0xD1CD, 0x6DF9, + 0xD1CE, 0x76D0, 0xD1CF, 0x4E25, 0xD1D0, 0x7814, 0xD1D1, 0x8712, + 0xD1D2, 0x5CA9, 0xD1D3, 0x5EF6, 0xD1D4, 0x8A00, 0xD1D5, 0x989C, + 0xD1D6, 0x960E, 0xD1D7, 0x708E, 0xD1D8, 0x6CBF, 0xD1D9, 0x5944, + 0xD1DA, 0x63A9, 0xD1DB, 0x773C, 0xD1DC, 0x884D, 0xD1DD, 0x6F14, + 0xD1DE, 0x8273, 0xD1DF, 0x5830, 0xD1E0, 0x71D5, 0xD1E1, 0x538C, + 0xD1E2, 0x781A, 0xD1E3, 0x96C1, 0xD1E4, 0x5501, 0xD1E5, 0x5F66, + 0xD1E6, 0x7130, 0xD1E7, 0x5BB4, 0xD1E8, 0x8C1A, 0xD1E9, 0x9A8C, + 0xD1EA, 0x6B83, 0xD1EB, 0x592E, 0xD1EC, 0x9E2F, 0xD1ED, 0x79E7, + 0xD1EE, 0x6768, 0xD1EF, 0x626C, 0xD1F0, 0x4F6F, 0xD1F1, 0x75A1, + 0xD1F2, 0x7F8A, 0xD1F3, 0x6D0B, 0xD1F4, 0x9633, 0xD1F5, 0x6C27, + 0xD1F6, 0x4EF0, 0xD1F7, 0x75D2, 0xD1F8, 0x517B, 0xD1F9, 0x6837, + 0xD1FA, 0x6F3E, 0xD1FB, 0x9080, 0xD1FC, 0x8170, 0xD1FD, 0x5996, + 0xD1FE, 0x7476, 0xD240, 0x8938, 0xD241, 0x8939, 0xD242, 0x893A, + 0xD243, 0x893B, 0xD244, 0x893C, 0xD245, 0x893D, 0xD246, 0x893E, + 0xD247, 0x893F, 0xD248, 0x8940, 0xD249, 0x8942, 0xD24A, 0x8943, + 0xD24B, 0x8945, 0xD24C, 0x8946, 0xD24D, 0x8947, 0xD24E, 0x8948, + 0xD24F, 0x8949, 0xD250, 0x894A, 0xD251, 0x894B, 0xD252, 0x894C, + 0xD253, 0x894D, 0xD254, 0x894E, 0xD255, 0x894F, 0xD256, 0x8950, + 0xD257, 0x8951, 0xD258, 0x8952, 0xD259, 0x8953, 0xD25A, 0x8954, + 0xD25B, 0x8955, 0xD25C, 0x8956, 0xD25D, 0x8957, 0xD25E, 0x8958, + 0xD25F, 0x8959, 0xD260, 0x895A, 0xD261, 0x895B, 0xD262, 0x895C, + 0xD263, 0x895D, 0xD264, 0x8960, 0xD265, 0x8961, 0xD266, 0x8962, + 0xD267, 0x8963, 0xD268, 0x8964, 0xD269, 0x8965, 0xD26A, 0x8967, + 0xD26B, 0x8968, 0xD26C, 0x8969, 0xD26D, 0x896A, 0xD26E, 0x896B, + 0xD26F, 0x896C, 0xD270, 0x896D, 0xD271, 0x896E, 0xD272, 0x896F, + 0xD273, 0x8970, 0xD274, 0x8971, 0xD275, 0x8972, 0xD276, 0x8973, + 0xD277, 0x8974, 0xD278, 0x8975, 0xD279, 0x8976, 0xD27A, 0x8977, + 0xD27B, 0x8978, 0xD27C, 0x8979, 0xD27D, 0x897A, 0xD27E, 0x897C, + 0xD280, 0x897D, 0xD281, 0x897E, 0xD282, 0x8980, 0xD283, 0x8982, + 0xD284, 0x8984, 0xD285, 0x8985, 0xD286, 0x8987, 0xD287, 0x8988, + 0xD288, 0x8989, 0xD289, 0x898A, 0xD28A, 0x898B, 0xD28B, 0x898C, + 0xD28C, 0x898D, 0xD28D, 0x898E, 0xD28E, 0x898F, 0xD28F, 0x8990, + 0xD290, 0x8991, 0xD291, 0x8992, 0xD292, 0x8993, 0xD293, 0x8994, + 0xD294, 0x8995, 0xD295, 0x8996, 0xD296, 0x8997, 0xD297, 0x8998, + 0xD298, 0x8999, 0xD299, 0x899A, 0xD29A, 0x899B, 0xD29B, 0x899C, + 0xD29C, 0x899D, 0xD29D, 0x899E, 0xD29E, 0x899F, 0xD29F, 0x89A0, + 0xD2A0, 0x89A1, 0xD2A1, 0x6447, 0xD2A2, 0x5C27, 0xD2A3, 0x9065, + 0xD2A4, 0x7A91, 0xD2A5, 0x8C23, 0xD2A6, 0x59DA, 0xD2A7, 0x54AC, + 0xD2A8, 0x8200, 0xD2A9, 0x836F, 0xD2AA, 0x8981, 0xD2AB, 0x8000, + 0xD2AC, 0x6930, 0xD2AD, 0x564E, 0xD2AE, 0x8036, 0xD2AF, 0x7237, + 0xD2B0, 0x91CE, 0xD2B1, 0x51B6, 0xD2B2, 0x4E5F, 0xD2B3, 0x9875, + 0xD2B4, 0x6396, 0xD2B5, 0x4E1A, 0xD2B6, 0x53F6, 0xD2B7, 0x66F3, + 0xD2B8, 0x814B, 0xD2B9, 0x591C, 0xD2BA, 0x6DB2, 0xD2BB, 0x4E00, + 0xD2BC, 0x58F9, 0xD2BD, 0x533B, 0xD2BE, 0x63D6, 0xD2BF, 0x94F1, + 0xD2C0, 0x4F9D, 0xD2C1, 0x4F0A, 0xD2C2, 0x8863, 0xD2C3, 0x9890, + 0xD2C4, 0x5937, 0xD2C5, 0x9057, 0xD2C6, 0x79FB, 0xD2C7, 0x4EEA, + 0xD2C8, 0x80F0, 0xD2C9, 0x7591, 0xD2CA, 0x6C82, 0xD2CB, 0x5B9C, + 0xD2CC, 0x59E8, 0xD2CD, 0x5F5D, 0xD2CE, 0x6905, 0xD2CF, 0x8681, + 0xD2D0, 0x501A, 0xD2D1, 0x5DF2, 0xD2D2, 0x4E59, 0xD2D3, 0x77E3, + 0xD2D4, 0x4EE5, 0xD2D5, 0x827A, 0xD2D6, 0x6291, 0xD2D7, 0x6613, + 0xD2D8, 0x9091, 0xD2D9, 0x5C79, 0xD2DA, 0x4EBF, 0xD2DB, 0x5F79, + 0xD2DC, 0x81C6, 0xD2DD, 0x9038, 0xD2DE, 0x8084, 0xD2DF, 0x75AB, + 0xD2E0, 0x4EA6, 0xD2E1, 0x88D4, 0xD2E2, 0x610F, 0xD2E3, 0x6BC5, + 0xD2E4, 0x5FC6, 0xD2E5, 0x4E49, 0xD2E6, 0x76CA, 0xD2E7, 0x6EA2, + 0xD2E8, 0x8BE3, 0xD2E9, 0x8BAE, 0xD2EA, 0x8C0A, 0xD2EB, 0x8BD1, + 0xD2EC, 0x5F02, 0xD2ED, 0x7FFC, 0xD2EE, 0x7FCC, 0xD2EF, 0x7ECE, + 0xD2F0, 0x8335, 0xD2F1, 0x836B, 0xD2F2, 0x56E0, 0xD2F3, 0x6BB7, + 0xD2F4, 0x97F3, 0xD2F5, 0x9634, 0xD2F6, 0x59FB, 0xD2F7, 0x541F, + 0xD2F8, 0x94F6, 0xD2F9, 0x6DEB, 0xD2FA, 0x5BC5, 0xD2FB, 0x996E, + 0xD2FC, 0x5C39, 0xD2FD, 0x5F15, 0xD2FE, 0x9690, 0xD340, 0x89A2, + 0xD341, 0x89A3, 0xD342, 0x89A4, 0xD343, 0x89A5, 0xD344, 0x89A6, + 0xD345, 0x89A7, 0xD346, 0x89A8, 0xD347, 0x89A9, 0xD348, 0x89AA, + 0xD349, 0x89AB, 0xD34A, 0x89AC, 0xD34B, 0x89AD, 0xD34C, 0x89AE, + 0xD34D, 0x89AF, 0xD34E, 0x89B0, 0xD34F, 0x89B1, 0xD350, 0x89B2, + 0xD351, 0x89B3, 0xD352, 0x89B4, 0xD353, 0x89B5, 0xD354, 0x89B6, + 0xD355, 0x89B7, 0xD356, 0x89B8, 0xD357, 0x89B9, 0xD358, 0x89BA, + 0xD359, 0x89BB, 0xD35A, 0x89BC, 0xD35B, 0x89BD, 0xD35C, 0x89BE, + 0xD35D, 0x89BF, 0xD35E, 0x89C0, 0xD35F, 0x89C3, 0xD360, 0x89CD, + 0xD361, 0x89D3, 0xD362, 0x89D4, 0xD363, 0x89D5, 0xD364, 0x89D7, + 0xD365, 0x89D8, 0xD366, 0x89D9, 0xD367, 0x89DB, 0xD368, 0x89DD, + 0xD369, 0x89DF, 0xD36A, 0x89E0, 0xD36B, 0x89E1, 0xD36C, 0x89E2, + 0xD36D, 0x89E4, 0xD36E, 0x89E7, 0xD36F, 0x89E8, 0xD370, 0x89E9, + 0xD371, 0x89EA, 0xD372, 0x89EC, 0xD373, 0x89ED, 0xD374, 0x89EE, + 0xD375, 0x89F0, 0xD376, 0x89F1, 0xD377, 0x89F2, 0xD378, 0x89F4, + 0xD379, 0x89F5, 0xD37A, 0x89F6, 0xD37B, 0x89F7, 0xD37C, 0x89F8, + 0xD37D, 0x89F9, 0xD37E, 0x89FA, 0xD380, 0x89FB, 0xD381, 0x89FC, + 0xD382, 0x89FD, 0xD383, 0x89FE, 0xD384, 0x89FF, 0xD385, 0x8A01, + 0xD386, 0x8A02, 0xD387, 0x8A03, 0xD388, 0x8A04, 0xD389, 0x8A05, + 0xD38A, 0x8A06, 0xD38B, 0x8A08, 0xD38C, 0x8A09, 0xD38D, 0x8A0A, + 0xD38E, 0x8A0B, 0xD38F, 0x8A0C, 0xD390, 0x8A0D, 0xD391, 0x8A0E, + 0xD392, 0x8A0F, 0xD393, 0x8A10, 0xD394, 0x8A11, 0xD395, 0x8A12, + 0xD396, 0x8A13, 0xD397, 0x8A14, 0xD398, 0x8A15, 0xD399, 0x8A16, + 0xD39A, 0x8A17, 0xD39B, 0x8A18, 0xD39C, 0x8A19, 0xD39D, 0x8A1A, + 0xD39E, 0x8A1B, 0xD39F, 0x8A1C, 0xD3A0, 0x8A1D, 0xD3A1, 0x5370, + 0xD3A2, 0x82F1, 0xD3A3, 0x6A31, 0xD3A4, 0x5A74, 0xD3A5, 0x9E70, + 0xD3A6, 0x5E94, 0xD3A7, 0x7F28, 0xD3A8, 0x83B9, 0xD3A9, 0x8424, + 0xD3AA, 0x8425, 0xD3AB, 0x8367, 0xD3AC, 0x8747, 0xD3AD, 0x8FCE, + 0xD3AE, 0x8D62, 0xD3AF, 0x76C8, 0xD3B0, 0x5F71, 0xD3B1, 0x9896, + 0xD3B2, 0x786C, 0xD3B3, 0x6620, 0xD3B4, 0x54DF, 0xD3B5, 0x62E5, + 0xD3B6, 0x4F63, 0xD3B7, 0x81C3, 0xD3B8, 0x75C8, 0xD3B9, 0x5EB8, + 0xD3BA, 0x96CD, 0xD3BB, 0x8E0A, 0xD3BC, 0x86F9, 0xD3BD, 0x548F, + 0xD3BE, 0x6CF3, 0xD3BF, 0x6D8C, 0xD3C0, 0x6C38, 0xD3C1, 0x607F, + 0xD3C2, 0x52C7, 0xD3C3, 0x7528, 0xD3C4, 0x5E7D, 0xD3C5, 0x4F18, + 0xD3C6, 0x60A0, 0xD3C7, 0x5FE7, 0xD3C8, 0x5C24, 0xD3C9, 0x7531, + 0xD3CA, 0x90AE, 0xD3CB, 0x94C0, 0xD3CC, 0x72B9, 0xD3CD, 0x6CB9, + 0xD3CE, 0x6E38, 0xD3CF, 0x9149, 0xD3D0, 0x6709, 0xD3D1, 0x53CB, + 0xD3D2, 0x53F3, 0xD3D3, 0x4F51, 0xD3D4, 0x91C9, 0xD3D5, 0x8BF1, + 0xD3D6, 0x53C8, 0xD3D7, 0x5E7C, 0xD3D8, 0x8FC2, 0xD3D9, 0x6DE4, + 0xD3DA, 0x4E8E, 0xD3DB, 0x76C2, 0xD3DC, 0x6986, 0xD3DD, 0x865E, + 0xD3DE, 0x611A, 0xD3DF, 0x8206, 0xD3E0, 0x4F59, 0xD3E1, 0x4FDE, + 0xD3E2, 0x903E, 0xD3E3, 0x9C7C, 0xD3E4, 0x6109, 0xD3E5, 0x6E1D, + 0xD3E6, 0x6E14, 0xD3E7, 0x9685, 0xD3E8, 0x4E88, 0xD3E9, 0x5A31, + 0xD3EA, 0x96E8, 0xD3EB, 0x4E0E, 0xD3EC, 0x5C7F, 0xD3ED, 0x79B9, + 0xD3EE, 0x5B87, 0xD3EF, 0x8BED, 0xD3F0, 0x7FBD, 0xD3F1, 0x7389, + 0xD3F2, 0x57DF, 0xD3F3, 0x828B, 0xD3F4, 0x90C1, 0xD3F5, 0x5401, + 0xD3F6, 0x9047, 0xD3F7, 0x55BB, 0xD3F8, 0x5CEA, 0xD3F9, 0x5FA1, + 0xD3FA, 0x6108, 0xD3FB, 0x6B32, 0xD3FC, 0x72F1, 0xD3FD, 0x80B2, + 0xD3FE, 0x8A89, 0xD440, 0x8A1E, 0xD441, 0x8A1F, 0xD442, 0x8A20, + 0xD443, 0x8A21, 0xD444, 0x8A22, 0xD445, 0x8A23, 0xD446, 0x8A24, + 0xD447, 0x8A25, 0xD448, 0x8A26, 0xD449, 0x8A27, 0xD44A, 0x8A28, + 0xD44B, 0x8A29, 0xD44C, 0x8A2A, 0xD44D, 0x8A2B, 0xD44E, 0x8A2C, + 0xD44F, 0x8A2D, 0xD450, 0x8A2E, 0xD451, 0x8A2F, 0xD452, 0x8A30, + 0xD453, 0x8A31, 0xD454, 0x8A32, 0xD455, 0x8A33, 0xD456, 0x8A34, + 0xD457, 0x8A35, 0xD458, 0x8A36, 0xD459, 0x8A37, 0xD45A, 0x8A38, + 0xD45B, 0x8A39, 0xD45C, 0x8A3A, 0xD45D, 0x8A3B, 0xD45E, 0x8A3C, + 0xD45F, 0x8A3D, 0xD460, 0x8A3F, 0xD461, 0x8A40, 0xD462, 0x8A41, + 0xD463, 0x8A42, 0xD464, 0x8A43, 0xD465, 0x8A44, 0xD466, 0x8A45, + 0xD467, 0x8A46, 0xD468, 0x8A47, 0xD469, 0x8A49, 0xD46A, 0x8A4A, + 0xD46B, 0x8A4B, 0xD46C, 0x8A4C, 0xD46D, 0x8A4D, 0xD46E, 0x8A4E, + 0xD46F, 0x8A4F, 0xD470, 0x8A50, 0xD471, 0x8A51, 0xD472, 0x8A52, + 0xD473, 0x8A53, 0xD474, 0x8A54, 0xD475, 0x8A55, 0xD476, 0x8A56, + 0xD477, 0x8A57, 0xD478, 0x8A58, 0xD479, 0x8A59, 0xD47A, 0x8A5A, + 0xD47B, 0x8A5B, 0xD47C, 0x8A5C, 0xD47D, 0x8A5D, 0xD47E, 0x8A5E, + 0xD480, 0x8A5F, 0xD481, 0x8A60, 0xD482, 0x8A61, 0xD483, 0x8A62, + 0xD484, 0x8A63, 0xD485, 0x8A64, 0xD486, 0x8A65, 0xD487, 0x8A66, + 0xD488, 0x8A67, 0xD489, 0x8A68, 0xD48A, 0x8A69, 0xD48B, 0x8A6A, + 0xD48C, 0x8A6B, 0xD48D, 0x8A6C, 0xD48E, 0x8A6D, 0xD48F, 0x8A6E, + 0xD490, 0x8A6F, 0xD491, 0x8A70, 0xD492, 0x8A71, 0xD493, 0x8A72, + 0xD494, 0x8A73, 0xD495, 0x8A74, 0xD496, 0x8A75, 0xD497, 0x8A76, + 0xD498, 0x8A77, 0xD499, 0x8A78, 0xD49A, 0x8A7A, 0xD49B, 0x8A7B, + 0xD49C, 0x8A7C, 0xD49D, 0x8A7D, 0xD49E, 0x8A7E, 0xD49F, 0x8A7F, + 0xD4A0, 0x8A80, 0xD4A1, 0x6D74, 0xD4A2, 0x5BD3, 0xD4A3, 0x88D5, + 0xD4A4, 0x9884, 0xD4A5, 0x8C6B, 0xD4A6, 0x9A6D, 0xD4A7, 0x9E33, + 0xD4A8, 0x6E0A, 0xD4A9, 0x51A4, 0xD4AA, 0x5143, 0xD4AB, 0x57A3, + 0xD4AC, 0x8881, 0xD4AD, 0x539F, 0xD4AE, 0x63F4, 0xD4AF, 0x8F95, + 0xD4B0, 0x56ED, 0xD4B1, 0x5458, 0xD4B2, 0x5706, 0xD4B3, 0x733F, + 0xD4B4, 0x6E90, 0xD4B5, 0x7F18, 0xD4B6, 0x8FDC, 0xD4B7, 0x82D1, + 0xD4B8, 0x613F, 0xD4B9, 0x6028, 0xD4BA, 0x9662, 0xD4BB, 0x66F0, + 0xD4BC, 0x7EA6, 0xD4BD, 0x8D8A, 0xD4BE, 0x8DC3, 0xD4BF, 0x94A5, + 0xD4C0, 0x5CB3, 0xD4C1, 0x7CA4, 0xD4C2, 0x6708, 0xD4C3, 0x60A6, + 0xD4C4, 0x9605, 0xD4C5, 0x8018, 0xD4C6, 0x4E91, 0xD4C7, 0x90E7, + 0xD4C8, 0x5300, 0xD4C9, 0x9668, 0xD4CA, 0x5141, 0xD4CB, 0x8FD0, + 0xD4CC, 0x8574, 0xD4CD, 0x915D, 0xD4CE, 0x6655, 0xD4CF, 0x97F5, + 0xD4D0, 0x5B55, 0xD4D1, 0x531D, 0xD4D2, 0x7838, 0xD4D3, 0x6742, + 0xD4D4, 0x683D, 0xD4D5, 0x54C9, 0xD4D6, 0x707E, 0xD4D7, 0x5BB0, + 0xD4D8, 0x8F7D, 0xD4D9, 0x518D, 0xD4DA, 0x5728, 0xD4DB, 0x54B1, + 0xD4DC, 0x6512, 0xD4DD, 0x6682, 0xD4DE, 0x8D5E, 0xD4DF, 0x8D43, + 0xD4E0, 0x810F, 0xD4E1, 0x846C, 0xD4E2, 0x906D, 0xD4E3, 0x7CDF, + 0xD4E4, 0x51FF, 0xD4E5, 0x85FB, 0xD4E6, 0x67A3, 0xD4E7, 0x65E9, + 0xD4E8, 0x6FA1, 0xD4E9, 0x86A4, 0xD4EA, 0x8E81, 0xD4EB, 0x566A, + 0xD4EC, 0x9020, 0xD4ED, 0x7682, 0xD4EE, 0x7076, 0xD4EF, 0x71E5, + 0xD4F0, 0x8D23, 0xD4F1, 0x62E9, 0xD4F2, 0x5219, 0xD4F3, 0x6CFD, + 0xD4F4, 0x8D3C, 0xD4F5, 0x600E, 0xD4F6, 0x589E, 0xD4F7, 0x618E, + 0xD4F8, 0x66FE, 0xD4F9, 0x8D60, 0xD4FA, 0x624E, 0xD4FB, 0x55B3, + 0xD4FC, 0x6E23, 0xD4FD, 0x672D, 0xD4FE, 0x8F67, 0xD540, 0x8A81, + 0xD541, 0x8A82, 0xD542, 0x8A83, 0xD543, 0x8A84, 0xD544, 0x8A85, + 0xD545, 0x8A86, 0xD546, 0x8A87, 0xD547, 0x8A88, 0xD548, 0x8A8B, + 0xD549, 0x8A8C, 0xD54A, 0x8A8D, 0xD54B, 0x8A8E, 0xD54C, 0x8A8F, + 0xD54D, 0x8A90, 0xD54E, 0x8A91, 0xD54F, 0x8A92, 0xD550, 0x8A94, + 0xD551, 0x8A95, 0xD552, 0x8A96, 0xD553, 0x8A97, 0xD554, 0x8A98, + 0xD555, 0x8A99, 0xD556, 0x8A9A, 0xD557, 0x8A9B, 0xD558, 0x8A9C, + 0xD559, 0x8A9D, 0xD55A, 0x8A9E, 0xD55B, 0x8A9F, 0xD55C, 0x8AA0, + 0xD55D, 0x8AA1, 0xD55E, 0x8AA2, 0xD55F, 0x8AA3, 0xD560, 0x8AA4, + 0xD561, 0x8AA5, 0xD562, 0x8AA6, 0xD563, 0x8AA7, 0xD564, 0x8AA8, + 0xD565, 0x8AA9, 0xD566, 0x8AAA, 0xD567, 0x8AAB, 0xD568, 0x8AAC, + 0xD569, 0x8AAD, 0xD56A, 0x8AAE, 0xD56B, 0x8AAF, 0xD56C, 0x8AB0, + 0xD56D, 0x8AB1, 0xD56E, 0x8AB2, 0xD56F, 0x8AB3, 0xD570, 0x8AB4, + 0xD571, 0x8AB5, 0xD572, 0x8AB6, 0xD573, 0x8AB7, 0xD574, 0x8AB8, + 0xD575, 0x8AB9, 0xD576, 0x8ABA, 0xD577, 0x8ABB, 0xD578, 0x8ABC, + 0xD579, 0x8ABD, 0xD57A, 0x8ABE, 0xD57B, 0x8ABF, 0xD57C, 0x8AC0, + 0xD57D, 0x8AC1, 0xD57E, 0x8AC2, 0xD580, 0x8AC3, 0xD581, 0x8AC4, + 0xD582, 0x8AC5, 0xD583, 0x8AC6, 0xD584, 0x8AC7, 0xD585, 0x8AC8, + 0xD586, 0x8AC9, 0xD587, 0x8ACA, 0xD588, 0x8ACB, 0xD589, 0x8ACC, + 0xD58A, 0x8ACD, 0xD58B, 0x8ACE, 0xD58C, 0x8ACF, 0xD58D, 0x8AD0, + 0xD58E, 0x8AD1, 0xD58F, 0x8AD2, 0xD590, 0x8AD3, 0xD591, 0x8AD4, + 0xD592, 0x8AD5, 0xD593, 0x8AD6, 0xD594, 0x8AD7, 0xD595, 0x8AD8, + 0xD596, 0x8AD9, 0xD597, 0x8ADA, 0xD598, 0x8ADB, 0xD599, 0x8ADC, + 0xD59A, 0x8ADD, 0xD59B, 0x8ADE, 0xD59C, 0x8ADF, 0xD59D, 0x8AE0, + 0xD59E, 0x8AE1, 0xD59F, 0x8AE2, 0xD5A0, 0x8AE3, 0xD5A1, 0x94E1, + 0xD5A2, 0x95F8, 0xD5A3, 0x7728, 0xD5A4, 0x6805, 0xD5A5, 0x69A8, + 0xD5A6, 0x548B, 0xD5A7, 0x4E4D, 0xD5A8, 0x70B8, 0xD5A9, 0x8BC8, + 0xD5AA, 0x6458, 0xD5AB, 0x658B, 0xD5AC, 0x5B85, 0xD5AD, 0x7A84, + 0xD5AE, 0x503A, 0xD5AF, 0x5BE8, 0xD5B0, 0x77BB, 0xD5B1, 0x6BE1, + 0xD5B2, 0x8A79, 0xD5B3, 0x7C98, 0xD5B4, 0x6CBE, 0xD5B5, 0x76CF, + 0xD5B6, 0x65A9, 0xD5B7, 0x8F97, 0xD5B8, 0x5D2D, 0xD5B9, 0x5C55, + 0xD5BA, 0x8638, 0xD5BB, 0x6808, 0xD5BC, 0x5360, 0xD5BD, 0x6218, + 0xD5BE, 0x7AD9, 0xD5BF, 0x6E5B, 0xD5C0, 0x7EFD, 0xD5C1, 0x6A1F, + 0xD5C2, 0x7AE0, 0xD5C3, 0x5F70, 0xD5C4, 0x6F33, 0xD5C5, 0x5F20, + 0xD5C6, 0x638C, 0xD5C7, 0x6DA8, 0xD5C8, 0x6756, 0xD5C9, 0x4E08, + 0xD5CA, 0x5E10, 0xD5CB, 0x8D26, 0xD5CC, 0x4ED7, 0xD5CD, 0x80C0, + 0xD5CE, 0x7634, 0xD5CF, 0x969C, 0xD5D0, 0x62DB, 0xD5D1, 0x662D, + 0xD5D2, 0x627E, 0xD5D3, 0x6CBC, 0xD5D4, 0x8D75, 0xD5D5, 0x7167, + 0xD5D6, 0x7F69, 0xD5D7, 0x5146, 0xD5D8, 0x8087, 0xD5D9, 0x53EC, + 0xD5DA, 0x906E, 0xD5DB, 0x6298, 0xD5DC, 0x54F2, 0xD5DD, 0x86F0, + 0xD5DE, 0x8F99, 0xD5DF, 0x8005, 0xD5E0, 0x9517, 0xD5E1, 0x8517, + 0xD5E2, 0x8FD9, 0xD5E3, 0x6D59, 0xD5E4, 0x73CD, 0xD5E5, 0x659F, + 0xD5E6, 0x771F, 0xD5E7, 0x7504, 0xD5E8, 0x7827, 0xD5E9, 0x81FB, + 0xD5EA, 0x8D1E, 0xD5EB, 0x9488, 0xD5EC, 0x4FA6, 0xD5ED, 0x6795, + 0xD5EE, 0x75B9, 0xD5EF, 0x8BCA, 0xD5F0, 0x9707, 0xD5F1, 0x632F, + 0xD5F2, 0x9547, 0xD5F3, 0x9635, 0xD5F4, 0x84B8, 0xD5F5, 0x6323, + 0xD5F6, 0x7741, 0xD5F7, 0x5F81, 0xD5F8, 0x72F0, 0xD5F9, 0x4E89, + 0xD5FA, 0x6014, 0xD5FB, 0x6574, 0xD5FC, 0x62EF, 0xD5FD, 0x6B63, + 0xD5FE, 0x653F, 0xD640, 0x8AE4, 0xD641, 0x8AE5, 0xD642, 0x8AE6, + 0xD643, 0x8AE7, 0xD644, 0x8AE8, 0xD645, 0x8AE9, 0xD646, 0x8AEA, + 0xD647, 0x8AEB, 0xD648, 0x8AEC, 0xD649, 0x8AED, 0xD64A, 0x8AEE, + 0xD64B, 0x8AEF, 0xD64C, 0x8AF0, 0xD64D, 0x8AF1, 0xD64E, 0x8AF2, + 0xD64F, 0x8AF3, 0xD650, 0x8AF4, 0xD651, 0x8AF5, 0xD652, 0x8AF6, + 0xD653, 0x8AF7, 0xD654, 0x8AF8, 0xD655, 0x8AF9, 0xD656, 0x8AFA, + 0xD657, 0x8AFB, 0xD658, 0x8AFC, 0xD659, 0x8AFD, 0xD65A, 0x8AFE, + 0xD65B, 0x8AFF, 0xD65C, 0x8B00, 0xD65D, 0x8B01, 0xD65E, 0x8B02, + 0xD65F, 0x8B03, 0xD660, 0x8B04, 0xD661, 0x8B05, 0xD662, 0x8B06, + 0xD663, 0x8B08, 0xD664, 0x8B09, 0xD665, 0x8B0A, 0xD666, 0x8B0B, + 0xD667, 0x8B0C, 0xD668, 0x8B0D, 0xD669, 0x8B0E, 0xD66A, 0x8B0F, + 0xD66B, 0x8B10, 0xD66C, 0x8B11, 0xD66D, 0x8B12, 0xD66E, 0x8B13, + 0xD66F, 0x8B14, 0xD670, 0x8B15, 0xD671, 0x8B16, 0xD672, 0x8B17, + 0xD673, 0x8B18, 0xD674, 0x8B19, 0xD675, 0x8B1A, 0xD676, 0x8B1B, + 0xD677, 0x8B1C, 0xD678, 0x8B1D, 0xD679, 0x8B1E, 0xD67A, 0x8B1F, + 0xD67B, 0x8B20, 0xD67C, 0x8B21, 0xD67D, 0x8B22, 0xD67E, 0x8B23, + 0xD680, 0x8B24, 0xD681, 0x8B25, 0xD682, 0x8B27, 0xD683, 0x8B28, + 0xD684, 0x8B29, 0xD685, 0x8B2A, 0xD686, 0x8B2B, 0xD687, 0x8B2C, + 0xD688, 0x8B2D, 0xD689, 0x8B2E, 0xD68A, 0x8B2F, 0xD68B, 0x8B30, + 0xD68C, 0x8B31, 0xD68D, 0x8B32, 0xD68E, 0x8B33, 0xD68F, 0x8B34, + 0xD690, 0x8B35, 0xD691, 0x8B36, 0xD692, 0x8B37, 0xD693, 0x8B38, + 0xD694, 0x8B39, 0xD695, 0x8B3A, 0xD696, 0x8B3B, 0xD697, 0x8B3C, + 0xD698, 0x8B3D, 0xD699, 0x8B3E, 0xD69A, 0x8B3F, 0xD69B, 0x8B40, + 0xD69C, 0x8B41, 0xD69D, 0x8B42, 0xD69E, 0x8B43, 0xD69F, 0x8B44, + 0xD6A0, 0x8B45, 0xD6A1, 0x5E27, 0xD6A2, 0x75C7, 0xD6A3, 0x90D1, + 0xD6A4, 0x8BC1, 0xD6A5, 0x829D, 0xD6A6, 0x679D, 0xD6A7, 0x652F, + 0xD6A8, 0x5431, 0xD6A9, 0x8718, 0xD6AA, 0x77E5, 0xD6AB, 0x80A2, + 0xD6AC, 0x8102, 0xD6AD, 0x6C41, 0xD6AE, 0x4E4B, 0xD6AF, 0x7EC7, + 0xD6B0, 0x804C, 0xD6B1, 0x76F4, 0xD6B2, 0x690D, 0xD6B3, 0x6B96, + 0xD6B4, 0x6267, 0xD6B5, 0x503C, 0xD6B6, 0x4F84, 0xD6B7, 0x5740, + 0xD6B8, 0x6307, 0xD6B9, 0x6B62, 0xD6BA, 0x8DBE, 0xD6BB, 0x53EA, + 0xD6BC, 0x65E8, 0xD6BD, 0x7EB8, 0xD6BE, 0x5FD7, 0xD6BF, 0x631A, + 0xD6C0, 0x63B7, 0xD6C1, 0x81F3, 0xD6C2, 0x81F4, 0xD6C3, 0x7F6E, + 0xD6C4, 0x5E1C, 0xD6C5, 0x5CD9, 0xD6C6, 0x5236, 0xD6C7, 0x667A, + 0xD6C8, 0x79E9, 0xD6C9, 0x7A1A, 0xD6CA, 0x8D28, 0xD6CB, 0x7099, + 0xD6CC, 0x75D4, 0xD6CD, 0x6EDE, 0xD6CE, 0x6CBB, 0xD6CF, 0x7A92, + 0xD6D0, 0x4E2D, 0xD6D1, 0x76C5, 0xD6D2, 0x5FE0, 0xD6D3, 0x949F, + 0xD6D4, 0x8877, 0xD6D5, 0x7EC8, 0xD6D6, 0x79CD, 0xD6D7, 0x80BF, + 0xD6D8, 0x91CD, 0xD6D9, 0x4EF2, 0xD6DA, 0x4F17, 0xD6DB, 0x821F, + 0xD6DC, 0x5468, 0xD6DD, 0x5DDE, 0xD6DE, 0x6D32, 0xD6DF, 0x8BCC, + 0xD6E0, 0x7CA5, 0xD6E1, 0x8F74, 0xD6E2, 0x8098, 0xD6E3, 0x5E1A, + 0xD6E4, 0x5492, 0xD6E5, 0x76B1, 0xD6E6, 0x5B99, 0xD6E7, 0x663C, + 0xD6E8, 0x9AA4, 0xD6E9, 0x73E0, 0xD6EA, 0x682A, 0xD6EB, 0x86DB, + 0xD6EC, 0x6731, 0xD6ED, 0x732A, 0xD6EE, 0x8BF8, 0xD6EF, 0x8BDB, + 0xD6F0, 0x9010, 0xD6F1, 0x7AF9, 0xD6F2, 0x70DB, 0xD6F3, 0x716E, + 0xD6F4, 0x62C4, 0xD6F5, 0x77A9, 0xD6F6, 0x5631, 0xD6F7, 0x4E3B, + 0xD6F8, 0x8457, 0xD6F9, 0x67F1, 0xD6FA, 0x52A9, 0xD6FB, 0x86C0, + 0xD6FC, 0x8D2E, 0xD6FD, 0x94F8, 0xD6FE, 0x7B51, 0xD740, 0x8B46, + 0xD741, 0x8B47, 0xD742, 0x8B48, 0xD743, 0x8B49, 0xD744, 0x8B4A, + 0xD745, 0x8B4B, 0xD746, 0x8B4C, 0xD747, 0x8B4D, 0xD748, 0x8B4E, + 0xD749, 0x8B4F, 0xD74A, 0x8B50, 0xD74B, 0x8B51, 0xD74C, 0x8B52, + 0xD74D, 0x8B53, 0xD74E, 0x8B54, 0xD74F, 0x8B55, 0xD750, 0x8B56, + 0xD751, 0x8B57, 0xD752, 0x8B58, 0xD753, 0x8B59, 0xD754, 0x8B5A, + 0xD755, 0x8B5B, 0xD756, 0x8B5C, 0xD757, 0x8B5D, 0xD758, 0x8B5E, + 0xD759, 0x8B5F, 0xD75A, 0x8B60, 0xD75B, 0x8B61, 0xD75C, 0x8B62, + 0xD75D, 0x8B63, 0xD75E, 0x8B64, 0xD75F, 0x8B65, 0xD760, 0x8B67, + 0xD761, 0x8B68, 0xD762, 0x8B69, 0xD763, 0x8B6A, 0xD764, 0x8B6B, + 0xD765, 0x8B6D, 0xD766, 0x8B6E, 0xD767, 0x8B6F, 0xD768, 0x8B70, + 0xD769, 0x8B71, 0xD76A, 0x8B72, 0xD76B, 0x8B73, 0xD76C, 0x8B74, + 0xD76D, 0x8B75, 0xD76E, 0x8B76, 0xD76F, 0x8B77, 0xD770, 0x8B78, + 0xD771, 0x8B79, 0xD772, 0x8B7A, 0xD773, 0x8B7B, 0xD774, 0x8B7C, + 0xD775, 0x8B7D, 0xD776, 0x8B7E, 0xD777, 0x8B7F, 0xD778, 0x8B80, + 0xD779, 0x8B81, 0xD77A, 0x8B82, 0xD77B, 0x8B83, 0xD77C, 0x8B84, + 0xD77D, 0x8B85, 0xD77E, 0x8B86, 0xD780, 0x8B87, 0xD781, 0x8B88, + 0xD782, 0x8B89, 0xD783, 0x8B8A, 0xD784, 0x8B8B, 0xD785, 0x8B8C, + 0xD786, 0x8B8D, 0xD787, 0x8B8E, 0xD788, 0x8B8F, 0xD789, 0x8B90, + 0xD78A, 0x8B91, 0xD78B, 0x8B92, 0xD78C, 0x8B93, 0xD78D, 0x8B94, + 0xD78E, 0x8B95, 0xD78F, 0x8B96, 0xD790, 0x8B97, 0xD791, 0x8B98, + 0xD792, 0x8B99, 0xD793, 0x8B9A, 0xD794, 0x8B9B, 0xD795, 0x8B9C, + 0xD796, 0x8B9D, 0xD797, 0x8B9E, 0xD798, 0x8B9F, 0xD799, 0x8BAC, + 0xD79A, 0x8BB1, 0xD79B, 0x8BBB, 0xD79C, 0x8BC7, 0xD79D, 0x8BD0, + 0xD79E, 0x8BEA, 0xD79F, 0x8C09, 0xD7A0, 0x8C1E, 0xD7A1, 0x4F4F, + 0xD7A2, 0x6CE8, 0xD7A3, 0x795D, 0xD7A4, 0x9A7B, 0xD7A5, 0x6293, + 0xD7A6, 0x722A, 0xD7A7, 0x62FD, 0xD7A8, 0x4E13, 0xD7A9, 0x7816, + 0xD7AA, 0x8F6C, 0xD7AB, 0x64B0, 0xD7AC, 0x8D5A, 0xD7AD, 0x7BC6, + 0xD7AE, 0x6869, 0xD7AF, 0x5E84, 0xD7B0, 0x88C5, 0xD7B1, 0x5986, + 0xD7B2, 0x649E, 0xD7B3, 0x58EE, 0xD7B4, 0x72B6, 0xD7B5, 0x690E, + 0xD7B6, 0x9525, 0xD7B7, 0x8FFD, 0xD7B8, 0x8D58, 0xD7B9, 0x5760, + 0xD7BA, 0x7F00, 0xD7BB, 0x8C06, 0xD7BC, 0x51C6, 0xD7BD, 0x6349, + 0xD7BE, 0x62D9, 0xD7BF, 0x5353, 0xD7C0, 0x684C, 0xD7C1, 0x7422, + 0xD7C2, 0x8301, 0xD7C3, 0x914C, 0xD7C4, 0x5544, 0xD7C5, 0x7740, + 0xD7C6, 0x707C, 0xD7C7, 0x6D4A, 0xD7C8, 0x5179, 0xD7C9, 0x54A8, + 0xD7CA, 0x8D44, 0xD7CB, 0x59FF, 0xD7CC, 0x6ECB, 0xD7CD, 0x6DC4, + 0xD7CE, 0x5B5C, 0xD7CF, 0x7D2B, 0xD7D0, 0x4ED4, 0xD7D1, 0x7C7D, + 0xD7D2, 0x6ED3, 0xD7D3, 0x5B50, 0xD7D4, 0x81EA, 0xD7D5, 0x6E0D, + 0xD7D6, 0x5B57, 0xD7D7, 0x9B03, 0xD7D8, 0x68D5, 0xD7D9, 0x8E2A, + 0xD7DA, 0x5B97, 0xD7DB, 0x7EFC, 0xD7DC, 0x603B, 0xD7DD, 0x7EB5, + 0xD7DE, 0x90B9, 0xD7DF, 0x8D70, 0xD7E0, 0x594F, 0xD7E1, 0x63CD, + 0xD7E2, 0x79DF, 0xD7E3, 0x8DB3, 0xD7E4, 0x5352, 0xD7E5, 0x65CF, + 0xD7E6, 0x7956, 0xD7E7, 0x8BC5, 0xD7E8, 0x963B, 0xD7E9, 0x7EC4, + 0xD7EA, 0x94BB, 0xD7EB, 0x7E82, 0xD7EC, 0x5634, 0xD7ED, 0x9189, + 0xD7EE, 0x6700, 0xD7EF, 0x7F6A, 0xD7F0, 0x5C0A, 0xD7F1, 0x9075, + 0xD7F2, 0x6628, 0xD7F3, 0x5DE6, 0xD7F4, 0x4F50, 0xD7F5, 0x67DE, + 0xD7F6, 0x505A, 0xD7F7, 0x4F5C, 0xD7F8, 0x5750, 0xD7F9, 0x5EA7, + 0xD840, 0x8C38, 0xD841, 0x8C39, 0xD842, 0x8C3A, 0xD843, 0x8C3B, + 0xD844, 0x8C3C, 0xD845, 0x8C3D, 0xD846, 0x8C3E, 0xD847, 0x8C3F, + 0xD848, 0x8C40, 0xD849, 0x8C42, 0xD84A, 0x8C43, 0xD84B, 0x8C44, + 0xD84C, 0x8C45, 0xD84D, 0x8C48, 0xD84E, 0x8C4A, 0xD84F, 0x8C4B, + 0xD850, 0x8C4D, 0xD851, 0x8C4E, 0xD852, 0x8C4F, 0xD853, 0x8C50, + 0xD854, 0x8C51, 0xD855, 0x8C52, 0xD856, 0x8C53, 0xD857, 0x8C54, + 0xD858, 0x8C56, 0xD859, 0x8C57, 0xD85A, 0x8C58, 0xD85B, 0x8C59, + 0xD85C, 0x8C5B, 0xD85D, 0x8C5C, 0xD85E, 0x8C5D, 0xD85F, 0x8C5E, + 0xD860, 0x8C5F, 0xD861, 0x8C60, 0xD862, 0x8C63, 0xD863, 0x8C64, + 0xD864, 0x8C65, 0xD865, 0x8C66, 0xD866, 0x8C67, 0xD867, 0x8C68, + 0xD868, 0x8C69, 0xD869, 0x8C6C, 0xD86A, 0x8C6D, 0xD86B, 0x8C6E, + 0xD86C, 0x8C6F, 0xD86D, 0x8C70, 0xD86E, 0x8C71, 0xD86F, 0x8C72, + 0xD870, 0x8C74, 0xD871, 0x8C75, 0xD872, 0x8C76, 0xD873, 0x8C77, + 0xD874, 0x8C7B, 0xD875, 0x8C7C, 0xD876, 0x8C7D, 0xD877, 0x8C7E, + 0xD878, 0x8C7F, 0xD879, 0x8C80, 0xD87A, 0x8C81, 0xD87B, 0x8C83, + 0xD87C, 0x8C84, 0xD87D, 0x8C86, 0xD87E, 0x8C87, 0xD880, 0x8C88, + 0xD881, 0x8C8B, 0xD882, 0x8C8D, 0xD883, 0x8C8E, 0xD884, 0x8C8F, + 0xD885, 0x8C90, 0xD886, 0x8C91, 0xD887, 0x8C92, 0xD888, 0x8C93, + 0xD889, 0x8C95, 0xD88A, 0x8C96, 0xD88B, 0x8C97, 0xD88C, 0x8C99, + 0xD88D, 0x8C9A, 0xD88E, 0x8C9B, 0xD88F, 0x8C9C, 0xD890, 0x8C9D, + 0xD891, 0x8C9E, 0xD892, 0x8C9F, 0xD893, 0x8CA0, 0xD894, 0x8CA1, + 0xD895, 0x8CA2, 0xD896, 0x8CA3, 0xD897, 0x8CA4, 0xD898, 0x8CA5, + 0xD899, 0x8CA6, 0xD89A, 0x8CA7, 0xD89B, 0x8CA8, 0xD89C, 0x8CA9, + 0xD89D, 0x8CAA, 0xD89E, 0x8CAB, 0xD89F, 0x8CAC, 0xD8A0, 0x8CAD, + 0xD8A1, 0x4E8D, 0xD8A2, 0x4E0C, 0xD8A3, 0x5140, 0xD8A4, 0x4E10, + 0xD8A5, 0x5EFF, 0xD8A6, 0x5345, 0xD8A7, 0x4E15, 0xD8A8, 0x4E98, + 0xD8A9, 0x4E1E, 0xD8AA, 0x9B32, 0xD8AB, 0x5B6C, 0xD8AC, 0x5669, + 0xD8AD, 0x4E28, 0xD8AE, 0x79BA, 0xD8AF, 0x4E3F, 0xD8B0, 0x5315, + 0xD8B1, 0x4E47, 0xD8B2, 0x592D, 0xD8B3, 0x723B, 0xD8B4, 0x536E, + 0xD8B5, 0x6C10, 0xD8B6, 0x56DF, 0xD8B7, 0x80E4, 0xD8B8, 0x9997, + 0xD8B9, 0x6BD3, 0xD8BA, 0x777E, 0xD8BB, 0x9F17, 0xD8BC, 0x4E36, + 0xD8BD, 0x4E9F, 0xD8BE, 0x9F10, 0xD8BF, 0x4E5C, 0xD8C0, 0x4E69, + 0xD8C1, 0x4E93, 0xD8C2, 0x8288, 0xD8C3, 0x5B5B, 0xD8C4, 0x556C, + 0xD8C5, 0x560F, 0xD8C6, 0x4EC4, 0xD8C7, 0x538D, 0xD8C8, 0x539D, + 0xD8C9, 0x53A3, 0xD8CA, 0x53A5, 0xD8CB, 0x53AE, 0xD8CC, 0x9765, + 0xD8CD, 0x8D5D, 0xD8CE, 0x531A, 0xD8CF, 0x53F5, 0xD8D0, 0x5326, + 0xD8D1, 0x532E, 0xD8D2, 0x533E, 0xD8D3, 0x8D5C, 0xD8D4, 0x5366, + 0xD8D5, 0x5363, 0xD8D6, 0x5202, 0xD8D7, 0x5208, 0xD8D8, 0x520E, + 0xD8D9, 0x522D, 0xD8DA, 0x5233, 0xD8DB, 0x523F, 0xD8DC, 0x5240, + 0xD8DD, 0x524C, 0xD8DE, 0x525E, 0xD8DF, 0x5261, 0xD8E0, 0x525C, + 0xD8E1, 0x84AF, 0xD8E2, 0x527D, 0xD8E3, 0x5282, 0xD8E4, 0x5281, + 0xD8E5, 0x5290, 0xD8E6, 0x5293, 0xD8E7, 0x5182, 0xD8E8, 0x7F54, + 0xD8E9, 0x4EBB, 0xD8EA, 0x4EC3, 0xD8EB, 0x4EC9, 0xD8EC, 0x4EC2, + 0xD8ED, 0x4EE8, 0xD8EE, 0x4EE1, 0xD8EF, 0x4EEB, 0xD8F0, 0x4EDE, + 0xD8F1, 0x4F1B, 0xD8F2, 0x4EF3, 0xD8F3, 0x4F22, 0xD8F4, 0x4F64, + 0xD8F5, 0x4EF5, 0xD8F6, 0x4F25, 0xD8F7, 0x4F27, 0xD8F8, 0x4F09, + 0xD8F9, 0x4F2B, 0xD8FA, 0x4F5E, 0xD8FB, 0x4F67, 0xD8FC, 0x6538, + 0xD8FD, 0x4F5A, 0xD8FE, 0x4F5D, 0xD940, 0x8CAE, 0xD941, 0x8CAF, + 0xD942, 0x8CB0, 0xD943, 0x8CB1, 0xD944, 0x8CB2, 0xD945, 0x8CB3, + 0xD946, 0x8CB4, 0xD947, 0x8CB5, 0xD948, 0x8CB6, 0xD949, 0x8CB7, + 0xD94A, 0x8CB8, 0xD94B, 0x8CB9, 0xD94C, 0x8CBA, 0xD94D, 0x8CBB, + 0xD94E, 0x8CBC, 0xD94F, 0x8CBD, 0xD950, 0x8CBE, 0xD951, 0x8CBF, + 0xD952, 0x8CC0, 0xD953, 0x8CC1, 0xD954, 0x8CC2, 0xD955, 0x8CC3, + 0xD956, 0x8CC4, 0xD957, 0x8CC5, 0xD958, 0x8CC6, 0xD959, 0x8CC7, + 0xD95A, 0x8CC8, 0xD95B, 0x8CC9, 0xD95C, 0x8CCA, 0xD95D, 0x8CCB, + 0xD95E, 0x8CCC, 0xD95F, 0x8CCD, 0xD960, 0x8CCE, 0xD961, 0x8CCF, + 0xD962, 0x8CD0, 0xD963, 0x8CD1, 0xD964, 0x8CD2, 0xD965, 0x8CD3, + 0xD966, 0x8CD4, 0xD967, 0x8CD5, 0xD968, 0x8CD6, 0xD969, 0x8CD7, + 0xD96A, 0x8CD8, 0xD96B, 0x8CD9, 0xD96C, 0x8CDA, 0xD96D, 0x8CDB, + 0xD96E, 0x8CDC, 0xD96F, 0x8CDD, 0xD970, 0x8CDE, 0xD971, 0x8CDF, + 0xD972, 0x8CE0, 0xD973, 0x8CE1, 0xD974, 0x8CE2, 0xD975, 0x8CE3, + 0xD976, 0x8CE4, 0xD977, 0x8CE5, 0xD978, 0x8CE6, 0xD979, 0x8CE7, + 0xD97A, 0x8CE8, 0xD97B, 0x8CE9, 0xD97C, 0x8CEA, 0xD97D, 0x8CEB, + 0xD97E, 0x8CEC, 0xD980, 0x8CED, 0xD981, 0x8CEE, 0xD982, 0x8CEF, + 0xD983, 0x8CF0, 0xD984, 0x8CF1, 0xD985, 0x8CF2, 0xD986, 0x8CF3, + 0xD987, 0x8CF4, 0xD988, 0x8CF5, 0xD989, 0x8CF6, 0xD98A, 0x8CF7, + 0xD98B, 0x8CF8, 0xD98C, 0x8CF9, 0xD98D, 0x8CFA, 0xD98E, 0x8CFB, + 0xD98F, 0x8CFC, 0xD990, 0x8CFD, 0xD991, 0x8CFE, 0xD992, 0x8CFF, + 0xD993, 0x8D00, 0xD994, 0x8D01, 0xD995, 0x8D02, 0xD996, 0x8D03, + 0xD997, 0x8D04, 0xD998, 0x8D05, 0xD999, 0x8D06, 0xD99A, 0x8D07, + 0xD99B, 0x8D08, 0xD99C, 0x8D09, 0xD99D, 0x8D0A, 0xD99E, 0x8D0B, + 0xD99F, 0x8D0C, 0xD9A0, 0x8D0D, 0xD9A1, 0x4F5F, 0xD9A2, 0x4F57, + 0xD9A3, 0x4F32, 0xD9A4, 0x4F3D, 0xD9A5, 0x4F76, 0xD9A6, 0x4F74, + 0xD9A7, 0x4F91, 0xD9A8, 0x4F89, 0xD9A9, 0x4F83, 0xD9AA, 0x4F8F, + 0xD9AB, 0x4F7E, 0xD9AC, 0x4F7B, 0xD9AD, 0x4FAA, 0xD9AE, 0x4F7C, + 0xD9AF, 0x4FAC, 0xD9B0, 0x4F94, 0xD9B1, 0x4FE6, 0xD9B2, 0x4FE8, + 0xD9B3, 0x4FEA, 0xD9B4, 0x4FC5, 0xD9B5, 0x4FDA, 0xD9B6, 0x4FE3, + 0xD9B7, 0x4FDC, 0xD9B8, 0x4FD1, 0xD9B9, 0x4FDF, 0xD9BA, 0x4FF8, + 0xD9BB, 0x5029, 0xD9BC, 0x504C, 0xD9BD, 0x4FF3, 0xD9BE, 0x502C, + 0xD9BF, 0x500F, 0xD9C0, 0x502E, 0xD9C1, 0x502D, 0xD9C2, 0x4FFE, + 0xD9C3, 0x501C, 0xD9C4, 0x500C, 0xD9C5, 0x5025, 0xD9C6, 0x5028, + 0xD9C7, 0x507E, 0xD9C8, 0x5043, 0xD9C9, 0x5055, 0xD9CA, 0x5048, + 0xD9CB, 0x504E, 0xD9CC, 0x506C, 0xD9CD, 0x507B, 0xD9CE, 0x50A5, + 0xD9CF, 0x50A7, 0xD9D0, 0x50A9, 0xD9D1, 0x50BA, 0xD9D2, 0x50D6, + 0xD9D3, 0x5106, 0xD9D4, 0x50ED, 0xD9D5, 0x50EC, 0xD9D6, 0x50E6, + 0xD9D7, 0x50EE, 0xD9D8, 0x5107, 0xD9D9, 0x510B, 0xD9DA, 0x4EDD, + 0xD9DB, 0x6C3D, 0xD9DC, 0x4F58, 0xD9DD, 0x4F65, 0xD9DE, 0x4FCE, + 0xD9DF, 0x9FA0, 0xD9E0, 0x6C46, 0xD9E1, 0x7C74, 0xD9E2, 0x516E, + 0xD9E3, 0x5DFD, 0xD9E4, 0x9EC9, 0xD9E5, 0x9998, 0xD9E6, 0x5181, + 0xD9E7, 0x5914, 0xD9E8, 0x52F9, 0xD9E9, 0x530D, 0xD9EA, 0x8A07, + 0xD9EB, 0x5310, 0xD9EC, 0x51EB, 0xD9ED, 0x5919, 0xD9EE, 0x5155, + 0xD9EF, 0x4EA0, 0xD9F0, 0x5156, 0xD9F1, 0x4EB3, 0xD9F2, 0x886E, + 0xD9F3, 0x88A4, 0xD9F4, 0x4EB5, 0xD9F5, 0x8114, 0xD9F6, 0x88D2, + 0xD9F7, 0x7980, 0xD9F8, 0x5B34, 0xD9F9, 0x8803, 0xD9FA, 0x7FB8, + 0xD9FB, 0x51AB, 0xD9FC, 0x51B1, 0xD9FD, 0x51BD, 0xD9FE, 0x51BC, + 0xDA40, 0x8D0E, 0xDA41, 0x8D0F, 0xDA42, 0x8D10, 0xDA43, 0x8D11, + 0xDA44, 0x8D12, 0xDA45, 0x8D13, 0xDA46, 0x8D14, 0xDA47, 0x8D15, + 0xDA48, 0x8D16, 0xDA49, 0x8D17, 0xDA4A, 0x8D18, 0xDA4B, 0x8D19, + 0xDA4C, 0x8D1A, 0xDA4D, 0x8D1B, 0xDA4E, 0x8D1C, 0xDA4F, 0x8D20, + 0xDA50, 0x8D51, 0xDA51, 0x8D52, 0xDA52, 0x8D57, 0xDA53, 0x8D5F, + 0xDA54, 0x8D65, 0xDA55, 0x8D68, 0xDA56, 0x8D69, 0xDA57, 0x8D6A, + 0xDA58, 0x8D6C, 0xDA59, 0x8D6E, 0xDA5A, 0x8D6F, 0xDA5B, 0x8D71, + 0xDA5C, 0x8D72, 0xDA5D, 0x8D78, 0xDA5E, 0x8D79, 0xDA5F, 0x8D7A, + 0xDA60, 0x8D7B, 0xDA61, 0x8D7C, 0xDA62, 0x8D7D, 0xDA63, 0x8D7E, + 0xDA64, 0x8D7F, 0xDA65, 0x8D80, 0xDA66, 0x8D82, 0xDA67, 0x8D83, + 0xDA68, 0x8D86, 0xDA69, 0x8D87, 0xDA6A, 0x8D88, 0xDA6B, 0x8D89, + 0xDA6C, 0x8D8C, 0xDA6D, 0x8D8D, 0xDA6E, 0x8D8E, 0xDA6F, 0x8D8F, + 0xDA70, 0x8D90, 0xDA71, 0x8D92, 0xDA72, 0x8D93, 0xDA73, 0x8D95, + 0xDA74, 0x8D96, 0xDA75, 0x8D97, 0xDA76, 0x8D98, 0xDA77, 0x8D99, + 0xDA78, 0x8D9A, 0xDA79, 0x8D9B, 0xDA7A, 0x8D9C, 0xDA7B, 0x8D9D, + 0xDA7C, 0x8D9E, 0xDA7D, 0x8DA0, 0xDA7E, 0x8DA1, 0xDA80, 0x8DA2, + 0xDA81, 0x8DA4, 0xDA82, 0x8DA5, 0xDA83, 0x8DA6, 0xDA84, 0x8DA7, + 0xDA85, 0x8DA8, 0xDA86, 0x8DA9, 0xDA87, 0x8DAA, 0xDA88, 0x8DAB, + 0xDA89, 0x8DAC, 0xDA8A, 0x8DAD, 0xDA8B, 0x8DAE, 0xDA8C, 0x8DAF, + 0xDA8D, 0x8DB0, 0xDA8E, 0x8DB2, 0xDA8F, 0x8DB6, 0xDA90, 0x8DB7, + 0xDA91, 0x8DB9, 0xDA92, 0x8DBB, 0xDA93, 0x8DBD, 0xDA94, 0x8DC0, + 0xDA95, 0x8DC1, 0xDA96, 0x8DC2, 0xDA97, 0x8DC5, 0xDA98, 0x8DC7, + 0xDA99, 0x8DC8, 0xDA9A, 0x8DC9, 0xDA9B, 0x8DCA, 0xDA9C, 0x8DCD, + 0xDA9D, 0x8DD0, 0xDA9E, 0x8DD2, 0xDA9F, 0x8DD3, 0xDAA0, 0x8DD4, + 0xDAA1, 0x51C7, 0xDAA2, 0x5196, 0xDAA3, 0x51A2, 0xDAA4, 0x51A5, + 0xDAA5, 0x8BA0, 0xDAA6, 0x8BA6, 0xDAA7, 0x8BA7, 0xDAA8, 0x8BAA, + 0xDAA9, 0x8BB4, 0xDAAA, 0x8BB5, 0xDAAB, 0x8BB7, 0xDAAC, 0x8BC2, + 0xDAAD, 0x8BC3, 0xDAAE, 0x8BCB, 0xDAAF, 0x8BCF, 0xDAB0, 0x8BCE, + 0xDAB1, 0x8BD2, 0xDAB2, 0x8BD3, 0xDAB3, 0x8BD4, 0xDAB4, 0x8BD6, + 0xDAB5, 0x8BD8, 0xDAB6, 0x8BD9, 0xDAB7, 0x8BDC, 0xDAB8, 0x8BDF, + 0xDAB9, 0x8BE0, 0xDABA, 0x8BE4, 0xDABB, 0x8BE8, 0xDABC, 0x8BE9, + 0xDABD, 0x8BEE, 0xDABE, 0x8BF0, 0xDABF, 0x8BF3, 0xDAC0, 0x8BF6, + 0xDAC1, 0x8BF9, 0xDAC2, 0x8BFC, 0xDAC3, 0x8BFF, 0xDAC4, 0x8C00, + 0xDAC5, 0x8C02, 0xDAC6, 0x8C04, 0xDAC7, 0x8C07, 0xDAC8, 0x8C0C, + 0xDAC9, 0x8C0F, 0xDACA, 0x8C11, 0xDACB, 0x8C12, 0xDACC, 0x8C14, + 0xDACD, 0x8C15, 0xDACE, 0x8C16, 0xDACF, 0x8C19, 0xDAD0, 0x8C1B, + 0xDAD1, 0x8C18, 0xDAD2, 0x8C1D, 0xDAD3, 0x8C1F, 0xDAD4, 0x8C20, + 0xDAD5, 0x8C21, 0xDAD6, 0x8C25, 0xDAD7, 0x8C27, 0xDAD8, 0x8C2A, + 0xDAD9, 0x8C2B, 0xDADA, 0x8C2E, 0xDADB, 0x8C2F, 0xDADC, 0x8C32, + 0xDADD, 0x8C33, 0xDADE, 0x8C35, 0xDADF, 0x8C36, 0xDAE0, 0x5369, + 0xDAE1, 0x537A, 0xDAE2, 0x961D, 0xDAE3, 0x9622, 0xDAE4, 0x9621, + 0xDAE5, 0x9631, 0xDAE6, 0x962A, 0xDAE7, 0x963D, 0xDAE8, 0x963C, + 0xDAE9, 0x9642, 0xDAEA, 0x9649, 0xDAEB, 0x9654, 0xDAEC, 0x965F, + 0xDAED, 0x9667, 0xDAEE, 0x966C, 0xDAEF, 0x9672, 0xDAF0, 0x9674, + 0xDAF1, 0x9688, 0xDAF2, 0x968D, 0xDAF3, 0x9697, 0xDAF4, 0x96B0, + 0xDAF5, 0x9097, 0xDAF6, 0x909B, 0xDAF7, 0x909D, 0xDAF8, 0x9099, + 0xDAF9, 0x90AC, 0xDAFA, 0x90A1, 0xDAFB, 0x90B4, 0xDAFC, 0x90B3, + 0xDAFD, 0x90B6, 0xDAFE, 0x90BA, 0xDB40, 0x8DD5, 0xDB41, 0x8DD8, + 0xDB42, 0x8DD9, 0xDB43, 0x8DDC, 0xDB44, 0x8DE0, 0xDB45, 0x8DE1, + 0xDB46, 0x8DE2, 0xDB47, 0x8DE5, 0xDB48, 0x8DE6, 0xDB49, 0x8DE7, + 0xDB4A, 0x8DE9, 0xDB4B, 0x8DED, 0xDB4C, 0x8DEE, 0xDB4D, 0x8DF0, + 0xDB4E, 0x8DF1, 0xDB4F, 0x8DF2, 0xDB50, 0x8DF4, 0xDB51, 0x8DF6, + 0xDB52, 0x8DFC, 0xDB53, 0x8DFE, 0xDB54, 0x8DFF, 0xDB55, 0x8E00, + 0xDB56, 0x8E01, 0xDB57, 0x8E02, 0xDB58, 0x8E03, 0xDB59, 0x8E04, + 0xDB5A, 0x8E06, 0xDB5B, 0x8E07, 0xDB5C, 0x8E08, 0xDB5D, 0x8E0B, + 0xDB5E, 0x8E0D, 0xDB5F, 0x8E0E, 0xDB60, 0x8E10, 0xDB61, 0x8E11, + 0xDB62, 0x8E12, 0xDB63, 0x8E13, 0xDB64, 0x8E15, 0xDB65, 0x8E16, + 0xDB66, 0x8E17, 0xDB67, 0x8E18, 0xDB68, 0x8E19, 0xDB69, 0x8E1A, + 0xDB6A, 0x8E1B, 0xDB6B, 0x8E1C, 0xDB6C, 0x8E20, 0xDB6D, 0x8E21, + 0xDB6E, 0x8E24, 0xDB6F, 0x8E25, 0xDB70, 0x8E26, 0xDB71, 0x8E27, + 0xDB72, 0x8E28, 0xDB73, 0x8E2B, 0xDB74, 0x8E2D, 0xDB75, 0x8E30, + 0xDB76, 0x8E32, 0xDB77, 0x8E33, 0xDB78, 0x8E34, 0xDB79, 0x8E36, + 0xDB7A, 0x8E37, 0xDB7B, 0x8E38, 0xDB7C, 0x8E3B, 0xDB7D, 0x8E3C, + 0xDB7E, 0x8E3E, 0xDB80, 0x8E3F, 0xDB81, 0x8E43, 0xDB82, 0x8E45, + 0xDB83, 0x8E46, 0xDB84, 0x8E4C, 0xDB85, 0x8E4D, 0xDB86, 0x8E4E, + 0xDB87, 0x8E4F, 0xDB88, 0x8E50, 0xDB89, 0x8E53, 0xDB8A, 0x8E54, + 0xDB8B, 0x8E55, 0xDB8C, 0x8E56, 0xDB8D, 0x8E57, 0xDB8E, 0x8E58, + 0xDB8F, 0x8E5A, 0xDB90, 0x8E5B, 0xDB91, 0x8E5C, 0xDB92, 0x8E5D, + 0xDB93, 0x8E5E, 0xDB94, 0x8E5F, 0xDB95, 0x8E60, 0xDB96, 0x8E61, + 0xDB97, 0x8E62, 0xDB98, 0x8E63, 0xDB99, 0x8E64, 0xDB9A, 0x8E65, + 0xDB9B, 0x8E67, 0xDB9C, 0x8E68, 0xDB9D, 0x8E6A, 0xDB9E, 0x8E6B, + 0xDB9F, 0x8E6E, 0xDBA0, 0x8E71, 0xDBA1, 0x90B8, 0xDBA2, 0x90B0, + 0xDBA3, 0x90CF, 0xDBA4, 0x90C5, 0xDBA5, 0x90BE, 0xDBA6, 0x90D0, + 0xDBA7, 0x90C4, 0xDBA8, 0x90C7, 0xDBA9, 0x90D3, 0xDBAA, 0x90E6, + 0xDBAB, 0x90E2, 0xDBAC, 0x90DC, 0xDBAD, 0x90D7, 0xDBAE, 0x90DB, + 0xDBAF, 0x90EB, 0xDBB0, 0x90EF, 0xDBB1, 0x90FE, 0xDBB2, 0x9104, + 0xDBB3, 0x9122, 0xDBB4, 0x911E, 0xDBB5, 0x9123, 0xDBB6, 0x9131, + 0xDBB7, 0x912F, 0xDBB8, 0x9139, 0xDBB9, 0x9143, 0xDBBA, 0x9146, + 0xDBBB, 0x520D, 0xDBBC, 0x5942, 0xDBBD, 0x52A2, 0xDBBE, 0x52AC, + 0xDBBF, 0x52AD, 0xDBC0, 0x52BE, 0xDBC1, 0x54FF, 0xDBC2, 0x52D0, + 0xDBC3, 0x52D6, 0xDBC4, 0x52F0, 0xDBC5, 0x53DF, 0xDBC6, 0x71EE, + 0xDBC7, 0x77CD, 0xDBC8, 0x5EF4, 0xDBC9, 0x51F5, 0xDBCA, 0x51FC, + 0xDBCB, 0x9B2F, 0xDBCC, 0x53B6, 0xDBCD, 0x5F01, 0xDBCE, 0x755A, + 0xDBCF, 0x5DEF, 0xDBD0, 0x574C, 0xDBD1, 0x57A9, 0xDBD2, 0x57A1, + 0xDBD3, 0x587E, 0xDBD4, 0x58BC, 0xDBD5, 0x58C5, 0xDBD6, 0x58D1, + 0xDBD7, 0x5729, 0xDBD8, 0x572C, 0xDBD9, 0x572A, 0xDBDA, 0x5733, + 0xDBDB, 0x5739, 0xDBDC, 0x572E, 0xDBDD, 0x572F, 0xDBDE, 0x575C, + 0xDBDF, 0x573B, 0xDBE0, 0x5742, 0xDBE1, 0x5769, 0xDBE2, 0x5785, + 0xDBE3, 0x576B, 0xDBE4, 0x5786, 0xDBE5, 0x577C, 0xDBE6, 0x577B, + 0xDBE7, 0x5768, 0xDBE8, 0x576D, 0xDBE9, 0x5776, 0xDBEA, 0x5773, + 0xDBEB, 0x57AD, 0xDBEC, 0x57A4, 0xDBED, 0x578C, 0xDBEE, 0x57B2, + 0xDBEF, 0x57CF, 0xDBF0, 0x57A7, 0xDBF1, 0x57B4, 0xDBF2, 0x5793, + 0xDBF3, 0x57A0, 0xDBF4, 0x57D5, 0xDBF5, 0x57D8, 0xDBF6, 0x57DA, + 0xDBF7, 0x57D9, 0xDBF8, 0x57D2, 0xDBF9, 0x57B8, 0xDBFA, 0x57F4, + 0xDBFB, 0x57EF, 0xDBFC, 0x57F8, 0xDBFD, 0x57E4, 0xDBFE, 0x57DD, + 0xDC40, 0x8E73, 0xDC41, 0x8E75, 0xDC42, 0x8E77, 0xDC43, 0x8E78, + 0xDC44, 0x8E79, 0xDC45, 0x8E7A, 0xDC46, 0x8E7B, 0xDC47, 0x8E7D, + 0xDC48, 0x8E7E, 0xDC49, 0x8E80, 0xDC4A, 0x8E82, 0xDC4B, 0x8E83, + 0xDC4C, 0x8E84, 0xDC4D, 0x8E86, 0xDC4E, 0x8E88, 0xDC4F, 0x8E89, + 0xDC50, 0x8E8A, 0xDC51, 0x8E8B, 0xDC52, 0x8E8C, 0xDC53, 0x8E8D, + 0xDC54, 0x8E8E, 0xDC55, 0x8E91, 0xDC56, 0x8E92, 0xDC57, 0x8E93, + 0xDC58, 0x8E95, 0xDC59, 0x8E96, 0xDC5A, 0x8E97, 0xDC5B, 0x8E98, + 0xDC5C, 0x8E99, 0xDC5D, 0x8E9A, 0xDC5E, 0x8E9B, 0xDC5F, 0x8E9D, + 0xDC60, 0x8E9F, 0xDC61, 0x8EA0, 0xDC62, 0x8EA1, 0xDC63, 0x8EA2, + 0xDC64, 0x8EA3, 0xDC65, 0x8EA4, 0xDC66, 0x8EA5, 0xDC67, 0x8EA6, + 0xDC68, 0x8EA7, 0xDC69, 0x8EA8, 0xDC6A, 0x8EA9, 0xDC6B, 0x8EAA, + 0xDC6C, 0x8EAD, 0xDC6D, 0x8EAE, 0xDC6E, 0x8EB0, 0xDC6F, 0x8EB1, + 0xDC70, 0x8EB3, 0xDC71, 0x8EB4, 0xDC72, 0x8EB5, 0xDC73, 0x8EB6, + 0xDC74, 0x8EB7, 0xDC75, 0x8EB8, 0xDC76, 0x8EB9, 0xDC77, 0x8EBB, + 0xDC78, 0x8EBC, 0xDC79, 0x8EBD, 0xDC7A, 0x8EBE, 0xDC7B, 0x8EBF, + 0xDC7C, 0x8EC0, 0xDC7D, 0x8EC1, 0xDC7E, 0x8EC2, 0xDC80, 0x8EC3, + 0xDC81, 0x8EC4, 0xDC82, 0x8EC5, 0xDC83, 0x8EC6, 0xDC84, 0x8EC7, + 0xDC85, 0x8EC8, 0xDC86, 0x8EC9, 0xDC87, 0x8ECA, 0xDC88, 0x8ECB, + 0xDC89, 0x8ECC, 0xDC8A, 0x8ECD, 0xDC8B, 0x8ECF, 0xDC8C, 0x8ED0, + 0xDC8D, 0x8ED1, 0xDC8E, 0x8ED2, 0xDC8F, 0x8ED3, 0xDC90, 0x8ED4, + 0xDC91, 0x8ED5, 0xDC92, 0x8ED6, 0xDC93, 0x8ED7, 0xDC94, 0x8ED8, + 0xDC95, 0x8ED9, 0xDC96, 0x8EDA, 0xDC97, 0x8EDB, 0xDC98, 0x8EDC, + 0xDC99, 0x8EDD, 0xDC9A, 0x8EDE, 0xDC9B, 0x8EDF, 0xDC9C, 0x8EE0, + 0xDC9D, 0x8EE1, 0xDC9E, 0x8EE2, 0xDC9F, 0x8EE3, 0xDCA0, 0x8EE4, + 0xDCA1, 0x580B, 0xDCA2, 0x580D, 0xDCA3, 0x57FD, 0xDCA4, 0x57ED, + 0xDCA5, 0x5800, 0xDCA6, 0x581E, 0xDCA7, 0x5819, 0xDCA8, 0x5844, + 0xDCA9, 0x5820, 0xDCAA, 0x5865, 0xDCAB, 0x586C, 0xDCAC, 0x5881, + 0xDCAD, 0x5889, 0xDCAE, 0x589A, 0xDCAF, 0x5880, 0xDCB0, 0x99A8, + 0xDCB1, 0x9F19, 0xDCB2, 0x61FF, 0xDCB3, 0x8279, 0xDCB4, 0x827D, + 0xDCB5, 0x827F, 0xDCB6, 0x828F, 0xDCB7, 0x828A, 0xDCB8, 0x82A8, + 0xDCB9, 0x8284, 0xDCBA, 0x828E, 0xDCBB, 0x8291, 0xDCBC, 0x8297, + 0xDCBD, 0x8299, 0xDCBE, 0x82AB, 0xDCBF, 0x82B8, 0xDCC0, 0x82BE, + 0xDCC1, 0x82B0, 0xDCC2, 0x82C8, 0xDCC3, 0x82CA, 0xDCC4, 0x82E3, + 0xDCC5, 0x8298, 0xDCC6, 0x82B7, 0xDCC7, 0x82AE, 0xDCC8, 0x82CB, + 0xDCC9, 0x82CC, 0xDCCA, 0x82C1, 0xDCCB, 0x82A9, 0xDCCC, 0x82B4, + 0xDCCD, 0x82A1, 0xDCCE, 0x82AA, 0xDCCF, 0x829F, 0xDCD0, 0x82C4, + 0xDCD1, 0x82CE, 0xDCD2, 0x82A4, 0xDCD3, 0x82E1, 0xDCD4, 0x8309, + 0xDCD5, 0x82F7, 0xDCD6, 0x82E4, 0xDCD7, 0x830F, 0xDCD8, 0x8307, + 0xDCD9, 0x82DC, 0xDCDA, 0x82F4, 0xDCDB, 0x82D2, 0xDCDC, 0x82D8, + 0xDCDD, 0x830C, 0xDCDE, 0x82FB, 0xDCDF, 0x82D3, 0xDCE0, 0x8311, + 0xDCE1, 0x831A, 0xDCE2, 0x8306, 0xDCE3, 0x8314, 0xDCE4, 0x8315, + 0xDCE5, 0x82E0, 0xDCE6, 0x82D5, 0xDCE7, 0x831C, 0xDCE8, 0x8351, + 0xDCE9, 0x835B, 0xDCEA, 0x835C, 0xDCEB, 0x8308, 0xDCEC, 0x8392, + 0xDCED, 0x833C, 0xDCEE, 0x8334, 0xDCEF, 0x8331, 0xDCF0, 0x839B, + 0xDCF1, 0x835E, 0xDCF2, 0x832F, 0xDCF3, 0x834F, 0xDCF4, 0x8347, + 0xDCF5, 0x8343, 0xDCF6, 0x835F, 0xDCF7, 0x8340, 0xDCF8, 0x8317, + 0xDCF9, 0x8360, 0xDCFA, 0x832D, 0xDCFB, 0x833A, 0xDCFC, 0x8333, + 0xDCFD, 0x8366, 0xDCFE, 0x8365, 0xDD40, 0x8EE5, 0xDD41, 0x8EE6, + 0xDD42, 0x8EE7, 0xDD43, 0x8EE8, 0xDD44, 0x8EE9, 0xDD45, 0x8EEA, + 0xDD46, 0x8EEB, 0xDD47, 0x8EEC, 0xDD48, 0x8EED, 0xDD49, 0x8EEE, + 0xDD4A, 0x8EEF, 0xDD4B, 0x8EF0, 0xDD4C, 0x8EF1, 0xDD4D, 0x8EF2, + 0xDD4E, 0x8EF3, 0xDD4F, 0x8EF4, 0xDD50, 0x8EF5, 0xDD51, 0x8EF6, + 0xDD52, 0x8EF7, 0xDD53, 0x8EF8, 0xDD54, 0x8EF9, 0xDD55, 0x8EFA, + 0xDD56, 0x8EFB, 0xDD57, 0x8EFC, 0xDD58, 0x8EFD, 0xDD59, 0x8EFE, + 0xDD5A, 0x8EFF, 0xDD5B, 0x8F00, 0xDD5C, 0x8F01, 0xDD5D, 0x8F02, + 0xDD5E, 0x8F03, 0xDD5F, 0x8F04, 0xDD60, 0x8F05, 0xDD61, 0x8F06, + 0xDD62, 0x8F07, 0xDD63, 0x8F08, 0xDD64, 0x8F09, 0xDD65, 0x8F0A, + 0xDD66, 0x8F0B, 0xDD67, 0x8F0C, 0xDD68, 0x8F0D, 0xDD69, 0x8F0E, + 0xDD6A, 0x8F0F, 0xDD6B, 0x8F10, 0xDD6C, 0x8F11, 0xDD6D, 0x8F12, + 0xDD6E, 0x8F13, 0xDD6F, 0x8F14, 0xDD70, 0x8F15, 0xDD71, 0x8F16, + 0xDD72, 0x8F17, 0xDD73, 0x8F18, 0xDD74, 0x8F19, 0xDD75, 0x8F1A, + 0xDD76, 0x8F1B, 0xDD77, 0x8F1C, 0xDD78, 0x8F1D, 0xDD79, 0x8F1E, + 0xDD7A, 0x8F1F, 0xDD7B, 0x8F20, 0xDD7C, 0x8F21, 0xDD7D, 0x8F22, + 0xDD7E, 0x8F23, 0xDD80, 0x8F24, 0xDD81, 0x8F25, 0xDD82, 0x8F26, + 0xDD83, 0x8F27, 0xDD84, 0x8F28, 0xDD85, 0x8F29, 0xDD86, 0x8F2A, + 0xDD87, 0x8F2B, 0xDD88, 0x8F2C, 0xDD89, 0x8F2D, 0xDD8A, 0x8F2E, + 0xDD8B, 0x8F2F, 0xDD8C, 0x8F30, 0xDD8D, 0x8F31, 0xDD8E, 0x8F32, + 0xDD8F, 0x8F33, 0xDD90, 0x8F34, 0xDD91, 0x8F35, 0xDD92, 0x8F36, + 0xDD93, 0x8F37, 0xDD94, 0x8F38, 0xDD95, 0x8F39, 0xDD96, 0x8F3A, + 0xDD97, 0x8F3B, 0xDD98, 0x8F3C, 0xDD99, 0x8F3D, 0xDD9A, 0x8F3E, + 0xDD9B, 0x8F3F, 0xDD9C, 0x8F40, 0xDD9D, 0x8F41, 0xDD9E, 0x8F42, + 0xDD9F, 0x8F43, 0xDDA0, 0x8F44, 0xDDA1, 0x8368, 0xDDA2, 0x831B, + 0xDDA3, 0x8369, 0xDDA4, 0x836C, 0xDDA5, 0x836A, 0xDDA6, 0x836D, + 0xDDA7, 0x836E, 0xDDA8, 0x83B0, 0xDDA9, 0x8378, 0xDDAA, 0x83B3, + 0xDDAB, 0x83B4, 0xDDAC, 0x83A0, 0xDDAD, 0x83AA, 0xDDAE, 0x8393, + 0xDDAF, 0x839C, 0xDDB0, 0x8385, 0xDDB1, 0x837C, 0xDDB2, 0x83B6, + 0xDDB3, 0x83A9, 0xDDB4, 0x837D, 0xDDB5, 0x83B8, 0xDDB6, 0x837B, + 0xDDB7, 0x8398, 0xDDB8, 0x839E, 0xDDB9, 0x83A8, 0xDDBA, 0x83BA, + 0xDDBB, 0x83BC, 0xDDBC, 0x83C1, 0xDDBD, 0x8401, 0xDDBE, 0x83E5, + 0xDDBF, 0x83D8, 0xDDC0, 0x5807, 0xDDC1, 0x8418, 0xDDC2, 0x840B, + 0xDDC3, 0x83DD, 0xDDC4, 0x83FD, 0xDDC5, 0x83D6, 0xDDC6, 0x841C, + 0xDDC7, 0x8438, 0xDDC8, 0x8411, 0xDDC9, 0x8406, 0xDDCA, 0x83D4, + 0xDDCB, 0x83DF, 0xDDCC, 0x840F, 0xDDCD, 0x8403, 0xDDCE, 0x83F8, + 0xDDCF, 0x83F9, 0xDDD0, 0x83EA, 0xDDD1, 0x83C5, 0xDDD2, 0x83C0, + 0xDDD3, 0x8426, 0xDDD4, 0x83F0, 0xDDD5, 0x83E1, 0xDDD6, 0x845C, + 0xDDD7, 0x8451, 0xDDD8, 0x845A, 0xDDD9, 0x8459, 0xDDDA, 0x8473, + 0xDDDB, 0x8487, 0xDDDC, 0x8488, 0xDDDD, 0x847A, 0xDDDE, 0x8489, + 0xDDDF, 0x8478, 0xDDE0, 0x843C, 0xDDE1, 0x8446, 0xDDE2, 0x8469, + 0xDDE3, 0x8476, 0xDDE4, 0x848C, 0xDDE5, 0x848E, 0xDDE6, 0x8431, + 0xDDE7, 0x846D, 0xDDE8, 0x84C1, 0xDDE9, 0x84CD, 0xDDEA, 0x84D0, + 0xDDEB, 0x84E6, 0xDDEC, 0x84BD, 0xDDED, 0x84D3, 0xDDEE, 0x84CA, + 0xDDEF, 0x84BF, 0xDDF0, 0x84BA, 0xDDF1, 0x84E0, 0xDDF2, 0x84A1, + 0xDDF3, 0x84B9, 0xDDF4, 0x84B4, 0xDDF5, 0x8497, 0xDDF6, 0x84E5, + 0xDDF7, 0x84E3, 0xDDF8, 0x850C, 0xDDF9, 0x750D, 0xDDFA, 0x8538, + 0xDDFB, 0x84F0, 0xDDFC, 0x8539, 0xDDFD, 0x851F, 0xDDFE, 0x853A, + 0xDE40, 0x8F45, 0xDE41, 0x8F46, 0xDE42, 0x8F47, 0xDE43, 0x8F48, + 0xDE44, 0x8F49, 0xDE45, 0x8F4A, 0xDE46, 0x8F4B, 0xDE47, 0x8F4C, + 0xDE48, 0x8F4D, 0xDE49, 0x8F4E, 0xDE4A, 0x8F4F, 0xDE4B, 0x8F50, + 0xDE4C, 0x8F51, 0xDE4D, 0x8F52, 0xDE4E, 0x8F53, 0xDE4F, 0x8F54, + 0xDE50, 0x8F55, 0xDE51, 0x8F56, 0xDE52, 0x8F57, 0xDE53, 0x8F58, + 0xDE54, 0x8F59, 0xDE55, 0x8F5A, 0xDE56, 0x8F5B, 0xDE57, 0x8F5C, + 0xDE58, 0x8F5D, 0xDE59, 0x8F5E, 0xDE5A, 0x8F5F, 0xDE5B, 0x8F60, + 0xDE5C, 0x8F61, 0xDE5D, 0x8F62, 0xDE5E, 0x8F63, 0xDE5F, 0x8F64, + 0xDE60, 0x8F65, 0xDE61, 0x8F6A, 0xDE62, 0x8F80, 0xDE63, 0x8F8C, + 0xDE64, 0x8F92, 0xDE65, 0x8F9D, 0xDE66, 0x8FA0, 0xDE67, 0x8FA1, + 0xDE68, 0x8FA2, 0xDE69, 0x8FA4, 0xDE6A, 0x8FA5, 0xDE6B, 0x8FA6, + 0xDE6C, 0x8FA7, 0xDE6D, 0x8FAA, 0xDE6E, 0x8FAC, 0xDE6F, 0x8FAD, + 0xDE70, 0x8FAE, 0xDE71, 0x8FAF, 0xDE72, 0x8FB2, 0xDE73, 0x8FB3, + 0xDE74, 0x8FB4, 0xDE75, 0x8FB5, 0xDE76, 0x8FB7, 0xDE77, 0x8FB8, + 0xDE78, 0x8FBA, 0xDE79, 0x8FBB, 0xDE7A, 0x8FBC, 0xDE7B, 0x8FBF, + 0xDE7C, 0x8FC0, 0xDE7D, 0x8FC3, 0xDE7E, 0x8FC6, 0xDE80, 0x8FC9, + 0xDE81, 0x8FCA, 0xDE82, 0x8FCB, 0xDE83, 0x8FCC, 0xDE84, 0x8FCD, + 0xDE85, 0x8FCF, 0xDE86, 0x8FD2, 0xDE87, 0x8FD6, 0xDE88, 0x8FD7, + 0xDE89, 0x8FDA, 0xDE8A, 0x8FE0, 0xDE8B, 0x8FE1, 0xDE8C, 0x8FE3, + 0xDE8D, 0x8FE7, 0xDE8E, 0x8FEC, 0xDE8F, 0x8FEF, 0xDE90, 0x8FF1, + 0xDE91, 0x8FF2, 0xDE92, 0x8FF4, 0xDE93, 0x8FF5, 0xDE94, 0x8FF6, + 0xDE95, 0x8FFA, 0xDE96, 0x8FFB, 0xDE97, 0x8FFC, 0xDE98, 0x8FFE, + 0xDE99, 0x8FFF, 0xDE9A, 0x9007, 0xDE9B, 0x9008, 0xDE9C, 0x900C, + 0xDE9D, 0x900E, 0xDE9E, 0x9013, 0xDE9F, 0x9015, 0xDEA0, 0x9018, + 0xDEA1, 0x8556, 0xDEA2, 0x853B, 0xDEA3, 0x84FF, 0xDEA4, 0x84FC, + 0xDEA5, 0x8559, 0xDEA6, 0x8548, 0xDEA7, 0x8568, 0xDEA8, 0x8564, + 0xDEA9, 0x855E, 0xDEAA, 0x857A, 0xDEAB, 0x77A2, 0xDEAC, 0x8543, + 0xDEAD, 0x8572, 0xDEAE, 0x857B, 0xDEAF, 0x85A4, 0xDEB0, 0x85A8, + 0xDEB1, 0x8587, 0xDEB2, 0x858F, 0xDEB3, 0x8579, 0xDEB4, 0x85AE, + 0xDEB5, 0x859C, 0xDEB6, 0x8585, 0xDEB7, 0x85B9, 0xDEB8, 0x85B7, + 0xDEB9, 0x85B0, 0xDEBA, 0x85D3, 0xDEBB, 0x85C1, 0xDEBC, 0x85DC, + 0xDEBD, 0x85FF, 0xDEBE, 0x8627, 0xDEBF, 0x8605, 0xDEC0, 0x8629, + 0xDEC1, 0x8616, 0xDEC2, 0x863C, 0xDEC3, 0x5EFE, 0xDEC4, 0x5F08, + 0xDEC5, 0x593C, 0xDEC6, 0x5941, 0xDEC7, 0x8037, 0xDEC8, 0x5955, + 0xDEC9, 0x595A, 0xDECA, 0x5958, 0xDECB, 0x530F, 0xDECC, 0x5C22, + 0xDECD, 0x5C25, 0xDECE, 0x5C2C, 0xDECF, 0x5C34, 0xDED0, 0x624C, + 0xDED1, 0x626A, 0xDED2, 0x629F, 0xDED3, 0x62BB, 0xDED4, 0x62CA, + 0xDED5, 0x62DA, 0xDED6, 0x62D7, 0xDED7, 0x62EE, 0xDED8, 0x6322, + 0xDED9, 0x62F6, 0xDEDA, 0x6339, 0xDEDB, 0x634B, 0xDEDC, 0x6343, + 0xDEDD, 0x63AD, 0xDEDE, 0x63F6, 0xDEDF, 0x6371, 0xDEE0, 0x637A, + 0xDEE1, 0x638E, 0xDEE2, 0x63B4, 0xDEE3, 0x636D, 0xDEE4, 0x63AC, + 0xDEE5, 0x638A, 0xDEE6, 0x6369, 0xDEE7, 0x63AE, 0xDEE8, 0x63BC, + 0xDEE9, 0x63F2, 0xDEEA, 0x63F8, 0xDEEB, 0x63E0, 0xDEEC, 0x63FF, + 0xDEED, 0x63C4, 0xDEEE, 0x63DE, 0xDEEF, 0x63CE, 0xDEF0, 0x6452, + 0xDEF1, 0x63C6, 0xDEF2, 0x63BE, 0xDEF3, 0x6445, 0xDEF4, 0x6441, + 0xDEF5, 0x640B, 0xDEF6, 0x641B, 0xDEF7, 0x6420, 0xDEF8, 0x640C, + 0xDEF9, 0x6426, 0xDEFA, 0x6421, 0xDEFB, 0x645E, 0xDEFC, 0x6484, + 0xDEFD, 0x646D, 0xDEFE, 0x6496, 0xDF40, 0x9019, 0xDF41, 0x901C, + 0xDF42, 0x9023, 0xDF43, 0x9024, 0xDF44, 0x9025, 0xDF45, 0x9027, + 0xDF46, 0x9028, 0xDF47, 0x9029, 0xDF48, 0x902A, 0xDF49, 0x902B, + 0xDF4A, 0x902C, 0xDF4B, 0x9030, 0xDF4C, 0x9031, 0xDF4D, 0x9032, + 0xDF4E, 0x9033, 0xDF4F, 0x9034, 0xDF50, 0x9037, 0xDF51, 0x9039, + 0xDF52, 0x903A, 0xDF53, 0x903D, 0xDF54, 0x903F, 0xDF55, 0x9040, + 0xDF56, 0x9043, 0xDF57, 0x9045, 0xDF58, 0x9046, 0xDF59, 0x9048, + 0xDF5A, 0x9049, 0xDF5B, 0x904A, 0xDF5C, 0x904B, 0xDF5D, 0x904C, + 0xDF5E, 0x904E, 0xDF5F, 0x9054, 0xDF60, 0x9055, 0xDF61, 0x9056, + 0xDF62, 0x9059, 0xDF63, 0x905A, 0xDF64, 0x905C, 0xDF65, 0x905D, + 0xDF66, 0x905E, 0xDF67, 0x905F, 0xDF68, 0x9060, 0xDF69, 0x9061, + 0xDF6A, 0x9064, 0xDF6B, 0x9066, 0xDF6C, 0x9067, 0xDF6D, 0x9069, + 0xDF6E, 0x906A, 0xDF6F, 0x906B, 0xDF70, 0x906C, 0xDF71, 0x906F, + 0xDF72, 0x9070, 0xDF73, 0x9071, 0xDF74, 0x9072, 0xDF75, 0x9073, + 0xDF76, 0x9076, 0xDF77, 0x9077, 0xDF78, 0x9078, 0xDF79, 0x9079, + 0xDF7A, 0x907A, 0xDF7B, 0x907B, 0xDF7C, 0x907C, 0xDF7D, 0x907E, + 0xDF7E, 0x9081, 0xDF80, 0x9084, 0xDF81, 0x9085, 0xDF82, 0x9086, + 0xDF83, 0x9087, 0xDF84, 0x9089, 0xDF85, 0x908A, 0xDF86, 0x908C, + 0xDF87, 0x908D, 0xDF88, 0x908E, 0xDF89, 0x908F, 0xDF8A, 0x9090, + 0xDF8B, 0x9092, 0xDF8C, 0x9094, 0xDF8D, 0x9096, 0xDF8E, 0x9098, + 0xDF8F, 0x909A, 0xDF90, 0x909C, 0xDF91, 0x909E, 0xDF92, 0x909F, + 0xDF93, 0x90A0, 0xDF94, 0x90A4, 0xDF95, 0x90A5, 0xDF96, 0x90A7, + 0xDF97, 0x90A8, 0xDF98, 0x90A9, 0xDF99, 0x90AB, 0xDF9A, 0x90AD, + 0xDF9B, 0x90B2, 0xDF9C, 0x90B7, 0xDF9D, 0x90BC, 0xDF9E, 0x90BD, + 0xDF9F, 0x90BF, 0xDFA0, 0x90C0, 0xDFA1, 0x647A, 0xDFA2, 0x64B7, + 0xDFA3, 0x64B8, 0xDFA4, 0x6499, 0xDFA5, 0x64BA, 0xDFA6, 0x64C0, + 0xDFA7, 0x64D0, 0xDFA8, 0x64D7, 0xDFA9, 0x64E4, 0xDFAA, 0x64E2, + 0xDFAB, 0x6509, 0xDFAC, 0x6525, 0xDFAD, 0x652E, 0xDFAE, 0x5F0B, + 0xDFAF, 0x5FD2, 0xDFB0, 0x7519, 0xDFB1, 0x5F11, 0xDFB2, 0x535F, + 0xDFB3, 0x53F1, 0xDFB4, 0x53FD, 0xDFB5, 0x53E9, 0xDFB6, 0x53E8, + 0xDFB7, 0x53FB, 0xDFB8, 0x5412, 0xDFB9, 0x5416, 0xDFBA, 0x5406, + 0xDFBB, 0x544B, 0xDFBC, 0x5452, 0xDFBD, 0x5453, 0xDFBE, 0x5454, + 0xDFBF, 0x5456, 0xDFC0, 0x5443, 0xDFC1, 0x5421, 0xDFC2, 0x5457, + 0xDFC3, 0x5459, 0xDFC4, 0x5423, 0xDFC5, 0x5432, 0xDFC6, 0x5482, + 0xDFC7, 0x5494, 0xDFC8, 0x5477, 0xDFC9, 0x5471, 0xDFCA, 0x5464, + 0xDFCB, 0x549A, 0xDFCC, 0x549B, 0xDFCD, 0x5484, 0xDFCE, 0x5476, + 0xDFCF, 0x5466, 0xDFD0, 0x549D, 0xDFD1, 0x54D0, 0xDFD2, 0x54AD, + 0xDFD3, 0x54C2, 0xDFD4, 0x54B4, 0xDFD5, 0x54D2, 0xDFD6, 0x54A7, + 0xDFD7, 0x54A6, 0xDFD8, 0x54D3, 0xDFD9, 0x54D4, 0xDFDA, 0x5472, + 0xDFDB, 0x54A3, 0xDFDC, 0x54D5, 0xDFDD, 0x54BB, 0xDFDE, 0x54BF, + 0xDFDF, 0x54CC, 0xDFE0, 0x54D9, 0xDFE1, 0x54DA, 0xDFE2, 0x54DC, + 0xDFE3, 0x54A9, 0xDFE4, 0x54AA, 0xDFE5, 0x54A4, 0xDFE6, 0x54DD, + 0xDFE7, 0x54CF, 0xDFE8, 0x54DE, 0xDFE9, 0x551B, 0xDFEA, 0x54E7, + 0xDFEB, 0x5520, 0xDFEC, 0x54FD, 0xDFED, 0x5514, 0xDFEE, 0x54F3, + 0xDFEF, 0x5522, 0xDFF0, 0x5523, 0xDFF1, 0x550F, 0xDFF2, 0x5511, + 0xDFF3, 0x5527, 0xDFF4, 0x552A, 0xDFF5, 0x5567, 0xDFF6, 0x558F, + 0xDFF7, 0x55B5, 0xDFF8, 0x5549, 0xDFF9, 0x556D, 0xDFFA, 0x5541, + 0xDFFB, 0x5555, 0xDFFC, 0x553F, 0xDFFD, 0x5550, 0xDFFE, 0x553C, + 0xE040, 0x90C2, 0xE041, 0x90C3, 0xE042, 0x90C6, 0xE043, 0x90C8, + 0xE044, 0x90C9, 0xE045, 0x90CB, 0xE046, 0x90CC, 0xE047, 0x90CD, + 0xE048, 0x90D2, 0xE049, 0x90D4, 0xE04A, 0x90D5, 0xE04B, 0x90D6, + 0xE04C, 0x90D8, 0xE04D, 0x90D9, 0xE04E, 0x90DA, 0xE04F, 0x90DE, + 0xE050, 0x90DF, 0xE051, 0x90E0, 0xE052, 0x90E3, 0xE053, 0x90E4, + 0xE054, 0x90E5, 0xE055, 0x90E9, 0xE056, 0x90EA, 0xE057, 0x90EC, + 0xE058, 0x90EE, 0xE059, 0x90F0, 0xE05A, 0x90F1, 0xE05B, 0x90F2, + 0xE05C, 0x90F3, 0xE05D, 0x90F5, 0xE05E, 0x90F6, 0xE05F, 0x90F7, + 0xE060, 0x90F9, 0xE061, 0x90FA, 0xE062, 0x90FB, 0xE063, 0x90FC, + 0xE064, 0x90FF, 0xE065, 0x9100, 0xE066, 0x9101, 0xE067, 0x9103, + 0xE068, 0x9105, 0xE069, 0x9106, 0xE06A, 0x9107, 0xE06B, 0x9108, + 0xE06C, 0x9109, 0xE06D, 0x910A, 0xE06E, 0x910B, 0xE06F, 0x910C, + 0xE070, 0x910D, 0xE071, 0x910E, 0xE072, 0x910F, 0xE073, 0x9110, + 0xE074, 0x9111, 0xE075, 0x9112, 0xE076, 0x9113, 0xE077, 0x9114, + 0xE078, 0x9115, 0xE079, 0x9116, 0xE07A, 0x9117, 0xE07B, 0x9118, + 0xE07C, 0x911A, 0xE07D, 0x911B, 0xE07E, 0x911C, 0xE080, 0x911D, + 0xE081, 0x911F, 0xE082, 0x9120, 0xE083, 0x9121, 0xE084, 0x9124, + 0xE085, 0x9125, 0xE086, 0x9126, 0xE087, 0x9127, 0xE088, 0x9128, + 0xE089, 0x9129, 0xE08A, 0x912A, 0xE08B, 0x912B, 0xE08C, 0x912C, + 0xE08D, 0x912D, 0xE08E, 0x912E, 0xE08F, 0x9130, 0xE090, 0x9132, + 0xE091, 0x9133, 0xE092, 0x9134, 0xE093, 0x9135, 0xE094, 0x9136, + 0xE095, 0x9137, 0xE096, 0x9138, 0xE097, 0x913A, 0xE098, 0x913B, + 0xE099, 0x913C, 0xE09A, 0x913D, 0xE09B, 0x913E, 0xE09C, 0x913F, + 0xE09D, 0x9140, 0xE09E, 0x9141, 0xE09F, 0x9142, 0xE0A0, 0x9144, + 0xE0A1, 0x5537, 0xE0A2, 0x5556, 0xE0A3, 0x5575, 0xE0A4, 0x5576, + 0xE0A5, 0x5577, 0xE0A6, 0x5533, 0xE0A7, 0x5530, 0xE0A8, 0x555C, + 0xE0A9, 0x558B, 0xE0AA, 0x55D2, 0xE0AB, 0x5583, 0xE0AC, 0x55B1, + 0xE0AD, 0x55B9, 0xE0AE, 0x5588, 0xE0AF, 0x5581, 0xE0B0, 0x559F, + 0xE0B1, 0x557E, 0xE0B2, 0x55D6, 0xE0B3, 0x5591, 0xE0B4, 0x557B, + 0xE0B5, 0x55DF, 0xE0B6, 0x55BD, 0xE0B7, 0x55BE, 0xE0B8, 0x5594, + 0xE0B9, 0x5599, 0xE0BA, 0x55EA, 0xE0BB, 0x55F7, 0xE0BC, 0x55C9, + 0xE0BD, 0x561F, 0xE0BE, 0x55D1, 0xE0BF, 0x55EB, 0xE0C0, 0x55EC, + 0xE0C1, 0x55D4, 0xE0C2, 0x55E6, 0xE0C3, 0x55DD, 0xE0C4, 0x55C4, + 0xE0C5, 0x55EF, 0xE0C6, 0x55E5, 0xE0C7, 0x55F2, 0xE0C8, 0x55F3, + 0xE0C9, 0x55CC, 0xE0CA, 0x55CD, 0xE0CB, 0x55E8, 0xE0CC, 0x55F5, + 0xE0CD, 0x55E4, 0xE0CE, 0x8F94, 0xE0CF, 0x561E, 0xE0D0, 0x5608, + 0xE0D1, 0x560C, 0xE0D2, 0x5601, 0xE0D3, 0x5624, 0xE0D4, 0x5623, + 0xE0D5, 0x55FE, 0xE0D6, 0x5600, 0xE0D7, 0x5627, 0xE0D8, 0x562D, + 0xE0D9, 0x5658, 0xE0DA, 0x5639, 0xE0DB, 0x5657, 0xE0DC, 0x562C, + 0xE0DD, 0x564D, 0xE0DE, 0x5662, 0xE0DF, 0x5659, 0xE0E0, 0x565C, + 0xE0E1, 0x564C, 0xE0E2, 0x5654, 0xE0E3, 0x5686, 0xE0E4, 0x5664, + 0xE0E5, 0x5671, 0xE0E6, 0x566B, 0xE0E7, 0x567B, 0xE0E8, 0x567C, + 0xE0E9, 0x5685, 0xE0EA, 0x5693, 0xE0EB, 0x56AF, 0xE0EC, 0x56D4, + 0xE0ED, 0x56D7, 0xE0EE, 0x56DD, 0xE0EF, 0x56E1, 0xE0F0, 0x56F5, + 0xE0F1, 0x56EB, 0xE0F2, 0x56F9, 0xE0F3, 0x56FF, 0xE0F4, 0x5704, + 0xE0F5, 0x570A, 0xE0F6, 0x5709, 0xE0F7, 0x571C, 0xE0F8, 0x5E0F, + 0xE0F9, 0x5E19, 0xE0FA, 0x5E14, 0xE0FB, 0x5E11, 0xE0FC, 0x5E31, + 0xE0FD, 0x5E3B, 0xE0FE, 0x5E3C, 0xE140, 0x9145, 0xE141, 0x9147, + 0xE142, 0x9148, 0xE143, 0x9151, 0xE144, 0x9153, 0xE145, 0x9154, + 0xE146, 0x9155, 0xE147, 0x9156, 0xE148, 0x9158, 0xE149, 0x9159, + 0xE14A, 0x915B, 0xE14B, 0x915C, 0xE14C, 0x915F, 0xE14D, 0x9160, + 0xE14E, 0x9166, 0xE14F, 0x9167, 0xE150, 0x9168, 0xE151, 0x916B, + 0xE152, 0x916D, 0xE153, 0x9173, 0xE154, 0x917A, 0xE155, 0x917B, + 0xE156, 0x917C, 0xE157, 0x9180, 0xE158, 0x9181, 0xE159, 0x9182, + 0xE15A, 0x9183, 0xE15B, 0x9184, 0xE15C, 0x9186, 0xE15D, 0x9188, + 0xE15E, 0x918A, 0xE15F, 0x918E, 0xE160, 0x918F, 0xE161, 0x9193, + 0xE162, 0x9194, 0xE163, 0x9195, 0xE164, 0x9196, 0xE165, 0x9197, + 0xE166, 0x9198, 0xE167, 0x9199, 0xE168, 0x919C, 0xE169, 0x919D, + 0xE16A, 0x919E, 0xE16B, 0x919F, 0xE16C, 0x91A0, 0xE16D, 0x91A1, + 0xE16E, 0x91A4, 0xE16F, 0x91A5, 0xE170, 0x91A6, 0xE171, 0x91A7, + 0xE172, 0x91A8, 0xE173, 0x91A9, 0xE174, 0x91AB, 0xE175, 0x91AC, + 0xE176, 0x91B0, 0xE177, 0x91B1, 0xE178, 0x91B2, 0xE179, 0x91B3, + 0xE17A, 0x91B6, 0xE17B, 0x91B7, 0xE17C, 0x91B8, 0xE17D, 0x91B9, + 0xE17E, 0x91BB, 0xE180, 0x91BC, 0xE181, 0x91BD, 0xE182, 0x91BE, + 0xE183, 0x91BF, 0xE184, 0x91C0, 0xE185, 0x91C1, 0xE186, 0x91C2, + 0xE187, 0x91C3, 0xE188, 0x91C4, 0xE189, 0x91C5, 0xE18A, 0x91C6, + 0xE18B, 0x91C8, 0xE18C, 0x91CB, 0xE18D, 0x91D0, 0xE18E, 0x91D2, + 0xE18F, 0x91D3, 0xE190, 0x91D4, 0xE191, 0x91D5, 0xE192, 0x91D6, + 0xE193, 0x91D7, 0xE194, 0x91D8, 0xE195, 0x91D9, 0xE196, 0x91DA, + 0xE197, 0x91DB, 0xE198, 0x91DD, 0xE199, 0x91DE, 0xE19A, 0x91DF, + 0xE19B, 0x91E0, 0xE19C, 0x91E1, 0xE19D, 0x91E2, 0xE19E, 0x91E3, + 0xE19F, 0x91E4, 0xE1A0, 0x91E5, 0xE1A1, 0x5E37, 0xE1A2, 0x5E44, + 0xE1A3, 0x5E54, 0xE1A4, 0x5E5B, 0xE1A5, 0x5E5E, 0xE1A6, 0x5E61, + 0xE1A7, 0x5C8C, 0xE1A8, 0x5C7A, 0xE1A9, 0x5C8D, 0xE1AA, 0x5C90, + 0xE1AB, 0x5C96, 0xE1AC, 0x5C88, 0xE1AD, 0x5C98, 0xE1AE, 0x5C99, + 0xE1AF, 0x5C91, 0xE1B0, 0x5C9A, 0xE1B1, 0x5C9C, 0xE1B2, 0x5CB5, + 0xE1B3, 0x5CA2, 0xE1B4, 0x5CBD, 0xE1B5, 0x5CAC, 0xE1B6, 0x5CAB, + 0xE1B7, 0x5CB1, 0xE1B8, 0x5CA3, 0xE1B9, 0x5CC1, 0xE1BA, 0x5CB7, + 0xE1BB, 0x5CC4, 0xE1BC, 0x5CD2, 0xE1BD, 0x5CE4, 0xE1BE, 0x5CCB, + 0xE1BF, 0x5CE5, 0xE1C0, 0x5D02, 0xE1C1, 0x5D03, 0xE1C2, 0x5D27, + 0xE1C3, 0x5D26, 0xE1C4, 0x5D2E, 0xE1C5, 0x5D24, 0xE1C6, 0x5D1E, + 0xE1C7, 0x5D06, 0xE1C8, 0x5D1B, 0xE1C9, 0x5D58, 0xE1CA, 0x5D3E, + 0xE1CB, 0x5D34, 0xE1CC, 0x5D3D, 0xE1CD, 0x5D6C, 0xE1CE, 0x5D5B, + 0xE1CF, 0x5D6F, 0xE1D0, 0x5D5D, 0xE1D1, 0x5D6B, 0xE1D2, 0x5D4B, + 0xE1D3, 0x5D4A, 0xE1D4, 0x5D69, 0xE1D5, 0x5D74, 0xE1D6, 0x5D82, + 0xE1D7, 0x5D99, 0xE1D8, 0x5D9D, 0xE1D9, 0x8C73, 0xE1DA, 0x5DB7, + 0xE1DB, 0x5DC5, 0xE1DC, 0x5F73, 0xE1DD, 0x5F77, 0xE1DE, 0x5F82, + 0xE1DF, 0x5F87, 0xE1E0, 0x5F89, 0xE1E1, 0x5F8C, 0xE1E2, 0x5F95, + 0xE1E3, 0x5F99, 0xE1E4, 0x5F9C, 0xE1E5, 0x5FA8, 0xE1E6, 0x5FAD, + 0xE1E7, 0x5FB5, 0xE1E8, 0x5FBC, 0xE1E9, 0x8862, 0xE1EA, 0x5F61, + 0xE1EB, 0x72AD, 0xE1EC, 0x72B0, 0xE1ED, 0x72B4, 0xE1EE, 0x72B7, + 0xE1EF, 0x72B8, 0xE1F0, 0x72C3, 0xE1F1, 0x72C1, 0xE1F2, 0x72CE, + 0xE1F3, 0x72CD, 0xE1F4, 0x72D2, 0xE1F5, 0x72E8, 0xE1F6, 0x72EF, + 0xE1F7, 0x72E9, 0xE1F8, 0x72F2, 0xE1F9, 0x72F4, 0xE1FA, 0x72F7, + 0xE1FB, 0x7301, 0xE1FC, 0x72F3, 0xE1FD, 0x7303, 0xE1FE, 0x72FA, + 0xE240, 0x91E6, 0xE241, 0x91E7, 0xE242, 0x91E8, 0xE243, 0x91E9, + 0xE244, 0x91EA, 0xE245, 0x91EB, 0xE246, 0x91EC, 0xE247, 0x91ED, + 0xE248, 0x91EE, 0xE249, 0x91EF, 0xE24A, 0x91F0, 0xE24B, 0x91F1, + 0xE24C, 0x91F2, 0xE24D, 0x91F3, 0xE24E, 0x91F4, 0xE24F, 0x91F5, + 0xE250, 0x91F6, 0xE251, 0x91F7, 0xE252, 0x91F8, 0xE253, 0x91F9, + 0xE254, 0x91FA, 0xE255, 0x91FB, 0xE256, 0x91FC, 0xE257, 0x91FD, + 0xE258, 0x91FE, 0xE259, 0x91FF, 0xE25A, 0x9200, 0xE25B, 0x9201, + 0xE25C, 0x9202, 0xE25D, 0x9203, 0xE25E, 0x9204, 0xE25F, 0x9205, + 0xE260, 0x9206, 0xE261, 0x9207, 0xE262, 0x9208, 0xE263, 0x9209, + 0xE264, 0x920A, 0xE265, 0x920B, 0xE266, 0x920C, 0xE267, 0x920D, + 0xE268, 0x920E, 0xE269, 0x920F, 0xE26A, 0x9210, 0xE26B, 0x9211, + 0xE26C, 0x9212, 0xE26D, 0x9213, 0xE26E, 0x9214, 0xE26F, 0x9215, + 0xE270, 0x9216, 0xE271, 0x9217, 0xE272, 0x9218, 0xE273, 0x9219, + 0xE274, 0x921A, 0xE275, 0x921B, 0xE276, 0x921C, 0xE277, 0x921D, + 0xE278, 0x921E, 0xE279, 0x921F, 0xE27A, 0x9220, 0xE27B, 0x9221, + 0xE27C, 0x9222, 0xE27D, 0x9223, 0xE27E, 0x9224, 0xE280, 0x9225, + 0xE281, 0x9226, 0xE282, 0x9227, 0xE283, 0x9228, 0xE284, 0x9229, + 0xE285, 0x922A, 0xE286, 0x922B, 0xE287, 0x922C, 0xE288, 0x922D, + 0xE289, 0x922E, 0xE28A, 0x922F, 0xE28B, 0x9230, 0xE28C, 0x9231, + 0xE28D, 0x9232, 0xE28E, 0x9233, 0xE28F, 0x9234, 0xE290, 0x9235, + 0xE291, 0x9236, 0xE292, 0x9237, 0xE293, 0x9238, 0xE294, 0x9239, + 0xE295, 0x923A, 0xE296, 0x923B, 0xE297, 0x923C, 0xE298, 0x923D, + 0xE299, 0x923E, 0xE29A, 0x923F, 0xE29B, 0x9240, 0xE29C, 0x9241, + 0xE29D, 0x9242, 0xE29E, 0x9243, 0xE29F, 0x9244, 0xE2A0, 0x9245, + 0xE2A1, 0x72FB, 0xE2A2, 0x7317, 0xE2A3, 0x7313, 0xE2A4, 0x7321, + 0xE2A5, 0x730A, 0xE2A6, 0x731E, 0xE2A7, 0x731D, 0xE2A8, 0x7315, + 0xE2A9, 0x7322, 0xE2AA, 0x7339, 0xE2AB, 0x7325, 0xE2AC, 0x732C, + 0xE2AD, 0x7338, 0xE2AE, 0x7331, 0xE2AF, 0x7350, 0xE2B0, 0x734D, + 0xE2B1, 0x7357, 0xE2B2, 0x7360, 0xE2B3, 0x736C, 0xE2B4, 0x736F, + 0xE2B5, 0x737E, 0xE2B6, 0x821B, 0xE2B7, 0x5925, 0xE2B8, 0x98E7, + 0xE2B9, 0x5924, 0xE2BA, 0x5902, 0xE2BB, 0x9963, 0xE2BC, 0x9967, + 0xE2BD, 0x9968, 0xE2BE, 0x9969, 0xE2BF, 0x996A, 0xE2C0, 0x996B, + 0xE2C1, 0x996C, 0xE2C2, 0x9974, 0xE2C3, 0x9977, 0xE2C4, 0x997D, + 0xE2C5, 0x9980, 0xE2C6, 0x9984, 0xE2C7, 0x9987, 0xE2C8, 0x998A, + 0xE2C9, 0x998D, 0xE2CA, 0x9990, 0xE2CB, 0x9991, 0xE2CC, 0x9993, + 0xE2CD, 0x9994, 0xE2CE, 0x9995, 0xE2CF, 0x5E80, 0xE2D0, 0x5E91, + 0xE2D1, 0x5E8B, 0xE2D2, 0x5E96, 0xE2D3, 0x5EA5, 0xE2D4, 0x5EA0, + 0xE2D5, 0x5EB9, 0xE2D6, 0x5EB5, 0xE2D7, 0x5EBE, 0xE2D8, 0x5EB3, + 0xE2D9, 0x8D53, 0xE2DA, 0x5ED2, 0xE2DB, 0x5ED1, 0xE2DC, 0x5EDB, + 0xE2DD, 0x5EE8, 0xE2DE, 0x5EEA, 0xE2DF, 0x81BA, 0xE2E0, 0x5FC4, + 0xE2E1, 0x5FC9, 0xE2E2, 0x5FD6, 0xE2E3, 0x5FCF, 0xE2E4, 0x6003, + 0xE2E5, 0x5FEE, 0xE2E6, 0x6004, 0xE2E7, 0x5FE1, 0xE2E8, 0x5FE4, + 0xE2E9, 0x5FFE, 0xE2EA, 0x6005, 0xE2EB, 0x6006, 0xE2EC, 0x5FEA, + 0xE2ED, 0x5FED, 0xE2EE, 0x5FF8, 0xE2EF, 0x6019, 0xE2F0, 0x6035, + 0xE2F1, 0x6026, 0xE2F2, 0x601B, 0xE2F3, 0x600F, 0xE2F4, 0x600D, + 0xE2F5, 0x6029, 0xE2F6, 0x602B, 0xE2F7, 0x600A, 0xE2F8, 0x603F, + 0xE2F9, 0x6021, 0xE2FA, 0x6078, 0xE2FB, 0x6079, 0xE2FC, 0x607B, + 0xE2FD, 0x607A, 0xE2FE, 0x6042, 0xE340, 0x9246, 0xE341, 0x9247, + 0xE342, 0x9248, 0xE343, 0x9249, 0xE344, 0x924A, 0xE345, 0x924B, + 0xE346, 0x924C, 0xE347, 0x924D, 0xE348, 0x924E, 0xE349, 0x924F, + 0xE34A, 0x9250, 0xE34B, 0x9251, 0xE34C, 0x9252, 0xE34D, 0x9253, + 0xE34E, 0x9254, 0xE34F, 0x9255, 0xE350, 0x9256, 0xE351, 0x9257, + 0xE352, 0x9258, 0xE353, 0x9259, 0xE354, 0x925A, 0xE355, 0x925B, + 0xE356, 0x925C, 0xE357, 0x925D, 0xE358, 0x925E, 0xE359, 0x925F, + 0xE35A, 0x9260, 0xE35B, 0x9261, 0xE35C, 0x9262, 0xE35D, 0x9263, + 0xE35E, 0x9264, 0xE35F, 0x9265, 0xE360, 0x9266, 0xE361, 0x9267, + 0xE362, 0x9268, 0xE363, 0x9269, 0xE364, 0x926A, 0xE365, 0x926B, + 0xE366, 0x926C, 0xE367, 0x926D, 0xE368, 0x926E, 0xE369, 0x926F, + 0xE36A, 0x9270, 0xE36B, 0x9271, 0xE36C, 0x9272, 0xE36D, 0x9273, + 0xE36E, 0x9275, 0xE36F, 0x9276, 0xE370, 0x9277, 0xE371, 0x9278, + 0xE372, 0x9279, 0xE373, 0x927A, 0xE374, 0x927B, 0xE375, 0x927C, + 0xE376, 0x927D, 0xE377, 0x927E, 0xE378, 0x927F, 0xE379, 0x9280, + 0xE37A, 0x9281, 0xE37B, 0x9282, 0xE37C, 0x9283, 0xE37D, 0x9284, + 0xE37E, 0x9285, 0xE380, 0x9286, 0xE381, 0x9287, 0xE382, 0x9288, + 0xE383, 0x9289, 0xE384, 0x928A, 0xE385, 0x928B, 0xE386, 0x928C, + 0xE387, 0x928D, 0xE388, 0x928F, 0xE389, 0x9290, 0xE38A, 0x9291, + 0xE38B, 0x9292, 0xE38C, 0x9293, 0xE38D, 0x9294, 0xE38E, 0x9295, + 0xE38F, 0x9296, 0xE390, 0x9297, 0xE391, 0x9298, 0xE392, 0x9299, + 0xE393, 0x929A, 0xE394, 0x929B, 0xE395, 0x929C, 0xE396, 0x929D, + 0xE397, 0x929E, 0xE398, 0x929F, 0xE399, 0x92A0, 0xE39A, 0x92A1, + 0xE39B, 0x92A2, 0xE39C, 0x92A3, 0xE39D, 0x92A4, 0xE39E, 0x92A5, + 0xE39F, 0x92A6, 0xE3A0, 0x92A7, 0xE3A1, 0x606A, 0xE3A2, 0x607D, + 0xE3A3, 0x6096, 0xE3A4, 0x609A, 0xE3A5, 0x60AD, 0xE3A6, 0x609D, + 0xE3A7, 0x6083, 0xE3A8, 0x6092, 0xE3A9, 0x608C, 0xE3AA, 0x609B, + 0xE3AB, 0x60EC, 0xE3AC, 0x60BB, 0xE3AD, 0x60B1, 0xE3AE, 0x60DD, + 0xE3AF, 0x60D8, 0xE3B0, 0x60C6, 0xE3B1, 0x60DA, 0xE3B2, 0x60B4, + 0xE3B3, 0x6120, 0xE3B4, 0x6126, 0xE3B5, 0x6115, 0xE3B6, 0x6123, + 0xE3B7, 0x60F4, 0xE3B8, 0x6100, 0xE3B9, 0x610E, 0xE3BA, 0x612B, + 0xE3BB, 0x614A, 0xE3BC, 0x6175, 0xE3BD, 0x61AC, 0xE3BE, 0x6194, + 0xE3BF, 0x61A7, 0xE3C0, 0x61B7, 0xE3C1, 0x61D4, 0xE3C2, 0x61F5, + 0xE3C3, 0x5FDD, 0xE3C4, 0x96B3, 0xE3C5, 0x95E9, 0xE3C6, 0x95EB, + 0xE3C7, 0x95F1, 0xE3C8, 0x95F3, 0xE3C9, 0x95F5, 0xE3CA, 0x95F6, + 0xE3CB, 0x95FC, 0xE3CC, 0x95FE, 0xE3CD, 0x9603, 0xE3CE, 0x9604, + 0xE3CF, 0x9606, 0xE3D0, 0x9608, 0xE3D1, 0x960A, 0xE3D2, 0x960B, + 0xE3D3, 0x960C, 0xE3D4, 0x960D, 0xE3D5, 0x960F, 0xE3D6, 0x9612, + 0xE3D7, 0x9615, 0xE3D8, 0x9616, 0xE3D9, 0x9617, 0xE3DA, 0x9619, + 0xE3DB, 0x961A, 0xE3DC, 0x4E2C, 0xE3DD, 0x723F, 0xE3DE, 0x6215, + 0xE3DF, 0x6C35, 0xE3E0, 0x6C54, 0xE3E1, 0x6C5C, 0xE3E2, 0x6C4A, + 0xE3E3, 0x6CA3, 0xE3E4, 0x6C85, 0xE3E5, 0x6C90, 0xE3E6, 0x6C94, + 0xE3E7, 0x6C8C, 0xE3E8, 0x6C68, 0xE3E9, 0x6C69, 0xE3EA, 0x6C74, + 0xE3EB, 0x6C76, 0xE3EC, 0x6C86, 0xE3ED, 0x6CA9, 0xE3EE, 0x6CD0, + 0xE3EF, 0x6CD4, 0xE3F0, 0x6CAD, 0xE3F1, 0x6CF7, 0xE3F2, 0x6CF8, + 0xE3F3, 0x6CF1, 0xE3F4, 0x6CD7, 0xE3F5, 0x6CB2, 0xE3F6, 0x6CE0, + 0xE3F7, 0x6CD6, 0xE3F8, 0x6CFA, 0xE3F9, 0x6CEB, 0xE3FA, 0x6CEE, + 0xE3FB, 0x6CB1, 0xE3FC, 0x6CD3, 0xE3FD, 0x6CEF, 0xE3FE, 0x6CFE, + 0xE440, 0x92A8, 0xE441, 0x92A9, 0xE442, 0x92AA, 0xE443, 0x92AB, + 0xE444, 0x92AC, 0xE445, 0x92AD, 0xE446, 0x92AF, 0xE447, 0x92B0, + 0xE448, 0x92B1, 0xE449, 0x92B2, 0xE44A, 0x92B3, 0xE44B, 0x92B4, + 0xE44C, 0x92B5, 0xE44D, 0x92B6, 0xE44E, 0x92B7, 0xE44F, 0x92B8, + 0xE450, 0x92B9, 0xE451, 0x92BA, 0xE452, 0x92BB, 0xE453, 0x92BC, + 0xE454, 0x92BD, 0xE455, 0x92BE, 0xE456, 0x92BF, 0xE457, 0x92C0, + 0xE458, 0x92C1, 0xE459, 0x92C2, 0xE45A, 0x92C3, 0xE45B, 0x92C4, + 0xE45C, 0x92C5, 0xE45D, 0x92C6, 0xE45E, 0x92C7, 0xE45F, 0x92C9, + 0xE460, 0x92CA, 0xE461, 0x92CB, 0xE462, 0x92CC, 0xE463, 0x92CD, + 0xE464, 0x92CE, 0xE465, 0x92CF, 0xE466, 0x92D0, 0xE467, 0x92D1, + 0xE468, 0x92D2, 0xE469, 0x92D3, 0xE46A, 0x92D4, 0xE46B, 0x92D5, + 0xE46C, 0x92D6, 0xE46D, 0x92D7, 0xE46E, 0x92D8, 0xE46F, 0x92D9, + 0xE470, 0x92DA, 0xE471, 0x92DB, 0xE472, 0x92DC, 0xE473, 0x92DD, + 0xE474, 0x92DE, 0xE475, 0x92DF, 0xE476, 0x92E0, 0xE477, 0x92E1, + 0xE478, 0x92E2, 0xE479, 0x92E3, 0xE47A, 0x92E4, 0xE47B, 0x92E5, + 0xE47C, 0x92E6, 0xE47D, 0x92E7, 0xE47E, 0x92E8, 0xE480, 0x92E9, + 0xE481, 0x92EA, 0xE482, 0x92EB, 0xE483, 0x92EC, 0xE484, 0x92ED, + 0xE485, 0x92EE, 0xE486, 0x92EF, 0xE487, 0x92F0, 0xE488, 0x92F1, + 0xE489, 0x92F2, 0xE48A, 0x92F3, 0xE48B, 0x92F4, 0xE48C, 0x92F5, + 0xE48D, 0x92F6, 0xE48E, 0x92F7, 0xE48F, 0x92F8, 0xE490, 0x92F9, + 0xE491, 0x92FA, 0xE492, 0x92FB, 0xE493, 0x92FC, 0xE494, 0x92FD, + 0xE495, 0x92FE, 0xE496, 0x92FF, 0xE497, 0x9300, 0xE498, 0x9301, + 0xE499, 0x9302, 0xE49A, 0x9303, 0xE49B, 0x9304, 0xE49C, 0x9305, + 0xE49D, 0x9306, 0xE49E, 0x9307, 0xE49F, 0x9308, 0xE4A0, 0x9309, + 0xE4A1, 0x6D39, 0xE4A2, 0x6D27, 0xE4A3, 0x6D0C, 0xE4A4, 0x6D43, + 0xE4A5, 0x6D48, 0xE4A6, 0x6D07, 0xE4A7, 0x6D04, 0xE4A8, 0x6D19, + 0xE4A9, 0x6D0E, 0xE4AA, 0x6D2B, 0xE4AB, 0x6D4D, 0xE4AC, 0x6D2E, + 0xE4AD, 0x6D35, 0xE4AE, 0x6D1A, 0xE4AF, 0x6D4F, 0xE4B0, 0x6D52, + 0xE4B1, 0x6D54, 0xE4B2, 0x6D33, 0xE4B3, 0x6D91, 0xE4B4, 0x6D6F, + 0xE4B5, 0x6D9E, 0xE4B6, 0x6DA0, 0xE4B7, 0x6D5E, 0xE4B8, 0x6D93, + 0xE4B9, 0x6D94, 0xE4BA, 0x6D5C, 0xE4BB, 0x6D60, 0xE4BC, 0x6D7C, + 0xE4BD, 0x6D63, 0xE4BE, 0x6E1A, 0xE4BF, 0x6DC7, 0xE4C0, 0x6DC5, + 0xE4C1, 0x6DDE, 0xE4C2, 0x6E0E, 0xE4C3, 0x6DBF, 0xE4C4, 0x6DE0, + 0xE4C5, 0x6E11, 0xE4C6, 0x6DE6, 0xE4C7, 0x6DDD, 0xE4C8, 0x6DD9, + 0xE4C9, 0x6E16, 0xE4CA, 0x6DAB, 0xE4CB, 0x6E0C, 0xE4CC, 0x6DAE, + 0xE4CD, 0x6E2B, 0xE4CE, 0x6E6E, 0xE4CF, 0x6E4E, 0xE4D0, 0x6E6B, + 0xE4D1, 0x6EB2, 0xE4D2, 0x6E5F, 0xE4D3, 0x6E86, 0xE4D4, 0x6E53, + 0xE4D5, 0x6E54, 0xE4D6, 0x6E32, 0xE4D7, 0x6E25, 0xE4D8, 0x6E44, + 0xE4D9, 0x6EDF, 0xE4DA, 0x6EB1, 0xE4DB, 0x6E98, 0xE4DC, 0x6EE0, + 0xE4DD, 0x6F2D, 0xE4DE, 0x6EE2, 0xE4DF, 0x6EA5, 0xE4E0, 0x6EA7, + 0xE4E1, 0x6EBD, 0xE4E2, 0x6EBB, 0xE4E3, 0x6EB7, 0xE4E4, 0x6ED7, + 0xE4E5, 0x6EB4, 0xE4E6, 0x6ECF, 0xE4E7, 0x6E8F, 0xE4E8, 0x6EC2, + 0xE4E9, 0x6E9F, 0xE4EA, 0x6F62, 0xE4EB, 0x6F46, 0xE4EC, 0x6F47, + 0xE4ED, 0x6F24, 0xE4EE, 0x6F15, 0xE4EF, 0x6EF9, 0xE4F0, 0x6F2F, + 0xE4F1, 0x6F36, 0xE4F2, 0x6F4B, 0xE4F3, 0x6F74, 0xE4F4, 0x6F2A, + 0xE4F5, 0x6F09, 0xE4F6, 0x6F29, 0xE4F7, 0x6F89, 0xE4F8, 0x6F8D, + 0xE4F9, 0x6F8C, 0xE4FA, 0x6F78, 0xE4FB, 0x6F72, 0xE4FC, 0x6F7C, + 0xE4FD, 0x6F7A, 0xE4FE, 0x6FD1, 0xE540, 0x930A, 0xE541, 0x930B, + 0xE542, 0x930C, 0xE543, 0x930D, 0xE544, 0x930E, 0xE545, 0x930F, + 0xE546, 0x9310, 0xE547, 0x9311, 0xE548, 0x9312, 0xE549, 0x9313, + 0xE54A, 0x9314, 0xE54B, 0x9315, 0xE54C, 0x9316, 0xE54D, 0x9317, + 0xE54E, 0x9318, 0xE54F, 0x9319, 0xE550, 0x931A, 0xE551, 0x931B, + 0xE552, 0x931C, 0xE553, 0x931D, 0xE554, 0x931E, 0xE555, 0x931F, + 0xE556, 0x9320, 0xE557, 0x9321, 0xE558, 0x9322, 0xE559, 0x9323, + 0xE55A, 0x9324, 0xE55B, 0x9325, 0xE55C, 0x9326, 0xE55D, 0x9327, + 0xE55E, 0x9328, 0xE55F, 0x9329, 0xE560, 0x932A, 0xE561, 0x932B, + 0xE562, 0x932C, 0xE563, 0x932D, 0xE564, 0x932E, 0xE565, 0x932F, + 0xE566, 0x9330, 0xE567, 0x9331, 0xE568, 0x9332, 0xE569, 0x9333, + 0xE56A, 0x9334, 0xE56B, 0x9335, 0xE56C, 0x9336, 0xE56D, 0x9337, + 0xE56E, 0x9338, 0xE56F, 0x9339, 0xE570, 0x933A, 0xE571, 0x933B, + 0xE572, 0x933C, 0xE573, 0x933D, 0xE574, 0x933F, 0xE575, 0x9340, + 0xE576, 0x9341, 0xE577, 0x9342, 0xE578, 0x9343, 0xE579, 0x9344, + 0xE57A, 0x9345, 0xE57B, 0x9346, 0xE57C, 0x9347, 0xE57D, 0x9348, + 0xE57E, 0x9349, 0xE580, 0x934A, 0xE581, 0x934B, 0xE582, 0x934C, + 0xE583, 0x934D, 0xE584, 0x934E, 0xE585, 0x934F, 0xE586, 0x9350, + 0xE587, 0x9351, 0xE588, 0x9352, 0xE589, 0x9353, 0xE58A, 0x9354, + 0xE58B, 0x9355, 0xE58C, 0x9356, 0xE58D, 0x9357, 0xE58E, 0x9358, + 0xE58F, 0x9359, 0xE590, 0x935A, 0xE591, 0x935B, 0xE592, 0x935C, + 0xE593, 0x935D, 0xE594, 0x935E, 0xE595, 0x935F, 0xE596, 0x9360, + 0xE597, 0x9361, 0xE598, 0x9362, 0xE599, 0x9363, 0xE59A, 0x9364, + 0xE59B, 0x9365, 0xE59C, 0x9366, 0xE59D, 0x9367, 0xE59E, 0x9368, + 0xE59F, 0x9369, 0xE5A0, 0x936B, 0xE5A1, 0x6FC9, 0xE5A2, 0x6FA7, + 0xE5A3, 0x6FB9, 0xE5A4, 0x6FB6, 0xE5A5, 0x6FC2, 0xE5A6, 0x6FE1, + 0xE5A7, 0x6FEE, 0xE5A8, 0x6FDE, 0xE5A9, 0x6FE0, 0xE5AA, 0x6FEF, + 0xE5AB, 0x701A, 0xE5AC, 0x7023, 0xE5AD, 0x701B, 0xE5AE, 0x7039, + 0xE5AF, 0x7035, 0xE5B0, 0x704F, 0xE5B1, 0x705E, 0xE5B2, 0x5B80, + 0xE5B3, 0x5B84, 0xE5B4, 0x5B95, 0xE5B5, 0x5B93, 0xE5B6, 0x5BA5, + 0xE5B7, 0x5BB8, 0xE5B8, 0x752F, 0xE5B9, 0x9A9E, 0xE5BA, 0x6434, + 0xE5BB, 0x5BE4, 0xE5BC, 0x5BEE, 0xE5BD, 0x8930, 0xE5BE, 0x5BF0, + 0xE5BF, 0x8E47, 0xE5C0, 0x8B07, 0xE5C1, 0x8FB6, 0xE5C2, 0x8FD3, + 0xE5C3, 0x8FD5, 0xE5C4, 0x8FE5, 0xE5C5, 0x8FEE, 0xE5C6, 0x8FE4, + 0xE5C7, 0x8FE9, 0xE5C8, 0x8FE6, 0xE5C9, 0x8FF3, 0xE5CA, 0x8FE8, + 0xE5CB, 0x9005, 0xE5CC, 0x9004, 0xE5CD, 0x900B, 0xE5CE, 0x9026, + 0xE5CF, 0x9011, 0xE5D0, 0x900D, 0xE5D1, 0x9016, 0xE5D2, 0x9021, + 0xE5D3, 0x9035, 0xE5D4, 0x9036, 0xE5D5, 0x902D, 0xE5D6, 0x902F, + 0xE5D7, 0x9044, 0xE5D8, 0x9051, 0xE5D9, 0x9052, 0xE5DA, 0x9050, + 0xE5DB, 0x9068, 0xE5DC, 0x9058, 0xE5DD, 0x9062, 0xE5DE, 0x905B, + 0xE5DF, 0x66B9, 0xE5E0, 0x9074, 0xE5E1, 0x907D, 0xE5E2, 0x9082, + 0xE5E3, 0x9088, 0xE5E4, 0x9083, 0xE5E5, 0x908B, 0xE5E6, 0x5F50, + 0xE5E7, 0x5F57, 0xE5E8, 0x5F56, 0xE5E9, 0x5F58, 0xE5EA, 0x5C3B, + 0xE5EB, 0x54AB, 0xE5EC, 0x5C50, 0xE5ED, 0x5C59, 0xE5EE, 0x5B71, + 0xE5EF, 0x5C63, 0xE5F0, 0x5C66, 0xE5F1, 0x7FBC, 0xE5F2, 0x5F2A, + 0xE5F3, 0x5F29, 0xE5F4, 0x5F2D, 0xE5F5, 0x8274, 0xE5F6, 0x5F3C, + 0xE5F7, 0x9B3B, 0xE5F8, 0x5C6E, 0xE5F9, 0x5981, 0xE5FA, 0x5983, + 0xE5FB, 0x598D, 0xE5FC, 0x59A9, 0xE5FD, 0x59AA, 0xE5FE, 0x59A3, + 0xE640, 0x936C, 0xE641, 0x936D, 0xE642, 0x936E, 0xE643, 0x936F, + 0xE644, 0x9370, 0xE645, 0x9371, 0xE646, 0x9372, 0xE647, 0x9373, + 0xE648, 0x9374, 0xE649, 0x9375, 0xE64A, 0x9376, 0xE64B, 0x9377, + 0xE64C, 0x9378, 0xE64D, 0x9379, 0xE64E, 0x937A, 0xE64F, 0x937B, + 0xE650, 0x937C, 0xE651, 0x937D, 0xE652, 0x937E, 0xE653, 0x937F, + 0xE654, 0x9380, 0xE655, 0x9381, 0xE656, 0x9382, 0xE657, 0x9383, + 0xE658, 0x9384, 0xE659, 0x9385, 0xE65A, 0x9386, 0xE65B, 0x9387, + 0xE65C, 0x9388, 0xE65D, 0x9389, 0xE65E, 0x938A, 0xE65F, 0x938B, + 0xE660, 0x938C, 0xE661, 0x938D, 0xE662, 0x938E, 0xE663, 0x9390, + 0xE664, 0x9391, 0xE665, 0x9392, 0xE666, 0x9393, 0xE667, 0x9394, + 0xE668, 0x9395, 0xE669, 0x9396, 0xE66A, 0x9397, 0xE66B, 0x9398, + 0xE66C, 0x9399, 0xE66D, 0x939A, 0xE66E, 0x939B, 0xE66F, 0x939C, + 0xE670, 0x939D, 0xE671, 0x939E, 0xE672, 0x939F, 0xE673, 0x93A0, + 0xE674, 0x93A1, 0xE675, 0x93A2, 0xE676, 0x93A3, 0xE677, 0x93A4, + 0xE678, 0x93A5, 0xE679, 0x93A6, 0xE67A, 0x93A7, 0xE67B, 0x93A8, + 0xE67C, 0x93A9, 0xE67D, 0x93AA, 0xE67E, 0x93AB, 0xE680, 0x93AC, + 0xE681, 0x93AD, 0xE682, 0x93AE, 0xE683, 0x93AF, 0xE684, 0x93B0, + 0xE685, 0x93B1, 0xE686, 0x93B2, 0xE687, 0x93B3, 0xE688, 0x93B4, + 0xE689, 0x93B5, 0xE68A, 0x93B6, 0xE68B, 0x93B7, 0xE68C, 0x93B8, + 0xE68D, 0x93B9, 0xE68E, 0x93BA, 0xE68F, 0x93BB, 0xE690, 0x93BC, + 0xE691, 0x93BD, 0xE692, 0x93BE, 0xE693, 0x93BF, 0xE694, 0x93C0, + 0xE695, 0x93C1, 0xE696, 0x93C2, 0xE697, 0x93C3, 0xE698, 0x93C4, + 0xE699, 0x93C5, 0xE69A, 0x93C6, 0xE69B, 0x93C7, 0xE69C, 0x93C8, + 0xE69D, 0x93C9, 0xE69E, 0x93CB, 0xE69F, 0x93CC, 0xE6A0, 0x93CD, + 0xE6A1, 0x5997, 0xE6A2, 0x59CA, 0xE6A3, 0x59AB, 0xE6A4, 0x599E, + 0xE6A5, 0x59A4, 0xE6A6, 0x59D2, 0xE6A7, 0x59B2, 0xE6A8, 0x59AF, + 0xE6A9, 0x59D7, 0xE6AA, 0x59BE, 0xE6AB, 0x5A05, 0xE6AC, 0x5A06, + 0xE6AD, 0x59DD, 0xE6AE, 0x5A08, 0xE6AF, 0x59E3, 0xE6B0, 0x59D8, + 0xE6B1, 0x59F9, 0xE6B2, 0x5A0C, 0xE6B3, 0x5A09, 0xE6B4, 0x5A32, + 0xE6B5, 0x5A34, 0xE6B6, 0x5A11, 0xE6B7, 0x5A23, 0xE6B8, 0x5A13, + 0xE6B9, 0x5A40, 0xE6BA, 0x5A67, 0xE6BB, 0x5A4A, 0xE6BC, 0x5A55, + 0xE6BD, 0x5A3C, 0xE6BE, 0x5A62, 0xE6BF, 0x5A75, 0xE6C0, 0x80EC, + 0xE6C1, 0x5AAA, 0xE6C2, 0x5A9B, 0xE6C3, 0x5A77, 0xE6C4, 0x5A7A, + 0xE6C5, 0x5ABE, 0xE6C6, 0x5AEB, 0xE6C7, 0x5AB2, 0xE6C8, 0x5AD2, + 0xE6C9, 0x5AD4, 0xE6CA, 0x5AB8, 0xE6CB, 0x5AE0, 0xE6CC, 0x5AE3, + 0xE6CD, 0x5AF1, 0xE6CE, 0x5AD6, 0xE6CF, 0x5AE6, 0xE6D0, 0x5AD8, + 0xE6D1, 0x5ADC, 0xE6D2, 0x5B09, 0xE6D3, 0x5B17, 0xE6D4, 0x5B16, + 0xE6D5, 0x5B32, 0xE6D6, 0x5B37, 0xE6D7, 0x5B40, 0xE6D8, 0x5C15, + 0xE6D9, 0x5C1C, 0xE6DA, 0x5B5A, 0xE6DB, 0x5B65, 0xE6DC, 0x5B73, + 0xE6DD, 0x5B51, 0xE6DE, 0x5B53, 0xE6DF, 0x5B62, 0xE6E0, 0x9A75, + 0xE6E1, 0x9A77, 0xE6E2, 0x9A78, 0xE6E3, 0x9A7A, 0xE6E4, 0x9A7F, + 0xE6E5, 0x9A7D, 0xE6E6, 0x9A80, 0xE6E7, 0x9A81, 0xE6E8, 0x9A85, + 0xE6E9, 0x9A88, 0xE6EA, 0x9A8A, 0xE6EB, 0x9A90, 0xE6EC, 0x9A92, + 0xE6ED, 0x9A93, 0xE6EE, 0x9A96, 0xE6EF, 0x9A98, 0xE6F0, 0x9A9B, + 0xE6F1, 0x9A9C, 0xE6F2, 0x9A9D, 0xE6F3, 0x9A9F, 0xE6F4, 0x9AA0, + 0xE6F5, 0x9AA2, 0xE6F6, 0x9AA3, 0xE6F7, 0x9AA5, 0xE6F8, 0x9AA7, + 0xE6F9, 0x7E9F, 0xE6FA, 0x7EA1, 0xE6FB, 0x7EA3, 0xE6FC, 0x7EA5, + 0xE6FD, 0x7EA8, 0xE6FE, 0x7EA9, 0xE740, 0x93CE, 0xE741, 0x93CF, + 0xE742, 0x93D0, 0xE743, 0x93D1, 0xE744, 0x93D2, 0xE745, 0x93D3, + 0xE746, 0x93D4, 0xE747, 0x93D5, 0xE748, 0x93D7, 0xE749, 0x93D8, + 0xE74A, 0x93D9, 0xE74B, 0x93DA, 0xE74C, 0x93DB, 0xE74D, 0x93DC, + 0xE74E, 0x93DD, 0xE74F, 0x93DE, 0xE750, 0x93DF, 0xE751, 0x93E0, + 0xE752, 0x93E1, 0xE753, 0x93E2, 0xE754, 0x93E3, 0xE755, 0x93E4, + 0xE756, 0x93E5, 0xE757, 0x93E6, 0xE758, 0x93E7, 0xE759, 0x93E8, + 0xE75A, 0x93E9, 0xE75B, 0x93EA, 0xE75C, 0x93EB, 0xE75D, 0x93EC, + 0xE75E, 0x93ED, 0xE75F, 0x93EE, 0xE760, 0x93EF, 0xE761, 0x93F0, + 0xE762, 0x93F1, 0xE763, 0x93F2, 0xE764, 0x93F3, 0xE765, 0x93F4, + 0xE766, 0x93F5, 0xE767, 0x93F6, 0xE768, 0x93F7, 0xE769, 0x93F8, + 0xE76A, 0x93F9, 0xE76B, 0x93FA, 0xE76C, 0x93FB, 0xE76D, 0x93FC, + 0xE76E, 0x93FD, 0xE76F, 0x93FE, 0xE770, 0x93FF, 0xE771, 0x9400, + 0xE772, 0x9401, 0xE773, 0x9402, 0xE774, 0x9403, 0xE775, 0x9404, + 0xE776, 0x9405, 0xE777, 0x9406, 0xE778, 0x9407, 0xE779, 0x9408, + 0xE77A, 0x9409, 0xE77B, 0x940A, 0xE77C, 0x940B, 0xE77D, 0x940C, + 0xE77E, 0x940D, 0xE780, 0x940E, 0xE781, 0x940F, 0xE782, 0x9410, + 0xE783, 0x9411, 0xE784, 0x9412, 0xE785, 0x9413, 0xE786, 0x9414, + 0xE787, 0x9415, 0xE788, 0x9416, 0xE789, 0x9417, 0xE78A, 0x9418, + 0xE78B, 0x9419, 0xE78C, 0x941A, 0xE78D, 0x941B, 0xE78E, 0x941C, + 0xE78F, 0x941D, 0xE790, 0x941E, 0xE791, 0x941F, 0xE792, 0x9420, + 0xE793, 0x9421, 0xE794, 0x9422, 0xE795, 0x9423, 0xE796, 0x9424, + 0xE797, 0x9425, 0xE798, 0x9426, 0xE799, 0x9427, 0xE79A, 0x9428, + 0xE79B, 0x9429, 0xE79C, 0x942A, 0xE79D, 0x942B, 0xE79E, 0x942C, + 0xE79F, 0x942D, 0xE7A0, 0x942E, 0xE7A1, 0x7EAD, 0xE7A2, 0x7EB0, + 0xE7A3, 0x7EBE, 0xE7A4, 0x7EC0, 0xE7A5, 0x7EC1, 0xE7A6, 0x7EC2, + 0xE7A7, 0x7EC9, 0xE7A8, 0x7ECB, 0xE7A9, 0x7ECC, 0xE7AA, 0x7ED0, + 0xE7AB, 0x7ED4, 0xE7AC, 0x7ED7, 0xE7AD, 0x7EDB, 0xE7AE, 0x7EE0, + 0xE7AF, 0x7EE1, 0xE7B0, 0x7EE8, 0xE7B1, 0x7EEB, 0xE7B2, 0x7EEE, + 0xE7B3, 0x7EEF, 0xE7B4, 0x7EF1, 0xE7B5, 0x7EF2, 0xE7B6, 0x7F0D, + 0xE7B7, 0x7EF6, 0xE7B8, 0x7EFA, 0xE7B9, 0x7EFB, 0xE7BA, 0x7EFE, + 0xE7BB, 0x7F01, 0xE7BC, 0x7F02, 0xE7BD, 0x7F03, 0xE7BE, 0x7F07, + 0xE7BF, 0x7F08, 0xE7C0, 0x7F0B, 0xE7C1, 0x7F0C, 0xE7C2, 0x7F0F, + 0xE7C3, 0x7F11, 0xE7C4, 0x7F12, 0xE7C5, 0x7F17, 0xE7C6, 0x7F19, + 0xE7C7, 0x7F1C, 0xE7C8, 0x7F1B, 0xE7C9, 0x7F1F, 0xE7CA, 0x7F21, + 0xE7CB, 0x7F22, 0xE7CC, 0x7F23, 0xE7CD, 0x7F24, 0xE7CE, 0x7F25, + 0xE7CF, 0x7F26, 0xE7D0, 0x7F27, 0xE7D1, 0x7F2A, 0xE7D2, 0x7F2B, + 0xE7D3, 0x7F2C, 0xE7D4, 0x7F2D, 0xE7D5, 0x7F2F, 0xE7D6, 0x7F30, + 0xE7D7, 0x7F31, 0xE7D8, 0x7F32, 0xE7D9, 0x7F33, 0xE7DA, 0x7F35, + 0xE7DB, 0x5E7A, 0xE7DC, 0x757F, 0xE7DD, 0x5DDB, 0xE7DE, 0x753E, + 0xE7DF, 0x9095, 0xE7E0, 0x738E, 0xE7E1, 0x7391, 0xE7E2, 0x73AE, + 0xE7E3, 0x73A2, 0xE7E4, 0x739F, 0xE7E5, 0x73CF, 0xE7E6, 0x73C2, + 0xE7E7, 0x73D1, 0xE7E8, 0x73B7, 0xE7E9, 0x73B3, 0xE7EA, 0x73C0, + 0xE7EB, 0x73C9, 0xE7EC, 0x73C8, 0xE7ED, 0x73E5, 0xE7EE, 0x73D9, + 0xE7EF, 0x987C, 0xE7F0, 0x740A, 0xE7F1, 0x73E9, 0xE7F2, 0x73E7, + 0xE7F3, 0x73DE, 0xE7F4, 0x73BA, 0xE7F5, 0x73F2, 0xE7F6, 0x740F, + 0xE7F7, 0x742A, 0xE7F8, 0x745B, 0xE7F9, 0x7426, 0xE7FA, 0x7425, + 0xE7FB, 0x7428, 0xE7FC, 0x7430, 0xE7FD, 0x742E, 0xE7FE, 0x742C, + 0xE840, 0x942F, 0xE841, 0x9430, 0xE842, 0x9431, 0xE843, 0x9432, + 0xE844, 0x9433, 0xE845, 0x9434, 0xE846, 0x9435, 0xE847, 0x9436, + 0xE848, 0x9437, 0xE849, 0x9438, 0xE84A, 0x9439, 0xE84B, 0x943A, + 0xE84C, 0x943B, 0xE84D, 0x943C, 0xE84E, 0x943D, 0xE84F, 0x943F, + 0xE850, 0x9440, 0xE851, 0x9441, 0xE852, 0x9442, 0xE853, 0x9443, + 0xE854, 0x9444, 0xE855, 0x9445, 0xE856, 0x9446, 0xE857, 0x9447, + 0xE858, 0x9448, 0xE859, 0x9449, 0xE85A, 0x944A, 0xE85B, 0x944B, + 0xE85C, 0x944C, 0xE85D, 0x944D, 0xE85E, 0x944E, 0xE85F, 0x944F, + 0xE860, 0x9450, 0xE861, 0x9451, 0xE862, 0x9452, 0xE863, 0x9453, + 0xE864, 0x9454, 0xE865, 0x9455, 0xE866, 0x9456, 0xE867, 0x9457, + 0xE868, 0x9458, 0xE869, 0x9459, 0xE86A, 0x945A, 0xE86B, 0x945B, + 0xE86C, 0x945C, 0xE86D, 0x945D, 0xE86E, 0x945E, 0xE86F, 0x945F, + 0xE870, 0x9460, 0xE871, 0x9461, 0xE872, 0x9462, 0xE873, 0x9463, + 0xE874, 0x9464, 0xE875, 0x9465, 0xE876, 0x9466, 0xE877, 0x9467, + 0xE878, 0x9468, 0xE879, 0x9469, 0xE87A, 0x946A, 0xE87B, 0x946C, + 0xE87C, 0x946D, 0xE87D, 0x946E, 0xE87E, 0x946F, 0xE880, 0x9470, + 0xE881, 0x9471, 0xE882, 0x9472, 0xE883, 0x9473, 0xE884, 0x9474, + 0xE885, 0x9475, 0xE886, 0x9476, 0xE887, 0x9477, 0xE888, 0x9478, + 0xE889, 0x9479, 0xE88A, 0x947A, 0xE88B, 0x947B, 0xE88C, 0x947C, + 0xE88D, 0x947D, 0xE88E, 0x947E, 0xE88F, 0x947F, 0xE890, 0x9480, + 0xE891, 0x9481, 0xE892, 0x9482, 0xE893, 0x9483, 0xE894, 0x9484, + 0xE895, 0x9491, 0xE896, 0x9496, 0xE897, 0x9498, 0xE898, 0x94C7, + 0xE899, 0x94CF, 0xE89A, 0x94D3, 0xE89B, 0x94D4, 0xE89C, 0x94DA, + 0xE89D, 0x94E6, 0xE89E, 0x94FB, 0xE89F, 0x951C, 0xE8A0, 0x9520, + 0xE8A1, 0x741B, 0xE8A2, 0x741A, 0xE8A3, 0x7441, 0xE8A4, 0x745C, + 0xE8A5, 0x7457, 0xE8A6, 0x7455, 0xE8A7, 0x7459, 0xE8A8, 0x7477, + 0xE8A9, 0x746D, 0xE8AA, 0x747E, 0xE8AB, 0x749C, 0xE8AC, 0x748E, + 0xE8AD, 0x7480, 0xE8AE, 0x7481, 0xE8AF, 0x7487, 0xE8B0, 0x748B, + 0xE8B1, 0x749E, 0xE8B2, 0x74A8, 0xE8B3, 0x74A9, 0xE8B4, 0x7490, + 0xE8B5, 0x74A7, 0xE8B6, 0x74D2, 0xE8B7, 0x74BA, 0xE8B8, 0x97EA, + 0xE8B9, 0x97EB, 0xE8BA, 0x97EC, 0xE8BB, 0x674C, 0xE8BC, 0x6753, + 0xE8BD, 0x675E, 0xE8BE, 0x6748, 0xE8BF, 0x6769, 0xE8C0, 0x67A5, + 0xE8C1, 0x6787, 0xE8C2, 0x676A, 0xE8C3, 0x6773, 0xE8C4, 0x6798, + 0xE8C5, 0x67A7, 0xE8C6, 0x6775, 0xE8C7, 0x67A8, 0xE8C8, 0x679E, + 0xE8C9, 0x67AD, 0xE8CA, 0x678B, 0xE8CB, 0x6777, 0xE8CC, 0x677C, + 0xE8CD, 0x67F0, 0xE8CE, 0x6809, 0xE8CF, 0x67D8, 0xE8D0, 0x680A, + 0xE8D1, 0x67E9, 0xE8D2, 0x67B0, 0xE8D3, 0x680C, 0xE8D4, 0x67D9, + 0xE8D5, 0x67B5, 0xE8D6, 0x67DA, 0xE8D7, 0x67B3, 0xE8D8, 0x67DD, + 0xE8D9, 0x6800, 0xE8DA, 0x67C3, 0xE8DB, 0x67B8, 0xE8DC, 0x67E2, + 0xE8DD, 0x680E, 0xE8DE, 0x67C1, 0xE8DF, 0x67FD, 0xE8E0, 0x6832, + 0xE8E1, 0x6833, 0xE8E2, 0x6860, 0xE8E3, 0x6861, 0xE8E4, 0x684E, + 0xE8E5, 0x6862, 0xE8E6, 0x6844, 0xE8E7, 0x6864, 0xE8E8, 0x6883, + 0xE8E9, 0x681D, 0xE8EA, 0x6855, 0xE8EB, 0x6866, 0xE8EC, 0x6841, + 0xE8ED, 0x6867, 0xE8EE, 0x6840, 0xE8EF, 0x683E, 0xE8F0, 0x684A, + 0xE8F1, 0x6849, 0xE8F2, 0x6829, 0xE8F3, 0x68B5, 0xE8F4, 0x688F, + 0xE8F5, 0x6874, 0xE8F6, 0x6877, 0xE8F7, 0x6893, 0xE8F8, 0x686B, + 0xE8F9, 0x68C2, 0xE8FA, 0x696E, 0xE8FB, 0x68FC, 0xE8FC, 0x691F, + 0xE8FD, 0x6920, 0xE8FE, 0x68F9, 0xE940, 0x9527, 0xE941, 0x9533, + 0xE942, 0x953D, 0xE943, 0x9543, 0xE944, 0x9548, 0xE945, 0x954B, + 0xE946, 0x9555, 0xE947, 0x955A, 0xE948, 0x9560, 0xE949, 0x956E, + 0xE94A, 0x9574, 0xE94B, 0x9575, 0xE94C, 0x9577, 0xE94D, 0x9578, + 0xE94E, 0x9579, 0xE94F, 0x957A, 0xE950, 0x957B, 0xE951, 0x957C, + 0xE952, 0x957D, 0xE953, 0x957E, 0xE954, 0x9580, 0xE955, 0x9581, + 0xE956, 0x9582, 0xE957, 0x9583, 0xE958, 0x9584, 0xE959, 0x9585, + 0xE95A, 0x9586, 0xE95B, 0x9587, 0xE95C, 0x9588, 0xE95D, 0x9589, + 0xE95E, 0x958A, 0xE95F, 0x958B, 0xE960, 0x958C, 0xE961, 0x958D, + 0xE962, 0x958E, 0xE963, 0x958F, 0xE964, 0x9590, 0xE965, 0x9591, + 0xE966, 0x9592, 0xE967, 0x9593, 0xE968, 0x9594, 0xE969, 0x9595, + 0xE96A, 0x9596, 0xE96B, 0x9597, 0xE96C, 0x9598, 0xE96D, 0x9599, + 0xE96E, 0x959A, 0xE96F, 0x959B, 0xE970, 0x959C, 0xE971, 0x959D, + 0xE972, 0x959E, 0xE973, 0x959F, 0xE974, 0x95A0, 0xE975, 0x95A1, + 0xE976, 0x95A2, 0xE977, 0x95A3, 0xE978, 0x95A4, 0xE979, 0x95A5, + 0xE97A, 0x95A6, 0xE97B, 0x95A7, 0xE97C, 0x95A8, 0xE97D, 0x95A9, + 0xE97E, 0x95AA, 0xE980, 0x95AB, 0xE981, 0x95AC, 0xE982, 0x95AD, + 0xE983, 0x95AE, 0xE984, 0x95AF, 0xE985, 0x95B0, 0xE986, 0x95B1, + 0xE987, 0x95B2, 0xE988, 0x95B3, 0xE989, 0x95B4, 0xE98A, 0x95B5, + 0xE98B, 0x95B6, 0xE98C, 0x95B7, 0xE98D, 0x95B8, 0xE98E, 0x95B9, + 0xE98F, 0x95BA, 0xE990, 0x95BB, 0xE991, 0x95BC, 0xE992, 0x95BD, + 0xE993, 0x95BE, 0xE994, 0x95BF, 0xE995, 0x95C0, 0xE996, 0x95C1, + 0xE997, 0x95C2, 0xE998, 0x95C3, 0xE999, 0x95C4, 0xE99A, 0x95C5, + 0xE99B, 0x95C6, 0xE99C, 0x95C7, 0xE99D, 0x95C8, 0xE99E, 0x95C9, + 0xE99F, 0x95CA, 0xE9A0, 0x95CB, 0xE9A1, 0x6924, 0xE9A2, 0x68F0, + 0xE9A3, 0x690B, 0xE9A4, 0x6901, 0xE9A5, 0x6957, 0xE9A6, 0x68E3, + 0xE9A7, 0x6910, 0xE9A8, 0x6971, 0xE9A9, 0x6939, 0xE9AA, 0x6960, + 0xE9AB, 0x6942, 0xE9AC, 0x695D, 0xE9AD, 0x6984, 0xE9AE, 0x696B, + 0xE9AF, 0x6980, 0xE9B0, 0x6998, 0xE9B1, 0x6978, 0xE9B2, 0x6934, + 0xE9B3, 0x69CC, 0xE9B4, 0x6987, 0xE9B5, 0x6988, 0xE9B6, 0x69CE, + 0xE9B7, 0x6989, 0xE9B8, 0x6966, 0xE9B9, 0x6963, 0xE9BA, 0x6979, + 0xE9BB, 0x699B, 0xE9BC, 0x69A7, 0xE9BD, 0x69BB, 0xE9BE, 0x69AB, + 0xE9BF, 0x69AD, 0xE9C0, 0x69D4, 0xE9C1, 0x69B1, 0xE9C2, 0x69C1, + 0xE9C3, 0x69CA, 0xE9C4, 0x69DF, 0xE9C5, 0x6995, 0xE9C6, 0x69E0, + 0xE9C7, 0x698D, 0xE9C8, 0x69FF, 0xE9C9, 0x6A2F, 0xE9CA, 0x69ED, + 0xE9CB, 0x6A17, 0xE9CC, 0x6A18, 0xE9CD, 0x6A65, 0xE9CE, 0x69F2, + 0xE9CF, 0x6A44, 0xE9D0, 0x6A3E, 0xE9D1, 0x6AA0, 0xE9D2, 0x6A50, + 0xE9D3, 0x6A5B, 0xE9D4, 0x6A35, 0xE9D5, 0x6A8E, 0xE9D6, 0x6A79, + 0xE9D7, 0x6A3D, 0xE9D8, 0x6A28, 0xE9D9, 0x6A58, 0xE9DA, 0x6A7C, + 0xE9DB, 0x6A91, 0xE9DC, 0x6A90, 0xE9DD, 0x6AA9, 0xE9DE, 0x6A97, + 0xE9DF, 0x6AAB, 0xE9E0, 0x7337, 0xE9E1, 0x7352, 0xE9E2, 0x6B81, + 0xE9E3, 0x6B82, 0xE9E4, 0x6B87, 0xE9E5, 0x6B84, 0xE9E6, 0x6B92, + 0xE9E7, 0x6B93, 0xE9E8, 0x6B8D, 0xE9E9, 0x6B9A, 0xE9EA, 0x6B9B, + 0xE9EB, 0x6BA1, 0xE9EC, 0x6BAA, 0xE9ED, 0x8F6B, 0xE9EE, 0x8F6D, + 0xE9EF, 0x8F71, 0xE9F0, 0x8F72, 0xE9F1, 0x8F73, 0xE9F2, 0x8F75, + 0xE9F3, 0x8F76, 0xE9F4, 0x8F78, 0xE9F5, 0x8F77, 0xE9F6, 0x8F79, + 0xE9F7, 0x8F7A, 0xE9F8, 0x8F7C, 0xE9F9, 0x8F7E, 0xE9FA, 0x8F81, + 0xE9FB, 0x8F82, 0xE9FC, 0x8F84, 0xE9FD, 0x8F87, 0xE9FE, 0x8F8B, + 0xEA40, 0x95CC, 0xEA41, 0x95CD, 0xEA42, 0x95CE, 0xEA43, 0x95CF, + 0xEA44, 0x95D0, 0xEA45, 0x95D1, 0xEA46, 0x95D2, 0xEA47, 0x95D3, + 0xEA48, 0x95D4, 0xEA49, 0x95D5, 0xEA4A, 0x95D6, 0xEA4B, 0x95D7, + 0xEA4C, 0x95D8, 0xEA4D, 0x95D9, 0xEA4E, 0x95DA, 0xEA4F, 0x95DB, + 0xEA50, 0x95DC, 0xEA51, 0x95DD, 0xEA52, 0x95DE, 0xEA53, 0x95DF, + 0xEA54, 0x95E0, 0xEA55, 0x95E1, 0xEA56, 0x95E2, 0xEA57, 0x95E3, + 0xEA58, 0x95E4, 0xEA59, 0x95E5, 0xEA5A, 0x95E6, 0xEA5B, 0x95E7, + 0xEA5C, 0x95EC, 0xEA5D, 0x95FF, 0xEA5E, 0x9607, 0xEA5F, 0x9613, + 0xEA60, 0x9618, 0xEA61, 0x961B, 0xEA62, 0x961E, 0xEA63, 0x9620, + 0xEA64, 0x9623, 0xEA65, 0x9624, 0xEA66, 0x9625, 0xEA67, 0x9626, + 0xEA68, 0x9627, 0xEA69, 0x9628, 0xEA6A, 0x9629, 0xEA6B, 0x962B, + 0xEA6C, 0x962C, 0xEA6D, 0x962D, 0xEA6E, 0x962F, 0xEA6F, 0x9630, + 0xEA70, 0x9637, 0xEA71, 0x9638, 0xEA72, 0x9639, 0xEA73, 0x963A, + 0xEA74, 0x963E, 0xEA75, 0x9641, 0xEA76, 0x9643, 0xEA77, 0x964A, + 0xEA78, 0x964E, 0xEA79, 0x964F, 0xEA7A, 0x9651, 0xEA7B, 0x9652, + 0xEA7C, 0x9653, 0xEA7D, 0x9656, 0xEA7E, 0x9657, 0xEA80, 0x9658, + 0xEA81, 0x9659, 0xEA82, 0x965A, 0xEA83, 0x965C, 0xEA84, 0x965D, + 0xEA85, 0x965E, 0xEA86, 0x9660, 0xEA87, 0x9663, 0xEA88, 0x9665, + 0xEA89, 0x9666, 0xEA8A, 0x966B, 0xEA8B, 0x966D, 0xEA8C, 0x966E, + 0xEA8D, 0x966F, 0xEA8E, 0x9670, 0xEA8F, 0x9671, 0xEA90, 0x9673, + 0xEA91, 0x9678, 0xEA92, 0x9679, 0xEA93, 0x967A, 0xEA94, 0x967B, + 0xEA95, 0x967C, 0xEA96, 0x967D, 0xEA97, 0x967E, 0xEA98, 0x967F, + 0xEA99, 0x9680, 0xEA9A, 0x9681, 0xEA9B, 0x9682, 0xEA9C, 0x9683, + 0xEA9D, 0x9684, 0xEA9E, 0x9687, 0xEA9F, 0x9689, 0xEAA0, 0x968A, + 0xEAA1, 0x8F8D, 0xEAA2, 0x8F8E, 0xEAA3, 0x8F8F, 0xEAA4, 0x8F98, + 0xEAA5, 0x8F9A, 0xEAA6, 0x8ECE, 0xEAA7, 0x620B, 0xEAA8, 0x6217, + 0xEAA9, 0x621B, 0xEAAA, 0x621F, 0xEAAB, 0x6222, 0xEAAC, 0x6221, + 0xEAAD, 0x6225, 0xEAAE, 0x6224, 0xEAAF, 0x622C, 0xEAB0, 0x81E7, + 0xEAB1, 0x74EF, 0xEAB2, 0x74F4, 0xEAB3, 0x74FF, 0xEAB4, 0x750F, + 0xEAB5, 0x7511, 0xEAB6, 0x7513, 0xEAB7, 0x6534, 0xEAB8, 0x65EE, + 0xEAB9, 0x65EF, 0xEABA, 0x65F0, 0xEABB, 0x660A, 0xEABC, 0x6619, + 0xEABD, 0x6772, 0xEABE, 0x6603, 0xEABF, 0x6615, 0xEAC0, 0x6600, + 0xEAC1, 0x7085, 0xEAC2, 0x66F7, 0xEAC3, 0x661D, 0xEAC4, 0x6634, + 0xEAC5, 0x6631, 0xEAC6, 0x6636, 0xEAC7, 0x6635, 0xEAC8, 0x8006, + 0xEAC9, 0x665F, 0xEACA, 0x6654, 0xEACB, 0x6641, 0xEACC, 0x664F, + 0xEACD, 0x6656, 0xEACE, 0x6661, 0xEACF, 0x6657, 0xEAD0, 0x6677, + 0xEAD1, 0x6684, 0xEAD2, 0x668C, 0xEAD3, 0x66A7, 0xEAD4, 0x669D, + 0xEAD5, 0x66BE, 0xEAD6, 0x66DB, 0xEAD7, 0x66DC, 0xEAD8, 0x66E6, + 0xEAD9, 0x66E9, 0xEADA, 0x8D32, 0xEADB, 0x8D33, 0xEADC, 0x8D36, + 0xEADD, 0x8D3B, 0xEADE, 0x8D3D, 0xEADF, 0x8D40, 0xEAE0, 0x8D45, + 0xEAE1, 0x8D46, 0xEAE2, 0x8D48, 0xEAE3, 0x8D49, 0xEAE4, 0x8D47, + 0xEAE5, 0x8D4D, 0xEAE6, 0x8D55, 0xEAE7, 0x8D59, 0xEAE8, 0x89C7, + 0xEAE9, 0x89CA, 0xEAEA, 0x89CB, 0xEAEB, 0x89CC, 0xEAEC, 0x89CE, + 0xEAED, 0x89CF, 0xEAEE, 0x89D0, 0xEAEF, 0x89D1, 0xEAF0, 0x726E, + 0xEAF1, 0x729F, 0xEAF2, 0x725D, 0xEAF3, 0x7266, 0xEAF4, 0x726F, + 0xEAF5, 0x727E, 0xEAF6, 0x727F, 0xEAF7, 0x7284, 0xEAF8, 0x728B, + 0xEAF9, 0x728D, 0xEAFA, 0x728F, 0xEAFB, 0x7292, 0xEAFC, 0x6308, + 0xEAFD, 0x6332, 0xEAFE, 0x63B0, 0xEB40, 0x968C, 0xEB41, 0x968E, + 0xEB42, 0x9691, 0xEB43, 0x9692, 0xEB44, 0x9693, 0xEB45, 0x9695, + 0xEB46, 0x9696, 0xEB47, 0x969A, 0xEB48, 0x969B, 0xEB49, 0x969D, + 0xEB4A, 0x969E, 0xEB4B, 0x969F, 0xEB4C, 0x96A0, 0xEB4D, 0x96A1, + 0xEB4E, 0x96A2, 0xEB4F, 0x96A3, 0xEB50, 0x96A4, 0xEB51, 0x96A5, + 0xEB52, 0x96A6, 0xEB53, 0x96A8, 0xEB54, 0x96A9, 0xEB55, 0x96AA, + 0xEB56, 0x96AB, 0xEB57, 0x96AC, 0xEB58, 0x96AD, 0xEB59, 0x96AE, + 0xEB5A, 0x96AF, 0xEB5B, 0x96B1, 0xEB5C, 0x96B2, 0xEB5D, 0x96B4, + 0xEB5E, 0x96B5, 0xEB5F, 0x96B7, 0xEB60, 0x96B8, 0xEB61, 0x96BA, + 0xEB62, 0x96BB, 0xEB63, 0x96BF, 0xEB64, 0x96C2, 0xEB65, 0x96C3, + 0xEB66, 0x96C8, 0xEB67, 0x96CA, 0xEB68, 0x96CB, 0xEB69, 0x96D0, + 0xEB6A, 0x96D1, 0xEB6B, 0x96D3, 0xEB6C, 0x96D4, 0xEB6D, 0x96D6, + 0xEB6E, 0x96D7, 0xEB6F, 0x96D8, 0xEB70, 0x96D9, 0xEB71, 0x96DA, + 0xEB72, 0x96DB, 0xEB73, 0x96DC, 0xEB74, 0x96DD, 0xEB75, 0x96DE, + 0xEB76, 0x96DF, 0xEB77, 0x96E1, 0xEB78, 0x96E2, 0xEB79, 0x96E3, + 0xEB7A, 0x96E4, 0xEB7B, 0x96E5, 0xEB7C, 0x96E6, 0xEB7D, 0x96E7, + 0xEB7E, 0x96EB, 0xEB80, 0x96EC, 0xEB81, 0x96ED, 0xEB82, 0x96EE, + 0xEB83, 0x96F0, 0xEB84, 0x96F1, 0xEB85, 0x96F2, 0xEB86, 0x96F4, + 0xEB87, 0x96F5, 0xEB88, 0x96F8, 0xEB89, 0x96FA, 0xEB8A, 0x96FB, + 0xEB8B, 0x96FC, 0xEB8C, 0x96FD, 0xEB8D, 0x96FF, 0xEB8E, 0x9702, + 0xEB8F, 0x9703, 0xEB90, 0x9705, 0xEB91, 0x970A, 0xEB92, 0x970B, + 0xEB93, 0x970C, 0xEB94, 0x9710, 0xEB95, 0x9711, 0xEB96, 0x9712, + 0xEB97, 0x9714, 0xEB98, 0x9715, 0xEB99, 0x9717, 0xEB9A, 0x9718, + 0xEB9B, 0x9719, 0xEB9C, 0x971A, 0xEB9D, 0x971B, 0xEB9E, 0x971D, + 0xEB9F, 0x971F, 0xEBA0, 0x9720, 0xEBA1, 0x643F, 0xEBA2, 0x64D8, + 0xEBA3, 0x8004, 0xEBA4, 0x6BEA, 0xEBA5, 0x6BF3, 0xEBA6, 0x6BFD, + 0xEBA7, 0x6BF5, 0xEBA8, 0x6BF9, 0xEBA9, 0x6C05, 0xEBAA, 0x6C07, + 0xEBAB, 0x6C06, 0xEBAC, 0x6C0D, 0xEBAD, 0x6C15, 0xEBAE, 0x6C18, + 0xEBAF, 0x6C19, 0xEBB0, 0x6C1A, 0xEBB1, 0x6C21, 0xEBB2, 0x6C29, + 0xEBB3, 0x6C24, 0xEBB4, 0x6C2A, 0xEBB5, 0x6C32, 0xEBB6, 0x6535, + 0xEBB7, 0x6555, 0xEBB8, 0x656B, 0xEBB9, 0x724D, 0xEBBA, 0x7252, + 0xEBBB, 0x7256, 0xEBBC, 0x7230, 0xEBBD, 0x8662, 0xEBBE, 0x5216, + 0xEBBF, 0x809F, 0xEBC0, 0x809C, 0xEBC1, 0x8093, 0xEBC2, 0x80BC, + 0xEBC3, 0x670A, 0xEBC4, 0x80BD, 0xEBC5, 0x80B1, 0xEBC6, 0x80AB, + 0xEBC7, 0x80AD, 0xEBC8, 0x80B4, 0xEBC9, 0x80B7, 0xEBCA, 0x80E7, + 0xEBCB, 0x80E8, 0xEBCC, 0x80E9, 0xEBCD, 0x80EA, 0xEBCE, 0x80DB, + 0xEBCF, 0x80C2, 0xEBD0, 0x80C4, 0xEBD1, 0x80D9, 0xEBD2, 0x80CD, + 0xEBD3, 0x80D7, 0xEBD4, 0x6710, 0xEBD5, 0x80DD, 0xEBD6, 0x80EB, + 0xEBD7, 0x80F1, 0xEBD8, 0x80F4, 0xEBD9, 0x80ED, 0xEBDA, 0x810D, + 0xEBDB, 0x810E, 0xEBDC, 0x80F2, 0xEBDD, 0x80FC, 0xEBDE, 0x6715, + 0xEBDF, 0x8112, 0xEBE0, 0x8C5A, 0xEBE1, 0x8136, 0xEBE2, 0x811E, + 0xEBE3, 0x812C, 0xEBE4, 0x8118, 0xEBE5, 0x8132, 0xEBE6, 0x8148, + 0xEBE7, 0x814C, 0xEBE8, 0x8153, 0xEBE9, 0x8174, 0xEBEA, 0x8159, + 0xEBEB, 0x815A, 0xEBEC, 0x8171, 0xEBED, 0x8160, 0xEBEE, 0x8169, + 0xEBEF, 0x817C, 0xEBF0, 0x817D, 0xEBF1, 0x816D, 0xEBF2, 0x8167, + 0xEBF3, 0x584D, 0xEBF4, 0x5AB5, 0xEBF5, 0x8188, 0xEBF6, 0x8182, + 0xEBF7, 0x8191, 0xEBF8, 0x6ED5, 0xEBF9, 0x81A3, 0xEBFA, 0x81AA, + 0xEBFB, 0x81CC, 0xEBFC, 0x6726, 0xEBFD, 0x81CA, 0xEBFE, 0x81BB, + 0xEC40, 0x9721, 0xEC41, 0x9722, 0xEC42, 0x9723, 0xEC43, 0x9724, + 0xEC44, 0x9725, 0xEC45, 0x9726, 0xEC46, 0x9727, 0xEC47, 0x9728, + 0xEC48, 0x9729, 0xEC49, 0x972B, 0xEC4A, 0x972C, 0xEC4B, 0x972E, + 0xEC4C, 0x972F, 0xEC4D, 0x9731, 0xEC4E, 0x9733, 0xEC4F, 0x9734, + 0xEC50, 0x9735, 0xEC51, 0x9736, 0xEC52, 0x9737, 0xEC53, 0x973A, + 0xEC54, 0x973B, 0xEC55, 0x973C, 0xEC56, 0x973D, 0xEC57, 0x973F, + 0xEC58, 0x9740, 0xEC59, 0x9741, 0xEC5A, 0x9742, 0xEC5B, 0x9743, + 0xEC5C, 0x9744, 0xEC5D, 0x9745, 0xEC5E, 0x9746, 0xEC5F, 0x9747, + 0xEC60, 0x9748, 0xEC61, 0x9749, 0xEC62, 0x974A, 0xEC63, 0x974B, + 0xEC64, 0x974C, 0xEC65, 0x974D, 0xEC66, 0x974E, 0xEC67, 0x974F, + 0xEC68, 0x9750, 0xEC69, 0x9751, 0xEC6A, 0x9754, 0xEC6B, 0x9755, + 0xEC6C, 0x9757, 0xEC6D, 0x9758, 0xEC6E, 0x975A, 0xEC6F, 0x975C, + 0xEC70, 0x975D, 0xEC71, 0x975F, 0xEC72, 0x9763, 0xEC73, 0x9764, + 0xEC74, 0x9766, 0xEC75, 0x9767, 0xEC76, 0x9768, 0xEC77, 0x976A, + 0xEC78, 0x976B, 0xEC79, 0x976C, 0xEC7A, 0x976D, 0xEC7B, 0x976E, + 0xEC7C, 0x976F, 0xEC7D, 0x9770, 0xEC7E, 0x9771, 0xEC80, 0x9772, + 0xEC81, 0x9775, 0xEC82, 0x9777, 0xEC83, 0x9778, 0xEC84, 0x9779, + 0xEC85, 0x977A, 0xEC86, 0x977B, 0xEC87, 0x977D, 0xEC88, 0x977E, + 0xEC89, 0x977F, 0xEC8A, 0x9780, 0xEC8B, 0x9781, 0xEC8C, 0x9782, + 0xEC8D, 0x9783, 0xEC8E, 0x9784, 0xEC8F, 0x9786, 0xEC90, 0x9787, + 0xEC91, 0x9788, 0xEC92, 0x9789, 0xEC93, 0x978A, 0xEC94, 0x978C, + 0xEC95, 0x978E, 0xEC96, 0x978F, 0xEC97, 0x9790, 0xEC98, 0x9793, + 0xEC99, 0x9795, 0xEC9A, 0x9796, 0xEC9B, 0x9797, 0xEC9C, 0x9799, + 0xEC9D, 0x979A, 0xEC9E, 0x979B, 0xEC9F, 0x979C, 0xECA0, 0x979D, + 0xECA1, 0x81C1, 0xECA2, 0x81A6, 0xECA3, 0x6B24, 0xECA4, 0x6B37, + 0xECA5, 0x6B39, 0xECA6, 0x6B43, 0xECA7, 0x6B46, 0xECA8, 0x6B59, + 0xECA9, 0x98D1, 0xECAA, 0x98D2, 0xECAB, 0x98D3, 0xECAC, 0x98D5, + 0xECAD, 0x98D9, 0xECAE, 0x98DA, 0xECAF, 0x6BB3, 0xECB0, 0x5F40, + 0xECB1, 0x6BC2, 0xECB2, 0x89F3, 0xECB3, 0x6590, 0xECB4, 0x9F51, + 0xECB5, 0x6593, 0xECB6, 0x65BC, 0xECB7, 0x65C6, 0xECB8, 0x65C4, + 0xECB9, 0x65C3, 0xECBA, 0x65CC, 0xECBB, 0x65CE, 0xECBC, 0x65D2, + 0xECBD, 0x65D6, 0xECBE, 0x7080, 0xECBF, 0x709C, 0xECC0, 0x7096, + 0xECC1, 0x709D, 0xECC2, 0x70BB, 0xECC3, 0x70C0, 0xECC4, 0x70B7, + 0xECC5, 0x70AB, 0xECC6, 0x70B1, 0xECC7, 0x70E8, 0xECC8, 0x70CA, + 0xECC9, 0x7110, 0xECCA, 0x7113, 0xECCB, 0x7116, 0xECCC, 0x712F, + 0xECCD, 0x7131, 0xECCE, 0x7173, 0xECCF, 0x715C, 0xECD0, 0x7168, + 0xECD1, 0x7145, 0xECD2, 0x7172, 0xECD3, 0x714A, 0xECD4, 0x7178, + 0xECD5, 0x717A, 0xECD6, 0x7198, 0xECD7, 0x71B3, 0xECD8, 0x71B5, + 0xECD9, 0x71A8, 0xECDA, 0x71A0, 0xECDB, 0x71E0, 0xECDC, 0x71D4, + 0xECDD, 0x71E7, 0xECDE, 0x71F9, 0xECDF, 0x721D, 0xECE0, 0x7228, + 0xECE1, 0x706C, 0xECE2, 0x7118, 0xECE3, 0x7166, 0xECE4, 0x71B9, + 0xECE5, 0x623E, 0xECE6, 0x623D, 0xECE7, 0x6243, 0xECE8, 0x6248, + 0xECE9, 0x6249, 0xECEA, 0x793B, 0xECEB, 0x7940, 0xECEC, 0x7946, + 0xECED, 0x7949, 0xECEE, 0x795B, 0xECEF, 0x795C, 0xECF0, 0x7953, + 0xECF1, 0x795A, 0xECF2, 0x7962, 0xECF3, 0x7957, 0xECF4, 0x7960, + 0xECF5, 0x796F, 0xECF6, 0x7967, 0xECF7, 0x797A, 0xECF8, 0x7985, + 0xECF9, 0x798A, 0xECFA, 0x799A, 0xECFB, 0x79A7, 0xECFC, 0x79B3, + 0xECFD, 0x5FD1, 0xECFE, 0x5FD0, 0xED40, 0x979E, 0xED41, 0x979F, + 0xED42, 0x97A1, 0xED43, 0x97A2, 0xED44, 0x97A4, 0xED45, 0x97A5, + 0xED46, 0x97A6, 0xED47, 0x97A7, 0xED48, 0x97A8, 0xED49, 0x97A9, + 0xED4A, 0x97AA, 0xED4B, 0x97AC, 0xED4C, 0x97AE, 0xED4D, 0x97B0, + 0xED4E, 0x97B1, 0xED4F, 0x97B3, 0xED50, 0x97B5, 0xED51, 0x97B6, + 0xED52, 0x97B7, 0xED53, 0x97B8, 0xED54, 0x97B9, 0xED55, 0x97BA, + 0xED56, 0x97BB, 0xED57, 0x97BC, 0xED58, 0x97BD, 0xED59, 0x97BE, + 0xED5A, 0x97BF, 0xED5B, 0x97C0, 0xED5C, 0x97C1, 0xED5D, 0x97C2, + 0xED5E, 0x97C3, 0xED5F, 0x97C4, 0xED60, 0x97C5, 0xED61, 0x97C6, + 0xED62, 0x97C7, 0xED63, 0x97C8, 0xED64, 0x97C9, 0xED65, 0x97CA, + 0xED66, 0x97CB, 0xED67, 0x97CC, 0xED68, 0x97CD, 0xED69, 0x97CE, + 0xED6A, 0x97CF, 0xED6B, 0x97D0, 0xED6C, 0x97D1, 0xED6D, 0x97D2, + 0xED6E, 0x97D3, 0xED6F, 0x97D4, 0xED70, 0x97D5, 0xED71, 0x97D6, + 0xED72, 0x97D7, 0xED73, 0x97D8, 0xED74, 0x97D9, 0xED75, 0x97DA, + 0xED76, 0x97DB, 0xED77, 0x97DC, 0xED78, 0x97DD, 0xED79, 0x97DE, + 0xED7A, 0x97DF, 0xED7B, 0x97E0, 0xED7C, 0x97E1, 0xED7D, 0x97E2, + 0xED7E, 0x97E3, 0xED80, 0x97E4, 0xED81, 0x97E5, 0xED82, 0x97E8, + 0xED83, 0x97EE, 0xED84, 0x97EF, 0xED85, 0x97F0, 0xED86, 0x97F1, + 0xED87, 0x97F2, 0xED88, 0x97F4, 0xED89, 0x97F7, 0xED8A, 0x97F8, + 0xED8B, 0x97F9, 0xED8C, 0x97FA, 0xED8D, 0x97FB, 0xED8E, 0x97FC, + 0xED8F, 0x97FD, 0xED90, 0x97FE, 0xED91, 0x97FF, 0xED92, 0x9800, + 0xED93, 0x9801, 0xED94, 0x9802, 0xED95, 0x9803, 0xED96, 0x9804, + 0xED97, 0x9805, 0xED98, 0x9806, 0xED99, 0x9807, 0xED9A, 0x9808, + 0xED9B, 0x9809, 0xED9C, 0x980A, 0xED9D, 0x980B, 0xED9E, 0x980C, + 0xED9F, 0x980D, 0xEDA0, 0x980E, 0xEDA1, 0x603C, 0xEDA2, 0x605D, + 0xEDA3, 0x605A, 0xEDA4, 0x6067, 0xEDA5, 0x6041, 0xEDA6, 0x6059, + 0xEDA7, 0x6063, 0xEDA8, 0x60AB, 0xEDA9, 0x6106, 0xEDAA, 0x610D, + 0xEDAB, 0x615D, 0xEDAC, 0x61A9, 0xEDAD, 0x619D, 0xEDAE, 0x61CB, + 0xEDAF, 0x61D1, 0xEDB0, 0x6206, 0xEDB1, 0x8080, 0xEDB2, 0x807F, + 0xEDB3, 0x6C93, 0xEDB4, 0x6CF6, 0xEDB5, 0x6DFC, 0xEDB6, 0x77F6, + 0xEDB7, 0x77F8, 0xEDB8, 0x7800, 0xEDB9, 0x7809, 0xEDBA, 0x7817, + 0xEDBB, 0x7818, 0xEDBC, 0x7811, 0xEDBD, 0x65AB, 0xEDBE, 0x782D, + 0xEDBF, 0x781C, 0xEDC0, 0x781D, 0xEDC1, 0x7839, 0xEDC2, 0x783A, + 0xEDC3, 0x783B, 0xEDC4, 0x781F, 0xEDC5, 0x783C, 0xEDC6, 0x7825, + 0xEDC7, 0x782C, 0xEDC8, 0x7823, 0xEDC9, 0x7829, 0xEDCA, 0x784E, + 0xEDCB, 0x786D, 0xEDCC, 0x7856, 0xEDCD, 0x7857, 0xEDCE, 0x7826, + 0xEDCF, 0x7850, 0xEDD0, 0x7847, 0xEDD1, 0x784C, 0xEDD2, 0x786A, + 0xEDD3, 0x789B, 0xEDD4, 0x7893, 0xEDD5, 0x789A, 0xEDD6, 0x7887, + 0xEDD7, 0x789C, 0xEDD8, 0x78A1, 0xEDD9, 0x78A3, 0xEDDA, 0x78B2, + 0xEDDB, 0x78B9, 0xEDDC, 0x78A5, 0xEDDD, 0x78D4, 0xEDDE, 0x78D9, + 0xEDDF, 0x78C9, 0xEDE0, 0x78EC, 0xEDE1, 0x78F2, 0xEDE2, 0x7905, + 0xEDE3, 0x78F4, 0xEDE4, 0x7913, 0xEDE5, 0x7924, 0xEDE6, 0x791E, + 0xEDE7, 0x7934, 0xEDE8, 0x9F9B, 0xEDE9, 0x9EF9, 0xEDEA, 0x9EFB, + 0xEDEB, 0x9EFC, 0xEDEC, 0x76F1, 0xEDED, 0x7704, 0xEDEE, 0x770D, + 0xEDEF, 0x76F9, 0xEDF0, 0x7707, 0xEDF1, 0x7708, 0xEDF2, 0x771A, + 0xEDF3, 0x7722, 0xEDF4, 0x7719, 0xEDF5, 0x772D, 0xEDF6, 0x7726, + 0xEDF7, 0x7735, 0xEDF8, 0x7738, 0xEDF9, 0x7750, 0xEDFA, 0x7751, + 0xEDFB, 0x7747, 0xEDFC, 0x7743, 0xEDFD, 0x775A, 0xEDFE, 0x7768, + 0xEE40, 0x980F, 0xEE41, 0x9810, 0xEE42, 0x9811, 0xEE43, 0x9812, + 0xEE44, 0x9813, 0xEE45, 0x9814, 0xEE46, 0x9815, 0xEE47, 0x9816, + 0xEE48, 0x9817, 0xEE49, 0x9818, 0xEE4A, 0x9819, 0xEE4B, 0x981A, + 0xEE4C, 0x981B, 0xEE4D, 0x981C, 0xEE4E, 0x981D, 0xEE4F, 0x981E, + 0xEE50, 0x981F, 0xEE51, 0x9820, 0xEE52, 0x9821, 0xEE53, 0x9822, + 0xEE54, 0x9823, 0xEE55, 0x9824, 0xEE56, 0x9825, 0xEE57, 0x9826, + 0xEE58, 0x9827, 0xEE59, 0x9828, 0xEE5A, 0x9829, 0xEE5B, 0x982A, + 0xEE5C, 0x982B, 0xEE5D, 0x982C, 0xEE5E, 0x982D, 0xEE5F, 0x982E, + 0xEE60, 0x982F, 0xEE61, 0x9830, 0xEE62, 0x9831, 0xEE63, 0x9832, + 0xEE64, 0x9833, 0xEE65, 0x9834, 0xEE66, 0x9835, 0xEE67, 0x9836, + 0xEE68, 0x9837, 0xEE69, 0x9838, 0xEE6A, 0x9839, 0xEE6B, 0x983A, + 0xEE6C, 0x983B, 0xEE6D, 0x983C, 0xEE6E, 0x983D, 0xEE6F, 0x983E, + 0xEE70, 0x983F, 0xEE71, 0x9840, 0xEE72, 0x9841, 0xEE73, 0x9842, + 0xEE74, 0x9843, 0xEE75, 0x9844, 0xEE76, 0x9845, 0xEE77, 0x9846, + 0xEE78, 0x9847, 0xEE79, 0x9848, 0xEE7A, 0x9849, 0xEE7B, 0x984A, + 0xEE7C, 0x984B, 0xEE7D, 0x984C, 0xEE7E, 0x984D, 0xEE80, 0x984E, + 0xEE81, 0x984F, 0xEE82, 0x9850, 0xEE83, 0x9851, 0xEE84, 0x9852, + 0xEE85, 0x9853, 0xEE86, 0x9854, 0xEE87, 0x9855, 0xEE88, 0x9856, + 0xEE89, 0x9857, 0xEE8A, 0x9858, 0xEE8B, 0x9859, 0xEE8C, 0x985A, + 0xEE8D, 0x985B, 0xEE8E, 0x985C, 0xEE8F, 0x985D, 0xEE90, 0x985E, + 0xEE91, 0x985F, 0xEE92, 0x9860, 0xEE93, 0x9861, 0xEE94, 0x9862, + 0xEE95, 0x9863, 0xEE96, 0x9864, 0xEE97, 0x9865, 0xEE98, 0x9866, + 0xEE99, 0x9867, 0xEE9A, 0x9868, 0xEE9B, 0x9869, 0xEE9C, 0x986A, + 0xEE9D, 0x986B, 0xEE9E, 0x986C, 0xEE9F, 0x986D, 0xEEA0, 0x986E, + 0xEEA1, 0x7762, 0xEEA2, 0x7765, 0xEEA3, 0x777F, 0xEEA4, 0x778D, + 0xEEA5, 0x777D, 0xEEA6, 0x7780, 0xEEA7, 0x778C, 0xEEA8, 0x7791, + 0xEEA9, 0x779F, 0xEEAA, 0x77A0, 0xEEAB, 0x77B0, 0xEEAC, 0x77B5, + 0xEEAD, 0x77BD, 0xEEAE, 0x753A, 0xEEAF, 0x7540, 0xEEB0, 0x754E, + 0xEEB1, 0x754B, 0xEEB2, 0x7548, 0xEEB3, 0x755B, 0xEEB4, 0x7572, + 0xEEB5, 0x7579, 0xEEB6, 0x7583, 0xEEB7, 0x7F58, 0xEEB8, 0x7F61, + 0xEEB9, 0x7F5F, 0xEEBA, 0x8A48, 0xEEBB, 0x7F68, 0xEEBC, 0x7F74, + 0xEEBD, 0x7F71, 0xEEBE, 0x7F79, 0xEEBF, 0x7F81, 0xEEC0, 0x7F7E, + 0xEEC1, 0x76CD, 0xEEC2, 0x76E5, 0xEEC3, 0x8832, 0xEEC4, 0x9485, + 0xEEC5, 0x9486, 0xEEC6, 0x9487, 0xEEC7, 0x948B, 0xEEC8, 0x948A, + 0xEEC9, 0x948C, 0xEECA, 0x948D, 0xEECB, 0x948F, 0xEECC, 0x9490, + 0xEECD, 0x9494, 0xEECE, 0x9497, 0xEECF, 0x9495, 0xEED0, 0x949A, + 0xEED1, 0x949B, 0xEED2, 0x949C, 0xEED3, 0x94A3, 0xEED4, 0x94A4, + 0xEED5, 0x94AB, 0xEED6, 0x94AA, 0xEED7, 0x94AD, 0xEED8, 0x94AC, + 0xEED9, 0x94AF, 0xEEDA, 0x94B0, 0xEEDB, 0x94B2, 0xEEDC, 0x94B4, + 0xEEDD, 0x94B6, 0xEEDE, 0x94B7, 0xEEDF, 0x94B8, 0xEEE0, 0x94B9, + 0xEEE1, 0x94BA, 0xEEE2, 0x94BC, 0xEEE3, 0x94BD, 0xEEE4, 0x94BF, + 0xEEE5, 0x94C4, 0xEEE6, 0x94C8, 0xEEE7, 0x94C9, 0xEEE8, 0x94CA, + 0xEEE9, 0x94CB, 0xEEEA, 0x94CC, 0xEEEB, 0x94CD, 0xEEEC, 0x94CE, + 0xEEED, 0x94D0, 0xEEEE, 0x94D1, 0xEEEF, 0x94D2, 0xEEF0, 0x94D5, + 0xEEF1, 0x94D6, 0xEEF2, 0x94D7, 0xEEF3, 0x94D9, 0xEEF4, 0x94D8, + 0xEEF5, 0x94DB, 0xEEF6, 0x94DE, 0xEEF7, 0x94DF, 0xEEF8, 0x94E0, + 0xEEF9, 0x94E2, 0xEEFA, 0x94E4, 0xEEFB, 0x94E5, 0xEEFC, 0x94E7, + 0xEEFD, 0x94E8, 0xEEFE, 0x94EA, 0xEF40, 0x986F, 0xEF41, 0x9870, + 0xEF42, 0x9871, 0xEF43, 0x9872, 0xEF44, 0x9873, 0xEF45, 0x9874, + 0xEF46, 0x988B, 0xEF47, 0x988E, 0xEF48, 0x9892, 0xEF49, 0x9895, + 0xEF4A, 0x9899, 0xEF4B, 0x98A3, 0xEF4C, 0x98A8, 0xEF4D, 0x98A9, + 0xEF4E, 0x98AA, 0xEF4F, 0x98AB, 0xEF50, 0x98AC, 0xEF51, 0x98AD, + 0xEF52, 0x98AE, 0xEF53, 0x98AF, 0xEF54, 0x98B0, 0xEF55, 0x98B1, + 0xEF56, 0x98B2, 0xEF57, 0x98B3, 0xEF58, 0x98B4, 0xEF59, 0x98B5, + 0xEF5A, 0x98B6, 0xEF5B, 0x98B7, 0xEF5C, 0x98B8, 0xEF5D, 0x98B9, + 0xEF5E, 0x98BA, 0xEF5F, 0x98BB, 0xEF60, 0x98BC, 0xEF61, 0x98BD, + 0xEF62, 0x98BE, 0xEF63, 0x98BF, 0xEF64, 0x98C0, 0xEF65, 0x98C1, + 0xEF66, 0x98C2, 0xEF67, 0x98C3, 0xEF68, 0x98C4, 0xEF69, 0x98C5, + 0xEF6A, 0x98C6, 0xEF6B, 0x98C7, 0xEF6C, 0x98C8, 0xEF6D, 0x98C9, + 0xEF6E, 0x98CA, 0xEF6F, 0x98CB, 0xEF70, 0x98CC, 0xEF71, 0x98CD, + 0xEF72, 0x98CF, 0xEF73, 0x98D0, 0xEF74, 0x98D4, 0xEF75, 0x98D6, + 0xEF76, 0x98D7, 0xEF77, 0x98DB, 0xEF78, 0x98DC, 0xEF79, 0x98DD, + 0xEF7A, 0x98E0, 0xEF7B, 0x98E1, 0xEF7C, 0x98E2, 0xEF7D, 0x98E3, + 0xEF7E, 0x98E4, 0xEF80, 0x98E5, 0xEF81, 0x98E6, 0xEF82, 0x98E9, + 0xEF83, 0x98EA, 0xEF84, 0x98EB, 0xEF85, 0x98EC, 0xEF86, 0x98ED, + 0xEF87, 0x98EE, 0xEF88, 0x98EF, 0xEF89, 0x98F0, 0xEF8A, 0x98F1, + 0xEF8B, 0x98F2, 0xEF8C, 0x98F3, 0xEF8D, 0x98F4, 0xEF8E, 0x98F5, + 0xEF8F, 0x98F6, 0xEF90, 0x98F7, 0xEF91, 0x98F8, 0xEF92, 0x98F9, + 0xEF93, 0x98FA, 0xEF94, 0x98FB, 0xEF95, 0x98FC, 0xEF96, 0x98FD, + 0xEF97, 0x98FE, 0xEF98, 0x98FF, 0xEF99, 0x9900, 0xEF9A, 0x9901, + 0xEF9B, 0x9902, 0xEF9C, 0x9903, 0xEF9D, 0x9904, 0xEF9E, 0x9905, + 0xEF9F, 0x9906, 0xEFA0, 0x9907, 0xEFA1, 0x94E9, 0xEFA2, 0x94EB, + 0xEFA3, 0x94EE, 0xEFA4, 0x94EF, 0xEFA5, 0x94F3, 0xEFA6, 0x94F4, + 0xEFA7, 0x94F5, 0xEFA8, 0x94F7, 0xEFA9, 0x94F9, 0xEFAA, 0x94FC, + 0xEFAB, 0x94FD, 0xEFAC, 0x94FF, 0xEFAD, 0x9503, 0xEFAE, 0x9502, + 0xEFAF, 0x9506, 0xEFB0, 0x9507, 0xEFB1, 0x9509, 0xEFB2, 0x950A, + 0xEFB3, 0x950D, 0xEFB4, 0x950E, 0xEFB5, 0x950F, 0xEFB6, 0x9512, + 0xEFB7, 0x9513, 0xEFB8, 0x9514, 0xEFB9, 0x9515, 0xEFBA, 0x9516, + 0xEFBB, 0x9518, 0xEFBC, 0x951B, 0xEFBD, 0x951D, 0xEFBE, 0x951E, + 0xEFBF, 0x951F, 0xEFC0, 0x9522, 0xEFC1, 0x952A, 0xEFC2, 0x952B, + 0xEFC3, 0x9529, 0xEFC4, 0x952C, 0xEFC5, 0x9531, 0xEFC6, 0x9532, + 0xEFC7, 0x9534, 0xEFC8, 0x9536, 0xEFC9, 0x9537, 0xEFCA, 0x9538, + 0xEFCB, 0x953C, 0xEFCC, 0x953E, 0xEFCD, 0x953F, 0xEFCE, 0x9542, + 0xEFCF, 0x9535, 0xEFD0, 0x9544, 0xEFD1, 0x9545, 0xEFD2, 0x9546, + 0xEFD3, 0x9549, 0xEFD4, 0x954C, 0xEFD5, 0x954E, 0xEFD6, 0x954F, + 0xEFD7, 0x9552, 0xEFD8, 0x9553, 0xEFD9, 0x9554, 0xEFDA, 0x9556, + 0xEFDB, 0x9557, 0xEFDC, 0x9558, 0xEFDD, 0x9559, 0xEFDE, 0x955B, + 0xEFDF, 0x955E, 0xEFE0, 0x955F, 0xEFE1, 0x955D, 0xEFE2, 0x9561, + 0xEFE3, 0x9562, 0xEFE4, 0x9564, 0xEFE5, 0x9565, 0xEFE6, 0x9566, + 0xEFE7, 0x9567, 0xEFE8, 0x9568, 0xEFE9, 0x9569, 0xEFEA, 0x956A, + 0xEFEB, 0x956B, 0xEFEC, 0x956C, 0xEFED, 0x956F, 0xEFEE, 0x9571, + 0xEFEF, 0x9572, 0xEFF0, 0x9573, 0xEFF1, 0x953A, 0xEFF2, 0x77E7, + 0xEFF3, 0x77EC, 0xEFF4, 0x96C9, 0xEFF5, 0x79D5, 0xEFF6, 0x79ED, + 0xEFF7, 0x79E3, 0xEFF8, 0x79EB, 0xEFF9, 0x7A06, 0xEFFA, 0x5D47, + 0xEFFB, 0x7A03, 0xEFFC, 0x7A02, 0xEFFD, 0x7A1E, 0xEFFE, 0x7A14, + 0xF040, 0x9908, 0xF041, 0x9909, 0xF042, 0x990A, 0xF043, 0x990B, + 0xF044, 0x990C, 0xF045, 0x990E, 0xF046, 0x990F, 0xF047, 0x9911, + 0xF048, 0x9912, 0xF049, 0x9913, 0xF04A, 0x9914, 0xF04B, 0x9915, + 0xF04C, 0x9916, 0xF04D, 0x9917, 0xF04E, 0x9918, 0xF04F, 0x9919, + 0xF050, 0x991A, 0xF051, 0x991B, 0xF052, 0x991C, 0xF053, 0x991D, + 0xF054, 0x991E, 0xF055, 0x991F, 0xF056, 0x9920, 0xF057, 0x9921, + 0xF058, 0x9922, 0xF059, 0x9923, 0xF05A, 0x9924, 0xF05B, 0x9925, + 0xF05C, 0x9926, 0xF05D, 0x9927, 0xF05E, 0x9928, 0xF05F, 0x9929, + 0xF060, 0x992A, 0xF061, 0x992B, 0xF062, 0x992C, 0xF063, 0x992D, + 0xF064, 0x992F, 0xF065, 0x9930, 0xF066, 0x9931, 0xF067, 0x9932, + 0xF068, 0x9933, 0xF069, 0x9934, 0xF06A, 0x9935, 0xF06B, 0x9936, + 0xF06C, 0x9937, 0xF06D, 0x9938, 0xF06E, 0x9939, 0xF06F, 0x993A, + 0xF070, 0x993B, 0xF071, 0x993C, 0xF072, 0x993D, 0xF073, 0x993E, + 0xF074, 0x993F, 0xF075, 0x9940, 0xF076, 0x9941, 0xF077, 0x9942, + 0xF078, 0x9943, 0xF079, 0x9944, 0xF07A, 0x9945, 0xF07B, 0x9946, + 0xF07C, 0x9947, 0xF07D, 0x9948, 0xF07E, 0x9949, 0xF080, 0x994A, + 0xF081, 0x994B, 0xF082, 0x994C, 0xF083, 0x994D, 0xF084, 0x994E, + 0xF085, 0x994F, 0xF086, 0x9950, 0xF087, 0x9951, 0xF088, 0x9952, + 0xF089, 0x9953, 0xF08A, 0x9956, 0xF08B, 0x9957, 0xF08C, 0x9958, + 0xF08D, 0x9959, 0xF08E, 0x995A, 0xF08F, 0x995B, 0xF090, 0x995C, + 0xF091, 0x995D, 0xF092, 0x995E, 0xF093, 0x995F, 0xF094, 0x9960, + 0xF095, 0x9961, 0xF096, 0x9962, 0xF097, 0x9964, 0xF098, 0x9966, + 0xF099, 0x9973, 0xF09A, 0x9978, 0xF09B, 0x9979, 0xF09C, 0x997B, + 0xF09D, 0x997E, 0xF09E, 0x9982, 0xF09F, 0x9983, 0xF0A0, 0x9989, + 0xF0A1, 0x7A39, 0xF0A2, 0x7A37, 0xF0A3, 0x7A51, 0xF0A4, 0x9ECF, + 0xF0A5, 0x99A5, 0xF0A6, 0x7A70, 0xF0A7, 0x7688, 0xF0A8, 0x768E, + 0xF0A9, 0x7693, 0xF0AA, 0x7699, 0xF0AB, 0x76A4, 0xF0AC, 0x74DE, + 0xF0AD, 0x74E0, 0xF0AE, 0x752C, 0xF0AF, 0x9E20, 0xF0B0, 0x9E22, + 0xF0B1, 0x9E28, 0xF0B2, 0x9E29, 0xF0B3, 0x9E2A, 0xF0B4, 0x9E2B, + 0xF0B5, 0x9E2C, 0xF0B6, 0x9E32, 0xF0B7, 0x9E31, 0xF0B8, 0x9E36, + 0xF0B9, 0x9E38, 0xF0BA, 0x9E37, 0xF0BB, 0x9E39, 0xF0BC, 0x9E3A, + 0xF0BD, 0x9E3E, 0xF0BE, 0x9E41, 0xF0BF, 0x9E42, 0xF0C0, 0x9E44, + 0xF0C1, 0x9E46, 0xF0C2, 0x9E47, 0xF0C3, 0x9E48, 0xF0C4, 0x9E49, + 0xF0C5, 0x9E4B, 0xF0C6, 0x9E4C, 0xF0C7, 0x9E4E, 0xF0C8, 0x9E51, + 0xF0C9, 0x9E55, 0xF0CA, 0x9E57, 0xF0CB, 0x9E5A, 0xF0CC, 0x9E5B, + 0xF0CD, 0x9E5C, 0xF0CE, 0x9E5E, 0xF0CF, 0x9E63, 0xF0D0, 0x9E66, + 0xF0D1, 0x9E67, 0xF0D2, 0x9E68, 0xF0D3, 0x9E69, 0xF0D4, 0x9E6A, + 0xF0D5, 0x9E6B, 0xF0D6, 0x9E6C, 0xF0D7, 0x9E71, 0xF0D8, 0x9E6D, + 0xF0D9, 0x9E73, 0xF0DA, 0x7592, 0xF0DB, 0x7594, 0xF0DC, 0x7596, + 0xF0DD, 0x75A0, 0xF0DE, 0x759D, 0xF0DF, 0x75AC, 0xF0E0, 0x75A3, + 0xF0E1, 0x75B3, 0xF0E2, 0x75B4, 0xF0E3, 0x75B8, 0xF0E4, 0x75C4, + 0xF0E5, 0x75B1, 0xF0E6, 0x75B0, 0xF0E7, 0x75C3, 0xF0E8, 0x75C2, + 0xF0E9, 0x75D6, 0xF0EA, 0x75CD, 0xF0EB, 0x75E3, 0xF0EC, 0x75E8, + 0xF0ED, 0x75E6, 0xF0EE, 0x75E4, 0xF0EF, 0x75EB, 0xF0F0, 0x75E7, + 0xF0F1, 0x7603, 0xF0F2, 0x75F1, 0xF0F3, 0x75FC, 0xF0F4, 0x75FF, + 0xF0F5, 0x7610, 0xF0F6, 0x7600, 0xF0F7, 0x7605, 0xF0F8, 0x760C, + 0xF0F9, 0x7617, 0xF0FA, 0x760A, 0xF0FB, 0x7625, 0xF0FC, 0x7618, + 0xF0FD, 0x7615, 0xF0FE, 0x7619, 0xF140, 0x998C, 0xF141, 0x998E, + 0xF142, 0x999A, 0xF143, 0x999B, 0xF144, 0x999C, 0xF145, 0x999D, + 0xF146, 0x999E, 0xF147, 0x999F, 0xF148, 0x99A0, 0xF149, 0x99A1, + 0xF14A, 0x99A2, 0xF14B, 0x99A3, 0xF14C, 0x99A4, 0xF14D, 0x99A6, + 0xF14E, 0x99A7, 0xF14F, 0x99A9, 0xF150, 0x99AA, 0xF151, 0x99AB, + 0xF152, 0x99AC, 0xF153, 0x99AD, 0xF154, 0x99AE, 0xF155, 0x99AF, + 0xF156, 0x99B0, 0xF157, 0x99B1, 0xF158, 0x99B2, 0xF159, 0x99B3, + 0xF15A, 0x99B4, 0xF15B, 0x99B5, 0xF15C, 0x99B6, 0xF15D, 0x99B7, + 0xF15E, 0x99B8, 0xF15F, 0x99B9, 0xF160, 0x99BA, 0xF161, 0x99BB, + 0xF162, 0x99BC, 0xF163, 0x99BD, 0xF164, 0x99BE, 0xF165, 0x99BF, + 0xF166, 0x99C0, 0xF167, 0x99C1, 0xF168, 0x99C2, 0xF169, 0x99C3, + 0xF16A, 0x99C4, 0xF16B, 0x99C5, 0xF16C, 0x99C6, 0xF16D, 0x99C7, + 0xF16E, 0x99C8, 0xF16F, 0x99C9, 0xF170, 0x99CA, 0xF171, 0x99CB, + 0xF172, 0x99CC, 0xF173, 0x99CD, 0xF174, 0x99CE, 0xF175, 0x99CF, + 0xF176, 0x99D0, 0xF177, 0x99D1, 0xF178, 0x99D2, 0xF179, 0x99D3, + 0xF17A, 0x99D4, 0xF17B, 0x99D5, 0xF17C, 0x99D6, 0xF17D, 0x99D7, + 0xF17E, 0x99D8, 0xF180, 0x99D9, 0xF181, 0x99DA, 0xF182, 0x99DB, + 0xF183, 0x99DC, 0xF184, 0x99DD, 0xF185, 0x99DE, 0xF186, 0x99DF, + 0xF187, 0x99E0, 0xF188, 0x99E1, 0xF189, 0x99E2, 0xF18A, 0x99E3, + 0xF18B, 0x99E4, 0xF18C, 0x99E5, 0xF18D, 0x99E6, 0xF18E, 0x99E7, + 0xF18F, 0x99E8, 0xF190, 0x99E9, 0xF191, 0x99EA, 0xF192, 0x99EB, + 0xF193, 0x99EC, 0xF194, 0x99ED, 0xF195, 0x99EE, 0xF196, 0x99EF, + 0xF197, 0x99F0, 0xF198, 0x99F1, 0xF199, 0x99F2, 0xF19A, 0x99F3, + 0xF19B, 0x99F4, 0xF19C, 0x99F5, 0xF19D, 0x99F6, 0xF19E, 0x99F7, + 0xF19F, 0x99F8, 0xF1A0, 0x99F9, 0xF1A1, 0x761B, 0xF1A2, 0x763C, + 0xF1A3, 0x7622, 0xF1A4, 0x7620, 0xF1A5, 0x7640, 0xF1A6, 0x762D, + 0xF1A7, 0x7630, 0xF1A8, 0x763F, 0xF1A9, 0x7635, 0xF1AA, 0x7643, + 0xF1AB, 0x763E, 0xF1AC, 0x7633, 0xF1AD, 0x764D, 0xF1AE, 0x765E, + 0xF1AF, 0x7654, 0xF1B0, 0x765C, 0xF1B1, 0x7656, 0xF1B2, 0x766B, + 0xF1B3, 0x766F, 0xF1B4, 0x7FCA, 0xF1B5, 0x7AE6, 0xF1B6, 0x7A78, + 0xF1B7, 0x7A79, 0xF1B8, 0x7A80, 0xF1B9, 0x7A86, 0xF1BA, 0x7A88, + 0xF1BB, 0x7A95, 0xF1BC, 0x7AA6, 0xF1BD, 0x7AA0, 0xF1BE, 0x7AAC, + 0xF1BF, 0x7AA8, 0xF1C0, 0x7AAD, 0xF1C1, 0x7AB3, 0xF1C2, 0x8864, + 0xF1C3, 0x8869, 0xF1C4, 0x8872, 0xF1C5, 0x887D, 0xF1C6, 0x887F, + 0xF1C7, 0x8882, 0xF1C8, 0x88A2, 0xF1C9, 0x88C6, 0xF1CA, 0x88B7, + 0xF1CB, 0x88BC, 0xF1CC, 0x88C9, 0xF1CD, 0x88E2, 0xF1CE, 0x88CE, + 0xF1CF, 0x88E3, 0xF1D0, 0x88E5, 0xF1D1, 0x88F1, 0xF1D2, 0x891A, + 0xF1D3, 0x88FC, 0xF1D4, 0x88E8, 0xF1D5, 0x88FE, 0xF1D6, 0x88F0, + 0xF1D7, 0x8921, 0xF1D8, 0x8919, 0xF1D9, 0x8913, 0xF1DA, 0x891B, + 0xF1DB, 0x890A, 0xF1DC, 0x8934, 0xF1DD, 0x892B, 0xF1DE, 0x8936, + 0xF1DF, 0x8941, 0xF1E0, 0x8966, 0xF1E1, 0x897B, 0xF1E2, 0x758B, + 0xF1E3, 0x80E5, 0xF1E4, 0x76B2, 0xF1E5, 0x76B4, 0xF1E6, 0x77DC, + 0xF1E7, 0x8012, 0xF1E8, 0x8014, 0xF1E9, 0x8016, 0xF1EA, 0x801C, + 0xF1EB, 0x8020, 0xF1EC, 0x8022, 0xF1ED, 0x8025, 0xF1EE, 0x8026, + 0xF1EF, 0x8027, 0xF1F0, 0x8029, 0xF1F1, 0x8028, 0xF1F2, 0x8031, + 0xF1F3, 0x800B, 0xF1F4, 0x8035, 0xF1F5, 0x8043, 0xF1F6, 0x8046, + 0xF1F7, 0x804D, 0xF1F8, 0x8052, 0xF1F9, 0x8069, 0xF1FA, 0x8071, + 0xF1FB, 0x8983, 0xF1FC, 0x9878, 0xF1FD, 0x9880, 0xF1FE, 0x9883, + 0xF240, 0x99FA, 0xF241, 0x99FB, 0xF242, 0x99FC, 0xF243, 0x99FD, + 0xF244, 0x99FE, 0xF245, 0x99FF, 0xF246, 0x9A00, 0xF247, 0x9A01, + 0xF248, 0x9A02, 0xF249, 0x9A03, 0xF24A, 0x9A04, 0xF24B, 0x9A05, + 0xF24C, 0x9A06, 0xF24D, 0x9A07, 0xF24E, 0x9A08, 0xF24F, 0x9A09, + 0xF250, 0x9A0A, 0xF251, 0x9A0B, 0xF252, 0x9A0C, 0xF253, 0x9A0D, + 0xF254, 0x9A0E, 0xF255, 0x9A0F, 0xF256, 0x9A10, 0xF257, 0x9A11, + 0xF258, 0x9A12, 0xF259, 0x9A13, 0xF25A, 0x9A14, 0xF25B, 0x9A15, + 0xF25C, 0x9A16, 0xF25D, 0x9A17, 0xF25E, 0x9A18, 0xF25F, 0x9A19, + 0xF260, 0x9A1A, 0xF261, 0x9A1B, 0xF262, 0x9A1C, 0xF263, 0x9A1D, + 0xF264, 0x9A1E, 0xF265, 0x9A1F, 0xF266, 0x9A20, 0xF267, 0x9A21, + 0xF268, 0x9A22, 0xF269, 0x9A23, 0xF26A, 0x9A24, 0xF26B, 0x9A25, + 0xF26C, 0x9A26, 0xF26D, 0x9A27, 0xF26E, 0x9A28, 0xF26F, 0x9A29, + 0xF270, 0x9A2A, 0xF271, 0x9A2B, 0xF272, 0x9A2C, 0xF273, 0x9A2D, + 0xF274, 0x9A2E, 0xF275, 0x9A2F, 0xF276, 0x9A30, 0xF277, 0x9A31, + 0xF278, 0x9A32, 0xF279, 0x9A33, 0xF27A, 0x9A34, 0xF27B, 0x9A35, + 0xF27C, 0x9A36, 0xF27D, 0x9A37, 0xF27E, 0x9A38, 0xF280, 0x9A39, + 0xF281, 0x9A3A, 0xF282, 0x9A3B, 0xF283, 0x9A3C, 0xF284, 0x9A3D, + 0xF285, 0x9A3E, 0xF286, 0x9A3F, 0xF287, 0x9A40, 0xF288, 0x9A41, + 0xF289, 0x9A42, 0xF28A, 0x9A43, 0xF28B, 0x9A44, 0xF28C, 0x9A45, + 0xF28D, 0x9A46, 0xF28E, 0x9A47, 0xF28F, 0x9A48, 0xF290, 0x9A49, + 0xF291, 0x9A4A, 0xF292, 0x9A4B, 0xF293, 0x9A4C, 0xF294, 0x9A4D, + 0xF295, 0x9A4E, 0xF296, 0x9A4F, 0xF297, 0x9A50, 0xF298, 0x9A51, + 0xF299, 0x9A52, 0xF29A, 0x9A53, 0xF29B, 0x9A54, 0xF29C, 0x9A55, + 0xF29D, 0x9A56, 0xF29E, 0x9A57, 0xF29F, 0x9A58, 0xF2A0, 0x9A59, + 0xF2A1, 0x9889, 0xF2A2, 0x988C, 0xF2A3, 0x988D, 0xF2A4, 0x988F, + 0xF2A5, 0x9894, 0xF2A6, 0x989A, 0xF2A7, 0x989B, 0xF2A8, 0x989E, + 0xF2A9, 0x989F, 0xF2AA, 0x98A1, 0xF2AB, 0x98A2, 0xF2AC, 0x98A5, + 0xF2AD, 0x98A6, 0xF2AE, 0x864D, 0xF2AF, 0x8654, 0xF2B0, 0x866C, + 0xF2B1, 0x866E, 0xF2B2, 0x867F, 0xF2B3, 0x867A, 0xF2B4, 0x867C, + 0xF2B5, 0x867B, 0xF2B6, 0x86A8, 0xF2B7, 0x868D, 0xF2B8, 0x868B, + 0xF2B9, 0x86AC, 0xF2BA, 0x869D, 0xF2BB, 0x86A7, 0xF2BC, 0x86A3, + 0xF2BD, 0x86AA, 0xF2BE, 0x8693, 0xF2BF, 0x86A9, 0xF2C0, 0x86B6, + 0xF2C1, 0x86C4, 0xF2C2, 0x86B5, 0xF2C3, 0x86CE, 0xF2C4, 0x86B0, + 0xF2C5, 0x86BA, 0xF2C6, 0x86B1, 0xF2C7, 0x86AF, 0xF2C8, 0x86C9, + 0xF2C9, 0x86CF, 0xF2CA, 0x86B4, 0xF2CB, 0x86E9, 0xF2CC, 0x86F1, + 0xF2CD, 0x86F2, 0xF2CE, 0x86ED, 0xF2CF, 0x86F3, 0xF2D0, 0x86D0, + 0xF2D1, 0x8713, 0xF2D2, 0x86DE, 0xF2D3, 0x86F4, 0xF2D4, 0x86DF, + 0xF2D5, 0x86D8, 0xF2D6, 0x86D1, 0xF2D7, 0x8703, 0xF2D8, 0x8707, + 0xF2D9, 0x86F8, 0xF2DA, 0x8708, 0xF2DB, 0x870A, 0xF2DC, 0x870D, + 0xF2DD, 0x8709, 0xF2DE, 0x8723, 0xF2DF, 0x873B, 0xF2E0, 0x871E, + 0xF2E1, 0x8725, 0xF2E2, 0x872E, 0xF2E3, 0x871A, 0xF2E4, 0x873E, + 0xF2E5, 0x8748, 0xF2E6, 0x8734, 0xF2E7, 0x8731, 0xF2E8, 0x8729, + 0xF2E9, 0x8737, 0xF2EA, 0x873F, 0xF2EB, 0x8782, 0xF2EC, 0x8722, + 0xF2ED, 0x877D, 0xF2EE, 0x877E, 0xF2EF, 0x877B, 0xF2F0, 0x8760, + 0xF2F1, 0x8770, 0xF2F2, 0x874C, 0xF2F3, 0x876E, 0xF2F4, 0x878B, + 0xF2F5, 0x8753, 0xF2F6, 0x8763, 0xF2F7, 0x877C, 0xF2F8, 0x8764, + 0xF2F9, 0x8759, 0xF2FA, 0x8765, 0xF2FB, 0x8793, 0xF2FC, 0x87AF, + 0xF2FD, 0x87A8, 0xF2FE, 0x87D2, 0xF340, 0x9A5A, 0xF341, 0x9A5B, + 0xF342, 0x9A5C, 0xF343, 0x9A5D, 0xF344, 0x9A5E, 0xF345, 0x9A5F, + 0xF346, 0x9A60, 0xF347, 0x9A61, 0xF348, 0x9A62, 0xF349, 0x9A63, + 0xF34A, 0x9A64, 0xF34B, 0x9A65, 0xF34C, 0x9A66, 0xF34D, 0x9A67, + 0xF34E, 0x9A68, 0xF34F, 0x9A69, 0xF350, 0x9A6A, 0xF351, 0x9A6B, + 0xF352, 0x9A72, 0xF353, 0x9A83, 0xF354, 0x9A89, 0xF355, 0x9A8D, + 0xF356, 0x9A8E, 0xF357, 0x9A94, 0xF358, 0x9A95, 0xF359, 0x9A99, + 0xF35A, 0x9AA6, 0xF35B, 0x9AA9, 0xF35C, 0x9AAA, 0xF35D, 0x9AAB, + 0xF35E, 0x9AAC, 0xF35F, 0x9AAD, 0xF360, 0x9AAE, 0xF361, 0x9AAF, + 0xF362, 0x9AB2, 0xF363, 0x9AB3, 0xF364, 0x9AB4, 0xF365, 0x9AB5, + 0xF366, 0x9AB9, 0xF367, 0x9ABB, 0xF368, 0x9ABD, 0xF369, 0x9ABE, + 0xF36A, 0x9ABF, 0xF36B, 0x9AC3, 0xF36C, 0x9AC4, 0xF36D, 0x9AC6, + 0xF36E, 0x9AC7, 0xF36F, 0x9AC8, 0xF370, 0x9AC9, 0xF371, 0x9ACA, + 0xF372, 0x9ACD, 0xF373, 0x9ACE, 0xF374, 0x9ACF, 0xF375, 0x9AD0, + 0xF376, 0x9AD2, 0xF377, 0x9AD4, 0xF378, 0x9AD5, 0xF379, 0x9AD6, + 0xF37A, 0x9AD7, 0xF37B, 0x9AD9, 0xF37C, 0x9ADA, 0xF37D, 0x9ADB, + 0xF37E, 0x9ADC, 0xF380, 0x9ADD, 0xF381, 0x9ADE, 0xF382, 0x9AE0, + 0xF383, 0x9AE2, 0xF384, 0x9AE3, 0xF385, 0x9AE4, 0xF386, 0x9AE5, + 0xF387, 0x9AE7, 0xF388, 0x9AE8, 0xF389, 0x9AE9, 0xF38A, 0x9AEA, + 0xF38B, 0x9AEC, 0xF38C, 0x9AEE, 0xF38D, 0x9AF0, 0xF38E, 0x9AF1, + 0xF38F, 0x9AF2, 0xF390, 0x9AF3, 0xF391, 0x9AF4, 0xF392, 0x9AF5, + 0xF393, 0x9AF6, 0xF394, 0x9AF7, 0xF395, 0x9AF8, 0xF396, 0x9AFA, + 0xF397, 0x9AFC, 0xF398, 0x9AFD, 0xF399, 0x9AFE, 0xF39A, 0x9AFF, + 0xF39B, 0x9B00, 0xF39C, 0x9B01, 0xF39D, 0x9B02, 0xF39E, 0x9B04, + 0xF39F, 0x9B05, 0xF3A0, 0x9B06, 0xF3A1, 0x87C6, 0xF3A2, 0x8788, + 0xF3A3, 0x8785, 0xF3A4, 0x87AD, 0xF3A5, 0x8797, 0xF3A6, 0x8783, + 0xF3A7, 0x87AB, 0xF3A8, 0x87E5, 0xF3A9, 0x87AC, 0xF3AA, 0x87B5, + 0xF3AB, 0x87B3, 0xF3AC, 0x87CB, 0xF3AD, 0x87D3, 0xF3AE, 0x87BD, + 0xF3AF, 0x87D1, 0xF3B0, 0x87C0, 0xF3B1, 0x87CA, 0xF3B2, 0x87DB, + 0xF3B3, 0x87EA, 0xF3B4, 0x87E0, 0xF3B5, 0x87EE, 0xF3B6, 0x8816, + 0xF3B7, 0x8813, 0xF3B8, 0x87FE, 0xF3B9, 0x880A, 0xF3BA, 0x881B, + 0xF3BB, 0x8821, 0xF3BC, 0x8839, 0xF3BD, 0x883C, 0xF3BE, 0x7F36, + 0xF3BF, 0x7F42, 0xF3C0, 0x7F44, 0xF3C1, 0x7F45, 0xF3C2, 0x8210, + 0xF3C3, 0x7AFA, 0xF3C4, 0x7AFD, 0xF3C5, 0x7B08, 0xF3C6, 0x7B03, + 0xF3C7, 0x7B04, 0xF3C8, 0x7B15, 0xF3C9, 0x7B0A, 0xF3CA, 0x7B2B, + 0xF3CB, 0x7B0F, 0xF3CC, 0x7B47, 0xF3CD, 0x7B38, 0xF3CE, 0x7B2A, + 0xF3CF, 0x7B19, 0xF3D0, 0x7B2E, 0xF3D1, 0x7B31, 0xF3D2, 0x7B20, + 0xF3D3, 0x7B25, 0xF3D4, 0x7B24, 0xF3D5, 0x7B33, 0xF3D6, 0x7B3E, + 0xF3D7, 0x7B1E, 0xF3D8, 0x7B58, 0xF3D9, 0x7B5A, 0xF3DA, 0x7B45, + 0xF3DB, 0x7B75, 0xF3DC, 0x7B4C, 0xF3DD, 0x7B5D, 0xF3DE, 0x7B60, + 0xF3DF, 0x7B6E, 0xF3E0, 0x7B7B, 0xF3E1, 0x7B62, 0xF3E2, 0x7B72, + 0xF3E3, 0x7B71, 0xF3E4, 0x7B90, 0xF3E5, 0x7BA6, 0xF3E6, 0x7BA7, + 0xF3E7, 0x7BB8, 0xF3E8, 0x7BAC, 0xF3E9, 0x7B9D, 0xF3EA, 0x7BA8, + 0xF3EB, 0x7B85, 0xF3EC, 0x7BAA, 0xF3ED, 0x7B9C, 0xF3EE, 0x7BA2, + 0xF3EF, 0x7BAB, 0xF3F0, 0x7BB4, 0xF3F1, 0x7BD1, 0xF3F2, 0x7BC1, + 0xF3F3, 0x7BCC, 0xF3F4, 0x7BDD, 0xF3F5, 0x7BDA, 0xF3F6, 0x7BE5, + 0xF3F7, 0x7BE6, 0xF3F8, 0x7BEA, 0xF3F9, 0x7C0C, 0xF3FA, 0x7BFE, + 0xF3FB, 0x7BFC, 0xF3FC, 0x7C0F, 0xF3FD, 0x7C16, 0xF3FE, 0x7C0B, + 0xF440, 0x9B07, 0xF441, 0x9B09, 0xF442, 0x9B0A, 0xF443, 0x9B0B, + 0xF444, 0x9B0C, 0xF445, 0x9B0D, 0xF446, 0x9B0E, 0xF447, 0x9B10, + 0xF448, 0x9B11, 0xF449, 0x9B12, 0xF44A, 0x9B14, 0xF44B, 0x9B15, + 0xF44C, 0x9B16, 0xF44D, 0x9B17, 0xF44E, 0x9B18, 0xF44F, 0x9B19, + 0xF450, 0x9B1A, 0xF451, 0x9B1B, 0xF452, 0x9B1C, 0xF453, 0x9B1D, + 0xF454, 0x9B1E, 0xF455, 0x9B20, 0xF456, 0x9B21, 0xF457, 0x9B22, + 0xF458, 0x9B24, 0xF459, 0x9B25, 0xF45A, 0x9B26, 0xF45B, 0x9B27, + 0xF45C, 0x9B28, 0xF45D, 0x9B29, 0xF45E, 0x9B2A, 0xF45F, 0x9B2B, + 0xF460, 0x9B2C, 0xF461, 0x9B2D, 0xF462, 0x9B2E, 0xF463, 0x9B30, + 0xF464, 0x9B31, 0xF465, 0x9B33, 0xF466, 0x9B34, 0xF467, 0x9B35, + 0xF468, 0x9B36, 0xF469, 0x9B37, 0xF46A, 0x9B38, 0xF46B, 0x9B39, + 0xF46C, 0x9B3A, 0xF46D, 0x9B3D, 0xF46E, 0x9B3E, 0xF46F, 0x9B3F, + 0xF470, 0x9B40, 0xF471, 0x9B46, 0xF472, 0x9B4A, 0xF473, 0x9B4B, + 0xF474, 0x9B4C, 0xF475, 0x9B4E, 0xF476, 0x9B50, 0xF477, 0x9B52, + 0xF478, 0x9B53, 0xF479, 0x9B55, 0xF47A, 0x9B56, 0xF47B, 0x9B57, + 0xF47C, 0x9B58, 0xF47D, 0x9B59, 0xF47E, 0x9B5A, 0xF480, 0x9B5B, + 0xF481, 0x9B5C, 0xF482, 0x9B5D, 0xF483, 0x9B5E, 0xF484, 0x9B5F, + 0xF485, 0x9B60, 0xF486, 0x9B61, 0xF487, 0x9B62, 0xF488, 0x9B63, + 0xF489, 0x9B64, 0xF48A, 0x9B65, 0xF48B, 0x9B66, 0xF48C, 0x9B67, + 0xF48D, 0x9B68, 0xF48E, 0x9B69, 0xF48F, 0x9B6A, 0xF490, 0x9B6B, + 0xF491, 0x9B6C, 0xF492, 0x9B6D, 0xF493, 0x9B6E, 0xF494, 0x9B6F, + 0xF495, 0x9B70, 0xF496, 0x9B71, 0xF497, 0x9B72, 0xF498, 0x9B73, + 0xF499, 0x9B74, 0xF49A, 0x9B75, 0xF49B, 0x9B76, 0xF49C, 0x9B77, + 0xF49D, 0x9B78, 0xF49E, 0x9B79, 0xF49F, 0x9B7A, 0xF4A0, 0x9B7B, + 0xF4A1, 0x7C1F, 0xF4A2, 0x7C2A, 0xF4A3, 0x7C26, 0xF4A4, 0x7C38, + 0xF4A5, 0x7C41, 0xF4A6, 0x7C40, 0xF4A7, 0x81FE, 0xF4A8, 0x8201, + 0xF4A9, 0x8202, 0xF4AA, 0x8204, 0xF4AB, 0x81EC, 0xF4AC, 0x8844, + 0xF4AD, 0x8221, 0xF4AE, 0x8222, 0xF4AF, 0x8223, 0xF4B0, 0x822D, + 0xF4B1, 0x822F, 0xF4B2, 0x8228, 0xF4B3, 0x822B, 0xF4B4, 0x8238, + 0xF4B5, 0x823B, 0xF4B6, 0x8233, 0xF4B7, 0x8234, 0xF4B8, 0x823E, + 0xF4B9, 0x8244, 0xF4BA, 0x8249, 0xF4BB, 0x824B, 0xF4BC, 0x824F, + 0xF4BD, 0x825A, 0xF4BE, 0x825F, 0xF4BF, 0x8268, 0xF4C0, 0x887E, + 0xF4C1, 0x8885, 0xF4C2, 0x8888, 0xF4C3, 0x88D8, 0xF4C4, 0x88DF, + 0xF4C5, 0x895E, 0xF4C6, 0x7F9D, 0xF4C7, 0x7F9F, 0xF4C8, 0x7FA7, + 0xF4C9, 0x7FAF, 0xF4CA, 0x7FB0, 0xF4CB, 0x7FB2, 0xF4CC, 0x7C7C, + 0xF4CD, 0x6549, 0xF4CE, 0x7C91, 0xF4CF, 0x7C9D, 0xF4D0, 0x7C9C, + 0xF4D1, 0x7C9E, 0xF4D2, 0x7CA2, 0xF4D3, 0x7CB2, 0xF4D4, 0x7CBC, + 0xF4D5, 0x7CBD, 0xF4D6, 0x7CC1, 0xF4D7, 0x7CC7, 0xF4D8, 0x7CCC, + 0xF4D9, 0x7CCD, 0xF4DA, 0x7CC8, 0xF4DB, 0x7CC5, 0xF4DC, 0x7CD7, + 0xF4DD, 0x7CE8, 0xF4DE, 0x826E, 0xF4DF, 0x66A8, 0xF4E0, 0x7FBF, + 0xF4E1, 0x7FCE, 0xF4E2, 0x7FD5, 0xF4E3, 0x7FE5, 0xF4E4, 0x7FE1, + 0xF4E5, 0x7FE6, 0xF4E6, 0x7FE9, 0xF4E7, 0x7FEE, 0xF4E8, 0x7FF3, + 0xF4E9, 0x7CF8, 0xF4EA, 0x7D77, 0xF4EB, 0x7DA6, 0xF4EC, 0x7DAE, + 0xF4ED, 0x7E47, 0xF4EE, 0x7E9B, 0xF4EF, 0x9EB8, 0xF4F0, 0x9EB4, + 0xF4F1, 0x8D73, 0xF4F2, 0x8D84, 0xF4F3, 0x8D94, 0xF4F4, 0x8D91, + 0xF4F5, 0x8DB1, 0xF4F6, 0x8D67, 0xF4F7, 0x8D6D, 0xF4F8, 0x8C47, + 0xF4F9, 0x8C49, 0xF4FA, 0x914A, 0xF4FB, 0x9150, 0xF4FC, 0x914E, + 0xF4FD, 0x914F, 0xF4FE, 0x9164, 0xF540, 0x9B7C, 0xF541, 0x9B7D, + 0xF542, 0x9B7E, 0xF543, 0x9B7F, 0xF544, 0x9B80, 0xF545, 0x9B81, + 0xF546, 0x9B82, 0xF547, 0x9B83, 0xF548, 0x9B84, 0xF549, 0x9B85, + 0xF54A, 0x9B86, 0xF54B, 0x9B87, 0xF54C, 0x9B88, 0xF54D, 0x9B89, + 0xF54E, 0x9B8A, 0xF54F, 0x9B8B, 0xF550, 0x9B8C, 0xF551, 0x9B8D, + 0xF552, 0x9B8E, 0xF553, 0x9B8F, 0xF554, 0x9B90, 0xF555, 0x9B91, + 0xF556, 0x9B92, 0xF557, 0x9B93, 0xF558, 0x9B94, 0xF559, 0x9B95, + 0xF55A, 0x9B96, 0xF55B, 0x9B97, 0xF55C, 0x9B98, 0xF55D, 0x9B99, + 0xF55E, 0x9B9A, 0xF55F, 0x9B9B, 0xF560, 0x9B9C, 0xF561, 0x9B9D, + 0xF562, 0x9B9E, 0xF563, 0x9B9F, 0xF564, 0x9BA0, 0xF565, 0x9BA1, + 0xF566, 0x9BA2, 0xF567, 0x9BA3, 0xF568, 0x9BA4, 0xF569, 0x9BA5, + 0xF56A, 0x9BA6, 0xF56B, 0x9BA7, 0xF56C, 0x9BA8, 0xF56D, 0x9BA9, + 0xF56E, 0x9BAA, 0xF56F, 0x9BAB, 0xF570, 0x9BAC, 0xF571, 0x9BAD, + 0xF572, 0x9BAE, 0xF573, 0x9BAF, 0xF574, 0x9BB0, 0xF575, 0x9BB1, + 0xF576, 0x9BB2, 0xF577, 0x9BB3, 0xF578, 0x9BB4, 0xF579, 0x9BB5, + 0xF57A, 0x9BB6, 0xF57B, 0x9BB7, 0xF57C, 0x9BB8, 0xF57D, 0x9BB9, + 0xF57E, 0x9BBA, 0xF580, 0x9BBB, 0xF581, 0x9BBC, 0xF582, 0x9BBD, + 0xF583, 0x9BBE, 0xF584, 0x9BBF, 0xF585, 0x9BC0, 0xF586, 0x9BC1, + 0xF587, 0x9BC2, 0xF588, 0x9BC3, 0xF589, 0x9BC4, 0xF58A, 0x9BC5, + 0xF58B, 0x9BC6, 0xF58C, 0x9BC7, 0xF58D, 0x9BC8, 0xF58E, 0x9BC9, + 0xF58F, 0x9BCA, 0xF590, 0x9BCB, 0xF591, 0x9BCC, 0xF592, 0x9BCD, + 0xF593, 0x9BCE, 0xF594, 0x9BCF, 0xF595, 0x9BD0, 0xF596, 0x9BD1, + 0xF597, 0x9BD2, 0xF598, 0x9BD3, 0xF599, 0x9BD4, 0xF59A, 0x9BD5, + 0xF59B, 0x9BD6, 0xF59C, 0x9BD7, 0xF59D, 0x9BD8, 0xF59E, 0x9BD9, + 0xF59F, 0x9BDA, 0xF5A0, 0x9BDB, 0xF5A1, 0x9162, 0xF5A2, 0x9161, + 0xF5A3, 0x9170, 0xF5A4, 0x9169, 0xF5A5, 0x916F, 0xF5A6, 0x917D, + 0xF5A7, 0x917E, 0xF5A8, 0x9172, 0xF5A9, 0x9174, 0xF5AA, 0x9179, + 0xF5AB, 0x918C, 0xF5AC, 0x9185, 0xF5AD, 0x9190, 0xF5AE, 0x918D, + 0xF5AF, 0x9191, 0xF5B0, 0x91A2, 0xF5B1, 0x91A3, 0xF5B2, 0x91AA, + 0xF5B3, 0x91AD, 0xF5B4, 0x91AE, 0xF5B5, 0x91AF, 0xF5B6, 0x91B5, + 0xF5B7, 0x91B4, 0xF5B8, 0x91BA, 0xF5B9, 0x8C55, 0xF5BA, 0x9E7E, + 0xF5BB, 0x8DB8, 0xF5BC, 0x8DEB, 0xF5BD, 0x8E05, 0xF5BE, 0x8E59, + 0xF5BF, 0x8E69, 0xF5C0, 0x8DB5, 0xF5C1, 0x8DBF, 0xF5C2, 0x8DBC, + 0xF5C3, 0x8DBA, 0xF5C4, 0x8DC4, 0xF5C5, 0x8DD6, 0xF5C6, 0x8DD7, + 0xF5C7, 0x8DDA, 0xF5C8, 0x8DDE, 0xF5C9, 0x8DCE, 0xF5CA, 0x8DCF, + 0xF5CB, 0x8DDB, 0xF5CC, 0x8DC6, 0xF5CD, 0x8DEC, 0xF5CE, 0x8DF7, + 0xF5CF, 0x8DF8, 0xF5D0, 0x8DE3, 0xF5D1, 0x8DF9, 0xF5D2, 0x8DFB, + 0xF5D3, 0x8DE4, 0xF5D4, 0x8E09, 0xF5D5, 0x8DFD, 0xF5D6, 0x8E14, + 0xF5D7, 0x8E1D, 0xF5D8, 0x8E1F, 0xF5D9, 0x8E2C, 0xF5DA, 0x8E2E, + 0xF5DB, 0x8E23, 0xF5DC, 0x8E2F, 0xF5DD, 0x8E3A, 0xF5DE, 0x8E40, + 0xF5DF, 0x8E39, 0xF5E0, 0x8E35, 0xF5E1, 0x8E3D, 0xF5E2, 0x8E31, + 0xF5E3, 0x8E49, 0xF5E4, 0x8E41, 0xF5E5, 0x8E42, 0xF5E6, 0x8E51, + 0xF5E7, 0x8E52, 0xF5E8, 0x8E4A, 0xF5E9, 0x8E70, 0xF5EA, 0x8E76, + 0xF5EB, 0x8E7C, 0xF5EC, 0x8E6F, 0xF5ED, 0x8E74, 0xF5EE, 0x8E85, + 0xF5EF, 0x8E8F, 0xF5F0, 0x8E94, 0xF5F1, 0x8E90, 0xF5F2, 0x8E9C, + 0xF5F3, 0x8E9E, 0xF5F4, 0x8C78, 0xF5F5, 0x8C82, 0xF5F6, 0x8C8A, + 0xF5F7, 0x8C85, 0xF5F8, 0x8C98, 0xF5F9, 0x8C94, 0xF5FA, 0x659B, + 0xF5FB, 0x89D6, 0xF5FC, 0x89DE, 0xF5FD, 0x89DA, 0xF5FE, 0x89DC, + 0xF640, 0x9BDC, 0xF641, 0x9BDD, 0xF642, 0x9BDE, 0xF643, 0x9BDF, + 0xF644, 0x9BE0, 0xF645, 0x9BE1, 0xF646, 0x9BE2, 0xF647, 0x9BE3, + 0xF648, 0x9BE4, 0xF649, 0x9BE5, 0xF64A, 0x9BE6, 0xF64B, 0x9BE7, + 0xF64C, 0x9BE8, 0xF64D, 0x9BE9, 0xF64E, 0x9BEA, 0xF64F, 0x9BEB, + 0xF650, 0x9BEC, 0xF651, 0x9BED, 0xF652, 0x9BEE, 0xF653, 0x9BEF, + 0xF654, 0x9BF0, 0xF655, 0x9BF1, 0xF656, 0x9BF2, 0xF657, 0x9BF3, + 0xF658, 0x9BF4, 0xF659, 0x9BF5, 0xF65A, 0x9BF6, 0xF65B, 0x9BF7, + 0xF65C, 0x9BF8, 0xF65D, 0x9BF9, 0xF65E, 0x9BFA, 0xF65F, 0x9BFB, + 0xF660, 0x9BFC, 0xF661, 0x9BFD, 0xF662, 0x9BFE, 0xF663, 0x9BFF, + 0xF664, 0x9C00, 0xF665, 0x9C01, 0xF666, 0x9C02, 0xF667, 0x9C03, + 0xF668, 0x9C04, 0xF669, 0x9C05, 0xF66A, 0x9C06, 0xF66B, 0x9C07, + 0xF66C, 0x9C08, 0xF66D, 0x9C09, 0xF66E, 0x9C0A, 0xF66F, 0x9C0B, + 0xF670, 0x9C0C, 0xF671, 0x9C0D, 0xF672, 0x9C0E, 0xF673, 0x9C0F, + 0xF674, 0x9C10, 0xF675, 0x9C11, 0xF676, 0x9C12, 0xF677, 0x9C13, + 0xF678, 0x9C14, 0xF679, 0x9C15, 0xF67A, 0x9C16, 0xF67B, 0x9C17, + 0xF67C, 0x9C18, 0xF67D, 0x9C19, 0xF67E, 0x9C1A, 0xF680, 0x9C1B, + 0xF681, 0x9C1C, 0xF682, 0x9C1D, 0xF683, 0x9C1E, 0xF684, 0x9C1F, + 0xF685, 0x9C20, 0xF686, 0x9C21, 0xF687, 0x9C22, 0xF688, 0x9C23, + 0xF689, 0x9C24, 0xF68A, 0x9C25, 0xF68B, 0x9C26, 0xF68C, 0x9C27, + 0xF68D, 0x9C28, 0xF68E, 0x9C29, 0xF68F, 0x9C2A, 0xF690, 0x9C2B, + 0xF691, 0x9C2C, 0xF692, 0x9C2D, 0xF693, 0x9C2E, 0xF694, 0x9C2F, + 0xF695, 0x9C30, 0xF696, 0x9C31, 0xF697, 0x9C32, 0xF698, 0x9C33, + 0xF699, 0x9C34, 0xF69A, 0x9C35, 0xF69B, 0x9C36, 0xF69C, 0x9C37, + 0xF69D, 0x9C38, 0xF69E, 0x9C39, 0xF69F, 0x9C3A, 0xF6A0, 0x9C3B, + 0xF6A1, 0x89E5, 0xF6A2, 0x89EB, 0xF6A3, 0x89EF, 0xF6A4, 0x8A3E, + 0xF6A5, 0x8B26, 0xF6A6, 0x9753, 0xF6A7, 0x96E9, 0xF6A8, 0x96F3, + 0xF6A9, 0x96EF, 0xF6AA, 0x9706, 0xF6AB, 0x9701, 0xF6AC, 0x9708, + 0xF6AD, 0x970F, 0xF6AE, 0x970E, 0xF6AF, 0x972A, 0xF6B0, 0x972D, + 0xF6B1, 0x9730, 0xF6B2, 0x973E, 0xF6B3, 0x9F80, 0xF6B4, 0x9F83, + 0xF6B5, 0x9F85, 0xF6B6, 0x9F86, 0xF6B7, 0x9F87, 0xF6B8, 0x9F88, + 0xF6B9, 0x9F89, 0xF6BA, 0x9F8A, 0xF6BB, 0x9F8C, 0xF6BC, 0x9EFE, + 0xF6BD, 0x9F0B, 0xF6BE, 0x9F0D, 0xF6BF, 0x96B9, 0xF6C0, 0x96BC, + 0xF6C1, 0x96BD, 0xF6C2, 0x96CE, 0xF6C3, 0x96D2, 0xF6C4, 0x77BF, + 0xF6C5, 0x96E0, 0xF6C6, 0x928E, 0xF6C7, 0x92AE, 0xF6C8, 0x92C8, + 0xF6C9, 0x933E, 0xF6CA, 0x936A, 0xF6CB, 0x93CA, 0xF6CC, 0x938F, + 0xF6CD, 0x943E, 0xF6CE, 0x946B, 0xF6CF, 0x9C7F, 0xF6D0, 0x9C82, + 0xF6D1, 0x9C85, 0xF6D2, 0x9C86, 0xF6D3, 0x9C87, 0xF6D4, 0x9C88, + 0xF6D5, 0x7A23, 0xF6D6, 0x9C8B, 0xF6D7, 0x9C8E, 0xF6D8, 0x9C90, + 0xF6D9, 0x9C91, 0xF6DA, 0x9C92, 0xF6DB, 0x9C94, 0xF6DC, 0x9C95, + 0xF6DD, 0x9C9A, 0xF6DE, 0x9C9B, 0xF6DF, 0x9C9E, 0xF6E0, 0x9C9F, + 0xF6E1, 0x9CA0, 0xF6E2, 0x9CA1, 0xF6E3, 0x9CA2, 0xF6E4, 0x9CA3, + 0xF6E5, 0x9CA5, 0xF6E6, 0x9CA6, 0xF6E7, 0x9CA7, 0xF6E8, 0x9CA8, + 0xF6E9, 0x9CA9, 0xF6EA, 0x9CAB, 0xF6EB, 0x9CAD, 0xF6EC, 0x9CAE, + 0xF6ED, 0x9CB0, 0xF6EE, 0x9CB1, 0xF6EF, 0x9CB2, 0xF6F0, 0x9CB3, + 0xF6F1, 0x9CB4, 0xF6F2, 0x9CB5, 0xF6F3, 0x9CB6, 0xF6F4, 0x9CB7, + 0xF6F5, 0x9CBA, 0xF6F6, 0x9CBB, 0xF6F7, 0x9CBC, 0xF6F8, 0x9CBD, + 0xF6F9, 0x9CC4, 0xF6FA, 0x9CC5, 0xF6FB, 0x9CC6, 0xF6FC, 0x9CC7, + 0xF6FD, 0x9CCA, 0xF6FE, 0x9CCB, 0xF740, 0x9C3C, 0xF741, 0x9C3D, + 0xF742, 0x9C3E, 0xF743, 0x9C3F, 0xF744, 0x9C40, 0xF745, 0x9C41, + 0xF746, 0x9C42, 0xF747, 0x9C43, 0xF748, 0x9C44, 0xF749, 0x9C45, + 0xF74A, 0x9C46, 0xF74B, 0x9C47, 0xF74C, 0x9C48, 0xF74D, 0x9C49, + 0xF74E, 0x9C4A, 0xF74F, 0x9C4B, 0xF750, 0x9C4C, 0xF751, 0x9C4D, + 0xF752, 0x9C4E, 0xF753, 0x9C4F, 0xF754, 0x9C50, 0xF755, 0x9C51, + 0xF756, 0x9C52, 0xF757, 0x9C53, 0xF758, 0x9C54, 0xF759, 0x9C55, + 0xF75A, 0x9C56, 0xF75B, 0x9C57, 0xF75C, 0x9C58, 0xF75D, 0x9C59, + 0xF75E, 0x9C5A, 0xF75F, 0x9C5B, 0xF760, 0x9C5C, 0xF761, 0x9C5D, + 0xF762, 0x9C5E, 0xF763, 0x9C5F, 0xF764, 0x9C60, 0xF765, 0x9C61, + 0xF766, 0x9C62, 0xF767, 0x9C63, 0xF768, 0x9C64, 0xF769, 0x9C65, + 0xF76A, 0x9C66, 0xF76B, 0x9C67, 0xF76C, 0x9C68, 0xF76D, 0x9C69, + 0xF76E, 0x9C6A, 0xF76F, 0x9C6B, 0xF770, 0x9C6C, 0xF771, 0x9C6D, + 0xF772, 0x9C6E, 0xF773, 0x9C6F, 0xF774, 0x9C70, 0xF775, 0x9C71, + 0xF776, 0x9C72, 0xF777, 0x9C73, 0xF778, 0x9C74, 0xF779, 0x9C75, + 0xF77A, 0x9C76, 0xF77B, 0x9C77, 0xF77C, 0x9C78, 0xF77D, 0x9C79, + 0xF77E, 0x9C7A, 0xF780, 0x9C7B, 0xF781, 0x9C7D, 0xF782, 0x9C7E, + 0xF783, 0x9C80, 0xF784, 0x9C83, 0xF785, 0x9C84, 0xF786, 0x9C89, + 0xF787, 0x9C8A, 0xF788, 0x9C8C, 0xF789, 0x9C8F, 0xF78A, 0x9C93, + 0xF78B, 0x9C96, 0xF78C, 0x9C97, 0xF78D, 0x9C98, 0xF78E, 0x9C99, + 0xF78F, 0x9C9D, 0xF790, 0x9CAA, 0xF791, 0x9CAC, 0xF792, 0x9CAF, + 0xF793, 0x9CB9, 0xF794, 0x9CBE, 0xF795, 0x9CBF, 0xF796, 0x9CC0, + 0xF797, 0x9CC1, 0xF798, 0x9CC2, 0xF799, 0x9CC8, 0xF79A, 0x9CC9, + 0xF79B, 0x9CD1, 0xF79C, 0x9CD2, 0xF79D, 0x9CDA, 0xF79E, 0x9CDB, + 0xF79F, 0x9CE0, 0xF7A0, 0x9CE1, 0xF7A1, 0x9CCC, 0xF7A2, 0x9CCD, + 0xF7A3, 0x9CCE, 0xF7A4, 0x9CCF, 0xF7A5, 0x9CD0, 0xF7A6, 0x9CD3, + 0xF7A7, 0x9CD4, 0xF7A8, 0x9CD5, 0xF7A9, 0x9CD7, 0xF7AA, 0x9CD8, + 0xF7AB, 0x9CD9, 0xF7AC, 0x9CDC, 0xF7AD, 0x9CDD, 0xF7AE, 0x9CDF, + 0xF7AF, 0x9CE2, 0xF7B0, 0x977C, 0xF7B1, 0x9785, 0xF7B2, 0x9791, + 0xF7B3, 0x9792, 0xF7B4, 0x9794, 0xF7B5, 0x97AF, 0xF7B6, 0x97AB, + 0xF7B7, 0x97A3, 0xF7B8, 0x97B2, 0xF7B9, 0x97B4, 0xF7BA, 0x9AB1, + 0xF7BB, 0x9AB0, 0xF7BC, 0x9AB7, 0xF7BD, 0x9E58, 0xF7BE, 0x9AB6, + 0xF7BF, 0x9ABA, 0xF7C0, 0x9ABC, 0xF7C1, 0x9AC1, 0xF7C2, 0x9AC0, + 0xF7C3, 0x9AC5, 0xF7C4, 0x9AC2, 0xF7C5, 0x9ACB, 0xF7C6, 0x9ACC, + 0xF7C7, 0x9AD1, 0xF7C8, 0x9B45, 0xF7C9, 0x9B43, 0xF7CA, 0x9B47, + 0xF7CB, 0x9B49, 0xF7CC, 0x9B48, 0xF7CD, 0x9B4D, 0xF7CE, 0x9B51, + 0xF7CF, 0x98E8, 0xF7D0, 0x990D, 0xF7D1, 0x992E, 0xF7D2, 0x9955, + 0xF7D3, 0x9954, 0xF7D4, 0x9ADF, 0xF7D5, 0x9AE1, 0xF7D6, 0x9AE6, + 0xF7D7, 0x9AEF, 0xF7D8, 0x9AEB, 0xF7D9, 0x9AFB, 0xF7DA, 0x9AED, + 0xF7DB, 0x9AF9, 0xF7DC, 0x9B08, 0xF7DD, 0x9B0F, 0xF7DE, 0x9B13, + 0xF7DF, 0x9B1F, 0xF7E0, 0x9B23, 0xF7E1, 0x9EBD, 0xF7E2, 0x9EBE, + 0xF7E3, 0x7E3B, 0xF7E4, 0x9E82, 0xF7E5, 0x9E87, 0xF7E6, 0x9E88, + 0xF7E7, 0x9E8B, 0xF7E8, 0x9E92, 0xF7E9, 0x93D6, 0xF7EA, 0x9E9D, + 0xF7EB, 0x9E9F, 0xF7EC, 0x9EDB, 0xF7ED, 0x9EDC, 0xF7EE, 0x9EDD, + 0xF7EF, 0x9EE0, 0xF7F0, 0x9EDF, 0xF7F1, 0x9EE2, 0xF7F2, 0x9EE9, + 0xF7F3, 0x9EE7, 0xF7F4, 0x9EE5, 0xF7F5, 0x9EEA, 0xF7F6, 0x9EEF, + 0xF7F7, 0x9F22, 0xF7F8, 0x9F2C, 0xF7F9, 0x9F2F, 0xF7FA, 0x9F39, + 0xF7FB, 0x9F37, 0xF7FC, 0x9F3D, 0xF7FD, 0x9F3E, 0xF7FE, 0x9F44, + 0xF840, 0x9CE3, 0xF841, 0x9CE4, 0xF842, 0x9CE5, 0xF843, 0x9CE6, + 0xF844, 0x9CE7, 0xF845, 0x9CE8, 0xF846, 0x9CE9, 0xF847, 0x9CEA, + 0xF848, 0x9CEB, 0xF849, 0x9CEC, 0xF84A, 0x9CED, 0xF84B, 0x9CEE, + 0xF84C, 0x9CEF, 0xF84D, 0x9CF0, 0xF84E, 0x9CF1, 0xF84F, 0x9CF2, + 0xF850, 0x9CF3, 0xF851, 0x9CF4, 0xF852, 0x9CF5, 0xF853, 0x9CF6, + 0xF854, 0x9CF7, 0xF855, 0x9CF8, 0xF856, 0x9CF9, 0xF857, 0x9CFA, + 0xF858, 0x9CFB, 0xF859, 0x9CFC, 0xF85A, 0x9CFD, 0xF85B, 0x9CFE, + 0xF85C, 0x9CFF, 0xF85D, 0x9D00, 0xF85E, 0x9D01, 0xF85F, 0x9D02, + 0xF860, 0x9D03, 0xF861, 0x9D04, 0xF862, 0x9D05, 0xF863, 0x9D06, + 0xF864, 0x9D07, 0xF865, 0x9D08, 0xF866, 0x9D09, 0xF867, 0x9D0A, + 0xF868, 0x9D0B, 0xF869, 0x9D0C, 0xF86A, 0x9D0D, 0xF86B, 0x9D0E, + 0xF86C, 0x9D0F, 0xF86D, 0x9D10, 0xF86E, 0x9D11, 0xF86F, 0x9D12, + 0xF870, 0x9D13, 0xF871, 0x9D14, 0xF872, 0x9D15, 0xF873, 0x9D16, + 0xF874, 0x9D17, 0xF875, 0x9D18, 0xF876, 0x9D19, 0xF877, 0x9D1A, + 0xF878, 0x9D1B, 0xF879, 0x9D1C, 0xF87A, 0x9D1D, 0xF87B, 0x9D1E, + 0xF87C, 0x9D1F, 0xF87D, 0x9D20, 0xF87E, 0x9D21, 0xF880, 0x9D22, + 0xF881, 0x9D23, 0xF882, 0x9D24, 0xF883, 0x9D25, 0xF884, 0x9D26, + 0xF885, 0x9D27, 0xF886, 0x9D28, 0xF887, 0x9D29, 0xF888, 0x9D2A, + 0xF889, 0x9D2B, 0xF88A, 0x9D2C, 0xF88B, 0x9D2D, 0xF88C, 0x9D2E, + 0xF88D, 0x9D2F, 0xF88E, 0x9D30, 0xF88F, 0x9D31, 0xF890, 0x9D32, + 0xF891, 0x9D33, 0xF892, 0x9D34, 0xF893, 0x9D35, 0xF894, 0x9D36, + 0xF895, 0x9D37, 0xF896, 0x9D38, 0xF897, 0x9D39, 0xF898, 0x9D3A, + 0xF899, 0x9D3B, 0xF89A, 0x9D3C, 0xF89B, 0x9D3D, 0xF89C, 0x9D3E, + 0xF89D, 0x9D3F, 0xF89E, 0x9D40, 0xF89F, 0x9D41, 0xF8A0, 0x9D42, + 0xF940, 0x9D43, 0xF941, 0x9D44, 0xF942, 0x9D45, 0xF943, 0x9D46, + 0xF944, 0x9D47, 0xF945, 0x9D48, 0xF946, 0x9D49, 0xF947, 0x9D4A, + 0xF948, 0x9D4B, 0xF949, 0x9D4C, 0xF94A, 0x9D4D, 0xF94B, 0x9D4E, + 0xF94C, 0x9D4F, 0xF94D, 0x9D50, 0xF94E, 0x9D51, 0xF94F, 0x9D52, + 0xF950, 0x9D53, 0xF951, 0x9D54, 0xF952, 0x9D55, 0xF953, 0x9D56, + 0xF954, 0x9D57, 0xF955, 0x9D58, 0xF956, 0x9D59, 0xF957, 0x9D5A, + 0xF958, 0x9D5B, 0xF959, 0x9D5C, 0xF95A, 0x9D5D, 0xF95B, 0x9D5E, + 0xF95C, 0x9D5F, 0xF95D, 0x9D60, 0xF95E, 0x9D61, 0xF95F, 0x9D62, + 0xF960, 0x9D63, 0xF961, 0x9D64, 0xF962, 0x9D65, 0xF963, 0x9D66, + 0xF964, 0x9D67, 0xF965, 0x9D68, 0xF966, 0x9D69, 0xF967, 0x9D6A, + 0xF968, 0x9D6B, 0xF969, 0x9D6C, 0xF96A, 0x9D6D, 0xF96B, 0x9D6E, + 0xF96C, 0x9D6F, 0xF96D, 0x9D70, 0xF96E, 0x9D71, 0xF96F, 0x9D72, + 0xF970, 0x9D73, 0xF971, 0x9D74, 0xF972, 0x9D75, 0xF973, 0x9D76, + 0xF974, 0x9D77, 0xF975, 0x9D78, 0xF976, 0x9D79, 0xF977, 0x9D7A, + 0xF978, 0x9D7B, 0xF979, 0x9D7C, 0xF97A, 0x9D7D, 0xF97B, 0x9D7E, + 0xF97C, 0x9D7F, 0xF97D, 0x9D80, 0xF97E, 0x9D81, 0xF980, 0x9D82, + 0xF981, 0x9D83, 0xF982, 0x9D84, 0xF983, 0x9D85, 0xF984, 0x9D86, + 0xF985, 0x9D87, 0xF986, 0x9D88, 0xF987, 0x9D89, 0xF988, 0x9D8A, + 0xF989, 0x9D8B, 0xF98A, 0x9D8C, 0xF98B, 0x9D8D, 0xF98C, 0x9D8E, + 0xF98D, 0x9D8F, 0xF98E, 0x9D90, 0xF98F, 0x9D91, 0xF990, 0x9D92, + 0xF991, 0x9D93, 0xF992, 0x9D94, 0xF993, 0x9D95, 0xF994, 0x9D96, + 0xF995, 0x9D97, 0xF996, 0x9D98, 0xF997, 0x9D99, 0xF998, 0x9D9A, + 0xF999, 0x9D9B, 0xF99A, 0x9D9C, 0xF99B, 0x9D9D, 0xF99C, 0x9D9E, + 0xF99D, 0x9D9F, 0xF99E, 0x9DA0, 0xF99F, 0x9DA1, 0xF9A0, 0x9DA2, + 0xFA40, 0x9DA3, 0xFA41, 0x9DA4, 0xFA42, 0x9DA5, 0xFA43, 0x9DA6, + 0xFA44, 0x9DA7, 0xFA45, 0x9DA8, 0xFA46, 0x9DA9, 0xFA47, 0x9DAA, + 0xFA48, 0x9DAB, 0xFA49, 0x9DAC, 0xFA4A, 0x9DAD, 0xFA4B, 0x9DAE, + 0xFA4C, 0x9DAF, 0xFA4D, 0x9DB0, 0xFA4E, 0x9DB1, 0xFA4F, 0x9DB2, + 0xFA50, 0x9DB3, 0xFA51, 0x9DB4, 0xFA52, 0x9DB5, 0xFA53, 0x9DB6, + 0xFA54, 0x9DB7, 0xFA55, 0x9DB8, 0xFA56, 0x9DB9, 0xFA57, 0x9DBA, + 0xFA58, 0x9DBB, 0xFA59, 0x9DBC, 0xFA5A, 0x9DBD, 0xFA5B, 0x9DBE, + 0xFA5C, 0x9DBF, 0xFA5D, 0x9DC0, 0xFA5E, 0x9DC1, 0xFA5F, 0x9DC2, + 0xFA60, 0x9DC3, 0xFA61, 0x9DC4, 0xFA62, 0x9DC5, 0xFA63, 0x9DC6, + 0xFA64, 0x9DC7, 0xFA65, 0x9DC8, 0xFA66, 0x9DC9, 0xFA67, 0x9DCA, + 0xFA68, 0x9DCB, 0xFA69, 0x9DCC, 0xFA6A, 0x9DCD, 0xFA6B, 0x9DCE, + 0xFA6C, 0x9DCF, 0xFA6D, 0x9DD0, 0xFA6E, 0x9DD1, 0xFA6F, 0x9DD2, + 0xFA70, 0x9DD3, 0xFA71, 0x9DD4, 0xFA72, 0x9DD5, 0xFA73, 0x9DD6, + 0xFA74, 0x9DD7, 0xFA75, 0x9DD8, 0xFA76, 0x9DD9, 0xFA77, 0x9DDA, + 0xFA78, 0x9DDB, 0xFA79, 0x9DDC, 0xFA7A, 0x9DDD, 0xFA7B, 0x9DDE, + 0xFA7C, 0x9DDF, 0xFA7D, 0x9DE0, 0xFA7E, 0x9DE1, 0xFA80, 0x9DE2, + 0xFA81, 0x9DE3, 0xFA82, 0x9DE4, 0xFA83, 0x9DE5, 0xFA84, 0x9DE6, + 0xFA85, 0x9DE7, 0xFA86, 0x9DE8, 0xFA87, 0x9DE9, 0xFA88, 0x9DEA, + 0xFA89, 0x9DEB, 0xFA8A, 0x9DEC, 0xFA8B, 0x9DED, 0xFA8C, 0x9DEE, + 0xFA8D, 0x9DEF, 0xFA8E, 0x9DF0, 0xFA8F, 0x9DF1, 0xFA90, 0x9DF2, + 0xFA91, 0x9DF3, 0xFA92, 0x9DF4, 0xFA93, 0x9DF5, 0xFA94, 0x9DF6, + 0xFA95, 0x9DF7, 0xFA96, 0x9DF8, 0xFA97, 0x9DF9, 0xFA98, 0x9DFA, + 0xFA99, 0x9DFB, 0xFA9A, 0x9DFC, 0xFA9B, 0x9DFD, 0xFA9C, 0x9DFE, + 0xFA9D, 0x9DFF, 0xFA9E, 0x9E00, 0xFA9F, 0x9E01, 0xFAA0, 0x9E02, + 0xFB40, 0x9E03, 0xFB41, 0x9E04, 0xFB42, 0x9E05, 0xFB43, 0x9E06, + 0xFB44, 0x9E07, 0xFB45, 0x9E08, 0xFB46, 0x9E09, 0xFB47, 0x9E0A, + 0xFB48, 0x9E0B, 0xFB49, 0x9E0C, 0xFB4A, 0x9E0D, 0xFB4B, 0x9E0E, + 0xFB4C, 0x9E0F, 0xFB4D, 0x9E10, 0xFB4E, 0x9E11, 0xFB4F, 0x9E12, + 0xFB50, 0x9E13, 0xFB51, 0x9E14, 0xFB52, 0x9E15, 0xFB53, 0x9E16, + 0xFB54, 0x9E17, 0xFB55, 0x9E18, 0xFB56, 0x9E19, 0xFB57, 0x9E1A, + 0xFB58, 0x9E1B, 0xFB59, 0x9E1C, 0xFB5A, 0x9E1D, 0xFB5B, 0x9E1E, + 0xFB5C, 0x9E24, 0xFB5D, 0x9E27, 0xFB5E, 0x9E2E, 0xFB5F, 0x9E30, + 0xFB60, 0x9E34, 0xFB61, 0x9E3B, 0xFB62, 0x9E3C, 0xFB63, 0x9E40, + 0xFB64, 0x9E4D, 0xFB65, 0x9E50, 0xFB66, 0x9E52, 0xFB67, 0x9E53, + 0xFB68, 0x9E54, 0xFB69, 0x9E56, 0xFB6A, 0x9E59, 0xFB6B, 0x9E5D, + 0xFB6C, 0x9E5F, 0xFB6D, 0x9E60, 0xFB6E, 0x9E61, 0xFB6F, 0x9E62, + 0xFB70, 0x9E65, 0xFB71, 0x9E6E, 0xFB72, 0x9E6F, 0xFB73, 0x9E72, + 0xFB74, 0x9E74, 0xFB75, 0x9E75, 0xFB76, 0x9E76, 0xFB77, 0x9E77, + 0xFB78, 0x9E78, 0xFB79, 0x9E79, 0xFB7A, 0x9E7A, 0xFB7B, 0x9E7B, + 0xFB7C, 0x9E7C, 0xFB7D, 0x9E7D, 0xFB7E, 0x9E80, 0xFB80, 0x9E81, + 0xFB81, 0x9E83, 0xFB82, 0x9E84, 0xFB83, 0x9E85, 0xFB84, 0x9E86, + 0xFB85, 0x9E89, 0xFB86, 0x9E8A, 0xFB87, 0x9E8C, 0xFB88, 0x9E8D, + 0xFB89, 0x9E8E, 0xFB8A, 0x9E8F, 0xFB8B, 0x9E90, 0xFB8C, 0x9E91, + 0xFB8D, 0x9E94, 0xFB8E, 0x9E95, 0xFB8F, 0x9E96, 0xFB90, 0x9E97, + 0xFB91, 0x9E98, 0xFB92, 0x9E99, 0xFB93, 0x9E9A, 0xFB94, 0x9E9B, + 0xFB95, 0x9E9C, 0xFB96, 0x9E9E, 0xFB97, 0x9EA0, 0xFB98, 0x9EA1, + 0xFB99, 0x9EA2, 0xFB9A, 0x9EA3, 0xFB9B, 0x9EA4, 0xFB9C, 0x9EA5, + 0xFB9D, 0x9EA7, 0xFB9E, 0x9EA8, 0xFB9F, 0x9EA9, 0xFBA0, 0x9EAA, + 0xFC40, 0x9EAB, 0xFC41, 0x9EAC, 0xFC42, 0x9EAD, 0xFC43, 0x9EAE, + 0xFC44, 0x9EAF, 0xFC45, 0x9EB0, 0xFC46, 0x9EB1, 0xFC47, 0x9EB2, + 0xFC48, 0x9EB3, 0xFC49, 0x9EB5, 0xFC4A, 0x9EB6, 0xFC4B, 0x9EB7, + 0xFC4C, 0x9EB9, 0xFC4D, 0x9EBA, 0xFC4E, 0x9EBC, 0xFC4F, 0x9EBF, + 0xFC50, 0x9EC0, 0xFC51, 0x9EC1, 0xFC52, 0x9EC2, 0xFC53, 0x9EC3, + 0xFC54, 0x9EC5, 0xFC55, 0x9EC6, 0xFC56, 0x9EC7, 0xFC57, 0x9EC8, + 0xFC58, 0x9ECA, 0xFC59, 0x9ECB, 0xFC5A, 0x9ECC, 0xFC5B, 0x9ED0, + 0xFC5C, 0x9ED2, 0xFC5D, 0x9ED3, 0xFC5E, 0x9ED5, 0xFC5F, 0x9ED6, + 0xFC60, 0x9ED7, 0xFC61, 0x9ED9, 0xFC62, 0x9EDA, 0xFC63, 0x9EDE, + 0xFC64, 0x9EE1, 0xFC65, 0x9EE3, 0xFC66, 0x9EE4, 0xFC67, 0x9EE6, + 0xFC68, 0x9EE8, 0xFC69, 0x9EEB, 0xFC6A, 0x9EEC, 0xFC6B, 0x9EED, + 0xFC6C, 0x9EEE, 0xFC6D, 0x9EF0, 0xFC6E, 0x9EF1, 0xFC6F, 0x9EF2, + 0xFC70, 0x9EF3, 0xFC71, 0x9EF4, 0xFC72, 0x9EF5, 0xFC73, 0x9EF6, + 0xFC74, 0x9EF7, 0xFC75, 0x9EF8, 0xFC76, 0x9EFA, 0xFC77, 0x9EFD, + 0xFC78, 0x9EFF, 0xFC79, 0x9F00, 0xFC7A, 0x9F01, 0xFC7B, 0x9F02, + 0xFC7C, 0x9F03, 0xFC7D, 0x9F04, 0xFC7E, 0x9F05, 0xFC80, 0x9F06, + 0xFC81, 0x9F07, 0xFC82, 0x9F08, 0xFC83, 0x9F09, 0xFC84, 0x9F0A, + 0xFC85, 0x9F0C, 0xFC86, 0x9F0F, 0xFC87, 0x9F11, 0xFC88, 0x9F12, + 0xFC89, 0x9F14, 0xFC8A, 0x9F15, 0xFC8B, 0x9F16, 0xFC8C, 0x9F18, + 0xFC8D, 0x9F1A, 0xFC8E, 0x9F1B, 0xFC8F, 0x9F1C, 0xFC90, 0x9F1D, + 0xFC91, 0x9F1E, 0xFC92, 0x9F1F, 0xFC93, 0x9F21, 0xFC94, 0x9F23, + 0xFC95, 0x9F24, 0xFC96, 0x9F25, 0xFC97, 0x9F26, 0xFC98, 0x9F27, + 0xFC99, 0x9F28, 0xFC9A, 0x9F29, 0xFC9B, 0x9F2A, 0xFC9C, 0x9F2B, + 0xFC9D, 0x9F2D, 0xFC9E, 0x9F2E, 0xFC9F, 0x9F30, 0xFCA0, 0x9F31, + 0xFD40, 0x9F32, 0xFD41, 0x9F33, 0xFD42, 0x9F34, 0xFD43, 0x9F35, + 0xFD44, 0x9F36, 0xFD45, 0x9F38, 0xFD46, 0x9F3A, 0xFD47, 0x9F3C, + 0xFD48, 0x9F3F, 0xFD49, 0x9F40, 0xFD4A, 0x9F41, 0xFD4B, 0x9F42, + 0xFD4C, 0x9F43, 0xFD4D, 0x9F45, 0xFD4E, 0x9F46, 0xFD4F, 0x9F47, + 0xFD50, 0x9F48, 0xFD51, 0x9F49, 0xFD52, 0x9F4A, 0xFD53, 0x9F4B, + 0xFD54, 0x9F4C, 0xFD55, 0x9F4D, 0xFD56, 0x9F4E, 0xFD57, 0x9F4F, + 0xFD58, 0x9F52, 0xFD59, 0x9F53, 0xFD5A, 0x9F54, 0xFD5B, 0x9F55, + 0xFD5C, 0x9F56, 0xFD5D, 0x9F57, 0xFD5E, 0x9F58, 0xFD5F, 0x9F59, + 0xFD60, 0x9F5A, 0xFD61, 0x9F5B, 0xFD62, 0x9F5C, 0xFD63, 0x9F5D, + 0xFD64, 0x9F5E, 0xFD65, 0x9F5F, 0xFD66, 0x9F60, 0xFD67, 0x9F61, + 0xFD68, 0x9F62, 0xFD69, 0x9F63, 0xFD6A, 0x9F64, 0xFD6B, 0x9F65, + 0xFD6C, 0x9F66, 0xFD6D, 0x9F67, 0xFD6E, 0x9F68, 0xFD6F, 0x9F69, + 0xFD70, 0x9F6A, 0xFD71, 0x9F6B, 0xFD72, 0x9F6C, 0xFD73, 0x9F6D, + 0xFD74, 0x9F6E, 0xFD75, 0x9F6F, 0xFD76, 0x9F70, 0xFD77, 0x9F71, + 0xFD78, 0x9F72, 0xFD79, 0x9F73, 0xFD7A, 0x9F74, 0xFD7B, 0x9F75, + 0xFD7C, 0x9F76, 0xFD7D, 0x9F77, 0xFD7E, 0x9F78, 0xFD80, 0x9F79, + 0xFD81, 0x9F7A, 0xFD82, 0x9F7B, 0xFD83, 0x9F7C, 0xFD84, 0x9F7D, + 0xFD85, 0x9F7E, 0xFD86, 0x9F81, 0xFD87, 0x9F82, 0xFD88, 0x9F8D, + 0xFD89, 0x9F8E, 0xFD8A, 0x9F8F, 0xFD8B, 0x9F90, 0xFD8C, 0x9F91, + 0xFD8D, 0x9F92, 0xFD8E, 0x9F93, 0xFD8F, 0x9F94, 0xFD90, 0x9F95, + 0xFD91, 0x9F96, 0xFD92, 0x9F97, 0xFD93, 0x9F98, 0xFD94, 0x9F9C, + 0xFD95, 0x9F9D, 0xFD96, 0x9F9E, 0xFD97, 0x9FA1, 0xFD98, 0x9FA2, + 0xFD99, 0x9FA3, 0xFD9A, 0x9FA4, 0xFD9B, 0x9FA5, 0xFD9C, 0xF92C, + 0xFD9D, 0xF979, 0xFD9E, 0xF995, 0xFD9F, 0xF9E7, 0xFDA0, 0xF9F1, + 0xFE40, 0xFA0C, 0xFE41, 0xFA0D, 0xFE42, 0xFA0E, 0xFE43, 0xFA0F, + 0xFE44, 0xFA11, 0xFE45, 0xFA13, 0xFE46, 0xFA14, 0xFE47, 0xFA18, + 0xFE48, 0xFA1F, 0xFE49, 0xFA20, 0xFE4A, 0xFA21, 0xFE4B, 0xFA23, + 0xFE4C, 0xFA24, 0xFE4D, 0xFA27, 0xFE4E, 0xFA28, 0xFE4F, 0xFA29, + 0, 0 +}; + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR src, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (src < 0x80) { /* ASCII */ + c = src; + } else { + if (dir) { /* OEMCP to unicode */ + p = oem2uni; + hi = sizeof(oem2uni) / 4 - 1; + } else { /* Unicode to OEMCP */ + p = uni2oem; + hi = sizeof(uni2oem) / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (src == p[i * 2]) break; + if (src > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; + } + + return c; +} +#else +#error This file is not needed in current configuration. + +#endif diff --git a/2.5/bertos/fs/fatfs/option/cc949.c b/2.5/bertos/fs/fatfs/option/cc949.c new file mode 100644 index 00000000..89679854 --- /dev/null +++ b/2.5/bertos/fs/fatfs/option/cc949.c @@ -0,0 +1,8588 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ +/* */ +/* CP949 (Korean) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + + +#if _USE_LFN && _CODE_PAGE == 949 + + +static +const WCHAR uni2oem[] = { +/* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ + 0x00A1, 0xA2AE, 0x00A4, 0xA2B4, 0x00A7, 0xA1D7, 0x00A8, 0xA1A7, + 0x00AA, 0xA8A3, 0x00AD, 0xA1A9, 0x00AE, 0xA2E7, 0x00B0, 0xA1C6, + 0x00B1, 0xA1BE, 0x00B2, 0xA9F7, 0x00B3, 0xA9F8, 0x00B4, 0xA2A5, + 0x00B6, 0xA2D2, 0x00B7, 0xA1A4, 0x00B8, 0xA2AC, 0x00B9, 0xA9F6, + 0x00BA, 0xA8AC, 0x00BC, 0xA8F9, 0x00BD, 0xA8F6, 0x00BE, 0xA8FA, + 0x00BF, 0xA2AF, 0x00C6, 0xA8A1, 0x00D0, 0xA8A2, 0x00D7, 0xA1BF, + 0x00D8, 0xA8AA, 0x00DE, 0xA8AD, 0x00DF, 0xA9AC, 0x00E6, 0xA9A1, + 0x00F0, 0xA9A3, 0x00F7, 0xA1C0, 0x00F8, 0xA9AA, 0x00FE, 0xA9AD, + 0x0111, 0xA9A2, 0x0126, 0xA8A4, 0x0127, 0xA9A4, 0x0131, 0xA9A5, + 0x0132, 0xA8A6, 0x0133, 0xA9A6, 0x0138, 0xA9A7, 0x013F, 0xA8A8, + 0x0140, 0xA9A8, 0x0141, 0xA8A9, 0x0142, 0xA9A9, 0x0149, 0xA9B0, + 0x014A, 0xA8AF, 0x014B, 0xA9AF, 0x0152, 0xA8AB, 0x0153, 0xA9AB, + 0x0166, 0xA8AE, 0x0167, 0xA9AE, 0x02C7, 0xA2A7, 0x02D0, 0xA2B0, + 0x02D8, 0xA2A8, 0x02D9, 0xA2AB, 0x02DA, 0xA2AA, 0x02DB, 0xA2AD, + 0x02DD, 0xA2A9, 0x0391, 0xA5C1, 0x0392, 0xA5C2, 0x0393, 0xA5C3, + 0x0394, 0xA5C4, 0x0395, 0xA5C5, 0x0396, 0xA5C6, 0x0397, 0xA5C7, + 0x0398, 0xA5C8, 0x0399, 0xA5C9, 0x039A, 0xA5CA, 0x039B, 0xA5CB, + 0x039C, 0xA5CC, 0x039D, 0xA5CD, 0x039E, 0xA5CE, 0x039F, 0xA5CF, + 0x03A0, 0xA5D0, 0x03A1, 0xA5D1, 0x03A3, 0xA5D2, 0x03A4, 0xA5D3, + 0x03A5, 0xA5D4, 0x03A6, 0xA5D5, 0x03A7, 0xA5D6, 0x03A8, 0xA5D7, + 0x03A9, 0xA5D8, 0x03B1, 0xA5E1, 0x03B2, 0xA5E2, 0x03B3, 0xA5E3, + 0x03B4, 0xA5E4, 0x03B5, 0xA5E5, 0x03B6, 0xA5E6, 0x03B7, 0xA5E7, + 0x03B8, 0xA5E8, 0x03B9, 0xA5E9, 0x03BA, 0xA5EA, 0x03BB, 0xA5EB, + 0x03BC, 0xA5EC, 0x03BD, 0xA5ED, 0x03BE, 0xA5EE, 0x03BF, 0xA5EF, + 0x03C0, 0xA5F0, 0x03C1, 0xA5F1, 0x03C3, 0xA5F2, 0x03C4, 0xA5F3, + 0x03C5, 0xA5F4, 0x03C6, 0xA5F5, 0x03C7, 0xA5F6, 0x03C8, 0xA5F7, + 0x03C9, 0xA5F8, 0x0401, 0xACA7, 0x0410, 0xACA1, 0x0411, 0xACA2, + 0x0412, 0xACA3, 0x0413, 0xACA4, 0x0414, 0xACA5, 0x0415, 0xACA6, + 0x0416, 0xACA8, 0x0417, 0xACA9, 0x0418, 0xACAA, 0x0419, 0xACAB, + 0x041A, 0xACAC, 0x041B, 0xACAD, 0x041C, 0xACAE, 0x041D, 0xACAF, + 0x041E, 0xACB0, 0x041F, 0xACB1, 0x0420, 0xACB2, 0x0421, 0xACB3, + 0x0422, 0xACB4, 0x0423, 0xACB5, 0x0424, 0xACB6, 0x0425, 0xACB7, + 0x0426, 0xACB8, 0x0427, 0xACB9, 0x0428, 0xACBA, 0x0429, 0xACBB, + 0x042A, 0xACBC, 0x042B, 0xACBD, 0x042C, 0xACBE, 0x042D, 0xACBF, + 0x042E, 0xACC0, 0x042F, 0xACC1, 0x0430, 0xACD1, 0x0431, 0xACD2, + 0x0432, 0xACD3, 0x0433, 0xACD4, 0x0434, 0xACD5, 0x0435, 0xACD6, + 0x0436, 0xACD8, 0x0437, 0xACD9, 0x0438, 0xACDA, 0x0439, 0xACDB, + 0x043A, 0xACDC, 0x043B, 0xACDD, 0x043C, 0xACDE, 0x043D, 0xACDF, + 0x043E, 0xACE0, 0x043F, 0xACE1, 0x0440, 0xACE2, 0x0441, 0xACE3, + 0x0442, 0xACE4, 0x0443, 0xACE5, 0x0444, 0xACE6, 0x0445, 0xACE7, + 0x0446, 0xACE8, 0x0447, 0xACE9, 0x0448, 0xACEA, 0x0449, 0xACEB, + 0x044A, 0xACEC, 0x044B, 0xACED, 0x044C, 0xACEE, 0x044D, 0xACEF, + 0x044E, 0xACF0, 0x044F, 0xACF1, 0x0451, 0xACD7, 0x2015, 0xA1AA, + 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, + 0x2020, 0xA2D3, 0x2021, 0xA2D4, 0x2025, 0xA1A5, 0x2026, 0xA1A6, + 0x2030, 0xA2B6, 0x2032, 0xA1C7, 0x2033, 0xA1C8, 0x203B, 0xA1D8, + 0x2074, 0xA9F9, 0x207F, 0xA9FA, 0x2081, 0xA9FB, 0x2082, 0xA9FC, + 0x2083, 0xA9FD, 0x2084, 0xA9FE, 0x20AC, 0xA2E6, 0x2103, 0xA1C9, + 0x2109, 0xA2B5, 0x2113, 0xA7A4, 0x2116, 0xA2E0, 0x2121, 0xA2E5, + 0x2122, 0xA2E2, 0x2126, 0xA7D9, 0x212B, 0xA1CA, 0x2153, 0xA8F7, + 0x2154, 0xA8F8, 0x215B, 0xA8FB, 0x215C, 0xA8FC, 0x215D, 0xA8FD, + 0x215E, 0xA8FE, 0x2160, 0xA5B0, 0x2161, 0xA5B1, 0x2162, 0xA5B2, + 0x2163, 0xA5B3, 0x2164, 0xA5B4, 0x2165, 0xA5B5, 0x2166, 0xA5B6, + 0x2167, 0xA5B7, 0x2168, 0xA5B8, 0x2169, 0xA5B9, 0x2170, 0xA5A1, + 0x2171, 0xA5A2, 0x2172, 0xA5A3, 0x2173, 0xA5A4, 0x2174, 0xA5A5, + 0x2175, 0xA5A6, 0x2176, 0xA5A7, 0x2177, 0xA5A8, 0x2178, 0xA5A9, + 0x2179, 0xA5AA, 0x2190, 0xA1E7, 0x2191, 0xA1E8, 0x2192, 0xA1E6, + 0x2193, 0xA1E9, 0x2194, 0xA1EA, 0x2195, 0xA2D5, 0x2196, 0xA2D8, + 0x2197, 0xA2D6, 0x2198, 0xA2D9, 0x2199, 0xA2D7, 0x21D2, 0xA2A1, + 0x21D4, 0xA2A2, 0x2200, 0xA2A3, 0x2202, 0xA1D3, 0x2203, 0xA2A4, + 0x2207, 0xA1D4, 0x2208, 0xA1F4, 0x220B, 0xA1F5, 0x220F, 0xA2B3, + 0x2211, 0xA2B2, 0x221A, 0xA1EE, 0x221D, 0xA1F0, 0x221E, 0xA1C4, + 0x2220, 0xA1D0, 0x2225, 0xA1AB, 0x2227, 0xA1FC, 0x2228, 0xA1FD, + 0x2229, 0xA1FB, 0x222A, 0xA1FA, 0x222B, 0xA1F2, 0x222C, 0xA1F3, + 0x222E, 0xA2B1, 0x2234, 0xA1C5, 0x2235, 0xA1F1, 0x223C, 0xA1AD, + 0x223D, 0xA1EF, 0x2252, 0xA1D6, 0x2260, 0xA1C1, 0x2261, 0xA1D5, + 0x2264, 0xA1C2, 0x2265, 0xA1C3, 0x226A, 0xA1EC, 0x226B, 0xA1ED, + 0x2282, 0xA1F8, 0x2283, 0xA1F9, 0x2286, 0xA1F6, 0x2287, 0xA1F7, + 0x2299, 0xA2C1, 0x22A5, 0xA1D1, 0x2312, 0xA1D2, 0x2460, 0xA8E7, + 0x2461, 0xA8E8, 0x2462, 0xA8E9, 0x2463, 0xA8EA, 0x2464, 0xA8EB, + 0x2465, 0xA8EC, 0x2466, 0xA8ED, 0x2467, 0xA8EE, 0x2468, 0xA8EF, + 0x2469, 0xA8F0, 0x246A, 0xA8F1, 0x246B, 0xA8F2, 0x246C, 0xA8F3, + 0x246D, 0xA8F4, 0x246E, 0xA8F5, 0x2474, 0xA9E7, 0x2475, 0xA9E8, + 0x2476, 0xA9E9, 0x2477, 0xA9EA, 0x2478, 0xA9EB, 0x2479, 0xA9EC, + 0x247A, 0xA9ED, 0x247B, 0xA9EE, 0x247C, 0xA9EF, 0x247D, 0xA9F0, + 0x247E, 0xA9F1, 0x247F, 0xA9F2, 0x2480, 0xA9F3, 0x2481, 0xA9F4, + 0x2482, 0xA9F5, 0x249C, 0xA9CD, 0x249D, 0xA9CE, 0x249E, 0xA9CF, + 0x249F, 0xA9D0, 0x24A0, 0xA9D1, 0x24A1, 0xA9D2, 0x24A2, 0xA9D3, + 0x24A3, 0xA9D4, 0x24A4, 0xA9D5, 0x24A5, 0xA9D6, 0x24A6, 0xA9D7, + 0x24A7, 0xA9D8, 0x24A8, 0xA9D9, 0x24A9, 0xA9DA, 0x24AA, 0xA9DB, + 0x24AB, 0xA9DC, 0x24AC, 0xA9DD, 0x24AD, 0xA9DE, 0x24AE, 0xA9DF, + 0x24AF, 0xA9E0, 0x24B0, 0xA9E1, 0x24B1, 0xA9E2, 0x24B2, 0xA9E3, + 0x24B3, 0xA9E4, 0x24B4, 0xA9E5, 0x24B5, 0xA9E6, 0x24D0, 0xA8CD, + 0x24D1, 0xA8CE, 0x24D2, 0xA8CF, 0x24D3, 0xA8D0, 0x24D4, 0xA8D1, + 0x24D5, 0xA8D2, 0x24D6, 0xA8D3, 0x24D7, 0xA8D4, 0x24D8, 0xA8D5, + 0x24D9, 0xA8D6, 0x24DA, 0xA8D7, 0x24DB, 0xA8D8, 0x24DC, 0xA8D9, + 0x24DD, 0xA8DA, 0x24DE, 0xA8DB, 0x24DF, 0xA8DC, 0x24E0, 0xA8DD, + 0x24E1, 0xA8DE, 0x24E2, 0xA8DF, 0x24E3, 0xA8E0, 0x24E4, 0xA8E1, + 0x24E5, 0xA8E2, 0x24E6, 0xA8E3, 0x24E7, 0xA8E4, 0x24E8, 0xA8E5, + 0x24E9, 0xA8E6, 0x2500, 0xA6A1, 0x2501, 0xA6AC, 0x2502, 0xA6A2, + 0x2503, 0xA6AD, 0x250C, 0xA6A3, 0x250D, 0xA6C8, 0x250E, 0xA6C7, + 0x250F, 0xA6AE, 0x2510, 0xA6A4, 0x2511, 0xA6C2, 0x2512, 0xA6C1, + 0x2513, 0xA6AF, 0x2514, 0xA6A6, 0x2515, 0xA6C6, 0x2516, 0xA6C5, + 0x2517, 0xA6B1, 0x2518, 0xA6A5, 0x2519, 0xA6C4, 0x251A, 0xA6C3, + 0x251B, 0xA6B0, 0x251C, 0xA6A7, 0x251D, 0xA6BC, 0x251E, 0xA6C9, + 0x251F, 0xA6CA, 0x2520, 0xA6B7, 0x2521, 0xA6CB, 0x2522, 0xA6CC, + 0x2523, 0xA6B2, 0x2524, 0xA6A9, 0x2525, 0xA6BE, 0x2526, 0xA6CD, + 0x2527, 0xA6CE, 0x2528, 0xA6B9, 0x2529, 0xA6CF, 0x252A, 0xA6D0, + 0x252B, 0xA6B4, 0x252C, 0xA6A8, 0x252D, 0xA6D1, 0x252E, 0xA6D2, + 0x252F, 0xA6B8, 0x2530, 0xA6BD, 0x2531, 0xA6D3, 0x2532, 0xA6D4, + 0x2533, 0xA6B3, 0x2534, 0xA6AA, 0x2535, 0xA6D5, 0x2536, 0xA6D6, + 0x2537, 0xA6BA, 0x2538, 0xA6BF, 0x2539, 0xA6D7, 0x253A, 0xA6D8, + 0x253B, 0xA6B5, 0x253C, 0xA6AB, 0x253D, 0xA6D9, 0x253E, 0xA6DA, + 0x253F, 0xA6BB, 0x2540, 0xA6DB, 0x2541, 0xA6DC, 0x2542, 0xA6C0, + 0x2543, 0xA6DD, 0x2544, 0xA6DE, 0x2545, 0xA6DF, 0x2546, 0xA6E0, + 0x2547, 0xA6E1, 0x2548, 0xA6E2, 0x2549, 0xA6E3, 0x254A, 0xA6E4, + 0x254B, 0xA6B6, 0x2592, 0xA2C6, 0x25A0, 0xA1E1, 0x25A1, 0xA1E0, + 0x25A3, 0xA2C3, 0x25A4, 0xA2C7, 0x25A5, 0xA2C8, 0x25A6, 0xA2CB, + 0x25A7, 0xA2CA, 0x25A8, 0xA2C9, 0x25A9, 0xA2CC, 0x25B2, 0xA1E3, + 0x25B3, 0xA1E2, 0x25B6, 0xA2BA, 0x25B7, 0xA2B9, 0x25BC, 0xA1E5, + 0x25BD, 0xA1E4, 0x25C0, 0xA2B8, 0x25C1, 0xA2B7, 0x25C6, 0xA1DF, + 0x25C7, 0xA1DE, 0x25C8, 0xA2C2, 0x25CB, 0xA1DB, 0x25CE, 0xA1DD, + 0x25CF, 0xA1DC, 0x25D0, 0xA2C4, 0x25D1, 0xA2C5, 0x2605, 0xA1DA, + 0x2606, 0xA1D9, 0x260E, 0xA2CF, 0x260F, 0xA2CE, 0x261C, 0xA2D0, + 0x261E, 0xA2D1, 0x2640, 0xA1CF, 0x2642, 0xA1CE, 0x2660, 0xA2BC, + 0x2661, 0xA2BD, 0x2663, 0xA2C0, 0x2664, 0xA2BB, 0x2665, 0xA2BE, + 0x2667, 0xA2BF, 0x2668, 0xA2CD, 0x2669, 0xA2DB, 0x266A, 0xA2DC, + 0x266C, 0xA2DD, 0x266D, 0xA2DA, 0x3000, 0xA1A1, 0x3001, 0xA1A2, + 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3008, 0xA1B4, 0x3009, 0xA1B5, + 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, + 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BC, 0x3011, 0xA1BD, + 0x3013, 0xA1EB, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3041, 0xAAA1, + 0x3042, 0xAAA2, 0x3043, 0xAAA3, 0x3044, 0xAAA4, 0x3045, 0xAAA5, + 0x3046, 0xAAA6, 0x3047, 0xAAA7, 0x3048, 0xAAA8, 0x3049, 0xAAA9, + 0x304A, 0xAAAA, 0x304B, 0xAAAB, 0x304C, 0xAAAC, 0x304D, 0xAAAD, + 0x304E, 0xAAAE, 0x304F, 0xAAAF, 0x3050, 0xAAB0, 0x3051, 0xAAB1, + 0x3052, 0xAAB2, 0x3053, 0xAAB3, 0x3054, 0xAAB4, 0x3055, 0xAAB5, + 0x3056, 0xAAB6, 0x3057, 0xAAB7, 0x3058, 0xAAB8, 0x3059, 0xAAB9, + 0x305A, 0xAABA, 0x305B, 0xAABB, 0x305C, 0xAABC, 0x305D, 0xAABD, + 0x305E, 0xAABE, 0x305F, 0xAABF, 0x3060, 0xAAC0, 0x3061, 0xAAC1, + 0x3062, 0xAAC2, 0x3063, 0xAAC3, 0x3064, 0xAAC4, 0x3065, 0xAAC5, + 0x3066, 0xAAC6, 0x3067, 0xAAC7, 0x3068, 0xAAC8, 0x3069, 0xAAC9, + 0x306A, 0xAACA, 0x306B, 0xAACB, 0x306C, 0xAACC, 0x306D, 0xAACD, + 0x306E, 0xAACE, 0x306F, 0xAACF, 0x3070, 0xAAD0, 0x3071, 0xAAD1, + 0x3072, 0xAAD2, 0x3073, 0xAAD3, 0x3074, 0xAAD4, 0x3075, 0xAAD5, + 0x3076, 0xAAD6, 0x3077, 0xAAD7, 0x3078, 0xAAD8, 0x3079, 0xAAD9, + 0x307A, 0xAADA, 0x307B, 0xAADB, 0x307C, 0xAADC, 0x307D, 0xAADD, + 0x307E, 0xAADE, 0x307F, 0xAADF, 0x3080, 0xAAE0, 0x3081, 0xAAE1, + 0x3082, 0xAAE2, 0x3083, 0xAAE3, 0x3084, 0xAAE4, 0x3085, 0xAAE5, + 0x3086, 0xAAE6, 0x3087, 0xAAE7, 0x3088, 0xAAE8, 0x3089, 0xAAE9, + 0x308A, 0xAAEA, 0x308B, 0xAAEB, 0x308C, 0xAAEC, 0x308D, 0xAAED, + 0x308E, 0xAAEE, 0x308F, 0xAAEF, 0x3090, 0xAAF0, 0x3091, 0xAAF1, + 0x3092, 0xAAF2, 0x3093, 0xAAF3, 0x30A1, 0xABA1, 0x30A2, 0xABA2, + 0x30A3, 0xABA3, 0x30A4, 0xABA4, 0x30A5, 0xABA5, 0x30A6, 0xABA6, + 0x30A7, 0xABA7, 0x30A8, 0xABA8, 0x30A9, 0xABA9, 0x30AA, 0xABAA, + 0x30AB, 0xABAB, 0x30AC, 0xABAC, 0x30AD, 0xABAD, 0x30AE, 0xABAE, + 0x30AF, 0xABAF, 0x30B0, 0xABB0, 0x30B1, 0xABB1, 0x30B2, 0xABB2, + 0x30B3, 0xABB3, 0x30B4, 0xABB4, 0x30B5, 0xABB5, 0x30B6, 0xABB6, + 0x30B7, 0xABB7, 0x30B8, 0xABB8, 0x30B9, 0xABB9, 0x30BA, 0xABBA, + 0x30BB, 0xABBB, 0x30BC, 0xABBC, 0x30BD, 0xABBD, 0x30BE, 0xABBE, + 0x30BF, 0xABBF, 0x30C0, 0xABC0, 0x30C1, 0xABC1, 0x30C2, 0xABC2, + 0x30C3, 0xABC3, 0x30C4, 0xABC4, 0x30C5, 0xABC5, 0x30C6, 0xABC6, + 0x30C7, 0xABC7, 0x30C8, 0xABC8, 0x30C9, 0xABC9, 0x30CA, 0xABCA, + 0x30CB, 0xABCB, 0x30CC, 0xABCC, 0x30CD, 0xABCD, 0x30CE, 0xABCE, + 0x30CF, 0xABCF, 0x30D0, 0xABD0, 0x30D1, 0xABD1, 0x30D2, 0xABD2, + 0x30D3, 0xABD3, 0x30D4, 0xABD4, 0x30D5, 0xABD5, 0x30D6, 0xABD6, + 0x30D7, 0xABD7, 0x30D8, 0xABD8, 0x30D9, 0xABD9, 0x30DA, 0xABDA, + 0x30DB, 0xABDB, 0x30DC, 0xABDC, 0x30DD, 0xABDD, 0x30DE, 0xABDE, + 0x30DF, 0xABDF, 0x30E0, 0xABE0, 0x30E1, 0xABE1, 0x30E2, 0xABE2, + 0x30E3, 0xABE3, 0x30E4, 0xABE4, 0x30E5, 0xABE5, 0x30E6, 0xABE6, + 0x30E7, 0xABE7, 0x30E8, 0xABE8, 0x30E9, 0xABE9, 0x30EA, 0xABEA, + 0x30EB, 0xABEB, 0x30EC, 0xABEC, 0x30ED, 0xABED, 0x30EE, 0xABEE, + 0x30EF, 0xABEF, 0x30F0, 0xABF0, 0x30F1, 0xABF1, 0x30F2, 0xABF2, + 0x30F3, 0xABF3, 0x30F4, 0xABF4, 0x30F5, 0xABF5, 0x30F6, 0xABF6, + 0x3131, 0xA4A1, 0x3132, 0xA4A2, 0x3133, 0xA4A3, 0x3134, 0xA4A4, + 0x3135, 0xA4A5, 0x3136, 0xA4A6, 0x3137, 0xA4A7, 0x3138, 0xA4A8, + 0x3139, 0xA4A9, 0x313A, 0xA4AA, 0x313B, 0xA4AB, 0x313C, 0xA4AC, + 0x313D, 0xA4AD, 0x313E, 0xA4AE, 0x313F, 0xA4AF, 0x3140, 0xA4B0, + 0x3141, 0xA4B1, 0x3142, 0xA4B2, 0x3143, 0xA4B3, 0x3144, 0xA4B4, + 0x3145, 0xA4B5, 0x3146, 0xA4B6, 0x3147, 0xA4B7, 0x3148, 0xA4B8, + 0x3149, 0xA4B9, 0x314A, 0xA4BA, 0x314B, 0xA4BB, 0x314C, 0xA4BC, + 0x314D, 0xA4BD, 0x314E, 0xA4BE, 0x314F, 0xA4BF, 0x3150, 0xA4C0, + 0x3151, 0xA4C1, 0x3152, 0xA4C2, 0x3153, 0xA4C3, 0x3154, 0xA4C4, + 0x3155, 0xA4C5, 0x3156, 0xA4C6, 0x3157, 0xA4C7, 0x3158, 0xA4C8, + 0x3159, 0xA4C9, 0x315A, 0xA4CA, 0x315B, 0xA4CB, 0x315C, 0xA4CC, + 0x315D, 0xA4CD, 0x315E, 0xA4CE, 0x315F, 0xA4CF, 0x3160, 0xA4D0, + 0x3161, 0xA4D1, 0x3162, 0xA4D2, 0x3163, 0xA4D3, 0x3164, 0xA4D4, + 0x3165, 0xA4D5, 0x3166, 0xA4D6, 0x3167, 0xA4D7, 0x3168, 0xA4D8, + 0x3169, 0xA4D9, 0x316A, 0xA4DA, 0x316B, 0xA4DB, 0x316C, 0xA4DC, + 0x316D, 0xA4DD, 0x316E, 0xA4DE, 0x316F, 0xA4DF, 0x3170, 0xA4E0, + 0x3171, 0xA4E1, 0x3172, 0xA4E2, 0x3173, 0xA4E3, 0x3174, 0xA4E4, + 0x3175, 0xA4E5, 0x3176, 0xA4E6, 0x3177, 0xA4E7, 0x3178, 0xA4E8, + 0x3179, 0xA4E9, 0x317A, 0xA4EA, 0x317B, 0xA4EB, 0x317C, 0xA4EC, + 0x317D, 0xA4ED, 0x317E, 0xA4EE, 0x317F, 0xA4EF, 0x3180, 0xA4F0, + 0x3181, 0xA4F1, 0x3182, 0xA4F2, 0x3183, 0xA4F3, 0x3184, 0xA4F4, + 0x3185, 0xA4F5, 0x3186, 0xA4F6, 0x3187, 0xA4F7, 0x3188, 0xA4F8, + 0x3189, 0xA4F9, 0x318A, 0xA4FA, 0x318B, 0xA4FB, 0x318C, 0xA4FC, + 0x318D, 0xA4FD, 0x318E, 0xA4FE, 0x3200, 0xA9B1, 0x3201, 0xA9B2, + 0x3202, 0xA9B3, 0x3203, 0xA9B4, 0x3204, 0xA9B5, 0x3205, 0xA9B6, + 0x3206, 0xA9B7, 0x3207, 0xA9B8, 0x3208, 0xA9B9, 0x3209, 0xA9BA, + 0x320A, 0xA9BB, 0x320B, 0xA9BC, 0x320C, 0xA9BD, 0x320D, 0xA9BE, + 0x320E, 0xA9BF, 0x320F, 0xA9C0, 0x3210, 0xA9C1, 0x3211, 0xA9C2, + 0x3212, 0xA9C3, 0x3213, 0xA9C4, 0x3214, 0xA9C5, 0x3215, 0xA9C6, + 0x3216, 0xA9C7, 0x3217, 0xA9C8, 0x3218, 0xA9C9, 0x3219, 0xA9CA, + 0x321A, 0xA9CB, 0x321B, 0xA9CC, 0x321C, 0xA2DF, 0x3260, 0xA8B1, + 0x3261, 0xA8B2, 0x3262, 0xA8B3, 0x3263, 0xA8B4, 0x3264, 0xA8B5, + 0x3265, 0xA8B6, 0x3266, 0xA8B7, 0x3267, 0xA8B8, 0x3268, 0xA8B9, + 0x3269, 0xA8BA, 0x326A, 0xA8BB, 0x326B, 0xA8BC, 0x326C, 0xA8BD, + 0x326D, 0xA8BE, 0x326E, 0xA8BF, 0x326F, 0xA8C0, 0x3270, 0xA8C1, + 0x3271, 0xA8C2, 0x3272, 0xA8C3, 0x3273, 0xA8C4, 0x3274, 0xA8C5, + 0x3275, 0xA8C6, 0x3276, 0xA8C7, 0x3277, 0xA8C8, 0x3278, 0xA8C9, + 0x3279, 0xA8CA, 0x327A, 0xA8CB, 0x327B, 0xA8CC, 0x327F, 0xA2DE, + 0x3380, 0xA7C9, 0x3381, 0xA7CA, 0x3382, 0xA7CB, 0x3383, 0xA7CC, + 0x3384, 0xA7CD, 0x3388, 0xA7BA, 0x3389, 0xA7BB, 0x338A, 0xA7DC, + 0x338B, 0xA7DD, 0x338C, 0xA7DE, 0x338D, 0xA7B6, 0x338E, 0xA7B7, + 0x338F, 0xA7B8, 0x3390, 0xA7D4, 0x3391, 0xA7D5, 0x3392, 0xA7D6, + 0x3393, 0xA7D7, 0x3394, 0xA7D8, 0x3395, 0xA7A1, 0x3396, 0xA7A2, + 0x3397, 0xA7A3, 0x3398, 0xA7A5, 0x3399, 0xA7AB, 0x339A, 0xA7AC, + 0x339B, 0xA7AD, 0x339C, 0xA7AE, 0x339D, 0xA7AF, 0x339E, 0xA7B0, + 0x339F, 0xA7B1, 0x33A0, 0xA7B2, 0x33A1, 0xA7B3, 0x33A2, 0xA7B4, + 0x33A3, 0xA7A7, 0x33A4, 0xA7A8, 0x33A5, 0xA7A9, 0x33A6, 0xA7AA, + 0x33A7, 0xA7BD, 0x33A8, 0xA7BE, 0x33A9, 0xA7E5, 0x33AA, 0xA7E6, + 0x33AB, 0xA7E7, 0x33AC, 0xA7E8, 0x33AD, 0xA7E1, 0x33AE, 0xA7E2, + 0x33AF, 0xA7E3, 0x33B0, 0xA7BF, 0x33B1, 0xA7C0, 0x33B2, 0xA7C1, + 0x33B3, 0xA7C2, 0x33B4, 0xA7C3, 0x33B5, 0xA7C4, 0x33B6, 0xA7C5, + 0x33B7, 0xA7C6, 0x33B8, 0xA7C7, 0x33B9, 0xA7C8, 0x33BA, 0xA7CE, + 0x33BB, 0xA7CF, 0x33BC, 0xA7D0, 0x33BD, 0xA7D1, 0x33BE, 0xA7D2, + 0x33BF, 0xA7D3, 0x33C0, 0xA7DA, 0x33C1, 0xA7DB, 0x33C2, 0xA2E3, + 0x33C3, 0xA7EC, 0x33C4, 0xA7A6, 0x33C5, 0xA7E0, 0x33C6, 0xA7EF, + 0x33C7, 0xA2E1, 0x33C8, 0xA7BC, 0x33C9, 0xA7ED, 0x33CA, 0xA7B5, + 0x33CF, 0xA7B9, 0x33D0, 0xA7EA, 0x33D3, 0xA7EB, 0x33D6, 0xA7DF, + 0x33D8, 0xA2E4, 0x33DB, 0xA7E4, 0x33DC, 0xA7EE, 0x33DD, 0xA7E9, + 0x4E00, 0xECE9, 0x4E01, 0xEFCB, 0x4E03, 0xF6D2, 0x4E07, 0xD8B2, + 0x4E08, 0xEDDB, 0x4E09, 0xDFB2, 0x4E0A, 0xDFBE, 0x4E0B, 0xF9BB, + 0x4E0D, 0xDCF4, 0x4E11, 0xF5E4, 0x4E14, 0xF3A6, 0x4E15, 0xDDE0, + 0x4E16, 0xE1A6, 0x4E18, 0xCEF8, 0x4E19, 0xDCB0, 0x4E1E, 0xE3AA, + 0x4E2D, 0xF1E9, 0x4E32, 0xCDFA, 0x4E38, 0xFCAF, 0x4E39, 0xD3A1, + 0x4E3B, 0xF1AB, 0x4E42, 0xE7D1, 0x4E43, 0xD2AC, 0x4E45, 0xCEF9, + 0x4E4B, 0xF1FD, 0x4E4D, 0xDEBF, 0x4E4E, 0xFBBA, 0x4E4F, 0xF9B9, + 0x4E56, 0xCED2, 0x4E58, 0xE3AB, 0x4E59, 0xEBE0, 0x4E5D, 0xCEFA, + 0x4E5E, 0xCBF7, 0x4E5F, 0xE5A5, 0x4E6B, 0xCAE1, 0x4E6D, 0xD4CC, + 0x4E73, 0xEAE1, 0x4E76, 0xDCE3, 0x4E77, 0xDFAD, 0x4E7E, 0xCBEB, + 0x4E82, 0xD5AF, 0x4E86, 0xD6F5, 0x4E88, 0xE5F8, 0x4E8B, 0xDEC0, + 0x4E8C, 0xECA3, 0x4E8E, 0xE9CD, 0x4E90, 0xEAA7, 0x4E91, 0xE9F6, + 0x4E92, 0xFBBB, 0x4E94, 0xE7E9, 0x4E95, 0xEFCC, 0x4E98, 0xD0E6, + 0x4E9B, 0xDEC1, 0x4E9E, 0xE4AC, 0x4EA1, 0xD8CC, 0x4EA2, 0xF9F1, + 0x4EA4, 0xCEDF, 0x4EA5, 0xFAA4, 0x4EA6, 0xE6B2, 0x4EA8, 0xFAFB, + 0x4EAB, 0xFABD, 0x4EAC, 0xCCC8, 0x4EAD, 0xEFCD, 0x4EAE, 0xD5D5, + 0x4EB6, 0xD3A2, 0x4EBA, 0xECD1, 0x4EC0, 0xE4A7, 0x4EC1, 0xECD2, + 0x4EC4, 0xF6B1, 0x4EC7, 0xCEFB, 0x4ECA, 0xD0D1, 0x4ECB, 0xCBBF, + 0x4ECD, 0xEDA4, 0x4ED4, 0xEDA8, 0x4ED5, 0xDEC2, 0x4ED6, 0xF6E2, + 0x4ED7, 0xEDDC, 0x4ED8, 0xDCF5, 0x4ED9, 0xE0B9, 0x4EDD, 0xD4CE, + 0x4EDF, 0xF4B5, 0x4EE3, 0xD3DB, 0x4EE4, 0xD6B5, 0x4EE5, 0xECA4, + 0x4EF0, 0xE4E6, 0x4EF2, 0xF1EA, 0x4EF6, 0xCBEC, 0x4EF7, 0xCBC0, + 0x4EFB, 0xECF2, 0x4F01, 0xD0EA, 0x4F09, 0xF9F2, 0x4F0A, 0xECA5, + 0x4F0B, 0xD0DF, 0x4F0D, 0xE7EA, 0x4F0E, 0xD0EB, 0x4F0F, 0xDCD1, + 0x4F10, 0xDBE9, 0x4F11, 0xFDCC, 0x4F2F, 0xDBD7, 0x4F34, 0xDAE1, + 0x4F36, 0xD6B6, 0x4F38, 0xE3DF, 0x4F3A, 0xDEC3, 0x4F3C, 0xDEC4, + 0x4F3D, 0xCAA1, 0x4F43, 0xEEEC, 0x4F46, 0xD3A3, 0x4F47, 0xEEB7, + 0x4F48, 0xF8CF, 0x4F4D, 0xEAC8, 0x4F4E, 0xEEB8, 0x4F4F, 0xF1AC, + 0x4F50, 0xF1A5, 0x4F51, 0xE9CE, 0x4F55, 0xF9BC, 0x4F59, 0xE5F9, + 0x4F5A, 0xECEA, 0x4F5B, 0xDDD6, 0x4F5C, 0xEDC2, 0x4F69, 0xF8A5, + 0x4F6F, 0xE5BA, 0x4F70, 0xDBD8, 0x4F73, 0xCAA2, 0x4F76, 0xD1CD, + 0x4F7A, 0xEEED, 0x4F7E, 0xECEB, 0x4F7F, 0xDEC5, 0x4F81, 0xE3E0, + 0x4F83, 0xCAC9, 0x4F84, 0xF2E9, 0x4F86, 0xD5CE, 0x4F88, 0xF6B6, + 0x4F8A, 0xCEC2, 0x4F8B, 0xD6C7, 0x4F8D, 0xE3B4, 0x4F8F, 0xF1AD, + 0x4F91, 0xEAE2, 0x4F96, 0xD7C2, 0x4F98, 0xF3A7, 0x4F9B, 0xCDEA, + 0x4F9D, 0xEBEE, 0x4FAE, 0xD9B2, 0x4FAF, 0xFDA5, 0x4FB5, 0xF6D5, + 0x4FB6, 0xD5E2, 0x4FBF, 0xF8B5, 0x4FC2, 0xCCF5, 0x4FC3, 0xF5B5, + 0x4FC4, 0xE4AD, 0x4FC9, 0xE7EB, 0x4FCA, 0xF1D5, 0x4FCE, 0xF0BB, + 0x4FD1, 0xE9B5, 0x4FD3, 0xCCC9, 0x4FD4, 0xFAD5, 0x4FD7, 0xE1D4, + 0x4FDA, 0xD7D6, 0x4FDD, 0xDCC1, 0x4FDF, 0xDEC6, 0x4FE0, 0xFAEF, + 0x4FE1, 0xE3E1, 0x4FEE, 0xE1F3, 0x4FEF, 0xDCF6, 0x4FF1, 0xCEFC, + 0x4FF3, 0xDBC4, 0x4FF5, 0xF8F1, 0x4FF8, 0xDCE4, 0x4FFA, 0xE5EF, + 0x5002, 0xDCB1, 0x5006, 0xD5D6, 0x5009, 0xF3DA, 0x500B, 0xCBC1, + 0x500D, 0xDBC3, 0x5011, 0xD9FA, 0x5012, 0xD3EE, 0x5016, 0xFAB8, + 0x5019, 0xFDA6, 0x501A, 0xEBEF, 0x501C, 0xF4A6, 0x501E, 0xCCCA, + 0x501F, 0xF3A8, 0x5021, 0xF3DB, 0x5023, 0xDBA7, 0x5024, 0xF6B7, + 0x5026, 0xCFE6, 0x5027, 0xF0F2, 0x5028, 0xCBDA, 0x502A, 0xE7D2, + 0x502B, 0xD7C3, 0x502C, 0xF6F0, 0x502D, 0xE8DE, 0x503B, 0xE5A6, + 0x5043, 0xE5E7, 0x5047, 0xCAA3, 0x5048, 0xCCA7, 0x5049, 0xEAC9, + 0x504F, 0xF8B6, 0x5055, 0xFAA5, 0x505A, 0xF1AE, 0x505C, 0xEFCE, + 0x5065, 0xCBED, 0x5074, 0xF6B0, 0x5075, 0xEFCF, 0x5076, 0xE9CF, + 0x5078, 0xF7DE, 0x5080, 0xCED3, 0x5085, 0xDCF7, 0x508D, 0xDBA8, + 0x5091, 0xCBF8, 0x5098, 0xDFA1, 0x5099, 0xDDE1, 0x50AC, 0xF5CA, + 0x50AD, 0xE9B6, 0x50B2, 0xE7EC, 0x50B3, 0xEEEE, 0x50B5, 0xF3F0, + 0x50B7, 0xDFBF, 0x50BE, 0xCCCB, 0x50C5, 0xD0C1, 0x50C9, 0xF4D2, + 0x50CA, 0xE0BA, 0x50CF, 0xDFC0, 0x50D1, 0xCEE0, 0x50D5, 0xDCD2, + 0x50D6, 0xFDEA, 0x50DA, 0xD6F6, 0x50DE, 0xEACA, 0x50E5, 0xE8E9, + 0x50E7, 0xE3AC, 0x50ED, 0xF3D0, 0x50F9, 0xCAA4, 0x50FB, 0xDBF8, + 0x50FF, 0xDEC7, 0x5100, 0xEBF0, 0x5101, 0xF1D6, 0x5104, 0xE5E2, + 0x5106, 0xCCCC, 0x5109, 0xCBFB, 0x5112, 0xEAE3, 0x511F, 0xDFC1, + 0x5121, 0xD6ED, 0x512A, 0xE9D0, 0x5132, 0xEEB9, 0x5137, 0xD5E3, + 0x513A, 0xD1D3, 0x513C, 0xE5F0, 0x5140, 0xE8B4, 0x5141, 0xEBC3, + 0x5143, 0xEAAA, 0x5144, 0xFAFC, 0x5145, 0xF5F6, 0x5146, 0xF0BC, + 0x5147, 0xFDD4, 0x5148, 0xE0BB, 0x5149, 0xCEC3, 0x514B, 0xD0BA, + 0x514C, 0xF7BA, 0x514D, 0xD8F3, 0x514E, 0xF7CD, 0x5152, 0xE4AE, + 0x515C, 0xD4DF, 0x5162, 0xD0E7, 0x5165, 0xECFD, 0x5167, 0xD2AE, + 0x5168, 0xEEEF, 0x5169, 0xD5D7, 0x516A, 0xEAE4, 0x516B, 0xF8A2, + 0x516C, 0xCDEB, 0x516D, 0xD7BF, 0x516E, 0xFBB1, 0x5171, 0xCDEC, + 0x5175, 0xDCB2, 0x5176, 0xD0EC, 0x5177, 0xCEFD, 0x5178, 0xEEF0, + 0x517C, 0xCCC2, 0x5180, 0xD0ED, 0x5186, 0xE5F7, 0x518A, 0xF3FC, + 0x518D, 0xEEA2, 0x5192, 0xD9B3, 0x5195, 0xD8F4, 0x5197, 0xE9B7, + 0x51A0, 0xCEAE, 0x51A5, 0xD9A2, 0x51AA, 0xD8F1, 0x51AC, 0xD4CF, + 0x51B6, 0xE5A7, 0x51B7, 0xD5D2, 0x51BD, 0xD6A9, 0x51C4, 0xF4A2, + 0x51C6, 0xF1D7, 0x51C9, 0xD5D8, 0x51CB, 0xF0BD, 0x51CC, 0xD7D0, + 0x51CD, 0xD4D0, 0x51DC, 0xD7CF, 0x51DD, 0xEBEA, 0x51DE, 0xFDEB, + 0x51E1, 0xDBED, 0x51F0, 0xFCC5, 0x51F1, 0xCBC2, 0x51F6, 0xFDD5, + 0x51F8, 0xF4C8, 0x51F9, 0xE8EA, 0x51FA, 0xF5F3, 0x51FD, 0xF9DE, + 0x5200, 0xD3EF, 0x5203, 0xECD3, 0x5206, 0xDDC2, 0x5207, 0xEFB7, + 0x5208, 0xE7D4, 0x520A, 0xCACA, 0x520E, 0xD9FB, 0x5211, 0xFAFD, + 0x5217, 0xD6AA, 0x521D, 0xF4F8, 0x5224, 0xF7F7, 0x5225, 0xDCAC, + 0x5229, 0xD7D7, 0x522A, 0xDFA2, 0x522E, 0xCEBE, 0x5230, 0xD3F0, + 0x5236, 0xF0A4, 0x5237, 0xE1EC, 0x5238, 0xCFE7, 0x5239, 0xF3CB, + 0x523A, 0xEDA9, 0x523B, 0xCABE, 0x5243, 0xF4EF, 0x5247, 0xF6CE, + 0x524A, 0xDEFB, 0x524B, 0xD0BB, 0x524C, 0xD5B7, 0x524D, 0xEEF1, + 0x5254, 0xF4A8, 0x5256, 0xDCF8, 0x525B, 0xCBA7, 0x525D, 0xDACE, + 0x5261, 0xE0E6, 0x5269, 0xEDA5, 0x526A, 0xEEF2, 0x526F, 0xDCF9, + 0x5272, 0xF9DC, 0x5275, 0xF3DC, 0x527D, 0xF8F2, 0x527F, 0xF4F9, + 0x5283, 0xFCF1, 0x5287, 0xD0BC, 0x5288, 0xDBF9, 0x5289, 0xD7B1, + 0x528D, 0xCBFC, 0x5291, 0xF0A5, 0x5292, 0xCBFD, 0x529B, 0xD5F4, + 0x529F, 0xCDED, 0x52A0, 0xCAA5, 0x52A3, 0xD6AB, 0x52A4, 0xD0C2, + 0x52A9, 0xF0BE, 0x52AA, 0xD2BD, 0x52AB, 0xCCA4, 0x52BE, 0xFAB6, + 0x52C1, 0xCCCD, 0x52C3, 0xDAFA, 0x52C5, 0xF6CF, 0x52C7, 0xE9B8, + 0x52C9, 0xD8F5, 0x52CD, 0xCCCE, 0x52D2, 0xD7CD, 0x52D5, 0xD4D1, + 0x52D6, 0xE9ED, 0x52D8, 0xCAEB, 0x52D9, 0xD9E2, 0x52DB, 0xFDB2, + 0x52DD, 0xE3AD, 0x52DE, 0xD6CC, 0x52DF, 0xD9B4, 0x52E2, 0xE1A7, + 0x52E3, 0xEED3, 0x52E4, 0xD0C3, 0x52F3, 0xFDB3, 0x52F5, 0xD5E4, + 0x52F8, 0xCFE8, 0x52FA, 0xEDC3, 0x52FB, 0xD0B2, 0x52FE, 0xCEFE, + 0x52FF, 0xDAA8, 0x5305, 0xF8D0, 0x5308, 0xFDD6, 0x530D, 0xF8D1, + 0x530F, 0xF8D2, 0x5310, 0xDCD3, 0x5315, 0xDDE2, 0x5316, 0xFBF9, + 0x5317, 0xDDC1, 0x5319, 0xE3B5, 0x5320, 0xEDDD, 0x5321, 0xCEC4, + 0x5323, 0xCBA1, 0x532A, 0xDDE3, 0x532F, 0xFCDD, 0x5339, 0xF9AF, + 0x533F, 0xD2FB, 0x5340, 0xCFA1, 0x5341, 0xE4A8, 0x5343, 0xF4B6, + 0x5344, 0xECFE, 0x5347, 0xE3AE, 0x5348, 0xE7ED, 0x5349, 0xFDC1, + 0x534A, 0xDAE2, 0x534D, 0xD8B3, 0x5351, 0xDDE4, 0x5352, 0xF0EF, + 0x5353, 0xF6F1, 0x5354, 0xFAF0, 0x5357, 0xD1F5, 0x535A, 0xDACF, + 0x535C, 0xDCD4, 0x535E, 0xDCA6, 0x5360, 0xEFBF, 0x5366, 0xCECF, + 0x5368, 0xE0D9, 0x536F, 0xD9D6, 0x5370, 0xECD4, 0x5371, 0xEACB, + 0x5374, 0xCABF, 0x5375, 0xD5B0, 0x5377, 0xCFE9, 0x537D, 0xF1ED, + 0x537F, 0xCCCF, 0x5384, 0xE4F8, 0x5393, 0xE4ED, 0x5398, 0xD7D8, + 0x539A, 0xFDA7, 0x539F, 0xEAAB, 0x53A0, 0xF6B2, 0x53A5, 0xCFF0, + 0x53A6, 0xF9BD, 0x53AD, 0xE6F4, 0x53BB, 0xCBDB, 0x53C3, 0xF3D1, + 0x53C8, 0xE9D1, 0x53C9, 0xF3A9, 0x53CA, 0xD0E0, 0x53CB, 0xE9D2, + 0x53CD, 0xDAE3, 0x53D4, 0xE2D2, 0x53D6, 0xF6A2, 0x53D7, 0xE1F4, + 0x53DB, 0xDAE4, 0x53E1, 0xE7D5, 0x53E2, 0xF5BF, 0x53E3, 0xCFA2, + 0x53E4, 0xCDAF, 0x53E5, 0xCFA3, 0x53E9, 0xCDB0, 0x53EA, 0xF1FE, + 0x53EB, 0xD0A3, 0x53EC, 0xE1AF, 0x53ED, 0xF8A3, 0x53EF, 0xCAA6, + 0x53F0, 0xF7BB, 0x53F1, 0xF2EA, 0x53F2, 0xDEC8, 0x53F3, 0xE9D3, + 0x53F8, 0xDEC9, 0x5403, 0xFDDE, 0x5404, 0xCAC0, 0x5408, 0xF9EA, + 0x5409, 0xD1CE, 0x540A, 0xEED4, 0x540C, 0xD4D2, 0x540D, 0xD9A3, + 0x540E, 0xFDA8, 0x540F, 0xD7D9, 0x5410, 0xF7CE, 0x5411, 0xFABE, + 0x541B, 0xCFD6, 0x541D, 0xD7F0, 0x541F, 0xEBE1, 0x5420, 0xF8C5, + 0x5426, 0xDCFA, 0x5429, 0xDDC3, 0x542B, 0xF9DF, 0x5433, 0xE7EF, + 0x5438, 0xFDE5, 0x5439, 0xF6A3, 0x543B, 0xD9FC, 0x543C, 0xFDA9, + 0x543E, 0xE7EE, 0x5442, 0xD5E5, 0x5448, 0xEFD0, 0x544A, 0xCDB1, + 0x5451, 0xF7A2, 0x5468, 0xF1B2, 0x546A, 0xF1B1, 0x5471, 0xCDB2, + 0x5473, 0xDAAB, 0x5475, 0xCAA7, 0x547B, 0xE3E2, 0x547C, 0xFBBC, + 0x547D, 0xD9A4, 0x5480, 0xEEBA, 0x5486, 0xF8D3, 0x548C, 0xFBFA, + 0x548E, 0xCFA4, 0x5490, 0xDCFB, 0x54A4, 0xF6E3, 0x54A8, 0xEDAA, + 0x54AB, 0xF2A1, 0x54AC, 0xCEE1, 0x54B3, 0xFAA6, 0x54B8, 0xF9E0, + 0x54BD, 0xECD6, 0x54C0, 0xE4EE, 0x54C1, 0xF9A1, 0x54C4, 0xFBEF, + 0x54C8, 0xF9EB, 0x54C9, 0xEEA3, 0x54E1, 0xEAAC, 0x54E5, 0xCAA8, + 0x54E8, 0xF4FA, 0x54ED, 0xCDD6, 0x54EE, 0xFCF6, 0x54F2, 0xF4C9, + 0x54FA, 0xF8D4, 0x5504, 0xF8A6, 0x5506, 0xDECA, 0x5507, 0xF2C6, + 0x550E, 0xD7DA, 0x5510, 0xD3D0, 0x551C, 0xD8C5, 0x552F, 0xEAE6, + 0x5531, 0xF3DD, 0x5535, 0xE4DA, 0x553E, 0xF6E4, 0x5544, 0xF6F2, + 0x5546, 0xDFC2, 0x554F, 0xD9FD, 0x5553, 0xCCF6, 0x5556, 0xD3BA, + 0x555E, 0xE4AF, 0x5563, 0xF9E1, 0x557C, 0xF0A6, 0x5580, 0xCBD3, + 0x5584, 0xE0BC, 0x5586, 0xF4CA, 0x5587, 0xD4FA, 0x5589, 0xFDAA, + 0x558A, 0xF9E2, 0x5598, 0xF4B7, 0x5599, 0xFDC2, 0x559A, 0xFCB0, + 0x559C, 0xFDEC, 0x559D, 0xCAE2, 0x55A7, 0xFDBD, 0x55A9, 0xEAE7, + 0x55AA, 0xDFC3, 0x55AB, 0xD1D2, 0x55AC, 0xCEE2, 0x55AE, 0xD3A4, + 0x55C5, 0xFDAB, 0x55C7, 0xDFE0, 0x55D4, 0xF2C7, 0x55DA, 0xE7F0, + 0x55DC, 0xD0EE, 0x55DF, 0xF3AA, 0x55E3, 0xDECB, 0x55E4, 0xF6B8, + 0x55FD, 0xE1F5, 0x55FE, 0xF1B3, 0x5606, 0xF7A3, 0x5609, 0xCAA9, + 0x5614, 0xCFA5, 0x5617, 0xDFC4, 0x562F, 0xE1B0, 0x5632, 0xF0BF, + 0x5634, 0xF6A4, 0x5636, 0xE3B6, 0x5653, 0xFAC6, 0x5668, 0xD0EF, + 0x566B, 0xFDED, 0x5674, 0xDDC4, 0x5686, 0xFCF7, 0x56A5, 0xE6BF, + 0x56AC, 0xDEAD, 0x56AE, 0xFABF, 0x56B4, 0xE5F1, 0x56BC, 0xEDC4, + 0x56CA, 0xD2A5, 0x56CD, 0xFDEE, 0x56D1, 0xF5B6, 0x56DA, 0xE1F6, + 0x56DB, 0xDECC, 0x56DE, 0xFCDE, 0x56E0, 0xECD7, 0x56F0, 0xCDDD, + 0x56F9, 0xD6B7, 0x56FA, 0xCDB3, 0x5703, 0xF8D5, 0x5704, 0xE5D8, + 0x5708, 0xCFEA, 0x570B, 0xCFD0, 0x570D, 0xEACC, 0x5712, 0xEAAE, + 0x5713, 0xEAAD, 0x5716, 0xD3F1, 0x5718, 0xD3A5, 0x571F, 0xF7CF, + 0x5728, 0xEEA4, 0x572D, 0xD0A4, 0x5730, 0xF2A2, 0x573B, 0xD0F0, + 0x5740, 0xF2A3, 0x5742, 0xF7F8, 0x5747, 0xD0B3, 0x574A, 0xDBA9, + 0x574D, 0xD3BB, 0x574E, 0xCAEC, 0x5750, 0xF1A6, 0x5751, 0xCBD5, + 0x5761, 0xF7E7, 0x5764, 0xCDDE, 0x5766, 0xF7A4, 0x576A, 0xF8C0, + 0x576E, 0xD3DD, 0x5770, 0xCCD0, 0x5775, 0xCFA6, 0x577C, 0xF6F3, + 0x5782, 0xE1F7, 0x5788, 0xD3DC, 0x578B, 0xFAFE, 0x5793, 0xFAA7, + 0x57A0, 0xEBD9, 0x57A2, 0xCFA7, 0x57A3, 0xEAAF, 0x57C3, 0xE4EF, + 0x57C7, 0xE9B9, 0x57C8, 0xF1D8, 0x57CB, 0xD8D8, 0x57CE, 0xE0F2, + 0x57DF, 0xE6B4, 0x57E0, 0xDCFC, 0x57F0, 0xF3F1, 0x57F4, 0xE3D0, + 0x57F7, 0xF2FB, 0x57F9, 0xDBC6, 0x57FA, 0xD0F1, 0x57FC, 0xD0F2, + 0x5800, 0xCFDC, 0x5802, 0xD3D1, 0x5805, 0xCCB1, 0x5806, 0xF7D8, + 0x5808, 0xCBA8, 0x5809, 0xEBBC, 0x580A, 0xE4BE, 0x581E, 0xF4DC, + 0x5821, 0xDCC2, 0x5824, 0xF0A7, 0x5827, 0xE6C0, 0x582A, 0xCAED, + 0x582F, 0xE8EB, 0x5830, 0xE5E8, 0x5831, 0xDCC3, 0x5834, 0xEDDE, + 0x5835, 0xD3F2, 0x583A, 0xCCF7, 0x584A, 0xCED4, 0x584B, 0xE7AB, + 0x584F, 0xCBC3, 0x5851, 0xE1B1, 0x5854, 0xF7B2, 0x5857, 0xD3F3, + 0x5858, 0xD3D2, 0x585A, 0xF5C0, 0x585E, 0xDFDD, 0x5861, 0xEEF3, + 0x5862, 0xE7F1, 0x5864, 0xFDB4, 0x5875, 0xF2C8, 0x5879, 0xF3D2, + 0x587C, 0xEEF4, 0x587E, 0xE2D3, 0x5883, 0xCCD1, 0x5885, 0xDFEA, + 0x5889, 0xE9BA, 0x5893, 0xD9D7, 0x589C, 0xF5CD, 0x589E, 0xF1F2, + 0x589F, 0xFAC7, 0x58A8, 0xD9F8, 0x58A9, 0xD4C2, 0x58AE, 0xF6E5, + 0x58B3, 0xDDC5, 0x58BA, 0xE7F2, 0x58BB, 0xEDDF, 0x58BE, 0xCACB, + 0x58C1, 0xDBFA, 0x58C5, 0xE8B5, 0x58C7, 0xD3A6, 0x58CE, 0xFDB5, + 0x58D1, 0xF9C9, 0x58D3, 0xE4E2, 0x58D5, 0xFBBD, 0x58D8, 0xD7A4, + 0x58D9, 0xCEC5, 0x58DE, 0xCED5, 0x58DF, 0xD6E6, 0x58E4, 0xE5BD, + 0x58EB, 0xDECD, 0x58EC, 0xECF3, 0x58EF, 0xEDE0, 0x58F9, 0xECEC, + 0x58FA, 0xFBBE, 0x58FB, 0xDFEB, 0x58FD, 0xE1F8, 0x590F, 0xF9BE, + 0x5914, 0xD0F3, 0x5915, 0xE0AA, 0x5916, 0xE8E2, 0x5919, 0xE2D4, + 0x591A, 0xD2FD, 0x591C, 0xE5A8, 0x5922, 0xD9D3, 0x5927, 0xD3DE, + 0x5929, 0xF4B8, 0x592A, 0xF7BC, 0x592B, 0xDCFD, 0x592D, 0xE8EC, + 0x592E, 0xE4E7, 0x5931, 0xE3F7, 0x5937, 0xECA8, 0x593E, 0xFAF1, + 0x5944, 0xE5F2, 0x5947, 0xD0F4, 0x5948, 0xD2AF, 0x5949, 0xDCE5, + 0x594E, 0xD0A5, 0x594F, 0xF1B4, 0x5950, 0xFCB1, 0x5951, 0xCCF8, + 0x5954, 0xDDC6, 0x5955, 0xFAD1, 0x5957, 0xF7DF, 0x595A, 0xFAA8, + 0x5960, 0xEEF5, 0x5962, 0xDECE, 0x5967, 0xE7F3, 0x596A, 0xF7AC, + 0x596B, 0xEBC4, 0x596C, 0xEDE1, 0x596D, 0xE0AB, 0x596E, 0xDDC7, + 0x5973, 0xD2B3, 0x5974, 0xD2BF, 0x5978, 0xCACC, 0x597D, 0xFBBF, + 0x5982, 0xE5FD, 0x5983, 0xDDE5, 0x5984, 0xD8CD, 0x598A, 0xECF4, + 0x5993, 0xD0F5, 0x5996, 0xE8ED, 0x5997, 0xD0D2, 0x5999, 0xD9D8, + 0x59A5, 0xF6E6, 0x59A8, 0xDBAA, 0x59AC, 0xF7E0, 0x59B9, 0xD8D9, + 0x59BB, 0xF4A3, 0x59BE, 0xF4DD, 0x59C3, 0xEFD1, 0x59C6, 0xD9B5, + 0x59C9, 0xEDAB, 0x59CB, 0xE3B7, 0x59D0, 0xEEBB, 0x59D1, 0xCDB4, + 0x59D3, 0xE0F3, 0x59D4, 0xEACD, 0x59D9, 0xECF5, 0x59DA, 0xE8EE, + 0x59DC, 0xCBA9, 0x59DD, 0xF1AF, 0x59E6, 0xCACD, 0x59E8, 0xECA9, + 0x59EA, 0xF2EB, 0x59EC, 0xFDEF, 0x59EE, 0xF9F3, 0x59F8, 0xE6C1, + 0x59FB, 0xECD8, 0x59FF, 0xEDAC, 0x5A01, 0xEACE, 0x5A03, 0xE8DF, + 0x5A11, 0xDECF, 0x5A18, 0xD2A6, 0x5A1B, 0xE7F4, 0x5A1C, 0xD1D6, + 0x5A1F, 0xE6C2, 0x5A20, 0xE3E3, 0x5A25, 0xE4B0, 0x5A29, 0xD8B4, + 0x5A36, 0xF6A5, 0x5A3C, 0xF3DE, 0x5A41, 0xD7A5, 0x5A46, 0xF7E8, + 0x5A49, 0xE8C6, 0x5A5A, 0xFBE6, 0x5A62, 0xDDE6, 0x5A66, 0xDCFE, + 0x5A92, 0xD8DA, 0x5A9A, 0xDAAC, 0x5A9B, 0xEAB0, 0x5AA4, 0xE3B8, + 0x5AC1, 0xCAAA, 0x5AC2, 0xE1F9, 0x5AC4, 0xEAB1, 0x5AC9, 0xF2EC, + 0x5ACC, 0xFAEE, 0x5AE1, 0xEED5, 0x5AE6, 0xF9F4, 0x5AE9, 0xD2EC, + 0x5B05, 0xFBFB, 0x5B09, 0xFDF0, 0x5B0B, 0xE0BD, 0x5B0C, 0xCEE3, + 0x5B16, 0xF8C6, 0x5B2A, 0xDEAE, 0x5B40, 0xDFC5, 0x5B43, 0xE5BE, + 0x5B50, 0xEDAD, 0x5B51, 0xFAEA, 0x5B54, 0xCDEE, 0x5B55, 0xEDA6, + 0x5B57, 0xEDAE, 0x5B58, 0xF0ED, 0x5B5A, 0xDDA1, 0x5B5C, 0xEDAF, + 0x5B5D, 0xFCF8, 0x5B5F, 0xD8EB, 0x5B63, 0xCCF9, 0x5B64, 0xCDB5, + 0x5B69, 0xFAA9, 0x5B6B, 0xE1DD, 0x5B70, 0xE2D5, 0x5B71, 0xEDCF, + 0x5B75, 0xDDA2, 0x5B78, 0xF9CA, 0x5B7A, 0xEAE8, 0x5B7C, 0xE5ED, + 0x5B85, 0xD3EB, 0x5B87, 0xE9D4, 0x5B88, 0xE1FA, 0x5B89, 0xE4CC, + 0x5B8B, 0xE1E4, 0x5B8C, 0xE8C7, 0x5B8F, 0xCEDB, 0x5B93, 0xDCD5, + 0x5B95, 0xF7B5, 0x5B96, 0xFCF3, 0x5B97, 0xF0F3, 0x5B98, 0xCEAF, + 0x5B99, 0xF1B5, 0x5B9A, 0xEFD2, 0x5B9B, 0xE8C8, 0x5B9C, 0xEBF1, + 0x5BA2, 0xCBD4, 0x5BA3, 0xE0BE, 0x5BA4, 0xE3F8, 0x5BA5, 0xEAE9, + 0x5BA6, 0xFCB2, 0x5BAC, 0xE0F4, 0x5BAE, 0xCFE0, 0x5BB0, 0xEEA5, + 0x5BB3, 0xFAAA, 0x5BB4, 0xE6C3, 0x5BB5, 0xE1B2, 0x5BB6, 0xCAAB, + 0x5BB8, 0xE3E4, 0x5BB9, 0xE9BB, 0x5BBF, 0xE2D6, 0x5BC0, 0xF3F2, + 0x5BC2, 0xEED6, 0x5BC3, 0xEAB2, 0x5BC4, 0xD0F6, 0x5BC5, 0xECD9, + 0x5BC6, 0xDACB, 0x5BC7, 0xCFA8, 0x5BCC, 0xDDA3, 0x5BD0, 0xD8DB, + 0x5BD2, 0xF9CE, 0x5BD3, 0xE9D5, 0x5BD4, 0xE3D1, 0x5BD7, 0xD2BC, + 0x5BDE, 0xD8AC, 0x5BDF, 0xF3CC, 0x5BE1, 0xCDFB, 0x5BE2, 0xF6D6, + 0x5BE4, 0xE7F5, 0x5BE5, 0xE8EF, 0x5BE6, 0xE3F9, 0x5BE7, 0xD2BB, + 0x5BE8, 0xF3F3, 0x5BE9, 0xE3FB, 0x5BEB, 0xDED0, 0x5BEC, 0xCEB0, + 0x5BEE, 0xD6F7, 0x5BEF, 0xF1D9, 0x5BF5, 0xF5C1, 0x5BF6, 0xDCC4, + 0x5BF8, 0xF5BB, 0x5BFA, 0xDED1, 0x5C01, 0xDCE6, 0x5C04, 0xDED2, + 0x5C07, 0xEDE2, 0x5C08, 0xEEF6, 0x5C09, 0xEACF, 0x5C0A, 0xF0EE, + 0x5C0B, 0xE3FC, 0x5C0D, 0xD3DF, 0x5C0E, 0xD3F4, 0x5C0F, 0xE1B3, + 0x5C11, 0xE1B4, 0x5C16, 0xF4D3, 0x5C19, 0xDFC6, 0x5C24, 0xE9D6, + 0x5C28, 0xDBAB, 0x5C31, 0xF6A6, 0x5C38, 0xE3B9, 0x5C39, 0xEBC5, + 0x5C3A, 0xF4A9, 0x5C3B, 0xCDB6, 0x5C3C, 0xD2F9, 0x5C3E, 0xDAAD, + 0x5C3F, 0xD2E3, 0x5C40, 0xCFD1, 0x5C45, 0xCBDC, 0x5C46, 0xCCFA, + 0x5C48, 0xCFDD, 0x5C4B, 0xE8A9, 0x5C4D, 0xE3BB, 0x5C4E, 0xE3BA, + 0x5C51, 0xE0DA, 0x5C55, 0xEEF7, 0x5C5B, 0xDCB3, 0x5C60, 0xD3F5, + 0x5C62, 0xD7A6, 0x5C64, 0xF6B5, 0x5C65, 0xD7DB, 0x5C6C, 0xE1D5, + 0x5C6F, 0xD4EA, 0x5C71, 0xDFA3, 0x5C79, 0xFDDF, 0x5C90, 0xD0F7, + 0x5C91, 0xEDD4, 0x5CA1, 0xCBAA, 0x5CA9, 0xE4DB, 0x5CAB, 0xE1FB, + 0x5CAC, 0xCBA2, 0x5CB1, 0xD3E0, 0x5CB3, 0xE4BF, 0x5CB5, 0xFBC0, + 0x5CB7, 0xDABE, 0x5CB8, 0xE4CD, 0x5CBA, 0xD6B9, 0x5CBE, 0xEFC0, + 0x5CC0, 0xE1FC, 0x5CD9, 0xF6B9, 0x5CE0, 0xDFC7, 0x5CE8, 0xE4B1, + 0x5CEF, 0xDCE7, 0x5CF0, 0xDCE8, 0x5CF4, 0xFAD6, 0x5CF6, 0xD3F6, + 0x5CFB, 0xF1DA, 0x5CFD, 0xFAF2, 0x5D07, 0xE2FD, 0x5D0D, 0xD5CF, + 0x5D0E, 0xD0F8, 0x5D11, 0xCDDF, 0x5D14, 0xF5CB, 0x5D16, 0xE4F0, + 0x5D17, 0xCBAB, 0x5D19, 0xD7C4, 0x5D27, 0xE2FE, 0x5D29, 0xDDDA, + 0x5D4B, 0xDAAE, 0x5D4C, 0xCAEE, 0x5D50, 0xD5B9, 0x5D69, 0xE3A1, + 0x5D6C, 0xE8E3, 0x5D6F, 0xF3AB, 0x5D87, 0xCFA9, 0x5D8B, 0xD3F7, + 0x5D9D, 0xD4F1, 0x5DA0, 0xCEE4, 0x5DA2, 0xE8F2, 0x5DAA, 0xE5F5, + 0x5DB8, 0xE7AE, 0x5DBA, 0xD6BA, 0x5DBC, 0xDFEC, 0x5DBD, 0xE4C0, + 0x5DCD, 0xE8E4, 0x5DD2, 0xD8B5, 0x5DD6, 0xE4DC, 0x5DDD, 0xF4B9, + 0x5DDE, 0xF1B6, 0x5DE1, 0xE2DE, 0x5DE2, 0xE1B5, 0x5DE5, 0xCDEF, + 0x5DE6, 0xF1A7, 0x5DE7, 0xCEE5, 0x5DE8, 0xCBDD, 0x5DEB, 0xD9E3, + 0x5DEE, 0xF3AC, 0x5DF1, 0xD0F9, 0x5DF2, 0xECAB, 0x5DF3, 0xDED3, + 0x5DF4, 0xF7E9, 0x5DF7, 0xF9F5, 0x5DFD, 0xE1DE, 0x5DFE, 0xCBEE, + 0x5E02, 0xE3BC, 0x5E03, 0xF8D6, 0x5E06, 0xDBEE, 0x5E0C, 0xFDF1, + 0x5E11, 0xF7B6, 0x5E16, 0xF4DE, 0x5E19, 0xF2ED, 0x5E1B, 0xDBD9, + 0x5E1D, 0xF0A8, 0x5E25, 0xE1FD, 0x5E2B, 0xDED4, 0x5E2D, 0xE0AC, + 0x5E33, 0xEDE3, 0x5E36, 0xD3E1, 0x5E38, 0xDFC8, 0x5E3D, 0xD9B6, + 0x5E3F, 0xFDAC, 0x5E40, 0xEFD3, 0x5E44, 0xE4C1, 0x5E45, 0xF8EB, + 0x5E47, 0xDBAC, 0x5E4C, 0xFCC6, 0x5E55, 0xD8AD, 0x5E5F, 0xF6BA, + 0x5E61, 0xDBDF, 0x5E62, 0xD3D3, 0x5E63, 0xF8C7, 0x5E72, 0xCACE, + 0x5E73, 0xF8C1, 0x5E74, 0xD2B4, 0x5E77, 0xDCB4, 0x5E78, 0xFAB9, + 0x5E79, 0xCACF, 0x5E7B, 0xFCB3, 0x5E7C, 0xEAEA, 0x5E7D, 0xEAEB, + 0x5E7E, 0xD0FA, 0x5E84, 0xEDE4, 0x5E87, 0xDDE7, 0x5E8A, 0xDFC9, + 0x5E8F, 0xDFED, 0x5E95, 0xEEBC, 0x5E97, 0xEFC1, 0x5E9A, 0xCCD2, + 0x5E9C, 0xDDA4, 0x5EA0, 0xDFCA, 0x5EA6, 0xD3F8, 0x5EA7, 0xF1A8, + 0x5EAB, 0xCDB7, 0x5EAD, 0xEFD4, 0x5EB5, 0xE4DD, 0x5EB6, 0xDFEE, + 0x5EB7, 0xCBAC, 0x5EB8, 0xE9BC, 0x5EBE, 0xEAEC, 0x5EC2, 0xDFCB, + 0x5EC8, 0xF9BF, 0x5EC9, 0xD6AF, 0x5ECA, 0xD5C6, 0x5ED0, 0xCFAA, + 0x5ED3, 0xCEA9, 0x5ED6, 0xD6F8, 0x5EDA, 0xF1B7, 0x5EDB, 0xEEF8, + 0x5EDF, 0xD9D9, 0x5EE0, 0xF3DF, 0x5EE2, 0xF8C8, 0x5EE3, 0xCEC6, + 0x5EEC, 0xD5E6, 0x5EF3, 0xF4E6, 0x5EF6, 0xE6C5, 0x5EF7, 0xEFD5, + 0x5EFA, 0xCBEF, 0x5EFB, 0xFCDF, 0x5F01, 0xDCA7, 0x5F04, 0xD6E7, + 0x5F0A, 0xF8C9, 0x5F0F, 0xE3D2, 0x5F11, 0xE3BD, 0x5F13, 0xCFE1, + 0x5F14, 0xF0C0, 0x5F15, 0xECDA, 0x5F17, 0xDDD7, 0x5F18, 0xFBF0, + 0x5F1B, 0xECAC, 0x5F1F, 0xF0A9, 0x5F26, 0xFAD7, 0x5F27, 0xFBC1, + 0x5F29, 0xD2C0, 0x5F31, 0xE5B0, 0x5F35, 0xEDE5, 0x5F3A, 0xCBAD, + 0x5F3C, 0xF9B0, 0x5F48, 0xF7A5, 0x5F4A, 0xCBAE, 0x5F4C, 0xDAAF, + 0x5F4E, 0xD8B6, 0x5F56, 0xD3A7, 0x5F57, 0xFBB2, 0x5F59, 0xFDC4, + 0x5F5B, 0xECAD, 0x5F62, 0xFBA1, 0x5F66, 0xE5E9, 0x5F67, 0xE9EE, + 0x5F69, 0xF3F4, 0x5F6A, 0xF8F3, 0x5F6B, 0xF0C1, 0x5F6C, 0xDEAF, + 0x5F6D, 0xF8B0, 0x5F70, 0xF3E0, 0x5F71, 0xE7AF, 0x5F77, 0xDBAD, + 0x5F79, 0xE6B5, 0x5F7C, 0xF9A8, 0x5F7F, 0xDDD8, 0x5F80, 0xE8D9, + 0x5F81, 0xEFD6, 0x5F85, 0xD3E2, 0x5F87, 0xE2DF, 0x5F8A, 0xFCE0, + 0x5F8B, 0xD7C8, 0x5F8C, 0xFDAD, 0x5F90, 0xDFEF, 0x5F91, 0xCCD3, + 0x5F92, 0xD3F9, 0x5F97, 0xD4F0, 0x5F98, 0xDBC7, 0x5F99, 0xDED5, + 0x5F9E, 0xF0F4, 0x5FA0, 0xD5D0, 0x5FA1, 0xE5D9, 0x5FA8, 0xFCC7, + 0x5FA9, 0xDCD6, 0x5FAA, 0xE2E0, 0x5FAE, 0xDAB0, 0x5FB5, 0xF3A3, + 0x5FB7, 0xD3EC, 0x5FB9, 0xF4CB, 0x5FBD, 0xFDC5, 0x5FC3, 0xE3FD, + 0x5FC5, 0xF9B1, 0x5FCC, 0xD0FB, 0x5FCD, 0xECDB, 0x5FD6, 0xF5BC, + 0x5FD7, 0xF2A4, 0x5FD8, 0xD8CE, 0x5FD9, 0xD8CF, 0x5FE0, 0xF5F7, + 0x5FEB, 0xF6E1, 0x5FF5, 0xD2B7, 0x5FFD, 0xFBEC, 0x5FFF, 0xDDC8, + 0x600F, 0xE4E8, 0x6012, 0xD2C1, 0x6016, 0xF8D7, 0x601C, 0xD6BB, + 0x601D, 0xDED6, 0x6020, 0xF7BD, 0x6021, 0xECAE, 0x6025, 0xD0E1, + 0x6027, 0xE0F5, 0x6028, 0xEAB3, 0x602A, 0xCED6, 0x602F, 0xCCA5, + 0x6041, 0xECF6, 0x6042, 0xE2E1, 0x6043, 0xE3BE, 0x604D, 0xFCC8, + 0x6050, 0xCDF0, 0x6052, 0xF9F6, 0x6055, 0xDFF0, 0x6059, 0xE5BF, + 0x605D, 0xCEBF, 0x6062, 0xFCE1, 0x6063, 0xEDB0, 0x6064, 0xFDD1, + 0x6065, 0xF6BB, 0x6068, 0xF9CF, 0x6069, 0xEBDA, 0x606A, 0xCAC1, + 0x606C, 0xD2B8, 0x606D, 0xCDF1, 0x606F, 0xE3D3, 0x6070, 0xFDE6, + 0x6085, 0xE6ED, 0x6089, 0xE3FA, 0x608C, 0xF0AA, 0x608D, 0xF9D0, + 0x6094, 0xFCE2, 0x6096, 0xF8A7, 0x609A, 0xE1E5, 0x609B, 0xEEF9, + 0x609F, 0xE7F6, 0x60A0, 0xEAED, 0x60A3, 0xFCB4, 0x60A4, 0xF5C2, + 0x60A7, 0xD7DC, 0x60B0, 0xF0F5, 0x60B2, 0xDDE8, 0x60B3, 0xD3ED, + 0x60B4, 0xF5FC, 0x60B6, 0xDABF, 0x60B8, 0xCCFB, 0x60BC, 0xD3FA, + 0x60BD, 0xF4A4, 0x60C5, 0xEFD7, 0x60C7, 0xD4C3, 0x60D1, 0xFBE3, + 0x60DA, 0xFBED, 0x60DC, 0xE0AD, 0x60DF, 0xEAEE, 0x60E0, 0xFBB3, + 0x60E1, 0xE4C2, 0x60F0, 0xF6E7, 0x60F1, 0xD2DD, 0x60F3, 0xDFCC, + 0x60F6, 0xFCC9, 0x60F9, 0xE5A9, 0x60FA, 0xE0F6, 0x60FB, 0xF6B3, + 0x6101, 0xE1FE, 0x6106, 0xCBF0, 0x6108, 0xEAEF, 0x6109, 0xEAF0, + 0x610D, 0xDAC0, 0x610E, 0xF8B4, 0x610F, 0xEBF2, 0x6115, 0xE4C3, + 0x611A, 0xE9D7, 0x611B, 0xE4F1, 0x611F, 0xCAEF, 0x6127, 0xCED7, + 0x6130, 0xFCCA, 0x6134, 0xF3E1, 0x6137, 0xCBC4, 0x613C, 0xE3E5, + 0x613E, 0xCBC5, 0x613F, 0xEAB4, 0x6142, 0xE9BD, 0x6144, 0xD7C9, + 0x6147, 0xEBDB, 0x6148, 0xEDB1, 0x614A, 0xCCC3, 0x614B, 0xF7BE, + 0x614C, 0xFCCB, 0x6153, 0xF8F4, 0x6155, 0xD9B7, 0x6158, 0xF3D3, + 0x6159, 0xF3D4, 0x615D, 0xF7E4, 0x615F, 0xF7D1, 0x6162, 0xD8B7, + 0x6163, 0xCEB1, 0x6164, 0xCAC2, 0x6167, 0xFBB4, 0x6168, 0xCBC6, + 0x616B, 0xF0F6, 0x616E, 0xD5E7, 0x6170, 0xEAD0, 0x6176, 0xCCD4, + 0x6177, 0xCBAF, 0x617D, 0xF4AA, 0x617E, 0xE9AF, 0x6181, 0xF5C3, + 0x6182, 0xE9D8, 0x618A, 0xDDE9, 0x618E, 0xF1F3, 0x6190, 0xD5FB, + 0x6191, 0xDEBB, 0x6194, 0xF4FB, 0x6198, 0xFDF3, 0x6199, 0xFDF2, + 0x619A, 0xF7A6, 0x61A4, 0xDDC9, 0x61A7, 0xD4D3, 0x61A9, 0xCCA8, + 0x61AB, 0xDAC1, 0x61AC, 0xCCD5, 0x61AE, 0xD9E4, 0x61B2, 0xFACA, + 0x61B6, 0xE5E3, 0x61BA, 0xD3BC, 0x61BE, 0xCAF0, 0x61C3, 0xD0C4, + 0x61C7, 0xCAD0, 0x61C8, 0xFAAB, 0x61C9, 0xEBEB, 0x61CA, 0xE7F8, + 0x61CB, 0xD9E5, 0x61E6, 0xD1D7, 0x61F2, 0xF3A4, 0x61F6, 0xD4FB, + 0x61F7, 0xFCE3, 0x61F8, 0xFAD8, 0x61FA, 0xF3D5, 0x61FC, 0xCFAB, + 0x61FF, 0xEBF3, 0x6200, 0xD5FC, 0x6207, 0xD3D4, 0x6208, 0xCDFC, + 0x620A, 0xD9E6, 0x620C, 0xE2F9, 0x620D, 0xE2A1, 0x620E, 0xEBD4, + 0x6210, 0xE0F7, 0x6211, 0xE4B2, 0x6212, 0xCCFC, 0x6216, 0xFBE4, + 0x621A, 0xF4AB, 0x621F, 0xD0BD, 0x6221, 0xCAF1, 0x622A, 0xEFB8, + 0x622E, 0xD7C0, 0x6230, 0xEEFA, 0x6231, 0xFDF4, 0x6234, 0xD3E3, + 0x6236, 0xFBC2, 0x623E, 0xD5E8, 0x623F, 0xDBAE, 0x6240, 0xE1B6, + 0x6241, 0xF8B7, 0x6247, 0xE0BF, 0x6248, 0xFBC3, 0x6249, 0xDDEA, + 0x624B, 0xE2A2, 0x624D, 0xEEA6, 0x6253, 0xF6E8, 0x6258, 0xF6F5, + 0x626E, 0xDDCA, 0x6271, 0xD0E2, 0x6276, 0xDDA6, 0x6279, 0xDDEB, + 0x627C, 0xE4F9, 0x627F, 0xE3AF, 0x6280, 0xD0FC, 0x6284, 0xF4FC, + 0x6289, 0xCCBC, 0x628A, 0xF7EA, 0x6291, 0xE5E4, 0x6292, 0xDFF1, + 0x6295, 0xF7E1, 0x6297, 0xF9F7, 0x6298, 0xEFB9, 0x629B, 0xF8D8, + 0x62AB, 0xF9A9, 0x62B1, 0xF8D9, 0x62B5, 0xEEBD, 0x62B9, 0xD8C6, + 0x62BC, 0xE4E3, 0x62BD, 0xF5CE, 0x62C2, 0xDDD9, 0x62C7, 0xD9E7, + 0x62C8, 0xD2B9, 0x62C9, 0xD5C3, 0x62CC, 0xDAE5, 0x62CD, 0xDAD0, + 0x62CF, 0xD1D9, 0x62D0, 0xCED8, 0x62D2, 0xCBDE, 0x62D3, 0xF4AC, + 0x62D4, 0xDAFB, 0x62D6, 0xF6E9, 0x62D7, 0xE8F3, 0x62D8, 0xCFAC, + 0x62D9, 0xF0F0, 0x62DB, 0xF4FD, 0x62DC, 0xDBC8, 0x62EC, 0xCEC0, + 0x62ED, 0xE3D4, 0x62EE, 0xD1CF, 0x62EF, 0xF1F5, 0x62F1, 0xCDF2, + 0x62F3, 0xCFEB, 0x62F7, 0xCDB8, 0x62FE, 0xE3A6, 0x62FF, 0xD1DA, + 0x6301, 0xF2A5, 0x6307, 0xF2A6, 0x6309, 0xE4CE, 0x6311, 0xD3FB, + 0x632B, 0xF1A9, 0x632F, 0xF2C9, 0x633A, 0xEFD8, 0x633B, 0xE6C9, + 0x633D, 0xD8B8, 0x633E, 0xFAF3, 0x6349, 0xF3B5, 0x634C, 0xF8A4, + 0x634F, 0xD1F3, 0x6350, 0xE6C8, 0x6355, 0xF8DA, 0x6367, 0xDCE9, + 0x6368, 0xDED7, 0x636E, 0xCBDF, 0x6372, 0xCFEC, 0x6377, 0xF4DF, + 0x637A, 0xD1F4, 0x637B, 0xD2BA, 0x637F, 0xDFF2, 0x6383, 0xE1B7, + 0x6388, 0xE2A3, 0x6389, 0xD3FC, 0x638C, 0xEDE6, 0x6392, 0xDBC9, + 0x6396, 0xE4FA, 0x6398, 0xCFDE, 0x639B, 0xCED0, 0x63A0, 0xD5D3, + 0x63A1, 0xF3F5, 0x63A2, 0xF7AE, 0x63A5, 0xEFC8, 0x63A7, 0xCDF3, + 0x63A8, 0xF5CF, 0x63A9, 0xE5F3, 0x63AA, 0xF0C2, 0x63C0, 0xCAD1, + 0x63C4, 0xEAF1, 0x63C6, 0xD0A6, 0x63CF, 0xD9DA, 0x63D0, 0xF0AB, + 0x63D6, 0xEBE7, 0x63DA, 0xE5C0, 0x63DB, 0xFCB5, 0x63E1, 0xE4C4, + 0x63ED, 0xCCA9, 0x63EE, 0xFDC6, 0x63F4, 0xEAB5, 0x63F6, 0xE5AA, + 0x63F7, 0xDFBA, 0x640D, 0xE1DF, 0x640F, 0xDAD1, 0x6414, 0xE1B8, + 0x6416, 0xE8F4, 0x6417, 0xD3FD, 0x641C, 0xE2A4, 0x6422, 0xF2CA, + 0x642C, 0xDAE6, 0x642D, 0xF7B3, 0x643A, 0xFDCD, 0x643E, 0xF3B6, + 0x6458, 0xEED7, 0x6460, 0xF5C4, 0x6469, 0xD8A4, 0x646F, 0xF2A7, + 0x6478, 0xD9B8, 0x6479, 0xD9B9, 0x647A, 0xEFC9, 0x6488, 0xD6CE, + 0x6491, 0xF7CB, 0x6492, 0xDFAE, 0x6493, 0xE8F5, 0x649A, 0xD2B5, + 0x649E, 0xD3D5, 0x64A4, 0xF4CC, 0x64A5, 0xDAFC, 0x64AB, 0xD9E8, + 0x64AD, 0xF7EB, 0x64AE, 0xF5C9, 0x64B0, 0xF3BC, 0x64B2, 0xDAD2, + 0x64BB, 0xD3B5, 0x64C1, 0xE8B6, 0x64C4, 0xD6CF, 0x64C5, 0xF4BA, + 0x64C7, 0xF7C9, 0x64CA, 0xCCAA, 0x64CD, 0xF0C3, 0x64CE, 0xCCD6, + 0x64D2, 0xD0D3, 0x64D4, 0xD3BD, 0x64D8, 0xDBFB, 0x64DA, 0xCBE0, + 0x64E1, 0xD3E4, 0x64E2, 0xF6F7, 0x64E5, 0xD5BA, 0x64E6, 0xF3CD, + 0x64E7, 0xCBE1, 0x64EC, 0xEBF4, 0x64F2, 0xF4AD, 0x64F4, 0xFCAA, + 0x64FA, 0xF7EC, 0x64FE, 0xE8F6, 0x6500, 0xDAE7, 0x6504, 0xF7CC, + 0x6518, 0xE5C1, 0x651D, 0xE0EE, 0x6523, 0xD5FD, 0x652A, 0xCEE6, + 0x652B, 0xFCAB, 0x652C, 0xD5BB, 0x652F, 0xF2A8, 0x6536, 0xE2A5, + 0x6537, 0xCDB9, 0x6538, 0xEAF2, 0x6539, 0xCBC7, 0x653B, 0xCDF4, + 0x653E, 0xDBAF, 0x653F, 0xEFD9, 0x6545, 0xCDBA, 0x6548, 0xFCF9, + 0x654D, 0xDFF3, 0x654E, 0xCEE7, 0x654F, 0xDAC2, 0x6551, 0xCFAD, + 0x6556, 0xE7F9, 0x6557, 0xF8A8, 0x655E, 0xF3E2, 0x6562, 0xCAF2, + 0x6563, 0xDFA4, 0x6566, 0xD4C4, 0x656C, 0xCCD7, 0x656D, 0xE5C2, + 0x6572, 0xCDBB, 0x6574, 0xEFDA, 0x6575, 0xEED8, 0x6577, 0xDDA7, + 0x6578, 0xE2A6, 0x657E, 0xE0C0, 0x6582, 0xD6B0, 0x6583, 0xF8CA, + 0x6585, 0xFCFA, 0x6587, 0xD9FE, 0x658C, 0xDEB0, 0x6590, 0xDDEC, + 0x6591, 0xDAE8, 0x6597, 0xD4E0, 0x6599, 0xD6F9, 0x659B, 0xCDD7, + 0x659C, 0xDED8, 0x659F, 0xF2F8, 0x65A1, 0xE4D6, 0x65A4, 0xD0C5, + 0x65A5, 0xF4AE, 0x65A7, 0xDDA8, 0x65AB, 0xEDC5, 0x65AC, 0xF3D6, + 0x65AF, 0xDED9, 0x65B0, 0xE3E6, 0x65B7, 0xD3A8, 0x65B9, 0xDBB0, + 0x65BC, 0xE5DA, 0x65BD, 0xE3BF, 0x65C1, 0xDBB1, 0x65C5, 0xD5E9, + 0x65CB, 0xE0C1, 0x65CC, 0xEFDB, 0x65CF, 0xF0E9, 0x65D2, 0xD7B2, + 0x65D7, 0xD0FD, 0x65E0, 0xD9E9, 0x65E3, 0xD0FE, 0x65E5, 0xECED, + 0x65E6, 0xD3A9, 0x65E8, 0xF2A9, 0x65E9, 0xF0C4, 0x65EC, 0xE2E2, + 0x65ED, 0xE9EF, 0x65F1, 0xF9D1, 0x65F4, 0xE9D9, 0x65FA, 0xE8DA, + 0x65FB, 0xDAC3, 0x65FC, 0xDAC4, 0x65FD, 0xD4C5, 0x65FF, 0xE7FA, + 0x6606, 0xCDE0, 0x6607, 0xE3B0, 0x6609, 0xDBB2, 0x660A, 0xFBC4, + 0x660C, 0xF3E3, 0x660E, 0xD9A5, 0x660F, 0xFBE7, 0x6610, 0xDDCB, + 0x6611, 0xD0D4, 0x6613, 0xE6B6, 0x6614, 0xE0AE, 0x6615, 0xFDDA, + 0x661E, 0xDCB5, 0x661F, 0xE0F8, 0x6620, 0xE7B1, 0x6625, 0xF5F0, + 0x6627, 0xD8DC, 0x6628, 0xEDC6, 0x662D, 0xE1B9, 0x662F, 0xE3C0, + 0x6630, 0xF9C0, 0x6631, 0xE9F0, 0x6634, 0xD9DB, 0x6636, 0xF3E4, + 0x663A, 0xDCB6, 0x663B, 0xE4E9, 0x6641, 0xF0C5, 0x6642, 0xE3C1, + 0x6643, 0xFCCC, 0x6644, 0xFCCD, 0x6649, 0xF2CB, 0x664B, 0xF2CC, + 0x664F, 0xE4CF, 0x6659, 0xF1DB, 0x665B, 0xFAD9, 0x665D, 0xF1B8, + 0x665E, 0xFDF5, 0x665F, 0xE0F9, 0x6664, 0xE7FB, 0x6665, 0xFCB7, + 0x6666, 0xFCE4, 0x6667, 0xFBC5, 0x6668, 0xE3E7, 0x6669, 0xD8B9, + 0x666B, 0xF6F8, 0x666E, 0xDCC5, 0x666F, 0xCCD8, 0x6673, 0xE0AF, + 0x6674, 0xF4E7, 0x6676, 0xEFDC, 0x6677, 0xCFFC, 0x6678, 0xEFDD, + 0x667A, 0xF2AA, 0x6684, 0xFDBE, 0x6687, 0xCAAC, 0x6688, 0xFDBB, + 0x6689, 0xFDC7, 0x668E, 0xE7B2, 0x6690, 0xEAD1, 0x6691, 0xDFF4, + 0x6696, 0xD1EC, 0x6697, 0xE4DE, 0x6698, 0xE5C3, 0x669D, 0xD9A6, + 0x66A0, 0xCDBC, 0x66A2, 0xF3E5, 0x66AB, 0xEDD5, 0x66AE, 0xD9BA, + 0x66B2, 0xEDE7, 0x66B3, 0xFBB5, 0x66B4, 0xF8EC, 0x66B9, 0xE0E7, + 0x66BB, 0xCCD9, 0x66BE, 0xD4C6, 0x66C4, 0xE7A5, 0x66C6, 0xD5F5, + 0x66C7, 0xD3BE, 0x66C9, 0xFCFB, 0x66D6, 0xE4F2, 0x66D9, 0xDFF5, + 0x66DC, 0xE8F8, 0x66DD, 0xF8ED, 0x66E0, 0xCEC7, 0x66E6, 0xFDF6, + 0x66F0, 0xE8D8, 0x66F2, 0xCDD8, 0x66F3, 0xE7D6, 0x66F4, 0xCCDA, + 0x66F7, 0xCAE3, 0x66F8, 0xDFF6, 0x66F9, 0xF0C7, 0x66FA, 0xF0C6, + 0x66FC, 0xD8BA, 0x66FE, 0xF1F4, 0x66FF, 0xF4F0, 0x6700, 0xF5CC, + 0x6703, 0xFCE5, 0x6708, 0xEAC5, 0x6709, 0xEAF3, 0x670B, 0xDDDB, + 0x670D, 0xDCD7, 0x6714, 0xDEFD, 0x6715, 0xF2F9, 0x6717, 0xD5C7, + 0x671B, 0xD8D0, 0x671D, 0xF0C8, 0x671E, 0xD1A1, 0x671F, 0xD1A2, + 0x6726, 0xD9D4, 0x6727, 0xD6E8, 0x6728, 0xD9CA, 0x672A, 0xDAB1, + 0x672B, 0xD8C7, 0x672C, 0xDCE2, 0x672D, 0xF3CE, 0x672E, 0xF5F4, + 0x6731, 0xF1B9, 0x6734, 0xDAD3, 0x6736, 0xF6EA, 0x673A, 0xCFF5, + 0x673D, 0xFDAE, 0x6746, 0xCAD2, 0x6749, 0xDFB4, 0x674E, 0xD7DD, + 0x674F, 0xFABA, 0x6750, 0xEEA7, 0x6751, 0xF5BD, 0x6753, 0xF8F5, + 0x6756, 0xEDE8, 0x675C, 0xD4E1, 0x675E, 0xD1A3, 0x675F, 0xE1D6, + 0x676D, 0xF9F8, 0x676F, 0xDBCA, 0x6770, 0xCBF9, 0x6771, 0xD4D4, + 0x6773, 0xD9DC, 0x6775, 0xEEBE, 0x6777, 0xF7ED, 0x677B, 0xD2EE, + 0x677E, 0xE1E6, 0x677F, 0xF7F9, 0x6787, 0xDDED, 0x6789, 0xE8DB, + 0x678B, 0xDBB3, 0x678F, 0xD1F7, 0x6790, 0xE0B0, 0x6793, 0xD4E2, + 0x6795, 0xF6D7, 0x6797, 0xD7F9, 0x679A, 0xD8DD, 0x679C, 0xCDFD, + 0x679D, 0xF2AB, 0x67AF, 0xCDBD, 0x67B0, 0xF8C2, 0x67B3, 0xF2AC, + 0x67B6, 0xCAAD, 0x67B7, 0xCAAE, 0x67B8, 0xCFAE, 0x67BE, 0xE3C2, + 0x67C4, 0xDCB7, 0x67CF, 0xDBDA, 0x67D0, 0xD9BB, 0x67D1, 0xCAF3, + 0x67D2, 0xF6D3, 0x67D3, 0xE6F8, 0x67D4, 0xEAF5, 0x67DA, 0xEAF6, + 0x67DD, 0xF6F9, 0x67E9, 0xCFAF, 0x67EC, 0xCAD3, 0x67EF, 0xCAAF, + 0x67F0, 0xD2B0, 0x67F1, 0xF1BA, 0x67F3, 0xD7B3, 0x67F4, 0xE3C3, + 0x67F5, 0xF3FD, 0x67F6, 0xDEDA, 0x67FB, 0xDEDB, 0x67FE, 0xEFDE, + 0x6812, 0xE2E3, 0x6813, 0xEEFB, 0x6816, 0xDFF7, 0x6817, 0xD7CA, + 0x6821, 0xCEE8, 0x6822, 0xDBDB, 0x682A, 0xF1BB, 0x682F, 0xE9F1, + 0x6838, 0xFAB7, 0x6839, 0xD0C6, 0x683C, 0xCCAB, 0x683D, 0xEEA8, + 0x6840, 0xCBFA, 0x6841, 0xF9F9, 0x6842, 0xCCFD, 0x6843, 0xD3FE, + 0x6848, 0xE4D0, 0x684E, 0xF2EE, 0x6850, 0xD4D5, 0x6851, 0xDFCD, + 0x6853, 0xFCB8, 0x6854, 0xD1D0, 0x686D, 0xF2CD, 0x6876, 0xF7D2, + 0x687F, 0xCAD4, 0x6881, 0xD5D9, 0x6885, 0xD8DE, 0x688F, 0xCDD9, + 0x6893, 0xEEA9, 0x6894, 0xF6BC, 0x6897, 0xCCDB, 0x689D, 0xF0C9, + 0x689F, 0xFCFC, 0x68A1, 0xE8C9, 0x68A2, 0xF4FE, 0x68A7, 0xE7FC, + 0x68A8, 0xD7DE, 0x68AD, 0xDEDC, 0x68AF, 0xF0AC, 0x68B0, 0xCCFE, + 0x68B1, 0xCDE1, 0x68B3, 0xE1BA, 0x68B5, 0xDBEF, 0x68B6, 0xDAB2, + 0x68C4, 0xD1A5, 0x68C5, 0xDCB8, 0x68C9, 0xD8F6, 0x68CB, 0xD1A4, + 0x68CD, 0xCDE2, 0x68D2, 0xDCEA, 0x68D5, 0xF0F7, 0x68D7, 0xF0CA, + 0x68D8, 0xD0BE, 0x68DA, 0xDDDC, 0x68DF, 0xD4D6, 0x68E0, 0xD3D6, + 0x68E7, 0xEDD0, 0x68E8, 0xCDA1, 0x68EE, 0xDFB5, 0x68F2, 0xDFF8, + 0x68F9, 0xD4A1, 0x68FA, 0xCEB2, 0x6900, 0xE8CA, 0x6905, 0xEBF5, + 0x690D, 0xE3D5, 0x690E, 0xF5D0, 0x6912, 0xF5A1, 0x6927, 0xD9A7, + 0x6930, 0xE5AB, 0x693D, 0xE6CB, 0x693F, 0xF5F1, 0x694A, 0xE5C5, + 0x6953, 0xF9A3, 0x6954, 0xE0DB, 0x6955, 0xF6EB, 0x6957, 0xCBF1, + 0x6959, 0xD9EA, 0x695A, 0xF5A2, 0x695E, 0xD7D1, 0x6960, 0xD1F8, + 0x6961, 0xEAF8, 0x6962, 0xEAF9, 0x6963, 0xDAB3, 0x6968, 0xEFDF, + 0x696B, 0xF1EF, 0x696D, 0xE5F6, 0x696E, 0xEEBF, 0x696F, 0xE2E4, + 0x6975, 0xD0BF, 0x6977, 0xFAAC, 0x6978, 0xF5D1, 0x6979, 0xE7B3, + 0x6995, 0xE9BE, 0x699B, 0xF2CE, 0x699C, 0xDBB4, 0x69A5, 0xFCCE, + 0x69A7, 0xDDEE, 0x69AE, 0xE7B4, 0x69B4, 0xD7B4, 0x69BB, 0xF7B4, + 0x69C1, 0xCDBE, 0x69C3, 0xDAE9, 0x69CB, 0xCFB0, 0x69CC, 0xF7D9, + 0x69CD, 0xF3E6, 0x69D0, 0xCED9, 0x69E8, 0xCEAA, 0x69EA, 0xCBC8, + 0x69FB, 0xD0A7, 0x69FD, 0xF0CB, 0x69FF, 0xD0C7, 0x6A02, 0xE4C5, + 0x6A0A, 0xDBE0, 0x6A11, 0xD5DA, 0x6A13, 0xD7A7, 0x6A17, 0xEEC0, + 0x6A19, 0xF8F6, 0x6A1E, 0xF5D2, 0x6A1F, 0xEDE9, 0x6A21, 0xD9BC, + 0x6A23, 0xE5C6, 0x6A35, 0xF5A3, 0x6A38, 0xDAD4, 0x6A39, 0xE2A7, + 0x6A3A, 0xFBFC, 0x6A3D, 0xF1DC, 0x6A44, 0xCAF4, 0x6A48, 0xE8FA, + 0x6A4B, 0xCEE9, 0x6A52, 0xE9F8, 0x6A53, 0xE2E5, 0x6A58, 0xD0B9, + 0x6A59, 0xD4F2, 0x6A5F, 0xD1A6, 0x6A61, 0xDFCE, 0x6A6B, 0xFCF4, + 0x6A80, 0xD3AA, 0x6A84, 0xCCAC, 0x6A89, 0xEFE0, 0x6A8D, 0xE5E5, + 0x6A8E, 0xD0D5, 0x6A97, 0xDBFC, 0x6A9C, 0xFCE6, 0x6AA2, 0xCBFE, + 0x6AA3, 0xEDEA, 0x6AB3, 0xDEB1, 0x6ABB, 0xF9E3, 0x6AC2, 0xD4A2, + 0x6AC3, 0xCFF6, 0x6AD3, 0xD6D0, 0x6ADA, 0xD5EA, 0x6ADB, 0xF1EE, + 0x6AF6, 0xFACB, 0x6AFB, 0xE5A1, 0x6B04, 0xD5B1, 0x6B0A, 0xCFED, + 0x6B0C, 0xEDEB, 0x6B12, 0xD5B2, 0x6B16, 0xD5BC, 0x6B20, 0xFDE2, + 0x6B21, 0xF3AD, 0x6B23, 0xFDDB, 0x6B32, 0xE9B0, 0x6B3A, 0xD1A7, + 0x6B3D, 0xFDE3, 0x6B3E, 0xCEB3, 0x6B46, 0xFDE4, 0x6B47, 0xFACE, + 0x6B4C, 0xCAB0, 0x6B4E, 0xF7A7, 0x6B50, 0xCFB1, 0x6B5F, 0xE6A2, + 0x6B61, 0xFCB6, 0x6B62, 0xF2AD, 0x6B63, 0xEFE1, 0x6B64, 0xF3AE, + 0x6B65, 0xDCC6, 0x6B66, 0xD9EB, 0x6B6A, 0xE8E0, 0x6B72, 0xE1A8, + 0x6B77, 0xD5F6, 0x6B78, 0xCFFD, 0x6B7B, 0xDEDD, 0x6B7F, 0xD9D1, + 0x6B83, 0xE4EA, 0x6B84, 0xF2CF, 0x6B86, 0xF7BF, 0x6B89, 0xE2E6, + 0x6B8A, 0xE2A8, 0x6B96, 0xE3D6, 0x6B98, 0xEDD1, 0x6B9E, 0xE9F9, + 0x6BAE, 0xD6B1, 0x6BAF, 0xDEB2, 0x6BB2, 0xE0E8, 0x6BB5, 0xD3AB, + 0x6BB7, 0xEBDC, 0x6BBA, 0xDFAF, 0x6BBC, 0xCAC3, 0x6BBF, 0xEEFC, + 0x6BC1, 0xFDC3, 0x6BC5, 0xEBF6, 0x6BC6, 0xCFB2, 0x6BCB, 0xD9EC, + 0x6BCD, 0xD9BD, 0x6BCF, 0xD8DF, 0x6BD2, 0xD4B8, 0x6BD3, 0xEBBE, + 0x6BD4, 0xDDEF, 0x6BD6, 0xDDF0, 0x6BD7, 0xDDF1, 0x6BD8, 0xDDF2, + 0x6BDB, 0xD9BE, 0x6BEB, 0xFBC6, 0x6BEC, 0xCFB3, 0x6C08, 0xEEFD, + 0x6C0F, 0xE4AB, 0x6C11, 0xDAC5, 0x6C13, 0xD8EC, 0x6C23, 0xD1A8, + 0x6C34, 0xE2A9, 0x6C37, 0xDEBC, 0x6C38, 0xE7B5, 0x6C3E, 0xDBF0, + 0x6C40, 0xEFE2, 0x6C41, 0xF1F0, 0x6C42, 0xCFB4, 0x6C4E, 0xDBF1, + 0x6C50, 0xE0B1, 0x6C55, 0xDFA5, 0x6C57, 0xF9D2, 0x6C5A, 0xE7FD, + 0x6C5D, 0xE6A3, 0x6C5E, 0xFBF1, 0x6C5F, 0xCBB0, 0x6C60, 0xF2AE, + 0x6C68, 0xCDE7, 0x6C6A, 0xE8DC, 0x6C6D, 0xE7D7, 0x6C70, 0xF7C0, + 0x6C72, 0xD0E3, 0x6C76, 0xDAA1, 0x6C7A, 0xCCBD, 0x6C7D, 0xD1A9, + 0x6C7E, 0xDDCC, 0x6C81, 0xE3FE, 0x6C82, 0xD1AA, 0x6C83, 0xE8AA, + 0x6C85, 0xEAB6, 0x6C86, 0xF9FA, 0x6C87, 0xE6CC, 0x6C88, 0xF6D8, + 0x6C8C, 0xD4C7, 0x6C90, 0xD9CB, 0x6C92, 0xD9D2, 0x6C93, 0xD3CB, + 0x6C94, 0xD8F7, 0x6C95, 0xDAA9, 0x6C96, 0xF5F8, 0x6C99, 0xDEDE, + 0x6C9A, 0xF2AF, 0x6C9B, 0xF8A9, 0x6CAB, 0xD8C8, 0x6CAE, 0xEEC1, + 0x6CB3, 0xF9C1, 0x6CB8, 0xDDF3, 0x6CB9, 0xEAFA, 0x6CBB, 0xF6BD, + 0x6CBC, 0xE1BB, 0x6CBD, 0xCDBF, 0x6CBE, 0xF4D4, 0x6CBF, 0xE6CD, + 0x6CC1, 0xFCCF, 0x6CC2, 0xFBA2, 0x6CC4, 0xE0DC, 0x6CC9, 0xF4BB, + 0x6CCA, 0xDAD5, 0x6CCC, 0xF9B2, 0x6CD3, 0xFBF2, 0x6CD5, 0xDBF6, + 0x6CD7, 0xDEDF, 0x6CDB, 0xDBF2, 0x6CE1, 0xF8DC, 0x6CE2, 0xF7EE, + 0x6CE3, 0xEBE8, 0x6CE5, 0xD2FA, 0x6CE8, 0xF1BC, 0x6CEB, 0xFADA, + 0x6CEE, 0xDAEA, 0x6CEF, 0xDAC6, 0x6CF0, 0xF7C1, 0x6CF3, 0xE7B6, + 0x6D0B, 0xE5C7, 0x6D0C, 0xD6AC, 0x6D11, 0xDCC7, 0x6D17, 0xE1A9, + 0x6D19, 0xE2AA, 0x6D1B, 0xD5A6, 0x6D1E, 0xD4D7, 0x6D25, 0xF2D0, + 0x6D27, 0xEAFB, 0x6D29, 0xE0DD, 0x6D2A, 0xFBF3, 0x6D32, 0xF1BD, + 0x6D35, 0xE2E7, 0x6D36, 0xFDD7, 0x6D38, 0xCEC8, 0x6D39, 0xEAB7, + 0x6D3B, 0xFCC0, 0x6D3D, 0xFDE7, 0x6D3E, 0xF7EF, 0x6D41, 0xD7B5, + 0x6D59, 0xEFBA, 0x6D5A, 0xF1DD, 0x6D5C, 0xDEB3, 0x6D63, 0xE8CB, + 0x6D66, 0xF8DD, 0x6D69, 0xFBC7, 0x6D6A, 0xD5C8, 0x6D6C, 0xD7DF, + 0x6D6E, 0xDDA9, 0x6D74, 0xE9B1, 0x6D77, 0xFAAD, 0x6D78, 0xF6D9, + 0x6D79, 0xFAF4, 0x6D7F, 0xF8AA, 0x6D85, 0xE6EE, 0x6D87, 0xCCDC, + 0x6D88, 0xE1BC, 0x6D89, 0xE0EF, 0x6D8C, 0xE9BF, 0x6D8D, 0xFCFD, + 0x6D8E, 0xE6CE, 0x6D91, 0xE1D7, 0x6D93, 0xE6CF, 0x6D95, 0xF4F1, + 0x6DAF, 0xE4F3, 0x6DB2, 0xE4FB, 0x6DB5, 0xF9E4, 0x6DC0, 0xEFE3, + 0x6DC3, 0xCFEE, 0x6DC4, 0xF6BE, 0x6DC5, 0xE0B2, 0x6DC6, 0xFCFE, + 0x6DC7, 0xD1AB, 0x6DCB, 0xD7FA, 0x6DCF, 0xFBC8, 0x6DD1, 0xE2D7, + 0x6DD8, 0xD4A3, 0x6DD9, 0xF0F8, 0x6DDA, 0xD7A8, 0x6DDE, 0xE1E7, + 0x6DE1, 0xD3BF, 0x6DE8, 0xEFE4, 0x6DEA, 0xD7C5, 0x6DEB, 0xEBE2, + 0x6DEE, 0xFCE7, 0x6DF1, 0xE4A2, 0x6DF3, 0xE2E8, 0x6DF5, 0xE6D0, + 0x6DF7, 0xFBE8, 0x6DF8, 0xF4E8, 0x6DF9, 0xE5F4, 0x6DFA, 0xF4BC, + 0x6DFB, 0xF4D5, 0x6E17, 0xDFB6, 0x6E19, 0xFCB9, 0x6E1A, 0xEEC2, + 0x6E1B, 0xCAF5, 0x6E1F, 0xEFE5, 0x6E20, 0xCBE2, 0x6E21, 0xD4A4, + 0x6E23, 0xDEE0, 0x6E24, 0xDAFD, 0x6E25, 0xE4C6, 0x6E26, 0xE8BE, + 0x6E2B, 0xE0DE, 0x6E2C, 0xF6B4, 0x6E2D, 0xEAD2, 0x6E2F, 0xF9FB, + 0x6E32, 0xE0C2, 0x6E34, 0xCAE4, 0x6E36, 0xE7B7, 0x6E38, 0xEAFD, + 0x6E3A, 0xD9DD, 0x6E3C, 0xDAB4, 0x6E3D, 0xEEAA, 0x6E3E, 0xFBE9, + 0x6E43, 0xDBCB, 0x6E44, 0xDAB5, 0x6E4A, 0xF1BE, 0x6E4D, 0xD3AC, + 0x6E56, 0xFBC9, 0x6E58, 0xDFCF, 0x6E5B, 0xD3C0, 0x6E5C, 0xE3D7, + 0x6E5E, 0xEFE6, 0x6E5F, 0xFCD0, 0x6E67, 0xE9C0, 0x6E6B, 0xF5D3, + 0x6E6E, 0xECDC, 0x6E6F, 0xF7B7, 0x6E72, 0xEAB8, 0x6E73, 0xD1F9, + 0x6E7A, 0xDCC8, 0x6E90, 0xEAB9, 0x6E96, 0xF1DE, 0x6E9C, 0xD7B6, + 0x6E9D, 0xCFB5, 0x6E9F, 0xD9A8, 0x6EA2, 0xECEE, 0x6EA5, 0xDDAA, + 0x6EAA, 0xCDA2, 0x6EAB, 0xE8AE, 0x6EAF, 0xE1BD, 0x6EB1, 0xF2D1, + 0x6EB6, 0xE9C1, 0x6EBA, 0xD2FC, 0x6EC2, 0xDBB5, 0x6EC4, 0xF3E7, + 0x6EC5, 0xD8FE, 0x6EC9, 0xFCD1, 0x6ECB, 0xEDB2, 0x6ECC, 0xF4AF, + 0x6ECE, 0xFBA3, 0x6ED1, 0xFCC1, 0x6ED3, 0xEEAB, 0x6ED4, 0xD4A5, + 0x6EEF, 0xF4F2, 0x6EF4, 0xEED9, 0x6EF8, 0xFBCA, 0x6EFE, 0xCDE3, + 0x6EFF, 0xD8BB, 0x6F01, 0xE5DB, 0x6F02, 0xF8F7, 0x6F06, 0xF6D4, + 0x6F0F, 0xD7A9, 0x6F11, 0xCBC9, 0x6F14, 0xE6D1, 0x6F15, 0xF0CC, + 0x6F20, 0xD8AE, 0x6F22, 0xF9D3, 0x6F23, 0xD5FE, 0x6F2B, 0xD8BC, + 0x6F2C, 0xF2B0, 0x6F31, 0xE2AB, 0x6F32, 0xF3E8, 0x6F38, 0xEFC2, + 0x6F3F, 0xEDEC, 0x6F41, 0xE7B8, 0x6F51, 0xDAFE, 0x6F54, 0xCCBE, + 0x6F57, 0xF2FC, 0x6F58, 0xDAEB, 0x6F5A, 0xE2D8, 0x6F5B, 0xEDD6, + 0x6F5E, 0xD6D1, 0x6F5F, 0xE0B3, 0x6F62, 0xFCD2, 0x6F64, 0xEBC8, + 0x6F6D, 0xD3C1, 0x6F6E, 0xF0CD, 0x6F70, 0xCFF7, 0x6F7A, 0xEDD2, + 0x6F7C, 0xD4D8, 0x6F7D, 0xDCC9, 0x6F7E, 0xD7F1, 0x6F81, 0xDFBB, + 0x6F84, 0xF3A5, 0x6F88, 0xF4CD, 0x6F8D, 0xF1BF, 0x6F8E, 0xF8B1, + 0x6F90, 0xE9FA, 0x6F94, 0xFBCB, 0x6F97, 0xCAD5, 0x6FA3, 0xF9D4, + 0x6FA4, 0xF7CA, 0x6FA7, 0xD6C8, 0x6FAE, 0xFCE8, 0x6FAF, 0xF3BD, + 0x6FB1, 0xEEFE, 0x6FB3, 0xE7FE, 0x6FB9, 0xD3C2, 0x6FBE, 0xD3B6, + 0x6FC0, 0xCCAD, 0x6FC1, 0xF6FA, 0x6FC2, 0xD6B2, 0x6FC3, 0xD2D8, + 0x6FCA, 0xE7D8, 0x6FD5, 0xE3A5, 0x6FDA, 0xE7B9, 0x6FDF, 0xF0AD, + 0x6FE0, 0xFBCC, 0x6FE1, 0xEBA1, 0x6FE4, 0xD4A6, 0x6FE9, 0xFBCD, + 0x6FEB, 0xD5BD, 0x6FEC, 0xF1DF, 0x6FEF, 0xF6FB, 0x6FF1, 0xDEB4, + 0x6FFE, 0xD5EB, 0x7001, 0xE5C8, 0x7005, 0xFBA4, 0x7006, 0xD4B9, + 0x7009, 0xDEE1, 0x700B, 0xE4A3, 0x700F, 0xD7B7, 0x7011, 0xF8EE, + 0x7015, 0xDEB5, 0x7018, 0xD6D2, 0x701A, 0xF9D5, 0x701B, 0xE7BA, + 0x701C, 0xEBD5, 0x701D, 0xD5F7, 0x701E, 0xEFE7, 0x701F, 0xE1BE, + 0x7023, 0xFAAE, 0x7027, 0xD6E9, 0x7028, 0xD6EE, 0x702F, 0xE7BB, + 0x7037, 0xECCB, 0x703E, 0xD5B3, 0x704C, 0xCEB4, 0x7050, 0xFBA5, + 0x7051, 0xE1EE, 0x7058, 0xF7A8, 0x705D, 0xFBCE, 0x7063, 0xD8BD, + 0x706B, 0xFBFD, 0x7070, 0xFCE9, 0x7078, 0xCFB6, 0x707C, 0xEDC7, + 0x707D, 0xEEAC, 0x7085, 0xCCDD, 0x708A, 0xF6A7, 0x708E, 0xE6FA, + 0x7092, 0xF5A4, 0x7098, 0xFDDC, 0x7099, 0xEDB3, 0x709A, 0xCEC9, + 0x70A1, 0xEFE8, 0x70A4, 0xE1BF, 0x70AB, 0xFADB, 0x70AC, 0xCBE3, + 0x70AD, 0xF7A9, 0x70AF, 0xFBA6, 0x70B3, 0xDCB9, 0x70B7, 0xF1C0, + 0x70B8, 0xEDC8, 0x70B9, 0xEFC3, 0x70C8, 0xD6AD, 0x70CB, 0xFDCE, + 0x70CF, 0xE8A1, 0x70D8, 0xFBF4, 0x70D9, 0xD5A7, 0x70DD, 0xF1F6, + 0x70DF, 0xE6D3, 0x70F1, 0xCCDE, 0x70F9, 0xF8B2, 0x70FD, 0xDCEB, + 0x7104, 0xFDB6, 0x7109, 0xE5EA, 0x710C, 0xF1E0, 0x7119, 0xDBCC, + 0x711A, 0xDDCD, 0x711E, 0xD4C8, 0x7121, 0xD9ED, 0x7126, 0xF5A5, + 0x7130, 0xE6FB, 0x7136, 0xE6D4, 0x7147, 0xFDC8, 0x7149, 0xD6A1, + 0x714A, 0xFDBF, 0x714C, 0xFCD3, 0x714E, 0xEFA1, 0x7150, 0xE7BC, + 0x7156, 0xD1EE, 0x7159, 0xE6D5, 0x715C, 0xE9F2, 0x715E, 0xDFB0, + 0x7164, 0xD8E0, 0x7165, 0xFCBA, 0x7166, 0xFDAF, 0x7167, 0xF0CE, + 0x7169, 0xDBE1, 0x716C, 0xE5C9, 0x716E, 0xEDB4, 0x717D, 0xE0C3, + 0x7184, 0xE3D8, 0x7189, 0xE9FB, 0x718A, 0xEAA8, 0x718F, 0xFDB7, + 0x7192, 0xFBA7, 0x7194, 0xE9C2, 0x7199, 0xFDF7, 0x719F, 0xE2D9, + 0x71A2, 0xDCEC, 0x71AC, 0xE8A2, 0x71B1, 0xE6F0, 0x71B9, 0xFDF8, + 0x71BA, 0xFDF9, 0x71BE, 0xF6BF, 0x71C1, 0xE7A7, 0x71C3, 0xE6D7, + 0x71C8, 0xD4F3, 0x71C9, 0xD4C9, 0x71CE, 0xD6FA, 0x71D0, 0xD7F2, + 0x71D2, 0xE1C0, 0x71D4, 0xDBE2, 0x71D5, 0xE6D8, 0x71DF, 0xE7BD, + 0x71E5, 0xF0CF, 0x71E6, 0xF3BE, 0x71E7, 0xE2AC, 0x71ED, 0xF5B7, + 0x71EE, 0xE0F0, 0x71FB, 0xFDB8, 0x71FC, 0xE3E8, 0x71FE, 0xD4A7, + 0x71FF, 0xE8FC, 0x7200, 0xFAD2, 0x7206, 0xF8EF, 0x7210, 0xD6D3, + 0x721B, 0xD5B4, 0x722A, 0xF0D0, 0x722C, 0xF7F0, 0x722D, 0xEEB3, + 0x7230, 0xEABA, 0x7232, 0xEAD3, 0x7235, 0xEDC9, 0x7236, 0xDDAB, + 0x723A, 0xE5AC, 0x723B, 0xFDA1, 0x723D, 0xDFD0, 0x723E, 0xECB3, + 0x7240, 0xDFD1, 0x7246, 0xEDED, 0x7247, 0xF8B8, 0x7248, 0xF7FA, + 0x724C, 0xF8AB, 0x7252, 0xF4E0, 0x7258, 0xD4BA, 0x7259, 0xE4B3, + 0x725B, 0xE9DA, 0x725D, 0xDEB6, 0x725F, 0xD9BF, 0x7261, 0xD9C0, + 0x7262, 0xD6EF, 0x7267, 0xD9CC, 0x7269, 0xDAAA, 0x7272, 0xDFE5, + 0x7279, 0xF7E5, 0x727D, 0xCCB2, 0x7280, 0xDFF9, 0x7281, 0xD7E0, + 0x72A2, 0xD4BB, 0x72A7, 0xFDFA, 0x72AC, 0xCCB3, 0x72AF, 0xDBF3, + 0x72C0, 0xDFD2, 0x72C2, 0xCECA, 0x72C4, 0xEEDA, 0x72CE, 0xE4E4, + 0x72D0, 0xFBCF, 0x72D7, 0xCFB7, 0x72D9, 0xEEC3, 0x72E1, 0xCEEA, + 0x72E9, 0xE2AD, 0x72F8, 0xD7E1, 0x72F9, 0xFAF5, 0x72FC, 0xD5C9, + 0x72FD, 0xF8AC, 0x730A, 0xE7D9, 0x7316, 0xF3E9, 0x731B, 0xD8ED, + 0x731C, 0xE3C4, 0x731D, 0xF0F1, 0x7325, 0xE8E5, 0x7329, 0xE0FA, + 0x732A, 0xEEC4, 0x732B, 0xD9DE, 0x7336, 0xEBA2, 0x7337, 0xEBA3, + 0x733E, 0xFCC2, 0x733F, 0xEABB, 0x7344, 0xE8AB, 0x7345, 0xDEE2, + 0x7350, 0xEDEF, 0x7352, 0xE8A3, 0x7357, 0xCFF1, 0x7368, 0xD4BC, + 0x736A, 0xFCEA, 0x7370, 0xE7BE, 0x7372, 0xFCF2, 0x7375, 0xD6B4, + 0x7378, 0xE2AE, 0x737A, 0xD3B7, 0x737B, 0xFACC, 0x7384, 0xFADC, + 0x7386, 0xEDB5, 0x7387, 0xE1E3, 0x7389, 0xE8AC, 0x738B, 0xE8DD, + 0x738E, 0xEFE9, 0x7394, 0xF4BD, 0x7396, 0xCFB8, 0x7397, 0xE9DB, + 0x7398, 0xD1AC, 0x739F, 0xDAC7, 0x73A7, 0xEBC9, 0x73A9, 0xE8CC, + 0x73AD, 0xDEB7, 0x73B2, 0xD6BC, 0x73B3, 0xD3E5, 0x73B9, 0xFADD, + 0x73C0, 0xDAD6, 0x73C2, 0xCAB1, 0x73C9, 0xDAC8, 0x73CA, 0xDFA6, + 0x73CC, 0xF9B3, 0x73CD, 0xF2D2, 0x73CF, 0xCAC4, 0x73D6, 0xCECB, + 0x73D9, 0xCDF5, 0x73DD, 0xFDB0, 0x73DE, 0xD5A8, 0x73E0, 0xF1C1, + 0x73E3, 0xE2E9, 0x73E4, 0xDCCA, 0x73E5, 0xECB4, 0x73E6, 0xFAC0, + 0x73E9, 0xFBA8, 0x73EA, 0xD0A8, 0x73ED, 0xDAEC, 0x73F7, 0xD9EE, + 0x73F9, 0xE0FB, 0x73FD, 0xEFEA, 0x73FE, 0xFADE, 0x7401, 0xE0C4, + 0x7403, 0xCFB9, 0x7405, 0xD5CA, 0x7406, 0xD7E2, 0x7407, 0xE2AF, + 0x7409, 0xD7B8, 0x7413, 0xE8CD, 0x741B, 0xF6DA, 0x7420, 0xEFA2, + 0x7421, 0xE2DA, 0x7422, 0xF6FC, 0x7425, 0xFBD0, 0x7426, 0xD1AD, + 0x7428, 0xCDE4, 0x742A, 0xD1AE, 0x742B, 0xDCED, 0x742C, 0xE8CE, + 0x742E, 0xF0F9, 0x742F, 0xCEB5, 0x7430, 0xE6FC, 0x7433, 0xD7FB, + 0x7434, 0xD0D6, 0x7435, 0xDDF5, 0x7436, 0xF7F1, 0x7438, 0xF6FD, + 0x743A, 0xDBF7, 0x743F, 0xFBEA, 0x7440, 0xE9DC, 0x7441, 0xD9C1, + 0x7443, 0xF5F2, 0x7444, 0xE0C5, 0x744B, 0xEAD4, 0x7455, 0xF9C2, + 0x7457, 0xEABC, 0x7459, 0xD2C5, 0x745A, 0xFBD1, 0x745B, 0xE7C0, + 0x745C, 0xEBA5, 0x745E, 0xDFFA, 0x745F, 0xE3A2, 0x7460, 0xD7B9, + 0x7462, 0xE9C3, 0x7464, 0xE8FD, 0x7465, 0xE8AF, 0x7468, 0xF2D3, + 0x7469, 0xFBA9, 0x746A, 0xD8A5, 0x746F, 0xD5CB, 0x747E, 0xD0C8, + 0x7482, 0xD1AF, 0x7483, 0xD7E3, 0x7487, 0xE0C6, 0x7489, 0xD6A2, + 0x748B, 0xEDF0, 0x7498, 0xD7F3, 0x749C, 0xFCD4, 0x749E, 0xDAD7, + 0x749F, 0xCCDF, 0x74A1, 0xF2D4, 0x74A3, 0xD1B0, 0x74A5, 0xCCE0, + 0x74A7, 0xDBFD, 0x74A8, 0xF3BF, 0x74AA, 0xF0D1, 0x74B0, 0xFCBB, + 0x74B2, 0xE2B0, 0x74B5, 0xE6A5, 0x74B9, 0xE2DB, 0x74BD, 0xDFDE, + 0x74BF, 0xE0C7, 0x74C6, 0xF2EF, 0x74CA, 0xCCE1, 0x74CF, 0xD6EA, + 0x74D4, 0xE7C2, 0x74D8, 0xCEB6, 0x74DA, 0xF3C0, 0x74DC, 0xCDFE, + 0x74E0, 0xFBD2, 0x74E2, 0xF8F8, 0x74E3, 0xF7FB, 0x74E6, 0xE8BF, + 0x74EE, 0xE8B7, 0x74F7, 0xEDB6, 0x7501, 0xDCBA, 0x7504, 0xCCB4, + 0x7511, 0xF1F7, 0x7515, 0xE8B8, 0x7518, 0xCAF6, 0x751A, 0xE4A4, + 0x751B, 0xF4D6, 0x751F, 0xDFE6, 0x7523, 0xDFA7, 0x7525, 0xDFE7, + 0x7526, 0xE1C1, 0x7528, 0xE9C4, 0x752B, 0xDCCB, 0x752C, 0xE9C5, + 0x7530, 0xEFA3, 0x7531, 0xEBA6, 0x7532, 0xCBA3, 0x7533, 0xE3E9, + 0x7537, 0xD1FB, 0x7538, 0xEFA4, 0x753A, 0xEFEB, 0x7547, 0xD0B4, + 0x754C, 0xCDA3, 0x754F, 0xE8E6, 0x7551, 0xEFA5, 0x7553, 0xD3CC, + 0x7554, 0xDAED, 0x7559, 0xD7BA, 0x755B, 0xF2D5, 0x755C, 0xF5E5, + 0x755D, 0xD9EF, 0x7562, 0xF9B4, 0x7565, 0xD5D4, 0x7566, 0xFDCF, + 0x756A, 0xDBE3, 0x756F, 0xF1E1, 0x7570, 0xECB6, 0x7575, 0xFBFE, + 0x7576, 0xD3D7, 0x7578, 0xD1B1, 0x757A, 0xCBB1, 0x757F, 0xD1B2, + 0x7586, 0xCBB2, 0x7587, 0xF1C2, 0x758A, 0xF4E1, 0x758B, 0xF9B5, + 0x758E, 0xE1C3, 0x758F, 0xE1C2, 0x7591, 0xEBF7, 0x759D, 0xDFA8, + 0x75A5, 0xCBCA, 0x75AB, 0xE6B9, 0x75B1, 0xF8DE, 0x75B2, 0xF9AA, + 0x75B3, 0xCAF7, 0x75B5, 0xEDB7, 0x75B8, 0xD3B8, 0x75B9, 0xF2D6, + 0x75BC, 0xD4D9, 0x75BD, 0xEEC5, 0x75BE, 0xF2F0, 0x75C2, 0xCAB2, + 0x75C5, 0xDCBB, 0x75C7, 0xF1F8, 0x75CD, 0xECB7, 0x75D2, 0xE5CA, + 0x75D4, 0xF6C0, 0x75D5, 0xFDDD, 0x75D8, 0xD4E3, 0x75D9, 0xCCE2, + 0x75DB, 0xF7D4, 0x75E2, 0xD7E5, 0x75F0, 0xD3C3, 0x75F2, 0xD8A6, + 0x75F4, 0xF6C1, 0x75FA, 0xDDF6, 0x75FC, 0xCDC0, 0x7600, 0xE5DC, + 0x760D, 0xE5CB, 0x7619, 0xE1C4, 0x761F, 0xE8B0, 0x7620, 0xF4B0, + 0x7621, 0xF3EA, 0x7622, 0xDAEE, 0x7624, 0xD7BB, 0x7626, 0xE2B1, + 0x763B, 0xD7AA, 0x7642, 0xD6FB, 0x764C, 0xE4DF, 0x764E, 0xCAD6, + 0x7652, 0xEBA8, 0x7656, 0xDBFE, 0x7661, 0xF6C2, 0x7664, 0xEFBB, + 0x7669, 0xD4FD, 0x766C, 0xE0C8, 0x7670, 0xE8B9, 0x7672, 0xEFA6, + 0x7678, 0xCDA4, 0x767B, 0xD4F4, 0x767C, 0xDBA1, 0x767D, 0xDBDC, + 0x767E, 0xDBDD, 0x7684, 0xEEDC, 0x7686, 0xCBCB, 0x7687, 0xFCD5, + 0x768E, 0xCEEB, 0x7690, 0xCDC1, 0x7693, 0xFBD3, 0x76AE, 0xF9AB, + 0x76BA, 0xF5D4, 0x76BF, 0xD9A9, 0x76C2, 0xE9DD, 0x76C3, 0xDBCD, + 0x76C6, 0xDDCE, 0x76C8, 0xE7C3, 0x76CA, 0xECCC, 0x76D2, 0xF9EC, + 0x76D6, 0xCBCC, 0x76DB, 0xE0FC, 0x76DC, 0xD4A8, 0x76DE, 0xEDD3, + 0x76DF, 0xD8EF, 0x76E1, 0xF2D7, 0x76E3, 0xCAF8, 0x76E4, 0xDAEF, + 0x76E7, 0xD6D4, 0x76EE, 0xD9CD, 0x76F2, 0xD8EE, 0x76F4, 0xF2C1, + 0x76F8, 0xDFD3, 0x76FC, 0xDAF0, 0x76FE, 0xE2EA, 0x7701, 0xE0FD, + 0x7704, 0xD8F8, 0x7708, 0xF7AF, 0x7709, 0xDAB6, 0x770B, 0xCAD7, + 0x771E, 0xF2D8, 0x7720, 0xD8F9, 0x7729, 0xFADF, 0x7737, 0xCFEF, + 0x7738, 0xD9C2, 0x773A, 0xF0D2, 0x773C, 0xE4D1, 0x7740, 0xF3B7, + 0x774D, 0xFAE0, 0x775B, 0xEFEC, 0x7761, 0xE2B2, 0x7763, 0xD4BD, + 0x7766, 0xD9CE, 0x776B, 0xF4E2, 0x7779, 0xD4A9, 0x777E, 0xCDC2, + 0x777F, 0xE7DA, 0x778B, 0xF2D9, 0x7791, 0xD9AA, 0x779E, 0xD8BE, + 0x77A5, 0xDCAD, 0x77AC, 0xE2EB, 0x77AD, 0xD6FC, 0x77B0, 0xCAF9, + 0x77B3, 0xD4DA, 0x77BB, 0xF4D7, 0x77BC, 0xCCA1, 0x77BF, 0xCFBA, + 0x77D7, 0xF5B8, 0x77DB, 0xD9C3, 0x77DC, 0xD0E8, 0x77E2, 0xE3C5, + 0x77E3, 0xEBF8, 0x77E5, 0xF2B1, 0x77E9, 0xCFBB, 0x77ED, 0xD3AD, + 0x77EE, 0xE8E1, 0x77EF, 0xCEEC, 0x77F3, 0xE0B4, 0x7802, 0xDEE3, + 0x7812, 0xDDF7, 0x7825, 0xF2B2, 0x7826, 0xF3F6, 0x7827, 0xF6DB, + 0x782C, 0xD7FE, 0x7832, 0xF8DF, 0x7834, 0xF7F2, 0x7845, 0xD0A9, + 0x784F, 0xE6DA, 0x785D, 0xF5A6, 0x786B, 0xD7BC, 0x786C, 0xCCE3, + 0x786F, 0xE6DB, 0x787C, 0xDDDD, 0x7881, 0xD1B3, 0x7887, 0xEFED, + 0x788C, 0xD6DE, 0x788D, 0xE4F4, 0x788E, 0xE1EF, 0x7891, 0xDDF8, + 0x7897, 0xE8CF, 0x78A3, 0xCAE5, 0x78A7, 0xDCA1, 0x78A9, 0xE0B5, + 0x78BA, 0xFCAC, 0x78BB, 0xFCAD, 0x78BC, 0xD8A7, 0x78C1, 0xEDB8, + 0x78C5, 0xDBB6, 0x78CA, 0xD6F0, 0x78CB, 0xF3AF, 0x78CE, 0xCDA5, + 0x78D0, 0xDAF1, 0x78E8, 0xD8A8, 0x78EC, 0xCCE4, 0x78EF, 0xD1B4, + 0x78F5, 0xCAD8, 0x78FB, 0xDAF2, 0x7901, 0xF5A7, 0x790E, 0xF5A8, + 0x7916, 0xE6A6, 0x792A, 0xD5EC, 0x792B, 0xD5F8, 0x792C, 0xDAF3, + 0x793A, 0xE3C6, 0x793E, 0xDEE4, 0x7940, 0xDEE5, 0x7941, 0xD1B5, + 0x7947, 0xD1B6, 0x7948, 0xD1B7, 0x7949, 0xF2B3, 0x7950, 0xE9DE, + 0x7956, 0xF0D3, 0x7957, 0xF2B4, 0x795A, 0xF0D4, 0x795B, 0xCBE4, + 0x795C, 0xFBD4, 0x795D, 0xF5E6, 0x795E, 0xE3EA, 0x7960, 0xDEE6, + 0x7965, 0xDFD4, 0x7968, 0xF8F9, 0x796D, 0xF0AE, 0x797A, 0xD1B8, + 0x797F, 0xD6DF, 0x7981, 0xD0D7, 0x798D, 0xFCA1, 0x798E, 0xEFEE, + 0x798F, 0xDCD8, 0x7991, 0xE9DF, 0x79A6, 0xE5DD, 0x79A7, 0xFDFB, + 0x79AA, 0xE0C9, 0x79AE, 0xD6C9, 0x79B1, 0xD4AA, 0x79B3, 0xE5CC, + 0x79B9, 0xE9E0, 0x79BD, 0xD0D8, 0x79BE, 0xFCA2, 0x79BF, 0xD4BE, + 0x79C0, 0xE2B3, 0x79C1, 0xDEE7, 0x79C9, 0xDCBC, 0x79CA, 0xD2B6, + 0x79CB, 0xF5D5, 0x79D1, 0xCEA1, 0x79D2, 0xF5A9, 0x79D5, 0xDDF9, + 0x79D8, 0xDDFA, 0x79DF, 0xF0D5, 0x79E4, 0xF6DF, 0x79E6, 0xF2DA, + 0x79E7, 0xE4EB, 0x79E9, 0xF2F1, 0x79FB, 0xECB9, 0x7A00, 0xFDFC, + 0x7A05, 0xE1AA, 0x7A08, 0xCAD9, 0x7A0B, 0xEFEF, 0x7A0D, 0xF5AA, + 0x7A14, 0xECF9, 0x7A17, 0xF8AD, 0x7A19, 0xF2C2, 0x7A1A, 0xF6C3, + 0x7A1C, 0xD7D2, 0x7A1F, 0xF9A2, 0x7A20, 0xF0D6, 0x7A2E, 0xF0FA, + 0x7A31, 0xF6E0, 0x7A36, 0xE9F3, 0x7A37, 0xF2C3, 0x7A3B, 0xD4AB, + 0x7A3C, 0xCAB3, 0x7A3D, 0xCDA6, 0x7A3F, 0xCDC3, 0x7A40, 0xCDDA, + 0x7A46, 0xD9CF, 0x7A49, 0xF6C4, 0x7A4D, 0xEEDD, 0x7A4E, 0xE7C4, + 0x7A57, 0xE2B4, 0x7A61, 0xDFE2, 0x7A62, 0xE7DB, 0x7A69, 0xE8B1, + 0x7A6B, 0xFCAE, 0x7A70, 0xE5CD, 0x7A74, 0xFAEB, 0x7A76, 0xCFBC, + 0x7A79, 0xCFE2, 0x7A7A, 0xCDF6, 0x7A7D, 0xEFF0, 0x7A7F, 0xF4BE, + 0x7A81, 0xD4CD, 0x7A84, 0xF3B8, 0x7A88, 0xE9A1, 0x7A92, 0xF2F2, + 0x7A93, 0xF3EB, 0x7A95, 0xF0D7, 0x7A98, 0xCFD7, 0x7A9F, 0xCFDF, + 0x7AA9, 0xE8C0, 0x7AAA, 0xE8C1, 0x7AAE, 0xCFE3, 0x7AAF, 0xE9A2, + 0x7ABA, 0xD0AA, 0x7AC4, 0xF3C1, 0x7AC5, 0xD0AB, 0x7AC7, 0xD4E4, + 0x7ACA, 0xEFBC, 0x7ACB, 0xD8A1, 0x7AD7, 0xD9DF, 0x7AD9, 0xF3D7, + 0x7ADD, 0xDCBD, 0x7ADF, 0xCCE5, 0x7AE0, 0xEDF1, 0x7AE3, 0xF1E2, + 0x7AE5, 0xD4DB, 0x7AEA, 0xE2B5, 0x7AED, 0xCAE6, 0x7AEF, 0xD3AE, + 0x7AF6, 0xCCE6, 0x7AF9, 0xF1D3, 0x7AFA, 0xF5E7, 0x7AFF, 0xCADA, + 0x7B0F, 0xFBEE, 0x7B11, 0xE1C5, 0x7B19, 0xDFE9, 0x7B1B, 0xEEDE, + 0x7B1E, 0xF7C2, 0x7B20, 0xD8A2, 0x7B26, 0xDDAC, 0x7B2C, 0xF0AF, + 0x7B2D, 0xD6BD, 0x7B39, 0xE1AB, 0x7B46, 0xF9B6, 0x7B49, 0xD4F5, + 0x7B4B, 0xD0C9, 0x7B4C, 0xEFA7, 0x7B4D, 0xE2EC, 0x7B4F, 0xDBEA, + 0x7B50, 0xCECC, 0x7B51, 0xF5E8, 0x7B52, 0xF7D5, 0x7B54, 0xD3CD, + 0x7B56, 0xF3FE, 0x7B60, 0xD0B5, 0x7B6C, 0xE0FE, 0x7B6E, 0xDFFB, + 0x7B75, 0xE6DD, 0x7B7D, 0xE8A4, 0x7B87, 0xCBCD, 0x7B8B, 0xEFA8, + 0x7B8F, 0xEEB4, 0x7B94, 0xDAD8, 0x7B95, 0xD1B9, 0x7B97, 0xDFA9, + 0x7B9A, 0xF3B0, 0x7B9D, 0xCCC4, 0x7BA1, 0xCEB7, 0x7BAD, 0xEFA9, + 0x7BB1, 0xDFD5, 0x7BB4, 0xEDD7, 0x7BB8, 0xEEC6, 0x7BC0, 0xEFBD, + 0x7BC1, 0xFCD6, 0x7BC4, 0xDBF4, 0x7BC6, 0xEFAA, 0x7BC7, 0xF8B9, + 0x7BC9, 0xF5E9, 0x7BD2, 0xE3D9, 0x7BE0, 0xE1C6, 0x7BE4, 0xD4BF, + 0x7BE9, 0xDEE8, 0x7C07, 0xF0EA, 0x7C12, 0xF3C2, 0x7C1E, 0xD3AF, + 0x7C21, 0xCADB, 0x7C27, 0xFCD7, 0x7C2A, 0xEDD8, 0x7C2B, 0xE1C7, + 0x7C3D, 0xF4D8, 0x7C3E, 0xD6B3, 0x7C3F, 0xDDAD, 0x7C43, 0xD5BE, + 0x7C4C, 0xF1C3, 0x7C4D, 0xEEDF, 0x7C60, 0xD6EB, 0x7C64, 0xF4D9, + 0x7C6C, 0xD7E6, 0x7C73, 0xDAB7, 0x7C83, 0xDDFB, 0x7C89, 0xDDCF, + 0x7C92, 0xD8A3, 0x7C95, 0xDAD9, 0x7C97, 0xF0D8, 0x7C98, 0xEFC4, + 0x7C9F, 0xE1D8, 0x7CA5, 0xF1D4, 0x7CA7, 0xEDF2, 0x7CAE, 0xD5DB, + 0x7CB1, 0xD5DC, 0x7CB2, 0xF3C4, 0x7CB3, 0xCBD7, 0x7CB9, 0xE2B6, + 0x7CBE, 0xEFF1, 0x7CCA, 0xFBD5, 0x7CD6, 0xD3D8, 0x7CDE, 0xDDD0, + 0x7CDF, 0xF0D9, 0x7CE0, 0xCBB3, 0x7CE7, 0xD5DD, 0x7CFB, 0xCDA7, + 0x7CFE, 0xD0AC, 0x7D00, 0xD1BA, 0x7D02, 0xF1C4, 0x7D04, 0xE5B3, + 0x7D05, 0xFBF5, 0x7D06, 0xE9E1, 0x7D07, 0xFDE0, 0x7D08, 0xFCBC, + 0x7D0A, 0xDAA2, 0x7D0B, 0xDAA3, 0x7D0D, 0xD2A1, 0x7D10, 0xD2EF, + 0x7D14, 0xE2ED, 0x7D17, 0xDEE9, 0x7D18, 0xCEDC, 0x7D19, 0xF2B5, + 0x7D1A, 0xD0E4, 0x7D1B, 0xDDD1, 0x7D20, 0xE1C8, 0x7D21, 0xDBB7, + 0x7D22, 0xDFE3, 0x7D2B, 0xEDB9, 0x7D2C, 0xF1C5, 0x7D2E, 0xF3CF, + 0x7D2F, 0xD7AB, 0x7D30, 0xE1AC, 0x7D33, 0xE3EB, 0x7D35, 0xEEC7, + 0x7D39, 0xE1C9, 0x7D3A, 0xCAFA, 0x7D42, 0xF0FB, 0x7D43, 0xFAE1, + 0x7D44, 0xF0DA, 0x7D45, 0xCCE7, 0x7D46, 0xDAF4, 0x7D50, 0xCCBF, + 0x7D5E, 0xCEED, 0x7D61, 0xD5A9, 0x7D62, 0xFAE2, 0x7D66, 0xD0E5, + 0x7D68, 0xEBD6, 0x7D6A, 0xECDF, 0x7D6E, 0xDFFC, 0x7D71, 0xF7D6, + 0x7D72, 0xDEEA, 0x7D73, 0xCBB4, 0x7D76, 0xEFBE, 0x7D79, 0xCCB5, + 0x7D7F, 0xCFBD, 0x7D8E, 0xEFF2, 0x7D8F, 0xE2B7, 0x7D93, 0xCCE8, + 0x7D9C, 0xF0FC, 0x7DA0, 0xD6E0, 0x7DA2, 0xF1C6, 0x7DAC, 0xE2B8, + 0x7DAD, 0xEBAB, 0x7DB1, 0xCBB5, 0x7DB2, 0xD8D1, 0x7DB4, 0xF4CE, + 0x7DB5, 0xF3F7, 0x7DB8, 0xD7C6, 0x7DBA, 0xD1BB, 0x7DBB, 0xF7AA, + 0x7DBD, 0xEDCA, 0x7DBE, 0xD7D3, 0x7DBF, 0xD8FA, 0x7DC7, 0xF6C5, + 0x7DCA, 0xD1CC, 0x7DCB, 0xDDFC, 0x7DD6, 0xDFFD, 0x7DD8, 0xF9E5, + 0x7DDA, 0xE0CA, 0x7DDD, 0xF2FD, 0x7DDE, 0xD3B0, 0x7DE0, 0xF4F3, + 0x7DE1, 0xDAC9, 0x7DE3, 0xE6DE, 0x7DE8, 0xF8BA, 0x7DE9, 0xE8D0, + 0x7DEC, 0xD8FB, 0x7DEF, 0xEAD5, 0x7DF4, 0xD6A3, 0x7DFB, 0xF6C6, + 0x7E09, 0xF2DB, 0x7E0A, 0xE4FC, 0x7E15, 0xE8B2, 0x7E1B, 0xDADA, + 0x7E1D, 0xF2DC, 0x7E1E, 0xFBD6, 0x7E1F, 0xE9B2, 0x7E21, 0xEEAD, + 0x7E23, 0xFAE3, 0x7E2B, 0xDCEE, 0x7E2E, 0xF5EA, 0x7E2F, 0xE6E0, + 0x7E31, 0xF0FD, 0x7E37, 0xD7AC, 0x7E3D, 0xF5C5, 0x7E3E, 0xEEE0, + 0x7E41, 0xDBE5, 0x7E43, 0xDDDE, 0x7E46, 0xD9F0, 0x7E47, 0xE9A3, + 0x7E52, 0xF1F9, 0x7E54, 0xF2C4, 0x7E55, 0xE0CB, 0x7E5E, 0xE9A4, + 0x7E61, 0xE2B9, 0x7E69, 0xE3B1, 0x7E6A, 0xFCEB, 0x7E6B, 0xCDA8, + 0x7E6D, 0xCCB6, 0x7E70, 0xF0DB, 0x7E79, 0xE6BA, 0x7E7C, 0xCDA9, + 0x7E82, 0xF3C3, 0x7E8C, 0xE1D9, 0x7E8F, 0xEFAB, 0x7E93, 0xE7C5, + 0x7E96, 0xE0E9, 0x7E98, 0xF3C5, 0x7E9B, 0xD4C0, 0x7E9C, 0xD5BF, + 0x7F36, 0xDDAE, 0x7F38, 0xF9FC, 0x7F3A, 0xCCC0, 0x7F4C, 0xE5A2, + 0x7F50, 0xCEB8, 0x7F54, 0xD8D2, 0x7F55, 0xF9D6, 0x7F6A, 0xF1AA, + 0x7F6B, 0xCED1, 0x7F6E, 0xF6C7, 0x7F70, 0xDBEB, 0x7F72, 0xDFFE, + 0x7F75, 0xD8E1, 0x7F77, 0xF7F3, 0x7F79, 0xD7E7, 0x7F85, 0xD4FE, + 0x7F88, 0xD1BC, 0x7F8A, 0xE5CF, 0x7F8C, 0xCBB6, 0x7F8E, 0xDAB8, + 0x7F94, 0xCDC4, 0x7F9A, 0xD6BE, 0x7F9E, 0xE2BA, 0x7FA4, 0xCFD8, + 0x7FA8, 0xE0CC, 0x7FA9, 0xEBF9, 0x7FB2, 0xFDFD, 0x7FB8, 0xD7E8, + 0x7FB9, 0xCBD8, 0x7FBD, 0xE9E2, 0x7FC1, 0xE8BA, 0x7FC5, 0xE3C7, + 0x7FCA, 0xECCD, 0x7FCC, 0xECCE, 0x7FCE, 0xD6BF, 0x7FD2, 0xE3A7, + 0x7FD4, 0xDFD6, 0x7FD5, 0xFDE8, 0x7FDF, 0xEEE1, 0x7FE0, 0xF6A8, + 0x7FE1, 0xDDFD, 0x7FE9, 0xF8BB, 0x7FEB, 0xE8D1, 0x7FF0, 0xF9D7, + 0x7FF9, 0xCEEE, 0x7FFC, 0xECCF, 0x8000, 0xE9A5, 0x8001, 0xD6D5, + 0x8003, 0xCDC5, 0x8005, 0xEDBA, 0x8006, 0xD1BD, 0x8009, 0xCFBE, + 0x800C, 0xECBB, 0x8010, 0xD2B1, 0x8015, 0xCCE9, 0x8017, 0xD9C4, + 0x8018, 0xE9FC, 0x802D, 0xD1BE, 0x8033, 0xECBC, 0x8036, 0xE5AD, + 0x803D, 0xF7B0, 0x803F, 0xCCEA, 0x8043, 0xD3C4, 0x8046, 0xD6C0, + 0x804A, 0xD6FD, 0x8056, 0xE1A1, 0x8058, 0xDEBD, 0x805A, 0xF6A9, + 0x805E, 0xDAA4, 0x806F, 0xD6A4, 0x8070, 0xF5C6, 0x8072, 0xE1A2, + 0x8073, 0xE9C6, 0x8077, 0xF2C5, 0x807D, 0xF4E9, 0x807E, 0xD6EC, + 0x807F, 0xEBD3, 0x8084, 0xECBD, 0x8085, 0xE2DC, 0x8086, 0xDEEB, + 0x8087, 0xF0DC, 0x8089, 0xEBBF, 0x808B, 0xD7CE, 0x808C, 0xD1BF, + 0x8096, 0xF5AB, 0x809B, 0xF9FD, 0x809D, 0xCADC, 0x80A1, 0xCDC6, + 0x80A2, 0xF2B6, 0x80A5, 0xDDFE, 0x80A9, 0xCCB7, 0x80AA, 0xDBB8, + 0x80AF, 0xD0E9, 0x80B1, 0xCEDD, 0x80B2, 0xEBC0, 0x80B4, 0xFDA2, + 0x80BA, 0xF8CB, 0x80C3, 0xEAD6, 0x80C4, 0xF1B0, 0x80CC, 0xDBCE, + 0x80CE, 0xF7C3, 0x80DA, 0xDBCF, 0x80DB, 0xCBA4, 0x80DE, 0xF8E0, + 0x80E1, 0xFBD7, 0x80E4, 0xEBCA, 0x80E5, 0xE0A1, 0x80F1, 0xCECD, + 0x80F4, 0xD4DC, 0x80F8, 0xFDD8, 0x80FD, 0xD2F6, 0x8102, 0xF2B7, + 0x8105, 0xFAF6, 0x8106, 0xF6AA, 0x8107, 0xFAF7, 0x8108, 0xD8E6, + 0x810A, 0xF4B1, 0x8118, 0xE8D2, 0x811A, 0xCAC5, 0x811B, 0xCCEB, + 0x8123, 0xE2EE, 0x8129, 0xE2BB, 0x812B, 0xF7AD, 0x812F, 0xF8E1, + 0x8139, 0xF3EC, 0x813E, 0xDEA1, 0x814B, 0xE4FD, 0x814E, 0xE3EC, + 0x8150, 0xDDAF, 0x8151, 0xDDB0, 0x8154, 0xCBB7, 0x8155, 0xE8D3, + 0x8165, 0xE1A3, 0x8166, 0xD2E0, 0x816B, 0xF0FE, 0x8170, 0xE9A6, + 0x8171, 0xCBF2, 0x8178, 0xEDF3, 0x8179, 0xDCD9, 0x817A, 0xE0CD, + 0x817F, 0xF7DA, 0x8180, 0xDBB9, 0x8188, 0xCCAE, 0x818A, 0xDADB, + 0x818F, 0xCDC7, 0x819A, 0xDDB1, 0x819C, 0xD8AF, 0x819D, 0xE3A3, + 0x81A0, 0xCEEF, 0x81A3, 0xF2F3, 0x81A8, 0xF8B3, 0x81B3, 0xE0CE, + 0x81B5, 0xF5FD, 0x81BA, 0xEBEC, 0x81BD, 0xD3C5, 0x81BE, 0xFCEC, + 0x81BF, 0xD2DB, 0x81C0, 0xD4EB, 0x81C2, 0xDEA2, 0x81C6, 0xE5E6, + 0x81CD, 0xF0B0, 0x81D8, 0xD5C4, 0x81DF, 0xEDF4, 0x81E3, 0xE3ED, + 0x81E5, 0xE8C2, 0x81E7, 0xEDF5, 0x81E8, 0xD7FC, 0x81EA, 0xEDBB, + 0x81ED, 0xF6AB, 0x81F3, 0xF2B8, 0x81F4, 0xF6C8, 0x81FA, 0xD3E6, + 0x81FB, 0xF2DD, 0x81FC, 0xCFBF, 0x81FE, 0xEBAC, 0x8205, 0xCFC0, + 0x8207, 0xE6A8, 0x8208, 0xFDE9, 0x820A, 0xCFC1, 0x820C, 0xE0DF, + 0x820D, 0xDEEC, 0x8212, 0xE0A2, 0x821B, 0xF4BF, 0x821C, 0xE2EF, + 0x821E, 0xD9F1, 0x821F, 0xF1C7, 0x8221, 0xCBB8, 0x822A, 0xF9FE, + 0x822B, 0xDBBA, 0x822C, 0xDAF5, 0x8235, 0xF6EC, 0x8236, 0xDADC, + 0x8237, 0xFAE4, 0x8239, 0xE0CF, 0x8240, 0xDDB2, 0x8245, 0xE6A9, + 0x8247, 0xEFF3, 0x8259, 0xF3ED, 0x8264, 0xEBFA, 0x8266, 0xF9E6, + 0x826E, 0xCADD, 0x826F, 0xD5DE, 0x8271, 0xCADE, 0x8272, 0xDFE4, + 0x8276, 0xE6FD, 0x8278, 0xF5AC, 0x827E, 0xE4F5, 0x828B, 0xE9E3, + 0x828D, 0xEDCB, 0x828E, 0xCFE4, 0x8292, 0xD8D3, 0x8299, 0xDDB3, + 0x829A, 0xD4EC, 0x829D, 0xF2B9, 0x829F, 0xDFB7, 0x82A5, 0xCBCE, + 0x82A6, 0xFBD8, 0x82A9, 0xD0D9, 0x82AC, 0xDDD2, 0x82AD, 0xF7F4, + 0x82AE, 0xE7DC, 0x82AF, 0xE4A5, 0x82B1, 0xFCA3, 0x82B3, 0xDBBB, + 0x82B7, 0xF2BA, 0x82B8, 0xE9FD, 0x82B9, 0xD0CA, 0x82BB, 0xF5D6, + 0x82BC, 0xD9C5, 0x82BD, 0xE4B4, 0x82BF, 0xEDA7, 0x82D1, 0xEABD, + 0x82D2, 0xE6FE, 0x82D4, 0xF7C4, 0x82D5, 0xF5AD, 0x82D7, 0xD9E0, + 0x82DB, 0xCAB4, 0x82DE, 0xF8E2, 0x82DF, 0xCFC2, 0x82E1, 0xECBE, + 0x82E5, 0xE5B4, 0x82E6, 0xCDC8, 0x82E7, 0xEEC8, 0x82F1, 0xE7C8, + 0x82FD, 0xCDC9, 0x82FE, 0xF9B7, 0x8301, 0xF1E8, 0x8302, 0xD9F2, + 0x8303, 0xDBF5, 0x8304, 0xCAB5, 0x8305, 0xD9C6, 0x8309, 0xD8C9, + 0x8317, 0xD9AB, 0x8328, 0xEDBC, 0x832B, 0xD8D4, 0x832F, 0xDCDA, + 0x8331, 0xE2BC, 0x8334, 0xFCED, 0x8335, 0xECE0, 0x8336, 0xD2FE, + 0x8338, 0xE9C7, 0x8339, 0xE6AA, 0x8340, 0xE2F0, 0x8347, 0xFABB, + 0x8349, 0xF5AE, 0x834A, 0xFBAA, 0x834F, 0xECFB, 0x8351, 0xECBF, + 0x8352, 0xFCD8, 0x8373, 0xD4E5, 0x8377, 0xF9C3, 0x837B, 0xEEE2, + 0x8389, 0xD7E9, 0x838A, 0xEDF6, 0x838E, 0xDEED, 0x8396, 0xCCEC, + 0x8398, 0xE3EE, 0x839E, 0xE8D4, 0x83A2, 0xFAF8, 0x83A9, 0xDDB4, + 0x83AA, 0xE4B5, 0x83AB, 0xD8B0, 0x83BD, 0xD8D5, 0x83C1, 0xF4EA, + 0x83C5, 0xCEB9, 0x83C9, 0xD6E1, 0x83CA, 0xCFD2, 0x83CC, 0xD0B6, + 0x83D3, 0xCEA2, 0x83D6, 0xF3EE, 0x83DC, 0xF3F8, 0x83E9, 0xDCCC, + 0x83EB, 0xD0CB, 0x83EF, 0xFCA4, 0x83F0, 0xCDCA, 0x83F1, 0xD7D4, + 0x83F2, 0xDEA3, 0x83F4, 0xE4E0, 0x83F9, 0xEEC9, 0x83FD, 0xE2DD, + 0x8403, 0xF5FE, 0x8404, 0xD4AC, 0x840A, 0xD5D1, 0x840C, 0xD8F0, + 0x840D, 0xF8C3, 0x840E, 0xEAD7, 0x8429, 0xF5D7, 0x842C, 0xD8BF, + 0x8431, 0xFDC0, 0x8438, 0xEBAD, 0x843D, 0xD5AA, 0x8449, 0xE7A8, + 0x8457, 0xEECA, 0x845B, 0xCAE7, 0x8461, 0xF8E3, 0x8463, 0xD4DD, + 0x8466, 0xEAD8, 0x846B, 0xFBD9, 0x846C, 0xEDF7, 0x846F, 0xE5B5, + 0x8475, 0xD0AD, 0x847A, 0xF1F1, 0x8490, 0xE2BD, 0x8494, 0xE3C8, + 0x8499, 0xD9D5, 0x849C, 0xDFAA, 0x84A1, 0xDBBC, 0x84B2, 0xF8E4, + 0x84B8, 0xF1FA, 0x84BB, 0xE5B6, 0x84BC, 0xF3EF, 0x84BF, 0xFBDA, + 0x84C0, 0xE1E0, 0x84C2, 0xD9AC, 0x84C4, 0xF5EB, 0x84C6, 0xE0B6, + 0x84C9, 0xE9C8, 0x84CB, 0xCBCF, 0x84CD, 0xE3C9, 0x84D1, 0xDEEE, + 0x84DA, 0xE2BE, 0x84EC, 0xDCEF, 0x84EE, 0xD6A5, 0x84F4, 0xE2F1, + 0x84FC, 0xD6FE, 0x8511, 0xD9A1, 0x8513, 0xD8C0, 0x8514, 0xDCDB, + 0x8517, 0xEDBD, 0x8518, 0xDFB8, 0x851A, 0xEAA5, 0x851E, 0xD7AD, + 0x8521, 0xF3F9, 0x8523, 0xEDF8, 0x8525, 0xF5C7, 0x852C, 0xE1CA, + 0x852D, 0xEBE3, 0x852F, 0xF2DE, 0x853D, 0xF8CC, 0x853F, 0xEAD9, + 0x8541, 0xD3C6, 0x8543, 0xDBE6, 0x8549, 0xF5AF, 0x854E, 0xCEF0, + 0x8553, 0xE9FE, 0x8559, 0xFBB6, 0x8563, 0xE2F2, 0x8568, 0xCFF2, + 0x8569, 0xF7B9, 0x856A, 0xD9F3, 0x856D, 0xE1CB, 0x8584, 0xDADD, + 0x8587, 0xDAB9, 0x858F, 0xEBFB, 0x8591, 0xCBB9, 0x8594, 0xEDF9, + 0x859B, 0xE0E0, 0x85A6, 0xF4C0, 0x85A8, 0xFDBC, 0x85A9, 0xDFB1, + 0x85AA, 0xE3EF, 0x85AF, 0xE0A3, 0x85B0, 0xFDB9, 0x85BA, 0xF0B1, + 0x85C1, 0xCDCB, 0x85C9, 0xEDBE, 0x85CD, 0xD5C0, 0x85CE, 0xE3F0, + 0x85CF, 0xEDFA, 0x85D5, 0xE9E4, 0x85DC, 0xD5ED, 0x85DD, 0xE7DD, + 0x85E4, 0xD4F6, 0x85E5, 0xE5B7, 0x85E9, 0xDBE7, 0x85EA, 0xE2BF, + 0x85F7, 0xEECB, 0x85FA, 0xD7F4, 0x85FB, 0xF0DD, 0x85FF, 0xCEAB, + 0x8602, 0xE7DE, 0x8606, 0xD6D6, 0x8607, 0xE1CC, 0x860A, 0xE8B3, + 0x8616, 0xE5EE, 0x8617, 0xDCA2, 0x861A, 0xE0D0, 0x862D, 0xD5B5, + 0x863F, 0xD5A1, 0x864E, 0xFBDB, 0x8650, 0xF9CB, 0x8654, 0xCBF3, + 0x8655, 0xF4A5, 0x865B, 0xFAC8, 0x865C, 0xD6D7, 0x865E, 0xE9E5, + 0x865F, 0xFBDC, 0x8667, 0xFDD0, 0x8679, 0xFBF6, 0x868A, 0xDAA5, + 0x868C, 0xDBBD, 0x8693, 0xECE2, 0x86A3, 0xCDF7, 0x86A4, 0xF0DE, + 0x86A9, 0xF6C9, 0x86C7, 0xDEEF, 0x86CB, 0xD3B1, 0x86D4, 0xFCEE, + 0x86D9, 0xE8C3, 0x86DB, 0xF1C8, 0x86DF, 0xCEF1, 0x86E4, 0xF9ED, + 0x86ED, 0xF2F4, 0x86FE, 0xE4B6, 0x8700, 0xF5B9, 0x8702, 0xDCF0, + 0x8703, 0xE3F1, 0x8708, 0xE8A5, 0x8718, 0xF2BB, 0x871A, 0xDEA4, + 0x871C, 0xDACC, 0x874E, 0xCAE9, 0x8755, 0xE3DA, 0x8757, 0xFCD9, + 0x875F, 0xEADA, 0x8766, 0xF9C4, 0x8768, 0xE3A4, 0x8774, 0xFBDD, + 0x8776, 0xEFCA, 0x8778, 0xE8C4, 0x8782, 0xD5CC, 0x878D, 0xEBD7, + 0x879F, 0xD9AD, 0x87A2, 0xFBAB, 0x87B3, 0xD3D9, 0x87BA, 0xD5A2, + 0x87C4, 0xF6DE, 0x87E0, 0xDAF6, 0x87EC, 0xE0D1, 0x87EF, 0xE9A8, + 0x87F2, 0xF5F9, 0x87F9, 0xFAAF, 0x87FB, 0xEBFC, 0x87FE, 0xE0EA, + 0x8805, 0xE3B2, 0x881F, 0xD5C5, 0x8822, 0xF1E3, 0x8823, 0xD5EE, + 0x8831, 0xCDCC, 0x8836, 0xEDD9, 0x883B, 0xD8C1, 0x8840, 0xFAEC, + 0x8846, 0xF1EB, 0x884C, 0xFABC, 0x884D, 0xE6E2, 0x8852, 0xFAE5, + 0x8853, 0xE2FA, 0x8857, 0xCAB6, 0x8859, 0xE4B7, 0x885B, 0xEADB, + 0x885D, 0xF5FA, 0x8861, 0xFBAC, 0x8862, 0xCFC3, 0x8863, 0xEBFD, + 0x8868, 0xF8FA, 0x886B, 0xDFB9, 0x8870, 0xE1F1, 0x8872, 0xD2A4, + 0x8877, 0xF5FB, 0x887E, 0xD0DA, 0x887F, 0xD0DB, 0x8881, 0xEABE, + 0x8882, 0xD9B1, 0x8888, 0xCAB7, 0x888B, 0xD3E7, 0x888D, 0xF8E5, + 0x8892, 0xD3B2, 0x8896, 0xE2C0, 0x8897, 0xF2DF, 0x889E, 0xCDE5, + 0x88AB, 0xF9AC, 0x88B4, 0xCDCD, 0x88C1, 0xEEAE, 0x88C2, 0xD6AE, + 0x88CF, 0xD7EA, 0x88D4, 0xE7E0, 0x88D5, 0xEBAE, 0x88D9, 0xCFD9, + 0x88DC, 0xDCCD, 0x88DD, 0xEDFB, 0x88DF, 0xDEF0, 0x88E1, 0xD7EB, + 0x88E8, 0xDEA5, 0x88F3, 0xDFD7, 0x88F4, 0xDBD0, 0x88F5, 0xDBD1, + 0x88F8, 0xD5A3, 0x88FD, 0xF0B2, 0x8907, 0xDCDC, 0x8910, 0xCAE8, + 0x8912, 0xF8E6, 0x8913, 0xDCCE, 0x8918, 0xEADC, 0x8919, 0xDBD2, + 0x8925, 0xE9B3, 0x892A, 0xF7DB, 0x8936, 0xE3A8, 0x8938, 0xD7AE, + 0x893B, 0xE0E1, 0x8941, 0xCBBA, 0x8944, 0xE5D1, 0x895F, 0xD0DC, + 0x8964, 0xD5C1, 0x896A, 0xD8CA, 0x8972, 0xE3A9, 0x897F, 0xE0A4, + 0x8981, 0xE9A9, 0x8983, 0xD3C7, 0x8986, 0xDCDD, 0x8987, 0xF8AE, + 0x898B, 0xCCB8, 0x898F, 0xD0AE, 0x8993, 0xD8F2, 0x8996, 0xE3CA, + 0x89A1, 0xCCAF, 0x89A9, 0xD4AD, 0x89AA, 0xF6D1, 0x89B2, 0xD0CC, + 0x89BA, 0xCAC6, 0x89BD, 0xD5C2, 0x89C0, 0xCEBA, 0x89D2, 0xCAC7, + 0x89E3, 0xFAB0, 0x89F4, 0xDFD8, 0x89F8, 0xF5BA, 0x8A00, 0xE5EB, + 0x8A02, 0xEFF4, 0x8A03, 0xDDB5, 0x8A08, 0xCDAA, 0x8A0A, 0xE3F2, + 0x8A0C, 0xFBF7, 0x8A0E, 0xF7D0, 0x8A13, 0xFDBA, 0x8A16, 0xFDE1, + 0x8A17, 0xF6FE, 0x8A18, 0xD1C0, 0x8A1B, 0xE8C5, 0x8A1D, 0xE4B8, + 0x8A1F, 0xE1E8, 0x8A23, 0xCCC1, 0x8A25, 0xD2ED, 0x8A2A, 0xDBBE, + 0x8A2D, 0xE0E2, 0x8A31, 0xFAC9, 0x8A34, 0xE1CD, 0x8A36, 0xCAB8, + 0x8A3A, 0xF2E0, 0x8A3B, 0xF1C9, 0x8A50, 0xDEF1, 0x8A54, 0xF0DF, + 0x8A55, 0xF8C4, 0x8A5B, 0xEECC, 0x8A5E, 0xDEF2, 0x8A60, 0xE7C9, + 0x8A62, 0xE2F3, 0x8A63, 0xE7E1, 0x8A66, 0xE3CB, 0x8A69, 0xE3CC, + 0x8A6D, 0xCFF8, 0x8A6E, 0xEFAC, 0x8A70, 0xFDFE, 0x8A71, 0xFCA5, + 0x8A72, 0xFAB1, 0x8A73, 0xDFD9, 0x8A75, 0xE0D2, 0x8A79, 0xF4DA, + 0x8A85, 0xF1CA, 0x8A87, 0xCEA3, 0x8A8C, 0xF2BC, 0x8A8D, 0xECE3, + 0x8A93, 0xE0A5, 0x8A95, 0xF7AB, 0x8A98, 0xEBAF, 0x8A9E, 0xE5DE, + 0x8AA0, 0xE1A4, 0x8AA1, 0xCDAB, 0x8AA3, 0xD9F4, 0x8AA4, 0xE8A6, + 0x8AA5, 0xCDCE, 0x8AA6, 0xE1E9, 0x8AA8, 0xFCEF, 0x8AAA, 0xE0E3, + 0x8AB0, 0xE2C1, 0x8AB2, 0xCEA4, 0x8AB9, 0xDEA6, 0x8ABC, 0xEBFE, + 0x8ABE, 0xEBDD, 0x8ABF, 0xF0E0, 0x8AC2, 0xF4DB, 0x8AC4, 0xE2F4, + 0x8AC7, 0xD3C8, 0x8ACB, 0xF4EB, 0x8ACD, 0xEEB5, 0x8ACF, 0xF5D8, + 0x8AD2, 0xD5DF, 0x8AD6, 0xD6E5, 0x8ADB, 0xEBB0, 0x8ADC, 0xF4E3, + 0x8AE1, 0xE3CD, 0x8AE6, 0xF4F4, 0x8AE7, 0xFAB2, 0x8AEA, 0xEFF5, + 0x8AEB, 0xCADF, 0x8AED, 0xEBB1, 0x8AEE, 0xEDBF, 0x8AF1, 0xFDC9, + 0x8AF6, 0xE4A6, 0x8AF7, 0xF9A4, 0x8AF8, 0xF0B3, 0x8AFA, 0xE5EC, + 0x8AFE, 0xD1E7, 0x8B00, 0xD9C7, 0x8B01, 0xE4D7, 0x8B02, 0xEADD, + 0x8B04, 0xD4F7, 0x8B0E, 0xDABA, 0x8B10, 0xDACD, 0x8B14, 0xF9CC, + 0x8B16, 0xE1DA, 0x8B17, 0xDBBF, 0x8B19, 0xCCC5, 0x8B1A, 0xECD0, + 0x8B1B, 0xCBBB, 0x8B1D, 0xDEF3, 0x8B20, 0xE9AA, 0x8B28, 0xD9C8, + 0x8B2B, 0xEEE3, 0x8B2C, 0xD7BD, 0x8B33, 0xCFC4, 0x8B39, 0xD0CD, + 0x8B41, 0xFCA6, 0x8B49, 0xF1FB, 0x8B4E, 0xFDD2, 0x8B4F, 0xD1C1, + 0x8B58, 0xE3DB, 0x8B5A, 0xD3C9, 0x8B5C, 0xDCCF, 0x8B66, 0xCCED, + 0x8B6C, 0xDEA7, 0x8B6F, 0xE6BB, 0x8B70, 0xECA1, 0x8B74, 0xCCB9, + 0x8B77, 0xFBDE, 0x8B7D, 0xE7E2, 0x8B80, 0xD4C1, 0x8B8A, 0xDCA8, + 0x8B90, 0xE2C2, 0x8B92, 0xF3D8, 0x8B93, 0xE5D3, 0x8B96, 0xF3D9, + 0x8B9A, 0xF3C6, 0x8C37, 0xCDDB, 0x8C3F, 0xCDAC, 0x8C41, 0xFCC3, + 0x8C46, 0xD4E7, 0x8C48, 0xD1C2, 0x8C4A, 0xF9A5, 0x8C4C, 0xE8D5, + 0x8C55, 0xE3CE, 0x8C5A, 0xD4CA, 0x8C61, 0xDFDA, 0x8C6A, 0xFBDF, + 0x8C6B, 0xE7E3, 0x8C79, 0xF8FB, 0x8C7A, 0xE3CF, 0x8C82, 0xF5B0, + 0x8C8A, 0xD8E7, 0x8C8C, 0xD9C9, 0x8C9D, 0xF8AF, 0x8C9E, 0xEFF6, + 0x8CA0, 0xDDB6, 0x8CA1, 0xEEAF, 0x8CA2, 0xCDF8, 0x8CA7, 0xDEB8, + 0x8CA8, 0xFCA7, 0x8CA9, 0xF7FC, 0x8CAA, 0xF7B1, 0x8CAB, 0xCEBB, + 0x8CAC, 0xF4A1, 0x8CAF, 0xEECD, 0x8CB0, 0xE1AE, 0x8CB3, 0xECC3, + 0x8CB4, 0xCFFE, 0x8CB6, 0xF8BF, 0x8CB7, 0xD8E2, 0x8CB8, 0xD3E8, + 0x8CBB, 0xDEA8, 0x8CBC, 0xF4E4, 0x8CBD, 0xECC2, 0x8CBF, 0xD9F5, + 0x8CC0, 0xF9C5, 0x8CC1, 0xDDD3, 0x8CC2, 0xD6F1, 0x8CC3, 0xECFC, + 0x8CC4, 0xFCF0, 0x8CC7, 0xEDC0, 0x8CC8, 0xCAB9, 0x8CCA, 0xEEE4, + 0x8CD1, 0xF2E1, 0x8CD3, 0xDEB9, 0x8CDA, 0xD6F2, 0x8CDC, 0xDEF4, + 0x8CDE, 0xDFDB, 0x8CE0, 0xDBD3, 0x8CE2, 0xFAE7, 0x8CE3, 0xD8E3, + 0x8CE4, 0xF4C1, 0x8CE6, 0xDDB7, 0x8CEA, 0xF2F5, 0x8CED, 0xD4AE, + 0x8CF4, 0xD6F3, 0x8CFB, 0xDDB8, 0x8CFC, 0xCFC5, 0x8CFD, 0xDFDF, + 0x8D04, 0xF2BE, 0x8D05, 0xF6A1, 0x8D07, 0xEBCB, 0x8D08, 0xF1FC, + 0x8D0A, 0xF3C7, 0x8D0D, 0xE0EB, 0x8D13, 0xEDFC, 0x8D16, 0xE1DB, + 0x8D64, 0xEEE5, 0x8D66, 0xDEF5, 0x8D6B, 0xFAD3, 0x8D70, 0xF1CB, + 0x8D73, 0xD0AF, 0x8D74, 0xDDB9, 0x8D77, 0xD1C3, 0x8D85, 0xF5B1, + 0x8D8A, 0xEAC6, 0x8D99, 0xF0E1, 0x8DA3, 0xF6AC, 0x8DA8, 0xF5D9, + 0x8DB3, 0xF0EB, 0x8DBA, 0xDDBA, 0x8DBE, 0xF2BF, 0x8DC6, 0xF7C5, + 0x8DCB, 0xDBA2, 0x8DCC, 0xF2F6, 0x8DCF, 0xCABA, 0x8DDB, 0xF7F5, + 0x8DDD, 0xCBE5, 0x8DE1, 0xEEE6, 0x8DE3, 0xE0D3, 0x8DE8, 0xCEA5, + 0x8DEF, 0xD6D8, 0x8DF3, 0xD4AF, 0x8E0A, 0xE9C9, 0x8E0F, 0xD3CE, + 0x8E10, 0xF4C2, 0x8E1E, 0xCBE6, 0x8E2A, 0xF1A1, 0x8E30, 0xEBB2, + 0x8E35, 0xF1A2, 0x8E42, 0xEBB3, 0x8E44, 0xF0B4, 0x8E47, 0xCBF4, + 0x8E48, 0xD4B0, 0x8E49, 0xF3B2, 0x8E4A, 0xFBB7, 0x8E59, 0xF5EC, + 0x8E5F, 0xEEE7, 0x8E60, 0xF4B2, 0x8E74, 0xF5ED, 0x8E76, 0xCFF3, + 0x8E81, 0xF0E2, 0x8E87, 0xEECE, 0x8E8A, 0xF1CC, 0x8E8D, 0xE5B8, + 0x8EAA, 0xD7F5, 0x8EAB, 0xE3F3, 0x8EAC, 0xCFE5, 0x8EC0, 0xCFC6, + 0x8ECA, 0xF3B3, 0x8ECB, 0xE4D8, 0x8ECC, 0xCFF9, 0x8ECD, 0xCFDA, + 0x8ED2, 0xFACD, 0x8EDF, 0xE6E3, 0x8EEB, 0xF2E2, 0x8EF8, 0xF5EE, + 0x8EFB, 0xCABB, 0x8EFE, 0xE3DC, 0x8F03, 0xCEF2, 0x8F05, 0xD6D9, + 0x8F09, 0xEEB0, 0x8F12, 0xF4E5, 0x8F13, 0xD8C2, 0x8F14, 0xDCD0, + 0x8F15, 0xCCEE, 0x8F1B, 0xD5E0, 0x8F1C, 0xF6CA, 0x8F1D, 0xFDCA, + 0x8F1E, 0xD8D6, 0x8F1F, 0xF4CF, 0x8F26, 0xD6A6, 0x8F27, 0xDCBE, + 0x8F29, 0xDBD4, 0x8F2A, 0xD7C7, 0x8F2F, 0xF2FE, 0x8F33, 0xF1CD, + 0x8F38, 0xE2C3, 0x8F39, 0xDCDE, 0x8F3B, 0xDCDF, 0x8F3E, 0xEFAD, + 0x8F3F, 0xE6AB, 0x8F44, 0xF9DD, 0x8F45, 0xEABF, 0x8F49, 0xEFAE, + 0x8F4D, 0xF4D0, 0x8F4E, 0xCEF3, 0x8F5D, 0xE6AC, 0x8F5F, 0xCEDE, + 0x8F62, 0xD5F9, 0x8F9B, 0xE3F4, 0x8F9C, 0xCDD0, 0x8FA3, 0xD5B8, + 0x8FA6, 0xF7FD, 0x8FA8, 0xDCA9, 0x8FAD, 0xDEF6, 0x8FAF, 0xDCAA, + 0x8FB0, 0xF2E3, 0x8FB1, 0xE9B4, 0x8FB2, 0xD2DC, 0x8FC2, 0xE9E6, + 0x8FC5, 0xE3F6, 0x8FCE, 0xE7CA, 0x8FD1, 0xD0CE, 0x8FD4, 0xDAF7, + 0x8FE6, 0xCABC, 0x8FEA, 0xEEE8, 0x8FEB, 0xDADE, 0x8FED, 0xF2F7, + 0x8FF0, 0xE2FB, 0x8FF2, 0xCCA6, 0x8FF7, 0xDABB, 0x8FF9, 0xEEE9, + 0x8FFD, 0xF5DA, 0x9000, 0xF7DC, 0x9001, 0xE1EA, 0x9002, 0xCEC1, + 0x9003, 0xD4B1, 0x9005, 0xFDB1, 0x9006, 0xE6BD, 0x9008, 0xFBAD, + 0x900B, 0xF8E7, 0x900D, 0xE1CE, 0x900F, 0xF7E2, 0x9010, 0xF5EF, + 0x9011, 0xCFC7, 0x9014, 0xD4B2, 0x9015, 0xCCEF, 0x9017, 0xD4E8, + 0x9019, 0xEECF, 0x901A, 0xF7D7, 0x901D, 0xE0A6, 0x901E, 0xD6C1, + 0x901F, 0xE1DC, 0x9020, 0xF0E3, 0x9021, 0xF1E4, 0x9022, 0xDCF1, + 0x9023, 0xD6A7, 0x902E, 0xF4F5, 0x9031, 0xF1CE, 0x9032, 0xF2E4, + 0x9035, 0xD0B0, 0x9038, 0xECEF, 0x903C, 0xF9BA, 0x903E, 0xEBB5, + 0x9041, 0xD4ED, 0x9042, 0xE2C4, 0x9047, 0xE9E7, 0x904A, 0xEBB4, + 0x904B, 0xEAA1, 0x904D, 0xF8BC, 0x904E, 0xCEA6, 0x9050, 0xF9C6, + 0x9051, 0xFCDA, 0x9053, 0xD4B3, 0x9054, 0xD3B9, 0x9055, 0xEADE, + 0x9059, 0xE9AB, 0x905C, 0xE1E1, 0x905D, 0xD3CF, 0x905E, 0xF4F6, + 0x9060, 0xEAC0, 0x9061, 0xE1CF, 0x9063, 0xCCBA, 0x9069, 0xEEEA, + 0x906D, 0xF0E4, 0x906E, 0xF3B4, 0x906F, 0xD4EE, 0x9072, 0xF2C0, + 0x9075, 0xF1E5, 0x9077, 0xF4C3, 0x9078, 0xE0D4, 0x907A, 0xEBB6, + 0x907C, 0xD7A1, 0x907D, 0xCBE8, 0x907F, 0xF9AD, 0x9080, 0xE9AD, + 0x9081, 0xD8E4, 0x9082, 0xFAB3, 0x9083, 0xE2C5, 0x9084, 0xFCBD, + 0x9087, 0xECC4, 0x9088, 0xD8B1, 0x908A, 0xDCAB, 0x908F, 0xD5A4, + 0x9091, 0xEBE9, 0x9095, 0xE8BB, 0x9099, 0xD8D7, 0x90A2, 0xFBAE, + 0x90A3, 0xD1E1, 0x90A6, 0xDBC0, 0x90A8, 0xF5BE, 0x90AA, 0xDEF7, + 0x90AF, 0xCAFB, 0x90B0, 0xF7C6, 0x90B1, 0xCFC8, 0x90B5, 0xE1D0, + 0x90B8, 0xEED0, 0x90C1, 0xE9F4, 0x90CA, 0xCEF4, 0x90DE, 0xD5CD, + 0x90E1, 0xCFDB, 0x90E8, 0xDDBB, 0x90ED, 0xCEAC, 0x90F5, 0xE9E8, + 0x90FD, 0xD4B4, 0x9102, 0xE4C7, 0x9112, 0xF5DB, 0x9115, 0xFAC1, + 0x9119, 0xDEA9, 0x9127, 0xD4F8, 0x912D, 0xEFF7, 0x9132, 0xD3B3, + 0x9149, 0xEBB7, 0x914A, 0xEFF8, 0x914B, 0xF5DC, 0x914C, 0xEDCC, + 0x914D, 0xDBD5, 0x914E, 0xF1CF, 0x9152, 0xF1D0, 0x9162, 0xF5B2, + 0x9169, 0xD9AE, 0x916A, 0xD5AC, 0x916C, 0xE2C6, 0x9175, 0xFDA3, + 0x9177, 0xFBE5, 0x9178, 0xDFAB, 0x9187, 0xE2F5, 0x9189, 0xF6AD, + 0x918B, 0xF5B3, 0x918D, 0xF0B5, 0x9192, 0xE1A5, 0x919C, 0xF5DD, + 0x91AB, 0xECA2, 0x91AC, 0xEDFD, 0x91AE, 0xF5B4, 0x91AF, 0xFBB8, + 0x91B1, 0xDBA3, 0x91B4, 0xD6CA, 0x91B5, 0xCBD9, 0x91C0, 0xE5D4, + 0x91C7, 0xF3FA, 0x91C9, 0xEBB8, 0x91CB, 0xE0B7, 0x91CC, 0xD7EC, + 0x91CD, 0xF1EC, 0x91CE, 0xE5AF, 0x91CF, 0xD5E1, 0x91D0, 0xD7ED, + 0x91D1, 0xD1D1, 0x91D7, 0xE1F2, 0x91D8, 0xEFF9, 0x91DC, 0xDDBC, + 0x91DD, 0xF6DC, 0x91E3, 0xF0E5, 0x91E7, 0xF4C4, 0x91EA, 0xE9E9, + 0x91F5, 0xF3FB, 0x920D, 0xD4EF, 0x9210, 0xCCA2, 0x9211, 0xF7FE, + 0x9212, 0xDFBC, 0x9217, 0xEBCD, 0x921E, 0xD0B7, 0x9234, 0xD6C2, + 0x923A, 0xE8AD, 0x923F, 0xEFAF, 0x9240, 0xCBA5, 0x9245, 0xCBE9, + 0x9249, 0xFAE8, 0x9257, 0xCCC6, 0x925B, 0xE6E7, 0x925E, 0xEAC7, + 0x9262, 0xDBA4, 0x9264, 0xCFC9, 0x9265, 0xE2FC, 0x9266, 0xEFFA, + 0x9280, 0xEBDE, 0x9283, 0xF5C8, 0x9285, 0xD4DE, 0x9291, 0xE0D5, + 0x9293, 0xEFB0, 0x9296, 0xE2C7, 0x9298, 0xD9AF, 0x929C, 0xF9E7, + 0x92B3, 0xE7E5, 0x92B6, 0xCFCA, 0x92B7, 0xE1D1, 0x92B9, 0xE2C8, + 0x92CC, 0xEFFB, 0x92CF, 0xFAF9, 0x92D2, 0xDCF2, 0x92E4, 0xE0A7, + 0x92EA, 0xF8E8, 0x92F8, 0xCBEA, 0x92FC, 0xCBBC, 0x9304, 0xD6E2, + 0x9310, 0xF5DE, 0x9318, 0xF5DF, 0x931A, 0xEEB6, 0x931E, 0xE2F6, + 0x931F, 0xD3CA, 0x9320, 0xEFFC, 0x9321, 0xD1C4, 0x9322, 0xEFB1, + 0x9324, 0xD1C5, 0x9326, 0xD0DE, 0x9328, 0xD9E1, 0x932B, 0xE0B8, + 0x932E, 0xCDD1, 0x932F, 0xF3B9, 0x9348, 0xE7CC, 0x934A, 0xD6A8, + 0x934B, 0xCEA7, 0x934D, 0xD4B5, 0x9354, 0xE4C8, 0x935B, 0xD3B4, + 0x936E, 0xEBB9, 0x9375, 0xCBF5, 0x937C, 0xF6DD, 0x937E, 0xF1A3, + 0x938C, 0xCCC7, 0x9394, 0xE9CA, 0x9396, 0xE1F0, 0x939A, 0xF5E0, + 0x93A3, 0xFBAF, 0x93A7, 0xCBD1, 0x93AC, 0xFBE0, 0x93AD, 0xF2E5, + 0x93B0, 0xECF0, 0x93C3, 0xF0EC, 0x93D1, 0xEEEB, 0x93DE, 0xE9CB, + 0x93E1, 0xCCF0, 0x93E4, 0xD7AF, 0x93F6, 0xF3A1, 0x9404, 0xFCF5, + 0x9418, 0xF1A4, 0x9425, 0xE0D6, 0x942B, 0xEFB2, 0x9435, 0xF4D1, + 0x9438, 0xF7A1, 0x9444, 0xF1D1, 0x9451, 0xCAFC, 0x9452, 0xCAFD, + 0x945B, 0xCECE, 0x947D, 0xF3C8, 0x947F, 0xF3BA, 0x9577, 0xEDFE, + 0x9580, 0xDAA6, 0x9583, 0xE0EC, 0x9589, 0xF8CD, 0x958B, 0xCBD2, + 0x958F, 0xEBCE, 0x9591, 0xF9D8, 0x9592, 0xF9D9, 0x9593, 0xCAE0, + 0x9594, 0xDACA, 0x9598, 0xCBA6, 0x95A3, 0xCAC8, 0x95A4, 0xF9EE, + 0x95A5, 0xDBEC, 0x95A8, 0xD0B1, 0x95AD, 0xD5EF, 0x95B1, 0xE6F3, + 0x95BB, 0xE7A2, 0x95BC, 0xE4D9, 0x95C7, 0xE4E1, 0x95CA, 0xFCC4, + 0x95D4, 0xF9EF, 0x95D5, 0xCFF4, 0x95D6, 0xF7E6, 0x95DC, 0xCEBC, + 0x95E1, 0xF4C5, 0x95E2, 0xDCA3, 0x961C, 0xDDBD, 0x9621, 0xF4C6, + 0x962A, 0xF8A1, 0x962E, 0xE8D6, 0x9632, 0xDBC1, 0x963B, 0xF0E6, + 0x963F, 0xE4B9, 0x9640, 0xF6ED, 0x9642, 0xF9AE, 0x9644, 0xDDBE, + 0x964B, 0xD7B0, 0x964C, 0xD8E8, 0x964D, 0xCBBD, 0x9650, 0xF9DA, + 0x965B, 0xF8CE, 0x965C, 0xF9F0, 0x965D, 0xE0ED, 0x965E, 0xE3B3, + 0x965F, 0xF4B3, 0x9662, 0xEAC2, 0x9663, 0xF2E6, 0x9664, 0xF0B6, + 0x966A, 0xDBD6, 0x9670, 0xEBE4, 0x9673, 0xF2E7, 0x9675, 0xD7D5, + 0x9676, 0xD4B6, 0x9677, 0xF9E8, 0x9678, 0xD7C1, 0x967D, 0xE5D5, + 0x9685, 0xE9EA, 0x9686, 0xD7CC, 0x968A, 0xD3E9, 0x968B, 0xE2C9, + 0x968D, 0xFCDB, 0x968E, 0xCDAD, 0x9694, 0xCCB0, 0x9695, 0xEAA2, + 0x9698, 0xE4F6, 0x9699, 0xD0C0, 0x969B, 0xF0B7, 0x969C, 0xEEA1, + 0x96A3, 0xD7F6, 0x96A7, 0xE2CA, 0x96A8, 0xE2CB, 0x96AA, 0xFACF, + 0x96B1, 0xEBDF, 0x96B7, 0xD6CB, 0x96BB, 0xF4B4, 0x96C0, 0xEDCD, + 0x96C1, 0xE4D2, 0x96C4, 0xEAA9, 0x96C5, 0xE4BA, 0x96C6, 0xF3A2, + 0x96C7, 0xCDD2, 0x96C9, 0xF6CB, 0x96CB, 0xF1E6, 0x96CC, 0xEDC1, + 0x96CD, 0xE8BC, 0x96CE, 0xEED1, 0x96D5, 0xF0E7, 0x96D6, 0xE2CC, + 0x96D9, 0xE4AA, 0x96DB, 0xF5E1, 0x96DC, 0xEDDA, 0x96E2, 0xD7EE, + 0x96E3, 0xD1F1, 0x96E8, 0xE9EB, 0x96E9, 0xE9EC, 0x96EA, 0xE0E4, + 0x96EF, 0xDAA7, 0x96F0, 0xDDD4, 0x96F2, 0xEAA3, 0x96F6, 0xD6C3, + 0x96F7, 0xD6F4, 0x96F9, 0xDADF, 0x96FB, 0xEFB3, 0x9700, 0xE2CD, + 0x9706, 0xEFFD, 0x9707, 0xF2E8, 0x9711, 0xEFC5, 0x9713, 0xE7E7, + 0x9716, 0xD7FD, 0x9719, 0xE7CE, 0x971C, 0xDFDC, 0x971E, 0xF9C7, + 0x9727, 0xD9F6, 0x9730, 0xDFAC, 0x9732, 0xD6DA, 0x9739, 0xDCA4, + 0x973D, 0xF0B8, 0x9742, 0xD5FA, 0x9744, 0xE4F7, 0x9748, 0xD6C4, + 0x9751, 0xF4EC, 0x9756, 0xEFFE, 0x975C, 0xF0A1, 0x975E, 0xDEAA, + 0x9761, 0xDABC, 0x9762, 0xD8FC, 0x9769, 0xFAD4, 0x976D, 0xECE5, + 0x9774, 0xFCA8, 0x9777, 0xECE6, 0x977A, 0xD8CB, 0x978B, 0xFBB9, + 0x978D, 0xE4D3, 0x978F, 0xCDF9, 0x97A0, 0xCFD3, 0x97A8, 0xCAEA, + 0x97AB, 0xCFD4, 0x97AD, 0xF8BD, 0x97C6, 0xF4C7, 0x97CB, 0xEADF, + 0x97D3, 0xF9DB, 0x97DC, 0xD4B7, 0x97F3, 0xEBE5, 0x97F6, 0xE1D2, + 0x97FB, 0xEAA4, 0x97FF, 0xFAC2, 0x9800, 0xFBE1, 0x9801, 0xFAED, + 0x9802, 0xF0A2, 0x9803, 0xCCF1, 0x9805, 0xFAA3, 0x9806, 0xE2F7, + 0x9808, 0xE2CE, 0x980A, 0xE9F5, 0x980C, 0xE1EB, 0x9810, 0xE7E8, + 0x9811, 0xE8D7, 0x9812, 0xDAF8, 0x9813, 0xD4CB, 0x9817, 0xF7F6, + 0x9818, 0xD6C5, 0x982D, 0xD4E9, 0x9830, 0xFAFA, 0x9838, 0xCCF2, + 0x9839, 0xF7DD, 0x983B, 0xDEBA, 0x9846, 0xCEA8, 0x984C, 0xF0B9, + 0x984D, 0xE4FE, 0x984E, 0xE4C9, 0x9854, 0xE4D4, 0x9858, 0xEAC3, + 0x985A, 0xEFB4, 0x985E, 0xD7BE, 0x9865, 0xFBE2, 0x9867, 0xCDD3, + 0x986B, 0xEFB5, 0x986F, 0xFAE9, 0x98A8, 0xF9A6, 0x98AF, 0xDFBD, + 0x98B1, 0xF7C7, 0x98C4, 0xF8FD, 0x98C7, 0xF8FC, 0x98DB, 0xDEAB, + 0x98DC, 0xDBE8, 0x98DF, 0xE3DD, 0x98E1, 0xE1E2, 0x98E2, 0xD1C6, + 0x98ED, 0xF6D0, 0x98EE, 0xEBE6, 0x98EF, 0xDAF9, 0x98F4, 0xECC7, + 0x98FC, 0xDEF8, 0x98FD, 0xF8E9, 0x98FE, 0xE3DE, 0x9903, 0xCEF5, + 0x9909, 0xFAC3, 0x990A, 0xE5D7, 0x990C, 0xECC8, 0x9910, 0xF3C9, + 0x9913, 0xE4BB, 0x9918, 0xE6AE, 0x991E, 0xEFB6, 0x9920, 0xDCBF, + 0x9928, 0xCEBD, 0x9945, 0xD8C3, 0x9949, 0xD0CF, 0x994B, 0xCFFA, + 0x994C, 0xF3CA, 0x994D, 0xE0D7, 0x9951, 0xD1C7, 0x9952, 0xE9AE, + 0x9954, 0xE8BD, 0x9957, 0xFAC4, 0x9996, 0xE2CF, 0x9999, 0xFAC5, + 0x999D, 0xF9B8, 0x99A5, 0xDCE0, 0x99A8, 0xFBB0, 0x99AC, 0xD8A9, + 0x99AD, 0xE5DF, 0x99AE, 0xF9A7, 0x99B1, 0xF6EE, 0x99B3, 0xF6CC, + 0x99B4, 0xE2F8, 0x99B9, 0xECF1, 0x99C1, 0xDAE0, 0x99D0, 0xF1D2, + 0x99D1, 0xD2CC, 0x99D2, 0xCFCB, 0x99D5, 0xCABD, 0x99D9, 0xDDBF, + 0x99DD, 0xF6EF, 0x99DF, 0xDEF9, 0x99ED, 0xFAB4, 0x99F1, 0xD5AD, + 0x99FF, 0xF1E7, 0x9A01, 0xDEBE, 0x9A08, 0xDCC0, 0x9A0E, 0xD1C8, + 0x9A0F, 0xD1C9, 0x9A19, 0xF8BE, 0x9A2B, 0xCBF6, 0x9A30, 0xD4F9, + 0x9A36, 0xF5E2, 0x9A37, 0xE1D3, 0x9A40, 0xD8E9, 0x9A43, 0xF8FE, + 0x9A45, 0xCFCC, 0x9A4D, 0xFDA4, 0x9A55, 0xCEF6, 0x9A57, 0xFAD0, + 0x9A5A, 0xCCF3, 0x9A5B, 0xE6BE, 0x9A5F, 0xF6AE, 0x9A62, 0xD5F0, + 0x9A65, 0xD1CA, 0x9A69, 0xFCBE, 0x9A6A, 0xD5F1, 0x9AA8, 0xCDE9, + 0x9AB8, 0xFAB5, 0x9AD3, 0xE2D0, 0x9AD4, 0xF4F7, 0x9AD8, 0xCDD4, + 0x9AE5, 0xE7A3, 0x9AEE, 0xDBA5, 0x9B1A, 0xE2D1, 0x9B27, 0xD7A2, + 0x9B2A, 0xF7E3, 0x9B31, 0xEAA6, 0x9B3C, 0xD0A1, 0x9B41, 0xCEDA, + 0x9B42, 0xFBEB, 0x9B43, 0xDBA6, 0x9B44, 0xDBDE, 0x9B45, 0xD8E5, + 0x9B4F, 0xEAE0, 0x9B54, 0xD8AA, 0x9B5A, 0xE5E0, 0x9B6F, 0xD6DB, + 0x9B8E, 0xEFC6, 0x9B91, 0xF8EA, 0x9B9F, 0xE4D5, 0x9BAB, 0xCEF7, + 0x9BAE, 0xE0D8, 0x9BC9, 0xD7EF, 0x9BD6, 0xF4ED, 0x9BE4, 0xCDE6, + 0x9BE8, 0xCCF4, 0x9C0D, 0xF5E3, 0x9C10, 0xE4CA, 0x9C12, 0xDCE1, + 0x9C15, 0xF9C8, 0x9C25, 0xFCBF, 0x9C32, 0xE8A7, 0x9C3B, 0xD8C4, + 0x9C47, 0xCBBE, 0x9C49, 0xDCAE, 0x9C57, 0xD7F7, 0x9CE5, 0xF0E8, + 0x9CE7, 0xDDC0, 0x9CE9, 0xCFCD, 0x9CF3, 0xDCF3, 0x9CF4, 0xD9B0, + 0x9CF6, 0xE6E9, 0x9D09, 0xE4BC, 0x9D1B, 0xEAC4, 0x9D26, 0xE4EC, + 0x9D28, 0xE4E5, 0x9D3B, 0xFBF8, 0x9D51, 0xCCBB, 0x9D5D, 0xE4BD, + 0x9D60, 0xCDDC, 0x9D61, 0xD9F7, 0x9D6C, 0xDDDF, 0x9D72, 0xEDCE, + 0x9DA9, 0xD9D0, 0x9DAF, 0xE5A3, 0x9DB4, 0xF9CD, 0x9DC4, 0xCDAE, + 0x9DD7, 0xCFCE, 0x9DF2, 0xF6AF, 0x9DF8, 0xFDD3, 0x9DF9, 0xEBED, + 0x9DFA, 0xD6DC, 0x9E1A, 0xE5A4, 0x9E1E, 0xD5B6, 0x9E75, 0xD6DD, + 0x9E79, 0xF9E9, 0x9E7D, 0xE7A4, 0x9E7F, 0xD6E3, 0x9E92, 0xD1CB, + 0x9E93, 0xD6E4, 0x9E97, 0xD5F2, 0x9E9D, 0xDEFA, 0x9E9F, 0xD7F8, + 0x9EA5, 0xD8EA, 0x9EB4, 0xCFD5, 0x9EB5, 0xD8FD, 0x9EBB, 0xD8AB, + 0x9EBE, 0xFDCB, 0x9EC3, 0xFCDC, 0x9ECD, 0xE0A8, 0x9ECE, 0xD5F3, + 0x9ED1, 0xFDD9, 0x9ED4, 0xCCA3, 0x9ED8, 0xD9F9, 0x9EDB, 0xD3EA, + 0x9EDC, 0xF5F5, 0x9EDE, 0xEFC7, 0x9EE8, 0xD3DA, 0x9EF4, 0xDABD, + 0x9F07, 0xE8A8, 0x9F08, 0xDCAF, 0x9F0E, 0xF0A3, 0x9F13, 0xCDD5, + 0x9F20, 0xE0A9, 0x9F3B, 0xDEAC, 0x9F4A, 0xF0BA, 0x9F4B, 0xEEB1, + 0x9F4E, 0xEEB2, 0x9F52, 0xF6CD, 0x9F5F, 0xEED2, 0x9F61, 0xD6C6, + 0x9F67, 0xE0E5, 0x9F6A, 0xF3BB, 0x9F6C, 0xE5E1, 0x9F77, 0xE4CB, + 0x9F8D, 0xD7A3, 0x9F90, 0xDBC2, 0x9F95, 0xCAFE, 0x9F9C, 0xCFCF, + 0xAC00, 0xB0A1, 0xAC01, 0xB0A2, 0xAC02, 0x8141, 0xAC03, 0x8142, + 0xAC04, 0xB0A3, 0xAC05, 0x8143, 0xAC06, 0x8144, 0xAC07, 0xB0A4, + 0xAC08, 0xB0A5, 0xAC09, 0xB0A6, 0xAC0A, 0xB0A7, 0xAC0B, 0x8145, + 0xAC0C, 0x8146, 0xAC0D, 0x8147, 0xAC0E, 0x8148, 0xAC0F, 0x8149, + 0xAC10, 0xB0A8, 0xAC11, 0xB0A9, 0xAC12, 0xB0AA, 0xAC13, 0xB0AB, + 0xAC14, 0xB0AC, 0xAC15, 0xB0AD, 0xAC16, 0xB0AE, 0xAC17, 0xB0AF, + 0xAC18, 0x814A, 0xAC19, 0xB0B0, 0xAC1A, 0xB0B1, 0xAC1B, 0xB0B2, + 0xAC1C, 0xB0B3, 0xAC1D, 0xB0B4, 0xAC1E, 0x814B, 0xAC1F, 0x814C, + 0xAC20, 0xB0B5, 0xAC21, 0x814D, 0xAC22, 0x814E, 0xAC23, 0x814F, + 0xAC24, 0xB0B6, 0xAC25, 0x8150, 0xAC26, 0x8151, 0xAC27, 0x8152, + 0xAC28, 0x8153, 0xAC29, 0x8154, 0xAC2A, 0x8155, 0xAC2B, 0x8156, + 0xAC2C, 0xB0B7, 0xAC2D, 0xB0B8, 0xAC2E, 0x8157, 0xAC2F, 0xB0B9, + 0xAC30, 0xB0BA, 0xAC31, 0xB0BB, 0xAC32, 0x8158, 0xAC33, 0x8159, + 0xAC34, 0x815A, 0xAC35, 0x8161, 0xAC36, 0x8162, 0xAC37, 0x8163, + 0xAC38, 0xB0BC, 0xAC39, 0xB0BD, 0xAC3A, 0x8164, 0xAC3B, 0x8165, + 0xAC3C, 0xB0BE, 0xAC3D, 0x8166, 0xAC3E, 0x8167, 0xAC3F, 0x8168, + 0xAC40, 0xB0BF, 0xAC41, 0x8169, 0xAC42, 0x816A, 0xAC43, 0x816B, + 0xAC44, 0x816C, 0xAC45, 0x816D, 0xAC46, 0x816E, 0xAC47, 0x816F, + 0xAC48, 0x8170, 0xAC49, 0x8171, 0xAC4A, 0x8172, 0xAC4B, 0xB0C0, + 0xAC4C, 0x8173, 0xAC4D, 0xB0C1, 0xAC4E, 0x8174, 0xAC4F, 0x8175, + 0xAC50, 0x8176, 0xAC51, 0x8177, 0xAC52, 0x8178, 0xAC53, 0x8179, + 0xAC54, 0xB0C2, 0xAC55, 0x817A, 0xAC56, 0x8181, 0xAC57, 0x8182, + 0xAC58, 0xB0C3, 0xAC59, 0x8183, 0xAC5A, 0x8184, 0xAC5B, 0x8185, + 0xAC5C, 0xB0C4, 0xAC5D, 0x8186, 0xAC5E, 0x8187, 0xAC5F, 0x8188, + 0xAC60, 0x8189, 0xAC61, 0x818A, 0xAC62, 0x818B, 0xAC63, 0x818C, + 0xAC64, 0x818D, 0xAC65, 0x818E, 0xAC66, 0x818F, 0xAC67, 0x8190, + 0xAC68, 0x8191, 0xAC69, 0x8192, 0xAC6A, 0x8193, 0xAC6B, 0x8194, + 0xAC6C, 0x8195, 0xAC6D, 0x8196, 0xAC6E, 0x8197, 0xAC6F, 0x8198, + 0xAC70, 0xB0C5, 0xAC71, 0xB0C6, 0xAC72, 0x8199, 0xAC73, 0x819A, + 0xAC74, 0xB0C7, 0xAC75, 0x819B, 0xAC76, 0x819C, 0xAC77, 0xB0C8, + 0xAC78, 0xB0C9, 0xAC79, 0x819D, 0xAC7A, 0xB0CA, 0xAC7B, 0x819E, + 0xAC7C, 0x819F, 0xAC7D, 0x81A0, 0xAC7E, 0x81A1, 0xAC7F, 0x81A2, + 0xAC80, 0xB0CB, 0xAC81, 0xB0CC, 0xAC82, 0x81A3, 0xAC83, 0xB0CD, + 0xAC84, 0xB0CE, 0xAC85, 0xB0CF, 0xAC86, 0xB0D0, 0xAC87, 0x81A4, + 0xAC88, 0x81A5, 0xAC89, 0xB0D1, 0xAC8A, 0xB0D2, 0xAC8B, 0xB0D3, + 0xAC8C, 0xB0D4, 0xAC8D, 0x81A6, 0xAC8E, 0x81A7, 0xAC8F, 0x81A8, + 0xAC90, 0xB0D5, 0xAC91, 0x81A9, 0xAC92, 0x81AA, 0xAC93, 0x81AB, + 0xAC94, 0xB0D6, 0xAC95, 0x81AC, 0xAC96, 0x81AD, 0xAC97, 0x81AE, + 0xAC98, 0x81AF, 0xAC99, 0x81B0, 0xAC9A, 0x81B1, 0xAC9B, 0x81B2, + 0xAC9C, 0xB0D7, 0xAC9D, 0xB0D8, 0xAC9E, 0x81B3, 0xAC9F, 0xB0D9, + 0xACA0, 0xB0DA, 0xACA1, 0xB0DB, 0xACA2, 0x81B4, 0xACA3, 0x81B5, + 0xACA4, 0x81B6, 0xACA5, 0x81B7, 0xACA6, 0x81B8, 0xACA7, 0x81B9, + 0xACA8, 0xB0DC, 0xACA9, 0xB0DD, 0xACAA, 0xB0DE, 0xACAB, 0x81BA, + 0xACAC, 0xB0DF, 0xACAD, 0x81BB, 0xACAE, 0x81BC, 0xACAF, 0xB0E0, + 0xACB0, 0xB0E1, 0xACB1, 0x81BD, 0xACB2, 0x81BE, 0xACB3, 0x81BF, + 0xACB4, 0x81C0, 0xACB5, 0x81C1, 0xACB6, 0x81C2, 0xACB7, 0x81C3, + 0xACB8, 0xB0E2, 0xACB9, 0xB0E3, 0xACBA, 0x81C4, 0xACBB, 0xB0E4, + 0xACBC, 0xB0E5, 0xACBD, 0xB0E6, 0xACBE, 0x81C5, 0xACBF, 0x81C6, + 0xACC0, 0x81C7, 0xACC1, 0xB0E7, 0xACC2, 0x81C8, 0xACC3, 0x81C9, + 0xACC4, 0xB0E8, 0xACC5, 0x81CA, 0xACC6, 0x81CB, 0xACC7, 0x81CC, + 0xACC8, 0xB0E9, 0xACC9, 0x81CD, 0xACCA, 0x81CE, 0xACCB, 0x81CF, + 0xACCC, 0xB0EA, 0xACCD, 0x81D0, 0xACCE, 0x81D1, 0xACCF, 0x81D2, + 0xACD0, 0x81D3, 0xACD1, 0x81D4, 0xACD2, 0x81D5, 0xACD3, 0x81D6, + 0xACD4, 0x81D7, 0xACD5, 0xB0EB, 0xACD6, 0x81D8, 0xACD7, 0xB0EC, + 0xACD8, 0x81D9, 0xACD9, 0x81DA, 0xACDA, 0x81DB, 0xACDB, 0x81DC, + 0xACDC, 0x81DD, 0xACDD, 0x81DE, 0xACDE, 0x81DF, 0xACDF, 0x81E0, + 0xACE0, 0xB0ED, 0xACE1, 0xB0EE, 0xACE2, 0x81E1, 0xACE3, 0x81E2, + 0xACE4, 0xB0EF, 0xACE5, 0x81E3, 0xACE6, 0x81E4, 0xACE7, 0xB0F0, + 0xACE8, 0xB0F1, 0xACE9, 0x81E5, 0xACEA, 0xB0F2, 0xACEB, 0x81E6, + 0xACEC, 0xB0F3, 0xACED, 0x81E7, 0xACEE, 0x81E8, 0xACEF, 0xB0F4, + 0xACF0, 0xB0F5, 0xACF1, 0xB0F6, 0xACF2, 0x81E9, 0xACF3, 0xB0F7, + 0xACF4, 0x81EA, 0xACF5, 0xB0F8, 0xACF6, 0xB0F9, 0xACF7, 0x81EB, + 0xACF8, 0x81EC, 0xACF9, 0x81ED, 0xACFA, 0x81EE, 0xACFB, 0x81EF, + 0xACFC, 0xB0FA, 0xACFD, 0xB0FB, 0xACFE, 0x81F0, 0xACFF, 0x81F1, + 0xAD00, 0xB0FC, 0xAD01, 0x81F2, 0xAD02, 0x81F3, 0xAD03, 0x81F4, + 0xAD04, 0xB0FD, 0xAD05, 0x81F5, 0xAD06, 0xB0FE, 0xAD07, 0x81F6, + 0xAD08, 0x81F7, 0xAD09, 0x81F8, 0xAD0A, 0x81F9, 0xAD0B, 0x81FA, + 0xAD0C, 0xB1A1, 0xAD0D, 0xB1A2, 0xAD0E, 0x81FB, 0xAD0F, 0xB1A3, + 0xAD10, 0x81FC, 0xAD11, 0xB1A4, 0xAD12, 0x81FD, 0xAD13, 0x81FE, + 0xAD14, 0x8241, 0xAD15, 0x8242, 0xAD16, 0x8243, 0xAD17, 0x8244, + 0xAD18, 0xB1A5, 0xAD19, 0x8245, 0xAD1A, 0x8246, 0xAD1B, 0x8247, + 0xAD1C, 0xB1A6, 0xAD1D, 0x8248, 0xAD1E, 0x8249, 0xAD1F, 0x824A, + 0xAD20, 0xB1A7, 0xAD21, 0x824B, 0xAD22, 0x824C, 0xAD23, 0x824D, + 0xAD24, 0x824E, 0xAD25, 0x824F, 0xAD26, 0x8250, 0xAD27, 0x8251, + 0xAD28, 0x8252, 0xAD29, 0xB1A8, 0xAD2A, 0x8253, 0xAD2B, 0x8254, + 0xAD2C, 0xB1A9, 0xAD2D, 0xB1AA, 0xAD2E, 0x8255, 0xAD2F, 0x8256, + 0xAD30, 0x8257, 0xAD31, 0x8258, 0xAD32, 0x8259, 0xAD33, 0x825A, + 0xAD34, 0xB1AB, 0xAD35, 0xB1AC, 0xAD36, 0x8261, 0xAD37, 0x8262, + 0xAD38, 0xB1AD, 0xAD39, 0x8263, 0xAD3A, 0x8264, 0xAD3B, 0x8265, + 0xAD3C, 0xB1AE, 0xAD3D, 0x8266, 0xAD3E, 0x8267, 0xAD3F, 0x8268, + 0xAD40, 0x8269, 0xAD41, 0x826A, 0xAD42, 0x826B, 0xAD43, 0x826C, + 0xAD44, 0xB1AF, 0xAD45, 0xB1B0, 0xAD46, 0x826D, 0xAD47, 0xB1B1, + 0xAD48, 0x826E, 0xAD49, 0xB1B2, 0xAD4A, 0x826F, 0xAD4B, 0x8270, + 0xAD4C, 0x8271, 0xAD4D, 0x8272, 0xAD4E, 0x8273, 0xAD4F, 0x8274, + 0xAD50, 0xB1B3, 0xAD51, 0x8275, 0xAD52, 0x8276, 0xAD53, 0x8277, + 0xAD54, 0xB1B4, 0xAD55, 0x8278, 0xAD56, 0x8279, 0xAD57, 0x827A, + 0xAD58, 0xB1B5, 0xAD59, 0x8281, 0xAD5A, 0x8282, 0xAD5B, 0x8283, + 0xAD5C, 0x8284, 0xAD5D, 0x8285, 0xAD5E, 0x8286, 0xAD5F, 0x8287, + 0xAD60, 0x8288, 0xAD61, 0xB1B6, 0xAD62, 0x8289, 0xAD63, 0xB1B7, + 0xAD64, 0x828A, 0xAD65, 0x828B, 0xAD66, 0x828C, 0xAD67, 0x828D, + 0xAD68, 0x828E, 0xAD69, 0x828F, 0xAD6A, 0x8290, 0xAD6B, 0x8291, + 0xAD6C, 0xB1B8, 0xAD6D, 0xB1B9, 0xAD6E, 0x8292, 0xAD6F, 0x8293, + 0xAD70, 0xB1BA, 0xAD71, 0x8294, 0xAD72, 0x8295, 0xAD73, 0xB1BB, + 0xAD74, 0xB1BC, 0xAD75, 0xB1BD, 0xAD76, 0xB1BE, 0xAD77, 0x8296, + 0xAD78, 0x8297, 0xAD79, 0x8298, 0xAD7A, 0x8299, 0xAD7B, 0xB1BF, + 0xAD7C, 0xB1C0, 0xAD7D, 0xB1C1, 0xAD7E, 0x829A, 0xAD7F, 0xB1C2, + 0xAD80, 0x829B, 0xAD81, 0xB1C3, 0xAD82, 0xB1C4, 0xAD83, 0x829C, + 0xAD84, 0x829D, 0xAD85, 0x829E, 0xAD86, 0x829F, 0xAD87, 0x82A0, + 0xAD88, 0xB1C5, 0xAD89, 0xB1C6, 0xAD8A, 0x82A1, 0xAD8B, 0x82A2, + 0xAD8C, 0xB1C7, 0xAD8D, 0x82A3, 0xAD8E, 0x82A4, 0xAD8F, 0x82A5, + 0xAD90, 0xB1C8, 0xAD91, 0x82A6, 0xAD92, 0x82A7, 0xAD93, 0x82A8, + 0xAD94, 0x82A9, 0xAD95, 0x82AA, 0xAD96, 0x82AB, 0xAD97, 0x82AC, + 0xAD98, 0x82AD, 0xAD99, 0x82AE, 0xAD9A, 0x82AF, 0xAD9B, 0x82B0, + 0xAD9C, 0xB1C9, 0xAD9D, 0xB1CA, 0xAD9E, 0x82B1, 0xAD9F, 0x82B2, + 0xADA0, 0x82B3, 0xADA1, 0x82B4, 0xADA2, 0x82B5, 0xADA3, 0x82B6, + 0xADA4, 0xB1CB, 0xADA5, 0x82B7, 0xADA6, 0x82B8, 0xADA7, 0x82B9, + 0xADA8, 0x82BA, 0xADA9, 0x82BB, 0xADAA, 0x82BC, 0xADAB, 0x82BD, + 0xADAC, 0x82BE, 0xADAD, 0x82BF, 0xADAE, 0x82C0, 0xADAF, 0x82C1, + 0xADB0, 0x82C2, 0xADB1, 0x82C3, 0xADB2, 0x82C4, 0xADB3, 0x82C5, + 0xADB4, 0x82C6, 0xADB5, 0x82C7, 0xADB6, 0x82C8, 0xADB7, 0xB1CC, + 0xADB8, 0x82C9, 0xADB9, 0x82CA, 0xADBA, 0x82CB, 0xADBB, 0x82CC, + 0xADBC, 0x82CD, 0xADBD, 0x82CE, 0xADBE, 0x82CF, 0xADBF, 0x82D0, + 0xADC0, 0xB1CD, 0xADC1, 0xB1CE, 0xADC2, 0x82D1, 0xADC3, 0x82D2, + 0xADC4, 0xB1CF, 0xADC5, 0x82D3, 0xADC6, 0x82D4, 0xADC7, 0x82D5, + 0xADC8, 0xB1D0, 0xADC9, 0x82D6, 0xADCA, 0x82D7, 0xADCB, 0x82D8, + 0xADCC, 0x82D9, 0xADCD, 0x82DA, 0xADCE, 0x82DB, 0xADCF, 0x82DC, + 0xADD0, 0xB1D1, 0xADD1, 0xB1D2, 0xADD2, 0x82DD, 0xADD3, 0xB1D3, + 0xADD4, 0x82DE, 0xADD5, 0x82DF, 0xADD6, 0x82E0, 0xADD7, 0x82E1, + 0xADD8, 0x82E2, 0xADD9, 0x82E3, 0xADDA, 0x82E4, 0xADDB, 0x82E5, + 0xADDC, 0xB1D4, 0xADDD, 0x82E6, 0xADDE, 0x82E7, 0xADDF, 0x82E8, + 0xADE0, 0xB1D5, 0xADE1, 0x82E9, 0xADE2, 0x82EA, 0xADE3, 0x82EB, + 0xADE4, 0xB1D6, 0xADE5, 0x82EC, 0xADE6, 0x82ED, 0xADE7, 0x82EE, + 0xADE8, 0x82EF, 0xADE9, 0x82F0, 0xADEA, 0x82F1, 0xADEB, 0x82F2, + 0xADEC, 0x82F3, 0xADED, 0x82F4, 0xADEE, 0x82F5, 0xADEF, 0x82F6, + 0xADF0, 0x82F7, 0xADF1, 0x82F8, 0xADF2, 0x82F9, 0xADF3, 0x82FA, + 0xADF4, 0x82FB, 0xADF5, 0x82FC, 0xADF6, 0x82FD, 0xADF7, 0x82FE, + 0xADF8, 0xB1D7, 0xADF9, 0xB1D8, 0xADFA, 0x8341, 0xADFB, 0x8342, + 0xADFC, 0xB1D9, 0xADFD, 0x8343, 0xADFE, 0x8344, 0xADFF, 0xB1DA, + 0xAE00, 0xB1DB, 0xAE01, 0xB1DC, 0xAE02, 0x8345, 0xAE03, 0x8346, + 0xAE04, 0x8347, 0xAE05, 0x8348, 0xAE06, 0x8349, 0xAE07, 0x834A, + 0xAE08, 0xB1DD, 0xAE09, 0xB1DE, 0xAE0A, 0x834B, 0xAE0B, 0xB1DF, + 0xAE0C, 0x834C, 0xAE0D, 0xB1E0, 0xAE0E, 0x834D, 0xAE0F, 0x834E, + 0xAE10, 0x834F, 0xAE11, 0x8350, 0xAE12, 0x8351, 0xAE13, 0x8352, + 0xAE14, 0xB1E1, 0xAE15, 0x8353, 0xAE16, 0x8354, 0xAE17, 0x8355, + 0xAE18, 0x8356, 0xAE19, 0x8357, 0xAE1A, 0x8358, 0xAE1B, 0x8359, + 0xAE1C, 0x835A, 0xAE1D, 0x8361, 0xAE1E, 0x8362, 0xAE1F, 0x8363, + 0xAE20, 0x8364, 0xAE21, 0x8365, 0xAE22, 0x8366, 0xAE23, 0x8367, + 0xAE24, 0x8368, 0xAE25, 0x8369, 0xAE26, 0x836A, 0xAE27, 0x836B, + 0xAE28, 0x836C, 0xAE29, 0x836D, 0xAE2A, 0x836E, 0xAE2B, 0x836F, + 0xAE2C, 0x8370, 0xAE2D, 0x8371, 0xAE2E, 0x8372, 0xAE2F, 0x8373, + 0xAE30, 0xB1E2, 0xAE31, 0xB1E3, 0xAE32, 0x8374, 0xAE33, 0x8375, + 0xAE34, 0xB1E4, 0xAE35, 0x8376, 0xAE36, 0x8377, 0xAE37, 0xB1E5, + 0xAE38, 0xB1E6, 0xAE39, 0x8378, 0xAE3A, 0xB1E7, 0xAE3B, 0x8379, + 0xAE3C, 0x837A, 0xAE3D, 0x8381, 0xAE3E, 0x8382, 0xAE3F, 0x8383, + 0xAE40, 0xB1E8, 0xAE41, 0xB1E9, 0xAE42, 0x8384, 0xAE43, 0xB1EA, + 0xAE44, 0x8385, 0xAE45, 0xB1EB, 0xAE46, 0xB1EC, 0xAE47, 0x8386, + 0xAE48, 0x8387, 0xAE49, 0x8388, 0xAE4A, 0xB1ED, 0xAE4B, 0x8389, + 0xAE4C, 0xB1EE, 0xAE4D, 0xB1EF, 0xAE4E, 0xB1F0, 0xAE4F, 0x838A, + 0xAE50, 0xB1F1, 0xAE51, 0x838B, 0xAE52, 0x838C, 0xAE53, 0x838D, + 0xAE54, 0xB1F2, 0xAE55, 0x838E, 0xAE56, 0xB1F3, 0xAE57, 0x838F, + 0xAE58, 0x8390, 0xAE59, 0x8391, 0xAE5A, 0x8392, 0xAE5B, 0x8393, + 0xAE5C, 0xB1F4, 0xAE5D, 0xB1F5, 0xAE5E, 0x8394, 0xAE5F, 0xB1F6, + 0xAE60, 0xB1F7, 0xAE61, 0xB1F8, 0xAE62, 0x8395, 0xAE63, 0x8396, + 0xAE64, 0x8397, 0xAE65, 0xB1F9, 0xAE66, 0x8398, 0xAE67, 0x8399, + 0xAE68, 0xB1FA, 0xAE69, 0xB1FB, 0xAE6A, 0x839A, 0xAE6B, 0x839B, + 0xAE6C, 0xB1FC, 0xAE6D, 0x839C, 0xAE6E, 0x839D, 0xAE6F, 0x839E, + 0xAE70, 0xB1FD, 0xAE71, 0x839F, 0xAE72, 0x83A0, 0xAE73, 0x83A1, + 0xAE74, 0x83A2, 0xAE75, 0x83A3, 0xAE76, 0x83A4, 0xAE77, 0x83A5, + 0xAE78, 0xB1FE, 0xAE79, 0xB2A1, 0xAE7A, 0x83A6, 0xAE7B, 0xB2A2, + 0xAE7C, 0xB2A3, 0xAE7D, 0xB2A4, 0xAE7E, 0x83A7, 0xAE7F, 0x83A8, + 0xAE80, 0x83A9, 0xAE81, 0x83AA, 0xAE82, 0x83AB, 0xAE83, 0x83AC, + 0xAE84, 0xB2A5, 0xAE85, 0xB2A6, 0xAE86, 0x83AD, 0xAE87, 0x83AE, + 0xAE88, 0x83AF, 0xAE89, 0x83B0, 0xAE8A, 0x83B1, 0xAE8B, 0x83B2, + 0xAE8C, 0xB2A7, 0xAE8D, 0x83B3, 0xAE8E, 0x83B4, 0xAE8F, 0x83B5, + 0xAE90, 0x83B6, 0xAE91, 0x83B7, 0xAE92, 0x83B8, 0xAE93, 0x83B9, + 0xAE94, 0x83BA, 0xAE95, 0x83BB, 0xAE96, 0x83BC, 0xAE97, 0x83BD, + 0xAE98, 0x83BE, 0xAE99, 0x83BF, 0xAE9A, 0x83C0, 0xAE9B, 0x83C1, + 0xAE9C, 0x83C2, 0xAE9D, 0x83C3, 0xAE9E, 0x83C4, 0xAE9F, 0x83C5, + 0xAEA0, 0x83C6, 0xAEA1, 0x83C7, 0xAEA2, 0x83C8, 0xAEA3, 0x83C9, + 0xAEA4, 0x83CA, 0xAEA5, 0x83CB, 0xAEA6, 0x83CC, 0xAEA7, 0x83CD, + 0xAEA8, 0x83CE, 0xAEA9, 0x83CF, 0xAEAA, 0x83D0, 0xAEAB, 0x83D1, + 0xAEAC, 0x83D2, 0xAEAD, 0x83D3, 0xAEAE, 0x83D4, 0xAEAF, 0x83D5, + 0xAEB0, 0x83D6, 0xAEB1, 0x83D7, 0xAEB2, 0x83D8, 0xAEB3, 0x83D9, + 0xAEB4, 0x83DA, 0xAEB5, 0x83DB, 0xAEB6, 0x83DC, 0xAEB7, 0x83DD, + 0xAEB8, 0x83DE, 0xAEB9, 0x83DF, 0xAEBA, 0x83E0, 0xAEBB, 0x83E1, + 0xAEBC, 0xB2A8, 0xAEBD, 0xB2A9, 0xAEBE, 0xB2AA, 0xAEBF, 0x83E2, + 0xAEC0, 0xB2AB, 0xAEC1, 0x83E3, 0xAEC2, 0x83E4, 0xAEC3, 0x83E5, + 0xAEC4, 0xB2AC, 0xAEC5, 0x83E6, 0xAEC6, 0x83E7, 0xAEC7, 0x83E8, + 0xAEC8, 0x83E9, 0xAEC9, 0x83EA, 0xAECA, 0x83EB, 0xAECB, 0x83EC, + 0xAECC, 0xB2AD, 0xAECD, 0xB2AE, 0xAECE, 0x83ED, 0xAECF, 0xB2AF, + 0xAED0, 0xB2B0, 0xAED1, 0xB2B1, 0xAED2, 0x83EE, 0xAED3, 0x83EF, + 0xAED4, 0x83F0, 0xAED5, 0x83F1, 0xAED6, 0x83F2, 0xAED7, 0x83F3, + 0xAED8, 0xB2B2, 0xAED9, 0xB2B3, 0xAEDA, 0x83F4, 0xAEDB, 0x83F5, + 0xAEDC, 0xB2B4, 0xAEDD, 0x83F6, 0xAEDE, 0x83F7, 0xAEDF, 0x83F8, + 0xAEE0, 0x83F9, 0xAEE1, 0x83FA, 0xAEE2, 0x83FB, 0xAEE3, 0x83FC, + 0xAEE4, 0x83FD, 0xAEE5, 0x83FE, 0xAEE6, 0x8441, 0xAEE7, 0x8442, + 0xAEE8, 0xB2B5, 0xAEE9, 0x8443, 0xAEEA, 0x8444, 0xAEEB, 0xB2B6, + 0xAEEC, 0x8445, 0xAEED, 0xB2B7, 0xAEEE, 0x8446, 0xAEEF, 0x8447, + 0xAEF0, 0x8448, 0xAEF1, 0x8449, 0xAEF2, 0x844A, 0xAEF3, 0x844B, + 0xAEF4, 0xB2B8, 0xAEF5, 0x844C, 0xAEF6, 0x844D, 0xAEF7, 0x844E, + 0xAEF8, 0xB2B9, 0xAEF9, 0x844F, 0xAEFA, 0x8450, 0xAEFB, 0x8451, + 0xAEFC, 0xB2BA, 0xAEFD, 0x8452, 0xAEFE, 0x8453, 0xAEFF, 0x8454, + 0xAF00, 0x8455, 0xAF01, 0x8456, 0xAF02, 0x8457, 0xAF03, 0x8458, + 0xAF04, 0x8459, 0xAF05, 0x845A, 0xAF06, 0x8461, 0xAF07, 0xB2BB, + 0xAF08, 0xB2BC, 0xAF09, 0x8462, 0xAF0A, 0x8463, 0xAF0B, 0x8464, + 0xAF0C, 0x8465, 0xAF0D, 0xB2BD, 0xAF0E, 0x8466, 0xAF0F, 0x8467, + 0xAF10, 0xB2BE, 0xAF11, 0x8468, 0xAF12, 0x8469, 0xAF13, 0x846A, + 0xAF14, 0x846B, 0xAF15, 0x846C, 0xAF16, 0x846D, 0xAF17, 0x846E, + 0xAF18, 0x846F, 0xAF19, 0x8470, 0xAF1A, 0x8471, 0xAF1B, 0x8472, + 0xAF1C, 0x8473, 0xAF1D, 0x8474, 0xAF1E, 0x8475, 0xAF1F, 0x8476, + 0xAF20, 0x8477, 0xAF21, 0x8478, 0xAF22, 0x8479, 0xAF23, 0x847A, + 0xAF24, 0x8481, 0xAF25, 0x8482, 0xAF26, 0x8483, 0xAF27, 0x8484, + 0xAF28, 0x8485, 0xAF29, 0x8486, 0xAF2A, 0x8487, 0xAF2B, 0x8488, + 0xAF2C, 0xB2BF, 0xAF2D, 0xB2C0, 0xAF2E, 0x8489, 0xAF2F, 0x848A, + 0xAF30, 0xB2C1, 0xAF31, 0x848B, 0xAF32, 0xB2C2, 0xAF33, 0x848C, + 0xAF34, 0xB2C3, 0xAF35, 0x848D, 0xAF36, 0x848E, 0xAF37, 0x848F, + 0xAF38, 0x8490, 0xAF39, 0x8491, 0xAF3A, 0x8492, 0xAF3B, 0x8493, + 0xAF3C, 0xB2C4, 0xAF3D, 0xB2C5, 0xAF3E, 0x8494, 0xAF3F, 0xB2C6, + 0xAF40, 0x8495, 0xAF41, 0xB2C7, 0xAF42, 0xB2C8, 0xAF43, 0xB2C9, + 0xAF44, 0x8496, 0xAF45, 0x8497, 0xAF46, 0x8498, 0xAF47, 0x8499, + 0xAF48, 0xB2CA, 0xAF49, 0xB2CB, 0xAF4A, 0x849A, 0xAF4B, 0x849B, + 0xAF4C, 0x849C, 0xAF4D, 0x849D, 0xAF4E, 0x849E, 0xAF4F, 0x849F, + 0xAF50, 0xB2CC, 0xAF51, 0x84A0, 0xAF52, 0x84A1, 0xAF53, 0x84A2, + 0xAF54, 0x84A3, 0xAF55, 0x84A4, 0xAF56, 0x84A5, 0xAF57, 0x84A6, + 0xAF58, 0x84A7, 0xAF59, 0x84A8, 0xAF5A, 0x84A9, 0xAF5B, 0x84AA, + 0xAF5C, 0xB2CD, 0xAF5D, 0xB2CE, 0xAF5E, 0x84AB, 0xAF5F, 0x84AC, + 0xAF60, 0x84AD, 0xAF61, 0x84AE, 0xAF62, 0x84AF, 0xAF63, 0x84B0, + 0xAF64, 0xB2CF, 0xAF65, 0xB2D0, 0xAF66, 0x84B1, 0xAF67, 0x84B2, + 0xAF68, 0x84B3, 0xAF69, 0x84B4, 0xAF6A, 0x84B5, 0xAF6B, 0x84B6, + 0xAF6C, 0x84B7, 0xAF6D, 0x84B8, 0xAF6E, 0x84B9, 0xAF6F, 0x84BA, + 0xAF70, 0x84BB, 0xAF71, 0x84BC, 0xAF72, 0x84BD, 0xAF73, 0x84BE, + 0xAF74, 0x84BF, 0xAF75, 0x84C0, 0xAF76, 0x84C1, 0xAF77, 0x84C2, + 0xAF78, 0x84C3, 0xAF79, 0xB2D1, 0xAF7A, 0x84C4, 0xAF7B, 0x84C5, + 0xAF7C, 0x84C6, 0xAF7D, 0x84C7, 0xAF7E, 0x84C8, 0xAF7F, 0x84C9, + 0xAF80, 0xB2D2, 0xAF81, 0x84CA, 0xAF82, 0x84CB, 0xAF83, 0x84CC, + 0xAF84, 0xB2D3, 0xAF85, 0x84CD, 0xAF86, 0x84CE, 0xAF87, 0x84CF, + 0xAF88, 0xB2D4, 0xAF89, 0x84D0, 0xAF8A, 0x84D1, 0xAF8B, 0x84D2, + 0xAF8C, 0x84D3, 0xAF8D, 0x84D4, 0xAF8E, 0x84D5, 0xAF8F, 0x84D6, + 0xAF90, 0xB2D5, 0xAF91, 0xB2D6, 0xAF92, 0x84D7, 0xAF93, 0x84D8, + 0xAF94, 0x84D9, 0xAF95, 0xB2D7, 0xAF96, 0x84DA, 0xAF97, 0x84DB, + 0xAF98, 0x84DC, 0xAF99, 0x84DD, 0xAF9A, 0x84DE, 0xAF9B, 0x84DF, + 0xAF9C, 0xB2D8, 0xAF9D, 0x84E0, 0xAF9E, 0x84E1, 0xAF9F, 0x84E2, + 0xAFA0, 0x84E3, 0xAFA1, 0x84E4, 0xAFA2, 0x84E5, 0xAFA3, 0x84E6, + 0xAFA4, 0x84E7, 0xAFA5, 0x84E8, 0xAFA6, 0x84E9, 0xAFA7, 0x84EA, + 0xAFA8, 0x84EB, 0xAFA9, 0x84EC, 0xAFAA, 0x84ED, 0xAFAB, 0x84EE, + 0xAFAC, 0x84EF, 0xAFAD, 0x84F0, 0xAFAE, 0x84F1, 0xAFAF, 0x84F2, + 0xAFB0, 0x84F3, 0xAFB1, 0x84F4, 0xAFB2, 0x84F5, 0xAFB3, 0x84F6, + 0xAFB4, 0x84F7, 0xAFB5, 0x84F8, 0xAFB6, 0x84F9, 0xAFB7, 0x84FA, + 0xAFB8, 0xB2D9, 0xAFB9, 0xB2DA, 0xAFBA, 0x84FB, 0xAFBB, 0x84FC, + 0xAFBC, 0xB2DB, 0xAFBD, 0x84FD, 0xAFBE, 0x84FE, 0xAFBF, 0x8541, + 0xAFC0, 0xB2DC, 0xAFC1, 0x8542, 0xAFC2, 0x8543, 0xAFC3, 0x8544, + 0xAFC4, 0x8545, 0xAFC5, 0x8546, 0xAFC6, 0x8547, 0xAFC7, 0xB2DD, + 0xAFC8, 0xB2DE, 0xAFC9, 0xB2DF, 0xAFCA, 0x8548, 0xAFCB, 0xB2E0, + 0xAFCC, 0x8549, 0xAFCD, 0xB2E1, 0xAFCE, 0xB2E2, 0xAFCF, 0x854A, + 0xAFD0, 0x854B, 0xAFD1, 0x854C, 0xAFD2, 0x854D, 0xAFD3, 0x854E, + 0xAFD4, 0xB2E3, 0xAFD5, 0x854F, 0xAFD6, 0x8550, 0xAFD7, 0x8551, + 0xAFD8, 0x8552, 0xAFD9, 0x8553, 0xAFDA, 0x8554, 0xAFDB, 0x8555, + 0xAFDC, 0xB2E4, 0xAFDD, 0x8556, 0xAFDE, 0x8557, 0xAFDF, 0x8558, + 0xAFE0, 0x8559, 0xAFE1, 0x855A, 0xAFE2, 0x8561, 0xAFE3, 0x8562, + 0xAFE4, 0x8563, 0xAFE5, 0x8564, 0xAFE6, 0x8565, 0xAFE7, 0x8566, + 0xAFE8, 0xB2E5, 0xAFE9, 0xB2E6, 0xAFEA, 0x8567, 0xAFEB, 0x8568, + 0xAFEC, 0x8569, 0xAFED, 0x856A, 0xAFEE, 0x856B, 0xAFEF, 0x856C, + 0xAFF0, 0xB2E7, 0xAFF1, 0xB2E8, 0xAFF2, 0x856D, 0xAFF3, 0x856E, + 0xAFF4, 0xB2E9, 0xAFF5, 0x856F, 0xAFF6, 0x8570, 0xAFF7, 0x8571, + 0xAFF8, 0xB2EA, 0xAFF9, 0x8572, 0xAFFA, 0x8573, 0xAFFB, 0x8574, + 0xAFFC, 0x8575, 0xAFFD, 0x8576, 0xAFFE, 0x8577, 0xAFFF, 0x8578, + 0xB000, 0xB2EB, 0xB001, 0xB2EC, 0xB002, 0x8579, 0xB003, 0x857A, + 0xB004, 0xB2ED, 0xB005, 0x8581, 0xB006, 0x8582, 0xB007, 0x8583, + 0xB008, 0x8584, 0xB009, 0x8585, 0xB00A, 0x8586, 0xB00B, 0x8587, + 0xB00C, 0xB2EE, 0xB00D, 0x8588, 0xB00E, 0x8589, 0xB00F, 0x858A, + 0xB010, 0xB2EF, 0xB011, 0x858B, 0xB012, 0x858C, 0xB013, 0x858D, + 0xB014, 0xB2F0, 0xB015, 0x858E, 0xB016, 0x858F, 0xB017, 0x8590, + 0xB018, 0x8591, 0xB019, 0x8592, 0xB01A, 0x8593, 0xB01B, 0x8594, + 0xB01C, 0xB2F1, 0xB01D, 0xB2F2, 0xB01E, 0x8595, 0xB01F, 0x8596, + 0xB020, 0x8597, 0xB021, 0x8598, 0xB022, 0x8599, 0xB023, 0x859A, + 0xB024, 0x859B, 0xB025, 0x859C, 0xB026, 0x859D, 0xB027, 0x859E, + 0xB028, 0xB2F3, 0xB029, 0x859F, 0xB02A, 0x85A0, 0xB02B, 0x85A1, + 0xB02C, 0x85A2, 0xB02D, 0x85A3, 0xB02E, 0x85A4, 0xB02F, 0x85A5, + 0xB030, 0x85A6, 0xB031, 0x85A7, 0xB032, 0x85A8, 0xB033, 0x85A9, + 0xB034, 0x85AA, 0xB035, 0x85AB, 0xB036, 0x85AC, 0xB037, 0x85AD, + 0xB038, 0x85AE, 0xB039, 0x85AF, 0xB03A, 0x85B0, 0xB03B, 0x85B1, + 0xB03C, 0x85B2, 0xB03D, 0x85B3, 0xB03E, 0x85B4, 0xB03F, 0x85B5, + 0xB040, 0x85B6, 0xB041, 0x85B7, 0xB042, 0x85B8, 0xB043, 0x85B9, + 0xB044, 0xB2F4, 0xB045, 0xB2F5, 0xB046, 0x85BA, 0xB047, 0x85BB, + 0xB048, 0xB2F6, 0xB049, 0x85BC, 0xB04A, 0xB2F7, 0xB04B, 0x85BD, + 0xB04C, 0xB2F8, 0xB04D, 0x85BE, 0xB04E, 0xB2F9, 0xB04F, 0x85BF, + 0xB050, 0x85C0, 0xB051, 0x85C1, 0xB052, 0x85C2, 0xB053, 0xB2FA, + 0xB054, 0xB2FB, 0xB055, 0xB2FC, 0xB056, 0x85C3, 0xB057, 0xB2FD, + 0xB058, 0x85C4, 0xB059, 0xB2FE, 0xB05A, 0x85C5, 0xB05B, 0x85C6, + 0xB05C, 0x85C7, 0xB05D, 0xB3A1, 0xB05E, 0x85C8, 0xB05F, 0x85C9, + 0xB060, 0x85CA, 0xB061, 0x85CB, 0xB062, 0x85CC, 0xB063, 0x85CD, + 0xB064, 0x85CE, 0xB065, 0x85CF, 0xB066, 0x85D0, 0xB067, 0x85D1, + 0xB068, 0x85D2, 0xB069, 0x85D3, 0xB06A, 0x85D4, 0xB06B, 0x85D5, + 0xB06C, 0x85D6, 0xB06D, 0x85D7, 0xB06E, 0x85D8, 0xB06F, 0x85D9, + 0xB070, 0x85DA, 0xB071, 0x85DB, 0xB072, 0x85DC, 0xB073, 0x85DD, + 0xB074, 0x85DE, 0xB075, 0x85DF, 0xB076, 0x85E0, 0xB077, 0x85E1, + 0xB078, 0x85E2, 0xB079, 0x85E3, 0xB07A, 0x85E4, 0xB07B, 0x85E5, + 0xB07C, 0xB3A2, 0xB07D, 0xB3A3, 0xB07E, 0x85E6, 0xB07F, 0x85E7, + 0xB080, 0xB3A4, 0xB081, 0x85E8, 0xB082, 0x85E9, 0xB083, 0x85EA, + 0xB084, 0xB3A5, 0xB085, 0x85EB, 0xB086, 0x85EC, 0xB087, 0x85ED, + 0xB088, 0x85EE, 0xB089, 0x85EF, 0xB08A, 0x85F0, 0xB08B, 0x85F1, + 0xB08C, 0xB3A6, 0xB08D, 0xB3A7, 0xB08E, 0x85F2, 0xB08F, 0xB3A8, + 0xB090, 0x85F3, 0xB091, 0xB3A9, 0xB092, 0x85F4, 0xB093, 0x85F5, + 0xB094, 0x85F6, 0xB095, 0x85F7, 0xB096, 0x85F8, 0xB097, 0x85F9, + 0xB098, 0xB3AA, 0xB099, 0xB3AB, 0xB09A, 0xB3AC, 0xB09B, 0x85FA, + 0xB09C, 0xB3AD, 0xB09D, 0x85FB, 0xB09E, 0x85FC, 0xB09F, 0xB3AE, + 0xB0A0, 0xB3AF, 0xB0A1, 0xB3B0, 0xB0A2, 0xB3B1, 0xB0A3, 0x85FD, + 0xB0A4, 0x85FE, 0xB0A5, 0x8641, 0xB0A6, 0x8642, 0xB0A7, 0x8643, + 0xB0A8, 0xB3B2, 0xB0A9, 0xB3B3, 0xB0AA, 0x8644, 0xB0AB, 0xB3B4, + 0xB0AC, 0xB3B5, 0xB0AD, 0xB3B6, 0xB0AE, 0xB3B7, 0xB0AF, 0xB3B8, + 0xB0B0, 0x8645, 0xB0B1, 0xB3B9, 0xB0B2, 0x8646, 0xB0B3, 0xB3BA, + 0xB0B4, 0xB3BB, 0xB0B5, 0xB3BC, 0xB0B6, 0x8647, 0xB0B7, 0x8648, + 0xB0B8, 0xB3BD, 0xB0B9, 0x8649, 0xB0BA, 0x864A, 0xB0BB, 0x864B, + 0xB0BC, 0xB3BE, 0xB0BD, 0x864C, 0xB0BE, 0x864D, 0xB0BF, 0x864E, + 0xB0C0, 0x864F, 0xB0C1, 0x8650, 0xB0C2, 0x8651, 0xB0C3, 0x8652, + 0xB0C4, 0xB3BF, 0xB0C5, 0xB3C0, 0xB0C6, 0x8653, 0xB0C7, 0xB3C1, + 0xB0C8, 0xB3C2, 0xB0C9, 0xB3C3, 0xB0CA, 0x8654, 0xB0CB, 0x8655, + 0xB0CC, 0x8656, 0xB0CD, 0x8657, 0xB0CE, 0x8658, 0xB0CF, 0x8659, + 0xB0D0, 0xB3C4, 0xB0D1, 0xB3C5, 0xB0D2, 0x865A, 0xB0D3, 0x8661, + 0xB0D4, 0xB3C6, 0xB0D5, 0x8662, 0xB0D6, 0x8663, 0xB0D7, 0x8664, + 0xB0D8, 0xB3C7, 0xB0D9, 0x8665, 0xB0DA, 0x8666, 0xB0DB, 0x8667, + 0xB0DC, 0x8668, 0xB0DD, 0x8669, 0xB0DE, 0x866A, 0xB0DF, 0x866B, + 0xB0E0, 0xB3C8, 0xB0E1, 0x866C, 0xB0E2, 0x866D, 0xB0E3, 0x866E, + 0xB0E4, 0x866F, 0xB0E5, 0xB3C9, 0xB0E6, 0x8670, 0xB0E7, 0x8671, + 0xB0E8, 0x8672, 0xB0E9, 0x8673, 0xB0EA, 0x8674, 0xB0EB, 0x8675, + 0xB0EC, 0x8676, 0xB0ED, 0x8677, 0xB0EE, 0x8678, 0xB0EF, 0x8679, + 0xB0F0, 0x867A, 0xB0F1, 0x8681, 0xB0F2, 0x8682, 0xB0F3, 0x8683, + 0xB0F4, 0x8684, 0xB0F5, 0x8685, 0xB0F6, 0x8686, 0xB0F7, 0x8687, + 0xB0F8, 0x8688, 0xB0F9, 0x8689, 0xB0FA, 0x868A, 0xB0FB, 0x868B, + 0xB0FC, 0x868C, 0xB0FD, 0x868D, 0xB0FE, 0x868E, 0xB0FF, 0x868F, + 0xB100, 0x8690, 0xB101, 0x8691, 0xB102, 0x8692, 0xB103, 0x8693, + 0xB104, 0x8694, 0xB105, 0x8695, 0xB106, 0x8696, 0xB107, 0x8697, + 0xB108, 0xB3CA, 0xB109, 0xB3CB, 0xB10A, 0x8698, 0xB10B, 0xB3CC, + 0xB10C, 0xB3CD, 0xB10D, 0x8699, 0xB10E, 0x869A, 0xB10F, 0x869B, + 0xB110, 0xB3CE, 0xB111, 0x869C, 0xB112, 0xB3CF, 0xB113, 0xB3D0, + 0xB114, 0x869D, 0xB115, 0x869E, 0xB116, 0x869F, 0xB117, 0x86A0, + 0xB118, 0xB3D1, 0xB119, 0xB3D2, 0xB11A, 0x86A1, 0xB11B, 0xB3D3, + 0xB11C, 0xB3D4, 0xB11D, 0xB3D5, 0xB11E, 0x86A2, 0xB11F, 0x86A3, + 0xB120, 0x86A4, 0xB121, 0x86A5, 0xB122, 0x86A6, 0xB123, 0xB3D6, + 0xB124, 0xB3D7, 0xB125, 0xB3D8, 0xB126, 0x86A7, 0xB127, 0x86A8, + 0xB128, 0xB3D9, 0xB129, 0x86A9, 0xB12A, 0x86AA, 0xB12B, 0x86AB, + 0xB12C, 0xB3DA, 0xB12D, 0x86AC, 0xB12E, 0x86AD, 0xB12F, 0x86AE, + 0xB130, 0x86AF, 0xB131, 0x86B0, 0xB132, 0x86B1, 0xB133, 0x86B2, + 0xB134, 0xB3DB, 0xB135, 0xB3DC, 0xB136, 0x86B3, 0xB137, 0xB3DD, + 0xB138, 0xB3DE, 0xB139, 0xB3DF, 0xB13A, 0x86B4, 0xB13B, 0x86B5, + 0xB13C, 0x86B6, 0xB13D, 0x86B7, 0xB13E, 0x86B8, 0xB13F, 0x86B9, + 0xB140, 0xB3E0, 0xB141, 0xB3E1, 0xB142, 0x86BA, 0xB143, 0x86BB, + 0xB144, 0xB3E2, 0xB145, 0x86BC, 0xB146, 0x86BD, 0xB147, 0x86BE, + 0xB148, 0xB3E3, 0xB149, 0x86BF, 0xB14A, 0x86C0, 0xB14B, 0x86C1, + 0xB14C, 0x86C2, 0xB14D, 0x86C3, 0xB14E, 0x86C4, 0xB14F, 0x86C5, + 0xB150, 0xB3E4, 0xB151, 0xB3E5, 0xB152, 0x86C6, 0xB153, 0x86C7, + 0xB154, 0xB3E6, 0xB155, 0xB3E7, 0xB156, 0x86C8, 0xB157, 0x86C9, + 0xB158, 0xB3E8, 0xB159, 0x86CA, 0xB15A, 0x86CB, 0xB15B, 0x86CC, + 0xB15C, 0xB3E9, 0xB15D, 0x86CD, 0xB15E, 0x86CE, 0xB15F, 0x86CF, + 0xB160, 0xB3EA, 0xB161, 0x86D0, 0xB162, 0x86D1, 0xB163, 0x86D2, + 0xB164, 0x86D3, 0xB165, 0x86D4, 0xB166, 0x86D5, 0xB167, 0x86D6, + 0xB168, 0x86D7, 0xB169, 0x86D8, 0xB16A, 0x86D9, 0xB16B, 0x86DA, + 0xB16C, 0x86DB, 0xB16D, 0x86DC, 0xB16E, 0x86DD, 0xB16F, 0x86DE, + 0xB170, 0x86DF, 0xB171, 0x86E0, 0xB172, 0x86E1, 0xB173, 0x86E2, + 0xB174, 0x86E3, 0xB175, 0x86E4, 0xB176, 0x86E5, 0xB177, 0x86E6, + 0xB178, 0xB3EB, 0xB179, 0xB3EC, 0xB17A, 0x86E7, 0xB17B, 0x86E8, + 0xB17C, 0xB3ED, 0xB17D, 0x86E9, 0xB17E, 0x86EA, 0xB17F, 0x86EB, + 0xB180, 0xB3EE, 0xB181, 0x86EC, 0xB182, 0xB3EF, 0xB183, 0x86ED, + 0xB184, 0x86EE, 0xB185, 0x86EF, 0xB186, 0x86F0, 0xB187, 0x86F1, + 0xB188, 0xB3F0, 0xB189, 0xB3F1, 0xB18A, 0x86F2, 0xB18B, 0xB3F2, + 0xB18C, 0x86F3, 0xB18D, 0xB3F3, 0xB18E, 0x86F4, 0xB18F, 0x86F5, + 0xB190, 0x86F6, 0xB191, 0x86F7, 0xB192, 0xB3F4, 0xB193, 0xB3F5, + 0xB194, 0xB3F6, 0xB195, 0x86F8, 0xB196, 0x86F9, 0xB197, 0x86FA, + 0xB198, 0xB3F7, 0xB199, 0x86FB, 0xB19A, 0x86FC, 0xB19B, 0x86FD, + 0xB19C, 0xB3F8, 0xB19D, 0x86FE, 0xB19E, 0x8741, 0xB19F, 0x8742, + 0xB1A0, 0x8743, 0xB1A1, 0x8744, 0xB1A2, 0x8745, 0xB1A3, 0x8746, + 0xB1A4, 0x8747, 0xB1A5, 0x8748, 0xB1A6, 0x8749, 0xB1A7, 0x874A, + 0xB1A8, 0xB3F9, 0xB1A9, 0x874B, 0xB1AA, 0x874C, 0xB1AB, 0x874D, + 0xB1AC, 0x874E, 0xB1AD, 0x874F, 0xB1AE, 0x8750, 0xB1AF, 0x8751, + 0xB1B0, 0x8752, 0xB1B1, 0x8753, 0xB1B2, 0x8754, 0xB1B3, 0x8755, + 0xB1B4, 0x8756, 0xB1B5, 0x8757, 0xB1B6, 0x8758, 0xB1B7, 0x8759, + 0xB1B8, 0x875A, 0xB1B9, 0x8761, 0xB1BA, 0x8762, 0xB1BB, 0x8763, + 0xB1BC, 0x8764, 0xB1BD, 0x8765, 0xB1BE, 0x8766, 0xB1BF, 0x8767, + 0xB1C0, 0x8768, 0xB1C1, 0x8769, 0xB1C2, 0x876A, 0xB1C3, 0x876B, + 0xB1C4, 0x876C, 0xB1C5, 0x876D, 0xB1C6, 0x876E, 0xB1C7, 0x876F, + 0xB1C8, 0x8770, 0xB1C9, 0x8771, 0xB1CA, 0x8772, 0xB1CB, 0x8773, + 0xB1CC, 0xB3FA, 0xB1CD, 0x8774, 0xB1CE, 0x8775, 0xB1CF, 0x8776, + 0xB1D0, 0xB3FB, 0xB1D1, 0x8777, 0xB1D2, 0x8778, 0xB1D3, 0x8779, + 0xB1D4, 0xB3FC, 0xB1D5, 0x877A, 0xB1D6, 0x8781, 0xB1D7, 0x8782, + 0xB1D8, 0x8783, 0xB1D9, 0x8784, 0xB1DA, 0x8785, 0xB1DB, 0x8786, + 0xB1DC, 0xB3FD, 0xB1DD, 0xB3FE, 0xB1DE, 0x8787, 0xB1DF, 0xB4A1, + 0xB1E0, 0x8788, 0xB1E1, 0x8789, 0xB1E2, 0x878A, 0xB1E3, 0x878B, + 0xB1E4, 0x878C, 0xB1E5, 0x878D, 0xB1E6, 0x878E, 0xB1E7, 0x878F, + 0xB1E8, 0xB4A2, 0xB1E9, 0xB4A3, 0xB1EA, 0x8790, 0xB1EB, 0x8791, + 0xB1EC, 0xB4A4, 0xB1ED, 0x8792, 0xB1EE, 0x8793, 0xB1EF, 0x8794, + 0xB1F0, 0xB4A5, 0xB1F1, 0x8795, 0xB1F2, 0x8796, 0xB1F3, 0x8797, + 0xB1F4, 0x8798, 0xB1F5, 0x8799, 0xB1F6, 0x879A, 0xB1F7, 0x879B, + 0xB1F8, 0x879C, 0xB1F9, 0xB4A6, 0xB1FA, 0x879D, 0xB1FB, 0xB4A7, + 0xB1FC, 0x879E, 0xB1FD, 0xB4A8, 0xB1FE, 0x879F, 0xB1FF, 0x87A0, + 0xB200, 0x87A1, 0xB201, 0x87A2, 0xB202, 0x87A3, 0xB203, 0x87A4, + 0xB204, 0xB4A9, 0xB205, 0xB4AA, 0xB206, 0x87A5, 0xB207, 0x87A6, + 0xB208, 0xB4AB, 0xB209, 0x87A7, 0xB20A, 0x87A8, 0xB20B, 0xB4AC, + 0xB20C, 0xB4AD, 0xB20D, 0x87A9, 0xB20E, 0x87AA, 0xB20F, 0x87AB, + 0xB210, 0x87AC, 0xB211, 0x87AD, 0xB212, 0x87AE, 0xB213, 0x87AF, + 0xB214, 0xB4AE, 0xB215, 0xB4AF, 0xB216, 0x87B0, 0xB217, 0xB4B0, + 0xB218, 0x87B1, 0xB219, 0xB4B1, 0xB21A, 0x87B2, 0xB21B, 0x87B3, + 0xB21C, 0x87B4, 0xB21D, 0x87B5, 0xB21E, 0x87B6, 0xB21F, 0x87B7, + 0xB220, 0xB4B2, 0xB221, 0x87B8, 0xB222, 0x87B9, 0xB223, 0x87BA, + 0xB224, 0x87BB, 0xB225, 0x87BC, 0xB226, 0x87BD, 0xB227, 0x87BE, + 0xB228, 0x87BF, 0xB229, 0x87C0, 0xB22A, 0x87C1, 0xB22B, 0x87C2, + 0xB22C, 0x87C3, 0xB22D, 0x87C4, 0xB22E, 0x87C5, 0xB22F, 0x87C6, + 0xB230, 0x87C7, 0xB231, 0x87C8, 0xB232, 0x87C9, 0xB233, 0x87CA, + 0xB234, 0xB4B3, 0xB235, 0x87CB, 0xB236, 0x87CC, 0xB237, 0x87CD, + 0xB238, 0x87CE, 0xB239, 0x87CF, 0xB23A, 0x87D0, 0xB23B, 0x87D1, + 0xB23C, 0xB4B4, 0xB23D, 0x87D2, 0xB23E, 0x87D3, 0xB23F, 0x87D4, + 0xB240, 0x87D5, 0xB241, 0x87D6, 0xB242, 0x87D7, 0xB243, 0x87D8, + 0xB244, 0x87D9, 0xB245, 0x87DA, 0xB246, 0x87DB, 0xB247, 0x87DC, + 0xB248, 0x87DD, 0xB249, 0x87DE, 0xB24A, 0x87DF, 0xB24B, 0x87E0, + 0xB24C, 0x87E1, 0xB24D, 0x87E2, 0xB24E, 0x87E3, 0xB24F, 0x87E4, + 0xB250, 0x87E5, 0xB251, 0x87E6, 0xB252, 0x87E7, 0xB253, 0x87E8, + 0xB254, 0x87E9, 0xB255, 0x87EA, 0xB256, 0x87EB, 0xB257, 0x87EC, + 0xB258, 0xB4B5, 0xB259, 0x87ED, 0xB25A, 0x87EE, 0xB25B, 0x87EF, + 0xB25C, 0xB4B6, 0xB25D, 0x87F0, 0xB25E, 0x87F1, 0xB25F, 0x87F2, + 0xB260, 0xB4B7, 0xB261, 0x87F3, 0xB262, 0x87F4, 0xB263, 0x87F5, + 0xB264, 0x87F6, 0xB265, 0x87F7, 0xB266, 0x87F8, 0xB267, 0x87F9, + 0xB268, 0xB4B8, 0xB269, 0xB4B9, 0xB26A, 0x87FA, 0xB26B, 0x87FB, + 0xB26C, 0x87FC, 0xB26D, 0x87FD, 0xB26E, 0x87FE, 0xB26F, 0x8841, + 0xB270, 0x8842, 0xB271, 0x8843, 0xB272, 0x8844, 0xB273, 0x8845, + 0xB274, 0xB4BA, 0xB275, 0xB4BB, 0xB276, 0x8846, 0xB277, 0x8847, + 0xB278, 0x8848, 0xB279, 0x8849, 0xB27A, 0x884A, 0xB27B, 0x884B, + 0xB27C, 0xB4BC, 0xB27D, 0x884C, 0xB27E, 0x884D, 0xB27F, 0x884E, + 0xB280, 0x884F, 0xB281, 0x8850, 0xB282, 0x8851, 0xB283, 0x8852, + 0xB284, 0xB4BD, 0xB285, 0xB4BE, 0xB286, 0x8853, 0xB287, 0x8854, + 0xB288, 0x8855, 0xB289, 0xB4BF, 0xB28A, 0x8856, 0xB28B, 0x8857, + 0xB28C, 0x8858, 0xB28D, 0x8859, 0xB28E, 0x885A, 0xB28F, 0x8861, + 0xB290, 0xB4C0, 0xB291, 0xB4C1, 0xB292, 0x8862, 0xB293, 0x8863, + 0xB294, 0xB4C2, 0xB295, 0x8864, 0xB296, 0x8865, 0xB297, 0x8866, + 0xB298, 0xB4C3, 0xB299, 0xB4C4, 0xB29A, 0xB4C5, 0xB29B, 0x8867, + 0xB29C, 0x8868, 0xB29D, 0x8869, 0xB29E, 0x886A, 0xB29F, 0x886B, + 0xB2A0, 0xB4C6, 0xB2A1, 0xB4C7, 0xB2A2, 0x886C, 0xB2A3, 0xB4C8, + 0xB2A4, 0x886D, 0xB2A5, 0xB4C9, 0xB2A6, 0xB4CA, 0xB2A7, 0x886E, + 0xB2A8, 0x886F, 0xB2A9, 0x8870, 0xB2AA, 0xB4CB, 0xB2AB, 0x8871, + 0xB2AC, 0xB4CC, 0xB2AD, 0x8872, 0xB2AE, 0x8873, 0xB2AF, 0x8874, + 0xB2B0, 0xB4CD, 0xB2B1, 0x8875, 0xB2B2, 0x8876, 0xB2B3, 0x8877, + 0xB2B4, 0xB4CE, 0xB2B5, 0x8878, 0xB2B6, 0x8879, 0xB2B7, 0x887A, + 0xB2B8, 0x8881, 0xB2B9, 0x8882, 0xB2BA, 0x8883, 0xB2BB, 0x8884, + 0xB2BC, 0x8885, 0xB2BD, 0x8886, 0xB2BE, 0x8887, 0xB2BF, 0x8888, + 0xB2C0, 0x8889, 0xB2C1, 0x888A, 0xB2C2, 0x888B, 0xB2C3, 0x888C, + 0xB2C4, 0x888D, 0xB2C5, 0x888E, 0xB2C6, 0x888F, 0xB2C7, 0x8890, + 0xB2C8, 0xB4CF, 0xB2C9, 0xB4D0, 0xB2CA, 0x8891, 0xB2CB, 0x8892, + 0xB2CC, 0xB4D1, 0xB2CD, 0x8893, 0xB2CE, 0x8894, 0xB2CF, 0x8895, + 0xB2D0, 0xB4D2, 0xB2D1, 0x8896, 0xB2D2, 0xB4D3, 0xB2D3, 0x8897, + 0xB2D4, 0x8898, 0xB2D5, 0x8899, 0xB2D6, 0x889A, 0xB2D7, 0x889B, + 0xB2D8, 0xB4D4, 0xB2D9, 0xB4D5, 0xB2DA, 0x889C, 0xB2DB, 0xB4D6, + 0xB2DC, 0x889D, 0xB2DD, 0xB4D7, 0xB2DE, 0x889E, 0xB2DF, 0x889F, + 0xB2E0, 0x88A0, 0xB2E1, 0x88A1, 0xB2E2, 0xB4D8, 0xB2E3, 0x88A2, + 0xB2E4, 0xB4D9, 0xB2E5, 0xB4DA, 0xB2E6, 0xB4DB, 0xB2E7, 0x88A3, + 0xB2E8, 0xB4DC, 0xB2E9, 0x88A4, 0xB2EA, 0x88A5, 0xB2EB, 0xB4DD, + 0xB2EC, 0xB4DE, 0xB2ED, 0xB4DF, 0xB2EE, 0xB4E0, 0xB2EF, 0xB4E1, + 0xB2F0, 0x88A6, 0xB2F1, 0x88A7, 0xB2F2, 0x88A8, 0xB2F3, 0xB4E2, + 0xB2F4, 0xB4E3, 0xB2F5, 0xB4E4, 0xB2F6, 0x88A9, 0xB2F7, 0xB4E5, + 0xB2F8, 0xB4E6, 0xB2F9, 0xB4E7, 0xB2FA, 0xB4E8, 0xB2FB, 0xB4E9, + 0xB2FC, 0x88AA, 0xB2FD, 0x88AB, 0xB2FE, 0x88AC, 0xB2FF, 0xB4EA, + 0xB300, 0xB4EB, 0xB301, 0xB4EC, 0xB302, 0x88AD, 0xB303, 0x88AE, + 0xB304, 0xB4ED, 0xB305, 0x88AF, 0xB306, 0x88B0, 0xB307, 0x88B1, + 0xB308, 0xB4EE, 0xB309, 0x88B2, 0xB30A, 0x88B3, 0xB30B, 0x88B4, + 0xB30C, 0x88B5, 0xB30D, 0x88B6, 0xB30E, 0x88B7, 0xB30F, 0x88B8, + 0xB310, 0xB4EF, 0xB311, 0xB4F0, 0xB312, 0x88B9, 0xB313, 0xB4F1, + 0xB314, 0xB4F2, 0xB315, 0xB4F3, 0xB316, 0x88BA, 0xB317, 0x88BB, + 0xB318, 0x88BC, 0xB319, 0x88BD, 0xB31A, 0x88BE, 0xB31B, 0x88BF, + 0xB31C, 0xB4F4, 0xB31D, 0x88C0, 0xB31E, 0x88C1, 0xB31F, 0x88C2, + 0xB320, 0x88C3, 0xB321, 0x88C4, 0xB322, 0x88C5, 0xB323, 0x88C6, + 0xB324, 0x88C7, 0xB325, 0x88C8, 0xB326, 0x88C9, 0xB327, 0x88CA, + 0xB328, 0x88CB, 0xB329, 0x88CC, 0xB32A, 0x88CD, 0xB32B, 0x88CE, + 0xB32C, 0x88CF, 0xB32D, 0x88D0, 0xB32E, 0x88D1, 0xB32F, 0x88D2, + 0xB330, 0x88D3, 0xB331, 0x88D4, 0xB332, 0x88D5, 0xB333, 0x88D6, + 0xB334, 0x88D7, 0xB335, 0x88D8, 0xB336, 0x88D9, 0xB337, 0x88DA, + 0xB338, 0x88DB, 0xB339, 0x88DC, 0xB33A, 0x88DD, 0xB33B, 0x88DE, + 0xB33C, 0x88DF, 0xB33D, 0x88E0, 0xB33E, 0x88E1, 0xB33F, 0x88E2, + 0xB340, 0x88E3, 0xB341, 0x88E4, 0xB342, 0x88E5, 0xB343, 0x88E6, + 0xB344, 0x88E7, 0xB345, 0x88E8, 0xB346, 0x88E9, 0xB347, 0x88EA, + 0xB348, 0x88EB, 0xB349, 0x88EC, 0xB34A, 0x88ED, 0xB34B, 0x88EE, + 0xB34C, 0x88EF, 0xB34D, 0x88F0, 0xB34E, 0x88F1, 0xB34F, 0x88F2, + 0xB350, 0x88F3, 0xB351, 0x88F4, 0xB352, 0x88F5, 0xB353, 0x88F6, + 0xB354, 0xB4F5, 0xB355, 0xB4F6, 0xB356, 0xB4F7, 0xB357, 0x88F7, + 0xB358, 0xB4F8, 0xB359, 0x88F8, 0xB35A, 0x88F9, 0xB35B, 0xB4F9, + 0xB35C, 0xB4FA, 0xB35D, 0x88FA, 0xB35E, 0xB4FB, 0xB35F, 0xB4FC, + 0xB360, 0x88FB, 0xB361, 0x88FC, 0xB362, 0x88FD, 0xB363, 0x88FE, + 0xB364, 0xB4FD, 0xB365, 0xB4FE, 0xB366, 0x8941, 0xB367, 0xB5A1, + 0xB368, 0x8942, 0xB369, 0xB5A2, 0xB36A, 0x8943, 0xB36B, 0xB5A3, + 0xB36C, 0x8944, 0xB36D, 0x8945, 0xB36E, 0xB5A4, 0xB36F, 0x8946, + 0xB370, 0xB5A5, 0xB371, 0xB5A6, 0xB372, 0x8947, 0xB373, 0x8948, + 0xB374, 0xB5A7, 0xB375, 0x8949, 0xB376, 0x894A, 0xB377, 0x894B, + 0xB378, 0xB5A8, 0xB379, 0x894C, 0xB37A, 0x894D, 0xB37B, 0x894E, + 0xB37C, 0x894F, 0xB37D, 0x8950, 0xB37E, 0x8951, 0xB37F, 0x8952, + 0xB380, 0xB5A9, 0xB381, 0xB5AA, 0xB382, 0x8953, 0xB383, 0xB5AB, + 0xB384, 0xB5AC, 0xB385, 0xB5AD, 0xB386, 0x8954, 0xB387, 0x8955, + 0xB388, 0x8956, 0xB389, 0x8957, 0xB38A, 0x8958, 0xB38B, 0x8959, + 0xB38C, 0xB5AE, 0xB38D, 0x895A, 0xB38E, 0x8961, 0xB38F, 0x8962, + 0xB390, 0xB5AF, 0xB391, 0x8963, 0xB392, 0x8964, 0xB393, 0x8965, + 0xB394, 0xB5B0, 0xB395, 0x8966, 0xB396, 0x8967, 0xB397, 0x8968, + 0xB398, 0x8969, 0xB399, 0x896A, 0xB39A, 0x896B, 0xB39B, 0x896C, + 0xB39C, 0x896D, 0xB39D, 0x896E, 0xB39E, 0x896F, 0xB39F, 0x8970, + 0xB3A0, 0xB5B1, 0xB3A1, 0xB5B2, 0xB3A2, 0x8971, 0xB3A3, 0x8972, + 0xB3A4, 0x8973, 0xB3A5, 0x8974, 0xB3A6, 0x8975, 0xB3A7, 0x8976, + 0xB3A8, 0xB5B3, 0xB3A9, 0x8977, 0xB3AA, 0x8978, 0xB3AB, 0x8979, + 0xB3AC, 0xB5B4, 0xB3AD, 0x897A, 0xB3AE, 0x8981, 0xB3AF, 0x8982, + 0xB3B0, 0x8983, 0xB3B1, 0x8984, 0xB3B2, 0x8985, 0xB3B3, 0x8986, + 0xB3B4, 0x8987, 0xB3B5, 0x8988, 0xB3B6, 0x8989, 0xB3B7, 0x898A, + 0xB3B8, 0x898B, 0xB3B9, 0x898C, 0xB3BA, 0x898D, 0xB3BB, 0x898E, + 0xB3BC, 0x898F, 0xB3BD, 0x8990, 0xB3BE, 0x8991, 0xB3BF, 0x8992, + 0xB3C0, 0x8993, 0xB3C1, 0x8994, 0xB3C2, 0x8995, 0xB3C3, 0x8996, + 0xB3C4, 0xB5B5, 0xB3C5, 0xB5B6, 0xB3C6, 0x8997, 0xB3C7, 0x8998, + 0xB3C8, 0xB5B7, 0xB3C9, 0x8999, 0xB3CA, 0x899A, 0xB3CB, 0xB5B8, + 0xB3CC, 0xB5B9, 0xB3CD, 0x899B, 0xB3CE, 0xB5BA, 0xB3CF, 0x899C, + 0xB3D0, 0xB5BB, 0xB3D1, 0x899D, 0xB3D2, 0x899E, 0xB3D3, 0x899F, + 0xB3D4, 0xB5BC, 0xB3D5, 0xB5BD, 0xB3D6, 0x89A0, 0xB3D7, 0xB5BE, + 0xB3D8, 0x89A1, 0xB3D9, 0xB5BF, 0xB3DA, 0x89A2, 0xB3DB, 0xB5C0, + 0xB3DC, 0x89A3, 0xB3DD, 0xB5C1, 0xB3DE, 0x89A4, 0xB3DF, 0x89A5, + 0xB3E0, 0xB5C2, 0xB3E1, 0x89A6, 0xB3E2, 0x89A7, 0xB3E3, 0x89A8, + 0xB3E4, 0xB5C3, 0xB3E5, 0x89A9, 0xB3E6, 0x89AA, 0xB3E7, 0x89AB, + 0xB3E8, 0xB5C4, 0xB3E9, 0x89AC, 0xB3EA, 0x89AD, 0xB3EB, 0x89AE, + 0xB3EC, 0x89AF, 0xB3ED, 0x89B0, 0xB3EE, 0x89B1, 0xB3EF, 0x89B2, + 0xB3F0, 0x89B3, 0xB3F1, 0x89B4, 0xB3F2, 0x89B5, 0xB3F3, 0x89B6, + 0xB3F4, 0x89B7, 0xB3F5, 0x89B8, 0xB3F6, 0x89B9, 0xB3F7, 0x89BA, + 0xB3F8, 0x89BB, 0xB3F9, 0x89BC, 0xB3FA, 0x89BD, 0xB3FB, 0x89BE, + 0xB3FC, 0xB5C5, 0xB3FD, 0x89BF, 0xB3FE, 0x89C0, 0xB3FF, 0x89C1, + 0xB400, 0x89C2, 0xB401, 0x89C3, 0xB402, 0x89C4, 0xB403, 0x89C5, + 0xB404, 0x89C6, 0xB405, 0x89C7, 0xB406, 0x89C8, 0xB407, 0x89C9, + 0xB408, 0x89CA, 0xB409, 0x89CB, 0xB40A, 0x89CC, 0xB40B, 0x89CD, + 0xB40C, 0x89CE, 0xB40D, 0x89CF, 0xB40E, 0x89D0, 0xB40F, 0x89D1, + 0xB410, 0xB5C6, 0xB411, 0x89D2, 0xB412, 0x89D3, 0xB413, 0x89D4, + 0xB414, 0x89D5, 0xB415, 0x89D6, 0xB416, 0x89D7, 0xB417, 0x89D8, + 0xB418, 0xB5C7, 0xB419, 0x89D9, 0xB41A, 0x89DA, 0xB41B, 0x89DB, + 0xB41C, 0xB5C8, 0xB41D, 0x89DC, 0xB41E, 0x89DD, 0xB41F, 0x89DE, + 0xB420, 0xB5C9, 0xB421, 0x89DF, 0xB422, 0x89E0, 0xB423, 0x89E1, + 0xB424, 0x89E2, 0xB425, 0x89E3, 0xB426, 0x89E4, 0xB427, 0x89E5, + 0xB428, 0xB5CA, 0xB429, 0xB5CB, 0xB42A, 0x89E6, 0xB42B, 0xB5CC, + 0xB42C, 0x89E7, 0xB42D, 0x89E8, 0xB42E, 0x89E9, 0xB42F, 0x89EA, + 0xB430, 0x89EB, 0xB431, 0x89EC, 0xB432, 0x89ED, 0xB433, 0x89EE, + 0xB434, 0xB5CD, 0xB435, 0x89EF, 0xB436, 0x89F0, 0xB437, 0x89F1, + 0xB438, 0x89F2, 0xB439, 0x89F3, 0xB43A, 0x89F4, 0xB43B, 0x89F5, + 0xB43C, 0x89F6, 0xB43D, 0x89F7, 0xB43E, 0x89F8, 0xB43F, 0x89F9, + 0xB440, 0x89FA, 0xB441, 0x89FB, 0xB442, 0x89FC, 0xB443, 0x89FD, + 0xB444, 0x89FE, 0xB445, 0x8A41, 0xB446, 0x8A42, 0xB447, 0x8A43, + 0xB448, 0x8A44, 0xB449, 0x8A45, 0xB44A, 0x8A46, 0xB44B, 0x8A47, + 0xB44C, 0x8A48, 0xB44D, 0x8A49, 0xB44E, 0x8A4A, 0xB44F, 0x8A4B, + 0xB450, 0xB5CE, 0xB451, 0xB5CF, 0xB452, 0x8A4C, 0xB453, 0x8A4D, + 0xB454, 0xB5D0, 0xB455, 0x8A4E, 0xB456, 0x8A4F, 0xB457, 0x8A50, + 0xB458, 0xB5D1, 0xB459, 0x8A51, 0xB45A, 0x8A52, 0xB45B, 0x8A53, + 0xB45C, 0x8A54, 0xB45D, 0x8A55, 0xB45E, 0x8A56, 0xB45F, 0x8A57, + 0xB460, 0xB5D2, 0xB461, 0xB5D3, 0xB462, 0x8A58, 0xB463, 0xB5D4, + 0xB464, 0x8A59, 0xB465, 0xB5D5, 0xB466, 0x8A5A, 0xB467, 0x8A61, + 0xB468, 0x8A62, 0xB469, 0x8A63, 0xB46A, 0x8A64, 0xB46B, 0x8A65, + 0xB46C, 0xB5D6, 0xB46D, 0x8A66, 0xB46E, 0x8A67, 0xB46F, 0x8A68, + 0xB470, 0x8A69, 0xB471, 0x8A6A, 0xB472, 0x8A6B, 0xB473, 0x8A6C, + 0xB474, 0x8A6D, 0xB475, 0x8A6E, 0xB476, 0x8A6F, 0xB477, 0x8A70, + 0xB478, 0x8A71, 0xB479, 0x8A72, 0xB47A, 0x8A73, 0xB47B, 0x8A74, + 0xB47C, 0x8A75, 0xB47D, 0x8A76, 0xB47E, 0x8A77, 0xB47F, 0x8A78, + 0xB480, 0xB5D7, 0xB481, 0x8A79, 0xB482, 0x8A7A, 0xB483, 0x8A81, + 0xB484, 0x8A82, 0xB485, 0x8A83, 0xB486, 0x8A84, 0xB487, 0x8A85, + 0xB488, 0xB5D8, 0xB489, 0x8A86, 0xB48A, 0x8A87, 0xB48B, 0x8A88, + 0xB48C, 0x8A89, 0xB48D, 0x8A8A, 0xB48E, 0x8A8B, 0xB48F, 0x8A8C, + 0xB490, 0x8A8D, 0xB491, 0x8A8E, 0xB492, 0x8A8F, 0xB493, 0x8A90, + 0xB494, 0x8A91, 0xB495, 0x8A92, 0xB496, 0x8A93, 0xB497, 0x8A94, + 0xB498, 0x8A95, 0xB499, 0x8A96, 0xB49A, 0x8A97, 0xB49B, 0x8A98, + 0xB49C, 0x8A99, 0xB49D, 0xB5D9, 0xB49E, 0x8A9A, 0xB49F, 0x8A9B, + 0xB4A0, 0x8A9C, 0xB4A1, 0x8A9D, 0xB4A2, 0x8A9E, 0xB4A3, 0x8A9F, + 0xB4A4, 0xB5DA, 0xB4A5, 0x8AA0, 0xB4A6, 0x8AA1, 0xB4A7, 0x8AA2, + 0xB4A8, 0xB5DB, 0xB4A9, 0x8AA3, 0xB4AA, 0x8AA4, 0xB4AB, 0x8AA5, + 0xB4AC, 0xB5DC, 0xB4AD, 0x8AA6, 0xB4AE, 0x8AA7, 0xB4AF, 0x8AA8, + 0xB4B0, 0x8AA9, 0xB4B1, 0x8AAA, 0xB4B2, 0x8AAB, 0xB4B3, 0x8AAC, + 0xB4B4, 0x8AAD, 0xB4B5, 0xB5DD, 0xB4B6, 0x8AAE, 0xB4B7, 0xB5DE, + 0xB4B8, 0x8AAF, 0xB4B9, 0xB5DF, 0xB4BA, 0x8AB0, 0xB4BB, 0x8AB1, + 0xB4BC, 0x8AB2, 0xB4BD, 0x8AB3, 0xB4BE, 0x8AB4, 0xB4BF, 0x8AB5, + 0xB4C0, 0xB5E0, 0xB4C1, 0x8AB6, 0xB4C2, 0x8AB7, 0xB4C3, 0x8AB8, + 0xB4C4, 0xB5E1, 0xB4C5, 0x8AB9, 0xB4C6, 0x8ABA, 0xB4C7, 0x8ABB, + 0xB4C8, 0xB5E2, 0xB4C9, 0x8ABC, 0xB4CA, 0x8ABD, 0xB4CB, 0x8ABE, + 0xB4CC, 0x8ABF, 0xB4CD, 0x8AC0, 0xB4CE, 0x8AC1, 0xB4CF, 0x8AC2, + 0xB4D0, 0xB5E3, 0xB4D1, 0x8AC3, 0xB4D2, 0x8AC4, 0xB4D3, 0x8AC5, + 0xB4D4, 0x8AC6, 0xB4D5, 0xB5E4, 0xB4D6, 0x8AC7, 0xB4D7, 0x8AC8, + 0xB4D8, 0x8AC9, 0xB4D9, 0x8ACA, 0xB4DA, 0x8ACB, 0xB4DB, 0x8ACC, + 0xB4DC, 0xB5E5, 0xB4DD, 0xB5E6, 0xB4DE, 0x8ACD, 0xB4DF, 0x8ACE, + 0xB4E0, 0xB5E7, 0xB4E1, 0x8ACF, 0xB4E2, 0x8AD0, 0xB4E3, 0xB5E8, + 0xB4E4, 0xB5E9, 0xB4E5, 0x8AD1, 0xB4E6, 0xB5EA, 0xB4E7, 0x8AD2, + 0xB4E8, 0x8AD3, 0xB4E9, 0x8AD4, 0xB4EA, 0x8AD5, 0xB4EB, 0x8AD6, + 0xB4EC, 0xB5EB, 0xB4ED, 0xB5EC, 0xB4EE, 0x8AD7, 0xB4EF, 0xB5ED, + 0xB4F0, 0x8AD8, 0xB4F1, 0xB5EE, 0xB4F2, 0x8AD9, 0xB4F3, 0x8ADA, + 0xB4F4, 0x8ADB, 0xB4F5, 0x8ADC, 0xB4F6, 0x8ADD, 0xB4F7, 0x8ADE, + 0xB4F8, 0xB5EF, 0xB4F9, 0x8ADF, 0xB4FA, 0x8AE0, 0xB4FB, 0x8AE1, + 0xB4FC, 0x8AE2, 0xB4FD, 0x8AE3, 0xB4FE, 0x8AE4, 0xB4FF, 0x8AE5, + 0xB500, 0x8AE6, 0xB501, 0x8AE7, 0xB502, 0x8AE8, 0xB503, 0x8AE9, + 0xB504, 0x8AEA, 0xB505, 0x8AEB, 0xB506, 0x8AEC, 0xB507, 0x8AED, + 0xB508, 0x8AEE, 0xB509, 0x8AEF, 0xB50A, 0x8AF0, 0xB50B, 0x8AF1, + 0xB50C, 0x8AF2, 0xB50D, 0x8AF3, 0xB50E, 0x8AF4, 0xB50F, 0x8AF5, + 0xB510, 0x8AF6, 0xB511, 0x8AF7, 0xB512, 0x8AF8, 0xB513, 0x8AF9, + 0xB514, 0xB5F0, 0xB515, 0xB5F1, 0xB516, 0x8AFA, 0xB517, 0x8AFB, + 0xB518, 0xB5F2, 0xB519, 0x8AFC, 0xB51A, 0x8AFD, 0xB51B, 0xB5F3, + 0xB51C, 0xB5F4, 0xB51D, 0x8AFE, 0xB51E, 0x8B41, 0xB51F, 0x8B42, + 0xB520, 0x8B43, 0xB521, 0x8B44, 0xB522, 0x8B45, 0xB523, 0x8B46, + 0xB524, 0xB5F5, 0xB525, 0xB5F6, 0xB526, 0x8B47, 0xB527, 0xB5F7, + 0xB528, 0xB5F8, 0xB529, 0xB5F9, 0xB52A, 0xB5FA, 0xB52B, 0x8B48, + 0xB52C, 0x8B49, 0xB52D, 0x8B4A, 0xB52E, 0x8B4B, 0xB52F, 0x8B4C, + 0xB530, 0xB5FB, 0xB531, 0xB5FC, 0xB532, 0x8B4D, 0xB533, 0x8B4E, + 0xB534, 0xB5FD, 0xB535, 0x8B4F, 0xB536, 0x8B50, 0xB537, 0x8B51, + 0xB538, 0xB5FE, 0xB539, 0x8B52, 0xB53A, 0x8B53, 0xB53B, 0x8B54, + 0xB53C, 0x8B55, 0xB53D, 0x8B56, 0xB53E, 0x8B57, 0xB53F, 0x8B58, + 0xB540, 0xB6A1, 0xB541, 0xB6A2, 0xB542, 0x8B59, 0xB543, 0xB6A3, + 0xB544, 0xB6A4, 0xB545, 0xB6A5, 0xB546, 0x8B5A, 0xB547, 0x8B61, + 0xB548, 0x8B62, 0xB549, 0x8B63, 0xB54A, 0x8B64, 0xB54B, 0xB6A6, + 0xB54C, 0xB6A7, 0xB54D, 0xB6A8, 0xB54E, 0x8B65, 0xB54F, 0x8B66, + 0xB550, 0xB6A9, 0xB551, 0x8B67, 0xB552, 0x8B68, 0xB553, 0x8B69, + 0xB554, 0xB6AA, 0xB555, 0x8B6A, 0xB556, 0x8B6B, 0xB557, 0x8B6C, + 0xB558, 0x8B6D, 0xB559, 0x8B6E, 0xB55A, 0x8B6F, 0xB55B, 0x8B70, + 0xB55C, 0xB6AB, 0xB55D, 0xB6AC, 0xB55E, 0x8B71, 0xB55F, 0xB6AD, + 0xB560, 0xB6AE, 0xB561, 0xB6AF, 0xB562, 0x8B72, 0xB563, 0x8B73, + 0xB564, 0x8B74, 0xB565, 0x8B75, 0xB566, 0x8B76, 0xB567, 0x8B77, + 0xB568, 0x8B78, 0xB569, 0x8B79, 0xB56A, 0x8B7A, 0xB56B, 0x8B81, + 0xB56C, 0x8B82, 0xB56D, 0x8B83, 0xB56E, 0x8B84, 0xB56F, 0x8B85, + 0xB570, 0x8B86, 0xB571, 0x8B87, 0xB572, 0x8B88, 0xB573, 0x8B89, + 0xB574, 0x8B8A, 0xB575, 0x8B8B, 0xB576, 0x8B8C, 0xB577, 0x8B8D, + 0xB578, 0x8B8E, 0xB579, 0x8B8F, 0xB57A, 0x8B90, 0xB57B, 0x8B91, + 0xB57C, 0x8B92, 0xB57D, 0x8B93, 0xB57E, 0x8B94, 0xB57F, 0x8B95, + 0xB580, 0x8B96, 0xB581, 0x8B97, 0xB582, 0x8B98, 0xB583, 0x8B99, + 0xB584, 0x8B9A, 0xB585, 0x8B9B, 0xB586, 0x8B9C, 0xB587, 0x8B9D, + 0xB588, 0x8B9E, 0xB589, 0x8B9F, 0xB58A, 0x8BA0, 0xB58B, 0x8BA1, + 0xB58C, 0x8BA2, 0xB58D, 0x8BA3, 0xB58E, 0x8BA4, 0xB58F, 0x8BA5, + 0xB590, 0x8BA6, 0xB591, 0x8BA7, 0xB592, 0x8BA8, 0xB593, 0x8BA9, + 0xB594, 0x8BAA, 0xB595, 0x8BAB, 0xB596, 0x8BAC, 0xB597, 0x8BAD, + 0xB598, 0x8BAE, 0xB599, 0x8BAF, 0xB59A, 0x8BB0, 0xB59B, 0x8BB1, + 0xB59C, 0x8BB2, 0xB59D, 0x8BB3, 0xB59E, 0x8BB4, 0xB59F, 0x8BB5, + 0xB5A0, 0xB6B0, 0xB5A1, 0xB6B1, 0xB5A2, 0x8BB6, 0xB5A3, 0x8BB7, + 0xB5A4, 0xB6B2, 0xB5A5, 0x8BB8, 0xB5A6, 0x8BB9, 0xB5A7, 0x8BBA, + 0xB5A8, 0xB6B3, 0xB5A9, 0x8BBB, 0xB5AA, 0xB6B4, 0xB5AB, 0xB6B5, + 0xB5AC, 0x8BBC, 0xB5AD, 0x8BBD, 0xB5AE, 0x8BBE, 0xB5AF, 0x8BBF, + 0xB5B0, 0xB6B6, 0xB5B1, 0xB6B7, 0xB5B2, 0x8BC0, 0xB5B3, 0xB6B8, + 0xB5B4, 0xB6B9, 0xB5B5, 0xB6BA, 0xB5B6, 0x8BC1, 0xB5B7, 0x8BC2, + 0xB5B8, 0x8BC3, 0xB5B9, 0x8BC4, 0xB5BA, 0x8BC5, 0xB5BB, 0xB6BB, + 0xB5BC, 0xB6BC, 0xB5BD, 0xB6BD, 0xB5BE, 0x8BC6, 0xB5BF, 0x8BC7, + 0xB5C0, 0xB6BE, 0xB5C1, 0x8BC8, 0xB5C2, 0x8BC9, 0xB5C3, 0x8BCA, + 0xB5C4, 0xB6BF, 0xB5C5, 0x8BCB, 0xB5C6, 0x8BCC, 0xB5C7, 0x8BCD, + 0xB5C8, 0x8BCE, 0xB5C9, 0x8BCF, 0xB5CA, 0x8BD0, 0xB5CB, 0x8BD1, + 0xB5CC, 0xB6C0, 0xB5CD, 0xB6C1, 0xB5CE, 0x8BD2, 0xB5CF, 0xB6C2, + 0xB5D0, 0xB6C3, 0xB5D1, 0xB6C4, 0xB5D2, 0x8BD3, 0xB5D3, 0x8BD4, + 0xB5D4, 0x8BD5, 0xB5D5, 0x8BD6, 0xB5D6, 0x8BD7, 0xB5D7, 0x8BD8, + 0xB5D8, 0xB6C5, 0xB5D9, 0x8BD9, 0xB5DA, 0x8BDA, 0xB5DB, 0x8BDB, + 0xB5DC, 0x8BDC, 0xB5DD, 0x8BDD, 0xB5DE, 0x8BDE, 0xB5DF, 0x8BDF, + 0xB5E0, 0x8BE0, 0xB5E1, 0x8BE1, 0xB5E2, 0x8BE2, 0xB5E3, 0x8BE3, + 0xB5E4, 0x8BE4, 0xB5E5, 0x8BE5, 0xB5E6, 0x8BE6, 0xB5E7, 0x8BE7, + 0xB5E8, 0x8BE8, 0xB5E9, 0x8BE9, 0xB5EA, 0x8BEA, 0xB5EB, 0x8BEB, + 0xB5EC, 0xB6C6, 0xB5ED, 0x8BEC, 0xB5EE, 0x8BED, 0xB5EF, 0x8BEE, + 0xB5F0, 0x8BEF, 0xB5F1, 0x8BF0, 0xB5F2, 0x8BF1, 0xB5F3, 0x8BF2, + 0xB5F4, 0x8BF3, 0xB5F5, 0x8BF4, 0xB5F6, 0x8BF5, 0xB5F7, 0x8BF6, + 0xB5F8, 0x8BF7, 0xB5F9, 0x8BF8, 0xB5FA, 0x8BF9, 0xB5FB, 0x8BFA, + 0xB5FC, 0x8BFB, 0xB5FD, 0x8BFC, 0xB5FE, 0x8BFD, 0xB5FF, 0x8BFE, + 0xB600, 0x8C41, 0xB601, 0x8C42, 0xB602, 0x8C43, 0xB603, 0x8C44, + 0xB604, 0x8C45, 0xB605, 0x8C46, 0xB606, 0x8C47, 0xB607, 0x8C48, + 0xB608, 0x8C49, 0xB609, 0x8C4A, 0xB60A, 0x8C4B, 0xB60B, 0x8C4C, + 0xB60C, 0x8C4D, 0xB60D, 0x8C4E, 0xB60E, 0x8C4F, 0xB60F, 0x8C50, + 0xB610, 0xB6C7, 0xB611, 0xB6C8, 0xB612, 0x8C51, 0xB613, 0x8C52, + 0xB614, 0xB6C9, 0xB615, 0x8C53, 0xB616, 0x8C54, 0xB617, 0x8C55, + 0xB618, 0xB6CA, 0xB619, 0x8C56, 0xB61A, 0x8C57, 0xB61B, 0x8C58, + 0xB61C, 0x8C59, 0xB61D, 0x8C5A, 0xB61E, 0x8C61, 0xB61F, 0x8C62, + 0xB620, 0x8C63, 0xB621, 0x8C64, 0xB622, 0x8C65, 0xB623, 0x8C66, + 0xB624, 0x8C67, 0xB625, 0xB6CB, 0xB626, 0x8C68, 0xB627, 0x8C69, + 0xB628, 0x8C6A, 0xB629, 0x8C6B, 0xB62A, 0x8C6C, 0xB62B, 0x8C6D, + 0xB62C, 0xB6CC, 0xB62D, 0x8C6E, 0xB62E, 0x8C6F, 0xB62F, 0x8C70, + 0xB630, 0x8C71, 0xB631, 0x8C72, 0xB632, 0x8C73, 0xB633, 0x8C74, + 0xB634, 0xB6CD, 0xB635, 0x8C75, 0xB636, 0x8C76, 0xB637, 0x8C77, + 0xB638, 0x8C78, 0xB639, 0x8C79, 0xB63A, 0x8C7A, 0xB63B, 0x8C81, + 0xB63C, 0x8C82, 0xB63D, 0x8C83, 0xB63E, 0x8C84, 0xB63F, 0x8C85, + 0xB640, 0x8C86, 0xB641, 0x8C87, 0xB642, 0x8C88, 0xB643, 0x8C89, + 0xB644, 0x8C8A, 0xB645, 0x8C8B, 0xB646, 0x8C8C, 0xB647, 0x8C8D, + 0xB648, 0xB6CE, 0xB649, 0x8C8E, 0xB64A, 0x8C8F, 0xB64B, 0x8C90, + 0xB64C, 0x8C91, 0xB64D, 0x8C92, 0xB64E, 0x8C93, 0xB64F, 0x8C94, + 0xB650, 0x8C95, 0xB651, 0x8C96, 0xB652, 0x8C97, 0xB653, 0x8C98, + 0xB654, 0x8C99, 0xB655, 0x8C9A, 0xB656, 0x8C9B, 0xB657, 0x8C9C, + 0xB658, 0x8C9D, 0xB659, 0x8C9E, 0xB65A, 0x8C9F, 0xB65B, 0x8CA0, + 0xB65C, 0x8CA1, 0xB65D, 0x8CA2, 0xB65E, 0x8CA3, 0xB65F, 0x8CA4, + 0xB660, 0x8CA5, 0xB661, 0x8CA6, 0xB662, 0x8CA7, 0xB663, 0x8CA8, + 0xB664, 0xB6CF, 0xB665, 0x8CA9, 0xB666, 0x8CAA, 0xB667, 0x8CAB, + 0xB668, 0xB6D0, 0xB669, 0x8CAC, 0xB66A, 0x8CAD, 0xB66B, 0x8CAE, + 0xB66C, 0x8CAF, 0xB66D, 0x8CB0, 0xB66E, 0x8CB1, 0xB66F, 0x8CB2, + 0xB670, 0x8CB3, 0xB671, 0x8CB4, 0xB672, 0x8CB5, 0xB673, 0x8CB6, + 0xB674, 0x8CB7, 0xB675, 0x8CB8, 0xB676, 0x8CB9, 0xB677, 0x8CBA, + 0xB678, 0x8CBB, 0xB679, 0x8CBC, 0xB67A, 0x8CBD, 0xB67B, 0x8CBE, + 0xB67C, 0x8CBF, 0xB67D, 0x8CC0, 0xB67E, 0x8CC1, 0xB67F, 0x8CC2, + 0xB680, 0x8CC3, 0xB681, 0x8CC4, 0xB682, 0x8CC5, 0xB683, 0x8CC6, + 0xB684, 0x8CC7, 0xB685, 0x8CC8, 0xB686, 0x8CC9, 0xB687, 0x8CCA, + 0xB688, 0x8CCB, 0xB689, 0x8CCC, 0xB68A, 0x8CCD, 0xB68B, 0x8CCE, + 0xB68C, 0x8CCF, 0xB68D, 0x8CD0, 0xB68E, 0x8CD1, 0xB68F, 0x8CD2, + 0xB690, 0x8CD3, 0xB691, 0x8CD4, 0xB692, 0x8CD5, 0xB693, 0x8CD6, + 0xB694, 0x8CD7, 0xB695, 0x8CD8, 0xB696, 0x8CD9, 0xB697, 0x8CDA, + 0xB698, 0x8CDB, 0xB699, 0x8CDC, 0xB69A, 0x8CDD, 0xB69B, 0x8CDE, + 0xB69C, 0xB6D1, 0xB69D, 0xB6D2, 0xB69E, 0x8CDF, 0xB69F, 0x8CE0, + 0xB6A0, 0xB6D3, 0xB6A1, 0x8CE1, 0xB6A2, 0x8CE2, 0xB6A3, 0x8CE3, + 0xB6A4, 0xB6D4, 0xB6A5, 0x8CE4, 0xB6A6, 0x8CE5, 0xB6A7, 0x8CE6, + 0xB6A8, 0x8CE7, 0xB6A9, 0x8CE8, 0xB6AA, 0x8CE9, 0xB6AB, 0xB6D5, + 0xB6AC, 0xB6D6, 0xB6AD, 0x8CEA, 0xB6AE, 0x8CEB, 0xB6AF, 0x8CEC, + 0xB6B0, 0x8CED, 0xB6B1, 0xB6D7, 0xB6B2, 0x8CEE, 0xB6B3, 0x8CEF, + 0xB6B4, 0x8CF0, 0xB6B5, 0x8CF1, 0xB6B6, 0x8CF2, 0xB6B7, 0x8CF3, + 0xB6B8, 0x8CF4, 0xB6B9, 0x8CF5, 0xB6BA, 0x8CF6, 0xB6BB, 0x8CF7, + 0xB6BC, 0x8CF8, 0xB6BD, 0x8CF9, 0xB6BE, 0x8CFA, 0xB6BF, 0x8CFB, + 0xB6C0, 0x8CFC, 0xB6C1, 0x8CFD, 0xB6C2, 0x8CFE, 0xB6C3, 0x8D41, + 0xB6C4, 0x8D42, 0xB6C5, 0x8D43, 0xB6C6, 0x8D44, 0xB6C7, 0x8D45, + 0xB6C8, 0x8D46, 0xB6C9, 0x8D47, 0xB6CA, 0x8D48, 0xB6CB, 0x8D49, + 0xB6CC, 0x8D4A, 0xB6CD, 0x8D4B, 0xB6CE, 0x8D4C, 0xB6CF, 0x8D4D, + 0xB6D0, 0x8D4E, 0xB6D1, 0x8D4F, 0xB6D2, 0x8D50, 0xB6D3, 0x8D51, + 0xB6D4, 0xB6D8, 0xB6D5, 0x8D52, 0xB6D6, 0x8D53, 0xB6D7, 0x8D54, + 0xB6D8, 0x8D55, 0xB6D9, 0x8D56, 0xB6DA, 0x8D57, 0xB6DB, 0x8D58, + 0xB6DC, 0x8D59, 0xB6DD, 0x8D5A, 0xB6DE, 0x8D61, 0xB6DF, 0x8D62, + 0xB6E0, 0x8D63, 0xB6E1, 0x8D64, 0xB6E2, 0x8D65, 0xB6E3, 0x8D66, + 0xB6E4, 0x8D67, 0xB6E5, 0x8D68, 0xB6E6, 0x8D69, 0xB6E7, 0x8D6A, + 0xB6E8, 0x8D6B, 0xB6E9, 0x8D6C, 0xB6EA, 0x8D6D, 0xB6EB, 0x8D6E, + 0xB6EC, 0x8D6F, 0xB6ED, 0x8D70, 0xB6EE, 0x8D71, 0xB6EF, 0x8D72, + 0xB6F0, 0xB6D9, 0xB6F1, 0x8D73, 0xB6F2, 0x8D74, 0xB6F3, 0x8D75, + 0xB6F4, 0xB6DA, 0xB6F5, 0x8D76, 0xB6F6, 0x8D77, 0xB6F7, 0x8D78, + 0xB6F8, 0xB6DB, 0xB6F9, 0x8D79, 0xB6FA, 0x8D7A, 0xB6FB, 0x8D81, + 0xB6FC, 0x8D82, 0xB6FD, 0x8D83, 0xB6FE, 0x8D84, 0xB6FF, 0x8D85, + 0xB700, 0xB6DC, 0xB701, 0xB6DD, 0xB702, 0x8D86, 0xB703, 0x8D87, + 0xB704, 0x8D88, 0xB705, 0xB6DE, 0xB706, 0x8D89, 0xB707, 0x8D8A, + 0xB708, 0x8D8B, 0xB709, 0x8D8C, 0xB70A, 0x8D8D, 0xB70B, 0x8D8E, + 0xB70C, 0x8D8F, 0xB70D, 0x8D90, 0xB70E, 0x8D91, 0xB70F, 0x8D92, + 0xB710, 0x8D93, 0xB711, 0x8D94, 0xB712, 0x8D95, 0xB713, 0x8D96, + 0xB714, 0x8D97, 0xB715, 0x8D98, 0xB716, 0x8D99, 0xB717, 0x8D9A, + 0xB718, 0x8D9B, 0xB719, 0x8D9C, 0xB71A, 0x8D9D, 0xB71B, 0x8D9E, + 0xB71C, 0x8D9F, 0xB71D, 0x8DA0, 0xB71E, 0x8DA1, 0xB71F, 0x8DA2, + 0xB720, 0x8DA3, 0xB721, 0x8DA4, 0xB722, 0x8DA5, 0xB723, 0x8DA6, + 0xB724, 0x8DA7, 0xB725, 0x8DA8, 0xB726, 0x8DA9, 0xB727, 0x8DAA, + 0xB728, 0xB6DF, 0xB729, 0xB6E0, 0xB72A, 0x8DAB, 0xB72B, 0x8DAC, + 0xB72C, 0xB6E1, 0xB72D, 0x8DAD, 0xB72E, 0x8DAE, 0xB72F, 0xB6E2, + 0xB730, 0xB6E3, 0xB731, 0x8DAF, 0xB732, 0x8DB0, 0xB733, 0x8DB1, + 0xB734, 0x8DB2, 0xB735, 0x8DB3, 0xB736, 0x8DB4, 0xB737, 0x8DB5, + 0xB738, 0xB6E4, 0xB739, 0xB6E5, 0xB73A, 0x8DB6, 0xB73B, 0xB6E6, + 0xB73C, 0x8DB7, 0xB73D, 0x8DB8, 0xB73E, 0x8DB9, 0xB73F, 0x8DBA, + 0xB740, 0x8DBB, 0xB741, 0x8DBC, 0xB742, 0x8DBD, 0xB743, 0x8DBE, + 0xB744, 0xB6E7, 0xB745, 0x8DBF, 0xB746, 0x8DC0, 0xB747, 0x8DC1, + 0xB748, 0xB6E8, 0xB749, 0x8DC2, 0xB74A, 0x8DC3, 0xB74B, 0x8DC4, + 0xB74C, 0xB6E9, 0xB74D, 0x8DC5, 0xB74E, 0x8DC6, 0xB74F, 0x8DC7, + 0xB750, 0x8DC8, 0xB751, 0x8DC9, 0xB752, 0x8DCA, 0xB753, 0x8DCB, + 0xB754, 0xB6EA, 0xB755, 0xB6EB, 0xB756, 0x8DCC, 0xB757, 0x8DCD, + 0xB758, 0x8DCE, 0xB759, 0x8DCF, 0xB75A, 0x8DD0, 0xB75B, 0x8DD1, + 0xB75C, 0x8DD2, 0xB75D, 0x8DD3, 0xB75E, 0x8DD4, 0xB75F, 0x8DD5, + 0xB760, 0xB6EC, 0xB761, 0x8DD6, 0xB762, 0x8DD7, 0xB763, 0x8DD8, + 0xB764, 0xB6ED, 0xB765, 0x8DD9, 0xB766, 0x8DDA, 0xB767, 0x8DDB, + 0xB768, 0xB6EE, 0xB769, 0x8DDC, 0xB76A, 0x8DDD, 0xB76B, 0x8DDE, + 0xB76C, 0x8DDF, 0xB76D, 0x8DE0, 0xB76E, 0x8DE1, 0xB76F, 0x8DE2, + 0xB770, 0xB6EF, 0xB771, 0xB6F0, 0xB772, 0x8DE3, 0xB773, 0xB6F1, + 0xB774, 0x8DE4, 0xB775, 0xB6F2, 0xB776, 0x8DE5, 0xB777, 0x8DE6, + 0xB778, 0x8DE7, 0xB779, 0x8DE8, 0xB77A, 0x8DE9, 0xB77B, 0x8DEA, + 0xB77C, 0xB6F3, 0xB77D, 0xB6F4, 0xB77E, 0x8DEB, 0xB77F, 0x8DEC, + 0xB780, 0xB6F5, 0xB781, 0x8DED, 0xB782, 0x8DEE, 0xB783, 0x8DEF, + 0xB784, 0xB6F6, 0xB785, 0x8DF0, 0xB786, 0x8DF1, 0xB787, 0x8DF2, + 0xB788, 0x8DF3, 0xB789, 0x8DF4, 0xB78A, 0x8DF5, 0xB78B, 0x8DF6, + 0xB78C, 0xB6F7, 0xB78D, 0xB6F8, 0xB78E, 0x8DF7, 0xB78F, 0xB6F9, + 0xB790, 0xB6FA, 0xB791, 0xB6FB, 0xB792, 0xB6FC, 0xB793, 0x8DF8, + 0xB794, 0x8DF9, 0xB795, 0x8DFA, 0xB796, 0xB6FD, 0xB797, 0xB6FE, + 0xB798, 0xB7A1, 0xB799, 0xB7A2, 0xB79A, 0x8DFB, 0xB79B, 0x8DFC, + 0xB79C, 0xB7A3, 0xB79D, 0x8DFD, 0xB79E, 0x8DFE, 0xB79F, 0x8E41, + 0xB7A0, 0xB7A4, 0xB7A1, 0x8E42, 0xB7A2, 0x8E43, 0xB7A3, 0x8E44, + 0xB7A4, 0x8E45, 0xB7A5, 0x8E46, 0xB7A6, 0x8E47, 0xB7A7, 0x8E48, + 0xB7A8, 0xB7A5, 0xB7A9, 0xB7A6, 0xB7AA, 0x8E49, 0xB7AB, 0xB7A7, + 0xB7AC, 0xB7A8, 0xB7AD, 0xB7A9, 0xB7AE, 0x8E4A, 0xB7AF, 0x8E4B, + 0xB7B0, 0x8E4C, 0xB7B1, 0x8E4D, 0xB7B2, 0x8E4E, 0xB7B3, 0x8E4F, + 0xB7B4, 0xB7AA, 0xB7B5, 0xB7AB, 0xB7B6, 0x8E50, 0xB7B7, 0x8E51, + 0xB7B8, 0xB7AC, 0xB7B9, 0x8E52, 0xB7BA, 0x8E53, 0xB7BB, 0x8E54, + 0xB7BC, 0x8E55, 0xB7BD, 0x8E56, 0xB7BE, 0x8E57, 0xB7BF, 0x8E58, + 0xB7C0, 0x8E59, 0xB7C1, 0x8E5A, 0xB7C2, 0x8E61, 0xB7C3, 0x8E62, + 0xB7C4, 0x8E63, 0xB7C5, 0x8E64, 0xB7C6, 0x8E65, 0xB7C7, 0xB7AD, + 0xB7C8, 0x8E66, 0xB7C9, 0xB7AE, 0xB7CA, 0x8E67, 0xB7CB, 0x8E68, + 0xB7CC, 0x8E69, 0xB7CD, 0x8E6A, 0xB7CE, 0x8E6B, 0xB7CF, 0x8E6C, + 0xB7D0, 0x8E6D, 0xB7D1, 0x8E6E, 0xB7D2, 0x8E6F, 0xB7D3, 0x8E70, + 0xB7D4, 0x8E71, 0xB7D5, 0x8E72, 0xB7D6, 0x8E73, 0xB7D7, 0x8E74, + 0xB7D8, 0x8E75, 0xB7D9, 0x8E76, 0xB7DA, 0x8E77, 0xB7DB, 0x8E78, + 0xB7DC, 0x8E79, 0xB7DD, 0x8E7A, 0xB7DE, 0x8E81, 0xB7DF, 0x8E82, + 0xB7E0, 0x8E83, 0xB7E1, 0x8E84, 0xB7E2, 0x8E85, 0xB7E3, 0x8E86, + 0xB7E4, 0x8E87, 0xB7E5, 0x8E88, 0xB7E6, 0x8E89, 0xB7E7, 0x8E8A, + 0xB7E8, 0x8E8B, 0xB7E9, 0x8E8C, 0xB7EA, 0x8E8D, 0xB7EB, 0x8E8E, + 0xB7EC, 0xB7AF, 0xB7ED, 0xB7B0, 0xB7EE, 0x8E8F, 0xB7EF, 0x8E90, + 0xB7F0, 0xB7B1, 0xB7F1, 0x8E91, 0xB7F2, 0x8E92, 0xB7F3, 0x8E93, + 0xB7F4, 0xB7B2, 0xB7F5, 0x8E94, 0xB7F6, 0x8E95, 0xB7F7, 0x8E96, + 0xB7F8, 0x8E97, 0xB7F9, 0x8E98, 0xB7FA, 0x8E99, 0xB7FB, 0x8E9A, + 0xB7FC, 0xB7B3, 0xB7FD, 0xB7B4, 0xB7FE, 0x8E9B, 0xB7FF, 0xB7B5, + 0xB800, 0xB7B6, 0xB801, 0xB7B7, 0xB802, 0x8E9C, 0xB803, 0x8E9D, + 0xB804, 0x8E9E, 0xB805, 0x8E9F, 0xB806, 0x8EA0, 0xB807, 0xB7B8, + 0xB808, 0xB7B9, 0xB809, 0xB7BA, 0xB80A, 0x8EA1, 0xB80B, 0x8EA2, + 0xB80C, 0xB7BB, 0xB80D, 0x8EA3, 0xB80E, 0x8EA4, 0xB80F, 0x8EA5, + 0xB810, 0xB7BC, 0xB811, 0x8EA6, 0xB812, 0x8EA7, 0xB813, 0x8EA8, + 0xB814, 0x8EA9, 0xB815, 0x8EAA, 0xB816, 0x8EAB, 0xB817, 0x8EAC, + 0xB818, 0xB7BD, 0xB819, 0xB7BE, 0xB81A, 0x8EAD, 0xB81B, 0xB7BF, + 0xB81C, 0x8EAE, 0xB81D, 0xB7C0, 0xB81E, 0x8EAF, 0xB81F, 0x8EB0, + 0xB820, 0x8EB1, 0xB821, 0x8EB2, 0xB822, 0x8EB3, 0xB823, 0x8EB4, + 0xB824, 0xB7C1, 0xB825, 0xB7C2, 0xB826, 0x8EB5, 0xB827, 0x8EB6, + 0xB828, 0xB7C3, 0xB829, 0x8EB7, 0xB82A, 0x8EB8, 0xB82B, 0x8EB9, + 0xB82C, 0xB7C4, 0xB82D, 0x8EBA, 0xB82E, 0x8EBB, 0xB82F, 0x8EBC, + 0xB830, 0x8EBD, 0xB831, 0x8EBE, 0xB832, 0x8EBF, 0xB833, 0x8EC0, + 0xB834, 0xB7C5, 0xB835, 0xB7C6, 0xB836, 0x8EC1, 0xB837, 0xB7C7, + 0xB838, 0xB7C8, 0xB839, 0xB7C9, 0xB83A, 0x8EC2, 0xB83B, 0x8EC3, + 0xB83C, 0x8EC4, 0xB83D, 0x8EC5, 0xB83E, 0x8EC6, 0xB83F, 0x8EC7, + 0xB840, 0xB7CA, 0xB841, 0x8EC8, 0xB842, 0x8EC9, 0xB843, 0x8ECA, + 0xB844, 0xB7CB, 0xB845, 0x8ECB, 0xB846, 0x8ECC, 0xB847, 0x8ECD, + 0xB848, 0x8ECE, 0xB849, 0x8ECF, 0xB84A, 0x8ED0, 0xB84B, 0x8ED1, + 0xB84C, 0x8ED2, 0xB84D, 0x8ED3, 0xB84E, 0x8ED4, 0xB84F, 0x8ED5, + 0xB850, 0x8ED6, 0xB851, 0xB7CC, 0xB852, 0x8ED7, 0xB853, 0xB7CD, + 0xB854, 0x8ED8, 0xB855, 0x8ED9, 0xB856, 0x8EDA, 0xB857, 0x8EDB, + 0xB858, 0x8EDC, 0xB859, 0x8EDD, 0xB85A, 0x8EDE, 0xB85B, 0x8EDF, + 0xB85C, 0xB7CE, 0xB85D, 0xB7CF, 0xB85E, 0x8EE0, 0xB85F, 0x8EE1, + 0xB860, 0xB7D0, 0xB861, 0x8EE2, 0xB862, 0x8EE3, 0xB863, 0x8EE4, + 0xB864, 0xB7D1, 0xB865, 0x8EE5, 0xB866, 0x8EE6, 0xB867, 0x8EE7, + 0xB868, 0x8EE8, 0xB869, 0x8EE9, 0xB86A, 0x8EEA, 0xB86B, 0x8EEB, + 0xB86C, 0xB7D2, 0xB86D, 0xB7D3, 0xB86E, 0x8EEC, 0xB86F, 0xB7D4, + 0xB870, 0x8EED, 0xB871, 0xB7D5, 0xB872, 0x8EEE, 0xB873, 0x8EEF, + 0xB874, 0x8EF0, 0xB875, 0x8EF1, 0xB876, 0x8EF2, 0xB877, 0x8EF3, + 0xB878, 0xB7D6, 0xB879, 0x8EF4, 0xB87A, 0x8EF5, 0xB87B, 0x8EF6, + 0xB87C, 0xB7D7, 0xB87D, 0x8EF7, 0xB87E, 0x8EF8, 0xB87F, 0x8EF9, + 0xB880, 0x8EFA, 0xB881, 0x8EFB, 0xB882, 0x8EFC, 0xB883, 0x8EFD, + 0xB884, 0x8EFE, 0xB885, 0x8F41, 0xB886, 0x8F42, 0xB887, 0x8F43, + 0xB888, 0x8F44, 0xB889, 0x8F45, 0xB88A, 0x8F46, 0xB88B, 0x8F47, + 0xB88C, 0x8F48, 0xB88D, 0xB7D8, 0xB88E, 0x8F49, 0xB88F, 0x8F4A, + 0xB890, 0x8F4B, 0xB891, 0x8F4C, 0xB892, 0x8F4D, 0xB893, 0x8F4E, + 0xB894, 0x8F4F, 0xB895, 0x8F50, 0xB896, 0x8F51, 0xB897, 0x8F52, + 0xB898, 0x8F53, 0xB899, 0x8F54, 0xB89A, 0x8F55, 0xB89B, 0x8F56, + 0xB89C, 0x8F57, 0xB89D, 0x8F58, 0xB89E, 0x8F59, 0xB89F, 0x8F5A, + 0xB8A0, 0x8F61, 0xB8A1, 0x8F62, 0xB8A2, 0x8F63, 0xB8A3, 0x8F64, + 0xB8A4, 0x8F65, 0xB8A5, 0x8F66, 0xB8A6, 0x8F67, 0xB8A7, 0x8F68, + 0xB8A8, 0xB7D9, 0xB8A9, 0x8F69, 0xB8AA, 0x8F6A, 0xB8AB, 0x8F6B, + 0xB8AC, 0x8F6C, 0xB8AD, 0x8F6D, 0xB8AE, 0x8F6E, 0xB8AF, 0x8F6F, + 0xB8B0, 0xB7DA, 0xB8B1, 0x8F70, 0xB8B2, 0x8F71, 0xB8B3, 0x8F72, + 0xB8B4, 0xB7DB, 0xB8B5, 0x8F73, 0xB8B6, 0x8F74, 0xB8B7, 0x8F75, + 0xB8B8, 0xB7DC, 0xB8B9, 0x8F76, 0xB8BA, 0x8F77, 0xB8BB, 0x8F78, + 0xB8BC, 0x8F79, 0xB8BD, 0x8F7A, 0xB8BE, 0x8F81, 0xB8BF, 0x8F82, + 0xB8C0, 0xB7DD, 0xB8C1, 0xB7DE, 0xB8C2, 0x8F83, 0xB8C3, 0xB7DF, + 0xB8C4, 0x8F84, 0xB8C5, 0xB7E0, 0xB8C6, 0x8F85, 0xB8C7, 0x8F86, + 0xB8C8, 0x8F87, 0xB8C9, 0x8F88, 0xB8CA, 0x8F89, 0xB8CB, 0x8F8A, + 0xB8CC, 0xB7E1, 0xB8CD, 0x8F8B, 0xB8CE, 0x8F8C, 0xB8CF, 0x8F8D, + 0xB8D0, 0xB7E2, 0xB8D1, 0x8F8E, 0xB8D2, 0x8F8F, 0xB8D3, 0x8F90, + 0xB8D4, 0xB7E3, 0xB8D5, 0x8F91, 0xB8D6, 0x8F92, 0xB8D7, 0x8F93, + 0xB8D8, 0x8F94, 0xB8D9, 0x8F95, 0xB8DA, 0x8F96, 0xB8DB, 0x8F97, + 0xB8DC, 0x8F98, 0xB8DD, 0xB7E4, 0xB8DE, 0x8F99, 0xB8DF, 0xB7E5, + 0xB8E0, 0x8F9A, 0xB8E1, 0xB7E6, 0xB8E2, 0x8F9B, 0xB8E3, 0x8F9C, + 0xB8E4, 0x8F9D, 0xB8E5, 0x8F9E, 0xB8E6, 0x8F9F, 0xB8E7, 0x8FA0, + 0xB8E8, 0xB7E7, 0xB8E9, 0xB7E8, 0xB8EA, 0x8FA1, 0xB8EB, 0x8FA2, + 0xB8EC, 0xB7E9, 0xB8ED, 0x8FA3, 0xB8EE, 0x8FA4, 0xB8EF, 0x8FA5, + 0xB8F0, 0xB7EA, 0xB8F1, 0x8FA6, 0xB8F2, 0x8FA7, 0xB8F3, 0x8FA8, + 0xB8F4, 0x8FA9, 0xB8F5, 0x8FAA, 0xB8F6, 0x8FAB, 0xB8F7, 0x8FAC, + 0xB8F8, 0xB7EB, 0xB8F9, 0xB7EC, 0xB8FA, 0x8FAD, 0xB8FB, 0xB7ED, + 0xB8FC, 0x8FAE, 0xB8FD, 0xB7EE, 0xB8FE, 0x8FAF, 0xB8FF, 0x8FB0, + 0xB900, 0x8FB1, 0xB901, 0x8FB2, 0xB902, 0x8FB3, 0xB903, 0x8FB4, + 0xB904, 0xB7EF, 0xB905, 0x8FB5, 0xB906, 0x8FB6, 0xB907, 0x8FB7, + 0xB908, 0x8FB8, 0xB909, 0x8FB9, 0xB90A, 0x8FBA, 0xB90B, 0x8FBB, + 0xB90C, 0x8FBC, 0xB90D, 0x8FBD, 0xB90E, 0x8FBE, 0xB90F, 0x8FBF, + 0xB910, 0x8FC0, 0xB911, 0x8FC1, 0xB912, 0x8FC2, 0xB913, 0x8FC3, + 0xB914, 0x8FC4, 0xB915, 0x8FC5, 0xB916, 0x8FC6, 0xB917, 0x8FC7, + 0xB918, 0xB7F0, 0xB919, 0x8FC8, 0xB91A, 0x8FC9, 0xB91B, 0x8FCA, + 0xB91C, 0x8FCB, 0xB91D, 0x8FCC, 0xB91E, 0x8FCD, 0xB91F, 0x8FCE, + 0xB920, 0xB7F1, 0xB921, 0x8FCF, 0xB922, 0x8FD0, 0xB923, 0x8FD1, + 0xB924, 0x8FD2, 0xB925, 0x8FD3, 0xB926, 0x8FD4, 0xB927, 0x8FD5, + 0xB928, 0x8FD6, 0xB929, 0x8FD7, 0xB92A, 0x8FD8, 0xB92B, 0x8FD9, + 0xB92C, 0x8FDA, 0xB92D, 0x8FDB, 0xB92E, 0x8FDC, 0xB92F, 0x8FDD, + 0xB930, 0x8FDE, 0xB931, 0x8FDF, 0xB932, 0x8FE0, 0xB933, 0x8FE1, + 0xB934, 0x8FE2, 0xB935, 0x8FE3, 0xB936, 0x8FE4, 0xB937, 0x8FE5, + 0xB938, 0x8FE6, 0xB939, 0x8FE7, 0xB93A, 0x8FE8, 0xB93B, 0x8FE9, + 0xB93C, 0xB7F2, 0xB93D, 0xB7F3, 0xB93E, 0x8FEA, 0xB93F, 0x8FEB, + 0xB940, 0xB7F4, 0xB941, 0x8FEC, 0xB942, 0x8FED, 0xB943, 0x8FEE, + 0xB944, 0xB7F5, 0xB945, 0x8FEF, 0xB946, 0x8FF0, 0xB947, 0x8FF1, + 0xB948, 0x8FF2, 0xB949, 0x8FF3, 0xB94A, 0x8FF4, 0xB94B, 0x8FF5, + 0xB94C, 0xB7F6, 0xB94D, 0x8FF6, 0xB94E, 0x8FF7, 0xB94F, 0xB7F7, + 0xB950, 0x8FF8, 0xB951, 0xB7F8, 0xB952, 0x8FF9, 0xB953, 0x8FFA, + 0xB954, 0x8FFB, 0xB955, 0x8FFC, 0xB956, 0x8FFD, 0xB957, 0x8FFE, + 0xB958, 0xB7F9, 0xB959, 0xB7FA, 0xB95A, 0x9041, 0xB95B, 0x9042, + 0xB95C, 0xB7FB, 0xB95D, 0x9043, 0xB95E, 0x9044, 0xB95F, 0x9045, + 0xB960, 0xB7FC, 0xB961, 0x9046, 0xB962, 0x9047, 0xB963, 0x9048, + 0xB964, 0x9049, 0xB965, 0x904A, 0xB966, 0x904B, 0xB967, 0x904C, + 0xB968, 0xB7FD, 0xB969, 0xB7FE, 0xB96A, 0x904D, 0xB96B, 0xB8A1, + 0xB96C, 0x904E, 0xB96D, 0xB8A2, 0xB96E, 0x904F, 0xB96F, 0x9050, + 0xB970, 0x9051, 0xB971, 0x9052, 0xB972, 0x9053, 0xB973, 0x9054, + 0xB974, 0xB8A3, 0xB975, 0xB8A4, 0xB976, 0x9055, 0xB977, 0x9056, + 0xB978, 0xB8A5, 0xB979, 0x9057, 0xB97A, 0x9058, 0xB97B, 0x9059, + 0xB97C, 0xB8A6, 0xB97D, 0x905A, 0xB97E, 0x9061, 0xB97F, 0x9062, + 0xB980, 0x9063, 0xB981, 0x9064, 0xB982, 0x9065, 0xB983, 0x9066, + 0xB984, 0xB8A7, 0xB985, 0xB8A8, 0xB986, 0x9067, 0xB987, 0xB8A9, + 0xB988, 0x9068, 0xB989, 0xB8AA, 0xB98A, 0xB8AB, 0xB98B, 0x9069, + 0xB98C, 0x906A, 0xB98D, 0xB8AC, 0xB98E, 0xB8AD, 0xB98F, 0x906B, + 0xB990, 0x906C, 0xB991, 0x906D, 0xB992, 0x906E, 0xB993, 0x906F, + 0xB994, 0x9070, 0xB995, 0x9071, 0xB996, 0x9072, 0xB997, 0x9073, + 0xB998, 0x9074, 0xB999, 0x9075, 0xB99A, 0x9076, 0xB99B, 0x9077, + 0xB99C, 0x9078, 0xB99D, 0x9079, 0xB99E, 0x907A, 0xB99F, 0x9081, + 0xB9A0, 0x9082, 0xB9A1, 0x9083, 0xB9A2, 0x9084, 0xB9A3, 0x9085, + 0xB9A4, 0x9086, 0xB9A5, 0x9087, 0xB9A6, 0x9088, 0xB9A7, 0x9089, + 0xB9A8, 0x908A, 0xB9A9, 0x908B, 0xB9AA, 0x908C, 0xB9AB, 0x908D, + 0xB9AC, 0xB8AE, 0xB9AD, 0xB8AF, 0xB9AE, 0x908E, 0xB9AF, 0x908F, + 0xB9B0, 0xB8B0, 0xB9B1, 0x9090, 0xB9B2, 0x9091, 0xB9B3, 0x9092, + 0xB9B4, 0xB8B1, 0xB9B5, 0x9093, 0xB9B6, 0x9094, 0xB9B7, 0x9095, + 0xB9B8, 0x9096, 0xB9B9, 0x9097, 0xB9BA, 0x9098, 0xB9BB, 0x9099, + 0xB9BC, 0xB8B2, 0xB9BD, 0xB8B3, 0xB9BE, 0x909A, 0xB9BF, 0xB8B4, + 0xB9C0, 0x909B, 0xB9C1, 0xB8B5, 0xB9C2, 0x909C, 0xB9C3, 0x909D, + 0xB9C4, 0x909E, 0xB9C5, 0x909F, 0xB9C6, 0x90A0, 0xB9C7, 0x90A1, + 0xB9C8, 0xB8B6, 0xB9C9, 0xB8B7, 0xB9CA, 0x90A2, 0xB9CB, 0x90A3, + 0xB9CC, 0xB8B8, 0xB9CD, 0x90A4, 0xB9CE, 0xB8B9, 0xB9CF, 0xB8BA, + 0xB9D0, 0xB8BB, 0xB9D1, 0xB8BC, 0xB9D2, 0xB8BD, 0xB9D3, 0x90A5, + 0xB9D4, 0x90A6, 0xB9D5, 0x90A7, 0xB9D6, 0x90A8, 0xB9D7, 0x90A9, + 0xB9D8, 0xB8BE, 0xB9D9, 0xB8BF, 0xB9DA, 0x90AA, 0xB9DB, 0xB8C0, + 0xB9DC, 0x90AB, 0xB9DD, 0xB8C1, 0xB9DE, 0xB8C2, 0xB9DF, 0x90AC, + 0xB9E0, 0x90AD, 0xB9E1, 0xB8C3, 0xB9E2, 0x90AE, 0xB9E3, 0xB8C4, + 0xB9E4, 0xB8C5, 0xB9E5, 0xB8C6, 0xB9E6, 0x90AF, 0xB9E7, 0x90B0, + 0xB9E8, 0xB8C7, 0xB9E9, 0x90B1, 0xB9EA, 0x90B2, 0xB9EB, 0x90B3, + 0xB9EC, 0xB8C8, 0xB9ED, 0x90B4, 0xB9EE, 0x90B5, 0xB9EF, 0x90B6, + 0xB9F0, 0x90B7, 0xB9F1, 0x90B8, 0xB9F2, 0x90B9, 0xB9F3, 0x90BA, + 0xB9F4, 0xB8C9, 0xB9F5, 0xB8CA, 0xB9F6, 0x90BB, 0xB9F7, 0xB8CB, + 0xB9F8, 0xB8CC, 0xB9F9, 0xB8CD, 0xB9FA, 0xB8CE, 0xB9FB, 0x90BC, + 0xB9FC, 0x90BD, 0xB9FD, 0x90BE, 0xB9FE, 0x90BF, 0xB9FF, 0x90C0, + 0xBA00, 0xB8CF, 0xBA01, 0xB8D0, 0xBA02, 0x90C1, 0xBA03, 0x90C2, + 0xBA04, 0x90C3, 0xBA05, 0x90C4, 0xBA06, 0x90C5, 0xBA07, 0x90C6, + 0xBA08, 0xB8D1, 0xBA09, 0x90C7, 0xBA0A, 0x90C8, 0xBA0B, 0x90C9, + 0xBA0C, 0x90CA, 0xBA0D, 0x90CB, 0xBA0E, 0x90CC, 0xBA0F, 0x90CD, + 0xBA10, 0x90CE, 0xBA11, 0x90CF, 0xBA12, 0x90D0, 0xBA13, 0x90D1, + 0xBA14, 0x90D2, 0xBA15, 0xB8D2, 0xBA16, 0x90D3, 0xBA17, 0x90D4, + 0xBA18, 0x90D5, 0xBA19, 0x90D6, 0xBA1A, 0x90D7, 0xBA1B, 0x90D8, + 0xBA1C, 0x90D9, 0xBA1D, 0x90DA, 0xBA1E, 0x90DB, 0xBA1F, 0x90DC, + 0xBA20, 0x90DD, 0xBA21, 0x90DE, 0xBA22, 0x90DF, 0xBA23, 0x90E0, + 0xBA24, 0x90E1, 0xBA25, 0x90E2, 0xBA26, 0x90E3, 0xBA27, 0x90E4, + 0xBA28, 0x90E5, 0xBA29, 0x90E6, 0xBA2A, 0x90E7, 0xBA2B, 0x90E8, + 0xBA2C, 0x90E9, 0xBA2D, 0x90EA, 0xBA2E, 0x90EB, 0xBA2F, 0x90EC, + 0xBA30, 0x90ED, 0xBA31, 0x90EE, 0xBA32, 0x90EF, 0xBA33, 0x90F0, + 0xBA34, 0x90F1, 0xBA35, 0x90F2, 0xBA36, 0x90F3, 0xBA37, 0x90F4, + 0xBA38, 0xB8D3, 0xBA39, 0xB8D4, 0xBA3A, 0x90F5, 0xBA3B, 0x90F6, + 0xBA3C, 0xB8D5, 0xBA3D, 0x90F7, 0xBA3E, 0x90F8, 0xBA3F, 0x90F9, + 0xBA40, 0xB8D6, 0xBA41, 0x90FA, 0xBA42, 0xB8D7, 0xBA43, 0x90FB, + 0xBA44, 0x90FC, 0xBA45, 0x90FD, 0xBA46, 0x90FE, 0xBA47, 0x9141, + 0xBA48, 0xB8D8, 0xBA49, 0xB8D9, 0xBA4A, 0x9142, 0xBA4B, 0xB8DA, + 0xBA4C, 0x9143, 0xBA4D, 0xB8DB, 0xBA4E, 0xB8DC, 0xBA4F, 0x9144, + 0xBA50, 0x9145, 0xBA51, 0x9146, 0xBA52, 0x9147, 0xBA53, 0xB8DD, + 0xBA54, 0xB8DE, 0xBA55, 0xB8DF, 0xBA56, 0x9148, 0xBA57, 0x9149, + 0xBA58, 0xB8E0, 0xBA59, 0x914A, 0xBA5A, 0x914B, 0xBA5B, 0x914C, + 0xBA5C, 0xB8E1, 0xBA5D, 0x914D, 0xBA5E, 0x914E, 0xBA5F, 0x914F, + 0xBA60, 0x9150, 0xBA61, 0x9151, 0xBA62, 0x9152, 0xBA63, 0x9153, + 0xBA64, 0xB8E2, 0xBA65, 0xB8E3, 0xBA66, 0x9154, 0xBA67, 0xB8E4, + 0xBA68, 0xB8E5, 0xBA69, 0xB8E6, 0xBA6A, 0x9155, 0xBA6B, 0x9156, + 0xBA6C, 0x9157, 0xBA6D, 0x9158, 0xBA6E, 0x9159, 0xBA6F, 0x915A, + 0xBA70, 0xB8E7, 0xBA71, 0xB8E8, 0xBA72, 0x9161, 0xBA73, 0x9162, + 0xBA74, 0xB8E9, 0xBA75, 0x9163, 0xBA76, 0x9164, 0xBA77, 0x9165, + 0xBA78, 0xB8EA, 0xBA79, 0x9166, 0xBA7A, 0x9167, 0xBA7B, 0x9168, + 0xBA7C, 0x9169, 0xBA7D, 0x916A, 0xBA7E, 0x916B, 0xBA7F, 0x916C, + 0xBA80, 0x916D, 0xBA81, 0x916E, 0xBA82, 0x916F, 0xBA83, 0xB8EB, + 0xBA84, 0xB8EC, 0xBA85, 0xB8ED, 0xBA86, 0x9170, 0xBA87, 0xB8EE, + 0xBA88, 0x9171, 0xBA89, 0x9172, 0xBA8A, 0x9173, 0xBA8B, 0x9174, + 0xBA8C, 0xB8EF, 0xBA8D, 0x9175, 0xBA8E, 0x9176, 0xBA8F, 0x9177, + 0xBA90, 0x9178, 0xBA91, 0x9179, 0xBA92, 0x917A, 0xBA93, 0x9181, + 0xBA94, 0x9182, 0xBA95, 0x9183, 0xBA96, 0x9184, 0xBA97, 0x9185, + 0xBA98, 0x9186, 0xBA99, 0x9187, 0xBA9A, 0x9188, 0xBA9B, 0x9189, + 0xBA9C, 0x918A, 0xBA9D, 0x918B, 0xBA9E, 0x918C, 0xBA9F, 0x918D, + 0xBAA0, 0x918E, 0xBAA1, 0x918F, 0xBAA2, 0x9190, 0xBAA3, 0x9191, + 0xBAA4, 0x9192, 0xBAA5, 0x9193, 0xBAA6, 0x9194, 0xBAA7, 0x9195, + 0xBAA8, 0xB8F0, 0xBAA9, 0xB8F1, 0xBAAA, 0x9196, 0xBAAB, 0xB8F2, + 0xBAAC, 0xB8F3, 0xBAAD, 0x9197, 0xBAAE, 0x9198, 0xBAAF, 0x9199, + 0xBAB0, 0xB8F4, 0xBAB1, 0x919A, 0xBAB2, 0xB8F5, 0xBAB3, 0x919B, + 0xBAB4, 0x919C, 0xBAB5, 0x919D, 0xBAB6, 0x919E, 0xBAB7, 0x919F, + 0xBAB8, 0xB8F6, 0xBAB9, 0xB8F7, 0xBABA, 0x91A0, 0xBABB, 0xB8F8, + 0xBABC, 0x91A1, 0xBABD, 0xB8F9, 0xBABE, 0x91A2, 0xBABF, 0x91A3, + 0xBAC0, 0x91A4, 0xBAC1, 0x91A5, 0xBAC2, 0x91A6, 0xBAC3, 0x91A7, + 0xBAC4, 0xB8FA, 0xBAC5, 0x91A8, 0xBAC6, 0x91A9, 0xBAC7, 0x91AA, + 0xBAC8, 0xB8FB, 0xBAC9, 0x91AB, 0xBACA, 0x91AC, 0xBACB, 0x91AD, + 0xBACC, 0x91AE, 0xBACD, 0x91AF, 0xBACE, 0x91B0, 0xBACF, 0x91B1, + 0xBAD0, 0x91B2, 0xBAD1, 0x91B3, 0xBAD2, 0x91B4, 0xBAD3, 0x91B5, + 0xBAD4, 0x91B6, 0xBAD5, 0x91B7, 0xBAD6, 0x91B8, 0xBAD7, 0x91B9, + 0xBAD8, 0xB8FC, 0xBAD9, 0xB8FD, 0xBADA, 0x91BA, 0xBADB, 0x91BB, + 0xBADC, 0x91BC, 0xBADD, 0x91BD, 0xBADE, 0x91BE, 0xBADF, 0x91BF, + 0xBAE0, 0x91C0, 0xBAE1, 0x91C1, 0xBAE2, 0x91C2, 0xBAE3, 0x91C3, + 0xBAE4, 0x91C4, 0xBAE5, 0x91C5, 0xBAE6, 0x91C6, 0xBAE7, 0x91C7, + 0xBAE8, 0x91C8, 0xBAE9, 0x91C9, 0xBAEA, 0x91CA, 0xBAEB, 0x91CB, + 0xBAEC, 0x91CC, 0xBAED, 0x91CD, 0xBAEE, 0x91CE, 0xBAEF, 0x91CF, + 0xBAF0, 0x91D0, 0xBAF1, 0x91D1, 0xBAF2, 0x91D2, 0xBAF3, 0x91D3, + 0xBAF4, 0x91D4, 0xBAF5, 0x91D5, 0xBAF6, 0x91D6, 0xBAF7, 0x91D7, + 0xBAF8, 0x91D8, 0xBAF9, 0x91D9, 0xBAFA, 0x91DA, 0xBAFB, 0x91DB, + 0xBAFC, 0xB8FE, 0xBAFD, 0x91DC, 0xBAFE, 0x91DD, 0xBAFF, 0x91DE, + 0xBB00, 0xB9A1, 0xBB01, 0x91DF, 0xBB02, 0x91E0, 0xBB03, 0x91E1, + 0xBB04, 0xB9A2, 0xBB05, 0x91E2, 0xBB06, 0x91E3, 0xBB07, 0x91E4, + 0xBB08, 0x91E5, 0xBB09, 0x91E6, 0xBB0A, 0x91E7, 0xBB0B, 0x91E8, + 0xBB0C, 0x91E9, 0xBB0D, 0xB9A3, 0xBB0E, 0x91EA, 0xBB0F, 0xB9A4, + 0xBB10, 0x91EB, 0xBB11, 0xB9A5, 0xBB12, 0x91EC, 0xBB13, 0x91ED, + 0xBB14, 0x91EE, 0xBB15, 0x91EF, 0xBB16, 0x91F0, 0xBB17, 0x91F1, + 0xBB18, 0xB9A6, 0xBB19, 0x91F2, 0xBB1A, 0x91F3, 0xBB1B, 0x91F4, + 0xBB1C, 0xB9A7, 0xBB1D, 0x91F5, 0xBB1E, 0x91F6, 0xBB1F, 0x91F7, + 0xBB20, 0xB9A8, 0xBB21, 0x91F8, 0xBB22, 0x91F9, 0xBB23, 0x91FA, + 0xBB24, 0x91FB, 0xBB25, 0x91FC, 0xBB26, 0x91FD, 0xBB27, 0x91FE, + 0xBB28, 0x9241, 0xBB29, 0xB9A9, 0xBB2A, 0x9242, 0xBB2B, 0xB9AA, + 0xBB2C, 0x9243, 0xBB2D, 0x9244, 0xBB2E, 0x9245, 0xBB2F, 0x9246, + 0xBB30, 0x9247, 0xBB31, 0x9248, 0xBB32, 0x9249, 0xBB33, 0x924A, + 0xBB34, 0xB9AB, 0xBB35, 0xB9AC, 0xBB36, 0xB9AD, 0xBB37, 0x924B, + 0xBB38, 0xB9AE, 0xBB39, 0x924C, 0xBB3A, 0x924D, 0xBB3B, 0xB9AF, + 0xBB3C, 0xB9B0, 0xBB3D, 0xB9B1, 0xBB3E, 0xB9B2, 0xBB3F, 0x924E, + 0xBB40, 0x924F, 0xBB41, 0x9250, 0xBB42, 0x9251, 0xBB43, 0x9252, + 0xBB44, 0xB9B3, 0xBB45, 0xB9B4, 0xBB46, 0x9253, 0xBB47, 0xB9B5, + 0xBB48, 0x9254, 0xBB49, 0xB9B6, 0xBB4A, 0x9255, 0xBB4B, 0x9256, + 0xBB4C, 0x9257, 0xBB4D, 0xB9B7, 0xBB4E, 0x9258, 0xBB4F, 0xB9B8, + 0xBB50, 0xB9B9, 0xBB51, 0x9259, 0xBB52, 0x925A, 0xBB53, 0x9261, + 0xBB54, 0xB9BA, 0xBB55, 0x9262, 0xBB56, 0x9263, 0xBB57, 0x9264, + 0xBB58, 0xB9BB, 0xBB59, 0x9265, 0xBB5A, 0x9266, 0xBB5B, 0x9267, + 0xBB5C, 0x9268, 0xBB5D, 0x9269, 0xBB5E, 0x926A, 0xBB5F, 0x926B, + 0xBB60, 0x926C, 0xBB61, 0xB9BC, 0xBB62, 0x926D, 0xBB63, 0xB9BD, + 0xBB64, 0x926E, 0xBB65, 0x926F, 0xBB66, 0x9270, 0xBB67, 0x9271, + 0xBB68, 0x9272, 0xBB69, 0x9273, 0xBB6A, 0x9274, 0xBB6B, 0x9275, + 0xBB6C, 0xB9BE, 0xBB6D, 0x9276, 0xBB6E, 0x9277, 0xBB6F, 0x9278, + 0xBB70, 0x9279, 0xBB71, 0x927A, 0xBB72, 0x9281, 0xBB73, 0x9282, + 0xBB74, 0x9283, 0xBB75, 0x9284, 0xBB76, 0x9285, 0xBB77, 0x9286, + 0xBB78, 0x9287, 0xBB79, 0x9288, 0xBB7A, 0x9289, 0xBB7B, 0x928A, + 0xBB7C, 0x928B, 0xBB7D, 0x928C, 0xBB7E, 0x928D, 0xBB7F, 0x928E, + 0xBB80, 0x928F, 0xBB81, 0x9290, 0xBB82, 0x9291, 0xBB83, 0x9292, + 0xBB84, 0x9293, 0xBB85, 0x9294, 0xBB86, 0x9295, 0xBB87, 0x9296, + 0xBB88, 0xB9BF, 0xBB89, 0x9297, 0xBB8A, 0x9298, 0xBB8B, 0x9299, + 0xBB8C, 0xB9C0, 0xBB8D, 0x929A, 0xBB8E, 0x929B, 0xBB8F, 0x929C, + 0xBB90, 0xB9C1, 0xBB91, 0x929D, 0xBB92, 0x929E, 0xBB93, 0x929F, + 0xBB94, 0x92A0, 0xBB95, 0x92A1, 0xBB96, 0x92A2, 0xBB97, 0x92A3, + 0xBB98, 0x92A4, 0xBB99, 0x92A5, 0xBB9A, 0x92A6, 0xBB9B, 0x92A7, + 0xBB9C, 0x92A8, 0xBB9D, 0x92A9, 0xBB9E, 0x92AA, 0xBB9F, 0x92AB, + 0xBBA0, 0x92AC, 0xBBA1, 0x92AD, 0xBBA2, 0x92AE, 0xBBA3, 0x92AF, + 0xBBA4, 0xB9C2, 0xBBA5, 0x92B0, 0xBBA6, 0x92B1, 0xBBA7, 0x92B2, + 0xBBA8, 0xB9C3, 0xBBA9, 0x92B3, 0xBBAA, 0x92B4, 0xBBAB, 0x92B5, + 0xBBAC, 0xB9C4, 0xBBAD, 0x92B6, 0xBBAE, 0x92B7, 0xBBAF, 0x92B8, + 0xBBB0, 0x92B9, 0xBBB1, 0x92BA, 0xBBB2, 0x92BB, 0xBBB3, 0x92BC, + 0xBBB4, 0xB9C5, 0xBBB5, 0x92BD, 0xBBB6, 0x92BE, 0xBBB7, 0xB9C6, + 0xBBB8, 0x92BF, 0xBBB9, 0x92C0, 0xBBBA, 0x92C1, 0xBBBB, 0x92C2, + 0xBBBC, 0x92C3, 0xBBBD, 0x92C4, 0xBBBE, 0x92C5, 0xBBBF, 0x92C6, + 0xBBC0, 0xB9C7, 0xBBC1, 0x92C7, 0xBBC2, 0x92C8, 0xBBC3, 0x92C9, + 0xBBC4, 0xB9C8, 0xBBC5, 0x92CA, 0xBBC6, 0x92CB, 0xBBC7, 0x92CC, + 0xBBC8, 0xB9C9, 0xBBC9, 0x92CD, 0xBBCA, 0x92CE, 0xBBCB, 0x92CF, + 0xBBCC, 0x92D0, 0xBBCD, 0x92D1, 0xBBCE, 0x92D2, 0xBBCF, 0x92D3, + 0xBBD0, 0xB9CA, 0xBBD1, 0x92D4, 0xBBD2, 0x92D5, 0xBBD3, 0xB9CB, + 0xBBD4, 0x92D6, 0xBBD5, 0x92D7, 0xBBD6, 0x92D8, 0xBBD7, 0x92D9, + 0xBBD8, 0x92DA, 0xBBD9, 0x92DB, 0xBBDA, 0x92DC, 0xBBDB, 0x92DD, + 0xBBDC, 0x92DE, 0xBBDD, 0x92DF, 0xBBDE, 0x92E0, 0xBBDF, 0x92E1, + 0xBBE0, 0x92E2, 0xBBE1, 0x92E3, 0xBBE2, 0x92E4, 0xBBE3, 0x92E5, + 0xBBE4, 0x92E6, 0xBBE5, 0x92E7, 0xBBE6, 0x92E8, 0xBBE7, 0x92E9, + 0xBBE8, 0x92EA, 0xBBE9, 0x92EB, 0xBBEA, 0x92EC, 0xBBEB, 0x92ED, + 0xBBEC, 0x92EE, 0xBBED, 0x92EF, 0xBBEE, 0x92F0, 0xBBEF, 0x92F1, + 0xBBF0, 0x92F2, 0xBBF1, 0x92F3, 0xBBF2, 0x92F4, 0xBBF3, 0x92F5, + 0xBBF4, 0x92F6, 0xBBF5, 0x92F7, 0xBBF6, 0x92F8, 0xBBF7, 0x92F9, + 0xBBF8, 0xB9CC, 0xBBF9, 0xB9CD, 0xBBFA, 0x92FA, 0xBBFB, 0x92FB, + 0xBBFC, 0xB9CE, 0xBBFD, 0x92FC, 0xBBFE, 0x92FD, 0xBBFF, 0xB9CF, + 0xBC00, 0xB9D0, 0xBC01, 0x92FE, 0xBC02, 0xB9D1, 0xBC03, 0x9341, + 0xBC04, 0x9342, 0xBC05, 0x9343, 0xBC06, 0x9344, 0xBC07, 0x9345, + 0xBC08, 0xB9D2, 0xBC09, 0xB9D3, 0xBC0A, 0x9346, 0xBC0B, 0xB9D4, + 0xBC0C, 0xB9D5, 0xBC0D, 0xB9D6, 0xBC0E, 0x9347, 0xBC0F, 0xB9D7, + 0xBC10, 0x9348, 0xBC11, 0xB9D8, 0xBC12, 0x9349, 0xBC13, 0x934A, + 0xBC14, 0xB9D9, 0xBC15, 0xB9DA, 0xBC16, 0xB9DB, 0xBC17, 0xB9DC, + 0xBC18, 0xB9DD, 0xBC19, 0x934B, 0xBC1A, 0x934C, 0xBC1B, 0xB9DE, + 0xBC1C, 0xB9DF, 0xBC1D, 0xB9E0, 0xBC1E, 0xB9E1, 0xBC1F, 0xB9E2, + 0xBC20, 0x934D, 0xBC21, 0x934E, 0xBC22, 0x934F, 0xBC23, 0x9350, + 0xBC24, 0xB9E3, 0xBC25, 0xB9E4, 0xBC26, 0x9351, 0xBC27, 0xB9E5, + 0xBC28, 0x9352, 0xBC29, 0xB9E6, 0xBC2A, 0x9353, 0xBC2B, 0x9354, + 0xBC2C, 0x9355, 0xBC2D, 0xB9E7, 0xBC2E, 0x9356, 0xBC2F, 0x9357, + 0xBC30, 0xB9E8, 0xBC31, 0xB9E9, 0xBC32, 0x9358, 0xBC33, 0x9359, + 0xBC34, 0xB9EA, 0xBC35, 0x935A, 0xBC36, 0x9361, 0xBC37, 0x9362, + 0xBC38, 0xB9EB, 0xBC39, 0x9363, 0xBC3A, 0x9364, 0xBC3B, 0x9365, + 0xBC3C, 0x9366, 0xBC3D, 0x9367, 0xBC3E, 0x9368, 0xBC3F, 0x9369, + 0xBC40, 0xB9EC, 0xBC41, 0xB9ED, 0xBC42, 0x936A, 0xBC43, 0xB9EE, + 0xBC44, 0xB9EF, 0xBC45, 0xB9F0, 0xBC46, 0x936B, 0xBC47, 0x936C, + 0xBC48, 0x936D, 0xBC49, 0xB9F1, 0xBC4A, 0x936E, 0xBC4B, 0x936F, + 0xBC4C, 0xB9F2, 0xBC4D, 0xB9F3, 0xBC4E, 0x9370, 0xBC4F, 0x9371, + 0xBC50, 0xB9F4, 0xBC51, 0x9372, 0xBC52, 0x9373, 0xBC53, 0x9374, + 0xBC54, 0x9375, 0xBC55, 0x9376, 0xBC56, 0x9377, 0xBC57, 0x9378, + 0xBC58, 0x9379, 0xBC59, 0x937A, 0xBC5A, 0x9381, 0xBC5B, 0x9382, + 0xBC5C, 0x9383, 0xBC5D, 0xB9F5, 0xBC5E, 0x9384, 0xBC5F, 0x9385, + 0xBC60, 0x9386, 0xBC61, 0x9387, 0xBC62, 0x9388, 0xBC63, 0x9389, + 0xBC64, 0x938A, 0xBC65, 0x938B, 0xBC66, 0x938C, 0xBC67, 0x938D, + 0xBC68, 0x938E, 0xBC69, 0x938F, 0xBC6A, 0x9390, 0xBC6B, 0x9391, + 0xBC6C, 0x9392, 0xBC6D, 0x9393, 0xBC6E, 0x9394, 0xBC6F, 0x9395, + 0xBC70, 0x9396, 0xBC71, 0x9397, 0xBC72, 0x9398, 0xBC73, 0x9399, + 0xBC74, 0x939A, 0xBC75, 0x939B, 0xBC76, 0x939C, 0xBC77, 0x939D, + 0xBC78, 0x939E, 0xBC79, 0x939F, 0xBC7A, 0x93A0, 0xBC7B, 0x93A1, + 0xBC7C, 0x93A2, 0xBC7D, 0x93A3, 0xBC7E, 0x93A4, 0xBC7F, 0x93A5, + 0xBC80, 0x93A6, 0xBC81, 0x93A7, 0xBC82, 0x93A8, 0xBC83, 0x93A9, + 0xBC84, 0xB9F6, 0xBC85, 0xB9F7, 0xBC86, 0x93AA, 0xBC87, 0x93AB, + 0xBC88, 0xB9F8, 0xBC89, 0x93AC, 0xBC8A, 0x93AD, 0xBC8B, 0xB9F9, + 0xBC8C, 0xB9FA, 0xBC8D, 0x93AE, 0xBC8E, 0xB9FB, 0xBC8F, 0x93AF, + 0xBC90, 0x93B0, 0xBC91, 0x93B1, 0xBC92, 0x93B2, 0xBC93, 0x93B3, + 0xBC94, 0xB9FC, 0xBC95, 0xB9FD, 0xBC96, 0x93B4, 0xBC97, 0xB9FE, + 0xBC98, 0x93B5, 0xBC99, 0xBAA1, 0xBC9A, 0xBAA2, 0xBC9B, 0x93B6, + 0xBC9C, 0x93B7, 0xBC9D, 0x93B8, 0xBC9E, 0x93B9, 0xBC9F, 0x93BA, + 0xBCA0, 0xBAA3, 0xBCA1, 0xBAA4, 0xBCA2, 0x93BB, 0xBCA3, 0x93BC, + 0xBCA4, 0xBAA5, 0xBCA5, 0x93BD, 0xBCA6, 0x93BE, 0xBCA7, 0xBAA6, + 0xBCA8, 0xBAA7, 0xBCA9, 0x93BF, 0xBCAA, 0x93C0, 0xBCAB, 0x93C1, + 0xBCAC, 0x93C2, 0xBCAD, 0x93C3, 0xBCAE, 0x93C4, 0xBCAF, 0x93C5, + 0xBCB0, 0xBAA8, 0xBCB1, 0xBAA9, 0xBCB2, 0x93C6, 0xBCB3, 0xBAAA, + 0xBCB4, 0xBAAB, 0xBCB5, 0xBAAC, 0xBCB6, 0x93C7, 0xBCB7, 0x93C8, + 0xBCB8, 0x93C9, 0xBCB9, 0x93CA, 0xBCBA, 0x93CB, 0xBCBB, 0x93CC, + 0xBCBC, 0xBAAD, 0xBCBD, 0xBAAE, 0xBCBE, 0x93CD, 0xBCBF, 0x93CE, + 0xBCC0, 0xBAAF, 0xBCC1, 0x93CF, 0xBCC2, 0x93D0, 0xBCC3, 0x93D1, + 0xBCC4, 0xBAB0, 0xBCC5, 0x93D2, 0xBCC6, 0x93D3, 0xBCC7, 0x93D4, + 0xBCC8, 0x93D5, 0xBCC9, 0x93D6, 0xBCCA, 0x93D7, 0xBCCB, 0x93D8, + 0xBCCC, 0x93D9, 0xBCCD, 0xBAB1, 0xBCCE, 0x93DA, 0xBCCF, 0xBAB2, + 0xBCD0, 0xBAB3, 0xBCD1, 0xBAB4, 0xBCD2, 0x93DB, 0xBCD3, 0x93DC, + 0xBCD4, 0x93DD, 0xBCD5, 0xBAB5, 0xBCD6, 0x93DE, 0xBCD7, 0x93DF, + 0xBCD8, 0xBAB6, 0xBCD9, 0x93E0, 0xBCDA, 0x93E1, 0xBCDB, 0x93E2, + 0xBCDC, 0xBAB7, 0xBCDD, 0x93E3, 0xBCDE, 0x93E4, 0xBCDF, 0x93E5, + 0xBCE0, 0x93E6, 0xBCE1, 0x93E7, 0xBCE2, 0x93E8, 0xBCE3, 0x93E9, + 0xBCE4, 0x93EA, 0xBCE5, 0x93EB, 0xBCE6, 0x93EC, 0xBCE7, 0x93ED, + 0xBCE8, 0x93EE, 0xBCE9, 0x93EF, 0xBCEA, 0x93F0, 0xBCEB, 0x93F1, + 0xBCEC, 0x93F2, 0xBCED, 0x93F3, 0xBCEE, 0x93F4, 0xBCEF, 0x93F5, + 0xBCF0, 0x93F6, 0xBCF1, 0x93F7, 0xBCF2, 0x93F8, 0xBCF3, 0x93F9, + 0xBCF4, 0xBAB8, 0xBCF5, 0xBAB9, 0xBCF6, 0xBABA, 0xBCF7, 0x93FA, + 0xBCF8, 0xBABB, 0xBCF9, 0x93FB, 0xBCFA, 0x93FC, 0xBCFB, 0x93FD, + 0xBCFC, 0xBABC, 0xBCFD, 0x93FE, 0xBCFE, 0x9441, 0xBCFF, 0x9442, + 0xBD00, 0x9443, 0xBD01, 0x9444, 0xBD02, 0x9445, 0xBD03, 0x9446, + 0xBD04, 0xBABD, 0xBD05, 0xBABE, 0xBD06, 0x9447, 0xBD07, 0xBABF, + 0xBD08, 0x9448, 0xBD09, 0xBAC0, 0xBD0A, 0x9449, 0xBD0B, 0x944A, + 0xBD0C, 0x944B, 0xBD0D, 0x944C, 0xBD0E, 0x944D, 0xBD0F, 0x944E, + 0xBD10, 0xBAC1, 0xBD11, 0x944F, 0xBD12, 0x9450, 0xBD13, 0x9451, + 0xBD14, 0xBAC2, 0xBD15, 0x9452, 0xBD16, 0x9453, 0xBD17, 0x9454, + 0xBD18, 0x9455, 0xBD19, 0x9456, 0xBD1A, 0x9457, 0xBD1B, 0x9458, + 0xBD1C, 0x9459, 0xBD1D, 0x945A, 0xBD1E, 0x9461, 0xBD1F, 0x9462, + 0xBD20, 0x9463, 0xBD21, 0x9464, 0xBD22, 0x9465, 0xBD23, 0x9466, + 0xBD24, 0xBAC3, 0xBD25, 0x9467, 0xBD26, 0x9468, 0xBD27, 0x9469, + 0xBD28, 0x946A, 0xBD29, 0x946B, 0xBD2A, 0x946C, 0xBD2B, 0x946D, + 0xBD2C, 0xBAC4, 0xBD2D, 0x946E, 0xBD2E, 0x946F, 0xBD2F, 0x9470, + 0xBD30, 0x9471, 0xBD31, 0x9472, 0xBD32, 0x9473, 0xBD33, 0x9474, + 0xBD34, 0x9475, 0xBD35, 0x9476, 0xBD36, 0x9477, 0xBD37, 0x9478, + 0xBD38, 0x9479, 0xBD39, 0x947A, 0xBD3A, 0x9481, 0xBD3B, 0x9482, + 0xBD3C, 0x9483, 0xBD3D, 0x9484, 0xBD3E, 0x9485, 0xBD3F, 0x9486, + 0xBD40, 0xBAC5, 0xBD41, 0x9487, 0xBD42, 0x9488, 0xBD43, 0x9489, + 0xBD44, 0x948A, 0xBD45, 0x948B, 0xBD46, 0x948C, 0xBD47, 0x948D, + 0xBD48, 0xBAC6, 0xBD49, 0xBAC7, 0xBD4A, 0x948E, 0xBD4B, 0x948F, + 0xBD4C, 0xBAC8, 0xBD4D, 0x9490, 0xBD4E, 0x9491, 0xBD4F, 0x9492, + 0xBD50, 0xBAC9, 0xBD51, 0x9493, 0xBD52, 0x9494, 0xBD53, 0x9495, + 0xBD54, 0x9496, 0xBD55, 0x9497, 0xBD56, 0x9498, 0xBD57, 0x9499, + 0xBD58, 0xBACA, 0xBD59, 0xBACB, 0xBD5A, 0x949A, 0xBD5B, 0x949B, + 0xBD5C, 0x949C, 0xBD5D, 0x949D, 0xBD5E, 0x949E, 0xBD5F, 0x949F, + 0xBD60, 0x94A0, 0xBD61, 0x94A1, 0xBD62, 0x94A2, 0xBD63, 0x94A3, + 0xBD64, 0xBACC, 0xBD65, 0x94A4, 0xBD66, 0x94A5, 0xBD67, 0x94A6, + 0xBD68, 0xBACD, 0xBD69, 0x94A7, 0xBD6A, 0x94A8, 0xBD6B, 0x94A9, + 0xBD6C, 0x94AA, 0xBD6D, 0x94AB, 0xBD6E, 0x94AC, 0xBD6F, 0x94AD, + 0xBD70, 0x94AE, 0xBD71, 0x94AF, 0xBD72, 0x94B0, 0xBD73, 0x94B1, + 0xBD74, 0x94B2, 0xBD75, 0x94B3, 0xBD76, 0x94B4, 0xBD77, 0x94B5, + 0xBD78, 0x94B6, 0xBD79, 0x94B7, 0xBD7A, 0x94B8, 0xBD7B, 0x94B9, + 0xBD7C, 0x94BA, 0xBD7D, 0x94BB, 0xBD7E, 0x94BC, 0xBD7F, 0x94BD, + 0xBD80, 0xBACE, 0xBD81, 0xBACF, 0xBD82, 0x94BE, 0xBD83, 0x94BF, + 0xBD84, 0xBAD0, 0xBD85, 0x94C0, 0xBD86, 0x94C1, 0xBD87, 0xBAD1, + 0xBD88, 0xBAD2, 0xBD89, 0xBAD3, 0xBD8A, 0xBAD4, 0xBD8B, 0x94C2, + 0xBD8C, 0x94C3, 0xBD8D, 0x94C4, 0xBD8E, 0x94C5, 0xBD8F, 0x94C6, + 0xBD90, 0xBAD5, 0xBD91, 0xBAD6, 0xBD92, 0x94C7, 0xBD93, 0xBAD7, + 0xBD94, 0x94C8, 0xBD95, 0xBAD8, 0xBD96, 0x94C9, 0xBD97, 0x94CA, + 0xBD98, 0x94CB, 0xBD99, 0xBAD9, 0xBD9A, 0xBADA, 0xBD9B, 0x94CC, + 0xBD9C, 0xBADB, 0xBD9D, 0x94CD, 0xBD9E, 0x94CE, 0xBD9F, 0x94CF, + 0xBDA0, 0x94D0, 0xBDA1, 0x94D1, 0xBDA2, 0x94D2, 0xBDA3, 0x94D3, + 0xBDA4, 0xBADC, 0xBDA5, 0x94D4, 0xBDA6, 0x94D5, 0xBDA7, 0x94D6, + 0xBDA8, 0x94D7, 0xBDA9, 0x94D8, 0xBDAA, 0x94D9, 0xBDAB, 0x94DA, + 0xBDAC, 0x94DB, 0xBDAD, 0x94DC, 0xBDAE, 0x94DD, 0xBDAF, 0x94DE, + 0xBDB0, 0xBADD, 0xBDB1, 0x94DF, 0xBDB2, 0x94E0, 0xBDB3, 0x94E1, + 0xBDB4, 0x94E2, 0xBDB5, 0x94E3, 0xBDB6, 0x94E4, 0xBDB7, 0x94E5, + 0xBDB8, 0xBADE, 0xBDB9, 0x94E6, 0xBDBA, 0x94E7, 0xBDBB, 0x94E8, + 0xBDBC, 0x94E9, 0xBDBD, 0x94EA, 0xBDBE, 0x94EB, 0xBDBF, 0x94EC, + 0xBDC0, 0x94ED, 0xBDC1, 0x94EE, 0xBDC2, 0x94EF, 0xBDC3, 0x94F0, + 0xBDC4, 0x94F1, 0xBDC5, 0x94F2, 0xBDC6, 0x94F3, 0xBDC7, 0x94F4, + 0xBDC8, 0x94F5, 0xBDC9, 0x94F6, 0xBDCA, 0x94F7, 0xBDCB, 0x94F8, + 0xBDCC, 0x94F9, 0xBDCD, 0x94FA, 0xBDCE, 0x94FB, 0xBDCF, 0x94FC, + 0xBDD0, 0x94FD, 0xBDD1, 0x94FE, 0xBDD2, 0x9541, 0xBDD3, 0x9542, + 0xBDD4, 0xBADF, 0xBDD5, 0xBAE0, 0xBDD6, 0x9543, 0xBDD7, 0x9544, + 0xBDD8, 0xBAE1, 0xBDD9, 0x9545, 0xBDDA, 0x9546, 0xBDDB, 0x9547, + 0xBDDC, 0xBAE2, 0xBDDD, 0x9548, 0xBDDE, 0x9549, 0xBDDF, 0x954A, + 0xBDE0, 0x954B, 0xBDE1, 0x954C, 0xBDE2, 0x954D, 0xBDE3, 0x954E, + 0xBDE4, 0x954F, 0xBDE5, 0x9550, 0xBDE6, 0x9551, 0xBDE7, 0x9552, + 0xBDE8, 0x9553, 0xBDE9, 0xBAE3, 0xBDEA, 0x9554, 0xBDEB, 0x9555, + 0xBDEC, 0x9556, 0xBDED, 0x9557, 0xBDEE, 0x9558, 0xBDEF, 0x9559, + 0xBDF0, 0xBAE4, 0xBDF1, 0x955A, 0xBDF2, 0x9561, 0xBDF3, 0x9562, + 0xBDF4, 0xBAE5, 0xBDF5, 0x9563, 0xBDF6, 0x9564, 0xBDF7, 0x9565, + 0xBDF8, 0xBAE6, 0xBDF9, 0x9566, 0xBDFA, 0x9567, 0xBDFB, 0x9568, + 0xBDFC, 0x9569, 0xBDFD, 0x956A, 0xBDFE, 0x956B, 0xBDFF, 0x956C, + 0xBE00, 0xBAE7, 0xBE01, 0x956D, 0xBE02, 0x956E, 0xBE03, 0xBAE8, + 0xBE04, 0x956F, 0xBE05, 0xBAE9, 0xBE06, 0x9570, 0xBE07, 0x9571, + 0xBE08, 0x9572, 0xBE09, 0x9573, 0xBE0A, 0x9574, 0xBE0B, 0x9575, + 0xBE0C, 0xBAEA, 0xBE0D, 0xBAEB, 0xBE0E, 0x9576, 0xBE0F, 0x9577, + 0xBE10, 0xBAEC, 0xBE11, 0x9578, 0xBE12, 0x9579, 0xBE13, 0x957A, + 0xBE14, 0xBAED, 0xBE15, 0x9581, 0xBE16, 0x9582, 0xBE17, 0x9583, + 0xBE18, 0x9584, 0xBE19, 0x9585, 0xBE1A, 0x9586, 0xBE1B, 0x9587, + 0xBE1C, 0xBAEE, 0xBE1D, 0xBAEF, 0xBE1E, 0x9588, 0xBE1F, 0xBAF0, + 0xBE20, 0x9589, 0xBE21, 0x958A, 0xBE22, 0x958B, 0xBE23, 0x958C, + 0xBE24, 0x958D, 0xBE25, 0x958E, 0xBE26, 0x958F, 0xBE27, 0x9590, + 0xBE28, 0x9591, 0xBE29, 0x9592, 0xBE2A, 0x9593, 0xBE2B, 0x9594, + 0xBE2C, 0x9595, 0xBE2D, 0x9596, 0xBE2E, 0x9597, 0xBE2F, 0x9598, + 0xBE30, 0x9599, 0xBE31, 0x959A, 0xBE32, 0x959B, 0xBE33, 0x959C, + 0xBE34, 0x959D, 0xBE35, 0x959E, 0xBE36, 0x959F, 0xBE37, 0x95A0, + 0xBE38, 0x95A1, 0xBE39, 0x95A2, 0xBE3A, 0x95A3, 0xBE3B, 0x95A4, + 0xBE3C, 0x95A5, 0xBE3D, 0x95A6, 0xBE3E, 0x95A7, 0xBE3F, 0x95A8, + 0xBE40, 0x95A9, 0xBE41, 0x95AA, 0xBE42, 0x95AB, 0xBE43, 0x95AC, + 0xBE44, 0xBAF1, 0xBE45, 0xBAF2, 0xBE46, 0x95AD, 0xBE47, 0x95AE, + 0xBE48, 0xBAF3, 0xBE49, 0x95AF, 0xBE4A, 0x95B0, 0xBE4B, 0x95B1, + 0xBE4C, 0xBAF4, 0xBE4D, 0x95B2, 0xBE4E, 0xBAF5, 0xBE4F, 0x95B3, + 0xBE50, 0x95B4, 0xBE51, 0x95B5, 0xBE52, 0x95B6, 0xBE53, 0x95B7, + 0xBE54, 0xBAF6, 0xBE55, 0xBAF7, 0xBE56, 0x95B8, 0xBE57, 0xBAF8, + 0xBE58, 0x95B9, 0xBE59, 0xBAF9, 0xBE5A, 0xBAFA, 0xBE5B, 0xBAFB, + 0xBE5C, 0x95BA, 0xBE5D, 0x95BB, 0xBE5E, 0x95BC, 0xBE5F, 0x95BD, + 0xBE60, 0xBAFC, 0xBE61, 0xBAFD, 0xBE62, 0x95BE, 0xBE63, 0x95BF, + 0xBE64, 0xBAFE, 0xBE65, 0x95C0, 0xBE66, 0x95C1, 0xBE67, 0x95C2, + 0xBE68, 0xBBA1, 0xBE69, 0x95C3, 0xBE6A, 0xBBA2, 0xBE6B, 0x95C4, + 0xBE6C, 0x95C5, 0xBE6D, 0x95C6, 0xBE6E, 0x95C7, 0xBE6F, 0x95C8, + 0xBE70, 0xBBA3, 0xBE71, 0xBBA4, 0xBE72, 0x95C9, 0xBE73, 0xBBA5, + 0xBE74, 0xBBA6, 0xBE75, 0xBBA7, 0xBE76, 0x95CA, 0xBE77, 0x95CB, + 0xBE78, 0x95CC, 0xBE79, 0x95CD, 0xBE7A, 0x95CE, 0xBE7B, 0xBBA8, + 0xBE7C, 0xBBA9, 0xBE7D, 0xBBAA, 0xBE7E, 0x95CF, 0xBE7F, 0x95D0, + 0xBE80, 0xBBAB, 0xBE81, 0x95D1, 0xBE82, 0x95D2, 0xBE83, 0x95D3, + 0xBE84, 0xBBAC, 0xBE85, 0x95D4, 0xBE86, 0x95D5, 0xBE87, 0x95D6, + 0xBE88, 0x95D7, 0xBE89, 0x95D8, 0xBE8A, 0x95D9, 0xBE8B, 0x95DA, + 0xBE8C, 0xBBAD, 0xBE8D, 0xBBAE, 0xBE8E, 0x95DB, 0xBE8F, 0xBBAF, + 0xBE90, 0xBBB0, 0xBE91, 0xBBB1, 0xBE92, 0x95DC, 0xBE93, 0x95DD, + 0xBE94, 0x95DE, 0xBE95, 0x95DF, 0xBE96, 0x95E0, 0xBE97, 0x95E1, + 0xBE98, 0xBBB2, 0xBE99, 0xBBB3, 0xBE9A, 0x95E2, 0xBE9B, 0x95E3, + 0xBE9C, 0x95E4, 0xBE9D, 0x95E5, 0xBE9E, 0x95E6, 0xBE9F, 0x95E7, + 0xBEA0, 0x95E8, 0xBEA1, 0x95E9, 0xBEA2, 0x95EA, 0xBEA3, 0x95EB, + 0xBEA4, 0x95EC, 0xBEA5, 0x95ED, 0xBEA6, 0x95EE, 0xBEA7, 0x95EF, + 0xBEA8, 0xBBB4, 0xBEA9, 0x95F0, 0xBEAA, 0x95F1, 0xBEAB, 0x95F2, + 0xBEAC, 0x95F3, 0xBEAD, 0x95F4, 0xBEAE, 0x95F5, 0xBEAF, 0x95F6, + 0xBEB0, 0x95F7, 0xBEB1, 0x95F8, 0xBEB2, 0x95F9, 0xBEB3, 0x95FA, + 0xBEB4, 0x95FB, 0xBEB5, 0x95FC, 0xBEB6, 0x95FD, 0xBEB7, 0x95FE, + 0xBEB8, 0x9641, 0xBEB9, 0x9642, 0xBEBA, 0x9643, 0xBEBB, 0x9644, + 0xBEBC, 0x9645, 0xBEBD, 0x9646, 0xBEBE, 0x9647, 0xBEBF, 0x9648, + 0xBEC0, 0x9649, 0xBEC1, 0x964A, 0xBEC2, 0x964B, 0xBEC3, 0x964C, + 0xBEC4, 0x964D, 0xBEC5, 0x964E, 0xBEC6, 0x964F, 0xBEC7, 0x9650, + 0xBEC8, 0x9651, 0xBEC9, 0x9652, 0xBECA, 0x9653, 0xBECB, 0x9654, + 0xBECC, 0x9655, 0xBECD, 0x9656, 0xBECE, 0x9657, 0xBECF, 0x9658, + 0xBED0, 0xBBB5, 0xBED1, 0xBBB6, 0xBED2, 0x9659, 0xBED3, 0x965A, + 0xBED4, 0xBBB7, 0xBED5, 0x9661, 0xBED6, 0x9662, 0xBED7, 0xBBB8, + 0xBED8, 0xBBB9, 0xBED9, 0x9663, 0xBEDA, 0x9664, 0xBEDB, 0x9665, + 0xBEDC, 0x9666, 0xBEDD, 0x9667, 0xBEDE, 0x9668, 0xBEDF, 0x9669, + 0xBEE0, 0xBBBA, 0xBEE1, 0x966A, 0xBEE2, 0x966B, 0xBEE3, 0xBBBB, + 0xBEE4, 0xBBBC, 0xBEE5, 0xBBBD, 0xBEE6, 0x966C, 0xBEE7, 0x966D, + 0xBEE8, 0x966E, 0xBEE9, 0x966F, 0xBEEA, 0x9670, 0xBEEB, 0x9671, + 0xBEEC, 0xBBBE, 0xBEED, 0x9672, 0xBEEE, 0x9673, 0xBEEF, 0x9674, + 0xBEF0, 0x9675, 0xBEF1, 0x9676, 0xBEF2, 0x9677, 0xBEF3, 0x9678, + 0xBEF4, 0x9679, 0xBEF5, 0x967A, 0xBEF6, 0x9681, 0xBEF7, 0x9682, + 0xBEF8, 0x9683, 0xBEF9, 0x9684, 0xBEFA, 0x9685, 0xBEFB, 0x9686, + 0xBEFC, 0x9687, 0xBEFD, 0x9688, 0xBEFE, 0x9689, 0xBEFF, 0x968A, + 0xBF00, 0x968B, 0xBF01, 0xBBBF, 0xBF02, 0x968C, 0xBF03, 0x968D, + 0xBF04, 0x968E, 0xBF05, 0x968F, 0xBF06, 0x9690, 0xBF07, 0x9691, + 0xBF08, 0xBBC0, 0xBF09, 0xBBC1, 0xBF0A, 0x9692, 0xBF0B, 0x9693, + 0xBF0C, 0x9694, 0xBF0D, 0x9695, 0xBF0E, 0x9696, 0xBF0F, 0x9697, + 0xBF10, 0x9698, 0xBF11, 0x9699, 0xBF12, 0x969A, 0xBF13, 0x969B, + 0xBF14, 0x969C, 0xBF15, 0x969D, 0xBF16, 0x969E, 0xBF17, 0x969F, + 0xBF18, 0xBBC2, 0xBF19, 0xBBC3, 0xBF1A, 0x96A0, 0xBF1B, 0xBBC4, + 0xBF1C, 0xBBC5, 0xBF1D, 0xBBC6, 0xBF1E, 0x96A1, 0xBF1F, 0x96A2, + 0xBF20, 0x96A3, 0xBF21, 0x96A4, 0xBF22, 0x96A5, 0xBF23, 0x96A6, + 0xBF24, 0x96A7, 0xBF25, 0x96A8, 0xBF26, 0x96A9, 0xBF27, 0x96AA, + 0xBF28, 0x96AB, 0xBF29, 0x96AC, 0xBF2A, 0x96AD, 0xBF2B, 0x96AE, + 0xBF2C, 0x96AF, 0xBF2D, 0x96B0, 0xBF2E, 0x96B1, 0xBF2F, 0x96B2, + 0xBF30, 0x96B3, 0xBF31, 0x96B4, 0xBF32, 0x96B5, 0xBF33, 0x96B6, + 0xBF34, 0x96B7, 0xBF35, 0x96B8, 0xBF36, 0x96B9, 0xBF37, 0x96BA, + 0xBF38, 0x96BB, 0xBF39, 0x96BC, 0xBF3A, 0x96BD, 0xBF3B, 0x96BE, + 0xBF3C, 0x96BF, 0xBF3D, 0x96C0, 0xBF3E, 0x96C1, 0xBF3F, 0x96C2, + 0xBF40, 0xBBC7, 0xBF41, 0xBBC8, 0xBF42, 0x96C3, 0xBF43, 0x96C4, + 0xBF44, 0xBBC9, 0xBF45, 0x96C5, 0xBF46, 0x96C6, 0xBF47, 0x96C7, + 0xBF48, 0xBBCA, 0xBF49, 0x96C8, 0xBF4A, 0x96C9, 0xBF4B, 0x96CA, + 0xBF4C, 0x96CB, 0xBF4D, 0x96CC, 0xBF4E, 0x96CD, 0xBF4F, 0x96CE, + 0xBF50, 0xBBCB, 0xBF51, 0xBBCC, 0xBF52, 0x96CF, 0xBF53, 0x96D0, + 0xBF54, 0x96D1, 0xBF55, 0xBBCD, 0xBF56, 0x96D2, 0xBF57, 0x96D3, + 0xBF58, 0x96D4, 0xBF59, 0x96D5, 0xBF5A, 0x96D6, 0xBF5B, 0x96D7, + 0xBF5C, 0x96D8, 0xBF5D, 0x96D9, 0xBF5E, 0x96DA, 0xBF5F, 0x96DB, + 0xBF60, 0x96DC, 0xBF61, 0x96DD, 0xBF62, 0x96DE, 0xBF63, 0x96DF, + 0xBF64, 0x96E0, 0xBF65, 0x96E1, 0xBF66, 0x96E2, 0xBF67, 0x96E3, + 0xBF68, 0x96E4, 0xBF69, 0x96E5, 0xBF6A, 0x96E6, 0xBF6B, 0x96E7, + 0xBF6C, 0x96E8, 0xBF6D, 0x96E9, 0xBF6E, 0x96EA, 0xBF6F, 0x96EB, + 0xBF70, 0x96EC, 0xBF71, 0x96ED, 0xBF72, 0x96EE, 0xBF73, 0x96EF, + 0xBF74, 0x96F0, 0xBF75, 0x96F1, 0xBF76, 0x96F2, 0xBF77, 0x96F3, + 0xBF78, 0x96F4, 0xBF79, 0x96F5, 0xBF7A, 0x96F6, 0xBF7B, 0x96F7, + 0xBF7C, 0x96F8, 0xBF7D, 0x96F9, 0xBF7E, 0x96FA, 0xBF7F, 0x96FB, + 0xBF80, 0x96FC, 0xBF81, 0x96FD, 0xBF82, 0x96FE, 0xBF83, 0x9741, + 0xBF84, 0x9742, 0xBF85, 0x9743, 0xBF86, 0x9744, 0xBF87, 0x9745, + 0xBF88, 0x9746, 0xBF89, 0x9747, 0xBF8A, 0x9748, 0xBF8B, 0x9749, + 0xBF8C, 0x974A, 0xBF8D, 0x974B, 0xBF8E, 0x974C, 0xBF8F, 0x974D, + 0xBF90, 0x974E, 0xBF91, 0x974F, 0xBF92, 0x9750, 0xBF93, 0x9751, + 0xBF94, 0xBBCE, 0xBF95, 0x9752, 0xBF96, 0x9753, 0xBF97, 0x9754, + 0xBF98, 0x9755, 0xBF99, 0x9756, 0xBF9A, 0x9757, 0xBF9B, 0x9758, + 0xBF9C, 0x9759, 0xBF9D, 0x975A, 0xBF9E, 0x9761, 0xBF9F, 0x9762, + 0xBFA0, 0x9763, 0xBFA1, 0x9764, 0xBFA2, 0x9765, 0xBFA3, 0x9766, + 0xBFA4, 0x9767, 0xBFA5, 0x9768, 0xBFA6, 0x9769, 0xBFA7, 0x976A, + 0xBFA8, 0x976B, 0xBFA9, 0x976C, 0xBFAA, 0x976D, 0xBFAB, 0x976E, + 0xBFAC, 0x976F, 0xBFAD, 0x9770, 0xBFAE, 0x9771, 0xBFAF, 0x9772, + 0xBFB0, 0xBBCF, 0xBFB1, 0x9773, 0xBFB2, 0x9774, 0xBFB3, 0x9775, + 0xBFB4, 0x9776, 0xBFB5, 0x9777, 0xBFB6, 0x9778, 0xBFB7, 0x9779, + 0xBFB8, 0x977A, 0xBFB9, 0x9781, 0xBFBA, 0x9782, 0xBFBB, 0x9783, + 0xBFBC, 0x9784, 0xBFBD, 0x9785, 0xBFBE, 0x9786, 0xBFBF, 0x9787, + 0xBFC0, 0x9788, 0xBFC1, 0x9789, 0xBFC2, 0x978A, 0xBFC3, 0x978B, + 0xBFC4, 0x978C, 0xBFC5, 0xBBD0, 0xBFC6, 0x978D, 0xBFC7, 0x978E, + 0xBFC8, 0x978F, 0xBFC9, 0x9790, 0xBFCA, 0x9791, 0xBFCB, 0x9792, + 0xBFCC, 0xBBD1, 0xBFCD, 0xBBD2, 0xBFCE, 0x9793, 0xBFCF, 0x9794, + 0xBFD0, 0xBBD3, 0xBFD1, 0x9795, 0xBFD2, 0x9796, 0xBFD3, 0x9797, + 0xBFD4, 0xBBD4, 0xBFD5, 0x9798, 0xBFD6, 0x9799, 0xBFD7, 0x979A, + 0xBFD8, 0x979B, 0xBFD9, 0x979C, 0xBFDA, 0x979D, 0xBFDB, 0x979E, + 0xBFDC, 0xBBD5, 0xBFDD, 0x979F, 0xBFDE, 0x97A0, 0xBFDF, 0xBBD6, + 0xBFE0, 0x97A1, 0xBFE1, 0xBBD7, 0xBFE2, 0x97A2, 0xBFE3, 0x97A3, + 0xBFE4, 0x97A4, 0xBFE5, 0x97A5, 0xBFE6, 0x97A6, 0xBFE7, 0x97A7, + 0xBFE8, 0x97A8, 0xBFE9, 0x97A9, 0xBFEA, 0x97AA, 0xBFEB, 0x97AB, + 0xBFEC, 0x97AC, 0xBFED, 0x97AD, 0xBFEE, 0x97AE, 0xBFEF, 0x97AF, + 0xBFF0, 0x97B0, 0xBFF1, 0x97B1, 0xBFF2, 0x97B2, 0xBFF3, 0x97B3, + 0xBFF4, 0x97B4, 0xBFF5, 0x97B5, 0xBFF6, 0x97B6, 0xBFF7, 0x97B7, + 0xBFF8, 0x97B8, 0xBFF9, 0x97B9, 0xBFFA, 0x97BA, 0xBFFB, 0x97BB, + 0xBFFC, 0x97BC, 0xBFFD, 0x97BD, 0xBFFE, 0x97BE, 0xBFFF, 0x97BF, + 0xC000, 0x97C0, 0xC001, 0x97C1, 0xC002, 0x97C2, 0xC003, 0x97C3, + 0xC004, 0x97C4, 0xC005, 0x97C5, 0xC006, 0x97C6, 0xC007, 0x97C7, + 0xC008, 0x97C8, 0xC009, 0x97C9, 0xC00A, 0x97CA, 0xC00B, 0x97CB, + 0xC00C, 0x97CC, 0xC00D, 0x97CD, 0xC00E, 0x97CE, 0xC00F, 0x97CF, + 0xC010, 0x97D0, 0xC011, 0x97D1, 0xC012, 0x97D2, 0xC013, 0x97D3, + 0xC014, 0x97D4, 0xC015, 0x97D5, 0xC016, 0x97D6, 0xC017, 0x97D7, + 0xC018, 0x97D8, 0xC019, 0x97D9, 0xC01A, 0x97DA, 0xC01B, 0x97DB, + 0xC01C, 0x97DC, 0xC01D, 0x97DD, 0xC01E, 0x97DE, 0xC01F, 0x97DF, + 0xC020, 0x97E0, 0xC021, 0x97E1, 0xC022, 0x97E2, 0xC023, 0x97E3, + 0xC024, 0x97E4, 0xC025, 0x97E5, 0xC026, 0x97E6, 0xC027, 0x97E7, + 0xC028, 0x97E8, 0xC029, 0x97E9, 0xC02A, 0x97EA, 0xC02B, 0x97EB, + 0xC02C, 0x97EC, 0xC02D, 0x97ED, 0xC02E, 0x97EE, 0xC02F, 0x97EF, + 0xC030, 0x97F0, 0xC031, 0x97F1, 0xC032, 0x97F2, 0xC033, 0x97F3, + 0xC034, 0x97F4, 0xC035, 0x97F5, 0xC036, 0x97F6, 0xC037, 0x97F7, + 0xC038, 0x97F8, 0xC039, 0x97F9, 0xC03A, 0x97FA, 0xC03B, 0x97FB, + 0xC03C, 0xBBD8, 0xC03D, 0x97FC, 0xC03E, 0x97FD, 0xC03F, 0x97FE, + 0xC040, 0x9841, 0xC041, 0x9842, 0xC042, 0x9843, 0xC043, 0x9844, + 0xC044, 0x9845, 0xC045, 0x9846, 0xC046, 0x9847, 0xC047, 0x9848, + 0xC048, 0x9849, 0xC049, 0x984A, 0xC04A, 0x984B, 0xC04B, 0x984C, + 0xC04C, 0x984D, 0xC04D, 0x984E, 0xC04E, 0x984F, 0xC04F, 0x9850, + 0xC050, 0x9851, 0xC051, 0xBBD9, 0xC052, 0x9852, 0xC053, 0x9853, + 0xC054, 0x9854, 0xC055, 0x9855, 0xC056, 0x9856, 0xC057, 0x9857, + 0xC058, 0xBBDA, 0xC059, 0x9858, 0xC05A, 0x9859, 0xC05B, 0x985A, + 0xC05C, 0xBBDB, 0xC05D, 0x9861, 0xC05E, 0x9862, 0xC05F, 0x9863, + 0xC060, 0xBBDC, 0xC061, 0x9864, 0xC062, 0x9865, 0xC063, 0x9866, + 0xC064, 0x9867, 0xC065, 0x9868, 0xC066, 0x9869, 0xC067, 0x986A, + 0xC068, 0xBBDD, 0xC069, 0xBBDE, 0xC06A, 0x986B, 0xC06B, 0x986C, + 0xC06C, 0x986D, 0xC06D, 0x986E, 0xC06E, 0x986F, 0xC06F, 0x9870, + 0xC070, 0x9871, 0xC071, 0x9872, 0xC072, 0x9873, 0xC073, 0x9874, + 0xC074, 0x9875, 0xC075, 0x9876, 0xC076, 0x9877, 0xC077, 0x9878, + 0xC078, 0x9879, 0xC079, 0x987A, 0xC07A, 0x9881, 0xC07B, 0x9882, + 0xC07C, 0x9883, 0xC07D, 0x9884, 0xC07E, 0x9885, 0xC07F, 0x9886, + 0xC080, 0x9887, 0xC081, 0x9888, 0xC082, 0x9889, 0xC083, 0x988A, + 0xC084, 0x988B, 0xC085, 0x988C, 0xC086, 0x988D, 0xC087, 0x988E, + 0xC088, 0x988F, 0xC089, 0x9890, 0xC08A, 0x9891, 0xC08B, 0x9892, + 0xC08C, 0x9893, 0xC08D, 0x9894, 0xC08E, 0x9895, 0xC08F, 0x9896, + 0xC090, 0xBBDF, 0xC091, 0xBBE0, 0xC092, 0x9897, 0xC093, 0x9898, + 0xC094, 0xBBE1, 0xC095, 0x9899, 0xC096, 0x989A, 0xC097, 0x989B, + 0xC098, 0xBBE2, 0xC099, 0x989C, 0xC09A, 0x989D, 0xC09B, 0x989E, + 0xC09C, 0x989F, 0xC09D, 0x98A0, 0xC09E, 0x98A1, 0xC09F, 0x98A2, + 0xC0A0, 0xBBE3, 0xC0A1, 0xBBE4, 0xC0A2, 0x98A3, 0xC0A3, 0xBBE5, + 0xC0A4, 0x98A4, 0xC0A5, 0xBBE6, 0xC0A6, 0x98A5, 0xC0A7, 0x98A6, + 0xC0A8, 0x98A7, 0xC0A9, 0x98A8, 0xC0AA, 0x98A9, 0xC0AB, 0x98AA, + 0xC0AC, 0xBBE7, 0xC0AD, 0xBBE8, 0xC0AE, 0x98AB, 0xC0AF, 0xBBE9, + 0xC0B0, 0xBBEA, 0xC0B1, 0x98AC, 0xC0B2, 0x98AD, 0xC0B3, 0xBBEB, + 0xC0B4, 0xBBEC, 0xC0B5, 0xBBED, 0xC0B6, 0xBBEE, 0xC0B7, 0x98AE, + 0xC0B8, 0x98AF, 0xC0B9, 0x98B0, 0xC0BA, 0x98B1, 0xC0BB, 0x98B2, + 0xC0BC, 0xBBEF, 0xC0BD, 0xBBF0, 0xC0BE, 0x98B3, 0xC0BF, 0xBBF1, + 0xC0C0, 0xBBF2, 0xC0C1, 0xBBF3, 0xC0C2, 0x98B4, 0xC0C3, 0x98B5, + 0xC0C4, 0x98B6, 0xC0C5, 0xBBF4, 0xC0C6, 0x98B7, 0xC0C7, 0x98B8, + 0xC0C8, 0xBBF5, 0xC0C9, 0xBBF6, 0xC0CA, 0x98B9, 0xC0CB, 0x98BA, + 0xC0CC, 0xBBF7, 0xC0CD, 0x98BB, 0xC0CE, 0x98BC, 0xC0CF, 0x98BD, + 0xC0D0, 0xBBF8, 0xC0D1, 0x98BE, 0xC0D2, 0x98BF, 0xC0D3, 0x98C0, + 0xC0D4, 0x98C1, 0xC0D5, 0x98C2, 0xC0D6, 0x98C3, 0xC0D7, 0x98C4, + 0xC0D8, 0xBBF9, 0xC0D9, 0xBBFA, 0xC0DA, 0x98C5, 0xC0DB, 0xBBFB, + 0xC0DC, 0xBBFC, 0xC0DD, 0xBBFD, 0xC0DE, 0x98C6, 0xC0DF, 0x98C7, + 0xC0E0, 0x98C8, 0xC0E1, 0x98C9, 0xC0E2, 0x98CA, 0xC0E3, 0x98CB, + 0xC0E4, 0xBBFE, 0xC0E5, 0xBCA1, 0xC0E6, 0x98CC, 0xC0E7, 0x98CD, + 0xC0E8, 0xBCA2, 0xC0E9, 0x98CE, 0xC0EA, 0x98CF, 0xC0EB, 0x98D0, + 0xC0EC, 0xBCA3, 0xC0ED, 0x98D1, 0xC0EE, 0x98D2, 0xC0EF, 0x98D3, + 0xC0F0, 0x98D4, 0xC0F1, 0x98D5, 0xC0F2, 0x98D6, 0xC0F3, 0x98D7, + 0xC0F4, 0xBCA4, 0xC0F5, 0xBCA5, 0xC0F6, 0x98D8, 0xC0F7, 0xBCA6, + 0xC0F8, 0x98D9, 0xC0F9, 0xBCA7, 0xC0FA, 0x98DA, 0xC0FB, 0x98DB, + 0xC0FC, 0x98DC, 0xC0FD, 0x98DD, 0xC0FE, 0x98DE, 0xC0FF, 0x98DF, + 0xC100, 0xBCA8, 0xC101, 0x98E0, 0xC102, 0x98E1, 0xC103, 0x98E2, + 0xC104, 0xBCA9, 0xC105, 0x98E3, 0xC106, 0x98E4, 0xC107, 0x98E5, + 0xC108, 0xBCAA, 0xC109, 0x98E6, 0xC10A, 0x98E7, 0xC10B, 0x98E8, + 0xC10C, 0x98E9, 0xC10D, 0x98EA, 0xC10E, 0x98EB, 0xC10F, 0x98EC, + 0xC110, 0xBCAB, 0xC111, 0x98ED, 0xC112, 0x98EE, 0xC113, 0x98EF, + 0xC114, 0x98F0, 0xC115, 0xBCAC, 0xC116, 0x98F1, 0xC117, 0x98F2, + 0xC118, 0x98F3, 0xC119, 0x98F4, 0xC11A, 0x98F5, 0xC11B, 0x98F6, + 0xC11C, 0xBCAD, 0xC11D, 0xBCAE, 0xC11E, 0xBCAF, 0xC11F, 0xBCB0, + 0xC120, 0xBCB1, 0xC121, 0x98F7, 0xC122, 0x98F8, 0xC123, 0xBCB2, + 0xC124, 0xBCB3, 0xC125, 0x98F9, 0xC126, 0xBCB4, 0xC127, 0xBCB5, + 0xC128, 0x98FA, 0xC129, 0x98FB, 0xC12A, 0x98FC, 0xC12B, 0x98FD, + 0xC12C, 0xBCB6, 0xC12D, 0xBCB7, 0xC12E, 0x98FE, 0xC12F, 0xBCB8, + 0xC130, 0xBCB9, 0xC131, 0xBCBA, 0xC132, 0x9941, 0xC133, 0x9942, + 0xC134, 0x9943, 0xC135, 0x9944, 0xC136, 0xBCBB, 0xC137, 0x9945, + 0xC138, 0xBCBC, 0xC139, 0xBCBD, 0xC13A, 0x9946, 0xC13B, 0x9947, + 0xC13C, 0xBCBE, 0xC13D, 0x9948, 0xC13E, 0x9949, 0xC13F, 0x994A, + 0xC140, 0xBCBF, 0xC141, 0x994B, 0xC142, 0x994C, 0xC143, 0x994D, + 0xC144, 0x994E, 0xC145, 0x994F, 0xC146, 0x9950, 0xC147, 0x9951, + 0xC148, 0xBCC0, 0xC149, 0xBCC1, 0xC14A, 0x9952, 0xC14B, 0xBCC2, + 0xC14C, 0xBCC3, 0xC14D, 0xBCC4, 0xC14E, 0x9953, 0xC14F, 0x9954, + 0xC150, 0x9955, 0xC151, 0x9956, 0xC152, 0x9957, 0xC153, 0x9958, + 0xC154, 0xBCC5, 0xC155, 0xBCC6, 0xC156, 0x9959, 0xC157, 0x995A, + 0xC158, 0xBCC7, 0xC159, 0x9961, 0xC15A, 0x9962, 0xC15B, 0x9963, + 0xC15C, 0xBCC8, 0xC15D, 0x9964, 0xC15E, 0x9965, 0xC15F, 0x9966, + 0xC160, 0x9967, 0xC161, 0x9968, 0xC162, 0x9969, 0xC163, 0x996A, + 0xC164, 0xBCC9, 0xC165, 0xBCCA, 0xC166, 0x996B, 0xC167, 0xBCCB, + 0xC168, 0xBCCC, 0xC169, 0xBCCD, 0xC16A, 0x996C, 0xC16B, 0x996D, + 0xC16C, 0x996E, 0xC16D, 0x996F, 0xC16E, 0x9970, 0xC16F, 0x9971, + 0xC170, 0xBCCE, 0xC171, 0x9972, 0xC172, 0x9973, 0xC173, 0x9974, + 0xC174, 0xBCCF, 0xC175, 0x9975, 0xC176, 0x9976, 0xC177, 0x9977, + 0xC178, 0xBCD0, 0xC179, 0x9978, 0xC17A, 0x9979, 0xC17B, 0x997A, + 0xC17C, 0x9981, 0xC17D, 0x9982, 0xC17E, 0x9983, 0xC17F, 0x9984, + 0xC180, 0x9985, 0xC181, 0x9986, 0xC182, 0x9987, 0xC183, 0x9988, + 0xC184, 0x9989, 0xC185, 0xBCD1, 0xC186, 0x998A, 0xC187, 0x998B, + 0xC188, 0x998C, 0xC189, 0x998D, 0xC18A, 0x998E, 0xC18B, 0x998F, + 0xC18C, 0xBCD2, 0xC18D, 0xBCD3, 0xC18E, 0xBCD4, 0xC18F, 0x9990, + 0xC190, 0xBCD5, 0xC191, 0x9991, 0xC192, 0x9992, 0xC193, 0x9993, + 0xC194, 0xBCD6, 0xC195, 0x9994, 0xC196, 0xBCD7, 0xC197, 0x9995, + 0xC198, 0x9996, 0xC199, 0x9997, 0xC19A, 0x9998, 0xC19B, 0x9999, + 0xC19C, 0xBCD8, 0xC19D, 0xBCD9, 0xC19E, 0x999A, 0xC19F, 0xBCDA, + 0xC1A0, 0x999B, 0xC1A1, 0xBCDB, 0xC1A2, 0x999C, 0xC1A3, 0x999D, + 0xC1A4, 0x999E, 0xC1A5, 0xBCDC, 0xC1A6, 0x999F, 0xC1A7, 0x99A0, + 0xC1A8, 0xBCDD, 0xC1A9, 0xBCDE, 0xC1AA, 0x99A1, 0xC1AB, 0x99A2, + 0xC1AC, 0xBCDF, 0xC1AD, 0x99A3, 0xC1AE, 0x99A4, 0xC1AF, 0x99A5, + 0xC1B0, 0xBCE0, 0xC1B1, 0x99A6, 0xC1B2, 0x99A7, 0xC1B3, 0x99A8, + 0xC1B4, 0x99A9, 0xC1B5, 0x99AA, 0xC1B6, 0x99AB, 0xC1B7, 0x99AC, + 0xC1B8, 0x99AD, 0xC1B9, 0x99AE, 0xC1BA, 0x99AF, 0xC1BB, 0x99B0, + 0xC1BC, 0x99B1, 0xC1BD, 0xBCE1, 0xC1BE, 0x99B2, 0xC1BF, 0x99B3, + 0xC1C0, 0x99B4, 0xC1C1, 0x99B5, 0xC1C2, 0x99B6, 0xC1C3, 0x99B7, + 0xC1C4, 0xBCE2, 0xC1C5, 0x99B8, 0xC1C6, 0x99B9, 0xC1C7, 0x99BA, + 0xC1C8, 0xBCE3, 0xC1C9, 0x99BB, 0xC1CA, 0x99BC, 0xC1CB, 0x99BD, + 0xC1CC, 0xBCE4, 0xC1CD, 0x99BE, 0xC1CE, 0x99BF, 0xC1CF, 0x99C0, + 0xC1D0, 0x99C1, 0xC1D1, 0x99C2, 0xC1D2, 0x99C3, 0xC1D3, 0x99C4, + 0xC1D4, 0xBCE5, 0xC1D5, 0x99C5, 0xC1D6, 0x99C6, 0xC1D7, 0xBCE6, + 0xC1D8, 0xBCE7, 0xC1D9, 0x99C7, 0xC1DA, 0x99C8, 0xC1DB, 0x99C9, + 0xC1DC, 0x99CA, 0xC1DD, 0x99CB, 0xC1DE, 0x99CC, 0xC1DF, 0x99CD, + 0xC1E0, 0xBCE8, 0xC1E1, 0x99CE, 0xC1E2, 0x99CF, 0xC1E3, 0x99D0, + 0xC1E4, 0xBCE9, 0xC1E5, 0x99D1, 0xC1E6, 0x99D2, 0xC1E7, 0x99D3, + 0xC1E8, 0xBCEA, 0xC1E9, 0x99D4, 0xC1EA, 0x99D5, 0xC1EB, 0x99D6, + 0xC1EC, 0x99D7, 0xC1ED, 0x99D8, 0xC1EE, 0x99D9, 0xC1EF, 0x99DA, + 0xC1F0, 0xBCEB, 0xC1F1, 0xBCEC, 0xC1F2, 0x99DB, 0xC1F3, 0xBCED, + 0xC1F4, 0x99DC, 0xC1F5, 0x99DD, 0xC1F6, 0x99DE, 0xC1F7, 0x99DF, + 0xC1F8, 0x99E0, 0xC1F9, 0x99E1, 0xC1FA, 0x99E2, 0xC1FB, 0x99E3, + 0xC1FC, 0xBCEE, 0xC1FD, 0xBCEF, 0xC1FE, 0x99E4, 0xC1FF, 0x99E5, + 0xC200, 0xBCF0, 0xC201, 0x99E6, 0xC202, 0x99E7, 0xC203, 0x99E8, + 0xC204, 0xBCF1, 0xC205, 0x99E9, 0xC206, 0x99EA, 0xC207, 0x99EB, + 0xC208, 0x99EC, 0xC209, 0x99ED, 0xC20A, 0x99EE, 0xC20B, 0x99EF, + 0xC20C, 0xBCF2, 0xC20D, 0xBCF3, 0xC20E, 0x99F0, 0xC20F, 0xBCF4, + 0xC210, 0x99F1, 0xC211, 0xBCF5, 0xC212, 0x99F2, 0xC213, 0x99F3, + 0xC214, 0x99F4, 0xC215, 0x99F5, 0xC216, 0x99F6, 0xC217, 0x99F7, + 0xC218, 0xBCF6, 0xC219, 0xBCF7, 0xC21A, 0x99F8, 0xC21B, 0x99F9, + 0xC21C, 0xBCF8, 0xC21D, 0x99FA, 0xC21E, 0x99FB, 0xC21F, 0xBCF9, + 0xC220, 0xBCFA, 0xC221, 0x99FC, 0xC222, 0x99FD, 0xC223, 0x99FE, + 0xC224, 0x9A41, 0xC225, 0x9A42, 0xC226, 0x9A43, 0xC227, 0x9A44, + 0xC228, 0xBCFB, 0xC229, 0xBCFC, 0xC22A, 0x9A45, 0xC22B, 0xBCFD, + 0xC22C, 0x9A46, 0xC22D, 0xBCFE, 0xC22E, 0x9A47, 0xC22F, 0xBDA1, + 0xC230, 0x9A48, 0xC231, 0xBDA2, 0xC232, 0xBDA3, 0xC233, 0x9A49, + 0xC234, 0xBDA4, 0xC235, 0x9A4A, 0xC236, 0x9A4B, 0xC237, 0x9A4C, + 0xC238, 0x9A4D, 0xC239, 0x9A4E, 0xC23A, 0x9A4F, 0xC23B, 0x9A50, + 0xC23C, 0x9A51, 0xC23D, 0x9A52, 0xC23E, 0x9A53, 0xC23F, 0x9A54, + 0xC240, 0x9A55, 0xC241, 0x9A56, 0xC242, 0x9A57, 0xC243, 0x9A58, + 0xC244, 0x9A59, 0xC245, 0x9A5A, 0xC246, 0x9A61, 0xC247, 0x9A62, + 0xC248, 0xBDA5, 0xC249, 0x9A63, 0xC24A, 0x9A64, 0xC24B, 0x9A65, + 0xC24C, 0x9A66, 0xC24D, 0x9A67, 0xC24E, 0x9A68, 0xC24F, 0x9A69, + 0xC250, 0xBDA6, 0xC251, 0xBDA7, 0xC252, 0x9A6A, 0xC253, 0x9A6B, + 0xC254, 0xBDA8, 0xC255, 0x9A6C, 0xC256, 0x9A6D, 0xC257, 0x9A6E, + 0xC258, 0xBDA9, 0xC259, 0x9A6F, 0xC25A, 0x9A70, 0xC25B, 0x9A71, + 0xC25C, 0x9A72, 0xC25D, 0x9A73, 0xC25E, 0x9A74, 0xC25F, 0x9A75, + 0xC260, 0xBDAA, 0xC261, 0x9A76, 0xC262, 0x9A77, 0xC263, 0x9A78, + 0xC264, 0x9A79, 0xC265, 0xBDAB, 0xC266, 0x9A7A, 0xC267, 0x9A81, + 0xC268, 0x9A82, 0xC269, 0x9A83, 0xC26A, 0x9A84, 0xC26B, 0x9A85, + 0xC26C, 0xBDAC, 0xC26D, 0xBDAD, 0xC26E, 0x9A86, 0xC26F, 0x9A87, + 0xC270, 0xBDAE, 0xC271, 0x9A88, 0xC272, 0x9A89, 0xC273, 0x9A8A, + 0xC274, 0xBDAF, 0xC275, 0x9A8B, 0xC276, 0x9A8C, 0xC277, 0x9A8D, + 0xC278, 0x9A8E, 0xC279, 0x9A8F, 0xC27A, 0x9A90, 0xC27B, 0x9A91, + 0xC27C, 0xBDB0, 0xC27D, 0xBDB1, 0xC27E, 0x9A92, 0xC27F, 0xBDB2, + 0xC280, 0x9A93, 0xC281, 0xBDB3, 0xC282, 0x9A94, 0xC283, 0x9A95, + 0xC284, 0x9A96, 0xC285, 0x9A97, 0xC286, 0x9A98, 0xC287, 0x9A99, + 0xC288, 0xBDB4, 0xC289, 0xBDB5, 0xC28A, 0x9A9A, 0xC28B, 0x9A9B, + 0xC28C, 0x9A9C, 0xC28D, 0x9A9D, 0xC28E, 0x9A9E, 0xC28F, 0x9A9F, + 0xC290, 0xBDB6, 0xC291, 0x9AA0, 0xC292, 0x9AA1, 0xC293, 0x9AA2, + 0xC294, 0x9AA3, 0xC295, 0x9AA4, 0xC296, 0x9AA5, 0xC297, 0x9AA6, + 0xC298, 0xBDB7, 0xC299, 0x9AA7, 0xC29A, 0x9AA8, 0xC29B, 0xBDB8, + 0xC29C, 0x9AA9, 0xC29D, 0xBDB9, 0xC29E, 0x9AAA, 0xC29F, 0x9AAB, + 0xC2A0, 0x9AAC, 0xC2A1, 0x9AAD, 0xC2A2, 0x9AAE, 0xC2A3, 0x9AAF, + 0xC2A4, 0xBDBA, 0xC2A5, 0xBDBB, 0xC2A6, 0x9AB0, 0xC2A7, 0x9AB1, + 0xC2A8, 0xBDBC, 0xC2A9, 0x9AB2, 0xC2AA, 0x9AB3, 0xC2AB, 0x9AB4, + 0xC2AC, 0xBDBD, 0xC2AD, 0xBDBE, 0xC2AE, 0x9AB5, 0xC2AF, 0x9AB6, + 0xC2B0, 0x9AB7, 0xC2B1, 0x9AB8, 0xC2B2, 0x9AB9, 0xC2B3, 0x9ABA, + 0xC2B4, 0xBDBF, 0xC2B5, 0xBDC0, 0xC2B6, 0x9ABB, 0xC2B7, 0xBDC1, + 0xC2B8, 0x9ABC, 0xC2B9, 0xBDC2, 0xC2BA, 0x9ABD, 0xC2BB, 0x9ABE, + 0xC2BC, 0x9ABF, 0xC2BD, 0x9AC0, 0xC2BE, 0x9AC1, 0xC2BF, 0x9AC2, + 0xC2C0, 0x9AC3, 0xC2C1, 0x9AC4, 0xC2C2, 0x9AC5, 0xC2C3, 0x9AC6, + 0xC2C4, 0x9AC7, 0xC2C5, 0x9AC8, 0xC2C6, 0x9AC9, 0xC2C7, 0x9ACA, + 0xC2C8, 0x9ACB, 0xC2C9, 0x9ACC, 0xC2CA, 0x9ACD, 0xC2CB, 0x9ACE, + 0xC2CC, 0x9ACF, 0xC2CD, 0x9AD0, 0xC2CE, 0x9AD1, 0xC2CF, 0x9AD2, + 0xC2D0, 0x9AD3, 0xC2D1, 0x9AD4, 0xC2D2, 0x9AD5, 0xC2D3, 0x9AD6, + 0xC2D4, 0x9AD7, 0xC2D5, 0x9AD8, 0xC2D6, 0x9AD9, 0xC2D7, 0x9ADA, + 0xC2D8, 0x9ADB, 0xC2D9, 0x9ADC, 0xC2DA, 0x9ADD, 0xC2DB, 0x9ADE, + 0xC2DC, 0xBDC3, 0xC2DD, 0xBDC4, 0xC2DE, 0x9ADF, 0xC2DF, 0x9AE0, + 0xC2E0, 0xBDC5, 0xC2E1, 0x9AE1, 0xC2E2, 0x9AE2, 0xC2E3, 0xBDC6, + 0xC2E4, 0xBDC7, 0xC2E5, 0x9AE3, 0xC2E6, 0x9AE4, 0xC2E7, 0x9AE5, + 0xC2E8, 0x9AE6, 0xC2E9, 0x9AE7, 0xC2EA, 0x9AE8, 0xC2EB, 0xBDC8, + 0xC2EC, 0xBDC9, 0xC2ED, 0xBDCA, 0xC2EE, 0x9AE9, 0xC2EF, 0xBDCB, + 0xC2F0, 0x9AEA, 0xC2F1, 0xBDCC, 0xC2F2, 0x9AEB, 0xC2F3, 0x9AEC, + 0xC2F4, 0x9AED, 0xC2F5, 0x9AEE, 0xC2F6, 0xBDCD, 0xC2F7, 0x9AEF, + 0xC2F8, 0xBDCE, 0xC2F9, 0xBDCF, 0xC2FA, 0x9AF0, 0xC2FB, 0xBDD0, + 0xC2FC, 0xBDD1, 0xC2FD, 0x9AF1, 0xC2FE, 0x9AF2, 0xC2FF, 0x9AF3, + 0xC300, 0xBDD2, 0xC301, 0x9AF4, 0xC302, 0x9AF5, 0xC303, 0x9AF6, + 0xC304, 0x9AF7, 0xC305, 0x9AF8, 0xC306, 0x9AF9, 0xC307, 0x9AFA, + 0xC308, 0xBDD3, 0xC309, 0xBDD4, 0xC30A, 0x9AFB, 0xC30B, 0x9AFC, + 0xC30C, 0xBDD5, 0xC30D, 0xBDD6, 0xC30E, 0x9AFD, 0xC30F, 0x9AFE, + 0xC310, 0x9B41, 0xC311, 0x9B42, 0xC312, 0x9B43, 0xC313, 0xBDD7, + 0xC314, 0xBDD8, 0xC315, 0xBDD9, 0xC316, 0x9B44, 0xC317, 0x9B45, + 0xC318, 0xBDDA, 0xC319, 0x9B46, 0xC31A, 0x9B47, 0xC31B, 0x9B48, + 0xC31C, 0xBDDB, 0xC31D, 0x9B49, 0xC31E, 0x9B4A, 0xC31F, 0x9B4B, + 0xC320, 0x9B4C, 0xC321, 0x9B4D, 0xC322, 0x9B4E, 0xC323, 0x9B4F, + 0xC324, 0xBDDC, 0xC325, 0xBDDD, 0xC326, 0x9B50, 0xC327, 0x9B51, + 0xC328, 0xBDDE, 0xC329, 0xBDDF, 0xC32A, 0x9B52, 0xC32B, 0x9B53, + 0xC32C, 0x9B54, 0xC32D, 0x9B55, 0xC32E, 0x9B56, 0xC32F, 0x9B57, + 0xC330, 0x9B58, 0xC331, 0x9B59, 0xC332, 0x9B5A, 0xC333, 0x9B61, + 0xC334, 0x9B62, 0xC335, 0x9B63, 0xC336, 0x9B64, 0xC337, 0x9B65, + 0xC338, 0x9B66, 0xC339, 0x9B67, 0xC33A, 0x9B68, 0xC33B, 0x9B69, + 0xC33C, 0x9B6A, 0xC33D, 0x9B6B, 0xC33E, 0x9B6C, 0xC33F, 0x9B6D, + 0xC340, 0x9B6E, 0xC341, 0x9B6F, 0xC342, 0x9B70, 0xC343, 0x9B71, + 0xC344, 0x9B72, 0xC345, 0xBDE0, 0xC346, 0x9B73, 0xC347, 0x9B74, + 0xC348, 0x9B75, 0xC349, 0x9B76, 0xC34A, 0x9B77, 0xC34B, 0x9B78, + 0xC34C, 0x9B79, 0xC34D, 0x9B7A, 0xC34E, 0x9B81, 0xC34F, 0x9B82, + 0xC350, 0x9B83, 0xC351, 0x9B84, 0xC352, 0x9B85, 0xC353, 0x9B86, + 0xC354, 0x9B87, 0xC355, 0x9B88, 0xC356, 0x9B89, 0xC357, 0x9B8A, + 0xC358, 0x9B8B, 0xC359, 0x9B8C, 0xC35A, 0x9B8D, 0xC35B, 0x9B8E, + 0xC35C, 0x9B8F, 0xC35D, 0x9B90, 0xC35E, 0x9B91, 0xC35F, 0x9B92, + 0xC360, 0x9B93, 0xC361, 0x9B94, 0xC362, 0x9B95, 0xC363, 0x9B96, + 0xC364, 0x9B97, 0xC365, 0x9B98, 0xC366, 0x9B99, 0xC367, 0x9B9A, + 0xC368, 0xBDE1, 0xC369, 0xBDE2, 0xC36A, 0x9B9B, 0xC36B, 0x9B9C, + 0xC36C, 0xBDE3, 0xC36D, 0x9B9D, 0xC36E, 0x9B9E, 0xC36F, 0x9B9F, + 0xC370, 0xBDE4, 0xC371, 0x9BA0, 0xC372, 0xBDE5, 0xC373, 0x9BA1, + 0xC374, 0x9BA2, 0xC375, 0x9BA3, 0xC376, 0x9BA4, 0xC377, 0x9BA5, + 0xC378, 0xBDE6, 0xC379, 0xBDE7, 0xC37A, 0x9BA6, 0xC37B, 0x9BA7, + 0xC37C, 0xBDE8, 0xC37D, 0xBDE9, 0xC37E, 0x9BA8, 0xC37F, 0x9BA9, + 0xC380, 0x9BAA, 0xC381, 0x9BAB, 0xC382, 0x9BAC, 0xC383, 0x9BAD, + 0xC384, 0xBDEA, 0xC385, 0x9BAE, 0xC386, 0x9BAF, 0xC387, 0x9BB0, + 0xC388, 0xBDEB, 0xC389, 0x9BB1, 0xC38A, 0x9BB2, 0xC38B, 0x9BB3, + 0xC38C, 0xBDEC, 0xC38D, 0x9BB4, 0xC38E, 0x9BB5, 0xC38F, 0x9BB6, + 0xC390, 0x9BB7, 0xC391, 0x9BB8, 0xC392, 0x9BB9, 0xC393, 0x9BBA, + 0xC394, 0x9BBB, 0xC395, 0x9BBC, 0xC396, 0x9BBD, 0xC397, 0x9BBE, + 0xC398, 0x9BBF, 0xC399, 0x9BC0, 0xC39A, 0x9BC1, 0xC39B, 0x9BC2, + 0xC39C, 0x9BC3, 0xC39D, 0x9BC4, 0xC39E, 0x9BC5, 0xC39F, 0x9BC6, + 0xC3A0, 0x9BC7, 0xC3A1, 0x9BC8, 0xC3A2, 0x9BC9, 0xC3A3, 0x9BCA, + 0xC3A4, 0x9BCB, 0xC3A5, 0x9BCC, 0xC3A6, 0x9BCD, 0xC3A7, 0x9BCE, + 0xC3A8, 0x9BCF, 0xC3A9, 0x9BD0, 0xC3AA, 0x9BD1, 0xC3AB, 0x9BD2, + 0xC3AC, 0x9BD3, 0xC3AD, 0x9BD4, 0xC3AE, 0x9BD5, 0xC3AF, 0x9BD6, + 0xC3B0, 0x9BD7, 0xC3B1, 0x9BD8, 0xC3B2, 0x9BD9, 0xC3B3, 0x9BDA, + 0xC3B4, 0x9BDB, 0xC3B5, 0x9BDC, 0xC3B6, 0x9BDD, 0xC3B7, 0x9BDE, + 0xC3B8, 0x9BDF, 0xC3B9, 0x9BE0, 0xC3BA, 0x9BE1, 0xC3BB, 0x9BE2, + 0xC3BC, 0x9BE3, 0xC3BD, 0x9BE4, 0xC3BE, 0x9BE5, 0xC3BF, 0x9BE6, + 0xC3C0, 0xBDED, 0xC3C1, 0x9BE7, 0xC3C2, 0x9BE8, 0xC3C3, 0x9BE9, + 0xC3C4, 0x9BEA, 0xC3C5, 0x9BEB, 0xC3C6, 0x9BEC, 0xC3C7, 0x9BED, + 0xC3C8, 0x9BEE, 0xC3C9, 0x9BEF, 0xC3CA, 0x9BF0, 0xC3CB, 0x9BF1, + 0xC3CC, 0x9BF2, 0xC3CD, 0x9BF3, 0xC3CE, 0x9BF4, 0xC3CF, 0x9BF5, + 0xC3D0, 0x9BF6, 0xC3D1, 0x9BF7, 0xC3D2, 0x9BF8, 0xC3D3, 0x9BF9, + 0xC3D4, 0x9BFA, 0xC3D5, 0x9BFB, 0xC3D6, 0x9BFC, 0xC3D7, 0x9BFD, + 0xC3D8, 0xBDEE, 0xC3D9, 0xBDEF, 0xC3DA, 0x9BFE, 0xC3DB, 0x9C41, + 0xC3DC, 0xBDF0, 0xC3DD, 0x9C42, 0xC3DE, 0x9C43, 0xC3DF, 0xBDF1, + 0xC3E0, 0xBDF2, 0xC3E1, 0x9C44, 0xC3E2, 0xBDF3, 0xC3E3, 0x9C45, + 0xC3E4, 0x9C46, 0xC3E5, 0x9C47, 0xC3E6, 0x9C48, 0xC3E7, 0x9C49, + 0xC3E8, 0xBDF4, 0xC3E9, 0xBDF5, 0xC3EA, 0x9C4A, 0xC3EB, 0x9C4B, + 0xC3EC, 0x9C4C, 0xC3ED, 0xBDF6, 0xC3EE, 0x9C4D, 0xC3EF, 0x9C4E, + 0xC3F0, 0x9C4F, 0xC3F1, 0x9C50, 0xC3F2, 0x9C51, 0xC3F3, 0x9C52, + 0xC3F4, 0xBDF7, 0xC3F5, 0xBDF8, 0xC3F6, 0x9C53, 0xC3F7, 0x9C54, + 0xC3F8, 0xBDF9, 0xC3F9, 0x9C55, 0xC3FA, 0x9C56, 0xC3FB, 0x9C57, + 0xC3FC, 0x9C58, 0xC3FD, 0x9C59, 0xC3FE, 0x9C5A, 0xC3FF, 0x9C61, + 0xC400, 0x9C62, 0xC401, 0x9C63, 0xC402, 0x9C64, 0xC403, 0x9C65, + 0xC404, 0x9C66, 0xC405, 0x9C67, 0xC406, 0x9C68, 0xC407, 0x9C69, + 0xC408, 0xBDFA, 0xC409, 0x9C6A, 0xC40A, 0x9C6B, 0xC40B, 0x9C6C, + 0xC40C, 0x9C6D, 0xC40D, 0x9C6E, 0xC40E, 0x9C6F, 0xC40F, 0x9C70, + 0xC410, 0xBDFB, 0xC411, 0x9C71, 0xC412, 0x9C72, 0xC413, 0x9C73, + 0xC414, 0x9C74, 0xC415, 0x9C75, 0xC416, 0x9C76, 0xC417, 0x9C77, + 0xC418, 0x9C78, 0xC419, 0x9C79, 0xC41A, 0x9C7A, 0xC41B, 0x9C81, + 0xC41C, 0x9C82, 0xC41D, 0x9C83, 0xC41E, 0x9C84, 0xC41F, 0x9C85, + 0xC420, 0x9C86, 0xC421, 0x9C87, 0xC422, 0x9C88, 0xC423, 0x9C89, + 0xC424, 0xBDFC, 0xC425, 0x9C8A, 0xC426, 0x9C8B, 0xC427, 0x9C8C, + 0xC428, 0x9C8D, 0xC429, 0x9C8E, 0xC42A, 0x9C8F, 0xC42B, 0x9C90, + 0xC42C, 0xBDFD, 0xC42D, 0x9C91, 0xC42E, 0x9C92, 0xC42F, 0x9C93, + 0xC430, 0xBDFE, 0xC431, 0x9C94, 0xC432, 0x9C95, 0xC433, 0x9C96, + 0xC434, 0xBEA1, 0xC435, 0x9C97, 0xC436, 0x9C98, 0xC437, 0x9C99, + 0xC438, 0x9C9A, 0xC439, 0x9C9B, 0xC43A, 0x9C9C, 0xC43B, 0x9C9D, + 0xC43C, 0xBEA2, 0xC43D, 0xBEA3, 0xC43E, 0x9C9E, 0xC43F, 0x9C9F, + 0xC440, 0x9CA0, 0xC441, 0x9CA1, 0xC442, 0x9CA2, 0xC443, 0x9CA3, + 0xC444, 0x9CA4, 0xC445, 0x9CA5, 0xC446, 0x9CA6, 0xC447, 0x9CA7, + 0xC448, 0xBEA4, 0xC449, 0x9CA8, 0xC44A, 0x9CA9, 0xC44B, 0x9CAA, + 0xC44C, 0x9CAB, 0xC44D, 0x9CAC, 0xC44E, 0x9CAD, 0xC44F, 0x9CAE, + 0xC450, 0x9CAF, 0xC451, 0x9CB0, 0xC452, 0x9CB1, 0xC453, 0x9CB2, + 0xC454, 0x9CB3, 0xC455, 0x9CB4, 0xC456, 0x9CB5, 0xC457, 0x9CB6, + 0xC458, 0x9CB7, 0xC459, 0x9CB8, 0xC45A, 0x9CB9, 0xC45B, 0x9CBA, + 0xC45C, 0x9CBB, 0xC45D, 0x9CBC, 0xC45E, 0x9CBD, 0xC45F, 0x9CBE, + 0xC460, 0x9CBF, 0xC461, 0x9CC0, 0xC462, 0x9CC1, 0xC463, 0x9CC2, + 0xC464, 0xBEA5, 0xC465, 0xBEA6, 0xC466, 0x9CC3, 0xC467, 0x9CC4, + 0xC468, 0xBEA7, 0xC469, 0x9CC5, 0xC46A, 0x9CC6, 0xC46B, 0x9CC7, + 0xC46C, 0xBEA8, 0xC46D, 0x9CC8, 0xC46E, 0x9CC9, 0xC46F, 0x9CCA, + 0xC470, 0x9CCB, 0xC471, 0x9CCC, 0xC472, 0x9CCD, 0xC473, 0x9CCE, + 0xC474, 0xBEA9, 0xC475, 0xBEAA, 0xC476, 0x9CCF, 0xC477, 0x9CD0, + 0xC478, 0x9CD1, 0xC479, 0xBEAB, 0xC47A, 0x9CD2, 0xC47B, 0x9CD3, + 0xC47C, 0x9CD4, 0xC47D, 0x9CD5, 0xC47E, 0x9CD6, 0xC47F, 0x9CD7, + 0xC480, 0xBEAC, 0xC481, 0x9CD8, 0xC482, 0x9CD9, 0xC483, 0x9CDA, + 0xC484, 0x9CDB, 0xC485, 0x9CDC, 0xC486, 0x9CDD, 0xC487, 0x9CDE, + 0xC488, 0x9CDF, 0xC489, 0x9CE0, 0xC48A, 0x9CE1, 0xC48B, 0x9CE2, + 0xC48C, 0x9CE3, 0xC48D, 0x9CE4, 0xC48E, 0x9CE5, 0xC48F, 0x9CE6, + 0xC490, 0x9CE7, 0xC491, 0x9CE8, 0xC492, 0x9CE9, 0xC493, 0x9CEA, + 0xC494, 0xBEAD, 0xC495, 0x9CEB, 0xC496, 0x9CEC, 0xC497, 0x9CED, + 0xC498, 0x9CEE, 0xC499, 0x9CEF, 0xC49A, 0x9CF0, 0xC49B, 0x9CF1, + 0xC49C, 0xBEAE, 0xC49D, 0x9CF2, 0xC49E, 0x9CF3, 0xC49F, 0x9CF4, + 0xC4A0, 0x9CF5, 0xC4A1, 0x9CF6, 0xC4A2, 0x9CF7, 0xC4A3, 0x9CF8, + 0xC4A4, 0x9CF9, 0xC4A5, 0x9CFA, 0xC4A6, 0x9CFB, 0xC4A7, 0x9CFC, + 0xC4A8, 0x9CFD, 0xC4A9, 0x9CFE, 0xC4AA, 0x9D41, 0xC4AB, 0x9D42, + 0xC4AC, 0x9D43, 0xC4AD, 0x9D44, 0xC4AE, 0x9D45, 0xC4AF, 0x9D46, + 0xC4B0, 0x9D47, 0xC4B1, 0x9D48, 0xC4B2, 0x9D49, 0xC4B3, 0x9D4A, + 0xC4B4, 0x9D4B, 0xC4B5, 0x9D4C, 0xC4B6, 0x9D4D, 0xC4B7, 0x9D4E, + 0xC4B8, 0xBEAF, 0xC4B9, 0x9D4F, 0xC4BA, 0x9D50, 0xC4BB, 0x9D51, + 0xC4BC, 0xBEB0, 0xC4BD, 0x9D52, 0xC4BE, 0x9D53, 0xC4BF, 0x9D54, + 0xC4C0, 0x9D55, 0xC4C1, 0x9D56, 0xC4C2, 0x9D57, 0xC4C3, 0x9D58, + 0xC4C4, 0x9D59, 0xC4C5, 0x9D5A, 0xC4C6, 0x9D61, 0xC4C7, 0x9D62, + 0xC4C8, 0x9D63, 0xC4C9, 0x9D64, 0xC4CA, 0x9D65, 0xC4CB, 0x9D66, + 0xC4CC, 0x9D67, 0xC4CD, 0x9D68, 0xC4CE, 0x9D69, 0xC4CF, 0x9D6A, + 0xC4D0, 0x9D6B, 0xC4D1, 0x9D6C, 0xC4D2, 0x9D6D, 0xC4D3, 0x9D6E, + 0xC4D4, 0x9D6F, 0xC4D5, 0x9D70, 0xC4D6, 0x9D71, 0xC4D7, 0x9D72, + 0xC4D8, 0x9D73, 0xC4D9, 0x9D74, 0xC4DA, 0x9D75, 0xC4DB, 0x9D76, + 0xC4DC, 0x9D77, 0xC4DD, 0x9D78, 0xC4DE, 0x9D79, 0xC4DF, 0x9D7A, + 0xC4E0, 0x9D81, 0xC4E1, 0x9D82, 0xC4E2, 0x9D83, 0xC4E3, 0x9D84, + 0xC4E4, 0x9D85, 0xC4E5, 0x9D86, 0xC4E6, 0x9D87, 0xC4E7, 0x9D88, + 0xC4E8, 0x9D89, 0xC4E9, 0xBEB1, 0xC4EA, 0x9D8A, 0xC4EB, 0x9D8B, + 0xC4EC, 0x9D8C, 0xC4ED, 0x9D8D, 0xC4EE, 0x9D8E, 0xC4EF, 0x9D8F, + 0xC4F0, 0xBEB2, 0xC4F1, 0xBEB3, 0xC4F2, 0x9D90, 0xC4F3, 0x9D91, + 0xC4F4, 0xBEB4, 0xC4F5, 0x9D92, 0xC4F6, 0x9D93, 0xC4F7, 0x9D94, + 0xC4F8, 0xBEB5, 0xC4F9, 0x9D95, 0xC4FA, 0xBEB6, 0xC4FB, 0x9D96, + 0xC4FC, 0x9D97, 0xC4FD, 0x9D98, 0xC4FE, 0x9D99, 0xC4FF, 0xBEB7, + 0xC500, 0xBEB8, 0xC501, 0xBEB9, 0xC502, 0x9D9A, 0xC503, 0x9D9B, + 0xC504, 0x9D9C, 0xC505, 0x9D9D, 0xC506, 0x9D9E, 0xC507, 0x9D9F, + 0xC508, 0x9DA0, 0xC509, 0x9DA1, 0xC50A, 0x9DA2, 0xC50B, 0x9DA3, + 0xC50C, 0xBEBA, 0xC50D, 0x9DA4, 0xC50E, 0x9DA5, 0xC50F, 0x9DA6, + 0xC510, 0xBEBB, 0xC511, 0x9DA7, 0xC512, 0x9DA8, 0xC513, 0x9DA9, + 0xC514, 0xBEBC, 0xC515, 0x9DAA, 0xC516, 0x9DAB, 0xC517, 0x9DAC, + 0xC518, 0x9DAD, 0xC519, 0x9DAE, 0xC51A, 0x9DAF, 0xC51B, 0x9DB0, + 0xC51C, 0xBEBD, 0xC51D, 0x9DB1, 0xC51E, 0x9DB2, 0xC51F, 0x9DB3, + 0xC520, 0x9DB4, 0xC521, 0x9DB5, 0xC522, 0x9DB6, 0xC523, 0x9DB7, + 0xC524, 0x9DB8, 0xC525, 0x9DB9, 0xC526, 0x9DBA, 0xC527, 0x9DBB, + 0xC528, 0xBEBE, 0xC529, 0xBEBF, 0xC52A, 0x9DBC, 0xC52B, 0x9DBD, + 0xC52C, 0xBEC0, 0xC52D, 0x9DBE, 0xC52E, 0x9DBF, 0xC52F, 0x9DC0, + 0xC530, 0xBEC1, 0xC531, 0x9DC1, 0xC532, 0x9DC2, 0xC533, 0x9DC3, + 0xC534, 0x9DC4, 0xC535, 0x9DC5, 0xC536, 0x9DC6, 0xC537, 0x9DC7, + 0xC538, 0xBEC2, 0xC539, 0xBEC3, 0xC53A, 0x9DC8, 0xC53B, 0xBEC4, + 0xC53C, 0x9DC9, 0xC53D, 0xBEC5, 0xC53E, 0x9DCA, 0xC53F, 0x9DCB, + 0xC540, 0x9DCC, 0xC541, 0x9DCD, 0xC542, 0x9DCE, 0xC543, 0x9DCF, + 0xC544, 0xBEC6, 0xC545, 0xBEC7, 0xC546, 0x9DD0, 0xC547, 0x9DD1, + 0xC548, 0xBEC8, 0xC549, 0xBEC9, 0xC54A, 0xBECA, 0xC54B, 0x9DD2, + 0xC54C, 0xBECB, 0xC54D, 0xBECC, 0xC54E, 0xBECD, 0xC54F, 0x9DD3, + 0xC550, 0x9DD4, 0xC551, 0x9DD5, 0xC552, 0x9DD6, 0xC553, 0xBECE, + 0xC554, 0xBECF, 0xC555, 0xBED0, 0xC556, 0x9DD7, 0xC557, 0xBED1, + 0xC558, 0xBED2, 0xC559, 0xBED3, 0xC55A, 0x9DD8, 0xC55B, 0x9DD9, + 0xC55C, 0x9DDA, 0xC55D, 0xBED4, 0xC55E, 0xBED5, 0xC55F, 0x9DDB, + 0xC560, 0xBED6, 0xC561, 0xBED7, 0xC562, 0x9DDC, 0xC563, 0x9DDD, + 0xC564, 0xBED8, 0xC565, 0x9DDE, 0xC566, 0x9DDF, 0xC567, 0x9DE0, + 0xC568, 0xBED9, 0xC569, 0x9DE1, 0xC56A, 0x9DE2, 0xC56B, 0x9DE3, + 0xC56C, 0x9DE4, 0xC56D, 0x9DE5, 0xC56E, 0x9DE6, 0xC56F, 0x9DE7, + 0xC570, 0xBEDA, 0xC571, 0xBEDB, 0xC572, 0x9DE8, 0xC573, 0xBEDC, + 0xC574, 0xBEDD, 0xC575, 0xBEDE, 0xC576, 0x9DE9, 0xC577, 0x9DEA, + 0xC578, 0x9DEB, 0xC579, 0x9DEC, 0xC57A, 0x9DED, 0xC57B, 0x9DEE, + 0xC57C, 0xBEDF, 0xC57D, 0xBEE0, 0xC57E, 0x9DEF, 0xC57F, 0x9DF0, + 0xC580, 0xBEE1, 0xC581, 0x9DF1, 0xC582, 0x9DF2, 0xC583, 0x9DF3, + 0xC584, 0xBEE2, 0xC585, 0x9DF4, 0xC586, 0x9DF5, 0xC587, 0xBEE3, + 0xC588, 0x9DF6, 0xC589, 0x9DF7, 0xC58A, 0x9DF8, 0xC58B, 0x9DF9, + 0xC58C, 0xBEE4, 0xC58D, 0xBEE5, 0xC58E, 0x9DFA, 0xC58F, 0xBEE6, + 0xC590, 0x9DFB, 0xC591, 0xBEE7, 0xC592, 0x9DFC, 0xC593, 0x9DFD, + 0xC594, 0x9DFE, 0xC595, 0xBEE8, 0xC596, 0x9E41, 0xC597, 0xBEE9, + 0xC598, 0xBEEA, 0xC599, 0x9E42, 0xC59A, 0x9E43, 0xC59B, 0x9E44, + 0xC59C, 0xBEEB, 0xC59D, 0x9E45, 0xC59E, 0x9E46, 0xC59F, 0x9E47, + 0xC5A0, 0xBEEC, 0xC5A1, 0x9E48, 0xC5A2, 0x9E49, 0xC5A3, 0x9E4A, + 0xC5A4, 0x9E4B, 0xC5A5, 0x9E4C, 0xC5A6, 0x9E4D, 0xC5A7, 0x9E4E, + 0xC5A8, 0x9E4F, 0xC5A9, 0xBEED, 0xC5AA, 0x9E50, 0xC5AB, 0x9E51, + 0xC5AC, 0x9E52, 0xC5AD, 0x9E53, 0xC5AE, 0x9E54, 0xC5AF, 0x9E55, + 0xC5B0, 0x9E56, 0xC5B1, 0x9E57, 0xC5B2, 0x9E58, 0xC5B3, 0x9E59, + 0xC5B4, 0xBEEE, 0xC5B5, 0xBEEF, 0xC5B6, 0x9E5A, 0xC5B7, 0x9E61, + 0xC5B8, 0xBEF0, 0xC5B9, 0xBEF1, 0xC5BA, 0x9E62, 0xC5BB, 0xBEF2, + 0xC5BC, 0xBEF3, 0xC5BD, 0xBEF4, 0xC5BE, 0xBEF5, 0xC5BF, 0x9E63, + 0xC5C0, 0x9E64, 0xC5C1, 0x9E65, 0xC5C2, 0x9E66, 0xC5C3, 0x9E67, + 0xC5C4, 0xBEF6, 0xC5C5, 0xBEF7, 0xC5C6, 0xBEF8, 0xC5C7, 0xBEF9, + 0xC5C8, 0xBEFA, 0xC5C9, 0xBEFB, 0xC5CA, 0xBEFC, 0xC5CB, 0x9E68, + 0xC5CC, 0xBEFD, 0xC5CD, 0x9E69, 0xC5CE, 0xBEFE, 0xC5CF, 0x9E6A, + 0xC5D0, 0xBFA1, 0xC5D1, 0xBFA2, 0xC5D2, 0x9E6B, 0xC5D3, 0x9E6C, + 0xC5D4, 0xBFA3, 0xC5D5, 0x9E6D, 0xC5D6, 0x9E6E, 0xC5D7, 0x9E6F, + 0xC5D8, 0xBFA4, 0xC5D9, 0x9E70, 0xC5DA, 0x9E71, 0xC5DB, 0x9E72, + 0xC5DC, 0x9E73, 0xC5DD, 0x9E74, 0xC5DE, 0x9E75, 0xC5DF, 0x9E76, + 0xC5E0, 0xBFA5, 0xC5E1, 0xBFA6, 0xC5E2, 0x9E77, 0xC5E3, 0xBFA7, + 0xC5E4, 0x9E78, 0xC5E5, 0xBFA8, 0xC5E6, 0x9E79, 0xC5E7, 0x9E7A, + 0xC5E8, 0x9E81, 0xC5E9, 0x9E82, 0xC5EA, 0x9E83, 0xC5EB, 0x9E84, + 0xC5EC, 0xBFA9, 0xC5ED, 0xBFAA, 0xC5EE, 0xBFAB, 0xC5EF, 0x9E85, + 0xC5F0, 0xBFAC, 0xC5F1, 0x9E86, 0xC5F2, 0x9E87, 0xC5F3, 0x9E88, + 0xC5F4, 0xBFAD, 0xC5F5, 0x9E89, 0xC5F6, 0xBFAE, 0xC5F7, 0xBFAF, + 0xC5F8, 0x9E8A, 0xC5F9, 0x9E8B, 0xC5FA, 0x9E8C, 0xC5FB, 0x9E8D, + 0xC5FC, 0xBFB0, 0xC5FD, 0xBFB1, 0xC5FE, 0xBFB2, 0xC5FF, 0xBFB3, + 0xC600, 0xBFB4, 0xC601, 0xBFB5, 0xC602, 0x9E8E, 0xC603, 0x9E8F, + 0xC604, 0x9E90, 0xC605, 0xBFB6, 0xC606, 0xBFB7, 0xC607, 0xBFB8, + 0xC608, 0xBFB9, 0xC609, 0x9E91, 0xC60A, 0x9E92, 0xC60B, 0x9E93, + 0xC60C, 0xBFBA, 0xC60D, 0x9E94, 0xC60E, 0x9E95, 0xC60F, 0x9E96, + 0xC610, 0xBFBB, 0xC611, 0x9E97, 0xC612, 0x9E98, 0xC613, 0x9E99, + 0xC614, 0x9E9A, 0xC615, 0x9E9B, 0xC616, 0x9E9C, 0xC617, 0x9E9D, + 0xC618, 0xBFBC, 0xC619, 0xBFBD, 0xC61A, 0x9E9E, 0xC61B, 0xBFBE, + 0xC61C, 0xBFBF, 0xC61D, 0x9E9F, 0xC61E, 0x9EA0, 0xC61F, 0x9EA1, + 0xC620, 0x9EA2, 0xC621, 0x9EA3, 0xC622, 0x9EA4, 0xC623, 0x9EA5, + 0xC624, 0xBFC0, 0xC625, 0xBFC1, 0xC626, 0x9EA6, 0xC627, 0x9EA7, + 0xC628, 0xBFC2, 0xC629, 0x9EA8, 0xC62A, 0x9EA9, 0xC62B, 0x9EAA, + 0xC62C, 0xBFC3, 0xC62D, 0xBFC4, 0xC62E, 0xBFC5, 0xC62F, 0x9EAB, + 0xC630, 0xBFC6, 0xC631, 0x9EAC, 0xC632, 0x9EAD, 0xC633, 0xBFC7, + 0xC634, 0xBFC8, 0xC635, 0xBFC9, 0xC636, 0x9EAE, 0xC637, 0xBFCA, + 0xC638, 0x9EAF, 0xC639, 0xBFCB, 0xC63A, 0x9EB0, 0xC63B, 0xBFCC, + 0xC63C, 0x9EB1, 0xC63D, 0x9EB2, 0xC63E, 0x9EB3, 0xC63F, 0x9EB4, + 0xC640, 0xBFCD, 0xC641, 0xBFCE, 0xC642, 0x9EB5, 0xC643, 0x9EB6, + 0xC644, 0xBFCF, 0xC645, 0x9EB7, 0xC646, 0x9EB8, 0xC647, 0x9EB9, + 0xC648, 0xBFD0, 0xC649, 0x9EBA, 0xC64A, 0x9EBB, 0xC64B, 0x9EBC, + 0xC64C, 0x9EBD, 0xC64D, 0x9EBE, 0xC64E, 0x9EBF, 0xC64F, 0x9EC0, + 0xC650, 0xBFD1, 0xC651, 0xBFD2, 0xC652, 0x9EC1, 0xC653, 0xBFD3, + 0xC654, 0xBFD4, 0xC655, 0xBFD5, 0xC656, 0x9EC2, 0xC657, 0x9EC3, + 0xC658, 0x9EC4, 0xC659, 0x9EC5, 0xC65A, 0x9EC6, 0xC65B, 0x9EC7, + 0xC65C, 0xBFD6, 0xC65D, 0xBFD7, 0xC65E, 0x9EC8, 0xC65F, 0x9EC9, + 0xC660, 0xBFD8, 0xC661, 0x9ECA, 0xC662, 0x9ECB, 0xC663, 0x9ECC, + 0xC664, 0x9ECD, 0xC665, 0x9ECE, 0xC666, 0x9ECF, 0xC667, 0x9ED0, + 0xC668, 0x9ED1, 0xC669, 0x9ED2, 0xC66A, 0x9ED3, 0xC66B, 0x9ED4, + 0xC66C, 0xBFD9, 0xC66D, 0x9ED5, 0xC66E, 0x9ED6, 0xC66F, 0xBFDA, + 0xC670, 0x9ED7, 0xC671, 0xBFDB, 0xC672, 0x9ED8, 0xC673, 0x9ED9, + 0xC674, 0x9EDA, 0xC675, 0x9EDB, 0xC676, 0x9EDC, 0xC677, 0x9EDD, + 0xC678, 0xBFDC, 0xC679, 0xBFDD, 0xC67A, 0x9EDE, 0xC67B, 0x9EDF, + 0xC67C, 0xBFDE, 0xC67D, 0x9EE0, 0xC67E, 0x9EE1, 0xC67F, 0x9EE2, + 0xC680, 0xBFDF, 0xC681, 0x9EE3, 0xC682, 0x9EE4, 0xC683, 0x9EE5, + 0xC684, 0x9EE6, 0xC685, 0x9EE7, 0xC686, 0x9EE8, 0xC687, 0x9EE9, + 0xC688, 0xBFE0, 0xC689, 0xBFE1, 0xC68A, 0x9EEA, 0xC68B, 0xBFE2, + 0xC68C, 0x9EEB, 0xC68D, 0xBFE3, 0xC68E, 0x9EEC, 0xC68F, 0x9EED, + 0xC690, 0x9EEE, 0xC691, 0x9EEF, 0xC692, 0x9EF0, 0xC693, 0x9EF1, + 0xC694, 0xBFE4, 0xC695, 0xBFE5, 0xC696, 0x9EF2, 0xC697, 0x9EF3, + 0xC698, 0xBFE6, 0xC699, 0x9EF4, 0xC69A, 0x9EF5, 0xC69B, 0x9EF6, + 0xC69C, 0xBFE7, 0xC69D, 0x9EF7, 0xC69E, 0x9EF8, 0xC69F, 0x9EF9, + 0xC6A0, 0x9EFA, 0xC6A1, 0x9EFB, 0xC6A2, 0x9EFC, 0xC6A3, 0x9EFD, + 0xC6A4, 0xBFE8, 0xC6A5, 0xBFE9, 0xC6A6, 0x9EFE, 0xC6A7, 0xBFEA, + 0xC6A8, 0x9F41, 0xC6A9, 0xBFEB, 0xC6AA, 0x9F42, 0xC6AB, 0x9F43, + 0xC6AC, 0x9F44, 0xC6AD, 0x9F45, 0xC6AE, 0x9F46, 0xC6AF, 0x9F47, + 0xC6B0, 0xBFEC, 0xC6B1, 0xBFED, 0xC6B2, 0x9F48, 0xC6B3, 0x9F49, + 0xC6B4, 0xBFEE, 0xC6B5, 0x9F4A, 0xC6B6, 0x9F4B, 0xC6B7, 0x9F4C, + 0xC6B8, 0xBFEF, 0xC6B9, 0xBFF0, 0xC6BA, 0xBFF1, 0xC6BB, 0x9F4D, + 0xC6BC, 0x9F4E, 0xC6BD, 0x9F4F, 0xC6BE, 0x9F50, 0xC6BF, 0x9F51, + 0xC6C0, 0xBFF2, 0xC6C1, 0xBFF3, 0xC6C2, 0x9F52, 0xC6C3, 0xBFF4, + 0xC6C4, 0x9F53, 0xC6C5, 0xBFF5, 0xC6C6, 0x9F54, 0xC6C7, 0x9F55, + 0xC6C8, 0x9F56, 0xC6C9, 0x9F57, 0xC6CA, 0x9F58, 0xC6CB, 0x9F59, + 0xC6CC, 0xBFF6, 0xC6CD, 0xBFF7, 0xC6CE, 0x9F5A, 0xC6CF, 0x9F61, + 0xC6D0, 0xBFF8, 0xC6D1, 0x9F62, 0xC6D2, 0x9F63, 0xC6D3, 0x9F64, + 0xC6D4, 0xBFF9, 0xC6D5, 0x9F65, 0xC6D6, 0x9F66, 0xC6D7, 0x9F67, + 0xC6D8, 0x9F68, 0xC6D9, 0x9F69, 0xC6DA, 0x9F6A, 0xC6DB, 0x9F6B, + 0xC6DC, 0xBFFA, 0xC6DD, 0xBFFB, 0xC6DE, 0x9F6C, 0xC6DF, 0x9F6D, + 0xC6E0, 0xBFFC, 0xC6E1, 0xBFFD, 0xC6E2, 0x9F6E, 0xC6E3, 0x9F6F, + 0xC6E4, 0x9F70, 0xC6E5, 0x9F71, 0xC6E6, 0x9F72, 0xC6E7, 0x9F73, + 0xC6E8, 0xBFFE, 0xC6E9, 0xC0A1, 0xC6EA, 0x9F74, 0xC6EB, 0x9F75, + 0xC6EC, 0xC0A2, 0xC6ED, 0x9F76, 0xC6EE, 0x9F77, 0xC6EF, 0x9F78, + 0xC6F0, 0xC0A3, 0xC6F1, 0x9F79, 0xC6F2, 0x9F7A, 0xC6F3, 0x9F81, + 0xC6F4, 0x9F82, 0xC6F5, 0x9F83, 0xC6F6, 0x9F84, 0xC6F7, 0x9F85, + 0xC6F8, 0xC0A4, 0xC6F9, 0xC0A5, 0xC6FA, 0x9F86, 0xC6FB, 0x9F87, + 0xC6FC, 0x9F88, 0xC6FD, 0xC0A6, 0xC6FE, 0x9F89, 0xC6FF, 0x9F8A, + 0xC700, 0x9F8B, 0xC701, 0x9F8C, 0xC702, 0x9F8D, 0xC703, 0x9F8E, + 0xC704, 0xC0A7, 0xC705, 0xC0A8, 0xC706, 0x9F8F, 0xC707, 0x9F90, + 0xC708, 0xC0A9, 0xC709, 0x9F91, 0xC70A, 0x9F92, 0xC70B, 0x9F93, + 0xC70C, 0xC0AA, 0xC70D, 0x9F94, 0xC70E, 0x9F95, 0xC70F, 0x9F96, + 0xC710, 0x9F97, 0xC711, 0x9F98, 0xC712, 0x9F99, 0xC713, 0x9F9A, + 0xC714, 0xC0AB, 0xC715, 0xC0AC, 0xC716, 0x9F9B, 0xC717, 0xC0AD, + 0xC718, 0x9F9C, 0xC719, 0xC0AE, 0xC71A, 0x9F9D, 0xC71B, 0x9F9E, + 0xC71C, 0x9F9F, 0xC71D, 0x9FA0, 0xC71E, 0x9FA1, 0xC71F, 0x9FA2, + 0xC720, 0xC0AF, 0xC721, 0xC0B0, 0xC722, 0x9FA3, 0xC723, 0x9FA4, + 0xC724, 0xC0B1, 0xC725, 0x9FA5, 0xC726, 0x9FA6, 0xC727, 0x9FA7, + 0xC728, 0xC0B2, 0xC729, 0x9FA8, 0xC72A, 0x9FA9, 0xC72B, 0x9FAA, + 0xC72C, 0x9FAB, 0xC72D, 0x9FAC, 0xC72E, 0x9FAD, 0xC72F, 0x9FAE, + 0xC730, 0xC0B3, 0xC731, 0xC0B4, 0xC732, 0x9FAF, 0xC733, 0xC0B5, + 0xC734, 0x9FB0, 0xC735, 0xC0B6, 0xC736, 0x9FB1, 0xC737, 0xC0B7, + 0xC738, 0x9FB2, 0xC739, 0x9FB3, 0xC73A, 0x9FB4, 0xC73B, 0x9FB5, + 0xC73C, 0xC0B8, 0xC73D, 0xC0B9, 0xC73E, 0x9FB6, 0xC73F, 0x9FB7, + 0xC740, 0xC0BA, 0xC741, 0x9FB8, 0xC742, 0x9FB9, 0xC743, 0x9FBA, + 0xC744, 0xC0BB, 0xC745, 0x9FBB, 0xC746, 0x9FBC, 0xC747, 0x9FBD, + 0xC748, 0x9FBE, 0xC749, 0x9FBF, 0xC74A, 0xC0BC, 0xC74B, 0x9FC0, + 0xC74C, 0xC0BD, 0xC74D, 0xC0BE, 0xC74E, 0x9FC1, 0xC74F, 0xC0BF, + 0xC750, 0x9FC2, 0xC751, 0xC0C0, 0xC752, 0xC0C1, 0xC753, 0xC0C2, + 0xC754, 0xC0C3, 0xC755, 0xC0C4, 0xC756, 0xC0C5, 0xC757, 0xC0C6, + 0xC758, 0xC0C7, 0xC759, 0x9FC3, 0xC75A, 0x9FC4, 0xC75B, 0x9FC5, + 0xC75C, 0xC0C8, 0xC75D, 0x9FC6, 0xC75E, 0x9FC7, 0xC75F, 0x9FC8, + 0xC760, 0xC0C9, 0xC761, 0x9FC9, 0xC762, 0x9FCA, 0xC763, 0x9FCB, + 0xC764, 0x9FCC, 0xC765, 0x9FCD, 0xC766, 0x9FCE, 0xC767, 0x9FCF, + 0xC768, 0xC0CA, 0xC769, 0x9FD0, 0xC76A, 0x9FD1, 0xC76B, 0xC0CB, + 0xC76C, 0x9FD2, 0xC76D, 0x9FD3, 0xC76E, 0x9FD4, 0xC76F, 0x9FD5, + 0xC770, 0x9FD6, 0xC771, 0x9FD7, 0xC772, 0x9FD8, 0xC773, 0x9FD9, + 0xC774, 0xC0CC, 0xC775, 0xC0CD, 0xC776, 0x9FDA, 0xC777, 0x9FDB, + 0xC778, 0xC0CE, 0xC779, 0x9FDC, 0xC77A, 0x9FDD, 0xC77B, 0x9FDE, + 0xC77C, 0xC0CF, 0xC77D, 0xC0D0, 0xC77E, 0xC0D1, 0xC77F, 0x9FDF, + 0xC780, 0x9FE0, 0xC781, 0x9FE1, 0xC782, 0x9FE2, 0xC783, 0xC0D2, + 0xC784, 0xC0D3, 0xC785, 0xC0D4, 0xC786, 0x9FE3, 0xC787, 0xC0D5, + 0xC788, 0xC0D6, 0xC789, 0xC0D7, 0xC78A, 0xC0D8, 0xC78B, 0x9FE4, + 0xC78C, 0x9FE5, 0xC78D, 0x9FE6, 0xC78E, 0xC0D9, 0xC78F, 0x9FE7, + 0xC790, 0xC0DA, 0xC791, 0xC0DB, 0xC792, 0x9FE8, 0xC793, 0x9FE9, + 0xC794, 0xC0DC, 0xC795, 0x9FEA, 0xC796, 0xC0DD, 0xC797, 0xC0DE, + 0xC798, 0xC0DF, 0xC799, 0x9FEB, 0xC79A, 0xC0E0, 0xC79B, 0x9FEC, + 0xC79C, 0x9FED, 0xC79D, 0x9FEE, 0xC79E, 0x9FEF, 0xC79F, 0x9FF0, + 0xC7A0, 0xC0E1, 0xC7A1, 0xC0E2, 0xC7A2, 0x9FF1, 0xC7A3, 0xC0E3, + 0xC7A4, 0xC0E4, 0xC7A5, 0xC0E5, 0xC7A6, 0xC0E6, 0xC7A7, 0x9FF2, + 0xC7A8, 0x9FF3, 0xC7A9, 0x9FF4, 0xC7AA, 0x9FF5, 0xC7AB, 0x9FF6, + 0xC7AC, 0xC0E7, 0xC7AD, 0xC0E8, 0xC7AE, 0x9FF7, 0xC7AF, 0x9FF8, + 0xC7B0, 0xC0E9, 0xC7B1, 0x9FF9, 0xC7B2, 0x9FFA, 0xC7B3, 0x9FFB, + 0xC7B4, 0xC0EA, 0xC7B5, 0x9FFC, 0xC7B6, 0x9FFD, 0xC7B7, 0x9FFE, + 0xC7B8, 0xA041, 0xC7B9, 0xA042, 0xC7BA, 0xA043, 0xC7BB, 0xA044, + 0xC7BC, 0xC0EB, 0xC7BD, 0xC0EC, 0xC7BE, 0xA045, 0xC7BF, 0xC0ED, + 0xC7C0, 0xC0EE, 0xC7C1, 0xC0EF, 0xC7C2, 0xA046, 0xC7C3, 0xA047, + 0xC7C4, 0xA048, 0xC7C5, 0xA049, 0xC7C6, 0xA04A, 0xC7C7, 0xA04B, + 0xC7C8, 0xC0F0, 0xC7C9, 0xC0F1, 0xC7CA, 0xA04C, 0xC7CB, 0xA04D, + 0xC7CC, 0xC0F2, 0xC7CD, 0xA04E, 0xC7CE, 0xC0F3, 0xC7CF, 0xA04F, + 0xC7D0, 0xC0F4, 0xC7D1, 0xA050, 0xC7D2, 0xA051, 0xC7D3, 0xA052, + 0xC7D4, 0xA053, 0xC7D5, 0xA054, 0xC7D6, 0xA055, 0xC7D7, 0xA056, + 0xC7D8, 0xC0F5, 0xC7D9, 0xA057, 0xC7DA, 0xA058, 0xC7DB, 0xA059, + 0xC7DC, 0xA05A, 0xC7DD, 0xC0F6, 0xC7DE, 0xA061, 0xC7DF, 0xA062, + 0xC7E0, 0xA063, 0xC7E1, 0xA064, 0xC7E2, 0xA065, 0xC7E3, 0xA066, + 0xC7E4, 0xC0F7, 0xC7E5, 0xA067, 0xC7E6, 0xA068, 0xC7E7, 0xA069, + 0xC7E8, 0xC0F8, 0xC7E9, 0xA06A, 0xC7EA, 0xA06B, 0xC7EB, 0xA06C, + 0xC7EC, 0xC0F9, 0xC7ED, 0xA06D, 0xC7EE, 0xA06E, 0xC7EF, 0xA06F, + 0xC7F0, 0xA070, 0xC7F1, 0xA071, 0xC7F2, 0xA072, 0xC7F3, 0xA073, + 0xC7F4, 0xA074, 0xC7F5, 0xA075, 0xC7F6, 0xA076, 0xC7F7, 0xA077, + 0xC7F8, 0xA078, 0xC7F9, 0xA079, 0xC7FA, 0xA07A, 0xC7FB, 0xA081, + 0xC7FC, 0xA082, 0xC7FD, 0xA083, 0xC7FE, 0xA084, 0xC7FF, 0xA085, + 0xC800, 0xC0FA, 0xC801, 0xC0FB, 0xC802, 0xA086, 0xC803, 0xA087, + 0xC804, 0xC0FC, 0xC805, 0xA088, 0xC806, 0xA089, 0xC807, 0xA08A, + 0xC808, 0xC0FD, 0xC809, 0xA08B, 0xC80A, 0xC0FE, 0xC80B, 0xA08C, + 0xC80C, 0xA08D, 0xC80D, 0xA08E, 0xC80E, 0xA08F, 0xC80F, 0xA090, + 0xC810, 0xC1A1, 0xC811, 0xC1A2, 0xC812, 0xA091, 0xC813, 0xC1A3, + 0xC814, 0xA092, 0xC815, 0xC1A4, 0xC816, 0xC1A5, 0xC817, 0xA093, + 0xC818, 0xA094, 0xC819, 0xA095, 0xC81A, 0xA096, 0xC81B, 0xA097, + 0xC81C, 0xC1A6, 0xC81D, 0xC1A7, 0xC81E, 0xA098, 0xC81F, 0xA099, + 0xC820, 0xC1A8, 0xC821, 0xA09A, 0xC822, 0xA09B, 0xC823, 0xA09C, + 0xC824, 0xC1A9, 0xC825, 0xA09D, 0xC826, 0xA09E, 0xC827, 0xA09F, + 0xC828, 0xA0A0, 0xC829, 0xA0A1, 0xC82A, 0xA0A2, 0xC82B, 0xA0A3, + 0xC82C, 0xC1AA, 0xC82D, 0xC1AB, 0xC82E, 0xA0A4, 0xC82F, 0xC1AC, + 0xC830, 0xA0A5, 0xC831, 0xC1AD, 0xC832, 0xA0A6, 0xC833, 0xA0A7, + 0xC834, 0xA0A8, 0xC835, 0xA0A9, 0xC836, 0xA0AA, 0xC837, 0xA0AB, + 0xC838, 0xC1AE, 0xC839, 0xA0AC, 0xC83A, 0xA0AD, 0xC83B, 0xA0AE, + 0xC83C, 0xC1AF, 0xC83D, 0xA0AF, 0xC83E, 0xA0B0, 0xC83F, 0xA0B1, + 0xC840, 0xC1B0, 0xC841, 0xA0B2, 0xC842, 0xA0B3, 0xC843, 0xA0B4, + 0xC844, 0xA0B5, 0xC845, 0xA0B6, 0xC846, 0xA0B7, 0xC847, 0xA0B8, + 0xC848, 0xC1B1, 0xC849, 0xC1B2, 0xC84A, 0xA0B9, 0xC84B, 0xA0BA, + 0xC84C, 0xC1B3, 0xC84D, 0xC1B4, 0xC84E, 0xA0BB, 0xC84F, 0xA0BC, + 0xC850, 0xA0BD, 0xC851, 0xA0BE, 0xC852, 0xA0BF, 0xC853, 0xA0C0, + 0xC854, 0xC1B5, 0xC855, 0xA0C1, 0xC856, 0xA0C2, 0xC857, 0xA0C3, + 0xC858, 0xA0C4, 0xC859, 0xA0C5, 0xC85A, 0xA0C6, 0xC85B, 0xA0C7, + 0xC85C, 0xA0C8, 0xC85D, 0xA0C9, 0xC85E, 0xA0CA, 0xC85F, 0xA0CB, + 0xC860, 0xA0CC, 0xC861, 0xA0CD, 0xC862, 0xA0CE, 0xC863, 0xA0CF, + 0xC864, 0xA0D0, 0xC865, 0xA0D1, 0xC866, 0xA0D2, 0xC867, 0xA0D3, + 0xC868, 0xA0D4, 0xC869, 0xA0D5, 0xC86A, 0xA0D6, 0xC86B, 0xA0D7, + 0xC86C, 0xA0D8, 0xC86D, 0xA0D9, 0xC86E, 0xA0DA, 0xC86F, 0xA0DB, + 0xC870, 0xC1B6, 0xC871, 0xC1B7, 0xC872, 0xA0DC, 0xC873, 0xA0DD, + 0xC874, 0xC1B8, 0xC875, 0xA0DE, 0xC876, 0xA0DF, 0xC877, 0xA0E0, + 0xC878, 0xC1B9, 0xC879, 0xA0E1, 0xC87A, 0xC1BA, 0xC87B, 0xA0E2, + 0xC87C, 0xA0E3, 0xC87D, 0xA0E4, 0xC87E, 0xA0E5, 0xC87F, 0xA0E6, + 0xC880, 0xC1BB, 0xC881, 0xC1BC, 0xC882, 0xA0E7, 0xC883, 0xC1BD, + 0xC884, 0xA0E8, 0xC885, 0xC1BE, 0xC886, 0xC1BF, 0xC887, 0xC1C0, + 0xC888, 0xA0E9, 0xC889, 0xA0EA, 0xC88A, 0xA0EB, 0xC88B, 0xC1C1, + 0xC88C, 0xC1C2, 0xC88D, 0xC1C3, 0xC88E, 0xA0EC, 0xC88F, 0xA0ED, + 0xC890, 0xA0EE, 0xC891, 0xA0EF, 0xC892, 0xA0F0, 0xC893, 0xA0F1, + 0xC894, 0xC1C4, 0xC895, 0xA0F2, 0xC896, 0xA0F3, 0xC897, 0xA0F4, + 0xC898, 0xA0F5, 0xC899, 0xA0F6, 0xC89A, 0xA0F7, 0xC89B, 0xA0F8, + 0xC89C, 0xA0F9, 0xC89D, 0xC1C5, 0xC89E, 0xA0FA, 0xC89F, 0xC1C6, + 0xC8A0, 0xA0FB, 0xC8A1, 0xC1C7, 0xC8A2, 0xA0FC, 0xC8A3, 0xA0FD, + 0xC8A4, 0xA0FE, 0xC8A5, 0xA141, 0xC8A6, 0xA142, 0xC8A7, 0xA143, + 0xC8A8, 0xC1C8, 0xC8A9, 0xA144, 0xC8AA, 0xA145, 0xC8AB, 0xA146, + 0xC8AC, 0xA147, 0xC8AD, 0xA148, 0xC8AE, 0xA149, 0xC8AF, 0xA14A, + 0xC8B0, 0xA14B, 0xC8B1, 0xA14C, 0xC8B2, 0xA14D, 0xC8B3, 0xA14E, + 0xC8B4, 0xA14F, 0xC8B5, 0xA150, 0xC8B6, 0xA151, 0xC8B7, 0xA152, + 0xC8B8, 0xA153, 0xC8B9, 0xA154, 0xC8BA, 0xA155, 0xC8BB, 0xA156, + 0xC8BC, 0xC1C9, 0xC8BD, 0xC1CA, 0xC8BE, 0xA157, 0xC8BF, 0xA158, + 0xC8C0, 0xA159, 0xC8C1, 0xA15A, 0xC8C2, 0xA161, 0xC8C3, 0xA162, + 0xC8C4, 0xC1CB, 0xC8C5, 0xA163, 0xC8C6, 0xA164, 0xC8C7, 0xA165, + 0xC8C8, 0xC1CC, 0xC8C9, 0xA166, 0xC8CA, 0xA167, 0xC8CB, 0xA168, + 0xC8CC, 0xC1CD, 0xC8CD, 0xA169, 0xC8CE, 0xA16A, 0xC8CF, 0xA16B, + 0xC8D0, 0xA16C, 0xC8D1, 0xA16D, 0xC8D2, 0xA16E, 0xC8D3, 0xA16F, + 0xC8D4, 0xC1CE, 0xC8D5, 0xC1CF, 0xC8D6, 0xA170, 0xC8D7, 0xC1D0, + 0xC8D8, 0xA171, 0xC8D9, 0xC1D1, 0xC8DA, 0xA172, 0xC8DB, 0xA173, + 0xC8DC, 0xA174, 0xC8DD, 0xA175, 0xC8DE, 0xA176, 0xC8DF, 0xA177, + 0xC8E0, 0xC1D2, 0xC8E1, 0xC1D3, 0xC8E2, 0xA178, 0xC8E3, 0xA179, + 0xC8E4, 0xC1D4, 0xC8E5, 0xA17A, 0xC8E6, 0xA181, 0xC8E7, 0xA182, + 0xC8E8, 0xA183, 0xC8E9, 0xA184, 0xC8EA, 0xA185, 0xC8EB, 0xA186, + 0xC8EC, 0xA187, 0xC8ED, 0xA188, 0xC8EE, 0xA189, 0xC8EF, 0xA18A, + 0xC8F0, 0xA18B, 0xC8F1, 0xA18C, 0xC8F2, 0xA18D, 0xC8F3, 0xA18E, + 0xC8F4, 0xA18F, 0xC8F5, 0xC1D5, 0xC8F6, 0xA190, 0xC8F7, 0xA191, + 0xC8F8, 0xA192, 0xC8F9, 0xA193, 0xC8FA, 0xA194, 0xC8FB, 0xA195, + 0xC8FC, 0xC1D6, 0xC8FD, 0xC1D7, 0xC8FE, 0xA196, 0xC8FF, 0xA197, + 0xC900, 0xC1D8, 0xC901, 0xA198, 0xC902, 0xA199, 0xC903, 0xA19A, + 0xC904, 0xC1D9, 0xC905, 0xC1DA, 0xC906, 0xC1DB, 0xC907, 0xA19B, + 0xC908, 0xA19C, 0xC909, 0xA19D, 0xC90A, 0xA19E, 0xC90B, 0xA19F, + 0xC90C, 0xC1DC, 0xC90D, 0xC1DD, 0xC90E, 0xA1A0, 0xC90F, 0xC1DE, + 0xC910, 0xA241, 0xC911, 0xC1DF, 0xC912, 0xA242, 0xC913, 0xA243, + 0xC914, 0xA244, 0xC915, 0xA245, 0xC916, 0xA246, 0xC917, 0xA247, + 0xC918, 0xC1E0, 0xC919, 0xA248, 0xC91A, 0xA249, 0xC91B, 0xA24A, + 0xC91C, 0xA24B, 0xC91D, 0xA24C, 0xC91E, 0xA24D, 0xC91F, 0xA24E, + 0xC920, 0xA24F, 0xC921, 0xA250, 0xC922, 0xA251, 0xC923, 0xA252, + 0xC924, 0xA253, 0xC925, 0xA254, 0xC926, 0xA255, 0xC927, 0xA256, + 0xC928, 0xA257, 0xC929, 0xA258, 0xC92A, 0xA259, 0xC92B, 0xA25A, + 0xC92C, 0xC1E1, 0xC92D, 0xA261, 0xC92E, 0xA262, 0xC92F, 0xA263, + 0xC930, 0xA264, 0xC931, 0xA265, 0xC932, 0xA266, 0xC933, 0xA267, + 0xC934, 0xC1E2, 0xC935, 0xA268, 0xC936, 0xA269, 0xC937, 0xA26A, + 0xC938, 0xA26B, 0xC939, 0xA26C, 0xC93A, 0xA26D, 0xC93B, 0xA26E, + 0xC93C, 0xA26F, 0xC93D, 0xA270, 0xC93E, 0xA271, 0xC93F, 0xA272, + 0xC940, 0xA273, 0xC941, 0xA274, 0xC942, 0xA275, 0xC943, 0xA276, + 0xC944, 0xA277, 0xC945, 0xA278, 0xC946, 0xA279, 0xC947, 0xA27A, + 0xC948, 0xA281, 0xC949, 0xA282, 0xC94A, 0xA283, 0xC94B, 0xA284, + 0xC94C, 0xA285, 0xC94D, 0xA286, 0xC94E, 0xA287, 0xC94F, 0xA288, + 0xC950, 0xC1E3, 0xC951, 0xC1E4, 0xC952, 0xA289, 0xC953, 0xA28A, + 0xC954, 0xC1E5, 0xC955, 0xA28B, 0xC956, 0xA28C, 0xC957, 0xA28D, + 0xC958, 0xC1E6, 0xC959, 0xA28E, 0xC95A, 0xA28F, 0xC95B, 0xA290, + 0xC95C, 0xA291, 0xC95D, 0xA292, 0xC95E, 0xA293, 0xC95F, 0xA294, + 0xC960, 0xC1E7, 0xC961, 0xC1E8, 0xC962, 0xA295, 0xC963, 0xC1E9, + 0xC964, 0xA296, 0xC965, 0xA297, 0xC966, 0xA298, 0xC967, 0xA299, + 0xC968, 0xA29A, 0xC969, 0xA29B, 0xC96A, 0xA29C, 0xC96B, 0xA29D, + 0xC96C, 0xC1EA, 0xC96D, 0xA29E, 0xC96E, 0xA29F, 0xC96F, 0xA2A0, + 0xC970, 0xC1EB, 0xC971, 0xA341, 0xC972, 0xA342, 0xC973, 0xA343, + 0xC974, 0xC1EC, 0xC975, 0xA344, 0xC976, 0xA345, 0xC977, 0xA346, + 0xC978, 0xA347, 0xC979, 0xA348, 0xC97A, 0xA349, 0xC97B, 0xA34A, + 0xC97C, 0xC1ED, 0xC97D, 0xA34B, 0xC97E, 0xA34C, 0xC97F, 0xA34D, + 0xC980, 0xA34E, 0xC981, 0xA34F, 0xC982, 0xA350, 0xC983, 0xA351, + 0xC984, 0xA352, 0xC985, 0xA353, 0xC986, 0xA354, 0xC987, 0xA355, + 0xC988, 0xC1EE, 0xC989, 0xC1EF, 0xC98A, 0xA356, 0xC98B, 0xA357, + 0xC98C, 0xC1F0, 0xC98D, 0xA358, 0xC98E, 0xA359, 0xC98F, 0xA35A, + 0xC990, 0xC1F1, 0xC991, 0xA361, 0xC992, 0xA362, 0xC993, 0xA363, + 0xC994, 0xA364, 0xC995, 0xA365, 0xC996, 0xA366, 0xC997, 0xA367, + 0xC998, 0xC1F2, 0xC999, 0xC1F3, 0xC99A, 0xA368, 0xC99B, 0xC1F4, + 0xC99C, 0xA369, 0xC99D, 0xC1F5, 0xC99E, 0xA36A, 0xC99F, 0xA36B, + 0xC9A0, 0xA36C, 0xC9A1, 0xA36D, 0xC9A2, 0xA36E, 0xC9A3, 0xA36F, + 0xC9A4, 0xA370, 0xC9A5, 0xA371, 0xC9A6, 0xA372, 0xC9A7, 0xA373, + 0xC9A8, 0xA374, 0xC9A9, 0xA375, 0xC9AA, 0xA376, 0xC9AB, 0xA377, + 0xC9AC, 0xA378, 0xC9AD, 0xA379, 0xC9AE, 0xA37A, 0xC9AF, 0xA381, + 0xC9B0, 0xA382, 0xC9B1, 0xA383, 0xC9B2, 0xA384, 0xC9B3, 0xA385, + 0xC9B4, 0xA386, 0xC9B5, 0xA387, 0xC9B6, 0xA388, 0xC9B7, 0xA389, + 0xC9B8, 0xA38A, 0xC9B9, 0xA38B, 0xC9BA, 0xA38C, 0xC9BB, 0xA38D, + 0xC9BC, 0xA38E, 0xC9BD, 0xA38F, 0xC9BE, 0xA390, 0xC9BF, 0xA391, + 0xC9C0, 0xC1F6, 0xC9C1, 0xC1F7, 0xC9C2, 0xA392, 0xC9C3, 0xA393, + 0xC9C4, 0xC1F8, 0xC9C5, 0xA394, 0xC9C6, 0xA395, 0xC9C7, 0xC1F9, + 0xC9C8, 0xC1FA, 0xC9C9, 0xA396, 0xC9CA, 0xC1FB, 0xC9CB, 0xA397, + 0xC9CC, 0xA398, 0xC9CD, 0xA399, 0xC9CE, 0xA39A, 0xC9CF, 0xA39B, + 0xC9D0, 0xC1FC, 0xC9D1, 0xC1FD, 0xC9D2, 0xA39C, 0xC9D3, 0xC1FE, + 0xC9D4, 0xA39D, 0xC9D5, 0xC2A1, 0xC9D6, 0xC2A2, 0xC9D7, 0xA39E, + 0xC9D8, 0xA39F, 0xC9D9, 0xC2A3, 0xC9DA, 0xC2A4, 0xC9DB, 0xA3A0, + 0xC9DC, 0xC2A5, 0xC9DD, 0xC2A6, 0xC9DE, 0xA441, 0xC9DF, 0xA442, + 0xC9E0, 0xC2A7, 0xC9E1, 0xA443, 0xC9E2, 0xC2A8, 0xC9E3, 0xA444, + 0xC9E4, 0xC2A9, 0xC9E5, 0xA445, 0xC9E6, 0xA446, 0xC9E7, 0xC2AA, + 0xC9E8, 0xA447, 0xC9E9, 0xA448, 0xC9EA, 0xA449, 0xC9EB, 0xA44A, + 0xC9EC, 0xC2AB, 0xC9ED, 0xC2AC, 0xC9EE, 0xA44B, 0xC9EF, 0xC2AD, + 0xC9F0, 0xC2AE, 0xC9F1, 0xC2AF, 0xC9F2, 0xA44C, 0xC9F3, 0xA44D, + 0xC9F4, 0xA44E, 0xC9F5, 0xA44F, 0xC9F6, 0xA450, 0xC9F7, 0xA451, + 0xC9F8, 0xC2B0, 0xC9F9, 0xC2B1, 0xC9FA, 0xA452, 0xC9FB, 0xA453, + 0xC9FC, 0xC2B2, 0xC9FD, 0xA454, 0xC9FE, 0xA455, 0xC9FF, 0xA456, + 0xCA00, 0xC2B3, 0xCA01, 0xA457, 0xCA02, 0xA458, 0xCA03, 0xA459, + 0xCA04, 0xA45A, 0xCA05, 0xA461, 0xCA06, 0xA462, 0xCA07, 0xA463, + 0xCA08, 0xC2B4, 0xCA09, 0xC2B5, 0xCA0A, 0xA464, 0xCA0B, 0xC2B6, + 0xCA0C, 0xC2B7, 0xCA0D, 0xC2B8, 0xCA0E, 0xA465, 0xCA0F, 0xA466, + 0xCA10, 0xA467, 0xCA11, 0xA468, 0xCA12, 0xA469, 0xCA13, 0xA46A, + 0xCA14, 0xC2B9, 0xCA15, 0xA46B, 0xCA16, 0xA46C, 0xCA17, 0xA46D, + 0xCA18, 0xC2BA, 0xCA19, 0xA46E, 0xCA1A, 0xA46F, 0xCA1B, 0xA470, + 0xCA1C, 0xA471, 0xCA1D, 0xA472, 0xCA1E, 0xA473, 0xCA1F, 0xA474, + 0xCA20, 0xA475, 0xCA21, 0xA476, 0xCA22, 0xA477, 0xCA23, 0xA478, + 0xCA24, 0xA479, 0xCA25, 0xA47A, 0xCA26, 0xA481, 0xCA27, 0xA482, + 0xCA28, 0xA483, 0xCA29, 0xC2BB, 0xCA2A, 0xA484, 0xCA2B, 0xA485, + 0xCA2C, 0xA486, 0xCA2D, 0xA487, 0xCA2E, 0xA488, 0xCA2F, 0xA489, + 0xCA30, 0xA48A, 0xCA31, 0xA48B, 0xCA32, 0xA48C, 0xCA33, 0xA48D, + 0xCA34, 0xA48E, 0xCA35, 0xA48F, 0xCA36, 0xA490, 0xCA37, 0xA491, + 0xCA38, 0xA492, 0xCA39, 0xA493, 0xCA3A, 0xA494, 0xCA3B, 0xA495, + 0xCA3C, 0xA496, 0xCA3D, 0xA497, 0xCA3E, 0xA498, 0xCA3F, 0xA499, + 0xCA40, 0xA49A, 0xCA41, 0xA49B, 0xCA42, 0xA49C, 0xCA43, 0xA49D, + 0xCA44, 0xA49E, 0xCA45, 0xA49F, 0xCA46, 0xA4A0, 0xCA47, 0xA541, + 0xCA48, 0xA542, 0xCA49, 0xA543, 0xCA4A, 0xA544, 0xCA4B, 0xA545, + 0xCA4C, 0xC2BC, 0xCA4D, 0xC2BD, 0xCA4E, 0xA546, 0xCA4F, 0xA547, + 0xCA50, 0xC2BE, 0xCA51, 0xA548, 0xCA52, 0xA549, 0xCA53, 0xA54A, + 0xCA54, 0xC2BF, 0xCA55, 0xA54B, 0xCA56, 0xA54C, 0xCA57, 0xA54D, + 0xCA58, 0xA54E, 0xCA59, 0xA54F, 0xCA5A, 0xA550, 0xCA5B, 0xA551, + 0xCA5C, 0xC2C0, 0xCA5D, 0xC2C1, 0xCA5E, 0xA552, 0xCA5F, 0xC2C2, + 0xCA60, 0xC2C3, 0xCA61, 0xC2C4, 0xCA62, 0xA553, 0xCA63, 0xA554, + 0xCA64, 0xA555, 0xCA65, 0xA556, 0xCA66, 0xA557, 0xCA67, 0xA558, + 0xCA68, 0xC2C5, 0xCA69, 0xA559, 0xCA6A, 0xA55A, 0xCA6B, 0xA561, + 0xCA6C, 0xA562, 0xCA6D, 0xA563, 0xCA6E, 0xA564, 0xCA6F, 0xA565, + 0xCA70, 0xA566, 0xCA71, 0xA567, 0xCA72, 0xA568, 0xCA73, 0xA569, + 0xCA74, 0xA56A, 0xCA75, 0xA56B, 0xCA76, 0xA56C, 0xCA77, 0xA56D, + 0xCA78, 0xA56E, 0xCA79, 0xA56F, 0xCA7A, 0xA570, 0xCA7B, 0xA571, + 0xCA7C, 0xA572, 0xCA7D, 0xC2C6, 0xCA7E, 0xA573, 0xCA7F, 0xA574, + 0xCA80, 0xA575, 0xCA81, 0xA576, 0xCA82, 0xA577, 0xCA83, 0xA578, + 0xCA84, 0xC2C7, 0xCA85, 0xA579, 0xCA86, 0xA57A, 0xCA87, 0xA581, + 0xCA88, 0xA582, 0xCA89, 0xA583, 0xCA8A, 0xA584, 0xCA8B, 0xA585, + 0xCA8C, 0xA586, 0xCA8D, 0xA587, 0xCA8E, 0xA588, 0xCA8F, 0xA589, + 0xCA90, 0xA58A, 0xCA91, 0xA58B, 0xCA92, 0xA58C, 0xCA93, 0xA58D, + 0xCA94, 0xA58E, 0xCA95, 0xA58F, 0xCA96, 0xA590, 0xCA97, 0xA591, + 0xCA98, 0xC2C8, 0xCA99, 0xA592, 0xCA9A, 0xA593, 0xCA9B, 0xA594, + 0xCA9C, 0xA595, 0xCA9D, 0xA596, 0xCA9E, 0xA597, 0xCA9F, 0xA598, + 0xCAA0, 0xA599, 0xCAA1, 0xA59A, 0xCAA2, 0xA59B, 0xCAA3, 0xA59C, + 0xCAA4, 0xA59D, 0xCAA5, 0xA59E, 0xCAA6, 0xA59F, 0xCAA7, 0xA5A0, + 0xCAA8, 0xA641, 0xCAA9, 0xA642, 0xCAAA, 0xA643, 0xCAAB, 0xA644, + 0xCAAC, 0xA645, 0xCAAD, 0xA646, 0xCAAE, 0xA647, 0xCAAF, 0xA648, + 0xCAB0, 0xA649, 0xCAB1, 0xA64A, 0xCAB2, 0xA64B, 0xCAB3, 0xA64C, + 0xCAB4, 0xA64D, 0xCAB5, 0xA64E, 0xCAB6, 0xA64F, 0xCAB7, 0xA650, + 0xCAB8, 0xA651, 0xCAB9, 0xA652, 0xCABA, 0xA653, 0xCABB, 0xA654, + 0xCABC, 0xC2C9, 0xCABD, 0xC2CA, 0xCABE, 0xA655, 0xCABF, 0xA656, + 0xCAC0, 0xC2CB, 0xCAC1, 0xA657, 0xCAC2, 0xA658, 0xCAC3, 0xA659, + 0xCAC4, 0xC2CC, 0xCAC5, 0xA65A, 0xCAC6, 0xA661, 0xCAC7, 0xA662, + 0xCAC8, 0xA663, 0xCAC9, 0xA664, 0xCACA, 0xA665, 0xCACB, 0xA666, + 0xCACC, 0xC2CD, 0xCACD, 0xC2CE, 0xCACE, 0xA667, 0xCACF, 0xC2CF, + 0xCAD0, 0xA668, 0xCAD1, 0xC2D0, 0xCAD2, 0xA669, 0xCAD3, 0xC2D1, + 0xCAD4, 0xA66A, 0xCAD5, 0xA66B, 0xCAD6, 0xA66C, 0xCAD7, 0xA66D, + 0xCAD8, 0xC2D2, 0xCAD9, 0xC2D3, 0xCADA, 0xA66E, 0xCADB, 0xA66F, + 0xCADC, 0xA670, 0xCADD, 0xA671, 0xCADE, 0xA672, 0xCADF, 0xA673, + 0xCAE0, 0xC2D4, 0xCAE1, 0xA674, 0xCAE2, 0xA675, 0xCAE3, 0xA676, + 0xCAE4, 0xA677, 0xCAE5, 0xA678, 0xCAE6, 0xA679, 0xCAE7, 0xA67A, + 0xCAE8, 0xA681, 0xCAE9, 0xA682, 0xCAEA, 0xA683, 0xCAEB, 0xA684, + 0xCAEC, 0xC2D5, 0xCAED, 0xA685, 0xCAEE, 0xA686, 0xCAEF, 0xA687, + 0xCAF0, 0xA688, 0xCAF1, 0xA689, 0xCAF2, 0xA68A, 0xCAF3, 0xA68B, + 0xCAF4, 0xC2D6, 0xCAF5, 0xA68C, 0xCAF6, 0xA68D, 0xCAF7, 0xA68E, + 0xCAF8, 0xA68F, 0xCAF9, 0xA690, 0xCAFA, 0xA691, 0xCAFB, 0xA692, + 0xCAFC, 0xA693, 0xCAFD, 0xA694, 0xCAFE, 0xA695, 0xCAFF, 0xA696, + 0xCB00, 0xA697, 0xCB01, 0xA698, 0xCB02, 0xA699, 0xCB03, 0xA69A, + 0xCB04, 0xA69B, 0xCB05, 0xA69C, 0xCB06, 0xA69D, 0xCB07, 0xA69E, + 0xCB08, 0xC2D7, 0xCB09, 0xA69F, 0xCB0A, 0xA6A0, 0xCB0B, 0xA741, + 0xCB0C, 0xA742, 0xCB0D, 0xA743, 0xCB0E, 0xA744, 0xCB0F, 0xA745, + 0xCB10, 0xC2D8, 0xCB11, 0xA746, 0xCB12, 0xA747, 0xCB13, 0xA748, + 0xCB14, 0xC2D9, 0xCB15, 0xA749, 0xCB16, 0xA74A, 0xCB17, 0xA74B, + 0xCB18, 0xC2DA, 0xCB19, 0xA74C, 0xCB1A, 0xA74D, 0xCB1B, 0xA74E, + 0xCB1C, 0xA74F, 0xCB1D, 0xA750, 0xCB1E, 0xA751, 0xCB1F, 0xA752, + 0xCB20, 0xC2DB, 0xCB21, 0xC2DC, 0xCB22, 0xA753, 0xCB23, 0xA754, + 0xCB24, 0xA755, 0xCB25, 0xA756, 0xCB26, 0xA757, 0xCB27, 0xA758, + 0xCB28, 0xA759, 0xCB29, 0xA75A, 0xCB2A, 0xA761, 0xCB2B, 0xA762, + 0xCB2C, 0xA763, 0xCB2D, 0xA764, 0xCB2E, 0xA765, 0xCB2F, 0xA766, + 0xCB30, 0xA767, 0xCB31, 0xA768, 0xCB32, 0xA769, 0xCB33, 0xA76A, + 0xCB34, 0xA76B, 0xCB35, 0xA76C, 0xCB36, 0xA76D, 0xCB37, 0xA76E, + 0xCB38, 0xA76F, 0xCB39, 0xA770, 0xCB3A, 0xA771, 0xCB3B, 0xA772, + 0xCB3C, 0xA773, 0xCB3D, 0xA774, 0xCB3E, 0xA775, 0xCB3F, 0xA776, + 0xCB40, 0xA777, 0xCB41, 0xC2DD, 0xCB42, 0xA778, 0xCB43, 0xA779, + 0xCB44, 0xA77A, 0xCB45, 0xA781, 0xCB46, 0xA782, 0xCB47, 0xA783, + 0xCB48, 0xC2DE, 0xCB49, 0xC2DF, 0xCB4A, 0xA784, 0xCB4B, 0xA785, + 0xCB4C, 0xC2E0, 0xCB4D, 0xA786, 0xCB4E, 0xA787, 0xCB4F, 0xA788, + 0xCB50, 0xC2E1, 0xCB51, 0xA789, 0xCB52, 0xA78A, 0xCB53, 0xA78B, + 0xCB54, 0xA78C, 0xCB55, 0xA78D, 0xCB56, 0xA78E, 0xCB57, 0xA78F, + 0xCB58, 0xC2E2, 0xCB59, 0xC2E3, 0xCB5A, 0xA790, 0xCB5B, 0xA791, + 0xCB5C, 0xA792, 0xCB5D, 0xC2E4, 0xCB5E, 0xA793, 0xCB5F, 0xA794, + 0xCB60, 0xA795, 0xCB61, 0xA796, 0xCB62, 0xA797, 0xCB63, 0xA798, + 0xCB64, 0xC2E5, 0xCB65, 0xA799, 0xCB66, 0xA79A, 0xCB67, 0xA79B, + 0xCB68, 0xA79C, 0xCB69, 0xA79D, 0xCB6A, 0xA79E, 0xCB6B, 0xA79F, + 0xCB6C, 0xA7A0, 0xCB6D, 0xA841, 0xCB6E, 0xA842, 0xCB6F, 0xA843, + 0xCB70, 0xA844, 0xCB71, 0xA845, 0xCB72, 0xA846, 0xCB73, 0xA847, + 0xCB74, 0xA848, 0xCB75, 0xA849, 0xCB76, 0xA84A, 0xCB77, 0xA84B, + 0xCB78, 0xC2E6, 0xCB79, 0xC2E7, 0xCB7A, 0xA84C, 0xCB7B, 0xA84D, + 0xCB7C, 0xA84E, 0xCB7D, 0xA84F, 0xCB7E, 0xA850, 0xCB7F, 0xA851, + 0xCB80, 0xA852, 0xCB81, 0xA853, 0xCB82, 0xA854, 0xCB83, 0xA855, + 0xCB84, 0xA856, 0xCB85, 0xA857, 0xCB86, 0xA858, 0xCB87, 0xA859, + 0xCB88, 0xA85A, 0xCB89, 0xA861, 0xCB8A, 0xA862, 0xCB8B, 0xA863, + 0xCB8C, 0xA864, 0xCB8D, 0xA865, 0xCB8E, 0xA866, 0xCB8F, 0xA867, + 0xCB90, 0xA868, 0xCB91, 0xA869, 0xCB92, 0xA86A, 0xCB93, 0xA86B, + 0xCB94, 0xA86C, 0xCB95, 0xA86D, 0xCB96, 0xA86E, 0xCB97, 0xA86F, + 0xCB98, 0xA870, 0xCB99, 0xA871, 0xCB9A, 0xA872, 0xCB9B, 0xA873, + 0xCB9C, 0xC2E8, 0xCB9D, 0xA874, 0xCB9E, 0xA875, 0xCB9F, 0xA876, + 0xCBA0, 0xA877, 0xCBA1, 0xA878, 0xCBA2, 0xA879, 0xCBA3, 0xA87A, + 0xCBA4, 0xA881, 0xCBA5, 0xA882, 0xCBA6, 0xA883, 0xCBA7, 0xA884, + 0xCBA8, 0xA885, 0xCBA9, 0xA886, 0xCBAA, 0xA887, 0xCBAB, 0xA888, + 0xCBAC, 0xA889, 0xCBAD, 0xA88A, 0xCBAE, 0xA88B, 0xCBAF, 0xA88C, + 0xCBB0, 0xA88D, 0xCBB1, 0xA88E, 0xCBB2, 0xA88F, 0xCBB3, 0xA890, + 0xCBB4, 0xA891, 0xCBB5, 0xA892, 0xCBB6, 0xA893, 0xCBB7, 0xA894, + 0xCBB8, 0xC2E9, 0xCBB9, 0xA895, 0xCBBA, 0xA896, 0xCBBB, 0xA897, + 0xCBBC, 0xA898, 0xCBBD, 0xA899, 0xCBBE, 0xA89A, 0xCBBF, 0xA89B, + 0xCBC0, 0xA89C, 0xCBC1, 0xA89D, 0xCBC2, 0xA89E, 0xCBC3, 0xA89F, + 0xCBC4, 0xA8A0, 0xCBC5, 0xA941, 0xCBC6, 0xA942, 0xCBC7, 0xA943, + 0xCBC8, 0xA944, 0xCBC9, 0xA945, 0xCBCA, 0xA946, 0xCBCB, 0xA947, + 0xCBCC, 0xA948, 0xCBCD, 0xA949, 0xCBCE, 0xA94A, 0xCBCF, 0xA94B, + 0xCBD0, 0xA94C, 0xCBD1, 0xA94D, 0xCBD2, 0xA94E, 0xCBD3, 0xA94F, + 0xCBD4, 0xC2EA, 0xCBD5, 0xA950, 0xCBD6, 0xA951, 0xCBD7, 0xA952, + 0xCBD8, 0xA953, 0xCBD9, 0xA954, 0xCBDA, 0xA955, 0xCBDB, 0xA956, + 0xCBDC, 0xA957, 0xCBDD, 0xA958, 0xCBDE, 0xA959, 0xCBDF, 0xA95A, + 0xCBE0, 0xA961, 0xCBE1, 0xA962, 0xCBE2, 0xA963, 0xCBE3, 0xA964, + 0xCBE4, 0xC2EB, 0xCBE5, 0xA965, 0xCBE6, 0xA966, 0xCBE7, 0xC2EC, + 0xCBE8, 0xA967, 0xCBE9, 0xC2ED, 0xCBEA, 0xA968, 0xCBEB, 0xA969, + 0xCBEC, 0xA96A, 0xCBED, 0xA96B, 0xCBEE, 0xA96C, 0xCBEF, 0xA96D, + 0xCBF0, 0xA96E, 0xCBF1, 0xA96F, 0xCBF2, 0xA970, 0xCBF3, 0xA971, + 0xCBF4, 0xA972, 0xCBF5, 0xA973, 0xCBF6, 0xA974, 0xCBF7, 0xA975, + 0xCBF8, 0xA976, 0xCBF9, 0xA977, 0xCBFA, 0xA978, 0xCBFB, 0xA979, + 0xCBFC, 0xA97A, 0xCBFD, 0xA981, 0xCBFE, 0xA982, 0xCBFF, 0xA983, + 0xCC00, 0xA984, 0xCC01, 0xA985, 0xCC02, 0xA986, 0xCC03, 0xA987, + 0xCC04, 0xA988, 0xCC05, 0xA989, 0xCC06, 0xA98A, 0xCC07, 0xA98B, + 0xCC08, 0xA98C, 0xCC09, 0xA98D, 0xCC0A, 0xA98E, 0xCC0B, 0xA98F, + 0xCC0C, 0xC2EE, 0xCC0D, 0xC2EF, 0xCC0E, 0xA990, 0xCC0F, 0xA991, + 0xCC10, 0xC2F0, 0xCC11, 0xA992, 0xCC12, 0xA993, 0xCC13, 0xA994, + 0xCC14, 0xC2F1, 0xCC15, 0xA995, 0xCC16, 0xA996, 0xCC17, 0xA997, + 0xCC18, 0xA998, 0xCC19, 0xA999, 0xCC1A, 0xA99A, 0xCC1B, 0xA99B, + 0xCC1C, 0xC2F2, 0xCC1D, 0xC2F3, 0xCC1E, 0xA99C, 0xCC1F, 0xA99D, + 0xCC20, 0xA99E, 0xCC21, 0xC2F4, 0xCC22, 0xC2F5, 0xCC23, 0xA99F, + 0xCC24, 0xA9A0, 0xCC25, 0xAA41, 0xCC26, 0xAA42, 0xCC27, 0xC2F6, + 0xCC28, 0xC2F7, 0xCC29, 0xC2F8, 0xCC2A, 0xAA43, 0xCC2B, 0xAA44, + 0xCC2C, 0xC2F9, 0xCC2D, 0xAA45, 0xCC2E, 0xC2FA, 0xCC2F, 0xAA46, + 0xCC30, 0xC2FB, 0xCC31, 0xAA47, 0xCC32, 0xAA48, 0xCC33, 0xAA49, + 0xCC34, 0xAA4A, 0xCC35, 0xAA4B, 0xCC36, 0xAA4C, 0xCC37, 0xAA4D, + 0xCC38, 0xC2FC, 0xCC39, 0xC2FD, 0xCC3A, 0xAA4E, 0xCC3B, 0xC2FE, + 0xCC3C, 0xC3A1, 0xCC3D, 0xC3A2, 0xCC3E, 0xC3A3, 0xCC3F, 0xAA4F, + 0xCC40, 0xAA50, 0xCC41, 0xAA51, 0xCC42, 0xAA52, 0xCC43, 0xAA53, + 0xCC44, 0xC3A4, 0xCC45, 0xC3A5, 0xCC46, 0xAA54, 0xCC47, 0xAA55, + 0xCC48, 0xC3A6, 0xCC49, 0xAA56, 0xCC4A, 0xAA57, 0xCC4B, 0xAA58, + 0xCC4C, 0xC3A7, 0xCC4D, 0xAA59, 0xCC4E, 0xAA5A, 0xCC4F, 0xAA61, + 0xCC50, 0xAA62, 0xCC51, 0xAA63, 0xCC52, 0xAA64, 0xCC53, 0xAA65, + 0xCC54, 0xC3A8, 0xCC55, 0xC3A9, 0xCC56, 0xAA66, 0xCC57, 0xC3AA, + 0xCC58, 0xC3AB, 0xCC59, 0xC3AC, 0xCC5A, 0xAA67, 0xCC5B, 0xAA68, + 0xCC5C, 0xAA69, 0xCC5D, 0xAA6A, 0xCC5E, 0xAA6B, 0xCC5F, 0xAA6C, + 0xCC60, 0xC3AD, 0xCC61, 0xAA6D, 0xCC62, 0xAA6E, 0xCC63, 0xAA6F, + 0xCC64, 0xC3AE, 0xCC65, 0xAA70, 0xCC66, 0xC3AF, 0xCC67, 0xAA71, + 0xCC68, 0xC3B0, 0xCC69, 0xAA72, 0xCC6A, 0xAA73, 0xCC6B, 0xAA74, + 0xCC6C, 0xAA75, 0xCC6D, 0xAA76, 0xCC6E, 0xAA77, 0xCC6F, 0xAA78, + 0xCC70, 0xC3B1, 0xCC71, 0xAA79, 0xCC72, 0xAA7A, 0xCC73, 0xAA81, + 0xCC74, 0xAA82, 0xCC75, 0xC3B2, 0xCC76, 0xAA83, 0xCC77, 0xAA84, + 0xCC78, 0xAA85, 0xCC79, 0xAA86, 0xCC7A, 0xAA87, 0xCC7B, 0xAA88, + 0xCC7C, 0xAA89, 0xCC7D, 0xAA8A, 0xCC7E, 0xAA8B, 0xCC7F, 0xAA8C, + 0xCC80, 0xAA8D, 0xCC81, 0xAA8E, 0xCC82, 0xAA8F, 0xCC83, 0xAA90, + 0xCC84, 0xAA91, 0xCC85, 0xAA92, 0xCC86, 0xAA93, 0xCC87, 0xAA94, + 0xCC88, 0xAA95, 0xCC89, 0xAA96, 0xCC8A, 0xAA97, 0xCC8B, 0xAA98, + 0xCC8C, 0xAA99, 0xCC8D, 0xAA9A, 0xCC8E, 0xAA9B, 0xCC8F, 0xAA9C, + 0xCC90, 0xAA9D, 0xCC91, 0xAA9E, 0xCC92, 0xAA9F, 0xCC93, 0xAAA0, + 0xCC94, 0xAB41, 0xCC95, 0xAB42, 0xCC96, 0xAB43, 0xCC97, 0xAB44, + 0xCC98, 0xC3B3, 0xCC99, 0xC3B4, 0xCC9A, 0xAB45, 0xCC9B, 0xAB46, + 0xCC9C, 0xC3B5, 0xCC9D, 0xAB47, 0xCC9E, 0xAB48, 0xCC9F, 0xAB49, + 0xCCA0, 0xC3B6, 0xCCA1, 0xAB4A, 0xCCA2, 0xAB4B, 0xCCA3, 0xAB4C, + 0xCCA4, 0xAB4D, 0xCCA5, 0xAB4E, 0xCCA6, 0xAB4F, 0xCCA7, 0xAB50, + 0xCCA8, 0xC3B7, 0xCCA9, 0xC3B8, 0xCCAA, 0xAB51, 0xCCAB, 0xC3B9, + 0xCCAC, 0xC3BA, 0xCCAD, 0xC3BB, 0xCCAE, 0xAB52, 0xCCAF, 0xAB53, + 0xCCB0, 0xAB54, 0xCCB1, 0xAB55, 0xCCB2, 0xAB56, 0xCCB3, 0xAB57, + 0xCCB4, 0xC3BC, 0xCCB5, 0xC3BD, 0xCCB6, 0xAB58, 0xCCB7, 0xAB59, + 0xCCB8, 0xC3BE, 0xCCB9, 0xAB5A, 0xCCBA, 0xAB61, 0xCCBB, 0xAB62, + 0xCCBC, 0xC3BF, 0xCCBD, 0xAB63, 0xCCBE, 0xAB64, 0xCCBF, 0xAB65, + 0xCCC0, 0xAB66, 0xCCC1, 0xAB67, 0xCCC2, 0xAB68, 0xCCC3, 0xAB69, + 0xCCC4, 0xC3C0, 0xCCC5, 0xC3C1, 0xCCC6, 0xAB6A, 0xCCC7, 0xC3C2, + 0xCCC8, 0xAB6B, 0xCCC9, 0xC3C3, 0xCCCA, 0xAB6C, 0xCCCB, 0xAB6D, + 0xCCCC, 0xAB6E, 0xCCCD, 0xAB6F, 0xCCCE, 0xAB70, 0xCCCF, 0xAB71, + 0xCCD0, 0xC3C4, 0xCCD1, 0xAB72, 0xCCD2, 0xAB73, 0xCCD3, 0xAB74, + 0xCCD4, 0xC3C5, 0xCCD5, 0xAB75, 0xCCD6, 0xAB76, 0xCCD7, 0xAB77, + 0xCCD8, 0xAB78, 0xCCD9, 0xAB79, 0xCCDA, 0xAB7A, 0xCCDB, 0xAB81, + 0xCCDC, 0xAB82, 0xCCDD, 0xAB83, 0xCCDE, 0xAB84, 0xCCDF, 0xAB85, + 0xCCE0, 0xAB86, 0xCCE1, 0xAB87, 0xCCE2, 0xAB88, 0xCCE3, 0xAB89, + 0xCCE4, 0xC3C6, 0xCCE5, 0xAB8A, 0xCCE6, 0xAB8B, 0xCCE7, 0xAB8C, + 0xCCE8, 0xAB8D, 0xCCE9, 0xAB8E, 0xCCEA, 0xAB8F, 0xCCEB, 0xAB90, + 0xCCEC, 0xC3C7, 0xCCED, 0xAB91, 0xCCEE, 0xAB92, 0xCCEF, 0xAB93, + 0xCCF0, 0xC3C8, 0xCCF1, 0xAB94, 0xCCF2, 0xAB95, 0xCCF3, 0xAB96, + 0xCCF4, 0xAB97, 0xCCF5, 0xAB98, 0xCCF6, 0xAB99, 0xCCF7, 0xAB9A, + 0xCCF8, 0xAB9B, 0xCCF9, 0xAB9C, 0xCCFA, 0xAB9D, 0xCCFB, 0xAB9E, + 0xCCFC, 0xAB9F, 0xCCFD, 0xABA0, 0xCCFE, 0xAC41, 0xCCFF, 0xAC42, + 0xCD00, 0xAC43, 0xCD01, 0xC3C9, 0xCD02, 0xAC44, 0xCD03, 0xAC45, + 0xCD04, 0xAC46, 0xCD05, 0xAC47, 0xCD06, 0xAC48, 0xCD07, 0xAC49, + 0xCD08, 0xC3CA, 0xCD09, 0xC3CB, 0xCD0A, 0xAC4A, 0xCD0B, 0xAC4B, + 0xCD0C, 0xC3CC, 0xCD0D, 0xAC4C, 0xCD0E, 0xAC4D, 0xCD0F, 0xAC4E, + 0xCD10, 0xC3CD, 0xCD11, 0xAC4F, 0xCD12, 0xAC50, 0xCD13, 0xAC51, + 0xCD14, 0xAC52, 0xCD15, 0xAC53, 0xCD16, 0xAC54, 0xCD17, 0xAC55, + 0xCD18, 0xC3CE, 0xCD19, 0xC3CF, 0xCD1A, 0xAC56, 0xCD1B, 0xC3D0, + 0xCD1C, 0xAC57, 0xCD1D, 0xC3D1, 0xCD1E, 0xAC58, 0xCD1F, 0xAC59, + 0xCD20, 0xAC5A, 0xCD21, 0xAC61, 0xCD22, 0xAC62, 0xCD23, 0xAC63, + 0xCD24, 0xC3D2, 0xCD25, 0xAC64, 0xCD26, 0xAC65, 0xCD27, 0xAC66, + 0xCD28, 0xC3D3, 0xCD29, 0xAC67, 0xCD2A, 0xAC68, 0xCD2B, 0xAC69, + 0xCD2C, 0xC3D4, 0xCD2D, 0xAC6A, 0xCD2E, 0xAC6B, 0xCD2F, 0xAC6C, + 0xCD30, 0xAC6D, 0xCD31, 0xAC6E, 0xCD32, 0xAC6F, 0xCD33, 0xAC70, + 0xCD34, 0xAC71, 0xCD35, 0xAC72, 0xCD36, 0xAC73, 0xCD37, 0xAC74, + 0xCD38, 0xAC75, 0xCD39, 0xC3D5, 0xCD3A, 0xAC76, 0xCD3B, 0xAC77, + 0xCD3C, 0xAC78, 0xCD3D, 0xAC79, 0xCD3E, 0xAC7A, 0xCD3F, 0xAC81, + 0xCD40, 0xAC82, 0xCD41, 0xAC83, 0xCD42, 0xAC84, 0xCD43, 0xAC85, + 0xCD44, 0xAC86, 0xCD45, 0xAC87, 0xCD46, 0xAC88, 0xCD47, 0xAC89, + 0xCD48, 0xAC8A, 0xCD49, 0xAC8B, 0xCD4A, 0xAC8C, 0xCD4B, 0xAC8D, + 0xCD4C, 0xAC8E, 0xCD4D, 0xAC8F, 0xCD4E, 0xAC90, 0xCD4F, 0xAC91, + 0xCD50, 0xAC92, 0xCD51, 0xAC93, 0xCD52, 0xAC94, 0xCD53, 0xAC95, + 0xCD54, 0xAC96, 0xCD55, 0xAC97, 0xCD56, 0xAC98, 0xCD57, 0xAC99, + 0xCD58, 0xAC9A, 0xCD59, 0xAC9B, 0xCD5A, 0xAC9C, 0xCD5B, 0xAC9D, + 0xCD5C, 0xC3D6, 0xCD5D, 0xAC9E, 0xCD5E, 0xAC9F, 0xCD5F, 0xACA0, + 0xCD60, 0xC3D7, 0xCD61, 0xAD41, 0xCD62, 0xAD42, 0xCD63, 0xAD43, + 0xCD64, 0xC3D8, 0xCD65, 0xAD44, 0xCD66, 0xAD45, 0xCD67, 0xAD46, + 0xCD68, 0xAD47, 0xCD69, 0xAD48, 0xCD6A, 0xAD49, 0xCD6B, 0xAD4A, + 0xCD6C, 0xC3D9, 0xCD6D, 0xC3DA, 0xCD6E, 0xAD4B, 0xCD6F, 0xC3DB, + 0xCD70, 0xAD4C, 0xCD71, 0xC3DC, 0xCD72, 0xAD4D, 0xCD73, 0xAD4E, + 0xCD74, 0xAD4F, 0xCD75, 0xAD50, 0xCD76, 0xAD51, 0xCD77, 0xAD52, + 0xCD78, 0xC3DD, 0xCD79, 0xAD53, 0xCD7A, 0xAD54, 0xCD7B, 0xAD55, + 0xCD7C, 0xAD56, 0xCD7D, 0xAD57, 0xCD7E, 0xAD58, 0xCD7F, 0xAD59, + 0xCD80, 0xAD5A, 0xCD81, 0xAD61, 0xCD82, 0xAD62, 0xCD83, 0xAD63, + 0xCD84, 0xAD64, 0xCD85, 0xAD65, 0xCD86, 0xAD66, 0xCD87, 0xAD67, + 0xCD88, 0xC3DE, 0xCD89, 0xAD68, 0xCD8A, 0xAD69, 0xCD8B, 0xAD6A, + 0xCD8C, 0xAD6B, 0xCD8D, 0xAD6C, 0xCD8E, 0xAD6D, 0xCD8F, 0xAD6E, + 0xCD90, 0xAD6F, 0xCD91, 0xAD70, 0xCD92, 0xAD71, 0xCD93, 0xAD72, + 0xCD94, 0xC3DF, 0xCD95, 0xC3E0, 0xCD96, 0xAD73, 0xCD97, 0xAD74, + 0xCD98, 0xC3E1, 0xCD99, 0xAD75, 0xCD9A, 0xAD76, 0xCD9B, 0xAD77, + 0xCD9C, 0xC3E2, 0xCD9D, 0xAD78, 0xCD9E, 0xAD79, 0xCD9F, 0xAD7A, + 0xCDA0, 0xAD81, 0xCDA1, 0xAD82, 0xCDA2, 0xAD83, 0xCDA3, 0xAD84, + 0xCDA4, 0xC3E3, 0xCDA5, 0xC3E4, 0xCDA6, 0xAD85, 0xCDA7, 0xC3E5, + 0xCDA8, 0xAD86, 0xCDA9, 0xC3E6, 0xCDAA, 0xAD87, 0xCDAB, 0xAD88, + 0xCDAC, 0xAD89, 0xCDAD, 0xAD8A, 0xCDAE, 0xAD8B, 0xCDAF, 0xAD8C, + 0xCDB0, 0xC3E7, 0xCDB1, 0xAD8D, 0xCDB2, 0xAD8E, 0xCDB3, 0xAD8F, + 0xCDB4, 0xAD90, 0xCDB5, 0xAD91, 0xCDB6, 0xAD92, 0xCDB7, 0xAD93, + 0xCDB8, 0xAD94, 0xCDB9, 0xAD95, 0xCDBA, 0xAD96, 0xCDBB, 0xAD97, + 0xCDBC, 0xAD98, 0xCDBD, 0xAD99, 0xCDBE, 0xAD9A, 0xCDBF, 0xAD9B, + 0xCDC0, 0xAD9C, 0xCDC1, 0xAD9D, 0xCDC2, 0xAD9E, 0xCDC3, 0xAD9F, + 0xCDC4, 0xC3E8, 0xCDC5, 0xADA0, 0xCDC6, 0xAE41, 0xCDC7, 0xAE42, + 0xCDC8, 0xAE43, 0xCDC9, 0xAE44, 0xCDCA, 0xAE45, 0xCDCB, 0xAE46, + 0xCDCC, 0xC3E9, 0xCDCD, 0xAE47, 0xCDCE, 0xAE48, 0xCDCF, 0xAE49, + 0xCDD0, 0xC3EA, 0xCDD1, 0xAE4A, 0xCDD2, 0xAE4B, 0xCDD3, 0xAE4C, + 0xCDD4, 0xAE4D, 0xCDD5, 0xAE4E, 0xCDD6, 0xAE4F, 0xCDD7, 0xAE50, + 0xCDD8, 0xAE51, 0xCDD9, 0xAE52, 0xCDDA, 0xAE53, 0xCDDB, 0xAE54, + 0xCDDC, 0xAE55, 0xCDDD, 0xAE56, 0xCDDE, 0xAE57, 0xCDDF, 0xAE58, + 0xCDE0, 0xAE59, 0xCDE1, 0xAE5A, 0xCDE2, 0xAE61, 0xCDE3, 0xAE62, + 0xCDE4, 0xAE63, 0xCDE5, 0xAE64, 0xCDE6, 0xAE65, 0xCDE7, 0xAE66, + 0xCDE8, 0xC3EB, 0xCDE9, 0xAE67, 0xCDEA, 0xAE68, 0xCDEB, 0xAE69, + 0xCDEC, 0xC3EC, 0xCDED, 0xAE6A, 0xCDEE, 0xAE6B, 0xCDEF, 0xAE6C, + 0xCDF0, 0xC3ED, 0xCDF1, 0xAE6D, 0xCDF2, 0xAE6E, 0xCDF3, 0xAE6F, + 0xCDF4, 0xAE70, 0xCDF5, 0xAE71, 0xCDF6, 0xAE72, 0xCDF7, 0xAE73, + 0xCDF8, 0xC3EE, 0xCDF9, 0xC3EF, 0xCDFA, 0xAE74, 0xCDFB, 0xC3F0, + 0xCDFC, 0xAE75, 0xCDFD, 0xC3F1, 0xCDFE, 0xAE76, 0xCDFF, 0xAE77, + 0xCE00, 0xAE78, 0xCE01, 0xAE79, 0xCE02, 0xAE7A, 0xCE03, 0xAE81, + 0xCE04, 0xC3F2, 0xCE05, 0xAE82, 0xCE06, 0xAE83, 0xCE07, 0xAE84, + 0xCE08, 0xC3F3, 0xCE09, 0xAE85, 0xCE0A, 0xAE86, 0xCE0B, 0xAE87, + 0xCE0C, 0xC3F4, 0xCE0D, 0xAE88, 0xCE0E, 0xAE89, 0xCE0F, 0xAE8A, + 0xCE10, 0xAE8B, 0xCE11, 0xAE8C, 0xCE12, 0xAE8D, 0xCE13, 0xAE8E, + 0xCE14, 0xC3F5, 0xCE15, 0xAE8F, 0xCE16, 0xAE90, 0xCE17, 0xAE91, + 0xCE18, 0xAE92, 0xCE19, 0xC3F6, 0xCE1A, 0xAE93, 0xCE1B, 0xAE94, + 0xCE1C, 0xAE95, 0xCE1D, 0xAE96, 0xCE1E, 0xAE97, 0xCE1F, 0xAE98, + 0xCE20, 0xC3F7, 0xCE21, 0xC3F8, 0xCE22, 0xAE99, 0xCE23, 0xAE9A, + 0xCE24, 0xC3F9, 0xCE25, 0xAE9B, 0xCE26, 0xAE9C, 0xCE27, 0xAE9D, + 0xCE28, 0xC3FA, 0xCE29, 0xAE9E, 0xCE2A, 0xAE9F, 0xCE2B, 0xAEA0, + 0xCE2C, 0xAF41, 0xCE2D, 0xAF42, 0xCE2E, 0xAF43, 0xCE2F, 0xAF44, + 0xCE30, 0xC3FB, 0xCE31, 0xC3FC, 0xCE32, 0xAF45, 0xCE33, 0xC3FD, + 0xCE34, 0xAF46, 0xCE35, 0xC3FE, 0xCE36, 0xAF47, 0xCE37, 0xAF48, + 0xCE38, 0xAF49, 0xCE39, 0xAF4A, 0xCE3A, 0xAF4B, 0xCE3B, 0xAF4C, + 0xCE3C, 0xAF4D, 0xCE3D, 0xAF4E, 0xCE3E, 0xAF4F, 0xCE3F, 0xAF50, + 0xCE40, 0xAF51, 0xCE41, 0xAF52, 0xCE42, 0xAF53, 0xCE43, 0xAF54, + 0xCE44, 0xAF55, 0xCE45, 0xAF56, 0xCE46, 0xAF57, 0xCE47, 0xAF58, + 0xCE48, 0xAF59, 0xCE49, 0xAF5A, 0xCE4A, 0xAF61, 0xCE4B, 0xAF62, + 0xCE4C, 0xAF63, 0xCE4D, 0xAF64, 0xCE4E, 0xAF65, 0xCE4F, 0xAF66, + 0xCE50, 0xAF67, 0xCE51, 0xAF68, 0xCE52, 0xAF69, 0xCE53, 0xAF6A, + 0xCE54, 0xAF6B, 0xCE55, 0xAF6C, 0xCE56, 0xAF6D, 0xCE57, 0xAF6E, + 0xCE58, 0xC4A1, 0xCE59, 0xC4A2, 0xCE5A, 0xAF6F, 0xCE5B, 0xAF70, + 0xCE5C, 0xC4A3, 0xCE5D, 0xAF71, 0xCE5E, 0xAF72, 0xCE5F, 0xC4A4, + 0xCE60, 0xC4A5, 0xCE61, 0xC4A6, 0xCE62, 0xAF73, 0xCE63, 0xAF74, + 0xCE64, 0xAF75, 0xCE65, 0xAF76, 0xCE66, 0xAF77, 0xCE67, 0xAF78, + 0xCE68, 0xC4A7, 0xCE69, 0xC4A8, 0xCE6A, 0xAF79, 0xCE6B, 0xC4A9, + 0xCE6C, 0xAF7A, 0xCE6D, 0xC4AA, 0xCE6E, 0xAF81, 0xCE6F, 0xAF82, + 0xCE70, 0xAF83, 0xCE71, 0xAF84, 0xCE72, 0xAF85, 0xCE73, 0xAF86, + 0xCE74, 0xC4AB, 0xCE75, 0xC4AC, 0xCE76, 0xAF87, 0xCE77, 0xAF88, + 0xCE78, 0xC4AD, 0xCE79, 0xAF89, 0xCE7A, 0xAF8A, 0xCE7B, 0xAF8B, + 0xCE7C, 0xC4AE, 0xCE7D, 0xAF8C, 0xCE7E, 0xAF8D, 0xCE7F, 0xAF8E, + 0xCE80, 0xAF8F, 0xCE81, 0xAF90, 0xCE82, 0xAF91, 0xCE83, 0xAF92, + 0xCE84, 0xC4AF, 0xCE85, 0xC4B0, 0xCE86, 0xAF93, 0xCE87, 0xC4B1, + 0xCE88, 0xAF94, 0xCE89, 0xC4B2, 0xCE8A, 0xAF95, 0xCE8B, 0xAF96, + 0xCE8C, 0xAF97, 0xCE8D, 0xAF98, 0xCE8E, 0xAF99, 0xCE8F, 0xAF9A, + 0xCE90, 0xC4B3, 0xCE91, 0xC4B4, 0xCE92, 0xAF9B, 0xCE93, 0xAF9C, + 0xCE94, 0xC4B5, 0xCE95, 0xAF9D, 0xCE96, 0xAF9E, 0xCE97, 0xAF9F, + 0xCE98, 0xC4B6, 0xCE99, 0xAFA0, 0xCE9A, 0xB041, 0xCE9B, 0xB042, + 0xCE9C, 0xB043, 0xCE9D, 0xB044, 0xCE9E, 0xB045, 0xCE9F, 0xB046, + 0xCEA0, 0xC4B7, 0xCEA1, 0xC4B8, 0xCEA2, 0xB047, 0xCEA3, 0xC4B9, + 0xCEA4, 0xC4BA, 0xCEA5, 0xC4BB, 0xCEA6, 0xB048, 0xCEA7, 0xB049, + 0xCEA8, 0xB04A, 0xCEA9, 0xB04B, 0xCEAA, 0xB04C, 0xCEAB, 0xB04D, + 0xCEAC, 0xC4BC, 0xCEAD, 0xC4BD, 0xCEAE, 0xB04E, 0xCEAF, 0xB04F, + 0xCEB0, 0xB050, 0xCEB1, 0xB051, 0xCEB2, 0xB052, 0xCEB3, 0xB053, + 0xCEB4, 0xB054, 0xCEB5, 0xB055, 0xCEB6, 0xB056, 0xCEB7, 0xB057, + 0xCEB8, 0xB058, 0xCEB9, 0xB059, 0xCEBA, 0xB05A, 0xCEBB, 0xB061, + 0xCEBC, 0xB062, 0xCEBD, 0xB063, 0xCEBE, 0xB064, 0xCEBF, 0xB065, + 0xCEC0, 0xB066, 0xCEC1, 0xC4BE, 0xCEC2, 0xB067, 0xCEC3, 0xB068, + 0xCEC4, 0xB069, 0xCEC5, 0xB06A, 0xCEC6, 0xB06B, 0xCEC7, 0xB06C, + 0xCEC8, 0xB06D, 0xCEC9, 0xB06E, 0xCECA, 0xB06F, 0xCECB, 0xB070, + 0xCECC, 0xB071, 0xCECD, 0xB072, 0xCECE, 0xB073, 0xCECF, 0xB074, + 0xCED0, 0xB075, 0xCED1, 0xB076, 0xCED2, 0xB077, 0xCED3, 0xB078, + 0xCED4, 0xB079, 0xCED5, 0xB07A, 0xCED6, 0xB081, 0xCED7, 0xB082, + 0xCED8, 0xB083, 0xCED9, 0xB084, 0xCEDA, 0xB085, 0xCEDB, 0xB086, + 0xCEDC, 0xB087, 0xCEDD, 0xB088, 0xCEDE, 0xB089, 0xCEDF, 0xB08A, + 0xCEE0, 0xB08B, 0xCEE1, 0xB08C, 0xCEE2, 0xB08D, 0xCEE3, 0xB08E, + 0xCEE4, 0xC4BF, 0xCEE5, 0xC4C0, 0xCEE6, 0xB08F, 0xCEE7, 0xB090, + 0xCEE8, 0xC4C1, 0xCEE9, 0xB091, 0xCEEA, 0xB092, 0xCEEB, 0xC4C2, + 0xCEEC, 0xC4C3, 0xCEED, 0xB093, 0xCEEE, 0xB094, 0xCEEF, 0xB095, + 0xCEF0, 0xB096, 0xCEF1, 0xB097, 0xCEF2, 0xB098, 0xCEF3, 0xB099, + 0xCEF4, 0xC4C4, 0xCEF5, 0xC4C5, 0xCEF6, 0xB09A, 0xCEF7, 0xC4C6, + 0xCEF8, 0xC4C7, 0xCEF9, 0xC4C8, 0xCEFA, 0xB09B, 0xCEFB, 0xB09C, + 0xCEFC, 0xB09D, 0xCEFD, 0xB09E, 0xCEFE, 0xB09F, 0xCEFF, 0xB0A0, + 0xCF00, 0xC4C9, 0xCF01, 0xC4CA, 0xCF02, 0xB141, 0xCF03, 0xB142, + 0xCF04, 0xC4CB, 0xCF05, 0xB143, 0xCF06, 0xB144, 0xCF07, 0xB145, + 0xCF08, 0xC4CC, 0xCF09, 0xB146, 0xCF0A, 0xB147, 0xCF0B, 0xB148, + 0xCF0C, 0xB149, 0xCF0D, 0xB14A, 0xCF0E, 0xB14B, 0xCF0F, 0xB14C, + 0xCF10, 0xC4CD, 0xCF11, 0xC4CE, 0xCF12, 0xB14D, 0xCF13, 0xC4CF, + 0xCF14, 0xB14E, 0xCF15, 0xC4D0, 0xCF16, 0xB14F, 0xCF17, 0xB150, + 0xCF18, 0xB151, 0xCF19, 0xB152, 0xCF1A, 0xB153, 0xCF1B, 0xB154, + 0xCF1C, 0xC4D1, 0xCF1D, 0xB155, 0xCF1E, 0xB156, 0xCF1F, 0xB157, + 0xCF20, 0xC4D2, 0xCF21, 0xB158, 0xCF22, 0xB159, 0xCF23, 0xB15A, + 0xCF24, 0xC4D3, 0xCF25, 0xB161, 0xCF26, 0xB162, 0xCF27, 0xB163, + 0xCF28, 0xB164, 0xCF29, 0xB165, 0xCF2A, 0xB166, 0xCF2B, 0xB167, + 0xCF2C, 0xC4D4, 0xCF2D, 0xC4D5, 0xCF2E, 0xB168, 0xCF2F, 0xC4D6, + 0xCF30, 0xC4D7, 0xCF31, 0xC4D8, 0xCF32, 0xB169, 0xCF33, 0xB16A, + 0xCF34, 0xB16B, 0xCF35, 0xB16C, 0xCF36, 0xB16D, 0xCF37, 0xB16E, + 0xCF38, 0xC4D9, 0xCF39, 0xB16F, 0xCF3A, 0xB170, 0xCF3B, 0xB171, + 0xCF3C, 0xB172, 0xCF3D, 0xB173, 0xCF3E, 0xB174, 0xCF3F, 0xB175, + 0xCF40, 0xB176, 0xCF41, 0xB177, 0xCF42, 0xB178, 0xCF43, 0xB179, + 0xCF44, 0xB17A, 0xCF45, 0xB181, 0xCF46, 0xB182, 0xCF47, 0xB183, + 0xCF48, 0xB184, 0xCF49, 0xB185, 0xCF4A, 0xB186, 0xCF4B, 0xB187, + 0xCF4C, 0xB188, 0xCF4D, 0xB189, 0xCF4E, 0xB18A, 0xCF4F, 0xB18B, + 0xCF50, 0xB18C, 0xCF51, 0xB18D, 0xCF52, 0xB18E, 0xCF53, 0xB18F, + 0xCF54, 0xC4DA, 0xCF55, 0xC4DB, 0xCF56, 0xB190, 0xCF57, 0xB191, + 0xCF58, 0xC4DC, 0xCF59, 0xB192, 0xCF5A, 0xB193, 0xCF5B, 0xB194, + 0xCF5C, 0xC4DD, 0xCF5D, 0xB195, 0xCF5E, 0xB196, 0xCF5F, 0xB197, + 0xCF60, 0xB198, 0xCF61, 0xB199, 0xCF62, 0xB19A, 0xCF63, 0xB19B, + 0xCF64, 0xC4DE, 0xCF65, 0xC4DF, 0xCF66, 0xB19C, 0xCF67, 0xC4E0, + 0xCF68, 0xB19D, 0xCF69, 0xC4E1, 0xCF6A, 0xB19E, 0xCF6B, 0xB19F, + 0xCF6C, 0xB1A0, 0xCF6D, 0xB241, 0xCF6E, 0xB242, 0xCF6F, 0xB243, + 0xCF70, 0xC4E2, 0xCF71, 0xC4E3, 0xCF72, 0xB244, 0xCF73, 0xB245, + 0xCF74, 0xC4E4, 0xCF75, 0xB246, 0xCF76, 0xB247, 0xCF77, 0xB248, + 0xCF78, 0xC4E5, 0xCF79, 0xB249, 0xCF7A, 0xB24A, 0xCF7B, 0xB24B, + 0xCF7C, 0xB24C, 0xCF7D, 0xB24D, 0xCF7E, 0xB24E, 0xCF7F, 0xB24F, + 0xCF80, 0xC4E6, 0xCF81, 0xB250, 0xCF82, 0xB251, 0xCF83, 0xB252, + 0xCF84, 0xB253, 0xCF85, 0xC4E7, 0xCF86, 0xB254, 0xCF87, 0xB255, + 0xCF88, 0xB256, 0xCF89, 0xB257, 0xCF8A, 0xB258, 0xCF8B, 0xB259, + 0xCF8C, 0xC4E8, 0xCF8D, 0xB25A, 0xCF8E, 0xB261, 0xCF8F, 0xB262, + 0xCF90, 0xB263, 0xCF91, 0xB264, 0xCF92, 0xB265, 0xCF93, 0xB266, + 0xCF94, 0xB267, 0xCF95, 0xB268, 0xCF96, 0xB269, 0xCF97, 0xB26A, + 0xCF98, 0xB26B, 0xCF99, 0xB26C, 0xCF9A, 0xB26D, 0xCF9B, 0xB26E, + 0xCF9C, 0xB26F, 0xCF9D, 0xB270, 0xCF9E, 0xB271, 0xCF9F, 0xB272, + 0xCFA0, 0xB273, 0xCFA1, 0xC4E9, 0xCFA2, 0xB274, 0xCFA3, 0xB275, + 0xCFA4, 0xB276, 0xCFA5, 0xB277, 0xCFA6, 0xB278, 0xCFA7, 0xB279, + 0xCFA8, 0xC4EA, 0xCFA9, 0xB27A, 0xCFAA, 0xB281, 0xCFAB, 0xB282, + 0xCFAC, 0xB283, 0xCFAD, 0xB284, 0xCFAE, 0xB285, 0xCFAF, 0xB286, + 0xCFB0, 0xC4EB, 0xCFB1, 0xB287, 0xCFB2, 0xB288, 0xCFB3, 0xB289, + 0xCFB4, 0xB28A, 0xCFB5, 0xB28B, 0xCFB6, 0xB28C, 0xCFB7, 0xB28D, + 0xCFB8, 0xB28E, 0xCFB9, 0xB28F, 0xCFBA, 0xB290, 0xCFBB, 0xB291, + 0xCFBC, 0xB292, 0xCFBD, 0xB293, 0xCFBE, 0xB294, 0xCFBF, 0xB295, + 0xCFC0, 0xB296, 0xCFC1, 0xB297, 0xCFC2, 0xB298, 0xCFC3, 0xB299, + 0xCFC4, 0xC4EC, 0xCFC5, 0xB29A, 0xCFC6, 0xB29B, 0xCFC7, 0xB29C, + 0xCFC8, 0xB29D, 0xCFC9, 0xB29E, 0xCFCA, 0xB29F, 0xCFCB, 0xB2A0, + 0xCFCC, 0xB341, 0xCFCD, 0xB342, 0xCFCE, 0xB343, 0xCFCF, 0xB344, + 0xCFD0, 0xB345, 0xCFD1, 0xB346, 0xCFD2, 0xB347, 0xCFD3, 0xB348, + 0xCFD4, 0xB349, 0xCFD5, 0xB34A, 0xCFD6, 0xB34B, 0xCFD7, 0xB34C, + 0xCFD8, 0xB34D, 0xCFD9, 0xB34E, 0xCFDA, 0xB34F, 0xCFDB, 0xB350, + 0xCFDC, 0xB351, 0xCFDD, 0xB352, 0xCFDE, 0xB353, 0xCFDF, 0xB354, + 0xCFE0, 0xC4ED, 0xCFE1, 0xC4EE, 0xCFE2, 0xB355, 0xCFE3, 0xB356, + 0xCFE4, 0xC4EF, 0xCFE5, 0xB357, 0xCFE6, 0xB358, 0xCFE7, 0xB359, + 0xCFE8, 0xC4F0, 0xCFE9, 0xB35A, 0xCFEA, 0xB361, 0xCFEB, 0xB362, + 0xCFEC, 0xB363, 0xCFED, 0xB364, 0xCFEE, 0xB365, 0xCFEF, 0xB366, + 0xCFF0, 0xC4F1, 0xCFF1, 0xC4F2, 0xCFF2, 0xB367, 0xCFF3, 0xC4F3, + 0xCFF4, 0xB368, 0xCFF5, 0xC4F4, 0xCFF6, 0xB369, 0xCFF7, 0xB36A, + 0xCFF8, 0xB36B, 0xCFF9, 0xB36C, 0xCFFA, 0xB36D, 0xCFFB, 0xB36E, + 0xCFFC, 0xC4F5, 0xCFFD, 0xB36F, 0xCFFE, 0xB370, 0xCFFF, 0xB371, + 0xD000, 0xC4F6, 0xD001, 0xB372, 0xD002, 0xB373, 0xD003, 0xB374, + 0xD004, 0xC4F7, 0xD005, 0xB375, 0xD006, 0xB376, 0xD007, 0xB377, + 0xD008, 0xB378, 0xD009, 0xB379, 0xD00A, 0xB37A, 0xD00B, 0xB381, + 0xD00C, 0xB382, 0xD00D, 0xB383, 0xD00E, 0xB384, 0xD00F, 0xB385, + 0xD010, 0xB386, 0xD011, 0xC4F8, 0xD012, 0xB387, 0xD013, 0xB388, + 0xD014, 0xB389, 0xD015, 0xB38A, 0xD016, 0xB38B, 0xD017, 0xB38C, + 0xD018, 0xC4F9, 0xD019, 0xB38D, 0xD01A, 0xB38E, 0xD01B, 0xB38F, + 0xD01C, 0xB390, 0xD01D, 0xB391, 0xD01E, 0xB392, 0xD01F, 0xB393, + 0xD020, 0xB394, 0xD021, 0xB395, 0xD022, 0xB396, 0xD023, 0xB397, + 0xD024, 0xB398, 0xD025, 0xB399, 0xD026, 0xB39A, 0xD027, 0xB39B, + 0xD028, 0xB39C, 0xD029, 0xB39D, 0xD02A, 0xB39E, 0xD02B, 0xB39F, + 0xD02C, 0xB3A0, 0xD02D, 0xC4FA, 0xD02E, 0xB441, 0xD02F, 0xB442, + 0xD030, 0xB443, 0xD031, 0xB444, 0xD032, 0xB445, 0xD033, 0xB446, + 0xD034, 0xC4FB, 0xD035, 0xC4FC, 0xD036, 0xB447, 0xD037, 0xB448, + 0xD038, 0xC4FD, 0xD039, 0xB449, 0xD03A, 0xB44A, 0xD03B, 0xB44B, + 0xD03C, 0xC4FE, 0xD03D, 0xB44C, 0xD03E, 0xB44D, 0xD03F, 0xB44E, + 0xD040, 0xB44F, 0xD041, 0xB450, 0xD042, 0xB451, 0xD043, 0xB452, + 0xD044, 0xC5A1, 0xD045, 0xC5A2, 0xD046, 0xB453, 0xD047, 0xC5A3, + 0xD048, 0xB454, 0xD049, 0xC5A4, 0xD04A, 0xB455, 0xD04B, 0xB456, + 0xD04C, 0xB457, 0xD04D, 0xB458, 0xD04E, 0xB459, 0xD04F, 0xB45A, + 0xD050, 0xC5A5, 0xD051, 0xB461, 0xD052, 0xB462, 0xD053, 0xB463, + 0xD054, 0xC5A6, 0xD055, 0xB464, 0xD056, 0xB465, 0xD057, 0xB466, + 0xD058, 0xC5A7, 0xD059, 0xB467, 0xD05A, 0xB468, 0xD05B, 0xB469, + 0xD05C, 0xB46A, 0xD05D, 0xB46B, 0xD05E, 0xB46C, 0xD05F, 0xB46D, + 0xD060, 0xC5A8, 0xD061, 0xB46E, 0xD062, 0xB46F, 0xD063, 0xB470, + 0xD064, 0xB471, 0xD065, 0xB472, 0xD066, 0xB473, 0xD067, 0xB474, + 0xD068, 0xB475, 0xD069, 0xB476, 0xD06A, 0xB477, 0xD06B, 0xB478, + 0xD06C, 0xC5A9, 0xD06D, 0xC5AA, 0xD06E, 0xB479, 0xD06F, 0xB47A, + 0xD070, 0xC5AB, 0xD071, 0xB481, 0xD072, 0xB482, 0xD073, 0xB483, + 0xD074, 0xC5AC, 0xD075, 0xB484, 0xD076, 0xB485, 0xD077, 0xB486, + 0xD078, 0xB487, 0xD079, 0xB488, 0xD07A, 0xB489, 0xD07B, 0xB48A, + 0xD07C, 0xC5AD, 0xD07D, 0xC5AE, 0xD07E, 0xB48B, 0xD07F, 0xB48C, + 0xD080, 0xB48D, 0xD081, 0xC5AF, 0xD082, 0xB48E, 0xD083, 0xB48F, + 0xD084, 0xB490, 0xD085, 0xB491, 0xD086, 0xB492, 0xD087, 0xB493, + 0xD088, 0xB494, 0xD089, 0xB495, 0xD08A, 0xB496, 0xD08B, 0xB497, + 0xD08C, 0xB498, 0xD08D, 0xB499, 0xD08E, 0xB49A, 0xD08F, 0xB49B, + 0xD090, 0xB49C, 0xD091, 0xB49D, 0xD092, 0xB49E, 0xD093, 0xB49F, + 0xD094, 0xB4A0, 0xD095, 0xB541, 0xD096, 0xB542, 0xD097, 0xB543, + 0xD098, 0xB544, 0xD099, 0xB545, 0xD09A, 0xB546, 0xD09B, 0xB547, + 0xD09C, 0xB548, 0xD09D, 0xB549, 0xD09E, 0xB54A, 0xD09F, 0xB54B, + 0xD0A0, 0xB54C, 0xD0A1, 0xB54D, 0xD0A2, 0xB54E, 0xD0A3, 0xB54F, + 0xD0A4, 0xC5B0, 0xD0A5, 0xC5B1, 0xD0A6, 0xB550, 0xD0A7, 0xB551, + 0xD0A8, 0xC5B2, 0xD0A9, 0xB552, 0xD0AA, 0xB553, 0xD0AB, 0xB554, + 0xD0AC, 0xC5B3, 0xD0AD, 0xB555, 0xD0AE, 0xB556, 0xD0AF, 0xB557, + 0xD0B0, 0xB558, 0xD0B1, 0xB559, 0xD0B2, 0xB55A, 0xD0B3, 0xB561, + 0xD0B4, 0xC5B4, 0xD0B5, 0xC5B5, 0xD0B6, 0xB562, 0xD0B7, 0xC5B6, + 0xD0B8, 0xB563, 0xD0B9, 0xC5B7, 0xD0BA, 0xB564, 0xD0BB, 0xB565, + 0xD0BC, 0xB566, 0xD0BD, 0xB567, 0xD0BE, 0xB568, 0xD0BF, 0xB569, + 0xD0C0, 0xC5B8, 0xD0C1, 0xC5B9, 0xD0C2, 0xB56A, 0xD0C3, 0xB56B, + 0xD0C4, 0xC5BA, 0xD0C5, 0xB56C, 0xD0C6, 0xB56D, 0xD0C7, 0xB56E, + 0xD0C8, 0xC5BB, 0xD0C9, 0xC5BC, 0xD0CA, 0xB56F, 0xD0CB, 0xB570, + 0xD0CC, 0xB571, 0xD0CD, 0xB572, 0xD0CE, 0xB573, 0xD0CF, 0xB574, + 0xD0D0, 0xC5BD, 0xD0D1, 0xC5BE, 0xD0D2, 0xB575, 0xD0D3, 0xC5BF, + 0xD0D4, 0xC5C0, 0xD0D5, 0xC5C1, 0xD0D6, 0xB576, 0xD0D7, 0xB577, + 0xD0D8, 0xB578, 0xD0D9, 0xB579, 0xD0DA, 0xB57A, 0xD0DB, 0xB581, + 0xD0DC, 0xC5C2, 0xD0DD, 0xC5C3, 0xD0DE, 0xB582, 0xD0DF, 0xB583, + 0xD0E0, 0xC5C4, 0xD0E1, 0xB584, 0xD0E2, 0xB585, 0xD0E3, 0xB586, + 0xD0E4, 0xC5C5, 0xD0E5, 0xB587, 0xD0E6, 0xB588, 0xD0E7, 0xB589, + 0xD0E8, 0xB58A, 0xD0E9, 0xB58B, 0xD0EA, 0xB58C, 0xD0EB, 0xB58D, + 0xD0EC, 0xC5C6, 0xD0ED, 0xC5C7, 0xD0EE, 0xB58E, 0xD0EF, 0xC5C8, + 0xD0F0, 0xC5C9, 0xD0F1, 0xC5CA, 0xD0F2, 0xB58F, 0xD0F3, 0xB590, + 0xD0F4, 0xB591, 0xD0F5, 0xB592, 0xD0F6, 0xB593, 0xD0F7, 0xB594, + 0xD0F8, 0xC5CB, 0xD0F9, 0xB595, 0xD0FA, 0xB596, 0xD0FB, 0xB597, + 0xD0FC, 0xB598, 0xD0FD, 0xB599, 0xD0FE, 0xB59A, 0xD0FF, 0xB59B, + 0xD100, 0xB59C, 0xD101, 0xB59D, 0xD102, 0xB59E, 0xD103, 0xB59F, + 0xD104, 0xB5A0, 0xD105, 0xB641, 0xD106, 0xB642, 0xD107, 0xB643, + 0xD108, 0xB644, 0xD109, 0xB645, 0xD10A, 0xB646, 0xD10B, 0xB647, + 0xD10C, 0xB648, 0xD10D, 0xC5CC, 0xD10E, 0xB649, 0xD10F, 0xB64A, + 0xD110, 0xB64B, 0xD111, 0xB64C, 0xD112, 0xB64D, 0xD113, 0xB64E, + 0xD114, 0xB64F, 0xD115, 0xB650, 0xD116, 0xB651, 0xD117, 0xB652, + 0xD118, 0xB653, 0xD119, 0xB654, 0xD11A, 0xB655, 0xD11B, 0xB656, + 0xD11C, 0xB657, 0xD11D, 0xB658, 0xD11E, 0xB659, 0xD11F, 0xB65A, + 0xD120, 0xB661, 0xD121, 0xB662, 0xD122, 0xB663, 0xD123, 0xB664, + 0xD124, 0xB665, 0xD125, 0xB666, 0xD126, 0xB667, 0xD127, 0xB668, + 0xD128, 0xB669, 0xD129, 0xB66A, 0xD12A, 0xB66B, 0xD12B, 0xB66C, + 0xD12C, 0xB66D, 0xD12D, 0xB66E, 0xD12E, 0xB66F, 0xD12F, 0xB670, + 0xD130, 0xC5CD, 0xD131, 0xC5CE, 0xD132, 0xB671, 0xD133, 0xB672, + 0xD134, 0xC5CF, 0xD135, 0xB673, 0xD136, 0xB674, 0xD137, 0xB675, + 0xD138, 0xC5D0, 0xD139, 0xB676, 0xD13A, 0xC5D1, 0xD13B, 0xB677, + 0xD13C, 0xB678, 0xD13D, 0xB679, 0xD13E, 0xB67A, 0xD13F, 0xB681, + 0xD140, 0xC5D2, 0xD141, 0xC5D3, 0xD142, 0xB682, 0xD143, 0xC5D4, + 0xD144, 0xC5D5, 0xD145, 0xC5D6, 0xD146, 0xB683, 0xD147, 0xB684, + 0xD148, 0xB685, 0xD149, 0xB686, 0xD14A, 0xB687, 0xD14B, 0xB688, + 0xD14C, 0xC5D7, 0xD14D, 0xC5D8, 0xD14E, 0xB689, 0xD14F, 0xB68A, + 0xD150, 0xC5D9, 0xD151, 0xB68B, 0xD152, 0xB68C, 0xD153, 0xB68D, + 0xD154, 0xC5DA, 0xD155, 0xB68E, 0xD156, 0xB68F, 0xD157, 0xB690, + 0xD158, 0xB691, 0xD159, 0xB692, 0xD15A, 0xB693, 0xD15B, 0xB694, + 0xD15C, 0xC5DB, 0xD15D, 0xC5DC, 0xD15E, 0xB695, 0xD15F, 0xC5DD, + 0xD160, 0xB696, 0xD161, 0xC5DE, 0xD162, 0xB697, 0xD163, 0xB698, + 0xD164, 0xB699, 0xD165, 0xB69A, 0xD166, 0xB69B, 0xD167, 0xB69C, + 0xD168, 0xC5DF, 0xD169, 0xB69D, 0xD16A, 0xB69E, 0xD16B, 0xB69F, + 0xD16C, 0xC5E0, 0xD16D, 0xB6A0, 0xD16E, 0xB741, 0xD16F, 0xB742, + 0xD170, 0xB743, 0xD171, 0xB744, 0xD172, 0xB745, 0xD173, 0xB746, + 0xD174, 0xB747, 0xD175, 0xB748, 0xD176, 0xB749, 0xD177, 0xB74A, + 0xD178, 0xB74B, 0xD179, 0xB74C, 0xD17A, 0xB74D, 0xD17B, 0xB74E, + 0xD17C, 0xC5E1, 0xD17D, 0xB74F, 0xD17E, 0xB750, 0xD17F, 0xB751, + 0xD180, 0xB752, 0xD181, 0xB753, 0xD182, 0xB754, 0xD183, 0xB755, + 0xD184, 0xC5E2, 0xD185, 0xB756, 0xD186, 0xB757, 0xD187, 0xB758, + 0xD188, 0xC5E3, 0xD189, 0xB759, 0xD18A, 0xB75A, 0xD18B, 0xB761, + 0xD18C, 0xB762, 0xD18D, 0xB763, 0xD18E, 0xB764, 0xD18F, 0xB765, + 0xD190, 0xB766, 0xD191, 0xB767, 0xD192, 0xB768, 0xD193, 0xB769, + 0xD194, 0xB76A, 0xD195, 0xB76B, 0xD196, 0xB76C, 0xD197, 0xB76D, + 0xD198, 0xB76E, 0xD199, 0xB76F, 0xD19A, 0xB770, 0xD19B, 0xB771, + 0xD19C, 0xB772, 0xD19D, 0xB773, 0xD19E, 0xB774, 0xD19F, 0xB775, + 0xD1A0, 0xC5E4, 0xD1A1, 0xC5E5, 0xD1A2, 0xB776, 0xD1A3, 0xB777, + 0xD1A4, 0xC5E6, 0xD1A5, 0xB778, 0xD1A6, 0xB779, 0xD1A7, 0xB77A, + 0xD1A8, 0xC5E7, 0xD1A9, 0xB781, 0xD1AA, 0xB782, 0xD1AB, 0xB783, + 0xD1AC, 0xB784, 0xD1AD, 0xB785, 0xD1AE, 0xB786, 0xD1AF, 0xB787, + 0xD1B0, 0xC5E8, 0xD1B1, 0xC5E9, 0xD1B2, 0xB788, 0xD1B3, 0xC5EA, + 0xD1B4, 0xB789, 0xD1B5, 0xC5EB, 0xD1B6, 0xB78A, 0xD1B7, 0xB78B, + 0xD1B8, 0xB78C, 0xD1B9, 0xB78D, 0xD1BA, 0xC5EC, 0xD1BB, 0xB78E, + 0xD1BC, 0xC5ED, 0xD1BD, 0xB78F, 0xD1BE, 0xB790, 0xD1BF, 0xB791, + 0xD1C0, 0xC5EE, 0xD1C1, 0xB792, 0xD1C2, 0xB793, 0xD1C3, 0xB794, + 0xD1C4, 0xB795, 0xD1C5, 0xB796, 0xD1C6, 0xB797, 0xD1C7, 0xB798, + 0xD1C8, 0xB799, 0xD1C9, 0xB79A, 0xD1CA, 0xB79B, 0xD1CB, 0xB79C, + 0xD1CC, 0xB79D, 0xD1CD, 0xB79E, 0xD1CE, 0xB79F, 0xD1CF, 0xB7A0, + 0xD1D0, 0xB841, 0xD1D1, 0xB842, 0xD1D2, 0xB843, 0xD1D3, 0xB844, + 0xD1D4, 0xB845, 0xD1D5, 0xB846, 0xD1D6, 0xB847, 0xD1D7, 0xB848, + 0xD1D8, 0xC5EF, 0xD1D9, 0xB849, 0xD1DA, 0xB84A, 0xD1DB, 0xB84B, + 0xD1DC, 0xB84C, 0xD1DD, 0xB84D, 0xD1DE, 0xB84E, 0xD1DF, 0xB84F, + 0xD1E0, 0xB850, 0xD1E1, 0xB851, 0xD1E2, 0xB852, 0xD1E3, 0xB853, + 0xD1E4, 0xB854, 0xD1E5, 0xB855, 0xD1E6, 0xB856, 0xD1E7, 0xB857, + 0xD1E8, 0xB858, 0xD1E9, 0xB859, 0xD1EA, 0xB85A, 0xD1EB, 0xB861, + 0xD1EC, 0xB862, 0xD1ED, 0xB863, 0xD1EE, 0xB864, 0xD1EF, 0xB865, + 0xD1F0, 0xB866, 0xD1F1, 0xB867, 0xD1F2, 0xB868, 0xD1F3, 0xB869, + 0xD1F4, 0xC5F0, 0xD1F5, 0xB86A, 0xD1F6, 0xB86B, 0xD1F7, 0xB86C, + 0xD1F8, 0xC5F1, 0xD1F9, 0xB86D, 0xD1FA, 0xB86E, 0xD1FB, 0xB86F, + 0xD1FC, 0xB870, 0xD1FD, 0xB871, 0xD1FE, 0xB872, 0xD1FF, 0xB873, + 0xD200, 0xB874, 0xD201, 0xB875, 0xD202, 0xB876, 0xD203, 0xB877, + 0xD204, 0xB878, 0xD205, 0xB879, 0xD206, 0xB87A, 0xD207, 0xC5F2, + 0xD208, 0xB881, 0xD209, 0xC5F3, 0xD20A, 0xB882, 0xD20B, 0xB883, + 0xD20C, 0xB884, 0xD20D, 0xB885, 0xD20E, 0xB886, 0xD20F, 0xB887, + 0xD210, 0xC5F4, 0xD211, 0xB888, 0xD212, 0xB889, 0xD213, 0xB88A, + 0xD214, 0xB88B, 0xD215, 0xB88C, 0xD216, 0xB88D, 0xD217, 0xB88E, + 0xD218, 0xB88F, 0xD219, 0xB890, 0xD21A, 0xB891, 0xD21B, 0xB892, + 0xD21C, 0xB893, 0xD21D, 0xB894, 0xD21E, 0xB895, 0xD21F, 0xB896, + 0xD220, 0xB897, 0xD221, 0xB898, 0xD222, 0xB899, 0xD223, 0xB89A, + 0xD224, 0xB89B, 0xD225, 0xB89C, 0xD226, 0xB89D, 0xD227, 0xB89E, + 0xD228, 0xB89F, 0xD229, 0xB8A0, 0xD22A, 0xB941, 0xD22B, 0xB942, + 0xD22C, 0xC5F5, 0xD22D, 0xC5F6, 0xD22E, 0xB943, 0xD22F, 0xB944, + 0xD230, 0xC5F7, 0xD231, 0xB945, 0xD232, 0xB946, 0xD233, 0xB947, + 0xD234, 0xC5F8, 0xD235, 0xB948, 0xD236, 0xB949, 0xD237, 0xB94A, + 0xD238, 0xB94B, 0xD239, 0xB94C, 0xD23A, 0xB94D, 0xD23B, 0xB94E, + 0xD23C, 0xC5F9, 0xD23D, 0xC5FA, 0xD23E, 0xB94F, 0xD23F, 0xC5FB, + 0xD240, 0xB950, 0xD241, 0xC5FC, 0xD242, 0xB951, 0xD243, 0xB952, + 0xD244, 0xB953, 0xD245, 0xB954, 0xD246, 0xB955, 0xD247, 0xB956, + 0xD248, 0xC5FD, 0xD249, 0xB957, 0xD24A, 0xB958, 0xD24B, 0xB959, + 0xD24C, 0xB95A, 0xD24D, 0xB961, 0xD24E, 0xB962, 0xD24F, 0xB963, + 0xD250, 0xB964, 0xD251, 0xB965, 0xD252, 0xB966, 0xD253, 0xB967, + 0xD254, 0xB968, 0xD255, 0xB969, 0xD256, 0xB96A, 0xD257, 0xB96B, + 0xD258, 0xB96C, 0xD259, 0xB96D, 0xD25A, 0xB96E, 0xD25B, 0xB96F, + 0xD25C, 0xC5FE, 0xD25D, 0xB970, 0xD25E, 0xB971, 0xD25F, 0xB972, + 0xD260, 0xB973, 0xD261, 0xB974, 0xD262, 0xB975, 0xD263, 0xB976, + 0xD264, 0xC6A1, 0xD265, 0xB977, 0xD266, 0xB978, 0xD267, 0xB979, + 0xD268, 0xB97A, 0xD269, 0xB981, 0xD26A, 0xB982, 0xD26B, 0xB983, + 0xD26C, 0xB984, 0xD26D, 0xB985, 0xD26E, 0xB986, 0xD26F, 0xB987, + 0xD270, 0xB988, 0xD271, 0xB989, 0xD272, 0xB98A, 0xD273, 0xB98B, + 0xD274, 0xB98C, 0xD275, 0xB98D, 0xD276, 0xB98E, 0xD277, 0xB98F, + 0xD278, 0xB990, 0xD279, 0xB991, 0xD27A, 0xB992, 0xD27B, 0xB993, + 0xD27C, 0xB994, 0xD27D, 0xB995, 0xD27E, 0xB996, 0xD27F, 0xB997, + 0xD280, 0xC6A2, 0xD281, 0xC6A3, 0xD282, 0xB998, 0xD283, 0xB999, + 0xD284, 0xC6A4, 0xD285, 0xB99A, 0xD286, 0xB99B, 0xD287, 0xB99C, + 0xD288, 0xC6A5, 0xD289, 0xB99D, 0xD28A, 0xB99E, 0xD28B, 0xB99F, + 0xD28C, 0xB9A0, 0xD28D, 0xBA41, 0xD28E, 0xBA42, 0xD28F, 0xBA43, + 0xD290, 0xC6A6, 0xD291, 0xC6A7, 0xD292, 0xBA44, 0xD293, 0xBA45, + 0xD294, 0xBA46, 0xD295, 0xC6A8, 0xD296, 0xBA47, 0xD297, 0xBA48, + 0xD298, 0xBA49, 0xD299, 0xBA4A, 0xD29A, 0xBA4B, 0xD29B, 0xBA4C, + 0xD29C, 0xC6A9, 0xD29D, 0xBA4D, 0xD29E, 0xBA4E, 0xD29F, 0xBA4F, + 0xD2A0, 0xC6AA, 0xD2A1, 0xBA50, 0xD2A2, 0xBA51, 0xD2A3, 0xBA52, + 0xD2A4, 0xC6AB, 0xD2A5, 0xBA53, 0xD2A6, 0xBA54, 0xD2A7, 0xBA55, + 0xD2A8, 0xBA56, 0xD2A9, 0xBA57, 0xD2AA, 0xBA58, 0xD2AB, 0xBA59, + 0xD2AC, 0xC6AC, 0xD2AD, 0xBA5A, 0xD2AE, 0xBA61, 0xD2AF, 0xBA62, + 0xD2B0, 0xBA63, 0xD2B1, 0xC6AD, 0xD2B2, 0xBA64, 0xD2B3, 0xBA65, + 0xD2B4, 0xBA66, 0xD2B5, 0xBA67, 0xD2B6, 0xBA68, 0xD2B7, 0xBA69, + 0xD2B8, 0xC6AE, 0xD2B9, 0xC6AF, 0xD2BA, 0xBA6A, 0xD2BB, 0xBA6B, + 0xD2BC, 0xC6B0, 0xD2BD, 0xBA6C, 0xD2BE, 0xBA6D, 0xD2BF, 0xC6B1, + 0xD2C0, 0xC6B2, 0xD2C1, 0xBA6E, 0xD2C2, 0xC6B3, 0xD2C3, 0xBA6F, + 0xD2C4, 0xBA70, 0xD2C5, 0xBA71, 0xD2C6, 0xBA72, 0xD2C7, 0xBA73, + 0xD2C8, 0xC6B4, 0xD2C9, 0xC6B5, 0xD2CA, 0xBA74, 0xD2CB, 0xC6B6, + 0xD2CC, 0xBA75, 0xD2CD, 0xBA76, 0xD2CE, 0xBA77, 0xD2CF, 0xBA78, + 0xD2D0, 0xBA79, 0xD2D1, 0xBA7A, 0xD2D2, 0xBA81, 0xD2D3, 0xBA82, + 0xD2D4, 0xC6B7, 0xD2D5, 0xBA83, 0xD2D6, 0xBA84, 0xD2D7, 0xBA85, + 0xD2D8, 0xC6B8, 0xD2D9, 0xBA86, 0xD2DA, 0xBA87, 0xD2DB, 0xBA88, + 0xD2DC, 0xC6B9, 0xD2DD, 0xBA89, 0xD2DE, 0xBA8A, 0xD2DF, 0xBA8B, + 0xD2E0, 0xBA8C, 0xD2E1, 0xBA8D, 0xD2E2, 0xBA8E, 0xD2E3, 0xBA8F, + 0xD2E4, 0xC6BA, 0xD2E5, 0xC6BB, 0xD2E6, 0xBA90, 0xD2E7, 0xBA91, + 0xD2E8, 0xBA92, 0xD2E9, 0xBA93, 0xD2EA, 0xBA94, 0xD2EB, 0xBA95, + 0xD2EC, 0xBA96, 0xD2ED, 0xBA97, 0xD2EE, 0xBA98, 0xD2EF, 0xBA99, + 0xD2F0, 0xC6BC, 0xD2F1, 0xC6BD, 0xD2F2, 0xBA9A, 0xD2F3, 0xBA9B, + 0xD2F4, 0xC6BE, 0xD2F5, 0xBA9C, 0xD2F6, 0xBA9D, 0xD2F7, 0xBA9E, + 0xD2F8, 0xC6BF, 0xD2F9, 0xBA9F, 0xD2FA, 0xBAA0, 0xD2FB, 0xBB41, + 0xD2FC, 0xBB42, 0xD2FD, 0xBB43, 0xD2FE, 0xBB44, 0xD2FF, 0xBB45, + 0xD300, 0xC6C0, 0xD301, 0xC6C1, 0xD302, 0xBB46, 0xD303, 0xC6C2, + 0xD304, 0xBB47, 0xD305, 0xC6C3, 0xD306, 0xBB48, 0xD307, 0xBB49, + 0xD308, 0xBB4A, 0xD309, 0xBB4B, 0xD30A, 0xBB4C, 0xD30B, 0xBB4D, + 0xD30C, 0xC6C4, 0xD30D, 0xC6C5, 0xD30E, 0xC6C6, 0xD30F, 0xBB4E, + 0xD310, 0xC6C7, 0xD311, 0xBB4F, 0xD312, 0xBB50, 0xD313, 0xBB51, + 0xD314, 0xC6C8, 0xD315, 0xBB52, 0xD316, 0xC6C9, 0xD317, 0xBB53, + 0xD318, 0xBB54, 0xD319, 0xBB55, 0xD31A, 0xBB56, 0xD31B, 0xBB57, + 0xD31C, 0xC6CA, 0xD31D, 0xC6CB, 0xD31E, 0xBB58, 0xD31F, 0xC6CC, + 0xD320, 0xC6CD, 0xD321, 0xC6CE, 0xD322, 0xBB59, 0xD323, 0xBB5A, + 0xD324, 0xBB61, 0xD325, 0xC6CF, 0xD326, 0xBB62, 0xD327, 0xBB63, + 0xD328, 0xC6D0, 0xD329, 0xC6D1, 0xD32A, 0xBB64, 0xD32B, 0xBB65, + 0xD32C, 0xC6D2, 0xD32D, 0xBB66, 0xD32E, 0xBB67, 0xD32F, 0xBB68, + 0xD330, 0xC6D3, 0xD331, 0xBB69, 0xD332, 0xBB6A, 0xD333, 0xBB6B, + 0xD334, 0xBB6C, 0xD335, 0xBB6D, 0xD336, 0xBB6E, 0xD337, 0xBB6F, + 0xD338, 0xC6D4, 0xD339, 0xC6D5, 0xD33A, 0xBB70, 0xD33B, 0xC6D6, + 0xD33C, 0xC6D7, 0xD33D, 0xC6D8, 0xD33E, 0xBB71, 0xD33F, 0xBB72, + 0xD340, 0xBB73, 0xD341, 0xBB74, 0xD342, 0xBB75, 0xD343, 0xBB76, + 0xD344, 0xC6D9, 0xD345, 0xC6DA, 0xD346, 0xBB77, 0xD347, 0xBB78, + 0xD348, 0xBB79, 0xD349, 0xBB7A, 0xD34A, 0xBB81, 0xD34B, 0xBB82, + 0xD34C, 0xBB83, 0xD34D, 0xBB84, 0xD34E, 0xBB85, 0xD34F, 0xBB86, + 0xD350, 0xBB87, 0xD351, 0xBB88, 0xD352, 0xBB89, 0xD353, 0xBB8A, + 0xD354, 0xBB8B, 0xD355, 0xBB8C, 0xD356, 0xBB8D, 0xD357, 0xBB8E, + 0xD358, 0xBB8F, 0xD359, 0xBB90, 0xD35A, 0xBB91, 0xD35B, 0xBB92, + 0xD35C, 0xBB93, 0xD35D, 0xBB94, 0xD35E, 0xBB95, 0xD35F, 0xBB96, + 0xD360, 0xBB97, 0xD361, 0xBB98, 0xD362, 0xBB99, 0xD363, 0xBB9A, + 0xD364, 0xBB9B, 0xD365, 0xBB9C, 0xD366, 0xBB9D, 0xD367, 0xBB9E, + 0xD368, 0xBB9F, 0xD369, 0xBBA0, 0xD36A, 0xBC41, 0xD36B, 0xBC42, + 0xD36C, 0xBC43, 0xD36D, 0xBC44, 0xD36E, 0xBC45, 0xD36F, 0xBC46, + 0xD370, 0xBC47, 0xD371, 0xBC48, 0xD372, 0xBC49, 0xD373, 0xBC4A, + 0xD374, 0xBC4B, 0xD375, 0xBC4C, 0xD376, 0xBC4D, 0xD377, 0xBC4E, + 0xD378, 0xBC4F, 0xD379, 0xBC50, 0xD37A, 0xBC51, 0xD37B, 0xBC52, + 0xD37C, 0xC6DB, 0xD37D, 0xC6DC, 0xD37E, 0xBC53, 0xD37F, 0xBC54, + 0xD380, 0xC6DD, 0xD381, 0xBC55, 0xD382, 0xBC56, 0xD383, 0xBC57, + 0xD384, 0xC6DE, 0xD385, 0xBC58, 0xD386, 0xBC59, 0xD387, 0xBC5A, + 0xD388, 0xBC61, 0xD389, 0xBC62, 0xD38A, 0xBC63, 0xD38B, 0xBC64, + 0xD38C, 0xC6DF, 0xD38D, 0xC6E0, 0xD38E, 0xBC65, 0xD38F, 0xC6E1, + 0xD390, 0xC6E2, 0xD391, 0xC6E3, 0xD392, 0xBC66, 0xD393, 0xBC67, + 0xD394, 0xBC68, 0xD395, 0xBC69, 0xD396, 0xBC6A, 0xD397, 0xBC6B, + 0xD398, 0xC6E4, 0xD399, 0xC6E5, 0xD39A, 0xBC6C, 0xD39B, 0xBC6D, + 0xD39C, 0xC6E6, 0xD39D, 0xBC6E, 0xD39E, 0xBC6F, 0xD39F, 0xBC70, + 0xD3A0, 0xC6E7, 0xD3A1, 0xBC71, 0xD3A2, 0xBC72, 0xD3A3, 0xBC73, + 0xD3A4, 0xBC74, 0xD3A5, 0xBC75, 0xD3A6, 0xBC76, 0xD3A7, 0xBC77, + 0xD3A8, 0xC6E8, 0xD3A9, 0xC6E9, 0xD3AA, 0xBC78, 0xD3AB, 0xC6EA, + 0xD3AC, 0xBC79, 0xD3AD, 0xC6EB, 0xD3AE, 0xBC7A, 0xD3AF, 0xBC81, + 0xD3B0, 0xBC82, 0xD3B1, 0xBC83, 0xD3B2, 0xBC84, 0xD3B3, 0xBC85, + 0xD3B4, 0xC6EC, 0xD3B5, 0xBC86, 0xD3B6, 0xBC87, 0xD3B7, 0xBC88, + 0xD3B8, 0xC6ED, 0xD3B9, 0xBC89, 0xD3BA, 0xBC8A, 0xD3BB, 0xBC8B, + 0xD3BC, 0xC6EE, 0xD3BD, 0xBC8C, 0xD3BE, 0xBC8D, 0xD3BF, 0xBC8E, + 0xD3C0, 0xBC8F, 0xD3C1, 0xBC90, 0xD3C2, 0xBC91, 0xD3C3, 0xBC92, + 0xD3C4, 0xC6EF, 0xD3C5, 0xC6F0, 0xD3C6, 0xBC93, 0xD3C7, 0xBC94, + 0xD3C8, 0xC6F1, 0xD3C9, 0xC6F2, 0xD3CA, 0xBC95, 0xD3CB, 0xBC96, + 0xD3CC, 0xBC97, 0xD3CD, 0xBC98, 0xD3CE, 0xBC99, 0xD3CF, 0xBC9A, + 0xD3D0, 0xC6F3, 0xD3D1, 0xBC9B, 0xD3D2, 0xBC9C, 0xD3D3, 0xBC9D, + 0xD3D4, 0xBC9E, 0xD3D5, 0xBC9F, 0xD3D6, 0xBCA0, 0xD3D7, 0xBD41, + 0xD3D8, 0xC6F4, 0xD3D9, 0xBD42, 0xD3DA, 0xBD43, 0xD3DB, 0xBD44, + 0xD3DC, 0xBD45, 0xD3DD, 0xBD46, 0xD3DE, 0xBD47, 0xD3DF, 0xBD48, + 0xD3E0, 0xBD49, 0xD3E1, 0xC6F5, 0xD3E2, 0xBD4A, 0xD3E3, 0xC6F6, + 0xD3E4, 0xBD4B, 0xD3E5, 0xBD4C, 0xD3E6, 0xBD4D, 0xD3E7, 0xBD4E, + 0xD3E8, 0xBD4F, 0xD3E9, 0xBD50, 0xD3EA, 0xBD51, 0xD3EB, 0xBD52, + 0xD3EC, 0xC6F7, 0xD3ED, 0xC6F8, 0xD3EE, 0xBD53, 0xD3EF, 0xBD54, + 0xD3F0, 0xC6F9, 0xD3F1, 0xBD55, 0xD3F2, 0xBD56, 0xD3F3, 0xBD57, + 0xD3F4, 0xC6FA, 0xD3F5, 0xBD58, 0xD3F6, 0xBD59, 0xD3F7, 0xBD5A, + 0xD3F8, 0xBD61, 0xD3F9, 0xBD62, 0xD3FA, 0xBD63, 0xD3FB, 0xBD64, + 0xD3FC, 0xC6FB, 0xD3FD, 0xC6FC, 0xD3FE, 0xBD65, 0xD3FF, 0xC6FD, + 0xD400, 0xBD66, 0xD401, 0xC6FE, 0xD402, 0xBD67, 0xD403, 0xBD68, + 0xD404, 0xBD69, 0xD405, 0xBD6A, 0xD406, 0xBD6B, 0xD407, 0xBD6C, + 0xD408, 0xC7A1, 0xD409, 0xBD6D, 0xD40A, 0xBD6E, 0xD40B, 0xBD6F, + 0xD40C, 0xBD70, 0xD40D, 0xBD71, 0xD40E, 0xBD72, 0xD40F, 0xBD73, + 0xD410, 0xBD74, 0xD411, 0xBD75, 0xD412, 0xBD76, 0xD413, 0xBD77, + 0xD414, 0xBD78, 0xD415, 0xBD79, 0xD416, 0xBD7A, 0xD417, 0xBD81, + 0xD418, 0xBD82, 0xD419, 0xBD83, 0xD41A, 0xBD84, 0xD41B, 0xBD85, + 0xD41C, 0xBD86, 0xD41D, 0xC7A2, 0xD41E, 0xBD87, 0xD41F, 0xBD88, + 0xD420, 0xBD89, 0xD421, 0xBD8A, 0xD422, 0xBD8B, 0xD423, 0xBD8C, + 0xD424, 0xBD8D, 0xD425, 0xBD8E, 0xD426, 0xBD8F, 0xD427, 0xBD90, + 0xD428, 0xBD91, 0xD429, 0xBD92, 0xD42A, 0xBD93, 0xD42B, 0xBD94, + 0xD42C, 0xBD95, 0xD42D, 0xBD96, 0xD42E, 0xBD97, 0xD42F, 0xBD98, + 0xD430, 0xBD99, 0xD431, 0xBD9A, 0xD432, 0xBD9B, 0xD433, 0xBD9C, + 0xD434, 0xBD9D, 0xD435, 0xBD9E, 0xD436, 0xBD9F, 0xD437, 0xBDA0, + 0xD438, 0xBE41, 0xD439, 0xBE42, 0xD43A, 0xBE43, 0xD43B, 0xBE44, + 0xD43C, 0xBE45, 0xD43D, 0xBE46, 0xD43E, 0xBE47, 0xD43F, 0xBE48, + 0xD440, 0xC7A3, 0xD441, 0xBE49, 0xD442, 0xBE4A, 0xD443, 0xBE4B, + 0xD444, 0xC7A4, 0xD445, 0xBE4C, 0xD446, 0xBE4D, 0xD447, 0xBE4E, + 0xD448, 0xBE4F, 0xD449, 0xBE50, 0xD44A, 0xBE51, 0xD44B, 0xBE52, + 0xD44C, 0xBE53, 0xD44D, 0xBE54, 0xD44E, 0xBE55, 0xD44F, 0xBE56, + 0xD450, 0xBE57, 0xD451, 0xBE58, 0xD452, 0xBE59, 0xD453, 0xBE5A, + 0xD454, 0xBE61, 0xD455, 0xBE62, 0xD456, 0xBE63, 0xD457, 0xBE64, + 0xD458, 0xBE65, 0xD459, 0xBE66, 0xD45A, 0xBE67, 0xD45B, 0xBE68, + 0xD45C, 0xC7A5, 0xD45D, 0xBE69, 0xD45E, 0xBE6A, 0xD45F, 0xBE6B, + 0xD460, 0xC7A6, 0xD461, 0xBE6C, 0xD462, 0xBE6D, 0xD463, 0xBE6E, + 0xD464, 0xC7A7, 0xD465, 0xBE6F, 0xD466, 0xBE70, 0xD467, 0xBE71, + 0xD468, 0xBE72, 0xD469, 0xBE73, 0xD46A, 0xBE74, 0xD46B, 0xBE75, + 0xD46C, 0xBE76, 0xD46D, 0xC7A8, 0xD46E, 0xBE77, 0xD46F, 0xC7A9, + 0xD470, 0xBE78, 0xD471, 0xBE79, 0xD472, 0xBE7A, 0xD473, 0xBE81, + 0xD474, 0xBE82, 0xD475, 0xBE83, 0xD476, 0xBE84, 0xD477, 0xBE85, + 0xD478, 0xC7AA, 0xD479, 0xC7AB, 0xD47A, 0xBE86, 0xD47B, 0xBE87, + 0xD47C, 0xC7AC, 0xD47D, 0xBE88, 0xD47E, 0xBE89, 0xD47F, 0xC7AD, + 0xD480, 0xC7AE, 0xD481, 0xBE8A, 0xD482, 0xC7AF, 0xD483, 0xBE8B, + 0xD484, 0xBE8C, 0xD485, 0xBE8D, 0xD486, 0xBE8E, 0xD487, 0xBE8F, + 0xD488, 0xC7B0, 0xD489, 0xC7B1, 0xD48A, 0xBE90, 0xD48B, 0xC7B2, + 0xD48C, 0xBE91, 0xD48D, 0xC7B3, 0xD48E, 0xBE92, 0xD48F, 0xBE93, + 0xD490, 0xBE94, 0xD491, 0xBE95, 0xD492, 0xBE96, 0xD493, 0xBE97, + 0xD494, 0xC7B4, 0xD495, 0xBE98, 0xD496, 0xBE99, 0xD497, 0xBE9A, + 0xD498, 0xBE9B, 0xD499, 0xBE9C, 0xD49A, 0xBE9D, 0xD49B, 0xBE9E, + 0xD49C, 0xBE9F, 0xD49D, 0xBEA0, 0xD49E, 0xBF41, 0xD49F, 0xBF42, + 0xD4A0, 0xBF43, 0xD4A1, 0xBF44, 0xD4A2, 0xBF45, 0xD4A3, 0xBF46, + 0xD4A4, 0xBF47, 0xD4A5, 0xBF48, 0xD4A6, 0xBF49, 0xD4A7, 0xBF4A, + 0xD4A8, 0xBF4B, 0xD4A9, 0xC7B5, 0xD4AA, 0xBF4C, 0xD4AB, 0xBF4D, + 0xD4AC, 0xBF4E, 0xD4AD, 0xBF4F, 0xD4AE, 0xBF50, 0xD4AF, 0xBF51, + 0xD4B0, 0xBF52, 0xD4B1, 0xBF53, 0xD4B2, 0xBF54, 0xD4B3, 0xBF55, + 0xD4B4, 0xBF56, 0xD4B5, 0xBF57, 0xD4B6, 0xBF58, 0xD4B7, 0xBF59, + 0xD4B8, 0xBF5A, 0xD4B9, 0xBF61, 0xD4BA, 0xBF62, 0xD4BB, 0xBF63, + 0xD4BC, 0xBF64, 0xD4BD, 0xBF65, 0xD4BE, 0xBF66, 0xD4BF, 0xBF67, + 0xD4C0, 0xBF68, 0xD4C1, 0xBF69, 0xD4C2, 0xBF6A, 0xD4C3, 0xBF6B, + 0xD4C4, 0xBF6C, 0xD4C5, 0xBF6D, 0xD4C6, 0xBF6E, 0xD4C7, 0xBF6F, + 0xD4C8, 0xBF70, 0xD4C9, 0xBF71, 0xD4CA, 0xBF72, 0xD4CB, 0xBF73, + 0xD4CC, 0xC7B6, 0xD4CD, 0xBF74, 0xD4CE, 0xBF75, 0xD4CF, 0xBF76, + 0xD4D0, 0xC7B7, 0xD4D1, 0xBF77, 0xD4D2, 0xBF78, 0xD4D3, 0xBF79, + 0xD4D4, 0xC7B8, 0xD4D5, 0xBF7A, 0xD4D6, 0xBF81, 0xD4D7, 0xBF82, + 0xD4D8, 0xBF83, 0xD4D9, 0xBF84, 0xD4DA, 0xBF85, 0xD4DB, 0xBF86, + 0xD4DC, 0xC7B9, 0xD4DD, 0xBF87, 0xD4DE, 0xBF88, 0xD4DF, 0xC7BA, + 0xD4E0, 0xBF89, 0xD4E1, 0xBF8A, 0xD4E2, 0xBF8B, 0xD4E3, 0xBF8C, + 0xD4E4, 0xBF8D, 0xD4E5, 0xBF8E, 0xD4E6, 0xBF8F, 0xD4E7, 0xBF90, + 0xD4E8, 0xC7BB, 0xD4E9, 0xBF91, 0xD4EA, 0xBF92, 0xD4EB, 0xBF93, + 0xD4EC, 0xC7BC, 0xD4ED, 0xBF94, 0xD4EE, 0xBF95, 0xD4EF, 0xBF96, + 0xD4F0, 0xC7BD, 0xD4F1, 0xBF97, 0xD4F2, 0xBF98, 0xD4F3, 0xBF99, + 0xD4F4, 0xBF9A, 0xD4F5, 0xBF9B, 0xD4F6, 0xBF9C, 0xD4F7, 0xBF9D, + 0xD4F8, 0xC7BE, 0xD4F9, 0xBF9E, 0xD4FA, 0xBF9F, 0xD4FB, 0xC7BF, + 0xD4FC, 0xBFA0, 0xD4FD, 0xC7C0, 0xD4FE, 0xC041, 0xD4FF, 0xC042, + 0xD500, 0xC043, 0xD501, 0xC044, 0xD502, 0xC045, 0xD503, 0xC046, + 0xD504, 0xC7C1, 0xD505, 0xC047, 0xD506, 0xC048, 0xD507, 0xC049, + 0xD508, 0xC7C2, 0xD509, 0xC04A, 0xD50A, 0xC04B, 0xD50B, 0xC04C, + 0xD50C, 0xC7C3, 0xD50D, 0xC04D, 0xD50E, 0xC04E, 0xD50F, 0xC04F, + 0xD510, 0xC050, 0xD511, 0xC051, 0xD512, 0xC052, 0xD513, 0xC053, + 0xD514, 0xC7C4, 0xD515, 0xC7C5, 0xD516, 0xC054, 0xD517, 0xC7C6, + 0xD518, 0xC055, 0xD519, 0xC056, 0xD51A, 0xC057, 0xD51B, 0xC058, + 0xD51C, 0xC059, 0xD51D, 0xC05A, 0xD51E, 0xC061, 0xD51F, 0xC062, + 0xD520, 0xC063, 0xD521, 0xC064, 0xD522, 0xC065, 0xD523, 0xC066, + 0xD524, 0xC067, 0xD525, 0xC068, 0xD526, 0xC069, 0xD527, 0xC06A, + 0xD528, 0xC06B, 0xD529, 0xC06C, 0xD52A, 0xC06D, 0xD52B, 0xC06E, + 0xD52C, 0xC06F, 0xD52D, 0xC070, 0xD52E, 0xC071, 0xD52F, 0xC072, + 0xD530, 0xC073, 0xD531, 0xC074, 0xD532, 0xC075, 0xD533, 0xC076, + 0xD534, 0xC077, 0xD535, 0xC078, 0xD536, 0xC079, 0xD537, 0xC07A, + 0xD538, 0xC081, 0xD539, 0xC082, 0xD53A, 0xC083, 0xD53B, 0xC084, + 0xD53C, 0xC7C7, 0xD53D, 0xC7C8, 0xD53E, 0xC085, 0xD53F, 0xC086, + 0xD540, 0xC7C9, 0xD541, 0xC087, 0xD542, 0xC088, 0xD543, 0xC089, + 0xD544, 0xC7CA, 0xD545, 0xC08A, 0xD546, 0xC08B, 0xD547, 0xC08C, + 0xD548, 0xC08D, 0xD549, 0xC08E, 0xD54A, 0xC08F, 0xD54B, 0xC090, + 0xD54C, 0xC7CB, 0xD54D, 0xC7CC, 0xD54E, 0xC091, 0xD54F, 0xC7CD, + 0xD550, 0xC092, 0xD551, 0xC7CE, 0xD552, 0xC093, 0xD553, 0xC094, + 0xD554, 0xC095, 0xD555, 0xC096, 0xD556, 0xC097, 0xD557, 0xC098, + 0xD558, 0xC7CF, 0xD559, 0xC7D0, 0xD55A, 0xC099, 0xD55B, 0xC09A, + 0xD55C, 0xC7D1, 0xD55D, 0xC09B, 0xD55E, 0xC09C, 0xD55F, 0xC09D, + 0xD560, 0xC7D2, 0xD561, 0xC09E, 0xD562, 0xC09F, 0xD563, 0xC0A0, + 0xD564, 0xC141, 0xD565, 0xC7D3, 0xD566, 0xC142, 0xD567, 0xC143, + 0xD568, 0xC7D4, 0xD569, 0xC7D5, 0xD56A, 0xC144, 0xD56B, 0xC7D6, + 0xD56C, 0xC145, 0xD56D, 0xC7D7, 0xD56E, 0xC146, 0xD56F, 0xC147, + 0xD570, 0xC148, 0xD571, 0xC149, 0xD572, 0xC14A, 0xD573, 0xC14B, + 0xD574, 0xC7D8, 0xD575, 0xC7D9, 0xD576, 0xC14C, 0xD577, 0xC14D, + 0xD578, 0xC7DA, 0xD579, 0xC14E, 0xD57A, 0xC14F, 0xD57B, 0xC150, + 0xD57C, 0xC7DB, 0xD57D, 0xC151, 0xD57E, 0xC152, 0xD57F, 0xC153, + 0xD580, 0xC154, 0xD581, 0xC155, 0xD582, 0xC156, 0xD583, 0xC157, + 0xD584, 0xC7DC, 0xD585, 0xC7DD, 0xD586, 0xC158, 0xD587, 0xC7DE, + 0xD588, 0xC7DF, 0xD589, 0xC7E0, 0xD58A, 0xC159, 0xD58B, 0xC15A, + 0xD58C, 0xC161, 0xD58D, 0xC162, 0xD58E, 0xC163, 0xD58F, 0xC164, + 0xD590, 0xC7E1, 0xD591, 0xC165, 0xD592, 0xC166, 0xD593, 0xC167, + 0xD594, 0xC168, 0xD595, 0xC169, 0xD596, 0xC16A, 0xD597, 0xC16B, + 0xD598, 0xC16C, 0xD599, 0xC16D, 0xD59A, 0xC16E, 0xD59B, 0xC16F, + 0xD59C, 0xC170, 0xD59D, 0xC171, 0xD59E, 0xC172, 0xD59F, 0xC173, + 0xD5A0, 0xC174, 0xD5A1, 0xC175, 0xD5A2, 0xC176, 0xD5A3, 0xC177, + 0xD5A4, 0xC178, 0xD5A5, 0xC7E2, 0xD5A6, 0xC179, 0xD5A7, 0xC17A, + 0xD5A8, 0xC181, 0xD5A9, 0xC182, 0xD5AA, 0xC183, 0xD5AB, 0xC184, + 0xD5AC, 0xC185, 0xD5AD, 0xC186, 0xD5AE, 0xC187, 0xD5AF, 0xC188, + 0xD5B0, 0xC189, 0xD5B1, 0xC18A, 0xD5B2, 0xC18B, 0xD5B3, 0xC18C, + 0xD5B4, 0xC18D, 0xD5B5, 0xC18E, 0xD5B6, 0xC18F, 0xD5B7, 0xC190, + 0xD5B8, 0xC191, 0xD5B9, 0xC192, 0xD5BA, 0xC193, 0xD5BB, 0xC194, + 0xD5BC, 0xC195, 0xD5BD, 0xC196, 0xD5BE, 0xC197, 0xD5BF, 0xC198, + 0xD5C0, 0xC199, 0xD5C1, 0xC19A, 0xD5C2, 0xC19B, 0xD5C3, 0xC19C, + 0xD5C4, 0xC19D, 0xD5C5, 0xC19E, 0xD5C6, 0xC19F, 0xD5C7, 0xC1A0, + 0xD5C8, 0xC7E3, 0xD5C9, 0xC7E4, 0xD5CA, 0xC241, 0xD5CB, 0xC242, + 0xD5CC, 0xC7E5, 0xD5CD, 0xC243, 0xD5CE, 0xC244, 0xD5CF, 0xC245, + 0xD5D0, 0xC7E6, 0xD5D1, 0xC246, 0xD5D2, 0xC7E7, 0xD5D3, 0xC247, + 0xD5D4, 0xC248, 0xD5D5, 0xC249, 0xD5D6, 0xC24A, 0xD5D7, 0xC24B, + 0xD5D8, 0xC7E8, 0xD5D9, 0xC7E9, 0xD5DA, 0xC24C, 0xD5DB, 0xC7EA, + 0xD5DC, 0xC24D, 0xD5DD, 0xC7EB, 0xD5DE, 0xC24E, 0xD5DF, 0xC24F, + 0xD5E0, 0xC250, 0xD5E1, 0xC251, 0xD5E2, 0xC252, 0xD5E3, 0xC253, + 0xD5E4, 0xC7EC, 0xD5E5, 0xC7ED, 0xD5E6, 0xC254, 0xD5E7, 0xC255, + 0xD5E8, 0xC7EE, 0xD5E9, 0xC256, 0xD5EA, 0xC257, 0xD5EB, 0xC258, + 0xD5EC, 0xC7EF, 0xD5ED, 0xC259, 0xD5EE, 0xC25A, 0xD5EF, 0xC261, + 0xD5F0, 0xC262, 0xD5F1, 0xC263, 0xD5F2, 0xC264, 0xD5F3, 0xC265, + 0xD5F4, 0xC7F0, 0xD5F5, 0xC7F1, 0xD5F6, 0xC266, 0xD5F7, 0xC7F2, + 0xD5F8, 0xC267, 0xD5F9, 0xC7F3, 0xD5FA, 0xC268, 0xD5FB, 0xC269, + 0xD5FC, 0xC26A, 0xD5FD, 0xC26B, 0xD5FE, 0xC26C, 0xD5FF, 0xC26D, + 0xD600, 0xC7F4, 0xD601, 0xC7F5, 0xD602, 0xC26E, 0xD603, 0xC26F, + 0xD604, 0xC7F6, 0xD605, 0xC270, 0xD606, 0xC271, 0xD607, 0xC272, + 0xD608, 0xC7F7, 0xD609, 0xC273, 0xD60A, 0xC274, 0xD60B, 0xC275, + 0xD60C, 0xC276, 0xD60D, 0xC277, 0xD60E, 0xC278, 0xD60F, 0xC279, + 0xD610, 0xC7F8, 0xD611, 0xC7F9, 0xD612, 0xC27A, 0xD613, 0xC7FA, + 0xD614, 0xC7FB, 0xD615, 0xC7FC, 0xD616, 0xC281, 0xD617, 0xC282, + 0xD618, 0xC283, 0xD619, 0xC284, 0xD61A, 0xC285, 0xD61B, 0xC286, + 0xD61C, 0xC7FD, 0xD61D, 0xC287, 0xD61E, 0xC288, 0xD61F, 0xC289, + 0xD620, 0xC7FE, 0xD621, 0xC28A, 0xD622, 0xC28B, 0xD623, 0xC28C, + 0xD624, 0xC8A1, 0xD625, 0xC28D, 0xD626, 0xC28E, 0xD627, 0xC28F, + 0xD628, 0xC290, 0xD629, 0xC291, 0xD62A, 0xC292, 0xD62B, 0xC293, + 0xD62C, 0xC294, 0xD62D, 0xC8A2, 0xD62E, 0xC295, 0xD62F, 0xC296, + 0xD630, 0xC297, 0xD631, 0xC298, 0xD632, 0xC299, 0xD633, 0xC29A, + 0xD634, 0xC29B, 0xD635, 0xC29C, 0xD636, 0xC29D, 0xD637, 0xC29E, + 0xD638, 0xC8A3, 0xD639, 0xC8A4, 0xD63A, 0xC29F, 0xD63B, 0xC2A0, + 0xD63C, 0xC8A5, 0xD63D, 0xC341, 0xD63E, 0xC342, 0xD63F, 0xC343, + 0xD640, 0xC8A6, 0xD641, 0xC344, 0xD642, 0xC345, 0xD643, 0xC346, + 0xD644, 0xC347, 0xD645, 0xC8A7, 0xD646, 0xC348, 0xD647, 0xC349, + 0xD648, 0xC8A8, 0xD649, 0xC8A9, 0xD64A, 0xC34A, 0xD64B, 0xC8AA, + 0xD64C, 0xC34B, 0xD64D, 0xC8AB, 0xD64E, 0xC34C, 0xD64F, 0xC34D, + 0xD650, 0xC34E, 0xD651, 0xC8AC, 0xD652, 0xC34F, 0xD653, 0xC350, + 0xD654, 0xC8AD, 0xD655, 0xC8AE, 0xD656, 0xC351, 0xD657, 0xC352, + 0xD658, 0xC8AF, 0xD659, 0xC353, 0xD65A, 0xC354, 0xD65B, 0xC355, + 0xD65C, 0xC8B0, 0xD65D, 0xC356, 0xD65E, 0xC357, 0xD65F, 0xC358, + 0xD660, 0xC359, 0xD661, 0xC35A, 0xD662, 0xC361, 0xD663, 0xC362, + 0xD664, 0xC363, 0xD665, 0xC364, 0xD666, 0xC365, 0xD667, 0xC8B1, + 0xD668, 0xC366, 0xD669, 0xC8B2, 0xD66A, 0xC367, 0xD66B, 0xC368, + 0xD66C, 0xC369, 0xD66D, 0xC36A, 0xD66E, 0xC36B, 0xD66F, 0xC36C, + 0xD670, 0xC8B3, 0xD671, 0xC8B4, 0xD672, 0xC36D, 0xD673, 0xC36E, + 0xD674, 0xC8B5, 0xD675, 0xC36F, 0xD676, 0xC370, 0xD677, 0xC371, + 0xD678, 0xC372, 0xD679, 0xC373, 0xD67A, 0xC374, 0xD67B, 0xC375, + 0xD67C, 0xC376, 0xD67D, 0xC377, 0xD67E, 0xC378, 0xD67F, 0xC379, + 0xD680, 0xC37A, 0xD681, 0xC381, 0xD682, 0xC382, 0xD683, 0xC8B6, + 0xD684, 0xC383, 0xD685, 0xC8B7, 0xD686, 0xC384, 0xD687, 0xC385, + 0xD688, 0xC386, 0xD689, 0xC387, 0xD68A, 0xC388, 0xD68B, 0xC389, + 0xD68C, 0xC8B8, 0xD68D, 0xC8B9, 0xD68E, 0xC38A, 0xD68F, 0xC38B, + 0xD690, 0xC8BA, 0xD691, 0xC38C, 0xD692, 0xC38D, 0xD693, 0xC38E, + 0xD694, 0xC8BB, 0xD695, 0xC38F, 0xD696, 0xC390, 0xD697, 0xC391, + 0xD698, 0xC392, 0xD699, 0xC393, 0xD69A, 0xC394, 0xD69B, 0xC395, + 0xD69C, 0xC396, 0xD69D, 0xC8BC, 0xD69E, 0xC397, 0xD69F, 0xC8BD, + 0xD6A0, 0xC398, 0xD6A1, 0xC8BE, 0xD6A2, 0xC399, 0xD6A3, 0xC39A, + 0xD6A4, 0xC39B, 0xD6A5, 0xC39C, 0xD6A6, 0xC39D, 0xD6A7, 0xC39E, + 0xD6A8, 0xC8BF, 0xD6A9, 0xC39F, 0xD6AA, 0xC3A0, 0xD6AB, 0xC441, + 0xD6AC, 0xC8C0, 0xD6AD, 0xC442, 0xD6AE, 0xC443, 0xD6AF, 0xC444, + 0xD6B0, 0xC8C1, 0xD6B1, 0xC445, 0xD6B2, 0xC446, 0xD6B3, 0xC447, + 0xD6B4, 0xC448, 0xD6B5, 0xC449, 0xD6B6, 0xC44A, 0xD6B7, 0xC44B, + 0xD6B8, 0xC44C, 0xD6B9, 0xC8C2, 0xD6BA, 0xC44D, 0xD6BB, 0xC8C3, + 0xD6BC, 0xC44E, 0xD6BD, 0xC44F, 0xD6BE, 0xC450, 0xD6BF, 0xC451, + 0xD6C0, 0xC452, 0xD6C1, 0xC453, 0xD6C2, 0xC454, 0xD6C3, 0xC455, + 0xD6C4, 0xC8C4, 0xD6C5, 0xC8C5, 0xD6C6, 0xC456, 0xD6C7, 0xC457, + 0xD6C8, 0xC8C6, 0xD6C9, 0xC458, 0xD6CA, 0xC459, 0xD6CB, 0xC45A, + 0xD6CC, 0xC8C7, 0xD6CD, 0xC461, 0xD6CE, 0xC462, 0xD6CF, 0xC463, + 0xD6D0, 0xC464, 0xD6D1, 0xC8C8, 0xD6D2, 0xC465, 0xD6D3, 0xC466, + 0xD6D4, 0xC8C9, 0xD6D5, 0xC467, 0xD6D6, 0xC468, 0xD6D7, 0xC8CA, + 0xD6D8, 0xC469, 0xD6D9, 0xC8CB, 0xD6DA, 0xC46A, 0xD6DB, 0xC46B, + 0xD6DC, 0xC46C, 0xD6DD, 0xC46D, 0xD6DE, 0xC46E, 0xD6DF, 0xC46F, + 0xD6E0, 0xC8CC, 0xD6E1, 0xC470, 0xD6E2, 0xC471, 0xD6E3, 0xC472, + 0xD6E4, 0xC8CD, 0xD6E5, 0xC473, 0xD6E6, 0xC474, 0xD6E7, 0xC475, + 0xD6E8, 0xC8CE, 0xD6E9, 0xC476, 0xD6EA, 0xC477, 0xD6EB, 0xC478, + 0xD6EC, 0xC479, 0xD6ED, 0xC47A, 0xD6EE, 0xC481, 0xD6EF, 0xC482, + 0xD6F0, 0xC8CF, 0xD6F1, 0xC483, 0xD6F2, 0xC484, 0xD6F3, 0xC485, + 0xD6F4, 0xC486, 0xD6F5, 0xC8D0, 0xD6F6, 0xC487, 0xD6F7, 0xC488, + 0xD6F8, 0xC489, 0xD6F9, 0xC48A, 0xD6FA, 0xC48B, 0xD6FB, 0xC48C, + 0xD6FC, 0xC8D1, 0xD6FD, 0xC8D2, 0xD6FE, 0xC48D, 0xD6FF, 0xC48E, + 0xD700, 0xC8D3, 0xD701, 0xC48F, 0xD702, 0xC490, 0xD703, 0xC491, + 0xD704, 0xC8D4, 0xD705, 0xC492, 0xD706, 0xC493, 0xD707, 0xC494, + 0xD708, 0xC495, 0xD709, 0xC496, 0xD70A, 0xC497, 0xD70B, 0xC498, + 0xD70C, 0xC499, 0xD70D, 0xC49A, 0xD70E, 0xC49B, 0xD70F, 0xC49C, + 0xD710, 0xC49D, 0xD711, 0xC8D5, 0xD712, 0xC49E, 0xD713, 0xC49F, + 0xD714, 0xC4A0, 0xD715, 0xC541, 0xD716, 0xC542, 0xD717, 0xC543, + 0xD718, 0xC8D6, 0xD719, 0xC8D7, 0xD71A, 0xC544, 0xD71B, 0xC545, + 0xD71C, 0xC8D8, 0xD71D, 0xC546, 0xD71E, 0xC547, 0xD71F, 0xC548, + 0xD720, 0xC8D9, 0xD721, 0xC549, 0xD722, 0xC54A, 0xD723, 0xC54B, + 0xD724, 0xC54C, 0xD725, 0xC54D, 0xD726, 0xC54E, 0xD727, 0xC54F, + 0xD728, 0xC8DA, 0xD729, 0xC8DB, 0xD72A, 0xC550, 0xD72B, 0xC8DC, + 0xD72C, 0xC551, 0xD72D, 0xC8DD, 0xD72E, 0xC552, 0xD72F, 0xC553, + 0xD730, 0xC554, 0xD731, 0xC555, 0xD732, 0xC556, 0xD733, 0xC557, + 0xD734, 0xC8DE, 0xD735, 0xC8DF, 0xD736, 0xC558, 0xD737, 0xC559, + 0xD738, 0xC8E0, 0xD739, 0xC55A, 0xD73A, 0xC561, 0xD73B, 0xC562, + 0xD73C, 0xC8E1, 0xD73D, 0xC563, 0xD73E, 0xC564, 0xD73F, 0xC565, + 0xD740, 0xC566, 0xD741, 0xC567, 0xD742, 0xC568, 0xD743, 0xC569, + 0xD744, 0xC8E2, 0xD745, 0xC56A, 0xD746, 0xC56B, 0xD747, 0xC8E3, + 0xD748, 0xC56C, 0xD749, 0xC8E4, 0xD74A, 0xC56D, 0xD74B, 0xC56E, + 0xD74C, 0xC56F, 0xD74D, 0xC570, 0xD74E, 0xC571, 0xD74F, 0xC572, + 0xD750, 0xC8E5, 0xD751, 0xC8E6, 0xD752, 0xC573, 0xD753, 0xC574, + 0xD754, 0xC8E7, 0xD755, 0xC575, 0xD756, 0xC8E8, 0xD757, 0xC8E9, + 0xD758, 0xC8EA, 0xD759, 0xC8EB, 0xD75A, 0xC576, 0xD75B, 0xC577, + 0xD75C, 0xC578, 0xD75D, 0xC579, 0xD75E, 0xC57A, 0xD75F, 0xC581, + 0xD760, 0xC8EC, 0xD761, 0xC8ED, 0xD762, 0xC582, 0xD763, 0xC8EE, + 0xD764, 0xC583, 0xD765, 0xC8EF, 0xD766, 0xC584, 0xD767, 0xC585, + 0xD768, 0xC586, 0xD769, 0xC8F0, 0xD76A, 0xC587, 0xD76B, 0xC588, + 0xD76C, 0xC8F1, 0xD76D, 0xC589, 0xD76E, 0xC58A, 0xD76F, 0xC58B, + 0xD770, 0xC8F2, 0xD771, 0xC58C, 0xD772, 0xC58D, 0xD773, 0xC58E, + 0xD774, 0xC8F3, 0xD775, 0xC58F, 0xD776, 0xC590, 0xD777, 0xC591, + 0xD778, 0xC592, 0xD779, 0xC593, 0xD77A, 0xC594, 0xD77B, 0xC595, + 0xD77C, 0xC8F4, 0xD77D, 0xC8F5, 0xD77E, 0xC596, 0xD77F, 0xC597, + 0xD780, 0xC598, 0xD781, 0xC8F6, 0xD782, 0xC599, 0xD783, 0xC59A, + 0xD784, 0xC59B, 0xD785, 0xC59C, 0xD786, 0xC59D, 0xD787, 0xC59E, + 0xD788, 0xC8F7, 0xD789, 0xC8F8, 0xD78A, 0xC59F, 0xD78B, 0xC5A0, + 0xD78C, 0xC8F9, 0xD78D, 0xC641, 0xD78E, 0xC642, 0xD78F, 0xC643, + 0xD790, 0xC8FA, 0xD791, 0xC644, 0xD792, 0xC645, 0xD793, 0xC646, + 0xD794, 0xC647, 0xD795, 0xC648, 0xD796, 0xC649, 0xD797, 0xC64A, + 0xD798, 0xC8FB, 0xD799, 0xC8FC, 0xD79A, 0xC64B, 0xD79B, 0xC8FD, + 0xD79C, 0xC64C, 0xD79D, 0xC8FE, 0xD79E, 0xC64D, 0xD79F, 0xC64E, + 0xD7A0, 0xC64F, 0xD7A1, 0xC650, 0xD7A2, 0xC651, 0xD7A3, 0xC652, + 0xF900, 0xCBD0, 0xF901, 0xCBD6, 0xF902, 0xCBE7, 0xF903, 0xCDCF, + 0xF904, 0xCDE8, 0xF905, 0xCEAD, 0xF906, 0xCFFB, 0xF907, 0xD0A2, + 0xF908, 0xD0B8, 0xF909, 0xD0D0, 0xF90A, 0xD0DD, 0xF90B, 0xD1D4, + 0xF90C, 0xD1D5, 0xF90D, 0xD1D8, 0xF90E, 0xD1DB, 0xF90F, 0xD1DC, + 0xF910, 0xD1DD, 0xF911, 0xD1DE, 0xF912, 0xD1DF, 0xF913, 0xD1E0, + 0xF914, 0xD1E2, 0xF915, 0xD1E3, 0xF916, 0xD1E4, 0xF917, 0xD1E5, + 0xF918, 0xD1E6, 0xF919, 0xD1E8, 0xF91A, 0xD1E9, 0xF91B, 0xD1EA, + 0xF91C, 0xD1EB, 0xF91D, 0xD1ED, 0xF91E, 0xD1EF, 0xF91F, 0xD1F0, + 0xF920, 0xD1F2, 0xF921, 0xD1F6, 0xF922, 0xD1FA, 0xF923, 0xD1FC, + 0xF924, 0xD1FD, 0xF925, 0xD1FE, 0xF926, 0xD2A2, 0xF927, 0xD2A3, + 0xF928, 0xD2A7, 0xF929, 0xD2A8, 0xF92A, 0xD2A9, 0xF92B, 0xD2AA, + 0xF92C, 0xD2AB, 0xF92D, 0xD2AD, 0xF92E, 0xD2B2, 0xF92F, 0xD2BE, + 0xF930, 0xD2C2, 0xF931, 0xD2C3, 0xF932, 0xD2C4, 0xF933, 0xD2C6, + 0xF934, 0xD2C7, 0xF935, 0xD2C8, 0xF936, 0xD2C9, 0xF937, 0xD2CA, + 0xF938, 0xD2CB, 0xF939, 0xD2CD, 0xF93A, 0xD2CE, 0xF93B, 0xD2CF, + 0xF93C, 0xD2D0, 0xF93D, 0xD2D1, 0xF93E, 0xD2D2, 0xF93F, 0xD2D3, + 0xF940, 0xD2D4, 0xF941, 0xD2D5, 0xF942, 0xD2D6, 0xF943, 0xD2D7, + 0xF944, 0xD2D9, 0xF945, 0xD2DA, 0xF946, 0xD2DE, 0xF947, 0xD2DF, + 0xF948, 0xD2E1, 0xF949, 0xD2E2, 0xF94A, 0xD2E4, 0xF94B, 0xD2E5, + 0xF94C, 0xD2E6, 0xF94D, 0xD2E7, 0xF94E, 0xD2E8, 0xF94F, 0xD2E9, + 0xF950, 0xD2EA, 0xF951, 0xD2EB, 0xF952, 0xD2F0, 0xF953, 0xD2F1, + 0xF954, 0xD2F2, 0xF955, 0xD2F3, 0xF956, 0xD2F4, 0xF957, 0xD2F5, + 0xF958, 0xD2F7, 0xF959, 0xD2F8, 0xF95A, 0xD4E6, 0xF95B, 0xD4FC, + 0xF95C, 0xD5A5, 0xF95D, 0xD5AB, 0xF95E, 0xD5AE, 0xF95F, 0xD6B8, + 0xF960, 0xD6CD, 0xF961, 0xD7CB, 0xF962, 0xD7E4, 0xF963, 0xDBC5, + 0xF964, 0xDBE4, 0xF965, 0xDCA5, 0xF966, 0xDDA5, 0xF967, 0xDDD5, + 0xF968, 0xDDF4, 0xF969, 0xDEFC, 0xF96A, 0xDEFE, 0xF96B, 0xDFB3, + 0xF96C, 0xDFE1, 0xF96D, 0xDFE8, 0xF96E, 0xE0F1, 0xF96F, 0xE1AD, + 0xF970, 0xE1ED, 0xF971, 0xE3F5, 0xF972, 0xE4A1, 0xF973, 0xE4A9, + 0xF974, 0xE5AE, 0xF975, 0xE5B1, 0xF976, 0xE5B2, 0xF977, 0xE5B9, + 0xF978, 0xE5BB, 0xF979, 0xE5BC, 0xF97A, 0xE5C4, 0xF97B, 0xE5CE, + 0xF97C, 0xE5D0, 0xF97D, 0xE5D2, 0xF97E, 0xE5D6, 0xF97F, 0xE5FA, + 0xF980, 0xE5FB, 0xF981, 0xE5FC, 0xF982, 0xE5FE, 0xF983, 0xE6A1, + 0xF984, 0xE6A4, 0xF985, 0xE6A7, 0xF986, 0xE6AD, 0xF987, 0xE6AF, + 0xF988, 0xE6B0, 0xF989, 0xE6B1, 0xF98A, 0xE6B3, 0xF98B, 0xE6B7, + 0xF98C, 0xE6B8, 0xF98D, 0xE6BC, 0xF98E, 0xE6C4, 0xF98F, 0xE6C6, + 0xF990, 0xE6C7, 0xF991, 0xE6CA, 0xF992, 0xE6D2, 0xF993, 0xE6D6, + 0xF994, 0xE6D9, 0xF995, 0xE6DC, 0xF996, 0xE6DF, 0xF997, 0xE6E1, + 0xF998, 0xE6E4, 0xF999, 0xE6E5, 0xF99A, 0xE6E6, 0xF99B, 0xE6E8, + 0xF99C, 0xE6EA, 0xF99D, 0xE6EB, 0xF99E, 0xE6EC, 0xF99F, 0xE6EF, + 0xF9A0, 0xE6F1, 0xF9A1, 0xE6F2, 0xF9A2, 0xE6F5, 0xF9A3, 0xE6F6, + 0xF9A4, 0xE6F7, 0xF9A5, 0xE6F9, 0xF9A6, 0xE7A1, 0xF9A7, 0xE7A6, + 0xF9A8, 0xE7A9, 0xF9A9, 0xE7AA, 0xF9AA, 0xE7AC, 0xF9AB, 0xE7AD, + 0xF9AC, 0xE7B0, 0xF9AD, 0xE7BF, 0xF9AE, 0xE7C1, 0xF9AF, 0xE7C6, + 0xF9B0, 0xE7C7, 0xF9B1, 0xE7CB, 0xF9B2, 0xE7CD, 0xF9B3, 0xE7CF, + 0xF9B4, 0xE7D0, 0xF9B5, 0xE7D3, 0xF9B6, 0xE7DF, 0xF9B7, 0xE7E4, + 0xF9B8, 0xE7E6, 0xF9B9, 0xE7F7, 0xF9BA, 0xE8E7, 0xF9BB, 0xE8E8, + 0xF9BC, 0xE8F0, 0xF9BD, 0xE8F1, 0xF9BE, 0xE8F7, 0xF9BF, 0xE8F9, + 0xF9C0, 0xE8FB, 0xF9C1, 0xE8FE, 0xF9C2, 0xE9A7, 0xF9C3, 0xE9AC, + 0xF9C4, 0xE9CC, 0xF9C5, 0xE9F7, 0xF9C6, 0xEAC1, 0xF9C7, 0xEAE5, + 0xF9C8, 0xEAF4, 0xF9C9, 0xEAF7, 0xF9CA, 0xEAFC, 0xF9CB, 0xEAFE, + 0xF9CC, 0xEBA4, 0xF9CD, 0xEBA7, 0xF9CE, 0xEBA9, 0xF9CF, 0xEBAA, + 0xF9D0, 0xEBBA, 0xF9D1, 0xEBBB, 0xF9D2, 0xEBBD, 0xF9D3, 0xEBC1, + 0xF9D4, 0xEBC2, 0xF9D5, 0xEBC6, 0xF9D6, 0xEBC7, 0xF9D7, 0xEBCC, + 0xF9D8, 0xEBCF, 0xF9D9, 0xEBD0, 0xF9DA, 0xEBD1, 0xF9DB, 0xEBD2, + 0xF9DC, 0xEBD8, 0xF9DD, 0xECA6, 0xF9DE, 0xECA7, 0xF9DF, 0xECAA, + 0xF9E0, 0xECAF, 0xF9E1, 0xECB0, 0xF9E2, 0xECB1, 0xF9E3, 0xECB2, + 0xF9E4, 0xECB5, 0xF9E5, 0xECB8, 0xF9E6, 0xECBA, 0xF9E7, 0xECC0, + 0xF9E8, 0xECC1, 0xF9E9, 0xECC5, 0xF9EA, 0xECC6, 0xF9EB, 0xECC9, + 0xF9EC, 0xECCA, 0xF9ED, 0xECD5, 0xF9EE, 0xECDD, 0xF9EF, 0xECDE, + 0xF9F0, 0xECE1, 0xF9F1, 0xECE4, 0xF9F2, 0xECE7, 0xF9F3, 0xECE8, + 0xF9F4, 0xECF7, 0xF9F5, 0xECF8, 0xF9F6, 0xECFA, 0xF9F7, 0xEDA1, + 0xF9F8, 0xEDA2, 0xF9F9, 0xEDA3, 0xF9FA, 0xEDEE, 0xF9FB, 0xEEDB, + 0xF9FC, 0xF2BD, 0xF9FD, 0xF2FA, 0xF9FE, 0xF3B1, 0xF9FF, 0xF4A7, + 0xFA00, 0xF4EE, 0xFA01, 0xF6F4, 0xFA02, 0xF6F6, 0xFA03, 0xF7B8, + 0xFA04, 0xF7C8, 0xFA05, 0xF7D3, 0xFA06, 0xF8DB, 0xFA07, 0xF8F0, + 0xFA08, 0xFAA1, 0xFA09, 0xFAA2, 0xFA0A, 0xFAE6, 0xFA0B, 0xFCA9, + 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA3A4, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, + 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, + 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, + 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, + 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, + 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, + 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, + 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA1AC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, + 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, + 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, + 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, + 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA2A6, 0xFFE0, 0xA1CB, 0xFFE1, 0xA1CC, + 0xFFE2, 0xA1FE, 0xFFE3, 0xA3FE, 0xFFE5, 0xA1CD, 0xFFE6, 0xA3DC, + 0, 0 +}; + +static +const WCHAR oem2uni[] = { +/* OEM - Unicode, OEM - Unicode, OEM - Unicode, OEM - Unicode */ + 0x8141, 0xAC02, 0x8142, 0xAC03, 0x8143, 0xAC05, 0x8144, 0xAC06, + 0x8145, 0xAC0B, 0x8146, 0xAC0C, 0x8147, 0xAC0D, 0x8148, 0xAC0E, + 0x8149, 0xAC0F, 0x814A, 0xAC18, 0x814B, 0xAC1E, 0x814C, 0xAC1F, + 0x814D, 0xAC21, 0x814E, 0xAC22, 0x814F, 0xAC23, 0x8150, 0xAC25, + 0x8151, 0xAC26, 0x8152, 0xAC27, 0x8153, 0xAC28, 0x8154, 0xAC29, + 0x8155, 0xAC2A, 0x8156, 0xAC2B, 0x8157, 0xAC2E, 0x8158, 0xAC32, + 0x8159, 0xAC33, 0x815A, 0xAC34, 0x8161, 0xAC35, 0x8162, 0xAC36, + 0x8163, 0xAC37, 0x8164, 0xAC3A, 0x8165, 0xAC3B, 0x8166, 0xAC3D, + 0x8167, 0xAC3E, 0x8168, 0xAC3F, 0x8169, 0xAC41, 0x816A, 0xAC42, + 0x816B, 0xAC43, 0x816C, 0xAC44, 0x816D, 0xAC45, 0x816E, 0xAC46, + 0x816F, 0xAC47, 0x8170, 0xAC48, 0x8171, 0xAC49, 0x8172, 0xAC4A, + 0x8173, 0xAC4C, 0x8174, 0xAC4E, 0x8175, 0xAC4F, 0x8176, 0xAC50, + 0x8177, 0xAC51, 0x8178, 0xAC52, 0x8179, 0xAC53, 0x817A, 0xAC55, + 0x8181, 0xAC56, 0x8182, 0xAC57, 0x8183, 0xAC59, 0x8184, 0xAC5A, + 0x8185, 0xAC5B, 0x8186, 0xAC5D, 0x8187, 0xAC5E, 0x8188, 0xAC5F, + 0x8189, 0xAC60, 0x818A, 0xAC61, 0x818B, 0xAC62, 0x818C, 0xAC63, + 0x818D, 0xAC64, 0x818E, 0xAC65, 0x818F, 0xAC66, 0x8190, 0xAC67, + 0x8191, 0xAC68, 0x8192, 0xAC69, 0x8193, 0xAC6A, 0x8194, 0xAC6B, + 0x8195, 0xAC6C, 0x8196, 0xAC6D, 0x8197, 0xAC6E, 0x8198, 0xAC6F, + 0x8199, 0xAC72, 0x819A, 0xAC73, 0x819B, 0xAC75, 0x819C, 0xAC76, + 0x819D, 0xAC79, 0x819E, 0xAC7B, 0x819F, 0xAC7C, 0x81A0, 0xAC7D, + 0x81A1, 0xAC7E, 0x81A2, 0xAC7F, 0x81A3, 0xAC82, 0x81A4, 0xAC87, + 0x81A5, 0xAC88, 0x81A6, 0xAC8D, 0x81A7, 0xAC8E, 0x81A8, 0xAC8F, + 0x81A9, 0xAC91, 0x81AA, 0xAC92, 0x81AB, 0xAC93, 0x81AC, 0xAC95, + 0x81AD, 0xAC96, 0x81AE, 0xAC97, 0x81AF, 0xAC98, 0x81B0, 0xAC99, + 0x81B1, 0xAC9A, 0x81B2, 0xAC9B, 0x81B3, 0xAC9E, 0x81B4, 0xACA2, + 0x81B5, 0xACA3, 0x81B6, 0xACA4, 0x81B7, 0xACA5, 0x81B8, 0xACA6, + 0x81B9, 0xACA7, 0x81BA, 0xACAB, 0x81BB, 0xACAD, 0x81BC, 0xACAE, + 0x81BD, 0xACB1, 0x81BE, 0xACB2, 0x81BF, 0xACB3, 0x81C0, 0xACB4, + 0x81C1, 0xACB5, 0x81C2, 0xACB6, 0x81C3, 0xACB7, 0x81C4, 0xACBA, + 0x81C5, 0xACBE, 0x81C6, 0xACBF, 0x81C7, 0xACC0, 0x81C8, 0xACC2, + 0x81C9, 0xACC3, 0x81CA, 0xACC5, 0x81CB, 0xACC6, 0x81CC, 0xACC7, + 0x81CD, 0xACC9, 0x81CE, 0xACCA, 0x81CF, 0xACCB, 0x81D0, 0xACCD, + 0x81D1, 0xACCE, 0x81D2, 0xACCF, 0x81D3, 0xACD0, 0x81D4, 0xACD1, + 0x81D5, 0xACD2, 0x81D6, 0xACD3, 0x81D7, 0xACD4, 0x81D8, 0xACD6, + 0x81D9, 0xACD8, 0x81DA, 0xACD9, 0x81DB, 0xACDA, 0x81DC, 0xACDB, + 0x81DD, 0xACDC, 0x81DE, 0xACDD, 0x81DF, 0xACDE, 0x81E0, 0xACDF, + 0x81E1, 0xACE2, 0x81E2, 0xACE3, 0x81E3, 0xACE5, 0x81E4, 0xACE6, + 0x81E5, 0xACE9, 0x81E6, 0xACEB, 0x81E7, 0xACED, 0x81E8, 0xACEE, + 0x81E9, 0xACF2, 0x81EA, 0xACF4, 0x81EB, 0xACF7, 0x81EC, 0xACF8, + 0x81ED, 0xACF9, 0x81EE, 0xACFA, 0x81EF, 0xACFB, 0x81F0, 0xACFE, + 0x81F1, 0xACFF, 0x81F2, 0xAD01, 0x81F3, 0xAD02, 0x81F4, 0xAD03, + 0x81F5, 0xAD05, 0x81F6, 0xAD07, 0x81F7, 0xAD08, 0x81F8, 0xAD09, + 0x81F9, 0xAD0A, 0x81FA, 0xAD0B, 0x81FB, 0xAD0E, 0x81FC, 0xAD10, + 0x81FD, 0xAD12, 0x81FE, 0xAD13, 0x8241, 0xAD14, 0x8242, 0xAD15, + 0x8243, 0xAD16, 0x8244, 0xAD17, 0x8245, 0xAD19, 0x8246, 0xAD1A, + 0x8247, 0xAD1B, 0x8248, 0xAD1D, 0x8249, 0xAD1E, 0x824A, 0xAD1F, + 0x824B, 0xAD21, 0x824C, 0xAD22, 0x824D, 0xAD23, 0x824E, 0xAD24, + 0x824F, 0xAD25, 0x8250, 0xAD26, 0x8251, 0xAD27, 0x8252, 0xAD28, + 0x8253, 0xAD2A, 0x8254, 0xAD2B, 0x8255, 0xAD2E, 0x8256, 0xAD2F, + 0x8257, 0xAD30, 0x8258, 0xAD31, 0x8259, 0xAD32, 0x825A, 0xAD33, + 0x8261, 0xAD36, 0x8262, 0xAD37, 0x8263, 0xAD39, 0x8264, 0xAD3A, + 0x8265, 0xAD3B, 0x8266, 0xAD3D, 0x8267, 0xAD3E, 0x8268, 0xAD3F, + 0x8269, 0xAD40, 0x826A, 0xAD41, 0x826B, 0xAD42, 0x826C, 0xAD43, + 0x826D, 0xAD46, 0x826E, 0xAD48, 0x826F, 0xAD4A, 0x8270, 0xAD4B, + 0x8271, 0xAD4C, 0x8272, 0xAD4D, 0x8273, 0xAD4E, 0x8274, 0xAD4F, + 0x8275, 0xAD51, 0x8276, 0xAD52, 0x8277, 0xAD53, 0x8278, 0xAD55, + 0x8279, 0xAD56, 0x827A, 0xAD57, 0x8281, 0xAD59, 0x8282, 0xAD5A, + 0x8283, 0xAD5B, 0x8284, 0xAD5C, 0x8285, 0xAD5D, 0x8286, 0xAD5E, + 0x8287, 0xAD5F, 0x8288, 0xAD60, 0x8289, 0xAD62, 0x828A, 0xAD64, + 0x828B, 0xAD65, 0x828C, 0xAD66, 0x828D, 0xAD67, 0x828E, 0xAD68, + 0x828F, 0xAD69, 0x8290, 0xAD6A, 0x8291, 0xAD6B, 0x8292, 0xAD6E, + 0x8293, 0xAD6F, 0x8294, 0xAD71, 0x8295, 0xAD72, 0x8296, 0xAD77, + 0x8297, 0xAD78, 0x8298, 0xAD79, 0x8299, 0xAD7A, 0x829A, 0xAD7E, + 0x829B, 0xAD80, 0x829C, 0xAD83, 0x829D, 0xAD84, 0x829E, 0xAD85, + 0x829F, 0xAD86, 0x82A0, 0xAD87, 0x82A1, 0xAD8A, 0x82A2, 0xAD8B, + 0x82A3, 0xAD8D, 0x82A4, 0xAD8E, 0x82A5, 0xAD8F, 0x82A6, 0xAD91, + 0x82A7, 0xAD92, 0x82A8, 0xAD93, 0x82A9, 0xAD94, 0x82AA, 0xAD95, + 0x82AB, 0xAD96, 0x82AC, 0xAD97, 0x82AD, 0xAD98, 0x82AE, 0xAD99, + 0x82AF, 0xAD9A, 0x82B0, 0xAD9B, 0x82B1, 0xAD9E, 0x82B2, 0xAD9F, + 0x82B3, 0xADA0, 0x82B4, 0xADA1, 0x82B5, 0xADA2, 0x82B6, 0xADA3, + 0x82B7, 0xADA5, 0x82B8, 0xADA6, 0x82B9, 0xADA7, 0x82BA, 0xADA8, + 0x82BB, 0xADA9, 0x82BC, 0xADAA, 0x82BD, 0xADAB, 0x82BE, 0xADAC, + 0x82BF, 0xADAD, 0x82C0, 0xADAE, 0x82C1, 0xADAF, 0x82C2, 0xADB0, + 0x82C3, 0xADB1, 0x82C4, 0xADB2, 0x82C5, 0xADB3, 0x82C6, 0xADB4, + 0x82C7, 0xADB5, 0x82C8, 0xADB6, 0x82C9, 0xADB8, 0x82CA, 0xADB9, + 0x82CB, 0xADBA, 0x82CC, 0xADBB, 0x82CD, 0xADBC, 0x82CE, 0xADBD, + 0x82CF, 0xADBE, 0x82D0, 0xADBF, 0x82D1, 0xADC2, 0x82D2, 0xADC3, + 0x82D3, 0xADC5, 0x82D4, 0xADC6, 0x82D5, 0xADC7, 0x82D6, 0xADC9, + 0x82D7, 0xADCA, 0x82D8, 0xADCB, 0x82D9, 0xADCC, 0x82DA, 0xADCD, + 0x82DB, 0xADCE, 0x82DC, 0xADCF, 0x82DD, 0xADD2, 0x82DE, 0xADD4, + 0x82DF, 0xADD5, 0x82E0, 0xADD6, 0x82E1, 0xADD7, 0x82E2, 0xADD8, + 0x82E3, 0xADD9, 0x82E4, 0xADDA, 0x82E5, 0xADDB, 0x82E6, 0xADDD, + 0x82E7, 0xADDE, 0x82E8, 0xADDF, 0x82E9, 0xADE1, 0x82EA, 0xADE2, + 0x82EB, 0xADE3, 0x82EC, 0xADE5, 0x82ED, 0xADE6, 0x82EE, 0xADE7, + 0x82EF, 0xADE8, 0x82F0, 0xADE9, 0x82F1, 0xADEA, 0x82F2, 0xADEB, + 0x82F3, 0xADEC, 0x82F4, 0xADED, 0x82F5, 0xADEE, 0x82F6, 0xADEF, + 0x82F7, 0xADF0, 0x82F8, 0xADF1, 0x82F9, 0xADF2, 0x82FA, 0xADF3, + 0x82FB, 0xADF4, 0x82FC, 0xADF5, 0x82FD, 0xADF6, 0x82FE, 0xADF7, + 0x8341, 0xADFA, 0x8342, 0xADFB, 0x8343, 0xADFD, 0x8344, 0xADFE, + 0x8345, 0xAE02, 0x8346, 0xAE03, 0x8347, 0xAE04, 0x8348, 0xAE05, + 0x8349, 0xAE06, 0x834A, 0xAE07, 0x834B, 0xAE0A, 0x834C, 0xAE0C, + 0x834D, 0xAE0E, 0x834E, 0xAE0F, 0x834F, 0xAE10, 0x8350, 0xAE11, + 0x8351, 0xAE12, 0x8352, 0xAE13, 0x8353, 0xAE15, 0x8354, 0xAE16, + 0x8355, 0xAE17, 0x8356, 0xAE18, 0x8357, 0xAE19, 0x8358, 0xAE1A, + 0x8359, 0xAE1B, 0x835A, 0xAE1C, 0x8361, 0xAE1D, 0x8362, 0xAE1E, + 0x8363, 0xAE1F, 0x8364, 0xAE20, 0x8365, 0xAE21, 0x8366, 0xAE22, + 0x8367, 0xAE23, 0x8368, 0xAE24, 0x8369, 0xAE25, 0x836A, 0xAE26, + 0x836B, 0xAE27, 0x836C, 0xAE28, 0x836D, 0xAE29, 0x836E, 0xAE2A, + 0x836F, 0xAE2B, 0x8370, 0xAE2C, 0x8371, 0xAE2D, 0x8372, 0xAE2E, + 0x8373, 0xAE2F, 0x8374, 0xAE32, 0x8375, 0xAE33, 0x8376, 0xAE35, + 0x8377, 0xAE36, 0x8378, 0xAE39, 0x8379, 0xAE3B, 0x837A, 0xAE3C, + 0x8381, 0xAE3D, 0x8382, 0xAE3E, 0x8383, 0xAE3F, 0x8384, 0xAE42, + 0x8385, 0xAE44, 0x8386, 0xAE47, 0x8387, 0xAE48, 0x8388, 0xAE49, + 0x8389, 0xAE4B, 0x838A, 0xAE4F, 0x838B, 0xAE51, 0x838C, 0xAE52, + 0x838D, 0xAE53, 0x838E, 0xAE55, 0x838F, 0xAE57, 0x8390, 0xAE58, + 0x8391, 0xAE59, 0x8392, 0xAE5A, 0x8393, 0xAE5B, 0x8394, 0xAE5E, + 0x8395, 0xAE62, 0x8396, 0xAE63, 0x8397, 0xAE64, 0x8398, 0xAE66, + 0x8399, 0xAE67, 0x839A, 0xAE6A, 0x839B, 0xAE6B, 0x839C, 0xAE6D, + 0x839D, 0xAE6E, 0x839E, 0xAE6F, 0x839F, 0xAE71, 0x83A0, 0xAE72, + 0x83A1, 0xAE73, 0x83A2, 0xAE74, 0x83A3, 0xAE75, 0x83A4, 0xAE76, + 0x83A5, 0xAE77, 0x83A6, 0xAE7A, 0x83A7, 0xAE7E, 0x83A8, 0xAE7F, + 0x83A9, 0xAE80, 0x83AA, 0xAE81, 0x83AB, 0xAE82, 0x83AC, 0xAE83, + 0x83AD, 0xAE86, 0x83AE, 0xAE87, 0x83AF, 0xAE88, 0x83B0, 0xAE89, + 0x83B1, 0xAE8A, 0x83B2, 0xAE8B, 0x83B3, 0xAE8D, 0x83B4, 0xAE8E, + 0x83B5, 0xAE8F, 0x83B6, 0xAE90, 0x83B7, 0xAE91, 0x83B8, 0xAE92, + 0x83B9, 0xAE93, 0x83BA, 0xAE94, 0x83BB, 0xAE95, 0x83BC, 0xAE96, + 0x83BD, 0xAE97, 0x83BE, 0xAE98, 0x83BF, 0xAE99, 0x83C0, 0xAE9A, + 0x83C1, 0xAE9B, 0x83C2, 0xAE9C, 0x83C3, 0xAE9D, 0x83C4, 0xAE9E, + 0x83C5, 0xAE9F, 0x83C6, 0xAEA0, 0x83C7, 0xAEA1, 0x83C8, 0xAEA2, + 0x83C9, 0xAEA3, 0x83CA, 0xAEA4, 0x83CB, 0xAEA5, 0x83CC, 0xAEA6, + 0x83CD, 0xAEA7, 0x83CE, 0xAEA8, 0x83CF, 0xAEA9, 0x83D0, 0xAEAA, + 0x83D1, 0xAEAB, 0x83D2, 0xAEAC, 0x83D3, 0xAEAD, 0x83D4, 0xAEAE, + 0x83D5, 0xAEAF, 0x83D6, 0xAEB0, 0x83D7, 0xAEB1, 0x83D8, 0xAEB2, + 0x83D9, 0xAEB3, 0x83DA, 0xAEB4, 0x83DB, 0xAEB5, 0x83DC, 0xAEB6, + 0x83DD, 0xAEB7, 0x83DE, 0xAEB8, 0x83DF, 0xAEB9, 0x83E0, 0xAEBA, + 0x83E1, 0xAEBB, 0x83E2, 0xAEBF, 0x83E3, 0xAEC1, 0x83E4, 0xAEC2, + 0x83E5, 0xAEC3, 0x83E6, 0xAEC5, 0x83E7, 0xAEC6, 0x83E8, 0xAEC7, + 0x83E9, 0xAEC8, 0x83EA, 0xAEC9, 0x83EB, 0xAECA, 0x83EC, 0xAECB, + 0x83ED, 0xAECE, 0x83EE, 0xAED2, 0x83EF, 0xAED3, 0x83F0, 0xAED4, + 0x83F1, 0xAED5, 0x83F2, 0xAED6, 0x83F3, 0xAED7, 0x83F4, 0xAEDA, + 0x83F5, 0xAEDB, 0x83F6, 0xAEDD, 0x83F7, 0xAEDE, 0x83F8, 0xAEDF, + 0x83F9, 0xAEE0, 0x83FA, 0xAEE1, 0x83FB, 0xAEE2, 0x83FC, 0xAEE3, + 0x83FD, 0xAEE4, 0x83FE, 0xAEE5, 0x8441, 0xAEE6, 0x8442, 0xAEE7, + 0x8443, 0xAEE9, 0x8444, 0xAEEA, 0x8445, 0xAEEC, 0x8446, 0xAEEE, + 0x8447, 0xAEEF, 0x8448, 0xAEF0, 0x8449, 0xAEF1, 0x844A, 0xAEF2, + 0x844B, 0xAEF3, 0x844C, 0xAEF5, 0x844D, 0xAEF6, 0x844E, 0xAEF7, + 0x844F, 0xAEF9, 0x8450, 0xAEFA, 0x8451, 0xAEFB, 0x8452, 0xAEFD, + 0x8453, 0xAEFE, 0x8454, 0xAEFF, 0x8455, 0xAF00, 0x8456, 0xAF01, + 0x8457, 0xAF02, 0x8458, 0xAF03, 0x8459, 0xAF04, 0x845A, 0xAF05, + 0x8461, 0xAF06, 0x8462, 0xAF09, 0x8463, 0xAF0A, 0x8464, 0xAF0B, + 0x8465, 0xAF0C, 0x8466, 0xAF0E, 0x8467, 0xAF0F, 0x8468, 0xAF11, + 0x8469, 0xAF12, 0x846A, 0xAF13, 0x846B, 0xAF14, 0x846C, 0xAF15, + 0x846D, 0xAF16, 0x846E, 0xAF17, 0x846F, 0xAF18, 0x8470, 0xAF19, + 0x8471, 0xAF1A, 0x8472, 0xAF1B, 0x8473, 0xAF1C, 0x8474, 0xAF1D, + 0x8475, 0xAF1E, 0x8476, 0xAF1F, 0x8477, 0xAF20, 0x8478, 0xAF21, + 0x8479, 0xAF22, 0x847A, 0xAF23, 0x8481, 0xAF24, 0x8482, 0xAF25, + 0x8483, 0xAF26, 0x8484, 0xAF27, 0x8485, 0xAF28, 0x8486, 0xAF29, + 0x8487, 0xAF2A, 0x8488, 0xAF2B, 0x8489, 0xAF2E, 0x848A, 0xAF2F, + 0x848B, 0xAF31, 0x848C, 0xAF33, 0x848D, 0xAF35, 0x848E, 0xAF36, + 0x848F, 0xAF37, 0x8490, 0xAF38, 0x8491, 0xAF39, 0x8492, 0xAF3A, + 0x8493, 0xAF3B, 0x8494, 0xAF3E, 0x8495, 0xAF40, 0x8496, 0xAF44, + 0x8497, 0xAF45, 0x8498, 0xAF46, 0x8499, 0xAF47, 0x849A, 0xAF4A, + 0x849B, 0xAF4B, 0x849C, 0xAF4C, 0x849D, 0xAF4D, 0x849E, 0xAF4E, + 0x849F, 0xAF4F, 0x84A0, 0xAF51, 0x84A1, 0xAF52, 0x84A2, 0xAF53, + 0x84A3, 0xAF54, 0x84A4, 0xAF55, 0x84A5, 0xAF56, 0x84A6, 0xAF57, + 0x84A7, 0xAF58, 0x84A8, 0xAF59, 0x84A9, 0xAF5A, 0x84AA, 0xAF5B, + 0x84AB, 0xAF5E, 0x84AC, 0xAF5F, 0x84AD, 0xAF60, 0x84AE, 0xAF61, + 0x84AF, 0xAF62, 0x84B0, 0xAF63, 0x84B1, 0xAF66, 0x84B2, 0xAF67, + 0x84B3, 0xAF68, 0x84B4, 0xAF69, 0x84B5, 0xAF6A, 0x84B6, 0xAF6B, + 0x84B7, 0xAF6C, 0x84B8, 0xAF6D, 0x84B9, 0xAF6E, 0x84BA, 0xAF6F, + 0x84BB, 0xAF70, 0x84BC, 0xAF71, 0x84BD, 0xAF72, 0x84BE, 0xAF73, + 0x84BF, 0xAF74, 0x84C0, 0xAF75, 0x84C1, 0xAF76, 0x84C2, 0xAF77, + 0x84C3, 0xAF78, 0x84C4, 0xAF7A, 0x84C5, 0xAF7B, 0x84C6, 0xAF7C, + 0x84C7, 0xAF7D, 0x84C8, 0xAF7E, 0x84C9, 0xAF7F, 0x84CA, 0xAF81, + 0x84CB, 0xAF82, 0x84CC, 0xAF83, 0x84CD, 0xAF85, 0x84CE, 0xAF86, + 0x84CF, 0xAF87, 0x84D0, 0xAF89, 0x84D1, 0xAF8A, 0x84D2, 0xAF8B, + 0x84D3, 0xAF8C, 0x84D4, 0xAF8D, 0x84D5, 0xAF8E, 0x84D6, 0xAF8F, + 0x84D7, 0xAF92, 0x84D8, 0xAF93, 0x84D9, 0xAF94, 0x84DA, 0xAF96, + 0x84DB, 0xAF97, 0x84DC, 0xAF98, 0x84DD, 0xAF99, 0x84DE, 0xAF9A, + 0x84DF, 0xAF9B, 0x84E0, 0xAF9D, 0x84E1, 0xAF9E, 0x84E2, 0xAF9F, + 0x84E3, 0xAFA0, 0x84E4, 0xAFA1, 0x84E5, 0xAFA2, 0x84E6, 0xAFA3, + 0x84E7, 0xAFA4, 0x84E8, 0xAFA5, 0x84E9, 0xAFA6, 0x84EA, 0xAFA7, + 0x84EB, 0xAFA8, 0x84EC, 0xAFA9, 0x84ED, 0xAFAA, 0x84EE, 0xAFAB, + 0x84EF, 0xAFAC, 0x84F0, 0xAFAD, 0x84F1, 0xAFAE, 0x84F2, 0xAFAF, + 0x84F3, 0xAFB0, 0x84F4, 0xAFB1, 0x84F5, 0xAFB2, 0x84F6, 0xAFB3, + 0x84F7, 0xAFB4, 0x84F8, 0xAFB5, 0x84F9, 0xAFB6, 0x84FA, 0xAFB7, + 0x84FB, 0xAFBA, 0x84FC, 0xAFBB, 0x84FD, 0xAFBD, 0x84FE, 0xAFBE, + 0x8541, 0xAFBF, 0x8542, 0xAFC1, 0x8543, 0xAFC2, 0x8544, 0xAFC3, + 0x8545, 0xAFC4, 0x8546, 0xAFC5, 0x8547, 0xAFC6, 0x8548, 0xAFCA, + 0x8549, 0xAFCC, 0x854A, 0xAFCF, 0x854B, 0xAFD0, 0x854C, 0xAFD1, + 0x854D, 0xAFD2, 0x854E, 0xAFD3, 0x854F, 0xAFD5, 0x8550, 0xAFD6, + 0x8551, 0xAFD7, 0x8552, 0xAFD8, 0x8553, 0xAFD9, 0x8554, 0xAFDA, + 0x8555, 0xAFDB, 0x8556, 0xAFDD, 0x8557, 0xAFDE, 0x8558, 0xAFDF, + 0x8559, 0xAFE0, 0x855A, 0xAFE1, 0x8561, 0xAFE2, 0x8562, 0xAFE3, + 0x8563, 0xAFE4, 0x8564, 0xAFE5, 0x8565, 0xAFE6, 0x8566, 0xAFE7, + 0x8567, 0xAFEA, 0x8568, 0xAFEB, 0x8569, 0xAFEC, 0x856A, 0xAFED, + 0x856B, 0xAFEE, 0x856C, 0xAFEF, 0x856D, 0xAFF2, 0x856E, 0xAFF3, + 0x856F, 0xAFF5, 0x8570, 0xAFF6, 0x8571, 0xAFF7, 0x8572, 0xAFF9, + 0x8573, 0xAFFA, 0x8574, 0xAFFB, 0x8575, 0xAFFC, 0x8576, 0xAFFD, + 0x8577, 0xAFFE, 0x8578, 0xAFFF, 0x8579, 0xB002, 0x857A, 0xB003, + 0x8581, 0xB005, 0x8582, 0xB006, 0x8583, 0xB007, 0x8584, 0xB008, + 0x8585, 0xB009, 0x8586, 0xB00A, 0x8587, 0xB00B, 0x8588, 0xB00D, + 0x8589, 0xB00E, 0x858A, 0xB00F, 0x858B, 0xB011, 0x858C, 0xB012, + 0x858D, 0xB013, 0x858E, 0xB015, 0x858F, 0xB016, 0x8590, 0xB017, + 0x8591, 0xB018, 0x8592, 0xB019, 0x8593, 0xB01A, 0x8594, 0xB01B, + 0x8595, 0xB01E, 0x8596, 0xB01F, 0x8597, 0xB020, 0x8598, 0xB021, + 0x8599, 0xB022, 0x859A, 0xB023, 0x859B, 0xB024, 0x859C, 0xB025, + 0x859D, 0xB026, 0x859E, 0xB027, 0x859F, 0xB029, 0x85A0, 0xB02A, + 0x85A1, 0xB02B, 0x85A2, 0xB02C, 0x85A3, 0xB02D, 0x85A4, 0xB02E, + 0x85A5, 0xB02F, 0x85A6, 0xB030, 0x85A7, 0xB031, 0x85A8, 0xB032, + 0x85A9, 0xB033, 0x85AA, 0xB034, 0x85AB, 0xB035, 0x85AC, 0xB036, + 0x85AD, 0xB037, 0x85AE, 0xB038, 0x85AF, 0xB039, 0x85B0, 0xB03A, + 0x85B1, 0xB03B, 0x85B2, 0xB03C, 0x85B3, 0xB03D, 0x85B4, 0xB03E, + 0x85B5, 0xB03F, 0x85B6, 0xB040, 0x85B7, 0xB041, 0x85B8, 0xB042, + 0x85B9, 0xB043, 0x85BA, 0xB046, 0x85BB, 0xB047, 0x85BC, 0xB049, + 0x85BD, 0xB04B, 0x85BE, 0xB04D, 0x85BF, 0xB04F, 0x85C0, 0xB050, + 0x85C1, 0xB051, 0x85C2, 0xB052, 0x85C3, 0xB056, 0x85C4, 0xB058, + 0x85C5, 0xB05A, 0x85C6, 0xB05B, 0x85C7, 0xB05C, 0x85C8, 0xB05E, + 0x85C9, 0xB05F, 0x85CA, 0xB060, 0x85CB, 0xB061, 0x85CC, 0xB062, + 0x85CD, 0xB063, 0x85CE, 0xB064, 0x85CF, 0xB065, 0x85D0, 0xB066, + 0x85D1, 0xB067, 0x85D2, 0xB068, 0x85D3, 0xB069, 0x85D4, 0xB06A, + 0x85D5, 0xB06B, 0x85D6, 0xB06C, 0x85D7, 0xB06D, 0x85D8, 0xB06E, + 0x85D9, 0xB06F, 0x85DA, 0xB070, 0x85DB, 0xB071, 0x85DC, 0xB072, + 0x85DD, 0xB073, 0x85DE, 0xB074, 0x85DF, 0xB075, 0x85E0, 0xB076, + 0x85E1, 0xB077, 0x85E2, 0xB078, 0x85E3, 0xB079, 0x85E4, 0xB07A, + 0x85E5, 0xB07B, 0x85E6, 0xB07E, 0x85E7, 0xB07F, 0x85E8, 0xB081, + 0x85E9, 0xB082, 0x85EA, 0xB083, 0x85EB, 0xB085, 0x85EC, 0xB086, + 0x85ED, 0xB087, 0x85EE, 0xB088, 0x85EF, 0xB089, 0x85F0, 0xB08A, + 0x85F1, 0xB08B, 0x85F2, 0xB08E, 0x85F3, 0xB090, 0x85F4, 0xB092, + 0x85F5, 0xB093, 0x85F6, 0xB094, 0x85F7, 0xB095, 0x85F8, 0xB096, + 0x85F9, 0xB097, 0x85FA, 0xB09B, 0x85FB, 0xB09D, 0x85FC, 0xB09E, + 0x85FD, 0xB0A3, 0x85FE, 0xB0A4, 0x8641, 0xB0A5, 0x8642, 0xB0A6, + 0x8643, 0xB0A7, 0x8644, 0xB0AA, 0x8645, 0xB0B0, 0x8646, 0xB0B2, + 0x8647, 0xB0B6, 0x8648, 0xB0B7, 0x8649, 0xB0B9, 0x864A, 0xB0BA, + 0x864B, 0xB0BB, 0x864C, 0xB0BD, 0x864D, 0xB0BE, 0x864E, 0xB0BF, + 0x864F, 0xB0C0, 0x8650, 0xB0C1, 0x8651, 0xB0C2, 0x8652, 0xB0C3, + 0x8653, 0xB0C6, 0x8654, 0xB0CA, 0x8655, 0xB0CB, 0x8656, 0xB0CC, + 0x8657, 0xB0CD, 0x8658, 0xB0CE, 0x8659, 0xB0CF, 0x865A, 0xB0D2, + 0x8661, 0xB0D3, 0x8662, 0xB0D5, 0x8663, 0xB0D6, 0x8664, 0xB0D7, + 0x8665, 0xB0D9, 0x8666, 0xB0DA, 0x8667, 0xB0DB, 0x8668, 0xB0DC, + 0x8669, 0xB0DD, 0x866A, 0xB0DE, 0x866B, 0xB0DF, 0x866C, 0xB0E1, + 0x866D, 0xB0E2, 0x866E, 0xB0E3, 0x866F, 0xB0E4, 0x8670, 0xB0E6, + 0x8671, 0xB0E7, 0x8672, 0xB0E8, 0x8673, 0xB0E9, 0x8674, 0xB0EA, + 0x8675, 0xB0EB, 0x8676, 0xB0EC, 0x8677, 0xB0ED, 0x8678, 0xB0EE, + 0x8679, 0xB0EF, 0x867A, 0xB0F0, 0x8681, 0xB0F1, 0x8682, 0xB0F2, + 0x8683, 0xB0F3, 0x8684, 0xB0F4, 0x8685, 0xB0F5, 0x8686, 0xB0F6, + 0x8687, 0xB0F7, 0x8688, 0xB0F8, 0x8689, 0xB0F9, 0x868A, 0xB0FA, + 0x868B, 0xB0FB, 0x868C, 0xB0FC, 0x868D, 0xB0FD, 0x868E, 0xB0FE, + 0x868F, 0xB0FF, 0x8690, 0xB100, 0x8691, 0xB101, 0x8692, 0xB102, + 0x8693, 0xB103, 0x8694, 0xB104, 0x8695, 0xB105, 0x8696, 0xB106, + 0x8697, 0xB107, 0x8698, 0xB10A, 0x8699, 0xB10D, 0x869A, 0xB10E, + 0x869B, 0xB10F, 0x869C, 0xB111, 0x869D, 0xB114, 0x869E, 0xB115, + 0x869F, 0xB116, 0x86A0, 0xB117, 0x86A1, 0xB11A, 0x86A2, 0xB11E, + 0x86A3, 0xB11F, 0x86A4, 0xB120, 0x86A5, 0xB121, 0x86A6, 0xB122, + 0x86A7, 0xB126, 0x86A8, 0xB127, 0x86A9, 0xB129, 0x86AA, 0xB12A, + 0x86AB, 0xB12B, 0x86AC, 0xB12D, 0x86AD, 0xB12E, 0x86AE, 0xB12F, + 0x86AF, 0xB130, 0x86B0, 0xB131, 0x86B1, 0xB132, 0x86B2, 0xB133, + 0x86B3, 0xB136, 0x86B4, 0xB13A, 0x86B5, 0xB13B, 0x86B6, 0xB13C, + 0x86B7, 0xB13D, 0x86B8, 0xB13E, 0x86B9, 0xB13F, 0x86BA, 0xB142, + 0x86BB, 0xB143, 0x86BC, 0xB145, 0x86BD, 0xB146, 0x86BE, 0xB147, + 0x86BF, 0xB149, 0x86C0, 0xB14A, 0x86C1, 0xB14B, 0x86C2, 0xB14C, + 0x86C3, 0xB14D, 0x86C4, 0xB14E, 0x86C5, 0xB14F, 0x86C6, 0xB152, + 0x86C7, 0xB153, 0x86C8, 0xB156, 0x86C9, 0xB157, 0x86CA, 0xB159, + 0x86CB, 0xB15A, 0x86CC, 0xB15B, 0x86CD, 0xB15D, 0x86CE, 0xB15E, + 0x86CF, 0xB15F, 0x86D0, 0xB161, 0x86D1, 0xB162, 0x86D2, 0xB163, + 0x86D3, 0xB164, 0x86D4, 0xB165, 0x86D5, 0xB166, 0x86D6, 0xB167, + 0x86D7, 0xB168, 0x86D8, 0xB169, 0x86D9, 0xB16A, 0x86DA, 0xB16B, + 0x86DB, 0xB16C, 0x86DC, 0xB16D, 0x86DD, 0xB16E, 0x86DE, 0xB16F, + 0x86DF, 0xB170, 0x86E0, 0xB171, 0x86E1, 0xB172, 0x86E2, 0xB173, + 0x86E3, 0xB174, 0x86E4, 0xB175, 0x86E5, 0xB176, 0x86E6, 0xB177, + 0x86E7, 0xB17A, 0x86E8, 0xB17B, 0x86E9, 0xB17D, 0x86EA, 0xB17E, + 0x86EB, 0xB17F, 0x86EC, 0xB181, 0x86ED, 0xB183, 0x86EE, 0xB184, + 0x86EF, 0xB185, 0x86F0, 0xB186, 0x86F1, 0xB187, 0x86F2, 0xB18A, + 0x86F3, 0xB18C, 0x86F4, 0xB18E, 0x86F5, 0xB18F, 0x86F6, 0xB190, + 0x86F7, 0xB191, 0x86F8, 0xB195, 0x86F9, 0xB196, 0x86FA, 0xB197, + 0x86FB, 0xB199, 0x86FC, 0xB19A, 0x86FD, 0xB19B, 0x86FE, 0xB19D, + 0x8741, 0xB19E, 0x8742, 0xB19F, 0x8743, 0xB1A0, 0x8744, 0xB1A1, + 0x8745, 0xB1A2, 0x8746, 0xB1A3, 0x8747, 0xB1A4, 0x8748, 0xB1A5, + 0x8749, 0xB1A6, 0x874A, 0xB1A7, 0x874B, 0xB1A9, 0x874C, 0xB1AA, + 0x874D, 0xB1AB, 0x874E, 0xB1AC, 0x874F, 0xB1AD, 0x8750, 0xB1AE, + 0x8751, 0xB1AF, 0x8752, 0xB1B0, 0x8753, 0xB1B1, 0x8754, 0xB1B2, + 0x8755, 0xB1B3, 0x8756, 0xB1B4, 0x8757, 0xB1B5, 0x8758, 0xB1B6, + 0x8759, 0xB1B7, 0x875A, 0xB1B8, 0x8761, 0xB1B9, 0x8762, 0xB1BA, + 0x8763, 0xB1BB, 0x8764, 0xB1BC, 0x8765, 0xB1BD, 0x8766, 0xB1BE, + 0x8767, 0xB1BF, 0x8768, 0xB1C0, 0x8769, 0xB1C1, 0x876A, 0xB1C2, + 0x876B, 0xB1C3, 0x876C, 0xB1C4, 0x876D, 0xB1C5, 0x876E, 0xB1C6, + 0x876F, 0xB1C7, 0x8770, 0xB1C8, 0x8771, 0xB1C9, 0x8772, 0xB1CA, + 0x8773, 0xB1CB, 0x8774, 0xB1CD, 0x8775, 0xB1CE, 0x8776, 0xB1CF, + 0x8777, 0xB1D1, 0x8778, 0xB1D2, 0x8779, 0xB1D3, 0x877A, 0xB1D5, + 0x8781, 0xB1D6, 0x8782, 0xB1D7, 0x8783, 0xB1D8, 0x8784, 0xB1D9, + 0x8785, 0xB1DA, 0x8786, 0xB1DB, 0x8787, 0xB1DE, 0x8788, 0xB1E0, + 0x8789, 0xB1E1, 0x878A, 0xB1E2, 0x878B, 0xB1E3, 0x878C, 0xB1E4, + 0x878D, 0xB1E5, 0x878E, 0xB1E6, 0x878F, 0xB1E7, 0x8790, 0xB1EA, + 0x8791, 0xB1EB, 0x8792, 0xB1ED, 0x8793, 0xB1EE, 0x8794, 0xB1EF, + 0x8795, 0xB1F1, 0x8796, 0xB1F2, 0x8797, 0xB1F3, 0x8798, 0xB1F4, + 0x8799, 0xB1F5, 0x879A, 0xB1F6, 0x879B, 0xB1F7, 0x879C, 0xB1F8, + 0x879D, 0xB1FA, 0x879E, 0xB1FC, 0x879F, 0xB1FE, 0x87A0, 0xB1FF, + 0x87A1, 0xB200, 0x87A2, 0xB201, 0x87A3, 0xB202, 0x87A4, 0xB203, + 0x87A5, 0xB206, 0x87A6, 0xB207, 0x87A7, 0xB209, 0x87A8, 0xB20A, + 0x87A9, 0xB20D, 0x87AA, 0xB20E, 0x87AB, 0xB20F, 0x87AC, 0xB210, + 0x87AD, 0xB211, 0x87AE, 0xB212, 0x87AF, 0xB213, 0x87B0, 0xB216, + 0x87B1, 0xB218, 0x87B2, 0xB21A, 0x87B3, 0xB21B, 0x87B4, 0xB21C, + 0x87B5, 0xB21D, 0x87B6, 0xB21E, 0x87B7, 0xB21F, 0x87B8, 0xB221, + 0x87B9, 0xB222, 0x87BA, 0xB223, 0x87BB, 0xB224, 0x87BC, 0xB225, + 0x87BD, 0xB226, 0x87BE, 0xB227, 0x87BF, 0xB228, 0x87C0, 0xB229, + 0x87C1, 0xB22A, 0x87C2, 0xB22B, 0x87C3, 0xB22C, 0x87C4, 0xB22D, + 0x87C5, 0xB22E, 0x87C6, 0xB22F, 0x87C7, 0xB230, 0x87C8, 0xB231, + 0x87C9, 0xB232, 0x87CA, 0xB233, 0x87CB, 0xB235, 0x87CC, 0xB236, + 0x87CD, 0xB237, 0x87CE, 0xB238, 0x87CF, 0xB239, 0x87D0, 0xB23A, + 0x87D1, 0xB23B, 0x87D2, 0xB23D, 0x87D3, 0xB23E, 0x87D4, 0xB23F, + 0x87D5, 0xB240, 0x87D6, 0xB241, 0x87D7, 0xB242, 0x87D8, 0xB243, + 0x87D9, 0xB244, 0x87DA, 0xB245, 0x87DB, 0xB246, 0x87DC, 0xB247, + 0x87DD, 0xB248, 0x87DE, 0xB249, 0x87DF, 0xB24A, 0x87E0, 0xB24B, + 0x87E1, 0xB24C, 0x87E2, 0xB24D, 0x87E3, 0xB24E, 0x87E4, 0xB24F, + 0x87E5, 0xB250, 0x87E6, 0xB251, 0x87E7, 0xB252, 0x87E8, 0xB253, + 0x87E9, 0xB254, 0x87EA, 0xB255, 0x87EB, 0xB256, 0x87EC, 0xB257, + 0x87ED, 0xB259, 0x87EE, 0xB25A, 0x87EF, 0xB25B, 0x87F0, 0xB25D, + 0x87F1, 0xB25E, 0x87F2, 0xB25F, 0x87F3, 0xB261, 0x87F4, 0xB262, + 0x87F5, 0xB263, 0x87F6, 0xB264, 0x87F7, 0xB265, 0x87F8, 0xB266, + 0x87F9, 0xB267, 0x87FA, 0xB26A, 0x87FB, 0xB26B, 0x87FC, 0xB26C, + 0x87FD, 0xB26D, 0x87FE, 0xB26E, 0x8841, 0xB26F, 0x8842, 0xB270, + 0x8843, 0xB271, 0x8844, 0xB272, 0x8845, 0xB273, 0x8846, 0xB276, + 0x8847, 0xB277, 0x8848, 0xB278, 0x8849, 0xB279, 0x884A, 0xB27A, + 0x884B, 0xB27B, 0x884C, 0xB27D, 0x884D, 0xB27E, 0x884E, 0xB27F, + 0x884F, 0xB280, 0x8850, 0xB281, 0x8851, 0xB282, 0x8852, 0xB283, + 0x8853, 0xB286, 0x8854, 0xB287, 0x8855, 0xB288, 0x8856, 0xB28A, + 0x8857, 0xB28B, 0x8858, 0xB28C, 0x8859, 0xB28D, 0x885A, 0xB28E, + 0x8861, 0xB28F, 0x8862, 0xB292, 0x8863, 0xB293, 0x8864, 0xB295, + 0x8865, 0xB296, 0x8866, 0xB297, 0x8867, 0xB29B, 0x8868, 0xB29C, + 0x8869, 0xB29D, 0x886A, 0xB29E, 0x886B, 0xB29F, 0x886C, 0xB2A2, + 0x886D, 0xB2A4, 0x886E, 0xB2A7, 0x886F, 0xB2A8, 0x8870, 0xB2A9, + 0x8871, 0xB2AB, 0x8872, 0xB2AD, 0x8873, 0xB2AE, 0x8874, 0xB2AF, + 0x8875, 0xB2B1, 0x8876, 0xB2B2, 0x8877, 0xB2B3, 0x8878, 0xB2B5, + 0x8879, 0xB2B6, 0x887A, 0xB2B7, 0x8881, 0xB2B8, 0x8882, 0xB2B9, + 0x8883, 0xB2BA, 0x8884, 0xB2BB, 0x8885, 0xB2BC, 0x8886, 0xB2BD, + 0x8887, 0xB2BE, 0x8888, 0xB2BF, 0x8889, 0xB2C0, 0x888A, 0xB2C1, + 0x888B, 0xB2C2, 0x888C, 0xB2C3, 0x888D, 0xB2C4, 0x888E, 0xB2C5, + 0x888F, 0xB2C6, 0x8890, 0xB2C7, 0x8891, 0xB2CA, 0x8892, 0xB2CB, + 0x8893, 0xB2CD, 0x8894, 0xB2CE, 0x8895, 0xB2CF, 0x8896, 0xB2D1, + 0x8897, 0xB2D3, 0x8898, 0xB2D4, 0x8899, 0xB2D5, 0x889A, 0xB2D6, + 0x889B, 0xB2D7, 0x889C, 0xB2DA, 0x889D, 0xB2DC, 0x889E, 0xB2DE, + 0x889F, 0xB2DF, 0x88A0, 0xB2E0, 0x88A1, 0xB2E1, 0x88A2, 0xB2E3, + 0x88A3, 0xB2E7, 0x88A4, 0xB2E9, 0x88A5, 0xB2EA, 0x88A6, 0xB2F0, + 0x88A7, 0xB2F1, 0x88A8, 0xB2F2, 0x88A9, 0xB2F6, 0x88AA, 0xB2FC, + 0x88AB, 0xB2FD, 0x88AC, 0xB2FE, 0x88AD, 0xB302, 0x88AE, 0xB303, + 0x88AF, 0xB305, 0x88B0, 0xB306, 0x88B1, 0xB307, 0x88B2, 0xB309, + 0x88B3, 0xB30A, 0x88B4, 0xB30B, 0x88B5, 0xB30C, 0x88B6, 0xB30D, + 0x88B7, 0xB30E, 0x88B8, 0xB30F, 0x88B9, 0xB312, 0x88BA, 0xB316, + 0x88BB, 0xB317, 0x88BC, 0xB318, 0x88BD, 0xB319, 0x88BE, 0xB31A, + 0x88BF, 0xB31B, 0x88C0, 0xB31D, 0x88C1, 0xB31E, 0x88C2, 0xB31F, + 0x88C3, 0xB320, 0x88C4, 0xB321, 0x88C5, 0xB322, 0x88C6, 0xB323, + 0x88C7, 0xB324, 0x88C8, 0xB325, 0x88C9, 0xB326, 0x88CA, 0xB327, + 0x88CB, 0xB328, 0x88CC, 0xB329, 0x88CD, 0xB32A, 0x88CE, 0xB32B, + 0x88CF, 0xB32C, 0x88D0, 0xB32D, 0x88D1, 0xB32E, 0x88D2, 0xB32F, + 0x88D3, 0xB330, 0x88D4, 0xB331, 0x88D5, 0xB332, 0x88D6, 0xB333, + 0x88D7, 0xB334, 0x88D8, 0xB335, 0x88D9, 0xB336, 0x88DA, 0xB337, + 0x88DB, 0xB338, 0x88DC, 0xB339, 0x88DD, 0xB33A, 0x88DE, 0xB33B, + 0x88DF, 0xB33C, 0x88E0, 0xB33D, 0x88E1, 0xB33E, 0x88E2, 0xB33F, + 0x88E3, 0xB340, 0x88E4, 0xB341, 0x88E5, 0xB342, 0x88E6, 0xB343, + 0x88E7, 0xB344, 0x88E8, 0xB345, 0x88E9, 0xB346, 0x88EA, 0xB347, + 0x88EB, 0xB348, 0x88EC, 0xB349, 0x88ED, 0xB34A, 0x88EE, 0xB34B, + 0x88EF, 0xB34C, 0x88F0, 0xB34D, 0x88F1, 0xB34E, 0x88F2, 0xB34F, + 0x88F3, 0xB350, 0x88F4, 0xB351, 0x88F5, 0xB352, 0x88F6, 0xB353, + 0x88F7, 0xB357, 0x88F8, 0xB359, 0x88F9, 0xB35A, 0x88FA, 0xB35D, + 0x88FB, 0xB360, 0x88FC, 0xB361, 0x88FD, 0xB362, 0x88FE, 0xB363, + 0x8941, 0xB366, 0x8942, 0xB368, 0x8943, 0xB36A, 0x8944, 0xB36C, + 0x8945, 0xB36D, 0x8946, 0xB36F, 0x8947, 0xB372, 0x8948, 0xB373, + 0x8949, 0xB375, 0x894A, 0xB376, 0x894B, 0xB377, 0x894C, 0xB379, + 0x894D, 0xB37A, 0x894E, 0xB37B, 0x894F, 0xB37C, 0x8950, 0xB37D, + 0x8951, 0xB37E, 0x8952, 0xB37F, 0x8953, 0xB382, 0x8954, 0xB386, + 0x8955, 0xB387, 0x8956, 0xB388, 0x8957, 0xB389, 0x8958, 0xB38A, + 0x8959, 0xB38B, 0x895A, 0xB38D, 0x8961, 0xB38E, 0x8962, 0xB38F, + 0x8963, 0xB391, 0x8964, 0xB392, 0x8965, 0xB393, 0x8966, 0xB395, + 0x8967, 0xB396, 0x8968, 0xB397, 0x8969, 0xB398, 0x896A, 0xB399, + 0x896B, 0xB39A, 0x896C, 0xB39B, 0x896D, 0xB39C, 0x896E, 0xB39D, + 0x896F, 0xB39E, 0x8970, 0xB39F, 0x8971, 0xB3A2, 0x8972, 0xB3A3, + 0x8973, 0xB3A4, 0x8974, 0xB3A5, 0x8975, 0xB3A6, 0x8976, 0xB3A7, + 0x8977, 0xB3A9, 0x8978, 0xB3AA, 0x8979, 0xB3AB, 0x897A, 0xB3AD, + 0x8981, 0xB3AE, 0x8982, 0xB3AF, 0x8983, 0xB3B0, 0x8984, 0xB3B1, + 0x8985, 0xB3B2, 0x8986, 0xB3B3, 0x8987, 0xB3B4, 0x8988, 0xB3B5, + 0x8989, 0xB3B6, 0x898A, 0xB3B7, 0x898B, 0xB3B8, 0x898C, 0xB3B9, + 0x898D, 0xB3BA, 0x898E, 0xB3BB, 0x898F, 0xB3BC, 0x8990, 0xB3BD, + 0x8991, 0xB3BE, 0x8992, 0xB3BF, 0x8993, 0xB3C0, 0x8994, 0xB3C1, + 0x8995, 0xB3C2, 0x8996, 0xB3C3, 0x8997, 0xB3C6, 0x8998, 0xB3C7, + 0x8999, 0xB3C9, 0x899A, 0xB3CA, 0x899B, 0xB3CD, 0x899C, 0xB3CF, + 0x899D, 0xB3D1, 0x899E, 0xB3D2, 0x899F, 0xB3D3, 0x89A0, 0xB3D6, + 0x89A1, 0xB3D8, 0x89A2, 0xB3DA, 0x89A3, 0xB3DC, 0x89A4, 0xB3DE, + 0x89A5, 0xB3DF, 0x89A6, 0xB3E1, 0x89A7, 0xB3E2, 0x89A8, 0xB3E3, + 0x89A9, 0xB3E5, 0x89AA, 0xB3E6, 0x89AB, 0xB3E7, 0x89AC, 0xB3E9, + 0x89AD, 0xB3EA, 0x89AE, 0xB3EB, 0x89AF, 0xB3EC, 0x89B0, 0xB3ED, + 0x89B1, 0xB3EE, 0x89B2, 0xB3EF, 0x89B3, 0xB3F0, 0x89B4, 0xB3F1, + 0x89B5, 0xB3F2, 0x89B6, 0xB3F3, 0x89B7, 0xB3F4, 0x89B8, 0xB3F5, + 0x89B9, 0xB3F6, 0x89BA, 0xB3F7, 0x89BB, 0xB3F8, 0x89BC, 0xB3F9, + 0x89BD, 0xB3FA, 0x89BE, 0xB3FB, 0x89BF, 0xB3FD, 0x89C0, 0xB3FE, + 0x89C1, 0xB3FF, 0x89C2, 0xB400, 0x89C3, 0xB401, 0x89C4, 0xB402, + 0x89C5, 0xB403, 0x89C6, 0xB404, 0x89C7, 0xB405, 0x89C8, 0xB406, + 0x89C9, 0xB407, 0x89CA, 0xB408, 0x89CB, 0xB409, 0x89CC, 0xB40A, + 0x89CD, 0xB40B, 0x89CE, 0xB40C, 0x89CF, 0xB40D, 0x89D0, 0xB40E, + 0x89D1, 0xB40F, 0x89D2, 0xB411, 0x89D3, 0xB412, 0x89D4, 0xB413, + 0x89D5, 0xB414, 0x89D6, 0xB415, 0x89D7, 0xB416, 0x89D8, 0xB417, + 0x89D9, 0xB419, 0x89DA, 0xB41A, 0x89DB, 0xB41B, 0x89DC, 0xB41D, + 0x89DD, 0xB41E, 0x89DE, 0xB41F, 0x89DF, 0xB421, 0x89E0, 0xB422, + 0x89E1, 0xB423, 0x89E2, 0xB424, 0x89E3, 0xB425, 0x89E4, 0xB426, + 0x89E5, 0xB427, 0x89E6, 0xB42A, 0x89E7, 0xB42C, 0x89E8, 0xB42D, + 0x89E9, 0xB42E, 0x89EA, 0xB42F, 0x89EB, 0xB430, 0x89EC, 0xB431, + 0x89ED, 0xB432, 0x89EE, 0xB433, 0x89EF, 0xB435, 0x89F0, 0xB436, + 0x89F1, 0xB437, 0x89F2, 0xB438, 0x89F3, 0xB439, 0x89F4, 0xB43A, + 0x89F5, 0xB43B, 0x89F6, 0xB43C, 0x89F7, 0xB43D, 0x89F8, 0xB43E, + 0x89F9, 0xB43F, 0x89FA, 0xB440, 0x89FB, 0xB441, 0x89FC, 0xB442, + 0x89FD, 0xB443, 0x89FE, 0xB444, 0x8A41, 0xB445, 0x8A42, 0xB446, + 0x8A43, 0xB447, 0x8A44, 0xB448, 0x8A45, 0xB449, 0x8A46, 0xB44A, + 0x8A47, 0xB44B, 0x8A48, 0xB44C, 0x8A49, 0xB44D, 0x8A4A, 0xB44E, + 0x8A4B, 0xB44F, 0x8A4C, 0xB452, 0x8A4D, 0xB453, 0x8A4E, 0xB455, + 0x8A4F, 0xB456, 0x8A50, 0xB457, 0x8A51, 0xB459, 0x8A52, 0xB45A, + 0x8A53, 0xB45B, 0x8A54, 0xB45C, 0x8A55, 0xB45D, 0x8A56, 0xB45E, + 0x8A57, 0xB45F, 0x8A58, 0xB462, 0x8A59, 0xB464, 0x8A5A, 0xB466, + 0x8A61, 0xB467, 0x8A62, 0xB468, 0x8A63, 0xB469, 0x8A64, 0xB46A, + 0x8A65, 0xB46B, 0x8A66, 0xB46D, 0x8A67, 0xB46E, 0x8A68, 0xB46F, + 0x8A69, 0xB470, 0x8A6A, 0xB471, 0x8A6B, 0xB472, 0x8A6C, 0xB473, + 0x8A6D, 0xB474, 0x8A6E, 0xB475, 0x8A6F, 0xB476, 0x8A70, 0xB477, + 0x8A71, 0xB478, 0x8A72, 0xB479, 0x8A73, 0xB47A, 0x8A74, 0xB47B, + 0x8A75, 0xB47C, 0x8A76, 0xB47D, 0x8A77, 0xB47E, 0x8A78, 0xB47F, + 0x8A79, 0xB481, 0x8A7A, 0xB482, 0x8A81, 0xB483, 0x8A82, 0xB484, + 0x8A83, 0xB485, 0x8A84, 0xB486, 0x8A85, 0xB487, 0x8A86, 0xB489, + 0x8A87, 0xB48A, 0x8A88, 0xB48B, 0x8A89, 0xB48C, 0x8A8A, 0xB48D, + 0x8A8B, 0xB48E, 0x8A8C, 0xB48F, 0x8A8D, 0xB490, 0x8A8E, 0xB491, + 0x8A8F, 0xB492, 0x8A90, 0xB493, 0x8A91, 0xB494, 0x8A92, 0xB495, + 0x8A93, 0xB496, 0x8A94, 0xB497, 0x8A95, 0xB498, 0x8A96, 0xB499, + 0x8A97, 0xB49A, 0x8A98, 0xB49B, 0x8A99, 0xB49C, 0x8A9A, 0xB49E, + 0x8A9B, 0xB49F, 0x8A9C, 0xB4A0, 0x8A9D, 0xB4A1, 0x8A9E, 0xB4A2, + 0x8A9F, 0xB4A3, 0x8AA0, 0xB4A5, 0x8AA1, 0xB4A6, 0x8AA2, 0xB4A7, + 0x8AA3, 0xB4A9, 0x8AA4, 0xB4AA, 0x8AA5, 0xB4AB, 0x8AA6, 0xB4AD, + 0x8AA7, 0xB4AE, 0x8AA8, 0xB4AF, 0x8AA9, 0xB4B0, 0x8AAA, 0xB4B1, + 0x8AAB, 0xB4B2, 0x8AAC, 0xB4B3, 0x8AAD, 0xB4B4, 0x8AAE, 0xB4B6, + 0x8AAF, 0xB4B8, 0x8AB0, 0xB4BA, 0x8AB1, 0xB4BB, 0x8AB2, 0xB4BC, + 0x8AB3, 0xB4BD, 0x8AB4, 0xB4BE, 0x8AB5, 0xB4BF, 0x8AB6, 0xB4C1, + 0x8AB7, 0xB4C2, 0x8AB8, 0xB4C3, 0x8AB9, 0xB4C5, 0x8ABA, 0xB4C6, + 0x8ABB, 0xB4C7, 0x8ABC, 0xB4C9, 0x8ABD, 0xB4CA, 0x8ABE, 0xB4CB, + 0x8ABF, 0xB4CC, 0x8AC0, 0xB4CD, 0x8AC1, 0xB4CE, 0x8AC2, 0xB4CF, + 0x8AC3, 0xB4D1, 0x8AC4, 0xB4D2, 0x8AC5, 0xB4D3, 0x8AC6, 0xB4D4, + 0x8AC7, 0xB4D6, 0x8AC8, 0xB4D7, 0x8AC9, 0xB4D8, 0x8ACA, 0xB4D9, + 0x8ACB, 0xB4DA, 0x8ACC, 0xB4DB, 0x8ACD, 0xB4DE, 0x8ACE, 0xB4DF, + 0x8ACF, 0xB4E1, 0x8AD0, 0xB4E2, 0x8AD1, 0xB4E5, 0x8AD2, 0xB4E7, + 0x8AD3, 0xB4E8, 0x8AD4, 0xB4E9, 0x8AD5, 0xB4EA, 0x8AD6, 0xB4EB, + 0x8AD7, 0xB4EE, 0x8AD8, 0xB4F0, 0x8AD9, 0xB4F2, 0x8ADA, 0xB4F3, + 0x8ADB, 0xB4F4, 0x8ADC, 0xB4F5, 0x8ADD, 0xB4F6, 0x8ADE, 0xB4F7, + 0x8ADF, 0xB4F9, 0x8AE0, 0xB4FA, 0x8AE1, 0xB4FB, 0x8AE2, 0xB4FC, + 0x8AE3, 0xB4FD, 0x8AE4, 0xB4FE, 0x8AE5, 0xB4FF, 0x8AE6, 0xB500, + 0x8AE7, 0xB501, 0x8AE8, 0xB502, 0x8AE9, 0xB503, 0x8AEA, 0xB504, + 0x8AEB, 0xB505, 0x8AEC, 0xB506, 0x8AED, 0xB507, 0x8AEE, 0xB508, + 0x8AEF, 0xB509, 0x8AF0, 0xB50A, 0x8AF1, 0xB50B, 0x8AF2, 0xB50C, + 0x8AF3, 0xB50D, 0x8AF4, 0xB50E, 0x8AF5, 0xB50F, 0x8AF6, 0xB510, + 0x8AF7, 0xB511, 0x8AF8, 0xB512, 0x8AF9, 0xB513, 0x8AFA, 0xB516, + 0x8AFB, 0xB517, 0x8AFC, 0xB519, 0x8AFD, 0xB51A, 0x8AFE, 0xB51D, + 0x8B41, 0xB51E, 0x8B42, 0xB51F, 0x8B43, 0xB520, 0x8B44, 0xB521, + 0x8B45, 0xB522, 0x8B46, 0xB523, 0x8B47, 0xB526, 0x8B48, 0xB52B, + 0x8B49, 0xB52C, 0x8B4A, 0xB52D, 0x8B4B, 0xB52E, 0x8B4C, 0xB52F, + 0x8B4D, 0xB532, 0x8B4E, 0xB533, 0x8B4F, 0xB535, 0x8B50, 0xB536, + 0x8B51, 0xB537, 0x8B52, 0xB539, 0x8B53, 0xB53A, 0x8B54, 0xB53B, + 0x8B55, 0xB53C, 0x8B56, 0xB53D, 0x8B57, 0xB53E, 0x8B58, 0xB53F, + 0x8B59, 0xB542, 0x8B5A, 0xB546, 0x8B61, 0xB547, 0x8B62, 0xB548, + 0x8B63, 0xB549, 0x8B64, 0xB54A, 0x8B65, 0xB54E, 0x8B66, 0xB54F, + 0x8B67, 0xB551, 0x8B68, 0xB552, 0x8B69, 0xB553, 0x8B6A, 0xB555, + 0x8B6B, 0xB556, 0x8B6C, 0xB557, 0x8B6D, 0xB558, 0x8B6E, 0xB559, + 0x8B6F, 0xB55A, 0x8B70, 0xB55B, 0x8B71, 0xB55E, 0x8B72, 0xB562, + 0x8B73, 0xB563, 0x8B74, 0xB564, 0x8B75, 0xB565, 0x8B76, 0xB566, + 0x8B77, 0xB567, 0x8B78, 0xB568, 0x8B79, 0xB569, 0x8B7A, 0xB56A, + 0x8B81, 0xB56B, 0x8B82, 0xB56C, 0x8B83, 0xB56D, 0x8B84, 0xB56E, + 0x8B85, 0xB56F, 0x8B86, 0xB570, 0x8B87, 0xB571, 0x8B88, 0xB572, + 0x8B89, 0xB573, 0x8B8A, 0xB574, 0x8B8B, 0xB575, 0x8B8C, 0xB576, + 0x8B8D, 0xB577, 0x8B8E, 0xB578, 0x8B8F, 0xB579, 0x8B90, 0xB57A, + 0x8B91, 0xB57B, 0x8B92, 0xB57C, 0x8B93, 0xB57D, 0x8B94, 0xB57E, + 0x8B95, 0xB57F, 0x8B96, 0xB580, 0x8B97, 0xB581, 0x8B98, 0xB582, + 0x8B99, 0xB583, 0x8B9A, 0xB584, 0x8B9B, 0xB585, 0x8B9C, 0xB586, + 0x8B9D, 0xB587, 0x8B9E, 0xB588, 0x8B9F, 0xB589, 0x8BA0, 0xB58A, + 0x8BA1, 0xB58B, 0x8BA2, 0xB58C, 0x8BA3, 0xB58D, 0x8BA4, 0xB58E, + 0x8BA5, 0xB58F, 0x8BA6, 0xB590, 0x8BA7, 0xB591, 0x8BA8, 0xB592, + 0x8BA9, 0xB593, 0x8BAA, 0xB594, 0x8BAB, 0xB595, 0x8BAC, 0xB596, + 0x8BAD, 0xB597, 0x8BAE, 0xB598, 0x8BAF, 0xB599, 0x8BB0, 0xB59A, + 0x8BB1, 0xB59B, 0x8BB2, 0xB59C, 0x8BB3, 0xB59D, 0x8BB4, 0xB59E, + 0x8BB5, 0xB59F, 0x8BB6, 0xB5A2, 0x8BB7, 0xB5A3, 0x8BB8, 0xB5A5, + 0x8BB9, 0xB5A6, 0x8BBA, 0xB5A7, 0x8BBB, 0xB5A9, 0x8BBC, 0xB5AC, + 0x8BBD, 0xB5AD, 0x8BBE, 0xB5AE, 0x8BBF, 0xB5AF, 0x8BC0, 0xB5B2, + 0x8BC1, 0xB5B6, 0x8BC2, 0xB5B7, 0x8BC3, 0xB5B8, 0x8BC4, 0xB5B9, + 0x8BC5, 0xB5BA, 0x8BC6, 0xB5BE, 0x8BC7, 0xB5BF, 0x8BC8, 0xB5C1, + 0x8BC9, 0xB5C2, 0x8BCA, 0xB5C3, 0x8BCB, 0xB5C5, 0x8BCC, 0xB5C6, + 0x8BCD, 0xB5C7, 0x8BCE, 0xB5C8, 0x8BCF, 0xB5C9, 0x8BD0, 0xB5CA, + 0x8BD1, 0xB5CB, 0x8BD2, 0xB5CE, 0x8BD3, 0xB5D2, 0x8BD4, 0xB5D3, + 0x8BD5, 0xB5D4, 0x8BD6, 0xB5D5, 0x8BD7, 0xB5D6, 0x8BD8, 0xB5D7, + 0x8BD9, 0xB5D9, 0x8BDA, 0xB5DA, 0x8BDB, 0xB5DB, 0x8BDC, 0xB5DC, + 0x8BDD, 0xB5DD, 0x8BDE, 0xB5DE, 0x8BDF, 0xB5DF, 0x8BE0, 0xB5E0, + 0x8BE1, 0xB5E1, 0x8BE2, 0xB5E2, 0x8BE3, 0xB5E3, 0x8BE4, 0xB5E4, + 0x8BE5, 0xB5E5, 0x8BE6, 0xB5E6, 0x8BE7, 0xB5E7, 0x8BE8, 0xB5E8, + 0x8BE9, 0xB5E9, 0x8BEA, 0xB5EA, 0x8BEB, 0xB5EB, 0x8BEC, 0xB5ED, + 0x8BED, 0xB5EE, 0x8BEE, 0xB5EF, 0x8BEF, 0xB5F0, 0x8BF0, 0xB5F1, + 0x8BF1, 0xB5F2, 0x8BF2, 0xB5F3, 0x8BF3, 0xB5F4, 0x8BF4, 0xB5F5, + 0x8BF5, 0xB5F6, 0x8BF6, 0xB5F7, 0x8BF7, 0xB5F8, 0x8BF8, 0xB5F9, + 0x8BF9, 0xB5FA, 0x8BFA, 0xB5FB, 0x8BFB, 0xB5FC, 0x8BFC, 0xB5FD, + 0x8BFD, 0xB5FE, 0x8BFE, 0xB5FF, 0x8C41, 0xB600, 0x8C42, 0xB601, + 0x8C43, 0xB602, 0x8C44, 0xB603, 0x8C45, 0xB604, 0x8C46, 0xB605, + 0x8C47, 0xB606, 0x8C48, 0xB607, 0x8C49, 0xB608, 0x8C4A, 0xB609, + 0x8C4B, 0xB60A, 0x8C4C, 0xB60B, 0x8C4D, 0xB60C, 0x8C4E, 0xB60D, + 0x8C4F, 0xB60E, 0x8C50, 0xB60F, 0x8C51, 0xB612, 0x8C52, 0xB613, + 0x8C53, 0xB615, 0x8C54, 0xB616, 0x8C55, 0xB617, 0x8C56, 0xB619, + 0x8C57, 0xB61A, 0x8C58, 0xB61B, 0x8C59, 0xB61C, 0x8C5A, 0xB61D, + 0x8C61, 0xB61E, 0x8C62, 0xB61F, 0x8C63, 0xB620, 0x8C64, 0xB621, + 0x8C65, 0xB622, 0x8C66, 0xB623, 0x8C67, 0xB624, 0x8C68, 0xB626, + 0x8C69, 0xB627, 0x8C6A, 0xB628, 0x8C6B, 0xB629, 0x8C6C, 0xB62A, + 0x8C6D, 0xB62B, 0x8C6E, 0xB62D, 0x8C6F, 0xB62E, 0x8C70, 0xB62F, + 0x8C71, 0xB630, 0x8C72, 0xB631, 0x8C73, 0xB632, 0x8C74, 0xB633, + 0x8C75, 0xB635, 0x8C76, 0xB636, 0x8C77, 0xB637, 0x8C78, 0xB638, + 0x8C79, 0xB639, 0x8C7A, 0xB63A, 0x8C81, 0xB63B, 0x8C82, 0xB63C, + 0x8C83, 0xB63D, 0x8C84, 0xB63E, 0x8C85, 0xB63F, 0x8C86, 0xB640, + 0x8C87, 0xB641, 0x8C88, 0xB642, 0x8C89, 0xB643, 0x8C8A, 0xB644, + 0x8C8B, 0xB645, 0x8C8C, 0xB646, 0x8C8D, 0xB647, 0x8C8E, 0xB649, + 0x8C8F, 0xB64A, 0x8C90, 0xB64B, 0x8C91, 0xB64C, 0x8C92, 0xB64D, + 0x8C93, 0xB64E, 0x8C94, 0xB64F, 0x8C95, 0xB650, 0x8C96, 0xB651, + 0x8C97, 0xB652, 0x8C98, 0xB653, 0x8C99, 0xB654, 0x8C9A, 0xB655, + 0x8C9B, 0xB656, 0x8C9C, 0xB657, 0x8C9D, 0xB658, 0x8C9E, 0xB659, + 0x8C9F, 0xB65A, 0x8CA0, 0xB65B, 0x8CA1, 0xB65C, 0x8CA2, 0xB65D, + 0x8CA3, 0xB65E, 0x8CA4, 0xB65F, 0x8CA5, 0xB660, 0x8CA6, 0xB661, + 0x8CA7, 0xB662, 0x8CA8, 0xB663, 0x8CA9, 0xB665, 0x8CAA, 0xB666, + 0x8CAB, 0xB667, 0x8CAC, 0xB669, 0x8CAD, 0xB66A, 0x8CAE, 0xB66B, + 0x8CAF, 0xB66C, 0x8CB0, 0xB66D, 0x8CB1, 0xB66E, 0x8CB2, 0xB66F, + 0x8CB3, 0xB670, 0x8CB4, 0xB671, 0x8CB5, 0xB672, 0x8CB6, 0xB673, + 0x8CB7, 0xB674, 0x8CB8, 0xB675, 0x8CB9, 0xB676, 0x8CBA, 0xB677, + 0x8CBB, 0xB678, 0x8CBC, 0xB679, 0x8CBD, 0xB67A, 0x8CBE, 0xB67B, + 0x8CBF, 0xB67C, 0x8CC0, 0xB67D, 0x8CC1, 0xB67E, 0x8CC2, 0xB67F, + 0x8CC3, 0xB680, 0x8CC4, 0xB681, 0x8CC5, 0xB682, 0x8CC6, 0xB683, + 0x8CC7, 0xB684, 0x8CC8, 0xB685, 0x8CC9, 0xB686, 0x8CCA, 0xB687, + 0x8CCB, 0xB688, 0x8CCC, 0xB689, 0x8CCD, 0xB68A, 0x8CCE, 0xB68B, + 0x8CCF, 0xB68C, 0x8CD0, 0xB68D, 0x8CD1, 0xB68E, 0x8CD2, 0xB68F, + 0x8CD3, 0xB690, 0x8CD4, 0xB691, 0x8CD5, 0xB692, 0x8CD6, 0xB693, + 0x8CD7, 0xB694, 0x8CD8, 0xB695, 0x8CD9, 0xB696, 0x8CDA, 0xB697, + 0x8CDB, 0xB698, 0x8CDC, 0xB699, 0x8CDD, 0xB69A, 0x8CDE, 0xB69B, + 0x8CDF, 0xB69E, 0x8CE0, 0xB69F, 0x8CE1, 0xB6A1, 0x8CE2, 0xB6A2, + 0x8CE3, 0xB6A3, 0x8CE4, 0xB6A5, 0x8CE5, 0xB6A6, 0x8CE6, 0xB6A7, + 0x8CE7, 0xB6A8, 0x8CE8, 0xB6A9, 0x8CE9, 0xB6AA, 0x8CEA, 0xB6AD, + 0x8CEB, 0xB6AE, 0x8CEC, 0xB6AF, 0x8CED, 0xB6B0, 0x8CEE, 0xB6B2, + 0x8CEF, 0xB6B3, 0x8CF0, 0xB6B4, 0x8CF1, 0xB6B5, 0x8CF2, 0xB6B6, + 0x8CF3, 0xB6B7, 0x8CF4, 0xB6B8, 0x8CF5, 0xB6B9, 0x8CF6, 0xB6BA, + 0x8CF7, 0xB6BB, 0x8CF8, 0xB6BC, 0x8CF9, 0xB6BD, 0x8CFA, 0xB6BE, + 0x8CFB, 0xB6BF, 0x8CFC, 0xB6C0, 0x8CFD, 0xB6C1, 0x8CFE, 0xB6C2, + 0x8D41, 0xB6C3, 0x8D42, 0xB6C4, 0x8D43, 0xB6C5, 0x8D44, 0xB6C6, + 0x8D45, 0xB6C7, 0x8D46, 0xB6C8, 0x8D47, 0xB6C9, 0x8D48, 0xB6CA, + 0x8D49, 0xB6CB, 0x8D4A, 0xB6CC, 0x8D4B, 0xB6CD, 0x8D4C, 0xB6CE, + 0x8D4D, 0xB6CF, 0x8D4E, 0xB6D0, 0x8D4F, 0xB6D1, 0x8D50, 0xB6D2, + 0x8D51, 0xB6D3, 0x8D52, 0xB6D5, 0x8D53, 0xB6D6, 0x8D54, 0xB6D7, + 0x8D55, 0xB6D8, 0x8D56, 0xB6D9, 0x8D57, 0xB6DA, 0x8D58, 0xB6DB, + 0x8D59, 0xB6DC, 0x8D5A, 0xB6DD, 0x8D61, 0xB6DE, 0x8D62, 0xB6DF, + 0x8D63, 0xB6E0, 0x8D64, 0xB6E1, 0x8D65, 0xB6E2, 0x8D66, 0xB6E3, + 0x8D67, 0xB6E4, 0x8D68, 0xB6E5, 0x8D69, 0xB6E6, 0x8D6A, 0xB6E7, + 0x8D6B, 0xB6E8, 0x8D6C, 0xB6E9, 0x8D6D, 0xB6EA, 0x8D6E, 0xB6EB, + 0x8D6F, 0xB6EC, 0x8D70, 0xB6ED, 0x8D71, 0xB6EE, 0x8D72, 0xB6EF, + 0x8D73, 0xB6F1, 0x8D74, 0xB6F2, 0x8D75, 0xB6F3, 0x8D76, 0xB6F5, + 0x8D77, 0xB6F6, 0x8D78, 0xB6F7, 0x8D79, 0xB6F9, 0x8D7A, 0xB6FA, + 0x8D81, 0xB6FB, 0x8D82, 0xB6FC, 0x8D83, 0xB6FD, 0x8D84, 0xB6FE, + 0x8D85, 0xB6FF, 0x8D86, 0xB702, 0x8D87, 0xB703, 0x8D88, 0xB704, + 0x8D89, 0xB706, 0x8D8A, 0xB707, 0x8D8B, 0xB708, 0x8D8C, 0xB709, + 0x8D8D, 0xB70A, 0x8D8E, 0xB70B, 0x8D8F, 0xB70C, 0x8D90, 0xB70D, + 0x8D91, 0xB70E, 0x8D92, 0xB70F, 0x8D93, 0xB710, 0x8D94, 0xB711, + 0x8D95, 0xB712, 0x8D96, 0xB713, 0x8D97, 0xB714, 0x8D98, 0xB715, + 0x8D99, 0xB716, 0x8D9A, 0xB717, 0x8D9B, 0xB718, 0x8D9C, 0xB719, + 0x8D9D, 0xB71A, 0x8D9E, 0xB71B, 0x8D9F, 0xB71C, 0x8DA0, 0xB71D, + 0x8DA1, 0xB71E, 0x8DA2, 0xB71F, 0x8DA3, 0xB720, 0x8DA4, 0xB721, + 0x8DA5, 0xB722, 0x8DA6, 0xB723, 0x8DA7, 0xB724, 0x8DA8, 0xB725, + 0x8DA9, 0xB726, 0x8DAA, 0xB727, 0x8DAB, 0xB72A, 0x8DAC, 0xB72B, + 0x8DAD, 0xB72D, 0x8DAE, 0xB72E, 0x8DAF, 0xB731, 0x8DB0, 0xB732, + 0x8DB1, 0xB733, 0x8DB2, 0xB734, 0x8DB3, 0xB735, 0x8DB4, 0xB736, + 0x8DB5, 0xB737, 0x8DB6, 0xB73A, 0x8DB7, 0xB73C, 0x8DB8, 0xB73D, + 0x8DB9, 0xB73E, 0x8DBA, 0xB73F, 0x8DBB, 0xB740, 0x8DBC, 0xB741, + 0x8DBD, 0xB742, 0x8DBE, 0xB743, 0x8DBF, 0xB745, 0x8DC0, 0xB746, + 0x8DC1, 0xB747, 0x8DC2, 0xB749, 0x8DC3, 0xB74A, 0x8DC4, 0xB74B, + 0x8DC5, 0xB74D, 0x8DC6, 0xB74E, 0x8DC7, 0xB74F, 0x8DC8, 0xB750, + 0x8DC9, 0xB751, 0x8DCA, 0xB752, 0x8DCB, 0xB753, 0x8DCC, 0xB756, + 0x8DCD, 0xB757, 0x8DCE, 0xB758, 0x8DCF, 0xB759, 0x8DD0, 0xB75A, + 0x8DD1, 0xB75B, 0x8DD2, 0xB75C, 0x8DD3, 0xB75D, 0x8DD4, 0xB75E, + 0x8DD5, 0xB75F, 0x8DD6, 0xB761, 0x8DD7, 0xB762, 0x8DD8, 0xB763, + 0x8DD9, 0xB765, 0x8DDA, 0xB766, 0x8DDB, 0xB767, 0x8DDC, 0xB769, + 0x8DDD, 0xB76A, 0x8DDE, 0xB76B, 0x8DDF, 0xB76C, 0x8DE0, 0xB76D, + 0x8DE1, 0xB76E, 0x8DE2, 0xB76F, 0x8DE3, 0xB772, 0x8DE4, 0xB774, + 0x8DE5, 0xB776, 0x8DE6, 0xB777, 0x8DE7, 0xB778, 0x8DE8, 0xB779, + 0x8DE9, 0xB77A, 0x8DEA, 0xB77B, 0x8DEB, 0xB77E, 0x8DEC, 0xB77F, + 0x8DED, 0xB781, 0x8DEE, 0xB782, 0x8DEF, 0xB783, 0x8DF0, 0xB785, + 0x8DF1, 0xB786, 0x8DF2, 0xB787, 0x8DF3, 0xB788, 0x8DF4, 0xB789, + 0x8DF5, 0xB78A, 0x8DF6, 0xB78B, 0x8DF7, 0xB78E, 0x8DF8, 0xB793, + 0x8DF9, 0xB794, 0x8DFA, 0xB795, 0x8DFB, 0xB79A, 0x8DFC, 0xB79B, + 0x8DFD, 0xB79D, 0x8DFE, 0xB79E, 0x8E41, 0xB79F, 0x8E42, 0xB7A1, + 0x8E43, 0xB7A2, 0x8E44, 0xB7A3, 0x8E45, 0xB7A4, 0x8E46, 0xB7A5, + 0x8E47, 0xB7A6, 0x8E48, 0xB7A7, 0x8E49, 0xB7AA, 0x8E4A, 0xB7AE, + 0x8E4B, 0xB7AF, 0x8E4C, 0xB7B0, 0x8E4D, 0xB7B1, 0x8E4E, 0xB7B2, + 0x8E4F, 0xB7B3, 0x8E50, 0xB7B6, 0x8E51, 0xB7B7, 0x8E52, 0xB7B9, + 0x8E53, 0xB7BA, 0x8E54, 0xB7BB, 0x8E55, 0xB7BC, 0x8E56, 0xB7BD, + 0x8E57, 0xB7BE, 0x8E58, 0xB7BF, 0x8E59, 0xB7C0, 0x8E5A, 0xB7C1, + 0x8E61, 0xB7C2, 0x8E62, 0xB7C3, 0x8E63, 0xB7C4, 0x8E64, 0xB7C5, + 0x8E65, 0xB7C6, 0x8E66, 0xB7C8, 0x8E67, 0xB7CA, 0x8E68, 0xB7CB, + 0x8E69, 0xB7CC, 0x8E6A, 0xB7CD, 0x8E6B, 0xB7CE, 0x8E6C, 0xB7CF, + 0x8E6D, 0xB7D0, 0x8E6E, 0xB7D1, 0x8E6F, 0xB7D2, 0x8E70, 0xB7D3, + 0x8E71, 0xB7D4, 0x8E72, 0xB7D5, 0x8E73, 0xB7D6, 0x8E74, 0xB7D7, + 0x8E75, 0xB7D8, 0x8E76, 0xB7D9, 0x8E77, 0xB7DA, 0x8E78, 0xB7DB, + 0x8E79, 0xB7DC, 0x8E7A, 0xB7DD, 0x8E81, 0xB7DE, 0x8E82, 0xB7DF, + 0x8E83, 0xB7E0, 0x8E84, 0xB7E1, 0x8E85, 0xB7E2, 0x8E86, 0xB7E3, + 0x8E87, 0xB7E4, 0x8E88, 0xB7E5, 0x8E89, 0xB7E6, 0x8E8A, 0xB7E7, + 0x8E8B, 0xB7E8, 0x8E8C, 0xB7E9, 0x8E8D, 0xB7EA, 0x8E8E, 0xB7EB, + 0x8E8F, 0xB7EE, 0x8E90, 0xB7EF, 0x8E91, 0xB7F1, 0x8E92, 0xB7F2, + 0x8E93, 0xB7F3, 0x8E94, 0xB7F5, 0x8E95, 0xB7F6, 0x8E96, 0xB7F7, + 0x8E97, 0xB7F8, 0x8E98, 0xB7F9, 0x8E99, 0xB7FA, 0x8E9A, 0xB7FB, + 0x8E9B, 0xB7FE, 0x8E9C, 0xB802, 0x8E9D, 0xB803, 0x8E9E, 0xB804, + 0x8E9F, 0xB805, 0x8EA0, 0xB806, 0x8EA1, 0xB80A, 0x8EA2, 0xB80B, + 0x8EA3, 0xB80D, 0x8EA4, 0xB80E, 0x8EA5, 0xB80F, 0x8EA6, 0xB811, + 0x8EA7, 0xB812, 0x8EA8, 0xB813, 0x8EA9, 0xB814, 0x8EAA, 0xB815, + 0x8EAB, 0xB816, 0x8EAC, 0xB817, 0x8EAD, 0xB81A, 0x8EAE, 0xB81C, + 0x8EAF, 0xB81E, 0x8EB0, 0xB81F, 0x8EB1, 0xB820, 0x8EB2, 0xB821, + 0x8EB3, 0xB822, 0x8EB4, 0xB823, 0x8EB5, 0xB826, 0x8EB6, 0xB827, + 0x8EB7, 0xB829, 0x8EB8, 0xB82A, 0x8EB9, 0xB82B, 0x8EBA, 0xB82D, + 0x8EBB, 0xB82E, 0x8EBC, 0xB82F, 0x8EBD, 0xB830, 0x8EBE, 0xB831, + 0x8EBF, 0xB832, 0x8EC0, 0xB833, 0x8EC1, 0xB836, 0x8EC2, 0xB83A, + 0x8EC3, 0xB83B, 0x8EC4, 0xB83C, 0x8EC5, 0xB83D, 0x8EC6, 0xB83E, + 0x8EC7, 0xB83F, 0x8EC8, 0xB841, 0x8EC9, 0xB842, 0x8ECA, 0xB843, + 0x8ECB, 0xB845, 0x8ECC, 0xB846, 0x8ECD, 0xB847, 0x8ECE, 0xB848, + 0x8ECF, 0xB849, 0x8ED0, 0xB84A, 0x8ED1, 0xB84B, 0x8ED2, 0xB84C, + 0x8ED3, 0xB84D, 0x8ED4, 0xB84E, 0x8ED5, 0xB84F, 0x8ED6, 0xB850, + 0x8ED7, 0xB852, 0x8ED8, 0xB854, 0x8ED9, 0xB855, 0x8EDA, 0xB856, + 0x8EDB, 0xB857, 0x8EDC, 0xB858, 0x8EDD, 0xB859, 0x8EDE, 0xB85A, + 0x8EDF, 0xB85B, 0x8EE0, 0xB85E, 0x8EE1, 0xB85F, 0x8EE2, 0xB861, + 0x8EE3, 0xB862, 0x8EE4, 0xB863, 0x8EE5, 0xB865, 0x8EE6, 0xB866, + 0x8EE7, 0xB867, 0x8EE8, 0xB868, 0x8EE9, 0xB869, 0x8EEA, 0xB86A, + 0x8EEB, 0xB86B, 0x8EEC, 0xB86E, 0x8EED, 0xB870, 0x8EEE, 0xB872, + 0x8EEF, 0xB873, 0x8EF0, 0xB874, 0x8EF1, 0xB875, 0x8EF2, 0xB876, + 0x8EF3, 0xB877, 0x8EF4, 0xB879, 0x8EF5, 0xB87A, 0x8EF6, 0xB87B, + 0x8EF7, 0xB87D, 0x8EF8, 0xB87E, 0x8EF9, 0xB87F, 0x8EFA, 0xB880, + 0x8EFB, 0xB881, 0x8EFC, 0xB882, 0x8EFD, 0xB883, 0x8EFE, 0xB884, + 0x8F41, 0xB885, 0x8F42, 0xB886, 0x8F43, 0xB887, 0x8F44, 0xB888, + 0x8F45, 0xB889, 0x8F46, 0xB88A, 0x8F47, 0xB88B, 0x8F48, 0xB88C, + 0x8F49, 0xB88E, 0x8F4A, 0xB88F, 0x8F4B, 0xB890, 0x8F4C, 0xB891, + 0x8F4D, 0xB892, 0x8F4E, 0xB893, 0x8F4F, 0xB894, 0x8F50, 0xB895, + 0x8F51, 0xB896, 0x8F52, 0xB897, 0x8F53, 0xB898, 0x8F54, 0xB899, + 0x8F55, 0xB89A, 0x8F56, 0xB89B, 0x8F57, 0xB89C, 0x8F58, 0xB89D, + 0x8F59, 0xB89E, 0x8F5A, 0xB89F, 0x8F61, 0xB8A0, 0x8F62, 0xB8A1, + 0x8F63, 0xB8A2, 0x8F64, 0xB8A3, 0x8F65, 0xB8A4, 0x8F66, 0xB8A5, + 0x8F67, 0xB8A6, 0x8F68, 0xB8A7, 0x8F69, 0xB8A9, 0x8F6A, 0xB8AA, + 0x8F6B, 0xB8AB, 0x8F6C, 0xB8AC, 0x8F6D, 0xB8AD, 0x8F6E, 0xB8AE, + 0x8F6F, 0xB8AF, 0x8F70, 0xB8B1, 0x8F71, 0xB8B2, 0x8F72, 0xB8B3, + 0x8F73, 0xB8B5, 0x8F74, 0xB8B6, 0x8F75, 0xB8B7, 0x8F76, 0xB8B9, + 0x8F77, 0xB8BA, 0x8F78, 0xB8BB, 0x8F79, 0xB8BC, 0x8F7A, 0xB8BD, + 0x8F81, 0xB8BE, 0x8F82, 0xB8BF, 0x8F83, 0xB8C2, 0x8F84, 0xB8C4, + 0x8F85, 0xB8C6, 0x8F86, 0xB8C7, 0x8F87, 0xB8C8, 0x8F88, 0xB8C9, + 0x8F89, 0xB8CA, 0x8F8A, 0xB8CB, 0x8F8B, 0xB8CD, 0x8F8C, 0xB8CE, + 0x8F8D, 0xB8CF, 0x8F8E, 0xB8D1, 0x8F8F, 0xB8D2, 0x8F90, 0xB8D3, + 0x8F91, 0xB8D5, 0x8F92, 0xB8D6, 0x8F93, 0xB8D7, 0x8F94, 0xB8D8, + 0x8F95, 0xB8D9, 0x8F96, 0xB8DA, 0x8F97, 0xB8DB, 0x8F98, 0xB8DC, + 0x8F99, 0xB8DE, 0x8F9A, 0xB8E0, 0x8F9B, 0xB8E2, 0x8F9C, 0xB8E3, + 0x8F9D, 0xB8E4, 0x8F9E, 0xB8E5, 0x8F9F, 0xB8E6, 0x8FA0, 0xB8E7, + 0x8FA1, 0xB8EA, 0x8FA2, 0xB8EB, 0x8FA3, 0xB8ED, 0x8FA4, 0xB8EE, + 0x8FA5, 0xB8EF, 0x8FA6, 0xB8F1, 0x8FA7, 0xB8F2, 0x8FA8, 0xB8F3, + 0x8FA9, 0xB8F4, 0x8FAA, 0xB8F5, 0x8FAB, 0xB8F6, 0x8FAC, 0xB8F7, + 0x8FAD, 0xB8FA, 0x8FAE, 0xB8FC, 0x8FAF, 0xB8FE, 0x8FB0, 0xB8FF, + 0x8FB1, 0xB900, 0x8FB2, 0xB901, 0x8FB3, 0xB902, 0x8FB4, 0xB903, + 0x8FB5, 0xB905, 0x8FB6, 0xB906, 0x8FB7, 0xB907, 0x8FB8, 0xB908, + 0x8FB9, 0xB909, 0x8FBA, 0xB90A, 0x8FBB, 0xB90B, 0x8FBC, 0xB90C, + 0x8FBD, 0xB90D, 0x8FBE, 0xB90E, 0x8FBF, 0xB90F, 0x8FC0, 0xB910, + 0x8FC1, 0xB911, 0x8FC2, 0xB912, 0x8FC3, 0xB913, 0x8FC4, 0xB914, + 0x8FC5, 0xB915, 0x8FC6, 0xB916, 0x8FC7, 0xB917, 0x8FC8, 0xB919, + 0x8FC9, 0xB91A, 0x8FCA, 0xB91B, 0x8FCB, 0xB91C, 0x8FCC, 0xB91D, + 0x8FCD, 0xB91E, 0x8FCE, 0xB91F, 0x8FCF, 0xB921, 0x8FD0, 0xB922, + 0x8FD1, 0xB923, 0x8FD2, 0xB924, 0x8FD3, 0xB925, 0x8FD4, 0xB926, + 0x8FD5, 0xB927, 0x8FD6, 0xB928, 0x8FD7, 0xB929, 0x8FD8, 0xB92A, + 0x8FD9, 0xB92B, 0x8FDA, 0xB92C, 0x8FDB, 0xB92D, 0x8FDC, 0xB92E, + 0x8FDD, 0xB92F, 0x8FDE, 0xB930, 0x8FDF, 0xB931, 0x8FE0, 0xB932, + 0x8FE1, 0xB933, 0x8FE2, 0xB934, 0x8FE3, 0xB935, 0x8FE4, 0xB936, + 0x8FE5, 0xB937, 0x8FE6, 0xB938, 0x8FE7, 0xB939, 0x8FE8, 0xB93A, + 0x8FE9, 0xB93B, 0x8FEA, 0xB93E, 0x8FEB, 0xB93F, 0x8FEC, 0xB941, + 0x8FED, 0xB942, 0x8FEE, 0xB943, 0x8FEF, 0xB945, 0x8FF0, 0xB946, + 0x8FF1, 0xB947, 0x8FF2, 0xB948, 0x8FF3, 0xB949, 0x8FF4, 0xB94A, + 0x8FF5, 0xB94B, 0x8FF6, 0xB94D, 0x8FF7, 0xB94E, 0x8FF8, 0xB950, + 0x8FF9, 0xB952, 0x8FFA, 0xB953, 0x8FFB, 0xB954, 0x8FFC, 0xB955, + 0x8FFD, 0xB956, 0x8FFE, 0xB957, 0x9041, 0xB95A, 0x9042, 0xB95B, + 0x9043, 0xB95D, 0x9044, 0xB95E, 0x9045, 0xB95F, 0x9046, 0xB961, + 0x9047, 0xB962, 0x9048, 0xB963, 0x9049, 0xB964, 0x904A, 0xB965, + 0x904B, 0xB966, 0x904C, 0xB967, 0x904D, 0xB96A, 0x904E, 0xB96C, + 0x904F, 0xB96E, 0x9050, 0xB96F, 0x9051, 0xB970, 0x9052, 0xB971, + 0x9053, 0xB972, 0x9054, 0xB973, 0x9055, 0xB976, 0x9056, 0xB977, + 0x9057, 0xB979, 0x9058, 0xB97A, 0x9059, 0xB97B, 0x905A, 0xB97D, + 0x9061, 0xB97E, 0x9062, 0xB97F, 0x9063, 0xB980, 0x9064, 0xB981, + 0x9065, 0xB982, 0x9066, 0xB983, 0x9067, 0xB986, 0x9068, 0xB988, + 0x9069, 0xB98B, 0x906A, 0xB98C, 0x906B, 0xB98F, 0x906C, 0xB990, + 0x906D, 0xB991, 0x906E, 0xB992, 0x906F, 0xB993, 0x9070, 0xB994, + 0x9071, 0xB995, 0x9072, 0xB996, 0x9073, 0xB997, 0x9074, 0xB998, + 0x9075, 0xB999, 0x9076, 0xB99A, 0x9077, 0xB99B, 0x9078, 0xB99C, + 0x9079, 0xB99D, 0x907A, 0xB99E, 0x9081, 0xB99F, 0x9082, 0xB9A0, + 0x9083, 0xB9A1, 0x9084, 0xB9A2, 0x9085, 0xB9A3, 0x9086, 0xB9A4, + 0x9087, 0xB9A5, 0x9088, 0xB9A6, 0x9089, 0xB9A7, 0x908A, 0xB9A8, + 0x908B, 0xB9A9, 0x908C, 0xB9AA, 0x908D, 0xB9AB, 0x908E, 0xB9AE, + 0x908F, 0xB9AF, 0x9090, 0xB9B1, 0x9091, 0xB9B2, 0x9092, 0xB9B3, + 0x9093, 0xB9B5, 0x9094, 0xB9B6, 0x9095, 0xB9B7, 0x9096, 0xB9B8, + 0x9097, 0xB9B9, 0x9098, 0xB9BA, 0x9099, 0xB9BB, 0x909A, 0xB9BE, + 0x909B, 0xB9C0, 0x909C, 0xB9C2, 0x909D, 0xB9C3, 0x909E, 0xB9C4, + 0x909F, 0xB9C5, 0x90A0, 0xB9C6, 0x90A1, 0xB9C7, 0x90A2, 0xB9CA, + 0x90A3, 0xB9CB, 0x90A4, 0xB9CD, 0x90A5, 0xB9D3, 0x90A6, 0xB9D4, + 0x90A7, 0xB9D5, 0x90A8, 0xB9D6, 0x90A9, 0xB9D7, 0x90AA, 0xB9DA, + 0x90AB, 0xB9DC, 0x90AC, 0xB9DF, 0x90AD, 0xB9E0, 0x90AE, 0xB9E2, + 0x90AF, 0xB9E6, 0x90B0, 0xB9E7, 0x90B1, 0xB9E9, 0x90B2, 0xB9EA, + 0x90B3, 0xB9EB, 0x90B4, 0xB9ED, 0x90B5, 0xB9EE, 0x90B6, 0xB9EF, + 0x90B7, 0xB9F0, 0x90B8, 0xB9F1, 0x90B9, 0xB9F2, 0x90BA, 0xB9F3, + 0x90BB, 0xB9F6, 0x90BC, 0xB9FB, 0x90BD, 0xB9FC, 0x90BE, 0xB9FD, + 0x90BF, 0xB9FE, 0x90C0, 0xB9FF, 0x90C1, 0xBA02, 0x90C2, 0xBA03, + 0x90C3, 0xBA04, 0x90C4, 0xBA05, 0x90C5, 0xBA06, 0x90C6, 0xBA07, + 0x90C7, 0xBA09, 0x90C8, 0xBA0A, 0x90C9, 0xBA0B, 0x90CA, 0xBA0C, + 0x90CB, 0xBA0D, 0x90CC, 0xBA0E, 0x90CD, 0xBA0F, 0x90CE, 0xBA10, + 0x90CF, 0xBA11, 0x90D0, 0xBA12, 0x90D1, 0xBA13, 0x90D2, 0xBA14, + 0x90D3, 0xBA16, 0x90D4, 0xBA17, 0x90D5, 0xBA18, 0x90D6, 0xBA19, + 0x90D7, 0xBA1A, 0x90D8, 0xBA1B, 0x90D9, 0xBA1C, 0x90DA, 0xBA1D, + 0x90DB, 0xBA1E, 0x90DC, 0xBA1F, 0x90DD, 0xBA20, 0x90DE, 0xBA21, + 0x90DF, 0xBA22, 0x90E0, 0xBA23, 0x90E1, 0xBA24, 0x90E2, 0xBA25, + 0x90E3, 0xBA26, 0x90E4, 0xBA27, 0x90E5, 0xBA28, 0x90E6, 0xBA29, + 0x90E7, 0xBA2A, 0x90E8, 0xBA2B, 0x90E9, 0xBA2C, 0x90EA, 0xBA2D, + 0x90EB, 0xBA2E, 0x90EC, 0xBA2F, 0x90ED, 0xBA30, 0x90EE, 0xBA31, + 0x90EF, 0xBA32, 0x90F0, 0xBA33, 0x90F1, 0xBA34, 0x90F2, 0xBA35, + 0x90F3, 0xBA36, 0x90F4, 0xBA37, 0x90F5, 0xBA3A, 0x90F6, 0xBA3B, + 0x90F7, 0xBA3D, 0x90F8, 0xBA3E, 0x90F9, 0xBA3F, 0x90FA, 0xBA41, + 0x90FB, 0xBA43, 0x90FC, 0xBA44, 0x90FD, 0xBA45, 0x90FE, 0xBA46, + 0x9141, 0xBA47, 0x9142, 0xBA4A, 0x9143, 0xBA4C, 0x9144, 0xBA4F, + 0x9145, 0xBA50, 0x9146, 0xBA51, 0x9147, 0xBA52, 0x9148, 0xBA56, + 0x9149, 0xBA57, 0x914A, 0xBA59, 0x914B, 0xBA5A, 0x914C, 0xBA5B, + 0x914D, 0xBA5D, 0x914E, 0xBA5E, 0x914F, 0xBA5F, 0x9150, 0xBA60, + 0x9151, 0xBA61, 0x9152, 0xBA62, 0x9153, 0xBA63, 0x9154, 0xBA66, + 0x9155, 0xBA6A, 0x9156, 0xBA6B, 0x9157, 0xBA6C, 0x9158, 0xBA6D, + 0x9159, 0xBA6E, 0x915A, 0xBA6F, 0x9161, 0xBA72, 0x9162, 0xBA73, + 0x9163, 0xBA75, 0x9164, 0xBA76, 0x9165, 0xBA77, 0x9166, 0xBA79, + 0x9167, 0xBA7A, 0x9168, 0xBA7B, 0x9169, 0xBA7C, 0x916A, 0xBA7D, + 0x916B, 0xBA7E, 0x916C, 0xBA7F, 0x916D, 0xBA80, 0x916E, 0xBA81, + 0x916F, 0xBA82, 0x9170, 0xBA86, 0x9171, 0xBA88, 0x9172, 0xBA89, + 0x9173, 0xBA8A, 0x9174, 0xBA8B, 0x9175, 0xBA8D, 0x9176, 0xBA8E, + 0x9177, 0xBA8F, 0x9178, 0xBA90, 0x9179, 0xBA91, 0x917A, 0xBA92, + 0x9181, 0xBA93, 0x9182, 0xBA94, 0x9183, 0xBA95, 0x9184, 0xBA96, + 0x9185, 0xBA97, 0x9186, 0xBA98, 0x9187, 0xBA99, 0x9188, 0xBA9A, + 0x9189, 0xBA9B, 0x918A, 0xBA9C, 0x918B, 0xBA9D, 0x918C, 0xBA9E, + 0x918D, 0xBA9F, 0x918E, 0xBAA0, 0x918F, 0xBAA1, 0x9190, 0xBAA2, + 0x9191, 0xBAA3, 0x9192, 0xBAA4, 0x9193, 0xBAA5, 0x9194, 0xBAA6, + 0x9195, 0xBAA7, 0x9196, 0xBAAA, 0x9197, 0xBAAD, 0x9198, 0xBAAE, + 0x9199, 0xBAAF, 0x919A, 0xBAB1, 0x919B, 0xBAB3, 0x919C, 0xBAB4, + 0x919D, 0xBAB5, 0x919E, 0xBAB6, 0x919F, 0xBAB7, 0x91A0, 0xBABA, + 0x91A1, 0xBABC, 0x91A2, 0xBABE, 0x91A3, 0xBABF, 0x91A4, 0xBAC0, + 0x91A5, 0xBAC1, 0x91A6, 0xBAC2, 0x91A7, 0xBAC3, 0x91A8, 0xBAC5, + 0x91A9, 0xBAC6, 0x91AA, 0xBAC7, 0x91AB, 0xBAC9, 0x91AC, 0xBACA, + 0x91AD, 0xBACB, 0x91AE, 0xBACC, 0x91AF, 0xBACD, 0x91B0, 0xBACE, + 0x91B1, 0xBACF, 0x91B2, 0xBAD0, 0x91B3, 0xBAD1, 0x91B4, 0xBAD2, + 0x91B5, 0xBAD3, 0x91B6, 0xBAD4, 0x91B7, 0xBAD5, 0x91B8, 0xBAD6, + 0x91B9, 0xBAD7, 0x91BA, 0xBADA, 0x91BB, 0xBADB, 0x91BC, 0xBADC, + 0x91BD, 0xBADD, 0x91BE, 0xBADE, 0x91BF, 0xBADF, 0x91C0, 0xBAE0, + 0x91C1, 0xBAE1, 0x91C2, 0xBAE2, 0x91C3, 0xBAE3, 0x91C4, 0xBAE4, + 0x91C5, 0xBAE5, 0x91C6, 0xBAE6, 0x91C7, 0xBAE7, 0x91C8, 0xBAE8, + 0x91C9, 0xBAE9, 0x91CA, 0xBAEA, 0x91CB, 0xBAEB, 0x91CC, 0xBAEC, + 0x91CD, 0xBAED, 0x91CE, 0xBAEE, 0x91CF, 0xBAEF, 0x91D0, 0xBAF0, + 0x91D1, 0xBAF1, 0x91D2, 0xBAF2, 0x91D3, 0xBAF3, 0x91D4, 0xBAF4, + 0x91D5, 0xBAF5, 0x91D6, 0xBAF6, 0x91D7, 0xBAF7, 0x91D8, 0xBAF8, + 0x91D9, 0xBAF9, 0x91DA, 0xBAFA, 0x91DB, 0xBAFB, 0x91DC, 0xBAFD, + 0x91DD, 0xBAFE, 0x91DE, 0xBAFF, 0x91DF, 0xBB01, 0x91E0, 0xBB02, + 0x91E1, 0xBB03, 0x91E2, 0xBB05, 0x91E3, 0xBB06, 0x91E4, 0xBB07, + 0x91E5, 0xBB08, 0x91E6, 0xBB09, 0x91E7, 0xBB0A, 0x91E8, 0xBB0B, + 0x91E9, 0xBB0C, 0x91EA, 0xBB0E, 0x91EB, 0xBB10, 0x91EC, 0xBB12, + 0x91ED, 0xBB13, 0x91EE, 0xBB14, 0x91EF, 0xBB15, 0x91F0, 0xBB16, + 0x91F1, 0xBB17, 0x91F2, 0xBB19, 0x91F3, 0xBB1A, 0x91F4, 0xBB1B, + 0x91F5, 0xBB1D, 0x91F6, 0xBB1E, 0x91F7, 0xBB1F, 0x91F8, 0xBB21, + 0x91F9, 0xBB22, 0x91FA, 0xBB23, 0x91FB, 0xBB24, 0x91FC, 0xBB25, + 0x91FD, 0xBB26, 0x91FE, 0xBB27, 0x9241, 0xBB28, 0x9242, 0xBB2A, + 0x9243, 0xBB2C, 0x9244, 0xBB2D, 0x9245, 0xBB2E, 0x9246, 0xBB2F, + 0x9247, 0xBB30, 0x9248, 0xBB31, 0x9249, 0xBB32, 0x924A, 0xBB33, + 0x924B, 0xBB37, 0x924C, 0xBB39, 0x924D, 0xBB3A, 0x924E, 0xBB3F, + 0x924F, 0xBB40, 0x9250, 0xBB41, 0x9251, 0xBB42, 0x9252, 0xBB43, + 0x9253, 0xBB46, 0x9254, 0xBB48, 0x9255, 0xBB4A, 0x9256, 0xBB4B, + 0x9257, 0xBB4C, 0x9258, 0xBB4E, 0x9259, 0xBB51, 0x925A, 0xBB52, + 0x9261, 0xBB53, 0x9262, 0xBB55, 0x9263, 0xBB56, 0x9264, 0xBB57, + 0x9265, 0xBB59, 0x9266, 0xBB5A, 0x9267, 0xBB5B, 0x9268, 0xBB5C, + 0x9269, 0xBB5D, 0x926A, 0xBB5E, 0x926B, 0xBB5F, 0x926C, 0xBB60, + 0x926D, 0xBB62, 0x926E, 0xBB64, 0x926F, 0xBB65, 0x9270, 0xBB66, + 0x9271, 0xBB67, 0x9272, 0xBB68, 0x9273, 0xBB69, 0x9274, 0xBB6A, + 0x9275, 0xBB6B, 0x9276, 0xBB6D, 0x9277, 0xBB6E, 0x9278, 0xBB6F, + 0x9279, 0xBB70, 0x927A, 0xBB71, 0x9281, 0xBB72, 0x9282, 0xBB73, + 0x9283, 0xBB74, 0x9284, 0xBB75, 0x9285, 0xBB76, 0x9286, 0xBB77, + 0x9287, 0xBB78, 0x9288, 0xBB79, 0x9289, 0xBB7A, 0x928A, 0xBB7B, + 0x928B, 0xBB7C, 0x928C, 0xBB7D, 0x928D, 0xBB7E, 0x928E, 0xBB7F, + 0x928F, 0xBB80, 0x9290, 0xBB81, 0x9291, 0xBB82, 0x9292, 0xBB83, + 0x9293, 0xBB84, 0x9294, 0xBB85, 0x9295, 0xBB86, 0x9296, 0xBB87, + 0x9297, 0xBB89, 0x9298, 0xBB8A, 0x9299, 0xBB8B, 0x929A, 0xBB8D, + 0x929B, 0xBB8E, 0x929C, 0xBB8F, 0x929D, 0xBB91, 0x929E, 0xBB92, + 0x929F, 0xBB93, 0x92A0, 0xBB94, 0x92A1, 0xBB95, 0x92A2, 0xBB96, + 0x92A3, 0xBB97, 0x92A4, 0xBB98, 0x92A5, 0xBB99, 0x92A6, 0xBB9A, + 0x92A7, 0xBB9B, 0x92A8, 0xBB9C, 0x92A9, 0xBB9D, 0x92AA, 0xBB9E, + 0x92AB, 0xBB9F, 0x92AC, 0xBBA0, 0x92AD, 0xBBA1, 0x92AE, 0xBBA2, + 0x92AF, 0xBBA3, 0x92B0, 0xBBA5, 0x92B1, 0xBBA6, 0x92B2, 0xBBA7, + 0x92B3, 0xBBA9, 0x92B4, 0xBBAA, 0x92B5, 0xBBAB, 0x92B6, 0xBBAD, + 0x92B7, 0xBBAE, 0x92B8, 0xBBAF, 0x92B9, 0xBBB0, 0x92BA, 0xBBB1, + 0x92BB, 0xBBB2, 0x92BC, 0xBBB3, 0x92BD, 0xBBB5, 0x92BE, 0xBBB6, + 0x92BF, 0xBBB8, 0x92C0, 0xBBB9, 0x92C1, 0xBBBA, 0x92C2, 0xBBBB, + 0x92C3, 0xBBBC, 0x92C4, 0xBBBD, 0x92C5, 0xBBBE, 0x92C6, 0xBBBF, + 0x92C7, 0xBBC1, 0x92C8, 0xBBC2, 0x92C9, 0xBBC3, 0x92CA, 0xBBC5, + 0x92CB, 0xBBC6, 0x92CC, 0xBBC7, 0x92CD, 0xBBC9, 0x92CE, 0xBBCA, + 0x92CF, 0xBBCB, 0x92D0, 0xBBCC, 0x92D1, 0xBBCD, 0x92D2, 0xBBCE, + 0x92D3, 0xBBCF, 0x92D4, 0xBBD1, 0x92D5, 0xBBD2, 0x92D6, 0xBBD4, + 0x92D7, 0xBBD5, 0x92D8, 0xBBD6, 0x92D9, 0xBBD7, 0x92DA, 0xBBD8, + 0x92DB, 0xBBD9, 0x92DC, 0xBBDA, 0x92DD, 0xBBDB, 0x92DE, 0xBBDC, + 0x92DF, 0xBBDD, 0x92E0, 0xBBDE, 0x92E1, 0xBBDF, 0x92E2, 0xBBE0, + 0x92E3, 0xBBE1, 0x92E4, 0xBBE2, 0x92E5, 0xBBE3, 0x92E6, 0xBBE4, + 0x92E7, 0xBBE5, 0x92E8, 0xBBE6, 0x92E9, 0xBBE7, 0x92EA, 0xBBE8, + 0x92EB, 0xBBE9, 0x92EC, 0xBBEA, 0x92ED, 0xBBEB, 0x92EE, 0xBBEC, + 0x92EF, 0xBBED, 0x92F0, 0xBBEE, 0x92F1, 0xBBEF, 0x92F2, 0xBBF0, + 0x92F3, 0xBBF1, 0x92F4, 0xBBF2, 0x92F5, 0xBBF3, 0x92F6, 0xBBF4, + 0x92F7, 0xBBF5, 0x92F8, 0xBBF6, 0x92F9, 0xBBF7, 0x92FA, 0xBBFA, + 0x92FB, 0xBBFB, 0x92FC, 0xBBFD, 0x92FD, 0xBBFE, 0x92FE, 0xBC01, + 0x9341, 0xBC03, 0x9342, 0xBC04, 0x9343, 0xBC05, 0x9344, 0xBC06, + 0x9345, 0xBC07, 0x9346, 0xBC0A, 0x9347, 0xBC0E, 0x9348, 0xBC10, + 0x9349, 0xBC12, 0x934A, 0xBC13, 0x934B, 0xBC19, 0x934C, 0xBC1A, + 0x934D, 0xBC20, 0x934E, 0xBC21, 0x934F, 0xBC22, 0x9350, 0xBC23, + 0x9351, 0xBC26, 0x9352, 0xBC28, 0x9353, 0xBC2A, 0x9354, 0xBC2B, + 0x9355, 0xBC2C, 0x9356, 0xBC2E, 0x9357, 0xBC2F, 0x9358, 0xBC32, + 0x9359, 0xBC33, 0x935A, 0xBC35, 0x9361, 0xBC36, 0x9362, 0xBC37, + 0x9363, 0xBC39, 0x9364, 0xBC3A, 0x9365, 0xBC3B, 0x9366, 0xBC3C, + 0x9367, 0xBC3D, 0x9368, 0xBC3E, 0x9369, 0xBC3F, 0x936A, 0xBC42, + 0x936B, 0xBC46, 0x936C, 0xBC47, 0x936D, 0xBC48, 0x936E, 0xBC4A, + 0x936F, 0xBC4B, 0x9370, 0xBC4E, 0x9371, 0xBC4F, 0x9372, 0xBC51, + 0x9373, 0xBC52, 0x9374, 0xBC53, 0x9375, 0xBC54, 0x9376, 0xBC55, + 0x9377, 0xBC56, 0x9378, 0xBC57, 0x9379, 0xBC58, 0x937A, 0xBC59, + 0x9381, 0xBC5A, 0x9382, 0xBC5B, 0x9383, 0xBC5C, 0x9384, 0xBC5E, + 0x9385, 0xBC5F, 0x9386, 0xBC60, 0x9387, 0xBC61, 0x9388, 0xBC62, + 0x9389, 0xBC63, 0x938A, 0xBC64, 0x938B, 0xBC65, 0x938C, 0xBC66, + 0x938D, 0xBC67, 0x938E, 0xBC68, 0x938F, 0xBC69, 0x9390, 0xBC6A, + 0x9391, 0xBC6B, 0x9392, 0xBC6C, 0x9393, 0xBC6D, 0x9394, 0xBC6E, + 0x9395, 0xBC6F, 0x9396, 0xBC70, 0x9397, 0xBC71, 0x9398, 0xBC72, + 0x9399, 0xBC73, 0x939A, 0xBC74, 0x939B, 0xBC75, 0x939C, 0xBC76, + 0x939D, 0xBC77, 0x939E, 0xBC78, 0x939F, 0xBC79, 0x93A0, 0xBC7A, + 0x93A1, 0xBC7B, 0x93A2, 0xBC7C, 0x93A3, 0xBC7D, 0x93A4, 0xBC7E, + 0x93A5, 0xBC7F, 0x93A6, 0xBC80, 0x93A7, 0xBC81, 0x93A8, 0xBC82, + 0x93A9, 0xBC83, 0x93AA, 0xBC86, 0x93AB, 0xBC87, 0x93AC, 0xBC89, + 0x93AD, 0xBC8A, 0x93AE, 0xBC8D, 0x93AF, 0xBC8F, 0x93B0, 0xBC90, + 0x93B1, 0xBC91, 0x93B2, 0xBC92, 0x93B3, 0xBC93, 0x93B4, 0xBC96, + 0x93B5, 0xBC98, 0x93B6, 0xBC9B, 0x93B7, 0xBC9C, 0x93B8, 0xBC9D, + 0x93B9, 0xBC9E, 0x93BA, 0xBC9F, 0x93BB, 0xBCA2, 0x93BC, 0xBCA3, + 0x93BD, 0xBCA5, 0x93BE, 0xBCA6, 0x93BF, 0xBCA9, 0x93C0, 0xBCAA, + 0x93C1, 0xBCAB, 0x93C2, 0xBCAC, 0x93C3, 0xBCAD, 0x93C4, 0xBCAE, + 0x93C5, 0xBCAF, 0x93C6, 0xBCB2, 0x93C7, 0xBCB6, 0x93C8, 0xBCB7, + 0x93C9, 0xBCB8, 0x93CA, 0xBCB9, 0x93CB, 0xBCBA, 0x93CC, 0xBCBB, + 0x93CD, 0xBCBE, 0x93CE, 0xBCBF, 0x93CF, 0xBCC1, 0x93D0, 0xBCC2, + 0x93D1, 0xBCC3, 0x93D2, 0xBCC5, 0x93D3, 0xBCC6, 0x93D4, 0xBCC7, + 0x93D5, 0xBCC8, 0x93D6, 0xBCC9, 0x93D7, 0xBCCA, 0x93D8, 0xBCCB, + 0x93D9, 0xBCCC, 0x93DA, 0xBCCE, 0x93DB, 0xBCD2, 0x93DC, 0xBCD3, + 0x93DD, 0xBCD4, 0x93DE, 0xBCD6, 0x93DF, 0xBCD7, 0x93E0, 0xBCD9, + 0x93E1, 0xBCDA, 0x93E2, 0xBCDB, 0x93E3, 0xBCDD, 0x93E4, 0xBCDE, + 0x93E5, 0xBCDF, 0x93E6, 0xBCE0, 0x93E7, 0xBCE1, 0x93E8, 0xBCE2, + 0x93E9, 0xBCE3, 0x93EA, 0xBCE4, 0x93EB, 0xBCE5, 0x93EC, 0xBCE6, + 0x93ED, 0xBCE7, 0x93EE, 0xBCE8, 0x93EF, 0xBCE9, 0x93F0, 0xBCEA, + 0x93F1, 0xBCEB, 0x93F2, 0xBCEC, 0x93F3, 0xBCED, 0x93F4, 0xBCEE, + 0x93F5, 0xBCEF, 0x93F6, 0xBCF0, 0x93F7, 0xBCF1, 0x93F8, 0xBCF2, + 0x93F9, 0xBCF3, 0x93FA, 0xBCF7, 0x93FB, 0xBCF9, 0x93FC, 0xBCFA, + 0x93FD, 0xBCFB, 0x93FE, 0xBCFD, 0x9441, 0xBCFE, 0x9442, 0xBCFF, + 0x9443, 0xBD00, 0x9444, 0xBD01, 0x9445, 0xBD02, 0x9446, 0xBD03, + 0x9447, 0xBD06, 0x9448, 0xBD08, 0x9449, 0xBD0A, 0x944A, 0xBD0B, + 0x944B, 0xBD0C, 0x944C, 0xBD0D, 0x944D, 0xBD0E, 0x944E, 0xBD0F, + 0x944F, 0xBD11, 0x9450, 0xBD12, 0x9451, 0xBD13, 0x9452, 0xBD15, + 0x9453, 0xBD16, 0x9454, 0xBD17, 0x9455, 0xBD18, 0x9456, 0xBD19, + 0x9457, 0xBD1A, 0x9458, 0xBD1B, 0x9459, 0xBD1C, 0x945A, 0xBD1D, + 0x9461, 0xBD1E, 0x9462, 0xBD1F, 0x9463, 0xBD20, 0x9464, 0xBD21, + 0x9465, 0xBD22, 0x9466, 0xBD23, 0x9467, 0xBD25, 0x9468, 0xBD26, + 0x9469, 0xBD27, 0x946A, 0xBD28, 0x946B, 0xBD29, 0x946C, 0xBD2A, + 0x946D, 0xBD2B, 0x946E, 0xBD2D, 0x946F, 0xBD2E, 0x9470, 0xBD2F, + 0x9471, 0xBD30, 0x9472, 0xBD31, 0x9473, 0xBD32, 0x9474, 0xBD33, + 0x9475, 0xBD34, 0x9476, 0xBD35, 0x9477, 0xBD36, 0x9478, 0xBD37, + 0x9479, 0xBD38, 0x947A, 0xBD39, 0x9481, 0xBD3A, 0x9482, 0xBD3B, + 0x9483, 0xBD3C, 0x9484, 0xBD3D, 0x9485, 0xBD3E, 0x9486, 0xBD3F, + 0x9487, 0xBD41, 0x9488, 0xBD42, 0x9489, 0xBD43, 0x948A, 0xBD44, + 0x948B, 0xBD45, 0x948C, 0xBD46, 0x948D, 0xBD47, 0x948E, 0xBD4A, + 0x948F, 0xBD4B, 0x9490, 0xBD4D, 0x9491, 0xBD4E, 0x9492, 0xBD4F, + 0x9493, 0xBD51, 0x9494, 0xBD52, 0x9495, 0xBD53, 0x9496, 0xBD54, + 0x9497, 0xBD55, 0x9498, 0xBD56, 0x9499, 0xBD57, 0x949A, 0xBD5A, + 0x949B, 0xBD5B, 0x949C, 0xBD5C, 0x949D, 0xBD5D, 0x949E, 0xBD5E, + 0x949F, 0xBD5F, 0x94A0, 0xBD60, 0x94A1, 0xBD61, 0x94A2, 0xBD62, + 0x94A3, 0xBD63, 0x94A4, 0xBD65, 0x94A5, 0xBD66, 0x94A6, 0xBD67, + 0x94A7, 0xBD69, 0x94A8, 0xBD6A, 0x94A9, 0xBD6B, 0x94AA, 0xBD6C, + 0x94AB, 0xBD6D, 0x94AC, 0xBD6E, 0x94AD, 0xBD6F, 0x94AE, 0xBD70, + 0x94AF, 0xBD71, 0x94B0, 0xBD72, 0x94B1, 0xBD73, 0x94B2, 0xBD74, + 0x94B3, 0xBD75, 0x94B4, 0xBD76, 0x94B5, 0xBD77, 0x94B6, 0xBD78, + 0x94B7, 0xBD79, 0x94B8, 0xBD7A, 0x94B9, 0xBD7B, 0x94BA, 0xBD7C, + 0x94BB, 0xBD7D, 0x94BC, 0xBD7E, 0x94BD, 0xBD7F, 0x94BE, 0xBD82, + 0x94BF, 0xBD83, 0x94C0, 0xBD85, 0x94C1, 0xBD86, 0x94C2, 0xBD8B, + 0x94C3, 0xBD8C, 0x94C4, 0xBD8D, 0x94C5, 0xBD8E, 0x94C6, 0xBD8F, + 0x94C7, 0xBD92, 0x94C8, 0xBD94, 0x94C9, 0xBD96, 0x94CA, 0xBD97, + 0x94CB, 0xBD98, 0x94CC, 0xBD9B, 0x94CD, 0xBD9D, 0x94CE, 0xBD9E, + 0x94CF, 0xBD9F, 0x94D0, 0xBDA0, 0x94D1, 0xBDA1, 0x94D2, 0xBDA2, + 0x94D3, 0xBDA3, 0x94D4, 0xBDA5, 0x94D5, 0xBDA6, 0x94D6, 0xBDA7, + 0x94D7, 0xBDA8, 0x94D8, 0xBDA9, 0x94D9, 0xBDAA, 0x94DA, 0xBDAB, + 0x94DB, 0xBDAC, 0x94DC, 0xBDAD, 0x94DD, 0xBDAE, 0x94DE, 0xBDAF, + 0x94DF, 0xBDB1, 0x94E0, 0xBDB2, 0x94E1, 0xBDB3, 0x94E2, 0xBDB4, + 0x94E3, 0xBDB5, 0x94E4, 0xBDB6, 0x94E5, 0xBDB7, 0x94E6, 0xBDB9, + 0x94E7, 0xBDBA, 0x94E8, 0xBDBB, 0x94E9, 0xBDBC, 0x94EA, 0xBDBD, + 0x94EB, 0xBDBE, 0x94EC, 0xBDBF, 0x94ED, 0xBDC0, 0x94EE, 0xBDC1, + 0x94EF, 0xBDC2, 0x94F0, 0xBDC3, 0x94F1, 0xBDC4, 0x94F2, 0xBDC5, + 0x94F3, 0xBDC6, 0x94F4, 0xBDC7, 0x94F5, 0xBDC8, 0x94F6, 0xBDC9, + 0x94F7, 0xBDCA, 0x94F8, 0xBDCB, 0x94F9, 0xBDCC, 0x94FA, 0xBDCD, + 0x94FB, 0xBDCE, 0x94FC, 0xBDCF, 0x94FD, 0xBDD0, 0x94FE, 0xBDD1, + 0x9541, 0xBDD2, 0x9542, 0xBDD3, 0x9543, 0xBDD6, 0x9544, 0xBDD7, + 0x9545, 0xBDD9, 0x9546, 0xBDDA, 0x9547, 0xBDDB, 0x9548, 0xBDDD, + 0x9549, 0xBDDE, 0x954A, 0xBDDF, 0x954B, 0xBDE0, 0x954C, 0xBDE1, + 0x954D, 0xBDE2, 0x954E, 0xBDE3, 0x954F, 0xBDE4, 0x9550, 0xBDE5, + 0x9551, 0xBDE6, 0x9552, 0xBDE7, 0x9553, 0xBDE8, 0x9554, 0xBDEA, + 0x9555, 0xBDEB, 0x9556, 0xBDEC, 0x9557, 0xBDED, 0x9558, 0xBDEE, + 0x9559, 0xBDEF, 0x955A, 0xBDF1, 0x9561, 0xBDF2, 0x9562, 0xBDF3, + 0x9563, 0xBDF5, 0x9564, 0xBDF6, 0x9565, 0xBDF7, 0x9566, 0xBDF9, + 0x9567, 0xBDFA, 0x9568, 0xBDFB, 0x9569, 0xBDFC, 0x956A, 0xBDFD, + 0x956B, 0xBDFE, 0x956C, 0xBDFF, 0x956D, 0xBE01, 0x956E, 0xBE02, + 0x956F, 0xBE04, 0x9570, 0xBE06, 0x9571, 0xBE07, 0x9572, 0xBE08, + 0x9573, 0xBE09, 0x9574, 0xBE0A, 0x9575, 0xBE0B, 0x9576, 0xBE0E, + 0x9577, 0xBE0F, 0x9578, 0xBE11, 0x9579, 0xBE12, 0x957A, 0xBE13, + 0x9581, 0xBE15, 0x9582, 0xBE16, 0x9583, 0xBE17, 0x9584, 0xBE18, + 0x9585, 0xBE19, 0x9586, 0xBE1A, 0x9587, 0xBE1B, 0x9588, 0xBE1E, + 0x9589, 0xBE20, 0x958A, 0xBE21, 0x958B, 0xBE22, 0x958C, 0xBE23, + 0x958D, 0xBE24, 0x958E, 0xBE25, 0x958F, 0xBE26, 0x9590, 0xBE27, + 0x9591, 0xBE28, 0x9592, 0xBE29, 0x9593, 0xBE2A, 0x9594, 0xBE2B, + 0x9595, 0xBE2C, 0x9596, 0xBE2D, 0x9597, 0xBE2E, 0x9598, 0xBE2F, + 0x9599, 0xBE30, 0x959A, 0xBE31, 0x959B, 0xBE32, 0x959C, 0xBE33, + 0x959D, 0xBE34, 0x959E, 0xBE35, 0x959F, 0xBE36, 0x95A0, 0xBE37, + 0x95A1, 0xBE38, 0x95A2, 0xBE39, 0x95A3, 0xBE3A, 0x95A4, 0xBE3B, + 0x95A5, 0xBE3C, 0x95A6, 0xBE3D, 0x95A7, 0xBE3E, 0x95A8, 0xBE3F, + 0x95A9, 0xBE40, 0x95AA, 0xBE41, 0x95AB, 0xBE42, 0x95AC, 0xBE43, + 0x95AD, 0xBE46, 0x95AE, 0xBE47, 0x95AF, 0xBE49, 0x95B0, 0xBE4A, + 0x95B1, 0xBE4B, 0x95B2, 0xBE4D, 0x95B3, 0xBE4F, 0x95B4, 0xBE50, + 0x95B5, 0xBE51, 0x95B6, 0xBE52, 0x95B7, 0xBE53, 0x95B8, 0xBE56, + 0x95B9, 0xBE58, 0x95BA, 0xBE5C, 0x95BB, 0xBE5D, 0x95BC, 0xBE5E, + 0x95BD, 0xBE5F, 0x95BE, 0xBE62, 0x95BF, 0xBE63, 0x95C0, 0xBE65, + 0x95C1, 0xBE66, 0x95C2, 0xBE67, 0x95C3, 0xBE69, 0x95C4, 0xBE6B, + 0x95C5, 0xBE6C, 0x95C6, 0xBE6D, 0x95C7, 0xBE6E, 0x95C8, 0xBE6F, + 0x95C9, 0xBE72, 0x95CA, 0xBE76, 0x95CB, 0xBE77, 0x95CC, 0xBE78, + 0x95CD, 0xBE79, 0x95CE, 0xBE7A, 0x95CF, 0xBE7E, 0x95D0, 0xBE7F, + 0x95D1, 0xBE81, 0x95D2, 0xBE82, 0x95D3, 0xBE83, 0x95D4, 0xBE85, + 0x95D5, 0xBE86, 0x95D6, 0xBE87, 0x95D7, 0xBE88, 0x95D8, 0xBE89, + 0x95D9, 0xBE8A, 0x95DA, 0xBE8B, 0x95DB, 0xBE8E, 0x95DC, 0xBE92, + 0x95DD, 0xBE93, 0x95DE, 0xBE94, 0x95DF, 0xBE95, 0x95E0, 0xBE96, + 0x95E1, 0xBE97, 0x95E2, 0xBE9A, 0x95E3, 0xBE9B, 0x95E4, 0xBE9C, + 0x95E5, 0xBE9D, 0x95E6, 0xBE9E, 0x95E7, 0xBE9F, 0x95E8, 0xBEA0, + 0x95E9, 0xBEA1, 0x95EA, 0xBEA2, 0x95EB, 0xBEA3, 0x95EC, 0xBEA4, + 0x95ED, 0xBEA5, 0x95EE, 0xBEA6, 0x95EF, 0xBEA7, 0x95F0, 0xBEA9, + 0x95F1, 0xBEAA, 0x95F2, 0xBEAB, 0x95F3, 0xBEAC, 0x95F4, 0xBEAD, + 0x95F5, 0xBEAE, 0x95F6, 0xBEAF, 0x95F7, 0xBEB0, 0x95F8, 0xBEB1, + 0x95F9, 0xBEB2, 0x95FA, 0xBEB3, 0x95FB, 0xBEB4, 0x95FC, 0xBEB5, + 0x95FD, 0xBEB6, 0x95FE, 0xBEB7, 0x9641, 0xBEB8, 0x9642, 0xBEB9, + 0x9643, 0xBEBA, 0x9644, 0xBEBB, 0x9645, 0xBEBC, 0x9646, 0xBEBD, + 0x9647, 0xBEBE, 0x9648, 0xBEBF, 0x9649, 0xBEC0, 0x964A, 0xBEC1, + 0x964B, 0xBEC2, 0x964C, 0xBEC3, 0x964D, 0xBEC4, 0x964E, 0xBEC5, + 0x964F, 0xBEC6, 0x9650, 0xBEC7, 0x9651, 0xBEC8, 0x9652, 0xBEC9, + 0x9653, 0xBECA, 0x9654, 0xBECB, 0x9655, 0xBECC, 0x9656, 0xBECD, + 0x9657, 0xBECE, 0x9658, 0xBECF, 0x9659, 0xBED2, 0x965A, 0xBED3, + 0x9661, 0xBED5, 0x9662, 0xBED6, 0x9663, 0xBED9, 0x9664, 0xBEDA, + 0x9665, 0xBEDB, 0x9666, 0xBEDC, 0x9667, 0xBEDD, 0x9668, 0xBEDE, + 0x9669, 0xBEDF, 0x966A, 0xBEE1, 0x966B, 0xBEE2, 0x966C, 0xBEE6, + 0x966D, 0xBEE7, 0x966E, 0xBEE8, 0x966F, 0xBEE9, 0x9670, 0xBEEA, + 0x9671, 0xBEEB, 0x9672, 0xBEED, 0x9673, 0xBEEE, 0x9674, 0xBEEF, + 0x9675, 0xBEF0, 0x9676, 0xBEF1, 0x9677, 0xBEF2, 0x9678, 0xBEF3, + 0x9679, 0xBEF4, 0x967A, 0xBEF5, 0x9681, 0xBEF6, 0x9682, 0xBEF7, + 0x9683, 0xBEF8, 0x9684, 0xBEF9, 0x9685, 0xBEFA, 0x9686, 0xBEFB, + 0x9687, 0xBEFC, 0x9688, 0xBEFD, 0x9689, 0xBEFE, 0x968A, 0xBEFF, + 0x968B, 0xBF00, 0x968C, 0xBF02, 0x968D, 0xBF03, 0x968E, 0xBF04, + 0x968F, 0xBF05, 0x9690, 0xBF06, 0x9691, 0xBF07, 0x9692, 0xBF0A, + 0x9693, 0xBF0B, 0x9694, 0xBF0C, 0x9695, 0xBF0D, 0x9696, 0xBF0E, + 0x9697, 0xBF0F, 0x9698, 0xBF10, 0x9699, 0xBF11, 0x969A, 0xBF12, + 0x969B, 0xBF13, 0x969C, 0xBF14, 0x969D, 0xBF15, 0x969E, 0xBF16, + 0x969F, 0xBF17, 0x96A0, 0xBF1A, 0x96A1, 0xBF1E, 0x96A2, 0xBF1F, + 0x96A3, 0xBF20, 0x96A4, 0xBF21, 0x96A5, 0xBF22, 0x96A6, 0xBF23, + 0x96A7, 0xBF24, 0x96A8, 0xBF25, 0x96A9, 0xBF26, 0x96AA, 0xBF27, + 0x96AB, 0xBF28, 0x96AC, 0xBF29, 0x96AD, 0xBF2A, 0x96AE, 0xBF2B, + 0x96AF, 0xBF2C, 0x96B0, 0xBF2D, 0x96B1, 0xBF2E, 0x96B2, 0xBF2F, + 0x96B3, 0xBF30, 0x96B4, 0xBF31, 0x96B5, 0xBF32, 0x96B6, 0xBF33, + 0x96B7, 0xBF34, 0x96B8, 0xBF35, 0x96B9, 0xBF36, 0x96BA, 0xBF37, + 0x96BB, 0xBF38, 0x96BC, 0xBF39, 0x96BD, 0xBF3A, 0x96BE, 0xBF3B, + 0x96BF, 0xBF3C, 0x96C0, 0xBF3D, 0x96C1, 0xBF3E, 0x96C2, 0xBF3F, + 0x96C3, 0xBF42, 0x96C4, 0xBF43, 0x96C5, 0xBF45, 0x96C6, 0xBF46, + 0x96C7, 0xBF47, 0x96C8, 0xBF49, 0x96C9, 0xBF4A, 0x96CA, 0xBF4B, + 0x96CB, 0xBF4C, 0x96CC, 0xBF4D, 0x96CD, 0xBF4E, 0x96CE, 0xBF4F, + 0x96CF, 0xBF52, 0x96D0, 0xBF53, 0x96D1, 0xBF54, 0x96D2, 0xBF56, + 0x96D3, 0xBF57, 0x96D4, 0xBF58, 0x96D5, 0xBF59, 0x96D6, 0xBF5A, + 0x96D7, 0xBF5B, 0x96D8, 0xBF5C, 0x96D9, 0xBF5D, 0x96DA, 0xBF5E, + 0x96DB, 0xBF5F, 0x96DC, 0xBF60, 0x96DD, 0xBF61, 0x96DE, 0xBF62, + 0x96DF, 0xBF63, 0x96E0, 0xBF64, 0x96E1, 0xBF65, 0x96E2, 0xBF66, + 0x96E3, 0xBF67, 0x96E4, 0xBF68, 0x96E5, 0xBF69, 0x96E6, 0xBF6A, + 0x96E7, 0xBF6B, 0x96E8, 0xBF6C, 0x96E9, 0xBF6D, 0x96EA, 0xBF6E, + 0x96EB, 0xBF6F, 0x96EC, 0xBF70, 0x96ED, 0xBF71, 0x96EE, 0xBF72, + 0x96EF, 0xBF73, 0x96F0, 0xBF74, 0x96F1, 0xBF75, 0x96F2, 0xBF76, + 0x96F3, 0xBF77, 0x96F4, 0xBF78, 0x96F5, 0xBF79, 0x96F6, 0xBF7A, + 0x96F7, 0xBF7B, 0x96F8, 0xBF7C, 0x96F9, 0xBF7D, 0x96FA, 0xBF7E, + 0x96FB, 0xBF7F, 0x96FC, 0xBF80, 0x96FD, 0xBF81, 0x96FE, 0xBF82, + 0x9741, 0xBF83, 0x9742, 0xBF84, 0x9743, 0xBF85, 0x9744, 0xBF86, + 0x9745, 0xBF87, 0x9746, 0xBF88, 0x9747, 0xBF89, 0x9748, 0xBF8A, + 0x9749, 0xBF8B, 0x974A, 0xBF8C, 0x974B, 0xBF8D, 0x974C, 0xBF8E, + 0x974D, 0xBF8F, 0x974E, 0xBF90, 0x974F, 0xBF91, 0x9750, 0xBF92, + 0x9751, 0xBF93, 0x9752, 0xBF95, 0x9753, 0xBF96, 0x9754, 0xBF97, + 0x9755, 0xBF98, 0x9756, 0xBF99, 0x9757, 0xBF9A, 0x9758, 0xBF9B, + 0x9759, 0xBF9C, 0x975A, 0xBF9D, 0x9761, 0xBF9E, 0x9762, 0xBF9F, + 0x9763, 0xBFA0, 0x9764, 0xBFA1, 0x9765, 0xBFA2, 0x9766, 0xBFA3, + 0x9767, 0xBFA4, 0x9768, 0xBFA5, 0x9769, 0xBFA6, 0x976A, 0xBFA7, + 0x976B, 0xBFA8, 0x976C, 0xBFA9, 0x976D, 0xBFAA, 0x976E, 0xBFAB, + 0x976F, 0xBFAC, 0x9770, 0xBFAD, 0x9771, 0xBFAE, 0x9772, 0xBFAF, + 0x9773, 0xBFB1, 0x9774, 0xBFB2, 0x9775, 0xBFB3, 0x9776, 0xBFB4, + 0x9777, 0xBFB5, 0x9778, 0xBFB6, 0x9779, 0xBFB7, 0x977A, 0xBFB8, + 0x9781, 0xBFB9, 0x9782, 0xBFBA, 0x9783, 0xBFBB, 0x9784, 0xBFBC, + 0x9785, 0xBFBD, 0x9786, 0xBFBE, 0x9787, 0xBFBF, 0x9788, 0xBFC0, + 0x9789, 0xBFC1, 0x978A, 0xBFC2, 0x978B, 0xBFC3, 0x978C, 0xBFC4, + 0x978D, 0xBFC6, 0x978E, 0xBFC7, 0x978F, 0xBFC8, 0x9790, 0xBFC9, + 0x9791, 0xBFCA, 0x9792, 0xBFCB, 0x9793, 0xBFCE, 0x9794, 0xBFCF, + 0x9795, 0xBFD1, 0x9796, 0xBFD2, 0x9797, 0xBFD3, 0x9798, 0xBFD5, + 0x9799, 0xBFD6, 0x979A, 0xBFD7, 0x979B, 0xBFD8, 0x979C, 0xBFD9, + 0x979D, 0xBFDA, 0x979E, 0xBFDB, 0x979F, 0xBFDD, 0x97A0, 0xBFDE, + 0x97A1, 0xBFE0, 0x97A2, 0xBFE2, 0x97A3, 0xBFE3, 0x97A4, 0xBFE4, + 0x97A5, 0xBFE5, 0x97A6, 0xBFE6, 0x97A7, 0xBFE7, 0x97A8, 0xBFE8, + 0x97A9, 0xBFE9, 0x97AA, 0xBFEA, 0x97AB, 0xBFEB, 0x97AC, 0xBFEC, + 0x97AD, 0xBFED, 0x97AE, 0xBFEE, 0x97AF, 0xBFEF, 0x97B0, 0xBFF0, + 0x97B1, 0xBFF1, 0x97B2, 0xBFF2, 0x97B3, 0xBFF3, 0x97B4, 0xBFF4, + 0x97B5, 0xBFF5, 0x97B6, 0xBFF6, 0x97B7, 0xBFF7, 0x97B8, 0xBFF8, + 0x97B9, 0xBFF9, 0x97BA, 0xBFFA, 0x97BB, 0xBFFB, 0x97BC, 0xBFFC, + 0x97BD, 0xBFFD, 0x97BE, 0xBFFE, 0x97BF, 0xBFFF, 0x97C0, 0xC000, + 0x97C1, 0xC001, 0x97C2, 0xC002, 0x97C3, 0xC003, 0x97C4, 0xC004, + 0x97C5, 0xC005, 0x97C6, 0xC006, 0x97C7, 0xC007, 0x97C8, 0xC008, + 0x97C9, 0xC009, 0x97CA, 0xC00A, 0x97CB, 0xC00B, 0x97CC, 0xC00C, + 0x97CD, 0xC00D, 0x97CE, 0xC00E, 0x97CF, 0xC00F, 0x97D0, 0xC010, + 0x97D1, 0xC011, 0x97D2, 0xC012, 0x97D3, 0xC013, 0x97D4, 0xC014, + 0x97D5, 0xC015, 0x97D6, 0xC016, 0x97D7, 0xC017, 0x97D8, 0xC018, + 0x97D9, 0xC019, 0x97DA, 0xC01A, 0x97DB, 0xC01B, 0x97DC, 0xC01C, + 0x97DD, 0xC01D, 0x97DE, 0xC01E, 0x97DF, 0xC01F, 0x97E0, 0xC020, + 0x97E1, 0xC021, 0x97E2, 0xC022, 0x97E3, 0xC023, 0x97E4, 0xC024, + 0x97E5, 0xC025, 0x97E6, 0xC026, 0x97E7, 0xC027, 0x97E8, 0xC028, + 0x97E9, 0xC029, 0x97EA, 0xC02A, 0x97EB, 0xC02B, 0x97EC, 0xC02C, + 0x97ED, 0xC02D, 0x97EE, 0xC02E, 0x97EF, 0xC02F, 0x97F0, 0xC030, + 0x97F1, 0xC031, 0x97F2, 0xC032, 0x97F3, 0xC033, 0x97F4, 0xC034, + 0x97F5, 0xC035, 0x97F6, 0xC036, 0x97F7, 0xC037, 0x97F8, 0xC038, + 0x97F9, 0xC039, 0x97FA, 0xC03A, 0x97FB, 0xC03B, 0x97FC, 0xC03D, + 0x97FD, 0xC03E, 0x97FE, 0xC03F, 0x9841, 0xC040, 0x9842, 0xC041, + 0x9843, 0xC042, 0x9844, 0xC043, 0x9845, 0xC044, 0x9846, 0xC045, + 0x9847, 0xC046, 0x9848, 0xC047, 0x9849, 0xC048, 0x984A, 0xC049, + 0x984B, 0xC04A, 0x984C, 0xC04B, 0x984D, 0xC04C, 0x984E, 0xC04D, + 0x984F, 0xC04E, 0x9850, 0xC04F, 0x9851, 0xC050, 0x9852, 0xC052, + 0x9853, 0xC053, 0x9854, 0xC054, 0x9855, 0xC055, 0x9856, 0xC056, + 0x9857, 0xC057, 0x9858, 0xC059, 0x9859, 0xC05A, 0x985A, 0xC05B, + 0x9861, 0xC05D, 0x9862, 0xC05E, 0x9863, 0xC05F, 0x9864, 0xC061, + 0x9865, 0xC062, 0x9866, 0xC063, 0x9867, 0xC064, 0x9868, 0xC065, + 0x9869, 0xC066, 0x986A, 0xC067, 0x986B, 0xC06A, 0x986C, 0xC06B, + 0x986D, 0xC06C, 0x986E, 0xC06D, 0x986F, 0xC06E, 0x9870, 0xC06F, + 0x9871, 0xC070, 0x9872, 0xC071, 0x9873, 0xC072, 0x9874, 0xC073, + 0x9875, 0xC074, 0x9876, 0xC075, 0x9877, 0xC076, 0x9878, 0xC077, + 0x9879, 0xC078, 0x987A, 0xC079, 0x9881, 0xC07A, 0x9882, 0xC07B, + 0x9883, 0xC07C, 0x9884, 0xC07D, 0x9885, 0xC07E, 0x9886, 0xC07F, + 0x9887, 0xC080, 0x9888, 0xC081, 0x9889, 0xC082, 0x988A, 0xC083, + 0x988B, 0xC084, 0x988C, 0xC085, 0x988D, 0xC086, 0x988E, 0xC087, + 0x988F, 0xC088, 0x9890, 0xC089, 0x9891, 0xC08A, 0x9892, 0xC08B, + 0x9893, 0xC08C, 0x9894, 0xC08D, 0x9895, 0xC08E, 0x9896, 0xC08F, + 0x9897, 0xC092, 0x9898, 0xC093, 0x9899, 0xC095, 0x989A, 0xC096, + 0x989B, 0xC097, 0x989C, 0xC099, 0x989D, 0xC09A, 0x989E, 0xC09B, + 0x989F, 0xC09C, 0x98A0, 0xC09D, 0x98A1, 0xC09E, 0x98A2, 0xC09F, + 0x98A3, 0xC0A2, 0x98A4, 0xC0A4, 0x98A5, 0xC0A6, 0x98A6, 0xC0A7, + 0x98A7, 0xC0A8, 0x98A8, 0xC0A9, 0x98A9, 0xC0AA, 0x98AA, 0xC0AB, + 0x98AB, 0xC0AE, 0x98AC, 0xC0B1, 0x98AD, 0xC0B2, 0x98AE, 0xC0B7, + 0x98AF, 0xC0B8, 0x98B0, 0xC0B9, 0x98B1, 0xC0BA, 0x98B2, 0xC0BB, + 0x98B3, 0xC0BE, 0x98B4, 0xC0C2, 0x98B5, 0xC0C3, 0x98B6, 0xC0C4, + 0x98B7, 0xC0C6, 0x98B8, 0xC0C7, 0x98B9, 0xC0CA, 0x98BA, 0xC0CB, + 0x98BB, 0xC0CD, 0x98BC, 0xC0CE, 0x98BD, 0xC0CF, 0x98BE, 0xC0D1, + 0x98BF, 0xC0D2, 0x98C0, 0xC0D3, 0x98C1, 0xC0D4, 0x98C2, 0xC0D5, + 0x98C3, 0xC0D6, 0x98C4, 0xC0D7, 0x98C5, 0xC0DA, 0x98C6, 0xC0DE, + 0x98C7, 0xC0DF, 0x98C8, 0xC0E0, 0x98C9, 0xC0E1, 0x98CA, 0xC0E2, + 0x98CB, 0xC0E3, 0x98CC, 0xC0E6, 0x98CD, 0xC0E7, 0x98CE, 0xC0E9, + 0x98CF, 0xC0EA, 0x98D0, 0xC0EB, 0x98D1, 0xC0ED, 0x98D2, 0xC0EE, + 0x98D3, 0xC0EF, 0x98D4, 0xC0F0, 0x98D5, 0xC0F1, 0x98D6, 0xC0F2, + 0x98D7, 0xC0F3, 0x98D8, 0xC0F6, 0x98D9, 0xC0F8, 0x98DA, 0xC0FA, + 0x98DB, 0xC0FB, 0x98DC, 0xC0FC, 0x98DD, 0xC0FD, 0x98DE, 0xC0FE, + 0x98DF, 0xC0FF, 0x98E0, 0xC101, 0x98E1, 0xC102, 0x98E2, 0xC103, + 0x98E3, 0xC105, 0x98E4, 0xC106, 0x98E5, 0xC107, 0x98E6, 0xC109, + 0x98E7, 0xC10A, 0x98E8, 0xC10B, 0x98E9, 0xC10C, 0x98EA, 0xC10D, + 0x98EB, 0xC10E, 0x98EC, 0xC10F, 0x98ED, 0xC111, 0x98EE, 0xC112, + 0x98EF, 0xC113, 0x98F0, 0xC114, 0x98F1, 0xC116, 0x98F2, 0xC117, + 0x98F3, 0xC118, 0x98F4, 0xC119, 0x98F5, 0xC11A, 0x98F6, 0xC11B, + 0x98F7, 0xC121, 0x98F8, 0xC122, 0x98F9, 0xC125, 0x98FA, 0xC128, + 0x98FB, 0xC129, 0x98FC, 0xC12A, 0x98FD, 0xC12B, 0x98FE, 0xC12E, + 0x9941, 0xC132, 0x9942, 0xC133, 0x9943, 0xC134, 0x9944, 0xC135, + 0x9945, 0xC137, 0x9946, 0xC13A, 0x9947, 0xC13B, 0x9948, 0xC13D, + 0x9949, 0xC13E, 0x994A, 0xC13F, 0x994B, 0xC141, 0x994C, 0xC142, + 0x994D, 0xC143, 0x994E, 0xC144, 0x994F, 0xC145, 0x9950, 0xC146, + 0x9951, 0xC147, 0x9952, 0xC14A, 0x9953, 0xC14E, 0x9954, 0xC14F, + 0x9955, 0xC150, 0x9956, 0xC151, 0x9957, 0xC152, 0x9958, 0xC153, + 0x9959, 0xC156, 0x995A, 0xC157, 0x9961, 0xC159, 0x9962, 0xC15A, + 0x9963, 0xC15B, 0x9964, 0xC15D, 0x9965, 0xC15E, 0x9966, 0xC15F, + 0x9967, 0xC160, 0x9968, 0xC161, 0x9969, 0xC162, 0x996A, 0xC163, + 0x996B, 0xC166, 0x996C, 0xC16A, 0x996D, 0xC16B, 0x996E, 0xC16C, + 0x996F, 0xC16D, 0x9970, 0xC16E, 0x9971, 0xC16F, 0x9972, 0xC171, + 0x9973, 0xC172, 0x9974, 0xC173, 0x9975, 0xC175, 0x9976, 0xC176, + 0x9977, 0xC177, 0x9978, 0xC179, 0x9979, 0xC17A, 0x997A, 0xC17B, + 0x9981, 0xC17C, 0x9982, 0xC17D, 0x9983, 0xC17E, 0x9984, 0xC17F, + 0x9985, 0xC180, 0x9986, 0xC181, 0x9987, 0xC182, 0x9988, 0xC183, + 0x9989, 0xC184, 0x998A, 0xC186, 0x998B, 0xC187, 0x998C, 0xC188, + 0x998D, 0xC189, 0x998E, 0xC18A, 0x998F, 0xC18B, 0x9990, 0xC18F, + 0x9991, 0xC191, 0x9992, 0xC192, 0x9993, 0xC193, 0x9994, 0xC195, + 0x9995, 0xC197, 0x9996, 0xC198, 0x9997, 0xC199, 0x9998, 0xC19A, + 0x9999, 0xC19B, 0x999A, 0xC19E, 0x999B, 0xC1A0, 0x999C, 0xC1A2, + 0x999D, 0xC1A3, 0x999E, 0xC1A4, 0x999F, 0xC1A6, 0x99A0, 0xC1A7, + 0x99A1, 0xC1AA, 0x99A2, 0xC1AB, 0x99A3, 0xC1AD, 0x99A4, 0xC1AE, + 0x99A5, 0xC1AF, 0x99A6, 0xC1B1, 0x99A7, 0xC1B2, 0x99A8, 0xC1B3, + 0x99A9, 0xC1B4, 0x99AA, 0xC1B5, 0x99AB, 0xC1B6, 0x99AC, 0xC1B7, + 0x99AD, 0xC1B8, 0x99AE, 0xC1B9, 0x99AF, 0xC1BA, 0x99B0, 0xC1BB, + 0x99B1, 0xC1BC, 0x99B2, 0xC1BE, 0x99B3, 0xC1BF, 0x99B4, 0xC1C0, + 0x99B5, 0xC1C1, 0x99B6, 0xC1C2, 0x99B7, 0xC1C3, 0x99B8, 0xC1C5, + 0x99B9, 0xC1C6, 0x99BA, 0xC1C7, 0x99BB, 0xC1C9, 0x99BC, 0xC1CA, + 0x99BD, 0xC1CB, 0x99BE, 0xC1CD, 0x99BF, 0xC1CE, 0x99C0, 0xC1CF, + 0x99C1, 0xC1D0, 0x99C2, 0xC1D1, 0x99C3, 0xC1D2, 0x99C4, 0xC1D3, + 0x99C5, 0xC1D5, 0x99C6, 0xC1D6, 0x99C7, 0xC1D9, 0x99C8, 0xC1DA, + 0x99C9, 0xC1DB, 0x99CA, 0xC1DC, 0x99CB, 0xC1DD, 0x99CC, 0xC1DE, + 0x99CD, 0xC1DF, 0x99CE, 0xC1E1, 0x99CF, 0xC1E2, 0x99D0, 0xC1E3, + 0x99D1, 0xC1E5, 0x99D2, 0xC1E6, 0x99D3, 0xC1E7, 0x99D4, 0xC1E9, + 0x99D5, 0xC1EA, 0x99D6, 0xC1EB, 0x99D7, 0xC1EC, 0x99D8, 0xC1ED, + 0x99D9, 0xC1EE, 0x99DA, 0xC1EF, 0x99DB, 0xC1F2, 0x99DC, 0xC1F4, + 0x99DD, 0xC1F5, 0x99DE, 0xC1F6, 0x99DF, 0xC1F7, 0x99E0, 0xC1F8, + 0x99E1, 0xC1F9, 0x99E2, 0xC1FA, 0x99E3, 0xC1FB, 0x99E4, 0xC1FE, + 0x99E5, 0xC1FF, 0x99E6, 0xC201, 0x99E7, 0xC202, 0x99E8, 0xC203, + 0x99E9, 0xC205, 0x99EA, 0xC206, 0x99EB, 0xC207, 0x99EC, 0xC208, + 0x99ED, 0xC209, 0x99EE, 0xC20A, 0x99EF, 0xC20B, 0x99F0, 0xC20E, + 0x99F1, 0xC210, 0x99F2, 0xC212, 0x99F3, 0xC213, 0x99F4, 0xC214, + 0x99F5, 0xC215, 0x99F6, 0xC216, 0x99F7, 0xC217, 0x99F8, 0xC21A, + 0x99F9, 0xC21B, 0x99FA, 0xC21D, 0x99FB, 0xC21E, 0x99FC, 0xC221, + 0x99FD, 0xC222, 0x99FE, 0xC223, 0x9A41, 0xC224, 0x9A42, 0xC225, + 0x9A43, 0xC226, 0x9A44, 0xC227, 0x9A45, 0xC22A, 0x9A46, 0xC22C, + 0x9A47, 0xC22E, 0x9A48, 0xC230, 0x9A49, 0xC233, 0x9A4A, 0xC235, + 0x9A4B, 0xC236, 0x9A4C, 0xC237, 0x9A4D, 0xC238, 0x9A4E, 0xC239, + 0x9A4F, 0xC23A, 0x9A50, 0xC23B, 0x9A51, 0xC23C, 0x9A52, 0xC23D, + 0x9A53, 0xC23E, 0x9A54, 0xC23F, 0x9A55, 0xC240, 0x9A56, 0xC241, + 0x9A57, 0xC242, 0x9A58, 0xC243, 0x9A59, 0xC244, 0x9A5A, 0xC245, + 0x9A61, 0xC246, 0x9A62, 0xC247, 0x9A63, 0xC249, 0x9A64, 0xC24A, + 0x9A65, 0xC24B, 0x9A66, 0xC24C, 0x9A67, 0xC24D, 0x9A68, 0xC24E, + 0x9A69, 0xC24F, 0x9A6A, 0xC252, 0x9A6B, 0xC253, 0x9A6C, 0xC255, + 0x9A6D, 0xC256, 0x9A6E, 0xC257, 0x9A6F, 0xC259, 0x9A70, 0xC25A, + 0x9A71, 0xC25B, 0x9A72, 0xC25C, 0x9A73, 0xC25D, 0x9A74, 0xC25E, + 0x9A75, 0xC25F, 0x9A76, 0xC261, 0x9A77, 0xC262, 0x9A78, 0xC263, + 0x9A79, 0xC264, 0x9A7A, 0xC266, 0x9A81, 0xC267, 0x9A82, 0xC268, + 0x9A83, 0xC269, 0x9A84, 0xC26A, 0x9A85, 0xC26B, 0x9A86, 0xC26E, + 0x9A87, 0xC26F, 0x9A88, 0xC271, 0x9A89, 0xC272, 0x9A8A, 0xC273, + 0x9A8B, 0xC275, 0x9A8C, 0xC276, 0x9A8D, 0xC277, 0x9A8E, 0xC278, + 0x9A8F, 0xC279, 0x9A90, 0xC27A, 0x9A91, 0xC27B, 0x9A92, 0xC27E, + 0x9A93, 0xC280, 0x9A94, 0xC282, 0x9A95, 0xC283, 0x9A96, 0xC284, + 0x9A97, 0xC285, 0x9A98, 0xC286, 0x9A99, 0xC287, 0x9A9A, 0xC28A, + 0x9A9B, 0xC28B, 0x9A9C, 0xC28C, 0x9A9D, 0xC28D, 0x9A9E, 0xC28E, + 0x9A9F, 0xC28F, 0x9AA0, 0xC291, 0x9AA1, 0xC292, 0x9AA2, 0xC293, + 0x9AA3, 0xC294, 0x9AA4, 0xC295, 0x9AA5, 0xC296, 0x9AA6, 0xC297, + 0x9AA7, 0xC299, 0x9AA8, 0xC29A, 0x9AA9, 0xC29C, 0x9AAA, 0xC29E, + 0x9AAB, 0xC29F, 0x9AAC, 0xC2A0, 0x9AAD, 0xC2A1, 0x9AAE, 0xC2A2, + 0x9AAF, 0xC2A3, 0x9AB0, 0xC2A6, 0x9AB1, 0xC2A7, 0x9AB2, 0xC2A9, + 0x9AB3, 0xC2AA, 0x9AB4, 0xC2AB, 0x9AB5, 0xC2AE, 0x9AB6, 0xC2AF, + 0x9AB7, 0xC2B0, 0x9AB8, 0xC2B1, 0x9AB9, 0xC2B2, 0x9ABA, 0xC2B3, + 0x9ABB, 0xC2B6, 0x9ABC, 0xC2B8, 0x9ABD, 0xC2BA, 0x9ABE, 0xC2BB, + 0x9ABF, 0xC2BC, 0x9AC0, 0xC2BD, 0x9AC1, 0xC2BE, 0x9AC2, 0xC2BF, + 0x9AC3, 0xC2C0, 0x9AC4, 0xC2C1, 0x9AC5, 0xC2C2, 0x9AC6, 0xC2C3, + 0x9AC7, 0xC2C4, 0x9AC8, 0xC2C5, 0x9AC9, 0xC2C6, 0x9ACA, 0xC2C7, + 0x9ACB, 0xC2C8, 0x9ACC, 0xC2C9, 0x9ACD, 0xC2CA, 0x9ACE, 0xC2CB, + 0x9ACF, 0xC2CC, 0x9AD0, 0xC2CD, 0x9AD1, 0xC2CE, 0x9AD2, 0xC2CF, + 0x9AD3, 0xC2D0, 0x9AD4, 0xC2D1, 0x9AD5, 0xC2D2, 0x9AD6, 0xC2D3, + 0x9AD7, 0xC2D4, 0x9AD8, 0xC2D5, 0x9AD9, 0xC2D6, 0x9ADA, 0xC2D7, + 0x9ADB, 0xC2D8, 0x9ADC, 0xC2D9, 0x9ADD, 0xC2DA, 0x9ADE, 0xC2DB, + 0x9ADF, 0xC2DE, 0x9AE0, 0xC2DF, 0x9AE1, 0xC2E1, 0x9AE2, 0xC2E2, + 0x9AE3, 0xC2E5, 0x9AE4, 0xC2E6, 0x9AE5, 0xC2E7, 0x9AE6, 0xC2E8, + 0x9AE7, 0xC2E9, 0x9AE8, 0xC2EA, 0x9AE9, 0xC2EE, 0x9AEA, 0xC2F0, + 0x9AEB, 0xC2F2, 0x9AEC, 0xC2F3, 0x9AED, 0xC2F4, 0x9AEE, 0xC2F5, + 0x9AEF, 0xC2F7, 0x9AF0, 0xC2FA, 0x9AF1, 0xC2FD, 0x9AF2, 0xC2FE, + 0x9AF3, 0xC2FF, 0x9AF4, 0xC301, 0x9AF5, 0xC302, 0x9AF6, 0xC303, + 0x9AF7, 0xC304, 0x9AF8, 0xC305, 0x9AF9, 0xC306, 0x9AFA, 0xC307, + 0x9AFB, 0xC30A, 0x9AFC, 0xC30B, 0x9AFD, 0xC30E, 0x9AFE, 0xC30F, + 0x9B41, 0xC310, 0x9B42, 0xC311, 0x9B43, 0xC312, 0x9B44, 0xC316, + 0x9B45, 0xC317, 0x9B46, 0xC319, 0x9B47, 0xC31A, 0x9B48, 0xC31B, + 0x9B49, 0xC31D, 0x9B4A, 0xC31E, 0x9B4B, 0xC31F, 0x9B4C, 0xC320, + 0x9B4D, 0xC321, 0x9B4E, 0xC322, 0x9B4F, 0xC323, 0x9B50, 0xC326, + 0x9B51, 0xC327, 0x9B52, 0xC32A, 0x9B53, 0xC32B, 0x9B54, 0xC32C, + 0x9B55, 0xC32D, 0x9B56, 0xC32E, 0x9B57, 0xC32F, 0x9B58, 0xC330, + 0x9B59, 0xC331, 0x9B5A, 0xC332, 0x9B61, 0xC333, 0x9B62, 0xC334, + 0x9B63, 0xC335, 0x9B64, 0xC336, 0x9B65, 0xC337, 0x9B66, 0xC338, + 0x9B67, 0xC339, 0x9B68, 0xC33A, 0x9B69, 0xC33B, 0x9B6A, 0xC33C, + 0x9B6B, 0xC33D, 0x9B6C, 0xC33E, 0x9B6D, 0xC33F, 0x9B6E, 0xC340, + 0x9B6F, 0xC341, 0x9B70, 0xC342, 0x9B71, 0xC343, 0x9B72, 0xC344, + 0x9B73, 0xC346, 0x9B74, 0xC347, 0x9B75, 0xC348, 0x9B76, 0xC349, + 0x9B77, 0xC34A, 0x9B78, 0xC34B, 0x9B79, 0xC34C, 0x9B7A, 0xC34D, + 0x9B81, 0xC34E, 0x9B82, 0xC34F, 0x9B83, 0xC350, 0x9B84, 0xC351, + 0x9B85, 0xC352, 0x9B86, 0xC353, 0x9B87, 0xC354, 0x9B88, 0xC355, + 0x9B89, 0xC356, 0x9B8A, 0xC357, 0x9B8B, 0xC358, 0x9B8C, 0xC359, + 0x9B8D, 0xC35A, 0x9B8E, 0xC35B, 0x9B8F, 0xC35C, 0x9B90, 0xC35D, + 0x9B91, 0xC35E, 0x9B92, 0xC35F, 0x9B93, 0xC360, 0x9B94, 0xC361, + 0x9B95, 0xC362, 0x9B96, 0xC363, 0x9B97, 0xC364, 0x9B98, 0xC365, + 0x9B99, 0xC366, 0x9B9A, 0xC367, 0x9B9B, 0xC36A, 0x9B9C, 0xC36B, + 0x9B9D, 0xC36D, 0x9B9E, 0xC36E, 0x9B9F, 0xC36F, 0x9BA0, 0xC371, + 0x9BA1, 0xC373, 0x9BA2, 0xC374, 0x9BA3, 0xC375, 0x9BA4, 0xC376, + 0x9BA5, 0xC377, 0x9BA6, 0xC37A, 0x9BA7, 0xC37B, 0x9BA8, 0xC37E, + 0x9BA9, 0xC37F, 0x9BAA, 0xC380, 0x9BAB, 0xC381, 0x9BAC, 0xC382, + 0x9BAD, 0xC383, 0x9BAE, 0xC385, 0x9BAF, 0xC386, 0x9BB0, 0xC387, + 0x9BB1, 0xC389, 0x9BB2, 0xC38A, 0x9BB3, 0xC38B, 0x9BB4, 0xC38D, + 0x9BB5, 0xC38E, 0x9BB6, 0xC38F, 0x9BB7, 0xC390, 0x9BB8, 0xC391, + 0x9BB9, 0xC392, 0x9BBA, 0xC393, 0x9BBB, 0xC394, 0x9BBC, 0xC395, + 0x9BBD, 0xC396, 0x9BBE, 0xC397, 0x9BBF, 0xC398, 0x9BC0, 0xC399, + 0x9BC1, 0xC39A, 0x9BC2, 0xC39B, 0x9BC3, 0xC39C, 0x9BC4, 0xC39D, + 0x9BC5, 0xC39E, 0x9BC6, 0xC39F, 0x9BC7, 0xC3A0, 0x9BC8, 0xC3A1, + 0x9BC9, 0xC3A2, 0x9BCA, 0xC3A3, 0x9BCB, 0xC3A4, 0x9BCC, 0xC3A5, + 0x9BCD, 0xC3A6, 0x9BCE, 0xC3A7, 0x9BCF, 0xC3A8, 0x9BD0, 0xC3A9, + 0x9BD1, 0xC3AA, 0x9BD2, 0xC3AB, 0x9BD3, 0xC3AC, 0x9BD4, 0xC3AD, + 0x9BD5, 0xC3AE, 0x9BD6, 0xC3AF, 0x9BD7, 0xC3B0, 0x9BD8, 0xC3B1, + 0x9BD9, 0xC3B2, 0x9BDA, 0xC3B3, 0x9BDB, 0xC3B4, 0x9BDC, 0xC3B5, + 0x9BDD, 0xC3B6, 0x9BDE, 0xC3B7, 0x9BDF, 0xC3B8, 0x9BE0, 0xC3B9, + 0x9BE1, 0xC3BA, 0x9BE2, 0xC3BB, 0x9BE3, 0xC3BC, 0x9BE4, 0xC3BD, + 0x9BE5, 0xC3BE, 0x9BE6, 0xC3BF, 0x9BE7, 0xC3C1, 0x9BE8, 0xC3C2, + 0x9BE9, 0xC3C3, 0x9BEA, 0xC3C4, 0x9BEB, 0xC3C5, 0x9BEC, 0xC3C6, + 0x9BED, 0xC3C7, 0x9BEE, 0xC3C8, 0x9BEF, 0xC3C9, 0x9BF0, 0xC3CA, + 0x9BF1, 0xC3CB, 0x9BF2, 0xC3CC, 0x9BF3, 0xC3CD, 0x9BF4, 0xC3CE, + 0x9BF5, 0xC3CF, 0x9BF6, 0xC3D0, 0x9BF7, 0xC3D1, 0x9BF8, 0xC3D2, + 0x9BF9, 0xC3D3, 0x9BFA, 0xC3D4, 0x9BFB, 0xC3D5, 0x9BFC, 0xC3D6, + 0x9BFD, 0xC3D7, 0x9BFE, 0xC3DA, 0x9C41, 0xC3DB, 0x9C42, 0xC3DD, + 0x9C43, 0xC3DE, 0x9C44, 0xC3E1, 0x9C45, 0xC3E3, 0x9C46, 0xC3E4, + 0x9C47, 0xC3E5, 0x9C48, 0xC3E6, 0x9C49, 0xC3E7, 0x9C4A, 0xC3EA, + 0x9C4B, 0xC3EB, 0x9C4C, 0xC3EC, 0x9C4D, 0xC3EE, 0x9C4E, 0xC3EF, + 0x9C4F, 0xC3F0, 0x9C50, 0xC3F1, 0x9C51, 0xC3F2, 0x9C52, 0xC3F3, + 0x9C53, 0xC3F6, 0x9C54, 0xC3F7, 0x9C55, 0xC3F9, 0x9C56, 0xC3FA, + 0x9C57, 0xC3FB, 0x9C58, 0xC3FC, 0x9C59, 0xC3FD, 0x9C5A, 0xC3FE, + 0x9C61, 0xC3FF, 0x9C62, 0xC400, 0x9C63, 0xC401, 0x9C64, 0xC402, + 0x9C65, 0xC403, 0x9C66, 0xC404, 0x9C67, 0xC405, 0x9C68, 0xC406, + 0x9C69, 0xC407, 0x9C6A, 0xC409, 0x9C6B, 0xC40A, 0x9C6C, 0xC40B, + 0x9C6D, 0xC40C, 0x9C6E, 0xC40D, 0x9C6F, 0xC40E, 0x9C70, 0xC40F, + 0x9C71, 0xC411, 0x9C72, 0xC412, 0x9C73, 0xC413, 0x9C74, 0xC414, + 0x9C75, 0xC415, 0x9C76, 0xC416, 0x9C77, 0xC417, 0x9C78, 0xC418, + 0x9C79, 0xC419, 0x9C7A, 0xC41A, 0x9C81, 0xC41B, 0x9C82, 0xC41C, + 0x9C83, 0xC41D, 0x9C84, 0xC41E, 0x9C85, 0xC41F, 0x9C86, 0xC420, + 0x9C87, 0xC421, 0x9C88, 0xC422, 0x9C89, 0xC423, 0x9C8A, 0xC425, + 0x9C8B, 0xC426, 0x9C8C, 0xC427, 0x9C8D, 0xC428, 0x9C8E, 0xC429, + 0x9C8F, 0xC42A, 0x9C90, 0xC42B, 0x9C91, 0xC42D, 0x9C92, 0xC42E, + 0x9C93, 0xC42F, 0x9C94, 0xC431, 0x9C95, 0xC432, 0x9C96, 0xC433, + 0x9C97, 0xC435, 0x9C98, 0xC436, 0x9C99, 0xC437, 0x9C9A, 0xC438, + 0x9C9B, 0xC439, 0x9C9C, 0xC43A, 0x9C9D, 0xC43B, 0x9C9E, 0xC43E, + 0x9C9F, 0xC43F, 0x9CA0, 0xC440, 0x9CA1, 0xC441, 0x9CA2, 0xC442, + 0x9CA3, 0xC443, 0x9CA4, 0xC444, 0x9CA5, 0xC445, 0x9CA6, 0xC446, + 0x9CA7, 0xC447, 0x9CA8, 0xC449, 0x9CA9, 0xC44A, 0x9CAA, 0xC44B, + 0x9CAB, 0xC44C, 0x9CAC, 0xC44D, 0x9CAD, 0xC44E, 0x9CAE, 0xC44F, + 0x9CAF, 0xC450, 0x9CB0, 0xC451, 0x9CB1, 0xC452, 0x9CB2, 0xC453, + 0x9CB3, 0xC454, 0x9CB4, 0xC455, 0x9CB5, 0xC456, 0x9CB6, 0xC457, + 0x9CB7, 0xC458, 0x9CB8, 0xC459, 0x9CB9, 0xC45A, 0x9CBA, 0xC45B, + 0x9CBB, 0xC45C, 0x9CBC, 0xC45D, 0x9CBD, 0xC45E, 0x9CBE, 0xC45F, + 0x9CBF, 0xC460, 0x9CC0, 0xC461, 0x9CC1, 0xC462, 0x9CC2, 0xC463, + 0x9CC3, 0xC466, 0x9CC4, 0xC467, 0x9CC5, 0xC469, 0x9CC6, 0xC46A, + 0x9CC7, 0xC46B, 0x9CC8, 0xC46D, 0x9CC9, 0xC46E, 0x9CCA, 0xC46F, + 0x9CCB, 0xC470, 0x9CCC, 0xC471, 0x9CCD, 0xC472, 0x9CCE, 0xC473, + 0x9CCF, 0xC476, 0x9CD0, 0xC477, 0x9CD1, 0xC478, 0x9CD2, 0xC47A, + 0x9CD3, 0xC47B, 0x9CD4, 0xC47C, 0x9CD5, 0xC47D, 0x9CD6, 0xC47E, + 0x9CD7, 0xC47F, 0x9CD8, 0xC481, 0x9CD9, 0xC482, 0x9CDA, 0xC483, + 0x9CDB, 0xC484, 0x9CDC, 0xC485, 0x9CDD, 0xC486, 0x9CDE, 0xC487, + 0x9CDF, 0xC488, 0x9CE0, 0xC489, 0x9CE1, 0xC48A, 0x9CE2, 0xC48B, + 0x9CE3, 0xC48C, 0x9CE4, 0xC48D, 0x9CE5, 0xC48E, 0x9CE6, 0xC48F, + 0x9CE7, 0xC490, 0x9CE8, 0xC491, 0x9CE9, 0xC492, 0x9CEA, 0xC493, + 0x9CEB, 0xC495, 0x9CEC, 0xC496, 0x9CED, 0xC497, 0x9CEE, 0xC498, + 0x9CEF, 0xC499, 0x9CF0, 0xC49A, 0x9CF1, 0xC49B, 0x9CF2, 0xC49D, + 0x9CF3, 0xC49E, 0x9CF4, 0xC49F, 0x9CF5, 0xC4A0, 0x9CF6, 0xC4A1, + 0x9CF7, 0xC4A2, 0x9CF8, 0xC4A3, 0x9CF9, 0xC4A4, 0x9CFA, 0xC4A5, + 0x9CFB, 0xC4A6, 0x9CFC, 0xC4A7, 0x9CFD, 0xC4A8, 0x9CFE, 0xC4A9, + 0x9D41, 0xC4AA, 0x9D42, 0xC4AB, 0x9D43, 0xC4AC, 0x9D44, 0xC4AD, + 0x9D45, 0xC4AE, 0x9D46, 0xC4AF, 0x9D47, 0xC4B0, 0x9D48, 0xC4B1, + 0x9D49, 0xC4B2, 0x9D4A, 0xC4B3, 0x9D4B, 0xC4B4, 0x9D4C, 0xC4B5, + 0x9D4D, 0xC4B6, 0x9D4E, 0xC4B7, 0x9D4F, 0xC4B9, 0x9D50, 0xC4BA, + 0x9D51, 0xC4BB, 0x9D52, 0xC4BD, 0x9D53, 0xC4BE, 0x9D54, 0xC4BF, + 0x9D55, 0xC4C0, 0x9D56, 0xC4C1, 0x9D57, 0xC4C2, 0x9D58, 0xC4C3, + 0x9D59, 0xC4C4, 0x9D5A, 0xC4C5, 0x9D61, 0xC4C6, 0x9D62, 0xC4C7, + 0x9D63, 0xC4C8, 0x9D64, 0xC4C9, 0x9D65, 0xC4CA, 0x9D66, 0xC4CB, + 0x9D67, 0xC4CC, 0x9D68, 0xC4CD, 0x9D69, 0xC4CE, 0x9D6A, 0xC4CF, + 0x9D6B, 0xC4D0, 0x9D6C, 0xC4D1, 0x9D6D, 0xC4D2, 0x9D6E, 0xC4D3, + 0x9D6F, 0xC4D4, 0x9D70, 0xC4D5, 0x9D71, 0xC4D6, 0x9D72, 0xC4D7, + 0x9D73, 0xC4D8, 0x9D74, 0xC4D9, 0x9D75, 0xC4DA, 0x9D76, 0xC4DB, + 0x9D77, 0xC4DC, 0x9D78, 0xC4DD, 0x9D79, 0xC4DE, 0x9D7A, 0xC4DF, + 0x9D81, 0xC4E0, 0x9D82, 0xC4E1, 0x9D83, 0xC4E2, 0x9D84, 0xC4E3, + 0x9D85, 0xC4E4, 0x9D86, 0xC4E5, 0x9D87, 0xC4E6, 0x9D88, 0xC4E7, + 0x9D89, 0xC4E8, 0x9D8A, 0xC4EA, 0x9D8B, 0xC4EB, 0x9D8C, 0xC4EC, + 0x9D8D, 0xC4ED, 0x9D8E, 0xC4EE, 0x9D8F, 0xC4EF, 0x9D90, 0xC4F2, + 0x9D91, 0xC4F3, 0x9D92, 0xC4F5, 0x9D93, 0xC4F6, 0x9D94, 0xC4F7, + 0x9D95, 0xC4F9, 0x9D96, 0xC4FB, 0x9D97, 0xC4FC, 0x9D98, 0xC4FD, + 0x9D99, 0xC4FE, 0x9D9A, 0xC502, 0x9D9B, 0xC503, 0x9D9C, 0xC504, + 0x9D9D, 0xC505, 0x9D9E, 0xC506, 0x9D9F, 0xC507, 0x9DA0, 0xC508, + 0x9DA1, 0xC509, 0x9DA2, 0xC50A, 0x9DA3, 0xC50B, 0x9DA4, 0xC50D, + 0x9DA5, 0xC50E, 0x9DA6, 0xC50F, 0x9DA7, 0xC511, 0x9DA8, 0xC512, + 0x9DA9, 0xC513, 0x9DAA, 0xC515, 0x9DAB, 0xC516, 0x9DAC, 0xC517, + 0x9DAD, 0xC518, 0x9DAE, 0xC519, 0x9DAF, 0xC51A, 0x9DB0, 0xC51B, + 0x9DB1, 0xC51D, 0x9DB2, 0xC51E, 0x9DB3, 0xC51F, 0x9DB4, 0xC520, + 0x9DB5, 0xC521, 0x9DB6, 0xC522, 0x9DB7, 0xC523, 0x9DB8, 0xC524, + 0x9DB9, 0xC525, 0x9DBA, 0xC526, 0x9DBB, 0xC527, 0x9DBC, 0xC52A, + 0x9DBD, 0xC52B, 0x9DBE, 0xC52D, 0x9DBF, 0xC52E, 0x9DC0, 0xC52F, + 0x9DC1, 0xC531, 0x9DC2, 0xC532, 0x9DC3, 0xC533, 0x9DC4, 0xC534, + 0x9DC5, 0xC535, 0x9DC6, 0xC536, 0x9DC7, 0xC537, 0x9DC8, 0xC53A, + 0x9DC9, 0xC53C, 0x9DCA, 0xC53E, 0x9DCB, 0xC53F, 0x9DCC, 0xC540, + 0x9DCD, 0xC541, 0x9DCE, 0xC542, 0x9DCF, 0xC543, 0x9DD0, 0xC546, + 0x9DD1, 0xC547, 0x9DD2, 0xC54B, 0x9DD3, 0xC54F, 0x9DD4, 0xC550, + 0x9DD5, 0xC551, 0x9DD6, 0xC552, 0x9DD7, 0xC556, 0x9DD8, 0xC55A, + 0x9DD9, 0xC55B, 0x9DDA, 0xC55C, 0x9DDB, 0xC55F, 0x9DDC, 0xC562, + 0x9DDD, 0xC563, 0x9DDE, 0xC565, 0x9DDF, 0xC566, 0x9DE0, 0xC567, + 0x9DE1, 0xC569, 0x9DE2, 0xC56A, 0x9DE3, 0xC56B, 0x9DE4, 0xC56C, + 0x9DE5, 0xC56D, 0x9DE6, 0xC56E, 0x9DE7, 0xC56F, 0x9DE8, 0xC572, + 0x9DE9, 0xC576, 0x9DEA, 0xC577, 0x9DEB, 0xC578, 0x9DEC, 0xC579, + 0x9DED, 0xC57A, 0x9DEE, 0xC57B, 0x9DEF, 0xC57E, 0x9DF0, 0xC57F, + 0x9DF1, 0xC581, 0x9DF2, 0xC582, 0x9DF3, 0xC583, 0x9DF4, 0xC585, + 0x9DF5, 0xC586, 0x9DF6, 0xC588, 0x9DF7, 0xC589, 0x9DF8, 0xC58A, + 0x9DF9, 0xC58B, 0x9DFA, 0xC58E, 0x9DFB, 0xC590, 0x9DFC, 0xC592, + 0x9DFD, 0xC593, 0x9DFE, 0xC594, 0x9E41, 0xC596, 0x9E42, 0xC599, + 0x9E43, 0xC59A, 0x9E44, 0xC59B, 0x9E45, 0xC59D, 0x9E46, 0xC59E, + 0x9E47, 0xC59F, 0x9E48, 0xC5A1, 0x9E49, 0xC5A2, 0x9E4A, 0xC5A3, + 0x9E4B, 0xC5A4, 0x9E4C, 0xC5A5, 0x9E4D, 0xC5A6, 0x9E4E, 0xC5A7, + 0x9E4F, 0xC5A8, 0x9E50, 0xC5AA, 0x9E51, 0xC5AB, 0x9E52, 0xC5AC, + 0x9E53, 0xC5AD, 0x9E54, 0xC5AE, 0x9E55, 0xC5AF, 0x9E56, 0xC5B0, + 0x9E57, 0xC5B1, 0x9E58, 0xC5B2, 0x9E59, 0xC5B3, 0x9E5A, 0xC5B6, + 0x9E61, 0xC5B7, 0x9E62, 0xC5BA, 0x9E63, 0xC5BF, 0x9E64, 0xC5C0, + 0x9E65, 0xC5C1, 0x9E66, 0xC5C2, 0x9E67, 0xC5C3, 0x9E68, 0xC5CB, + 0x9E69, 0xC5CD, 0x9E6A, 0xC5CF, 0x9E6B, 0xC5D2, 0x9E6C, 0xC5D3, + 0x9E6D, 0xC5D5, 0x9E6E, 0xC5D6, 0x9E6F, 0xC5D7, 0x9E70, 0xC5D9, + 0x9E71, 0xC5DA, 0x9E72, 0xC5DB, 0x9E73, 0xC5DC, 0x9E74, 0xC5DD, + 0x9E75, 0xC5DE, 0x9E76, 0xC5DF, 0x9E77, 0xC5E2, 0x9E78, 0xC5E4, + 0x9E79, 0xC5E6, 0x9E7A, 0xC5E7, 0x9E81, 0xC5E8, 0x9E82, 0xC5E9, + 0x9E83, 0xC5EA, 0x9E84, 0xC5EB, 0x9E85, 0xC5EF, 0x9E86, 0xC5F1, + 0x9E87, 0xC5F2, 0x9E88, 0xC5F3, 0x9E89, 0xC5F5, 0x9E8A, 0xC5F8, + 0x9E8B, 0xC5F9, 0x9E8C, 0xC5FA, 0x9E8D, 0xC5FB, 0x9E8E, 0xC602, + 0x9E8F, 0xC603, 0x9E90, 0xC604, 0x9E91, 0xC609, 0x9E92, 0xC60A, + 0x9E93, 0xC60B, 0x9E94, 0xC60D, 0x9E95, 0xC60E, 0x9E96, 0xC60F, + 0x9E97, 0xC611, 0x9E98, 0xC612, 0x9E99, 0xC613, 0x9E9A, 0xC614, + 0x9E9B, 0xC615, 0x9E9C, 0xC616, 0x9E9D, 0xC617, 0x9E9E, 0xC61A, + 0x9E9F, 0xC61D, 0x9EA0, 0xC61E, 0x9EA1, 0xC61F, 0x9EA2, 0xC620, + 0x9EA3, 0xC621, 0x9EA4, 0xC622, 0x9EA5, 0xC623, 0x9EA6, 0xC626, + 0x9EA7, 0xC627, 0x9EA8, 0xC629, 0x9EA9, 0xC62A, 0x9EAA, 0xC62B, + 0x9EAB, 0xC62F, 0x9EAC, 0xC631, 0x9EAD, 0xC632, 0x9EAE, 0xC636, + 0x9EAF, 0xC638, 0x9EB0, 0xC63A, 0x9EB1, 0xC63C, 0x9EB2, 0xC63D, + 0x9EB3, 0xC63E, 0x9EB4, 0xC63F, 0x9EB5, 0xC642, 0x9EB6, 0xC643, + 0x9EB7, 0xC645, 0x9EB8, 0xC646, 0x9EB9, 0xC647, 0x9EBA, 0xC649, + 0x9EBB, 0xC64A, 0x9EBC, 0xC64B, 0x9EBD, 0xC64C, 0x9EBE, 0xC64D, + 0x9EBF, 0xC64E, 0x9EC0, 0xC64F, 0x9EC1, 0xC652, 0x9EC2, 0xC656, + 0x9EC3, 0xC657, 0x9EC4, 0xC658, 0x9EC5, 0xC659, 0x9EC6, 0xC65A, + 0x9EC7, 0xC65B, 0x9EC8, 0xC65E, 0x9EC9, 0xC65F, 0x9ECA, 0xC661, + 0x9ECB, 0xC662, 0x9ECC, 0xC663, 0x9ECD, 0xC664, 0x9ECE, 0xC665, + 0x9ECF, 0xC666, 0x9ED0, 0xC667, 0x9ED1, 0xC668, 0x9ED2, 0xC669, + 0x9ED3, 0xC66A, 0x9ED4, 0xC66B, 0x9ED5, 0xC66D, 0x9ED6, 0xC66E, + 0x9ED7, 0xC670, 0x9ED8, 0xC672, 0x9ED9, 0xC673, 0x9EDA, 0xC674, + 0x9EDB, 0xC675, 0x9EDC, 0xC676, 0x9EDD, 0xC677, 0x9EDE, 0xC67A, + 0x9EDF, 0xC67B, 0x9EE0, 0xC67D, 0x9EE1, 0xC67E, 0x9EE2, 0xC67F, + 0x9EE3, 0xC681, 0x9EE4, 0xC682, 0x9EE5, 0xC683, 0x9EE6, 0xC684, + 0x9EE7, 0xC685, 0x9EE8, 0xC686, 0x9EE9, 0xC687, 0x9EEA, 0xC68A, + 0x9EEB, 0xC68C, 0x9EEC, 0xC68E, 0x9EED, 0xC68F, 0x9EEE, 0xC690, + 0x9EEF, 0xC691, 0x9EF0, 0xC692, 0x9EF1, 0xC693, 0x9EF2, 0xC696, + 0x9EF3, 0xC697, 0x9EF4, 0xC699, 0x9EF5, 0xC69A, 0x9EF6, 0xC69B, + 0x9EF7, 0xC69D, 0x9EF8, 0xC69E, 0x9EF9, 0xC69F, 0x9EFA, 0xC6A0, + 0x9EFB, 0xC6A1, 0x9EFC, 0xC6A2, 0x9EFD, 0xC6A3, 0x9EFE, 0xC6A6, + 0x9F41, 0xC6A8, 0x9F42, 0xC6AA, 0x9F43, 0xC6AB, 0x9F44, 0xC6AC, + 0x9F45, 0xC6AD, 0x9F46, 0xC6AE, 0x9F47, 0xC6AF, 0x9F48, 0xC6B2, + 0x9F49, 0xC6B3, 0x9F4A, 0xC6B5, 0x9F4B, 0xC6B6, 0x9F4C, 0xC6B7, + 0x9F4D, 0xC6BB, 0x9F4E, 0xC6BC, 0x9F4F, 0xC6BD, 0x9F50, 0xC6BE, + 0x9F51, 0xC6BF, 0x9F52, 0xC6C2, 0x9F53, 0xC6C4, 0x9F54, 0xC6C6, + 0x9F55, 0xC6C7, 0x9F56, 0xC6C8, 0x9F57, 0xC6C9, 0x9F58, 0xC6CA, + 0x9F59, 0xC6CB, 0x9F5A, 0xC6CE, 0x9F61, 0xC6CF, 0x9F62, 0xC6D1, + 0x9F63, 0xC6D2, 0x9F64, 0xC6D3, 0x9F65, 0xC6D5, 0x9F66, 0xC6D6, + 0x9F67, 0xC6D7, 0x9F68, 0xC6D8, 0x9F69, 0xC6D9, 0x9F6A, 0xC6DA, + 0x9F6B, 0xC6DB, 0x9F6C, 0xC6DE, 0x9F6D, 0xC6DF, 0x9F6E, 0xC6E2, + 0x9F6F, 0xC6E3, 0x9F70, 0xC6E4, 0x9F71, 0xC6E5, 0x9F72, 0xC6E6, + 0x9F73, 0xC6E7, 0x9F74, 0xC6EA, 0x9F75, 0xC6EB, 0x9F76, 0xC6ED, + 0x9F77, 0xC6EE, 0x9F78, 0xC6EF, 0x9F79, 0xC6F1, 0x9F7A, 0xC6F2, + 0x9F81, 0xC6F3, 0x9F82, 0xC6F4, 0x9F83, 0xC6F5, 0x9F84, 0xC6F6, + 0x9F85, 0xC6F7, 0x9F86, 0xC6FA, 0x9F87, 0xC6FB, 0x9F88, 0xC6FC, + 0x9F89, 0xC6FE, 0x9F8A, 0xC6FF, 0x9F8B, 0xC700, 0x9F8C, 0xC701, + 0x9F8D, 0xC702, 0x9F8E, 0xC703, 0x9F8F, 0xC706, 0x9F90, 0xC707, + 0x9F91, 0xC709, 0x9F92, 0xC70A, 0x9F93, 0xC70B, 0x9F94, 0xC70D, + 0x9F95, 0xC70E, 0x9F96, 0xC70F, 0x9F97, 0xC710, 0x9F98, 0xC711, + 0x9F99, 0xC712, 0x9F9A, 0xC713, 0x9F9B, 0xC716, 0x9F9C, 0xC718, + 0x9F9D, 0xC71A, 0x9F9E, 0xC71B, 0x9F9F, 0xC71C, 0x9FA0, 0xC71D, + 0x9FA1, 0xC71E, 0x9FA2, 0xC71F, 0x9FA3, 0xC722, 0x9FA4, 0xC723, + 0x9FA5, 0xC725, 0x9FA6, 0xC726, 0x9FA7, 0xC727, 0x9FA8, 0xC729, + 0x9FA9, 0xC72A, 0x9FAA, 0xC72B, 0x9FAB, 0xC72C, 0x9FAC, 0xC72D, + 0x9FAD, 0xC72E, 0x9FAE, 0xC72F, 0x9FAF, 0xC732, 0x9FB0, 0xC734, + 0x9FB1, 0xC736, 0x9FB2, 0xC738, 0x9FB3, 0xC739, 0x9FB4, 0xC73A, + 0x9FB5, 0xC73B, 0x9FB6, 0xC73E, 0x9FB7, 0xC73F, 0x9FB8, 0xC741, + 0x9FB9, 0xC742, 0x9FBA, 0xC743, 0x9FBB, 0xC745, 0x9FBC, 0xC746, + 0x9FBD, 0xC747, 0x9FBE, 0xC748, 0x9FBF, 0xC749, 0x9FC0, 0xC74B, + 0x9FC1, 0xC74E, 0x9FC2, 0xC750, 0x9FC3, 0xC759, 0x9FC4, 0xC75A, + 0x9FC5, 0xC75B, 0x9FC6, 0xC75D, 0x9FC7, 0xC75E, 0x9FC8, 0xC75F, + 0x9FC9, 0xC761, 0x9FCA, 0xC762, 0x9FCB, 0xC763, 0x9FCC, 0xC764, + 0x9FCD, 0xC765, 0x9FCE, 0xC766, 0x9FCF, 0xC767, 0x9FD0, 0xC769, + 0x9FD1, 0xC76A, 0x9FD2, 0xC76C, 0x9FD3, 0xC76D, 0x9FD4, 0xC76E, + 0x9FD5, 0xC76F, 0x9FD6, 0xC770, 0x9FD7, 0xC771, 0x9FD8, 0xC772, + 0x9FD9, 0xC773, 0x9FDA, 0xC776, 0x9FDB, 0xC777, 0x9FDC, 0xC779, + 0x9FDD, 0xC77A, 0x9FDE, 0xC77B, 0x9FDF, 0xC77F, 0x9FE0, 0xC780, + 0x9FE1, 0xC781, 0x9FE2, 0xC782, 0x9FE3, 0xC786, 0x9FE4, 0xC78B, + 0x9FE5, 0xC78C, 0x9FE6, 0xC78D, 0x9FE7, 0xC78F, 0x9FE8, 0xC792, + 0x9FE9, 0xC793, 0x9FEA, 0xC795, 0x9FEB, 0xC799, 0x9FEC, 0xC79B, + 0x9FED, 0xC79C, 0x9FEE, 0xC79D, 0x9FEF, 0xC79E, 0x9FF0, 0xC79F, + 0x9FF1, 0xC7A2, 0x9FF2, 0xC7A7, 0x9FF3, 0xC7A8, 0x9FF4, 0xC7A9, + 0x9FF5, 0xC7AA, 0x9FF6, 0xC7AB, 0x9FF7, 0xC7AE, 0x9FF8, 0xC7AF, + 0x9FF9, 0xC7B1, 0x9FFA, 0xC7B2, 0x9FFB, 0xC7B3, 0x9FFC, 0xC7B5, + 0x9FFD, 0xC7B6, 0x9FFE, 0xC7B7, 0xA041, 0xC7B8, 0xA042, 0xC7B9, + 0xA043, 0xC7BA, 0xA044, 0xC7BB, 0xA045, 0xC7BE, 0xA046, 0xC7C2, + 0xA047, 0xC7C3, 0xA048, 0xC7C4, 0xA049, 0xC7C5, 0xA04A, 0xC7C6, + 0xA04B, 0xC7C7, 0xA04C, 0xC7CA, 0xA04D, 0xC7CB, 0xA04E, 0xC7CD, + 0xA04F, 0xC7CF, 0xA050, 0xC7D1, 0xA051, 0xC7D2, 0xA052, 0xC7D3, + 0xA053, 0xC7D4, 0xA054, 0xC7D5, 0xA055, 0xC7D6, 0xA056, 0xC7D7, + 0xA057, 0xC7D9, 0xA058, 0xC7DA, 0xA059, 0xC7DB, 0xA05A, 0xC7DC, + 0xA061, 0xC7DE, 0xA062, 0xC7DF, 0xA063, 0xC7E0, 0xA064, 0xC7E1, + 0xA065, 0xC7E2, 0xA066, 0xC7E3, 0xA067, 0xC7E5, 0xA068, 0xC7E6, + 0xA069, 0xC7E7, 0xA06A, 0xC7E9, 0xA06B, 0xC7EA, 0xA06C, 0xC7EB, + 0xA06D, 0xC7ED, 0xA06E, 0xC7EE, 0xA06F, 0xC7EF, 0xA070, 0xC7F0, + 0xA071, 0xC7F1, 0xA072, 0xC7F2, 0xA073, 0xC7F3, 0xA074, 0xC7F4, + 0xA075, 0xC7F5, 0xA076, 0xC7F6, 0xA077, 0xC7F7, 0xA078, 0xC7F8, + 0xA079, 0xC7F9, 0xA07A, 0xC7FA, 0xA081, 0xC7FB, 0xA082, 0xC7FC, + 0xA083, 0xC7FD, 0xA084, 0xC7FE, 0xA085, 0xC7FF, 0xA086, 0xC802, + 0xA087, 0xC803, 0xA088, 0xC805, 0xA089, 0xC806, 0xA08A, 0xC807, + 0xA08B, 0xC809, 0xA08C, 0xC80B, 0xA08D, 0xC80C, 0xA08E, 0xC80D, + 0xA08F, 0xC80E, 0xA090, 0xC80F, 0xA091, 0xC812, 0xA092, 0xC814, + 0xA093, 0xC817, 0xA094, 0xC818, 0xA095, 0xC819, 0xA096, 0xC81A, + 0xA097, 0xC81B, 0xA098, 0xC81E, 0xA099, 0xC81F, 0xA09A, 0xC821, + 0xA09B, 0xC822, 0xA09C, 0xC823, 0xA09D, 0xC825, 0xA09E, 0xC826, + 0xA09F, 0xC827, 0xA0A0, 0xC828, 0xA0A1, 0xC829, 0xA0A2, 0xC82A, + 0xA0A3, 0xC82B, 0xA0A4, 0xC82E, 0xA0A5, 0xC830, 0xA0A6, 0xC832, + 0xA0A7, 0xC833, 0xA0A8, 0xC834, 0xA0A9, 0xC835, 0xA0AA, 0xC836, + 0xA0AB, 0xC837, 0xA0AC, 0xC839, 0xA0AD, 0xC83A, 0xA0AE, 0xC83B, + 0xA0AF, 0xC83D, 0xA0B0, 0xC83E, 0xA0B1, 0xC83F, 0xA0B2, 0xC841, + 0xA0B3, 0xC842, 0xA0B4, 0xC843, 0xA0B5, 0xC844, 0xA0B6, 0xC845, + 0xA0B7, 0xC846, 0xA0B8, 0xC847, 0xA0B9, 0xC84A, 0xA0BA, 0xC84B, + 0xA0BB, 0xC84E, 0xA0BC, 0xC84F, 0xA0BD, 0xC850, 0xA0BE, 0xC851, + 0xA0BF, 0xC852, 0xA0C0, 0xC853, 0xA0C1, 0xC855, 0xA0C2, 0xC856, + 0xA0C3, 0xC857, 0xA0C4, 0xC858, 0xA0C5, 0xC859, 0xA0C6, 0xC85A, + 0xA0C7, 0xC85B, 0xA0C8, 0xC85C, 0xA0C9, 0xC85D, 0xA0CA, 0xC85E, + 0xA0CB, 0xC85F, 0xA0CC, 0xC860, 0xA0CD, 0xC861, 0xA0CE, 0xC862, + 0xA0CF, 0xC863, 0xA0D0, 0xC864, 0xA0D1, 0xC865, 0xA0D2, 0xC866, + 0xA0D3, 0xC867, 0xA0D4, 0xC868, 0xA0D5, 0xC869, 0xA0D6, 0xC86A, + 0xA0D7, 0xC86B, 0xA0D8, 0xC86C, 0xA0D9, 0xC86D, 0xA0DA, 0xC86E, + 0xA0DB, 0xC86F, 0xA0DC, 0xC872, 0xA0DD, 0xC873, 0xA0DE, 0xC875, + 0xA0DF, 0xC876, 0xA0E0, 0xC877, 0xA0E1, 0xC879, 0xA0E2, 0xC87B, + 0xA0E3, 0xC87C, 0xA0E4, 0xC87D, 0xA0E5, 0xC87E, 0xA0E6, 0xC87F, + 0xA0E7, 0xC882, 0xA0E8, 0xC884, 0xA0E9, 0xC888, 0xA0EA, 0xC889, + 0xA0EB, 0xC88A, 0xA0EC, 0xC88E, 0xA0ED, 0xC88F, 0xA0EE, 0xC890, + 0xA0EF, 0xC891, 0xA0F0, 0xC892, 0xA0F1, 0xC893, 0xA0F2, 0xC895, + 0xA0F3, 0xC896, 0xA0F4, 0xC897, 0xA0F5, 0xC898, 0xA0F6, 0xC899, + 0xA0F7, 0xC89A, 0xA0F8, 0xC89B, 0xA0F9, 0xC89C, 0xA0FA, 0xC89E, + 0xA0FB, 0xC8A0, 0xA0FC, 0xC8A2, 0xA0FD, 0xC8A3, 0xA0FE, 0xC8A4, + 0xA141, 0xC8A5, 0xA142, 0xC8A6, 0xA143, 0xC8A7, 0xA144, 0xC8A9, + 0xA145, 0xC8AA, 0xA146, 0xC8AB, 0xA147, 0xC8AC, 0xA148, 0xC8AD, + 0xA149, 0xC8AE, 0xA14A, 0xC8AF, 0xA14B, 0xC8B0, 0xA14C, 0xC8B1, + 0xA14D, 0xC8B2, 0xA14E, 0xC8B3, 0xA14F, 0xC8B4, 0xA150, 0xC8B5, + 0xA151, 0xC8B6, 0xA152, 0xC8B7, 0xA153, 0xC8B8, 0xA154, 0xC8B9, + 0xA155, 0xC8BA, 0xA156, 0xC8BB, 0xA157, 0xC8BE, 0xA158, 0xC8BF, + 0xA159, 0xC8C0, 0xA15A, 0xC8C1, 0xA161, 0xC8C2, 0xA162, 0xC8C3, + 0xA163, 0xC8C5, 0xA164, 0xC8C6, 0xA165, 0xC8C7, 0xA166, 0xC8C9, + 0xA167, 0xC8CA, 0xA168, 0xC8CB, 0xA169, 0xC8CD, 0xA16A, 0xC8CE, + 0xA16B, 0xC8CF, 0xA16C, 0xC8D0, 0xA16D, 0xC8D1, 0xA16E, 0xC8D2, + 0xA16F, 0xC8D3, 0xA170, 0xC8D6, 0xA171, 0xC8D8, 0xA172, 0xC8DA, + 0xA173, 0xC8DB, 0xA174, 0xC8DC, 0xA175, 0xC8DD, 0xA176, 0xC8DE, + 0xA177, 0xC8DF, 0xA178, 0xC8E2, 0xA179, 0xC8E3, 0xA17A, 0xC8E5, + 0xA181, 0xC8E6, 0xA182, 0xC8E7, 0xA183, 0xC8E8, 0xA184, 0xC8E9, + 0xA185, 0xC8EA, 0xA186, 0xC8EB, 0xA187, 0xC8EC, 0xA188, 0xC8ED, + 0xA189, 0xC8EE, 0xA18A, 0xC8EF, 0xA18B, 0xC8F0, 0xA18C, 0xC8F1, + 0xA18D, 0xC8F2, 0xA18E, 0xC8F3, 0xA18F, 0xC8F4, 0xA190, 0xC8F6, + 0xA191, 0xC8F7, 0xA192, 0xC8F8, 0xA193, 0xC8F9, 0xA194, 0xC8FA, + 0xA195, 0xC8FB, 0xA196, 0xC8FE, 0xA197, 0xC8FF, 0xA198, 0xC901, + 0xA199, 0xC902, 0xA19A, 0xC903, 0xA19B, 0xC907, 0xA19C, 0xC908, + 0xA19D, 0xC909, 0xA19E, 0xC90A, 0xA19F, 0xC90B, 0xA1A0, 0xC90E, + 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7, + 0xA1A5, 0x2025, 0xA1A6, 0x2026, 0xA1A7, 0x00A8, 0xA1A8, 0x3003, + 0xA1A9, 0x00AD, 0xA1AA, 0x2015, 0xA1AB, 0x2225, 0xA1AC, 0xFF3C, + 0xA1AD, 0x223C, 0xA1AE, 0x2018, 0xA1AF, 0x2019, 0xA1B0, 0x201C, + 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, + 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, 0xA1B8, 0x300C, + 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3010, + 0xA1BD, 0x3011, 0xA1BE, 0x00B1, 0xA1BF, 0x00D7, 0xA1C0, 0x00F7, + 0xA1C1, 0x2260, 0xA1C2, 0x2264, 0xA1C3, 0x2265, 0xA1C4, 0x221E, + 0xA1C5, 0x2234, 0xA1C6, 0x00B0, 0xA1C7, 0x2032, 0xA1C8, 0x2033, + 0xA1C9, 0x2103, 0xA1CA, 0x212B, 0xA1CB, 0xFFE0, 0xA1CC, 0xFFE1, + 0xA1CD, 0xFFE5, 0xA1CE, 0x2642, 0xA1CF, 0x2640, 0xA1D0, 0x2220, + 0xA1D1, 0x22A5, 0xA1D2, 0x2312, 0xA1D3, 0x2202, 0xA1D4, 0x2207, + 0xA1D5, 0x2261, 0xA1D6, 0x2252, 0xA1D7, 0x00A7, 0xA1D8, 0x203B, + 0xA1D9, 0x2606, 0xA1DA, 0x2605, 0xA1DB, 0x25CB, 0xA1DC, 0x25CF, + 0xA1DD, 0x25CE, 0xA1DE, 0x25C7, 0xA1DF, 0x25C6, 0xA1E0, 0x25A1, + 0xA1E1, 0x25A0, 0xA1E2, 0x25B3, 0xA1E3, 0x25B2, 0xA1E4, 0x25BD, + 0xA1E5, 0x25BC, 0xA1E6, 0x2192, 0xA1E7, 0x2190, 0xA1E8, 0x2191, + 0xA1E9, 0x2193, 0xA1EA, 0x2194, 0xA1EB, 0x3013, 0xA1EC, 0x226A, + 0xA1ED, 0x226B, 0xA1EE, 0x221A, 0xA1EF, 0x223D, 0xA1F0, 0x221D, + 0xA1F1, 0x2235, 0xA1F2, 0x222B, 0xA1F3, 0x222C, 0xA1F4, 0x2208, + 0xA1F5, 0x220B, 0xA1F6, 0x2286, 0xA1F7, 0x2287, 0xA1F8, 0x2282, + 0xA1F9, 0x2283, 0xA1FA, 0x222A, 0xA1FB, 0x2229, 0xA1FC, 0x2227, + 0xA1FD, 0x2228, 0xA1FE, 0xFFE2, 0xA241, 0xC910, 0xA242, 0xC912, + 0xA243, 0xC913, 0xA244, 0xC914, 0xA245, 0xC915, 0xA246, 0xC916, + 0xA247, 0xC917, 0xA248, 0xC919, 0xA249, 0xC91A, 0xA24A, 0xC91B, + 0xA24B, 0xC91C, 0xA24C, 0xC91D, 0xA24D, 0xC91E, 0xA24E, 0xC91F, + 0xA24F, 0xC920, 0xA250, 0xC921, 0xA251, 0xC922, 0xA252, 0xC923, + 0xA253, 0xC924, 0xA254, 0xC925, 0xA255, 0xC926, 0xA256, 0xC927, + 0xA257, 0xC928, 0xA258, 0xC929, 0xA259, 0xC92A, 0xA25A, 0xC92B, + 0xA261, 0xC92D, 0xA262, 0xC92E, 0xA263, 0xC92F, 0xA264, 0xC930, + 0xA265, 0xC931, 0xA266, 0xC932, 0xA267, 0xC933, 0xA268, 0xC935, + 0xA269, 0xC936, 0xA26A, 0xC937, 0xA26B, 0xC938, 0xA26C, 0xC939, + 0xA26D, 0xC93A, 0xA26E, 0xC93B, 0xA26F, 0xC93C, 0xA270, 0xC93D, + 0xA271, 0xC93E, 0xA272, 0xC93F, 0xA273, 0xC940, 0xA274, 0xC941, + 0xA275, 0xC942, 0xA276, 0xC943, 0xA277, 0xC944, 0xA278, 0xC945, + 0xA279, 0xC946, 0xA27A, 0xC947, 0xA281, 0xC948, 0xA282, 0xC949, + 0xA283, 0xC94A, 0xA284, 0xC94B, 0xA285, 0xC94C, 0xA286, 0xC94D, + 0xA287, 0xC94E, 0xA288, 0xC94F, 0xA289, 0xC952, 0xA28A, 0xC953, + 0xA28B, 0xC955, 0xA28C, 0xC956, 0xA28D, 0xC957, 0xA28E, 0xC959, + 0xA28F, 0xC95A, 0xA290, 0xC95B, 0xA291, 0xC95C, 0xA292, 0xC95D, + 0xA293, 0xC95E, 0xA294, 0xC95F, 0xA295, 0xC962, 0xA296, 0xC964, + 0xA297, 0xC965, 0xA298, 0xC966, 0xA299, 0xC967, 0xA29A, 0xC968, + 0xA29B, 0xC969, 0xA29C, 0xC96A, 0xA29D, 0xC96B, 0xA29E, 0xC96D, + 0xA29F, 0xC96E, 0xA2A0, 0xC96F, 0xA2A1, 0x21D2, 0xA2A2, 0x21D4, + 0xA2A3, 0x2200, 0xA2A4, 0x2203, 0xA2A5, 0x00B4, 0xA2A6, 0xFF5E, + 0xA2A7, 0x02C7, 0xA2A8, 0x02D8, 0xA2A9, 0x02DD, 0xA2AA, 0x02DA, + 0xA2AB, 0x02D9, 0xA2AC, 0x00B8, 0xA2AD, 0x02DB, 0xA2AE, 0x00A1, + 0xA2AF, 0x00BF, 0xA2B0, 0x02D0, 0xA2B1, 0x222E, 0xA2B2, 0x2211, + 0xA2B3, 0x220F, 0xA2B4, 0x00A4, 0xA2B5, 0x2109, 0xA2B6, 0x2030, + 0xA2B7, 0x25C1, 0xA2B8, 0x25C0, 0xA2B9, 0x25B7, 0xA2BA, 0x25B6, + 0xA2BB, 0x2664, 0xA2BC, 0x2660, 0xA2BD, 0x2661, 0xA2BE, 0x2665, + 0xA2BF, 0x2667, 0xA2C0, 0x2663, 0xA2C1, 0x2299, 0xA2C2, 0x25C8, + 0xA2C3, 0x25A3, 0xA2C4, 0x25D0, 0xA2C5, 0x25D1, 0xA2C6, 0x2592, + 0xA2C7, 0x25A4, 0xA2C8, 0x25A5, 0xA2C9, 0x25A8, 0xA2CA, 0x25A7, + 0xA2CB, 0x25A6, 0xA2CC, 0x25A9, 0xA2CD, 0x2668, 0xA2CE, 0x260F, + 0xA2CF, 0x260E, 0xA2D0, 0x261C, 0xA2D1, 0x261E, 0xA2D2, 0x00B6, + 0xA2D3, 0x2020, 0xA2D4, 0x2021, 0xA2D5, 0x2195, 0xA2D6, 0x2197, + 0xA2D7, 0x2199, 0xA2D8, 0x2196, 0xA2D9, 0x2198, 0xA2DA, 0x266D, + 0xA2DB, 0x2669, 0xA2DC, 0x266A, 0xA2DD, 0x266C, 0xA2DE, 0x327F, + 0xA2DF, 0x321C, 0xA2E0, 0x2116, 0xA2E1, 0x33C7, 0xA2E2, 0x2122, + 0xA2E3, 0x33C2, 0xA2E4, 0x33D8, 0xA2E5, 0x2121, 0xA2E6, 0x20AC, + 0xA2E7, 0x00AE, 0xA341, 0xC971, 0xA342, 0xC972, 0xA343, 0xC973, + 0xA344, 0xC975, 0xA345, 0xC976, 0xA346, 0xC977, 0xA347, 0xC978, + 0xA348, 0xC979, 0xA349, 0xC97A, 0xA34A, 0xC97B, 0xA34B, 0xC97D, + 0xA34C, 0xC97E, 0xA34D, 0xC97F, 0xA34E, 0xC980, 0xA34F, 0xC981, + 0xA350, 0xC982, 0xA351, 0xC983, 0xA352, 0xC984, 0xA353, 0xC985, + 0xA354, 0xC986, 0xA355, 0xC987, 0xA356, 0xC98A, 0xA357, 0xC98B, + 0xA358, 0xC98D, 0xA359, 0xC98E, 0xA35A, 0xC98F, 0xA361, 0xC991, + 0xA362, 0xC992, 0xA363, 0xC993, 0xA364, 0xC994, 0xA365, 0xC995, + 0xA366, 0xC996, 0xA367, 0xC997, 0xA368, 0xC99A, 0xA369, 0xC99C, + 0xA36A, 0xC99E, 0xA36B, 0xC99F, 0xA36C, 0xC9A0, 0xA36D, 0xC9A1, + 0xA36E, 0xC9A2, 0xA36F, 0xC9A3, 0xA370, 0xC9A4, 0xA371, 0xC9A5, + 0xA372, 0xC9A6, 0xA373, 0xC9A7, 0xA374, 0xC9A8, 0xA375, 0xC9A9, + 0xA376, 0xC9AA, 0xA377, 0xC9AB, 0xA378, 0xC9AC, 0xA379, 0xC9AD, + 0xA37A, 0xC9AE, 0xA381, 0xC9AF, 0xA382, 0xC9B0, 0xA383, 0xC9B1, + 0xA384, 0xC9B2, 0xA385, 0xC9B3, 0xA386, 0xC9B4, 0xA387, 0xC9B5, + 0xA388, 0xC9B6, 0xA389, 0xC9B7, 0xA38A, 0xC9B8, 0xA38B, 0xC9B9, + 0xA38C, 0xC9BA, 0xA38D, 0xC9BB, 0xA38E, 0xC9BC, 0xA38F, 0xC9BD, + 0xA390, 0xC9BE, 0xA391, 0xC9BF, 0xA392, 0xC9C2, 0xA393, 0xC9C3, + 0xA394, 0xC9C5, 0xA395, 0xC9C6, 0xA396, 0xC9C9, 0xA397, 0xC9CB, + 0xA398, 0xC9CC, 0xA399, 0xC9CD, 0xA39A, 0xC9CE, 0xA39B, 0xC9CF, + 0xA39C, 0xC9D2, 0xA39D, 0xC9D4, 0xA39E, 0xC9D7, 0xA39F, 0xC9D8, + 0xA3A0, 0xC9DB, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, + 0xA3A4, 0xFF04, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, + 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, + 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, + 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, + 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, + 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, + 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, + 0xA3DC, 0xFFE6, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, + 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, + 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, + 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, + 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA441, 0xC9DE, + 0xA442, 0xC9DF, 0xA443, 0xC9E1, 0xA444, 0xC9E3, 0xA445, 0xC9E5, + 0xA446, 0xC9E6, 0xA447, 0xC9E8, 0xA448, 0xC9E9, 0xA449, 0xC9EA, + 0xA44A, 0xC9EB, 0xA44B, 0xC9EE, 0xA44C, 0xC9F2, 0xA44D, 0xC9F3, + 0xA44E, 0xC9F4, 0xA44F, 0xC9F5, 0xA450, 0xC9F6, 0xA451, 0xC9F7, + 0xA452, 0xC9FA, 0xA453, 0xC9FB, 0xA454, 0xC9FD, 0xA455, 0xC9FE, + 0xA456, 0xC9FF, 0xA457, 0xCA01, 0xA458, 0xCA02, 0xA459, 0xCA03, + 0xA45A, 0xCA04, 0xA461, 0xCA05, 0xA462, 0xCA06, 0xA463, 0xCA07, + 0xA464, 0xCA0A, 0xA465, 0xCA0E, 0xA466, 0xCA0F, 0xA467, 0xCA10, + 0xA468, 0xCA11, 0xA469, 0xCA12, 0xA46A, 0xCA13, 0xA46B, 0xCA15, + 0xA46C, 0xCA16, 0xA46D, 0xCA17, 0xA46E, 0xCA19, 0xA46F, 0xCA1A, + 0xA470, 0xCA1B, 0xA471, 0xCA1C, 0xA472, 0xCA1D, 0xA473, 0xCA1E, + 0xA474, 0xCA1F, 0xA475, 0xCA20, 0xA476, 0xCA21, 0xA477, 0xCA22, + 0xA478, 0xCA23, 0xA479, 0xCA24, 0xA47A, 0xCA25, 0xA481, 0xCA26, + 0xA482, 0xCA27, 0xA483, 0xCA28, 0xA484, 0xCA2A, 0xA485, 0xCA2B, + 0xA486, 0xCA2C, 0xA487, 0xCA2D, 0xA488, 0xCA2E, 0xA489, 0xCA2F, + 0xA48A, 0xCA30, 0xA48B, 0xCA31, 0xA48C, 0xCA32, 0xA48D, 0xCA33, + 0xA48E, 0xCA34, 0xA48F, 0xCA35, 0xA490, 0xCA36, 0xA491, 0xCA37, + 0xA492, 0xCA38, 0xA493, 0xCA39, 0xA494, 0xCA3A, 0xA495, 0xCA3B, + 0xA496, 0xCA3C, 0xA497, 0xCA3D, 0xA498, 0xCA3E, 0xA499, 0xCA3F, + 0xA49A, 0xCA40, 0xA49B, 0xCA41, 0xA49C, 0xCA42, 0xA49D, 0xCA43, + 0xA49E, 0xCA44, 0xA49F, 0xCA45, 0xA4A0, 0xCA46, 0xA4A1, 0x3131, + 0xA4A2, 0x3132, 0xA4A3, 0x3133, 0xA4A4, 0x3134, 0xA4A5, 0x3135, + 0xA4A6, 0x3136, 0xA4A7, 0x3137, 0xA4A8, 0x3138, 0xA4A9, 0x3139, + 0xA4AA, 0x313A, 0xA4AB, 0x313B, 0xA4AC, 0x313C, 0xA4AD, 0x313D, + 0xA4AE, 0x313E, 0xA4AF, 0x313F, 0xA4B0, 0x3140, 0xA4B1, 0x3141, + 0xA4B2, 0x3142, 0xA4B3, 0x3143, 0xA4B4, 0x3144, 0xA4B5, 0x3145, + 0xA4B6, 0x3146, 0xA4B7, 0x3147, 0xA4B8, 0x3148, 0xA4B9, 0x3149, + 0xA4BA, 0x314A, 0xA4BB, 0x314B, 0xA4BC, 0x314C, 0xA4BD, 0x314D, + 0xA4BE, 0x314E, 0xA4BF, 0x314F, 0xA4C0, 0x3150, 0xA4C1, 0x3151, + 0xA4C2, 0x3152, 0xA4C3, 0x3153, 0xA4C4, 0x3154, 0xA4C5, 0x3155, + 0xA4C6, 0x3156, 0xA4C7, 0x3157, 0xA4C8, 0x3158, 0xA4C9, 0x3159, + 0xA4CA, 0x315A, 0xA4CB, 0x315B, 0xA4CC, 0x315C, 0xA4CD, 0x315D, + 0xA4CE, 0x315E, 0xA4CF, 0x315F, 0xA4D0, 0x3160, 0xA4D1, 0x3161, + 0xA4D2, 0x3162, 0xA4D3, 0x3163, 0xA4D4, 0x3164, 0xA4D5, 0x3165, + 0xA4D6, 0x3166, 0xA4D7, 0x3167, 0xA4D8, 0x3168, 0xA4D9, 0x3169, + 0xA4DA, 0x316A, 0xA4DB, 0x316B, 0xA4DC, 0x316C, 0xA4DD, 0x316D, + 0xA4DE, 0x316E, 0xA4DF, 0x316F, 0xA4E0, 0x3170, 0xA4E1, 0x3171, + 0xA4E2, 0x3172, 0xA4E3, 0x3173, 0xA4E4, 0x3174, 0xA4E5, 0x3175, + 0xA4E6, 0x3176, 0xA4E7, 0x3177, 0xA4E8, 0x3178, 0xA4E9, 0x3179, + 0xA4EA, 0x317A, 0xA4EB, 0x317B, 0xA4EC, 0x317C, 0xA4ED, 0x317D, + 0xA4EE, 0x317E, 0xA4EF, 0x317F, 0xA4F0, 0x3180, 0xA4F1, 0x3181, + 0xA4F2, 0x3182, 0xA4F3, 0x3183, 0xA4F4, 0x3184, 0xA4F5, 0x3185, + 0xA4F6, 0x3186, 0xA4F7, 0x3187, 0xA4F8, 0x3188, 0xA4F9, 0x3189, + 0xA4FA, 0x318A, 0xA4FB, 0x318B, 0xA4FC, 0x318C, 0xA4FD, 0x318D, + 0xA4FE, 0x318E, 0xA541, 0xCA47, 0xA542, 0xCA48, 0xA543, 0xCA49, + 0xA544, 0xCA4A, 0xA545, 0xCA4B, 0xA546, 0xCA4E, 0xA547, 0xCA4F, + 0xA548, 0xCA51, 0xA549, 0xCA52, 0xA54A, 0xCA53, 0xA54B, 0xCA55, + 0xA54C, 0xCA56, 0xA54D, 0xCA57, 0xA54E, 0xCA58, 0xA54F, 0xCA59, + 0xA550, 0xCA5A, 0xA551, 0xCA5B, 0xA552, 0xCA5E, 0xA553, 0xCA62, + 0xA554, 0xCA63, 0xA555, 0xCA64, 0xA556, 0xCA65, 0xA557, 0xCA66, + 0xA558, 0xCA67, 0xA559, 0xCA69, 0xA55A, 0xCA6A, 0xA561, 0xCA6B, + 0xA562, 0xCA6C, 0xA563, 0xCA6D, 0xA564, 0xCA6E, 0xA565, 0xCA6F, + 0xA566, 0xCA70, 0xA567, 0xCA71, 0xA568, 0xCA72, 0xA569, 0xCA73, + 0xA56A, 0xCA74, 0xA56B, 0xCA75, 0xA56C, 0xCA76, 0xA56D, 0xCA77, + 0xA56E, 0xCA78, 0xA56F, 0xCA79, 0xA570, 0xCA7A, 0xA571, 0xCA7B, + 0xA572, 0xCA7C, 0xA573, 0xCA7E, 0xA574, 0xCA7F, 0xA575, 0xCA80, + 0xA576, 0xCA81, 0xA577, 0xCA82, 0xA578, 0xCA83, 0xA579, 0xCA85, + 0xA57A, 0xCA86, 0xA581, 0xCA87, 0xA582, 0xCA88, 0xA583, 0xCA89, + 0xA584, 0xCA8A, 0xA585, 0xCA8B, 0xA586, 0xCA8C, 0xA587, 0xCA8D, + 0xA588, 0xCA8E, 0xA589, 0xCA8F, 0xA58A, 0xCA90, 0xA58B, 0xCA91, + 0xA58C, 0xCA92, 0xA58D, 0xCA93, 0xA58E, 0xCA94, 0xA58F, 0xCA95, + 0xA590, 0xCA96, 0xA591, 0xCA97, 0xA592, 0xCA99, 0xA593, 0xCA9A, + 0xA594, 0xCA9B, 0xA595, 0xCA9C, 0xA596, 0xCA9D, 0xA597, 0xCA9E, + 0xA598, 0xCA9F, 0xA599, 0xCAA0, 0xA59A, 0xCAA1, 0xA59B, 0xCAA2, + 0xA59C, 0xCAA3, 0xA59D, 0xCAA4, 0xA59E, 0xCAA5, 0xA59F, 0xCAA6, + 0xA5A0, 0xCAA7, 0xA5A1, 0x2170, 0xA5A2, 0x2171, 0xA5A3, 0x2172, + 0xA5A4, 0x2173, 0xA5A5, 0x2174, 0xA5A6, 0x2175, 0xA5A7, 0x2176, + 0xA5A8, 0x2177, 0xA5A9, 0x2178, 0xA5AA, 0x2179, 0xA5B0, 0x2160, + 0xA5B1, 0x2161, 0xA5B2, 0x2162, 0xA5B3, 0x2163, 0xA5B4, 0x2164, + 0xA5B5, 0x2165, 0xA5B6, 0x2166, 0xA5B7, 0x2167, 0xA5B8, 0x2168, + 0xA5B9, 0x2169, 0xA5C1, 0x0391, 0xA5C2, 0x0392, 0xA5C3, 0x0393, + 0xA5C4, 0x0394, 0xA5C5, 0x0395, 0xA5C6, 0x0396, 0xA5C7, 0x0397, + 0xA5C8, 0x0398, 0xA5C9, 0x0399, 0xA5CA, 0x039A, 0xA5CB, 0x039B, + 0xA5CC, 0x039C, 0xA5CD, 0x039D, 0xA5CE, 0x039E, 0xA5CF, 0x039F, + 0xA5D0, 0x03A0, 0xA5D1, 0x03A1, 0xA5D2, 0x03A3, 0xA5D3, 0x03A4, + 0xA5D4, 0x03A5, 0xA5D5, 0x03A6, 0xA5D6, 0x03A7, 0xA5D7, 0x03A8, + 0xA5D8, 0x03A9, 0xA5E1, 0x03B1, 0xA5E2, 0x03B2, 0xA5E3, 0x03B3, + 0xA5E4, 0x03B4, 0xA5E5, 0x03B5, 0xA5E6, 0x03B6, 0xA5E7, 0x03B7, + 0xA5E8, 0x03B8, 0xA5E9, 0x03B9, 0xA5EA, 0x03BA, 0xA5EB, 0x03BB, + 0xA5EC, 0x03BC, 0xA5ED, 0x03BD, 0xA5EE, 0x03BE, 0xA5EF, 0x03BF, + 0xA5F0, 0x03C0, 0xA5F1, 0x03C1, 0xA5F2, 0x03C3, 0xA5F3, 0x03C4, + 0xA5F4, 0x03C5, 0xA5F5, 0x03C6, 0xA5F6, 0x03C7, 0xA5F7, 0x03C8, + 0xA5F8, 0x03C9, 0xA641, 0xCAA8, 0xA642, 0xCAA9, 0xA643, 0xCAAA, + 0xA644, 0xCAAB, 0xA645, 0xCAAC, 0xA646, 0xCAAD, 0xA647, 0xCAAE, + 0xA648, 0xCAAF, 0xA649, 0xCAB0, 0xA64A, 0xCAB1, 0xA64B, 0xCAB2, + 0xA64C, 0xCAB3, 0xA64D, 0xCAB4, 0xA64E, 0xCAB5, 0xA64F, 0xCAB6, + 0xA650, 0xCAB7, 0xA651, 0xCAB8, 0xA652, 0xCAB9, 0xA653, 0xCABA, + 0xA654, 0xCABB, 0xA655, 0xCABE, 0xA656, 0xCABF, 0xA657, 0xCAC1, + 0xA658, 0xCAC2, 0xA659, 0xCAC3, 0xA65A, 0xCAC5, 0xA661, 0xCAC6, + 0xA662, 0xCAC7, 0xA663, 0xCAC8, 0xA664, 0xCAC9, 0xA665, 0xCACA, + 0xA666, 0xCACB, 0xA667, 0xCACE, 0xA668, 0xCAD0, 0xA669, 0xCAD2, + 0xA66A, 0xCAD4, 0xA66B, 0xCAD5, 0xA66C, 0xCAD6, 0xA66D, 0xCAD7, + 0xA66E, 0xCADA, 0xA66F, 0xCADB, 0xA670, 0xCADC, 0xA671, 0xCADD, + 0xA672, 0xCADE, 0xA673, 0xCADF, 0xA674, 0xCAE1, 0xA675, 0xCAE2, + 0xA676, 0xCAE3, 0xA677, 0xCAE4, 0xA678, 0xCAE5, 0xA679, 0xCAE6, + 0xA67A, 0xCAE7, 0xA681, 0xCAE8, 0xA682, 0xCAE9, 0xA683, 0xCAEA, + 0xA684, 0xCAEB, 0xA685, 0xCAED, 0xA686, 0xCAEE, 0xA687, 0xCAEF, + 0xA688, 0xCAF0, 0xA689, 0xCAF1, 0xA68A, 0xCAF2, 0xA68B, 0xCAF3, + 0xA68C, 0xCAF5, 0xA68D, 0xCAF6, 0xA68E, 0xCAF7, 0xA68F, 0xCAF8, + 0xA690, 0xCAF9, 0xA691, 0xCAFA, 0xA692, 0xCAFB, 0xA693, 0xCAFC, + 0xA694, 0xCAFD, 0xA695, 0xCAFE, 0xA696, 0xCAFF, 0xA697, 0xCB00, + 0xA698, 0xCB01, 0xA699, 0xCB02, 0xA69A, 0xCB03, 0xA69B, 0xCB04, + 0xA69C, 0xCB05, 0xA69D, 0xCB06, 0xA69E, 0xCB07, 0xA69F, 0xCB09, + 0xA6A0, 0xCB0A, 0xA6A1, 0x2500, 0xA6A2, 0x2502, 0xA6A3, 0x250C, + 0xA6A4, 0x2510, 0xA6A5, 0x2518, 0xA6A6, 0x2514, 0xA6A7, 0x251C, + 0xA6A8, 0x252C, 0xA6A9, 0x2524, 0xA6AA, 0x2534, 0xA6AB, 0x253C, + 0xA6AC, 0x2501, 0xA6AD, 0x2503, 0xA6AE, 0x250F, 0xA6AF, 0x2513, + 0xA6B0, 0x251B, 0xA6B1, 0x2517, 0xA6B2, 0x2523, 0xA6B3, 0x2533, + 0xA6B4, 0x252B, 0xA6B5, 0x253B, 0xA6B6, 0x254B, 0xA6B7, 0x2520, + 0xA6B8, 0x252F, 0xA6B9, 0x2528, 0xA6BA, 0x2537, 0xA6BB, 0x253F, + 0xA6BC, 0x251D, 0xA6BD, 0x2530, 0xA6BE, 0x2525, 0xA6BF, 0x2538, + 0xA6C0, 0x2542, 0xA6C1, 0x2512, 0xA6C2, 0x2511, 0xA6C3, 0x251A, + 0xA6C4, 0x2519, 0xA6C5, 0x2516, 0xA6C6, 0x2515, 0xA6C7, 0x250E, + 0xA6C8, 0x250D, 0xA6C9, 0x251E, 0xA6CA, 0x251F, 0xA6CB, 0x2521, + 0xA6CC, 0x2522, 0xA6CD, 0x2526, 0xA6CE, 0x2527, 0xA6CF, 0x2529, + 0xA6D0, 0x252A, 0xA6D1, 0x252D, 0xA6D2, 0x252E, 0xA6D3, 0x2531, + 0xA6D4, 0x2532, 0xA6D5, 0x2535, 0xA6D6, 0x2536, 0xA6D7, 0x2539, + 0xA6D8, 0x253A, 0xA6D9, 0x253D, 0xA6DA, 0x253E, 0xA6DB, 0x2540, + 0xA6DC, 0x2541, 0xA6DD, 0x2543, 0xA6DE, 0x2544, 0xA6DF, 0x2545, + 0xA6E0, 0x2546, 0xA6E1, 0x2547, 0xA6E2, 0x2548, 0xA6E3, 0x2549, + 0xA6E4, 0x254A, 0xA741, 0xCB0B, 0xA742, 0xCB0C, 0xA743, 0xCB0D, + 0xA744, 0xCB0E, 0xA745, 0xCB0F, 0xA746, 0xCB11, 0xA747, 0xCB12, + 0xA748, 0xCB13, 0xA749, 0xCB15, 0xA74A, 0xCB16, 0xA74B, 0xCB17, + 0xA74C, 0xCB19, 0xA74D, 0xCB1A, 0xA74E, 0xCB1B, 0xA74F, 0xCB1C, + 0xA750, 0xCB1D, 0xA751, 0xCB1E, 0xA752, 0xCB1F, 0xA753, 0xCB22, + 0xA754, 0xCB23, 0xA755, 0xCB24, 0xA756, 0xCB25, 0xA757, 0xCB26, + 0xA758, 0xCB27, 0xA759, 0xCB28, 0xA75A, 0xCB29, 0xA761, 0xCB2A, + 0xA762, 0xCB2B, 0xA763, 0xCB2C, 0xA764, 0xCB2D, 0xA765, 0xCB2E, + 0xA766, 0xCB2F, 0xA767, 0xCB30, 0xA768, 0xCB31, 0xA769, 0xCB32, + 0xA76A, 0xCB33, 0xA76B, 0xCB34, 0xA76C, 0xCB35, 0xA76D, 0xCB36, + 0xA76E, 0xCB37, 0xA76F, 0xCB38, 0xA770, 0xCB39, 0xA771, 0xCB3A, + 0xA772, 0xCB3B, 0xA773, 0xCB3C, 0xA774, 0xCB3D, 0xA775, 0xCB3E, + 0xA776, 0xCB3F, 0xA777, 0xCB40, 0xA778, 0xCB42, 0xA779, 0xCB43, + 0xA77A, 0xCB44, 0xA781, 0xCB45, 0xA782, 0xCB46, 0xA783, 0xCB47, + 0xA784, 0xCB4A, 0xA785, 0xCB4B, 0xA786, 0xCB4D, 0xA787, 0xCB4E, + 0xA788, 0xCB4F, 0xA789, 0xCB51, 0xA78A, 0xCB52, 0xA78B, 0xCB53, + 0xA78C, 0xCB54, 0xA78D, 0xCB55, 0xA78E, 0xCB56, 0xA78F, 0xCB57, + 0xA790, 0xCB5A, 0xA791, 0xCB5B, 0xA792, 0xCB5C, 0xA793, 0xCB5E, + 0xA794, 0xCB5F, 0xA795, 0xCB60, 0xA796, 0xCB61, 0xA797, 0xCB62, + 0xA798, 0xCB63, 0xA799, 0xCB65, 0xA79A, 0xCB66, 0xA79B, 0xCB67, + 0xA79C, 0xCB68, 0xA79D, 0xCB69, 0xA79E, 0xCB6A, 0xA79F, 0xCB6B, + 0xA7A0, 0xCB6C, 0xA7A1, 0x3395, 0xA7A2, 0x3396, 0xA7A3, 0x3397, + 0xA7A4, 0x2113, 0xA7A5, 0x3398, 0xA7A6, 0x33C4, 0xA7A7, 0x33A3, + 0xA7A8, 0x33A4, 0xA7A9, 0x33A5, 0xA7AA, 0x33A6, 0xA7AB, 0x3399, + 0xA7AC, 0x339A, 0xA7AD, 0x339B, 0xA7AE, 0x339C, 0xA7AF, 0x339D, + 0xA7B0, 0x339E, 0xA7B1, 0x339F, 0xA7B2, 0x33A0, 0xA7B3, 0x33A1, + 0xA7B4, 0x33A2, 0xA7B5, 0x33CA, 0xA7B6, 0x338D, 0xA7B7, 0x338E, + 0xA7B8, 0x338F, 0xA7B9, 0x33CF, 0xA7BA, 0x3388, 0xA7BB, 0x3389, + 0xA7BC, 0x33C8, 0xA7BD, 0x33A7, 0xA7BE, 0x33A8, 0xA7BF, 0x33B0, + 0xA7C0, 0x33B1, 0xA7C1, 0x33B2, 0xA7C2, 0x33B3, 0xA7C3, 0x33B4, + 0xA7C4, 0x33B5, 0xA7C5, 0x33B6, 0xA7C6, 0x33B7, 0xA7C7, 0x33B8, + 0xA7C8, 0x33B9, 0xA7C9, 0x3380, 0xA7CA, 0x3381, 0xA7CB, 0x3382, + 0xA7CC, 0x3383, 0xA7CD, 0x3384, 0xA7CE, 0x33BA, 0xA7CF, 0x33BB, + 0xA7D0, 0x33BC, 0xA7D1, 0x33BD, 0xA7D2, 0x33BE, 0xA7D3, 0x33BF, + 0xA7D4, 0x3390, 0xA7D5, 0x3391, 0xA7D6, 0x3392, 0xA7D7, 0x3393, + 0xA7D8, 0x3394, 0xA7D9, 0x2126, 0xA7DA, 0x33C0, 0xA7DB, 0x33C1, + 0xA7DC, 0x338A, 0xA7DD, 0x338B, 0xA7DE, 0x338C, 0xA7DF, 0x33D6, + 0xA7E0, 0x33C5, 0xA7E1, 0x33AD, 0xA7E2, 0x33AE, 0xA7E3, 0x33AF, + 0xA7E4, 0x33DB, 0xA7E5, 0x33A9, 0xA7E6, 0x33AA, 0xA7E7, 0x33AB, + 0xA7E8, 0x33AC, 0xA7E9, 0x33DD, 0xA7EA, 0x33D0, 0xA7EB, 0x33D3, + 0xA7EC, 0x33C3, 0xA7ED, 0x33C9, 0xA7EE, 0x33DC, 0xA7EF, 0x33C6, + 0xA841, 0xCB6D, 0xA842, 0xCB6E, 0xA843, 0xCB6F, 0xA844, 0xCB70, + 0xA845, 0xCB71, 0xA846, 0xCB72, 0xA847, 0xCB73, 0xA848, 0xCB74, + 0xA849, 0xCB75, 0xA84A, 0xCB76, 0xA84B, 0xCB77, 0xA84C, 0xCB7A, + 0xA84D, 0xCB7B, 0xA84E, 0xCB7C, 0xA84F, 0xCB7D, 0xA850, 0xCB7E, + 0xA851, 0xCB7F, 0xA852, 0xCB80, 0xA853, 0xCB81, 0xA854, 0xCB82, + 0xA855, 0xCB83, 0xA856, 0xCB84, 0xA857, 0xCB85, 0xA858, 0xCB86, + 0xA859, 0xCB87, 0xA85A, 0xCB88, 0xA861, 0xCB89, 0xA862, 0xCB8A, + 0xA863, 0xCB8B, 0xA864, 0xCB8C, 0xA865, 0xCB8D, 0xA866, 0xCB8E, + 0xA867, 0xCB8F, 0xA868, 0xCB90, 0xA869, 0xCB91, 0xA86A, 0xCB92, + 0xA86B, 0xCB93, 0xA86C, 0xCB94, 0xA86D, 0xCB95, 0xA86E, 0xCB96, + 0xA86F, 0xCB97, 0xA870, 0xCB98, 0xA871, 0xCB99, 0xA872, 0xCB9A, + 0xA873, 0xCB9B, 0xA874, 0xCB9D, 0xA875, 0xCB9E, 0xA876, 0xCB9F, + 0xA877, 0xCBA0, 0xA878, 0xCBA1, 0xA879, 0xCBA2, 0xA87A, 0xCBA3, + 0xA881, 0xCBA4, 0xA882, 0xCBA5, 0xA883, 0xCBA6, 0xA884, 0xCBA7, + 0xA885, 0xCBA8, 0xA886, 0xCBA9, 0xA887, 0xCBAA, 0xA888, 0xCBAB, + 0xA889, 0xCBAC, 0xA88A, 0xCBAD, 0xA88B, 0xCBAE, 0xA88C, 0xCBAF, + 0xA88D, 0xCBB0, 0xA88E, 0xCBB1, 0xA88F, 0xCBB2, 0xA890, 0xCBB3, + 0xA891, 0xCBB4, 0xA892, 0xCBB5, 0xA893, 0xCBB6, 0xA894, 0xCBB7, + 0xA895, 0xCBB9, 0xA896, 0xCBBA, 0xA897, 0xCBBB, 0xA898, 0xCBBC, + 0xA899, 0xCBBD, 0xA89A, 0xCBBE, 0xA89B, 0xCBBF, 0xA89C, 0xCBC0, + 0xA89D, 0xCBC1, 0xA89E, 0xCBC2, 0xA89F, 0xCBC3, 0xA8A0, 0xCBC4, + 0xA8A1, 0x00C6, 0xA8A2, 0x00D0, 0xA8A3, 0x00AA, 0xA8A4, 0x0126, + 0xA8A6, 0x0132, 0xA8A8, 0x013F, 0xA8A9, 0x0141, 0xA8AA, 0x00D8, + 0xA8AB, 0x0152, 0xA8AC, 0x00BA, 0xA8AD, 0x00DE, 0xA8AE, 0x0166, + 0xA8AF, 0x014A, 0xA8B1, 0x3260, 0xA8B2, 0x3261, 0xA8B3, 0x3262, + 0xA8B4, 0x3263, 0xA8B5, 0x3264, 0xA8B6, 0x3265, 0xA8B7, 0x3266, + 0xA8B8, 0x3267, 0xA8B9, 0x3268, 0xA8BA, 0x3269, 0xA8BB, 0x326A, + 0xA8BC, 0x326B, 0xA8BD, 0x326C, 0xA8BE, 0x326D, 0xA8BF, 0x326E, + 0xA8C0, 0x326F, 0xA8C1, 0x3270, 0xA8C2, 0x3271, 0xA8C3, 0x3272, + 0xA8C4, 0x3273, 0xA8C5, 0x3274, 0xA8C6, 0x3275, 0xA8C7, 0x3276, + 0xA8C8, 0x3277, 0xA8C9, 0x3278, 0xA8CA, 0x3279, 0xA8CB, 0x327A, + 0xA8CC, 0x327B, 0xA8CD, 0x24D0, 0xA8CE, 0x24D1, 0xA8CF, 0x24D2, + 0xA8D0, 0x24D3, 0xA8D1, 0x24D4, 0xA8D2, 0x24D5, 0xA8D3, 0x24D6, + 0xA8D4, 0x24D7, 0xA8D5, 0x24D8, 0xA8D6, 0x24D9, 0xA8D7, 0x24DA, + 0xA8D8, 0x24DB, 0xA8D9, 0x24DC, 0xA8DA, 0x24DD, 0xA8DB, 0x24DE, + 0xA8DC, 0x24DF, 0xA8DD, 0x24E0, 0xA8DE, 0x24E1, 0xA8DF, 0x24E2, + 0xA8E0, 0x24E3, 0xA8E1, 0x24E4, 0xA8E2, 0x24E5, 0xA8E3, 0x24E6, + 0xA8E4, 0x24E7, 0xA8E5, 0x24E8, 0xA8E6, 0x24E9, 0xA8E7, 0x2460, + 0xA8E8, 0x2461, 0xA8E9, 0x2462, 0xA8EA, 0x2463, 0xA8EB, 0x2464, + 0xA8EC, 0x2465, 0xA8ED, 0x2466, 0xA8EE, 0x2467, 0xA8EF, 0x2468, + 0xA8F0, 0x2469, 0xA8F1, 0x246A, 0xA8F2, 0x246B, 0xA8F3, 0x246C, + 0xA8F4, 0x246D, 0xA8F5, 0x246E, 0xA8F6, 0x00BD, 0xA8F7, 0x2153, + 0xA8F8, 0x2154, 0xA8F9, 0x00BC, 0xA8FA, 0x00BE, 0xA8FB, 0x215B, + 0xA8FC, 0x215C, 0xA8FD, 0x215D, 0xA8FE, 0x215E, 0xA941, 0xCBC5, + 0xA942, 0xCBC6, 0xA943, 0xCBC7, 0xA944, 0xCBC8, 0xA945, 0xCBC9, + 0xA946, 0xCBCA, 0xA947, 0xCBCB, 0xA948, 0xCBCC, 0xA949, 0xCBCD, + 0xA94A, 0xCBCE, 0xA94B, 0xCBCF, 0xA94C, 0xCBD0, 0xA94D, 0xCBD1, + 0xA94E, 0xCBD2, 0xA94F, 0xCBD3, 0xA950, 0xCBD5, 0xA951, 0xCBD6, + 0xA952, 0xCBD7, 0xA953, 0xCBD8, 0xA954, 0xCBD9, 0xA955, 0xCBDA, + 0xA956, 0xCBDB, 0xA957, 0xCBDC, 0xA958, 0xCBDD, 0xA959, 0xCBDE, + 0xA95A, 0xCBDF, 0xA961, 0xCBE0, 0xA962, 0xCBE1, 0xA963, 0xCBE2, + 0xA964, 0xCBE3, 0xA965, 0xCBE5, 0xA966, 0xCBE6, 0xA967, 0xCBE8, + 0xA968, 0xCBEA, 0xA969, 0xCBEB, 0xA96A, 0xCBEC, 0xA96B, 0xCBED, + 0xA96C, 0xCBEE, 0xA96D, 0xCBEF, 0xA96E, 0xCBF0, 0xA96F, 0xCBF1, + 0xA970, 0xCBF2, 0xA971, 0xCBF3, 0xA972, 0xCBF4, 0xA973, 0xCBF5, + 0xA974, 0xCBF6, 0xA975, 0xCBF7, 0xA976, 0xCBF8, 0xA977, 0xCBF9, + 0xA978, 0xCBFA, 0xA979, 0xCBFB, 0xA97A, 0xCBFC, 0xA981, 0xCBFD, + 0xA982, 0xCBFE, 0xA983, 0xCBFF, 0xA984, 0xCC00, 0xA985, 0xCC01, + 0xA986, 0xCC02, 0xA987, 0xCC03, 0xA988, 0xCC04, 0xA989, 0xCC05, + 0xA98A, 0xCC06, 0xA98B, 0xCC07, 0xA98C, 0xCC08, 0xA98D, 0xCC09, + 0xA98E, 0xCC0A, 0xA98F, 0xCC0B, 0xA990, 0xCC0E, 0xA991, 0xCC0F, + 0xA992, 0xCC11, 0xA993, 0xCC12, 0xA994, 0xCC13, 0xA995, 0xCC15, + 0xA996, 0xCC16, 0xA997, 0xCC17, 0xA998, 0xCC18, 0xA999, 0xCC19, + 0xA99A, 0xCC1A, 0xA99B, 0xCC1B, 0xA99C, 0xCC1E, 0xA99D, 0xCC1F, + 0xA99E, 0xCC20, 0xA99F, 0xCC23, 0xA9A0, 0xCC24, 0xA9A1, 0x00E6, + 0xA9A2, 0x0111, 0xA9A3, 0x00F0, 0xA9A4, 0x0127, 0xA9A5, 0x0131, + 0xA9A6, 0x0133, 0xA9A7, 0x0138, 0xA9A8, 0x0140, 0xA9A9, 0x0142, + 0xA9AA, 0x00F8, 0xA9AB, 0x0153, 0xA9AC, 0x00DF, 0xA9AD, 0x00FE, + 0xA9AE, 0x0167, 0xA9AF, 0x014B, 0xA9B0, 0x0149, 0xA9B1, 0x3200, + 0xA9B2, 0x3201, 0xA9B3, 0x3202, 0xA9B4, 0x3203, 0xA9B5, 0x3204, + 0xA9B6, 0x3205, 0xA9B7, 0x3206, 0xA9B8, 0x3207, 0xA9B9, 0x3208, + 0xA9BA, 0x3209, 0xA9BB, 0x320A, 0xA9BC, 0x320B, 0xA9BD, 0x320C, + 0xA9BE, 0x320D, 0xA9BF, 0x320E, 0xA9C0, 0x320F, 0xA9C1, 0x3210, + 0xA9C2, 0x3211, 0xA9C3, 0x3212, 0xA9C4, 0x3213, 0xA9C5, 0x3214, + 0xA9C6, 0x3215, 0xA9C7, 0x3216, 0xA9C8, 0x3217, 0xA9C9, 0x3218, + 0xA9CA, 0x3219, 0xA9CB, 0x321A, 0xA9CC, 0x321B, 0xA9CD, 0x249C, + 0xA9CE, 0x249D, 0xA9CF, 0x249E, 0xA9D0, 0x249F, 0xA9D1, 0x24A0, + 0xA9D2, 0x24A1, 0xA9D3, 0x24A2, 0xA9D4, 0x24A3, 0xA9D5, 0x24A4, + 0xA9D6, 0x24A5, 0xA9D7, 0x24A6, 0xA9D8, 0x24A7, 0xA9D9, 0x24A8, + 0xA9DA, 0x24A9, 0xA9DB, 0x24AA, 0xA9DC, 0x24AB, 0xA9DD, 0x24AC, + 0xA9DE, 0x24AD, 0xA9DF, 0x24AE, 0xA9E0, 0x24AF, 0xA9E1, 0x24B0, + 0xA9E2, 0x24B1, 0xA9E3, 0x24B2, 0xA9E4, 0x24B3, 0xA9E5, 0x24B4, + 0xA9E6, 0x24B5, 0xA9E7, 0x2474, 0xA9E8, 0x2475, 0xA9E9, 0x2476, + 0xA9EA, 0x2477, 0xA9EB, 0x2478, 0xA9EC, 0x2479, 0xA9ED, 0x247A, + 0xA9EE, 0x247B, 0xA9EF, 0x247C, 0xA9F0, 0x247D, 0xA9F1, 0x247E, + 0xA9F2, 0x247F, 0xA9F3, 0x2480, 0xA9F4, 0x2481, 0xA9F5, 0x2482, + 0xA9F6, 0x00B9, 0xA9F7, 0x00B2, 0xA9F8, 0x00B3, 0xA9F9, 0x2074, + 0xA9FA, 0x207F, 0xA9FB, 0x2081, 0xA9FC, 0x2082, 0xA9FD, 0x2083, + 0xA9FE, 0x2084, 0xAA41, 0xCC25, 0xAA42, 0xCC26, 0xAA43, 0xCC2A, + 0xAA44, 0xCC2B, 0xAA45, 0xCC2D, 0xAA46, 0xCC2F, 0xAA47, 0xCC31, + 0xAA48, 0xCC32, 0xAA49, 0xCC33, 0xAA4A, 0xCC34, 0xAA4B, 0xCC35, + 0xAA4C, 0xCC36, 0xAA4D, 0xCC37, 0xAA4E, 0xCC3A, 0xAA4F, 0xCC3F, + 0xAA50, 0xCC40, 0xAA51, 0xCC41, 0xAA52, 0xCC42, 0xAA53, 0xCC43, + 0xAA54, 0xCC46, 0xAA55, 0xCC47, 0xAA56, 0xCC49, 0xAA57, 0xCC4A, + 0xAA58, 0xCC4B, 0xAA59, 0xCC4D, 0xAA5A, 0xCC4E, 0xAA61, 0xCC4F, + 0xAA62, 0xCC50, 0xAA63, 0xCC51, 0xAA64, 0xCC52, 0xAA65, 0xCC53, + 0xAA66, 0xCC56, 0xAA67, 0xCC5A, 0xAA68, 0xCC5B, 0xAA69, 0xCC5C, + 0xAA6A, 0xCC5D, 0xAA6B, 0xCC5E, 0xAA6C, 0xCC5F, 0xAA6D, 0xCC61, + 0xAA6E, 0xCC62, 0xAA6F, 0xCC63, 0xAA70, 0xCC65, 0xAA71, 0xCC67, + 0xAA72, 0xCC69, 0xAA73, 0xCC6A, 0xAA74, 0xCC6B, 0xAA75, 0xCC6C, + 0xAA76, 0xCC6D, 0xAA77, 0xCC6E, 0xAA78, 0xCC6F, 0xAA79, 0xCC71, + 0xAA7A, 0xCC72, 0xAA81, 0xCC73, 0xAA82, 0xCC74, 0xAA83, 0xCC76, + 0xAA84, 0xCC77, 0xAA85, 0xCC78, 0xAA86, 0xCC79, 0xAA87, 0xCC7A, + 0xAA88, 0xCC7B, 0xAA89, 0xCC7C, 0xAA8A, 0xCC7D, 0xAA8B, 0xCC7E, + 0xAA8C, 0xCC7F, 0xAA8D, 0xCC80, 0xAA8E, 0xCC81, 0xAA8F, 0xCC82, + 0xAA90, 0xCC83, 0xAA91, 0xCC84, 0xAA92, 0xCC85, 0xAA93, 0xCC86, + 0xAA94, 0xCC87, 0xAA95, 0xCC88, 0xAA96, 0xCC89, 0xAA97, 0xCC8A, + 0xAA98, 0xCC8B, 0xAA99, 0xCC8C, 0xAA9A, 0xCC8D, 0xAA9B, 0xCC8E, + 0xAA9C, 0xCC8F, 0xAA9D, 0xCC90, 0xAA9E, 0xCC91, 0xAA9F, 0xCC92, + 0xAAA0, 0xCC93, 0xAAA1, 0x3041, 0xAAA2, 0x3042, 0xAAA3, 0x3043, + 0xAAA4, 0x3044, 0xAAA5, 0x3045, 0xAAA6, 0x3046, 0xAAA7, 0x3047, + 0xAAA8, 0x3048, 0xAAA9, 0x3049, 0xAAAA, 0x304A, 0xAAAB, 0x304B, + 0xAAAC, 0x304C, 0xAAAD, 0x304D, 0xAAAE, 0x304E, 0xAAAF, 0x304F, + 0xAAB0, 0x3050, 0xAAB1, 0x3051, 0xAAB2, 0x3052, 0xAAB3, 0x3053, + 0xAAB4, 0x3054, 0xAAB5, 0x3055, 0xAAB6, 0x3056, 0xAAB7, 0x3057, + 0xAAB8, 0x3058, 0xAAB9, 0x3059, 0xAABA, 0x305A, 0xAABB, 0x305B, + 0xAABC, 0x305C, 0xAABD, 0x305D, 0xAABE, 0x305E, 0xAABF, 0x305F, + 0xAAC0, 0x3060, 0xAAC1, 0x3061, 0xAAC2, 0x3062, 0xAAC3, 0x3063, + 0xAAC4, 0x3064, 0xAAC5, 0x3065, 0xAAC6, 0x3066, 0xAAC7, 0x3067, + 0xAAC8, 0x3068, 0xAAC9, 0x3069, 0xAACA, 0x306A, 0xAACB, 0x306B, + 0xAACC, 0x306C, 0xAACD, 0x306D, 0xAACE, 0x306E, 0xAACF, 0x306F, + 0xAAD0, 0x3070, 0xAAD1, 0x3071, 0xAAD2, 0x3072, 0xAAD3, 0x3073, + 0xAAD4, 0x3074, 0xAAD5, 0x3075, 0xAAD6, 0x3076, 0xAAD7, 0x3077, + 0xAAD8, 0x3078, 0xAAD9, 0x3079, 0xAADA, 0x307A, 0xAADB, 0x307B, + 0xAADC, 0x307C, 0xAADD, 0x307D, 0xAADE, 0x307E, 0xAADF, 0x307F, + 0xAAE0, 0x3080, 0xAAE1, 0x3081, 0xAAE2, 0x3082, 0xAAE3, 0x3083, + 0xAAE4, 0x3084, 0xAAE5, 0x3085, 0xAAE6, 0x3086, 0xAAE7, 0x3087, + 0xAAE8, 0x3088, 0xAAE9, 0x3089, 0xAAEA, 0x308A, 0xAAEB, 0x308B, + 0xAAEC, 0x308C, 0xAAED, 0x308D, 0xAAEE, 0x308E, 0xAAEF, 0x308F, + 0xAAF0, 0x3090, 0xAAF1, 0x3091, 0xAAF2, 0x3092, 0xAAF3, 0x3093, + 0xAB41, 0xCC94, 0xAB42, 0xCC95, 0xAB43, 0xCC96, 0xAB44, 0xCC97, + 0xAB45, 0xCC9A, 0xAB46, 0xCC9B, 0xAB47, 0xCC9D, 0xAB48, 0xCC9E, + 0xAB49, 0xCC9F, 0xAB4A, 0xCCA1, 0xAB4B, 0xCCA2, 0xAB4C, 0xCCA3, + 0xAB4D, 0xCCA4, 0xAB4E, 0xCCA5, 0xAB4F, 0xCCA6, 0xAB50, 0xCCA7, + 0xAB51, 0xCCAA, 0xAB52, 0xCCAE, 0xAB53, 0xCCAF, 0xAB54, 0xCCB0, + 0xAB55, 0xCCB1, 0xAB56, 0xCCB2, 0xAB57, 0xCCB3, 0xAB58, 0xCCB6, + 0xAB59, 0xCCB7, 0xAB5A, 0xCCB9, 0xAB61, 0xCCBA, 0xAB62, 0xCCBB, + 0xAB63, 0xCCBD, 0xAB64, 0xCCBE, 0xAB65, 0xCCBF, 0xAB66, 0xCCC0, + 0xAB67, 0xCCC1, 0xAB68, 0xCCC2, 0xAB69, 0xCCC3, 0xAB6A, 0xCCC6, + 0xAB6B, 0xCCC8, 0xAB6C, 0xCCCA, 0xAB6D, 0xCCCB, 0xAB6E, 0xCCCC, + 0xAB6F, 0xCCCD, 0xAB70, 0xCCCE, 0xAB71, 0xCCCF, 0xAB72, 0xCCD1, + 0xAB73, 0xCCD2, 0xAB74, 0xCCD3, 0xAB75, 0xCCD5, 0xAB76, 0xCCD6, + 0xAB77, 0xCCD7, 0xAB78, 0xCCD8, 0xAB79, 0xCCD9, 0xAB7A, 0xCCDA, + 0xAB81, 0xCCDB, 0xAB82, 0xCCDC, 0xAB83, 0xCCDD, 0xAB84, 0xCCDE, + 0xAB85, 0xCCDF, 0xAB86, 0xCCE0, 0xAB87, 0xCCE1, 0xAB88, 0xCCE2, + 0xAB89, 0xCCE3, 0xAB8A, 0xCCE5, 0xAB8B, 0xCCE6, 0xAB8C, 0xCCE7, + 0xAB8D, 0xCCE8, 0xAB8E, 0xCCE9, 0xAB8F, 0xCCEA, 0xAB90, 0xCCEB, + 0xAB91, 0xCCED, 0xAB92, 0xCCEE, 0xAB93, 0xCCEF, 0xAB94, 0xCCF1, + 0xAB95, 0xCCF2, 0xAB96, 0xCCF3, 0xAB97, 0xCCF4, 0xAB98, 0xCCF5, + 0xAB99, 0xCCF6, 0xAB9A, 0xCCF7, 0xAB9B, 0xCCF8, 0xAB9C, 0xCCF9, + 0xAB9D, 0xCCFA, 0xAB9E, 0xCCFB, 0xAB9F, 0xCCFC, 0xABA0, 0xCCFD, + 0xABA1, 0x30A1, 0xABA2, 0x30A2, 0xABA3, 0x30A3, 0xABA4, 0x30A4, + 0xABA5, 0x30A5, 0xABA6, 0x30A6, 0xABA7, 0x30A7, 0xABA8, 0x30A8, + 0xABA9, 0x30A9, 0xABAA, 0x30AA, 0xABAB, 0x30AB, 0xABAC, 0x30AC, + 0xABAD, 0x30AD, 0xABAE, 0x30AE, 0xABAF, 0x30AF, 0xABB0, 0x30B0, + 0xABB1, 0x30B1, 0xABB2, 0x30B2, 0xABB3, 0x30B3, 0xABB4, 0x30B4, + 0xABB5, 0x30B5, 0xABB6, 0x30B6, 0xABB7, 0x30B7, 0xABB8, 0x30B8, + 0xABB9, 0x30B9, 0xABBA, 0x30BA, 0xABBB, 0x30BB, 0xABBC, 0x30BC, + 0xABBD, 0x30BD, 0xABBE, 0x30BE, 0xABBF, 0x30BF, 0xABC0, 0x30C0, + 0xABC1, 0x30C1, 0xABC2, 0x30C2, 0xABC3, 0x30C3, 0xABC4, 0x30C4, + 0xABC5, 0x30C5, 0xABC6, 0x30C6, 0xABC7, 0x30C7, 0xABC8, 0x30C8, + 0xABC9, 0x30C9, 0xABCA, 0x30CA, 0xABCB, 0x30CB, 0xABCC, 0x30CC, + 0xABCD, 0x30CD, 0xABCE, 0x30CE, 0xABCF, 0x30CF, 0xABD0, 0x30D0, + 0xABD1, 0x30D1, 0xABD2, 0x30D2, 0xABD3, 0x30D3, 0xABD4, 0x30D4, + 0xABD5, 0x30D5, 0xABD6, 0x30D6, 0xABD7, 0x30D7, 0xABD8, 0x30D8, + 0xABD9, 0x30D9, 0xABDA, 0x30DA, 0xABDB, 0x30DB, 0xABDC, 0x30DC, + 0xABDD, 0x30DD, 0xABDE, 0x30DE, 0xABDF, 0x30DF, 0xABE0, 0x30E0, + 0xABE1, 0x30E1, 0xABE2, 0x30E2, 0xABE3, 0x30E3, 0xABE4, 0x30E4, + 0xABE5, 0x30E5, 0xABE6, 0x30E6, 0xABE7, 0x30E7, 0xABE8, 0x30E8, + 0xABE9, 0x30E9, 0xABEA, 0x30EA, 0xABEB, 0x30EB, 0xABEC, 0x30EC, + 0xABED, 0x30ED, 0xABEE, 0x30EE, 0xABEF, 0x30EF, 0xABF0, 0x30F0, + 0xABF1, 0x30F1, 0xABF2, 0x30F2, 0xABF3, 0x30F3, 0xABF4, 0x30F4, + 0xABF5, 0x30F5, 0xABF6, 0x30F6, 0xAC41, 0xCCFE, 0xAC42, 0xCCFF, + 0xAC43, 0xCD00, 0xAC44, 0xCD02, 0xAC45, 0xCD03, 0xAC46, 0xCD04, + 0xAC47, 0xCD05, 0xAC48, 0xCD06, 0xAC49, 0xCD07, 0xAC4A, 0xCD0A, + 0xAC4B, 0xCD0B, 0xAC4C, 0xCD0D, 0xAC4D, 0xCD0E, 0xAC4E, 0xCD0F, + 0xAC4F, 0xCD11, 0xAC50, 0xCD12, 0xAC51, 0xCD13, 0xAC52, 0xCD14, + 0xAC53, 0xCD15, 0xAC54, 0xCD16, 0xAC55, 0xCD17, 0xAC56, 0xCD1A, + 0xAC57, 0xCD1C, 0xAC58, 0xCD1E, 0xAC59, 0xCD1F, 0xAC5A, 0xCD20, + 0xAC61, 0xCD21, 0xAC62, 0xCD22, 0xAC63, 0xCD23, 0xAC64, 0xCD25, + 0xAC65, 0xCD26, 0xAC66, 0xCD27, 0xAC67, 0xCD29, 0xAC68, 0xCD2A, + 0xAC69, 0xCD2B, 0xAC6A, 0xCD2D, 0xAC6B, 0xCD2E, 0xAC6C, 0xCD2F, + 0xAC6D, 0xCD30, 0xAC6E, 0xCD31, 0xAC6F, 0xCD32, 0xAC70, 0xCD33, + 0xAC71, 0xCD34, 0xAC72, 0xCD35, 0xAC73, 0xCD36, 0xAC74, 0xCD37, + 0xAC75, 0xCD38, 0xAC76, 0xCD3A, 0xAC77, 0xCD3B, 0xAC78, 0xCD3C, + 0xAC79, 0xCD3D, 0xAC7A, 0xCD3E, 0xAC81, 0xCD3F, 0xAC82, 0xCD40, + 0xAC83, 0xCD41, 0xAC84, 0xCD42, 0xAC85, 0xCD43, 0xAC86, 0xCD44, + 0xAC87, 0xCD45, 0xAC88, 0xCD46, 0xAC89, 0xCD47, 0xAC8A, 0xCD48, + 0xAC8B, 0xCD49, 0xAC8C, 0xCD4A, 0xAC8D, 0xCD4B, 0xAC8E, 0xCD4C, + 0xAC8F, 0xCD4D, 0xAC90, 0xCD4E, 0xAC91, 0xCD4F, 0xAC92, 0xCD50, + 0xAC93, 0xCD51, 0xAC94, 0xCD52, 0xAC95, 0xCD53, 0xAC96, 0xCD54, + 0xAC97, 0xCD55, 0xAC98, 0xCD56, 0xAC99, 0xCD57, 0xAC9A, 0xCD58, + 0xAC9B, 0xCD59, 0xAC9C, 0xCD5A, 0xAC9D, 0xCD5B, 0xAC9E, 0xCD5D, + 0xAC9F, 0xCD5E, 0xACA0, 0xCD5F, 0xACA1, 0x0410, 0xACA2, 0x0411, + 0xACA3, 0x0412, 0xACA4, 0x0413, 0xACA5, 0x0414, 0xACA6, 0x0415, + 0xACA7, 0x0401, 0xACA8, 0x0416, 0xACA9, 0x0417, 0xACAA, 0x0418, + 0xACAB, 0x0419, 0xACAC, 0x041A, 0xACAD, 0x041B, 0xACAE, 0x041C, + 0xACAF, 0x041D, 0xACB0, 0x041E, 0xACB1, 0x041F, 0xACB2, 0x0420, + 0xACB3, 0x0421, 0xACB4, 0x0422, 0xACB5, 0x0423, 0xACB6, 0x0424, + 0xACB7, 0x0425, 0xACB8, 0x0426, 0xACB9, 0x0427, 0xACBA, 0x0428, + 0xACBB, 0x0429, 0xACBC, 0x042A, 0xACBD, 0x042B, 0xACBE, 0x042C, + 0xACBF, 0x042D, 0xACC0, 0x042E, 0xACC1, 0x042F, 0xACD1, 0x0430, + 0xACD2, 0x0431, 0xACD3, 0x0432, 0xACD4, 0x0433, 0xACD5, 0x0434, + 0xACD6, 0x0435, 0xACD7, 0x0451, 0xACD8, 0x0436, 0xACD9, 0x0437, + 0xACDA, 0x0438, 0xACDB, 0x0439, 0xACDC, 0x043A, 0xACDD, 0x043B, + 0xACDE, 0x043C, 0xACDF, 0x043D, 0xACE0, 0x043E, 0xACE1, 0x043F, + 0xACE2, 0x0440, 0xACE3, 0x0441, 0xACE4, 0x0442, 0xACE5, 0x0443, + 0xACE6, 0x0444, 0xACE7, 0x0445, 0xACE8, 0x0446, 0xACE9, 0x0447, + 0xACEA, 0x0448, 0xACEB, 0x0449, 0xACEC, 0x044A, 0xACED, 0x044B, + 0xACEE, 0x044C, 0xACEF, 0x044D, 0xACF0, 0x044E, 0xACF1, 0x044F, + 0xAD41, 0xCD61, 0xAD42, 0xCD62, 0xAD43, 0xCD63, 0xAD44, 0xCD65, + 0xAD45, 0xCD66, 0xAD46, 0xCD67, 0xAD47, 0xCD68, 0xAD48, 0xCD69, + 0xAD49, 0xCD6A, 0xAD4A, 0xCD6B, 0xAD4B, 0xCD6E, 0xAD4C, 0xCD70, + 0xAD4D, 0xCD72, 0xAD4E, 0xCD73, 0xAD4F, 0xCD74, 0xAD50, 0xCD75, + 0xAD51, 0xCD76, 0xAD52, 0xCD77, 0xAD53, 0xCD79, 0xAD54, 0xCD7A, + 0xAD55, 0xCD7B, 0xAD56, 0xCD7C, 0xAD57, 0xCD7D, 0xAD58, 0xCD7E, + 0xAD59, 0xCD7F, 0xAD5A, 0xCD80, 0xAD61, 0xCD81, 0xAD62, 0xCD82, + 0xAD63, 0xCD83, 0xAD64, 0xCD84, 0xAD65, 0xCD85, 0xAD66, 0xCD86, + 0xAD67, 0xCD87, 0xAD68, 0xCD89, 0xAD69, 0xCD8A, 0xAD6A, 0xCD8B, + 0xAD6B, 0xCD8C, 0xAD6C, 0xCD8D, 0xAD6D, 0xCD8E, 0xAD6E, 0xCD8F, + 0xAD6F, 0xCD90, 0xAD70, 0xCD91, 0xAD71, 0xCD92, 0xAD72, 0xCD93, + 0xAD73, 0xCD96, 0xAD74, 0xCD97, 0xAD75, 0xCD99, 0xAD76, 0xCD9A, + 0xAD77, 0xCD9B, 0xAD78, 0xCD9D, 0xAD79, 0xCD9E, 0xAD7A, 0xCD9F, + 0xAD81, 0xCDA0, 0xAD82, 0xCDA1, 0xAD83, 0xCDA2, 0xAD84, 0xCDA3, + 0xAD85, 0xCDA6, 0xAD86, 0xCDA8, 0xAD87, 0xCDAA, 0xAD88, 0xCDAB, + 0xAD89, 0xCDAC, 0xAD8A, 0xCDAD, 0xAD8B, 0xCDAE, 0xAD8C, 0xCDAF, + 0xAD8D, 0xCDB1, 0xAD8E, 0xCDB2, 0xAD8F, 0xCDB3, 0xAD90, 0xCDB4, + 0xAD91, 0xCDB5, 0xAD92, 0xCDB6, 0xAD93, 0xCDB7, 0xAD94, 0xCDB8, + 0xAD95, 0xCDB9, 0xAD96, 0xCDBA, 0xAD97, 0xCDBB, 0xAD98, 0xCDBC, + 0xAD99, 0xCDBD, 0xAD9A, 0xCDBE, 0xAD9B, 0xCDBF, 0xAD9C, 0xCDC0, + 0xAD9D, 0xCDC1, 0xAD9E, 0xCDC2, 0xAD9F, 0xCDC3, 0xADA0, 0xCDC5, + 0xAE41, 0xCDC6, 0xAE42, 0xCDC7, 0xAE43, 0xCDC8, 0xAE44, 0xCDC9, + 0xAE45, 0xCDCA, 0xAE46, 0xCDCB, 0xAE47, 0xCDCD, 0xAE48, 0xCDCE, + 0xAE49, 0xCDCF, 0xAE4A, 0xCDD1, 0xAE4B, 0xCDD2, 0xAE4C, 0xCDD3, + 0xAE4D, 0xCDD4, 0xAE4E, 0xCDD5, 0xAE4F, 0xCDD6, 0xAE50, 0xCDD7, + 0xAE51, 0xCDD8, 0xAE52, 0xCDD9, 0xAE53, 0xCDDA, 0xAE54, 0xCDDB, + 0xAE55, 0xCDDC, 0xAE56, 0xCDDD, 0xAE57, 0xCDDE, 0xAE58, 0xCDDF, + 0xAE59, 0xCDE0, 0xAE5A, 0xCDE1, 0xAE61, 0xCDE2, 0xAE62, 0xCDE3, + 0xAE63, 0xCDE4, 0xAE64, 0xCDE5, 0xAE65, 0xCDE6, 0xAE66, 0xCDE7, + 0xAE67, 0xCDE9, 0xAE68, 0xCDEA, 0xAE69, 0xCDEB, 0xAE6A, 0xCDED, + 0xAE6B, 0xCDEE, 0xAE6C, 0xCDEF, 0xAE6D, 0xCDF1, 0xAE6E, 0xCDF2, + 0xAE6F, 0xCDF3, 0xAE70, 0xCDF4, 0xAE71, 0xCDF5, 0xAE72, 0xCDF6, + 0xAE73, 0xCDF7, 0xAE74, 0xCDFA, 0xAE75, 0xCDFC, 0xAE76, 0xCDFE, + 0xAE77, 0xCDFF, 0xAE78, 0xCE00, 0xAE79, 0xCE01, 0xAE7A, 0xCE02, + 0xAE81, 0xCE03, 0xAE82, 0xCE05, 0xAE83, 0xCE06, 0xAE84, 0xCE07, + 0xAE85, 0xCE09, 0xAE86, 0xCE0A, 0xAE87, 0xCE0B, 0xAE88, 0xCE0D, + 0xAE89, 0xCE0E, 0xAE8A, 0xCE0F, 0xAE8B, 0xCE10, 0xAE8C, 0xCE11, + 0xAE8D, 0xCE12, 0xAE8E, 0xCE13, 0xAE8F, 0xCE15, 0xAE90, 0xCE16, + 0xAE91, 0xCE17, 0xAE92, 0xCE18, 0xAE93, 0xCE1A, 0xAE94, 0xCE1B, + 0xAE95, 0xCE1C, 0xAE96, 0xCE1D, 0xAE97, 0xCE1E, 0xAE98, 0xCE1F, + 0xAE99, 0xCE22, 0xAE9A, 0xCE23, 0xAE9B, 0xCE25, 0xAE9C, 0xCE26, + 0xAE9D, 0xCE27, 0xAE9E, 0xCE29, 0xAE9F, 0xCE2A, 0xAEA0, 0xCE2B, + 0xAF41, 0xCE2C, 0xAF42, 0xCE2D, 0xAF43, 0xCE2E, 0xAF44, 0xCE2F, + 0xAF45, 0xCE32, 0xAF46, 0xCE34, 0xAF47, 0xCE36, 0xAF48, 0xCE37, + 0xAF49, 0xCE38, 0xAF4A, 0xCE39, 0xAF4B, 0xCE3A, 0xAF4C, 0xCE3B, + 0xAF4D, 0xCE3C, 0xAF4E, 0xCE3D, 0xAF4F, 0xCE3E, 0xAF50, 0xCE3F, + 0xAF51, 0xCE40, 0xAF52, 0xCE41, 0xAF53, 0xCE42, 0xAF54, 0xCE43, + 0xAF55, 0xCE44, 0xAF56, 0xCE45, 0xAF57, 0xCE46, 0xAF58, 0xCE47, + 0xAF59, 0xCE48, 0xAF5A, 0xCE49, 0xAF61, 0xCE4A, 0xAF62, 0xCE4B, + 0xAF63, 0xCE4C, 0xAF64, 0xCE4D, 0xAF65, 0xCE4E, 0xAF66, 0xCE4F, + 0xAF67, 0xCE50, 0xAF68, 0xCE51, 0xAF69, 0xCE52, 0xAF6A, 0xCE53, + 0xAF6B, 0xCE54, 0xAF6C, 0xCE55, 0xAF6D, 0xCE56, 0xAF6E, 0xCE57, + 0xAF6F, 0xCE5A, 0xAF70, 0xCE5B, 0xAF71, 0xCE5D, 0xAF72, 0xCE5E, + 0xAF73, 0xCE62, 0xAF74, 0xCE63, 0xAF75, 0xCE64, 0xAF76, 0xCE65, + 0xAF77, 0xCE66, 0xAF78, 0xCE67, 0xAF79, 0xCE6A, 0xAF7A, 0xCE6C, + 0xAF81, 0xCE6E, 0xAF82, 0xCE6F, 0xAF83, 0xCE70, 0xAF84, 0xCE71, + 0xAF85, 0xCE72, 0xAF86, 0xCE73, 0xAF87, 0xCE76, 0xAF88, 0xCE77, + 0xAF89, 0xCE79, 0xAF8A, 0xCE7A, 0xAF8B, 0xCE7B, 0xAF8C, 0xCE7D, + 0xAF8D, 0xCE7E, 0xAF8E, 0xCE7F, 0xAF8F, 0xCE80, 0xAF90, 0xCE81, + 0xAF91, 0xCE82, 0xAF92, 0xCE83, 0xAF93, 0xCE86, 0xAF94, 0xCE88, + 0xAF95, 0xCE8A, 0xAF96, 0xCE8B, 0xAF97, 0xCE8C, 0xAF98, 0xCE8D, + 0xAF99, 0xCE8E, 0xAF9A, 0xCE8F, 0xAF9B, 0xCE92, 0xAF9C, 0xCE93, + 0xAF9D, 0xCE95, 0xAF9E, 0xCE96, 0xAF9F, 0xCE97, 0xAFA0, 0xCE99, + 0xB041, 0xCE9A, 0xB042, 0xCE9B, 0xB043, 0xCE9C, 0xB044, 0xCE9D, + 0xB045, 0xCE9E, 0xB046, 0xCE9F, 0xB047, 0xCEA2, 0xB048, 0xCEA6, + 0xB049, 0xCEA7, 0xB04A, 0xCEA8, 0xB04B, 0xCEA9, 0xB04C, 0xCEAA, + 0xB04D, 0xCEAB, 0xB04E, 0xCEAE, 0xB04F, 0xCEAF, 0xB050, 0xCEB0, + 0xB051, 0xCEB1, 0xB052, 0xCEB2, 0xB053, 0xCEB3, 0xB054, 0xCEB4, + 0xB055, 0xCEB5, 0xB056, 0xCEB6, 0xB057, 0xCEB7, 0xB058, 0xCEB8, + 0xB059, 0xCEB9, 0xB05A, 0xCEBA, 0xB061, 0xCEBB, 0xB062, 0xCEBC, + 0xB063, 0xCEBD, 0xB064, 0xCEBE, 0xB065, 0xCEBF, 0xB066, 0xCEC0, + 0xB067, 0xCEC2, 0xB068, 0xCEC3, 0xB069, 0xCEC4, 0xB06A, 0xCEC5, + 0xB06B, 0xCEC6, 0xB06C, 0xCEC7, 0xB06D, 0xCEC8, 0xB06E, 0xCEC9, + 0xB06F, 0xCECA, 0xB070, 0xCECB, 0xB071, 0xCECC, 0xB072, 0xCECD, + 0xB073, 0xCECE, 0xB074, 0xCECF, 0xB075, 0xCED0, 0xB076, 0xCED1, + 0xB077, 0xCED2, 0xB078, 0xCED3, 0xB079, 0xCED4, 0xB07A, 0xCED5, + 0xB081, 0xCED6, 0xB082, 0xCED7, 0xB083, 0xCED8, 0xB084, 0xCED9, + 0xB085, 0xCEDA, 0xB086, 0xCEDB, 0xB087, 0xCEDC, 0xB088, 0xCEDD, + 0xB089, 0xCEDE, 0xB08A, 0xCEDF, 0xB08B, 0xCEE0, 0xB08C, 0xCEE1, + 0xB08D, 0xCEE2, 0xB08E, 0xCEE3, 0xB08F, 0xCEE6, 0xB090, 0xCEE7, + 0xB091, 0xCEE9, 0xB092, 0xCEEA, 0xB093, 0xCEED, 0xB094, 0xCEEE, + 0xB095, 0xCEEF, 0xB096, 0xCEF0, 0xB097, 0xCEF1, 0xB098, 0xCEF2, + 0xB099, 0xCEF3, 0xB09A, 0xCEF6, 0xB09B, 0xCEFA, 0xB09C, 0xCEFB, + 0xB09D, 0xCEFC, 0xB09E, 0xCEFD, 0xB09F, 0xCEFE, 0xB0A0, 0xCEFF, + 0xB0A1, 0xAC00, 0xB0A2, 0xAC01, 0xB0A3, 0xAC04, 0xB0A4, 0xAC07, + 0xB0A5, 0xAC08, 0xB0A6, 0xAC09, 0xB0A7, 0xAC0A, 0xB0A8, 0xAC10, + 0xB0A9, 0xAC11, 0xB0AA, 0xAC12, 0xB0AB, 0xAC13, 0xB0AC, 0xAC14, + 0xB0AD, 0xAC15, 0xB0AE, 0xAC16, 0xB0AF, 0xAC17, 0xB0B0, 0xAC19, + 0xB0B1, 0xAC1A, 0xB0B2, 0xAC1B, 0xB0B3, 0xAC1C, 0xB0B4, 0xAC1D, + 0xB0B5, 0xAC20, 0xB0B6, 0xAC24, 0xB0B7, 0xAC2C, 0xB0B8, 0xAC2D, + 0xB0B9, 0xAC2F, 0xB0BA, 0xAC30, 0xB0BB, 0xAC31, 0xB0BC, 0xAC38, + 0xB0BD, 0xAC39, 0xB0BE, 0xAC3C, 0xB0BF, 0xAC40, 0xB0C0, 0xAC4B, + 0xB0C1, 0xAC4D, 0xB0C2, 0xAC54, 0xB0C3, 0xAC58, 0xB0C4, 0xAC5C, + 0xB0C5, 0xAC70, 0xB0C6, 0xAC71, 0xB0C7, 0xAC74, 0xB0C8, 0xAC77, + 0xB0C9, 0xAC78, 0xB0CA, 0xAC7A, 0xB0CB, 0xAC80, 0xB0CC, 0xAC81, + 0xB0CD, 0xAC83, 0xB0CE, 0xAC84, 0xB0CF, 0xAC85, 0xB0D0, 0xAC86, + 0xB0D1, 0xAC89, 0xB0D2, 0xAC8A, 0xB0D3, 0xAC8B, 0xB0D4, 0xAC8C, + 0xB0D5, 0xAC90, 0xB0D6, 0xAC94, 0xB0D7, 0xAC9C, 0xB0D8, 0xAC9D, + 0xB0D9, 0xAC9F, 0xB0DA, 0xACA0, 0xB0DB, 0xACA1, 0xB0DC, 0xACA8, + 0xB0DD, 0xACA9, 0xB0DE, 0xACAA, 0xB0DF, 0xACAC, 0xB0E0, 0xACAF, + 0xB0E1, 0xACB0, 0xB0E2, 0xACB8, 0xB0E3, 0xACB9, 0xB0E4, 0xACBB, + 0xB0E5, 0xACBC, 0xB0E6, 0xACBD, 0xB0E7, 0xACC1, 0xB0E8, 0xACC4, + 0xB0E9, 0xACC8, 0xB0EA, 0xACCC, 0xB0EB, 0xACD5, 0xB0EC, 0xACD7, + 0xB0ED, 0xACE0, 0xB0EE, 0xACE1, 0xB0EF, 0xACE4, 0xB0F0, 0xACE7, + 0xB0F1, 0xACE8, 0xB0F2, 0xACEA, 0xB0F3, 0xACEC, 0xB0F4, 0xACEF, + 0xB0F5, 0xACF0, 0xB0F6, 0xACF1, 0xB0F7, 0xACF3, 0xB0F8, 0xACF5, + 0xB0F9, 0xACF6, 0xB0FA, 0xACFC, 0xB0FB, 0xACFD, 0xB0FC, 0xAD00, + 0xB0FD, 0xAD04, 0xB0FE, 0xAD06, 0xB141, 0xCF02, 0xB142, 0xCF03, + 0xB143, 0xCF05, 0xB144, 0xCF06, 0xB145, 0xCF07, 0xB146, 0xCF09, + 0xB147, 0xCF0A, 0xB148, 0xCF0B, 0xB149, 0xCF0C, 0xB14A, 0xCF0D, + 0xB14B, 0xCF0E, 0xB14C, 0xCF0F, 0xB14D, 0xCF12, 0xB14E, 0xCF14, + 0xB14F, 0xCF16, 0xB150, 0xCF17, 0xB151, 0xCF18, 0xB152, 0xCF19, + 0xB153, 0xCF1A, 0xB154, 0xCF1B, 0xB155, 0xCF1D, 0xB156, 0xCF1E, + 0xB157, 0xCF1F, 0xB158, 0xCF21, 0xB159, 0xCF22, 0xB15A, 0xCF23, + 0xB161, 0xCF25, 0xB162, 0xCF26, 0xB163, 0xCF27, 0xB164, 0xCF28, + 0xB165, 0xCF29, 0xB166, 0xCF2A, 0xB167, 0xCF2B, 0xB168, 0xCF2E, + 0xB169, 0xCF32, 0xB16A, 0xCF33, 0xB16B, 0xCF34, 0xB16C, 0xCF35, + 0xB16D, 0xCF36, 0xB16E, 0xCF37, 0xB16F, 0xCF39, 0xB170, 0xCF3A, + 0xB171, 0xCF3B, 0xB172, 0xCF3C, 0xB173, 0xCF3D, 0xB174, 0xCF3E, + 0xB175, 0xCF3F, 0xB176, 0xCF40, 0xB177, 0xCF41, 0xB178, 0xCF42, + 0xB179, 0xCF43, 0xB17A, 0xCF44, 0xB181, 0xCF45, 0xB182, 0xCF46, + 0xB183, 0xCF47, 0xB184, 0xCF48, 0xB185, 0xCF49, 0xB186, 0xCF4A, + 0xB187, 0xCF4B, 0xB188, 0xCF4C, 0xB189, 0xCF4D, 0xB18A, 0xCF4E, + 0xB18B, 0xCF4F, 0xB18C, 0xCF50, 0xB18D, 0xCF51, 0xB18E, 0xCF52, + 0xB18F, 0xCF53, 0xB190, 0xCF56, 0xB191, 0xCF57, 0xB192, 0xCF59, + 0xB193, 0xCF5A, 0xB194, 0xCF5B, 0xB195, 0xCF5D, 0xB196, 0xCF5E, + 0xB197, 0xCF5F, 0xB198, 0xCF60, 0xB199, 0xCF61, 0xB19A, 0xCF62, + 0xB19B, 0xCF63, 0xB19C, 0xCF66, 0xB19D, 0xCF68, 0xB19E, 0xCF6A, + 0xB19F, 0xCF6B, 0xB1A0, 0xCF6C, 0xB1A1, 0xAD0C, 0xB1A2, 0xAD0D, + 0xB1A3, 0xAD0F, 0xB1A4, 0xAD11, 0xB1A5, 0xAD18, 0xB1A6, 0xAD1C, + 0xB1A7, 0xAD20, 0xB1A8, 0xAD29, 0xB1A9, 0xAD2C, 0xB1AA, 0xAD2D, + 0xB1AB, 0xAD34, 0xB1AC, 0xAD35, 0xB1AD, 0xAD38, 0xB1AE, 0xAD3C, + 0xB1AF, 0xAD44, 0xB1B0, 0xAD45, 0xB1B1, 0xAD47, 0xB1B2, 0xAD49, + 0xB1B3, 0xAD50, 0xB1B4, 0xAD54, 0xB1B5, 0xAD58, 0xB1B6, 0xAD61, + 0xB1B7, 0xAD63, 0xB1B8, 0xAD6C, 0xB1B9, 0xAD6D, 0xB1BA, 0xAD70, + 0xB1BB, 0xAD73, 0xB1BC, 0xAD74, 0xB1BD, 0xAD75, 0xB1BE, 0xAD76, + 0xB1BF, 0xAD7B, 0xB1C0, 0xAD7C, 0xB1C1, 0xAD7D, 0xB1C2, 0xAD7F, + 0xB1C3, 0xAD81, 0xB1C4, 0xAD82, 0xB1C5, 0xAD88, 0xB1C6, 0xAD89, + 0xB1C7, 0xAD8C, 0xB1C8, 0xAD90, 0xB1C9, 0xAD9C, 0xB1CA, 0xAD9D, + 0xB1CB, 0xADA4, 0xB1CC, 0xADB7, 0xB1CD, 0xADC0, 0xB1CE, 0xADC1, + 0xB1CF, 0xADC4, 0xB1D0, 0xADC8, 0xB1D1, 0xADD0, 0xB1D2, 0xADD1, + 0xB1D3, 0xADD3, 0xB1D4, 0xADDC, 0xB1D5, 0xADE0, 0xB1D6, 0xADE4, + 0xB1D7, 0xADF8, 0xB1D8, 0xADF9, 0xB1D9, 0xADFC, 0xB1DA, 0xADFF, + 0xB1DB, 0xAE00, 0xB1DC, 0xAE01, 0xB1DD, 0xAE08, 0xB1DE, 0xAE09, + 0xB1DF, 0xAE0B, 0xB1E0, 0xAE0D, 0xB1E1, 0xAE14, 0xB1E2, 0xAE30, + 0xB1E3, 0xAE31, 0xB1E4, 0xAE34, 0xB1E5, 0xAE37, 0xB1E6, 0xAE38, + 0xB1E7, 0xAE3A, 0xB1E8, 0xAE40, 0xB1E9, 0xAE41, 0xB1EA, 0xAE43, + 0xB1EB, 0xAE45, 0xB1EC, 0xAE46, 0xB1ED, 0xAE4A, 0xB1EE, 0xAE4C, + 0xB1EF, 0xAE4D, 0xB1F0, 0xAE4E, 0xB1F1, 0xAE50, 0xB1F2, 0xAE54, + 0xB1F3, 0xAE56, 0xB1F4, 0xAE5C, 0xB1F5, 0xAE5D, 0xB1F6, 0xAE5F, + 0xB1F7, 0xAE60, 0xB1F8, 0xAE61, 0xB1F9, 0xAE65, 0xB1FA, 0xAE68, + 0xB1FB, 0xAE69, 0xB1FC, 0xAE6C, 0xB1FD, 0xAE70, 0xB1FE, 0xAE78, + 0xB241, 0xCF6D, 0xB242, 0xCF6E, 0xB243, 0xCF6F, 0xB244, 0xCF72, + 0xB245, 0xCF73, 0xB246, 0xCF75, 0xB247, 0xCF76, 0xB248, 0xCF77, + 0xB249, 0xCF79, 0xB24A, 0xCF7A, 0xB24B, 0xCF7B, 0xB24C, 0xCF7C, + 0xB24D, 0xCF7D, 0xB24E, 0xCF7E, 0xB24F, 0xCF7F, 0xB250, 0xCF81, + 0xB251, 0xCF82, 0xB252, 0xCF83, 0xB253, 0xCF84, 0xB254, 0xCF86, + 0xB255, 0xCF87, 0xB256, 0xCF88, 0xB257, 0xCF89, 0xB258, 0xCF8A, + 0xB259, 0xCF8B, 0xB25A, 0xCF8D, 0xB261, 0xCF8E, 0xB262, 0xCF8F, + 0xB263, 0xCF90, 0xB264, 0xCF91, 0xB265, 0xCF92, 0xB266, 0xCF93, + 0xB267, 0xCF94, 0xB268, 0xCF95, 0xB269, 0xCF96, 0xB26A, 0xCF97, + 0xB26B, 0xCF98, 0xB26C, 0xCF99, 0xB26D, 0xCF9A, 0xB26E, 0xCF9B, + 0xB26F, 0xCF9C, 0xB270, 0xCF9D, 0xB271, 0xCF9E, 0xB272, 0xCF9F, + 0xB273, 0xCFA0, 0xB274, 0xCFA2, 0xB275, 0xCFA3, 0xB276, 0xCFA4, + 0xB277, 0xCFA5, 0xB278, 0xCFA6, 0xB279, 0xCFA7, 0xB27A, 0xCFA9, + 0xB281, 0xCFAA, 0xB282, 0xCFAB, 0xB283, 0xCFAC, 0xB284, 0xCFAD, + 0xB285, 0xCFAE, 0xB286, 0xCFAF, 0xB287, 0xCFB1, 0xB288, 0xCFB2, + 0xB289, 0xCFB3, 0xB28A, 0xCFB4, 0xB28B, 0xCFB5, 0xB28C, 0xCFB6, + 0xB28D, 0xCFB7, 0xB28E, 0xCFB8, 0xB28F, 0xCFB9, 0xB290, 0xCFBA, + 0xB291, 0xCFBB, 0xB292, 0xCFBC, 0xB293, 0xCFBD, 0xB294, 0xCFBE, + 0xB295, 0xCFBF, 0xB296, 0xCFC0, 0xB297, 0xCFC1, 0xB298, 0xCFC2, + 0xB299, 0xCFC3, 0xB29A, 0xCFC5, 0xB29B, 0xCFC6, 0xB29C, 0xCFC7, + 0xB29D, 0xCFC8, 0xB29E, 0xCFC9, 0xB29F, 0xCFCA, 0xB2A0, 0xCFCB, + 0xB2A1, 0xAE79, 0xB2A2, 0xAE7B, 0xB2A3, 0xAE7C, 0xB2A4, 0xAE7D, + 0xB2A5, 0xAE84, 0xB2A6, 0xAE85, 0xB2A7, 0xAE8C, 0xB2A8, 0xAEBC, + 0xB2A9, 0xAEBD, 0xB2AA, 0xAEBE, 0xB2AB, 0xAEC0, 0xB2AC, 0xAEC4, + 0xB2AD, 0xAECC, 0xB2AE, 0xAECD, 0xB2AF, 0xAECF, 0xB2B0, 0xAED0, + 0xB2B1, 0xAED1, 0xB2B2, 0xAED8, 0xB2B3, 0xAED9, 0xB2B4, 0xAEDC, + 0xB2B5, 0xAEE8, 0xB2B6, 0xAEEB, 0xB2B7, 0xAEED, 0xB2B8, 0xAEF4, + 0xB2B9, 0xAEF8, 0xB2BA, 0xAEFC, 0xB2BB, 0xAF07, 0xB2BC, 0xAF08, + 0xB2BD, 0xAF0D, 0xB2BE, 0xAF10, 0xB2BF, 0xAF2C, 0xB2C0, 0xAF2D, + 0xB2C1, 0xAF30, 0xB2C2, 0xAF32, 0xB2C3, 0xAF34, 0xB2C4, 0xAF3C, + 0xB2C5, 0xAF3D, 0xB2C6, 0xAF3F, 0xB2C7, 0xAF41, 0xB2C8, 0xAF42, + 0xB2C9, 0xAF43, 0xB2CA, 0xAF48, 0xB2CB, 0xAF49, 0xB2CC, 0xAF50, + 0xB2CD, 0xAF5C, 0xB2CE, 0xAF5D, 0xB2CF, 0xAF64, 0xB2D0, 0xAF65, + 0xB2D1, 0xAF79, 0xB2D2, 0xAF80, 0xB2D3, 0xAF84, 0xB2D4, 0xAF88, + 0xB2D5, 0xAF90, 0xB2D6, 0xAF91, 0xB2D7, 0xAF95, 0xB2D8, 0xAF9C, + 0xB2D9, 0xAFB8, 0xB2DA, 0xAFB9, 0xB2DB, 0xAFBC, 0xB2DC, 0xAFC0, + 0xB2DD, 0xAFC7, 0xB2DE, 0xAFC8, 0xB2DF, 0xAFC9, 0xB2E0, 0xAFCB, + 0xB2E1, 0xAFCD, 0xB2E2, 0xAFCE, 0xB2E3, 0xAFD4, 0xB2E4, 0xAFDC, + 0xB2E5, 0xAFE8, 0xB2E6, 0xAFE9, 0xB2E7, 0xAFF0, 0xB2E8, 0xAFF1, + 0xB2E9, 0xAFF4, 0xB2EA, 0xAFF8, 0xB2EB, 0xB000, 0xB2EC, 0xB001, + 0xB2ED, 0xB004, 0xB2EE, 0xB00C, 0xB2EF, 0xB010, 0xB2F0, 0xB014, + 0xB2F1, 0xB01C, 0xB2F2, 0xB01D, 0xB2F3, 0xB028, 0xB2F4, 0xB044, + 0xB2F5, 0xB045, 0xB2F6, 0xB048, 0xB2F7, 0xB04A, 0xB2F8, 0xB04C, + 0xB2F9, 0xB04E, 0xB2FA, 0xB053, 0xB2FB, 0xB054, 0xB2FC, 0xB055, + 0xB2FD, 0xB057, 0xB2FE, 0xB059, 0xB341, 0xCFCC, 0xB342, 0xCFCD, + 0xB343, 0xCFCE, 0xB344, 0xCFCF, 0xB345, 0xCFD0, 0xB346, 0xCFD1, + 0xB347, 0xCFD2, 0xB348, 0xCFD3, 0xB349, 0xCFD4, 0xB34A, 0xCFD5, + 0xB34B, 0xCFD6, 0xB34C, 0xCFD7, 0xB34D, 0xCFD8, 0xB34E, 0xCFD9, + 0xB34F, 0xCFDA, 0xB350, 0xCFDB, 0xB351, 0xCFDC, 0xB352, 0xCFDD, + 0xB353, 0xCFDE, 0xB354, 0xCFDF, 0xB355, 0xCFE2, 0xB356, 0xCFE3, + 0xB357, 0xCFE5, 0xB358, 0xCFE6, 0xB359, 0xCFE7, 0xB35A, 0xCFE9, + 0xB361, 0xCFEA, 0xB362, 0xCFEB, 0xB363, 0xCFEC, 0xB364, 0xCFED, + 0xB365, 0xCFEE, 0xB366, 0xCFEF, 0xB367, 0xCFF2, 0xB368, 0xCFF4, + 0xB369, 0xCFF6, 0xB36A, 0xCFF7, 0xB36B, 0xCFF8, 0xB36C, 0xCFF9, + 0xB36D, 0xCFFA, 0xB36E, 0xCFFB, 0xB36F, 0xCFFD, 0xB370, 0xCFFE, + 0xB371, 0xCFFF, 0xB372, 0xD001, 0xB373, 0xD002, 0xB374, 0xD003, + 0xB375, 0xD005, 0xB376, 0xD006, 0xB377, 0xD007, 0xB378, 0xD008, + 0xB379, 0xD009, 0xB37A, 0xD00A, 0xB381, 0xD00B, 0xB382, 0xD00C, + 0xB383, 0xD00D, 0xB384, 0xD00E, 0xB385, 0xD00F, 0xB386, 0xD010, + 0xB387, 0xD012, 0xB388, 0xD013, 0xB389, 0xD014, 0xB38A, 0xD015, + 0xB38B, 0xD016, 0xB38C, 0xD017, 0xB38D, 0xD019, 0xB38E, 0xD01A, + 0xB38F, 0xD01B, 0xB390, 0xD01C, 0xB391, 0xD01D, 0xB392, 0xD01E, + 0xB393, 0xD01F, 0xB394, 0xD020, 0xB395, 0xD021, 0xB396, 0xD022, + 0xB397, 0xD023, 0xB398, 0xD024, 0xB399, 0xD025, 0xB39A, 0xD026, + 0xB39B, 0xD027, 0xB39C, 0xD028, 0xB39D, 0xD029, 0xB39E, 0xD02A, + 0xB39F, 0xD02B, 0xB3A0, 0xD02C, 0xB3A1, 0xB05D, 0xB3A2, 0xB07C, + 0xB3A3, 0xB07D, 0xB3A4, 0xB080, 0xB3A5, 0xB084, 0xB3A6, 0xB08C, + 0xB3A7, 0xB08D, 0xB3A8, 0xB08F, 0xB3A9, 0xB091, 0xB3AA, 0xB098, + 0xB3AB, 0xB099, 0xB3AC, 0xB09A, 0xB3AD, 0xB09C, 0xB3AE, 0xB09F, + 0xB3AF, 0xB0A0, 0xB3B0, 0xB0A1, 0xB3B1, 0xB0A2, 0xB3B2, 0xB0A8, + 0xB3B3, 0xB0A9, 0xB3B4, 0xB0AB, 0xB3B5, 0xB0AC, 0xB3B6, 0xB0AD, + 0xB3B7, 0xB0AE, 0xB3B8, 0xB0AF, 0xB3B9, 0xB0B1, 0xB3BA, 0xB0B3, + 0xB3BB, 0xB0B4, 0xB3BC, 0xB0B5, 0xB3BD, 0xB0B8, 0xB3BE, 0xB0BC, + 0xB3BF, 0xB0C4, 0xB3C0, 0xB0C5, 0xB3C1, 0xB0C7, 0xB3C2, 0xB0C8, + 0xB3C3, 0xB0C9, 0xB3C4, 0xB0D0, 0xB3C5, 0xB0D1, 0xB3C6, 0xB0D4, + 0xB3C7, 0xB0D8, 0xB3C8, 0xB0E0, 0xB3C9, 0xB0E5, 0xB3CA, 0xB108, + 0xB3CB, 0xB109, 0xB3CC, 0xB10B, 0xB3CD, 0xB10C, 0xB3CE, 0xB110, + 0xB3CF, 0xB112, 0xB3D0, 0xB113, 0xB3D1, 0xB118, 0xB3D2, 0xB119, + 0xB3D3, 0xB11B, 0xB3D4, 0xB11C, 0xB3D5, 0xB11D, 0xB3D6, 0xB123, + 0xB3D7, 0xB124, 0xB3D8, 0xB125, 0xB3D9, 0xB128, 0xB3DA, 0xB12C, + 0xB3DB, 0xB134, 0xB3DC, 0xB135, 0xB3DD, 0xB137, 0xB3DE, 0xB138, + 0xB3DF, 0xB139, 0xB3E0, 0xB140, 0xB3E1, 0xB141, 0xB3E2, 0xB144, + 0xB3E3, 0xB148, 0xB3E4, 0xB150, 0xB3E5, 0xB151, 0xB3E6, 0xB154, + 0xB3E7, 0xB155, 0xB3E8, 0xB158, 0xB3E9, 0xB15C, 0xB3EA, 0xB160, + 0xB3EB, 0xB178, 0xB3EC, 0xB179, 0xB3ED, 0xB17C, 0xB3EE, 0xB180, + 0xB3EF, 0xB182, 0xB3F0, 0xB188, 0xB3F1, 0xB189, 0xB3F2, 0xB18B, + 0xB3F3, 0xB18D, 0xB3F4, 0xB192, 0xB3F5, 0xB193, 0xB3F6, 0xB194, + 0xB3F7, 0xB198, 0xB3F8, 0xB19C, 0xB3F9, 0xB1A8, 0xB3FA, 0xB1CC, + 0xB3FB, 0xB1D0, 0xB3FC, 0xB1D4, 0xB3FD, 0xB1DC, 0xB3FE, 0xB1DD, + 0xB441, 0xD02E, 0xB442, 0xD02F, 0xB443, 0xD030, 0xB444, 0xD031, + 0xB445, 0xD032, 0xB446, 0xD033, 0xB447, 0xD036, 0xB448, 0xD037, + 0xB449, 0xD039, 0xB44A, 0xD03A, 0xB44B, 0xD03B, 0xB44C, 0xD03D, + 0xB44D, 0xD03E, 0xB44E, 0xD03F, 0xB44F, 0xD040, 0xB450, 0xD041, + 0xB451, 0xD042, 0xB452, 0xD043, 0xB453, 0xD046, 0xB454, 0xD048, + 0xB455, 0xD04A, 0xB456, 0xD04B, 0xB457, 0xD04C, 0xB458, 0xD04D, + 0xB459, 0xD04E, 0xB45A, 0xD04F, 0xB461, 0xD051, 0xB462, 0xD052, + 0xB463, 0xD053, 0xB464, 0xD055, 0xB465, 0xD056, 0xB466, 0xD057, + 0xB467, 0xD059, 0xB468, 0xD05A, 0xB469, 0xD05B, 0xB46A, 0xD05C, + 0xB46B, 0xD05D, 0xB46C, 0xD05E, 0xB46D, 0xD05F, 0xB46E, 0xD061, + 0xB46F, 0xD062, 0xB470, 0xD063, 0xB471, 0xD064, 0xB472, 0xD065, + 0xB473, 0xD066, 0xB474, 0xD067, 0xB475, 0xD068, 0xB476, 0xD069, + 0xB477, 0xD06A, 0xB478, 0xD06B, 0xB479, 0xD06E, 0xB47A, 0xD06F, + 0xB481, 0xD071, 0xB482, 0xD072, 0xB483, 0xD073, 0xB484, 0xD075, + 0xB485, 0xD076, 0xB486, 0xD077, 0xB487, 0xD078, 0xB488, 0xD079, + 0xB489, 0xD07A, 0xB48A, 0xD07B, 0xB48B, 0xD07E, 0xB48C, 0xD07F, + 0xB48D, 0xD080, 0xB48E, 0xD082, 0xB48F, 0xD083, 0xB490, 0xD084, + 0xB491, 0xD085, 0xB492, 0xD086, 0xB493, 0xD087, 0xB494, 0xD088, + 0xB495, 0xD089, 0xB496, 0xD08A, 0xB497, 0xD08B, 0xB498, 0xD08C, + 0xB499, 0xD08D, 0xB49A, 0xD08E, 0xB49B, 0xD08F, 0xB49C, 0xD090, + 0xB49D, 0xD091, 0xB49E, 0xD092, 0xB49F, 0xD093, 0xB4A0, 0xD094, + 0xB4A1, 0xB1DF, 0xB4A2, 0xB1E8, 0xB4A3, 0xB1E9, 0xB4A4, 0xB1EC, + 0xB4A5, 0xB1F0, 0xB4A6, 0xB1F9, 0xB4A7, 0xB1FB, 0xB4A8, 0xB1FD, + 0xB4A9, 0xB204, 0xB4AA, 0xB205, 0xB4AB, 0xB208, 0xB4AC, 0xB20B, + 0xB4AD, 0xB20C, 0xB4AE, 0xB214, 0xB4AF, 0xB215, 0xB4B0, 0xB217, + 0xB4B1, 0xB219, 0xB4B2, 0xB220, 0xB4B3, 0xB234, 0xB4B4, 0xB23C, + 0xB4B5, 0xB258, 0xB4B6, 0xB25C, 0xB4B7, 0xB260, 0xB4B8, 0xB268, + 0xB4B9, 0xB269, 0xB4BA, 0xB274, 0xB4BB, 0xB275, 0xB4BC, 0xB27C, + 0xB4BD, 0xB284, 0xB4BE, 0xB285, 0xB4BF, 0xB289, 0xB4C0, 0xB290, + 0xB4C1, 0xB291, 0xB4C2, 0xB294, 0xB4C3, 0xB298, 0xB4C4, 0xB299, + 0xB4C5, 0xB29A, 0xB4C6, 0xB2A0, 0xB4C7, 0xB2A1, 0xB4C8, 0xB2A3, + 0xB4C9, 0xB2A5, 0xB4CA, 0xB2A6, 0xB4CB, 0xB2AA, 0xB4CC, 0xB2AC, + 0xB4CD, 0xB2B0, 0xB4CE, 0xB2B4, 0xB4CF, 0xB2C8, 0xB4D0, 0xB2C9, + 0xB4D1, 0xB2CC, 0xB4D2, 0xB2D0, 0xB4D3, 0xB2D2, 0xB4D4, 0xB2D8, + 0xB4D5, 0xB2D9, 0xB4D6, 0xB2DB, 0xB4D7, 0xB2DD, 0xB4D8, 0xB2E2, + 0xB4D9, 0xB2E4, 0xB4DA, 0xB2E5, 0xB4DB, 0xB2E6, 0xB4DC, 0xB2E8, + 0xB4DD, 0xB2EB, 0xB4DE, 0xB2EC, 0xB4DF, 0xB2ED, 0xB4E0, 0xB2EE, + 0xB4E1, 0xB2EF, 0xB4E2, 0xB2F3, 0xB4E3, 0xB2F4, 0xB4E4, 0xB2F5, + 0xB4E5, 0xB2F7, 0xB4E6, 0xB2F8, 0xB4E7, 0xB2F9, 0xB4E8, 0xB2FA, + 0xB4E9, 0xB2FB, 0xB4EA, 0xB2FF, 0xB4EB, 0xB300, 0xB4EC, 0xB301, + 0xB4ED, 0xB304, 0xB4EE, 0xB308, 0xB4EF, 0xB310, 0xB4F0, 0xB311, + 0xB4F1, 0xB313, 0xB4F2, 0xB314, 0xB4F3, 0xB315, 0xB4F4, 0xB31C, + 0xB4F5, 0xB354, 0xB4F6, 0xB355, 0xB4F7, 0xB356, 0xB4F8, 0xB358, + 0xB4F9, 0xB35B, 0xB4FA, 0xB35C, 0xB4FB, 0xB35E, 0xB4FC, 0xB35F, + 0xB4FD, 0xB364, 0xB4FE, 0xB365, 0xB541, 0xD095, 0xB542, 0xD096, + 0xB543, 0xD097, 0xB544, 0xD098, 0xB545, 0xD099, 0xB546, 0xD09A, + 0xB547, 0xD09B, 0xB548, 0xD09C, 0xB549, 0xD09D, 0xB54A, 0xD09E, + 0xB54B, 0xD09F, 0xB54C, 0xD0A0, 0xB54D, 0xD0A1, 0xB54E, 0xD0A2, + 0xB54F, 0xD0A3, 0xB550, 0xD0A6, 0xB551, 0xD0A7, 0xB552, 0xD0A9, + 0xB553, 0xD0AA, 0xB554, 0xD0AB, 0xB555, 0xD0AD, 0xB556, 0xD0AE, + 0xB557, 0xD0AF, 0xB558, 0xD0B0, 0xB559, 0xD0B1, 0xB55A, 0xD0B2, + 0xB561, 0xD0B3, 0xB562, 0xD0B6, 0xB563, 0xD0B8, 0xB564, 0xD0BA, + 0xB565, 0xD0BB, 0xB566, 0xD0BC, 0xB567, 0xD0BD, 0xB568, 0xD0BE, + 0xB569, 0xD0BF, 0xB56A, 0xD0C2, 0xB56B, 0xD0C3, 0xB56C, 0xD0C5, + 0xB56D, 0xD0C6, 0xB56E, 0xD0C7, 0xB56F, 0xD0CA, 0xB570, 0xD0CB, + 0xB571, 0xD0CC, 0xB572, 0xD0CD, 0xB573, 0xD0CE, 0xB574, 0xD0CF, + 0xB575, 0xD0D2, 0xB576, 0xD0D6, 0xB577, 0xD0D7, 0xB578, 0xD0D8, + 0xB579, 0xD0D9, 0xB57A, 0xD0DA, 0xB581, 0xD0DB, 0xB582, 0xD0DE, + 0xB583, 0xD0DF, 0xB584, 0xD0E1, 0xB585, 0xD0E2, 0xB586, 0xD0E3, + 0xB587, 0xD0E5, 0xB588, 0xD0E6, 0xB589, 0xD0E7, 0xB58A, 0xD0E8, + 0xB58B, 0xD0E9, 0xB58C, 0xD0EA, 0xB58D, 0xD0EB, 0xB58E, 0xD0EE, + 0xB58F, 0xD0F2, 0xB590, 0xD0F3, 0xB591, 0xD0F4, 0xB592, 0xD0F5, + 0xB593, 0xD0F6, 0xB594, 0xD0F7, 0xB595, 0xD0F9, 0xB596, 0xD0FA, + 0xB597, 0xD0FB, 0xB598, 0xD0FC, 0xB599, 0xD0FD, 0xB59A, 0xD0FE, + 0xB59B, 0xD0FF, 0xB59C, 0xD100, 0xB59D, 0xD101, 0xB59E, 0xD102, + 0xB59F, 0xD103, 0xB5A0, 0xD104, 0xB5A1, 0xB367, 0xB5A2, 0xB369, + 0xB5A3, 0xB36B, 0xB5A4, 0xB36E, 0xB5A5, 0xB370, 0xB5A6, 0xB371, + 0xB5A7, 0xB374, 0xB5A8, 0xB378, 0xB5A9, 0xB380, 0xB5AA, 0xB381, + 0xB5AB, 0xB383, 0xB5AC, 0xB384, 0xB5AD, 0xB385, 0xB5AE, 0xB38C, + 0xB5AF, 0xB390, 0xB5B0, 0xB394, 0xB5B1, 0xB3A0, 0xB5B2, 0xB3A1, + 0xB5B3, 0xB3A8, 0xB5B4, 0xB3AC, 0xB5B5, 0xB3C4, 0xB5B6, 0xB3C5, + 0xB5B7, 0xB3C8, 0xB5B8, 0xB3CB, 0xB5B9, 0xB3CC, 0xB5BA, 0xB3CE, + 0xB5BB, 0xB3D0, 0xB5BC, 0xB3D4, 0xB5BD, 0xB3D5, 0xB5BE, 0xB3D7, + 0xB5BF, 0xB3D9, 0xB5C0, 0xB3DB, 0xB5C1, 0xB3DD, 0xB5C2, 0xB3E0, + 0xB5C3, 0xB3E4, 0xB5C4, 0xB3E8, 0xB5C5, 0xB3FC, 0xB5C6, 0xB410, + 0xB5C7, 0xB418, 0xB5C8, 0xB41C, 0xB5C9, 0xB420, 0xB5CA, 0xB428, + 0xB5CB, 0xB429, 0xB5CC, 0xB42B, 0xB5CD, 0xB434, 0xB5CE, 0xB450, + 0xB5CF, 0xB451, 0xB5D0, 0xB454, 0xB5D1, 0xB458, 0xB5D2, 0xB460, + 0xB5D3, 0xB461, 0xB5D4, 0xB463, 0xB5D5, 0xB465, 0xB5D6, 0xB46C, + 0xB5D7, 0xB480, 0xB5D8, 0xB488, 0xB5D9, 0xB49D, 0xB5DA, 0xB4A4, + 0xB5DB, 0xB4A8, 0xB5DC, 0xB4AC, 0xB5DD, 0xB4B5, 0xB5DE, 0xB4B7, + 0xB5DF, 0xB4B9, 0xB5E0, 0xB4C0, 0xB5E1, 0xB4C4, 0xB5E2, 0xB4C8, + 0xB5E3, 0xB4D0, 0xB5E4, 0xB4D5, 0xB5E5, 0xB4DC, 0xB5E6, 0xB4DD, + 0xB5E7, 0xB4E0, 0xB5E8, 0xB4E3, 0xB5E9, 0xB4E4, 0xB5EA, 0xB4E6, + 0xB5EB, 0xB4EC, 0xB5EC, 0xB4ED, 0xB5ED, 0xB4EF, 0xB5EE, 0xB4F1, + 0xB5EF, 0xB4F8, 0xB5F0, 0xB514, 0xB5F1, 0xB515, 0xB5F2, 0xB518, + 0xB5F3, 0xB51B, 0xB5F4, 0xB51C, 0xB5F5, 0xB524, 0xB5F6, 0xB525, + 0xB5F7, 0xB527, 0xB5F8, 0xB528, 0xB5F9, 0xB529, 0xB5FA, 0xB52A, + 0xB5FB, 0xB530, 0xB5FC, 0xB531, 0xB5FD, 0xB534, 0xB5FE, 0xB538, + 0xB641, 0xD105, 0xB642, 0xD106, 0xB643, 0xD107, 0xB644, 0xD108, + 0xB645, 0xD109, 0xB646, 0xD10A, 0xB647, 0xD10B, 0xB648, 0xD10C, + 0xB649, 0xD10E, 0xB64A, 0xD10F, 0xB64B, 0xD110, 0xB64C, 0xD111, + 0xB64D, 0xD112, 0xB64E, 0xD113, 0xB64F, 0xD114, 0xB650, 0xD115, + 0xB651, 0xD116, 0xB652, 0xD117, 0xB653, 0xD118, 0xB654, 0xD119, + 0xB655, 0xD11A, 0xB656, 0xD11B, 0xB657, 0xD11C, 0xB658, 0xD11D, + 0xB659, 0xD11E, 0xB65A, 0xD11F, 0xB661, 0xD120, 0xB662, 0xD121, + 0xB663, 0xD122, 0xB664, 0xD123, 0xB665, 0xD124, 0xB666, 0xD125, + 0xB667, 0xD126, 0xB668, 0xD127, 0xB669, 0xD128, 0xB66A, 0xD129, + 0xB66B, 0xD12A, 0xB66C, 0xD12B, 0xB66D, 0xD12C, 0xB66E, 0xD12D, + 0xB66F, 0xD12E, 0xB670, 0xD12F, 0xB671, 0xD132, 0xB672, 0xD133, + 0xB673, 0xD135, 0xB674, 0xD136, 0xB675, 0xD137, 0xB676, 0xD139, + 0xB677, 0xD13B, 0xB678, 0xD13C, 0xB679, 0xD13D, 0xB67A, 0xD13E, + 0xB681, 0xD13F, 0xB682, 0xD142, 0xB683, 0xD146, 0xB684, 0xD147, + 0xB685, 0xD148, 0xB686, 0xD149, 0xB687, 0xD14A, 0xB688, 0xD14B, + 0xB689, 0xD14E, 0xB68A, 0xD14F, 0xB68B, 0xD151, 0xB68C, 0xD152, + 0xB68D, 0xD153, 0xB68E, 0xD155, 0xB68F, 0xD156, 0xB690, 0xD157, + 0xB691, 0xD158, 0xB692, 0xD159, 0xB693, 0xD15A, 0xB694, 0xD15B, + 0xB695, 0xD15E, 0xB696, 0xD160, 0xB697, 0xD162, 0xB698, 0xD163, + 0xB699, 0xD164, 0xB69A, 0xD165, 0xB69B, 0xD166, 0xB69C, 0xD167, + 0xB69D, 0xD169, 0xB69E, 0xD16A, 0xB69F, 0xD16B, 0xB6A0, 0xD16D, + 0xB6A1, 0xB540, 0xB6A2, 0xB541, 0xB6A3, 0xB543, 0xB6A4, 0xB544, + 0xB6A5, 0xB545, 0xB6A6, 0xB54B, 0xB6A7, 0xB54C, 0xB6A8, 0xB54D, + 0xB6A9, 0xB550, 0xB6AA, 0xB554, 0xB6AB, 0xB55C, 0xB6AC, 0xB55D, + 0xB6AD, 0xB55F, 0xB6AE, 0xB560, 0xB6AF, 0xB561, 0xB6B0, 0xB5A0, + 0xB6B1, 0xB5A1, 0xB6B2, 0xB5A4, 0xB6B3, 0xB5A8, 0xB6B4, 0xB5AA, + 0xB6B5, 0xB5AB, 0xB6B6, 0xB5B0, 0xB6B7, 0xB5B1, 0xB6B8, 0xB5B3, + 0xB6B9, 0xB5B4, 0xB6BA, 0xB5B5, 0xB6BB, 0xB5BB, 0xB6BC, 0xB5BC, + 0xB6BD, 0xB5BD, 0xB6BE, 0xB5C0, 0xB6BF, 0xB5C4, 0xB6C0, 0xB5CC, + 0xB6C1, 0xB5CD, 0xB6C2, 0xB5CF, 0xB6C3, 0xB5D0, 0xB6C4, 0xB5D1, + 0xB6C5, 0xB5D8, 0xB6C6, 0xB5EC, 0xB6C7, 0xB610, 0xB6C8, 0xB611, + 0xB6C9, 0xB614, 0xB6CA, 0xB618, 0xB6CB, 0xB625, 0xB6CC, 0xB62C, + 0xB6CD, 0xB634, 0xB6CE, 0xB648, 0xB6CF, 0xB664, 0xB6D0, 0xB668, + 0xB6D1, 0xB69C, 0xB6D2, 0xB69D, 0xB6D3, 0xB6A0, 0xB6D4, 0xB6A4, + 0xB6D5, 0xB6AB, 0xB6D6, 0xB6AC, 0xB6D7, 0xB6B1, 0xB6D8, 0xB6D4, + 0xB6D9, 0xB6F0, 0xB6DA, 0xB6F4, 0xB6DB, 0xB6F8, 0xB6DC, 0xB700, + 0xB6DD, 0xB701, 0xB6DE, 0xB705, 0xB6DF, 0xB728, 0xB6E0, 0xB729, + 0xB6E1, 0xB72C, 0xB6E2, 0xB72F, 0xB6E3, 0xB730, 0xB6E4, 0xB738, + 0xB6E5, 0xB739, 0xB6E6, 0xB73B, 0xB6E7, 0xB744, 0xB6E8, 0xB748, + 0xB6E9, 0xB74C, 0xB6EA, 0xB754, 0xB6EB, 0xB755, 0xB6EC, 0xB760, + 0xB6ED, 0xB764, 0xB6EE, 0xB768, 0xB6EF, 0xB770, 0xB6F0, 0xB771, + 0xB6F1, 0xB773, 0xB6F2, 0xB775, 0xB6F3, 0xB77C, 0xB6F4, 0xB77D, + 0xB6F5, 0xB780, 0xB6F6, 0xB784, 0xB6F7, 0xB78C, 0xB6F8, 0xB78D, + 0xB6F9, 0xB78F, 0xB6FA, 0xB790, 0xB6FB, 0xB791, 0xB6FC, 0xB792, + 0xB6FD, 0xB796, 0xB6FE, 0xB797, 0xB741, 0xD16E, 0xB742, 0xD16F, + 0xB743, 0xD170, 0xB744, 0xD171, 0xB745, 0xD172, 0xB746, 0xD173, + 0xB747, 0xD174, 0xB748, 0xD175, 0xB749, 0xD176, 0xB74A, 0xD177, + 0xB74B, 0xD178, 0xB74C, 0xD179, 0xB74D, 0xD17A, 0xB74E, 0xD17B, + 0xB74F, 0xD17D, 0xB750, 0xD17E, 0xB751, 0xD17F, 0xB752, 0xD180, + 0xB753, 0xD181, 0xB754, 0xD182, 0xB755, 0xD183, 0xB756, 0xD185, + 0xB757, 0xD186, 0xB758, 0xD187, 0xB759, 0xD189, 0xB75A, 0xD18A, + 0xB761, 0xD18B, 0xB762, 0xD18C, 0xB763, 0xD18D, 0xB764, 0xD18E, + 0xB765, 0xD18F, 0xB766, 0xD190, 0xB767, 0xD191, 0xB768, 0xD192, + 0xB769, 0xD193, 0xB76A, 0xD194, 0xB76B, 0xD195, 0xB76C, 0xD196, + 0xB76D, 0xD197, 0xB76E, 0xD198, 0xB76F, 0xD199, 0xB770, 0xD19A, + 0xB771, 0xD19B, 0xB772, 0xD19C, 0xB773, 0xD19D, 0xB774, 0xD19E, + 0xB775, 0xD19F, 0xB776, 0xD1A2, 0xB777, 0xD1A3, 0xB778, 0xD1A5, + 0xB779, 0xD1A6, 0xB77A, 0xD1A7, 0xB781, 0xD1A9, 0xB782, 0xD1AA, + 0xB783, 0xD1AB, 0xB784, 0xD1AC, 0xB785, 0xD1AD, 0xB786, 0xD1AE, + 0xB787, 0xD1AF, 0xB788, 0xD1B2, 0xB789, 0xD1B4, 0xB78A, 0xD1B6, + 0xB78B, 0xD1B7, 0xB78C, 0xD1B8, 0xB78D, 0xD1B9, 0xB78E, 0xD1BB, + 0xB78F, 0xD1BD, 0xB790, 0xD1BE, 0xB791, 0xD1BF, 0xB792, 0xD1C1, + 0xB793, 0xD1C2, 0xB794, 0xD1C3, 0xB795, 0xD1C4, 0xB796, 0xD1C5, + 0xB797, 0xD1C6, 0xB798, 0xD1C7, 0xB799, 0xD1C8, 0xB79A, 0xD1C9, + 0xB79B, 0xD1CA, 0xB79C, 0xD1CB, 0xB79D, 0xD1CC, 0xB79E, 0xD1CD, + 0xB79F, 0xD1CE, 0xB7A0, 0xD1CF, 0xB7A1, 0xB798, 0xB7A2, 0xB799, + 0xB7A3, 0xB79C, 0xB7A4, 0xB7A0, 0xB7A5, 0xB7A8, 0xB7A6, 0xB7A9, + 0xB7A7, 0xB7AB, 0xB7A8, 0xB7AC, 0xB7A9, 0xB7AD, 0xB7AA, 0xB7B4, + 0xB7AB, 0xB7B5, 0xB7AC, 0xB7B8, 0xB7AD, 0xB7C7, 0xB7AE, 0xB7C9, + 0xB7AF, 0xB7EC, 0xB7B0, 0xB7ED, 0xB7B1, 0xB7F0, 0xB7B2, 0xB7F4, + 0xB7B3, 0xB7FC, 0xB7B4, 0xB7FD, 0xB7B5, 0xB7FF, 0xB7B6, 0xB800, + 0xB7B7, 0xB801, 0xB7B8, 0xB807, 0xB7B9, 0xB808, 0xB7BA, 0xB809, + 0xB7BB, 0xB80C, 0xB7BC, 0xB810, 0xB7BD, 0xB818, 0xB7BE, 0xB819, + 0xB7BF, 0xB81B, 0xB7C0, 0xB81D, 0xB7C1, 0xB824, 0xB7C2, 0xB825, + 0xB7C3, 0xB828, 0xB7C4, 0xB82C, 0xB7C5, 0xB834, 0xB7C6, 0xB835, + 0xB7C7, 0xB837, 0xB7C8, 0xB838, 0xB7C9, 0xB839, 0xB7CA, 0xB840, + 0xB7CB, 0xB844, 0xB7CC, 0xB851, 0xB7CD, 0xB853, 0xB7CE, 0xB85C, + 0xB7CF, 0xB85D, 0xB7D0, 0xB860, 0xB7D1, 0xB864, 0xB7D2, 0xB86C, + 0xB7D3, 0xB86D, 0xB7D4, 0xB86F, 0xB7D5, 0xB871, 0xB7D6, 0xB878, + 0xB7D7, 0xB87C, 0xB7D8, 0xB88D, 0xB7D9, 0xB8A8, 0xB7DA, 0xB8B0, + 0xB7DB, 0xB8B4, 0xB7DC, 0xB8B8, 0xB7DD, 0xB8C0, 0xB7DE, 0xB8C1, + 0xB7DF, 0xB8C3, 0xB7E0, 0xB8C5, 0xB7E1, 0xB8CC, 0xB7E2, 0xB8D0, + 0xB7E3, 0xB8D4, 0xB7E4, 0xB8DD, 0xB7E5, 0xB8DF, 0xB7E6, 0xB8E1, + 0xB7E7, 0xB8E8, 0xB7E8, 0xB8E9, 0xB7E9, 0xB8EC, 0xB7EA, 0xB8F0, + 0xB7EB, 0xB8F8, 0xB7EC, 0xB8F9, 0xB7ED, 0xB8FB, 0xB7EE, 0xB8FD, + 0xB7EF, 0xB904, 0xB7F0, 0xB918, 0xB7F1, 0xB920, 0xB7F2, 0xB93C, + 0xB7F3, 0xB93D, 0xB7F4, 0xB940, 0xB7F5, 0xB944, 0xB7F6, 0xB94C, + 0xB7F7, 0xB94F, 0xB7F8, 0xB951, 0xB7F9, 0xB958, 0xB7FA, 0xB959, + 0xB7FB, 0xB95C, 0xB7FC, 0xB960, 0xB7FD, 0xB968, 0xB7FE, 0xB969, + 0xB841, 0xD1D0, 0xB842, 0xD1D1, 0xB843, 0xD1D2, 0xB844, 0xD1D3, + 0xB845, 0xD1D4, 0xB846, 0xD1D5, 0xB847, 0xD1D6, 0xB848, 0xD1D7, + 0xB849, 0xD1D9, 0xB84A, 0xD1DA, 0xB84B, 0xD1DB, 0xB84C, 0xD1DC, + 0xB84D, 0xD1DD, 0xB84E, 0xD1DE, 0xB84F, 0xD1DF, 0xB850, 0xD1E0, + 0xB851, 0xD1E1, 0xB852, 0xD1E2, 0xB853, 0xD1E3, 0xB854, 0xD1E4, + 0xB855, 0xD1E5, 0xB856, 0xD1E6, 0xB857, 0xD1E7, 0xB858, 0xD1E8, + 0xB859, 0xD1E9, 0xB85A, 0xD1EA, 0xB861, 0xD1EB, 0xB862, 0xD1EC, + 0xB863, 0xD1ED, 0xB864, 0xD1EE, 0xB865, 0xD1EF, 0xB866, 0xD1F0, + 0xB867, 0xD1F1, 0xB868, 0xD1F2, 0xB869, 0xD1F3, 0xB86A, 0xD1F5, + 0xB86B, 0xD1F6, 0xB86C, 0xD1F7, 0xB86D, 0xD1F9, 0xB86E, 0xD1FA, + 0xB86F, 0xD1FB, 0xB870, 0xD1FC, 0xB871, 0xD1FD, 0xB872, 0xD1FE, + 0xB873, 0xD1FF, 0xB874, 0xD200, 0xB875, 0xD201, 0xB876, 0xD202, + 0xB877, 0xD203, 0xB878, 0xD204, 0xB879, 0xD205, 0xB87A, 0xD206, + 0xB881, 0xD208, 0xB882, 0xD20A, 0xB883, 0xD20B, 0xB884, 0xD20C, + 0xB885, 0xD20D, 0xB886, 0xD20E, 0xB887, 0xD20F, 0xB888, 0xD211, + 0xB889, 0xD212, 0xB88A, 0xD213, 0xB88B, 0xD214, 0xB88C, 0xD215, + 0xB88D, 0xD216, 0xB88E, 0xD217, 0xB88F, 0xD218, 0xB890, 0xD219, + 0xB891, 0xD21A, 0xB892, 0xD21B, 0xB893, 0xD21C, 0xB894, 0xD21D, + 0xB895, 0xD21E, 0xB896, 0xD21F, 0xB897, 0xD220, 0xB898, 0xD221, + 0xB899, 0xD222, 0xB89A, 0xD223, 0xB89B, 0xD224, 0xB89C, 0xD225, + 0xB89D, 0xD226, 0xB89E, 0xD227, 0xB89F, 0xD228, 0xB8A0, 0xD229, + 0xB8A1, 0xB96B, 0xB8A2, 0xB96D, 0xB8A3, 0xB974, 0xB8A4, 0xB975, + 0xB8A5, 0xB978, 0xB8A6, 0xB97C, 0xB8A7, 0xB984, 0xB8A8, 0xB985, + 0xB8A9, 0xB987, 0xB8AA, 0xB989, 0xB8AB, 0xB98A, 0xB8AC, 0xB98D, + 0xB8AD, 0xB98E, 0xB8AE, 0xB9AC, 0xB8AF, 0xB9AD, 0xB8B0, 0xB9B0, + 0xB8B1, 0xB9B4, 0xB8B2, 0xB9BC, 0xB8B3, 0xB9BD, 0xB8B4, 0xB9BF, + 0xB8B5, 0xB9C1, 0xB8B6, 0xB9C8, 0xB8B7, 0xB9C9, 0xB8B8, 0xB9CC, + 0xB8B9, 0xB9CE, 0xB8BA, 0xB9CF, 0xB8BB, 0xB9D0, 0xB8BC, 0xB9D1, + 0xB8BD, 0xB9D2, 0xB8BE, 0xB9D8, 0xB8BF, 0xB9D9, 0xB8C0, 0xB9DB, + 0xB8C1, 0xB9DD, 0xB8C2, 0xB9DE, 0xB8C3, 0xB9E1, 0xB8C4, 0xB9E3, + 0xB8C5, 0xB9E4, 0xB8C6, 0xB9E5, 0xB8C7, 0xB9E8, 0xB8C8, 0xB9EC, + 0xB8C9, 0xB9F4, 0xB8CA, 0xB9F5, 0xB8CB, 0xB9F7, 0xB8CC, 0xB9F8, + 0xB8CD, 0xB9F9, 0xB8CE, 0xB9FA, 0xB8CF, 0xBA00, 0xB8D0, 0xBA01, + 0xB8D1, 0xBA08, 0xB8D2, 0xBA15, 0xB8D3, 0xBA38, 0xB8D4, 0xBA39, + 0xB8D5, 0xBA3C, 0xB8D6, 0xBA40, 0xB8D7, 0xBA42, 0xB8D8, 0xBA48, + 0xB8D9, 0xBA49, 0xB8DA, 0xBA4B, 0xB8DB, 0xBA4D, 0xB8DC, 0xBA4E, + 0xB8DD, 0xBA53, 0xB8DE, 0xBA54, 0xB8DF, 0xBA55, 0xB8E0, 0xBA58, + 0xB8E1, 0xBA5C, 0xB8E2, 0xBA64, 0xB8E3, 0xBA65, 0xB8E4, 0xBA67, + 0xB8E5, 0xBA68, 0xB8E6, 0xBA69, 0xB8E7, 0xBA70, 0xB8E8, 0xBA71, + 0xB8E9, 0xBA74, 0xB8EA, 0xBA78, 0xB8EB, 0xBA83, 0xB8EC, 0xBA84, + 0xB8ED, 0xBA85, 0xB8EE, 0xBA87, 0xB8EF, 0xBA8C, 0xB8F0, 0xBAA8, + 0xB8F1, 0xBAA9, 0xB8F2, 0xBAAB, 0xB8F3, 0xBAAC, 0xB8F4, 0xBAB0, + 0xB8F5, 0xBAB2, 0xB8F6, 0xBAB8, 0xB8F7, 0xBAB9, 0xB8F8, 0xBABB, + 0xB8F9, 0xBABD, 0xB8FA, 0xBAC4, 0xB8FB, 0xBAC8, 0xB8FC, 0xBAD8, + 0xB8FD, 0xBAD9, 0xB8FE, 0xBAFC, 0xB941, 0xD22A, 0xB942, 0xD22B, + 0xB943, 0xD22E, 0xB944, 0xD22F, 0xB945, 0xD231, 0xB946, 0xD232, + 0xB947, 0xD233, 0xB948, 0xD235, 0xB949, 0xD236, 0xB94A, 0xD237, + 0xB94B, 0xD238, 0xB94C, 0xD239, 0xB94D, 0xD23A, 0xB94E, 0xD23B, + 0xB94F, 0xD23E, 0xB950, 0xD240, 0xB951, 0xD242, 0xB952, 0xD243, + 0xB953, 0xD244, 0xB954, 0xD245, 0xB955, 0xD246, 0xB956, 0xD247, + 0xB957, 0xD249, 0xB958, 0xD24A, 0xB959, 0xD24B, 0xB95A, 0xD24C, + 0xB961, 0xD24D, 0xB962, 0xD24E, 0xB963, 0xD24F, 0xB964, 0xD250, + 0xB965, 0xD251, 0xB966, 0xD252, 0xB967, 0xD253, 0xB968, 0xD254, + 0xB969, 0xD255, 0xB96A, 0xD256, 0xB96B, 0xD257, 0xB96C, 0xD258, + 0xB96D, 0xD259, 0xB96E, 0xD25A, 0xB96F, 0xD25B, 0xB970, 0xD25D, + 0xB971, 0xD25E, 0xB972, 0xD25F, 0xB973, 0xD260, 0xB974, 0xD261, + 0xB975, 0xD262, 0xB976, 0xD263, 0xB977, 0xD265, 0xB978, 0xD266, + 0xB979, 0xD267, 0xB97A, 0xD268, 0xB981, 0xD269, 0xB982, 0xD26A, + 0xB983, 0xD26B, 0xB984, 0xD26C, 0xB985, 0xD26D, 0xB986, 0xD26E, + 0xB987, 0xD26F, 0xB988, 0xD270, 0xB989, 0xD271, 0xB98A, 0xD272, + 0xB98B, 0xD273, 0xB98C, 0xD274, 0xB98D, 0xD275, 0xB98E, 0xD276, + 0xB98F, 0xD277, 0xB990, 0xD278, 0xB991, 0xD279, 0xB992, 0xD27A, + 0xB993, 0xD27B, 0xB994, 0xD27C, 0xB995, 0xD27D, 0xB996, 0xD27E, + 0xB997, 0xD27F, 0xB998, 0xD282, 0xB999, 0xD283, 0xB99A, 0xD285, + 0xB99B, 0xD286, 0xB99C, 0xD287, 0xB99D, 0xD289, 0xB99E, 0xD28A, + 0xB99F, 0xD28B, 0xB9A0, 0xD28C, 0xB9A1, 0xBB00, 0xB9A2, 0xBB04, + 0xB9A3, 0xBB0D, 0xB9A4, 0xBB0F, 0xB9A5, 0xBB11, 0xB9A6, 0xBB18, + 0xB9A7, 0xBB1C, 0xB9A8, 0xBB20, 0xB9A9, 0xBB29, 0xB9AA, 0xBB2B, + 0xB9AB, 0xBB34, 0xB9AC, 0xBB35, 0xB9AD, 0xBB36, 0xB9AE, 0xBB38, + 0xB9AF, 0xBB3B, 0xB9B0, 0xBB3C, 0xB9B1, 0xBB3D, 0xB9B2, 0xBB3E, + 0xB9B3, 0xBB44, 0xB9B4, 0xBB45, 0xB9B5, 0xBB47, 0xB9B6, 0xBB49, + 0xB9B7, 0xBB4D, 0xB9B8, 0xBB4F, 0xB9B9, 0xBB50, 0xB9BA, 0xBB54, + 0xB9BB, 0xBB58, 0xB9BC, 0xBB61, 0xB9BD, 0xBB63, 0xB9BE, 0xBB6C, + 0xB9BF, 0xBB88, 0xB9C0, 0xBB8C, 0xB9C1, 0xBB90, 0xB9C2, 0xBBA4, + 0xB9C3, 0xBBA8, 0xB9C4, 0xBBAC, 0xB9C5, 0xBBB4, 0xB9C6, 0xBBB7, + 0xB9C7, 0xBBC0, 0xB9C8, 0xBBC4, 0xB9C9, 0xBBC8, 0xB9CA, 0xBBD0, + 0xB9CB, 0xBBD3, 0xB9CC, 0xBBF8, 0xB9CD, 0xBBF9, 0xB9CE, 0xBBFC, + 0xB9CF, 0xBBFF, 0xB9D0, 0xBC00, 0xB9D1, 0xBC02, 0xB9D2, 0xBC08, + 0xB9D3, 0xBC09, 0xB9D4, 0xBC0B, 0xB9D5, 0xBC0C, 0xB9D6, 0xBC0D, + 0xB9D7, 0xBC0F, 0xB9D8, 0xBC11, 0xB9D9, 0xBC14, 0xB9DA, 0xBC15, + 0xB9DB, 0xBC16, 0xB9DC, 0xBC17, 0xB9DD, 0xBC18, 0xB9DE, 0xBC1B, + 0xB9DF, 0xBC1C, 0xB9E0, 0xBC1D, 0xB9E1, 0xBC1E, 0xB9E2, 0xBC1F, + 0xB9E3, 0xBC24, 0xB9E4, 0xBC25, 0xB9E5, 0xBC27, 0xB9E6, 0xBC29, + 0xB9E7, 0xBC2D, 0xB9E8, 0xBC30, 0xB9E9, 0xBC31, 0xB9EA, 0xBC34, + 0xB9EB, 0xBC38, 0xB9EC, 0xBC40, 0xB9ED, 0xBC41, 0xB9EE, 0xBC43, + 0xB9EF, 0xBC44, 0xB9F0, 0xBC45, 0xB9F1, 0xBC49, 0xB9F2, 0xBC4C, + 0xB9F3, 0xBC4D, 0xB9F4, 0xBC50, 0xB9F5, 0xBC5D, 0xB9F6, 0xBC84, + 0xB9F7, 0xBC85, 0xB9F8, 0xBC88, 0xB9F9, 0xBC8B, 0xB9FA, 0xBC8C, + 0xB9FB, 0xBC8E, 0xB9FC, 0xBC94, 0xB9FD, 0xBC95, 0xB9FE, 0xBC97, + 0xBA41, 0xD28D, 0xBA42, 0xD28E, 0xBA43, 0xD28F, 0xBA44, 0xD292, + 0xBA45, 0xD293, 0xBA46, 0xD294, 0xBA47, 0xD296, 0xBA48, 0xD297, + 0xBA49, 0xD298, 0xBA4A, 0xD299, 0xBA4B, 0xD29A, 0xBA4C, 0xD29B, + 0xBA4D, 0xD29D, 0xBA4E, 0xD29E, 0xBA4F, 0xD29F, 0xBA50, 0xD2A1, + 0xBA51, 0xD2A2, 0xBA52, 0xD2A3, 0xBA53, 0xD2A5, 0xBA54, 0xD2A6, + 0xBA55, 0xD2A7, 0xBA56, 0xD2A8, 0xBA57, 0xD2A9, 0xBA58, 0xD2AA, + 0xBA59, 0xD2AB, 0xBA5A, 0xD2AD, 0xBA61, 0xD2AE, 0xBA62, 0xD2AF, + 0xBA63, 0xD2B0, 0xBA64, 0xD2B2, 0xBA65, 0xD2B3, 0xBA66, 0xD2B4, + 0xBA67, 0xD2B5, 0xBA68, 0xD2B6, 0xBA69, 0xD2B7, 0xBA6A, 0xD2BA, + 0xBA6B, 0xD2BB, 0xBA6C, 0xD2BD, 0xBA6D, 0xD2BE, 0xBA6E, 0xD2C1, + 0xBA6F, 0xD2C3, 0xBA70, 0xD2C4, 0xBA71, 0xD2C5, 0xBA72, 0xD2C6, + 0xBA73, 0xD2C7, 0xBA74, 0xD2CA, 0xBA75, 0xD2CC, 0xBA76, 0xD2CD, + 0xBA77, 0xD2CE, 0xBA78, 0xD2CF, 0xBA79, 0xD2D0, 0xBA7A, 0xD2D1, + 0xBA81, 0xD2D2, 0xBA82, 0xD2D3, 0xBA83, 0xD2D5, 0xBA84, 0xD2D6, + 0xBA85, 0xD2D7, 0xBA86, 0xD2D9, 0xBA87, 0xD2DA, 0xBA88, 0xD2DB, + 0xBA89, 0xD2DD, 0xBA8A, 0xD2DE, 0xBA8B, 0xD2DF, 0xBA8C, 0xD2E0, + 0xBA8D, 0xD2E1, 0xBA8E, 0xD2E2, 0xBA8F, 0xD2E3, 0xBA90, 0xD2E6, + 0xBA91, 0xD2E7, 0xBA92, 0xD2E8, 0xBA93, 0xD2E9, 0xBA94, 0xD2EA, + 0xBA95, 0xD2EB, 0xBA96, 0xD2EC, 0xBA97, 0xD2ED, 0xBA98, 0xD2EE, + 0xBA99, 0xD2EF, 0xBA9A, 0xD2F2, 0xBA9B, 0xD2F3, 0xBA9C, 0xD2F5, + 0xBA9D, 0xD2F6, 0xBA9E, 0xD2F7, 0xBA9F, 0xD2F9, 0xBAA0, 0xD2FA, + 0xBAA1, 0xBC99, 0xBAA2, 0xBC9A, 0xBAA3, 0xBCA0, 0xBAA4, 0xBCA1, + 0xBAA5, 0xBCA4, 0xBAA6, 0xBCA7, 0xBAA7, 0xBCA8, 0xBAA8, 0xBCB0, + 0xBAA9, 0xBCB1, 0xBAAA, 0xBCB3, 0xBAAB, 0xBCB4, 0xBAAC, 0xBCB5, + 0xBAAD, 0xBCBC, 0xBAAE, 0xBCBD, 0xBAAF, 0xBCC0, 0xBAB0, 0xBCC4, + 0xBAB1, 0xBCCD, 0xBAB2, 0xBCCF, 0xBAB3, 0xBCD0, 0xBAB4, 0xBCD1, + 0xBAB5, 0xBCD5, 0xBAB6, 0xBCD8, 0xBAB7, 0xBCDC, 0xBAB8, 0xBCF4, + 0xBAB9, 0xBCF5, 0xBABA, 0xBCF6, 0xBABB, 0xBCF8, 0xBABC, 0xBCFC, + 0xBABD, 0xBD04, 0xBABE, 0xBD05, 0xBABF, 0xBD07, 0xBAC0, 0xBD09, + 0xBAC1, 0xBD10, 0xBAC2, 0xBD14, 0xBAC3, 0xBD24, 0xBAC4, 0xBD2C, + 0xBAC5, 0xBD40, 0xBAC6, 0xBD48, 0xBAC7, 0xBD49, 0xBAC8, 0xBD4C, + 0xBAC9, 0xBD50, 0xBACA, 0xBD58, 0xBACB, 0xBD59, 0xBACC, 0xBD64, + 0xBACD, 0xBD68, 0xBACE, 0xBD80, 0xBACF, 0xBD81, 0xBAD0, 0xBD84, + 0xBAD1, 0xBD87, 0xBAD2, 0xBD88, 0xBAD3, 0xBD89, 0xBAD4, 0xBD8A, + 0xBAD5, 0xBD90, 0xBAD6, 0xBD91, 0xBAD7, 0xBD93, 0xBAD8, 0xBD95, + 0xBAD9, 0xBD99, 0xBADA, 0xBD9A, 0xBADB, 0xBD9C, 0xBADC, 0xBDA4, + 0xBADD, 0xBDB0, 0xBADE, 0xBDB8, 0xBADF, 0xBDD4, 0xBAE0, 0xBDD5, + 0xBAE1, 0xBDD8, 0xBAE2, 0xBDDC, 0xBAE3, 0xBDE9, 0xBAE4, 0xBDF0, + 0xBAE5, 0xBDF4, 0xBAE6, 0xBDF8, 0xBAE7, 0xBE00, 0xBAE8, 0xBE03, + 0xBAE9, 0xBE05, 0xBAEA, 0xBE0C, 0xBAEB, 0xBE0D, 0xBAEC, 0xBE10, + 0xBAED, 0xBE14, 0xBAEE, 0xBE1C, 0xBAEF, 0xBE1D, 0xBAF0, 0xBE1F, + 0xBAF1, 0xBE44, 0xBAF2, 0xBE45, 0xBAF3, 0xBE48, 0xBAF4, 0xBE4C, + 0xBAF5, 0xBE4E, 0xBAF6, 0xBE54, 0xBAF7, 0xBE55, 0xBAF8, 0xBE57, + 0xBAF9, 0xBE59, 0xBAFA, 0xBE5A, 0xBAFB, 0xBE5B, 0xBAFC, 0xBE60, + 0xBAFD, 0xBE61, 0xBAFE, 0xBE64, 0xBB41, 0xD2FB, 0xBB42, 0xD2FC, + 0xBB43, 0xD2FD, 0xBB44, 0xD2FE, 0xBB45, 0xD2FF, 0xBB46, 0xD302, + 0xBB47, 0xD304, 0xBB48, 0xD306, 0xBB49, 0xD307, 0xBB4A, 0xD308, + 0xBB4B, 0xD309, 0xBB4C, 0xD30A, 0xBB4D, 0xD30B, 0xBB4E, 0xD30F, + 0xBB4F, 0xD311, 0xBB50, 0xD312, 0xBB51, 0xD313, 0xBB52, 0xD315, + 0xBB53, 0xD317, 0xBB54, 0xD318, 0xBB55, 0xD319, 0xBB56, 0xD31A, + 0xBB57, 0xD31B, 0xBB58, 0xD31E, 0xBB59, 0xD322, 0xBB5A, 0xD323, + 0xBB61, 0xD324, 0xBB62, 0xD326, 0xBB63, 0xD327, 0xBB64, 0xD32A, + 0xBB65, 0xD32B, 0xBB66, 0xD32D, 0xBB67, 0xD32E, 0xBB68, 0xD32F, + 0xBB69, 0xD331, 0xBB6A, 0xD332, 0xBB6B, 0xD333, 0xBB6C, 0xD334, + 0xBB6D, 0xD335, 0xBB6E, 0xD336, 0xBB6F, 0xD337, 0xBB70, 0xD33A, + 0xBB71, 0xD33E, 0xBB72, 0xD33F, 0xBB73, 0xD340, 0xBB74, 0xD341, + 0xBB75, 0xD342, 0xBB76, 0xD343, 0xBB77, 0xD346, 0xBB78, 0xD347, + 0xBB79, 0xD348, 0xBB7A, 0xD349, 0xBB81, 0xD34A, 0xBB82, 0xD34B, + 0xBB83, 0xD34C, 0xBB84, 0xD34D, 0xBB85, 0xD34E, 0xBB86, 0xD34F, + 0xBB87, 0xD350, 0xBB88, 0xD351, 0xBB89, 0xD352, 0xBB8A, 0xD353, + 0xBB8B, 0xD354, 0xBB8C, 0xD355, 0xBB8D, 0xD356, 0xBB8E, 0xD357, + 0xBB8F, 0xD358, 0xBB90, 0xD359, 0xBB91, 0xD35A, 0xBB92, 0xD35B, + 0xBB93, 0xD35C, 0xBB94, 0xD35D, 0xBB95, 0xD35E, 0xBB96, 0xD35F, + 0xBB97, 0xD360, 0xBB98, 0xD361, 0xBB99, 0xD362, 0xBB9A, 0xD363, + 0xBB9B, 0xD364, 0xBB9C, 0xD365, 0xBB9D, 0xD366, 0xBB9E, 0xD367, + 0xBB9F, 0xD368, 0xBBA0, 0xD369, 0xBBA1, 0xBE68, 0xBBA2, 0xBE6A, + 0xBBA3, 0xBE70, 0xBBA4, 0xBE71, 0xBBA5, 0xBE73, 0xBBA6, 0xBE74, + 0xBBA7, 0xBE75, 0xBBA8, 0xBE7B, 0xBBA9, 0xBE7C, 0xBBAA, 0xBE7D, + 0xBBAB, 0xBE80, 0xBBAC, 0xBE84, 0xBBAD, 0xBE8C, 0xBBAE, 0xBE8D, + 0xBBAF, 0xBE8F, 0xBBB0, 0xBE90, 0xBBB1, 0xBE91, 0xBBB2, 0xBE98, + 0xBBB3, 0xBE99, 0xBBB4, 0xBEA8, 0xBBB5, 0xBED0, 0xBBB6, 0xBED1, + 0xBBB7, 0xBED4, 0xBBB8, 0xBED7, 0xBBB9, 0xBED8, 0xBBBA, 0xBEE0, + 0xBBBB, 0xBEE3, 0xBBBC, 0xBEE4, 0xBBBD, 0xBEE5, 0xBBBE, 0xBEEC, + 0xBBBF, 0xBF01, 0xBBC0, 0xBF08, 0xBBC1, 0xBF09, 0xBBC2, 0xBF18, + 0xBBC3, 0xBF19, 0xBBC4, 0xBF1B, 0xBBC5, 0xBF1C, 0xBBC6, 0xBF1D, + 0xBBC7, 0xBF40, 0xBBC8, 0xBF41, 0xBBC9, 0xBF44, 0xBBCA, 0xBF48, + 0xBBCB, 0xBF50, 0xBBCC, 0xBF51, 0xBBCD, 0xBF55, 0xBBCE, 0xBF94, + 0xBBCF, 0xBFB0, 0xBBD0, 0xBFC5, 0xBBD1, 0xBFCC, 0xBBD2, 0xBFCD, + 0xBBD3, 0xBFD0, 0xBBD4, 0xBFD4, 0xBBD5, 0xBFDC, 0xBBD6, 0xBFDF, + 0xBBD7, 0xBFE1, 0xBBD8, 0xC03C, 0xBBD9, 0xC051, 0xBBDA, 0xC058, + 0xBBDB, 0xC05C, 0xBBDC, 0xC060, 0xBBDD, 0xC068, 0xBBDE, 0xC069, + 0xBBDF, 0xC090, 0xBBE0, 0xC091, 0xBBE1, 0xC094, 0xBBE2, 0xC098, + 0xBBE3, 0xC0A0, 0xBBE4, 0xC0A1, 0xBBE5, 0xC0A3, 0xBBE6, 0xC0A5, + 0xBBE7, 0xC0AC, 0xBBE8, 0xC0AD, 0xBBE9, 0xC0AF, 0xBBEA, 0xC0B0, + 0xBBEB, 0xC0B3, 0xBBEC, 0xC0B4, 0xBBED, 0xC0B5, 0xBBEE, 0xC0B6, + 0xBBEF, 0xC0BC, 0xBBF0, 0xC0BD, 0xBBF1, 0xC0BF, 0xBBF2, 0xC0C0, + 0xBBF3, 0xC0C1, 0xBBF4, 0xC0C5, 0xBBF5, 0xC0C8, 0xBBF6, 0xC0C9, + 0xBBF7, 0xC0CC, 0xBBF8, 0xC0D0, 0xBBF9, 0xC0D8, 0xBBFA, 0xC0D9, + 0xBBFB, 0xC0DB, 0xBBFC, 0xC0DC, 0xBBFD, 0xC0DD, 0xBBFE, 0xC0E4, + 0xBC41, 0xD36A, 0xBC42, 0xD36B, 0xBC43, 0xD36C, 0xBC44, 0xD36D, + 0xBC45, 0xD36E, 0xBC46, 0xD36F, 0xBC47, 0xD370, 0xBC48, 0xD371, + 0xBC49, 0xD372, 0xBC4A, 0xD373, 0xBC4B, 0xD374, 0xBC4C, 0xD375, + 0xBC4D, 0xD376, 0xBC4E, 0xD377, 0xBC4F, 0xD378, 0xBC50, 0xD379, + 0xBC51, 0xD37A, 0xBC52, 0xD37B, 0xBC53, 0xD37E, 0xBC54, 0xD37F, + 0xBC55, 0xD381, 0xBC56, 0xD382, 0xBC57, 0xD383, 0xBC58, 0xD385, + 0xBC59, 0xD386, 0xBC5A, 0xD387, 0xBC61, 0xD388, 0xBC62, 0xD389, + 0xBC63, 0xD38A, 0xBC64, 0xD38B, 0xBC65, 0xD38E, 0xBC66, 0xD392, + 0xBC67, 0xD393, 0xBC68, 0xD394, 0xBC69, 0xD395, 0xBC6A, 0xD396, + 0xBC6B, 0xD397, 0xBC6C, 0xD39A, 0xBC6D, 0xD39B, 0xBC6E, 0xD39D, + 0xBC6F, 0xD39E, 0xBC70, 0xD39F, 0xBC71, 0xD3A1, 0xBC72, 0xD3A2, + 0xBC73, 0xD3A3, 0xBC74, 0xD3A4, 0xBC75, 0xD3A5, 0xBC76, 0xD3A6, + 0xBC77, 0xD3A7, 0xBC78, 0xD3AA, 0xBC79, 0xD3AC, 0xBC7A, 0xD3AE, + 0xBC81, 0xD3AF, 0xBC82, 0xD3B0, 0xBC83, 0xD3B1, 0xBC84, 0xD3B2, + 0xBC85, 0xD3B3, 0xBC86, 0xD3B5, 0xBC87, 0xD3B6, 0xBC88, 0xD3B7, + 0xBC89, 0xD3B9, 0xBC8A, 0xD3BA, 0xBC8B, 0xD3BB, 0xBC8C, 0xD3BD, + 0xBC8D, 0xD3BE, 0xBC8E, 0xD3BF, 0xBC8F, 0xD3C0, 0xBC90, 0xD3C1, + 0xBC91, 0xD3C2, 0xBC92, 0xD3C3, 0xBC93, 0xD3C6, 0xBC94, 0xD3C7, + 0xBC95, 0xD3CA, 0xBC96, 0xD3CB, 0xBC97, 0xD3CC, 0xBC98, 0xD3CD, + 0xBC99, 0xD3CE, 0xBC9A, 0xD3CF, 0xBC9B, 0xD3D1, 0xBC9C, 0xD3D2, + 0xBC9D, 0xD3D3, 0xBC9E, 0xD3D4, 0xBC9F, 0xD3D5, 0xBCA0, 0xD3D6, + 0xBCA1, 0xC0E5, 0xBCA2, 0xC0E8, 0xBCA3, 0xC0EC, 0xBCA4, 0xC0F4, + 0xBCA5, 0xC0F5, 0xBCA6, 0xC0F7, 0xBCA7, 0xC0F9, 0xBCA8, 0xC100, + 0xBCA9, 0xC104, 0xBCAA, 0xC108, 0xBCAB, 0xC110, 0xBCAC, 0xC115, + 0xBCAD, 0xC11C, 0xBCAE, 0xC11D, 0xBCAF, 0xC11E, 0xBCB0, 0xC11F, + 0xBCB1, 0xC120, 0xBCB2, 0xC123, 0xBCB3, 0xC124, 0xBCB4, 0xC126, + 0xBCB5, 0xC127, 0xBCB6, 0xC12C, 0xBCB7, 0xC12D, 0xBCB8, 0xC12F, + 0xBCB9, 0xC130, 0xBCBA, 0xC131, 0xBCBB, 0xC136, 0xBCBC, 0xC138, + 0xBCBD, 0xC139, 0xBCBE, 0xC13C, 0xBCBF, 0xC140, 0xBCC0, 0xC148, + 0xBCC1, 0xC149, 0xBCC2, 0xC14B, 0xBCC3, 0xC14C, 0xBCC4, 0xC14D, + 0xBCC5, 0xC154, 0xBCC6, 0xC155, 0xBCC7, 0xC158, 0xBCC8, 0xC15C, + 0xBCC9, 0xC164, 0xBCCA, 0xC165, 0xBCCB, 0xC167, 0xBCCC, 0xC168, + 0xBCCD, 0xC169, 0xBCCE, 0xC170, 0xBCCF, 0xC174, 0xBCD0, 0xC178, + 0xBCD1, 0xC185, 0xBCD2, 0xC18C, 0xBCD3, 0xC18D, 0xBCD4, 0xC18E, + 0xBCD5, 0xC190, 0xBCD6, 0xC194, 0xBCD7, 0xC196, 0xBCD8, 0xC19C, + 0xBCD9, 0xC19D, 0xBCDA, 0xC19F, 0xBCDB, 0xC1A1, 0xBCDC, 0xC1A5, + 0xBCDD, 0xC1A8, 0xBCDE, 0xC1A9, 0xBCDF, 0xC1AC, 0xBCE0, 0xC1B0, + 0xBCE1, 0xC1BD, 0xBCE2, 0xC1C4, 0xBCE3, 0xC1C8, 0xBCE4, 0xC1CC, + 0xBCE5, 0xC1D4, 0xBCE6, 0xC1D7, 0xBCE7, 0xC1D8, 0xBCE8, 0xC1E0, + 0xBCE9, 0xC1E4, 0xBCEA, 0xC1E8, 0xBCEB, 0xC1F0, 0xBCEC, 0xC1F1, + 0xBCED, 0xC1F3, 0xBCEE, 0xC1FC, 0xBCEF, 0xC1FD, 0xBCF0, 0xC200, + 0xBCF1, 0xC204, 0xBCF2, 0xC20C, 0xBCF3, 0xC20D, 0xBCF4, 0xC20F, + 0xBCF5, 0xC211, 0xBCF6, 0xC218, 0xBCF7, 0xC219, 0xBCF8, 0xC21C, + 0xBCF9, 0xC21F, 0xBCFA, 0xC220, 0xBCFB, 0xC228, 0xBCFC, 0xC229, + 0xBCFD, 0xC22B, 0xBCFE, 0xC22D, 0xBD41, 0xD3D7, 0xBD42, 0xD3D9, + 0xBD43, 0xD3DA, 0xBD44, 0xD3DB, 0xBD45, 0xD3DC, 0xBD46, 0xD3DD, + 0xBD47, 0xD3DE, 0xBD48, 0xD3DF, 0xBD49, 0xD3E0, 0xBD4A, 0xD3E2, + 0xBD4B, 0xD3E4, 0xBD4C, 0xD3E5, 0xBD4D, 0xD3E6, 0xBD4E, 0xD3E7, + 0xBD4F, 0xD3E8, 0xBD50, 0xD3E9, 0xBD51, 0xD3EA, 0xBD52, 0xD3EB, + 0xBD53, 0xD3EE, 0xBD54, 0xD3EF, 0xBD55, 0xD3F1, 0xBD56, 0xD3F2, + 0xBD57, 0xD3F3, 0xBD58, 0xD3F5, 0xBD59, 0xD3F6, 0xBD5A, 0xD3F7, + 0xBD61, 0xD3F8, 0xBD62, 0xD3F9, 0xBD63, 0xD3FA, 0xBD64, 0xD3FB, + 0xBD65, 0xD3FE, 0xBD66, 0xD400, 0xBD67, 0xD402, 0xBD68, 0xD403, + 0xBD69, 0xD404, 0xBD6A, 0xD405, 0xBD6B, 0xD406, 0xBD6C, 0xD407, + 0xBD6D, 0xD409, 0xBD6E, 0xD40A, 0xBD6F, 0xD40B, 0xBD70, 0xD40C, + 0xBD71, 0xD40D, 0xBD72, 0xD40E, 0xBD73, 0xD40F, 0xBD74, 0xD410, + 0xBD75, 0xD411, 0xBD76, 0xD412, 0xBD77, 0xD413, 0xBD78, 0xD414, + 0xBD79, 0xD415, 0xBD7A, 0xD416, 0xBD81, 0xD417, 0xBD82, 0xD418, + 0xBD83, 0xD419, 0xBD84, 0xD41A, 0xBD85, 0xD41B, 0xBD86, 0xD41C, + 0xBD87, 0xD41E, 0xBD88, 0xD41F, 0xBD89, 0xD420, 0xBD8A, 0xD421, + 0xBD8B, 0xD422, 0xBD8C, 0xD423, 0xBD8D, 0xD424, 0xBD8E, 0xD425, + 0xBD8F, 0xD426, 0xBD90, 0xD427, 0xBD91, 0xD428, 0xBD92, 0xD429, + 0xBD93, 0xD42A, 0xBD94, 0xD42B, 0xBD95, 0xD42C, 0xBD96, 0xD42D, + 0xBD97, 0xD42E, 0xBD98, 0xD42F, 0xBD99, 0xD430, 0xBD9A, 0xD431, + 0xBD9B, 0xD432, 0xBD9C, 0xD433, 0xBD9D, 0xD434, 0xBD9E, 0xD435, + 0xBD9F, 0xD436, 0xBDA0, 0xD437, 0xBDA1, 0xC22F, 0xBDA2, 0xC231, + 0xBDA3, 0xC232, 0xBDA4, 0xC234, 0xBDA5, 0xC248, 0xBDA6, 0xC250, + 0xBDA7, 0xC251, 0xBDA8, 0xC254, 0xBDA9, 0xC258, 0xBDAA, 0xC260, + 0xBDAB, 0xC265, 0xBDAC, 0xC26C, 0xBDAD, 0xC26D, 0xBDAE, 0xC270, + 0xBDAF, 0xC274, 0xBDB0, 0xC27C, 0xBDB1, 0xC27D, 0xBDB2, 0xC27F, + 0xBDB3, 0xC281, 0xBDB4, 0xC288, 0xBDB5, 0xC289, 0xBDB6, 0xC290, + 0xBDB7, 0xC298, 0xBDB8, 0xC29B, 0xBDB9, 0xC29D, 0xBDBA, 0xC2A4, + 0xBDBB, 0xC2A5, 0xBDBC, 0xC2A8, 0xBDBD, 0xC2AC, 0xBDBE, 0xC2AD, + 0xBDBF, 0xC2B4, 0xBDC0, 0xC2B5, 0xBDC1, 0xC2B7, 0xBDC2, 0xC2B9, + 0xBDC3, 0xC2DC, 0xBDC4, 0xC2DD, 0xBDC5, 0xC2E0, 0xBDC6, 0xC2E3, + 0xBDC7, 0xC2E4, 0xBDC8, 0xC2EB, 0xBDC9, 0xC2EC, 0xBDCA, 0xC2ED, + 0xBDCB, 0xC2EF, 0xBDCC, 0xC2F1, 0xBDCD, 0xC2F6, 0xBDCE, 0xC2F8, + 0xBDCF, 0xC2F9, 0xBDD0, 0xC2FB, 0xBDD1, 0xC2FC, 0xBDD2, 0xC300, + 0xBDD3, 0xC308, 0xBDD4, 0xC309, 0xBDD5, 0xC30C, 0xBDD6, 0xC30D, + 0xBDD7, 0xC313, 0xBDD8, 0xC314, 0xBDD9, 0xC315, 0xBDDA, 0xC318, + 0xBDDB, 0xC31C, 0xBDDC, 0xC324, 0xBDDD, 0xC325, 0xBDDE, 0xC328, + 0xBDDF, 0xC329, 0xBDE0, 0xC345, 0xBDE1, 0xC368, 0xBDE2, 0xC369, + 0xBDE3, 0xC36C, 0xBDE4, 0xC370, 0xBDE5, 0xC372, 0xBDE6, 0xC378, + 0xBDE7, 0xC379, 0xBDE8, 0xC37C, 0xBDE9, 0xC37D, 0xBDEA, 0xC384, + 0xBDEB, 0xC388, 0xBDEC, 0xC38C, 0xBDED, 0xC3C0, 0xBDEE, 0xC3D8, + 0xBDEF, 0xC3D9, 0xBDF0, 0xC3DC, 0xBDF1, 0xC3DF, 0xBDF2, 0xC3E0, + 0xBDF3, 0xC3E2, 0xBDF4, 0xC3E8, 0xBDF5, 0xC3E9, 0xBDF6, 0xC3ED, + 0xBDF7, 0xC3F4, 0xBDF8, 0xC3F5, 0xBDF9, 0xC3F8, 0xBDFA, 0xC408, + 0xBDFB, 0xC410, 0xBDFC, 0xC424, 0xBDFD, 0xC42C, 0xBDFE, 0xC430, + 0xBE41, 0xD438, 0xBE42, 0xD439, 0xBE43, 0xD43A, 0xBE44, 0xD43B, + 0xBE45, 0xD43C, 0xBE46, 0xD43D, 0xBE47, 0xD43E, 0xBE48, 0xD43F, + 0xBE49, 0xD441, 0xBE4A, 0xD442, 0xBE4B, 0xD443, 0xBE4C, 0xD445, + 0xBE4D, 0xD446, 0xBE4E, 0xD447, 0xBE4F, 0xD448, 0xBE50, 0xD449, + 0xBE51, 0xD44A, 0xBE52, 0xD44B, 0xBE53, 0xD44C, 0xBE54, 0xD44D, + 0xBE55, 0xD44E, 0xBE56, 0xD44F, 0xBE57, 0xD450, 0xBE58, 0xD451, + 0xBE59, 0xD452, 0xBE5A, 0xD453, 0xBE61, 0xD454, 0xBE62, 0xD455, + 0xBE63, 0xD456, 0xBE64, 0xD457, 0xBE65, 0xD458, 0xBE66, 0xD459, + 0xBE67, 0xD45A, 0xBE68, 0xD45B, 0xBE69, 0xD45D, 0xBE6A, 0xD45E, + 0xBE6B, 0xD45F, 0xBE6C, 0xD461, 0xBE6D, 0xD462, 0xBE6E, 0xD463, + 0xBE6F, 0xD465, 0xBE70, 0xD466, 0xBE71, 0xD467, 0xBE72, 0xD468, + 0xBE73, 0xD469, 0xBE74, 0xD46A, 0xBE75, 0xD46B, 0xBE76, 0xD46C, + 0xBE77, 0xD46E, 0xBE78, 0xD470, 0xBE79, 0xD471, 0xBE7A, 0xD472, + 0xBE81, 0xD473, 0xBE82, 0xD474, 0xBE83, 0xD475, 0xBE84, 0xD476, + 0xBE85, 0xD477, 0xBE86, 0xD47A, 0xBE87, 0xD47B, 0xBE88, 0xD47D, + 0xBE89, 0xD47E, 0xBE8A, 0xD481, 0xBE8B, 0xD483, 0xBE8C, 0xD484, + 0xBE8D, 0xD485, 0xBE8E, 0xD486, 0xBE8F, 0xD487, 0xBE90, 0xD48A, + 0xBE91, 0xD48C, 0xBE92, 0xD48E, 0xBE93, 0xD48F, 0xBE94, 0xD490, + 0xBE95, 0xD491, 0xBE96, 0xD492, 0xBE97, 0xD493, 0xBE98, 0xD495, + 0xBE99, 0xD496, 0xBE9A, 0xD497, 0xBE9B, 0xD498, 0xBE9C, 0xD499, + 0xBE9D, 0xD49A, 0xBE9E, 0xD49B, 0xBE9F, 0xD49C, 0xBEA0, 0xD49D, + 0xBEA1, 0xC434, 0xBEA2, 0xC43C, 0xBEA3, 0xC43D, 0xBEA4, 0xC448, + 0xBEA5, 0xC464, 0xBEA6, 0xC465, 0xBEA7, 0xC468, 0xBEA8, 0xC46C, + 0xBEA9, 0xC474, 0xBEAA, 0xC475, 0xBEAB, 0xC479, 0xBEAC, 0xC480, + 0xBEAD, 0xC494, 0xBEAE, 0xC49C, 0xBEAF, 0xC4B8, 0xBEB0, 0xC4BC, + 0xBEB1, 0xC4E9, 0xBEB2, 0xC4F0, 0xBEB3, 0xC4F1, 0xBEB4, 0xC4F4, + 0xBEB5, 0xC4F8, 0xBEB6, 0xC4FA, 0xBEB7, 0xC4FF, 0xBEB8, 0xC500, + 0xBEB9, 0xC501, 0xBEBA, 0xC50C, 0xBEBB, 0xC510, 0xBEBC, 0xC514, + 0xBEBD, 0xC51C, 0xBEBE, 0xC528, 0xBEBF, 0xC529, 0xBEC0, 0xC52C, + 0xBEC1, 0xC530, 0xBEC2, 0xC538, 0xBEC3, 0xC539, 0xBEC4, 0xC53B, + 0xBEC5, 0xC53D, 0xBEC6, 0xC544, 0xBEC7, 0xC545, 0xBEC8, 0xC548, + 0xBEC9, 0xC549, 0xBECA, 0xC54A, 0xBECB, 0xC54C, 0xBECC, 0xC54D, + 0xBECD, 0xC54E, 0xBECE, 0xC553, 0xBECF, 0xC554, 0xBED0, 0xC555, + 0xBED1, 0xC557, 0xBED2, 0xC558, 0xBED3, 0xC559, 0xBED4, 0xC55D, + 0xBED5, 0xC55E, 0xBED6, 0xC560, 0xBED7, 0xC561, 0xBED8, 0xC564, + 0xBED9, 0xC568, 0xBEDA, 0xC570, 0xBEDB, 0xC571, 0xBEDC, 0xC573, + 0xBEDD, 0xC574, 0xBEDE, 0xC575, 0xBEDF, 0xC57C, 0xBEE0, 0xC57D, + 0xBEE1, 0xC580, 0xBEE2, 0xC584, 0xBEE3, 0xC587, 0xBEE4, 0xC58C, + 0xBEE5, 0xC58D, 0xBEE6, 0xC58F, 0xBEE7, 0xC591, 0xBEE8, 0xC595, + 0xBEE9, 0xC597, 0xBEEA, 0xC598, 0xBEEB, 0xC59C, 0xBEEC, 0xC5A0, + 0xBEED, 0xC5A9, 0xBEEE, 0xC5B4, 0xBEEF, 0xC5B5, 0xBEF0, 0xC5B8, + 0xBEF1, 0xC5B9, 0xBEF2, 0xC5BB, 0xBEF3, 0xC5BC, 0xBEF4, 0xC5BD, + 0xBEF5, 0xC5BE, 0xBEF6, 0xC5C4, 0xBEF7, 0xC5C5, 0xBEF8, 0xC5C6, + 0xBEF9, 0xC5C7, 0xBEFA, 0xC5C8, 0xBEFB, 0xC5C9, 0xBEFC, 0xC5CA, + 0xBEFD, 0xC5CC, 0xBEFE, 0xC5CE, 0xBF41, 0xD49E, 0xBF42, 0xD49F, + 0xBF43, 0xD4A0, 0xBF44, 0xD4A1, 0xBF45, 0xD4A2, 0xBF46, 0xD4A3, + 0xBF47, 0xD4A4, 0xBF48, 0xD4A5, 0xBF49, 0xD4A6, 0xBF4A, 0xD4A7, + 0xBF4B, 0xD4A8, 0xBF4C, 0xD4AA, 0xBF4D, 0xD4AB, 0xBF4E, 0xD4AC, + 0xBF4F, 0xD4AD, 0xBF50, 0xD4AE, 0xBF51, 0xD4AF, 0xBF52, 0xD4B0, + 0xBF53, 0xD4B1, 0xBF54, 0xD4B2, 0xBF55, 0xD4B3, 0xBF56, 0xD4B4, + 0xBF57, 0xD4B5, 0xBF58, 0xD4B6, 0xBF59, 0xD4B7, 0xBF5A, 0xD4B8, + 0xBF61, 0xD4B9, 0xBF62, 0xD4BA, 0xBF63, 0xD4BB, 0xBF64, 0xD4BC, + 0xBF65, 0xD4BD, 0xBF66, 0xD4BE, 0xBF67, 0xD4BF, 0xBF68, 0xD4C0, + 0xBF69, 0xD4C1, 0xBF6A, 0xD4C2, 0xBF6B, 0xD4C3, 0xBF6C, 0xD4C4, + 0xBF6D, 0xD4C5, 0xBF6E, 0xD4C6, 0xBF6F, 0xD4C7, 0xBF70, 0xD4C8, + 0xBF71, 0xD4C9, 0xBF72, 0xD4CA, 0xBF73, 0xD4CB, 0xBF74, 0xD4CD, + 0xBF75, 0xD4CE, 0xBF76, 0xD4CF, 0xBF77, 0xD4D1, 0xBF78, 0xD4D2, + 0xBF79, 0xD4D3, 0xBF7A, 0xD4D5, 0xBF81, 0xD4D6, 0xBF82, 0xD4D7, + 0xBF83, 0xD4D8, 0xBF84, 0xD4D9, 0xBF85, 0xD4DA, 0xBF86, 0xD4DB, + 0xBF87, 0xD4DD, 0xBF88, 0xD4DE, 0xBF89, 0xD4E0, 0xBF8A, 0xD4E1, + 0xBF8B, 0xD4E2, 0xBF8C, 0xD4E3, 0xBF8D, 0xD4E4, 0xBF8E, 0xD4E5, + 0xBF8F, 0xD4E6, 0xBF90, 0xD4E7, 0xBF91, 0xD4E9, 0xBF92, 0xD4EA, + 0xBF93, 0xD4EB, 0xBF94, 0xD4ED, 0xBF95, 0xD4EE, 0xBF96, 0xD4EF, + 0xBF97, 0xD4F1, 0xBF98, 0xD4F2, 0xBF99, 0xD4F3, 0xBF9A, 0xD4F4, + 0xBF9B, 0xD4F5, 0xBF9C, 0xD4F6, 0xBF9D, 0xD4F7, 0xBF9E, 0xD4F9, + 0xBF9F, 0xD4FA, 0xBFA0, 0xD4FC, 0xBFA1, 0xC5D0, 0xBFA2, 0xC5D1, + 0xBFA3, 0xC5D4, 0xBFA4, 0xC5D8, 0xBFA5, 0xC5E0, 0xBFA6, 0xC5E1, + 0xBFA7, 0xC5E3, 0xBFA8, 0xC5E5, 0xBFA9, 0xC5EC, 0xBFAA, 0xC5ED, + 0xBFAB, 0xC5EE, 0xBFAC, 0xC5F0, 0xBFAD, 0xC5F4, 0xBFAE, 0xC5F6, + 0xBFAF, 0xC5F7, 0xBFB0, 0xC5FC, 0xBFB1, 0xC5FD, 0xBFB2, 0xC5FE, + 0xBFB3, 0xC5FF, 0xBFB4, 0xC600, 0xBFB5, 0xC601, 0xBFB6, 0xC605, + 0xBFB7, 0xC606, 0xBFB8, 0xC607, 0xBFB9, 0xC608, 0xBFBA, 0xC60C, + 0xBFBB, 0xC610, 0xBFBC, 0xC618, 0xBFBD, 0xC619, 0xBFBE, 0xC61B, + 0xBFBF, 0xC61C, 0xBFC0, 0xC624, 0xBFC1, 0xC625, 0xBFC2, 0xC628, + 0xBFC3, 0xC62C, 0xBFC4, 0xC62D, 0xBFC5, 0xC62E, 0xBFC6, 0xC630, + 0xBFC7, 0xC633, 0xBFC8, 0xC634, 0xBFC9, 0xC635, 0xBFCA, 0xC637, + 0xBFCB, 0xC639, 0xBFCC, 0xC63B, 0xBFCD, 0xC640, 0xBFCE, 0xC641, + 0xBFCF, 0xC644, 0xBFD0, 0xC648, 0xBFD1, 0xC650, 0xBFD2, 0xC651, + 0xBFD3, 0xC653, 0xBFD4, 0xC654, 0xBFD5, 0xC655, 0xBFD6, 0xC65C, + 0xBFD7, 0xC65D, 0xBFD8, 0xC660, 0xBFD9, 0xC66C, 0xBFDA, 0xC66F, + 0xBFDB, 0xC671, 0xBFDC, 0xC678, 0xBFDD, 0xC679, 0xBFDE, 0xC67C, + 0xBFDF, 0xC680, 0xBFE0, 0xC688, 0xBFE1, 0xC689, 0xBFE2, 0xC68B, + 0xBFE3, 0xC68D, 0xBFE4, 0xC694, 0xBFE5, 0xC695, 0xBFE6, 0xC698, + 0xBFE7, 0xC69C, 0xBFE8, 0xC6A4, 0xBFE9, 0xC6A5, 0xBFEA, 0xC6A7, + 0xBFEB, 0xC6A9, 0xBFEC, 0xC6B0, 0xBFED, 0xC6B1, 0xBFEE, 0xC6B4, + 0xBFEF, 0xC6B8, 0xBFF0, 0xC6B9, 0xBFF1, 0xC6BA, 0xBFF2, 0xC6C0, + 0xBFF3, 0xC6C1, 0xBFF4, 0xC6C3, 0xBFF5, 0xC6C5, 0xBFF6, 0xC6CC, + 0xBFF7, 0xC6CD, 0xBFF8, 0xC6D0, 0xBFF9, 0xC6D4, 0xBFFA, 0xC6DC, + 0xBFFB, 0xC6DD, 0xBFFC, 0xC6E0, 0xBFFD, 0xC6E1, 0xBFFE, 0xC6E8, + 0xC041, 0xD4FE, 0xC042, 0xD4FF, 0xC043, 0xD500, 0xC044, 0xD501, + 0xC045, 0xD502, 0xC046, 0xD503, 0xC047, 0xD505, 0xC048, 0xD506, + 0xC049, 0xD507, 0xC04A, 0xD509, 0xC04B, 0xD50A, 0xC04C, 0xD50B, + 0xC04D, 0xD50D, 0xC04E, 0xD50E, 0xC04F, 0xD50F, 0xC050, 0xD510, + 0xC051, 0xD511, 0xC052, 0xD512, 0xC053, 0xD513, 0xC054, 0xD516, + 0xC055, 0xD518, 0xC056, 0xD519, 0xC057, 0xD51A, 0xC058, 0xD51B, + 0xC059, 0xD51C, 0xC05A, 0xD51D, 0xC061, 0xD51E, 0xC062, 0xD51F, + 0xC063, 0xD520, 0xC064, 0xD521, 0xC065, 0xD522, 0xC066, 0xD523, + 0xC067, 0xD524, 0xC068, 0xD525, 0xC069, 0xD526, 0xC06A, 0xD527, + 0xC06B, 0xD528, 0xC06C, 0xD529, 0xC06D, 0xD52A, 0xC06E, 0xD52B, + 0xC06F, 0xD52C, 0xC070, 0xD52D, 0xC071, 0xD52E, 0xC072, 0xD52F, + 0xC073, 0xD530, 0xC074, 0xD531, 0xC075, 0xD532, 0xC076, 0xD533, + 0xC077, 0xD534, 0xC078, 0xD535, 0xC079, 0xD536, 0xC07A, 0xD537, + 0xC081, 0xD538, 0xC082, 0xD539, 0xC083, 0xD53A, 0xC084, 0xD53B, + 0xC085, 0xD53E, 0xC086, 0xD53F, 0xC087, 0xD541, 0xC088, 0xD542, + 0xC089, 0xD543, 0xC08A, 0xD545, 0xC08B, 0xD546, 0xC08C, 0xD547, + 0xC08D, 0xD548, 0xC08E, 0xD549, 0xC08F, 0xD54A, 0xC090, 0xD54B, + 0xC091, 0xD54E, 0xC092, 0xD550, 0xC093, 0xD552, 0xC094, 0xD553, + 0xC095, 0xD554, 0xC096, 0xD555, 0xC097, 0xD556, 0xC098, 0xD557, + 0xC099, 0xD55A, 0xC09A, 0xD55B, 0xC09B, 0xD55D, 0xC09C, 0xD55E, + 0xC09D, 0xD55F, 0xC09E, 0xD561, 0xC09F, 0xD562, 0xC0A0, 0xD563, + 0xC0A1, 0xC6E9, 0xC0A2, 0xC6EC, 0xC0A3, 0xC6F0, 0xC0A4, 0xC6F8, + 0xC0A5, 0xC6F9, 0xC0A6, 0xC6FD, 0xC0A7, 0xC704, 0xC0A8, 0xC705, + 0xC0A9, 0xC708, 0xC0AA, 0xC70C, 0xC0AB, 0xC714, 0xC0AC, 0xC715, + 0xC0AD, 0xC717, 0xC0AE, 0xC719, 0xC0AF, 0xC720, 0xC0B0, 0xC721, + 0xC0B1, 0xC724, 0xC0B2, 0xC728, 0xC0B3, 0xC730, 0xC0B4, 0xC731, + 0xC0B5, 0xC733, 0xC0B6, 0xC735, 0xC0B7, 0xC737, 0xC0B8, 0xC73C, + 0xC0B9, 0xC73D, 0xC0BA, 0xC740, 0xC0BB, 0xC744, 0xC0BC, 0xC74A, + 0xC0BD, 0xC74C, 0xC0BE, 0xC74D, 0xC0BF, 0xC74F, 0xC0C0, 0xC751, + 0xC0C1, 0xC752, 0xC0C2, 0xC753, 0xC0C3, 0xC754, 0xC0C4, 0xC755, + 0xC0C5, 0xC756, 0xC0C6, 0xC757, 0xC0C7, 0xC758, 0xC0C8, 0xC75C, + 0xC0C9, 0xC760, 0xC0CA, 0xC768, 0xC0CB, 0xC76B, 0xC0CC, 0xC774, + 0xC0CD, 0xC775, 0xC0CE, 0xC778, 0xC0CF, 0xC77C, 0xC0D0, 0xC77D, + 0xC0D1, 0xC77E, 0xC0D2, 0xC783, 0xC0D3, 0xC784, 0xC0D4, 0xC785, + 0xC0D5, 0xC787, 0xC0D6, 0xC788, 0xC0D7, 0xC789, 0xC0D8, 0xC78A, + 0xC0D9, 0xC78E, 0xC0DA, 0xC790, 0xC0DB, 0xC791, 0xC0DC, 0xC794, + 0xC0DD, 0xC796, 0xC0DE, 0xC797, 0xC0DF, 0xC798, 0xC0E0, 0xC79A, + 0xC0E1, 0xC7A0, 0xC0E2, 0xC7A1, 0xC0E3, 0xC7A3, 0xC0E4, 0xC7A4, + 0xC0E5, 0xC7A5, 0xC0E6, 0xC7A6, 0xC0E7, 0xC7AC, 0xC0E8, 0xC7AD, + 0xC0E9, 0xC7B0, 0xC0EA, 0xC7B4, 0xC0EB, 0xC7BC, 0xC0EC, 0xC7BD, + 0xC0ED, 0xC7BF, 0xC0EE, 0xC7C0, 0xC0EF, 0xC7C1, 0xC0F0, 0xC7C8, + 0xC0F1, 0xC7C9, 0xC0F2, 0xC7CC, 0xC0F3, 0xC7CE, 0xC0F4, 0xC7D0, + 0xC0F5, 0xC7D8, 0xC0F6, 0xC7DD, 0xC0F7, 0xC7E4, 0xC0F8, 0xC7E8, + 0xC0F9, 0xC7EC, 0xC0FA, 0xC800, 0xC0FB, 0xC801, 0xC0FC, 0xC804, + 0xC0FD, 0xC808, 0xC0FE, 0xC80A, 0xC141, 0xD564, 0xC142, 0xD566, + 0xC143, 0xD567, 0xC144, 0xD56A, 0xC145, 0xD56C, 0xC146, 0xD56E, + 0xC147, 0xD56F, 0xC148, 0xD570, 0xC149, 0xD571, 0xC14A, 0xD572, + 0xC14B, 0xD573, 0xC14C, 0xD576, 0xC14D, 0xD577, 0xC14E, 0xD579, + 0xC14F, 0xD57A, 0xC150, 0xD57B, 0xC151, 0xD57D, 0xC152, 0xD57E, + 0xC153, 0xD57F, 0xC154, 0xD580, 0xC155, 0xD581, 0xC156, 0xD582, + 0xC157, 0xD583, 0xC158, 0xD586, 0xC159, 0xD58A, 0xC15A, 0xD58B, + 0xC161, 0xD58C, 0xC162, 0xD58D, 0xC163, 0xD58E, 0xC164, 0xD58F, + 0xC165, 0xD591, 0xC166, 0xD592, 0xC167, 0xD593, 0xC168, 0xD594, + 0xC169, 0xD595, 0xC16A, 0xD596, 0xC16B, 0xD597, 0xC16C, 0xD598, + 0xC16D, 0xD599, 0xC16E, 0xD59A, 0xC16F, 0xD59B, 0xC170, 0xD59C, + 0xC171, 0xD59D, 0xC172, 0xD59E, 0xC173, 0xD59F, 0xC174, 0xD5A0, + 0xC175, 0xD5A1, 0xC176, 0xD5A2, 0xC177, 0xD5A3, 0xC178, 0xD5A4, + 0xC179, 0xD5A6, 0xC17A, 0xD5A7, 0xC181, 0xD5A8, 0xC182, 0xD5A9, + 0xC183, 0xD5AA, 0xC184, 0xD5AB, 0xC185, 0xD5AC, 0xC186, 0xD5AD, + 0xC187, 0xD5AE, 0xC188, 0xD5AF, 0xC189, 0xD5B0, 0xC18A, 0xD5B1, + 0xC18B, 0xD5B2, 0xC18C, 0xD5B3, 0xC18D, 0xD5B4, 0xC18E, 0xD5B5, + 0xC18F, 0xD5B6, 0xC190, 0xD5B7, 0xC191, 0xD5B8, 0xC192, 0xD5B9, + 0xC193, 0xD5BA, 0xC194, 0xD5BB, 0xC195, 0xD5BC, 0xC196, 0xD5BD, + 0xC197, 0xD5BE, 0xC198, 0xD5BF, 0xC199, 0xD5C0, 0xC19A, 0xD5C1, + 0xC19B, 0xD5C2, 0xC19C, 0xD5C3, 0xC19D, 0xD5C4, 0xC19E, 0xD5C5, + 0xC19F, 0xD5C6, 0xC1A0, 0xD5C7, 0xC1A1, 0xC810, 0xC1A2, 0xC811, + 0xC1A3, 0xC813, 0xC1A4, 0xC815, 0xC1A5, 0xC816, 0xC1A6, 0xC81C, + 0xC1A7, 0xC81D, 0xC1A8, 0xC820, 0xC1A9, 0xC824, 0xC1AA, 0xC82C, + 0xC1AB, 0xC82D, 0xC1AC, 0xC82F, 0xC1AD, 0xC831, 0xC1AE, 0xC838, + 0xC1AF, 0xC83C, 0xC1B0, 0xC840, 0xC1B1, 0xC848, 0xC1B2, 0xC849, + 0xC1B3, 0xC84C, 0xC1B4, 0xC84D, 0xC1B5, 0xC854, 0xC1B6, 0xC870, + 0xC1B7, 0xC871, 0xC1B8, 0xC874, 0xC1B9, 0xC878, 0xC1BA, 0xC87A, + 0xC1BB, 0xC880, 0xC1BC, 0xC881, 0xC1BD, 0xC883, 0xC1BE, 0xC885, + 0xC1BF, 0xC886, 0xC1C0, 0xC887, 0xC1C1, 0xC88B, 0xC1C2, 0xC88C, + 0xC1C3, 0xC88D, 0xC1C4, 0xC894, 0xC1C5, 0xC89D, 0xC1C6, 0xC89F, + 0xC1C7, 0xC8A1, 0xC1C8, 0xC8A8, 0xC1C9, 0xC8BC, 0xC1CA, 0xC8BD, + 0xC1CB, 0xC8C4, 0xC1CC, 0xC8C8, 0xC1CD, 0xC8CC, 0xC1CE, 0xC8D4, + 0xC1CF, 0xC8D5, 0xC1D0, 0xC8D7, 0xC1D1, 0xC8D9, 0xC1D2, 0xC8E0, + 0xC1D3, 0xC8E1, 0xC1D4, 0xC8E4, 0xC1D5, 0xC8F5, 0xC1D6, 0xC8FC, + 0xC1D7, 0xC8FD, 0xC1D8, 0xC900, 0xC1D9, 0xC904, 0xC1DA, 0xC905, + 0xC1DB, 0xC906, 0xC1DC, 0xC90C, 0xC1DD, 0xC90D, 0xC1DE, 0xC90F, + 0xC1DF, 0xC911, 0xC1E0, 0xC918, 0xC1E1, 0xC92C, 0xC1E2, 0xC934, + 0xC1E3, 0xC950, 0xC1E4, 0xC951, 0xC1E5, 0xC954, 0xC1E6, 0xC958, + 0xC1E7, 0xC960, 0xC1E8, 0xC961, 0xC1E9, 0xC963, 0xC1EA, 0xC96C, + 0xC1EB, 0xC970, 0xC1EC, 0xC974, 0xC1ED, 0xC97C, 0xC1EE, 0xC988, + 0xC1EF, 0xC989, 0xC1F0, 0xC98C, 0xC1F1, 0xC990, 0xC1F2, 0xC998, + 0xC1F3, 0xC999, 0xC1F4, 0xC99B, 0xC1F5, 0xC99D, 0xC1F6, 0xC9C0, + 0xC1F7, 0xC9C1, 0xC1F8, 0xC9C4, 0xC1F9, 0xC9C7, 0xC1FA, 0xC9C8, + 0xC1FB, 0xC9CA, 0xC1FC, 0xC9D0, 0xC1FD, 0xC9D1, 0xC1FE, 0xC9D3, + 0xC241, 0xD5CA, 0xC242, 0xD5CB, 0xC243, 0xD5CD, 0xC244, 0xD5CE, + 0xC245, 0xD5CF, 0xC246, 0xD5D1, 0xC247, 0xD5D3, 0xC248, 0xD5D4, + 0xC249, 0xD5D5, 0xC24A, 0xD5D6, 0xC24B, 0xD5D7, 0xC24C, 0xD5DA, + 0xC24D, 0xD5DC, 0xC24E, 0xD5DE, 0xC24F, 0xD5DF, 0xC250, 0xD5E0, + 0xC251, 0xD5E1, 0xC252, 0xD5E2, 0xC253, 0xD5E3, 0xC254, 0xD5E6, + 0xC255, 0xD5E7, 0xC256, 0xD5E9, 0xC257, 0xD5EA, 0xC258, 0xD5EB, + 0xC259, 0xD5ED, 0xC25A, 0xD5EE, 0xC261, 0xD5EF, 0xC262, 0xD5F0, + 0xC263, 0xD5F1, 0xC264, 0xD5F2, 0xC265, 0xD5F3, 0xC266, 0xD5F6, + 0xC267, 0xD5F8, 0xC268, 0xD5FA, 0xC269, 0xD5FB, 0xC26A, 0xD5FC, + 0xC26B, 0xD5FD, 0xC26C, 0xD5FE, 0xC26D, 0xD5FF, 0xC26E, 0xD602, + 0xC26F, 0xD603, 0xC270, 0xD605, 0xC271, 0xD606, 0xC272, 0xD607, + 0xC273, 0xD609, 0xC274, 0xD60A, 0xC275, 0xD60B, 0xC276, 0xD60C, + 0xC277, 0xD60D, 0xC278, 0xD60E, 0xC279, 0xD60F, 0xC27A, 0xD612, + 0xC281, 0xD616, 0xC282, 0xD617, 0xC283, 0xD618, 0xC284, 0xD619, + 0xC285, 0xD61A, 0xC286, 0xD61B, 0xC287, 0xD61D, 0xC288, 0xD61E, + 0xC289, 0xD61F, 0xC28A, 0xD621, 0xC28B, 0xD622, 0xC28C, 0xD623, + 0xC28D, 0xD625, 0xC28E, 0xD626, 0xC28F, 0xD627, 0xC290, 0xD628, + 0xC291, 0xD629, 0xC292, 0xD62A, 0xC293, 0xD62B, 0xC294, 0xD62C, + 0xC295, 0xD62E, 0xC296, 0xD62F, 0xC297, 0xD630, 0xC298, 0xD631, + 0xC299, 0xD632, 0xC29A, 0xD633, 0xC29B, 0xD634, 0xC29C, 0xD635, + 0xC29D, 0xD636, 0xC29E, 0xD637, 0xC29F, 0xD63A, 0xC2A0, 0xD63B, + 0xC2A1, 0xC9D5, 0xC2A2, 0xC9D6, 0xC2A3, 0xC9D9, 0xC2A4, 0xC9DA, + 0xC2A5, 0xC9DC, 0xC2A6, 0xC9DD, 0xC2A7, 0xC9E0, 0xC2A8, 0xC9E2, + 0xC2A9, 0xC9E4, 0xC2AA, 0xC9E7, 0xC2AB, 0xC9EC, 0xC2AC, 0xC9ED, + 0xC2AD, 0xC9EF, 0xC2AE, 0xC9F0, 0xC2AF, 0xC9F1, 0xC2B0, 0xC9F8, + 0xC2B1, 0xC9F9, 0xC2B2, 0xC9FC, 0xC2B3, 0xCA00, 0xC2B4, 0xCA08, + 0xC2B5, 0xCA09, 0xC2B6, 0xCA0B, 0xC2B7, 0xCA0C, 0xC2B8, 0xCA0D, + 0xC2B9, 0xCA14, 0xC2BA, 0xCA18, 0xC2BB, 0xCA29, 0xC2BC, 0xCA4C, + 0xC2BD, 0xCA4D, 0xC2BE, 0xCA50, 0xC2BF, 0xCA54, 0xC2C0, 0xCA5C, + 0xC2C1, 0xCA5D, 0xC2C2, 0xCA5F, 0xC2C3, 0xCA60, 0xC2C4, 0xCA61, + 0xC2C5, 0xCA68, 0xC2C6, 0xCA7D, 0xC2C7, 0xCA84, 0xC2C8, 0xCA98, + 0xC2C9, 0xCABC, 0xC2CA, 0xCABD, 0xC2CB, 0xCAC0, 0xC2CC, 0xCAC4, + 0xC2CD, 0xCACC, 0xC2CE, 0xCACD, 0xC2CF, 0xCACF, 0xC2D0, 0xCAD1, + 0xC2D1, 0xCAD3, 0xC2D2, 0xCAD8, 0xC2D3, 0xCAD9, 0xC2D4, 0xCAE0, + 0xC2D5, 0xCAEC, 0xC2D6, 0xCAF4, 0xC2D7, 0xCB08, 0xC2D8, 0xCB10, + 0xC2D9, 0xCB14, 0xC2DA, 0xCB18, 0xC2DB, 0xCB20, 0xC2DC, 0xCB21, + 0xC2DD, 0xCB41, 0xC2DE, 0xCB48, 0xC2DF, 0xCB49, 0xC2E0, 0xCB4C, + 0xC2E1, 0xCB50, 0xC2E2, 0xCB58, 0xC2E3, 0xCB59, 0xC2E4, 0xCB5D, + 0xC2E5, 0xCB64, 0xC2E6, 0xCB78, 0xC2E7, 0xCB79, 0xC2E8, 0xCB9C, + 0xC2E9, 0xCBB8, 0xC2EA, 0xCBD4, 0xC2EB, 0xCBE4, 0xC2EC, 0xCBE7, + 0xC2ED, 0xCBE9, 0xC2EE, 0xCC0C, 0xC2EF, 0xCC0D, 0xC2F0, 0xCC10, + 0xC2F1, 0xCC14, 0xC2F2, 0xCC1C, 0xC2F3, 0xCC1D, 0xC2F4, 0xCC21, + 0xC2F5, 0xCC22, 0xC2F6, 0xCC27, 0xC2F7, 0xCC28, 0xC2F8, 0xCC29, + 0xC2F9, 0xCC2C, 0xC2FA, 0xCC2E, 0xC2FB, 0xCC30, 0xC2FC, 0xCC38, + 0xC2FD, 0xCC39, 0xC2FE, 0xCC3B, 0xC341, 0xD63D, 0xC342, 0xD63E, + 0xC343, 0xD63F, 0xC344, 0xD641, 0xC345, 0xD642, 0xC346, 0xD643, + 0xC347, 0xD644, 0xC348, 0xD646, 0xC349, 0xD647, 0xC34A, 0xD64A, + 0xC34B, 0xD64C, 0xC34C, 0xD64E, 0xC34D, 0xD64F, 0xC34E, 0xD650, + 0xC34F, 0xD652, 0xC350, 0xD653, 0xC351, 0xD656, 0xC352, 0xD657, + 0xC353, 0xD659, 0xC354, 0xD65A, 0xC355, 0xD65B, 0xC356, 0xD65D, + 0xC357, 0xD65E, 0xC358, 0xD65F, 0xC359, 0xD660, 0xC35A, 0xD661, + 0xC361, 0xD662, 0xC362, 0xD663, 0xC363, 0xD664, 0xC364, 0xD665, + 0xC365, 0xD666, 0xC366, 0xD668, 0xC367, 0xD66A, 0xC368, 0xD66B, + 0xC369, 0xD66C, 0xC36A, 0xD66D, 0xC36B, 0xD66E, 0xC36C, 0xD66F, + 0xC36D, 0xD672, 0xC36E, 0xD673, 0xC36F, 0xD675, 0xC370, 0xD676, + 0xC371, 0xD677, 0xC372, 0xD678, 0xC373, 0xD679, 0xC374, 0xD67A, + 0xC375, 0xD67B, 0xC376, 0xD67C, 0xC377, 0xD67D, 0xC378, 0xD67E, + 0xC379, 0xD67F, 0xC37A, 0xD680, 0xC381, 0xD681, 0xC382, 0xD682, + 0xC383, 0xD684, 0xC384, 0xD686, 0xC385, 0xD687, 0xC386, 0xD688, + 0xC387, 0xD689, 0xC388, 0xD68A, 0xC389, 0xD68B, 0xC38A, 0xD68E, + 0xC38B, 0xD68F, 0xC38C, 0xD691, 0xC38D, 0xD692, 0xC38E, 0xD693, + 0xC38F, 0xD695, 0xC390, 0xD696, 0xC391, 0xD697, 0xC392, 0xD698, + 0xC393, 0xD699, 0xC394, 0xD69A, 0xC395, 0xD69B, 0xC396, 0xD69C, + 0xC397, 0xD69E, 0xC398, 0xD6A0, 0xC399, 0xD6A2, 0xC39A, 0xD6A3, + 0xC39B, 0xD6A4, 0xC39C, 0xD6A5, 0xC39D, 0xD6A6, 0xC39E, 0xD6A7, + 0xC39F, 0xD6A9, 0xC3A0, 0xD6AA, 0xC3A1, 0xCC3C, 0xC3A2, 0xCC3D, + 0xC3A3, 0xCC3E, 0xC3A4, 0xCC44, 0xC3A5, 0xCC45, 0xC3A6, 0xCC48, + 0xC3A7, 0xCC4C, 0xC3A8, 0xCC54, 0xC3A9, 0xCC55, 0xC3AA, 0xCC57, + 0xC3AB, 0xCC58, 0xC3AC, 0xCC59, 0xC3AD, 0xCC60, 0xC3AE, 0xCC64, + 0xC3AF, 0xCC66, 0xC3B0, 0xCC68, 0xC3B1, 0xCC70, 0xC3B2, 0xCC75, + 0xC3B3, 0xCC98, 0xC3B4, 0xCC99, 0xC3B5, 0xCC9C, 0xC3B6, 0xCCA0, + 0xC3B7, 0xCCA8, 0xC3B8, 0xCCA9, 0xC3B9, 0xCCAB, 0xC3BA, 0xCCAC, + 0xC3BB, 0xCCAD, 0xC3BC, 0xCCB4, 0xC3BD, 0xCCB5, 0xC3BE, 0xCCB8, + 0xC3BF, 0xCCBC, 0xC3C0, 0xCCC4, 0xC3C1, 0xCCC5, 0xC3C2, 0xCCC7, + 0xC3C3, 0xCCC9, 0xC3C4, 0xCCD0, 0xC3C5, 0xCCD4, 0xC3C6, 0xCCE4, + 0xC3C7, 0xCCEC, 0xC3C8, 0xCCF0, 0xC3C9, 0xCD01, 0xC3CA, 0xCD08, + 0xC3CB, 0xCD09, 0xC3CC, 0xCD0C, 0xC3CD, 0xCD10, 0xC3CE, 0xCD18, + 0xC3CF, 0xCD19, 0xC3D0, 0xCD1B, 0xC3D1, 0xCD1D, 0xC3D2, 0xCD24, + 0xC3D3, 0xCD28, 0xC3D4, 0xCD2C, 0xC3D5, 0xCD39, 0xC3D6, 0xCD5C, + 0xC3D7, 0xCD60, 0xC3D8, 0xCD64, 0xC3D9, 0xCD6C, 0xC3DA, 0xCD6D, + 0xC3DB, 0xCD6F, 0xC3DC, 0xCD71, 0xC3DD, 0xCD78, 0xC3DE, 0xCD88, + 0xC3DF, 0xCD94, 0xC3E0, 0xCD95, 0xC3E1, 0xCD98, 0xC3E2, 0xCD9C, + 0xC3E3, 0xCDA4, 0xC3E4, 0xCDA5, 0xC3E5, 0xCDA7, 0xC3E6, 0xCDA9, + 0xC3E7, 0xCDB0, 0xC3E8, 0xCDC4, 0xC3E9, 0xCDCC, 0xC3EA, 0xCDD0, + 0xC3EB, 0xCDE8, 0xC3EC, 0xCDEC, 0xC3ED, 0xCDF0, 0xC3EE, 0xCDF8, + 0xC3EF, 0xCDF9, 0xC3F0, 0xCDFB, 0xC3F1, 0xCDFD, 0xC3F2, 0xCE04, + 0xC3F3, 0xCE08, 0xC3F4, 0xCE0C, 0xC3F5, 0xCE14, 0xC3F6, 0xCE19, + 0xC3F7, 0xCE20, 0xC3F8, 0xCE21, 0xC3F9, 0xCE24, 0xC3FA, 0xCE28, + 0xC3FB, 0xCE30, 0xC3FC, 0xCE31, 0xC3FD, 0xCE33, 0xC3FE, 0xCE35, + 0xC441, 0xD6AB, 0xC442, 0xD6AD, 0xC443, 0xD6AE, 0xC444, 0xD6AF, + 0xC445, 0xD6B1, 0xC446, 0xD6B2, 0xC447, 0xD6B3, 0xC448, 0xD6B4, + 0xC449, 0xD6B5, 0xC44A, 0xD6B6, 0xC44B, 0xD6B7, 0xC44C, 0xD6B8, + 0xC44D, 0xD6BA, 0xC44E, 0xD6BC, 0xC44F, 0xD6BD, 0xC450, 0xD6BE, + 0xC451, 0xD6BF, 0xC452, 0xD6C0, 0xC453, 0xD6C1, 0xC454, 0xD6C2, + 0xC455, 0xD6C3, 0xC456, 0xD6C6, 0xC457, 0xD6C7, 0xC458, 0xD6C9, + 0xC459, 0xD6CA, 0xC45A, 0xD6CB, 0xC461, 0xD6CD, 0xC462, 0xD6CE, + 0xC463, 0xD6CF, 0xC464, 0xD6D0, 0xC465, 0xD6D2, 0xC466, 0xD6D3, + 0xC467, 0xD6D5, 0xC468, 0xD6D6, 0xC469, 0xD6D8, 0xC46A, 0xD6DA, + 0xC46B, 0xD6DB, 0xC46C, 0xD6DC, 0xC46D, 0xD6DD, 0xC46E, 0xD6DE, + 0xC46F, 0xD6DF, 0xC470, 0xD6E1, 0xC471, 0xD6E2, 0xC472, 0xD6E3, + 0xC473, 0xD6E5, 0xC474, 0xD6E6, 0xC475, 0xD6E7, 0xC476, 0xD6E9, + 0xC477, 0xD6EA, 0xC478, 0xD6EB, 0xC479, 0xD6EC, 0xC47A, 0xD6ED, + 0xC481, 0xD6EE, 0xC482, 0xD6EF, 0xC483, 0xD6F1, 0xC484, 0xD6F2, + 0xC485, 0xD6F3, 0xC486, 0xD6F4, 0xC487, 0xD6F6, 0xC488, 0xD6F7, + 0xC489, 0xD6F8, 0xC48A, 0xD6F9, 0xC48B, 0xD6FA, 0xC48C, 0xD6FB, + 0xC48D, 0xD6FE, 0xC48E, 0xD6FF, 0xC48F, 0xD701, 0xC490, 0xD702, + 0xC491, 0xD703, 0xC492, 0xD705, 0xC493, 0xD706, 0xC494, 0xD707, + 0xC495, 0xD708, 0xC496, 0xD709, 0xC497, 0xD70A, 0xC498, 0xD70B, + 0xC499, 0xD70C, 0xC49A, 0xD70D, 0xC49B, 0xD70E, 0xC49C, 0xD70F, + 0xC49D, 0xD710, 0xC49E, 0xD712, 0xC49F, 0xD713, 0xC4A0, 0xD714, + 0xC4A1, 0xCE58, 0xC4A2, 0xCE59, 0xC4A3, 0xCE5C, 0xC4A4, 0xCE5F, + 0xC4A5, 0xCE60, 0xC4A6, 0xCE61, 0xC4A7, 0xCE68, 0xC4A8, 0xCE69, + 0xC4A9, 0xCE6B, 0xC4AA, 0xCE6D, 0xC4AB, 0xCE74, 0xC4AC, 0xCE75, + 0xC4AD, 0xCE78, 0xC4AE, 0xCE7C, 0xC4AF, 0xCE84, 0xC4B0, 0xCE85, + 0xC4B1, 0xCE87, 0xC4B2, 0xCE89, 0xC4B3, 0xCE90, 0xC4B4, 0xCE91, + 0xC4B5, 0xCE94, 0xC4B6, 0xCE98, 0xC4B7, 0xCEA0, 0xC4B8, 0xCEA1, + 0xC4B9, 0xCEA3, 0xC4BA, 0xCEA4, 0xC4BB, 0xCEA5, 0xC4BC, 0xCEAC, + 0xC4BD, 0xCEAD, 0xC4BE, 0xCEC1, 0xC4BF, 0xCEE4, 0xC4C0, 0xCEE5, + 0xC4C1, 0xCEE8, 0xC4C2, 0xCEEB, 0xC4C3, 0xCEEC, 0xC4C4, 0xCEF4, + 0xC4C5, 0xCEF5, 0xC4C6, 0xCEF7, 0xC4C7, 0xCEF8, 0xC4C8, 0xCEF9, + 0xC4C9, 0xCF00, 0xC4CA, 0xCF01, 0xC4CB, 0xCF04, 0xC4CC, 0xCF08, + 0xC4CD, 0xCF10, 0xC4CE, 0xCF11, 0xC4CF, 0xCF13, 0xC4D0, 0xCF15, + 0xC4D1, 0xCF1C, 0xC4D2, 0xCF20, 0xC4D3, 0xCF24, 0xC4D4, 0xCF2C, + 0xC4D5, 0xCF2D, 0xC4D6, 0xCF2F, 0xC4D7, 0xCF30, 0xC4D8, 0xCF31, + 0xC4D9, 0xCF38, 0xC4DA, 0xCF54, 0xC4DB, 0xCF55, 0xC4DC, 0xCF58, + 0xC4DD, 0xCF5C, 0xC4DE, 0xCF64, 0xC4DF, 0xCF65, 0xC4E0, 0xCF67, + 0xC4E1, 0xCF69, 0xC4E2, 0xCF70, 0xC4E3, 0xCF71, 0xC4E4, 0xCF74, + 0xC4E5, 0xCF78, 0xC4E6, 0xCF80, 0xC4E7, 0xCF85, 0xC4E8, 0xCF8C, + 0xC4E9, 0xCFA1, 0xC4EA, 0xCFA8, 0xC4EB, 0xCFB0, 0xC4EC, 0xCFC4, + 0xC4ED, 0xCFE0, 0xC4EE, 0xCFE1, 0xC4EF, 0xCFE4, 0xC4F0, 0xCFE8, + 0xC4F1, 0xCFF0, 0xC4F2, 0xCFF1, 0xC4F3, 0xCFF3, 0xC4F4, 0xCFF5, + 0xC4F5, 0xCFFC, 0xC4F6, 0xD000, 0xC4F7, 0xD004, 0xC4F8, 0xD011, + 0xC4F9, 0xD018, 0xC4FA, 0xD02D, 0xC4FB, 0xD034, 0xC4FC, 0xD035, + 0xC4FD, 0xD038, 0xC4FE, 0xD03C, 0xC541, 0xD715, 0xC542, 0xD716, + 0xC543, 0xD717, 0xC544, 0xD71A, 0xC545, 0xD71B, 0xC546, 0xD71D, + 0xC547, 0xD71E, 0xC548, 0xD71F, 0xC549, 0xD721, 0xC54A, 0xD722, + 0xC54B, 0xD723, 0xC54C, 0xD724, 0xC54D, 0xD725, 0xC54E, 0xD726, + 0xC54F, 0xD727, 0xC550, 0xD72A, 0xC551, 0xD72C, 0xC552, 0xD72E, + 0xC553, 0xD72F, 0xC554, 0xD730, 0xC555, 0xD731, 0xC556, 0xD732, + 0xC557, 0xD733, 0xC558, 0xD736, 0xC559, 0xD737, 0xC55A, 0xD739, + 0xC561, 0xD73A, 0xC562, 0xD73B, 0xC563, 0xD73D, 0xC564, 0xD73E, + 0xC565, 0xD73F, 0xC566, 0xD740, 0xC567, 0xD741, 0xC568, 0xD742, + 0xC569, 0xD743, 0xC56A, 0xD745, 0xC56B, 0xD746, 0xC56C, 0xD748, + 0xC56D, 0xD74A, 0xC56E, 0xD74B, 0xC56F, 0xD74C, 0xC570, 0xD74D, + 0xC571, 0xD74E, 0xC572, 0xD74F, 0xC573, 0xD752, 0xC574, 0xD753, + 0xC575, 0xD755, 0xC576, 0xD75A, 0xC577, 0xD75B, 0xC578, 0xD75C, + 0xC579, 0xD75D, 0xC57A, 0xD75E, 0xC581, 0xD75F, 0xC582, 0xD762, + 0xC583, 0xD764, 0xC584, 0xD766, 0xC585, 0xD767, 0xC586, 0xD768, + 0xC587, 0xD76A, 0xC588, 0xD76B, 0xC589, 0xD76D, 0xC58A, 0xD76E, + 0xC58B, 0xD76F, 0xC58C, 0xD771, 0xC58D, 0xD772, 0xC58E, 0xD773, + 0xC58F, 0xD775, 0xC590, 0xD776, 0xC591, 0xD777, 0xC592, 0xD778, + 0xC593, 0xD779, 0xC594, 0xD77A, 0xC595, 0xD77B, 0xC596, 0xD77E, + 0xC597, 0xD77F, 0xC598, 0xD780, 0xC599, 0xD782, 0xC59A, 0xD783, + 0xC59B, 0xD784, 0xC59C, 0xD785, 0xC59D, 0xD786, 0xC59E, 0xD787, + 0xC59F, 0xD78A, 0xC5A0, 0xD78B, 0xC5A1, 0xD044, 0xC5A2, 0xD045, + 0xC5A3, 0xD047, 0xC5A4, 0xD049, 0xC5A5, 0xD050, 0xC5A6, 0xD054, + 0xC5A7, 0xD058, 0xC5A8, 0xD060, 0xC5A9, 0xD06C, 0xC5AA, 0xD06D, + 0xC5AB, 0xD070, 0xC5AC, 0xD074, 0xC5AD, 0xD07C, 0xC5AE, 0xD07D, + 0xC5AF, 0xD081, 0xC5B0, 0xD0A4, 0xC5B1, 0xD0A5, 0xC5B2, 0xD0A8, + 0xC5B3, 0xD0AC, 0xC5B4, 0xD0B4, 0xC5B5, 0xD0B5, 0xC5B6, 0xD0B7, + 0xC5B7, 0xD0B9, 0xC5B8, 0xD0C0, 0xC5B9, 0xD0C1, 0xC5BA, 0xD0C4, + 0xC5BB, 0xD0C8, 0xC5BC, 0xD0C9, 0xC5BD, 0xD0D0, 0xC5BE, 0xD0D1, + 0xC5BF, 0xD0D3, 0xC5C0, 0xD0D4, 0xC5C1, 0xD0D5, 0xC5C2, 0xD0DC, + 0xC5C3, 0xD0DD, 0xC5C4, 0xD0E0, 0xC5C5, 0xD0E4, 0xC5C6, 0xD0EC, + 0xC5C7, 0xD0ED, 0xC5C8, 0xD0EF, 0xC5C9, 0xD0F0, 0xC5CA, 0xD0F1, + 0xC5CB, 0xD0F8, 0xC5CC, 0xD10D, 0xC5CD, 0xD130, 0xC5CE, 0xD131, + 0xC5CF, 0xD134, 0xC5D0, 0xD138, 0xC5D1, 0xD13A, 0xC5D2, 0xD140, + 0xC5D3, 0xD141, 0xC5D4, 0xD143, 0xC5D5, 0xD144, 0xC5D6, 0xD145, + 0xC5D7, 0xD14C, 0xC5D8, 0xD14D, 0xC5D9, 0xD150, 0xC5DA, 0xD154, + 0xC5DB, 0xD15C, 0xC5DC, 0xD15D, 0xC5DD, 0xD15F, 0xC5DE, 0xD161, + 0xC5DF, 0xD168, 0xC5E0, 0xD16C, 0xC5E1, 0xD17C, 0xC5E2, 0xD184, + 0xC5E3, 0xD188, 0xC5E4, 0xD1A0, 0xC5E5, 0xD1A1, 0xC5E6, 0xD1A4, + 0xC5E7, 0xD1A8, 0xC5E8, 0xD1B0, 0xC5E9, 0xD1B1, 0xC5EA, 0xD1B3, + 0xC5EB, 0xD1B5, 0xC5EC, 0xD1BA, 0xC5ED, 0xD1BC, 0xC5EE, 0xD1C0, + 0xC5EF, 0xD1D8, 0xC5F0, 0xD1F4, 0xC5F1, 0xD1F8, 0xC5F2, 0xD207, + 0xC5F3, 0xD209, 0xC5F4, 0xD210, 0xC5F5, 0xD22C, 0xC5F6, 0xD22D, + 0xC5F7, 0xD230, 0xC5F8, 0xD234, 0xC5F9, 0xD23C, 0xC5FA, 0xD23D, + 0xC5FB, 0xD23F, 0xC5FC, 0xD241, 0xC5FD, 0xD248, 0xC5FE, 0xD25C, + 0xC641, 0xD78D, 0xC642, 0xD78E, 0xC643, 0xD78F, 0xC644, 0xD791, + 0xC645, 0xD792, 0xC646, 0xD793, 0xC647, 0xD794, 0xC648, 0xD795, + 0xC649, 0xD796, 0xC64A, 0xD797, 0xC64B, 0xD79A, 0xC64C, 0xD79C, + 0xC64D, 0xD79E, 0xC64E, 0xD79F, 0xC64F, 0xD7A0, 0xC650, 0xD7A1, + 0xC651, 0xD7A2, 0xC652, 0xD7A3, 0xC6A1, 0xD264, 0xC6A2, 0xD280, + 0xC6A3, 0xD281, 0xC6A4, 0xD284, 0xC6A5, 0xD288, 0xC6A6, 0xD290, + 0xC6A7, 0xD291, 0xC6A8, 0xD295, 0xC6A9, 0xD29C, 0xC6AA, 0xD2A0, + 0xC6AB, 0xD2A4, 0xC6AC, 0xD2AC, 0xC6AD, 0xD2B1, 0xC6AE, 0xD2B8, + 0xC6AF, 0xD2B9, 0xC6B0, 0xD2BC, 0xC6B1, 0xD2BF, 0xC6B2, 0xD2C0, + 0xC6B3, 0xD2C2, 0xC6B4, 0xD2C8, 0xC6B5, 0xD2C9, 0xC6B6, 0xD2CB, + 0xC6B7, 0xD2D4, 0xC6B8, 0xD2D8, 0xC6B9, 0xD2DC, 0xC6BA, 0xD2E4, + 0xC6BB, 0xD2E5, 0xC6BC, 0xD2F0, 0xC6BD, 0xD2F1, 0xC6BE, 0xD2F4, + 0xC6BF, 0xD2F8, 0xC6C0, 0xD300, 0xC6C1, 0xD301, 0xC6C2, 0xD303, + 0xC6C3, 0xD305, 0xC6C4, 0xD30C, 0xC6C5, 0xD30D, 0xC6C6, 0xD30E, + 0xC6C7, 0xD310, 0xC6C8, 0xD314, 0xC6C9, 0xD316, 0xC6CA, 0xD31C, + 0xC6CB, 0xD31D, 0xC6CC, 0xD31F, 0xC6CD, 0xD320, 0xC6CE, 0xD321, + 0xC6CF, 0xD325, 0xC6D0, 0xD328, 0xC6D1, 0xD329, 0xC6D2, 0xD32C, + 0xC6D3, 0xD330, 0xC6D4, 0xD338, 0xC6D5, 0xD339, 0xC6D6, 0xD33B, + 0xC6D7, 0xD33C, 0xC6D8, 0xD33D, 0xC6D9, 0xD344, 0xC6DA, 0xD345, + 0xC6DB, 0xD37C, 0xC6DC, 0xD37D, 0xC6DD, 0xD380, 0xC6DE, 0xD384, + 0xC6DF, 0xD38C, 0xC6E0, 0xD38D, 0xC6E1, 0xD38F, 0xC6E2, 0xD390, + 0xC6E3, 0xD391, 0xC6E4, 0xD398, 0xC6E5, 0xD399, 0xC6E6, 0xD39C, + 0xC6E7, 0xD3A0, 0xC6E8, 0xD3A8, 0xC6E9, 0xD3A9, 0xC6EA, 0xD3AB, + 0xC6EB, 0xD3AD, 0xC6EC, 0xD3B4, 0xC6ED, 0xD3B8, 0xC6EE, 0xD3BC, + 0xC6EF, 0xD3C4, 0xC6F0, 0xD3C5, 0xC6F1, 0xD3C8, 0xC6F2, 0xD3C9, + 0xC6F3, 0xD3D0, 0xC6F4, 0xD3D8, 0xC6F5, 0xD3E1, 0xC6F6, 0xD3E3, + 0xC6F7, 0xD3EC, 0xC6F8, 0xD3ED, 0xC6F9, 0xD3F0, 0xC6FA, 0xD3F4, + 0xC6FB, 0xD3FC, 0xC6FC, 0xD3FD, 0xC6FD, 0xD3FF, 0xC6FE, 0xD401, + 0xC7A1, 0xD408, 0xC7A2, 0xD41D, 0xC7A3, 0xD440, 0xC7A4, 0xD444, + 0xC7A5, 0xD45C, 0xC7A6, 0xD460, 0xC7A7, 0xD464, 0xC7A8, 0xD46D, + 0xC7A9, 0xD46F, 0xC7AA, 0xD478, 0xC7AB, 0xD479, 0xC7AC, 0xD47C, + 0xC7AD, 0xD47F, 0xC7AE, 0xD480, 0xC7AF, 0xD482, 0xC7B0, 0xD488, + 0xC7B1, 0xD489, 0xC7B2, 0xD48B, 0xC7B3, 0xD48D, 0xC7B4, 0xD494, + 0xC7B5, 0xD4A9, 0xC7B6, 0xD4CC, 0xC7B7, 0xD4D0, 0xC7B8, 0xD4D4, + 0xC7B9, 0xD4DC, 0xC7BA, 0xD4DF, 0xC7BB, 0xD4E8, 0xC7BC, 0xD4EC, + 0xC7BD, 0xD4F0, 0xC7BE, 0xD4F8, 0xC7BF, 0xD4FB, 0xC7C0, 0xD4FD, + 0xC7C1, 0xD504, 0xC7C2, 0xD508, 0xC7C3, 0xD50C, 0xC7C4, 0xD514, + 0xC7C5, 0xD515, 0xC7C6, 0xD517, 0xC7C7, 0xD53C, 0xC7C8, 0xD53D, + 0xC7C9, 0xD540, 0xC7CA, 0xD544, 0xC7CB, 0xD54C, 0xC7CC, 0xD54D, + 0xC7CD, 0xD54F, 0xC7CE, 0xD551, 0xC7CF, 0xD558, 0xC7D0, 0xD559, + 0xC7D1, 0xD55C, 0xC7D2, 0xD560, 0xC7D3, 0xD565, 0xC7D4, 0xD568, + 0xC7D5, 0xD569, 0xC7D6, 0xD56B, 0xC7D7, 0xD56D, 0xC7D8, 0xD574, + 0xC7D9, 0xD575, 0xC7DA, 0xD578, 0xC7DB, 0xD57C, 0xC7DC, 0xD584, + 0xC7DD, 0xD585, 0xC7DE, 0xD587, 0xC7DF, 0xD588, 0xC7E0, 0xD589, + 0xC7E1, 0xD590, 0xC7E2, 0xD5A5, 0xC7E3, 0xD5C8, 0xC7E4, 0xD5C9, + 0xC7E5, 0xD5CC, 0xC7E6, 0xD5D0, 0xC7E7, 0xD5D2, 0xC7E8, 0xD5D8, + 0xC7E9, 0xD5D9, 0xC7EA, 0xD5DB, 0xC7EB, 0xD5DD, 0xC7EC, 0xD5E4, + 0xC7ED, 0xD5E5, 0xC7EE, 0xD5E8, 0xC7EF, 0xD5EC, 0xC7F0, 0xD5F4, + 0xC7F1, 0xD5F5, 0xC7F2, 0xD5F7, 0xC7F3, 0xD5F9, 0xC7F4, 0xD600, + 0xC7F5, 0xD601, 0xC7F6, 0xD604, 0xC7F7, 0xD608, 0xC7F8, 0xD610, + 0xC7F9, 0xD611, 0xC7FA, 0xD613, 0xC7FB, 0xD614, 0xC7FC, 0xD615, + 0xC7FD, 0xD61C, 0xC7FE, 0xD620, 0xC8A1, 0xD624, 0xC8A2, 0xD62D, + 0xC8A3, 0xD638, 0xC8A4, 0xD639, 0xC8A5, 0xD63C, 0xC8A6, 0xD640, + 0xC8A7, 0xD645, 0xC8A8, 0xD648, 0xC8A9, 0xD649, 0xC8AA, 0xD64B, + 0xC8AB, 0xD64D, 0xC8AC, 0xD651, 0xC8AD, 0xD654, 0xC8AE, 0xD655, + 0xC8AF, 0xD658, 0xC8B0, 0xD65C, 0xC8B1, 0xD667, 0xC8B2, 0xD669, + 0xC8B3, 0xD670, 0xC8B4, 0xD671, 0xC8B5, 0xD674, 0xC8B6, 0xD683, + 0xC8B7, 0xD685, 0xC8B8, 0xD68C, 0xC8B9, 0xD68D, 0xC8BA, 0xD690, + 0xC8BB, 0xD694, 0xC8BC, 0xD69D, 0xC8BD, 0xD69F, 0xC8BE, 0xD6A1, + 0xC8BF, 0xD6A8, 0xC8C0, 0xD6AC, 0xC8C1, 0xD6B0, 0xC8C2, 0xD6B9, + 0xC8C3, 0xD6BB, 0xC8C4, 0xD6C4, 0xC8C5, 0xD6C5, 0xC8C6, 0xD6C8, + 0xC8C7, 0xD6CC, 0xC8C8, 0xD6D1, 0xC8C9, 0xD6D4, 0xC8CA, 0xD6D7, + 0xC8CB, 0xD6D9, 0xC8CC, 0xD6E0, 0xC8CD, 0xD6E4, 0xC8CE, 0xD6E8, + 0xC8CF, 0xD6F0, 0xC8D0, 0xD6F5, 0xC8D1, 0xD6FC, 0xC8D2, 0xD6FD, + 0xC8D3, 0xD700, 0xC8D4, 0xD704, 0xC8D5, 0xD711, 0xC8D6, 0xD718, + 0xC8D7, 0xD719, 0xC8D8, 0xD71C, 0xC8D9, 0xD720, 0xC8DA, 0xD728, + 0xC8DB, 0xD729, 0xC8DC, 0xD72B, 0xC8DD, 0xD72D, 0xC8DE, 0xD734, + 0xC8DF, 0xD735, 0xC8E0, 0xD738, 0xC8E1, 0xD73C, 0xC8E2, 0xD744, + 0xC8E3, 0xD747, 0xC8E4, 0xD749, 0xC8E5, 0xD750, 0xC8E6, 0xD751, + 0xC8E7, 0xD754, 0xC8E8, 0xD756, 0xC8E9, 0xD757, 0xC8EA, 0xD758, + 0xC8EB, 0xD759, 0xC8EC, 0xD760, 0xC8ED, 0xD761, 0xC8EE, 0xD763, + 0xC8EF, 0xD765, 0xC8F0, 0xD769, 0xC8F1, 0xD76C, 0xC8F2, 0xD770, + 0xC8F3, 0xD774, 0xC8F4, 0xD77C, 0xC8F5, 0xD77D, 0xC8F6, 0xD781, + 0xC8F7, 0xD788, 0xC8F8, 0xD789, 0xC8F9, 0xD78C, 0xC8FA, 0xD790, + 0xC8FB, 0xD798, 0xC8FC, 0xD799, 0xC8FD, 0xD79B, 0xC8FE, 0xD79D, + 0xCAA1, 0x4F3D, 0xCAA2, 0x4F73, 0xCAA3, 0x5047, 0xCAA4, 0x50F9, + 0xCAA5, 0x52A0, 0xCAA6, 0x53EF, 0xCAA7, 0x5475, 0xCAA8, 0x54E5, + 0xCAA9, 0x5609, 0xCAAA, 0x5AC1, 0xCAAB, 0x5BB6, 0xCAAC, 0x6687, + 0xCAAD, 0x67B6, 0xCAAE, 0x67B7, 0xCAAF, 0x67EF, 0xCAB0, 0x6B4C, + 0xCAB1, 0x73C2, 0xCAB2, 0x75C2, 0xCAB3, 0x7A3C, 0xCAB4, 0x82DB, + 0xCAB5, 0x8304, 0xCAB6, 0x8857, 0xCAB7, 0x8888, 0xCAB8, 0x8A36, + 0xCAB9, 0x8CC8, 0xCABA, 0x8DCF, 0xCABB, 0x8EFB, 0xCABC, 0x8FE6, + 0xCABD, 0x99D5, 0xCABE, 0x523B, 0xCABF, 0x5374, 0xCAC0, 0x5404, + 0xCAC1, 0x606A, 0xCAC2, 0x6164, 0xCAC3, 0x6BBC, 0xCAC4, 0x73CF, + 0xCAC5, 0x811A, 0xCAC6, 0x89BA, 0xCAC7, 0x89D2, 0xCAC8, 0x95A3, + 0xCAC9, 0x4F83, 0xCACA, 0x520A, 0xCACB, 0x58BE, 0xCACC, 0x5978, + 0xCACD, 0x59E6, 0xCACE, 0x5E72, 0xCACF, 0x5E79, 0xCAD0, 0x61C7, + 0xCAD1, 0x63C0, 0xCAD2, 0x6746, 0xCAD3, 0x67EC, 0xCAD4, 0x687F, + 0xCAD5, 0x6F97, 0xCAD6, 0x764E, 0xCAD7, 0x770B, 0xCAD8, 0x78F5, + 0xCAD9, 0x7A08, 0xCADA, 0x7AFF, 0xCADB, 0x7C21, 0xCADC, 0x809D, + 0xCADD, 0x826E, 0xCADE, 0x8271, 0xCADF, 0x8AEB, 0xCAE0, 0x9593, + 0xCAE1, 0x4E6B, 0xCAE2, 0x559D, 0xCAE3, 0x66F7, 0xCAE4, 0x6E34, + 0xCAE5, 0x78A3, 0xCAE6, 0x7AED, 0xCAE7, 0x845B, 0xCAE8, 0x8910, + 0xCAE9, 0x874E, 0xCAEA, 0x97A8, 0xCAEB, 0x52D8, 0xCAEC, 0x574E, + 0xCAED, 0x582A, 0xCAEE, 0x5D4C, 0xCAEF, 0x611F, 0xCAF0, 0x61BE, + 0xCAF1, 0x6221, 0xCAF2, 0x6562, 0xCAF3, 0x67D1, 0xCAF4, 0x6A44, + 0xCAF5, 0x6E1B, 0xCAF6, 0x7518, 0xCAF7, 0x75B3, 0xCAF8, 0x76E3, + 0xCAF9, 0x77B0, 0xCAFA, 0x7D3A, 0xCAFB, 0x90AF, 0xCAFC, 0x9451, + 0xCAFD, 0x9452, 0xCAFE, 0x9F95, 0xCBA1, 0x5323, 0xCBA2, 0x5CAC, + 0xCBA3, 0x7532, 0xCBA4, 0x80DB, 0xCBA5, 0x9240, 0xCBA6, 0x9598, + 0xCBA7, 0x525B, 0xCBA8, 0x5808, 0xCBA9, 0x59DC, 0xCBAA, 0x5CA1, + 0xCBAB, 0x5D17, 0xCBAC, 0x5EB7, 0xCBAD, 0x5F3A, 0xCBAE, 0x5F4A, + 0xCBAF, 0x6177, 0xCBB0, 0x6C5F, 0xCBB1, 0x757A, 0xCBB2, 0x7586, + 0xCBB3, 0x7CE0, 0xCBB4, 0x7D73, 0xCBB5, 0x7DB1, 0xCBB6, 0x7F8C, + 0xCBB7, 0x8154, 0xCBB8, 0x8221, 0xCBB9, 0x8591, 0xCBBA, 0x8941, + 0xCBBB, 0x8B1B, 0xCBBC, 0x92FC, 0xCBBD, 0x964D, 0xCBBE, 0x9C47, + 0xCBBF, 0x4ECB, 0xCBC0, 0x4EF7, 0xCBC1, 0x500B, 0xCBC2, 0x51F1, + 0xCBC3, 0x584F, 0xCBC4, 0x6137, 0xCBC5, 0x613E, 0xCBC6, 0x6168, + 0xCBC7, 0x6539, 0xCBC8, 0x69EA, 0xCBC9, 0x6F11, 0xCBCA, 0x75A5, + 0xCBCB, 0x7686, 0xCBCC, 0x76D6, 0xCBCD, 0x7B87, 0xCBCE, 0x82A5, + 0xCBCF, 0x84CB, 0xCBD0, 0xF900, 0xCBD1, 0x93A7, 0xCBD2, 0x958B, + 0xCBD3, 0x5580, 0xCBD4, 0x5BA2, 0xCBD5, 0x5751, 0xCBD6, 0xF901, + 0xCBD7, 0x7CB3, 0xCBD8, 0x7FB9, 0xCBD9, 0x91B5, 0xCBDA, 0x5028, + 0xCBDB, 0x53BB, 0xCBDC, 0x5C45, 0xCBDD, 0x5DE8, 0xCBDE, 0x62D2, + 0xCBDF, 0x636E, 0xCBE0, 0x64DA, 0xCBE1, 0x64E7, 0xCBE2, 0x6E20, + 0xCBE3, 0x70AC, 0xCBE4, 0x795B, 0xCBE5, 0x8DDD, 0xCBE6, 0x8E1E, + 0xCBE7, 0xF902, 0xCBE8, 0x907D, 0xCBE9, 0x9245, 0xCBEA, 0x92F8, + 0xCBEB, 0x4E7E, 0xCBEC, 0x4EF6, 0xCBED, 0x5065, 0xCBEE, 0x5DFE, + 0xCBEF, 0x5EFA, 0xCBF0, 0x6106, 0xCBF1, 0x6957, 0xCBF2, 0x8171, + 0xCBF3, 0x8654, 0xCBF4, 0x8E47, 0xCBF5, 0x9375, 0xCBF6, 0x9A2B, + 0xCBF7, 0x4E5E, 0xCBF8, 0x5091, 0xCBF9, 0x6770, 0xCBFA, 0x6840, + 0xCBFB, 0x5109, 0xCBFC, 0x528D, 0xCBFD, 0x5292, 0xCBFE, 0x6AA2, + 0xCCA1, 0x77BC, 0xCCA2, 0x9210, 0xCCA3, 0x9ED4, 0xCCA4, 0x52AB, + 0xCCA5, 0x602F, 0xCCA6, 0x8FF2, 0xCCA7, 0x5048, 0xCCA8, 0x61A9, + 0xCCA9, 0x63ED, 0xCCAA, 0x64CA, 0xCCAB, 0x683C, 0xCCAC, 0x6A84, + 0xCCAD, 0x6FC0, 0xCCAE, 0x8188, 0xCCAF, 0x89A1, 0xCCB0, 0x9694, + 0xCCB1, 0x5805, 0xCCB2, 0x727D, 0xCCB3, 0x72AC, 0xCCB4, 0x7504, + 0xCCB5, 0x7D79, 0xCCB6, 0x7E6D, 0xCCB7, 0x80A9, 0xCCB8, 0x898B, + 0xCCB9, 0x8B74, 0xCCBA, 0x9063, 0xCCBB, 0x9D51, 0xCCBC, 0x6289, + 0xCCBD, 0x6C7A, 0xCCBE, 0x6F54, 0xCCBF, 0x7D50, 0xCCC0, 0x7F3A, + 0xCCC1, 0x8A23, 0xCCC2, 0x517C, 0xCCC3, 0x614A, 0xCCC4, 0x7B9D, + 0xCCC5, 0x8B19, 0xCCC6, 0x9257, 0xCCC7, 0x938C, 0xCCC8, 0x4EAC, + 0xCCC9, 0x4FD3, 0xCCCA, 0x501E, 0xCCCB, 0x50BE, 0xCCCC, 0x5106, + 0xCCCD, 0x52C1, 0xCCCE, 0x52CD, 0xCCCF, 0x537F, 0xCCD0, 0x5770, + 0xCCD1, 0x5883, 0xCCD2, 0x5E9A, 0xCCD3, 0x5F91, 0xCCD4, 0x6176, + 0xCCD5, 0x61AC, 0xCCD6, 0x64CE, 0xCCD7, 0x656C, 0xCCD8, 0x666F, + 0xCCD9, 0x66BB, 0xCCDA, 0x66F4, 0xCCDB, 0x6897, 0xCCDC, 0x6D87, + 0xCCDD, 0x7085, 0xCCDE, 0x70F1, 0xCCDF, 0x749F, 0xCCE0, 0x74A5, + 0xCCE1, 0x74CA, 0xCCE2, 0x75D9, 0xCCE3, 0x786C, 0xCCE4, 0x78EC, + 0xCCE5, 0x7ADF, 0xCCE6, 0x7AF6, 0xCCE7, 0x7D45, 0xCCE8, 0x7D93, + 0xCCE9, 0x8015, 0xCCEA, 0x803F, 0xCCEB, 0x811B, 0xCCEC, 0x8396, + 0xCCED, 0x8B66, 0xCCEE, 0x8F15, 0xCCEF, 0x9015, 0xCCF0, 0x93E1, + 0xCCF1, 0x9803, 0xCCF2, 0x9838, 0xCCF3, 0x9A5A, 0xCCF4, 0x9BE8, + 0xCCF5, 0x4FC2, 0xCCF6, 0x5553, 0xCCF7, 0x583A, 0xCCF8, 0x5951, + 0xCCF9, 0x5B63, 0xCCFA, 0x5C46, 0xCCFB, 0x60B8, 0xCCFC, 0x6212, + 0xCCFD, 0x6842, 0xCCFE, 0x68B0, 0xCDA1, 0x68E8, 0xCDA2, 0x6EAA, + 0xCDA3, 0x754C, 0xCDA4, 0x7678, 0xCDA5, 0x78CE, 0xCDA6, 0x7A3D, + 0xCDA7, 0x7CFB, 0xCDA8, 0x7E6B, 0xCDA9, 0x7E7C, 0xCDAA, 0x8A08, + 0xCDAB, 0x8AA1, 0xCDAC, 0x8C3F, 0xCDAD, 0x968E, 0xCDAE, 0x9DC4, + 0xCDAF, 0x53E4, 0xCDB0, 0x53E9, 0xCDB1, 0x544A, 0xCDB2, 0x5471, + 0xCDB3, 0x56FA, 0xCDB4, 0x59D1, 0xCDB5, 0x5B64, 0xCDB6, 0x5C3B, + 0xCDB7, 0x5EAB, 0xCDB8, 0x62F7, 0xCDB9, 0x6537, 0xCDBA, 0x6545, + 0xCDBB, 0x6572, 0xCDBC, 0x66A0, 0xCDBD, 0x67AF, 0xCDBE, 0x69C1, + 0xCDBF, 0x6CBD, 0xCDC0, 0x75FC, 0xCDC1, 0x7690, 0xCDC2, 0x777E, + 0xCDC3, 0x7A3F, 0xCDC4, 0x7F94, 0xCDC5, 0x8003, 0xCDC6, 0x80A1, + 0xCDC7, 0x818F, 0xCDC8, 0x82E6, 0xCDC9, 0x82FD, 0xCDCA, 0x83F0, + 0xCDCB, 0x85C1, 0xCDCC, 0x8831, 0xCDCD, 0x88B4, 0xCDCE, 0x8AA5, + 0xCDCF, 0xF903, 0xCDD0, 0x8F9C, 0xCDD1, 0x932E, 0xCDD2, 0x96C7, + 0xCDD3, 0x9867, 0xCDD4, 0x9AD8, 0xCDD5, 0x9F13, 0xCDD6, 0x54ED, + 0xCDD7, 0x659B, 0xCDD8, 0x66F2, 0xCDD9, 0x688F, 0xCDDA, 0x7A40, + 0xCDDB, 0x8C37, 0xCDDC, 0x9D60, 0xCDDD, 0x56F0, 0xCDDE, 0x5764, + 0xCDDF, 0x5D11, 0xCDE0, 0x6606, 0xCDE1, 0x68B1, 0xCDE2, 0x68CD, + 0xCDE3, 0x6EFE, 0xCDE4, 0x7428, 0xCDE5, 0x889E, 0xCDE6, 0x9BE4, + 0xCDE7, 0x6C68, 0xCDE8, 0xF904, 0xCDE9, 0x9AA8, 0xCDEA, 0x4F9B, + 0xCDEB, 0x516C, 0xCDEC, 0x5171, 0xCDED, 0x529F, 0xCDEE, 0x5B54, + 0xCDEF, 0x5DE5, 0xCDF0, 0x6050, 0xCDF1, 0x606D, 0xCDF2, 0x62F1, + 0xCDF3, 0x63A7, 0xCDF4, 0x653B, 0xCDF5, 0x73D9, 0xCDF6, 0x7A7A, + 0xCDF7, 0x86A3, 0xCDF8, 0x8CA2, 0xCDF9, 0x978F, 0xCDFA, 0x4E32, + 0xCDFB, 0x5BE1, 0xCDFC, 0x6208, 0xCDFD, 0x679C, 0xCDFE, 0x74DC, + 0xCEA1, 0x79D1, 0xCEA2, 0x83D3, 0xCEA3, 0x8A87, 0xCEA4, 0x8AB2, + 0xCEA5, 0x8DE8, 0xCEA6, 0x904E, 0xCEA7, 0x934B, 0xCEA8, 0x9846, + 0xCEA9, 0x5ED3, 0xCEAA, 0x69E8, 0xCEAB, 0x85FF, 0xCEAC, 0x90ED, + 0xCEAD, 0xF905, 0xCEAE, 0x51A0, 0xCEAF, 0x5B98, 0xCEB0, 0x5BEC, + 0xCEB1, 0x6163, 0xCEB2, 0x68FA, 0xCEB3, 0x6B3E, 0xCEB4, 0x704C, + 0xCEB5, 0x742F, 0xCEB6, 0x74D8, 0xCEB7, 0x7BA1, 0xCEB8, 0x7F50, + 0xCEB9, 0x83C5, 0xCEBA, 0x89C0, 0xCEBB, 0x8CAB, 0xCEBC, 0x95DC, + 0xCEBD, 0x9928, 0xCEBE, 0x522E, 0xCEBF, 0x605D, 0xCEC0, 0x62EC, + 0xCEC1, 0x9002, 0xCEC2, 0x4F8A, 0xCEC3, 0x5149, 0xCEC4, 0x5321, + 0xCEC5, 0x58D9, 0xCEC6, 0x5EE3, 0xCEC7, 0x66E0, 0xCEC8, 0x6D38, + 0xCEC9, 0x709A, 0xCECA, 0x72C2, 0xCECB, 0x73D6, 0xCECC, 0x7B50, + 0xCECD, 0x80F1, 0xCECE, 0x945B, 0xCECF, 0x5366, 0xCED0, 0x639B, + 0xCED1, 0x7F6B, 0xCED2, 0x4E56, 0xCED3, 0x5080, 0xCED4, 0x584A, + 0xCED5, 0x58DE, 0xCED6, 0x602A, 0xCED7, 0x6127, 0xCED8, 0x62D0, + 0xCED9, 0x69D0, 0xCEDA, 0x9B41, 0xCEDB, 0x5B8F, 0xCEDC, 0x7D18, + 0xCEDD, 0x80B1, 0xCEDE, 0x8F5F, 0xCEDF, 0x4EA4, 0xCEE0, 0x50D1, + 0xCEE1, 0x54AC, 0xCEE2, 0x55AC, 0xCEE3, 0x5B0C, 0xCEE4, 0x5DA0, + 0xCEE5, 0x5DE7, 0xCEE6, 0x652A, 0xCEE7, 0x654E, 0xCEE8, 0x6821, + 0xCEE9, 0x6A4B, 0xCEEA, 0x72E1, 0xCEEB, 0x768E, 0xCEEC, 0x77EF, + 0xCEED, 0x7D5E, 0xCEEE, 0x7FF9, 0xCEEF, 0x81A0, 0xCEF0, 0x854E, + 0xCEF1, 0x86DF, 0xCEF2, 0x8F03, 0xCEF3, 0x8F4E, 0xCEF4, 0x90CA, + 0xCEF5, 0x9903, 0xCEF6, 0x9A55, 0xCEF7, 0x9BAB, 0xCEF8, 0x4E18, + 0xCEF9, 0x4E45, 0xCEFA, 0x4E5D, 0xCEFB, 0x4EC7, 0xCEFC, 0x4FF1, + 0xCEFD, 0x5177, 0xCEFE, 0x52FE, 0xCFA1, 0x5340, 0xCFA2, 0x53E3, + 0xCFA3, 0x53E5, 0xCFA4, 0x548E, 0xCFA5, 0x5614, 0xCFA6, 0x5775, + 0xCFA7, 0x57A2, 0xCFA8, 0x5BC7, 0xCFA9, 0x5D87, 0xCFAA, 0x5ED0, + 0xCFAB, 0x61FC, 0xCFAC, 0x62D8, 0xCFAD, 0x6551, 0xCFAE, 0x67B8, + 0xCFAF, 0x67E9, 0xCFB0, 0x69CB, 0xCFB1, 0x6B50, 0xCFB2, 0x6BC6, + 0xCFB3, 0x6BEC, 0xCFB4, 0x6C42, 0xCFB5, 0x6E9D, 0xCFB6, 0x7078, + 0xCFB7, 0x72D7, 0xCFB8, 0x7396, 0xCFB9, 0x7403, 0xCFBA, 0x77BF, + 0xCFBB, 0x77E9, 0xCFBC, 0x7A76, 0xCFBD, 0x7D7F, 0xCFBE, 0x8009, + 0xCFBF, 0x81FC, 0xCFC0, 0x8205, 0xCFC1, 0x820A, 0xCFC2, 0x82DF, + 0xCFC3, 0x8862, 0xCFC4, 0x8B33, 0xCFC5, 0x8CFC, 0xCFC6, 0x8EC0, + 0xCFC7, 0x9011, 0xCFC8, 0x90B1, 0xCFC9, 0x9264, 0xCFCA, 0x92B6, + 0xCFCB, 0x99D2, 0xCFCC, 0x9A45, 0xCFCD, 0x9CE9, 0xCFCE, 0x9DD7, + 0xCFCF, 0x9F9C, 0xCFD0, 0x570B, 0xCFD1, 0x5C40, 0xCFD2, 0x83CA, + 0xCFD3, 0x97A0, 0xCFD4, 0x97AB, 0xCFD5, 0x9EB4, 0xCFD6, 0x541B, + 0xCFD7, 0x7A98, 0xCFD8, 0x7FA4, 0xCFD9, 0x88D9, 0xCFDA, 0x8ECD, + 0xCFDB, 0x90E1, 0xCFDC, 0x5800, 0xCFDD, 0x5C48, 0xCFDE, 0x6398, + 0xCFDF, 0x7A9F, 0xCFE0, 0x5BAE, 0xCFE1, 0x5F13, 0xCFE2, 0x7A79, + 0xCFE3, 0x7AAE, 0xCFE4, 0x828E, 0xCFE5, 0x8EAC, 0xCFE6, 0x5026, + 0xCFE7, 0x5238, 0xCFE8, 0x52F8, 0xCFE9, 0x5377, 0xCFEA, 0x5708, + 0xCFEB, 0x62F3, 0xCFEC, 0x6372, 0xCFED, 0x6B0A, 0xCFEE, 0x6DC3, + 0xCFEF, 0x7737, 0xCFF0, 0x53A5, 0xCFF1, 0x7357, 0xCFF2, 0x8568, + 0xCFF3, 0x8E76, 0xCFF4, 0x95D5, 0xCFF5, 0x673A, 0xCFF6, 0x6AC3, + 0xCFF7, 0x6F70, 0xCFF8, 0x8A6D, 0xCFF9, 0x8ECC, 0xCFFA, 0x994B, + 0xCFFB, 0xF906, 0xCFFC, 0x6677, 0xCFFD, 0x6B78, 0xCFFE, 0x8CB4, + 0xD0A1, 0x9B3C, 0xD0A2, 0xF907, 0xD0A3, 0x53EB, 0xD0A4, 0x572D, + 0xD0A5, 0x594E, 0xD0A6, 0x63C6, 0xD0A7, 0x69FB, 0xD0A8, 0x73EA, + 0xD0A9, 0x7845, 0xD0AA, 0x7ABA, 0xD0AB, 0x7AC5, 0xD0AC, 0x7CFE, + 0xD0AD, 0x8475, 0xD0AE, 0x898F, 0xD0AF, 0x8D73, 0xD0B0, 0x9035, + 0xD0B1, 0x95A8, 0xD0B2, 0x52FB, 0xD0B3, 0x5747, 0xD0B4, 0x7547, + 0xD0B5, 0x7B60, 0xD0B6, 0x83CC, 0xD0B7, 0x921E, 0xD0B8, 0xF908, + 0xD0B9, 0x6A58, 0xD0BA, 0x514B, 0xD0BB, 0x524B, 0xD0BC, 0x5287, + 0xD0BD, 0x621F, 0xD0BE, 0x68D8, 0xD0BF, 0x6975, 0xD0C0, 0x9699, + 0xD0C1, 0x50C5, 0xD0C2, 0x52A4, 0xD0C3, 0x52E4, 0xD0C4, 0x61C3, + 0xD0C5, 0x65A4, 0xD0C6, 0x6839, 0xD0C7, 0x69FF, 0xD0C8, 0x747E, + 0xD0C9, 0x7B4B, 0xD0CA, 0x82B9, 0xD0CB, 0x83EB, 0xD0CC, 0x89B2, + 0xD0CD, 0x8B39, 0xD0CE, 0x8FD1, 0xD0CF, 0x9949, 0xD0D0, 0xF909, + 0xD0D1, 0x4ECA, 0xD0D2, 0x5997, 0xD0D3, 0x64D2, 0xD0D4, 0x6611, + 0xD0D5, 0x6A8E, 0xD0D6, 0x7434, 0xD0D7, 0x7981, 0xD0D8, 0x79BD, + 0xD0D9, 0x82A9, 0xD0DA, 0x887E, 0xD0DB, 0x887F, 0xD0DC, 0x895F, + 0xD0DD, 0xF90A, 0xD0DE, 0x9326, 0xD0DF, 0x4F0B, 0xD0E0, 0x53CA, + 0xD0E1, 0x6025, 0xD0E2, 0x6271, 0xD0E3, 0x6C72, 0xD0E4, 0x7D1A, + 0xD0E5, 0x7D66, 0xD0E6, 0x4E98, 0xD0E7, 0x5162, 0xD0E8, 0x77DC, + 0xD0E9, 0x80AF, 0xD0EA, 0x4F01, 0xD0EB, 0x4F0E, 0xD0EC, 0x5176, + 0xD0ED, 0x5180, 0xD0EE, 0x55DC, 0xD0EF, 0x5668, 0xD0F0, 0x573B, + 0xD0F1, 0x57FA, 0xD0F2, 0x57FC, 0xD0F3, 0x5914, 0xD0F4, 0x5947, + 0xD0F5, 0x5993, 0xD0F6, 0x5BC4, 0xD0F7, 0x5C90, 0xD0F8, 0x5D0E, + 0xD0F9, 0x5DF1, 0xD0FA, 0x5E7E, 0xD0FB, 0x5FCC, 0xD0FC, 0x6280, + 0xD0FD, 0x65D7, 0xD0FE, 0x65E3, 0xD1A1, 0x671E, 0xD1A2, 0x671F, + 0xD1A3, 0x675E, 0xD1A4, 0x68CB, 0xD1A5, 0x68C4, 0xD1A6, 0x6A5F, + 0xD1A7, 0x6B3A, 0xD1A8, 0x6C23, 0xD1A9, 0x6C7D, 0xD1AA, 0x6C82, + 0xD1AB, 0x6DC7, 0xD1AC, 0x7398, 0xD1AD, 0x7426, 0xD1AE, 0x742A, + 0xD1AF, 0x7482, 0xD1B0, 0x74A3, 0xD1B1, 0x7578, 0xD1B2, 0x757F, + 0xD1B3, 0x7881, 0xD1B4, 0x78EF, 0xD1B5, 0x7941, 0xD1B6, 0x7947, + 0xD1B7, 0x7948, 0xD1B8, 0x797A, 0xD1B9, 0x7B95, 0xD1BA, 0x7D00, + 0xD1BB, 0x7DBA, 0xD1BC, 0x7F88, 0xD1BD, 0x8006, 0xD1BE, 0x802D, + 0xD1BF, 0x808C, 0xD1C0, 0x8A18, 0xD1C1, 0x8B4F, 0xD1C2, 0x8C48, + 0xD1C3, 0x8D77, 0xD1C4, 0x9321, 0xD1C5, 0x9324, 0xD1C6, 0x98E2, + 0xD1C7, 0x9951, 0xD1C8, 0x9A0E, 0xD1C9, 0x9A0F, 0xD1CA, 0x9A65, + 0xD1CB, 0x9E92, 0xD1CC, 0x7DCA, 0xD1CD, 0x4F76, 0xD1CE, 0x5409, + 0xD1CF, 0x62EE, 0xD1D0, 0x6854, 0xD1D1, 0x91D1, 0xD1D2, 0x55AB, + 0xD1D3, 0x513A, 0xD1D4, 0xF90B, 0xD1D5, 0xF90C, 0xD1D6, 0x5A1C, + 0xD1D7, 0x61E6, 0xD1D8, 0xF90D, 0xD1D9, 0x62CF, 0xD1DA, 0x62FF, + 0xD1DB, 0xF90E, 0xD1DC, 0xF90F, 0xD1DD, 0xF910, 0xD1DE, 0xF911, + 0xD1DF, 0xF912, 0xD1E0, 0xF913, 0xD1E1, 0x90A3, 0xD1E2, 0xF914, + 0xD1E3, 0xF915, 0xD1E4, 0xF916, 0xD1E5, 0xF917, 0xD1E6, 0xF918, + 0xD1E7, 0x8AFE, 0xD1E8, 0xF919, 0xD1E9, 0xF91A, 0xD1EA, 0xF91B, + 0xD1EB, 0xF91C, 0xD1EC, 0x6696, 0xD1ED, 0xF91D, 0xD1EE, 0x7156, + 0xD1EF, 0xF91E, 0xD1F0, 0xF91F, 0xD1F1, 0x96E3, 0xD1F2, 0xF920, + 0xD1F3, 0x634F, 0xD1F4, 0x637A, 0xD1F5, 0x5357, 0xD1F6, 0xF921, + 0xD1F7, 0x678F, 0xD1F8, 0x6960, 0xD1F9, 0x6E73, 0xD1FA, 0xF922, + 0xD1FB, 0x7537, 0xD1FC, 0xF923, 0xD1FD, 0xF924, 0xD1FE, 0xF925, + 0xD2A1, 0x7D0D, 0xD2A2, 0xF926, 0xD2A3, 0xF927, 0xD2A4, 0x8872, + 0xD2A5, 0x56CA, 0xD2A6, 0x5A18, 0xD2A7, 0xF928, 0xD2A8, 0xF929, + 0xD2A9, 0xF92A, 0xD2AA, 0xF92B, 0xD2AB, 0xF92C, 0xD2AC, 0x4E43, + 0xD2AD, 0xF92D, 0xD2AE, 0x5167, 0xD2AF, 0x5948, 0xD2B0, 0x67F0, + 0xD2B1, 0x8010, 0xD2B2, 0xF92E, 0xD2B3, 0x5973, 0xD2B4, 0x5E74, + 0xD2B5, 0x649A, 0xD2B6, 0x79CA, 0xD2B7, 0x5FF5, 0xD2B8, 0x606C, + 0xD2B9, 0x62C8, 0xD2BA, 0x637B, 0xD2BB, 0x5BE7, 0xD2BC, 0x5BD7, + 0xD2BD, 0x52AA, 0xD2BE, 0xF92F, 0xD2BF, 0x5974, 0xD2C0, 0x5F29, + 0xD2C1, 0x6012, 0xD2C2, 0xF930, 0xD2C3, 0xF931, 0xD2C4, 0xF932, + 0xD2C5, 0x7459, 0xD2C6, 0xF933, 0xD2C7, 0xF934, 0xD2C8, 0xF935, + 0xD2C9, 0xF936, 0xD2CA, 0xF937, 0xD2CB, 0xF938, 0xD2CC, 0x99D1, + 0xD2CD, 0xF939, 0xD2CE, 0xF93A, 0xD2CF, 0xF93B, 0xD2D0, 0xF93C, + 0xD2D1, 0xF93D, 0xD2D2, 0xF93E, 0xD2D3, 0xF93F, 0xD2D4, 0xF940, + 0xD2D5, 0xF941, 0xD2D6, 0xF942, 0xD2D7, 0xF943, 0xD2D8, 0x6FC3, + 0xD2D9, 0xF944, 0xD2DA, 0xF945, 0xD2DB, 0x81BF, 0xD2DC, 0x8FB2, + 0xD2DD, 0x60F1, 0xD2DE, 0xF946, 0xD2DF, 0xF947, 0xD2E0, 0x8166, + 0xD2E1, 0xF948, 0xD2E2, 0xF949, 0xD2E3, 0x5C3F, 0xD2E4, 0xF94A, + 0xD2E5, 0xF94B, 0xD2E6, 0xF94C, 0xD2E7, 0xF94D, 0xD2E8, 0xF94E, + 0xD2E9, 0xF94F, 0xD2EA, 0xF950, 0xD2EB, 0xF951, 0xD2EC, 0x5AE9, + 0xD2ED, 0x8A25, 0xD2EE, 0x677B, 0xD2EF, 0x7D10, 0xD2F0, 0xF952, + 0xD2F1, 0xF953, 0xD2F2, 0xF954, 0xD2F3, 0xF955, 0xD2F4, 0xF956, + 0xD2F5, 0xF957, 0xD2F6, 0x80FD, 0xD2F7, 0xF958, 0xD2F8, 0xF959, + 0xD2F9, 0x5C3C, 0xD2FA, 0x6CE5, 0xD2FB, 0x533F, 0xD2FC, 0x6EBA, + 0xD2FD, 0x591A, 0xD2FE, 0x8336, 0xD3A1, 0x4E39, 0xD3A2, 0x4EB6, + 0xD3A3, 0x4F46, 0xD3A4, 0x55AE, 0xD3A5, 0x5718, 0xD3A6, 0x58C7, + 0xD3A7, 0x5F56, 0xD3A8, 0x65B7, 0xD3A9, 0x65E6, 0xD3AA, 0x6A80, + 0xD3AB, 0x6BB5, 0xD3AC, 0x6E4D, 0xD3AD, 0x77ED, 0xD3AE, 0x7AEF, + 0xD3AF, 0x7C1E, 0xD3B0, 0x7DDE, 0xD3B1, 0x86CB, 0xD3B2, 0x8892, + 0xD3B3, 0x9132, 0xD3B4, 0x935B, 0xD3B5, 0x64BB, 0xD3B6, 0x6FBE, + 0xD3B7, 0x737A, 0xD3B8, 0x75B8, 0xD3B9, 0x9054, 0xD3BA, 0x5556, + 0xD3BB, 0x574D, 0xD3BC, 0x61BA, 0xD3BD, 0x64D4, 0xD3BE, 0x66C7, + 0xD3BF, 0x6DE1, 0xD3C0, 0x6E5B, 0xD3C1, 0x6F6D, 0xD3C2, 0x6FB9, + 0xD3C3, 0x75F0, 0xD3C4, 0x8043, 0xD3C5, 0x81BD, 0xD3C6, 0x8541, + 0xD3C7, 0x8983, 0xD3C8, 0x8AC7, 0xD3C9, 0x8B5A, 0xD3CA, 0x931F, + 0xD3CB, 0x6C93, 0xD3CC, 0x7553, 0xD3CD, 0x7B54, 0xD3CE, 0x8E0F, + 0xD3CF, 0x905D, 0xD3D0, 0x5510, 0xD3D1, 0x5802, 0xD3D2, 0x5858, + 0xD3D3, 0x5E62, 0xD3D4, 0x6207, 0xD3D5, 0x649E, 0xD3D6, 0x68E0, + 0xD3D7, 0x7576, 0xD3D8, 0x7CD6, 0xD3D9, 0x87B3, 0xD3DA, 0x9EE8, + 0xD3DB, 0x4EE3, 0xD3DC, 0x5788, 0xD3DD, 0x576E, 0xD3DE, 0x5927, + 0xD3DF, 0x5C0D, 0xD3E0, 0x5CB1, 0xD3E1, 0x5E36, 0xD3E2, 0x5F85, + 0xD3E3, 0x6234, 0xD3E4, 0x64E1, 0xD3E5, 0x73B3, 0xD3E6, 0x81FA, + 0xD3E7, 0x888B, 0xD3E8, 0x8CB8, 0xD3E9, 0x968A, 0xD3EA, 0x9EDB, + 0xD3EB, 0x5B85, 0xD3EC, 0x5FB7, 0xD3ED, 0x60B3, 0xD3EE, 0x5012, + 0xD3EF, 0x5200, 0xD3F0, 0x5230, 0xD3F1, 0x5716, 0xD3F2, 0x5835, + 0xD3F3, 0x5857, 0xD3F4, 0x5C0E, 0xD3F5, 0x5C60, 0xD3F6, 0x5CF6, + 0xD3F7, 0x5D8B, 0xD3F8, 0x5EA6, 0xD3F9, 0x5F92, 0xD3FA, 0x60BC, + 0xD3FB, 0x6311, 0xD3FC, 0x6389, 0xD3FD, 0x6417, 0xD3FE, 0x6843, + 0xD4A1, 0x68F9, 0xD4A2, 0x6AC2, 0xD4A3, 0x6DD8, 0xD4A4, 0x6E21, + 0xD4A5, 0x6ED4, 0xD4A6, 0x6FE4, 0xD4A7, 0x71FE, 0xD4A8, 0x76DC, + 0xD4A9, 0x7779, 0xD4AA, 0x79B1, 0xD4AB, 0x7A3B, 0xD4AC, 0x8404, + 0xD4AD, 0x89A9, 0xD4AE, 0x8CED, 0xD4AF, 0x8DF3, 0xD4B0, 0x8E48, + 0xD4B1, 0x9003, 0xD4B2, 0x9014, 0xD4B3, 0x9053, 0xD4B4, 0x90FD, + 0xD4B5, 0x934D, 0xD4B6, 0x9676, 0xD4B7, 0x97DC, 0xD4B8, 0x6BD2, + 0xD4B9, 0x7006, 0xD4BA, 0x7258, 0xD4BB, 0x72A2, 0xD4BC, 0x7368, + 0xD4BD, 0x7763, 0xD4BE, 0x79BF, 0xD4BF, 0x7BE4, 0xD4C0, 0x7E9B, + 0xD4C1, 0x8B80, 0xD4C2, 0x58A9, 0xD4C3, 0x60C7, 0xD4C4, 0x6566, + 0xD4C5, 0x65FD, 0xD4C6, 0x66BE, 0xD4C7, 0x6C8C, 0xD4C8, 0x711E, + 0xD4C9, 0x71C9, 0xD4CA, 0x8C5A, 0xD4CB, 0x9813, 0xD4CC, 0x4E6D, + 0xD4CD, 0x7A81, 0xD4CE, 0x4EDD, 0xD4CF, 0x51AC, 0xD4D0, 0x51CD, + 0xD4D1, 0x52D5, 0xD4D2, 0x540C, 0xD4D3, 0x61A7, 0xD4D4, 0x6771, + 0xD4D5, 0x6850, 0xD4D6, 0x68DF, 0xD4D7, 0x6D1E, 0xD4D8, 0x6F7C, + 0xD4D9, 0x75BC, 0xD4DA, 0x77B3, 0xD4DB, 0x7AE5, 0xD4DC, 0x80F4, + 0xD4DD, 0x8463, 0xD4DE, 0x9285, 0xD4DF, 0x515C, 0xD4E0, 0x6597, + 0xD4E1, 0x675C, 0xD4E2, 0x6793, 0xD4E3, 0x75D8, 0xD4E4, 0x7AC7, + 0xD4E5, 0x8373, 0xD4E6, 0xF95A, 0xD4E7, 0x8C46, 0xD4E8, 0x9017, + 0xD4E9, 0x982D, 0xD4EA, 0x5C6F, 0xD4EB, 0x81C0, 0xD4EC, 0x829A, + 0xD4ED, 0x9041, 0xD4EE, 0x906F, 0xD4EF, 0x920D, 0xD4F0, 0x5F97, + 0xD4F1, 0x5D9D, 0xD4F2, 0x6A59, 0xD4F3, 0x71C8, 0xD4F4, 0x767B, + 0xD4F5, 0x7B49, 0xD4F6, 0x85E4, 0xD4F7, 0x8B04, 0xD4F8, 0x9127, + 0xD4F9, 0x9A30, 0xD4FA, 0x5587, 0xD4FB, 0x61F6, 0xD4FC, 0xF95B, + 0xD4FD, 0x7669, 0xD4FE, 0x7F85, 0xD5A1, 0x863F, 0xD5A2, 0x87BA, + 0xD5A3, 0x88F8, 0xD5A4, 0x908F, 0xD5A5, 0xF95C, 0xD5A6, 0x6D1B, + 0xD5A7, 0x70D9, 0xD5A8, 0x73DE, 0xD5A9, 0x7D61, 0xD5AA, 0x843D, + 0xD5AB, 0xF95D, 0xD5AC, 0x916A, 0xD5AD, 0x99F1, 0xD5AE, 0xF95E, + 0xD5AF, 0x4E82, 0xD5B0, 0x5375, 0xD5B1, 0x6B04, 0xD5B2, 0x6B12, + 0xD5B3, 0x703E, 0xD5B4, 0x721B, 0xD5B5, 0x862D, 0xD5B6, 0x9E1E, + 0xD5B7, 0x524C, 0xD5B8, 0x8FA3, 0xD5B9, 0x5D50, 0xD5BA, 0x64E5, + 0xD5BB, 0x652C, 0xD5BC, 0x6B16, 0xD5BD, 0x6FEB, 0xD5BE, 0x7C43, + 0xD5BF, 0x7E9C, 0xD5C0, 0x85CD, 0xD5C1, 0x8964, 0xD5C2, 0x89BD, + 0xD5C3, 0x62C9, 0xD5C4, 0x81D8, 0xD5C5, 0x881F, 0xD5C6, 0x5ECA, + 0xD5C7, 0x6717, 0xD5C8, 0x6D6A, 0xD5C9, 0x72FC, 0xD5CA, 0x7405, + 0xD5CB, 0x746F, 0xD5CC, 0x8782, 0xD5CD, 0x90DE, 0xD5CE, 0x4F86, + 0xD5CF, 0x5D0D, 0xD5D0, 0x5FA0, 0xD5D1, 0x840A, 0xD5D2, 0x51B7, + 0xD5D3, 0x63A0, 0xD5D4, 0x7565, 0xD5D5, 0x4EAE, 0xD5D6, 0x5006, + 0xD5D7, 0x5169, 0xD5D8, 0x51C9, 0xD5D9, 0x6881, 0xD5DA, 0x6A11, + 0xD5DB, 0x7CAE, 0xD5DC, 0x7CB1, 0xD5DD, 0x7CE7, 0xD5DE, 0x826F, + 0xD5DF, 0x8AD2, 0xD5E0, 0x8F1B, 0xD5E1, 0x91CF, 0xD5E2, 0x4FB6, + 0xD5E3, 0x5137, 0xD5E4, 0x52F5, 0xD5E5, 0x5442, 0xD5E6, 0x5EEC, + 0xD5E7, 0x616E, 0xD5E8, 0x623E, 0xD5E9, 0x65C5, 0xD5EA, 0x6ADA, + 0xD5EB, 0x6FFE, 0xD5EC, 0x792A, 0xD5ED, 0x85DC, 0xD5EE, 0x8823, + 0xD5EF, 0x95AD, 0xD5F0, 0x9A62, 0xD5F1, 0x9A6A, 0xD5F2, 0x9E97, + 0xD5F3, 0x9ECE, 0xD5F4, 0x529B, 0xD5F5, 0x66C6, 0xD5F6, 0x6B77, + 0xD5F7, 0x701D, 0xD5F8, 0x792B, 0xD5F9, 0x8F62, 0xD5FA, 0x9742, + 0xD5FB, 0x6190, 0xD5FC, 0x6200, 0xD5FD, 0x6523, 0xD5FE, 0x6F23, + 0xD6A1, 0x7149, 0xD6A2, 0x7489, 0xD6A3, 0x7DF4, 0xD6A4, 0x806F, + 0xD6A5, 0x84EE, 0xD6A6, 0x8F26, 0xD6A7, 0x9023, 0xD6A8, 0x934A, + 0xD6A9, 0x51BD, 0xD6AA, 0x5217, 0xD6AB, 0x52A3, 0xD6AC, 0x6D0C, + 0xD6AD, 0x70C8, 0xD6AE, 0x88C2, 0xD6AF, 0x5EC9, 0xD6B0, 0x6582, + 0xD6B1, 0x6BAE, 0xD6B2, 0x6FC2, 0xD6B3, 0x7C3E, 0xD6B4, 0x7375, + 0xD6B5, 0x4EE4, 0xD6B6, 0x4F36, 0xD6B7, 0x56F9, 0xD6B8, 0xF95F, + 0xD6B9, 0x5CBA, 0xD6BA, 0x5DBA, 0xD6BB, 0x601C, 0xD6BC, 0x73B2, + 0xD6BD, 0x7B2D, 0xD6BE, 0x7F9A, 0xD6BF, 0x7FCE, 0xD6C0, 0x8046, + 0xD6C1, 0x901E, 0xD6C2, 0x9234, 0xD6C3, 0x96F6, 0xD6C4, 0x9748, + 0xD6C5, 0x9818, 0xD6C6, 0x9F61, 0xD6C7, 0x4F8B, 0xD6C8, 0x6FA7, + 0xD6C9, 0x79AE, 0xD6CA, 0x91B4, 0xD6CB, 0x96B7, 0xD6CC, 0x52DE, + 0xD6CD, 0xF960, 0xD6CE, 0x6488, 0xD6CF, 0x64C4, 0xD6D0, 0x6AD3, + 0xD6D1, 0x6F5E, 0xD6D2, 0x7018, 0xD6D3, 0x7210, 0xD6D4, 0x76E7, + 0xD6D5, 0x8001, 0xD6D6, 0x8606, 0xD6D7, 0x865C, 0xD6D8, 0x8DEF, + 0xD6D9, 0x8F05, 0xD6DA, 0x9732, 0xD6DB, 0x9B6F, 0xD6DC, 0x9DFA, + 0xD6DD, 0x9E75, 0xD6DE, 0x788C, 0xD6DF, 0x797F, 0xD6E0, 0x7DA0, + 0xD6E1, 0x83C9, 0xD6E2, 0x9304, 0xD6E3, 0x9E7F, 0xD6E4, 0x9E93, + 0xD6E5, 0x8AD6, 0xD6E6, 0x58DF, 0xD6E7, 0x5F04, 0xD6E8, 0x6727, + 0xD6E9, 0x7027, 0xD6EA, 0x74CF, 0xD6EB, 0x7C60, 0xD6EC, 0x807E, + 0xD6ED, 0x5121, 0xD6EE, 0x7028, 0xD6EF, 0x7262, 0xD6F0, 0x78CA, + 0xD6F1, 0x8CC2, 0xD6F2, 0x8CDA, 0xD6F3, 0x8CF4, 0xD6F4, 0x96F7, + 0xD6F5, 0x4E86, 0xD6F6, 0x50DA, 0xD6F7, 0x5BEE, 0xD6F8, 0x5ED6, + 0xD6F9, 0x6599, 0xD6FA, 0x71CE, 0xD6FB, 0x7642, 0xD6FC, 0x77AD, + 0xD6FD, 0x804A, 0xD6FE, 0x84FC, 0xD7A1, 0x907C, 0xD7A2, 0x9B27, + 0xD7A3, 0x9F8D, 0xD7A4, 0x58D8, 0xD7A5, 0x5A41, 0xD7A6, 0x5C62, + 0xD7A7, 0x6A13, 0xD7A8, 0x6DDA, 0xD7A9, 0x6F0F, 0xD7AA, 0x763B, + 0xD7AB, 0x7D2F, 0xD7AC, 0x7E37, 0xD7AD, 0x851E, 0xD7AE, 0x8938, + 0xD7AF, 0x93E4, 0xD7B0, 0x964B, 0xD7B1, 0x5289, 0xD7B2, 0x65D2, + 0xD7B3, 0x67F3, 0xD7B4, 0x69B4, 0xD7B5, 0x6D41, 0xD7B6, 0x6E9C, + 0xD7B7, 0x700F, 0xD7B8, 0x7409, 0xD7B9, 0x7460, 0xD7BA, 0x7559, + 0xD7BB, 0x7624, 0xD7BC, 0x786B, 0xD7BD, 0x8B2C, 0xD7BE, 0x985E, + 0xD7BF, 0x516D, 0xD7C0, 0x622E, 0xD7C1, 0x9678, 0xD7C2, 0x4F96, + 0xD7C3, 0x502B, 0xD7C4, 0x5D19, 0xD7C5, 0x6DEA, 0xD7C6, 0x7DB8, + 0xD7C7, 0x8F2A, 0xD7C8, 0x5F8B, 0xD7C9, 0x6144, 0xD7CA, 0x6817, + 0xD7CB, 0xF961, 0xD7CC, 0x9686, 0xD7CD, 0x52D2, 0xD7CE, 0x808B, + 0xD7CF, 0x51DC, 0xD7D0, 0x51CC, 0xD7D1, 0x695E, 0xD7D2, 0x7A1C, + 0xD7D3, 0x7DBE, 0xD7D4, 0x83F1, 0xD7D5, 0x9675, 0xD7D6, 0x4FDA, + 0xD7D7, 0x5229, 0xD7D8, 0x5398, 0xD7D9, 0x540F, 0xD7DA, 0x550E, + 0xD7DB, 0x5C65, 0xD7DC, 0x60A7, 0xD7DD, 0x674E, 0xD7DE, 0x68A8, + 0xD7DF, 0x6D6C, 0xD7E0, 0x7281, 0xD7E1, 0x72F8, 0xD7E2, 0x7406, + 0xD7E3, 0x7483, 0xD7E4, 0xF962, 0xD7E5, 0x75E2, 0xD7E6, 0x7C6C, + 0xD7E7, 0x7F79, 0xD7E8, 0x7FB8, 0xD7E9, 0x8389, 0xD7EA, 0x88CF, + 0xD7EB, 0x88E1, 0xD7EC, 0x91CC, 0xD7ED, 0x91D0, 0xD7EE, 0x96E2, + 0xD7EF, 0x9BC9, 0xD7F0, 0x541D, 0xD7F1, 0x6F7E, 0xD7F2, 0x71D0, + 0xD7F3, 0x7498, 0xD7F4, 0x85FA, 0xD7F5, 0x8EAA, 0xD7F6, 0x96A3, + 0xD7F7, 0x9C57, 0xD7F8, 0x9E9F, 0xD7F9, 0x6797, 0xD7FA, 0x6DCB, + 0xD7FB, 0x7433, 0xD7FC, 0x81E8, 0xD7FD, 0x9716, 0xD7FE, 0x782C, + 0xD8A1, 0x7ACB, 0xD8A2, 0x7B20, 0xD8A3, 0x7C92, 0xD8A4, 0x6469, + 0xD8A5, 0x746A, 0xD8A6, 0x75F2, 0xD8A7, 0x78BC, 0xD8A8, 0x78E8, + 0xD8A9, 0x99AC, 0xD8AA, 0x9B54, 0xD8AB, 0x9EBB, 0xD8AC, 0x5BDE, + 0xD8AD, 0x5E55, 0xD8AE, 0x6F20, 0xD8AF, 0x819C, 0xD8B0, 0x83AB, + 0xD8B1, 0x9088, 0xD8B2, 0x4E07, 0xD8B3, 0x534D, 0xD8B4, 0x5A29, + 0xD8B5, 0x5DD2, 0xD8B6, 0x5F4E, 0xD8B7, 0x6162, 0xD8B8, 0x633D, + 0xD8B9, 0x6669, 0xD8BA, 0x66FC, 0xD8BB, 0x6EFF, 0xD8BC, 0x6F2B, + 0xD8BD, 0x7063, 0xD8BE, 0x779E, 0xD8BF, 0x842C, 0xD8C0, 0x8513, + 0xD8C1, 0x883B, 0xD8C2, 0x8F13, 0xD8C3, 0x9945, 0xD8C4, 0x9C3B, + 0xD8C5, 0x551C, 0xD8C6, 0x62B9, 0xD8C7, 0x672B, 0xD8C8, 0x6CAB, + 0xD8C9, 0x8309, 0xD8CA, 0x896A, 0xD8CB, 0x977A, 0xD8CC, 0x4EA1, + 0xD8CD, 0x5984, 0xD8CE, 0x5FD8, 0xD8CF, 0x5FD9, 0xD8D0, 0x671B, + 0xD8D1, 0x7DB2, 0xD8D2, 0x7F54, 0xD8D3, 0x8292, 0xD8D4, 0x832B, + 0xD8D5, 0x83BD, 0xD8D6, 0x8F1E, 0xD8D7, 0x9099, 0xD8D8, 0x57CB, + 0xD8D9, 0x59B9, 0xD8DA, 0x5A92, 0xD8DB, 0x5BD0, 0xD8DC, 0x6627, + 0xD8DD, 0x679A, 0xD8DE, 0x6885, 0xD8DF, 0x6BCF, 0xD8E0, 0x7164, + 0xD8E1, 0x7F75, 0xD8E2, 0x8CB7, 0xD8E3, 0x8CE3, 0xD8E4, 0x9081, + 0xD8E5, 0x9B45, 0xD8E6, 0x8108, 0xD8E7, 0x8C8A, 0xD8E8, 0x964C, + 0xD8E9, 0x9A40, 0xD8EA, 0x9EA5, 0xD8EB, 0x5B5F, 0xD8EC, 0x6C13, + 0xD8ED, 0x731B, 0xD8EE, 0x76F2, 0xD8EF, 0x76DF, 0xD8F0, 0x840C, + 0xD8F1, 0x51AA, 0xD8F2, 0x8993, 0xD8F3, 0x514D, 0xD8F4, 0x5195, + 0xD8F5, 0x52C9, 0xD8F6, 0x68C9, 0xD8F7, 0x6C94, 0xD8F8, 0x7704, + 0xD8F9, 0x7720, 0xD8FA, 0x7DBF, 0xD8FB, 0x7DEC, 0xD8FC, 0x9762, + 0xD8FD, 0x9EB5, 0xD8FE, 0x6EC5, 0xD9A1, 0x8511, 0xD9A2, 0x51A5, + 0xD9A3, 0x540D, 0xD9A4, 0x547D, 0xD9A5, 0x660E, 0xD9A6, 0x669D, + 0xD9A7, 0x6927, 0xD9A8, 0x6E9F, 0xD9A9, 0x76BF, 0xD9AA, 0x7791, + 0xD9AB, 0x8317, 0xD9AC, 0x84C2, 0xD9AD, 0x879F, 0xD9AE, 0x9169, + 0xD9AF, 0x9298, 0xD9B0, 0x9CF4, 0xD9B1, 0x8882, 0xD9B2, 0x4FAE, + 0xD9B3, 0x5192, 0xD9B4, 0x52DF, 0xD9B5, 0x59C6, 0xD9B6, 0x5E3D, + 0xD9B7, 0x6155, 0xD9B8, 0x6478, 0xD9B9, 0x6479, 0xD9BA, 0x66AE, + 0xD9BB, 0x67D0, 0xD9BC, 0x6A21, 0xD9BD, 0x6BCD, 0xD9BE, 0x6BDB, + 0xD9BF, 0x725F, 0xD9C0, 0x7261, 0xD9C1, 0x7441, 0xD9C2, 0x7738, + 0xD9C3, 0x77DB, 0xD9C4, 0x8017, 0xD9C5, 0x82BC, 0xD9C6, 0x8305, + 0xD9C7, 0x8B00, 0xD9C8, 0x8B28, 0xD9C9, 0x8C8C, 0xD9CA, 0x6728, + 0xD9CB, 0x6C90, 0xD9CC, 0x7267, 0xD9CD, 0x76EE, 0xD9CE, 0x7766, + 0xD9CF, 0x7A46, 0xD9D0, 0x9DA9, 0xD9D1, 0x6B7F, 0xD9D2, 0x6C92, + 0xD9D3, 0x5922, 0xD9D4, 0x6726, 0xD9D5, 0x8499, 0xD9D6, 0x536F, + 0xD9D7, 0x5893, 0xD9D8, 0x5999, 0xD9D9, 0x5EDF, 0xD9DA, 0x63CF, + 0xD9DB, 0x6634, 0xD9DC, 0x6773, 0xD9DD, 0x6E3A, 0xD9DE, 0x732B, + 0xD9DF, 0x7AD7, 0xD9E0, 0x82D7, 0xD9E1, 0x9328, 0xD9E2, 0x52D9, + 0xD9E3, 0x5DEB, 0xD9E4, 0x61AE, 0xD9E5, 0x61CB, 0xD9E6, 0x620A, + 0xD9E7, 0x62C7, 0xD9E8, 0x64AB, 0xD9E9, 0x65E0, 0xD9EA, 0x6959, + 0xD9EB, 0x6B66, 0xD9EC, 0x6BCB, 0xD9ED, 0x7121, 0xD9EE, 0x73F7, + 0xD9EF, 0x755D, 0xD9F0, 0x7E46, 0xD9F1, 0x821E, 0xD9F2, 0x8302, + 0xD9F3, 0x856A, 0xD9F4, 0x8AA3, 0xD9F5, 0x8CBF, 0xD9F6, 0x9727, + 0xD9F7, 0x9D61, 0xD9F8, 0x58A8, 0xD9F9, 0x9ED8, 0xD9FA, 0x5011, + 0xD9FB, 0x520E, 0xD9FC, 0x543B, 0xD9FD, 0x554F, 0xD9FE, 0x6587, + 0xDAA1, 0x6C76, 0xDAA2, 0x7D0A, 0xDAA3, 0x7D0B, 0xDAA4, 0x805E, + 0xDAA5, 0x868A, 0xDAA6, 0x9580, 0xDAA7, 0x96EF, 0xDAA8, 0x52FF, + 0xDAA9, 0x6C95, 0xDAAA, 0x7269, 0xDAAB, 0x5473, 0xDAAC, 0x5A9A, + 0xDAAD, 0x5C3E, 0xDAAE, 0x5D4B, 0xDAAF, 0x5F4C, 0xDAB0, 0x5FAE, + 0xDAB1, 0x672A, 0xDAB2, 0x68B6, 0xDAB3, 0x6963, 0xDAB4, 0x6E3C, + 0xDAB5, 0x6E44, 0xDAB6, 0x7709, 0xDAB7, 0x7C73, 0xDAB8, 0x7F8E, + 0xDAB9, 0x8587, 0xDABA, 0x8B0E, 0xDABB, 0x8FF7, 0xDABC, 0x9761, + 0xDABD, 0x9EF4, 0xDABE, 0x5CB7, 0xDABF, 0x60B6, 0xDAC0, 0x610D, + 0xDAC1, 0x61AB, 0xDAC2, 0x654F, 0xDAC3, 0x65FB, 0xDAC4, 0x65FC, + 0xDAC5, 0x6C11, 0xDAC6, 0x6CEF, 0xDAC7, 0x739F, 0xDAC8, 0x73C9, + 0xDAC9, 0x7DE1, 0xDACA, 0x9594, 0xDACB, 0x5BC6, 0xDACC, 0x871C, + 0xDACD, 0x8B10, 0xDACE, 0x525D, 0xDACF, 0x535A, 0xDAD0, 0x62CD, + 0xDAD1, 0x640F, 0xDAD2, 0x64B2, 0xDAD3, 0x6734, 0xDAD4, 0x6A38, + 0xDAD5, 0x6CCA, 0xDAD6, 0x73C0, 0xDAD7, 0x749E, 0xDAD8, 0x7B94, + 0xDAD9, 0x7C95, 0xDADA, 0x7E1B, 0xDADB, 0x818A, 0xDADC, 0x8236, + 0xDADD, 0x8584, 0xDADE, 0x8FEB, 0xDADF, 0x96F9, 0xDAE0, 0x99C1, + 0xDAE1, 0x4F34, 0xDAE2, 0x534A, 0xDAE3, 0x53CD, 0xDAE4, 0x53DB, + 0xDAE5, 0x62CC, 0xDAE6, 0x642C, 0xDAE7, 0x6500, 0xDAE8, 0x6591, + 0xDAE9, 0x69C3, 0xDAEA, 0x6CEE, 0xDAEB, 0x6F58, 0xDAEC, 0x73ED, + 0xDAED, 0x7554, 0xDAEE, 0x7622, 0xDAEF, 0x76E4, 0xDAF0, 0x76FC, + 0xDAF1, 0x78D0, 0xDAF2, 0x78FB, 0xDAF3, 0x792C, 0xDAF4, 0x7D46, + 0xDAF5, 0x822C, 0xDAF6, 0x87E0, 0xDAF7, 0x8FD4, 0xDAF8, 0x9812, + 0xDAF9, 0x98EF, 0xDAFA, 0x52C3, 0xDAFB, 0x62D4, 0xDAFC, 0x64A5, + 0xDAFD, 0x6E24, 0xDAFE, 0x6F51, 0xDBA1, 0x767C, 0xDBA2, 0x8DCB, + 0xDBA3, 0x91B1, 0xDBA4, 0x9262, 0xDBA5, 0x9AEE, 0xDBA6, 0x9B43, + 0xDBA7, 0x5023, 0xDBA8, 0x508D, 0xDBA9, 0x574A, 0xDBAA, 0x59A8, + 0xDBAB, 0x5C28, 0xDBAC, 0x5E47, 0xDBAD, 0x5F77, 0xDBAE, 0x623F, + 0xDBAF, 0x653E, 0xDBB0, 0x65B9, 0xDBB1, 0x65C1, 0xDBB2, 0x6609, + 0xDBB3, 0x678B, 0xDBB4, 0x699C, 0xDBB5, 0x6EC2, 0xDBB6, 0x78C5, + 0xDBB7, 0x7D21, 0xDBB8, 0x80AA, 0xDBB9, 0x8180, 0xDBBA, 0x822B, + 0xDBBB, 0x82B3, 0xDBBC, 0x84A1, 0xDBBD, 0x868C, 0xDBBE, 0x8A2A, + 0xDBBF, 0x8B17, 0xDBC0, 0x90A6, 0xDBC1, 0x9632, 0xDBC2, 0x9F90, + 0xDBC3, 0x500D, 0xDBC4, 0x4FF3, 0xDBC5, 0xF963, 0xDBC6, 0x57F9, + 0xDBC7, 0x5F98, 0xDBC8, 0x62DC, 0xDBC9, 0x6392, 0xDBCA, 0x676F, + 0xDBCB, 0x6E43, 0xDBCC, 0x7119, 0xDBCD, 0x76C3, 0xDBCE, 0x80CC, + 0xDBCF, 0x80DA, 0xDBD0, 0x88F4, 0xDBD1, 0x88F5, 0xDBD2, 0x8919, + 0xDBD3, 0x8CE0, 0xDBD4, 0x8F29, 0xDBD5, 0x914D, 0xDBD6, 0x966A, + 0xDBD7, 0x4F2F, 0xDBD8, 0x4F70, 0xDBD9, 0x5E1B, 0xDBDA, 0x67CF, + 0xDBDB, 0x6822, 0xDBDC, 0x767D, 0xDBDD, 0x767E, 0xDBDE, 0x9B44, + 0xDBDF, 0x5E61, 0xDBE0, 0x6A0A, 0xDBE1, 0x7169, 0xDBE2, 0x71D4, + 0xDBE3, 0x756A, 0xDBE4, 0xF964, 0xDBE5, 0x7E41, 0xDBE6, 0x8543, + 0xDBE7, 0x85E9, 0xDBE8, 0x98DC, 0xDBE9, 0x4F10, 0xDBEA, 0x7B4F, + 0xDBEB, 0x7F70, 0xDBEC, 0x95A5, 0xDBED, 0x51E1, 0xDBEE, 0x5E06, + 0xDBEF, 0x68B5, 0xDBF0, 0x6C3E, 0xDBF1, 0x6C4E, 0xDBF2, 0x6CDB, + 0xDBF3, 0x72AF, 0xDBF4, 0x7BC4, 0xDBF5, 0x8303, 0xDBF6, 0x6CD5, + 0xDBF7, 0x743A, 0xDBF8, 0x50FB, 0xDBF9, 0x5288, 0xDBFA, 0x58C1, + 0xDBFB, 0x64D8, 0xDBFC, 0x6A97, 0xDBFD, 0x74A7, 0xDBFE, 0x7656, + 0xDCA1, 0x78A7, 0xDCA2, 0x8617, 0xDCA3, 0x95E2, 0xDCA4, 0x9739, + 0xDCA5, 0xF965, 0xDCA6, 0x535E, 0xDCA7, 0x5F01, 0xDCA8, 0x8B8A, + 0xDCA9, 0x8FA8, 0xDCAA, 0x8FAF, 0xDCAB, 0x908A, 0xDCAC, 0x5225, + 0xDCAD, 0x77A5, 0xDCAE, 0x9C49, 0xDCAF, 0x9F08, 0xDCB0, 0x4E19, + 0xDCB1, 0x5002, 0xDCB2, 0x5175, 0xDCB3, 0x5C5B, 0xDCB4, 0x5E77, + 0xDCB5, 0x661E, 0xDCB6, 0x663A, 0xDCB7, 0x67C4, 0xDCB8, 0x68C5, + 0xDCB9, 0x70B3, 0xDCBA, 0x7501, 0xDCBB, 0x75C5, 0xDCBC, 0x79C9, + 0xDCBD, 0x7ADD, 0xDCBE, 0x8F27, 0xDCBF, 0x9920, 0xDCC0, 0x9A08, + 0xDCC1, 0x4FDD, 0xDCC2, 0x5821, 0xDCC3, 0x5831, 0xDCC4, 0x5BF6, + 0xDCC5, 0x666E, 0xDCC6, 0x6B65, 0xDCC7, 0x6D11, 0xDCC8, 0x6E7A, + 0xDCC9, 0x6F7D, 0xDCCA, 0x73E4, 0xDCCB, 0x752B, 0xDCCC, 0x83E9, + 0xDCCD, 0x88DC, 0xDCCE, 0x8913, 0xDCCF, 0x8B5C, 0xDCD0, 0x8F14, + 0xDCD1, 0x4F0F, 0xDCD2, 0x50D5, 0xDCD3, 0x5310, 0xDCD4, 0x535C, + 0xDCD5, 0x5B93, 0xDCD6, 0x5FA9, 0xDCD7, 0x670D, 0xDCD8, 0x798F, + 0xDCD9, 0x8179, 0xDCDA, 0x832F, 0xDCDB, 0x8514, 0xDCDC, 0x8907, + 0xDCDD, 0x8986, 0xDCDE, 0x8F39, 0xDCDF, 0x8F3B, 0xDCE0, 0x99A5, + 0xDCE1, 0x9C12, 0xDCE2, 0x672C, 0xDCE3, 0x4E76, 0xDCE4, 0x4FF8, + 0xDCE5, 0x5949, 0xDCE6, 0x5C01, 0xDCE7, 0x5CEF, 0xDCE8, 0x5CF0, + 0xDCE9, 0x6367, 0xDCEA, 0x68D2, 0xDCEB, 0x70FD, 0xDCEC, 0x71A2, + 0xDCED, 0x742B, 0xDCEE, 0x7E2B, 0xDCEF, 0x84EC, 0xDCF0, 0x8702, + 0xDCF1, 0x9022, 0xDCF2, 0x92D2, 0xDCF3, 0x9CF3, 0xDCF4, 0x4E0D, + 0xDCF5, 0x4ED8, 0xDCF6, 0x4FEF, 0xDCF7, 0x5085, 0xDCF8, 0x5256, + 0xDCF9, 0x526F, 0xDCFA, 0x5426, 0xDCFB, 0x5490, 0xDCFC, 0x57E0, + 0xDCFD, 0x592B, 0xDCFE, 0x5A66, 0xDDA1, 0x5B5A, 0xDDA2, 0x5B75, + 0xDDA3, 0x5BCC, 0xDDA4, 0x5E9C, 0xDDA5, 0xF966, 0xDDA6, 0x6276, + 0xDDA7, 0x6577, 0xDDA8, 0x65A7, 0xDDA9, 0x6D6E, 0xDDAA, 0x6EA5, + 0xDDAB, 0x7236, 0xDDAC, 0x7B26, 0xDDAD, 0x7C3F, 0xDDAE, 0x7F36, + 0xDDAF, 0x8150, 0xDDB0, 0x8151, 0xDDB1, 0x819A, 0xDDB2, 0x8240, + 0xDDB3, 0x8299, 0xDDB4, 0x83A9, 0xDDB5, 0x8A03, 0xDDB6, 0x8CA0, + 0xDDB7, 0x8CE6, 0xDDB8, 0x8CFB, 0xDDB9, 0x8D74, 0xDDBA, 0x8DBA, + 0xDDBB, 0x90E8, 0xDDBC, 0x91DC, 0xDDBD, 0x961C, 0xDDBE, 0x9644, + 0xDDBF, 0x99D9, 0xDDC0, 0x9CE7, 0xDDC1, 0x5317, 0xDDC2, 0x5206, + 0xDDC3, 0x5429, 0xDDC4, 0x5674, 0xDDC5, 0x58B3, 0xDDC6, 0x5954, + 0xDDC7, 0x596E, 0xDDC8, 0x5FFF, 0xDDC9, 0x61A4, 0xDDCA, 0x626E, + 0xDDCB, 0x6610, 0xDDCC, 0x6C7E, 0xDDCD, 0x711A, 0xDDCE, 0x76C6, + 0xDDCF, 0x7C89, 0xDDD0, 0x7CDE, 0xDDD1, 0x7D1B, 0xDDD2, 0x82AC, + 0xDDD3, 0x8CC1, 0xDDD4, 0x96F0, 0xDDD5, 0xF967, 0xDDD6, 0x4F5B, + 0xDDD7, 0x5F17, 0xDDD8, 0x5F7F, 0xDDD9, 0x62C2, 0xDDDA, 0x5D29, + 0xDDDB, 0x670B, 0xDDDC, 0x68DA, 0xDDDD, 0x787C, 0xDDDE, 0x7E43, + 0xDDDF, 0x9D6C, 0xDDE0, 0x4E15, 0xDDE1, 0x5099, 0xDDE2, 0x5315, + 0xDDE3, 0x532A, 0xDDE4, 0x5351, 0xDDE5, 0x5983, 0xDDE6, 0x5A62, + 0xDDE7, 0x5E87, 0xDDE8, 0x60B2, 0xDDE9, 0x618A, 0xDDEA, 0x6249, + 0xDDEB, 0x6279, 0xDDEC, 0x6590, 0xDDED, 0x6787, 0xDDEE, 0x69A7, + 0xDDEF, 0x6BD4, 0xDDF0, 0x6BD6, 0xDDF1, 0x6BD7, 0xDDF2, 0x6BD8, + 0xDDF3, 0x6CB8, 0xDDF4, 0xF968, 0xDDF5, 0x7435, 0xDDF6, 0x75FA, + 0xDDF7, 0x7812, 0xDDF8, 0x7891, 0xDDF9, 0x79D5, 0xDDFA, 0x79D8, + 0xDDFB, 0x7C83, 0xDDFC, 0x7DCB, 0xDDFD, 0x7FE1, 0xDDFE, 0x80A5, + 0xDEA1, 0x813E, 0xDEA2, 0x81C2, 0xDEA3, 0x83F2, 0xDEA4, 0x871A, + 0xDEA5, 0x88E8, 0xDEA6, 0x8AB9, 0xDEA7, 0x8B6C, 0xDEA8, 0x8CBB, + 0xDEA9, 0x9119, 0xDEAA, 0x975E, 0xDEAB, 0x98DB, 0xDEAC, 0x9F3B, + 0xDEAD, 0x56AC, 0xDEAE, 0x5B2A, 0xDEAF, 0x5F6C, 0xDEB0, 0x658C, + 0xDEB1, 0x6AB3, 0xDEB2, 0x6BAF, 0xDEB3, 0x6D5C, 0xDEB4, 0x6FF1, + 0xDEB5, 0x7015, 0xDEB6, 0x725D, 0xDEB7, 0x73AD, 0xDEB8, 0x8CA7, + 0xDEB9, 0x8CD3, 0xDEBA, 0x983B, 0xDEBB, 0x6191, 0xDEBC, 0x6C37, + 0xDEBD, 0x8058, 0xDEBE, 0x9A01, 0xDEBF, 0x4E4D, 0xDEC0, 0x4E8B, + 0xDEC1, 0x4E9B, 0xDEC2, 0x4ED5, 0xDEC3, 0x4F3A, 0xDEC4, 0x4F3C, + 0xDEC5, 0x4F7F, 0xDEC6, 0x4FDF, 0xDEC7, 0x50FF, 0xDEC8, 0x53F2, + 0xDEC9, 0x53F8, 0xDECA, 0x5506, 0xDECB, 0x55E3, 0xDECC, 0x56DB, + 0xDECD, 0x58EB, 0xDECE, 0x5962, 0xDECF, 0x5A11, 0xDED0, 0x5BEB, + 0xDED1, 0x5BFA, 0xDED2, 0x5C04, 0xDED3, 0x5DF3, 0xDED4, 0x5E2B, + 0xDED5, 0x5F99, 0xDED6, 0x601D, 0xDED7, 0x6368, 0xDED8, 0x659C, + 0xDED9, 0x65AF, 0xDEDA, 0x67F6, 0xDEDB, 0x67FB, 0xDEDC, 0x68AD, + 0xDEDD, 0x6B7B, 0xDEDE, 0x6C99, 0xDEDF, 0x6CD7, 0xDEE0, 0x6E23, + 0xDEE1, 0x7009, 0xDEE2, 0x7345, 0xDEE3, 0x7802, 0xDEE4, 0x793E, + 0xDEE5, 0x7940, 0xDEE6, 0x7960, 0xDEE7, 0x79C1, 0xDEE8, 0x7BE9, + 0xDEE9, 0x7D17, 0xDEEA, 0x7D72, 0xDEEB, 0x8086, 0xDEEC, 0x820D, + 0xDEED, 0x838E, 0xDEEE, 0x84D1, 0xDEEF, 0x86C7, 0xDEF0, 0x88DF, + 0xDEF1, 0x8A50, 0xDEF2, 0x8A5E, 0xDEF3, 0x8B1D, 0xDEF4, 0x8CDC, + 0xDEF5, 0x8D66, 0xDEF6, 0x8FAD, 0xDEF7, 0x90AA, 0xDEF8, 0x98FC, + 0xDEF9, 0x99DF, 0xDEFA, 0x9E9D, 0xDEFB, 0x524A, 0xDEFC, 0xF969, + 0xDEFD, 0x6714, 0xDEFE, 0xF96A, 0xDFA1, 0x5098, 0xDFA2, 0x522A, + 0xDFA3, 0x5C71, 0xDFA4, 0x6563, 0xDFA5, 0x6C55, 0xDFA6, 0x73CA, + 0xDFA7, 0x7523, 0xDFA8, 0x759D, 0xDFA9, 0x7B97, 0xDFAA, 0x849C, + 0xDFAB, 0x9178, 0xDFAC, 0x9730, 0xDFAD, 0x4E77, 0xDFAE, 0x6492, + 0xDFAF, 0x6BBA, 0xDFB0, 0x715E, 0xDFB1, 0x85A9, 0xDFB2, 0x4E09, + 0xDFB3, 0xF96B, 0xDFB4, 0x6749, 0xDFB5, 0x68EE, 0xDFB6, 0x6E17, + 0xDFB7, 0x829F, 0xDFB8, 0x8518, 0xDFB9, 0x886B, 0xDFBA, 0x63F7, + 0xDFBB, 0x6F81, 0xDFBC, 0x9212, 0xDFBD, 0x98AF, 0xDFBE, 0x4E0A, + 0xDFBF, 0x50B7, 0xDFC0, 0x50CF, 0xDFC1, 0x511F, 0xDFC2, 0x5546, + 0xDFC3, 0x55AA, 0xDFC4, 0x5617, 0xDFC5, 0x5B40, 0xDFC6, 0x5C19, + 0xDFC7, 0x5CE0, 0xDFC8, 0x5E38, 0xDFC9, 0x5E8A, 0xDFCA, 0x5EA0, + 0xDFCB, 0x5EC2, 0xDFCC, 0x60F3, 0xDFCD, 0x6851, 0xDFCE, 0x6A61, + 0xDFCF, 0x6E58, 0xDFD0, 0x723D, 0xDFD1, 0x7240, 0xDFD2, 0x72C0, + 0xDFD3, 0x76F8, 0xDFD4, 0x7965, 0xDFD5, 0x7BB1, 0xDFD6, 0x7FD4, + 0xDFD7, 0x88F3, 0xDFD8, 0x89F4, 0xDFD9, 0x8A73, 0xDFDA, 0x8C61, + 0xDFDB, 0x8CDE, 0xDFDC, 0x971C, 0xDFDD, 0x585E, 0xDFDE, 0x74BD, + 0xDFDF, 0x8CFD, 0xDFE0, 0x55C7, 0xDFE1, 0xF96C, 0xDFE2, 0x7A61, + 0xDFE3, 0x7D22, 0xDFE4, 0x8272, 0xDFE5, 0x7272, 0xDFE6, 0x751F, + 0xDFE7, 0x7525, 0xDFE8, 0xF96D, 0xDFE9, 0x7B19, 0xDFEA, 0x5885, + 0xDFEB, 0x58FB, 0xDFEC, 0x5DBC, 0xDFED, 0x5E8F, 0xDFEE, 0x5EB6, + 0xDFEF, 0x5F90, 0xDFF0, 0x6055, 0xDFF1, 0x6292, 0xDFF2, 0x637F, + 0xDFF3, 0x654D, 0xDFF4, 0x6691, 0xDFF5, 0x66D9, 0xDFF6, 0x66F8, + 0xDFF7, 0x6816, 0xDFF8, 0x68F2, 0xDFF9, 0x7280, 0xDFFA, 0x745E, + 0xDFFB, 0x7B6E, 0xDFFC, 0x7D6E, 0xDFFD, 0x7DD6, 0xDFFE, 0x7F72, + 0xE0A1, 0x80E5, 0xE0A2, 0x8212, 0xE0A3, 0x85AF, 0xE0A4, 0x897F, + 0xE0A5, 0x8A93, 0xE0A6, 0x901D, 0xE0A7, 0x92E4, 0xE0A8, 0x9ECD, + 0xE0A9, 0x9F20, 0xE0AA, 0x5915, 0xE0AB, 0x596D, 0xE0AC, 0x5E2D, + 0xE0AD, 0x60DC, 0xE0AE, 0x6614, 0xE0AF, 0x6673, 0xE0B0, 0x6790, + 0xE0B1, 0x6C50, 0xE0B2, 0x6DC5, 0xE0B3, 0x6F5F, 0xE0B4, 0x77F3, + 0xE0B5, 0x78A9, 0xE0B6, 0x84C6, 0xE0B7, 0x91CB, 0xE0B8, 0x932B, + 0xE0B9, 0x4ED9, 0xE0BA, 0x50CA, 0xE0BB, 0x5148, 0xE0BC, 0x5584, + 0xE0BD, 0x5B0B, 0xE0BE, 0x5BA3, 0xE0BF, 0x6247, 0xE0C0, 0x657E, + 0xE0C1, 0x65CB, 0xE0C2, 0x6E32, 0xE0C3, 0x717D, 0xE0C4, 0x7401, + 0xE0C5, 0x7444, 0xE0C6, 0x7487, 0xE0C7, 0x74BF, 0xE0C8, 0x766C, + 0xE0C9, 0x79AA, 0xE0CA, 0x7DDA, 0xE0CB, 0x7E55, 0xE0CC, 0x7FA8, + 0xE0CD, 0x817A, 0xE0CE, 0x81B3, 0xE0CF, 0x8239, 0xE0D0, 0x861A, + 0xE0D1, 0x87EC, 0xE0D2, 0x8A75, 0xE0D3, 0x8DE3, 0xE0D4, 0x9078, + 0xE0D5, 0x9291, 0xE0D6, 0x9425, 0xE0D7, 0x994D, 0xE0D8, 0x9BAE, + 0xE0D9, 0x5368, 0xE0DA, 0x5C51, 0xE0DB, 0x6954, 0xE0DC, 0x6CC4, + 0xE0DD, 0x6D29, 0xE0DE, 0x6E2B, 0xE0DF, 0x820C, 0xE0E0, 0x859B, + 0xE0E1, 0x893B, 0xE0E2, 0x8A2D, 0xE0E3, 0x8AAA, 0xE0E4, 0x96EA, + 0xE0E5, 0x9F67, 0xE0E6, 0x5261, 0xE0E7, 0x66B9, 0xE0E8, 0x6BB2, + 0xE0E9, 0x7E96, 0xE0EA, 0x87FE, 0xE0EB, 0x8D0D, 0xE0EC, 0x9583, + 0xE0ED, 0x965D, 0xE0EE, 0x651D, 0xE0EF, 0x6D89, 0xE0F0, 0x71EE, + 0xE0F1, 0xF96E, 0xE0F2, 0x57CE, 0xE0F3, 0x59D3, 0xE0F4, 0x5BAC, + 0xE0F5, 0x6027, 0xE0F6, 0x60FA, 0xE0F7, 0x6210, 0xE0F8, 0x661F, + 0xE0F9, 0x665F, 0xE0FA, 0x7329, 0xE0FB, 0x73F9, 0xE0FC, 0x76DB, + 0xE0FD, 0x7701, 0xE0FE, 0x7B6C, 0xE1A1, 0x8056, 0xE1A2, 0x8072, + 0xE1A3, 0x8165, 0xE1A4, 0x8AA0, 0xE1A5, 0x9192, 0xE1A6, 0x4E16, + 0xE1A7, 0x52E2, 0xE1A8, 0x6B72, 0xE1A9, 0x6D17, 0xE1AA, 0x7A05, + 0xE1AB, 0x7B39, 0xE1AC, 0x7D30, 0xE1AD, 0xF96F, 0xE1AE, 0x8CB0, + 0xE1AF, 0x53EC, 0xE1B0, 0x562F, 0xE1B1, 0x5851, 0xE1B2, 0x5BB5, + 0xE1B3, 0x5C0F, 0xE1B4, 0x5C11, 0xE1B5, 0x5DE2, 0xE1B6, 0x6240, + 0xE1B7, 0x6383, 0xE1B8, 0x6414, 0xE1B9, 0x662D, 0xE1BA, 0x68B3, + 0xE1BB, 0x6CBC, 0xE1BC, 0x6D88, 0xE1BD, 0x6EAF, 0xE1BE, 0x701F, + 0xE1BF, 0x70A4, 0xE1C0, 0x71D2, 0xE1C1, 0x7526, 0xE1C2, 0x758F, + 0xE1C3, 0x758E, 0xE1C4, 0x7619, 0xE1C5, 0x7B11, 0xE1C6, 0x7BE0, + 0xE1C7, 0x7C2B, 0xE1C8, 0x7D20, 0xE1C9, 0x7D39, 0xE1CA, 0x852C, + 0xE1CB, 0x856D, 0xE1CC, 0x8607, 0xE1CD, 0x8A34, 0xE1CE, 0x900D, + 0xE1CF, 0x9061, 0xE1D0, 0x90B5, 0xE1D1, 0x92B7, 0xE1D2, 0x97F6, + 0xE1D3, 0x9A37, 0xE1D4, 0x4FD7, 0xE1D5, 0x5C6C, 0xE1D6, 0x675F, + 0xE1D7, 0x6D91, 0xE1D8, 0x7C9F, 0xE1D9, 0x7E8C, 0xE1DA, 0x8B16, + 0xE1DB, 0x8D16, 0xE1DC, 0x901F, 0xE1DD, 0x5B6B, 0xE1DE, 0x5DFD, + 0xE1DF, 0x640D, 0xE1E0, 0x84C0, 0xE1E1, 0x905C, 0xE1E2, 0x98E1, + 0xE1E3, 0x7387, 0xE1E4, 0x5B8B, 0xE1E5, 0x609A, 0xE1E6, 0x677E, + 0xE1E7, 0x6DDE, 0xE1E8, 0x8A1F, 0xE1E9, 0x8AA6, 0xE1EA, 0x9001, + 0xE1EB, 0x980C, 0xE1EC, 0x5237, 0xE1ED, 0xF970, 0xE1EE, 0x7051, + 0xE1EF, 0x788E, 0xE1F0, 0x9396, 0xE1F1, 0x8870, 0xE1F2, 0x91D7, + 0xE1F3, 0x4FEE, 0xE1F4, 0x53D7, 0xE1F5, 0x55FD, 0xE1F6, 0x56DA, + 0xE1F7, 0x5782, 0xE1F8, 0x58FD, 0xE1F9, 0x5AC2, 0xE1FA, 0x5B88, + 0xE1FB, 0x5CAB, 0xE1FC, 0x5CC0, 0xE1FD, 0x5E25, 0xE1FE, 0x6101, + 0xE2A1, 0x620D, 0xE2A2, 0x624B, 0xE2A3, 0x6388, 0xE2A4, 0x641C, + 0xE2A5, 0x6536, 0xE2A6, 0x6578, 0xE2A7, 0x6A39, 0xE2A8, 0x6B8A, + 0xE2A9, 0x6C34, 0xE2AA, 0x6D19, 0xE2AB, 0x6F31, 0xE2AC, 0x71E7, + 0xE2AD, 0x72E9, 0xE2AE, 0x7378, 0xE2AF, 0x7407, 0xE2B0, 0x74B2, + 0xE2B1, 0x7626, 0xE2B2, 0x7761, 0xE2B3, 0x79C0, 0xE2B4, 0x7A57, + 0xE2B5, 0x7AEA, 0xE2B6, 0x7CB9, 0xE2B7, 0x7D8F, 0xE2B8, 0x7DAC, + 0xE2B9, 0x7E61, 0xE2BA, 0x7F9E, 0xE2BB, 0x8129, 0xE2BC, 0x8331, + 0xE2BD, 0x8490, 0xE2BE, 0x84DA, 0xE2BF, 0x85EA, 0xE2C0, 0x8896, + 0xE2C1, 0x8AB0, 0xE2C2, 0x8B90, 0xE2C3, 0x8F38, 0xE2C4, 0x9042, + 0xE2C5, 0x9083, 0xE2C6, 0x916C, 0xE2C7, 0x9296, 0xE2C8, 0x92B9, + 0xE2C9, 0x968B, 0xE2CA, 0x96A7, 0xE2CB, 0x96A8, 0xE2CC, 0x96D6, + 0xE2CD, 0x9700, 0xE2CE, 0x9808, 0xE2CF, 0x9996, 0xE2D0, 0x9AD3, + 0xE2D1, 0x9B1A, 0xE2D2, 0x53D4, 0xE2D3, 0x587E, 0xE2D4, 0x5919, + 0xE2D5, 0x5B70, 0xE2D6, 0x5BBF, 0xE2D7, 0x6DD1, 0xE2D8, 0x6F5A, + 0xE2D9, 0x719F, 0xE2DA, 0x7421, 0xE2DB, 0x74B9, 0xE2DC, 0x8085, + 0xE2DD, 0x83FD, 0xE2DE, 0x5DE1, 0xE2DF, 0x5F87, 0xE2E0, 0x5FAA, + 0xE2E1, 0x6042, 0xE2E2, 0x65EC, 0xE2E3, 0x6812, 0xE2E4, 0x696F, + 0xE2E5, 0x6A53, 0xE2E6, 0x6B89, 0xE2E7, 0x6D35, 0xE2E8, 0x6DF3, + 0xE2E9, 0x73E3, 0xE2EA, 0x76FE, 0xE2EB, 0x77AC, 0xE2EC, 0x7B4D, + 0xE2ED, 0x7D14, 0xE2EE, 0x8123, 0xE2EF, 0x821C, 0xE2F0, 0x8340, + 0xE2F1, 0x84F4, 0xE2F2, 0x8563, 0xE2F3, 0x8A62, 0xE2F4, 0x8AC4, + 0xE2F5, 0x9187, 0xE2F6, 0x931E, 0xE2F7, 0x9806, 0xE2F8, 0x99B4, + 0xE2F9, 0x620C, 0xE2FA, 0x8853, 0xE2FB, 0x8FF0, 0xE2FC, 0x9265, + 0xE2FD, 0x5D07, 0xE2FE, 0x5D27, 0xE3A1, 0x5D69, 0xE3A2, 0x745F, + 0xE3A3, 0x819D, 0xE3A4, 0x8768, 0xE3A5, 0x6FD5, 0xE3A6, 0x62FE, + 0xE3A7, 0x7FD2, 0xE3A8, 0x8936, 0xE3A9, 0x8972, 0xE3AA, 0x4E1E, + 0xE3AB, 0x4E58, 0xE3AC, 0x50E7, 0xE3AD, 0x52DD, 0xE3AE, 0x5347, + 0xE3AF, 0x627F, 0xE3B0, 0x6607, 0xE3B1, 0x7E69, 0xE3B2, 0x8805, + 0xE3B3, 0x965E, 0xE3B4, 0x4F8D, 0xE3B5, 0x5319, 0xE3B6, 0x5636, + 0xE3B7, 0x59CB, 0xE3B8, 0x5AA4, 0xE3B9, 0x5C38, 0xE3BA, 0x5C4E, + 0xE3BB, 0x5C4D, 0xE3BC, 0x5E02, 0xE3BD, 0x5F11, 0xE3BE, 0x6043, + 0xE3BF, 0x65BD, 0xE3C0, 0x662F, 0xE3C1, 0x6642, 0xE3C2, 0x67BE, + 0xE3C3, 0x67F4, 0xE3C4, 0x731C, 0xE3C5, 0x77E2, 0xE3C6, 0x793A, + 0xE3C7, 0x7FC5, 0xE3C8, 0x8494, 0xE3C9, 0x84CD, 0xE3CA, 0x8996, + 0xE3CB, 0x8A66, 0xE3CC, 0x8A69, 0xE3CD, 0x8AE1, 0xE3CE, 0x8C55, + 0xE3CF, 0x8C7A, 0xE3D0, 0x57F4, 0xE3D1, 0x5BD4, 0xE3D2, 0x5F0F, + 0xE3D3, 0x606F, 0xE3D4, 0x62ED, 0xE3D5, 0x690D, 0xE3D6, 0x6B96, + 0xE3D7, 0x6E5C, 0xE3D8, 0x7184, 0xE3D9, 0x7BD2, 0xE3DA, 0x8755, + 0xE3DB, 0x8B58, 0xE3DC, 0x8EFE, 0xE3DD, 0x98DF, 0xE3DE, 0x98FE, + 0xE3DF, 0x4F38, 0xE3E0, 0x4F81, 0xE3E1, 0x4FE1, 0xE3E2, 0x547B, + 0xE3E3, 0x5A20, 0xE3E4, 0x5BB8, 0xE3E5, 0x613C, 0xE3E6, 0x65B0, + 0xE3E7, 0x6668, 0xE3E8, 0x71FC, 0xE3E9, 0x7533, 0xE3EA, 0x795E, + 0xE3EB, 0x7D33, 0xE3EC, 0x814E, 0xE3ED, 0x81E3, 0xE3EE, 0x8398, + 0xE3EF, 0x85AA, 0xE3F0, 0x85CE, 0xE3F1, 0x8703, 0xE3F2, 0x8A0A, + 0xE3F3, 0x8EAB, 0xE3F4, 0x8F9B, 0xE3F5, 0xF971, 0xE3F6, 0x8FC5, + 0xE3F7, 0x5931, 0xE3F8, 0x5BA4, 0xE3F9, 0x5BE6, 0xE3FA, 0x6089, + 0xE3FB, 0x5BE9, 0xE3FC, 0x5C0B, 0xE3FD, 0x5FC3, 0xE3FE, 0x6C81, + 0xE4A1, 0xF972, 0xE4A2, 0x6DF1, 0xE4A3, 0x700B, 0xE4A4, 0x751A, + 0xE4A5, 0x82AF, 0xE4A6, 0x8AF6, 0xE4A7, 0x4EC0, 0xE4A8, 0x5341, + 0xE4A9, 0xF973, 0xE4AA, 0x96D9, 0xE4AB, 0x6C0F, 0xE4AC, 0x4E9E, + 0xE4AD, 0x4FC4, 0xE4AE, 0x5152, 0xE4AF, 0x555E, 0xE4B0, 0x5A25, + 0xE4B1, 0x5CE8, 0xE4B2, 0x6211, 0xE4B3, 0x7259, 0xE4B4, 0x82BD, + 0xE4B5, 0x83AA, 0xE4B6, 0x86FE, 0xE4B7, 0x8859, 0xE4B8, 0x8A1D, + 0xE4B9, 0x963F, 0xE4BA, 0x96C5, 0xE4BB, 0x9913, 0xE4BC, 0x9D09, + 0xE4BD, 0x9D5D, 0xE4BE, 0x580A, 0xE4BF, 0x5CB3, 0xE4C0, 0x5DBD, + 0xE4C1, 0x5E44, 0xE4C2, 0x60E1, 0xE4C3, 0x6115, 0xE4C4, 0x63E1, + 0xE4C5, 0x6A02, 0xE4C6, 0x6E25, 0xE4C7, 0x9102, 0xE4C8, 0x9354, + 0xE4C9, 0x984E, 0xE4CA, 0x9C10, 0xE4CB, 0x9F77, 0xE4CC, 0x5B89, + 0xE4CD, 0x5CB8, 0xE4CE, 0x6309, 0xE4CF, 0x664F, 0xE4D0, 0x6848, + 0xE4D1, 0x773C, 0xE4D2, 0x96C1, 0xE4D3, 0x978D, 0xE4D4, 0x9854, + 0xE4D5, 0x9B9F, 0xE4D6, 0x65A1, 0xE4D7, 0x8B01, 0xE4D8, 0x8ECB, + 0xE4D9, 0x95BC, 0xE4DA, 0x5535, 0xE4DB, 0x5CA9, 0xE4DC, 0x5DD6, + 0xE4DD, 0x5EB5, 0xE4DE, 0x6697, 0xE4DF, 0x764C, 0xE4E0, 0x83F4, + 0xE4E1, 0x95C7, 0xE4E2, 0x58D3, 0xE4E3, 0x62BC, 0xE4E4, 0x72CE, + 0xE4E5, 0x9D28, 0xE4E6, 0x4EF0, 0xE4E7, 0x592E, 0xE4E8, 0x600F, + 0xE4E9, 0x663B, 0xE4EA, 0x6B83, 0xE4EB, 0x79E7, 0xE4EC, 0x9D26, + 0xE4ED, 0x5393, 0xE4EE, 0x54C0, 0xE4EF, 0x57C3, 0xE4F0, 0x5D16, + 0xE4F1, 0x611B, 0xE4F2, 0x66D6, 0xE4F3, 0x6DAF, 0xE4F4, 0x788D, + 0xE4F5, 0x827E, 0xE4F6, 0x9698, 0xE4F7, 0x9744, 0xE4F8, 0x5384, + 0xE4F9, 0x627C, 0xE4FA, 0x6396, 0xE4FB, 0x6DB2, 0xE4FC, 0x7E0A, + 0xE4FD, 0x814B, 0xE4FE, 0x984D, 0xE5A1, 0x6AFB, 0xE5A2, 0x7F4C, + 0xE5A3, 0x9DAF, 0xE5A4, 0x9E1A, 0xE5A5, 0x4E5F, 0xE5A6, 0x503B, + 0xE5A7, 0x51B6, 0xE5A8, 0x591C, 0xE5A9, 0x60F9, 0xE5AA, 0x63F6, + 0xE5AB, 0x6930, 0xE5AC, 0x723A, 0xE5AD, 0x8036, 0xE5AE, 0xF974, + 0xE5AF, 0x91CE, 0xE5B0, 0x5F31, 0xE5B1, 0xF975, 0xE5B2, 0xF976, + 0xE5B3, 0x7D04, 0xE5B4, 0x82E5, 0xE5B5, 0x846F, 0xE5B6, 0x84BB, + 0xE5B7, 0x85E5, 0xE5B8, 0x8E8D, 0xE5B9, 0xF977, 0xE5BA, 0x4F6F, + 0xE5BB, 0xF978, 0xE5BC, 0xF979, 0xE5BD, 0x58E4, 0xE5BE, 0x5B43, + 0xE5BF, 0x6059, 0xE5C0, 0x63DA, 0xE5C1, 0x6518, 0xE5C2, 0x656D, + 0xE5C3, 0x6698, 0xE5C4, 0xF97A, 0xE5C5, 0x694A, 0xE5C6, 0x6A23, + 0xE5C7, 0x6D0B, 0xE5C8, 0x7001, 0xE5C9, 0x716C, 0xE5CA, 0x75D2, + 0xE5CB, 0x760D, 0xE5CC, 0x79B3, 0xE5CD, 0x7A70, 0xE5CE, 0xF97B, + 0xE5CF, 0x7F8A, 0xE5D0, 0xF97C, 0xE5D1, 0x8944, 0xE5D2, 0xF97D, + 0xE5D3, 0x8B93, 0xE5D4, 0x91C0, 0xE5D5, 0x967D, 0xE5D6, 0xF97E, + 0xE5D7, 0x990A, 0xE5D8, 0x5704, 0xE5D9, 0x5FA1, 0xE5DA, 0x65BC, + 0xE5DB, 0x6F01, 0xE5DC, 0x7600, 0xE5DD, 0x79A6, 0xE5DE, 0x8A9E, + 0xE5DF, 0x99AD, 0xE5E0, 0x9B5A, 0xE5E1, 0x9F6C, 0xE5E2, 0x5104, + 0xE5E3, 0x61B6, 0xE5E4, 0x6291, 0xE5E5, 0x6A8D, 0xE5E6, 0x81C6, + 0xE5E7, 0x5043, 0xE5E8, 0x5830, 0xE5E9, 0x5F66, 0xE5EA, 0x7109, + 0xE5EB, 0x8A00, 0xE5EC, 0x8AFA, 0xE5ED, 0x5B7C, 0xE5EE, 0x8616, + 0xE5EF, 0x4FFA, 0xE5F0, 0x513C, 0xE5F1, 0x56B4, 0xE5F2, 0x5944, + 0xE5F3, 0x63A9, 0xE5F4, 0x6DF9, 0xE5F5, 0x5DAA, 0xE5F6, 0x696D, + 0xE5F7, 0x5186, 0xE5F8, 0x4E88, 0xE5F9, 0x4F59, 0xE5FA, 0xF97F, + 0xE5FB, 0xF980, 0xE5FC, 0xF981, 0xE5FD, 0x5982, 0xE5FE, 0xF982, + 0xE6A1, 0xF983, 0xE6A2, 0x6B5F, 0xE6A3, 0x6C5D, 0xE6A4, 0xF984, + 0xE6A5, 0x74B5, 0xE6A6, 0x7916, 0xE6A7, 0xF985, 0xE6A8, 0x8207, + 0xE6A9, 0x8245, 0xE6AA, 0x8339, 0xE6AB, 0x8F3F, 0xE6AC, 0x8F5D, + 0xE6AD, 0xF986, 0xE6AE, 0x9918, 0xE6AF, 0xF987, 0xE6B0, 0xF988, + 0xE6B1, 0xF989, 0xE6B2, 0x4EA6, 0xE6B3, 0xF98A, 0xE6B4, 0x57DF, + 0xE6B5, 0x5F79, 0xE6B6, 0x6613, 0xE6B7, 0xF98B, 0xE6B8, 0xF98C, + 0xE6B9, 0x75AB, 0xE6BA, 0x7E79, 0xE6BB, 0x8B6F, 0xE6BC, 0xF98D, + 0xE6BD, 0x9006, 0xE6BE, 0x9A5B, 0xE6BF, 0x56A5, 0xE6C0, 0x5827, + 0xE6C1, 0x59F8, 0xE6C2, 0x5A1F, 0xE6C3, 0x5BB4, 0xE6C4, 0xF98E, + 0xE6C5, 0x5EF6, 0xE6C6, 0xF98F, 0xE6C7, 0xF990, 0xE6C8, 0x6350, + 0xE6C9, 0x633B, 0xE6CA, 0xF991, 0xE6CB, 0x693D, 0xE6CC, 0x6C87, + 0xE6CD, 0x6CBF, 0xE6CE, 0x6D8E, 0xE6CF, 0x6D93, 0xE6D0, 0x6DF5, + 0xE6D1, 0x6F14, 0xE6D2, 0xF992, 0xE6D3, 0x70DF, 0xE6D4, 0x7136, + 0xE6D5, 0x7159, 0xE6D6, 0xF993, 0xE6D7, 0x71C3, 0xE6D8, 0x71D5, + 0xE6D9, 0xF994, 0xE6DA, 0x784F, 0xE6DB, 0x786F, 0xE6DC, 0xF995, + 0xE6DD, 0x7B75, 0xE6DE, 0x7DE3, 0xE6DF, 0xF996, 0xE6E0, 0x7E2F, + 0xE6E1, 0xF997, 0xE6E2, 0x884D, 0xE6E3, 0x8EDF, 0xE6E4, 0xF998, + 0xE6E5, 0xF999, 0xE6E6, 0xF99A, 0xE6E7, 0x925B, 0xE6E8, 0xF99B, + 0xE6E9, 0x9CF6, 0xE6EA, 0xF99C, 0xE6EB, 0xF99D, 0xE6EC, 0xF99E, + 0xE6ED, 0x6085, 0xE6EE, 0x6D85, 0xE6EF, 0xF99F, 0xE6F0, 0x71B1, + 0xE6F1, 0xF9A0, 0xE6F2, 0xF9A1, 0xE6F3, 0x95B1, 0xE6F4, 0x53AD, + 0xE6F5, 0xF9A2, 0xE6F6, 0xF9A3, 0xE6F7, 0xF9A4, 0xE6F8, 0x67D3, + 0xE6F9, 0xF9A5, 0xE6FA, 0x708E, 0xE6FB, 0x7130, 0xE6FC, 0x7430, + 0xE6FD, 0x8276, 0xE6FE, 0x82D2, 0xE7A1, 0xF9A6, 0xE7A2, 0x95BB, + 0xE7A3, 0x9AE5, 0xE7A4, 0x9E7D, 0xE7A5, 0x66C4, 0xE7A6, 0xF9A7, + 0xE7A7, 0x71C1, 0xE7A8, 0x8449, 0xE7A9, 0xF9A8, 0xE7AA, 0xF9A9, + 0xE7AB, 0x584B, 0xE7AC, 0xF9AA, 0xE7AD, 0xF9AB, 0xE7AE, 0x5DB8, + 0xE7AF, 0x5F71, 0xE7B0, 0xF9AC, 0xE7B1, 0x6620, 0xE7B2, 0x668E, + 0xE7B3, 0x6979, 0xE7B4, 0x69AE, 0xE7B5, 0x6C38, 0xE7B6, 0x6CF3, + 0xE7B7, 0x6E36, 0xE7B8, 0x6F41, 0xE7B9, 0x6FDA, 0xE7BA, 0x701B, + 0xE7BB, 0x702F, 0xE7BC, 0x7150, 0xE7BD, 0x71DF, 0xE7BE, 0x7370, + 0xE7BF, 0xF9AD, 0xE7C0, 0x745B, 0xE7C1, 0xF9AE, 0xE7C2, 0x74D4, + 0xE7C3, 0x76C8, 0xE7C4, 0x7A4E, 0xE7C5, 0x7E93, 0xE7C6, 0xF9AF, + 0xE7C7, 0xF9B0, 0xE7C8, 0x82F1, 0xE7C9, 0x8A60, 0xE7CA, 0x8FCE, + 0xE7CB, 0xF9B1, 0xE7CC, 0x9348, 0xE7CD, 0xF9B2, 0xE7CE, 0x9719, + 0xE7CF, 0xF9B3, 0xE7D0, 0xF9B4, 0xE7D1, 0x4E42, 0xE7D2, 0x502A, + 0xE7D3, 0xF9B5, 0xE7D4, 0x5208, 0xE7D5, 0x53E1, 0xE7D6, 0x66F3, + 0xE7D7, 0x6C6D, 0xE7D8, 0x6FCA, 0xE7D9, 0x730A, 0xE7DA, 0x777F, + 0xE7DB, 0x7A62, 0xE7DC, 0x82AE, 0xE7DD, 0x85DD, 0xE7DE, 0x8602, + 0xE7DF, 0xF9B6, 0xE7E0, 0x88D4, 0xE7E1, 0x8A63, 0xE7E2, 0x8B7D, + 0xE7E3, 0x8C6B, 0xE7E4, 0xF9B7, 0xE7E5, 0x92B3, 0xE7E6, 0xF9B8, + 0xE7E7, 0x9713, 0xE7E8, 0x9810, 0xE7E9, 0x4E94, 0xE7EA, 0x4F0D, + 0xE7EB, 0x4FC9, 0xE7EC, 0x50B2, 0xE7ED, 0x5348, 0xE7EE, 0x543E, + 0xE7EF, 0x5433, 0xE7F0, 0x55DA, 0xE7F1, 0x5862, 0xE7F2, 0x58BA, + 0xE7F3, 0x5967, 0xE7F4, 0x5A1B, 0xE7F5, 0x5BE4, 0xE7F6, 0x609F, + 0xE7F7, 0xF9B9, 0xE7F8, 0x61CA, 0xE7F9, 0x6556, 0xE7FA, 0x65FF, + 0xE7FB, 0x6664, 0xE7FC, 0x68A7, 0xE7FD, 0x6C5A, 0xE7FE, 0x6FB3, + 0xE8A1, 0x70CF, 0xE8A2, 0x71AC, 0xE8A3, 0x7352, 0xE8A4, 0x7B7D, + 0xE8A5, 0x8708, 0xE8A6, 0x8AA4, 0xE8A7, 0x9C32, 0xE8A8, 0x9F07, + 0xE8A9, 0x5C4B, 0xE8AA, 0x6C83, 0xE8AB, 0x7344, 0xE8AC, 0x7389, + 0xE8AD, 0x923A, 0xE8AE, 0x6EAB, 0xE8AF, 0x7465, 0xE8B0, 0x761F, + 0xE8B1, 0x7A69, 0xE8B2, 0x7E15, 0xE8B3, 0x860A, 0xE8B4, 0x5140, + 0xE8B5, 0x58C5, 0xE8B6, 0x64C1, 0xE8B7, 0x74EE, 0xE8B8, 0x7515, + 0xE8B9, 0x7670, 0xE8BA, 0x7FC1, 0xE8BB, 0x9095, 0xE8BC, 0x96CD, + 0xE8BD, 0x9954, 0xE8BE, 0x6E26, 0xE8BF, 0x74E6, 0xE8C0, 0x7AA9, + 0xE8C1, 0x7AAA, 0xE8C2, 0x81E5, 0xE8C3, 0x86D9, 0xE8C4, 0x8778, + 0xE8C5, 0x8A1B, 0xE8C6, 0x5A49, 0xE8C7, 0x5B8C, 0xE8C8, 0x5B9B, + 0xE8C9, 0x68A1, 0xE8CA, 0x6900, 0xE8CB, 0x6D63, 0xE8CC, 0x73A9, + 0xE8CD, 0x7413, 0xE8CE, 0x742C, 0xE8CF, 0x7897, 0xE8D0, 0x7DE9, + 0xE8D1, 0x7FEB, 0xE8D2, 0x8118, 0xE8D3, 0x8155, 0xE8D4, 0x839E, + 0xE8D5, 0x8C4C, 0xE8D6, 0x962E, 0xE8D7, 0x9811, 0xE8D8, 0x66F0, + 0xE8D9, 0x5F80, 0xE8DA, 0x65FA, 0xE8DB, 0x6789, 0xE8DC, 0x6C6A, + 0xE8DD, 0x738B, 0xE8DE, 0x502D, 0xE8DF, 0x5A03, 0xE8E0, 0x6B6A, + 0xE8E1, 0x77EE, 0xE8E2, 0x5916, 0xE8E3, 0x5D6C, 0xE8E4, 0x5DCD, + 0xE8E5, 0x7325, 0xE8E6, 0x754F, 0xE8E7, 0xF9BA, 0xE8E8, 0xF9BB, + 0xE8E9, 0x50E5, 0xE8EA, 0x51F9, 0xE8EB, 0x582F, 0xE8EC, 0x592D, + 0xE8ED, 0x5996, 0xE8EE, 0x59DA, 0xE8EF, 0x5BE5, 0xE8F0, 0xF9BC, + 0xE8F1, 0xF9BD, 0xE8F2, 0x5DA2, 0xE8F3, 0x62D7, 0xE8F4, 0x6416, + 0xE8F5, 0x6493, 0xE8F6, 0x64FE, 0xE8F7, 0xF9BE, 0xE8F8, 0x66DC, + 0xE8F9, 0xF9BF, 0xE8FA, 0x6A48, 0xE8FB, 0xF9C0, 0xE8FC, 0x71FF, + 0xE8FD, 0x7464, 0xE8FE, 0xF9C1, 0xE9A1, 0x7A88, 0xE9A2, 0x7AAF, + 0xE9A3, 0x7E47, 0xE9A4, 0x7E5E, 0xE9A5, 0x8000, 0xE9A6, 0x8170, + 0xE9A7, 0xF9C2, 0xE9A8, 0x87EF, 0xE9A9, 0x8981, 0xE9AA, 0x8B20, + 0xE9AB, 0x9059, 0xE9AC, 0xF9C3, 0xE9AD, 0x9080, 0xE9AE, 0x9952, + 0xE9AF, 0x617E, 0xE9B0, 0x6B32, 0xE9B1, 0x6D74, 0xE9B2, 0x7E1F, + 0xE9B3, 0x8925, 0xE9B4, 0x8FB1, 0xE9B5, 0x4FD1, 0xE9B6, 0x50AD, + 0xE9B7, 0x5197, 0xE9B8, 0x52C7, 0xE9B9, 0x57C7, 0xE9BA, 0x5889, + 0xE9BB, 0x5BB9, 0xE9BC, 0x5EB8, 0xE9BD, 0x6142, 0xE9BE, 0x6995, + 0xE9BF, 0x6D8C, 0xE9C0, 0x6E67, 0xE9C1, 0x6EB6, 0xE9C2, 0x7194, + 0xE9C3, 0x7462, 0xE9C4, 0x7528, 0xE9C5, 0x752C, 0xE9C6, 0x8073, + 0xE9C7, 0x8338, 0xE9C8, 0x84C9, 0xE9C9, 0x8E0A, 0xE9CA, 0x9394, + 0xE9CB, 0x93DE, 0xE9CC, 0xF9C4, 0xE9CD, 0x4E8E, 0xE9CE, 0x4F51, + 0xE9CF, 0x5076, 0xE9D0, 0x512A, 0xE9D1, 0x53C8, 0xE9D2, 0x53CB, + 0xE9D3, 0x53F3, 0xE9D4, 0x5B87, 0xE9D5, 0x5BD3, 0xE9D6, 0x5C24, + 0xE9D7, 0x611A, 0xE9D8, 0x6182, 0xE9D9, 0x65F4, 0xE9DA, 0x725B, + 0xE9DB, 0x7397, 0xE9DC, 0x7440, 0xE9DD, 0x76C2, 0xE9DE, 0x7950, + 0xE9DF, 0x7991, 0xE9E0, 0x79B9, 0xE9E1, 0x7D06, 0xE9E2, 0x7FBD, + 0xE9E3, 0x828B, 0xE9E4, 0x85D5, 0xE9E5, 0x865E, 0xE9E6, 0x8FC2, + 0xE9E7, 0x9047, 0xE9E8, 0x90F5, 0xE9E9, 0x91EA, 0xE9EA, 0x9685, + 0xE9EB, 0x96E8, 0xE9EC, 0x96E9, 0xE9ED, 0x52D6, 0xE9EE, 0x5F67, + 0xE9EF, 0x65ED, 0xE9F0, 0x6631, 0xE9F1, 0x682F, 0xE9F2, 0x715C, + 0xE9F3, 0x7A36, 0xE9F4, 0x90C1, 0xE9F5, 0x980A, 0xE9F6, 0x4E91, + 0xE9F7, 0xF9C5, 0xE9F8, 0x6A52, 0xE9F9, 0x6B9E, 0xE9FA, 0x6F90, + 0xE9FB, 0x7189, 0xE9FC, 0x8018, 0xE9FD, 0x82B8, 0xE9FE, 0x8553, + 0xEAA1, 0x904B, 0xEAA2, 0x9695, 0xEAA3, 0x96F2, 0xEAA4, 0x97FB, + 0xEAA5, 0x851A, 0xEAA6, 0x9B31, 0xEAA7, 0x4E90, 0xEAA8, 0x718A, + 0xEAA9, 0x96C4, 0xEAAA, 0x5143, 0xEAAB, 0x539F, 0xEAAC, 0x54E1, + 0xEAAD, 0x5713, 0xEAAE, 0x5712, 0xEAAF, 0x57A3, 0xEAB0, 0x5A9B, + 0xEAB1, 0x5AC4, 0xEAB2, 0x5BC3, 0xEAB3, 0x6028, 0xEAB4, 0x613F, + 0xEAB5, 0x63F4, 0xEAB6, 0x6C85, 0xEAB7, 0x6D39, 0xEAB8, 0x6E72, + 0xEAB9, 0x6E90, 0xEABA, 0x7230, 0xEABB, 0x733F, 0xEABC, 0x7457, + 0xEABD, 0x82D1, 0xEABE, 0x8881, 0xEABF, 0x8F45, 0xEAC0, 0x9060, + 0xEAC1, 0xF9C6, 0xEAC2, 0x9662, 0xEAC3, 0x9858, 0xEAC4, 0x9D1B, + 0xEAC5, 0x6708, 0xEAC6, 0x8D8A, 0xEAC7, 0x925E, 0xEAC8, 0x4F4D, + 0xEAC9, 0x5049, 0xEACA, 0x50DE, 0xEACB, 0x5371, 0xEACC, 0x570D, + 0xEACD, 0x59D4, 0xEACE, 0x5A01, 0xEACF, 0x5C09, 0xEAD0, 0x6170, + 0xEAD1, 0x6690, 0xEAD2, 0x6E2D, 0xEAD3, 0x7232, 0xEAD4, 0x744B, + 0xEAD5, 0x7DEF, 0xEAD6, 0x80C3, 0xEAD7, 0x840E, 0xEAD8, 0x8466, + 0xEAD9, 0x853F, 0xEADA, 0x875F, 0xEADB, 0x885B, 0xEADC, 0x8918, + 0xEADD, 0x8B02, 0xEADE, 0x9055, 0xEADF, 0x97CB, 0xEAE0, 0x9B4F, + 0xEAE1, 0x4E73, 0xEAE2, 0x4F91, 0xEAE3, 0x5112, 0xEAE4, 0x516A, + 0xEAE5, 0xF9C7, 0xEAE6, 0x552F, 0xEAE7, 0x55A9, 0xEAE8, 0x5B7A, + 0xEAE9, 0x5BA5, 0xEAEA, 0x5E7C, 0xEAEB, 0x5E7D, 0xEAEC, 0x5EBE, + 0xEAED, 0x60A0, 0xEAEE, 0x60DF, 0xEAEF, 0x6108, 0xEAF0, 0x6109, + 0xEAF1, 0x63C4, 0xEAF2, 0x6538, 0xEAF3, 0x6709, 0xEAF4, 0xF9C8, + 0xEAF5, 0x67D4, 0xEAF6, 0x67DA, 0xEAF7, 0xF9C9, 0xEAF8, 0x6961, + 0xEAF9, 0x6962, 0xEAFA, 0x6CB9, 0xEAFB, 0x6D27, 0xEAFC, 0xF9CA, + 0xEAFD, 0x6E38, 0xEAFE, 0xF9CB, 0xEBA1, 0x6FE1, 0xEBA2, 0x7336, + 0xEBA3, 0x7337, 0xEBA4, 0xF9CC, 0xEBA5, 0x745C, 0xEBA6, 0x7531, + 0xEBA7, 0xF9CD, 0xEBA8, 0x7652, 0xEBA9, 0xF9CE, 0xEBAA, 0xF9CF, + 0xEBAB, 0x7DAD, 0xEBAC, 0x81FE, 0xEBAD, 0x8438, 0xEBAE, 0x88D5, + 0xEBAF, 0x8A98, 0xEBB0, 0x8ADB, 0xEBB1, 0x8AED, 0xEBB2, 0x8E30, + 0xEBB3, 0x8E42, 0xEBB4, 0x904A, 0xEBB5, 0x903E, 0xEBB6, 0x907A, + 0xEBB7, 0x9149, 0xEBB8, 0x91C9, 0xEBB9, 0x936E, 0xEBBA, 0xF9D0, + 0xEBBB, 0xF9D1, 0xEBBC, 0x5809, 0xEBBD, 0xF9D2, 0xEBBE, 0x6BD3, + 0xEBBF, 0x8089, 0xEBC0, 0x80B2, 0xEBC1, 0xF9D3, 0xEBC2, 0xF9D4, + 0xEBC3, 0x5141, 0xEBC4, 0x596B, 0xEBC5, 0x5C39, 0xEBC6, 0xF9D5, + 0xEBC7, 0xF9D6, 0xEBC8, 0x6F64, 0xEBC9, 0x73A7, 0xEBCA, 0x80E4, + 0xEBCB, 0x8D07, 0xEBCC, 0xF9D7, 0xEBCD, 0x9217, 0xEBCE, 0x958F, + 0xEBCF, 0xF9D8, 0xEBD0, 0xF9D9, 0xEBD1, 0xF9DA, 0xEBD2, 0xF9DB, + 0xEBD3, 0x807F, 0xEBD4, 0x620E, 0xEBD5, 0x701C, 0xEBD6, 0x7D68, + 0xEBD7, 0x878D, 0xEBD8, 0xF9DC, 0xEBD9, 0x57A0, 0xEBDA, 0x6069, + 0xEBDB, 0x6147, 0xEBDC, 0x6BB7, 0xEBDD, 0x8ABE, 0xEBDE, 0x9280, + 0xEBDF, 0x96B1, 0xEBE0, 0x4E59, 0xEBE1, 0x541F, 0xEBE2, 0x6DEB, + 0xEBE3, 0x852D, 0xEBE4, 0x9670, 0xEBE5, 0x97F3, 0xEBE6, 0x98EE, + 0xEBE7, 0x63D6, 0xEBE8, 0x6CE3, 0xEBE9, 0x9091, 0xEBEA, 0x51DD, + 0xEBEB, 0x61C9, 0xEBEC, 0x81BA, 0xEBED, 0x9DF9, 0xEBEE, 0x4F9D, + 0xEBEF, 0x501A, 0xEBF0, 0x5100, 0xEBF1, 0x5B9C, 0xEBF2, 0x610F, + 0xEBF3, 0x61FF, 0xEBF4, 0x64EC, 0xEBF5, 0x6905, 0xEBF6, 0x6BC5, + 0xEBF7, 0x7591, 0xEBF8, 0x77E3, 0xEBF9, 0x7FA9, 0xEBFA, 0x8264, + 0xEBFB, 0x858F, 0xEBFC, 0x87FB, 0xEBFD, 0x8863, 0xEBFE, 0x8ABC, + 0xECA1, 0x8B70, 0xECA2, 0x91AB, 0xECA3, 0x4E8C, 0xECA4, 0x4EE5, + 0xECA5, 0x4F0A, 0xECA6, 0xF9DD, 0xECA7, 0xF9DE, 0xECA8, 0x5937, + 0xECA9, 0x59E8, 0xECAA, 0xF9DF, 0xECAB, 0x5DF2, 0xECAC, 0x5F1B, + 0xECAD, 0x5F5B, 0xECAE, 0x6021, 0xECAF, 0xF9E0, 0xECB0, 0xF9E1, + 0xECB1, 0xF9E2, 0xECB2, 0xF9E3, 0xECB3, 0x723E, 0xECB4, 0x73E5, + 0xECB5, 0xF9E4, 0xECB6, 0x7570, 0xECB7, 0x75CD, 0xECB8, 0xF9E5, + 0xECB9, 0x79FB, 0xECBA, 0xF9E6, 0xECBB, 0x800C, 0xECBC, 0x8033, + 0xECBD, 0x8084, 0xECBE, 0x82E1, 0xECBF, 0x8351, 0xECC0, 0xF9E7, + 0xECC1, 0xF9E8, 0xECC2, 0x8CBD, 0xECC3, 0x8CB3, 0xECC4, 0x9087, + 0xECC5, 0xF9E9, 0xECC6, 0xF9EA, 0xECC7, 0x98F4, 0xECC8, 0x990C, + 0xECC9, 0xF9EB, 0xECCA, 0xF9EC, 0xECCB, 0x7037, 0xECCC, 0x76CA, + 0xECCD, 0x7FCA, 0xECCE, 0x7FCC, 0xECCF, 0x7FFC, 0xECD0, 0x8B1A, + 0xECD1, 0x4EBA, 0xECD2, 0x4EC1, 0xECD3, 0x5203, 0xECD4, 0x5370, + 0xECD5, 0xF9ED, 0xECD6, 0x54BD, 0xECD7, 0x56E0, 0xECD8, 0x59FB, + 0xECD9, 0x5BC5, 0xECDA, 0x5F15, 0xECDB, 0x5FCD, 0xECDC, 0x6E6E, + 0xECDD, 0xF9EE, 0xECDE, 0xF9EF, 0xECDF, 0x7D6A, 0xECE0, 0x8335, + 0xECE1, 0xF9F0, 0xECE2, 0x8693, 0xECE3, 0x8A8D, 0xECE4, 0xF9F1, + 0xECE5, 0x976D, 0xECE6, 0x9777, 0xECE7, 0xF9F2, 0xECE8, 0xF9F3, + 0xECE9, 0x4E00, 0xECEA, 0x4F5A, 0xECEB, 0x4F7E, 0xECEC, 0x58F9, + 0xECED, 0x65E5, 0xECEE, 0x6EA2, 0xECEF, 0x9038, 0xECF0, 0x93B0, + 0xECF1, 0x99B9, 0xECF2, 0x4EFB, 0xECF3, 0x58EC, 0xECF4, 0x598A, + 0xECF5, 0x59D9, 0xECF6, 0x6041, 0xECF7, 0xF9F4, 0xECF8, 0xF9F5, + 0xECF9, 0x7A14, 0xECFA, 0xF9F6, 0xECFB, 0x834F, 0xECFC, 0x8CC3, + 0xECFD, 0x5165, 0xECFE, 0x5344, 0xEDA1, 0xF9F7, 0xEDA2, 0xF9F8, + 0xEDA3, 0xF9F9, 0xEDA4, 0x4ECD, 0xEDA5, 0x5269, 0xEDA6, 0x5B55, + 0xEDA7, 0x82BF, 0xEDA8, 0x4ED4, 0xEDA9, 0x523A, 0xEDAA, 0x54A8, + 0xEDAB, 0x59C9, 0xEDAC, 0x59FF, 0xEDAD, 0x5B50, 0xEDAE, 0x5B57, + 0xEDAF, 0x5B5C, 0xEDB0, 0x6063, 0xEDB1, 0x6148, 0xEDB2, 0x6ECB, + 0xEDB3, 0x7099, 0xEDB4, 0x716E, 0xEDB5, 0x7386, 0xEDB6, 0x74F7, + 0xEDB7, 0x75B5, 0xEDB8, 0x78C1, 0xEDB9, 0x7D2B, 0xEDBA, 0x8005, + 0xEDBB, 0x81EA, 0xEDBC, 0x8328, 0xEDBD, 0x8517, 0xEDBE, 0x85C9, + 0xEDBF, 0x8AEE, 0xEDC0, 0x8CC7, 0xEDC1, 0x96CC, 0xEDC2, 0x4F5C, + 0xEDC3, 0x52FA, 0xEDC4, 0x56BC, 0xEDC5, 0x65AB, 0xEDC6, 0x6628, + 0xEDC7, 0x707C, 0xEDC8, 0x70B8, 0xEDC9, 0x7235, 0xEDCA, 0x7DBD, + 0xEDCB, 0x828D, 0xEDCC, 0x914C, 0xEDCD, 0x96C0, 0xEDCE, 0x9D72, + 0xEDCF, 0x5B71, 0xEDD0, 0x68E7, 0xEDD1, 0x6B98, 0xEDD2, 0x6F7A, + 0xEDD3, 0x76DE, 0xEDD4, 0x5C91, 0xEDD5, 0x66AB, 0xEDD6, 0x6F5B, + 0xEDD7, 0x7BB4, 0xEDD8, 0x7C2A, 0xEDD9, 0x8836, 0xEDDA, 0x96DC, + 0xEDDB, 0x4E08, 0xEDDC, 0x4ED7, 0xEDDD, 0x5320, 0xEDDE, 0x5834, + 0xEDDF, 0x58BB, 0xEDE0, 0x58EF, 0xEDE1, 0x596C, 0xEDE2, 0x5C07, + 0xEDE3, 0x5E33, 0xEDE4, 0x5E84, 0xEDE5, 0x5F35, 0xEDE6, 0x638C, + 0xEDE7, 0x66B2, 0xEDE8, 0x6756, 0xEDE9, 0x6A1F, 0xEDEA, 0x6AA3, + 0xEDEB, 0x6B0C, 0xEDEC, 0x6F3F, 0xEDED, 0x7246, 0xEDEE, 0xF9FA, + 0xEDEF, 0x7350, 0xEDF0, 0x748B, 0xEDF1, 0x7AE0, 0xEDF2, 0x7CA7, + 0xEDF3, 0x8178, 0xEDF4, 0x81DF, 0xEDF5, 0x81E7, 0xEDF6, 0x838A, + 0xEDF7, 0x846C, 0xEDF8, 0x8523, 0xEDF9, 0x8594, 0xEDFA, 0x85CF, + 0xEDFB, 0x88DD, 0xEDFC, 0x8D13, 0xEDFD, 0x91AC, 0xEDFE, 0x9577, + 0xEEA1, 0x969C, 0xEEA2, 0x518D, 0xEEA3, 0x54C9, 0xEEA4, 0x5728, + 0xEEA5, 0x5BB0, 0xEEA6, 0x624D, 0xEEA7, 0x6750, 0xEEA8, 0x683D, + 0xEEA9, 0x6893, 0xEEAA, 0x6E3D, 0xEEAB, 0x6ED3, 0xEEAC, 0x707D, + 0xEEAD, 0x7E21, 0xEEAE, 0x88C1, 0xEEAF, 0x8CA1, 0xEEB0, 0x8F09, + 0xEEB1, 0x9F4B, 0xEEB2, 0x9F4E, 0xEEB3, 0x722D, 0xEEB4, 0x7B8F, + 0xEEB5, 0x8ACD, 0xEEB6, 0x931A, 0xEEB7, 0x4F47, 0xEEB8, 0x4F4E, + 0xEEB9, 0x5132, 0xEEBA, 0x5480, 0xEEBB, 0x59D0, 0xEEBC, 0x5E95, + 0xEEBD, 0x62B5, 0xEEBE, 0x6775, 0xEEBF, 0x696E, 0xEEC0, 0x6A17, + 0xEEC1, 0x6CAE, 0xEEC2, 0x6E1A, 0xEEC3, 0x72D9, 0xEEC4, 0x732A, + 0xEEC5, 0x75BD, 0xEEC6, 0x7BB8, 0xEEC7, 0x7D35, 0xEEC8, 0x82E7, + 0xEEC9, 0x83F9, 0xEECA, 0x8457, 0xEECB, 0x85F7, 0xEECC, 0x8A5B, + 0xEECD, 0x8CAF, 0xEECE, 0x8E87, 0xEECF, 0x9019, 0xEED0, 0x90B8, + 0xEED1, 0x96CE, 0xEED2, 0x9F5F, 0xEED3, 0x52E3, 0xEED4, 0x540A, + 0xEED5, 0x5AE1, 0xEED6, 0x5BC2, 0xEED7, 0x6458, 0xEED8, 0x6575, + 0xEED9, 0x6EF4, 0xEEDA, 0x72C4, 0xEEDB, 0xF9FB, 0xEEDC, 0x7684, + 0xEEDD, 0x7A4D, 0xEEDE, 0x7B1B, 0xEEDF, 0x7C4D, 0xEEE0, 0x7E3E, + 0xEEE1, 0x7FDF, 0xEEE2, 0x837B, 0xEEE3, 0x8B2B, 0xEEE4, 0x8CCA, + 0xEEE5, 0x8D64, 0xEEE6, 0x8DE1, 0xEEE7, 0x8E5F, 0xEEE8, 0x8FEA, + 0xEEE9, 0x8FF9, 0xEEEA, 0x9069, 0xEEEB, 0x93D1, 0xEEEC, 0x4F43, + 0xEEED, 0x4F7A, 0xEEEE, 0x50B3, 0xEEEF, 0x5168, 0xEEF0, 0x5178, + 0xEEF1, 0x524D, 0xEEF2, 0x526A, 0xEEF3, 0x5861, 0xEEF4, 0x587C, + 0xEEF5, 0x5960, 0xEEF6, 0x5C08, 0xEEF7, 0x5C55, 0xEEF8, 0x5EDB, + 0xEEF9, 0x609B, 0xEEFA, 0x6230, 0xEEFB, 0x6813, 0xEEFC, 0x6BBF, + 0xEEFD, 0x6C08, 0xEEFE, 0x6FB1, 0xEFA1, 0x714E, 0xEFA2, 0x7420, + 0xEFA3, 0x7530, 0xEFA4, 0x7538, 0xEFA5, 0x7551, 0xEFA6, 0x7672, + 0xEFA7, 0x7B4C, 0xEFA8, 0x7B8B, 0xEFA9, 0x7BAD, 0xEFAA, 0x7BC6, + 0xEFAB, 0x7E8F, 0xEFAC, 0x8A6E, 0xEFAD, 0x8F3E, 0xEFAE, 0x8F49, + 0xEFAF, 0x923F, 0xEFB0, 0x9293, 0xEFB1, 0x9322, 0xEFB2, 0x942B, + 0xEFB3, 0x96FB, 0xEFB4, 0x985A, 0xEFB5, 0x986B, 0xEFB6, 0x991E, + 0xEFB7, 0x5207, 0xEFB8, 0x622A, 0xEFB9, 0x6298, 0xEFBA, 0x6D59, + 0xEFBB, 0x7664, 0xEFBC, 0x7ACA, 0xEFBD, 0x7BC0, 0xEFBE, 0x7D76, + 0xEFBF, 0x5360, 0xEFC0, 0x5CBE, 0xEFC1, 0x5E97, 0xEFC2, 0x6F38, + 0xEFC3, 0x70B9, 0xEFC4, 0x7C98, 0xEFC5, 0x9711, 0xEFC6, 0x9B8E, + 0xEFC7, 0x9EDE, 0xEFC8, 0x63A5, 0xEFC9, 0x647A, 0xEFCA, 0x8776, + 0xEFCB, 0x4E01, 0xEFCC, 0x4E95, 0xEFCD, 0x4EAD, 0xEFCE, 0x505C, + 0xEFCF, 0x5075, 0xEFD0, 0x5448, 0xEFD1, 0x59C3, 0xEFD2, 0x5B9A, + 0xEFD3, 0x5E40, 0xEFD4, 0x5EAD, 0xEFD5, 0x5EF7, 0xEFD6, 0x5F81, + 0xEFD7, 0x60C5, 0xEFD8, 0x633A, 0xEFD9, 0x653F, 0xEFDA, 0x6574, + 0xEFDB, 0x65CC, 0xEFDC, 0x6676, 0xEFDD, 0x6678, 0xEFDE, 0x67FE, + 0xEFDF, 0x6968, 0xEFE0, 0x6A89, 0xEFE1, 0x6B63, 0xEFE2, 0x6C40, + 0xEFE3, 0x6DC0, 0xEFE4, 0x6DE8, 0xEFE5, 0x6E1F, 0xEFE6, 0x6E5E, + 0xEFE7, 0x701E, 0xEFE8, 0x70A1, 0xEFE9, 0x738E, 0xEFEA, 0x73FD, + 0xEFEB, 0x753A, 0xEFEC, 0x775B, 0xEFED, 0x7887, 0xEFEE, 0x798E, + 0xEFEF, 0x7A0B, 0xEFF0, 0x7A7D, 0xEFF1, 0x7CBE, 0xEFF2, 0x7D8E, + 0xEFF3, 0x8247, 0xEFF4, 0x8A02, 0xEFF5, 0x8AEA, 0xEFF6, 0x8C9E, + 0xEFF7, 0x912D, 0xEFF8, 0x914A, 0xEFF9, 0x91D8, 0xEFFA, 0x9266, + 0xEFFB, 0x92CC, 0xEFFC, 0x9320, 0xEFFD, 0x9706, 0xEFFE, 0x9756, + 0xF0A1, 0x975C, 0xF0A2, 0x9802, 0xF0A3, 0x9F0E, 0xF0A4, 0x5236, + 0xF0A5, 0x5291, 0xF0A6, 0x557C, 0xF0A7, 0x5824, 0xF0A8, 0x5E1D, + 0xF0A9, 0x5F1F, 0xF0AA, 0x608C, 0xF0AB, 0x63D0, 0xF0AC, 0x68AF, + 0xF0AD, 0x6FDF, 0xF0AE, 0x796D, 0xF0AF, 0x7B2C, 0xF0B0, 0x81CD, + 0xF0B1, 0x85BA, 0xF0B2, 0x88FD, 0xF0B3, 0x8AF8, 0xF0B4, 0x8E44, + 0xF0B5, 0x918D, 0xF0B6, 0x9664, 0xF0B7, 0x969B, 0xF0B8, 0x973D, + 0xF0B9, 0x984C, 0xF0BA, 0x9F4A, 0xF0BB, 0x4FCE, 0xF0BC, 0x5146, + 0xF0BD, 0x51CB, 0xF0BE, 0x52A9, 0xF0BF, 0x5632, 0xF0C0, 0x5F14, + 0xF0C1, 0x5F6B, 0xF0C2, 0x63AA, 0xF0C3, 0x64CD, 0xF0C4, 0x65E9, + 0xF0C5, 0x6641, 0xF0C6, 0x66FA, 0xF0C7, 0x66F9, 0xF0C8, 0x671D, + 0xF0C9, 0x689D, 0xF0CA, 0x68D7, 0xF0CB, 0x69FD, 0xF0CC, 0x6F15, + 0xF0CD, 0x6F6E, 0xF0CE, 0x7167, 0xF0CF, 0x71E5, 0xF0D0, 0x722A, + 0xF0D1, 0x74AA, 0xF0D2, 0x773A, 0xF0D3, 0x7956, 0xF0D4, 0x795A, + 0xF0D5, 0x79DF, 0xF0D6, 0x7A20, 0xF0D7, 0x7A95, 0xF0D8, 0x7C97, + 0xF0D9, 0x7CDF, 0xF0DA, 0x7D44, 0xF0DB, 0x7E70, 0xF0DC, 0x8087, + 0xF0DD, 0x85FB, 0xF0DE, 0x86A4, 0xF0DF, 0x8A54, 0xF0E0, 0x8ABF, + 0xF0E1, 0x8D99, 0xF0E2, 0x8E81, 0xF0E3, 0x9020, 0xF0E4, 0x906D, + 0xF0E5, 0x91E3, 0xF0E6, 0x963B, 0xF0E7, 0x96D5, 0xF0E8, 0x9CE5, + 0xF0E9, 0x65CF, 0xF0EA, 0x7C07, 0xF0EB, 0x8DB3, 0xF0EC, 0x93C3, + 0xF0ED, 0x5B58, 0xF0EE, 0x5C0A, 0xF0EF, 0x5352, 0xF0F0, 0x62D9, + 0xF0F1, 0x731D, 0xF0F2, 0x5027, 0xF0F3, 0x5B97, 0xF0F4, 0x5F9E, + 0xF0F5, 0x60B0, 0xF0F6, 0x616B, 0xF0F7, 0x68D5, 0xF0F8, 0x6DD9, + 0xF0F9, 0x742E, 0xF0FA, 0x7A2E, 0xF0FB, 0x7D42, 0xF0FC, 0x7D9C, + 0xF0FD, 0x7E31, 0xF0FE, 0x816B, 0xF1A1, 0x8E2A, 0xF1A2, 0x8E35, + 0xF1A3, 0x937E, 0xF1A4, 0x9418, 0xF1A5, 0x4F50, 0xF1A6, 0x5750, + 0xF1A7, 0x5DE6, 0xF1A8, 0x5EA7, 0xF1A9, 0x632B, 0xF1AA, 0x7F6A, + 0xF1AB, 0x4E3B, 0xF1AC, 0x4F4F, 0xF1AD, 0x4F8F, 0xF1AE, 0x505A, + 0xF1AF, 0x59DD, 0xF1B0, 0x80C4, 0xF1B1, 0x546A, 0xF1B2, 0x5468, + 0xF1B3, 0x55FE, 0xF1B4, 0x594F, 0xF1B5, 0x5B99, 0xF1B6, 0x5DDE, + 0xF1B7, 0x5EDA, 0xF1B8, 0x665D, 0xF1B9, 0x6731, 0xF1BA, 0x67F1, + 0xF1BB, 0x682A, 0xF1BC, 0x6CE8, 0xF1BD, 0x6D32, 0xF1BE, 0x6E4A, + 0xF1BF, 0x6F8D, 0xF1C0, 0x70B7, 0xF1C1, 0x73E0, 0xF1C2, 0x7587, + 0xF1C3, 0x7C4C, 0xF1C4, 0x7D02, 0xF1C5, 0x7D2C, 0xF1C6, 0x7DA2, + 0xF1C7, 0x821F, 0xF1C8, 0x86DB, 0xF1C9, 0x8A3B, 0xF1CA, 0x8A85, + 0xF1CB, 0x8D70, 0xF1CC, 0x8E8A, 0xF1CD, 0x8F33, 0xF1CE, 0x9031, + 0xF1CF, 0x914E, 0xF1D0, 0x9152, 0xF1D1, 0x9444, 0xF1D2, 0x99D0, + 0xF1D3, 0x7AF9, 0xF1D4, 0x7CA5, 0xF1D5, 0x4FCA, 0xF1D6, 0x5101, + 0xF1D7, 0x51C6, 0xF1D8, 0x57C8, 0xF1D9, 0x5BEF, 0xF1DA, 0x5CFB, + 0xF1DB, 0x6659, 0xF1DC, 0x6A3D, 0xF1DD, 0x6D5A, 0xF1DE, 0x6E96, + 0xF1DF, 0x6FEC, 0xF1E0, 0x710C, 0xF1E1, 0x756F, 0xF1E2, 0x7AE3, + 0xF1E3, 0x8822, 0xF1E4, 0x9021, 0xF1E5, 0x9075, 0xF1E6, 0x96CB, + 0xF1E7, 0x99FF, 0xF1E8, 0x8301, 0xF1E9, 0x4E2D, 0xF1EA, 0x4EF2, + 0xF1EB, 0x8846, 0xF1EC, 0x91CD, 0xF1ED, 0x537D, 0xF1EE, 0x6ADB, + 0xF1EF, 0x696B, 0xF1F0, 0x6C41, 0xF1F1, 0x847A, 0xF1F2, 0x589E, + 0xF1F3, 0x618E, 0xF1F4, 0x66FE, 0xF1F5, 0x62EF, 0xF1F6, 0x70DD, + 0xF1F7, 0x7511, 0xF1F8, 0x75C7, 0xF1F9, 0x7E52, 0xF1FA, 0x84B8, + 0xF1FB, 0x8B49, 0xF1FC, 0x8D08, 0xF1FD, 0x4E4B, 0xF1FE, 0x53EA, + 0xF2A1, 0x54AB, 0xF2A2, 0x5730, 0xF2A3, 0x5740, 0xF2A4, 0x5FD7, + 0xF2A5, 0x6301, 0xF2A6, 0x6307, 0xF2A7, 0x646F, 0xF2A8, 0x652F, + 0xF2A9, 0x65E8, 0xF2AA, 0x667A, 0xF2AB, 0x679D, 0xF2AC, 0x67B3, + 0xF2AD, 0x6B62, 0xF2AE, 0x6C60, 0xF2AF, 0x6C9A, 0xF2B0, 0x6F2C, + 0xF2B1, 0x77E5, 0xF2B2, 0x7825, 0xF2B3, 0x7949, 0xF2B4, 0x7957, + 0xF2B5, 0x7D19, 0xF2B6, 0x80A2, 0xF2B7, 0x8102, 0xF2B8, 0x81F3, + 0xF2B9, 0x829D, 0xF2BA, 0x82B7, 0xF2BB, 0x8718, 0xF2BC, 0x8A8C, + 0xF2BD, 0xF9FC, 0xF2BE, 0x8D04, 0xF2BF, 0x8DBE, 0xF2C0, 0x9072, + 0xF2C1, 0x76F4, 0xF2C2, 0x7A19, 0xF2C3, 0x7A37, 0xF2C4, 0x7E54, + 0xF2C5, 0x8077, 0xF2C6, 0x5507, 0xF2C7, 0x55D4, 0xF2C8, 0x5875, + 0xF2C9, 0x632F, 0xF2CA, 0x6422, 0xF2CB, 0x6649, 0xF2CC, 0x664B, + 0xF2CD, 0x686D, 0xF2CE, 0x699B, 0xF2CF, 0x6B84, 0xF2D0, 0x6D25, + 0xF2D1, 0x6EB1, 0xF2D2, 0x73CD, 0xF2D3, 0x7468, 0xF2D4, 0x74A1, + 0xF2D5, 0x755B, 0xF2D6, 0x75B9, 0xF2D7, 0x76E1, 0xF2D8, 0x771E, + 0xF2D9, 0x778B, 0xF2DA, 0x79E6, 0xF2DB, 0x7E09, 0xF2DC, 0x7E1D, + 0xF2DD, 0x81FB, 0xF2DE, 0x852F, 0xF2DF, 0x8897, 0xF2E0, 0x8A3A, + 0xF2E1, 0x8CD1, 0xF2E2, 0x8EEB, 0xF2E3, 0x8FB0, 0xF2E4, 0x9032, + 0xF2E5, 0x93AD, 0xF2E6, 0x9663, 0xF2E7, 0x9673, 0xF2E8, 0x9707, + 0xF2E9, 0x4F84, 0xF2EA, 0x53F1, 0xF2EB, 0x59EA, 0xF2EC, 0x5AC9, + 0xF2ED, 0x5E19, 0xF2EE, 0x684E, 0xF2EF, 0x74C6, 0xF2F0, 0x75BE, + 0xF2F1, 0x79E9, 0xF2F2, 0x7A92, 0xF2F3, 0x81A3, 0xF2F4, 0x86ED, + 0xF2F5, 0x8CEA, 0xF2F6, 0x8DCC, 0xF2F7, 0x8FED, 0xF2F8, 0x659F, + 0xF2F9, 0x6715, 0xF2FA, 0xF9FD, 0xF2FB, 0x57F7, 0xF2FC, 0x6F57, + 0xF2FD, 0x7DDD, 0xF2FE, 0x8F2F, 0xF3A1, 0x93F6, 0xF3A2, 0x96C6, + 0xF3A3, 0x5FB5, 0xF3A4, 0x61F2, 0xF3A5, 0x6F84, 0xF3A6, 0x4E14, + 0xF3A7, 0x4F98, 0xF3A8, 0x501F, 0xF3A9, 0x53C9, 0xF3AA, 0x55DF, + 0xF3AB, 0x5D6F, 0xF3AC, 0x5DEE, 0xF3AD, 0x6B21, 0xF3AE, 0x6B64, + 0xF3AF, 0x78CB, 0xF3B0, 0x7B9A, 0xF3B1, 0xF9FE, 0xF3B2, 0x8E49, + 0xF3B3, 0x8ECA, 0xF3B4, 0x906E, 0xF3B5, 0x6349, 0xF3B6, 0x643E, + 0xF3B7, 0x7740, 0xF3B8, 0x7A84, 0xF3B9, 0x932F, 0xF3BA, 0x947F, + 0xF3BB, 0x9F6A, 0xF3BC, 0x64B0, 0xF3BD, 0x6FAF, 0xF3BE, 0x71E6, + 0xF3BF, 0x74A8, 0xF3C0, 0x74DA, 0xF3C1, 0x7AC4, 0xF3C2, 0x7C12, + 0xF3C3, 0x7E82, 0xF3C4, 0x7CB2, 0xF3C5, 0x7E98, 0xF3C6, 0x8B9A, + 0xF3C7, 0x8D0A, 0xF3C8, 0x947D, 0xF3C9, 0x9910, 0xF3CA, 0x994C, + 0xF3CB, 0x5239, 0xF3CC, 0x5BDF, 0xF3CD, 0x64E6, 0xF3CE, 0x672D, + 0xF3CF, 0x7D2E, 0xF3D0, 0x50ED, 0xF3D1, 0x53C3, 0xF3D2, 0x5879, + 0xF3D3, 0x6158, 0xF3D4, 0x6159, 0xF3D5, 0x61FA, 0xF3D6, 0x65AC, + 0xF3D7, 0x7AD9, 0xF3D8, 0x8B92, 0xF3D9, 0x8B96, 0xF3DA, 0x5009, + 0xF3DB, 0x5021, 0xF3DC, 0x5275, 0xF3DD, 0x5531, 0xF3DE, 0x5A3C, + 0xF3DF, 0x5EE0, 0xF3E0, 0x5F70, 0xF3E1, 0x6134, 0xF3E2, 0x655E, + 0xF3E3, 0x660C, 0xF3E4, 0x6636, 0xF3E5, 0x66A2, 0xF3E6, 0x69CD, + 0xF3E7, 0x6EC4, 0xF3E8, 0x6F32, 0xF3E9, 0x7316, 0xF3EA, 0x7621, + 0xF3EB, 0x7A93, 0xF3EC, 0x8139, 0xF3ED, 0x8259, 0xF3EE, 0x83D6, + 0xF3EF, 0x84BC, 0xF3F0, 0x50B5, 0xF3F1, 0x57F0, 0xF3F2, 0x5BC0, + 0xF3F3, 0x5BE8, 0xF3F4, 0x5F69, 0xF3F5, 0x63A1, 0xF3F6, 0x7826, + 0xF3F7, 0x7DB5, 0xF3F8, 0x83DC, 0xF3F9, 0x8521, 0xF3FA, 0x91C7, + 0xF3FB, 0x91F5, 0xF3FC, 0x518A, 0xF3FD, 0x67F5, 0xF3FE, 0x7B56, + 0xF4A1, 0x8CAC, 0xF4A2, 0x51C4, 0xF4A3, 0x59BB, 0xF4A4, 0x60BD, + 0xF4A5, 0x8655, 0xF4A6, 0x501C, 0xF4A7, 0xF9FF, 0xF4A8, 0x5254, + 0xF4A9, 0x5C3A, 0xF4AA, 0x617D, 0xF4AB, 0x621A, 0xF4AC, 0x62D3, + 0xF4AD, 0x64F2, 0xF4AE, 0x65A5, 0xF4AF, 0x6ECC, 0xF4B0, 0x7620, + 0xF4B1, 0x810A, 0xF4B2, 0x8E60, 0xF4B3, 0x965F, 0xF4B4, 0x96BB, + 0xF4B5, 0x4EDF, 0xF4B6, 0x5343, 0xF4B7, 0x5598, 0xF4B8, 0x5929, + 0xF4B9, 0x5DDD, 0xF4BA, 0x64C5, 0xF4BB, 0x6CC9, 0xF4BC, 0x6DFA, + 0xF4BD, 0x7394, 0xF4BE, 0x7A7F, 0xF4BF, 0x821B, 0xF4C0, 0x85A6, + 0xF4C1, 0x8CE4, 0xF4C2, 0x8E10, 0xF4C3, 0x9077, 0xF4C4, 0x91E7, + 0xF4C5, 0x95E1, 0xF4C6, 0x9621, 0xF4C7, 0x97C6, 0xF4C8, 0x51F8, + 0xF4C9, 0x54F2, 0xF4CA, 0x5586, 0xF4CB, 0x5FB9, 0xF4CC, 0x64A4, + 0xF4CD, 0x6F88, 0xF4CE, 0x7DB4, 0xF4CF, 0x8F1F, 0xF4D0, 0x8F4D, + 0xF4D1, 0x9435, 0xF4D2, 0x50C9, 0xF4D3, 0x5C16, 0xF4D4, 0x6CBE, + 0xF4D5, 0x6DFB, 0xF4D6, 0x751B, 0xF4D7, 0x77BB, 0xF4D8, 0x7C3D, + 0xF4D9, 0x7C64, 0xF4DA, 0x8A79, 0xF4DB, 0x8AC2, 0xF4DC, 0x581E, + 0xF4DD, 0x59BE, 0xF4DE, 0x5E16, 0xF4DF, 0x6377, 0xF4E0, 0x7252, + 0xF4E1, 0x758A, 0xF4E2, 0x776B, 0xF4E3, 0x8ADC, 0xF4E4, 0x8CBC, + 0xF4E5, 0x8F12, 0xF4E6, 0x5EF3, 0xF4E7, 0x6674, 0xF4E8, 0x6DF8, + 0xF4E9, 0x807D, 0xF4EA, 0x83C1, 0xF4EB, 0x8ACB, 0xF4EC, 0x9751, + 0xF4ED, 0x9BD6, 0xF4EE, 0xFA00, 0xF4EF, 0x5243, 0xF4F0, 0x66FF, + 0xF4F1, 0x6D95, 0xF4F2, 0x6EEF, 0xF4F3, 0x7DE0, 0xF4F4, 0x8AE6, + 0xF4F5, 0x902E, 0xF4F6, 0x905E, 0xF4F7, 0x9AD4, 0xF4F8, 0x521D, + 0xF4F9, 0x527F, 0xF4FA, 0x54E8, 0xF4FB, 0x6194, 0xF4FC, 0x6284, + 0xF4FD, 0x62DB, 0xF4FE, 0x68A2, 0xF5A1, 0x6912, 0xF5A2, 0x695A, + 0xF5A3, 0x6A35, 0xF5A4, 0x7092, 0xF5A5, 0x7126, 0xF5A6, 0x785D, + 0xF5A7, 0x7901, 0xF5A8, 0x790E, 0xF5A9, 0x79D2, 0xF5AA, 0x7A0D, + 0xF5AB, 0x8096, 0xF5AC, 0x8278, 0xF5AD, 0x82D5, 0xF5AE, 0x8349, + 0xF5AF, 0x8549, 0xF5B0, 0x8C82, 0xF5B1, 0x8D85, 0xF5B2, 0x9162, + 0xF5B3, 0x918B, 0xF5B4, 0x91AE, 0xF5B5, 0x4FC3, 0xF5B6, 0x56D1, + 0xF5B7, 0x71ED, 0xF5B8, 0x77D7, 0xF5B9, 0x8700, 0xF5BA, 0x89F8, + 0xF5BB, 0x5BF8, 0xF5BC, 0x5FD6, 0xF5BD, 0x6751, 0xF5BE, 0x90A8, + 0xF5BF, 0x53E2, 0xF5C0, 0x585A, 0xF5C1, 0x5BF5, 0xF5C2, 0x60A4, + 0xF5C3, 0x6181, 0xF5C4, 0x6460, 0xF5C5, 0x7E3D, 0xF5C6, 0x8070, + 0xF5C7, 0x8525, 0xF5C8, 0x9283, 0xF5C9, 0x64AE, 0xF5CA, 0x50AC, + 0xF5CB, 0x5D14, 0xF5CC, 0x6700, 0xF5CD, 0x589C, 0xF5CE, 0x62BD, + 0xF5CF, 0x63A8, 0xF5D0, 0x690E, 0xF5D1, 0x6978, 0xF5D2, 0x6A1E, + 0xF5D3, 0x6E6B, 0xF5D4, 0x76BA, 0xF5D5, 0x79CB, 0xF5D6, 0x82BB, + 0xF5D7, 0x8429, 0xF5D8, 0x8ACF, 0xF5D9, 0x8DA8, 0xF5DA, 0x8FFD, + 0xF5DB, 0x9112, 0xF5DC, 0x914B, 0xF5DD, 0x919C, 0xF5DE, 0x9310, + 0xF5DF, 0x9318, 0xF5E0, 0x939A, 0xF5E1, 0x96DB, 0xF5E2, 0x9A36, + 0xF5E3, 0x9C0D, 0xF5E4, 0x4E11, 0xF5E5, 0x755C, 0xF5E6, 0x795D, + 0xF5E7, 0x7AFA, 0xF5E8, 0x7B51, 0xF5E9, 0x7BC9, 0xF5EA, 0x7E2E, + 0xF5EB, 0x84C4, 0xF5EC, 0x8E59, 0xF5ED, 0x8E74, 0xF5EE, 0x8EF8, + 0xF5EF, 0x9010, 0xF5F0, 0x6625, 0xF5F1, 0x693F, 0xF5F2, 0x7443, + 0xF5F3, 0x51FA, 0xF5F4, 0x672E, 0xF5F5, 0x9EDC, 0xF5F6, 0x5145, + 0xF5F7, 0x5FE0, 0xF5F8, 0x6C96, 0xF5F9, 0x87F2, 0xF5FA, 0x885D, + 0xF5FB, 0x8877, 0xF5FC, 0x60B4, 0xF5FD, 0x81B5, 0xF5FE, 0x8403, + 0xF6A1, 0x8D05, 0xF6A2, 0x53D6, 0xF6A3, 0x5439, 0xF6A4, 0x5634, + 0xF6A5, 0x5A36, 0xF6A6, 0x5C31, 0xF6A7, 0x708A, 0xF6A8, 0x7FE0, + 0xF6A9, 0x805A, 0xF6AA, 0x8106, 0xF6AB, 0x81ED, 0xF6AC, 0x8DA3, + 0xF6AD, 0x9189, 0xF6AE, 0x9A5F, 0xF6AF, 0x9DF2, 0xF6B0, 0x5074, + 0xF6B1, 0x4EC4, 0xF6B2, 0x53A0, 0xF6B3, 0x60FB, 0xF6B4, 0x6E2C, + 0xF6B5, 0x5C64, 0xF6B6, 0x4F88, 0xF6B7, 0x5024, 0xF6B8, 0x55E4, + 0xF6B9, 0x5CD9, 0xF6BA, 0x5E5F, 0xF6BB, 0x6065, 0xF6BC, 0x6894, + 0xF6BD, 0x6CBB, 0xF6BE, 0x6DC4, 0xF6BF, 0x71BE, 0xF6C0, 0x75D4, + 0xF6C1, 0x75F4, 0xF6C2, 0x7661, 0xF6C3, 0x7A1A, 0xF6C4, 0x7A49, + 0xF6C5, 0x7DC7, 0xF6C6, 0x7DFB, 0xF6C7, 0x7F6E, 0xF6C8, 0x81F4, + 0xF6C9, 0x86A9, 0xF6CA, 0x8F1C, 0xF6CB, 0x96C9, 0xF6CC, 0x99B3, + 0xF6CD, 0x9F52, 0xF6CE, 0x5247, 0xF6CF, 0x52C5, 0xF6D0, 0x98ED, + 0xF6D1, 0x89AA, 0xF6D2, 0x4E03, 0xF6D3, 0x67D2, 0xF6D4, 0x6F06, + 0xF6D5, 0x4FB5, 0xF6D6, 0x5BE2, 0xF6D7, 0x6795, 0xF6D8, 0x6C88, + 0xF6D9, 0x6D78, 0xF6DA, 0x741B, 0xF6DB, 0x7827, 0xF6DC, 0x91DD, + 0xF6DD, 0x937C, 0xF6DE, 0x87C4, 0xF6DF, 0x79E4, 0xF6E0, 0x7A31, + 0xF6E1, 0x5FEB, 0xF6E2, 0x4ED6, 0xF6E3, 0x54A4, 0xF6E4, 0x553E, + 0xF6E5, 0x58AE, 0xF6E6, 0x59A5, 0xF6E7, 0x60F0, 0xF6E8, 0x6253, + 0xF6E9, 0x62D6, 0xF6EA, 0x6736, 0xF6EB, 0x6955, 0xF6EC, 0x8235, + 0xF6ED, 0x9640, 0xF6EE, 0x99B1, 0xF6EF, 0x99DD, 0xF6F0, 0x502C, + 0xF6F1, 0x5353, 0xF6F2, 0x5544, 0xF6F3, 0x577C, 0xF6F4, 0xFA01, + 0xF6F5, 0x6258, 0xF6F6, 0xFA02, 0xF6F7, 0x64E2, 0xF6F8, 0x666B, + 0xF6F9, 0x67DD, 0xF6FA, 0x6FC1, 0xF6FB, 0x6FEF, 0xF6FC, 0x7422, + 0xF6FD, 0x7438, 0xF6FE, 0x8A17, 0xF7A1, 0x9438, 0xF7A2, 0x5451, + 0xF7A3, 0x5606, 0xF7A4, 0x5766, 0xF7A5, 0x5F48, 0xF7A6, 0x619A, + 0xF7A7, 0x6B4E, 0xF7A8, 0x7058, 0xF7A9, 0x70AD, 0xF7AA, 0x7DBB, + 0xF7AB, 0x8A95, 0xF7AC, 0x596A, 0xF7AD, 0x812B, 0xF7AE, 0x63A2, + 0xF7AF, 0x7708, 0xF7B0, 0x803D, 0xF7B1, 0x8CAA, 0xF7B2, 0x5854, + 0xF7B3, 0x642D, 0xF7B4, 0x69BB, 0xF7B5, 0x5B95, 0xF7B6, 0x5E11, + 0xF7B7, 0x6E6F, 0xF7B8, 0xFA03, 0xF7B9, 0x8569, 0xF7BA, 0x514C, + 0xF7BB, 0x53F0, 0xF7BC, 0x592A, 0xF7BD, 0x6020, 0xF7BE, 0x614B, + 0xF7BF, 0x6B86, 0xF7C0, 0x6C70, 0xF7C1, 0x6CF0, 0xF7C2, 0x7B1E, + 0xF7C3, 0x80CE, 0xF7C4, 0x82D4, 0xF7C5, 0x8DC6, 0xF7C6, 0x90B0, + 0xF7C7, 0x98B1, 0xF7C8, 0xFA04, 0xF7C9, 0x64C7, 0xF7CA, 0x6FA4, + 0xF7CB, 0x6491, 0xF7CC, 0x6504, 0xF7CD, 0x514E, 0xF7CE, 0x5410, + 0xF7CF, 0x571F, 0xF7D0, 0x8A0E, 0xF7D1, 0x615F, 0xF7D2, 0x6876, + 0xF7D3, 0xFA05, 0xF7D4, 0x75DB, 0xF7D5, 0x7B52, 0xF7D6, 0x7D71, + 0xF7D7, 0x901A, 0xF7D8, 0x5806, 0xF7D9, 0x69CC, 0xF7DA, 0x817F, + 0xF7DB, 0x892A, 0xF7DC, 0x9000, 0xF7DD, 0x9839, 0xF7DE, 0x5078, + 0xF7DF, 0x5957, 0xF7E0, 0x59AC, 0xF7E1, 0x6295, 0xF7E2, 0x900F, + 0xF7E3, 0x9B2A, 0xF7E4, 0x615D, 0xF7E5, 0x7279, 0xF7E6, 0x95D6, + 0xF7E7, 0x5761, 0xF7E8, 0x5A46, 0xF7E9, 0x5DF4, 0xF7EA, 0x628A, + 0xF7EB, 0x64AD, 0xF7EC, 0x64FA, 0xF7ED, 0x6777, 0xF7EE, 0x6CE2, + 0xF7EF, 0x6D3E, 0xF7F0, 0x722C, 0xF7F1, 0x7436, 0xF7F2, 0x7834, + 0xF7F3, 0x7F77, 0xF7F4, 0x82AD, 0xF7F5, 0x8DDB, 0xF7F6, 0x9817, + 0xF7F7, 0x5224, 0xF7F8, 0x5742, 0xF7F9, 0x677F, 0xF7FA, 0x7248, + 0xF7FB, 0x74E3, 0xF7FC, 0x8CA9, 0xF7FD, 0x8FA6, 0xF7FE, 0x9211, + 0xF8A1, 0x962A, 0xF8A2, 0x516B, 0xF8A3, 0x53ED, 0xF8A4, 0x634C, + 0xF8A5, 0x4F69, 0xF8A6, 0x5504, 0xF8A7, 0x6096, 0xF8A8, 0x6557, + 0xF8A9, 0x6C9B, 0xF8AA, 0x6D7F, 0xF8AB, 0x724C, 0xF8AC, 0x72FD, + 0xF8AD, 0x7A17, 0xF8AE, 0x8987, 0xF8AF, 0x8C9D, 0xF8B0, 0x5F6D, + 0xF8B1, 0x6F8E, 0xF8B2, 0x70F9, 0xF8B3, 0x81A8, 0xF8B4, 0x610E, + 0xF8B5, 0x4FBF, 0xF8B6, 0x504F, 0xF8B7, 0x6241, 0xF8B8, 0x7247, + 0xF8B9, 0x7BC7, 0xF8BA, 0x7DE8, 0xF8BB, 0x7FE9, 0xF8BC, 0x904D, + 0xF8BD, 0x97AD, 0xF8BE, 0x9A19, 0xF8BF, 0x8CB6, 0xF8C0, 0x576A, + 0xF8C1, 0x5E73, 0xF8C2, 0x67B0, 0xF8C3, 0x840D, 0xF8C4, 0x8A55, + 0xF8C5, 0x5420, 0xF8C6, 0x5B16, 0xF8C7, 0x5E63, 0xF8C8, 0x5EE2, + 0xF8C9, 0x5F0A, 0xF8CA, 0x6583, 0xF8CB, 0x80BA, 0xF8CC, 0x853D, + 0xF8CD, 0x9589, 0xF8CE, 0x965B, 0xF8CF, 0x4F48, 0xF8D0, 0x5305, + 0xF8D1, 0x530D, 0xF8D2, 0x530F, 0xF8D3, 0x5486, 0xF8D4, 0x54FA, + 0xF8D5, 0x5703, 0xF8D6, 0x5E03, 0xF8D7, 0x6016, 0xF8D8, 0x629B, + 0xF8D9, 0x62B1, 0xF8DA, 0x6355, 0xF8DB, 0xFA06, 0xF8DC, 0x6CE1, + 0xF8DD, 0x6D66, 0xF8DE, 0x75B1, 0xF8DF, 0x7832, 0xF8E0, 0x80DE, + 0xF8E1, 0x812F, 0xF8E2, 0x82DE, 0xF8E3, 0x8461, 0xF8E4, 0x84B2, + 0xF8E5, 0x888D, 0xF8E6, 0x8912, 0xF8E7, 0x900B, 0xF8E8, 0x92EA, + 0xF8E9, 0x98FD, 0xF8EA, 0x9B91, 0xF8EB, 0x5E45, 0xF8EC, 0x66B4, + 0xF8ED, 0x66DD, 0xF8EE, 0x7011, 0xF8EF, 0x7206, 0xF8F0, 0xFA07, + 0xF8F1, 0x4FF5, 0xF8F2, 0x527D, 0xF8F3, 0x5F6A, 0xF8F4, 0x6153, + 0xF8F5, 0x6753, 0xF8F6, 0x6A19, 0xF8F7, 0x6F02, 0xF8F8, 0x74E2, + 0xF8F9, 0x7968, 0xF8FA, 0x8868, 0xF8FB, 0x8C79, 0xF8FC, 0x98C7, + 0xF8FD, 0x98C4, 0xF8FE, 0x9A43, 0xF9A1, 0x54C1, 0xF9A2, 0x7A1F, + 0xF9A3, 0x6953, 0xF9A4, 0x8AF7, 0xF9A5, 0x8C4A, 0xF9A6, 0x98A8, + 0xF9A7, 0x99AE, 0xF9A8, 0x5F7C, 0xF9A9, 0x62AB, 0xF9AA, 0x75B2, + 0xF9AB, 0x76AE, 0xF9AC, 0x88AB, 0xF9AD, 0x907F, 0xF9AE, 0x9642, + 0xF9AF, 0x5339, 0xF9B0, 0x5F3C, 0xF9B1, 0x5FC5, 0xF9B2, 0x6CCC, + 0xF9B3, 0x73CC, 0xF9B4, 0x7562, 0xF9B5, 0x758B, 0xF9B6, 0x7B46, + 0xF9B7, 0x82FE, 0xF9B8, 0x999D, 0xF9B9, 0x4E4F, 0xF9BA, 0x903C, + 0xF9BB, 0x4E0B, 0xF9BC, 0x4F55, 0xF9BD, 0x53A6, 0xF9BE, 0x590F, + 0xF9BF, 0x5EC8, 0xF9C0, 0x6630, 0xF9C1, 0x6CB3, 0xF9C2, 0x7455, + 0xF9C3, 0x8377, 0xF9C4, 0x8766, 0xF9C5, 0x8CC0, 0xF9C6, 0x9050, + 0xF9C7, 0x971E, 0xF9C8, 0x9C15, 0xF9C9, 0x58D1, 0xF9CA, 0x5B78, + 0xF9CB, 0x8650, 0xF9CC, 0x8B14, 0xF9CD, 0x9DB4, 0xF9CE, 0x5BD2, + 0xF9CF, 0x6068, 0xF9D0, 0x608D, 0xF9D1, 0x65F1, 0xF9D2, 0x6C57, + 0xF9D3, 0x6F22, 0xF9D4, 0x6FA3, 0xF9D5, 0x701A, 0xF9D6, 0x7F55, + 0xF9D7, 0x7FF0, 0xF9D8, 0x9591, 0xF9D9, 0x9592, 0xF9DA, 0x9650, + 0xF9DB, 0x97D3, 0xF9DC, 0x5272, 0xF9DD, 0x8F44, 0xF9DE, 0x51FD, + 0xF9DF, 0x542B, 0xF9E0, 0x54B8, 0xF9E1, 0x5563, 0xF9E2, 0x558A, + 0xF9E3, 0x6ABB, 0xF9E4, 0x6DB5, 0xF9E5, 0x7DD8, 0xF9E6, 0x8266, + 0xF9E7, 0x929C, 0xF9E8, 0x9677, 0xF9E9, 0x9E79, 0xF9EA, 0x5408, + 0xF9EB, 0x54C8, 0xF9EC, 0x76D2, 0xF9ED, 0x86E4, 0xF9EE, 0x95A4, + 0xF9EF, 0x95D4, 0xF9F0, 0x965C, 0xF9F1, 0x4EA2, 0xF9F2, 0x4F09, + 0xF9F3, 0x59EE, 0xF9F4, 0x5AE6, 0xF9F5, 0x5DF7, 0xF9F6, 0x6052, + 0xF9F7, 0x6297, 0xF9F8, 0x676D, 0xF9F9, 0x6841, 0xF9FA, 0x6C86, + 0xF9FB, 0x6E2F, 0xF9FC, 0x7F38, 0xF9FD, 0x809B, 0xF9FE, 0x822A, + 0xFAA1, 0xFA08, 0xFAA2, 0xFA09, 0xFAA3, 0x9805, 0xFAA4, 0x4EA5, + 0xFAA5, 0x5055, 0xFAA6, 0x54B3, 0xFAA7, 0x5793, 0xFAA8, 0x595A, + 0xFAA9, 0x5B69, 0xFAAA, 0x5BB3, 0xFAAB, 0x61C8, 0xFAAC, 0x6977, + 0xFAAD, 0x6D77, 0xFAAE, 0x7023, 0xFAAF, 0x87F9, 0xFAB0, 0x89E3, + 0xFAB1, 0x8A72, 0xFAB2, 0x8AE7, 0xFAB3, 0x9082, 0xFAB4, 0x99ED, + 0xFAB5, 0x9AB8, 0xFAB6, 0x52BE, 0xFAB7, 0x6838, 0xFAB8, 0x5016, + 0xFAB9, 0x5E78, 0xFABA, 0x674F, 0xFABB, 0x8347, 0xFABC, 0x884C, + 0xFABD, 0x4EAB, 0xFABE, 0x5411, 0xFABF, 0x56AE, 0xFAC0, 0x73E6, + 0xFAC1, 0x9115, 0xFAC2, 0x97FF, 0xFAC3, 0x9909, 0xFAC4, 0x9957, + 0xFAC5, 0x9999, 0xFAC6, 0x5653, 0xFAC7, 0x589F, 0xFAC8, 0x865B, + 0xFAC9, 0x8A31, 0xFACA, 0x61B2, 0xFACB, 0x6AF6, 0xFACC, 0x737B, + 0xFACD, 0x8ED2, 0xFACE, 0x6B47, 0xFACF, 0x96AA, 0xFAD0, 0x9A57, + 0xFAD1, 0x5955, 0xFAD2, 0x7200, 0xFAD3, 0x8D6B, 0xFAD4, 0x9769, + 0xFAD5, 0x4FD4, 0xFAD6, 0x5CF4, 0xFAD7, 0x5F26, 0xFAD8, 0x61F8, + 0xFAD9, 0x665B, 0xFADA, 0x6CEB, 0xFADB, 0x70AB, 0xFADC, 0x7384, + 0xFADD, 0x73B9, 0xFADE, 0x73FE, 0xFADF, 0x7729, 0xFAE0, 0x774D, + 0xFAE1, 0x7D43, 0xFAE2, 0x7D62, 0xFAE3, 0x7E23, 0xFAE4, 0x8237, + 0xFAE5, 0x8852, 0xFAE6, 0xFA0A, 0xFAE7, 0x8CE2, 0xFAE8, 0x9249, + 0xFAE9, 0x986F, 0xFAEA, 0x5B51, 0xFAEB, 0x7A74, 0xFAEC, 0x8840, + 0xFAED, 0x9801, 0xFAEE, 0x5ACC, 0xFAEF, 0x4FE0, 0xFAF0, 0x5354, + 0xFAF1, 0x593E, 0xFAF2, 0x5CFD, 0xFAF3, 0x633E, 0xFAF4, 0x6D79, + 0xFAF5, 0x72F9, 0xFAF6, 0x8105, 0xFAF7, 0x8107, 0xFAF8, 0x83A2, + 0xFAF9, 0x92CF, 0xFAFA, 0x9830, 0xFAFB, 0x4EA8, 0xFAFC, 0x5144, + 0xFAFD, 0x5211, 0xFAFE, 0x578B, 0xFBA1, 0x5F62, 0xFBA2, 0x6CC2, + 0xFBA3, 0x6ECE, 0xFBA4, 0x7005, 0xFBA5, 0x7050, 0xFBA6, 0x70AF, + 0xFBA7, 0x7192, 0xFBA8, 0x73E9, 0xFBA9, 0x7469, 0xFBAA, 0x834A, + 0xFBAB, 0x87A2, 0xFBAC, 0x8861, 0xFBAD, 0x9008, 0xFBAE, 0x90A2, + 0xFBAF, 0x93A3, 0xFBB0, 0x99A8, 0xFBB1, 0x516E, 0xFBB2, 0x5F57, + 0xFBB3, 0x60E0, 0xFBB4, 0x6167, 0xFBB5, 0x66B3, 0xFBB6, 0x8559, + 0xFBB7, 0x8E4A, 0xFBB8, 0x91AF, 0xFBB9, 0x978B, 0xFBBA, 0x4E4E, + 0xFBBB, 0x4E92, 0xFBBC, 0x547C, 0xFBBD, 0x58D5, 0xFBBE, 0x58FA, + 0xFBBF, 0x597D, 0xFBC0, 0x5CB5, 0xFBC1, 0x5F27, 0xFBC2, 0x6236, + 0xFBC3, 0x6248, 0xFBC4, 0x660A, 0xFBC5, 0x6667, 0xFBC6, 0x6BEB, + 0xFBC7, 0x6D69, 0xFBC8, 0x6DCF, 0xFBC9, 0x6E56, 0xFBCA, 0x6EF8, + 0xFBCB, 0x6F94, 0xFBCC, 0x6FE0, 0xFBCD, 0x6FE9, 0xFBCE, 0x705D, + 0xFBCF, 0x72D0, 0xFBD0, 0x7425, 0xFBD1, 0x745A, 0xFBD2, 0x74E0, + 0xFBD3, 0x7693, 0xFBD4, 0x795C, 0xFBD5, 0x7CCA, 0xFBD6, 0x7E1E, + 0xFBD7, 0x80E1, 0xFBD8, 0x82A6, 0xFBD9, 0x846B, 0xFBDA, 0x84BF, + 0xFBDB, 0x864E, 0xFBDC, 0x865F, 0xFBDD, 0x8774, 0xFBDE, 0x8B77, + 0xFBDF, 0x8C6A, 0xFBE0, 0x93AC, 0xFBE1, 0x9800, 0xFBE2, 0x9865, + 0xFBE3, 0x60D1, 0xFBE4, 0x6216, 0xFBE5, 0x9177, 0xFBE6, 0x5A5A, + 0xFBE7, 0x660F, 0xFBE8, 0x6DF7, 0xFBE9, 0x6E3E, 0xFBEA, 0x743F, + 0xFBEB, 0x9B42, 0xFBEC, 0x5FFD, 0xFBED, 0x60DA, 0xFBEE, 0x7B0F, + 0xFBEF, 0x54C4, 0xFBF0, 0x5F18, 0xFBF1, 0x6C5E, 0xFBF2, 0x6CD3, + 0xFBF3, 0x6D2A, 0xFBF4, 0x70D8, 0xFBF5, 0x7D05, 0xFBF6, 0x8679, + 0xFBF7, 0x8A0C, 0xFBF8, 0x9D3B, 0xFBF9, 0x5316, 0xFBFA, 0x548C, + 0xFBFB, 0x5B05, 0xFBFC, 0x6A3A, 0xFBFD, 0x706B, 0xFBFE, 0x7575, + 0xFCA1, 0x798D, 0xFCA2, 0x79BE, 0xFCA3, 0x82B1, 0xFCA4, 0x83EF, + 0xFCA5, 0x8A71, 0xFCA6, 0x8B41, 0xFCA7, 0x8CA8, 0xFCA8, 0x9774, + 0xFCA9, 0xFA0B, 0xFCAA, 0x64F4, 0xFCAB, 0x652B, 0xFCAC, 0x78BA, + 0xFCAD, 0x78BB, 0xFCAE, 0x7A6B, 0xFCAF, 0x4E38, 0xFCB0, 0x559A, + 0xFCB1, 0x5950, 0xFCB2, 0x5BA6, 0xFCB3, 0x5E7B, 0xFCB4, 0x60A3, + 0xFCB5, 0x63DB, 0xFCB6, 0x6B61, 0xFCB7, 0x6665, 0xFCB8, 0x6853, + 0xFCB9, 0x6E19, 0xFCBA, 0x7165, 0xFCBB, 0x74B0, 0xFCBC, 0x7D08, + 0xFCBD, 0x9084, 0xFCBE, 0x9A69, 0xFCBF, 0x9C25, 0xFCC0, 0x6D3B, + 0xFCC1, 0x6ED1, 0xFCC2, 0x733E, 0xFCC3, 0x8C41, 0xFCC4, 0x95CA, + 0xFCC5, 0x51F0, 0xFCC6, 0x5E4C, 0xFCC7, 0x5FA8, 0xFCC8, 0x604D, + 0xFCC9, 0x60F6, 0xFCCA, 0x6130, 0xFCCB, 0x614C, 0xFCCC, 0x6643, + 0xFCCD, 0x6644, 0xFCCE, 0x69A5, 0xFCCF, 0x6CC1, 0xFCD0, 0x6E5F, + 0xFCD1, 0x6EC9, 0xFCD2, 0x6F62, 0xFCD3, 0x714C, 0xFCD4, 0x749C, + 0xFCD5, 0x7687, 0xFCD6, 0x7BC1, 0xFCD7, 0x7C27, 0xFCD8, 0x8352, + 0xFCD9, 0x8757, 0xFCDA, 0x9051, 0xFCDB, 0x968D, 0xFCDC, 0x9EC3, + 0xFCDD, 0x532F, 0xFCDE, 0x56DE, 0xFCDF, 0x5EFB, 0xFCE0, 0x5F8A, + 0xFCE1, 0x6062, 0xFCE2, 0x6094, 0xFCE3, 0x61F7, 0xFCE4, 0x6666, + 0xFCE5, 0x6703, 0xFCE6, 0x6A9C, 0xFCE7, 0x6DEE, 0xFCE8, 0x6FAE, + 0xFCE9, 0x7070, 0xFCEA, 0x736A, 0xFCEB, 0x7E6A, 0xFCEC, 0x81BE, + 0xFCED, 0x8334, 0xFCEE, 0x86D4, 0xFCEF, 0x8AA8, 0xFCF0, 0x8CC4, + 0xFCF1, 0x5283, 0xFCF2, 0x7372, 0xFCF3, 0x5B96, 0xFCF4, 0x6A6B, + 0xFCF5, 0x9404, 0xFCF6, 0x54EE, 0xFCF7, 0x5686, 0xFCF8, 0x5B5D, + 0xFCF9, 0x6548, 0xFCFA, 0x6585, 0xFCFB, 0x66C9, 0xFCFC, 0x689F, + 0xFCFD, 0x6D8D, 0xFCFE, 0x6DC6, 0xFDA1, 0x723B, 0xFDA2, 0x80B4, + 0xFDA3, 0x9175, 0xFDA4, 0x9A4D, 0xFDA5, 0x4FAF, 0xFDA6, 0x5019, + 0xFDA7, 0x539A, 0xFDA8, 0x540E, 0xFDA9, 0x543C, 0xFDAA, 0x5589, + 0xFDAB, 0x55C5, 0xFDAC, 0x5E3F, 0xFDAD, 0x5F8C, 0xFDAE, 0x673D, + 0xFDAF, 0x7166, 0xFDB0, 0x73DD, 0xFDB1, 0x9005, 0xFDB2, 0x52DB, + 0xFDB3, 0x52F3, 0xFDB4, 0x5864, 0xFDB5, 0x58CE, 0xFDB6, 0x7104, + 0xFDB7, 0x718F, 0xFDB8, 0x71FB, 0xFDB9, 0x85B0, 0xFDBA, 0x8A13, + 0xFDBB, 0x6688, 0xFDBC, 0x85A8, 0xFDBD, 0x55A7, 0xFDBE, 0x6684, + 0xFDBF, 0x714A, 0xFDC0, 0x8431, 0xFDC1, 0x5349, 0xFDC2, 0x5599, + 0xFDC3, 0x6BC1, 0xFDC4, 0x5F59, 0xFDC5, 0x5FBD, 0xFDC6, 0x63EE, + 0xFDC7, 0x6689, 0xFDC8, 0x7147, 0xFDC9, 0x8AF1, 0xFDCA, 0x8F1D, + 0xFDCB, 0x9EBE, 0xFDCC, 0x4F11, 0xFDCD, 0x643A, 0xFDCE, 0x70CB, + 0xFDCF, 0x7566, 0xFDD0, 0x8667, 0xFDD1, 0x6064, 0xFDD2, 0x8B4E, + 0xFDD3, 0x9DF8, 0xFDD4, 0x5147, 0xFDD5, 0x51F6, 0xFDD6, 0x5308, + 0xFDD7, 0x6D36, 0xFDD8, 0x80F8, 0xFDD9, 0x9ED1, 0xFDDA, 0x6615, + 0xFDDB, 0x6B23, 0xFDDC, 0x7098, 0xFDDD, 0x75D5, 0xFDDE, 0x5403, + 0xFDDF, 0x5C79, 0xFDE0, 0x7D07, 0xFDE1, 0x8A16, 0xFDE2, 0x6B20, + 0xFDE3, 0x6B3D, 0xFDE4, 0x6B46, 0xFDE5, 0x5438, 0xFDE6, 0x6070, + 0xFDE7, 0x6D3D, 0xFDE8, 0x7FD5, 0xFDE9, 0x8208, 0xFDEA, 0x50D6, + 0xFDEB, 0x51DE, 0xFDEC, 0x559C, 0xFDED, 0x566B, 0xFDEE, 0x56CD, + 0xFDEF, 0x59EC, 0xFDF0, 0x5B09, 0xFDF1, 0x5E0C, 0xFDF2, 0x6199, + 0xFDF3, 0x6198, 0xFDF4, 0x6231, 0xFDF5, 0x665E, 0xFDF6, 0x66E6, + 0xFDF7, 0x7199, 0xFDF8, 0x71B9, 0xFDF9, 0x71BA, 0xFDFA, 0x72A7, + 0xFDFB, 0x79A7, 0xFDFC, 0x7A00, 0xFDFD, 0x7FB2, 0xFDFE, 0x8A70, + 0, 0 +}; + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR src, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (src < 0x80) { /* ASCII */ + c = src; + } else { + if (dir) { /* OEMCP to unicode */ + p = oem2uni; + hi = sizeof(oem2uni) / 4 - 1; + } else { /* Unicode to OEMCP */ + p = uni2oem; + hi = sizeof(uni2oem) / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (src == p[i * 2]) break; + if (src > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; + } + + return c; +} +#else +#error This file is not needed in current configuration. + +#endif diff --git a/2.5/bertos/fs/fatfs/option/cc950.c b/2.5/bertos/fs/fatfs/option/cc950.c new file mode 100644 index 00000000..8e616774 --- /dev/null +++ b/2.5/bertos/fs/fatfs/option/cc950.c @@ -0,0 +1,6814 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ +/* */ +/* CP950 (Traditional Chinese Big5) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + + +#if _USE_LFN && _CODE_PAGE == 950 + + +static +const WCHAR uni2oem[] = { +/* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ + 0x00A7, 0xA1B1, 0x00AF, 0xA1C2, 0x00B0, 0xA258, 0x00B1, 0xA1D3, + 0x00B7, 0xA150, 0x00D7, 0xA1D1, 0x00F7, 0xA1D2, 0x02C7, 0xA3BE, + 0x02C9, 0xA3BC, 0x02CA, 0xA3BD, 0x02CB, 0xA3BF, 0x02CD, 0xA1C5, + 0x02D9, 0xA3BB, 0x0391, 0xA344, 0x0392, 0xA345, 0x0393, 0xA346, + 0x0394, 0xA347, 0x0395, 0xA348, 0x0396, 0xA349, 0x0397, 0xA34A, + 0x0398, 0xA34B, 0x0399, 0xA34C, 0x039A, 0xA34D, 0x039B, 0xA34E, + 0x039C, 0xA34F, 0x039D, 0xA350, 0x039E, 0xA351, 0x039F, 0xA352, + 0x03A0, 0xA353, 0x03A1, 0xA354, 0x03A3, 0xA355, 0x03A4, 0xA356, + 0x03A5, 0xA357, 0x03A6, 0xA358, 0x03A7, 0xA359, 0x03A8, 0xA35A, + 0x03A9, 0xA35B, 0x03B1, 0xA35C, 0x03B2, 0xA35D, 0x03B3, 0xA35E, + 0x03B4, 0xA35F, 0x03B5, 0xA360, 0x03B6, 0xA361, 0x03B7, 0xA362, + 0x03B8, 0xA363, 0x03B9, 0xA364, 0x03BA, 0xA365, 0x03BB, 0xA366, + 0x03BC, 0xA367, 0x03BD, 0xA368, 0x03BE, 0xA369, 0x03BF, 0xA36A, + 0x03C0, 0xA36B, 0x03C1, 0xA36C, 0x03C3, 0xA36D, 0x03C4, 0xA36E, + 0x03C5, 0xA36F, 0x03C6, 0xA370, 0x03C7, 0xA371, 0x03C8, 0xA372, + 0x03C9, 0xA373, 0x2013, 0xA156, 0x2014, 0xA158, 0x2018, 0xA1A5, + 0x2019, 0xA1A6, 0x201C, 0xA1A7, 0x201D, 0xA1A8, 0x2025, 0xA14C, + 0x2026, 0xA14B, 0x2027, 0xA145, 0x2032, 0xA1AC, 0x2035, 0xA1AB, + 0x203B, 0xA1B0, 0x20AC, 0xA3E1, 0x2103, 0xA24A, 0x2105, 0xA1C1, + 0x2109, 0xA24B, 0x2160, 0xA2B9, 0x2161, 0xA2BA, 0x2162, 0xA2BB, + 0x2163, 0xA2BC, 0x2164, 0xA2BD, 0x2165, 0xA2BE, 0x2166, 0xA2BF, + 0x2167, 0xA2C0, 0x2168, 0xA2C1, 0x2169, 0xA2C2, 0x2190, 0xA1F6, + 0x2191, 0xA1F4, 0x2192, 0xA1F7, 0x2193, 0xA1F5, 0x2196, 0xA1F8, + 0x2197, 0xA1F9, 0x2198, 0xA1FB, 0x2199, 0xA1FA, 0x2215, 0xA241, + 0x221A, 0xA1D4, 0x221E, 0xA1DB, 0x221F, 0xA1E8, 0x2220, 0xA1E7, + 0x2223, 0xA1FD, 0x2225, 0xA1FC, 0x2229, 0xA1E4, 0x222A, 0xA1E5, + 0x222B, 0xA1EC, 0x222E, 0xA1ED, 0x2234, 0xA1EF, 0x2235, 0xA1EE, + 0x2252, 0xA1DC, 0x2260, 0xA1DA, 0x2261, 0xA1DD, 0x2266, 0xA1D8, + 0x2267, 0xA1D9, 0x2295, 0xA1F2, 0x2299, 0xA1F3, 0x22A5, 0xA1E6, + 0x22BF, 0xA1E9, 0x2500, 0xA277, 0x2502, 0xA278, 0x250C, 0xA27A, + 0x2510, 0xA27B, 0x2514, 0xA27C, 0x2518, 0xA27D, 0x251C, 0xA275, + 0x2524, 0xA274, 0x252C, 0xA273, 0x2534, 0xA272, 0x253C, 0xA271, + 0x2550, 0xA2A4, 0x2550, 0xF9F9, 0x2551, 0xF9F8, 0x2552, 0xF9E6, + 0x2553, 0xF9EF, 0x2554, 0xF9DD, 0x2555, 0xF9E8, 0x2556, 0xF9F1, + 0x2557, 0xF9DF, 0x2558, 0xF9EC, 0x2559, 0xF9F5, 0x255A, 0xF9E3, + 0x255B, 0xF9EE, 0x255C, 0xF9F7, 0x255D, 0xF9E5, 0x255E, 0xA2A5, + 0x255E, 0xF9E9, 0x255F, 0xF9F2, 0x2560, 0xF9E0, 0x2561, 0xA2A7, + 0x2561, 0xF9EB, 0x2562, 0xF9F4, 0x2563, 0xF9E2, 0x2564, 0xF9E7, + 0x2565, 0xF9F0, 0x2566, 0xF9DE, 0x2567, 0xF9ED, 0x2568, 0xF9F6, + 0x2569, 0xF9E4, 0x256A, 0xA2A6, 0x256A, 0xF9EA, 0x256B, 0xF9F3, + 0x256C, 0xF9E1, 0x256D, 0xA27E, 0x256D, 0xF9FA, 0x256E, 0xA2A1, + 0x256E, 0xF9FB, 0x256F, 0xA2A3, 0x256F, 0xF9FD, 0x2570, 0xA2A2, + 0x2570, 0xF9FC, 0x2571, 0xA2AC, 0x2572, 0xA2AD, 0x2573, 0xA2AE, + 0x2574, 0xA15A, 0x2581, 0xA262, 0x2582, 0xA263, 0x2583, 0xA264, + 0x2584, 0xA265, 0x2585, 0xA266, 0x2586, 0xA267, 0x2587, 0xA268, + 0x2588, 0xA269, 0x2589, 0xA270, 0x258A, 0xA26F, 0x258B, 0xA26E, + 0x258C, 0xA26D, 0x258D, 0xA26C, 0x258E, 0xA26B, 0x258F, 0xA26A, + 0x2593, 0xF9FE, 0x2594, 0xA276, 0x2595, 0xA279, 0x25A0, 0xA1BD, + 0x25A1, 0xA1BC, 0x25B2, 0xA1B6, 0x25B3, 0xA1B5, 0x25BC, 0xA1BF, + 0x25BD, 0xA1BE, 0x25C6, 0xA1BB, 0x25C7, 0xA1BA, 0x25CB, 0xA1B3, + 0x25CE, 0xA1B7, 0x25CF, 0xA1B4, 0x25E2, 0xA2A8, 0x25E3, 0xA2A9, + 0x25E4, 0xA2AB, 0x25E5, 0xA2AA, 0x2605, 0xA1B9, 0x2606, 0xA1B8, + 0x2640, 0xA1F0, 0x2642, 0xA1F1, 0x3000, 0xA140, 0x3001, 0xA142, + 0x3002, 0xA143, 0x3003, 0xA1B2, 0x3008, 0xA171, 0x3009, 0xA172, + 0x300A, 0xA16D, 0x300B, 0xA16E, 0x300C, 0xA175, 0x300D, 0xA176, + 0x300E, 0xA179, 0x300F, 0xA17A, 0x3010, 0xA169, 0x3011, 0xA16A, + 0x3012, 0xA245, 0x3014, 0xA165, 0x3015, 0xA166, 0x301D, 0xA1A9, + 0x301E, 0xA1AA, 0x3021, 0xA2C3, 0x3022, 0xA2C4, 0x3023, 0xA2C5, + 0x3024, 0xA2C6, 0x3025, 0xA2C7, 0x3026, 0xA2C8, 0x3027, 0xA2C9, + 0x3028, 0xA2CA, 0x3029, 0xA2CB, 0x3105, 0xA374, 0x3106, 0xA375, + 0x3107, 0xA376, 0x3108, 0xA377, 0x3109, 0xA378, 0x310A, 0xA379, + 0x310B, 0xA37A, 0x310C, 0xA37B, 0x310D, 0xA37C, 0x310E, 0xA37D, + 0x310F, 0xA37E, 0x3110, 0xA3A1, 0x3111, 0xA3A2, 0x3112, 0xA3A3, + 0x3113, 0xA3A4, 0x3114, 0xA3A5, 0x3115, 0xA3A6, 0x3116, 0xA3A7, + 0x3117, 0xA3A8, 0x3118, 0xA3A9, 0x3119, 0xA3AA, 0x311A, 0xA3AB, + 0x311B, 0xA3AC, 0x311C, 0xA3AD, 0x311D, 0xA3AE, 0x311E, 0xA3AF, + 0x311F, 0xA3B0, 0x3120, 0xA3B1, 0x3121, 0xA3B2, 0x3122, 0xA3B3, + 0x3123, 0xA3B4, 0x3124, 0xA3B5, 0x3125, 0xA3B6, 0x3126, 0xA3B7, + 0x3127, 0xA3B8, 0x3128, 0xA3B9, 0x3129, 0xA3BA, 0x32A3, 0xA1C0, + 0x338E, 0xA255, 0x338F, 0xA256, 0x339C, 0xA250, 0x339D, 0xA251, + 0x339E, 0xA252, 0x33A1, 0xA254, 0x33C4, 0xA257, 0x33CE, 0xA253, + 0x33D1, 0xA1EB, 0x33D2, 0xA1EA, 0x33D5, 0xA24F, 0x4E00, 0xA440, + 0x4E01, 0xA442, 0x4E03, 0xA443, 0x4E07, 0xC945, 0x4E08, 0xA456, + 0x4E09, 0xA454, 0x4E0A, 0xA457, 0x4E0B, 0xA455, 0x4E0C, 0xC946, + 0x4E0D, 0xA4A3, 0x4E0E, 0xC94F, 0x4E0F, 0xC94D, 0x4E10, 0xA4A2, + 0x4E11, 0xA4A1, 0x4E14, 0xA542, 0x4E15, 0xA541, 0x4E16, 0xA540, + 0x4E18, 0xA543, 0x4E19, 0xA4FE, 0x4E1E, 0xA5E0, 0x4E1F, 0xA5E1, + 0x4E26, 0xA8C3, 0x4E2B, 0xA458, 0x4E2D, 0xA4A4, 0x4E2E, 0xC950, + 0x4E30, 0xA4A5, 0x4E31, 0xC963, 0x4E32, 0xA6EA, 0x4E33, 0xCBB1, + 0x4E38, 0xA459, 0x4E39, 0xA4A6, 0x4E3B, 0xA544, 0x4E3C, 0xC964, + 0x4E42, 0xC940, 0x4E43, 0xA444, 0x4E45, 0xA45B, 0x4E47, 0xC947, + 0x4E48, 0xA45C, 0x4E4B, 0xA4A7, 0x4E4D, 0xA545, 0x4E4E, 0xA547, + 0x4E4F, 0xA546, 0x4E52, 0xA5E2, 0x4E53, 0xA5E3, 0x4E56, 0xA8C4, + 0x4E58, 0xADBC, 0x4E59, 0xA441, 0x4E5C, 0xC941, 0x4E5D, 0xA445, + 0x4E5E, 0xA45E, 0x4E5F, 0xA45D, 0x4E69, 0xA5E4, 0x4E73, 0xA8C5, + 0x4E7E, 0xB0AE, 0x4E7F, 0xD44B, 0x4E82, 0xB6C3, 0x4E83, 0xDCB1, + 0x4E84, 0xDCB2, 0x4E86, 0xA446, 0x4E88, 0xA4A9, 0x4E8B, 0xA8C6, + 0x4E8C, 0xA447, 0x4E8D, 0xC948, 0x4E8E, 0xA45F, 0x4E91, 0xA4AA, + 0x4E92, 0xA4AC, 0x4E93, 0xC951, 0x4E94, 0xA4AD, 0x4E95, 0xA4AB, + 0x4E99, 0xA5E5, 0x4E9B, 0xA8C7, 0x4E9E, 0xA8C8, 0x4E9F, 0xAB45, + 0x4EA1, 0xA460, 0x4EA2, 0xA4AE, 0x4EA4, 0xA5E6, 0x4EA5, 0xA5E8, + 0x4EA6, 0xA5E7, 0x4EA8, 0xA6EB, 0x4EAB, 0xA8C9, 0x4EAC, 0xA8CA, + 0x4EAD, 0xAB46, 0x4EAE, 0xAB47, 0x4EB3, 0xADBD, 0x4EB6, 0xDCB3, + 0x4EB9, 0xF6D6, 0x4EBA, 0xA448, 0x4EC0, 0xA4B0, 0x4EC1, 0xA4AF, + 0x4EC2, 0xC952, 0x4EC3, 0xA4B1, 0x4EC4, 0xA4B7, 0x4EC6, 0xA4B2, + 0x4EC7, 0xA4B3, 0x4EC8, 0xC954, 0x4EC9, 0xC953, 0x4ECA, 0xA4B5, + 0x4ECB, 0xA4B6, 0x4ECD, 0xA4B4, 0x4ED4, 0xA54A, 0x4ED5, 0xA54B, + 0x4ED6, 0xA54C, 0x4ED7, 0xA54D, 0x4ED8, 0xA549, 0x4ED9, 0xA550, + 0x4EDA, 0xC96A, 0x4EDC, 0xC966, 0x4EDD, 0xC969, 0x4EDE, 0xA551, + 0x4EDF, 0xA561, 0x4EE1, 0xC968, 0x4EE3, 0xA54E, 0x4EE4, 0xA54F, + 0x4EE5, 0xA548, 0x4EE8, 0xC965, 0x4EE9, 0xC967, 0x4EF0, 0xA5F5, + 0x4EF1, 0xC9B0, 0x4EF2, 0xA5F2, 0x4EF3, 0xA5F6, 0x4EF4, 0xC9BA, + 0x4EF5, 0xC9AE, 0x4EF6, 0xA5F3, 0x4EF7, 0xC9B2, 0x4EFB, 0xA5F4, + 0x4EFD, 0xA5F7, 0x4EFF, 0xA5E9, 0x4F00, 0xC9B1, 0x4F01, 0xA5F8, + 0x4F02, 0xC9B5, 0x4F04, 0xC9B9, 0x4F05, 0xC9B6, 0x4F08, 0xC9B3, + 0x4F09, 0xA5EA, 0x4F0A, 0xA5EC, 0x4F0B, 0xA5F9, 0x4F0D, 0xA5EE, + 0x4F0E, 0xC9AB, 0x4F0F, 0xA5F1, 0x4F10, 0xA5EF, 0x4F11, 0xA5F0, + 0x4F12, 0xC9BB, 0x4F13, 0xC9B8, 0x4F14, 0xC9AF, 0x4F15, 0xA5ED, + 0x4F18, 0xC9AC, 0x4F19, 0xA5EB, 0x4F1D, 0xC9B4, 0x4F22, 0xC9B7, + 0x4F2C, 0xC9AD, 0x4F2D, 0xCA66, 0x4F2F, 0xA742, 0x4F30, 0xA6F4, + 0x4F33, 0xCA67, 0x4F34, 0xA6F1, 0x4F36, 0xA744, 0x4F38, 0xA6F9, + 0x4F3A, 0xA6F8, 0x4F3B, 0xCA5B, 0x4F3C, 0xA6FC, 0x4F3D, 0xA6F7, + 0x4F3E, 0xCA60, 0x4F3F, 0xCA68, 0x4F41, 0xCA64, 0x4F43, 0xA6FA, + 0x4F46, 0xA6FD, 0x4F47, 0xA6EE, 0x4F48, 0xA747, 0x4F49, 0xCA5D, + 0x4F4C, 0xCBBD, 0x4F4D, 0xA6EC, 0x4F4E, 0xA743, 0x4F4F, 0xA6ED, + 0x4F50, 0xA6F5, 0x4F51, 0xA6F6, 0x4F52, 0xCA62, 0x4F53, 0xCA5E, + 0x4F54, 0xA6FB, 0x4F55, 0xA6F3, 0x4F56, 0xCA5A, 0x4F57, 0xA6EF, + 0x4F58, 0xCA65, 0x4F59, 0xA745, 0x4F5A, 0xA748, 0x4F5B, 0xA6F2, + 0x4F5C, 0xA740, 0x4F5D, 0xA746, 0x4F5E, 0xA6F0, 0x4F5F, 0xCA63, + 0x4F60, 0xA741, 0x4F61, 0xCA69, 0x4F62, 0xCA5C, 0x4F63, 0xA6FE, + 0x4F64, 0xCA5F, 0x4F67, 0xCA61, 0x4F69, 0xA8D8, 0x4F6A, 0xCBBF, + 0x4F6B, 0xCBCB, 0x4F6C, 0xA8D0, 0x4F6E, 0xCBCC, 0x4F6F, 0xA8CB, + 0x4F70, 0xA8D5, 0x4F73, 0xA8CE, 0x4F74, 0xCBB9, 0x4F75, 0xA8D6, + 0x4F76, 0xCBB8, 0x4F77, 0xCBBC, 0x4F78, 0xCBC3, 0x4F79, 0xCBC1, + 0x4F7A, 0xA8DE, 0x4F7B, 0xA8D9, 0x4F7C, 0xCBB3, 0x4F7D, 0xCBB5, + 0x4F7E, 0xA8DB, 0x4F7F, 0xA8CF, 0x4F80, 0xCBB6, 0x4F81, 0xCBC2, + 0x4F82, 0xCBC9, 0x4F83, 0xA8D4, 0x4F84, 0xCBBB, 0x4F85, 0xCBB4, + 0x4F86, 0xA8D3, 0x4F87, 0xCBB7, 0x4F88, 0xA8D7, 0x4F89, 0xCBBA, + 0x4F8B, 0xA8D2, 0x4F8D, 0xA8CD, 0x4F8F, 0xA8DC, 0x4F90, 0xCBC4, + 0x4F91, 0xA8DD, 0x4F92, 0xCBC8, 0x4F94, 0xCBC6, 0x4F95, 0xCBCA, + 0x4F96, 0xA8DA, 0x4F97, 0xCBBE, 0x4F98, 0xCBB2, 0x4F9A, 0xCBC0, + 0x4F9B, 0xA8D1, 0x4F9C, 0xCBC5, 0x4F9D, 0xA8CC, 0x4F9E, 0xCBC7, + 0x4FAE, 0xAB56, 0x4FAF, 0xAB4A, 0x4FB2, 0xCDE0, 0x4FB3, 0xCDE8, + 0x4FB5, 0xAB49, 0x4FB6, 0xAB51, 0x4FB7, 0xAB5D, 0x4FB9, 0xCDEE, + 0x4FBA, 0xCDEC, 0x4FBB, 0xCDE7, 0x4FBF, 0xAB4B, 0x4FC0, 0xCDED, + 0x4FC1, 0xCDE3, 0x4FC2, 0xAB59, 0x4FC3, 0xAB50, 0x4FC4, 0xAB58, + 0x4FC5, 0xCDDE, 0x4FC7, 0xCDEA, 0x4FC9, 0xCDE1, 0x4FCA, 0xAB54, + 0x4FCB, 0xCDE2, 0x4FCD, 0xCDDD, 0x4FCE, 0xAB5B, 0x4FCF, 0xAB4E, + 0x4FD0, 0xAB57, 0x4FD1, 0xAB4D, 0x4FD3, 0xCDDF, 0x4FD4, 0xCDE4, + 0x4FD6, 0xCDEB, 0x4FD7, 0xAB55, 0x4FD8, 0xAB52, 0x4FD9, 0xCDE6, + 0x4FDA, 0xAB5A, 0x4FDB, 0xCDE9, 0x4FDC, 0xCDE5, 0x4FDD, 0xAB4F, + 0x4FDE, 0xAB5C, 0x4FDF, 0xAB53, 0x4FE0, 0xAB4C, 0x4FE1, 0xAB48, + 0x4FEC, 0xCDEF, 0x4FEE, 0xADD7, 0x4FEF, 0xADC1, 0x4FF1, 0xADD1, + 0x4FF3, 0xADD6, 0x4FF4, 0xD0D0, 0x4FF5, 0xD0CF, 0x4FF6, 0xD0D4, + 0x4FF7, 0xD0D5, 0x4FF8, 0xADC4, 0x4FFA, 0xADCD, 0x4FFE, 0xADDA, + 0x5000, 0xADCE, 0x5005, 0xD0C9, 0x5006, 0xADC7, 0x5007, 0xD0CA, + 0x5009, 0xADDC, 0x500B, 0xADD3, 0x500C, 0xADBE, 0x500D, 0xADBF, + 0x500E, 0xD0DD, 0x500F, 0xB0BF, 0x5011, 0xADCC, 0x5012, 0xADCB, + 0x5013, 0xD0CB, 0x5014, 0xADCF, 0x5015, 0xD45B, 0x5016, 0xADC6, + 0x5017, 0xD0D6, 0x5018, 0xADD5, 0x5019, 0xADD4, 0x501A, 0xADCA, + 0x501B, 0xD0CE, 0x501C, 0xD0D7, 0x501E, 0xD0C8, 0x501F, 0xADC9, + 0x5020, 0xD0D8, 0x5021, 0xADD2, 0x5022, 0xD0CC, 0x5023, 0xADC0, + 0x5025, 0xADC3, 0x5026, 0xADC2, 0x5027, 0xD0D9, 0x5028, 0xADD0, + 0x5029, 0xADC5, 0x502A, 0xADD9, 0x502B, 0xADDB, 0x502C, 0xD0D3, + 0x502D, 0xADD8, 0x502F, 0xD0DB, 0x5030, 0xD0CD, 0x5031, 0xD0DC, + 0x5033, 0xD0D1, 0x5035, 0xD0DA, 0x5037, 0xD0D2, 0x503C, 0xADC8, + 0x5040, 0xD463, 0x5041, 0xD457, 0x5043, 0xB0B3, 0x5045, 0xD45C, + 0x5046, 0xD462, 0x5047, 0xB0B2, 0x5048, 0xD455, 0x5049, 0xB0B6, + 0x504A, 0xD459, 0x504B, 0xD452, 0x504C, 0xB0B4, 0x504D, 0xD456, + 0x504E, 0xB0B9, 0x504F, 0xB0BE, 0x5051, 0xD467, 0x5053, 0xD451, + 0x5055, 0xB0BA, 0x5057, 0xD466, 0x505A, 0xB0B5, 0x505B, 0xD458, + 0x505C, 0xB0B1, 0x505D, 0xD453, 0x505E, 0xD44F, 0x505F, 0xD45D, + 0x5060, 0xD450, 0x5061, 0xD44E, 0x5062, 0xD45A, 0x5063, 0xD460, + 0x5064, 0xD461, 0x5065, 0xB0B7, 0x5068, 0xD85B, 0x5069, 0xD45E, + 0x506A, 0xD44D, 0x506B, 0xD45F, 0x506D, 0xB0C1, 0x506E, 0xD464, + 0x506F, 0xB0C0, 0x5070, 0xD44C, 0x5072, 0xD454, 0x5073, 0xD465, + 0x5074, 0xB0BC, 0x5075, 0xB0BB, 0x5076, 0xB0B8, 0x5077, 0xB0BD, + 0x507A, 0xB0AF, 0x507D, 0xB0B0, 0x5080, 0xB3C8, 0x5082, 0xD85E, + 0x5083, 0xD857, 0x5085, 0xB3C5, 0x5087, 0xD85F, 0x508B, 0xD855, + 0x508C, 0xD858, 0x508D, 0xB3C4, 0x508E, 0xD859, 0x5091, 0xB3C7, + 0x5092, 0xD85D, 0x5094, 0xD853, 0x5095, 0xD852, 0x5096, 0xB3C9, + 0x5098, 0xB3CA, 0x5099, 0xB3C6, 0x509A, 0xB3CB, 0x509B, 0xD851, + 0x509C, 0xD85C, 0x509D, 0xD85A, 0x509E, 0xD854, 0x50A2, 0xB3C3, + 0x50A3, 0xD856, 0x50AC, 0xB6CA, 0x50AD, 0xB6C4, 0x50AE, 0xDCB7, + 0x50AF, 0xB6CD, 0x50B0, 0xDCBD, 0x50B1, 0xDCC0, 0x50B2, 0xB6C6, + 0x50B3, 0xB6C7, 0x50B4, 0xDCBA, 0x50B5, 0xB6C5, 0x50B6, 0xDCC3, + 0x50B7, 0xB6CB, 0x50B8, 0xDCC4, 0x50BA, 0xDCBF, 0x50BB, 0xB6CC, + 0x50BD, 0xDCB4, 0x50BE, 0xB6C9, 0x50BF, 0xDCB5, 0x50C1, 0xDCBE, + 0x50C2, 0xDCBC, 0x50C4, 0xDCB8, 0x50C5, 0xB6C8, 0x50C6, 0xDCB6, + 0x50C7, 0xB6CE, 0x50C8, 0xDCBB, 0x50C9, 0xDCC2, 0x50CA, 0xDCB9, + 0x50CB, 0xDCC1, 0x50CE, 0xB9B6, 0x50CF, 0xB9B3, 0x50D1, 0xB9B4, + 0x50D3, 0xE0F9, 0x50D4, 0xE0F1, 0x50D5, 0xB9B2, 0x50D6, 0xB9AF, + 0x50D7, 0xE0F2, 0x50DA, 0xB9B1, 0x50DB, 0xE0F5, 0x50DD, 0xE0F7, + 0x50E0, 0xE0FE, 0x50E3, 0xE0FD, 0x50E4, 0xE0F8, 0x50E5, 0xB9AE, + 0x50E6, 0xE0F0, 0x50E7, 0xB9AC, 0x50E8, 0xE0F3, 0x50E9, 0xB9B7, + 0x50EA, 0xE0F6, 0x50EC, 0xE0FA, 0x50ED, 0xB9B0, 0x50EE, 0xB9AD, + 0x50EF, 0xE0FC, 0x50F0, 0xE0FB, 0x50F1, 0xB9B5, 0x50F3, 0xE0F4, + 0x50F5, 0xBBF8, 0x50F6, 0xE4EC, 0x50F8, 0xE4E9, 0x50F9, 0xBBF9, + 0x50FB, 0xBBF7, 0x50FD, 0xE4F0, 0x50FE, 0xE4ED, 0x50FF, 0xE4E6, + 0x5100, 0xBBF6, 0x5102, 0xBBFA, 0x5103, 0xE4E7, 0x5104, 0xBBF5, + 0x5105, 0xBBFD, 0x5106, 0xE4EA, 0x5107, 0xE4EB, 0x5108, 0xBBFB, + 0x5109, 0xBBFC, 0x510A, 0xE4F1, 0x510B, 0xE4EE, 0x510C, 0xE4EF, + 0x5110, 0xBEAA, 0x5111, 0xE8F8, 0x5112, 0xBEA7, 0x5113, 0xE8F5, + 0x5114, 0xBEA9, 0x5115, 0xBEAB, 0x5117, 0xE8F6, 0x5118, 0xBEA8, + 0x511A, 0xE8F7, 0x511C, 0xE8F4, 0x511F, 0xC076, 0x5120, 0xECBD, + 0x5121, 0xC077, 0x5122, 0xECBB, 0x5124, 0xECBC, 0x5125, 0xECBA, + 0x5126, 0xECB9, 0x5129, 0xECBE, 0x512A, 0xC075, 0x512D, 0xEFB8, + 0x512E, 0xEFB9, 0x5130, 0xE4E8, 0x5131, 0xEFB7, 0x5132, 0xC078, + 0x5133, 0xC35F, 0x5134, 0xF1EB, 0x5135, 0xF1EC, 0x5137, 0xC4D7, + 0x5138, 0xC4D8, 0x5139, 0xF5C1, 0x513A, 0xF5C0, 0x513B, 0xC56C, + 0x513C, 0xC56B, 0x513D, 0xF7D0, 0x513F, 0xA449, 0x5140, 0xA461, + 0x5141, 0xA4B9, 0x5143, 0xA4B8, 0x5144, 0xA553, 0x5145, 0xA552, + 0x5146, 0xA5FC, 0x5147, 0xA5FB, 0x5148, 0xA5FD, 0x5149, 0xA5FA, + 0x514B, 0xA74A, 0x514C, 0xA749, 0x514D, 0xA74B, 0x5152, 0xA8E0, + 0x5154, 0xA8DF, 0x5155, 0xA8E1, 0x5157, 0xAB5E, 0x5159, 0xA259, + 0x515A, 0xD0DE, 0x515B, 0xA25A, 0x515C, 0xB0C2, 0x515D, 0xA25C, + 0x515E, 0xA25B, 0x515F, 0xD860, 0x5161, 0xA25D, 0x5162, 0xB9B8, + 0x5163, 0xA25E, 0x5165, 0xA44A, 0x5167, 0xA4BA, 0x5168, 0xA5FE, + 0x5169, 0xA8E2, 0x516B, 0xA44B, 0x516C, 0xA4BD, 0x516D, 0xA4BB, + 0x516E, 0xA4BC, 0x5171, 0xA640, 0x5175, 0xA74C, 0x5176, 0xA8E4, + 0x5177, 0xA8E3, 0x5178, 0xA8E5, 0x517C, 0xADDD, 0x5180, 0xBEAC, + 0x5187, 0xC94E, 0x5189, 0xA554, 0x518A, 0xA555, 0x518D, 0xA641, + 0x518F, 0xCA6A, 0x5191, 0xAB60, 0x5192, 0xAB5F, 0x5193, 0xD0E0, + 0x5194, 0xD0DF, 0x5195, 0xB0C3, 0x5197, 0xA4BE, 0x5198, 0xC955, + 0x519E, 0xCBCD, 0x51A0, 0xAB61, 0x51A2, 0xADE0, 0x51A4, 0xADDE, + 0x51A5, 0xADDF, 0x51AA, 0xBEAD, 0x51AC, 0xA556, 0x51B0, 0xA642, + 0x51B1, 0xC9BC, 0x51B6, 0xA74D, 0x51B7, 0xA74E, 0x51B9, 0xCA6B, + 0x51BC, 0xCBCE, 0x51BD, 0xA8E6, 0x51BE, 0xCBCF, 0x51C4, 0xD0E2, + 0x51C5, 0xD0E3, 0x51C6, 0xADE3, 0x51C8, 0xD0E4, 0x51CA, 0xD0E1, + 0x51CB, 0xADE4, 0x51CC, 0xADE2, 0x51CD, 0xADE1, 0x51CE, 0xD0E5, + 0x51D0, 0xD468, 0x51D4, 0xD861, 0x51D7, 0xDCC5, 0x51D8, 0xE140, + 0x51DC, 0xBBFE, 0x51DD, 0xBEAE, 0x51DE, 0xE8F9, 0x51E0, 0xA44C, + 0x51E1, 0xA45A, 0x51F0, 0xB0C4, 0x51F1, 0xB3CD, 0x51F3, 0xB9B9, + 0x51F5, 0xC942, 0x51F6, 0xA4BF, 0x51F8, 0xA559, 0x51F9, 0xA557, + 0x51FA, 0xA558, 0x51FD, 0xA8E7, 0x5200, 0xA44D, 0x5201, 0xA44E, + 0x5203, 0xA462, 0x5206, 0xA4C0, 0x5207, 0xA4C1, 0x5208, 0xA4C2, + 0x5209, 0xC9BE, 0x520A, 0xA55A, 0x520C, 0xC96B, 0x520E, 0xA646, + 0x5210, 0xC9BF, 0x5211, 0xA644, 0x5212, 0xA645, 0x5213, 0xC9BD, + 0x5216, 0xA647, 0x5217, 0xA643, 0x521C, 0xCA6C, 0x521D, 0xAAEC, + 0x521E, 0xCA6D, 0x5221, 0xCA6E, 0x5224, 0xA750, 0x5225, 0xA74F, + 0x5228, 0xA753, 0x5229, 0xA751, 0x522A, 0xA752, 0x522E, 0xA8ED, + 0x5230, 0xA8EC, 0x5231, 0xCBD4, 0x5232, 0xCBD1, 0x5233, 0xCBD2, + 0x5235, 0xCBD0, 0x5236, 0xA8EE, 0x5237, 0xA8EA, 0x5238, 0xA8E9, + 0x523A, 0xA8EB, 0x523B, 0xA8E8, 0x5241, 0xA8EF, 0x5243, 0xAB63, + 0x5244, 0xCDF0, 0x5246, 0xCBD3, 0x5247, 0xAB68, 0x5249, 0xCDF1, + 0x524A, 0xAB64, 0x524B, 0xAB67, 0x524C, 0xAB66, 0x524D, 0xAB65, + 0x524E, 0xAB62, 0x5252, 0xD0E8, 0x5254, 0xADE7, 0x5255, 0xD0EB, + 0x5256, 0xADE5, 0x525A, 0xD0E7, 0x525B, 0xADE8, 0x525C, 0xADE6, + 0x525D, 0xADE9, 0x525E, 0xD0E9, 0x525F, 0xD0EA, 0x5261, 0xD0E6, + 0x5262, 0xD0EC, 0x5269, 0xB3D1, 0x526A, 0xB0C5, 0x526B, 0xD469, + 0x526C, 0xD46B, 0x526D, 0xD46A, 0x526E, 0xD46C, 0x526F, 0xB0C6, + 0x5272, 0xB3CE, 0x5274, 0xB3CF, 0x5275, 0xB3D0, 0x5277, 0xB6D0, + 0x5278, 0xDCC7, 0x527A, 0xDCC6, 0x527B, 0xDCC8, 0x527C, 0xDCC9, + 0x527D, 0xB6D1, 0x527F, 0xB6CF, 0x5280, 0xE141, 0x5281, 0xE142, + 0x5282, 0xB9BB, 0x5283, 0xB9BA, 0x5284, 0xE35A, 0x5287, 0xBC40, + 0x5288, 0xBC41, 0x5289, 0xBC42, 0x528A, 0xBC44, 0x528B, 0xE4F2, + 0x528C, 0xE4F3, 0x528D, 0xBC43, 0x5291, 0xBEAF, 0x5293, 0xBEB0, + 0x5296, 0xF1ED, 0x5297, 0xF5C3, 0x5298, 0xF5C2, 0x5299, 0xF7D1, + 0x529B, 0xA44F, 0x529F, 0xA55C, 0x52A0, 0xA55B, 0x52A3, 0xA648, + 0x52A6, 0xC9C0, 0x52A9, 0xA755, 0x52AA, 0xA756, 0x52AB, 0xA754, + 0x52AC, 0xA757, 0x52AD, 0xCA6F, 0x52AE, 0xCA70, 0x52BB, 0xA8F1, + 0x52BC, 0xCBD5, 0x52BE, 0xA8F0, 0x52C0, 0xCDF2, 0x52C1, 0xAB6C, + 0x52C2, 0xCDF3, 0x52C3, 0xAB6B, 0x52C7, 0xAB69, 0x52C9, 0xAB6A, + 0x52CD, 0xD0ED, 0x52D2, 0xB0C7, 0x52D3, 0xD46E, 0x52D5, 0xB0CA, + 0x52D6, 0xD46D, 0x52D7, 0xB1E5, 0x52D8, 0xB0C9, 0x52D9, 0xB0C8, + 0x52DB, 0xB3D4, 0x52DD, 0xB3D3, 0x52DE, 0xB3D2, 0x52DF, 0xB6D2, + 0x52E2, 0xB6D5, 0x52E3, 0xB6D6, 0x52E4, 0xB6D4, 0x52E6, 0xB6D3, + 0x52E9, 0xE143, 0x52EB, 0xE144, 0x52EF, 0xE4F5, 0x52F0, 0xBC45, + 0x52F1, 0xE4F4, 0x52F3, 0xBEB1, 0x52F4, 0xECBF, 0x52F5, 0xC079, + 0x52F7, 0xF1EE, 0x52F8, 0xC455, 0x52FA, 0xA463, 0x52FB, 0xA4C3, + 0x52FC, 0xC956, 0x52FE, 0xA4C4, 0x52FF, 0xA4C5, 0x5305, 0xA55D, + 0x5306, 0xA55E, 0x5308, 0xA649, 0x5309, 0xCA71, 0x530A, 0xCBD6, + 0x530B, 0xCBD7, 0x530D, 0xAB6D, 0x530E, 0xD0EE, 0x530F, 0xB0CC, + 0x5310, 0xB0CB, 0x5311, 0xD863, 0x5312, 0xD862, 0x5315, 0xA450, + 0x5316, 0xA4C6, 0x5317, 0xA55F, 0x5319, 0xB0CD, 0x531A, 0xC943, + 0x531C, 0xC96C, 0x531D, 0xA560, 0x531F, 0xC9C2, 0x5320, 0xA64B, + 0x5321, 0xA64A, 0x5322, 0xC9C1, 0x5323, 0xA758, 0x532A, 0xADEA, + 0x532D, 0xD46F, 0x532F, 0xB6D7, 0x5330, 0xE145, 0x5331, 0xB9BC, + 0x5334, 0xE8FA, 0x5337, 0xF3FD, 0x5339, 0xA4C7, 0x533C, 0xCBD8, + 0x533D, 0xCDF4, 0x533E, 0xB0D0, 0x533F, 0xB0CE, 0x5340, 0xB0CF, + 0x5341, 0xA2CC, 0x5341, 0xA451, 0x5343, 0xA464, 0x5344, 0xA2CD, + 0x5345, 0xA2CE, 0x5345, 0xA4CA, 0x5347, 0xA4C9, 0x5348, 0xA4C8, + 0x5349, 0xA563, 0x534A, 0xA562, 0x534C, 0xC96D, 0x534D, 0xC9C3, + 0x5351, 0xA8F5, 0x5352, 0xA8F2, 0x5353, 0xA8F4, 0x5354, 0xA8F3, + 0x5357, 0xAB6E, 0x535A, 0xB3D5, 0x535C, 0xA452, 0x535E, 0xA4CB, + 0x5360, 0xA565, 0x5361, 0xA564, 0x5363, 0xCA72, 0x5366, 0xA8F6, + 0x536C, 0xC957, 0x536E, 0xA567, 0x536F, 0xA566, 0x5370, 0xA64C, + 0x5371, 0xA64D, 0x5372, 0xCA73, 0x5373, 0xA759, 0x5375, 0xA75A, + 0x5377, 0xA8F7, 0x5378, 0xA8F8, 0x5379, 0xA8F9, 0x537B, 0xAB6F, + 0x537C, 0xCDF5, 0x537F, 0xADEB, 0x5382, 0xC944, 0x5384, 0xA4CC, + 0x538A, 0xC9C4, 0x538E, 0xCA74, 0x538F, 0xCA75, 0x5392, 0xCBD9, + 0x5394, 0xCBDA, 0x5396, 0xCDF7, 0x5397, 0xCDF6, 0x5398, 0xCDF9, + 0x5399, 0xCDF8, 0x539A, 0xAB70, 0x539C, 0xD470, 0x539D, 0xADED, + 0x539E, 0xD0EF, 0x539F, 0xADEC, 0x53A4, 0xD864, 0x53A5, 0xB3D6, + 0x53A7, 0xD865, 0x53AC, 0xE146, 0x53AD, 0xB9BD, 0x53B2, 0xBC46, + 0x53B4, 0xF1EF, 0x53B9, 0xC958, 0x53BB, 0xA568, 0x53C3, 0xB0D1, + 0x53C8, 0xA453, 0x53C9, 0xA465, 0x53CA, 0xA4CE, 0x53CB, 0xA4CD, + 0x53CD, 0xA4CF, 0x53D4, 0xA8FB, 0x53D6, 0xA8FA, 0x53D7, 0xA8FC, + 0x53DB, 0xAB71, 0x53DF, 0xADEE, 0x53E1, 0xE8FB, 0x53E2, 0xC24F, + 0x53E3, 0xA466, 0x53E4, 0xA56A, 0x53E5, 0xA579, 0x53E6, 0xA574, + 0x53E8, 0xA56F, 0x53E9, 0xA56E, 0x53EA, 0xA575, 0x53EB, 0xA573, + 0x53EC, 0xA56C, 0x53ED, 0xA57A, 0x53EE, 0xA56D, 0x53EF, 0xA569, + 0x53F0, 0xA578, 0x53F1, 0xA577, 0x53F2, 0xA576, 0x53F3, 0xA56B, + 0x53F5, 0xA572, 0x53F8, 0xA571, 0x53FB, 0xA57B, 0x53FC, 0xA570, + 0x5401, 0xA653, 0x5403, 0xA659, 0x5404, 0xA655, 0x5406, 0xA65B, + 0x5407, 0xC9C5, 0x5408, 0xA658, 0x5409, 0xA64E, 0x540A, 0xA651, + 0x540B, 0xA654, 0x540C, 0xA650, 0x540D, 0xA657, 0x540E, 0xA65A, + 0x540F, 0xA64F, 0x5410, 0xA652, 0x5411, 0xA656, 0x5412, 0xA65C, + 0x5418, 0xCA7E, 0x5419, 0xCA7B, 0x541B, 0xA767, 0x541C, 0xCA7C, + 0x541D, 0xA75B, 0x541E, 0xA75D, 0x541F, 0xA775, 0x5420, 0xA770, + 0x5424, 0xCAA5, 0x5425, 0xCA7D, 0x5426, 0xA75F, 0x5427, 0xA761, + 0x5428, 0xCAA4, 0x5429, 0xA768, 0x542A, 0xCA78, 0x542B, 0xA774, + 0x542C, 0xA776, 0x542D, 0xA75C, 0x542E, 0xA76D, 0x5430, 0xCA76, + 0x5431, 0xA773, 0x5433, 0xA764, 0x5435, 0xA76E, 0x5436, 0xA76F, + 0x5437, 0xCA77, 0x5438, 0xA76C, 0x5439, 0xA76A, 0x543B, 0xA76B, + 0x543C, 0xA771, 0x543D, 0xCAA1, 0x543E, 0xA75E, 0x5440, 0xA772, + 0x5441, 0xCAA3, 0x5442, 0xA766, 0x5443, 0xA763, 0x5445, 0xCA7A, + 0x5446, 0xA762, 0x5447, 0xCAA6, 0x5448, 0xA765, 0x544A, 0xA769, + 0x544E, 0xA760, 0x544F, 0xCAA2, 0x5454, 0xCA79, 0x5460, 0xCBEB, + 0x5461, 0xCBEA, 0x5462, 0xA94F, 0x5463, 0xCBED, 0x5464, 0xCBEF, + 0x5465, 0xCBE4, 0x5466, 0xCBE7, 0x5467, 0xCBEE, 0x5468, 0xA950, + 0x546B, 0xCBE1, 0x546C, 0xCBE5, 0x546F, 0xCBE9, 0x5470, 0xCE49, + 0x5471, 0xA94B, 0x5472, 0xCE4D, 0x5473, 0xA8FD, 0x5474, 0xCBE6, + 0x5475, 0xA8FE, 0x5476, 0xA94C, 0x5477, 0xA945, 0x5478, 0xA941, + 0x547A, 0xCBE2, 0x547B, 0xA944, 0x547C, 0xA949, 0x547D, 0xA952, + 0x547E, 0xCBE3, 0x547F, 0xCBDC, 0x5480, 0xA943, 0x5481, 0xCBDD, + 0x5482, 0xCBDF, 0x5484, 0xA946, 0x5486, 0xA948, 0x5487, 0xCBDB, + 0x5488, 0xCBE0, 0x548B, 0xA951, 0x548C, 0xA94D, 0x548D, 0xCBE8, + 0x548E, 0xA953, 0x5490, 0xA94A, 0x5491, 0xCBDE, 0x5492, 0xA947, + 0x5495, 0xA942, 0x5496, 0xA940, 0x5498, 0xCBEC, 0x549A, 0xA94E, + 0x54A0, 0xCE48, 0x54A1, 0xCDFB, 0x54A2, 0xCE4B, 0x54A5, 0xCDFD, + 0x54A6, 0xAB78, 0x54A7, 0xABA8, 0x54A8, 0xAB74, 0x54A9, 0xABA7, + 0x54AA, 0xAB7D, 0x54AB, 0xABA4, 0x54AC, 0xAB72, 0x54AD, 0xCDFC, + 0x54AE, 0xCE43, 0x54AF, 0xABA3, 0x54B0, 0xCE4F, 0x54B1, 0xABA5, + 0x54B3, 0xAB79, 0x54B6, 0xCE45, 0x54B7, 0xCE42, 0x54B8, 0xAB77, + 0x54BA, 0xCDFA, 0x54BB, 0xABA6, 0x54BC, 0xCE4A, 0x54BD, 0xAB7C, + 0x54BE, 0xCE4C, 0x54BF, 0xABA9, 0x54C0, 0xAB73, 0x54C1, 0xAB7E, + 0x54C2, 0xAB7B, 0x54C3, 0xCE40, 0x54C4, 0xABA1, 0x54C5, 0xCE46, + 0x54C6, 0xCE47, 0x54C7, 0xAB7A, 0x54C8, 0xABA2, 0x54C9, 0xAB76, + 0x54CE, 0xAB75, 0x54CF, 0xCDFE, 0x54D6, 0xCE44, 0x54DE, 0xCE4E, + 0x54E0, 0xD144, 0x54E1, 0xADFB, 0x54E2, 0xD0F1, 0x54E4, 0xD0F6, + 0x54E5, 0xADF4, 0x54E6, 0xAE40, 0x54E7, 0xD0F4, 0x54E8, 0xADEF, + 0x54E9, 0xADF9, 0x54EA, 0xADFE, 0x54EB, 0xD0FB, 0x54ED, 0xADFA, + 0x54EE, 0xADFD, 0x54F1, 0xD0FE, 0x54F2, 0xADF5, 0x54F3, 0xD0F5, + 0x54F7, 0xD142, 0x54F8, 0xD143, 0x54FA, 0xADF7, 0x54FB, 0xD141, + 0x54FC, 0xADF3, 0x54FD, 0xAE43, 0x54FF, 0xD0F8, 0x5501, 0xADF1, + 0x5503, 0xD146, 0x5504, 0xD0F9, 0x5505, 0xD0FD, 0x5506, 0xADF6, + 0x5507, 0xAE42, 0x5508, 0xD0FA, 0x5509, 0xADFC, 0x550A, 0xD140, + 0x550B, 0xD147, 0x550C, 0xD4A1, 0x550E, 0xD145, 0x550F, 0xAE44, + 0x5510, 0xADF0, 0x5511, 0xD0FC, 0x5512, 0xD0F3, 0x5514, 0xADF8, + 0x5517, 0xD0F2, 0x551A, 0xD0F7, 0x5526, 0xD0F0, 0x5527, 0xAE41, + 0x552A, 0xD477, 0x552C, 0xB0E4, 0x552D, 0xD4A7, 0x552E, 0xB0E2, + 0x552F, 0xB0DF, 0x5530, 0xD47C, 0x5531, 0xB0DB, 0x5532, 0xD4A2, + 0x5533, 0xB0E6, 0x5534, 0xD476, 0x5535, 0xD47B, 0x5536, 0xD47A, + 0x5537, 0xADF2, 0x5538, 0xB0E1, 0x5539, 0xD4A5, 0x553B, 0xD4A8, + 0x553C, 0xD473, 0x553E, 0xB3E8, 0x5540, 0xD4A9, 0x5541, 0xB0E7, + 0x5543, 0xB0D9, 0x5544, 0xB0D6, 0x5545, 0xD47E, 0x5546, 0xB0D3, + 0x5548, 0xD4A6, 0x554A, 0xB0DA, 0x554B, 0xD4AA, 0x554D, 0xD474, + 0x554E, 0xD4A4, 0x554F, 0xB0DD, 0x5550, 0xD475, 0x5551, 0xD478, + 0x5552, 0xD47D, 0x5555, 0xB0DE, 0x5556, 0xB0DC, 0x5557, 0xB0E8, + 0x555C, 0xB0E3, 0x555E, 0xB0D7, 0x555F, 0xB1D2, 0x5561, 0xB0D8, + 0x5562, 0xD479, 0x5563, 0xB0E5, 0x5564, 0xB0E0, 0x5565, 0xD4A3, + 0x5566, 0xB0D5, 0x556A, 0xB0D4, 0x5575, 0xD471, 0x5576, 0xD472, + 0x5577, 0xD86A, 0x557B, 0xB3D7, 0x557C, 0xB3DA, 0x557D, 0xD875, + 0x557E, 0xB3EE, 0x557F, 0xD878, 0x5580, 0xB3D8, 0x5581, 0xD871, + 0x5582, 0xB3DE, 0x5583, 0xB3E4, 0x5584, 0xB5BD, 0x5587, 0xB3E2, + 0x5588, 0xD86E, 0x5589, 0xB3EF, 0x558A, 0xB3DB, 0x558B, 0xB3E3, + 0x558C, 0xD876, 0x558D, 0xDCD7, 0x558E, 0xD87B, 0x558F, 0xD86F, + 0x5591, 0xD866, 0x5592, 0xD873, 0x5593, 0xD86D, 0x5594, 0xB3E1, + 0x5595, 0xD879, 0x5598, 0xB3DD, 0x5599, 0xB3F1, 0x559A, 0xB3EA, + 0x559C, 0xB3DF, 0x559D, 0xB3DC, 0x559F, 0xB3E7, 0x55A1, 0xD87A, + 0x55A2, 0xD86C, 0x55A3, 0xD872, 0x55A4, 0xD874, 0x55A5, 0xD868, + 0x55A6, 0xD877, 0x55A7, 0xB3D9, 0x55A8, 0xD867, 0x55AA, 0xB3E0, + 0x55AB, 0xB3F0, 0x55AC, 0xB3EC, 0x55AD, 0xD869, 0x55AE, 0xB3E6, + 0x55B1, 0xB3ED, 0x55B2, 0xB3E9, 0x55B3, 0xB3E5, 0x55B5, 0xD870, + 0x55BB, 0xB3EB, 0x55BF, 0xDCD5, 0x55C0, 0xDCD1, 0x55C2, 0xDCE0, + 0x55C3, 0xDCCA, 0x55C4, 0xDCD3, 0x55C5, 0xB6E5, 0x55C6, 0xB6E6, + 0x55C7, 0xB6DE, 0x55C8, 0xDCDC, 0x55C9, 0xB6E8, 0x55CA, 0xDCCF, + 0x55CB, 0xDCCE, 0x55CC, 0xDCCC, 0x55CD, 0xDCDE, 0x55CE, 0xB6DC, + 0x55CF, 0xDCD8, 0x55D0, 0xDCCD, 0x55D1, 0xB6DF, 0x55D2, 0xDCD6, + 0x55D3, 0xB6DA, 0x55D4, 0xDCD2, 0x55D5, 0xDCD9, 0x55D6, 0xDCDB, + 0x55D9, 0xDCDF, 0x55DA, 0xB6E3, 0x55DB, 0xDCCB, 0x55DC, 0xB6DD, + 0x55DD, 0xDCD0, 0x55DF, 0xB6D8, 0x55E1, 0xB6E4, 0x55E2, 0xDCDA, + 0x55E3, 0xB6E0, 0x55E4, 0xB6E1, 0x55E5, 0xB6E7, 0x55E6, 0xB6DB, + 0x55E7, 0xA25F, 0x55E8, 0xB6D9, 0x55E9, 0xDCD4, 0x55EF, 0xB6E2, + 0x55F2, 0xDCDD, 0x55F6, 0xB9CD, 0x55F7, 0xB9C8, 0x55F9, 0xE155, + 0x55FA, 0xE151, 0x55FC, 0xE14B, 0x55FD, 0xB9C2, 0x55FE, 0xB9BE, + 0x55FF, 0xE154, 0x5600, 0xB9BF, 0x5601, 0xE14E, 0x5602, 0xE150, + 0x5604, 0xE153, 0x5606, 0xB9C4, 0x5608, 0xB9CB, 0x5609, 0xB9C5, + 0x560C, 0xE149, 0x560D, 0xB9C6, 0x560E, 0xB9C7, 0x560F, 0xE14C, + 0x5610, 0xB9CC, 0x5612, 0xE14A, 0x5613, 0xE14F, 0x5614, 0xB9C3, + 0x5615, 0xE148, 0x5616, 0xB9C9, 0x5617, 0xB9C1, 0x561B, 0xB9C0, + 0x561C, 0xE14D, 0x561D, 0xE152, 0x561F, 0xB9CA, 0x5627, 0xE147, + 0x5629, 0xBC4D, 0x562A, 0xE547, 0x562C, 0xE544, 0x562E, 0xBC47, + 0x562F, 0xBC53, 0x5630, 0xBC54, 0x5632, 0xBC4A, 0x5633, 0xE542, + 0x5634, 0xBC4C, 0x5635, 0xE4F9, 0x5636, 0xBC52, 0x5638, 0xE546, + 0x5639, 0xBC49, 0x563A, 0xE548, 0x563B, 0xBC48, 0x563D, 0xE543, + 0x563E, 0xE545, 0x563F, 0xBC4B, 0x5640, 0xE541, 0x5641, 0xE4FA, + 0x5642, 0xE4F7, 0x5645, 0xD86B, 0x5646, 0xE4FD, 0x5648, 0xE4F6, + 0x5649, 0xE4FC, 0x564A, 0xE4FB, 0x564C, 0xE4F8, 0x564E, 0xBC4F, + 0x5653, 0xBC4E, 0x5657, 0xBC50, 0x5658, 0xE4FE, 0x5659, 0xBEB2, + 0x565A, 0xE540, 0x565E, 0xE945, 0x5660, 0xE8FD, 0x5662, 0xBEBE, + 0x5663, 0xE942, 0x5664, 0xBEB6, 0x5665, 0xBEBA, 0x5666, 0xE941, + 0x5668, 0xBEB9, 0x5669, 0xBEB5, 0x566A, 0xBEB8, 0x566B, 0xBEB3, + 0x566C, 0xBEBD, 0x566D, 0xE943, 0x566E, 0xE8FE, 0x566F, 0xBEBC, + 0x5670, 0xE8FC, 0x5671, 0xBEBB, 0x5672, 0xE944, 0x5673, 0xE940, + 0x5674, 0xBC51, 0x5676, 0xBEBF, 0x5677, 0xE946, 0x5678, 0xBEB7, + 0x5679, 0xBEB4, 0x567E, 0xECC6, 0x567F, 0xECC8, 0x5680, 0xC07B, + 0x5681, 0xECC9, 0x5682, 0xECC7, 0x5683, 0xECC5, 0x5684, 0xECC4, + 0x5685, 0xC07D, 0x5686, 0xECC3, 0x5687, 0xC07E, 0x568C, 0xECC1, + 0x568D, 0xECC2, 0x568E, 0xC07A, 0x568F, 0xC0A1, 0x5690, 0xC07C, + 0x5693, 0xECC0, 0x5695, 0xC250, 0x5697, 0xEFBC, 0x5698, 0xEFBA, + 0x5699, 0xEFBF, 0x569A, 0xEFBD, 0x569C, 0xEFBB, 0x569D, 0xEFBE, + 0x56A5, 0xC360, 0x56A6, 0xF1F2, 0x56A7, 0xF1F3, 0x56A8, 0xC456, + 0x56AA, 0xF1F4, 0x56AB, 0xF1F0, 0x56AC, 0xF1F5, 0x56AD, 0xF1F1, + 0x56AE, 0xC251, 0x56B2, 0xF3FE, 0x56B3, 0xF441, 0x56B4, 0xC459, + 0x56B5, 0xF440, 0x56B6, 0xC458, 0x56B7, 0xC457, 0x56BC, 0xC45A, + 0x56BD, 0xF5C5, 0x56BE, 0xF5C6, 0x56C0, 0xC4DA, 0x56C1, 0xC4D9, + 0x56C2, 0xC4DB, 0x56C3, 0xF5C4, 0x56C5, 0xF6D8, 0x56C6, 0xF6D7, + 0x56C8, 0xC56D, 0x56C9, 0xC56F, 0x56CA, 0xC56E, 0x56CB, 0xF6D9, + 0x56CC, 0xC5C8, 0x56CD, 0xF8A6, 0x56D1, 0xC5F1, 0x56D3, 0xF8A5, + 0x56D4, 0xF8EE, 0x56D7, 0xC949, 0x56DA, 0xA57D, 0x56DB, 0xA57C, + 0x56DD, 0xA65F, 0x56DE, 0xA65E, 0x56DF, 0xC9C7, 0x56E0, 0xA65D, + 0x56E1, 0xC9C6, 0x56E4, 0xA779, 0x56E5, 0xCAA9, 0x56E7, 0xCAA8, + 0x56EA, 0xA777, 0x56EB, 0xA77A, 0x56EE, 0xCAA7, 0x56F0, 0xA778, + 0x56F7, 0xCBF0, 0x56F9, 0xCBF1, 0x56FA, 0xA954, 0x56FF, 0xABAA, + 0x5701, 0xD148, 0x5702, 0xD149, 0x5703, 0xAE45, 0x5704, 0xAE46, + 0x5707, 0xD4AC, 0x5708, 0xB0E9, 0x5709, 0xB0EB, 0x570A, 0xD4AB, + 0x570B, 0xB0EA, 0x570C, 0xD87C, 0x570D, 0xB3F2, 0x5712, 0xB6E9, + 0x5713, 0xB6EA, 0x5714, 0xDCE1, 0x5716, 0xB9CF, 0x5718, 0xB9CE, + 0x571A, 0xE549, 0x571B, 0xE948, 0x571C, 0xE947, 0x571E, 0xF96B, + 0x571F, 0xA467, 0x5720, 0xC959, 0x5722, 0xC96E, 0x5723, 0xC96F, + 0x5728, 0xA662, 0x5729, 0xA666, 0x572A, 0xC9C9, 0x572C, 0xA664, + 0x572D, 0xA663, 0x572E, 0xC9C8, 0x572F, 0xA665, 0x5730, 0xA661, + 0x5733, 0xA660, 0x5734, 0xC9CA, 0x573B, 0xA7A6, 0x573E, 0xA7A3, + 0x5740, 0xA77D, 0x5741, 0xCAAA, 0x5745, 0xCAAB, 0x5747, 0xA7A1, + 0x5749, 0xCAAD, 0x574A, 0xA77B, 0x574B, 0xCAAE, 0x574C, 0xCAAC, + 0x574D, 0xA77E, 0x574E, 0xA7A2, 0x574F, 0xA7A5, 0x5750, 0xA7A4, + 0x5751, 0xA77C, 0x5752, 0xCAAF, 0x5761, 0xA959, 0x5762, 0xCBFE, + 0x5764, 0xA95B, 0x5766, 0xA95A, 0x5768, 0xCC40, 0x5769, 0xA958, + 0x576A, 0xA957, 0x576B, 0xCBF5, 0x576D, 0xCBF4, 0x576F, 0xCBF2, + 0x5770, 0xCBF7, 0x5771, 0xCBF6, 0x5772, 0xCBF3, 0x5773, 0xCBFC, + 0x5774, 0xCBFD, 0x5775, 0xCBFA, 0x5776, 0xCBF8, 0x5777, 0xA956, + 0x577B, 0xCBFB, 0x577C, 0xA95C, 0x577D, 0xCC41, 0x5780, 0xCBF9, + 0x5782, 0xABAB, 0x5783, 0xA955, 0x578B, 0xABAC, 0x578C, 0xCE54, + 0x578F, 0xCE5A, 0x5793, 0xABB2, 0x5794, 0xCE58, 0x5795, 0xCE5E, + 0x5797, 0xCE55, 0x5798, 0xCE59, 0x5799, 0xCE5B, 0x579A, 0xCE5D, + 0x579B, 0xCE57, 0x579D, 0xCE56, 0x579E, 0xCE51, 0x579F, 0xCE52, + 0x57A0, 0xABAD, 0x57A2, 0xABAF, 0x57A3, 0xABAE, 0x57A4, 0xCE53, + 0x57A5, 0xCE5C, 0x57AE, 0xABB1, 0x57B5, 0xCE50, 0x57B6, 0xD153, + 0x57B8, 0xD152, 0x57B9, 0xD157, 0x57BA, 0xD14E, 0x57BC, 0xD151, + 0x57BD, 0xD150, 0x57BF, 0xD154, 0x57C1, 0xD158, 0x57C2, 0xAE47, + 0x57C3, 0xAE4A, 0x57C6, 0xD14F, 0x57C7, 0xD155, 0x57CB, 0xAE49, + 0x57CC, 0xD14A, 0x57CE, 0xABB0, 0x57CF, 0xD4BA, 0x57D0, 0xD156, + 0x57D2, 0xD14D, 0x57D4, 0xAE48, 0x57D5, 0xD14C, 0x57DC, 0xD4B1, + 0x57DF, 0xB0EC, 0x57E0, 0xB0F0, 0x57E1, 0xD4C1, 0x57E2, 0xD4AF, + 0x57E3, 0xD4BD, 0x57E4, 0xB0F1, 0x57E5, 0xD4BF, 0x57E7, 0xD4C5, + 0x57E9, 0xD4C9, 0x57EC, 0xD4C0, 0x57ED, 0xD4B4, 0x57EE, 0xD4BC, + 0x57F0, 0xD4CA, 0x57F1, 0xD4C8, 0x57F2, 0xD4BE, 0x57F3, 0xD4B9, + 0x57F4, 0xD4B2, 0x57F5, 0xD8A6, 0x57F6, 0xD4B0, 0x57F7, 0xB0F5, + 0x57F8, 0xD4B7, 0x57F9, 0xB0F6, 0x57FA, 0xB0F2, 0x57FB, 0xD4AD, + 0x57FC, 0xD4C3, 0x57FD, 0xD4B5, 0x5800, 0xD4B3, 0x5801, 0xD4C6, + 0x5802, 0xB0F3, 0x5804, 0xD4CC, 0x5805, 0xB0ED, 0x5806, 0xB0EF, + 0x5807, 0xD4BB, 0x5808, 0xD4B6, 0x5809, 0xAE4B, 0x580A, 0xB0EE, + 0x580B, 0xD4B8, 0x580C, 0xD4C7, 0x580D, 0xD4CB, 0x580E, 0xD4C2, + 0x5810, 0xD4C4, 0x5814, 0xD4AE, 0x5819, 0xD8A1, 0x581B, 0xD8AA, + 0x581C, 0xD8A9, 0x581D, 0xB3FA, 0x581E, 0xD8A2, 0x5820, 0xB3FB, + 0x5821, 0xB3F9, 0x5823, 0xD8A4, 0x5824, 0xB3F6, 0x5825, 0xD8A8, + 0x5827, 0xD8A3, 0x5828, 0xD8A5, 0x5829, 0xD87D, 0x582A, 0xB3F4, + 0x582C, 0xD8B2, 0x582D, 0xD8B1, 0x582E, 0xD8AE, 0x582F, 0xB3F3, + 0x5830, 0xB3F7, 0x5831, 0xB3F8, 0x5832, 0xD14B, 0x5833, 0xD8AB, + 0x5834, 0xB3F5, 0x5835, 0xB0F4, 0x5836, 0xD8AD, 0x5837, 0xD87E, + 0x5838, 0xD8B0, 0x5839, 0xD8AF, 0x583B, 0xD8B3, 0x583D, 0xDCEF, + 0x583F, 0xD8AC, 0x5848, 0xD8A7, 0x5849, 0xDCE7, 0x584A, 0xB6F4, + 0x584B, 0xB6F7, 0x584C, 0xB6F2, 0x584D, 0xDCE6, 0x584E, 0xDCEA, + 0x584F, 0xDCE5, 0x5851, 0xB6EC, 0x5852, 0xB6F6, 0x5853, 0xDCE2, + 0x5854, 0xB6F0, 0x5855, 0xDCE9, 0x5857, 0xB6EE, 0x5858, 0xB6ED, + 0x5859, 0xDCEC, 0x585A, 0xB6EF, 0x585B, 0xDCEE, 0x585D, 0xDCEB, + 0x585E, 0xB6EB, 0x5862, 0xB6F5, 0x5863, 0xDCF0, 0x5864, 0xDCE4, + 0x5865, 0xDCED, 0x5868, 0xDCE3, 0x586B, 0xB6F1, 0x586D, 0xB6F3, + 0x586F, 0xDCE8, 0x5871, 0xDCF1, 0x5874, 0xE15D, 0x5875, 0xB9D0, + 0x5876, 0xE163, 0x5879, 0xB9D5, 0x587A, 0xE15F, 0x587B, 0xE166, + 0x587C, 0xE157, 0x587D, 0xB9D7, 0x587E, 0xB9D1, 0x587F, 0xE15C, + 0x5880, 0xBC55, 0x5881, 0xE15B, 0x5882, 0xE164, 0x5883, 0xB9D2, + 0x5885, 0xB9D6, 0x5886, 0xE15A, 0x5887, 0xE160, 0x5888, 0xE165, + 0x5889, 0xE156, 0x588A, 0xB9D4, 0x588B, 0xE15E, 0x588E, 0xE162, + 0x588F, 0xE168, 0x5890, 0xE158, 0x5891, 0xE161, 0x5893, 0xB9D3, + 0x5894, 0xE167, 0x5898, 0xE159, 0x589C, 0xBC59, 0x589D, 0xE54B, + 0x589E, 0xBC57, 0x589F, 0xBC56, 0x58A0, 0xE54D, 0x58A1, 0xE552, + 0x58A3, 0xE54E, 0x58A5, 0xE551, 0x58A6, 0xBC5C, 0x58A8, 0xBEA5, + 0x58A9, 0xBC5B, 0x58AB, 0xE54A, 0x58AC, 0xE550, 0x58AE, 0xBC5A, + 0x58AF, 0xE54F, 0x58B1, 0xE54C, 0x58B3, 0xBC58, 0x58BA, 0xE94D, + 0x58BB, 0xF9D9, 0x58BC, 0xE94F, 0x58BD, 0xE94A, 0x58BE, 0xBEC1, + 0x58BF, 0xE94C, 0x58C1, 0xBEC0, 0x58C2, 0xE94E, 0x58C5, 0xBEC3, + 0x58C6, 0xE950, 0x58C7, 0xBEC2, 0x58C8, 0xE949, 0x58C9, 0xE94B, + 0x58CE, 0xC0A5, 0x58CF, 0xECCC, 0x58D1, 0xC0A4, 0x58D2, 0xECCD, + 0x58D3, 0xC0A3, 0x58D4, 0xECCB, 0x58D5, 0xC0A2, 0x58D6, 0xECCA, + 0x58D8, 0xC253, 0x58D9, 0xC252, 0x58DA, 0xF1F6, 0x58DB, 0xF1F8, + 0x58DD, 0xF1F7, 0x58DE, 0xC361, 0x58DF, 0xC362, 0x58E2, 0xC363, + 0x58E3, 0xF442, 0x58E4, 0xC45B, 0x58E7, 0xF7D3, 0x58E8, 0xF7D2, + 0x58E9, 0xC5F2, 0x58EB, 0xA468, 0x58EC, 0xA4D0, 0x58EF, 0xA7A7, + 0x58F4, 0xCE5F, 0x58F9, 0xB3FC, 0x58FA, 0xB3FD, 0x58FC, 0xDCF2, + 0x58FD, 0xB9D8, 0x58FE, 0xE169, 0x58FF, 0xE553, 0x5903, 0xC95A, + 0x5906, 0xCAB0, 0x590C, 0xCC42, 0x590D, 0xCE60, 0x590E, 0xD159, + 0x590F, 0xAE4C, 0x5912, 0xF1F9, 0x5914, 0xC4DC, 0x5915, 0xA469, + 0x5916, 0xA57E, 0x5917, 0xC970, 0x5919, 0xA667, 0x591A, 0xA668, + 0x591C, 0xA95D, 0x5920, 0xB0F7, 0x5922, 0xB9DA, 0x5924, 0xB9DB, + 0x5925, 0xB9D9, 0x5927, 0xA46A, 0x5929, 0xA4D1, 0x592A, 0xA4D3, + 0x592B, 0xA4D2, 0x592C, 0xC95B, 0x592D, 0xA4D4, 0x592E, 0xA5A1, + 0x592F, 0xC971, 0x5931, 0xA5A2, 0x5937, 0xA669, 0x5938, 0xA66A, + 0x593C, 0xC9CB, 0x593E, 0xA7A8, 0x5940, 0xCAB1, 0x5944, 0xA961, + 0x5945, 0xCC43, 0x5947, 0xA95F, 0x5948, 0xA960, 0x5949, 0xA95E, + 0x594A, 0xD15A, 0x594E, 0xABB6, 0x594F, 0xABB5, 0x5950, 0xABB7, + 0x5951, 0xABB4, 0x5953, 0xCE61, 0x5954, 0xA962, 0x5955, 0xABB3, + 0x5957, 0xAE4D, 0x5958, 0xAE4E, 0x595A, 0xAE4F, 0x595C, 0xD4CD, + 0x5960, 0xB3FE, 0x5961, 0xD8B4, 0x5962, 0xB0F8, 0x5967, 0xB6F8, + 0x5969, 0xB9DD, 0x596A, 0xB9DC, 0x596B, 0xE16A, 0x596D, 0xBC5D, + 0x596E, 0xBEC4, 0x5970, 0xEFC0, 0x5971, 0xF6DA, 0x5972, 0xF7D4, + 0x5973, 0xA46B, 0x5974, 0xA5A3, 0x5976, 0xA5A4, 0x5977, 0xC9D1, + 0x5978, 0xA66C, 0x5979, 0xA66F, 0x597B, 0xC9CF, 0x597C, 0xC9CD, + 0x597D, 0xA66E, 0x597E, 0xC9D0, 0x597F, 0xC9D2, 0x5980, 0xC9CC, + 0x5981, 0xA671, 0x5982, 0xA670, 0x5983, 0xA66D, 0x5984, 0xA66B, + 0x5985, 0xC9CE, 0x598A, 0xA7B3, 0x598D, 0xA7B0, 0x598E, 0xCAB6, + 0x598F, 0xCAB9, 0x5990, 0xCAB8, 0x5992, 0xA7AA, 0x5993, 0xA7B2, + 0x5996, 0xA7AF, 0x5997, 0xCAB5, 0x5998, 0xCAB3, 0x5999, 0xA7AE, + 0x599D, 0xA7A9, 0x599E, 0xA7AC, 0x59A0, 0xCAB4, 0x59A1, 0xCABB, + 0x59A2, 0xCAB7, 0x59A3, 0xA7AD, 0x59A4, 0xA7B1, 0x59A5, 0xA7B4, + 0x59A6, 0xCAB2, 0x59A7, 0xCABA, 0x59A8, 0xA7AB, 0x59AE, 0xA967, + 0x59AF, 0xA96F, 0x59B1, 0xCC4F, 0x59B2, 0xCC48, 0x59B3, 0xA970, + 0x59B4, 0xCC53, 0x59B5, 0xCC44, 0x59B6, 0xCC4B, 0x59B9, 0xA966, + 0x59BA, 0xCC45, 0x59BB, 0xA964, 0x59BC, 0xCC4C, 0x59BD, 0xCC50, + 0x59BE, 0xA963, 0x59C0, 0xCC51, 0x59C1, 0xCC4A, 0x59C3, 0xCC4D, + 0x59C5, 0xA972, 0x59C6, 0xA969, 0x59C7, 0xCC54, 0x59C8, 0xCC52, + 0x59CA, 0xA96E, 0x59CB, 0xA96C, 0x59CC, 0xCC49, 0x59CD, 0xA96B, + 0x59CE, 0xCC47, 0x59CF, 0xCC46, 0x59D0, 0xA96A, 0x59D1, 0xA968, + 0x59D2, 0xA971, 0x59D3, 0xA96D, 0x59D4, 0xA965, 0x59D6, 0xCC4E, + 0x59D8, 0xABB9, 0x59DA, 0xABC0, 0x59DB, 0xCE6F, 0x59DC, 0xABB8, + 0x59DD, 0xCE67, 0x59DE, 0xCE63, 0x59E0, 0xCE73, 0x59E1, 0xCE62, + 0x59E3, 0xABBB, 0x59E4, 0xCE6C, 0x59E5, 0xABBE, 0x59E6, 0xABC1, + 0x59E8, 0xABBC, 0x59E9, 0xCE70, 0x59EA, 0xABBF, 0x59EC, 0xAE56, + 0x59ED, 0xCE76, 0x59EE, 0xCE64, 0x59F1, 0xCE66, 0x59F2, 0xCE6D, + 0x59F3, 0xCE71, 0x59F4, 0xCE75, 0x59F5, 0xCE72, 0x59F6, 0xCE6B, + 0x59F7, 0xCE6E, 0x59FA, 0xCE68, 0x59FB, 0xABC3, 0x59FC, 0xCE6A, + 0x59FD, 0xCE69, 0x59FE, 0xCE74, 0x59FF, 0xABBA, 0x5A00, 0xCE65, + 0x5A01, 0xABC2, 0x5A03, 0xABBD, 0x5A09, 0xAE5C, 0x5A0A, 0xD162, + 0x5A0C, 0xAE5B, 0x5A0F, 0xD160, 0x5A11, 0xAE50, 0x5A13, 0xAE55, + 0x5A15, 0xD15F, 0x5A16, 0xD15C, 0x5A17, 0xD161, 0x5A18, 0xAE51, + 0x5A19, 0xD15B, 0x5A1B, 0xAE54, 0x5A1C, 0xAE52, 0x5A1E, 0xD163, + 0x5A1F, 0xAE53, 0x5A20, 0xAE57, 0x5A23, 0xAE58, 0x5A25, 0xAE5A, + 0x5A29, 0xAE59, 0x5A2D, 0xD15D, 0x5A2E, 0xD15E, 0x5A33, 0xD164, + 0x5A35, 0xD4D4, 0x5A36, 0xB0F9, 0x5A37, 0xD8C2, 0x5A38, 0xD4D3, + 0x5A39, 0xD4E6, 0x5A3C, 0xB140, 0x5A3E, 0xD4E4, 0x5A40, 0xB0FE, + 0x5A41, 0xB0FA, 0x5A42, 0xD4ED, 0x5A43, 0xD4DD, 0x5A44, 0xD4E0, + 0x5A46, 0xB143, 0x5A47, 0xD4EA, 0x5A48, 0xD4E2, 0x5A49, 0xB0FB, + 0x5A4A, 0xB144, 0x5A4C, 0xD4E7, 0x5A4D, 0xD4E5, 0x5A50, 0xD4D6, + 0x5A51, 0xD4EB, 0x5A52, 0xD4DF, 0x5A53, 0xD4DA, 0x5A55, 0xD4D0, + 0x5A56, 0xD4EC, 0x5A57, 0xD4DC, 0x5A58, 0xD4CF, 0x5A5A, 0xB142, + 0x5A5B, 0xD4E1, 0x5A5C, 0xD4EE, 0x5A5D, 0xD4DE, 0x5A5E, 0xD4D2, + 0x5A5F, 0xD4D7, 0x5A60, 0xD4CE, 0x5A62, 0xB141, 0x5A64, 0xD4DB, + 0x5A65, 0xD4D8, 0x5A66, 0xB0FC, 0x5A67, 0xD4D1, 0x5A69, 0xD4E9, + 0x5A6A, 0xB0FD, 0x5A6C, 0xD4D9, 0x5A6D, 0xD4D5, 0x5A70, 0xD4E8, + 0x5A77, 0xB440, 0x5A78, 0xD8BB, 0x5A7A, 0xD8B8, 0x5A7B, 0xD8C9, + 0x5A7C, 0xD8BD, 0x5A7D, 0xD8CA, 0x5A7F, 0xB442, 0x5A83, 0xD8C6, + 0x5A84, 0xD8C3, 0x5A8A, 0xD8C4, 0x5A8B, 0xD8C7, 0x5A8C, 0xD8CB, + 0x5A8E, 0xD4E3, 0x5A8F, 0xD8CD, 0x5A90, 0xDD47, 0x5A92, 0xB443, + 0x5A93, 0xD8CE, 0x5A94, 0xD8B6, 0x5A95, 0xD8C0, 0x5A97, 0xD8C5, + 0x5A9A, 0xB441, 0x5A9B, 0xB444, 0x5A9C, 0xD8CC, 0x5A9D, 0xD8CF, + 0x5A9E, 0xD8BA, 0x5A9F, 0xD8B7, 0x5AA2, 0xD8B9, 0x5AA5, 0xD8BE, + 0x5AA6, 0xD8BC, 0x5AA7, 0xB445, 0x5AA9, 0xD8C8, 0x5AAC, 0xD8BF, + 0x5AAE, 0xD8C1, 0x5AAF, 0xD8B5, 0x5AB0, 0xDCFA, 0x5AB1, 0xDCF8, + 0x5AB2, 0xB742, 0x5AB3, 0xB740, 0x5AB4, 0xDD43, 0x5AB5, 0xDCF9, + 0x5AB6, 0xDD44, 0x5AB7, 0xDD40, 0x5AB8, 0xDCF7, 0x5AB9, 0xDD46, + 0x5ABA, 0xDCF6, 0x5ABB, 0xDCFD, 0x5ABC, 0xB6FE, 0x5ABD, 0xB6FD, + 0x5ABE, 0xB6FC, 0x5ABF, 0xDCFB, 0x5AC0, 0xDD41, 0x5AC1, 0xB6F9, + 0x5AC2, 0xB741, 0x5AC4, 0xDCF4, 0x5AC6, 0xDCFE, 0x5AC7, 0xDCF3, + 0x5AC8, 0xDCFC, 0x5AC9, 0xB6FA, 0x5ACA, 0xDD42, 0x5ACB, 0xDCF5, + 0x5ACC, 0xB6FB, 0x5ACD, 0xDD45, 0x5AD5, 0xE16E, 0x5AD6, 0xB9E2, + 0x5AD7, 0xB9E1, 0x5AD8, 0xB9E3, 0x5AD9, 0xE17A, 0x5ADA, 0xE170, + 0x5ADB, 0xE176, 0x5ADC, 0xE16B, 0x5ADD, 0xE179, 0x5ADE, 0xE178, + 0x5ADF, 0xE17C, 0x5AE0, 0xE175, 0x5AE1, 0xB9DE, 0x5AE2, 0xE174, + 0x5AE3, 0xB9E4, 0x5AE5, 0xE16D, 0x5AE6, 0xB9DF, 0x5AE8, 0xE17B, + 0x5AE9, 0xB9E0, 0x5AEA, 0xE16F, 0x5AEB, 0xE172, 0x5AEC, 0xE177, + 0x5AED, 0xE171, 0x5AEE, 0xE16C, 0x5AF3, 0xE173, 0x5AF4, 0xE555, + 0x5AF5, 0xBC61, 0x5AF6, 0xE558, 0x5AF7, 0xE557, 0x5AF8, 0xE55A, + 0x5AF9, 0xE55C, 0x5AFA, 0xF9DC, 0x5AFB, 0xBC5F, 0x5AFD, 0xE556, + 0x5AFF, 0xE554, 0x5B01, 0xE55D, 0x5B02, 0xE55B, 0x5B03, 0xE559, + 0x5B05, 0xE55F, 0x5B07, 0xE55E, 0x5B08, 0xBC63, 0x5B09, 0xBC5E, + 0x5B0B, 0xBC60, 0x5B0C, 0xBC62, 0x5B0F, 0xE560, 0x5B10, 0xE957, + 0x5B13, 0xE956, 0x5B14, 0xE955, 0x5B16, 0xE958, 0x5B17, 0xE951, + 0x5B19, 0xE952, 0x5B1A, 0xE95A, 0x5B1B, 0xE953, 0x5B1D, 0xBEC5, + 0x5B1E, 0xE95C, 0x5B20, 0xE95B, 0x5B21, 0xE954, 0x5B23, 0xECD1, + 0x5B24, 0xC0A8, 0x5B25, 0xECCF, 0x5B26, 0xECD4, 0x5B27, 0xECD3, + 0x5B28, 0xE959, 0x5B2A, 0xC0A7, 0x5B2C, 0xECD2, 0x5B2D, 0xECCE, + 0x5B2E, 0xECD6, 0x5B2F, 0xECD5, 0x5B30, 0xC0A6, 0x5B32, 0xECD0, + 0x5B34, 0xBEC6, 0x5B38, 0xC254, 0x5B3C, 0xEFC1, 0x5B3D, 0xF1FA, + 0x5B3E, 0xF1FB, 0x5B3F, 0xF1FC, 0x5B40, 0xC45C, 0x5B43, 0xC45D, + 0x5B45, 0xF443, 0x5B47, 0xF5C8, 0x5B48, 0xF5C7, 0x5B4B, 0xF6DB, + 0x5B4C, 0xF6DC, 0x5B4D, 0xF7D5, 0x5B4E, 0xF8A7, 0x5B50, 0xA46C, + 0x5B51, 0xA46D, 0x5B53, 0xA46E, 0x5B54, 0xA4D5, 0x5B55, 0xA5A5, + 0x5B56, 0xC9D3, 0x5B57, 0xA672, 0x5B58, 0xA673, 0x5B5A, 0xA7B7, + 0x5B5B, 0xA7B8, 0x5B5C, 0xA7B6, 0x5B5D, 0xA7B5, 0x5B5F, 0xA973, + 0x5B62, 0xCC55, 0x5B63, 0xA975, 0x5B64, 0xA974, 0x5B65, 0xCC56, + 0x5B69, 0xABC4, 0x5B6B, 0xAE5D, 0x5B6C, 0xD165, 0x5B6E, 0xD4F0, + 0x5B70, 0xB145, 0x5B71, 0xB447, 0x5B72, 0xD4EF, 0x5B73, 0xB446, + 0x5B75, 0xB9E5, 0x5B77, 0xE17D, 0x5B78, 0xBEC7, 0x5B7A, 0xC0A9, + 0x5B7B, 0xECD7, 0x5B7D, 0xC45E, 0x5B7F, 0xC570, 0x5B81, 0xC972, + 0x5B83, 0xA5A6, 0x5B84, 0xC973, 0x5B85, 0xA676, 0x5B87, 0xA674, + 0x5B88, 0xA675, 0x5B89, 0xA677, 0x5B8B, 0xA7BA, 0x5B8C, 0xA7B9, + 0x5B8E, 0xCABC, 0x5B8F, 0xA7BB, 0x5B92, 0xCABD, 0x5B93, 0xCC57, + 0x5B95, 0xCC58, 0x5B97, 0xA976, 0x5B98, 0xA978, 0x5B99, 0xA97A, + 0x5B9A, 0xA977, 0x5B9B, 0xA97B, 0x5B9C, 0xA979, 0x5BA2, 0xABC8, + 0x5BA3, 0xABC5, 0x5BA4, 0xABC7, 0x5BA5, 0xABC9, 0x5BA6, 0xABC6, + 0x5BA7, 0xD166, 0x5BA8, 0xCE77, 0x5BAC, 0xD168, 0x5BAD, 0xD167, + 0x5BAE, 0xAE63, 0x5BB0, 0xAE5F, 0x5BB3, 0xAE60, 0x5BB4, 0xAE62, + 0x5BB5, 0xAE64, 0x5BB6, 0xAE61, 0x5BB8, 0xAE66, 0x5BB9, 0xAE65, + 0x5BBF, 0xB14A, 0x5BC0, 0xD4F2, 0x5BC1, 0xD4F1, 0x5BC2, 0xB149, + 0x5BC4, 0xB148, 0x5BC5, 0xB147, 0x5BC6, 0xB14B, 0x5BC7, 0xB146, + 0x5BCA, 0xD8D5, 0x5BCB, 0xD8D2, 0x5BCC, 0xB449, 0x5BCD, 0xD8D1, + 0x5BCE, 0xD8D6, 0x5BD0, 0xB44B, 0x5BD1, 0xD8D4, 0x5BD2, 0xB448, + 0x5BD3, 0xB44A, 0x5BD4, 0xD8D3, 0x5BD6, 0xDD48, 0x5BD8, 0xDD49, + 0x5BD9, 0xDD4A, 0x5BDE, 0xB9E6, 0x5BDF, 0xB9EE, 0x5BE0, 0xE17E, + 0x5BE1, 0xB9E8, 0x5BE2, 0xB9EC, 0x5BE3, 0xE1A1, 0x5BE4, 0xB9ED, + 0x5BE5, 0xB9E9, 0x5BE6, 0xB9EA, 0x5BE7, 0xB9E7, 0x5BE8, 0xB9EB, + 0x5BE9, 0xBC66, 0x5BEA, 0xD8D0, 0x5BEB, 0xBC67, 0x5BEC, 0xBC65, + 0x5BEE, 0xBC64, 0x5BEF, 0xE95D, 0x5BF0, 0xBEC8, 0x5BF1, 0xECD8, + 0x5BF2, 0xECD9, 0x5BF5, 0xC364, 0x5BF6, 0xC45F, 0x5BF8, 0xA46F, + 0x5BFA, 0xA678, 0x5C01, 0xABCA, 0x5C03, 0xD169, 0x5C04, 0xAE67, + 0x5C07, 0xB14E, 0x5C08, 0xB14D, 0x5C09, 0xB14C, 0x5C0A, 0xB44C, + 0x5C0B, 0xB44D, 0x5C0C, 0xD8D7, 0x5C0D, 0xB9EF, 0x5C0E, 0xBEC9, + 0x5C0F, 0xA470, 0x5C10, 0xC95C, 0x5C11, 0xA4D6, 0x5C12, 0xC974, + 0x5C15, 0xC9D4, 0x5C16, 0xA679, 0x5C1A, 0xA97C, 0x5C1F, 0xDD4B, + 0x5C22, 0xA471, 0x5C24, 0xA4D7, 0x5C25, 0xC9D5, 0x5C28, 0xCABE, + 0x5C2A, 0xCABF, 0x5C2C, 0xA7BC, 0x5C30, 0xD8D8, 0x5C31, 0xB44E, + 0x5C33, 0xDD4C, 0x5C37, 0xC0AA, 0x5C38, 0xA472, 0x5C39, 0xA4A8, + 0x5C3A, 0xA4D8, 0x5C3B, 0xC975, 0x5C3C, 0xA5A7, 0x5C3E, 0xA7C0, + 0x5C3F, 0xA7BF, 0x5C40, 0xA7BD, 0x5C41, 0xA7BE, 0x5C44, 0xCC59, + 0x5C45, 0xA97E, 0x5C46, 0xA9A1, 0x5C47, 0xCC5A, 0x5C48, 0xA97D, + 0x5C4B, 0xABCE, 0x5C4C, 0xCE78, 0x5C4D, 0xABCD, 0x5C4E, 0xABCB, + 0x5C4F, 0xABCC, 0x5C50, 0xAE6A, 0x5C51, 0xAE68, 0x5C54, 0xD16B, + 0x5C55, 0xAE69, 0x5C56, 0xD16A, 0x5C58, 0xAE5E, 0x5C59, 0xD4F3, + 0x5C5C, 0xB150, 0x5C5D, 0xB151, 0x5C60, 0xB14F, 0x5C62, 0xB9F0, + 0x5C63, 0xE1A2, 0x5C64, 0xBC68, 0x5C65, 0xBC69, 0x5C67, 0xE561, + 0x5C68, 0xC0AB, 0x5C69, 0xEFC2, 0x5C6A, 0xEFC3, 0x5C6C, 0xC4DD, + 0x5C6D, 0xF8A8, 0x5C6E, 0xC94B, 0x5C6F, 0xA4D9, 0x5C71, 0xA473, + 0x5C73, 0xC977, 0x5C74, 0xC976, 0x5C79, 0xA67A, 0x5C7A, 0xC9D7, + 0x5C7B, 0xC9D8, 0x5C7C, 0xC9D6, 0x5C7E, 0xC9D9, 0x5C86, 0xCAC7, + 0x5C88, 0xCAC2, 0x5C89, 0xCAC4, 0x5C8A, 0xCAC6, 0x5C8B, 0xCAC3, + 0x5C8C, 0xA7C4, 0x5C8D, 0xCAC0, 0x5C8F, 0xCAC1, 0x5C90, 0xA7C1, + 0x5C91, 0xA7C2, 0x5C92, 0xCAC5, 0x5C93, 0xCAC8, 0x5C94, 0xA7C3, + 0x5C95, 0xCAC9, 0x5C9D, 0xCC68, 0x5C9F, 0xCC62, 0x5CA0, 0xCC5D, + 0x5CA1, 0xA9A3, 0x5CA2, 0xCC65, 0x5CA3, 0xCC63, 0x5CA4, 0xCC5C, + 0x5CA5, 0xCC69, 0x5CA6, 0xCC6C, 0x5CA7, 0xCC67, 0x5CA8, 0xCC60, + 0x5CA9, 0xA9A5, 0x5CAA, 0xCC66, 0x5CAB, 0xA9A6, 0x5CAC, 0xCC61, + 0x5CAD, 0xCC64, 0x5CAE, 0xCC5B, 0x5CAF, 0xCC5F, 0x5CB0, 0xCC6B, + 0x5CB1, 0xA9A7, 0x5CB3, 0xA9A8, 0x5CB5, 0xCC5E, 0x5CB6, 0xCC6A, + 0x5CB7, 0xA9A2, 0x5CB8, 0xA9A4, 0x5CC6, 0xCEAB, 0x5CC7, 0xCEA4, + 0x5CC8, 0xCEAA, 0x5CC9, 0xCEA3, 0x5CCA, 0xCEA5, 0x5CCB, 0xCE7D, + 0x5CCC, 0xCE7B, 0x5CCE, 0xCEAC, 0x5CCF, 0xCEA9, 0x5CD0, 0xCE79, + 0x5CD2, 0xABD0, 0x5CD3, 0xCEA7, 0x5CD4, 0xCEA8, 0x5CD6, 0xCEA6, + 0x5CD7, 0xCE7C, 0x5CD8, 0xCE7A, 0x5CD9, 0xABCF, 0x5CDA, 0xCEA2, + 0x5CDB, 0xCE7E, 0x5CDE, 0xCEA1, 0x5CDF, 0xCEAD, 0x5CE8, 0xAE6F, + 0x5CEA, 0xAE6E, 0x5CEC, 0xD16C, 0x5CED, 0xAE6B, 0x5CEE, 0xD16E, + 0x5CF0, 0xAE70, 0x5CF1, 0xD16F, 0x5CF4, 0xAE73, 0x5CF6, 0xAE71, + 0x5CF7, 0xD170, 0x5CF8, 0xCEAE, 0x5CF9, 0xD172, 0x5CFB, 0xAE6D, + 0x5CFD, 0xAE6C, 0x5CFF, 0xD16D, 0x5D00, 0xD171, 0x5D01, 0xAE72, + 0x5D06, 0xB153, 0x5D07, 0xB152, 0x5D0B, 0xD4F5, 0x5D0C, 0xD4F9, + 0x5D0D, 0xD4FB, 0x5D0E, 0xB154, 0x5D0F, 0xD4FE, 0x5D11, 0xB158, + 0x5D12, 0xD541, 0x5D14, 0xB15A, 0x5D16, 0xB156, 0x5D17, 0xB15E, + 0x5D19, 0xB15B, 0x5D1A, 0xD4F7, 0x5D1B, 0xB155, 0x5D1D, 0xD4F6, + 0x5D1E, 0xD4F4, 0x5D1F, 0xD543, 0x5D20, 0xD4F8, 0x5D22, 0xB157, + 0x5D23, 0xD542, 0x5D24, 0xB15C, 0x5D25, 0xD4FD, 0x5D26, 0xD4FC, + 0x5D27, 0xB15D, 0x5D28, 0xD4FA, 0x5D29, 0xB159, 0x5D2E, 0xD544, + 0x5D30, 0xD540, 0x5D31, 0xD8E7, 0x5D32, 0xD8EE, 0x5D33, 0xD8E3, + 0x5D34, 0xB451, 0x5D35, 0xD8DF, 0x5D36, 0xD8EF, 0x5D37, 0xD8D9, + 0x5D38, 0xD8EC, 0x5D39, 0xD8EA, 0x5D3A, 0xD8E4, 0x5D3C, 0xD8ED, + 0x5D3D, 0xD8E6, 0x5D3F, 0xD8DE, 0x5D40, 0xD8F0, 0x5D41, 0xD8DC, + 0x5D42, 0xD8E9, 0x5D43, 0xD8DA, 0x5D45, 0xD8F1, 0x5D47, 0xB452, + 0x5D49, 0xD8EB, 0x5D4A, 0xDD4F, 0x5D4B, 0xD8DD, 0x5D4C, 0xB44F, + 0x5D4E, 0xD8E1, 0x5D50, 0xB450, 0x5D51, 0xD8E0, 0x5D52, 0xD8E5, + 0x5D55, 0xD8E2, 0x5D59, 0xD8E8, 0x5D5E, 0xDD53, 0x5D62, 0xDD56, + 0x5D63, 0xDD4E, 0x5D65, 0xDD50, 0x5D67, 0xDD55, 0x5D68, 0xDD54, + 0x5D69, 0xB743, 0x5D6B, 0xD8DB, 0x5D6C, 0xDD52, 0x5D6F, 0xB744, + 0x5D71, 0xDD4D, 0x5D72, 0xDD51, 0x5D77, 0xE1A9, 0x5D79, 0xE1B0, + 0x5D7A, 0xE1A7, 0x5D7C, 0xE1AE, 0x5D7D, 0xE1A5, 0x5D7E, 0xE1AD, + 0x5D7F, 0xE1B1, 0x5D80, 0xE1A4, 0x5D81, 0xE1A8, 0x5D82, 0xE1A3, + 0x5D84, 0xB9F1, 0x5D86, 0xE1A6, 0x5D87, 0xB9F2, 0x5D88, 0xE1AC, + 0x5D89, 0xE1AB, 0x5D8A, 0xE1AA, 0x5D8D, 0xE1AF, 0x5D92, 0xE565, + 0x5D93, 0xE567, 0x5D94, 0xBC6B, 0x5D95, 0xE568, 0x5D97, 0xE563, + 0x5D99, 0xE562, 0x5D9A, 0xE56C, 0x5D9C, 0xE56A, 0x5D9D, 0xBC6A, + 0x5D9E, 0xE56D, 0x5D9F, 0xE564, 0x5DA0, 0xE569, 0x5DA1, 0xE56B, + 0x5DA2, 0xE566, 0x5DA7, 0xE961, 0x5DA8, 0xE966, 0x5DA9, 0xE960, + 0x5DAA, 0xE965, 0x5DAC, 0xE95E, 0x5DAD, 0xE968, 0x5DAE, 0xE964, + 0x5DAF, 0xE969, 0x5DB0, 0xE963, 0x5DB1, 0xE95F, 0x5DB2, 0xE967, + 0x5DB4, 0xE96A, 0x5DB5, 0xE962, 0x5DB7, 0xECDA, 0x5DB8, 0xC0AF, + 0x5DBA, 0xC0AD, 0x5DBC, 0xC0AC, 0x5DBD, 0xC0AE, 0x5DC0, 0xEFC4, + 0x5DC2, 0xF172, 0x5DC3, 0xF1FD, 0x5DC6, 0xF444, 0x5DC7, 0xF445, + 0x5DC9, 0xC460, 0x5DCB, 0xF5C9, 0x5DCD, 0xC4DE, 0x5DCF, 0xF5CA, + 0x5DD1, 0xF6DE, 0x5DD2, 0xC572, 0x5DD4, 0xC571, 0x5DD5, 0xF6DD, + 0x5DD6, 0xC5C9, 0x5DD8, 0xF7D6, 0x5DDD, 0xA474, 0x5DDE, 0xA67B, + 0x5DDF, 0xC9DA, 0x5DE0, 0xCACA, 0x5DE1, 0xA8B5, 0x5DE2, 0xB15F, + 0x5DE5, 0xA475, 0x5DE6, 0xA5AA, 0x5DE7, 0xA5A9, 0x5DE8, 0xA5A8, + 0x5DEB, 0xA7C5, 0x5DEE, 0xAE74, 0x5DF0, 0xDD57, 0x5DF1, 0xA476, + 0x5DF2, 0xA477, 0x5DF3, 0xA478, 0x5DF4, 0xA4DA, 0x5DF7, 0xABD1, + 0x5DF9, 0xCEAF, 0x5DFD, 0xB453, 0x5DFE, 0xA479, 0x5DFF, 0xC95D, + 0x5E02, 0xA5AB, 0x5E03, 0xA5AC, 0x5E04, 0xC978, 0x5E06, 0xA67C, + 0x5E0A, 0xCACB, 0x5E0C, 0xA7C6, 0x5E0E, 0xCACC, 0x5E11, 0xA9AE, + 0x5E14, 0xCC6E, 0x5E15, 0xA9AC, 0x5E16, 0xA9AB, 0x5E17, 0xCC6D, + 0x5E18, 0xA9A9, 0x5E19, 0xCC6F, 0x5E1A, 0xA9AA, 0x5E1B, 0xA9AD, + 0x5E1D, 0xABD2, 0x5E1F, 0xABD4, 0x5E20, 0xCEB3, 0x5E21, 0xCEB0, + 0x5E22, 0xCEB1, 0x5E23, 0xCEB2, 0x5E24, 0xCEB4, 0x5E25, 0xABD3, + 0x5E28, 0xD174, 0x5E29, 0xD173, 0x5E2B, 0xAE76, 0x5E2D, 0xAE75, + 0x5E33, 0xB162, 0x5E34, 0xD546, 0x5E36, 0xB161, 0x5E37, 0xB163, + 0x5E38, 0xB160, 0x5E3D, 0xB455, 0x5E3E, 0xD545, 0x5E40, 0xB456, + 0x5E41, 0xD8F3, 0x5E43, 0xB457, 0x5E44, 0xD8F2, 0x5E45, 0xB454, + 0x5E4A, 0xDD5A, 0x5E4B, 0xDD5C, 0x5E4C, 0xB745, 0x5E4D, 0xDD5B, + 0x5E4E, 0xDD59, 0x5E4F, 0xDD58, 0x5E53, 0xE1B4, 0x5E54, 0xB9F7, + 0x5E55, 0xB9F5, 0x5E57, 0xB9F6, 0x5E58, 0xE1B2, 0x5E59, 0xE1B3, + 0x5E5B, 0xB9F3, 0x5E5C, 0xE571, 0x5E5D, 0xE56F, 0x5E5F, 0xBC6D, + 0x5E60, 0xE570, 0x5E61, 0xBC6E, 0x5E62, 0xBC6C, 0x5E63, 0xB9F4, + 0x5E66, 0xE96D, 0x5E67, 0xE96B, 0x5E68, 0xE96C, 0x5E69, 0xE56E, + 0x5E6A, 0xECDC, 0x5E6B, 0xC0B0, 0x5E6C, 0xECDB, 0x5E6D, 0xEFC5, + 0x5E6E, 0xEFC6, 0x5E6F, 0xE96E, 0x5E70, 0xF1FE, 0x5E72, 0xA47A, + 0x5E73, 0xA5AD, 0x5E74, 0xA67E, 0x5E75, 0xC9DB, 0x5E76, 0xA67D, + 0x5E78, 0xA9AF, 0x5E79, 0xB746, 0x5E7B, 0xA4DB, 0x5E7C, 0xA5AE, + 0x5E7D, 0xABD5, 0x5E7E, 0xB458, 0x5E80, 0xC979, 0x5E82, 0xC97A, + 0x5E84, 0xC9DC, 0x5E87, 0xA7C8, 0x5E88, 0xCAD0, 0x5E89, 0xCACE, + 0x5E8A, 0xA7C9, 0x5E8B, 0xCACD, 0x5E8C, 0xCACF, 0x5E8D, 0xCAD1, + 0x5E8F, 0xA7C7, 0x5E95, 0xA9B3, 0x5E96, 0xA9B4, 0x5E97, 0xA9B1, + 0x5E9A, 0xA9B0, 0x5E9B, 0xCEB8, 0x5E9C, 0xA9B2, 0x5EA0, 0xABD6, + 0x5EA2, 0xCEB7, 0x5EA3, 0xCEB9, 0x5EA4, 0xCEB6, 0x5EA5, 0xCEBA, + 0x5EA6, 0xABD7, 0x5EA7, 0xAE79, 0x5EA8, 0xD175, 0x5EAA, 0xD177, + 0x5EAB, 0xAE77, 0x5EAC, 0xD178, 0x5EAD, 0xAE78, 0x5EAE, 0xD176, + 0x5EB0, 0xCEB5, 0x5EB1, 0xD547, 0x5EB2, 0xD54A, 0x5EB3, 0xD54B, + 0x5EB4, 0xD548, 0x5EB5, 0xB167, 0x5EB6, 0xB166, 0x5EB7, 0xB164, + 0x5EB8, 0xB165, 0x5EB9, 0xD549, 0x5EBE, 0xB168, 0x5EC1, 0xB45A, + 0x5EC2, 0xB45B, 0x5EC4, 0xB45C, 0x5EC5, 0xDD5D, 0x5EC6, 0xDD5F, + 0x5EC7, 0xDD61, 0x5EC8, 0xB748, 0x5EC9, 0xB747, 0x5ECA, 0xB459, + 0x5ECB, 0xDD60, 0x5ECC, 0xDD5E, 0x5ECE, 0xE1B8, 0x5ED1, 0xE1B6, + 0x5ED2, 0xE1BC, 0x5ED3, 0xB9F8, 0x5ED4, 0xE1BD, 0x5ED5, 0xE1BA, + 0x5ED6, 0xB9F9, 0x5ED7, 0xE1B7, 0x5ED8, 0xE1B5, 0x5ED9, 0xE1BB, + 0x5EDA, 0xBC70, 0x5EDB, 0xE573, 0x5EDC, 0xE1B9, 0x5EDD, 0xBC72, + 0x5EDE, 0xE574, 0x5EDF, 0xBC71, 0x5EE0, 0xBC74, 0x5EE1, 0xE575, + 0x5EE2, 0xBC6F, 0x5EE3, 0xBC73, 0x5EE5, 0xE973, 0x5EE6, 0xE971, + 0x5EE7, 0xE970, 0x5EE8, 0xE972, 0x5EE9, 0xE96F, 0x5EEC, 0xC366, + 0x5EEE, 0xF446, 0x5EEF, 0xF447, 0x5EF1, 0xF5CB, 0x5EF2, 0xF6DF, + 0x5EF3, 0xC655, 0x5EF6, 0xA9B5, 0x5EF7, 0xA7CA, 0x5EFA, 0xABD8, + 0x5EFE, 0xA47B, 0x5EFF, 0xA4DC, 0x5F01, 0xA5AF, 0x5F02, 0xC9DD, + 0x5F04, 0xA7CB, 0x5F05, 0xCAD2, 0x5F07, 0xCEBB, 0x5F08, 0xABD9, + 0x5F0A, 0xB9FA, 0x5F0B, 0xA47C, 0x5F0F, 0xA6A1, 0x5F12, 0xB749, + 0x5F13, 0xA47D, 0x5F14, 0xA4DD, 0x5F15, 0xA4DE, 0x5F17, 0xA5B1, + 0x5F18, 0xA5B0, 0x5F1A, 0xC9DE, 0x5F1B, 0xA6A2, 0x5F1D, 0xCAD3, + 0x5F1F, 0xA7CC, 0x5F22, 0xCC71, 0x5F23, 0xCC72, 0x5F24, 0xCC73, + 0x5F26, 0xA9B6, 0x5F27, 0xA9B7, 0x5F28, 0xCC70, 0x5F29, 0xA9B8, + 0x5F2D, 0xABDA, 0x5F2E, 0xCEBC, 0x5F30, 0xD17A, 0x5F31, 0xAE7A, + 0x5F33, 0xD179, 0x5F35, 0xB169, 0x5F36, 0xD54C, 0x5F37, 0xB16A, + 0x5F38, 0xD54D, 0x5F3C, 0xB45D, 0x5F40, 0xDD62, 0x5F43, 0xE1BF, + 0x5F44, 0xE1BE, 0x5F46, 0xB9FB, 0x5F48, 0xBC75, 0x5F49, 0xE576, + 0x5F4A, 0xBECA, 0x5F4B, 0xE974, 0x5F4C, 0xC0B1, 0x5F4E, 0xC573, + 0x5F4F, 0xF7D8, 0x5F54, 0xCC74, 0x5F56, 0xCEBD, 0x5F57, 0xB16B, + 0x5F58, 0xD8F4, 0x5F59, 0xB74A, 0x5F5D, 0xC255, 0x5F62, 0xA7CE, + 0x5F64, 0xA7CD, 0x5F65, 0xABDB, 0x5F67, 0xD17B, 0x5F69, 0xB16D, + 0x5F6A, 0xB343, 0x5F6B, 0xB16E, 0x5F6C, 0xB16C, 0x5F6D, 0xB45E, + 0x5F6F, 0xE1C0, 0x5F70, 0xB9FC, 0x5F71, 0xBC76, 0x5F73, 0xC94C, + 0x5F74, 0xC9DF, 0x5F76, 0xCAD5, 0x5F77, 0xA7CF, 0x5F78, 0xCAD4, + 0x5F79, 0xA7D0, 0x5F7C, 0xA9BC, 0x5F7D, 0xCC77, 0x5F7E, 0xCC76, + 0x5F7F, 0xA9BB, 0x5F80, 0xA9B9, 0x5F81, 0xA9BA, 0x5F82, 0xCC75, + 0x5F85, 0xABDD, 0x5F86, 0xCEBE, 0x5F87, 0xABE0, 0x5F88, 0xABDC, + 0x5F89, 0xABE2, 0x5F8A, 0xABDE, 0x5F8B, 0xABDF, 0x5F8C, 0xABE1, + 0x5F90, 0xAE7D, 0x5F91, 0xAE7C, 0x5F92, 0xAE7B, 0x5F96, 0xD54F, + 0x5F97, 0xB16F, 0x5F98, 0xB172, 0x5F99, 0xB170, 0x5F9B, 0xD54E, + 0x5F9C, 0xB175, 0x5F9E, 0xB171, 0x5F9F, 0xD550, 0x5FA0, 0xB174, + 0x5FA1, 0xB173, 0x5FA5, 0xD8F6, 0x5FA6, 0xD8F5, 0x5FA8, 0xB461, + 0x5FA9, 0xB45F, 0x5FAA, 0xB460, 0x5FAB, 0xD8F7, 0x5FAC, 0xB74B, + 0x5FAD, 0xDD64, 0x5FAE, 0xB74C, 0x5FAF, 0xDD63, 0x5FB2, 0xE577, + 0x5FB5, 0xBC78, 0x5FB6, 0xE1C1, 0x5FB7, 0xBC77, 0x5FB9, 0xB9FD, + 0x5FBB, 0xECDE, 0x5FBC, 0xE975, 0x5FBD, 0xC0B2, 0x5FBE, 0xECDD, + 0x5FBF, 0xF240, 0x5FC0, 0xF448, 0x5FC1, 0xF449, 0x5FC3, 0xA4DF, + 0x5FC5, 0xA5B2, 0x5FC9, 0xC97B, 0x5FCC, 0xA7D2, 0x5FCD, 0xA7D4, + 0x5FCF, 0xC9E2, 0x5FD0, 0xCAD8, 0x5FD1, 0xCAD7, 0x5FD2, 0xCAD6, + 0x5FD4, 0xC9E1, 0x5FD5, 0xC9E0, 0x5FD6, 0xA6A4, 0x5FD7, 0xA7D3, + 0x5FD8, 0xA7D1, 0x5FD9, 0xA6A3, 0x5FDD, 0xA9BD, 0x5FDE, 0xCC78, + 0x5FE0, 0xA9BE, 0x5FE1, 0xCADD, 0x5FE3, 0xCADF, 0x5FE4, 0xCADE, + 0x5FE5, 0xCC79, 0x5FE8, 0xCADA, 0x5FEA, 0xA7D8, 0x5FEB, 0xA7D6, + 0x5FED, 0xCAD9, 0x5FEE, 0xCADB, 0x5FEF, 0xCAE1, 0x5FF1, 0xA7D5, + 0x5FF3, 0xCADC, 0x5FF4, 0xCAE5, 0x5FF5, 0xA9C0, 0x5FF7, 0xCAE2, + 0x5FF8, 0xA7D7, 0x5FFA, 0xCAE0, 0x5FFB, 0xCAE3, 0x5FFD, 0xA9BF, + 0x5FFF, 0xA9C1, 0x6000, 0xCAE4, 0x6009, 0xCCAF, 0x600A, 0xCCA2, + 0x600B, 0xCC7E, 0x600C, 0xCCAE, 0x600D, 0xCCA9, 0x600E, 0xABE7, + 0x600F, 0xA9C2, 0x6010, 0xCCAA, 0x6011, 0xCCAD, 0x6012, 0xABE3, + 0x6013, 0xCCAC, 0x6014, 0xA9C3, 0x6015, 0xA9C8, 0x6016, 0xA9C6, + 0x6017, 0xCCA3, 0x6019, 0xCC7C, 0x601A, 0xCCA5, 0x601B, 0xA9CD, + 0x601C, 0xCCB0, 0x601D, 0xABE4, 0x601E, 0xCCA6, 0x6020, 0xABE5, + 0x6021, 0xA9C9, 0x6022, 0xCCA8, 0x6024, 0xCECD, 0x6025, 0xABE6, + 0x6026, 0xCC7B, 0x6027, 0xA9CA, 0x6028, 0xABE8, 0x6029, 0xA9CB, + 0x602A, 0xA9C7, 0x602B, 0xA9CC, 0x602C, 0xCCA7, 0x602D, 0xCC7A, + 0x602E, 0xCCAB, 0x602F, 0xA9C4, 0x6032, 0xCC7D, 0x6033, 0xCCA4, + 0x6034, 0xCCA1, 0x6035, 0xA9C5, 0x6037, 0xCEBF, 0x6039, 0xCEC0, + 0x6040, 0xCECA, 0x6041, 0xD1A1, 0x6042, 0xCECB, 0x6043, 0xABEE, + 0x6044, 0xCECE, 0x6045, 0xCEC4, 0x6046, 0xABED, 0x6047, 0xCEC6, + 0x6049, 0xCEC7, 0x604C, 0xCEC9, 0x604D, 0xABE9, 0x6050, 0xAEA3, + 0x6052, 0xF9DA, 0x6053, 0xCEC5, 0x6054, 0xCEC1, 0x6055, 0xAEA4, + 0x6058, 0xCECF, 0x6059, 0xAE7E, 0x605A, 0xD17D, 0x605B, 0xCEC8, + 0x605D, 0xD17C, 0x605E, 0xCEC3, 0x605F, 0xCECC, 0x6062, 0xABEC, + 0x6063, 0xAEA1, 0x6064, 0xABF2, 0x6065, 0xAEA2, 0x6066, 0xCED0, + 0x6067, 0xD17E, 0x6068, 0xABEB, 0x6069, 0xAEA6, 0x606A, 0xABF1, + 0x606B, 0xABF0, 0x606C, 0xABEF, 0x606D, 0xAEA5, 0x606E, 0xCED1, + 0x606F, 0xAEA7, 0x6070, 0xABEA, 0x6072, 0xCEC2, 0x607F, 0xB176, + 0x6080, 0xD1A4, 0x6081, 0xD1A6, 0x6083, 0xD1A8, 0x6084, 0xAEA8, + 0x6085, 0xAEAE, 0x6086, 0xD553, 0x6087, 0xD1AC, 0x6088, 0xD1A3, + 0x6089, 0xB178, 0x608A, 0xD551, 0x608C, 0xAEAD, 0x608D, 0xAEAB, + 0x608E, 0xD1AE, 0x6090, 0xD552, 0x6092, 0xD1A5, 0x6094, 0xAEAC, + 0x6095, 0xD1A9, 0x6096, 0xAEAF, 0x6097, 0xD1AB, 0x609A, 0xAEAA, + 0x609B, 0xD1AA, 0x609C, 0xD1AD, 0x609D, 0xD1A7, 0x609F, 0xAEA9, + 0x60A0, 0xB179, 0x60A2, 0xD1A2, 0x60A3, 0xB177, 0x60A8, 0xB17A, + 0x60B0, 0xD555, 0x60B1, 0xD55E, 0x60B2, 0xB464, 0x60B4, 0xB17C, + 0x60B5, 0xB1A3, 0x60B6, 0xB465, 0x60B7, 0xD560, 0x60B8, 0xB1AA, + 0x60B9, 0xD8F9, 0x60BA, 0xD556, 0x60BB, 0xB1A2, 0x60BC, 0xB1A5, + 0x60BD, 0xB17E, 0x60BE, 0xD554, 0x60BF, 0xD562, 0x60C0, 0xD565, + 0x60C1, 0xD949, 0x60C3, 0xD563, 0x60C4, 0xD8FD, 0x60C5, 0xB1A1, + 0x60C6, 0xB1A8, 0x60C7, 0xB1AC, 0x60C8, 0xD55D, 0x60C9, 0xD8F8, + 0x60CA, 0xD561, 0x60CB, 0xB17B, 0x60CC, 0xD8FA, 0x60CD, 0xD564, + 0x60CE, 0xD8FC, 0x60CF, 0xD559, 0x60D1, 0xB462, 0x60D3, 0xD557, + 0x60D4, 0xD558, 0x60D5, 0xB1A7, 0x60D8, 0xB1A6, 0x60D9, 0xD55B, + 0x60DA, 0xB1AB, 0x60DB, 0xD55F, 0x60DC, 0xB1A4, 0x60DD, 0xD55C, + 0x60DF, 0xB1A9, 0x60E0, 0xB466, 0x60E1, 0xB463, 0x60E2, 0xD8FB, + 0x60E4, 0xD55A, 0x60E6, 0xB17D, 0x60F0, 0xB46B, 0x60F1, 0xB46F, + 0x60F2, 0xD940, 0x60F3, 0xB751, 0x60F4, 0xB46D, 0x60F5, 0xD944, + 0x60F6, 0xB471, 0x60F7, 0xDD65, 0x60F8, 0xD946, 0x60F9, 0xB753, + 0x60FA, 0xB469, 0x60FB, 0xB46C, 0x60FC, 0xD947, 0x60FE, 0xD948, + 0x60FF, 0xD94E, 0x6100, 0xB473, 0x6101, 0xB754, 0x6103, 0xD94A, + 0x6104, 0xD94F, 0x6105, 0xD943, 0x6106, 0xB75E, 0x6108, 0xB755, + 0x6109, 0xB472, 0x610A, 0xD941, 0x610B, 0xD950, 0x610D, 0xB75D, + 0x610E, 0xB470, 0x610F, 0xB74E, 0x6110, 0xD94D, 0x6112, 0xB474, + 0x6113, 0xD945, 0x6114, 0xD8FE, 0x6115, 0xB46A, 0x6116, 0xD942, + 0x6118, 0xD94B, 0x611A, 0xB74D, 0x611B, 0xB752, 0x611C, 0xB467, + 0x611D, 0xD94C, 0x611F, 0xB750, 0x6123, 0xB468, 0x6127, 0xB75C, + 0x6128, 0xE1C3, 0x6129, 0xDD70, 0x612B, 0xDD68, 0x612C, 0xE1C2, + 0x612E, 0xDD6C, 0x612F, 0xDD6E, 0x6132, 0xDD6B, 0x6134, 0xB75B, + 0x6136, 0xDD6A, 0x6137, 0xB75F, 0x613B, 0xE1D2, 0x613E, 0xB75A, + 0x613F, 0xBA40, 0x6140, 0xDD71, 0x6141, 0xE1C4, 0x6144, 0xB758, + 0x6145, 0xDD69, 0x6146, 0xDD6D, 0x6147, 0xB9FE, 0x6148, 0xB74F, + 0x6149, 0xDD66, 0x614A, 0xDD67, 0x614B, 0xBA41, 0x614C, 0xB757, + 0x614D, 0xB759, 0x614E, 0xB756, 0x614F, 0xDD6F, 0x6152, 0xE1C8, + 0x6153, 0xE1C9, 0x6154, 0xE1CE, 0x6155, 0xBC7D, 0x6156, 0xE1D5, + 0x6158, 0xBA47, 0x615A, 0xBA46, 0x615B, 0xE1D0, 0x615D, 0xBC7C, + 0x615E, 0xE1C5, 0x615F, 0xBA45, 0x6161, 0xE1D4, 0x6162, 0xBA43, + 0x6163, 0xBA44, 0x6165, 0xE1D1, 0x6166, 0xE5AA, 0x6167, 0xBC7A, + 0x6168, 0xB46E, 0x616A, 0xE1D3, 0x616B, 0xBCA3, 0x616C, 0xE1CB, + 0x616E, 0xBC7B, 0x6170, 0xBCA2, 0x6171, 0xE1C6, 0x6172, 0xE1CA, + 0x6173, 0xE1C7, 0x6174, 0xE1CD, 0x6175, 0xBA48, 0x6176, 0xBC79, + 0x6177, 0xBA42, 0x6179, 0xE57A, 0x617A, 0xE1CF, 0x617C, 0xBCA1, + 0x617E, 0xBCA4, 0x6180, 0xE1CC, 0x6182, 0xBC7E, 0x6183, 0xE579, + 0x6189, 0xE57E, 0x618A, 0xBECE, 0x618B, 0xE578, 0x618C, 0xE9A3, + 0x618D, 0xE5A9, 0x618E, 0xBCA8, 0x6190, 0xBCA6, 0x6191, 0xBECC, + 0x6192, 0xE5A6, 0x6193, 0xE5A2, 0x6194, 0xBCAC, 0x6196, 0xE978, + 0x619A, 0xBCAA, 0x619B, 0xE5A1, 0x619D, 0xE976, 0x619F, 0xE5A5, + 0x61A1, 0xE5A8, 0x61A2, 0xE57D, 0x61A4, 0xBCAB, 0x61A7, 0xBCA5, + 0x61A8, 0xE977, 0x61A9, 0xBECD, 0x61AA, 0xE5A7, 0x61AB, 0xBCA7, + 0x61AC, 0xBCA9, 0x61AD, 0xE5A4, 0x61AE, 0xBCAD, 0x61AF, 0xE5A3, + 0x61B0, 0xE57C, 0x61B1, 0xE57B, 0x61B2, 0xBECB, 0x61B3, 0xE5AB, + 0x61B4, 0xE97A, 0x61B5, 0xECE0, 0x61B6, 0xBED0, 0x61B8, 0xE9A2, + 0x61BA, 0xE97E, 0x61BC, 0xECE1, 0x61BE, 0xBED1, 0x61BF, 0xE9A1, + 0x61C1, 0xE97C, 0x61C2, 0xC0B4, 0x61C3, 0xECDF, 0x61C5, 0xE979, + 0x61C6, 0xE97B, 0x61C7, 0xC0B5, 0x61C8, 0xBED3, 0x61C9, 0xC0B3, + 0x61CA, 0xBED2, 0x61CB, 0xC0B7, 0x61CC, 0xE97D, 0x61CD, 0xBECF, + 0x61D6, 0xEFCF, 0x61D8, 0xEFC7, 0x61DE, 0xECE7, 0x61DF, 0xEFC8, + 0x61E0, 0xECE3, 0x61E3, 0xC256, 0x61E4, 0xECE5, 0x61E5, 0xECE4, + 0x61E6, 0xC0B6, 0x61E7, 0xECE2, 0x61E8, 0xECE6, 0x61E9, 0xEFD0, + 0x61EA, 0xEFCC, 0x61EB, 0xEFCE, 0x61ED, 0xEFC9, 0x61EE, 0xEFCA, + 0x61F0, 0xEFCD, 0x61F1, 0xEFCB, 0x61F2, 0xC367, 0x61F5, 0xC36A, + 0x61F6, 0xC369, 0x61F7, 0xC368, 0x61F8, 0xC461, 0x61F9, 0xF44A, + 0x61FA, 0xC462, 0x61FB, 0xF241, 0x61FC, 0xC4DF, 0x61FD, 0xF5CC, + 0x61FE, 0xC4E0, 0x61FF, 0xC574, 0x6200, 0xC5CA, 0x6201, 0xF7D9, + 0x6203, 0xF7DA, 0x6204, 0xF7DB, 0x6207, 0xF9BA, 0x6208, 0xA4E0, + 0x6209, 0xC97C, 0x620A, 0xA5B3, 0x620C, 0xA6A6, 0x620D, 0xA6A7, + 0x620E, 0xA6A5, 0x6210, 0xA6A8, 0x6211, 0xA7DA, 0x6212, 0xA7D9, + 0x6214, 0xCCB1, 0x6215, 0xA9CF, 0x6216, 0xA9CE, 0x6219, 0xD1AF, + 0x621A, 0xB1AD, 0x621B, 0xB1AE, 0x621F, 0xB475, 0x6220, 0xDD72, + 0x6221, 0xB760, 0x6222, 0xB761, 0x6223, 0xDD74, 0x6224, 0xDD76, + 0x6225, 0xDD75, 0x6227, 0xE1D7, 0x6229, 0xE1D6, 0x622A, 0xBA49, + 0x622B, 0xE1D8, 0x622D, 0xE5AC, 0x622E, 0xBCAE, 0x6230, 0xBED4, + 0x6232, 0xC0B8, 0x6233, 0xC257, 0x6234, 0xC0B9, 0x6236, 0xA4E1, + 0x623A, 0xCAE6, 0x623D, 0xCCB2, 0x623E, 0xA9D1, 0x623F, 0xA9D0, + 0x6240, 0xA9D2, 0x6241, 0xABF3, 0x6242, 0xCED2, 0x6243, 0xCED3, + 0x6246, 0xD1B0, 0x6247, 0xAEB0, 0x6248, 0xB1AF, 0x6249, 0xB476, + 0x624A, 0xD951, 0x624B, 0xA4E2, 0x624D, 0xA47E, 0x624E, 0xA4E3, + 0x6250, 0xC97D, 0x6251, 0xA5B7, 0x6252, 0xA5B6, 0x6253, 0xA5B4, + 0x6254, 0xA5B5, 0x6258, 0xA6AB, 0x6259, 0xC9E9, 0x625A, 0xC9EB, + 0x625B, 0xA6AA, 0x625C, 0xC9E3, 0x625E, 0xC9E4, 0x6260, 0xC9EA, + 0x6261, 0xC9E6, 0x6262, 0xC9E8, 0x6263, 0xA6A9, 0x6264, 0xC9E5, + 0x6265, 0xC9EC, 0x6266, 0xC9E7, 0x626D, 0xA7E1, 0x626E, 0xA7EA, + 0x626F, 0xA7E8, 0x6270, 0xCAF0, 0x6271, 0xCAED, 0x6272, 0xCAF5, + 0x6273, 0xA7E6, 0x6274, 0xCAF6, 0x6276, 0xA7DF, 0x6277, 0xCAF3, + 0x6279, 0xA7E5, 0x627A, 0xCAEF, 0x627B, 0xCAEE, 0x627C, 0xA7E3, + 0x627D, 0xCAF4, 0x627E, 0xA7E4, 0x627F, 0xA9D3, 0x6280, 0xA7DE, + 0x6281, 0xCAF1, 0x6283, 0xCAE7, 0x6284, 0xA7DB, 0x6286, 0xA7EE, + 0x6287, 0xCAEC, 0x6288, 0xCAF2, 0x6289, 0xA7E0, 0x628A, 0xA7E2, + 0x628C, 0xCAE8, 0x628E, 0xCAE9, 0x628F, 0xCAEA, 0x6291, 0xA7ED, + 0x6292, 0xA7E7, 0x6293, 0xA7EC, 0x6294, 0xCAEB, 0x6295, 0xA7EB, + 0x6296, 0xA7DD, 0x6297, 0xA7DC, 0x6298, 0xA7E9, 0x62A8, 0xA9E1, + 0x62A9, 0xCCBE, 0x62AA, 0xCCB7, 0x62AB, 0xA9DC, 0x62AC, 0xA9EF, + 0x62AD, 0xCCB3, 0x62AE, 0xCCBA, 0x62AF, 0xCCBC, 0x62B0, 0xCCBF, + 0x62B1, 0xA9EA, 0x62B3, 0xCCBB, 0x62B4, 0xCCB4, 0x62B5, 0xA9E8, + 0x62B6, 0xCCB8, 0x62B8, 0xCCC0, 0x62B9, 0xA9D9, 0x62BB, 0xCCBD, + 0x62BC, 0xA9E3, 0x62BD, 0xA9E2, 0x62BE, 0xCCB6, 0x62BF, 0xA9D7, + 0x62C2, 0xA9D8, 0x62C4, 0xA9D6, 0x62C6, 0xA9EE, 0x62C7, 0xA9E6, + 0x62C8, 0xA9E0, 0x62C9, 0xA9D4, 0x62CA, 0xCCB9, 0x62CB, 0xA9DF, + 0x62CC, 0xA9D5, 0x62CD, 0xA9E7, 0x62CE, 0xA9F0, 0x62CF, 0xCED4, + 0x62D0, 0xA9E4, 0x62D1, 0xCCB5, 0x62D2, 0xA9DA, 0x62D3, 0xA9DD, + 0x62D4, 0xA9DE, 0x62D6, 0xA9EC, 0x62D7, 0xA9ED, 0x62D8, 0xA9EB, + 0x62D9, 0xA9E5, 0x62DA, 0xA9E9, 0x62DB, 0xA9DB, 0x62DC, 0xABF4, + 0x62EB, 0xCEDA, 0x62EC, 0xAC41, 0x62ED, 0xABF8, 0x62EE, 0xABFA, + 0x62EF, 0xAC40, 0x62F0, 0xCEE6, 0x62F1, 0xABFD, 0x62F2, 0xD1B1, + 0x62F3, 0xAEB1, 0x62F4, 0xAC43, 0x62F5, 0xCED7, 0x62F6, 0xCEDF, + 0x62F7, 0xABFE, 0x62F8, 0xCEDE, 0x62F9, 0xCEDB, 0x62FA, 0xCEE3, + 0x62FB, 0xCEE5, 0x62FC, 0xABF7, 0x62FD, 0xABFB, 0x62FE, 0xAC42, + 0x62FF, 0xAEB3, 0x6300, 0xCEE0, 0x6301, 0xABF9, 0x6302, 0xAC45, + 0x6303, 0xCED9, 0x6307, 0xABFC, 0x6308, 0xAEB2, 0x6309, 0xABF6, + 0x630B, 0xCED6, 0x630C, 0xCEDD, 0x630D, 0xCED5, 0x630E, 0xCED8, + 0x630F, 0xCEDC, 0x6310, 0xD1B2, 0x6311, 0xAC44, 0x6313, 0xCEE1, + 0x6314, 0xCEE2, 0x6315, 0xCEE4, 0x6316, 0xABF5, 0x6328, 0xAEC1, + 0x6329, 0xD1BE, 0x632A, 0xAEBF, 0x632B, 0xAEC0, 0x632C, 0xD1B4, + 0x632D, 0xD1C4, 0x632F, 0xAEB6, 0x6332, 0xD566, 0x6333, 0xD1C6, + 0x6334, 0xD1C0, 0x6336, 0xD1B7, 0x6338, 0xD1C9, 0x6339, 0xD1BA, + 0x633A, 0xAEBC, 0x633B, 0xD57D, 0x633C, 0xD1BD, 0x633D, 0xAEBE, + 0x633E, 0xAEB5, 0x6340, 0xD1CB, 0x6341, 0xD1BF, 0x6342, 0xAEB8, + 0x6343, 0xD1B8, 0x6344, 0xD1B5, 0x6345, 0xD1B6, 0x6346, 0xAEB9, + 0x6347, 0xD1C5, 0x6348, 0xD1CC, 0x6349, 0xAEBB, 0x634A, 0xD1BC, + 0x634B, 0xD1BB, 0x634C, 0xAEC3, 0x634D, 0xAEC2, 0x634E, 0xAEB4, + 0x634F, 0xAEBA, 0x6350, 0xAEBD, 0x6351, 0xD1C8, 0x6354, 0xD1C2, + 0x6355, 0xAEB7, 0x6356, 0xD1B3, 0x6357, 0xD1CA, 0x6358, 0xD1C1, + 0x6359, 0xD1C3, 0x635A, 0xD1C7, 0x6365, 0xD567, 0x6367, 0xB1B7, + 0x6368, 0xB1CB, 0x6369, 0xB1CA, 0x636B, 0xB1BF, 0x636D, 0xD579, + 0x636E, 0xD575, 0x636F, 0xD572, 0x6370, 0xD5A6, 0x6371, 0xB1BA, + 0x6372, 0xB1B2, 0x6375, 0xD577, 0x6376, 0xB4A8, 0x6377, 0xB1B6, + 0x6378, 0xD5A1, 0x637A, 0xB1CC, 0x637B, 0xB1C9, 0x637C, 0xD57B, + 0x637D, 0xD56A, 0x6380, 0xB1C8, 0x6381, 0xD5A3, 0x6382, 0xD569, + 0x6383, 0xB1BD, 0x6384, 0xB1C1, 0x6385, 0xD5A2, 0x6387, 0xD573, + 0x6388, 0xB1C2, 0x6389, 0xB1BC, 0x638A, 0xD568, 0x638C, 0xB478, + 0x638D, 0xD5A5, 0x638E, 0xD571, 0x638F, 0xB1C7, 0x6390, 0xD574, + 0x6391, 0xD5A4, 0x6392, 0xB1C6, 0x6394, 0xD952, 0x6396, 0xB1B3, + 0x6397, 0xD56F, 0x6398, 0xB1B8, 0x6399, 0xB1C3, 0x639B, 0xB1BE, + 0x639C, 0xD578, 0x639D, 0xD56E, 0x639E, 0xD56C, 0x639F, 0xD57E, + 0x63A0, 0xB1B0, 0x63A1, 0xB1C4, 0x63A2, 0xB1B4, 0x63A3, 0xB477, + 0x63A4, 0xD57C, 0x63A5, 0xB1B5, 0x63A7, 0xB1B1, 0x63A8, 0xB1C0, + 0x63A9, 0xB1BB, 0x63AA, 0xB1B9, 0x63AB, 0xD570, 0x63AC, 0xB1C5, + 0x63AD, 0xD56D, 0x63AE, 0xD57A, 0x63AF, 0xD576, 0x63B0, 0xD954, + 0x63B1, 0xD953, 0x63BD, 0xD56B, 0x63BE, 0xD964, 0x63C0, 0xB47A, + 0x63C2, 0xD96A, 0x63C3, 0xD959, 0x63C4, 0xD967, 0x63C5, 0xDD77, + 0x63C6, 0xB47D, 0x63C7, 0xD96B, 0x63C8, 0xD96E, 0x63C9, 0xB47C, + 0x63CA, 0xD95C, 0x63CB, 0xD96D, 0x63CC, 0xD96C, 0x63CD, 0xB47E, + 0x63CE, 0xD955, 0x63CF, 0xB479, 0x63D0, 0xB4A3, 0x63D2, 0xB4A1, + 0x63D3, 0xD969, 0x63D5, 0xD95F, 0x63D6, 0xB4A5, 0x63D7, 0xD970, + 0x63D8, 0xD968, 0x63D9, 0xD971, 0x63DA, 0xB4AD, 0x63DB, 0xB4AB, + 0x63DC, 0xD966, 0x63DD, 0xD965, 0x63DF, 0xD963, 0x63E0, 0xD95D, + 0x63E1, 0xB4A4, 0x63E3, 0xB4A2, 0x63E4, 0xD1B9, 0x63E5, 0xD956, + 0x63E7, 0xDDB7, 0x63E8, 0xD957, 0x63E9, 0xB47B, 0x63EA, 0xB4AA, + 0x63EB, 0xDD79, 0x63ED, 0xB4A6, 0x63EE, 0xB4A7, 0x63EF, 0xD958, + 0x63F0, 0xD96F, 0x63F1, 0xDD78, 0x63F2, 0xD960, 0x63F3, 0xD95B, + 0x63F4, 0xB4A9, 0x63F5, 0xD961, 0x63F6, 0xD95E, 0x63F9, 0xB4AE, + 0x6406, 0xB770, 0x6409, 0xDD7C, 0x640A, 0xDDB1, 0x640B, 0xDDB6, + 0x640C, 0xDDAA, 0x640D, 0xB76C, 0x640E, 0xDDBB, 0x640F, 0xB769, + 0x6410, 0xDD7A, 0x6412, 0xDD7B, 0x6413, 0xB762, 0x6414, 0xB76B, + 0x6415, 0xDDA4, 0x6416, 0xB76E, 0x6417, 0xB76F, 0x6418, 0xDDA5, + 0x641A, 0xDDB2, 0x641B, 0xDDB8, 0x641C, 0xB76A, 0x641E, 0xB764, + 0x641F, 0xDDA3, 0x6420, 0xDD7D, 0x6421, 0xDDBA, 0x6422, 0xDDA8, + 0x6423, 0xDDA9, 0x6424, 0xDD7E, 0x6425, 0xDDB4, 0x6426, 0xDDAB, + 0x6427, 0xDDB5, 0x6428, 0xDDAD, 0x642A, 0xB765, 0x642B, 0xE1D9, + 0x642C, 0xB768, 0x642D, 0xB766, 0x642E, 0xDDB9, 0x642F, 0xDDB0, + 0x6430, 0xDDAC, 0x6433, 0xDDA1, 0x6434, 0xBA53, 0x6435, 0xDDAF, + 0x6436, 0xB76D, 0x6437, 0xDDA7, 0x6439, 0xDDA6, 0x643D, 0xB767, + 0x643E, 0xB763, 0x643F, 0xE1EE, 0x6440, 0xDDB3, 0x6441, 0xDDAE, + 0x6443, 0xDDA2, 0x644B, 0xE1E9, 0x644D, 0xE1DA, 0x644E, 0xE1E5, + 0x6450, 0xE1EC, 0x6451, 0xBA51, 0x6452, 0xB4AC, 0x6453, 0xE1EA, + 0x6454, 0xBA4C, 0x6458, 0xBA4B, 0x6459, 0xE1F1, 0x645B, 0xE1DB, + 0x645C, 0xE1E8, 0x645D, 0xE1DC, 0x645E, 0xE1E7, 0x645F, 0xBA4F, + 0x6460, 0xE1EB, 0x6461, 0xD962, 0x6465, 0xE1F2, 0x6466, 0xE1E3, + 0x6467, 0xBA52, 0x6468, 0xE5BA, 0x6469, 0xBCAF, 0x646B, 0xE1F0, + 0x646C, 0xE1EF, 0x646D, 0xBA54, 0x646E, 0xE5AD, 0x646F, 0xBCB0, + 0x6470, 0xE5AE, 0x6472, 0xE1DF, 0x6473, 0xE1E0, 0x6474, 0xE1DD, + 0x6475, 0xE1E2, 0x6476, 0xE1DE, 0x6477, 0xE1F3, 0x6478, 0xBA4E, + 0x6479, 0xBCB1, 0x647A, 0xBA50, 0x647B, 0xBA55, 0x647D, 0xE1E1, + 0x647F, 0xE1ED, 0x6482, 0xE1E6, 0x6485, 0xE5B1, 0x6487, 0xBA4A, + 0x6488, 0xBCB4, 0x6489, 0xE9AA, 0x648A, 0xE5B6, 0x648B, 0xE5B5, + 0x648C, 0xE5B7, 0x648F, 0xE5B4, 0x6490, 0xBCB5, 0x6492, 0xBCBB, + 0x6493, 0xBCB8, 0x6495, 0xBCB9, 0x6496, 0xE5AF, 0x6497, 0xE5B2, + 0x6498, 0xE5BC, 0x6499, 0xBCC1, 0x649A, 0xBCBF, 0x649C, 0xE5B3, + 0x649D, 0xD95A, 0x649E, 0xBCB2, 0x649F, 0xE5B9, 0x64A0, 0xE5B0, + 0x64A2, 0xBCC2, 0x64A3, 0xE5B8, 0x64A4, 0xBA4D, 0x64A5, 0xBCB7, + 0x64A6, 0xE1E4, 0x64A9, 0xBCBA, 0x64AB, 0xBCBE, 0x64AC, 0xBCC0, + 0x64AD, 0xBCBD, 0x64AE, 0xBCBC, 0x64B0, 0xBCB6, 0x64B1, 0xE5BB, + 0x64B2, 0xBCB3, 0x64B3, 0xBCC3, 0x64BB, 0xBED8, 0x64BC, 0xBED9, + 0x64BD, 0xE9A9, 0x64BE, 0xBEE2, 0x64BF, 0xBEDF, 0x64C1, 0xBED6, + 0x64C2, 0xBEDD, 0x64C3, 0xE9AB, 0x64C4, 0xBEDB, 0x64C5, 0xBED5, + 0x64C7, 0xBEDC, 0x64C9, 0xE9A8, 0x64CA, 0xC0BB, 0x64CB, 0xBED7, + 0x64CD, 0xBEDE, 0x64CE, 0xC0BA, 0x64CF, 0xE9A7, 0x64D0, 0xE9A6, + 0x64D2, 0xBEE0, 0x64D4, 0xBEE1, 0x64D6, 0xE9A5, 0x64D7, 0xE9A4, + 0x64D8, 0xC0BC, 0x64D9, 0xE9AE, 0x64DA, 0xBEDA, 0x64DB, 0xE9AC, + 0x64E0, 0xC0BD, 0x64E2, 0xC0C2, 0x64E3, 0xECEA, 0x64E4, 0xECEC, + 0x64E6, 0xC0BF, 0x64E8, 0xECED, 0x64E9, 0xECE9, 0x64EB, 0xECEB, + 0x64EC, 0xC0C0, 0x64ED, 0xC0C3, 0x64EF, 0xECE8, 0x64F0, 0xC0BE, + 0x64F1, 0xC0C1, 0x64F2, 0xC259, 0x64F3, 0xE9AD, 0x64F4, 0xC258, + 0x64F7, 0xC25E, 0x64F8, 0xEFD4, 0x64FA, 0xC25C, 0x64FB, 0xC25D, + 0x64FC, 0xEFD7, 0x64FD, 0xEFD3, 0x64FE, 0xC25A, 0x64FF, 0xEFD1, + 0x6500, 0xC36B, 0x6501, 0xEFD5, 0x6503, 0xEFD6, 0x6504, 0xEFD2, + 0x6506, 0xC25B, 0x6507, 0xF242, 0x6509, 0xF245, 0x650C, 0xF246, + 0x650D, 0xF244, 0x650E, 0xF247, 0x650F, 0xC36C, 0x6510, 0xF243, + 0x6513, 0xF44E, 0x6514, 0xC464, 0x6515, 0xF44D, 0x6516, 0xF44C, + 0x6517, 0xF44B, 0x6518, 0xC463, 0x6519, 0xC465, 0x651B, 0xF5CD, + 0x651C, 0xC4E2, 0x651D, 0xC4E1, 0x6520, 0xF6E1, 0x6521, 0xF6E0, + 0x6522, 0xF6E3, 0x6523, 0xC5CB, 0x6524, 0xC575, 0x6525, 0xF7DD, + 0x6526, 0xF6E2, 0x6529, 0xF7DC, 0x652A, 0xC5CD, 0x652B, 0xC5CC, + 0x652C, 0xC5F3, 0x652D, 0xF8A9, 0x652E, 0xF8EF, 0x652F, 0xA4E4, + 0x6532, 0xD972, 0x6533, 0xE9AF, 0x6536, 0xA6AC, 0x6537, 0xCAF7, + 0x6538, 0xA7F1, 0x6539, 0xA7EF, 0x653B, 0xA7F0, 0x653D, 0xCCC1, + 0x653E, 0xA9F1, 0x653F, 0xAC46, 0x6541, 0xCEE7, 0x6543, 0xCEE8, + 0x6545, 0xAC47, 0x6546, 0xD1CE, 0x6548, 0xAEC4, 0x6549, 0xAEC5, + 0x654A, 0xD1CD, 0x654F, 0xB1D3, 0x6551, 0xB1CF, 0x6553, 0xD5A7, + 0x6554, 0xB1D6, 0x6555, 0xB1D5, 0x6556, 0xB1CE, 0x6557, 0xB1D1, + 0x6558, 0xB1D4, 0x6559, 0xB1D0, 0x655C, 0xD976, 0x655D, 0xB1CD, + 0x655E, 0xB4AF, 0x6562, 0xB4B1, 0x6563, 0xB4B2, 0x6564, 0xD975, + 0x6565, 0xD978, 0x6566, 0xB4B0, 0x6567, 0xD973, 0x6568, 0xD977, + 0x656A, 0xD974, 0x656C, 0xB771, 0x656F, 0xDDBC, 0x6572, 0xBA56, + 0x6573, 0xE1F4, 0x6574, 0xBEE3, 0x6575, 0xBCC4, 0x6576, 0xE5BD, + 0x6577, 0xBCC5, 0x6578, 0xBCC6, 0x6579, 0xE5BF, 0x657A, 0xE5BE, + 0x657B, 0xE5C0, 0x657C, 0xE9B1, 0x657F, 0xE9B0, 0x6580, 0xECEF, + 0x6581, 0xECEE, 0x6582, 0xC0C4, 0x6583, 0xC0C5, 0x6584, 0xF248, + 0x6587, 0xA4E5, 0x658C, 0xD979, 0x6590, 0xB4B4, 0x6591, 0xB4B3, + 0x6592, 0xDDBD, 0x6594, 0xEFD8, 0x6595, 0xC4E3, 0x6596, 0xF7DE, + 0x6597, 0xA4E6, 0x6599, 0xAEC6, 0x659B, 0xB1D8, 0x659C, 0xB1D7, + 0x659D, 0xD97A, 0x659E, 0xD97B, 0x659F, 0xB772, 0x65A0, 0xE1F5, + 0x65A1, 0xBA57, 0x65A2, 0xE9B2, 0x65A4, 0xA4E7, 0x65A5, 0xA5B8, + 0x65A7, 0xA9F2, 0x65A8, 0xCCC2, 0x65AA, 0xCEE9, 0x65AB, 0xAC48, + 0x65AC, 0xB1D9, 0x65AE, 0xD97C, 0x65AF, 0xB4B5, 0x65B0, 0xB773, + 0x65B2, 0xE5C1, 0x65B3, 0xE5C2, 0x65B6, 0xECF0, 0x65B7, 0xC25F, + 0x65B8, 0xF8F0, 0x65B9, 0xA4E8, 0x65BB, 0xCCC3, 0x65BC, 0xA9F3, + 0x65BD, 0xAC49, 0x65BF, 0xCEEA, 0x65C1, 0xAEC7, 0x65C2, 0xD1D2, + 0x65C3, 0xD1D0, 0x65C4, 0xD1D1, 0x65C5, 0xAEC8, 0x65C6, 0xD1CF, + 0x65CB, 0xB1DB, 0x65CC, 0xB1DC, 0x65CD, 0xD5A8, 0x65CE, 0xB1DD, + 0x65CF, 0xB1DA, 0x65D0, 0xD97D, 0x65D2, 0xD97E, 0x65D3, 0xDDBE, + 0x65D6, 0xBA59, 0x65D7, 0xBA58, 0x65DA, 0xECF1, 0x65DB, 0xEFD9, + 0x65DD, 0xF24A, 0x65DE, 0xF249, 0x65DF, 0xF44F, 0x65E1, 0xC95E, + 0x65E2, 0xAC4A, 0x65E5, 0xA4E9, 0x65E6, 0xA5B9, 0x65E8, 0xA6AE, + 0x65E9, 0xA6AD, 0x65EC, 0xA6AF, 0x65ED, 0xA6B0, 0x65EE, 0xC9EE, + 0x65EF, 0xC9ED, 0x65F0, 0xCAF8, 0x65F1, 0xA7F2, 0x65F2, 0xCAFB, + 0x65F3, 0xCAFA, 0x65F4, 0xCAF9, 0x65F5, 0xCAFC, 0x65FA, 0xA9F4, + 0x65FB, 0xCCC9, 0x65FC, 0xCCC5, 0x65FD, 0xCCCE, 0x6600, 0xA9FB, + 0x6602, 0xA9F9, 0x6603, 0xCCCA, 0x6604, 0xCCC6, 0x6605, 0xCCCD, + 0x6606, 0xA9F8, 0x6607, 0xAA40, 0x6608, 0xCCC8, 0x6609, 0xCCC4, + 0x660A, 0xA9FE, 0x660B, 0xCCCB, 0x660C, 0xA9F7, 0x660D, 0xCCCC, + 0x660E, 0xA9FA, 0x660F, 0xA9FC, 0x6610, 0xCCD0, 0x6611, 0xCCCF, + 0x6612, 0xCCC7, 0x6613, 0xA9F6, 0x6614, 0xA9F5, 0x6615, 0xA9FD, + 0x661C, 0xCEEF, 0x661D, 0xCEF5, 0x661F, 0xAC50, 0x6620, 0xAC4D, + 0x6621, 0xCEEC, 0x6622, 0xCEF1, 0x6624, 0xAC53, 0x6625, 0xAC4B, + 0x6626, 0xCEF0, 0x6627, 0xAC4E, 0x6628, 0xAC51, 0x662B, 0xCEF3, + 0x662D, 0xAC4C, 0x662E, 0xCEF8, 0x662F, 0xAC4F, 0x6631, 0xAC52, + 0x6632, 0xCEED, 0x6633, 0xCEF2, 0x6634, 0xCEF6, 0x6635, 0xCEEE, + 0x6636, 0xCEEB, 0x6639, 0xCEF7, 0x663A, 0xCEF4, 0x6641, 0xAED0, + 0x6642, 0xAEC9, 0x6643, 0xAECC, 0x6645, 0xAECF, 0x6647, 0xD1D5, + 0x6649, 0xAECA, 0x664A, 0xD1D3, 0x664C, 0xAECE, 0x664F, 0xAECB, + 0x6651, 0xD1D6, 0x6652, 0xAECD, 0x6659, 0xD5AC, 0x665A, 0xB1DF, + 0x665B, 0xD5AB, 0x665C, 0xD5AD, 0x665D, 0xB1DE, 0x665E, 0xB1E3, + 0x665F, 0xD1D4, 0x6661, 0xD5AA, 0x6662, 0xD5AE, 0x6664, 0xB1E0, + 0x6665, 0xD5A9, 0x6666, 0xB1E2, 0x6668, 0xB1E1, 0x666A, 0xD9A7, + 0x666C, 0xD9A2, 0x666E, 0xB4B6, 0x666F, 0xB4BA, 0x6670, 0xB4B7, + 0x6671, 0xD9A5, 0x6672, 0xD9A8, 0x6674, 0xB4B8, 0x6676, 0xB4B9, + 0x6677, 0xB4BE, 0x6678, 0xDDC7, 0x6679, 0xD9A6, 0x667A, 0xB4BC, + 0x667B, 0xD9A3, 0x667C, 0xD9A1, 0x667E, 0xB4BD, 0x6680, 0xD9A4, + 0x6684, 0xB779, 0x6686, 0xDDBF, 0x6687, 0xB776, 0x6688, 0xB777, + 0x6689, 0xB775, 0x668A, 0xDDC4, 0x668B, 0xDDC3, 0x668C, 0xDDC0, + 0x668D, 0xB77B, 0x6690, 0xDDC2, 0x6691, 0xB4BB, 0x6694, 0xDDC6, + 0x6695, 0xDDC1, 0x6696, 0xB778, 0x6697, 0xB774, 0x6698, 0xB77A, + 0x6699, 0xDDC5, 0x669D, 0xBA5C, 0x669F, 0xE1F8, 0x66A0, 0xE1F7, + 0x66A1, 0xE1F6, 0x66A2, 0xBA5A, 0x66A8, 0xBA5B, 0x66A9, 0xE5C5, + 0x66AA, 0xE5C8, 0x66AB, 0xBCC8, 0x66AE, 0xBCC7, 0x66AF, 0xE5C9, + 0x66B0, 0xE5C4, 0x66B1, 0xBCCA, 0x66B2, 0xE5C6, 0x66B4, 0xBCC9, + 0x66B5, 0xE5C3, 0x66B7, 0xE5C7, 0x66B8, 0xBEE9, 0x66B9, 0xBEE6, + 0x66BA, 0xE9BB, 0x66BB, 0xE9BA, 0x66BD, 0xE9B9, 0x66BE, 0xE9B4, + 0x66C0, 0xE9B5, 0x66C4, 0xBEE7, 0x66C6, 0xBEE4, 0x66C7, 0xBEE8, + 0x66C8, 0xE9B3, 0x66C9, 0xBEE5, 0x66CA, 0xE9B6, 0x66CB, 0xE9B7, + 0x66CC, 0xE9BC, 0x66CF, 0xE9B8, 0x66D2, 0xECF2, 0x66D6, 0xC0C7, + 0x66D8, 0xEFDC, 0x66D9, 0xC0C6, 0x66DA, 0xEFDA, 0x66DB, 0xEFDB, + 0x66DC, 0xC260, 0x66DD, 0xC36E, 0x66DE, 0xF24B, 0x66E0, 0xC36D, + 0x66E3, 0xF451, 0x66E4, 0xF452, 0x66E6, 0xC466, 0x66E8, 0xF450, + 0x66E9, 0xC4E4, 0x66EB, 0xF7DF, 0x66EC, 0xC5CE, 0x66ED, 0xF8AA, + 0x66EE, 0xF8AB, 0x66F0, 0xA4EA, 0x66F2, 0xA6B1, 0x66F3, 0xA6B2, + 0x66F4, 0xA7F3, 0x66F6, 0xCCD1, 0x66F7, 0xAC54, 0x66F8, 0xAED1, + 0x66F9, 0xB1E4, 0x66FC, 0xB0D2, 0x66FE, 0xB4BF, 0x66FF, 0xB4C0, + 0x6700, 0xB3CC, 0x6701, 0xD9A9, 0x6703, 0xB77C, 0x6704, 0xE1FA, + 0x6705, 0xE1F9, 0x6708, 0xA4EB, 0x6709, 0xA6B3, 0x670A, 0xCCD2, + 0x670B, 0xAA42, 0x670D, 0xAA41, 0x670F, 0xCEF9, 0x6710, 0xCEFA, + 0x6712, 0xD1D7, 0x6713, 0xD1D8, 0x6714, 0xAED2, 0x6715, 0xAED3, + 0x6717, 0xAED4, 0x6718, 0xD5AF, 0x671B, 0xB1E6, 0x671D, 0xB4C2, + 0x671F, 0xB4C1, 0x6720, 0xDDC8, 0x6721, 0xDF7A, 0x6722, 0xE1FB, + 0x6723, 0xE9BD, 0x6726, 0xC261, 0x6727, 0xC467, 0x6728, 0xA4EC, + 0x672A, 0xA5BC, 0x672B, 0xA5BD, 0x672C, 0xA5BB, 0x672D, 0xA5BE, + 0x672E, 0xA5BA, 0x6731, 0xA6B6, 0x6733, 0xC9F6, 0x6734, 0xA6B5, + 0x6735, 0xA6B7, 0x6738, 0xC9F1, 0x6739, 0xC9F0, 0x673A, 0xC9F3, + 0x673B, 0xC9F2, 0x673C, 0xC9F5, 0x673D, 0xA6B4, 0x673E, 0xC9EF, + 0x673F, 0xC9F4, 0x6745, 0xCAFD, 0x6746, 0xA7FD, 0x6747, 0xCAFE, + 0x6748, 0xCB43, 0x6749, 0xA7FC, 0x674B, 0xCB47, 0x674C, 0xCB42, + 0x674D, 0xCB45, 0x674E, 0xA7F5, 0x674F, 0xA7F6, 0x6750, 0xA7F7, + 0x6751, 0xA7F8, 0x6753, 0xA840, 0x6755, 0xCB41, 0x6756, 0xA7FA, + 0x6757, 0xA841, 0x6759, 0xCB40, 0x675A, 0xCB46, 0x675C, 0xA7F9, + 0x675D, 0xCB44, 0x675E, 0xA7FB, 0x675F, 0xA7F4, 0x6760, 0xA7FE, + 0x676A, 0xAA57, 0x676C, 0xCCD4, 0x676D, 0xAA43, 0x676F, 0xAA4D, + 0x6770, 0xAA4E, 0x6771, 0xAA46, 0x6772, 0xAA58, 0x6773, 0xAA48, + 0x6774, 0xCCDC, 0x6775, 0xAA53, 0x6776, 0xCCD7, 0x6777, 0xAA49, + 0x6778, 0xCCE6, 0x6779, 0xCCE7, 0x677A, 0xCCDF, 0x677B, 0xCCD8, + 0x677C, 0xAA56, 0x677D, 0xCCE4, 0x677E, 0xAA51, 0x677F, 0xAA4F, + 0x6781, 0xCCE5, 0x6783, 0xCCE3, 0x6784, 0xCCDB, 0x6785, 0xCCD3, + 0x6786, 0xCCDA, 0x6787, 0xAA4A, 0x6789, 0xAA50, 0x678B, 0xAA44, + 0x678C, 0xCCDE, 0x678D, 0xCCDD, 0x678E, 0xCCD5, 0x6790, 0xAA52, + 0x6791, 0xCCE1, 0x6792, 0xCCD6, 0x6793, 0xAA55, 0x6794, 0xCCE8, + 0x6795, 0xAA45, 0x6797, 0xAA4C, 0x6798, 0xCCD9, 0x6799, 0xCCE2, + 0x679A, 0xAA54, 0x679C, 0xAA47, 0x679D, 0xAA4B, 0x679F, 0xCCE0, + 0x67AE, 0xCF5B, 0x67AF, 0xAC5C, 0x67B0, 0xAC69, 0x67B2, 0xCF56, + 0x67B3, 0xCF4C, 0x67B4, 0xAC62, 0x67B5, 0xCF4A, 0x67B6, 0xAC5B, + 0x67B7, 0xCF45, 0x67B8, 0xAC65, 0x67B9, 0xCF52, 0x67BA, 0xCEFE, + 0x67BB, 0xCF41, 0x67C0, 0xCF44, 0x67C1, 0xCEFB, 0x67C2, 0xCF51, + 0x67C3, 0xCF61, 0x67C4, 0xAC60, 0x67C5, 0xCF46, 0x67C6, 0xCF58, + 0x67C8, 0xCEFD, 0x67C9, 0xCF5F, 0x67CA, 0xCF60, 0x67CB, 0xCF63, + 0x67CC, 0xCF5A, 0x67CD, 0xCF4B, 0x67CE, 0xCF53, 0x67CF, 0xAC66, + 0x67D0, 0xAC59, 0x67D1, 0xAC61, 0x67D2, 0xAC6D, 0x67D3, 0xAC56, + 0x67D4, 0xAC58, 0x67D8, 0xCF43, 0x67D9, 0xAC6A, 0x67DA, 0xAC63, + 0x67DB, 0xCF5D, 0x67DC, 0xCF40, 0x67DD, 0xAC6C, 0x67DE, 0xAC67, + 0x67DF, 0xCF49, 0x67E2, 0xAC6B, 0x67E3, 0xCF50, 0x67E4, 0xCF48, + 0x67E5, 0xAC64, 0x67E6, 0xCF5C, 0x67E7, 0xCF54, 0x67E9, 0xAC5E, + 0x67EA, 0xCF62, 0x67EB, 0xCF47, 0x67EC, 0xAC5A, 0x67ED, 0xCF59, + 0x67EE, 0xCF4F, 0x67EF, 0xAC5F, 0x67F0, 0xCF55, 0x67F1, 0xAC57, + 0x67F2, 0xCEFC, 0x67F3, 0xAC68, 0x67F4, 0xAEE3, 0x67F5, 0xAC5D, + 0x67F6, 0xCF4E, 0x67F7, 0xCF4D, 0x67F8, 0xCF42, 0x67FA, 0xCF5E, + 0x67FC, 0xCF57, 0x67FF, 0xAC55, 0x6812, 0xD1EC, 0x6813, 0xAEEA, + 0x6814, 0xD1ED, 0x6816, 0xD1E1, 0x6817, 0xAEDF, 0x6818, 0xAEEB, + 0x681A, 0xD1DA, 0x681C, 0xD1E3, 0x681D, 0xD1EB, 0x681F, 0xD1D9, + 0x6820, 0xD1F4, 0x6821, 0xAED5, 0x6825, 0xD1F3, 0x6826, 0xD1EE, + 0x6828, 0xD1EF, 0x6829, 0xAEDD, 0x682A, 0xAEE8, 0x682B, 0xD1E5, + 0x682D, 0xD1E6, 0x682E, 0xD1F0, 0x682F, 0xD1E7, 0x6831, 0xD1E2, + 0x6832, 0xD1DC, 0x6833, 0xD1DD, 0x6834, 0xD1EA, 0x6835, 0xD1E4, + 0x6838, 0xAED6, 0x6839, 0xAEDA, 0x683A, 0xD1F2, 0x683B, 0xD1DE, + 0x683C, 0xAEE6, 0x683D, 0xAEE2, 0x6840, 0xAEE5, 0x6841, 0xAEEC, + 0x6842, 0xAEDB, 0x6843, 0xAEE7, 0x6844, 0xD1E9, 0x6845, 0xAEE9, + 0x6846, 0xAED8, 0x6848, 0xAED7, 0x6849, 0xD1DB, 0x684B, 0xD1DF, + 0x684C, 0xAEE0, 0x684D, 0xD1F1, 0x684E, 0xD1E8, 0x684F, 0xD1E0, + 0x6850, 0xAEE4, 0x6851, 0xAEE1, 0x6853, 0xAED9, 0x6854, 0xAEDC, + 0x686B, 0xD5C4, 0x686D, 0xD5B4, 0x686E, 0xD5B5, 0x686F, 0xD5B9, + 0x6871, 0xD5C8, 0x6872, 0xD5C5, 0x6874, 0xD5BE, 0x6875, 0xD5BD, + 0x6876, 0xB1ED, 0x6877, 0xD5C1, 0x6878, 0xD5D0, 0x6879, 0xD5B0, + 0x687B, 0xD5D1, 0x687C, 0xD5C3, 0x687D, 0xD5D5, 0x687E, 0xD5C9, + 0x687F, 0xB1EC, 0x6880, 0xD5C7, 0x6881, 0xB1E7, 0x6882, 0xB1FC, + 0x6883, 0xB1F2, 0x6885, 0xB1F6, 0x6886, 0xB1F5, 0x6887, 0xD5B1, + 0x6889, 0xD5CE, 0x688A, 0xD5D4, 0x688B, 0xD5CC, 0x688C, 0xD5D3, + 0x688F, 0xD5C0, 0x6890, 0xD5B2, 0x6891, 0xD5D2, 0x6892, 0xD5C2, + 0x6893, 0xB1EA, 0x6894, 0xB1F7, 0x6896, 0xD5CB, 0x6897, 0xB1F0, + 0x689B, 0xD5CA, 0x689C, 0xD5B3, 0x689D, 0xB1F8, 0x689F, 0xB1FA, + 0x68A0, 0xD5CD, 0x68A1, 0xB1FB, 0x68A2, 0xB1E9, 0x68A3, 0xD5BA, + 0x68A4, 0xD5CF, 0x68A7, 0xB1EF, 0x68A8, 0xB1F9, 0x68A9, 0xD5BC, + 0x68AA, 0xD5C6, 0x68AB, 0xD5B7, 0x68AC, 0xD5BB, 0x68AD, 0xB1F4, + 0x68AE, 0xD5B6, 0x68AF, 0xB1E8, 0x68B0, 0xB1F1, 0x68B1, 0xB1EE, + 0x68B2, 0xD5BF, 0x68B3, 0xAEDE, 0x68B4, 0xD9C0, 0x68B5, 0xB1EB, + 0x68C4, 0xB1F3, 0x68C6, 0xD9C3, 0x68C7, 0xD9D9, 0x68C8, 0xD9CE, + 0x68C9, 0xB4D6, 0x68CB, 0xB4D1, 0x68CC, 0xD9BD, 0x68CD, 0xB4D2, + 0x68CE, 0xD9CD, 0x68D0, 0xD9C6, 0x68D1, 0xD9D3, 0x68D2, 0xB4CE, + 0x68D3, 0xD9AB, 0x68D4, 0xD9D5, 0x68D5, 0xB4C4, 0x68D6, 0xD9B3, + 0x68D7, 0xB4C7, 0x68D8, 0xB4C6, 0x68DA, 0xB4D7, 0x68DC, 0xD9AD, + 0x68DD, 0xD9CF, 0x68DE, 0xD9D0, 0x68DF, 0xB4C9, 0x68E0, 0xB4C5, + 0x68E1, 0xD9BB, 0x68E3, 0xB4D0, 0x68E4, 0xD9B6, 0x68E6, 0xD9D1, + 0x68E7, 0xB4CC, 0x68E8, 0xD9C9, 0x68E9, 0xD9D6, 0x68EA, 0xD9B0, + 0x68EB, 0xD9B5, 0x68EC, 0xD9AF, 0x68EE, 0xB4CB, 0x68EF, 0xD9C2, + 0x68F0, 0xDDDE, 0x68F1, 0xD9B1, 0x68F2, 0xB4CF, 0x68F3, 0xD9BA, + 0x68F4, 0xD9D2, 0x68F5, 0xB4CA, 0x68F6, 0xD9B7, 0x68F7, 0xD9B4, + 0x68F8, 0xD9C5, 0x68F9, 0xB4CD, 0x68FA, 0xB4C3, 0x68FB, 0xB4D9, + 0x68FC, 0xD9C8, 0x68FD, 0xD9C7, 0x6904, 0xD9AC, 0x6905, 0xB4C8, + 0x6906, 0xD9D4, 0x6907, 0xD9BC, 0x6908, 0xD9BE, 0x690A, 0xD9CB, + 0x690B, 0xD9CA, 0x690C, 0xD9AA, 0x690D, 0xB4D3, 0x690E, 0xB4D5, + 0x690F, 0xD9B2, 0x6910, 0xD9B9, 0x6911, 0xD9C1, 0x6912, 0xB4D4, + 0x6913, 0xD9B8, 0x6914, 0xD9C4, 0x6915, 0xD9D7, 0x6917, 0xD9CC, + 0x6925, 0xD9D8, 0x692A, 0xD9AE, 0x692F, 0xDDF2, 0x6930, 0xB7A6, + 0x6932, 0xDDF0, 0x6933, 0xDDDB, 0x6934, 0xDDE0, 0x6935, 0xDDD9, + 0x6937, 0xDDEC, 0x6938, 0xDDCB, 0x6939, 0xDDD2, 0x693B, 0xDDEA, + 0x693C, 0xDDF4, 0x693D, 0xDDDC, 0x693F, 0xDDCF, 0x6940, 0xDDE2, + 0x6941, 0xDDE7, 0x6942, 0xDDD3, 0x6944, 0xDDE4, 0x6945, 0xDDD0, + 0x6948, 0xDDD7, 0x6949, 0xDDD8, 0x694A, 0xB7A8, 0x694B, 0xDDEB, + 0x694C, 0xDDE9, 0x694E, 0xDDCC, 0x694F, 0xDDEE, 0x6951, 0xDDEF, + 0x6952, 0xDDF1, 0x6953, 0xB7AC, 0x6954, 0xB7A4, 0x6956, 0xD5B8, + 0x6957, 0xDDD4, 0x6958, 0xDDE6, 0x6959, 0xDDD5, 0x695A, 0xB7A1, + 0x695B, 0xB7B1, 0x695C, 0xDDED, 0x695D, 0xB7AF, 0x695E, 0xB7AB, + 0x695F, 0xDDCA, 0x6960, 0xB7A3, 0x6962, 0xDDCD, 0x6963, 0xB7B0, + 0x6965, 0xDDDD, 0x6966, 0xDDC9, 0x6968, 0xB7A9, 0x6969, 0xDDE1, + 0x696A, 0xDDD1, 0x696B, 0xB7AA, 0x696C, 0xDDDA, 0x696D, 0xB77E, + 0x696E, 0xB4D8, 0x696F, 0xDDE3, 0x6970, 0xD9BF, 0x6971, 0xDDCE, + 0x6974, 0xDDE8, 0x6975, 0xB7A5, 0x6976, 0xDDE5, 0x6977, 0xB7A2, + 0x6978, 0xDDDF, 0x6979, 0xB7AD, 0x697A, 0xDDD6, 0x697B, 0xDDF3, + 0x6982, 0xB7A7, 0x6983, 0xDEC6, 0x6986, 0xB7AE, 0x698D, 0xE24A, + 0x698E, 0xE248, 0x6990, 0xE25E, 0x6991, 0xE246, 0x6993, 0xE258, + 0x6994, 0xB77D, 0x6995, 0xBA5F, 0x6996, 0xE242, 0x6997, 0xE25D, + 0x6999, 0xE247, 0x699A, 0xE255, 0x699B, 0xBA64, 0x699C, 0xBA5D, + 0x699E, 0xE25B, 0x69A0, 0xE240, 0x69A1, 0xE25A, 0x69A3, 0xBA6F, + 0x69A4, 0xE251, 0x69A5, 0xE261, 0x69A6, 0xBA6D, 0x69A7, 0xE249, + 0x69A8, 0xBA5E, 0x69A9, 0xE24B, 0x69AA, 0xE259, 0x69AB, 0xBA67, + 0x69AC, 0xE244, 0x69AD, 0xBA6B, 0x69AE, 0xBA61, 0x69AF, 0xE24D, + 0x69B0, 0xE243, 0x69B1, 0xE1FC, 0x69B3, 0xE257, 0x69B4, 0xBA68, + 0x69B5, 0xE260, 0x69B6, 0xE1FD, 0x69B7, 0xBA65, 0x69B9, 0xE253, + 0x69BB, 0xBA66, 0x69BC, 0xE245, 0x69BD, 0xE250, 0x69BE, 0xE24C, + 0x69BF, 0xE24E, 0x69C1, 0xBA60, 0x69C2, 0xE25F, 0x69C3, 0xBA6E, + 0x69C4, 0xE24F, 0x69C6, 0xE262, 0x69C9, 0xE1FE, 0x69CA, 0xE254, + 0x69CB, 0xBA63, 0x69CC, 0xBA6C, 0x69CD, 0xBA6A, 0x69CE, 0xE241, + 0x69CF, 0xE256, 0x69D0, 0xBA69, 0x69D3, 0xBA62, 0x69D4, 0xE252, + 0x69D9, 0xE25C, 0x69E2, 0xE5D5, 0x69E4, 0xE5D1, 0x69E5, 0xE5CD, + 0x69E6, 0xE5E1, 0x69E7, 0xE5DE, 0x69E8, 0xBCCD, 0x69EB, 0xE5E5, + 0x69EC, 0xE5D4, 0x69ED, 0xBCD8, 0x69EE, 0xE5DB, 0x69F1, 0xE5D0, + 0x69F2, 0xE5DA, 0x69F3, 0xBCD5, 0x69F4, 0xE5EE, 0x69F6, 0xE5EB, + 0x69F7, 0xE5DD, 0x69F8, 0xE5CE, 0x69FB, 0xE5E2, 0x69FC, 0xE5E4, + 0x69FD, 0xBCD1, 0x69FE, 0xE5D8, 0x69FF, 0xE5D3, 0x6A00, 0xE5CA, + 0x6A01, 0xBCCE, 0x6A02, 0xBCD6, 0x6A04, 0xE5E7, 0x6A05, 0xBCD7, + 0x6A06, 0xE5CB, 0x6A07, 0xE5ED, 0x6A08, 0xE5E0, 0x6A09, 0xE5E6, + 0x6A0A, 0xBCD4, 0x6A0D, 0xE5E3, 0x6A0F, 0xE5EA, 0x6A11, 0xBCD9, + 0x6A13, 0xBCD3, 0x6A14, 0xE5DC, 0x6A15, 0xE5CF, 0x6A16, 0xE5EF, + 0x6A17, 0xE5CC, 0x6A18, 0xE5E8, 0x6A19, 0xBCD0, 0x6A1B, 0xE5D6, + 0x6A1D, 0xE5D7, 0x6A1E, 0xBCCF, 0x6A1F, 0xBCCC, 0x6A20, 0xE5D2, + 0x6A21, 0xBCD2, 0x6A23, 0xBCCB, 0x6A25, 0xE5E9, 0x6A26, 0xE5EC, + 0x6A27, 0xE5D9, 0x6A28, 0xE9CA, 0x6A32, 0xE9C2, 0x6A34, 0xE9BE, + 0x6A35, 0xBEF6, 0x6A38, 0xBEEB, 0x6A39, 0xBEF0, 0x6A3A, 0xBEEC, + 0x6A3B, 0xE9CC, 0x6A3C, 0xE9D7, 0x6A3D, 0xBEEA, 0x6A3E, 0xE9C4, + 0x6A3F, 0xE9CD, 0x6A40, 0xE5DF, 0x6A41, 0xE9CE, 0x6A44, 0xBEF1, + 0x6A46, 0xE9DD, 0x6A47, 0xBEF5, 0x6A48, 0xBEF8, 0x6A49, 0xE9C0, + 0x6A4B, 0xBEF4, 0x6A4D, 0xE9DB, 0x6A4E, 0xE9DC, 0x6A4F, 0xE9D2, + 0x6A50, 0xE9D1, 0x6A51, 0xE9C9, 0x6A54, 0xE9D3, 0x6A55, 0xE9DA, + 0x6A56, 0xE9D9, 0x6A58, 0xBEEF, 0x6A59, 0xBEED, 0x6A5A, 0xE9CB, + 0x6A5B, 0xE9C8, 0x6A5D, 0xE9C5, 0x6A5E, 0xE9D8, 0x6A5F, 0xBEF7, + 0x6A60, 0xE9D6, 0x6A61, 0xBEF3, 0x6A62, 0xBEF2, 0x6A64, 0xE9D0, + 0x6A66, 0xE9BF, 0x6A67, 0xE9C1, 0x6A68, 0xE9C3, 0x6A69, 0xE9D5, + 0x6A6A, 0xE9CF, 0x6A6B, 0xBEEE, 0x6A6D, 0xE9C6, 0x6A6F, 0xE9D4, + 0x6A76, 0xE9C7, 0x6A7E, 0xC0CF, 0x6A7F, 0xED45, 0x6A80, 0xC0C8, + 0x6A81, 0xECF5, 0x6A83, 0xED41, 0x6A84, 0xC0CA, 0x6A85, 0xED48, + 0x6A87, 0xECFC, 0x6A89, 0xECF7, 0x6A8C, 0xED49, 0x6A8D, 0xECF3, + 0x6A8E, 0xECFE, 0x6A90, 0xC0D1, 0x6A91, 0xED44, 0x6A92, 0xED4A, + 0x6A93, 0xECFD, 0x6A94, 0xC0C9, 0x6A95, 0xED40, 0x6A96, 0xECF4, + 0x6A97, 0xC0D0, 0x6A9A, 0xED47, 0x6A9B, 0xECF9, 0x6A9C, 0xC0CC, + 0x6A9E, 0xECFB, 0x6A9F, 0xECF8, 0x6AA0, 0xC0D2, 0x6AA1, 0xECFA, + 0x6AA2, 0xC0CB, 0x6AA3, 0xC0CE, 0x6AA4, 0xED43, 0x6AA5, 0xECF6, + 0x6AA6, 0xED46, 0x6AA8, 0xED42, 0x6AAC, 0xC263, 0x6AAD, 0xEFE7, + 0x6AAE, 0xC268, 0x6AAF, 0xC269, 0x6AB3, 0xC262, 0x6AB4, 0xEFE6, + 0x6AB6, 0xEFE3, 0x6AB7, 0xEFE4, 0x6AB8, 0xC266, 0x6AB9, 0xEFDE, + 0x6ABA, 0xEFE2, 0x6ABB, 0xC265, 0x6ABD, 0xEFDF, 0x6AC2, 0xC267, + 0x6AC3, 0xC264, 0x6AC5, 0xEFDD, 0x6AC6, 0xEFE1, 0x6AC7, 0xEFE5, + 0x6ACB, 0xF251, 0x6ACC, 0xF24E, 0x6ACD, 0xF257, 0x6ACF, 0xF256, + 0x6AD0, 0xF254, 0x6AD1, 0xF24F, 0x6AD3, 0xC372, 0x6AD9, 0xF250, + 0x6ADA, 0xC371, 0x6ADB, 0xC0CD, 0x6ADC, 0xF253, 0x6ADD, 0xC370, + 0x6ADE, 0xF258, 0x6ADF, 0xF252, 0x6AE0, 0xF24D, 0x6AE1, 0xEFE0, + 0x6AE5, 0xC36F, 0x6AE7, 0xF24C, 0x6AE8, 0xF456, 0x6AEA, 0xF455, + 0x6AEB, 0xF255, 0x6AEC, 0xC468, 0x6AEE, 0xF459, 0x6AEF, 0xF45A, + 0x6AF0, 0xF454, 0x6AF1, 0xF458, 0x6AF3, 0xF453, 0x6AF8, 0xF5D1, + 0x6AF9, 0xF457, 0x6AFA, 0xC4E7, 0x6AFB, 0xC4E5, 0x6AFC, 0xF5CF, + 0x6B00, 0xF5D2, 0x6B02, 0xF5CE, 0x6B03, 0xF5D0, 0x6B04, 0xC4E6, + 0x6B08, 0xF6E5, 0x6B09, 0xF6E6, 0x6B0A, 0xC576, 0x6B0B, 0xF6E4, + 0x6B0F, 0xF7E2, 0x6B10, 0xC5CF, 0x6B11, 0xF7E0, 0x6B12, 0xF7E1, + 0x6B13, 0xF8AC, 0x6B16, 0xC656, 0x6B17, 0xF8F3, 0x6B18, 0xF8F1, + 0x6B19, 0xF8F2, 0x6B1A, 0xF8F4, 0x6B1E, 0xF9BB, 0x6B20, 0xA4ED, + 0x6B21, 0xA6B8, 0x6B23, 0xAA59, 0x6B25, 0xCCE9, 0x6B28, 0xCF64, + 0x6B2C, 0xD1F5, 0x6B2D, 0xD1F7, 0x6B2F, 0xD1F6, 0x6B31, 0xD1F8, + 0x6B32, 0xB1FD, 0x6B33, 0xD5D7, 0x6B34, 0xD1F9, 0x6B36, 0xD5D6, + 0x6B37, 0xD5D8, 0x6B38, 0xD5D9, 0x6B39, 0xD9DA, 0x6B3A, 0xB4DB, + 0x6B3B, 0xD9DB, 0x6B3C, 0xD9DD, 0x6B3D, 0xB4DC, 0x6B3E, 0xB4DA, + 0x6B3F, 0xD9DC, 0x6B41, 0xDDFA, 0x6B42, 0xDDF8, 0x6B43, 0xDDF7, + 0x6B45, 0xDDF6, 0x6B46, 0xDDF5, 0x6B47, 0xB7B2, 0x6B48, 0xDDF9, + 0x6B49, 0xBA70, 0x6B4A, 0xE263, 0x6B4B, 0xE265, 0x6B4C, 0xBA71, + 0x6B4D, 0xE264, 0x6B4E, 0xBCDB, 0x6B50, 0xBCDA, 0x6B51, 0xE5F0, + 0x6B54, 0xE9DF, 0x6B55, 0xE9DE, 0x6B56, 0xE9E0, 0x6B59, 0xBEF9, + 0x6B5B, 0xED4B, 0x6B5C, 0xC0D3, 0x6B5E, 0xEFE8, 0x6B5F, 0xC26A, + 0x6B60, 0xF259, 0x6B61, 0xC577, 0x6B62, 0xA4EE, 0x6B63, 0xA5BF, + 0x6B64, 0xA6B9, 0x6B65, 0xA842, 0x6B66, 0xAA5A, 0x6B67, 0xAA5B, + 0x6B6A, 0xAC6E, 0x6B6D, 0xD1FA, 0x6B72, 0xB7B3, 0x6B76, 0xE6D1, + 0x6B77, 0xBEFA, 0x6B78, 0xC26B, 0x6B79, 0xA4EF, 0x6B7B, 0xA6BA, + 0x6B7E, 0xCCEB, 0x6B7F, 0xAA5C, 0x6B80, 0xCCEA, 0x6B82, 0xCF65, + 0x6B83, 0xAC6F, 0x6B84, 0xCF66, 0x6B86, 0xAC70, 0x6B88, 0xD1FC, + 0x6B89, 0xAEEE, 0x6B8A, 0xAEED, 0x6B8C, 0xD5DE, 0x6B8D, 0xD5DC, + 0x6B8E, 0xD5DD, 0x6B8F, 0xD5DB, 0x6B91, 0xD5DA, 0x6B94, 0xD9DE, + 0x6B95, 0xD9E1, 0x6B96, 0xB4DE, 0x6B97, 0xD9DF, 0x6B98, 0xB4DD, + 0x6B99, 0xD9E0, 0x6B9B, 0xDDFB, 0x6B9E, 0xE266, 0x6B9F, 0xE267, + 0x6BA0, 0xE268, 0x6BA2, 0xE5F3, 0x6BA3, 0xE5F2, 0x6BA4, 0xBCDC, + 0x6BA5, 0xE5F1, 0x6BA6, 0xE5F4, 0x6BA7, 0xE9E1, 0x6BAA, 0xE9E2, + 0x6BAB, 0xE9E3, 0x6BAD, 0xED4C, 0x6BAE, 0xC0D4, 0x6BAF, 0xC26C, + 0x6BB0, 0xF25A, 0x6BB2, 0xC4E8, 0x6BB3, 0xC95F, 0x6BB5, 0xAC71, + 0x6BB6, 0xCF67, 0x6BB7, 0xAEEF, 0x6BBA, 0xB1FE, 0x6BBC, 0xB4DF, + 0x6BBD, 0xD9E2, 0x6BBF, 0xB7B5, 0x6BC0, 0xB7B4, 0x6BC3, 0xE269, + 0x6BC4, 0xE26A, 0x6BC5, 0xBCDD, 0x6BC6, 0xBCDE, 0x6BC7, 0xE9E5, + 0x6BC8, 0xE9E4, 0x6BC9, 0xEFE9, 0x6BCA, 0xF7E3, 0x6BCB, 0xA4F0, + 0x6BCC, 0xC960, 0x6BCD, 0xA5C0, 0x6BCF, 0xA843, 0x6BD0, 0xCB48, + 0x6BD2, 0xAC72, 0x6BD3, 0xB7B6, 0x6BD4, 0xA4F1, 0x6BD6, 0xCF68, + 0x6BD7, 0xAC73, 0x6BD8, 0xCF69, 0x6BDA, 0xC0D5, 0x6BDB, 0xA4F2, + 0x6BDE, 0xCCEC, 0x6BE0, 0xCF6A, 0x6BE2, 0xD242, 0x6BE3, 0xD241, + 0x6BE4, 0xD1FE, 0x6BE6, 0xD1FD, 0x6BE7, 0xD243, 0x6BE8, 0xD240, + 0x6BEB, 0xB240, 0x6BEC, 0xB241, 0x6BEF, 0xB4E0, 0x6BF0, 0xD9E3, + 0x6BF2, 0xD9E4, 0x6BF3, 0xD9E5, 0x6BF7, 0xDE41, 0x6BF8, 0xDE42, + 0x6BF9, 0xDE40, 0x6BFB, 0xDDFD, 0x6BFC, 0xDDFE, 0x6BFD, 0xB7B7, + 0x6BFE, 0xE26B, 0x6BFF, 0xE5F7, 0x6C00, 0xE5F6, 0x6C01, 0xE5F5, + 0x6C02, 0xE5F8, 0x6C03, 0xE9E7, 0x6C04, 0xE9E6, 0x6C05, 0xBEFB, + 0x6C06, 0xE9E8, 0x6C08, 0xC0D6, 0x6C09, 0xED4D, 0x6C0B, 0xEFEA, + 0x6C0C, 0xF25B, 0x6C0D, 0xF6E7, 0x6C0F, 0xA4F3, 0x6C10, 0xA5C2, + 0x6C11, 0xA5C1, 0x6C13, 0xAA5D, 0x6C14, 0xC961, 0x6C15, 0xC97E, + 0x6C16, 0xA6BB, 0x6C18, 0xC9F7, 0x6C19, 0xCB49, 0x6C1A, 0xCB4A, + 0x6C1B, 0xAA5E, 0x6C1D, 0xCCED, 0x6C1F, 0xAC74, 0x6C20, 0xCF6B, + 0x6C21, 0xCF6C, 0x6C23, 0xAEF0, 0x6C24, 0xAEF4, 0x6C25, 0xD244, + 0x6C26, 0xAEF3, 0x6C27, 0xAEF1, 0x6C28, 0xAEF2, 0x6C2A, 0xD5DF, + 0x6C2B, 0xB242, 0x6C2C, 0xB4E3, 0x6C2E, 0xB4E1, 0x6C2F, 0xB4E2, + 0x6C30, 0xD9E6, 0x6C33, 0xBA72, 0x6C34, 0xA4F4, 0x6C36, 0xC9A1, + 0x6C38, 0xA5C3, 0x6C3B, 0xC9A4, 0x6C3E, 0xA5C6, 0x6C3F, 0xC9A3, + 0x6C40, 0xA5C5, 0x6C41, 0xA5C4, 0x6C42, 0xA844, 0x6C43, 0xC9A2, + 0x6C46, 0xC9F8, 0x6C4A, 0xC9FC, 0x6C4B, 0xC9FE, 0x6C4C, 0xCA40, + 0x6C4D, 0xA6C5, 0x6C4E, 0xA6C6, 0x6C4F, 0xC9FB, 0x6C50, 0xA6C1, + 0x6C52, 0xC9F9, 0x6C54, 0xC9FD, 0x6C55, 0xA6C2, 0x6C57, 0xA6BD, + 0x6C59, 0xA6BE, 0x6C5B, 0xA6C4, 0x6C5C, 0xC9FA, 0x6C5D, 0xA6BC, + 0x6C5E, 0xA845, 0x6C5F, 0xA6BF, 0x6C60, 0xA6C0, 0x6C61, 0xA6C3, + 0x6C65, 0xCB5B, 0x6C66, 0xCB59, 0x6C67, 0xCB4C, 0x6C68, 0xA851, + 0x6C69, 0xCB53, 0x6C6A, 0xA84C, 0x6C6B, 0xCB4D, 0x6C6D, 0xCB55, + 0x6C6F, 0xCB52, 0x6C70, 0xA84F, 0x6C71, 0xCB51, 0x6C72, 0xA856, + 0x6C73, 0xCB5A, 0x6C74, 0xA858, 0x6C76, 0xA85A, 0x6C78, 0xCB4B, + 0x6C7A, 0xA84D, 0x6C7B, 0xCB5C, 0x6C7D, 0xA854, 0x6C7E, 0xA857, + 0x6C80, 0xCD45, 0x6C81, 0xA847, 0x6C82, 0xA85E, 0x6C83, 0xA855, + 0x6C84, 0xCB4E, 0x6C85, 0xA84A, 0x6C86, 0xA859, 0x6C87, 0xCB56, + 0x6C88, 0xA848, 0x6C89, 0xA849, 0x6C8A, 0xCD43, 0x6C8B, 0xCB4F, + 0x6C8C, 0xA850, 0x6C8D, 0xA85B, 0x6C8E, 0xCB5D, 0x6C8F, 0xCB50, + 0x6C90, 0xA84E, 0x6C92, 0xA853, 0x6C93, 0xCCEE, 0x6C94, 0xA85C, + 0x6C95, 0xCB57, 0x6C96, 0xA852, 0x6C98, 0xA85D, 0x6C99, 0xA846, + 0x6C9A, 0xCB54, 0x6C9B, 0xA84B, 0x6C9C, 0xCB58, 0x6C9D, 0xCD44, + 0x6CAB, 0xAA6A, 0x6CAC, 0xAA7A, 0x6CAD, 0xCCF5, 0x6CAE, 0xAA71, + 0x6CB0, 0xCD4B, 0x6CB1, 0xAA62, 0x6CB3, 0xAA65, 0x6CB4, 0xCD42, + 0x6CB6, 0xCCF3, 0x6CB7, 0xCCF7, 0x6CB8, 0xAA6D, 0x6CB9, 0xAA6F, + 0x6CBA, 0xCCFA, 0x6CBB, 0xAA76, 0x6CBC, 0xAA68, 0x6CBD, 0xAA66, + 0x6CBE, 0xAA67, 0x6CBF, 0xAA75, 0x6CC0, 0xCD47, 0x6CC1, 0xAA70, + 0x6CC2, 0xCCF9, 0x6CC3, 0xCCFB, 0x6CC4, 0xAA6E, 0x6CC5, 0xAA73, + 0x6CC6, 0xCCFC, 0x6CC7, 0xCD4A, 0x6CC9, 0xAC75, 0x6CCA, 0xAA79, + 0x6CCC, 0xAA63, 0x6CCD, 0xCD49, 0x6CCF, 0xCD4D, 0x6CD0, 0xCCF8, + 0x6CD1, 0xCD4F, 0x6CD2, 0xCD40, 0x6CD3, 0xAA6C, 0x6CD4, 0xCCF4, + 0x6CD5, 0xAA6B, 0x6CD6, 0xAA7D, 0x6CD7, 0xAA72, 0x6CD9, 0xCCF2, + 0x6CDA, 0xCF75, 0x6CDB, 0xAA78, 0x6CDC, 0xAA7C, 0x6CDD, 0xCD41, + 0x6CDE, 0xCD46, 0x6CE0, 0xAA7E, 0x6CE1, 0xAA77, 0x6CE2, 0xAA69, + 0x6CE3, 0xAA5F, 0x6CE5, 0xAA64, 0x6CE7, 0xCCF6, 0x6CE8, 0xAA60, + 0x6CE9, 0xCD4E, 0x6CEB, 0xCCF0, 0x6CEC, 0xCCEF, 0x6CED, 0xCCFD, + 0x6CEE, 0xCCF1, 0x6CEF, 0xAA7B, 0x6CF0, 0xAEF5, 0x6CF1, 0xAA74, + 0x6CF2, 0xCCFE, 0x6CF3, 0xAA61, 0x6CF5, 0xACA6, 0x6CF9, 0xCD4C, + 0x6D00, 0xCF7C, 0x6D01, 0xCFA1, 0x6D03, 0xCFA4, 0x6D04, 0xCF77, + 0x6D07, 0xCFA7, 0x6D08, 0xCFAA, 0x6D09, 0xCFAC, 0x6D0A, 0xCF74, + 0x6D0B, 0xAC76, 0x6D0C, 0xAC7B, 0x6D0D, 0xD249, 0x6D0E, 0xACAD, + 0x6D0F, 0xCFA5, 0x6D10, 0xCFAD, 0x6D11, 0xCF7B, 0x6D12, 0xCF73, + 0x6D16, 0xD264, 0x6D17, 0xAC7E, 0x6D18, 0xCFA2, 0x6D19, 0xCF78, + 0x6D1A, 0xCF7A, 0x6D1B, 0xACA5, 0x6D1D, 0xCF7D, 0x6D1E, 0xAC7D, + 0x6D1F, 0xCF70, 0x6D20, 0xCFA8, 0x6D22, 0xCFAB, 0x6D25, 0xAC7A, + 0x6D27, 0xACA8, 0x6D28, 0xCF6D, 0x6D29, 0xACAA, 0x6D2A, 0xAC78, + 0x6D2B, 0xACAE, 0x6D2C, 0xCFA9, 0x6D2D, 0xCF6F, 0x6D2E, 0xACAB, + 0x6D2F, 0xD25E, 0x6D30, 0xCD48, 0x6D31, 0xAC7C, 0x6D32, 0xAC77, + 0x6D33, 0xCF76, 0x6D34, 0xCF6E, 0x6D35, 0xACAC, 0x6D36, 0xACA4, + 0x6D37, 0xCFA3, 0x6D38, 0xACA9, 0x6D39, 0xACA7, 0x6D3A, 0xCF79, + 0x6D3B, 0xACA1, 0x6D3C, 0xCF71, 0x6D3D, 0xACA2, 0x6D3E, 0xACA3, + 0x6D3F, 0xCF72, 0x6D40, 0xCFA6, 0x6D41, 0xAC79, 0x6D42, 0xCF7E, + 0x6D58, 0xD24C, 0x6D59, 0xAEFD, 0x6D5A, 0xAF43, 0x6D5E, 0xD255, + 0x6D5F, 0xD25B, 0x6D60, 0xD257, 0x6D61, 0xD24A, 0x6D62, 0xD24D, + 0x6D63, 0xD246, 0x6D64, 0xD247, 0x6D65, 0xAF4A, 0x6D66, 0xAEFA, + 0x6D67, 0xD256, 0x6D68, 0xD25F, 0x6D69, 0xAF45, 0x6D6A, 0xAEF6, + 0x6D6C, 0xAF40, 0x6D6D, 0xD24E, 0x6D6E, 0xAF42, 0x6D6F, 0xD24F, + 0x6D70, 0xD259, 0x6D74, 0xAF44, 0x6D75, 0xD268, 0x6D76, 0xD248, + 0x6D77, 0xAEFC, 0x6D78, 0xAEFB, 0x6D79, 0xAF48, 0x6D7A, 0xD245, + 0x6D7B, 0xD266, 0x6D7C, 0xD25A, 0x6D7D, 0xD267, 0x6D7E, 0xD261, + 0x6D7F, 0xD253, 0x6D80, 0xD262, 0x6D82, 0xD25C, 0x6D83, 0xD265, + 0x6D84, 0xD263, 0x6D85, 0xAF49, 0x6D86, 0xD254, 0x6D87, 0xAEF9, + 0x6D88, 0xAEF8, 0x6D89, 0xAF41, 0x6D8A, 0xAF47, 0x6D8B, 0xD260, + 0x6D8C, 0xAF46, 0x6D8D, 0xD251, 0x6D8E, 0xB243, 0x6D90, 0xD269, + 0x6D91, 0xD250, 0x6D92, 0xD24B, 0x6D93, 0xAEFE, 0x6D94, 0xAF4B, + 0x6D95, 0xAEF7, 0x6D97, 0xD258, 0x6D98, 0xD25D, 0x6DAA, 0xB265, + 0x6DAB, 0xD5E1, 0x6DAC, 0xD5E5, 0x6DAE, 0xB252, 0x6DAF, 0xB250, + 0x6DB2, 0xB247, 0x6DB3, 0xD5E3, 0x6DB4, 0xD5E2, 0x6DB5, 0xB25B, + 0x6DB7, 0xD5E8, 0x6DB8, 0xB255, 0x6DBA, 0xD5FA, 0x6DBB, 0xD647, + 0x6DBC, 0xB244, 0x6DBD, 0xD5F7, 0x6DBE, 0xD5F0, 0x6DBF, 0xB267, + 0x6DC0, 0xD5E0, 0x6DC2, 0xD5FC, 0x6DC4, 0xB264, 0x6DC5, 0xB258, + 0x6DC6, 0xB263, 0x6DC7, 0xB24E, 0x6DC8, 0xD5EC, 0x6DC9, 0xD5FE, + 0x6DCA, 0xD5F6, 0x6DCB, 0xB24F, 0x6DCC, 0xB249, 0x6DCD, 0xD645, + 0x6DCF, 0xD5FD, 0x6DD0, 0xD640, 0x6DD1, 0xB251, 0x6DD2, 0xB259, + 0x6DD3, 0xD642, 0x6DD4, 0xD5EA, 0x6DD5, 0xD5FB, 0x6DD6, 0xD5EF, + 0x6DD7, 0xD644, 0x6DD8, 0xB25E, 0x6DD9, 0xB246, 0x6DDA, 0xB25C, + 0x6DDB, 0xD5F4, 0x6DDC, 0xD5F2, 0x6DDD, 0xD5F3, 0x6DDE, 0xB253, + 0x6DDF, 0xD5EE, 0x6DE0, 0xD5ED, 0x6DE1, 0xB248, 0x6DE2, 0xD5E7, + 0x6DE3, 0xD646, 0x6DE4, 0xB24A, 0x6DE5, 0xD5F1, 0x6DE6, 0xB268, + 0x6DE8, 0xB262, 0x6DE9, 0xD5E6, 0x6DEA, 0xB25F, 0x6DEB, 0xB25D, + 0x6DEC, 0xB266, 0x6DED, 0xD5F8, 0x6DEE, 0xB261, 0x6DEF, 0xD252, + 0x6DF0, 0xD5F9, 0x6DF1, 0xB260, 0x6DF2, 0xD641, 0x6DF3, 0xB245, + 0x6DF4, 0xD5F5, 0x6DF5, 0xB257, 0x6DF6, 0xD5E9, 0x6DF7, 0xB256, + 0x6DF9, 0xB254, 0x6DFA, 0xB24C, 0x6DFB, 0xB24B, 0x6DFC, 0xD9E7, + 0x6DFD, 0xD643, 0x6E00, 0xD5EB, 0x6E03, 0xD9FC, 0x6E05, 0xB24D, + 0x6E19, 0xB541, 0x6E1A, 0xB25A, 0x6E1B, 0xB4EE, 0x6E1C, 0xD9F6, + 0x6E1D, 0xB4FC, 0x6E1F, 0xD9EA, 0x6E20, 0xB4EB, 0x6E21, 0xB4E7, + 0x6E22, 0xDA49, 0x6E23, 0xB4ED, 0x6E24, 0xB4F1, 0x6E25, 0xB4EC, + 0x6E26, 0xB4F5, 0x6E27, 0xDA4D, 0x6E28, 0xDA44, 0x6E2B, 0xD9F1, + 0x6E2C, 0xB4FA, 0x6E2D, 0xB4F4, 0x6E2E, 0xD9FD, 0x6E2F, 0xB4E4, + 0x6E30, 0xDA4A, 0x6E31, 0xDA43, 0x6E32, 0xB4E8, 0x6E33, 0xD9F7, + 0x6E34, 0xB4F7, 0x6E35, 0xDA55, 0x6E36, 0xDA56, 0x6E38, 0xB4E5, + 0x6E39, 0xDA48, 0x6E3A, 0xB4F9, 0x6E3B, 0xD9FB, 0x6E3C, 0xD9ED, + 0x6E3D, 0xD9EE, 0x6E3E, 0xB4FD, 0x6E3F, 0xD9F2, 0x6E40, 0xD9F9, + 0x6E41, 0xD9F3, 0x6E43, 0xB4FB, 0x6E44, 0xB544, 0x6E45, 0xD9EF, + 0x6E46, 0xD9E8, 0x6E47, 0xD9E9, 0x6E49, 0xD9EB, 0x6E4A, 0xB4EA, + 0x6E4B, 0xD9F8, 0x6E4D, 0xB4F8, 0x6E4E, 0xB542, 0x6E51, 0xD9FA, + 0x6E52, 0xDA53, 0x6E53, 0xDA4B, 0x6E54, 0xB4E6, 0x6E55, 0xDA51, + 0x6E56, 0xB4F2, 0x6E58, 0xB4F0, 0x6E5A, 0xDA57, 0x6E5B, 0xB4EF, + 0x6E5C, 0xDA41, 0x6E5D, 0xD9F4, 0x6E5E, 0xD9FE, 0x6E5F, 0xB547, + 0x6E60, 0xDA45, 0x6E61, 0xDA42, 0x6E62, 0xD9F0, 0x6E63, 0xB543, + 0x6E64, 0xDA4F, 0x6E65, 0xDA4C, 0x6E66, 0xDA54, 0x6E67, 0xB4E9, + 0x6E68, 0xDA40, 0x6E69, 0xB546, 0x6E6B, 0xDA47, 0x6E6E, 0xB4F3, + 0x6E6F, 0xB4F6, 0x6E71, 0xDA46, 0x6E72, 0xB545, 0x6E73, 0xD9F5, + 0x6E74, 0xD5E4, 0x6E77, 0xDA50, 0x6E78, 0xDA4E, 0x6E79, 0xDA52, + 0x6E88, 0xD9EC, 0x6E89, 0xB540, 0x6E8D, 0xDE61, 0x6E8E, 0xDE60, + 0x6E8F, 0xDE46, 0x6E90, 0xB7BD, 0x6E92, 0xDE5F, 0x6E93, 0xDE49, + 0x6E94, 0xDE4A, 0x6E96, 0xB7C7, 0x6E97, 0xDE68, 0x6E98, 0xB7C2, + 0x6E99, 0xDE5E, 0x6E9B, 0xDE43, 0x6E9C, 0xB7C8, 0x6E9D, 0xB7BE, + 0x6E9E, 0xDE52, 0x6E9F, 0xDE48, 0x6EA0, 0xDE4B, 0x6EA1, 0xDE63, + 0x6EA2, 0xB7B8, 0x6EA3, 0xDE6A, 0x6EA4, 0xDE62, 0x6EA5, 0xB7C1, + 0x6EA6, 0xDE57, 0x6EA7, 0xB7CC, 0x6EAA, 0xB7CB, 0x6EAB, 0xB7C5, + 0x6EAE, 0xDE69, 0x6EAF, 0xB7B9, 0x6EB0, 0xDE55, 0x6EB1, 0xDE4C, + 0x6EB2, 0xDE59, 0x6EB3, 0xDE65, 0x6EB4, 0xB7CD, 0x6EB6, 0xB7BB, + 0x6EB7, 0xDE54, 0x6EB9, 0xDE4D, 0x6EBA, 0xB7C4, 0x6EBC, 0xB7C3, + 0x6EBD, 0xDE50, 0x6EBE, 0xDE5A, 0x6EBF, 0xDE64, 0x6EC0, 0xDE47, + 0x6EC1, 0xDE51, 0x6EC2, 0xB7BC, 0x6EC3, 0xDE5B, 0x6EC4, 0xB7C9, + 0x6EC5, 0xB7C0, 0x6EC6, 0xDE4E, 0x6EC7, 0xB7BF, 0x6EC8, 0xDE45, + 0x6EC9, 0xDE53, 0x6ECA, 0xDE67, 0x6ECB, 0xB4FE, 0x6ECC, 0xBAB0, + 0x6ECD, 0xDE56, 0x6ECE, 0xE26C, 0x6ECF, 0xDE58, 0x6ED0, 0xDE66, + 0x6ED1, 0xB7C6, 0x6ED2, 0xDE4F, 0x6ED3, 0xB7BA, 0x6ED4, 0xB7CA, + 0x6ED5, 0xBCF0, 0x6ED6, 0xDE44, 0x6ED8, 0xDE5D, 0x6EDC, 0xDE5C, + 0x6EEB, 0xE2AA, 0x6EEC, 0xBAAD, 0x6EED, 0xE27D, 0x6EEE, 0xE2A4, + 0x6EEF, 0xBAA2, 0x6EF1, 0xE26E, 0x6EF2, 0xBAAF, 0x6EF4, 0xBA77, + 0x6EF5, 0xE26D, 0x6EF6, 0xE2B0, 0x6EF7, 0xBAB1, 0x6EF8, 0xE271, + 0x6EF9, 0xE2A3, 0x6EFB, 0xE273, 0x6EFC, 0xE2B3, 0x6EFD, 0xE2AF, + 0x6EFE, 0xBA75, 0x6EFF, 0xBAA1, 0x6F00, 0xE653, 0x6F01, 0xBAAE, + 0x6F02, 0xBA7D, 0x6F03, 0xE26F, 0x6F05, 0xE2AE, 0x6F06, 0xBAA3, + 0x6F07, 0xE2AB, 0x6F08, 0xE2B8, 0x6F09, 0xE275, 0x6F0A, 0xE27E, + 0x6F0D, 0xE2B6, 0x6F0E, 0xE2AC, 0x6F0F, 0xBA7C, 0x6F12, 0xE27C, + 0x6F13, 0xBA76, 0x6F14, 0xBA74, 0x6F15, 0xBAA8, 0x6F18, 0xE27A, + 0x6F19, 0xE277, 0x6F1A, 0xE278, 0x6F1C, 0xE2B2, 0x6F1E, 0xE2B7, + 0x6F1F, 0xE2B5, 0x6F20, 0xBA7A, 0x6F21, 0xE2B9, 0x6F22, 0xBA7E, + 0x6F23, 0xBAA7, 0x6F25, 0xE270, 0x6F26, 0xE5FA, 0x6F27, 0xE279, + 0x6F29, 0xBA78, 0x6F2A, 0xBAAC, 0x6F2B, 0xBAA9, 0x6F2C, 0xBA7B, + 0x6F2D, 0xE2A5, 0x6F2E, 0xE274, 0x6F2F, 0xBAAA, 0x6F30, 0xE2A7, + 0x6F31, 0xBAA4, 0x6F32, 0xBAA6, 0x6F33, 0xBA73, 0x6F35, 0xE2A9, + 0x6F36, 0xE2A1, 0x6F37, 0xE272, 0x6F38, 0xBAA5, 0x6F39, 0xE2B1, + 0x6F3A, 0xE2B4, 0x6F3B, 0xE27B, 0x6F3C, 0xE2A8, 0x6F3E, 0xBA79, + 0x6F3F, 0xBCDF, 0x6F40, 0xE2A6, 0x6F41, 0xE5F9, 0x6F43, 0xE2AD, + 0x6F4E, 0xE276, 0x6F4F, 0xE644, 0x6F50, 0xE64E, 0x6F51, 0xBCE2, + 0x6F52, 0xE64D, 0x6F53, 0xE659, 0x6F54, 0xBCE4, 0x6F55, 0xE64B, + 0x6F57, 0xE64F, 0x6F58, 0xBCEF, 0x6F5A, 0xE646, 0x6F5B, 0xBCE7, + 0x6F5D, 0xE652, 0x6F5E, 0xE9F0, 0x6F5F, 0xBCF3, 0x6F60, 0xBCF2, + 0x6F61, 0xE654, 0x6F62, 0xE643, 0x6F63, 0xE65E, 0x6F64, 0xBCED, + 0x6F66, 0xBCE3, 0x6F67, 0xE657, 0x6F69, 0xE65B, 0x6F6A, 0xE660, + 0x6F6B, 0xE655, 0x6F6C, 0xE649, 0x6F6D, 0xBCE6, 0x6F6E, 0xBCE9, + 0x6F6F, 0xBCF1, 0x6F70, 0xBCEC, 0x6F72, 0xE64C, 0x6F73, 0xE2A2, + 0x6F76, 0xE648, 0x6F77, 0xE65F, 0x6F78, 0xBCE8, 0x6F7A, 0xBCEB, + 0x6F7B, 0xE661, 0x6F7C, 0xBCE0, 0x6F7D, 0xE656, 0x6F7E, 0xE5FB, + 0x6F7F, 0xE65C, 0x6F80, 0xC0DF, 0x6F82, 0xE64A, 0x6F84, 0xBCE1, + 0x6F85, 0xE645, 0x6F86, 0xBCE5, 0x6F87, 0xE5FC, 0x6F88, 0xBAAB, + 0x6F89, 0xE641, 0x6F8B, 0xE65A, 0x6F8C, 0xE642, 0x6F8D, 0xE640, + 0x6F8E, 0xBCEA, 0x6F90, 0xE658, 0x6F92, 0xE5FE, 0x6F93, 0xE651, + 0x6F94, 0xE650, 0x6F95, 0xE65D, 0x6F96, 0xE647, 0x6F97, 0xBCEE, + 0x6F9E, 0xE9F3, 0x6FA0, 0xBF49, 0x6FA1, 0xBEFE, 0x6FA2, 0xEA40, + 0x6FA3, 0xE9EB, 0x6FA4, 0xBF41, 0x6FA5, 0xE9F7, 0x6FA6, 0xBF48, + 0x6FA7, 0xBF43, 0x6FA8, 0xE9F5, 0x6FA9, 0xED4F, 0x6FAA, 0xE9FB, + 0x6FAB, 0xEA42, 0x6FAC, 0xE9FA, 0x6FAD, 0xE9E9, 0x6FAE, 0xE9F8, + 0x6FAF, 0xEA44, 0x6FB0, 0xEA46, 0x6FB1, 0xBEFD, 0x6FB2, 0xEA45, + 0x6FB3, 0xBF44, 0x6FB4, 0xBF4A, 0x6FB6, 0xBF47, 0x6FB8, 0xE9FE, + 0x6FB9, 0xBF46, 0x6FBA, 0xE9F9, 0x6FBC, 0xE9ED, 0x6FBD, 0xE9F2, + 0x6FBF, 0xE9FD, 0x6FC0, 0xBF45, 0x6FC1, 0xBF42, 0x6FC2, 0xBEFC, + 0x6FC3, 0xBF40, 0x6FC4, 0xE9F1, 0x6FC6, 0xE5FD, 0x6FC7, 0xE9EC, + 0x6FC8, 0xE9EF, 0x6FC9, 0xEA41, 0x6FCA, 0xE9F4, 0x6FCB, 0xE9EA, + 0x6FCC, 0xED4E, 0x6FCD, 0xEA43, 0x6FCE, 0xE9EE, 0x6FCF, 0xE9FC, + 0x6FD4, 0xED51, 0x6FD5, 0xC0E3, 0x6FD8, 0xC0D7, 0x6FDB, 0xC0DB, + 0x6FDC, 0xED53, 0x6FDD, 0xED59, 0x6FDE, 0xED57, 0x6FDF, 0xC0D9, + 0x6FE0, 0xC0DA, 0x6FE1, 0xC0E1, 0x6FE2, 0xED5A, 0x6FE3, 0xED52, + 0x6FE4, 0xC0DC, 0x6FE6, 0xED56, 0x6FE7, 0xED55, 0x6FE8, 0xED5B, + 0x6FE9, 0xC0E2, 0x6FEB, 0xC0DD, 0x6FEC, 0xC0E0, 0x6FED, 0xED54, + 0x6FEE, 0xC0E4, 0x6FEF, 0xC0DE, 0x6FF0, 0xC0E5, 0x6FF1, 0xC0D8, + 0x6FF2, 0xED58, 0x6FF4, 0xED50, 0x6FF7, 0xEFF7, 0x6FFA, 0xC271, + 0x6FFB, 0xEFF4, 0x6FFC, 0xEFF6, 0x6FFE, 0xC26F, 0x6FFF, 0xEFF2, + 0x7000, 0xEFF3, 0x7001, 0xEFEE, 0x7004, 0xE9F6, 0x7005, 0xEFEF, + 0x7006, 0xC270, 0x7007, 0xEFEB, 0x7009, 0xC26D, 0x700A, 0xEFF8, + 0x700B, 0xC26E, 0x700C, 0xEFEC, 0x700D, 0xEFED, 0x700E, 0xEFF1, + 0x700F, 0xC273, 0x7011, 0xC272, 0x7014, 0xEFF0, 0x7015, 0xC378, + 0x7016, 0xF25F, 0x7017, 0xF265, 0x7018, 0xC379, 0x7019, 0xF25C, + 0x701A, 0xC376, 0x701B, 0xC373, 0x701C, 0xF267, 0x701D, 0xC377, + 0x701F, 0xC374, 0x7020, 0xF25E, 0x7021, 0xF261, 0x7022, 0xF262, + 0x7023, 0xF263, 0x7024, 0xF266, 0x7026, 0xEFF5, 0x7027, 0xF25D, + 0x7028, 0xC375, 0x7029, 0xF264, 0x702A, 0xF268, 0x702B, 0xF260, + 0x702F, 0xF45D, 0x7030, 0xC46A, 0x7031, 0xF460, 0x7032, 0xC46B, + 0x7033, 0xF468, 0x7034, 0xF45F, 0x7035, 0xF45C, 0x7037, 0xF45E, + 0x7038, 0xF462, 0x7039, 0xF465, 0x703A, 0xF464, 0x703B, 0xF467, + 0x703C, 0xF45B, 0x703E, 0xC469, 0x703F, 0xF463, 0x7040, 0xF466, + 0x7041, 0xF469, 0x7042, 0xF461, 0x7043, 0xF5D3, 0x7044, 0xF5D4, + 0x7045, 0xF5D8, 0x7046, 0xF5D9, 0x7048, 0xF5D6, 0x7049, 0xF5D7, + 0x704A, 0xF5D5, 0x704C, 0xC4E9, 0x7051, 0xC578, 0x7052, 0xF6EB, + 0x7055, 0xF6E8, 0x7056, 0xF6E9, 0x7057, 0xF6EA, 0x7058, 0xC579, + 0x705A, 0xF7E5, 0x705B, 0xF7E4, 0x705D, 0xF8AF, 0x705E, 0xC5F4, + 0x705F, 0xF8AD, 0x7060, 0xF8B0, 0x7061, 0xF8AE, 0x7062, 0xF8F5, + 0x7063, 0xC657, 0x7064, 0xC665, 0x7065, 0xF9A3, 0x7066, 0xF96C, + 0x7068, 0xF9A2, 0x7069, 0xF9D0, 0x706A, 0xF9D1, 0x706B, 0xA4F5, + 0x7070, 0xA6C7, 0x7071, 0xCA41, 0x7074, 0xCB5E, 0x7076, 0xA85F, + 0x7078, 0xA862, 0x707A, 0xCB5F, 0x707C, 0xA860, 0x707D, 0xA861, + 0x7082, 0xCD58, 0x7083, 0xCD5A, 0x7084, 0xCD55, 0x7085, 0xCD52, + 0x7086, 0xCD54, 0x708A, 0xAAA4, 0x708E, 0xAAA2, 0x7091, 0xCD56, + 0x7092, 0xAAA3, 0x7093, 0xCD53, 0x7094, 0xCD50, 0x7095, 0xAAA1, + 0x7096, 0xCD57, 0x7098, 0xCD51, 0x7099, 0xAAA5, 0x709A, 0xCD59, + 0x709F, 0xCFAF, 0x70A1, 0xCFB3, 0x70A4, 0xACB7, 0x70A9, 0xCFB6, + 0x70AB, 0xACAF, 0x70AC, 0xACB2, 0x70AD, 0xACB4, 0x70AE, 0xACB6, + 0x70AF, 0xACB3, 0x70B0, 0xCFB2, 0x70B1, 0xCFB1, 0x70B3, 0xACB1, + 0x70B4, 0xCFB4, 0x70B5, 0xCFB5, 0x70B7, 0xCFAE, 0x70B8, 0xACB5, + 0x70BA, 0xACB0, 0x70BE, 0xCFB0, 0x70C5, 0xD277, 0x70C6, 0xD278, + 0x70C7, 0xD279, 0x70C8, 0xAF50, 0x70CA, 0xAF4C, 0x70CB, 0xD26E, + 0x70CD, 0xD276, 0x70CE, 0xD27B, 0x70CF, 0xAF51, 0x70D1, 0xD26C, + 0x70D2, 0xD272, 0x70D3, 0xD26B, 0x70D4, 0xD275, 0x70D7, 0xD271, + 0x70D8, 0xAF4D, 0x70D9, 0xAF4F, 0x70DA, 0xD27A, 0x70DC, 0xD26A, + 0x70DD, 0xD26D, 0x70DE, 0xD273, 0x70E0, 0xD274, 0x70E1, 0xD27C, + 0x70E2, 0xD270, 0x70E4, 0xAF4E, 0x70EF, 0xB26D, 0x70F0, 0xD64E, + 0x70F3, 0xD650, 0x70F4, 0xD64C, 0x70F6, 0xD658, 0x70F7, 0xD64A, + 0x70F8, 0xD657, 0x70F9, 0xB269, 0x70FA, 0xD648, 0x70FB, 0xDA5B, + 0x70FC, 0xD652, 0x70FD, 0xB26C, 0x70FF, 0xD653, 0x7100, 0xD656, + 0x7102, 0xD65A, 0x7104, 0xD64F, 0x7106, 0xD654, 0x7109, 0xB26A, + 0x710A, 0xB26B, 0x710B, 0xD659, 0x710C, 0xD64D, 0x710D, 0xD649, + 0x710E, 0xD65B, 0x7110, 0xD651, 0x7113, 0xD655, 0x7117, 0xD64B, + 0x7119, 0xB548, 0x711A, 0xB549, 0x711B, 0xDA65, 0x711C, 0xB54F, + 0x711E, 0xDA59, 0x711F, 0xDA62, 0x7120, 0xDA58, 0x7121, 0xB54C, + 0x7122, 0xDA60, 0x7123, 0xDA5E, 0x7125, 0xDA5F, 0x7126, 0xB54A, + 0x7128, 0xDA63, 0x712E, 0xDA5C, 0x712F, 0xDA5A, 0x7130, 0xB54B, + 0x7131, 0xDA5D, 0x7132, 0xDA61, 0x7136, 0xB54D, 0x713A, 0xDA64, + 0x7141, 0xDE70, 0x7142, 0xDE77, 0x7143, 0xDE79, 0x7144, 0xDEA1, + 0x7146, 0xB7DA, 0x7147, 0xDE6B, 0x7149, 0xB7D2, 0x714B, 0xDE7A, + 0x714C, 0xB7D7, 0x714D, 0xDEA2, 0x714E, 0xB7CE, 0x7150, 0xDE7D, + 0x7152, 0xDE6D, 0x7153, 0xDE7E, 0x7154, 0xDE6C, 0x7156, 0xB7DC, + 0x7158, 0xDE78, 0x7159, 0xB7CF, 0x715A, 0xDEA3, 0x715C, 0xB7D4, + 0x715D, 0xDE71, 0x715E, 0xB7D9, 0x715F, 0xDE7C, 0x7160, 0xDE6F, + 0x7161, 0xDE76, 0x7162, 0xDE72, 0x7163, 0xDE6E, 0x7164, 0xB7D1, + 0x7165, 0xB7D8, 0x7166, 0xB7D6, 0x7167, 0xB7D3, 0x7168, 0xB7DB, + 0x7169, 0xB7D0, 0x716A, 0xDE75, 0x716C, 0xB7D5, 0x716E, 0xB54E, + 0x7170, 0xDE7B, 0x7172, 0xDE73, 0x7178, 0xDE74, 0x717B, 0xE2C1, + 0x717D, 0xBAB4, 0x7180, 0xE2BD, 0x7181, 0xE2C3, 0x7182, 0xE2BF, + 0x7184, 0xBAB6, 0x7185, 0xE2BE, 0x7186, 0xE2C2, 0x7187, 0xE2BA, + 0x7189, 0xE2BC, 0x718A, 0xBAB5, 0x718F, 0xE2C0, 0x7190, 0xE2BB, + 0x7192, 0xBAB7, 0x7194, 0xBAB2, 0x7197, 0xE2C4, 0x7199, 0xBAB3, + 0x719A, 0xE667, 0x719B, 0xE664, 0x719C, 0xE670, 0x719D, 0xE66A, + 0x719E, 0xE66C, 0x719F, 0xBCF4, 0x71A0, 0xE666, 0x71A1, 0xE66E, + 0x71A4, 0xE66D, 0x71A5, 0xE66B, 0x71A7, 0xE671, 0x71A8, 0xBCF7, + 0x71A9, 0xE668, 0x71AA, 0xE66F, 0x71AC, 0xBCF5, 0x71AF, 0xE663, + 0x71B0, 0xE665, 0x71B1, 0xBCF6, 0x71B2, 0xE662, 0x71B3, 0xE672, + 0x71B5, 0xE669, 0x71B8, 0xEA4A, 0x71B9, 0xBF51, 0x71BC, 0xEA55, + 0x71BD, 0xEA53, 0x71BE, 0xBF4B, 0x71BF, 0xEA49, 0x71C0, 0xEA4C, + 0x71C1, 0xEA4D, 0x71C2, 0xEA48, 0x71C3, 0xBF55, 0x71C4, 0xBF56, + 0x71C5, 0xEA47, 0x71C6, 0xEA56, 0x71C7, 0xEA51, 0x71C8, 0xBF4F, + 0x71C9, 0xBF4C, 0x71CA, 0xEA50, 0x71CB, 0xEA4E, 0x71CE, 0xBF52, + 0x71CF, 0xEA52, 0x71D0, 0xBF4D, 0x71D2, 0xBF4E, 0x71D4, 0xEA4F, + 0x71D5, 0xBF50, 0x71D6, 0xEA4B, 0x71D8, 0xEA54, 0x71D9, 0xBF53, + 0x71DA, 0xEA57, 0x71DB, 0xEA58, 0x71DC, 0xBF54, 0x71DF, 0xC0E7, + 0x71E0, 0xC0EE, 0x71E1, 0xED5C, 0x71E2, 0xED62, 0x71E4, 0xED60, + 0x71E5, 0xC0EA, 0x71E6, 0xC0E9, 0x71E7, 0xC0E6, 0x71E8, 0xED5E, + 0x71EC, 0xC0EC, 0x71ED, 0xC0EB, 0x71EE, 0xC0E8, 0x71F0, 0xED61, + 0x71F1, 0xED5D, 0x71F2, 0xED5F, 0x71F4, 0xC0ED, 0x71F8, 0xC277, + 0x71F9, 0xEFFB, 0x71FB, 0xC274, 0x71FC, 0xC275, 0x71FD, 0xEFFD, + 0x71FE, 0xC276, 0x71FF, 0xEFFA, 0x7201, 0xEFF9, 0x7202, 0xF26C, + 0x7203, 0xEFFC, 0x7205, 0xF26D, 0x7206, 0xC37A, 0x7207, 0xF26B, + 0x720A, 0xF26A, 0x720C, 0xF269, 0x720D, 0xC37B, 0x7210, 0xC46C, + 0x7213, 0xF46A, 0x7214, 0xF46B, 0x7219, 0xF5DC, 0x721A, 0xF5DB, + 0x721B, 0xC4EA, 0x721D, 0xF5DA, 0x721E, 0xF6EC, 0x721F, 0xF6ED, + 0x7222, 0xF7E6, 0x7223, 0xF8B1, 0x7226, 0xF8F6, 0x7227, 0xF9BC, + 0x7228, 0xC679, 0x7229, 0xF9C6, 0x722A, 0xA4F6, 0x722C, 0xAAA6, + 0x722D, 0xAAA7, 0x7230, 0xACB8, 0x7235, 0xC0EF, 0x7236, 0xA4F7, + 0x7238, 0xAAA8, 0x7239, 0xAF52, 0x723A, 0xB7DD, 0x723B, 0xA4F8, + 0x723D, 0xB26E, 0x723E, 0xBAB8, 0x723F, 0xC962, 0x7241, 0xCFB7, + 0x7242, 0xD27D, 0x7244, 0xE2C5, 0x7246, 0xC0F0, 0x7247, 0xA4F9, + 0x7248, 0xAAA9, 0x7249, 0xCFB8, 0x724A, 0xCFB9, 0x724B, 0xDA66, + 0x724C, 0xB550, 0x724F, 0xDEA4, 0x7252, 0xB7DE, 0x7253, 0xE2C6, + 0x7256, 0xBCF8, 0x7258, 0xC37C, 0x7259, 0xA4FA, 0x725A, 0xDA67, + 0x725B, 0xA4FB, 0x725D, 0xA6C9, 0x725E, 0xCA42, 0x725F, 0xA6C8, + 0x7260, 0xA865, 0x7261, 0xA864, 0x7262, 0xA863, 0x7263, 0xCB60, + 0x7267, 0xAAAA, 0x7269, 0xAAAB, 0x726A, 0xCD5B, 0x726C, 0xCFBA, + 0x726E, 0xCFBD, 0x726F, 0xACBA, 0x7270, 0xCFBB, 0x7272, 0xACB9, + 0x7273, 0xCFBC, 0x7274, 0xACBB, 0x7276, 0xD2A2, 0x7277, 0xD2A1, + 0x7278, 0xD27E, 0x7279, 0xAF53, 0x727B, 0xD65D, 0x727C, 0xD65E, + 0x727D, 0xB26F, 0x727E, 0xD65C, 0x727F, 0xD65F, 0x7280, 0xB552, + 0x7281, 0xB270, 0x7284, 0xB551, 0x7285, 0xDA6B, 0x7286, 0xDA6A, + 0x7288, 0xDA68, 0x7289, 0xDA69, 0x728B, 0xDA6C, 0x728C, 0xDEA6, + 0x728D, 0xDEA5, 0x728E, 0xDEA9, 0x7290, 0xDEA8, 0x7291, 0xDEA7, + 0x7292, 0xBAB9, 0x7293, 0xE2C9, 0x7295, 0xE2C8, 0x7296, 0xBABA, + 0x7297, 0xE2C7, 0x7298, 0xE673, 0x729A, 0xE674, 0x729B, 0xBCF9, + 0x729D, 0xEA59, 0x729E, 0xEA5A, 0x72A1, 0xF272, 0x72A2, 0xC37D, + 0x72A3, 0xF271, 0x72A4, 0xF270, 0x72A5, 0xF26E, 0x72A6, 0xF26F, + 0x72A7, 0xC4EB, 0x72A8, 0xF46C, 0x72A9, 0xF6EE, 0x72AA, 0xF8F7, + 0x72AC, 0xA4FC, 0x72AE, 0xC9A5, 0x72AF, 0xA5C7, 0x72B0, 0xC9A6, + 0x72B4, 0xCA43, 0x72B5, 0xCA44, 0x72BA, 0xCB66, 0x72BD, 0xCB62, + 0x72BF, 0xCB61, 0x72C0, 0xAAAC, 0x72C1, 0xCB65, 0x72C2, 0xA867, + 0x72C3, 0xCB63, 0x72C4, 0xA866, 0x72C5, 0xCB67, 0x72C6, 0xCB64, + 0x72C9, 0xCD5F, 0x72CA, 0xCFBE, 0x72CB, 0xCD5D, 0x72CC, 0xCD64, + 0x72CE, 0xAAAD, 0x72D0, 0xAAB0, 0x72D1, 0xCD65, 0x72D2, 0xCD61, + 0x72D4, 0xCD62, 0x72D6, 0xCD5C, 0x72D7, 0xAAAF, 0x72D8, 0xCD5E, + 0x72D9, 0xAAAE, 0x72DA, 0xCD63, 0x72DC, 0xCD60, 0x72DF, 0xCFC2, + 0x72E0, 0xACBD, 0x72E1, 0xACBE, 0x72E3, 0xCFC5, 0x72E4, 0xCFBF, + 0x72E6, 0xCFC4, 0x72E8, 0xCFC0, 0x72E9, 0xACBC, 0x72EA, 0xCFC3, + 0x72EB, 0xCFC1, 0x72F3, 0xD2A8, 0x72F4, 0xD2A5, 0x72F6, 0xD2A7, + 0x72F7, 0xAF58, 0x72F8, 0xAF57, 0x72F9, 0xAF55, 0x72FA, 0xD2A4, + 0x72FB, 0xD2A9, 0x72FC, 0xAF54, 0x72FD, 0xAF56, 0x72FE, 0xD2A6, + 0x72FF, 0xD667, 0x7300, 0xD2A3, 0x7301, 0xD2AA, 0x7307, 0xD662, + 0x7308, 0xD666, 0x730A, 0xD665, 0x730B, 0xDA6E, 0x730C, 0xDA79, + 0x730F, 0xD668, 0x7311, 0xD663, 0x7312, 0xDA6D, 0x7313, 0xB274, + 0x7316, 0xB273, 0x7317, 0xD661, 0x7318, 0xD664, 0x7319, 0xB275, + 0x731B, 0xB272, 0x731C, 0xB271, 0x731D, 0xD660, 0x731E, 0xD669, + 0x7322, 0xDA70, 0x7323, 0xDA77, 0x7325, 0xB554, 0x7326, 0xDA76, + 0x7327, 0xDA73, 0x7329, 0xB556, 0x732D, 0xDA75, 0x7330, 0xDA6F, + 0x7331, 0xDA71, 0x7332, 0xDA74, 0x7333, 0xDA72, 0x7334, 0xB555, + 0x7335, 0xDA78, 0x7336, 0xB553, 0x7337, 0xB7DF, 0x733A, 0xDEAD, + 0x733B, 0xDEAC, 0x733C, 0xDEAA, 0x733E, 0xB7E2, 0x733F, 0xB7E1, + 0x7340, 0xDEAE, 0x7342, 0xDEAB, 0x7343, 0xE2CA, 0x7344, 0xBABB, + 0x7345, 0xB7E0, 0x7349, 0xDEB0, 0x734A, 0xDEAF, 0x734C, 0xE2CD, + 0x734D, 0xE2CB, 0x734E, 0xBCFA, 0x7350, 0xBABC, 0x7351, 0xE2CC, + 0x7352, 0xE676, 0x7357, 0xBCFB, 0x7358, 0xE675, 0x7359, 0xE67E, + 0x735A, 0xE67D, 0x735B, 0xE67B, 0x735D, 0xE67A, 0x735E, 0xE677, + 0x735F, 0xE678, 0x7360, 0xE679, 0x7361, 0xE67C, 0x7362, 0xE6A1, + 0x7365, 0xEA5F, 0x7366, 0xEA5C, 0x7367, 0xEA5D, 0x7368, 0xBF57, + 0x7369, 0xEA5B, 0x736A, 0xEA61, 0x736B, 0xEA60, 0x736C, 0xEA5E, + 0x736E, 0xED64, 0x736F, 0xED65, 0x7370, 0xC0F1, 0x7372, 0xC0F2, + 0x7373, 0xED63, 0x7375, 0xC279, 0x7376, 0xEFFE, 0x7377, 0xC278, + 0x7378, 0xC37E, 0x737A, 0xC3A1, 0x737B, 0xC46D, 0x737C, 0xF46E, + 0x737D, 0xF46D, 0x737E, 0xF5DD, 0x737F, 0xF6EF, 0x7380, 0xC57A, + 0x7381, 0xF7E8, 0x7382, 0xF7E7, 0x7383, 0xF7E9, 0x7384, 0xA5C8, + 0x7385, 0xCFC6, 0x7386, 0xAF59, 0x7387, 0xB276, 0x7388, 0xD66A, + 0x7389, 0xA5C9, 0x738A, 0xC9A7, 0x738B, 0xA4FD, 0x738E, 0xCA45, + 0x7392, 0xCB6C, 0x7393, 0xCB6A, 0x7394, 0xCB6B, 0x7395, 0xCB68, + 0x7396, 0xA868, 0x7397, 0xCB69, 0x739D, 0xCD6D, 0x739F, 0xAAB3, + 0x73A0, 0xCD6B, 0x73A1, 0xCD67, 0x73A2, 0xCD6A, 0x73A4, 0xCD66, + 0x73A5, 0xAAB5, 0x73A6, 0xCD69, 0x73A8, 0xAAB2, 0x73A9, 0xAAB1, + 0x73AB, 0xAAB4, 0x73AC, 0xCD6C, 0x73AD, 0xCD68, 0x73B2, 0xACC2, + 0x73B3, 0xACC5, 0x73B4, 0xCFCE, 0x73B5, 0xCFCD, 0x73B6, 0xCFCC, + 0x73B7, 0xACBF, 0x73B8, 0xCFD5, 0x73B9, 0xCFCB, 0x73BB, 0xACC1, + 0x73BC, 0xD2AF, 0x73BE, 0xCFD2, 0x73BF, 0xCFD0, 0x73C0, 0xACC4, + 0x73C2, 0xCFC8, 0x73C3, 0xCFD3, 0x73C5, 0xCFCA, 0x73C6, 0xCFD4, + 0x73C7, 0xCFD1, 0x73C8, 0xCFC9, 0x73CA, 0xACC0, 0x73CB, 0xCFD6, + 0x73CC, 0xCFC7, 0x73CD, 0xACC3, 0x73D2, 0xD2B4, 0x73D3, 0xD2AB, + 0x73D4, 0xD2B6, 0x73D6, 0xD2AE, 0x73D7, 0xD2B9, 0x73D8, 0xD2BA, + 0x73D9, 0xD2AC, 0x73DA, 0xD2B8, 0x73DB, 0xD2B5, 0x73DC, 0xD2B3, + 0x73DD, 0xD2B7, 0x73DE, 0xAF5F, 0x73E0, 0xAF5D, 0x73E3, 0xD2B1, + 0x73E5, 0xD2AD, 0x73E7, 0xD2B0, 0x73E8, 0xD2BB, 0x73E9, 0xD2B2, + 0x73EA, 0xAF5E, 0x73EB, 0xCFCF, 0x73ED, 0xAF5A, 0x73EE, 0xAF5C, + 0x73F4, 0xD678, 0x73F5, 0xD66D, 0x73F6, 0xD66B, 0x73F8, 0xD66C, + 0x73FA, 0xD673, 0x73FC, 0xD674, 0x73FD, 0xD670, 0x73FE, 0xB27B, + 0x73FF, 0xD675, 0x7400, 0xD672, 0x7401, 0xD66F, 0x7403, 0xB279, + 0x7404, 0xD66E, 0x7405, 0xB277, 0x7406, 0xB27A, 0x7407, 0xD671, + 0x7408, 0xD679, 0x7409, 0xAF5B, 0x740A, 0xB278, 0x740B, 0xD677, + 0x740C, 0xD676, 0x740D, 0xB27C, 0x7416, 0xDA7E, 0x741A, 0xDAA1, + 0x741B, 0xB560, 0x741D, 0xDAA7, 0x7420, 0xDAA9, 0x7421, 0xDAA2, + 0x7422, 0xB55A, 0x7423, 0xDAA6, 0x7424, 0xDAA5, 0x7425, 0xB55B, + 0x7426, 0xB561, 0x7428, 0xB562, 0x7429, 0xDAA8, 0x742A, 0xB558, + 0x742B, 0xDA7D, 0x742C, 0xDA7B, 0x742D, 0xDAA3, 0x742E, 0xDA7A, + 0x742F, 0xB55F, 0x7430, 0xDA7C, 0x7431, 0xDAA4, 0x7432, 0xDAAA, + 0x7433, 0xB559, 0x7434, 0xB55E, 0x7435, 0xB55C, 0x7436, 0xB55D, + 0x743A, 0xB557, 0x743F, 0xB7E9, 0x7440, 0xDEB7, 0x7441, 0xB7E8, + 0x7442, 0xDEBB, 0x7444, 0xDEB1, 0x7446, 0xDEBC, 0x744A, 0xDEB2, + 0x744B, 0xDEB3, 0x744D, 0xDEBD, 0x744E, 0xDEBA, 0x744F, 0xDEB8, + 0x7450, 0xDEB9, 0x7451, 0xDEB5, 0x7452, 0xDEB4, 0x7454, 0xDEBE, + 0x7455, 0xB7E5, 0x7457, 0xDEB6, 0x7459, 0xB7EA, 0x745A, 0xB7E4, + 0x745B, 0xB7EB, 0x745C, 0xB7EC, 0x745E, 0xB7E7, 0x745F, 0xB7E6, + 0x7462, 0xE2CE, 0x7463, 0xBABE, 0x7464, 0xBABD, 0x7467, 0xE2D3, + 0x7469, 0xBCFC, 0x746A, 0xBABF, 0x746D, 0xBAC1, 0x746E, 0xE2D4, + 0x746F, 0xB7E3, 0x7470, 0xBAC0, 0x7471, 0xE2D0, 0x7472, 0xE2D2, + 0x7473, 0xE2CF, 0x7475, 0xE2D1, 0x7479, 0xE6AB, 0x747C, 0xE6AA, + 0x747D, 0xE6A7, 0x747E, 0xBD40, 0x747F, 0xEA62, 0x7480, 0xBD41, + 0x7481, 0xE6A6, 0x7483, 0xBCFE, 0x7485, 0xE6A8, 0x7486, 0xE6A5, + 0x7487, 0xE6A2, 0x7488, 0xE6A9, 0x7489, 0xE6A3, 0x748A, 0xE6A4, + 0x748B, 0xBCFD, 0x7490, 0xED69, 0x7492, 0xEA66, 0x7494, 0xEA65, + 0x7495, 0xEA67, 0x7497, 0xED66, 0x7498, 0xBF5A, 0x749A, 0xEA63, + 0x749C, 0xBF58, 0x749E, 0xBF5C, 0x749F, 0xBF5B, 0x74A0, 0xEA64, + 0x74A1, 0xEA68, 0x74A3, 0xBF59, 0x74A5, 0xED6D, 0x74A6, 0xC0F5, + 0x74A7, 0xC27A, 0x74A8, 0xC0F6, 0x74A9, 0xC0F3, 0x74AA, 0xED6A, + 0x74AB, 0xED68, 0x74AD, 0xED6B, 0x74AF, 0xED6E, 0x74B0, 0xC0F4, + 0x74B1, 0xED6C, 0x74B2, 0xED67, 0x74B5, 0xF042, 0x74B6, 0xF045, + 0x74B7, 0xF275, 0x74B8, 0xF040, 0x74BA, 0xF46F, 0x74BB, 0xF046, + 0x74BD, 0xC3A2, 0x74BE, 0xF044, 0x74BF, 0xC27B, 0x74C0, 0xF041, + 0x74C1, 0xF043, 0x74C2, 0xF047, 0x74C3, 0xF276, 0x74C5, 0xF274, + 0x74CA, 0xC3A3, 0x74CB, 0xF273, 0x74CF, 0xC46E, 0x74D4, 0xC4ED, + 0x74D5, 0xF6F1, 0x74D6, 0xC4EC, 0x74D7, 0xF6F3, 0x74D8, 0xF6F0, + 0x74D9, 0xF6F2, 0x74DA, 0xC5D0, 0x74DB, 0xF8B2, 0x74DC, 0xA5CA, + 0x74DD, 0xCD6E, 0x74DE, 0xD2BC, 0x74DF, 0xD2BD, 0x74E0, 0xB27D, + 0x74E1, 0xDEBF, 0x74E2, 0xBF5D, 0x74E3, 0xC3A4, 0x74E4, 0xC57B, + 0x74E5, 0xF8B3, 0x74E6, 0xA5CB, 0x74E8, 0xCD6F, 0x74E9, 0xA260, + 0x74EC, 0xCFD7, 0x74EE, 0xCFD8, 0x74F4, 0xD2BE, 0x74F5, 0xD2BF, + 0x74F6, 0xB27E, 0x74F7, 0xB2A1, 0x74FB, 0xDAAB, 0x74FD, 0xDEC2, + 0x74FE, 0xDEC1, 0x74FF, 0xDEC0, 0x7500, 0xE2D5, 0x7502, 0xE2D6, + 0x7503, 0xE2D7, 0x7504, 0xBAC2, 0x7507, 0xE6AD, 0x7508, 0xE6AC, + 0x750B, 0xEA69, 0x750C, 0xBF5E, 0x750D, 0xBF5F, 0x750F, 0xED72, + 0x7510, 0xED6F, 0x7511, 0xED70, 0x7512, 0xED71, 0x7513, 0xF049, + 0x7514, 0xF048, 0x7515, 0xC27C, 0x7516, 0xF277, 0x7517, 0xF5DE, + 0x7518, 0xA5CC, 0x751A, 0xACC6, 0x751C, 0xB2A2, 0x751D, 0xDEC3, + 0x751F, 0xA5CD, 0x7521, 0xD2C0, 0x7522, 0xB2A3, 0x7525, 0xB563, + 0x7526, 0xB564, 0x7528, 0xA5CE, 0x7529, 0xA5CF, 0x752A, 0xCA46, + 0x752B, 0xA86A, 0x752C, 0xA869, 0x752D, 0xACC7, 0x752E, 0xCFD9, + 0x752F, 0xDAAC, 0x7530, 0xA5D0, 0x7531, 0xA5D1, 0x7532, 0xA5D2, + 0x7533, 0xA5D3, 0x7537, 0xA86B, 0x7538, 0xA86C, 0x7539, 0xCB6E, + 0x753A, 0xCB6D, 0x753D, 0xAAB6, 0x753E, 0xCD72, 0x753F, 0xCD70, + 0x7540, 0xCD71, 0x7547, 0xCFDA, 0x7548, 0xCFDB, 0x754B, 0xACCB, + 0x754C, 0xACC9, 0x754E, 0xACCA, 0x754F, 0xACC8, 0x7554, 0xAF60, + 0x7559, 0xAF64, 0x755A, 0xAF63, 0x755B, 0xD2C1, 0x755C, 0xAF62, + 0x755D, 0xAF61, 0x755F, 0xD2C2, 0x7562, 0xB2A6, 0x7563, 0xD67B, + 0x7564, 0xD67A, 0x7565, 0xB2A4, 0x7566, 0xB2A5, 0x756A, 0xB566, + 0x756B, 0xB565, 0x756C, 0xDAAE, 0x756F, 0xDAAD, 0x7570, 0xB2A7, + 0x7576, 0xB7ED, 0x7577, 0xDEC5, 0x7578, 0xB7EE, 0x7579, 0xDEC4, + 0x757D, 0xE2D8, 0x757E, 0xE6AE, 0x757F, 0xBD42, 0x7580, 0xEA6A, + 0x7584, 0xED73, 0x7586, 0xC3A6, 0x7587, 0xC3A5, 0x758A, 0xC57C, + 0x758B, 0xA5D4, 0x758C, 0xCD73, 0x758F, 0xB2A8, 0x7590, 0xE2D9, + 0x7591, 0xBAC3, 0x7594, 0xCB6F, 0x7595, 0xCB70, 0x7598, 0xCD74, + 0x7599, 0xAAB8, 0x759A, 0xAAB9, 0x759D, 0xAAB7, 0x75A2, 0xACCF, + 0x75A3, 0xACD0, 0x75A4, 0xACCD, 0x75A5, 0xACCE, 0x75A7, 0xCFDC, + 0x75AA, 0xCFDD, 0x75AB, 0xACCC, 0x75B0, 0xD2C3, 0x75B2, 0xAF68, + 0x75B3, 0xAF69, 0x75B5, 0xB2AB, 0x75B6, 0xD2C9, 0x75B8, 0xAF6E, + 0x75B9, 0xAF6C, 0x75BA, 0xD2CA, 0x75BB, 0xD2C5, 0x75BC, 0xAF6B, + 0x75BD, 0xAF6A, 0x75BE, 0xAF65, 0x75BF, 0xD2C8, 0x75C0, 0xD2C7, + 0x75C1, 0xD2C4, 0x75C2, 0xAF6D, 0x75C4, 0xD2C6, 0x75C5, 0xAF66, + 0x75C7, 0xAF67, 0x75CA, 0xB2AC, 0x75CB, 0xD6A1, 0x75CC, 0xD6A2, + 0x75CD, 0xB2AD, 0x75CE, 0xD67C, 0x75CF, 0xD67E, 0x75D0, 0xD6A4, + 0x75D1, 0xD6A3, 0x75D2, 0xD67D, 0x75D4, 0xB2A9, 0x75D5, 0xB2AA, + 0x75D7, 0xDAB6, 0x75D8, 0xB56B, 0x75D9, 0xB56A, 0x75DA, 0xDAB0, + 0x75DB, 0xB568, 0x75DD, 0xDAB3, 0x75DE, 0xB56C, 0x75DF, 0xDAB4, + 0x75E0, 0xB56D, 0x75E1, 0xDAB1, 0x75E2, 0xB567, 0x75E3, 0xB569, + 0x75E4, 0xDAB5, 0x75E6, 0xDAB2, 0x75E7, 0xDAAF, 0x75ED, 0xDED2, + 0x75EF, 0xDEC7, 0x75F0, 0xB7F0, 0x75F1, 0xB7F3, 0x75F2, 0xB7F2, + 0x75F3, 0xB7F7, 0x75F4, 0xB7F6, 0x75F5, 0xDED3, 0x75F6, 0xDED1, + 0x75F7, 0xDECA, 0x75F8, 0xDECE, 0x75F9, 0xDECD, 0x75FA, 0xB7F4, + 0x75FB, 0xDED0, 0x75FC, 0xDECC, 0x75FD, 0xDED4, 0x75FE, 0xDECB, + 0x75FF, 0xB7F5, 0x7600, 0xB7EF, 0x7601, 0xB7F1, 0x7603, 0xDEC9, + 0x7608, 0xE2DB, 0x7609, 0xBAC7, 0x760A, 0xE2DF, 0x760B, 0xBAC6, + 0x760C, 0xE2DC, 0x760D, 0xBAC5, 0x760F, 0xDEC8, 0x7610, 0xDECF, + 0x7611, 0xE2DE, 0x7613, 0xBAC8, 0x7614, 0xE2E0, 0x7615, 0xE2DD, + 0x7616, 0xE2DA, 0x7619, 0xE6B1, 0x761A, 0xE6B5, 0x761B, 0xE6B7, + 0x761C, 0xE6B3, 0x761D, 0xE6B2, 0x761E, 0xE6B0, 0x761F, 0xBD45, + 0x7620, 0xBD43, 0x7621, 0xBD48, 0x7622, 0xBD49, 0x7623, 0xE6B4, + 0x7624, 0xBD46, 0x7625, 0xE6AF, 0x7626, 0xBD47, 0x7627, 0xBAC4, + 0x7628, 0xE6B6, 0x7629, 0xBD44, 0x762D, 0xEA6C, 0x762F, 0xEA6B, + 0x7630, 0xEA73, 0x7631, 0xEA6D, 0x7632, 0xEA72, 0x7633, 0xEA6F, + 0x7634, 0xBF60, 0x7635, 0xEA71, 0x7638, 0xBF61, 0x763A, 0xBF62, + 0x763C, 0xEA70, 0x763D, 0xEA6E, 0x7642, 0xC0F8, 0x7643, 0xED74, + 0x7646, 0xC0F7, 0x7647, 0xED77, 0x7648, 0xED75, 0x7649, 0xED76, + 0x764C, 0xC0F9, 0x7650, 0xF04D, 0x7652, 0xC2A1, 0x7653, 0xF04E, + 0x7656, 0xC27D, 0x7657, 0xF04F, 0x7658, 0xC27E, 0x7659, 0xF04C, + 0x765A, 0xF050, 0x765C, 0xF04A, 0x765F, 0xC3A7, 0x7660, 0xF278, + 0x7661, 0xC3A8, 0x7662, 0xC46F, 0x7664, 0xF04B, 0x7665, 0xC470, + 0x7669, 0xC4EE, 0x766A, 0xF5DF, 0x766C, 0xC57E, 0x766D, 0xF6F4, + 0x766E, 0xC57D, 0x7670, 0xF7EA, 0x7671, 0xC5F5, 0x7672, 0xC5F6, + 0x7675, 0xF9CC, 0x7678, 0xACD1, 0x7679, 0xCFDE, 0x767B, 0xB56E, + 0x767C, 0xB56F, 0x767D, 0xA5D5, 0x767E, 0xA6CA, 0x767F, 0xCA47, + 0x7681, 0xCB71, 0x7682, 0xA86D, 0x7684, 0xAABA, 0x7686, 0xACD2, + 0x7687, 0xACD3, 0x7688, 0xACD4, 0x7689, 0xD6A6, 0x768A, 0xD2CB, + 0x768B, 0xAF6F, 0x768E, 0xB2AE, 0x768F, 0xD6A5, 0x7692, 0xDAB8, + 0x7693, 0xB571, 0x7695, 0xDAB7, 0x7696, 0xB570, 0x7699, 0xDED5, + 0x769A, 0xBD4A, 0x769B, 0xE6BB, 0x769C, 0xE6B8, 0x769D, 0xE6B9, + 0x769E, 0xE6BA, 0x76A4, 0xED78, 0x76A6, 0xF051, 0x76AA, 0xF471, + 0x76AB, 0xF470, 0x76AD, 0xF6F5, 0x76AE, 0xA5D6, 0x76AF, 0xCD75, + 0x76B0, 0xAF70, 0x76B4, 0xB572, 0x76B5, 0xDED6, 0x76B8, 0xE2E1, + 0x76BA, 0xBD4B, 0x76BB, 0xEA74, 0x76BD, 0xF052, 0x76BE, 0xF472, + 0x76BF, 0xA5D7, 0x76C2, 0xAABB, 0x76C3, 0xACD7, 0x76C4, 0xCFDF, + 0x76C5, 0xACD8, 0x76C6, 0xACD6, 0x76C8, 0xACD5, 0x76C9, 0xD2CC, + 0x76CA, 0xAF71, 0x76CD, 0xAF72, 0x76CE, 0xAF73, 0x76D2, 0xB2B0, + 0x76D3, 0xD6A7, 0x76D4, 0xB2AF, 0x76DA, 0xDAB9, 0x76DB, 0xB2B1, + 0x76DC, 0xB573, 0x76DD, 0xDED7, 0x76DE, 0xB7F8, 0x76DF, 0xB7F9, + 0x76E1, 0xBAC9, 0x76E3, 0xBACA, 0x76E4, 0xBD4C, 0x76E5, 0xBF64, + 0x76E6, 0xEA75, 0x76E7, 0xBF63, 0x76E9, 0xED79, 0x76EA, 0xC0FA, + 0x76EC, 0xF053, 0x76ED, 0xF473, 0x76EE, 0xA5D8, 0x76EF, 0xA86E, + 0x76F0, 0xCD78, 0x76F1, 0xCD77, 0x76F2, 0xAABC, 0x76F3, 0xCD76, + 0x76F4, 0xAABD, 0x76F5, 0xCD79, 0x76F7, 0xCFE5, 0x76F8, 0xACDB, + 0x76F9, 0xACDA, 0x76FA, 0xCFE7, 0x76FB, 0xCFE6, 0x76FC, 0xACDF, + 0x76FE, 0xACDE, 0x7701, 0xACD9, 0x7703, 0xCFE1, 0x7704, 0xCFE2, + 0x7705, 0xCFE3, 0x7707, 0xACE0, 0x7708, 0xCFE0, 0x7709, 0xACDC, + 0x770A, 0xCFE4, 0x770B, 0xACDD, 0x7710, 0xD2CF, 0x7711, 0xD2D3, + 0x7712, 0xD2D1, 0x7713, 0xD2D0, 0x7715, 0xD2D4, 0x7719, 0xD2D5, + 0x771A, 0xD2D6, 0x771B, 0xD2CE, 0x771D, 0xD2CD, 0x771F, 0xAF75, + 0x7720, 0xAF76, 0x7722, 0xD2D7, 0x7723, 0xD2D2, 0x7725, 0xD6B0, + 0x7727, 0xD2D8, 0x7728, 0xAF77, 0x7729, 0xAF74, 0x772D, 0xD6AA, + 0x772F, 0xD6A9, 0x7731, 0xD6AB, 0x7732, 0xD6AC, 0x7733, 0xD6AE, + 0x7734, 0xD6AD, 0x7735, 0xD6B2, 0x7736, 0xB2B5, 0x7737, 0xB2B2, + 0x7738, 0xB2B6, 0x7739, 0xD6A8, 0x773A, 0xB2B7, 0x773B, 0xD6B1, + 0x773C, 0xB2B4, 0x773D, 0xD6AF, 0x773E, 0xB2B3, 0x7744, 0xDABC, + 0x7745, 0xDABE, 0x7746, 0xDABA, 0x7747, 0xDABB, 0x774A, 0xDABF, + 0x774B, 0xDAC1, 0x774C, 0xDAC2, 0x774D, 0xDABD, 0x774E, 0xDAC0, + 0x774F, 0xB574, 0x7752, 0xDEDB, 0x7754, 0xDEE0, 0x7755, 0xDED8, + 0x7756, 0xDEDC, 0x7759, 0xDEE1, 0x775A, 0xDEDD, 0x775B, 0xB7FA, + 0x775C, 0xB843, 0x775E, 0xB7FD, 0x775F, 0xDED9, 0x7760, 0xDEDA, + 0x7761, 0xBACE, 0x7762, 0xB846, 0x7763, 0xB7FE, 0x7765, 0xB844, + 0x7766, 0xB7FC, 0x7767, 0xDEDF, 0x7768, 0xB845, 0x7769, 0xDEDE, + 0x776A, 0xB841, 0x776B, 0xB7FB, 0x776C, 0xB842, 0x776D, 0xDEE2, + 0x776E, 0xE2E6, 0x776F, 0xE2E8, 0x7779, 0xB840, 0x777C, 0xE2E3, + 0x777D, 0xBACC, 0x777E, 0xE2E9, 0x777F, 0xBACD, 0x7780, 0xE2E7, + 0x7781, 0xE2E2, 0x7782, 0xE2E5, 0x7783, 0xE2EA, 0x7784, 0xBACB, + 0x7785, 0xE2E4, 0x7787, 0xBD4E, 0x7788, 0xE6BF, 0x7789, 0xE6BE, + 0x778B, 0xBD51, 0x778C, 0xBD4F, 0x778D, 0xE6BC, 0x778E, 0xBD4D, + 0x778F, 0xE6BD, 0x7791, 0xBD50, 0x7795, 0xEA7D, 0x7797, 0xEAA1, + 0x7799, 0xEA7E, 0x779A, 0xEA76, 0x779B, 0xEA7A, 0x779C, 0xEA79, + 0x779D, 0xEA77, 0x779E, 0xBF66, 0x779F, 0xBF67, 0x77A0, 0xBF65, + 0x77A1, 0xEA78, 0x77A2, 0xEA7B, 0x77A3, 0xEA7C, 0x77A5, 0xBF68, + 0x77A7, 0xC140, 0x77A8, 0xEDA3, 0x77AA, 0xC0FC, 0x77AB, 0xED7B, + 0x77AC, 0xC0FE, 0x77AD, 0xC141, 0x77B0, 0xC0FD, 0x77B1, 0xEDA2, + 0x77B2, 0xED7C, 0x77B3, 0xC0FB, 0x77B4, 0xEDA1, 0x77B5, 0xED7A, + 0x77B6, 0xED7E, 0x77B7, 0xED7D, 0x77BA, 0xF055, 0x77BB, 0xC2A4, + 0x77BC, 0xC2A5, 0x77BD, 0xC2A2, 0x77BF, 0xC2A3, 0x77C2, 0xF054, + 0x77C4, 0xF27B, 0x77C7, 0xC3A9, 0x77C9, 0xF279, 0x77CA, 0xF27A, + 0x77CC, 0xF474, 0x77CD, 0xF477, 0x77CE, 0xF475, 0x77CF, 0xF476, + 0x77D0, 0xF5E0, 0x77D3, 0xC4EF, 0x77D4, 0xF7EB, 0x77D5, 0xF8B4, + 0x77D7, 0xC5F7, 0x77D8, 0xF8F8, 0x77D9, 0xF8F9, 0x77DA, 0xC666, + 0x77DB, 0xA5D9, 0x77DC, 0xACE1, 0x77DE, 0xDAC3, 0x77E0, 0xDEE3, + 0x77E2, 0xA5DA, 0x77E3, 0xA86F, 0x77E5, 0xAABE, 0x77E7, 0xCFE8, + 0x77E8, 0xCFE9, 0x77E9, 0xAF78, 0x77EC, 0xDAC4, 0x77ED, 0xB575, + 0x77EE, 0xB847, 0x77EF, 0xC142, 0x77F0, 0xEDA4, 0x77F1, 0xF27C, + 0x77F2, 0xF478, 0x77F3, 0xA5DB, 0x77F7, 0xCDA1, 0x77F8, 0xCD7A, + 0x77F9, 0xCD7C, 0x77FA, 0xCD7E, 0x77FB, 0xCD7D, 0x77FC, 0xCD7B, + 0x77FD, 0xAABF, 0x7802, 0xACE2, 0x7803, 0xCFF2, 0x7805, 0xCFED, + 0x7806, 0xCFEA, 0x7809, 0xCFF1, 0x780C, 0xACE4, 0x780D, 0xACE5, + 0x780E, 0xCFF0, 0x780F, 0xCFEF, 0x7810, 0xCFEE, 0x7811, 0xCFEB, + 0x7812, 0xCFEC, 0x7813, 0xCFF3, 0x7814, 0xACE3, 0x781D, 0xAF7C, + 0x781F, 0xAFA4, 0x7820, 0xAFA3, 0x7821, 0xD2E1, 0x7822, 0xD2DB, + 0x7823, 0xD2D9, 0x7825, 0xAFA1, 0x7826, 0xD6B9, 0x7827, 0xAF7A, + 0x7828, 0xD2DE, 0x7829, 0xD2E2, 0x782A, 0xD2E4, 0x782B, 0xD2E0, + 0x782C, 0xD2DA, 0x782D, 0xAFA2, 0x782E, 0xD2DF, 0x782F, 0xD2DD, + 0x7830, 0xAF79, 0x7831, 0xD2E5, 0x7832, 0xAFA5, 0x7833, 0xD2E3, + 0x7834, 0xAF7D, 0x7835, 0xD2DC, 0x7837, 0xAF7E, 0x7838, 0xAF7B, + 0x7843, 0xB2B9, 0x7845, 0xD6BA, 0x7848, 0xD6B3, 0x7849, 0xD6B5, + 0x784A, 0xD6B7, 0x784C, 0xD6B8, 0x784D, 0xD6B6, 0x784E, 0xB2BA, + 0x7850, 0xD6BB, 0x7852, 0xD6B4, 0x785C, 0xDAC8, 0x785D, 0xB576, + 0x785E, 0xDAD0, 0x7860, 0xDAC5, 0x7862, 0xDAD1, 0x7864, 0xDAC6, + 0x7865, 0xDAC7, 0x7868, 0xDACF, 0x7869, 0xDACE, 0x786A, 0xDACB, + 0x786B, 0xB2B8, 0x786C, 0xB577, 0x786D, 0xDAC9, 0x786E, 0xDACC, + 0x786F, 0xB578, 0x7870, 0xDACD, 0x7871, 0xDACA, 0x7879, 0xDEEE, + 0x787B, 0xDEF2, 0x787C, 0xB84E, 0x787E, 0xE2F0, 0x787F, 0xB851, + 0x7880, 0xDEF0, 0x7881, 0xF9D6, 0x7883, 0xDEED, 0x7884, 0xDEE8, + 0x7885, 0xDEEA, 0x7886, 0xDEEB, 0x7887, 0xDEE4, 0x7889, 0xB84D, + 0x788C, 0xB84C, 0x788E, 0xB848, 0x788F, 0xDEE7, 0x7891, 0xB84F, + 0x7893, 0xB850, 0x7894, 0xDEE6, 0x7895, 0xDEE9, 0x7896, 0xDEF1, + 0x7897, 0xB84A, 0x7898, 0xB84B, 0x7899, 0xDEEF, 0x789A, 0xDEE5, + 0x789E, 0xE2F2, 0x789F, 0xBAD0, 0x78A0, 0xE2F4, 0x78A1, 0xDEEC, + 0x78A2, 0xE2F6, 0x78A3, 0xBAD4, 0x78A4, 0xE2F7, 0x78A5, 0xE2F3, + 0x78A7, 0xBAD1, 0x78A8, 0xE2EF, 0x78A9, 0xBAD3, 0x78AA, 0xE2EC, + 0x78AB, 0xE2F1, 0x78AC, 0xE2F5, 0x78AD, 0xE2EE, 0x78B0, 0xB849, + 0x78B2, 0xE2EB, 0x78B3, 0xBAD2, 0x78B4, 0xE2ED, 0x78BA, 0xBD54, + 0x78BB, 0xE6C1, 0x78BC, 0xBD58, 0x78BE, 0xBD56, 0x78C1, 0xBACF, + 0x78C3, 0xE6C8, 0x78C4, 0xE6C9, 0x78C5, 0xBD53, 0x78C8, 0xE6C7, + 0x78C9, 0xE6CA, 0x78CA, 0xBD55, 0x78CB, 0xBD52, 0x78CC, 0xE6C3, + 0x78CD, 0xE6C0, 0x78CE, 0xE6C5, 0x78CF, 0xE6C2, 0x78D0, 0xBD59, + 0x78D1, 0xE6C4, 0x78D4, 0xE6C6, 0x78D5, 0xBD57, 0x78DA, 0xBF6A, + 0x78DB, 0xEAA8, 0x78DD, 0xEAA2, 0x78DE, 0xEAA6, 0x78DF, 0xEAAC, + 0x78E0, 0xEAAD, 0x78E1, 0xEAA9, 0x78E2, 0xEAAA, 0x78E3, 0xEAA7, + 0x78E5, 0xEAA4, 0x78E7, 0xBF6C, 0x78E8, 0xBF69, 0x78E9, 0xEAA3, + 0x78EA, 0xEAA5, 0x78EC, 0xBF6B, 0x78ED, 0xEAAB, 0x78EF, 0xC146, + 0x78F2, 0xEDAA, 0x78F3, 0xEDA5, 0x78F4, 0xC145, 0x78F7, 0xC143, + 0x78F9, 0xEDAC, 0x78FA, 0xC144, 0x78FB, 0xEDA8, 0x78FC, 0xEDA9, + 0x78FD, 0xEDA6, 0x78FE, 0xEDAD, 0x78FF, 0xF056, 0x7901, 0xC147, + 0x7902, 0xEDA7, 0x7904, 0xEDAE, 0x7905, 0xEDAB, 0x7909, 0xF05A, + 0x790C, 0xF057, 0x790E, 0xC2A6, 0x7910, 0xF05B, 0x7911, 0xF05D, + 0x7912, 0xF05C, 0x7913, 0xF058, 0x7914, 0xF059, 0x7917, 0xF2A3, + 0x7919, 0xC3AA, 0x791B, 0xF27E, 0x791C, 0xF2A2, 0x791D, 0xF27D, + 0x791E, 0xF2A4, 0x7921, 0xF2A1, 0x7923, 0xF47A, 0x7924, 0xF47D, + 0x7925, 0xF479, 0x7926, 0xC471, 0x7927, 0xF47B, 0x7928, 0xF47C, + 0x7929, 0xF47E, 0x792A, 0xC472, 0x792B, 0xC474, 0x792C, 0xC473, + 0x792D, 0xF5E1, 0x792F, 0xF5E3, 0x7931, 0xF5E2, 0x7935, 0xF6F6, + 0x7938, 0xF8B5, 0x7939, 0xF8FA, 0x793A, 0xA5DC, 0x793D, 0xCB72, + 0x793E, 0xAAC0, 0x793F, 0xCDA3, 0x7940, 0xAAC1, 0x7941, 0xAAC2, + 0x7942, 0xCDA2, 0x7944, 0xCFF8, 0x7945, 0xCFF7, 0x7946, 0xACE6, + 0x7947, 0xACE9, 0x7948, 0xACE8, 0x7949, 0xACE7, 0x794A, 0xCFF4, + 0x794B, 0xCFF6, 0x794C, 0xCFF5, 0x794F, 0xD2E8, 0x7950, 0xAFA7, + 0x7951, 0xD2EC, 0x7952, 0xD2EB, 0x7953, 0xD2EA, 0x7954, 0xD2E6, + 0x7955, 0xAFA6, 0x7956, 0xAFAA, 0x7957, 0xAFAD, 0x795A, 0xAFAE, + 0x795B, 0xD2E7, 0x795C, 0xD2E9, 0x795D, 0xAFAC, 0x795E, 0xAFAB, + 0x795F, 0xAFA9, 0x7960, 0xAFA8, 0x7961, 0xD6C2, 0x7963, 0xD6C0, + 0x7964, 0xD6BC, 0x7965, 0xB2BB, 0x7967, 0xD6BD, 0x7968, 0xB2BC, + 0x7969, 0xD6BE, 0x796A, 0xD6BF, 0x796B, 0xD6C1, 0x796D, 0xB2BD, + 0x7970, 0xDAD5, 0x7972, 0xDAD4, 0x7973, 0xDAD3, 0x7974, 0xDAD2, + 0x7979, 0xDEF6, 0x797A, 0xB852, 0x797C, 0xDEF3, 0x797D, 0xDEF5, + 0x797F, 0xB853, 0x7981, 0xB854, 0x7982, 0xDEF4, 0x7988, 0xE341, + 0x798A, 0xE2F9, 0x798B, 0xE2FA, 0x798D, 0xBAD7, 0x798E, 0xBAD5, + 0x798F, 0xBAD6, 0x7990, 0xE343, 0x7992, 0xE342, 0x7993, 0xE2FE, + 0x7994, 0xE2FD, 0x7995, 0xE2FC, 0x7996, 0xE2FB, 0x7997, 0xE340, + 0x7998, 0xE2F8, 0x799A, 0xE6CB, 0x799B, 0xE6D0, 0x799C, 0xE6CE, + 0x79A0, 0xE6CD, 0x79A1, 0xE6CC, 0x79A2, 0xE6CF, 0x79A4, 0xEAAE, + 0x79A6, 0xBF6D, 0x79A7, 0xC148, 0x79A8, 0xEDB0, 0x79AA, 0xC149, + 0x79AB, 0xEDAF, 0x79AC, 0xF05F, 0x79AD, 0xF05E, 0x79AE, 0xC2A7, + 0x79B0, 0xF2A5, 0x79B1, 0xC3AB, 0x79B2, 0xF4A1, 0x79B3, 0xC5A1, + 0x79B4, 0xF6F7, 0x79B6, 0xF8B7, 0x79B7, 0xF8B6, 0x79B8, 0xC9A8, + 0x79B9, 0xACEA, 0x79BA, 0xACEB, 0x79BB, 0xD6C3, 0x79BD, 0xB856, + 0x79BE, 0xA5DD, 0x79BF, 0xA872, 0x79C0, 0xA871, 0x79C1, 0xA870, + 0x79C5, 0xCDA4, 0x79C8, 0xAAC4, 0x79C9, 0xAAC3, 0x79CB, 0xACEE, + 0x79CD, 0xCFFA, 0x79CE, 0xCFFD, 0x79CF, 0xCFFB, 0x79D1, 0xACEC, + 0x79D2, 0xACED, 0x79D5, 0xCFF9, 0x79D6, 0xCFFC, 0x79D8, 0xAFB5, + 0x79DC, 0xD2F3, 0x79DD, 0xD2F5, 0x79DE, 0xD2F4, 0x79DF, 0xAFB2, + 0x79E0, 0xD2EF, 0x79E3, 0xAFB0, 0x79E4, 0xAFAF, 0x79E6, 0xAFB3, + 0x79E7, 0xAFB1, 0x79E9, 0xAFB4, 0x79EA, 0xD2F2, 0x79EB, 0xD2ED, + 0x79EC, 0xD2EE, 0x79ED, 0xD2F1, 0x79EE, 0xD2F0, 0x79F6, 0xD6C6, + 0x79F7, 0xD6C7, 0x79F8, 0xD6C5, 0x79FA, 0xD6C4, 0x79FB, 0xB2BE, + 0x7A00, 0xB57D, 0x7A02, 0xDAD6, 0x7A03, 0xDAD8, 0x7A04, 0xDADA, + 0x7A05, 0xB57C, 0x7A08, 0xB57A, 0x7A0A, 0xDAD7, 0x7A0B, 0xB57B, + 0x7A0C, 0xDAD9, 0x7A0D, 0xB579, 0x7A10, 0xDF41, 0x7A11, 0xDEF7, + 0x7A12, 0xDEFA, 0x7A13, 0xDEFE, 0x7A14, 0xB85A, 0x7A15, 0xDEFC, + 0x7A17, 0xDEFB, 0x7A18, 0xDEF8, 0x7A19, 0xDEF9, 0x7A1A, 0xB858, + 0x7A1B, 0xDF40, 0x7A1C, 0xB857, 0x7A1E, 0xB85C, 0x7A1F, 0xB85B, + 0x7A20, 0xB859, 0x7A22, 0xDEFD, 0x7A26, 0xE349, 0x7A28, 0xE348, + 0x7A2B, 0xE344, 0x7A2E, 0xBAD8, 0x7A2F, 0xE347, 0x7A30, 0xE346, + 0x7A31, 0xBAD9, 0x7A37, 0xBD5E, 0x7A39, 0xE6D2, 0x7A3B, 0xBD5F, + 0x7A3C, 0xBD5B, 0x7A3D, 0xBD5D, 0x7A3F, 0xBD5A, 0x7A40, 0xBD5C, + 0x7A44, 0xEAAF, 0x7A46, 0xBF70, 0x7A47, 0xEAB1, 0x7A48, 0xEAB0, + 0x7A4A, 0xE345, 0x7A4B, 0xBF72, 0x7A4C, 0xBF71, 0x7A4D, 0xBF6E, + 0x7A4E, 0xBF6F, 0x7A54, 0xEDB5, 0x7A56, 0xEDB3, 0x7A57, 0xC14A, + 0x7A58, 0xEDB4, 0x7A5A, 0xEDB6, 0x7A5B, 0xEDB2, 0x7A5C, 0xEDB1, + 0x7A5F, 0xF060, 0x7A60, 0xC2AA, 0x7A61, 0xC2A8, 0x7A62, 0xC2A9, + 0x7A67, 0xF2A6, 0x7A68, 0xF2A7, 0x7A69, 0xC3AD, 0x7A6B, 0xC3AC, + 0x7A6C, 0xF4A3, 0x7A6D, 0xF4A4, 0x7A6E, 0xF4A2, 0x7A70, 0xF6F8, + 0x7A71, 0xF6F9, 0x7A74, 0xA5DE, 0x7A75, 0xCA48, 0x7A76, 0xA873, + 0x7A78, 0xCDA5, 0x7A79, 0xAAC6, 0x7A7A, 0xAAC5, 0x7A7B, 0xCDA6, + 0x7A7E, 0xD040, 0x7A7F, 0xACEF, 0x7A80, 0xCFFE, 0x7A81, 0xACF0, + 0x7A84, 0xAFB6, 0x7A85, 0xD2F8, 0x7A86, 0xD2F6, 0x7A87, 0xD2FC, + 0x7A88, 0xAFB7, 0x7A89, 0xD2F7, 0x7A8A, 0xD2FB, 0x7A8B, 0xD2F9, + 0x7A8C, 0xD2FA, 0x7A8F, 0xD6C8, 0x7A90, 0xD6CA, 0x7A92, 0xB2BF, + 0x7A94, 0xD6C9, 0x7A95, 0xB2C0, 0x7A96, 0xB5A2, 0x7A97, 0xB5A1, + 0x7A98, 0xB57E, 0x7A99, 0xDADB, 0x7A9E, 0xDF44, 0x7A9F, 0xB85D, + 0x7AA0, 0xB85E, 0x7AA2, 0xDF43, 0x7AA3, 0xDF42, 0x7AA8, 0xE34A, + 0x7AA9, 0xBADB, 0x7AAA, 0xBADA, 0x7AAB, 0xE34B, 0x7AAC, 0xE34C, + 0x7AAE, 0xBD61, 0x7AAF, 0xBD60, 0x7AB1, 0xEAB5, 0x7AB2, 0xE6D3, + 0x7AB3, 0xE6D5, 0x7AB4, 0xE6D4, 0x7AB5, 0xEAB4, 0x7AB6, 0xEAB2, + 0x7AB7, 0xEAB6, 0x7AB8, 0xEAB3, 0x7ABA, 0xBF73, 0x7ABE, 0xEDB7, + 0x7ABF, 0xC14B, 0x7AC0, 0xEDB8, 0x7AC1, 0xEDB9, 0x7AC4, 0xC2AB, + 0x7AC5, 0xC2AC, 0x7AC7, 0xC475, 0x7ACA, 0xC5D1, 0x7ACB, 0xA5DF, + 0x7AD1, 0xD041, 0x7AD8, 0xD2FD, 0x7AD9, 0xAFB8, 0x7ADF, 0xB3BA, + 0x7AE0, 0xB3B9, 0x7AE3, 0xB5A4, 0x7AE4, 0xDADD, 0x7AE5, 0xB5A3, + 0x7AE6, 0xDADC, 0x7AEB, 0xDF45, 0x7AED, 0xBADC, 0x7AEE, 0xE34D, + 0x7AEF, 0xBADD, 0x7AF6, 0xC476, 0x7AF7, 0xF4A5, 0x7AF9, 0xA6CB, + 0x7AFA, 0xAAC7, 0x7AFB, 0xCDA7, 0x7AFD, 0xACF2, 0x7AFF, 0xACF1, + 0x7B00, 0xD042, 0x7B01, 0xD043, 0x7B04, 0xD340, 0x7B05, 0xD342, + 0x7B06, 0xAFB9, 0x7B08, 0xD344, 0x7B09, 0xD347, 0x7B0A, 0xD345, + 0x7B0E, 0xD346, 0x7B0F, 0xD343, 0x7B10, 0xD2FE, 0x7B11, 0xAFBA, + 0x7B12, 0xD348, 0x7B13, 0xD341, 0x7B18, 0xD6D3, 0x7B19, 0xB2C6, + 0x7B1A, 0xD6DC, 0x7B1B, 0xB2C3, 0x7B1D, 0xD6D5, 0x7B1E, 0xB2C7, + 0x7B20, 0xB2C1, 0x7B22, 0xD6D0, 0x7B23, 0xD6DD, 0x7B24, 0xD6D1, + 0x7B25, 0xD6CE, 0x7B26, 0xB2C5, 0x7B28, 0xB2C2, 0x7B2A, 0xD6D4, + 0x7B2B, 0xD6D7, 0x7B2C, 0xB2C4, 0x7B2D, 0xD6D8, 0x7B2E, 0xB2C8, + 0x7B2F, 0xD6D9, 0x7B30, 0xD6CF, 0x7B31, 0xD6D6, 0x7B32, 0xD6DA, + 0x7B33, 0xD6D2, 0x7B34, 0xD6CD, 0x7B35, 0xD6CB, 0x7B38, 0xD6DB, + 0x7B3B, 0xDADF, 0x7B40, 0xDAE4, 0x7B44, 0xDAE0, 0x7B45, 0xDAE6, + 0x7B46, 0xB5A7, 0x7B47, 0xD6CC, 0x7B48, 0xDAE1, 0x7B49, 0xB5A5, + 0x7B4A, 0xDADE, 0x7B4B, 0xB5AC, 0x7B4C, 0xDAE2, 0x7B4D, 0xB5AB, + 0x7B4E, 0xDAE3, 0x7B4F, 0xB5AD, 0x7B50, 0xB5A8, 0x7B51, 0xB5AE, + 0x7B52, 0xB5A9, 0x7B54, 0xB5AA, 0x7B56, 0xB5A6, 0x7B58, 0xDAE5, + 0x7B60, 0xB861, 0x7B61, 0xDF50, 0x7B63, 0xDF53, 0x7B64, 0xDF47, + 0x7B65, 0xDF4C, 0x7B66, 0xDF46, 0x7B67, 0xB863, 0x7B69, 0xDF4A, + 0x7B6D, 0xDF48, 0x7B6E, 0xB862, 0x7B70, 0xDF4F, 0x7B71, 0xDF4E, + 0x7B72, 0xDF4B, 0x7B73, 0xDF4D, 0x7B74, 0xDF49, 0x7B75, 0xBAE1, + 0x7B76, 0xDF52, 0x7B77, 0xB85F, 0x7B78, 0xDF51, 0x7B82, 0xE35D, + 0x7B84, 0xBAE8, 0x7B85, 0xE358, 0x7B87, 0xBAE7, 0x7B88, 0xE34E, + 0x7B8A, 0xE350, 0x7B8B, 0xBAE0, 0x7B8C, 0xE355, 0x7B8D, 0xE354, + 0x7B8E, 0xE357, 0x7B8F, 0xBAE5, 0x7B90, 0xE352, 0x7B91, 0xE351, + 0x7B94, 0xBAE4, 0x7B95, 0xBADF, 0x7B96, 0xE353, 0x7B97, 0xBAE2, + 0x7B98, 0xE359, 0x7B99, 0xE35B, 0x7B9B, 0xE356, 0x7B9C, 0xE34F, + 0x7B9D, 0xBAE3, 0x7BA0, 0xBD69, 0x7BA1, 0xBADE, 0x7BA4, 0xE35C, + 0x7BAC, 0xE6D9, 0x7BAD, 0xBD62, 0x7BAF, 0xE6DB, 0x7BB1, 0xBD63, + 0x7BB4, 0xBD65, 0x7BB5, 0xE6DE, 0x7BB7, 0xE6D6, 0x7BB8, 0xBAE6, + 0x7BB9, 0xE6DC, 0x7BBE, 0xE6D8, 0x7BC0, 0xB860, 0x7BC1, 0xBD68, + 0x7BC4, 0xBD64, 0x7BC6, 0xBD66, 0x7BC7, 0xBD67, 0x7BC9, 0xBF76, + 0x7BCA, 0xE6DD, 0x7BCB, 0xE6D7, 0x7BCC, 0xBD6A, 0x7BCE, 0xE6DA, + 0x7BD4, 0xEAC0, 0x7BD5, 0xEABB, 0x7BD8, 0xEAC5, 0x7BD9, 0xBF74, + 0x7BDA, 0xEABD, 0x7BDB, 0xBF78, 0x7BDC, 0xEAC3, 0x7BDD, 0xEABA, + 0x7BDE, 0xEAB7, 0x7BDF, 0xEAC6, 0x7BE0, 0xC151, 0x7BE1, 0xBF79, + 0x7BE2, 0xEAC2, 0x7BE3, 0xEAB8, 0x7BE4, 0xBF77, 0x7BE5, 0xEABC, + 0x7BE6, 0xBF7B, 0x7BE7, 0xEAB9, 0x7BE8, 0xEABE, 0x7BE9, 0xBF7A, + 0x7BEA, 0xEAC1, 0x7BEB, 0xEAC4, 0x7BF0, 0xEDCB, 0x7BF1, 0xEDCC, + 0x7BF2, 0xEDBC, 0x7BF3, 0xEDC3, 0x7BF4, 0xEDC1, 0x7BF7, 0xC14F, + 0x7BF8, 0xEDC8, 0x7BF9, 0xEABF, 0x7BFB, 0xEDBF, 0x7BFD, 0xEDC9, + 0x7BFE, 0xC14E, 0x7BFF, 0xEDBE, 0x7C00, 0xEDBD, 0x7C01, 0xEDC7, + 0x7C02, 0xEDC4, 0x7C03, 0xEDC6, 0x7C05, 0xEDBA, 0x7C06, 0xEDCA, + 0x7C07, 0xC14C, 0x7C09, 0xEDC5, 0x7C0A, 0xEDCE, 0x7C0B, 0xEDC2, + 0x7C0C, 0xC150, 0x7C0D, 0xC14D, 0x7C0E, 0xEDC0, 0x7C0F, 0xEDBB, + 0x7C10, 0xEDCD, 0x7C11, 0xBF75, 0x7C19, 0xF063, 0x7C1C, 0xF061, + 0x7C1D, 0xF067, 0x7C1E, 0xC2B0, 0x7C1F, 0xF065, 0x7C20, 0xF064, + 0x7C21, 0xC2B2, 0x7C22, 0xF06A, 0x7C23, 0xC2B1, 0x7C25, 0xF06B, + 0x7C26, 0xF068, 0x7C27, 0xC2AE, 0x7C28, 0xF069, 0x7C29, 0xF062, + 0x7C2A, 0xC2AF, 0x7C2B, 0xC2AD, 0x7C2C, 0xF2AB, 0x7C2D, 0xF066, + 0x7C30, 0xF06C, 0x7C33, 0xF2A8, 0x7C37, 0xC3B2, 0x7C38, 0xC3B0, + 0x7C39, 0xF2AA, 0x7C3B, 0xF2AC, 0x7C3C, 0xF2A9, 0x7C3D, 0xC3B1, + 0x7C3E, 0xC3AE, 0x7C3F, 0xC3AF, 0x7C40, 0xC3B3, 0x7C43, 0xC478, + 0x7C45, 0xF4AA, 0x7C47, 0xF4A9, 0x7C48, 0xF4A7, 0x7C49, 0xF4A6, + 0x7C4A, 0xF4A8, 0x7C4C, 0xC477, 0x7C4D, 0xC479, 0x7C50, 0xC4F0, + 0x7C53, 0xF5E5, 0x7C54, 0xF5E4, 0x7C57, 0xF6FA, 0x7C59, 0xF6FC, + 0x7C5A, 0xF6FE, 0x7C5B, 0xF6FD, 0x7C5C, 0xF6FB, 0x7C5F, 0xC5A3, + 0x7C60, 0xC5A2, 0x7C63, 0xC5D3, 0x7C64, 0xC5D2, 0x7C65, 0xC5D4, + 0x7C66, 0xF7ED, 0x7C67, 0xF7EC, 0x7C69, 0xF8FB, 0x7C6A, 0xF8B8, + 0x7C6B, 0xF8FC, 0x7C6C, 0xC658, 0x7C6E, 0xC659, 0x7C6F, 0xF96D, + 0x7C72, 0xC67E, 0x7C73, 0xA6CC, 0x7C75, 0xCDA8, 0x7C78, 0xD045, + 0x7C79, 0xD046, 0x7C7A, 0xD044, 0x7C7D, 0xACF3, 0x7C7F, 0xD047, + 0x7C80, 0xD048, 0x7C81, 0xD049, 0x7C84, 0xD349, 0x7C85, 0xD34F, + 0x7C88, 0xD34D, 0x7C89, 0xAFBB, 0x7C8A, 0xD34B, 0x7C8C, 0xD34C, + 0x7C8D, 0xD34E, 0x7C91, 0xD34A, 0x7C92, 0xB2C9, 0x7C94, 0xD6DE, + 0x7C95, 0xB2CB, 0x7C96, 0xD6E0, 0x7C97, 0xB2CA, 0x7C98, 0xD6DF, + 0x7C9E, 0xDAE8, 0x7C9F, 0xB5AF, 0x7CA1, 0xDAEA, 0x7CA2, 0xDAE7, + 0x7CA3, 0xD6E1, 0x7CA5, 0xB5B0, 0x7CA7, 0xF9DB, 0x7CA8, 0xDAE9, + 0x7CAF, 0xDF56, 0x7CB1, 0xB864, 0x7CB2, 0xDF54, 0x7CB3, 0xB865, + 0x7CB4, 0xDF55, 0x7CB5, 0xB866, 0x7CB9, 0xBAE9, 0x7CBA, 0xE361, + 0x7CBB, 0xE35E, 0x7CBC, 0xE360, 0x7CBD, 0xBAEA, 0x7CBE, 0xBAEB, + 0x7CBF, 0xE35F, 0x7CC5, 0xE6DF, 0x7CC8, 0xE6E0, 0x7CCA, 0xBD6B, + 0x7CCB, 0xE6E2, 0x7CCC, 0xE6E1, 0x7CCE, 0xA261, 0x7CD0, 0xEACA, + 0x7CD1, 0xEACB, 0x7CD2, 0xEAC7, 0x7CD4, 0xEAC8, 0x7CD5, 0xBF7C, + 0x7CD6, 0xBF7D, 0x7CD7, 0xEAC9, 0x7CD9, 0xC157, 0x7CDC, 0xC153, + 0x7CDD, 0xC158, 0x7CDE, 0xC154, 0x7CDF, 0xC156, 0x7CE0, 0xC152, + 0x7CE2, 0xC155, 0x7CE7, 0xC2B3, 0x7CE8, 0xEDCF, 0x7CEA, 0xF2AE, + 0x7CEC, 0xF2AD, 0x7CEE, 0xF4AB, 0x7CEF, 0xC47A, 0x7CF0, 0xC47B, + 0x7CF1, 0xF741, 0x7CF2, 0xF5E6, 0x7CF4, 0xF740, 0x7CF6, 0xF8FD, + 0x7CF7, 0xF9A4, 0x7CF8, 0xA6CD, 0x7CFB, 0xA874, 0x7CFD, 0xCDA9, + 0x7CFE, 0xAAC8, 0x7D00, 0xACF6, 0x7D01, 0xD04C, 0x7D02, 0xACF4, + 0x7D03, 0xD04A, 0x7D04, 0xACF9, 0x7D05, 0xACF5, 0x7D06, 0xACFA, + 0x7D07, 0xACF8, 0x7D08, 0xD04B, 0x7D09, 0xACF7, 0x7D0A, 0xAFBF, + 0x7D0B, 0xAFBE, 0x7D0C, 0xD35A, 0x7D0D, 0xAFC7, 0x7D0E, 0xD353, + 0x7D0F, 0xD359, 0x7D10, 0xAFC3, 0x7D11, 0xD352, 0x7D12, 0xD358, + 0x7D13, 0xD356, 0x7D14, 0xAFC2, 0x7D15, 0xAFC4, 0x7D16, 0xD355, + 0x7D17, 0xAFBD, 0x7D18, 0xD354, 0x7D19, 0xAFC8, 0x7D1A, 0xAFC5, + 0x7D1B, 0xAFC9, 0x7D1C, 0xAFC6, 0x7D1D, 0xD351, 0x7D1E, 0xD350, + 0x7D1F, 0xD357, 0x7D20, 0xAFC0, 0x7D21, 0xAFBC, 0x7D22, 0xAFC1, + 0x7D28, 0xD6F0, 0x7D29, 0xD6E9, 0x7D2B, 0xB5B5, 0x7D2C, 0xD6E8, + 0x7D2E, 0xB2CF, 0x7D2F, 0xB2D6, 0x7D30, 0xB2D3, 0x7D31, 0xB2D9, + 0x7D32, 0xB2D8, 0x7D33, 0xB2D4, 0x7D35, 0xD6E2, 0x7D36, 0xD6E5, + 0x7D38, 0xD6E4, 0x7D39, 0xB2D0, 0x7D3A, 0xD6E6, 0x7D3B, 0xD6EF, + 0x7D3C, 0xB2D1, 0x7D3D, 0xD6E3, 0x7D3E, 0xD6EC, 0x7D3F, 0xD6ED, + 0x7D40, 0xB2D2, 0x7D41, 0xD6EA, 0x7D42, 0xB2D7, 0x7D43, 0xB2CD, + 0x7D44, 0xB2D5, 0x7D45, 0xD6E7, 0x7D46, 0xB2CC, 0x7D47, 0xD6EB, + 0x7D4A, 0xD6EE, 0x7D4E, 0xDAFB, 0x7D4F, 0xDAF2, 0x7D50, 0xB5B2, + 0x7D51, 0xDAF9, 0x7D52, 0xDAF6, 0x7D53, 0xDAEE, 0x7D54, 0xDAF7, + 0x7D55, 0xB5B4, 0x7D56, 0xDAEF, 0x7D58, 0xDAEB, 0x7D5B, 0xB86C, + 0x7D5C, 0xDAF4, 0x7D5E, 0xB5B1, 0x7D5F, 0xDAFA, 0x7D61, 0xB5B8, + 0x7D62, 0xB5BA, 0x7D63, 0xDAED, 0x7D66, 0xB5B9, 0x7D67, 0xDAF0, + 0x7D68, 0xB5B3, 0x7D69, 0xDAF8, 0x7D6A, 0xDAF1, 0x7D6B, 0xDAF5, + 0x7D6D, 0xDAF3, 0x7D6E, 0xB5B6, 0x7D6F, 0xDAEC, 0x7D70, 0xB5BB, + 0x7D71, 0xB2CE, 0x7D72, 0xB5B7, 0x7D73, 0xB5BC, 0x7D79, 0xB868, + 0x7D7A, 0xDF5D, 0x7D7B, 0xDF5F, 0x7D7C, 0xDF61, 0x7D7D, 0xDF65, + 0x7D7F, 0xDF5B, 0x7D80, 0xDF59, 0x7D81, 0xB86A, 0x7D83, 0xDF60, + 0x7D84, 0xDF64, 0x7D85, 0xDF5C, 0x7D86, 0xDF58, 0x7D88, 0xDF57, + 0x7D8C, 0xDF62, 0x7D8D, 0xDF5A, 0x7D8E, 0xDF5E, 0x7D8F, 0xB86B, + 0x7D91, 0xB869, 0x7D92, 0xDF66, 0x7D93, 0xB867, 0x7D94, 0xDF63, + 0x7D96, 0xE372, 0x7D9C, 0xBAEE, 0x7D9D, 0xE36A, 0x7D9E, 0xBD78, + 0x7D9F, 0xE374, 0x7DA0, 0xBAF1, 0x7DA1, 0xE378, 0x7DA2, 0xBAF7, + 0x7DA3, 0xE365, 0x7DA6, 0xE375, 0x7DA7, 0xE362, 0x7DA9, 0xE377, + 0x7DAA, 0xE366, 0x7DAC, 0xBAFE, 0x7DAD, 0xBAFB, 0x7DAE, 0xE376, + 0x7DAF, 0xE370, 0x7DB0, 0xBAED, 0x7DB1, 0xBAF5, 0x7DB2, 0xBAF4, + 0x7DB4, 0xBAF3, 0x7DB5, 0xBAF9, 0x7DB7, 0xE363, 0x7DB8, 0xBAFA, + 0x7DB9, 0xE371, 0x7DBA, 0xBAF6, 0x7DBB, 0xBAEC, 0x7DBC, 0xE373, + 0x7DBD, 0xBAEF, 0x7DBE, 0xBAF0, 0x7DBF, 0xBAF8, 0x7DC0, 0xE368, + 0x7DC1, 0xE367, 0x7DC2, 0xE364, 0x7DC4, 0xE36C, 0x7DC5, 0xE369, + 0x7DC6, 0xE36D, 0x7DC7, 0xBAFD, 0x7DC9, 0xE379, 0x7DCA, 0xBAF2, + 0x7DCB, 0xE36E, 0x7DCC, 0xE36F, 0x7DCE, 0xE36B, 0x7DD2, 0xBAFC, + 0x7DD7, 0xE6E7, 0x7DD8, 0xBD70, 0x7DD9, 0xBD79, 0x7DDA, 0xBD75, + 0x7DDB, 0xE6E4, 0x7DDD, 0xBD72, 0x7DDE, 0xBD76, 0x7DDF, 0xE6F0, + 0x7DE0, 0xBD6C, 0x7DE1, 0xE6E8, 0x7DE3, 0xBD74, 0x7DE6, 0xE6EB, + 0x7DE7, 0xE6E6, 0x7DE8, 0xBD73, 0x7DE9, 0xBD77, 0x7DEA, 0xE6E5, + 0x7DEC, 0xBD71, 0x7DEE, 0xE6EF, 0x7DEF, 0xBD6E, 0x7DF0, 0xE6EE, + 0x7DF1, 0xE6ED, 0x7DF2, 0xBD7A, 0x7DF3, 0xE572, 0x7DF4, 0xBD6D, + 0x7DF6, 0xE6EC, 0x7DF7, 0xE6E3, 0x7DF9, 0xBD7B, 0x7DFA, 0xE6EA, + 0x7DFB, 0xBD6F, 0x7E03, 0xE6E9, 0x7E08, 0xBFA2, 0x7E09, 0xBFA7, + 0x7E0A, 0xBF7E, 0x7E0B, 0xEAD8, 0x7E0C, 0xEACF, 0x7E0D, 0xEADB, + 0x7E0E, 0xEAD3, 0x7E0F, 0xEAD9, 0x7E10, 0xBFA8, 0x7E11, 0xBFA1, + 0x7E12, 0xEACC, 0x7E13, 0xEAD2, 0x7E14, 0xEADC, 0x7E15, 0xEAD5, + 0x7E16, 0xEADA, 0x7E17, 0xEACE, 0x7E1A, 0xEAD6, 0x7E1B, 0xBFA3, + 0x7E1C, 0xEAD4, 0x7E1D, 0xBFA6, 0x7E1E, 0xBFA5, 0x7E1F, 0xEAD0, + 0x7E20, 0xEAD1, 0x7E21, 0xEACD, 0x7E22, 0xEAD7, 0x7E23, 0xBFA4, + 0x7E24, 0xEADE, 0x7E25, 0xEADD, 0x7E29, 0xEDDA, 0x7E2A, 0xEDD6, + 0x7E2B, 0xC15F, 0x7E2D, 0xEDD0, 0x7E2E, 0xC159, 0x7E2F, 0xC169, + 0x7E30, 0xEDDC, 0x7E31, 0xC161, 0x7E32, 0xC15D, 0x7E33, 0xEDD3, + 0x7E34, 0xC164, 0x7E35, 0xC167, 0x7E36, 0xEDDE, 0x7E37, 0xC15C, + 0x7E38, 0xEDD5, 0x7E39, 0xC165, 0x7E3A, 0xEDE0, 0x7E3B, 0xEDDD, + 0x7E3C, 0xEDD1, 0x7E3D, 0xC160, 0x7E3E, 0xC15A, 0x7E3F, 0xC168, + 0x7E40, 0xEDD8, 0x7E41, 0xC163, 0x7E42, 0xEDD2, 0x7E43, 0xC15E, + 0x7E44, 0xEDDF, 0x7E45, 0xC162, 0x7E46, 0xC15B, 0x7E47, 0xEDD9, + 0x7E48, 0xC166, 0x7E49, 0xEDD7, 0x7E4C, 0xEDDB, 0x7E50, 0xF06E, + 0x7E51, 0xF074, 0x7E52, 0xC2B9, 0x7E53, 0xF077, 0x7E54, 0xC2B4, + 0x7E55, 0xC2B5, 0x7E56, 0xF06F, 0x7E57, 0xF076, 0x7E58, 0xF071, + 0x7E59, 0xC2BA, 0x7E5A, 0xC2B7, 0x7E5C, 0xF06D, 0x7E5E, 0xC2B6, + 0x7E5F, 0xF073, 0x7E60, 0xF075, 0x7E61, 0xC2B8, 0x7E62, 0xF072, + 0x7E63, 0xF070, 0x7E68, 0xF2B8, 0x7E69, 0xC3B7, 0x7E6A, 0xC3B8, + 0x7E6B, 0xC3B4, 0x7E6D, 0xC3B5, 0x7E6F, 0xF2B4, 0x7E70, 0xF2B2, + 0x7E72, 0xF2B6, 0x7E73, 0xC3BA, 0x7E74, 0xF2B7, 0x7E75, 0xF2B0, + 0x7E76, 0xF2AF, 0x7E77, 0xF2B3, 0x7E78, 0xF2B1, 0x7E79, 0xC3B6, + 0x7E7A, 0xF2B5, 0x7E7B, 0xF4AC, 0x7E7C, 0xC47E, 0x7E7D, 0xC47D, + 0x7E7E, 0xF4AD, 0x7E80, 0xF4AF, 0x7E81, 0xF4AE, 0x7E82, 0xC4A1, + 0x7E86, 0xF5EB, 0x7E87, 0xF5E8, 0x7E88, 0xF5E9, 0x7E8A, 0xF5E7, + 0x7E8B, 0xF5EA, 0x7E8C, 0xC4F2, 0x7E8D, 0xF5EC, 0x7E8F, 0xC4F1, + 0x7E91, 0xF742, 0x7E93, 0xC5D5, 0x7E94, 0xC5D7, 0x7E95, 0xF7EE, + 0x7E96, 0xC5D6, 0x7E97, 0xF8B9, 0x7E98, 0xF940, 0x7E99, 0xF942, + 0x7E9A, 0xF8FE, 0x7E9B, 0xF941, 0x7E9C, 0xC66C, 0x7F36, 0xA6CE, + 0x7F38, 0xACFB, 0x7F39, 0xD26F, 0x7F3A, 0xAFCA, 0x7F3D, 0xB2DA, + 0x7F3E, 0xDAFC, 0x7F3F, 0xDAFD, 0x7F43, 0xEADF, 0x7F44, 0xC16A, + 0x7F45, 0xEDE1, 0x7F48, 0xC2BB, 0x7F4A, 0xF2BA, 0x7F4B, 0xF2B9, + 0x7F4C, 0xC4A2, 0x7F4D, 0xF5ED, 0x7F4F, 0xF743, 0x7F50, 0xC5F8, + 0x7F51, 0xCA49, 0x7F54, 0xAAC9, 0x7F55, 0xA875, 0x7F58, 0xD04D, + 0x7F5B, 0xD360, 0x7F5C, 0xD35B, 0x7F5D, 0xD35F, 0x7F5E, 0xD35D, + 0x7F5F, 0xAFCB, 0x7F60, 0xD35E, 0x7F61, 0xD35C, 0x7F63, 0xD6F1, + 0x7F65, 0xDAFE, 0x7F66, 0xDB40, 0x7F67, 0xDF69, 0x7F68, 0xDF6A, + 0x7F69, 0xB86E, 0x7F6A, 0xB86F, 0x7F6B, 0xDF68, 0x7F6C, 0xDF6B, + 0x7F6D, 0xDF67, 0x7F6E, 0xB86D, 0x7F70, 0xBB40, 0x7F72, 0xB870, + 0x7F73, 0xE37A, 0x7F75, 0xBD7C, 0x7F76, 0xE6F1, 0x7F77, 0xBD7D, + 0x7F79, 0xBFA9, 0x7F7A, 0xEAE2, 0x7F7B, 0xEAE0, 0x7F7C, 0xEAE1, + 0x7F7D, 0xEDE4, 0x7F7E, 0xEDE3, 0x7F7F, 0xEDE2, 0x7F83, 0xF2BB, + 0x7F85, 0xC3B9, 0x7F86, 0xF2BC, 0x7F87, 0xF744, 0x7F88, 0xC5F9, + 0x7F89, 0xF8BA, 0x7F8A, 0xA6CF, 0x7F8B, 0xAACB, 0x7F8C, 0xAACA, + 0x7F8D, 0xD04F, 0x7F8E, 0xACFC, 0x7F91, 0xD04E, 0x7F92, 0xD362, + 0x7F94, 0xAFCC, 0x7F95, 0xD6F2, 0x7F96, 0xD361, 0x7F9A, 0xB2DC, + 0x7F9B, 0xD6F5, 0x7F9C, 0xD6F3, 0x7F9D, 0xD6F4, 0x7F9E, 0xB2DB, + 0x7FA0, 0xDB42, 0x7FA1, 0xDB43, 0x7FA2, 0xDB41, 0x7FA4, 0xB873, + 0x7FA5, 0xDF6D, 0x7FA6, 0xDF6C, 0x7FA7, 0xDF6E, 0x7FA8, 0xB872, + 0x7FA9, 0xB871, 0x7FAC, 0xE6F2, 0x7FAD, 0xE6F4, 0x7FAF, 0xBD7E, + 0x7FB0, 0xE6F3, 0x7FB1, 0xEAE3, 0x7FB2, 0xBFAA, 0x7FB3, 0xF079, + 0x7FB5, 0xF078, 0x7FB6, 0xC3BB, 0x7FB7, 0xF2BD, 0x7FB8, 0xC3BD, + 0x7FB9, 0xC3BC, 0x7FBA, 0xF4B0, 0x7FBB, 0xF5EE, 0x7FBC, 0xC4F3, + 0x7FBD, 0xA6D0, 0x7FBE, 0xD050, 0x7FBF, 0xACFD, 0x7FC0, 0xD365, + 0x7FC1, 0xAFCE, 0x7FC2, 0xD364, 0x7FC3, 0xD363, 0x7FC5, 0xAFCD, + 0x7FC7, 0xD6FB, 0x7FC9, 0xD6FD, 0x7FCA, 0xD6F6, 0x7FCB, 0xD6F7, + 0x7FCC, 0xB2DD, 0x7FCD, 0xD6F8, 0x7FCE, 0xB2DE, 0x7FCF, 0xD6FC, + 0x7FD0, 0xD6F9, 0x7FD1, 0xD6FA, 0x7FD2, 0xB2DF, 0x7FD4, 0xB5BE, + 0x7FD5, 0xB5BF, 0x7FD7, 0xDB44, 0x7FDB, 0xDF6F, 0x7FDC, 0xDF70, + 0x7FDE, 0xE37E, 0x7FDF, 0xBB43, 0x7FE0, 0xBB41, 0x7FE1, 0xBB42, + 0x7FE2, 0xE37B, 0x7FE3, 0xE37C, 0x7FE5, 0xE37D, 0x7FE6, 0xE6F9, + 0x7FE8, 0xE6FA, 0x7FE9, 0xBDA1, 0x7FEA, 0xE6F7, 0x7FEB, 0xE6F6, + 0x7FEC, 0xE6F8, 0x7FED, 0xE6F5, 0x7FEE, 0xBFAD, 0x7FEF, 0xEAE4, + 0x7FF0, 0xBFAB, 0x7FF1, 0xBFAC, 0x7FF2, 0xEDE6, 0x7FF3, 0xC16B, + 0x7FF4, 0xEDE5, 0x7FF5, 0xEFA8, 0x7FF7, 0xF07A, 0x7FF8, 0xF07B, + 0x7FF9, 0xC2BC, 0x7FFB, 0xC2BD, 0x7FFC, 0xC16C, 0x7FFD, 0xF2BE, + 0x7FFE, 0xF2BF, 0x7FFF, 0xF4B1, 0x8000, 0xC4A3, 0x8001, 0xA6D1, + 0x8003, 0xA6D2, 0x8004, 0xACFE, 0x8005, 0xAACC, 0x8006, 0xAFCF, + 0x8007, 0xD051, 0x800B, 0xB5C0, 0x800C, 0xA6D3, 0x800D, 0xAD41, + 0x800E, 0xD052, 0x800F, 0xD053, 0x8010, 0xAD40, 0x8011, 0xAD42, + 0x8012, 0xA6D4, 0x8014, 0xD054, 0x8015, 0xAFD1, 0x8016, 0xD366, + 0x8017, 0xAFD3, 0x8018, 0xAFD0, 0x8019, 0xAFD2, 0x801B, 0xD741, + 0x801C, 0xB2E0, 0x801E, 0xD740, 0x801F, 0xD6FE, 0x8021, 0xDF71, + 0x8024, 0xE3A1, 0x8026, 0xBDA2, 0x8028, 0xBFAE, 0x8029, 0xEAE6, + 0x802A, 0xEAE5, 0x802C, 0xEDE7, 0x8030, 0xF5EF, 0x8033, 0xA6D5, + 0x8034, 0xCB73, 0x8035, 0xCDAA, 0x8036, 0xAD43, 0x8037, 0xD055, + 0x8039, 0xD368, 0x803D, 0xAFD4, 0x803E, 0xD367, 0x803F, 0xAFD5, + 0x8043, 0xD743, 0x8046, 0xB2E2, 0x8047, 0xD742, 0x8048, 0xD744, + 0x804A, 0xB2E1, 0x804F, 0xDB46, 0x8050, 0xDB47, 0x8051, 0xDB45, + 0x8052, 0xB5C1, 0x8056, 0xB874, 0x8058, 0xB875, 0x805A, 0xBB45, + 0x805C, 0xE3A3, 0x805D, 0xE3A2, 0x805E, 0xBB44, 0x8064, 0xE6FB, + 0x8067, 0xE6FC, 0x806C, 0xEAE7, 0x806F, 0xC170, 0x8070, 0xC16F, + 0x8071, 0xC16D, 0x8072, 0xC16E, 0x8073, 0xC171, 0x8075, 0xF07C, + 0x8076, 0xC2BF, 0x8077, 0xC2BE, 0x8078, 0xF2C0, 0x8079, 0xF4B2, + 0x807D, 0xC5A5, 0x807E, 0xC5A4, 0x807F, 0xA6D6, 0x8082, 0xD1FB, + 0x8084, 0xB877, 0x8085, 0xB5C2, 0x8086, 0xB876, 0x8087, 0xBB46, + 0x8089, 0xA6D7, 0x808A, 0xC9A9, 0x808B, 0xA6D8, 0x808C, 0xA6D9, + 0x808F, 0xCDAB, 0x8090, 0xCB76, 0x8092, 0xCB77, 0x8093, 0xA877, + 0x8095, 0xCB74, 0x8096, 0xA876, 0x8098, 0xA879, 0x8099, 0xCB75, + 0x809A, 0xA87B, 0x809B, 0xA87A, 0x809C, 0xCB78, 0x809D, 0xA878, + 0x80A1, 0xAAD1, 0x80A2, 0xAACF, 0x80A3, 0xCDAD, 0x80A5, 0xAACE, + 0x80A9, 0xAAD3, 0x80AA, 0xAAD5, 0x80AB, 0xAAD2, 0x80AD, 0xCDB0, + 0x80AE, 0xCDAC, 0x80AF, 0xAAD6, 0x80B1, 0xAAD0, 0x80B2, 0xA87C, + 0x80B4, 0xAAD4, 0x80B5, 0xCDAF, 0x80B8, 0xCDAE, 0x80BA, 0xAACD, + 0x80C2, 0xD05B, 0x80C3, 0xAD47, 0x80C4, 0xAD48, 0x80C5, 0xD05D, + 0x80C7, 0xD057, 0x80C8, 0xD05A, 0x80C9, 0xD063, 0x80CA, 0xD061, + 0x80CC, 0xAD49, 0x80CD, 0xD067, 0x80CE, 0xAD4C, 0x80CF, 0xD064, + 0x80D0, 0xD05C, 0x80D1, 0xD059, 0x80D4, 0xDB49, 0x80D5, 0xD062, + 0x80D6, 0xAD44, 0x80D7, 0xD065, 0x80D8, 0xD056, 0x80D9, 0xD05F, + 0x80DA, 0xAD46, 0x80DB, 0xAD4B, 0x80DC, 0xD060, 0x80DD, 0xAD4F, + 0x80DE, 0xAD4D, 0x80E0, 0xD058, 0x80E1, 0xAD4A, 0x80E3, 0xD05E, + 0x80E4, 0xAD4E, 0x80E5, 0xAD45, 0x80E6, 0xD066, 0x80ED, 0xAFDA, + 0x80EF, 0xAFE3, 0x80F0, 0xAFD8, 0x80F1, 0xAFD6, 0x80F2, 0xD36A, + 0x80F3, 0xAFDE, 0x80F4, 0xAFDB, 0x80F5, 0xD36C, 0x80F8, 0xAFDD, + 0x80F9, 0xD36B, 0x80FA, 0xD369, 0x80FB, 0xD36E, 0x80FC, 0xAFE2, + 0x80FD, 0xAFE0, 0x80FE, 0xDB48, 0x8100, 0xD36F, 0x8101, 0xD36D, + 0x8102, 0xAFD7, 0x8105, 0xAFD9, 0x8106, 0xAFDC, 0x8108, 0xAFDF, + 0x810A, 0xAFE1, 0x8115, 0xD74E, 0x8116, 0xB2E4, 0x8118, 0xD745, + 0x8119, 0xD747, 0x811B, 0xD748, 0x811D, 0xD750, 0x811E, 0xD74C, + 0x811F, 0xD74A, 0x8121, 0xD74D, 0x8122, 0xD751, 0x8123, 0xB2E5, + 0x8124, 0xB2E9, 0x8125, 0xD746, 0x8127, 0xD74F, 0x8129, 0xB2E7, + 0x812B, 0xB2E6, 0x812C, 0xD74B, 0x812D, 0xD749, 0x812F, 0xB2E3, + 0x8130, 0xB2E8, 0x8139, 0xB5C8, 0x813A, 0xDB51, 0x813D, 0xDB4F, + 0x813E, 0xB5CA, 0x8143, 0xDB4A, 0x8144, 0xDFA1, 0x8146, 0xB5C9, + 0x8147, 0xDB4E, 0x814A, 0xDB4B, 0x814B, 0xB5C5, 0x814C, 0xB5CB, + 0x814D, 0xDB50, 0x814E, 0xB5C7, 0x814F, 0xDB4D, 0x8150, 0xBB47, + 0x8151, 0xB5C6, 0x8152, 0xDB4C, 0x8153, 0xB5CC, 0x8154, 0xB5C4, + 0x8155, 0xB5C3, 0x815B, 0xDF77, 0x815C, 0xDF75, 0x815E, 0xDF7B, + 0x8160, 0xDF73, 0x8161, 0xDFA2, 0x8162, 0xDF78, 0x8164, 0xDF72, + 0x8165, 0xB87B, 0x8166, 0xB8A3, 0x8167, 0xDF7D, 0x8169, 0xDF76, + 0x816B, 0xB87E, 0x816E, 0xB87C, 0x816F, 0xDF7E, 0x8170, 0xB879, + 0x8171, 0xB878, 0x8172, 0xDF79, 0x8173, 0xB87D, 0x8174, 0xB5CD, + 0x8176, 0xDF7C, 0x8177, 0xDF74, 0x8178, 0xB87A, 0x8179, 0xB8A1, + 0x817A, 0xB8A2, 0x817F, 0xBB4C, 0x8180, 0xBB48, 0x8182, 0xBB4D, + 0x8183, 0xE3A6, 0x8186, 0xE3A5, 0x8187, 0xE3A7, 0x8188, 0xBB4A, + 0x8189, 0xE3A4, 0x818A, 0xBB4B, 0x818B, 0xE3AA, 0x818C, 0xE3A9, + 0x818D, 0xE3A8, 0x818F, 0xBB49, 0x8195, 0xE741, 0x8197, 0xE744, + 0x8198, 0xBDA8, 0x8199, 0xE743, 0x819A, 0xBDA7, 0x819B, 0xBDA3, + 0x819C, 0xBDA4, 0x819D, 0xBDA5, 0x819E, 0xE740, 0x819F, 0xE6FE, + 0x81A0, 0xBDA6, 0x81A2, 0xE742, 0x81A3, 0xE6FD, 0x81A6, 0xEAE9, + 0x81A7, 0xEAF3, 0x81A8, 0xBFB1, 0x81A9, 0xBFB0, 0x81AB, 0xEAED, + 0x81AC, 0xEAEF, 0x81AE, 0xEAEA, 0x81B0, 0xEAEE, 0x81B1, 0xEAE8, + 0x81B2, 0xEAF1, 0x81B3, 0xBFAF, 0x81B4, 0xEAF0, 0x81B5, 0xEAEC, + 0x81B7, 0xEAF2, 0x81B9, 0xEAEB, 0x81BA, 0xC174, 0x81BB, 0xEDE8, + 0x81BC, 0xEDEE, 0x81BD, 0xC178, 0x81BE, 0xC17A, 0x81BF, 0xC177, + 0x81C0, 0xC176, 0x81C2, 0xC175, 0x81C3, 0xC173, 0x81C4, 0xEDE9, + 0x81C5, 0xEDEC, 0x81C6, 0xC172, 0x81C7, 0xEDED, 0x81C9, 0xC179, + 0x81CA, 0xEDEB, 0x81CC, 0xEDEA, 0x81CD, 0xC2C0, 0x81CF, 0xC2C1, + 0x81D0, 0xF0A1, 0x81D1, 0xF07D, 0x81D2, 0xF07E, 0x81D5, 0xF2C2, + 0x81D7, 0xF2C1, 0x81D8, 0xC3BE, 0x81D9, 0xF4B4, 0x81DA, 0xC4A4, + 0x81DB, 0xF4B3, 0x81DD, 0xF5F0, 0x81DE, 0xF745, 0x81DF, 0xC5A6, + 0x81E0, 0xF943, 0x81E1, 0xF944, 0x81E2, 0xC5D8, 0x81E3, 0xA6DA, + 0x81E5, 0xAAD7, 0x81E6, 0xDB52, 0x81E7, 0xBB4E, 0x81E8, 0xC17B, + 0x81E9, 0xEDEF, 0x81EA, 0xA6DB, 0x81EC, 0xAFE5, 0x81ED, 0xAFE4, + 0x81EE, 0xDB53, 0x81F2, 0xEAF4, 0x81F3, 0xA6DC, 0x81F4, 0xAD50, + 0x81F7, 0xDB54, 0x81F8, 0xDB55, 0x81F9, 0xDB56, 0x81FA, 0xBB4F, + 0x81FB, 0xBFB2, 0x81FC, 0xA6DD, 0x81FE, 0xAAD8, 0x81FF, 0xD068, + 0x8200, 0xAFE6, 0x8201, 0xD370, 0x8202, 0xB2EA, 0x8204, 0xDB57, + 0x8205, 0xB8A4, 0x8207, 0xBB50, 0x8208, 0xBFB3, 0x8209, 0xC17C, + 0x820A, 0xC2C2, 0x820B, 0xF4B5, 0x820C, 0xA6DE, 0x820D, 0xAAD9, + 0x8210, 0xAFE7, 0x8211, 0xD752, 0x8212, 0xB5CE, 0x8214, 0xBB51, + 0x8215, 0xE3AB, 0x8216, 0xE745, 0x821B, 0xA6DF, 0x821C, 0xB5CF, + 0x821D, 0xDFA3, 0x821E, 0xBB52, 0x821F, 0xA6E0, 0x8220, 0xCDB1, + 0x8221, 0xD069, 0x8222, 0xAD51, 0x8225, 0xD372, 0x8228, 0xAFEA, + 0x822A, 0xAFE8, 0x822B, 0xAFE9, 0x822C, 0xAFEB, 0x822F, 0xD371, + 0x8232, 0xD757, 0x8233, 0xD754, 0x8234, 0xD756, 0x8235, 0xB2EB, + 0x8236, 0xB2ED, 0x8237, 0xB2EC, 0x8238, 0xD753, 0x8239, 0xB2EE, + 0x823A, 0xD755, 0x823C, 0xDB58, 0x823D, 0xDB59, 0x823F, 0xDB5A, + 0x8240, 0xDFA6, 0x8242, 0xDFA7, 0x8244, 0xDFA5, 0x8245, 0xDFA8, + 0x8247, 0xB8A5, 0x8249, 0xDFA4, 0x824B, 0xBB53, 0x824E, 0xE74A, + 0x824F, 0xE746, 0x8250, 0xE749, 0x8251, 0xE74B, 0x8252, 0xE748, + 0x8253, 0xE747, 0x8255, 0xEAF5, 0x8256, 0xEAF6, 0x8257, 0xEAF7, + 0x8258, 0xBFB4, 0x8259, 0xBFB5, 0x825A, 0xEDF1, 0x825B, 0xEDF0, + 0x825C, 0xEDF2, 0x825E, 0xF0A3, 0x825F, 0xF0A2, 0x8261, 0xF2C4, + 0x8263, 0xF2C5, 0x8264, 0xF2C3, 0x8266, 0xC4A5, 0x8268, 0xF4B6, + 0x8269, 0xF4B7, 0x826B, 0xF746, 0x826C, 0xF7EF, 0x826D, 0xF8BB, + 0x826E, 0xA6E1, 0x826F, 0xA87D, 0x8271, 0xC17D, 0x8272, 0xA6E2, + 0x8274, 0xD758, 0x8275, 0xDB5B, 0x8277, 0xC641, 0x8278, 0xCA4A, + 0x827C, 0xCA4B, 0x827D, 0xCA4D, 0x827E, 0xA6E3, 0x827F, 0xCA4E, + 0x8280, 0xCA4C, 0x8283, 0xCBA2, 0x8284, 0xCBA3, 0x8285, 0xCB7B, + 0x828A, 0xCBA1, 0x828B, 0xA8A1, 0x828D, 0xA8A2, 0x828E, 0xCB7C, + 0x828F, 0xCB7A, 0x8290, 0xCB79, 0x8291, 0xCB7D, 0x8292, 0xA87E, + 0x8293, 0xCB7E, 0x8294, 0xD06A, 0x8298, 0xCDB6, 0x8299, 0xAADC, + 0x829A, 0xCDB5, 0x829B, 0xCDB7, 0x829D, 0xAADB, 0x829E, 0xCDBC, + 0x829F, 0xAADF, 0x82A0, 0xCDB2, 0x82A1, 0xCDC0, 0x82A2, 0xCDC6, + 0x82A3, 0xAAE6, 0x82A4, 0xCDC3, 0x82A5, 0xAAE3, 0x82A7, 0xCDB9, + 0x82A8, 0xCDBF, 0x82A9, 0xCDC1, 0x82AB, 0xCDB4, 0x82AC, 0xAAE2, + 0x82AD, 0xAADD, 0x82AE, 0xCDBA, 0x82AF, 0xAAE4, 0x82B0, 0xAAE7, + 0x82B1, 0xAAE1, 0x82B3, 0xAADA, 0x82B4, 0xCDBE, 0x82B5, 0xCDB8, + 0x82B6, 0xCDC5, 0x82B7, 0xAAE9, 0x82B8, 0xAAE5, 0x82B9, 0xAAE0, + 0x82BA, 0xCDBD, 0x82BB, 0xAFEC, 0x82BC, 0xCDBB, 0x82BD, 0xAADE, + 0x82BE, 0xAAE8, 0x82C0, 0xCDB3, 0x82C2, 0xCDC2, 0x82C3, 0xCDC4, + 0x82D1, 0xAD62, 0x82D2, 0xAD5C, 0x82D3, 0xAD64, 0x82D4, 0xAD61, + 0x82D5, 0xD071, 0x82D6, 0xD074, 0x82D7, 0xAD5D, 0x82D9, 0xD06B, + 0x82DB, 0xAD56, 0x82DC, 0xAD60, 0x82DE, 0xAD63, 0x82DF, 0xAD65, + 0x82E0, 0xD0A2, 0x82E1, 0xD077, 0x82E3, 0xAD55, 0x82E4, 0xD0A1, + 0x82E5, 0xAD59, 0x82E6, 0xAD57, 0x82E7, 0xAD52, 0x82E8, 0xD06F, + 0x82EA, 0xD07E, 0x82EB, 0xD073, 0x82EC, 0xD076, 0x82ED, 0xD0A5, + 0x82EF, 0xAD66, 0x82F0, 0xD07D, 0x82F1, 0xAD5E, 0x82F2, 0xD078, + 0x82F3, 0xD0A4, 0x82F4, 0xD075, 0x82F5, 0xD079, 0x82F6, 0xD07C, + 0x82F9, 0xD06D, 0x82FA, 0xD0A3, 0x82FB, 0xD07B, 0x82FE, 0xD06C, + 0x8300, 0xD070, 0x8301, 0xAD5F, 0x8302, 0xAD5A, 0x8303, 0xAD53, + 0x8304, 0xAD58, 0x8305, 0xAD54, 0x8306, 0xAD67, 0x8307, 0xD06E, + 0x8308, 0xD3A5, 0x8309, 0xAD5B, 0x830C, 0xD07A, 0x830D, 0xCE41, + 0x8316, 0xD3A8, 0x8317, 0xAFFA, 0x8319, 0xD376, 0x831B, 0xD3A3, + 0x831C, 0xD37D, 0x831E, 0xD3B2, 0x8320, 0xD3AA, 0x8322, 0xD37E, + 0x8324, 0xD3A9, 0x8325, 0xD378, 0x8326, 0xD37C, 0x8327, 0xD3B5, + 0x8328, 0xAFFD, 0x8329, 0xD3AD, 0x832A, 0xD3A4, 0x832B, 0xAFED, + 0x832C, 0xD3B3, 0x832D, 0xD374, 0x832F, 0xD3AC, 0x8331, 0xAFFC, + 0x8332, 0xAFF7, 0x8333, 0xD373, 0x8334, 0xAFF5, 0x8335, 0xAFF4, + 0x8336, 0xAFF9, 0x8337, 0xD3AB, 0x8338, 0xAFF1, 0x8339, 0xAFF8, + 0x833A, 0xD072, 0x833B, 0xDB5C, 0x833C, 0xD3A6, 0x833F, 0xD37A, + 0x8340, 0xAFFB, 0x8341, 0xD37B, 0x8342, 0xD3A1, 0x8343, 0xAFFE, + 0x8344, 0xD375, 0x8345, 0xD3AF, 0x8347, 0xD3AE, 0x8348, 0xD3B6, + 0x8349, 0xAFF3, 0x834A, 0xAFF0, 0x834B, 0xD3B4, 0x834C, 0xD3B0, + 0x834D, 0xD3A7, 0x834E, 0xD3A2, 0x834F, 0xAFF6, 0x8350, 0xAFF2, + 0x8351, 0xD377, 0x8352, 0xAFEE, 0x8353, 0xD3B1, 0x8354, 0xAFEF, + 0x8356, 0xD379, 0x8373, 0xD75E, 0x8374, 0xD760, 0x8375, 0xD765, + 0x8376, 0xD779, 0x8377, 0xB2FC, 0x8378, 0xB2F2, 0x837A, 0xD75D, + 0x837B, 0xB2FD, 0x837C, 0xB2FE, 0x837D, 0xD768, 0x837E, 0xD76F, + 0x837F, 0xD775, 0x8381, 0xD762, 0x8383, 0xD769, 0x8386, 0xB340, + 0x8387, 0xD777, 0x8388, 0xD772, 0x8389, 0xB2FA, 0x838A, 0xB2F8, + 0x838B, 0xD76E, 0x838C, 0xD76A, 0x838D, 0xD75C, 0x838E, 0xB2EF, + 0x838F, 0xD761, 0x8390, 0xD759, 0x8392, 0xB2F7, 0x8393, 0xB2F9, + 0x8394, 0xD766, 0x8395, 0xD763, 0x8396, 0xB2F4, 0x8397, 0xD773, + 0x8398, 0xB2F1, 0x8399, 0xD764, 0x839A, 0xD77A, 0x839B, 0xD76C, + 0x839D, 0xD76B, 0x839E, 0xB2F0, 0x83A0, 0xB2FB, 0x83A2, 0xB2F3, + 0x83A3, 0xD75A, 0x83A4, 0xD75F, 0x83A5, 0xD770, 0x83A6, 0xD776, + 0x83A7, 0xB341, 0x83A8, 0xD75B, 0x83A9, 0xD767, 0x83AA, 0xD76D, + 0x83AB, 0xB2F6, 0x83AE, 0xD778, 0x83AF, 0xD771, 0x83B0, 0xD774, + 0x83BD, 0xB2F5, 0x83BF, 0xDB6C, 0x83C0, 0xDB60, 0x83C1, 0xB5D7, + 0x83C2, 0xDB7D, 0x83C3, 0xDBA7, 0x83C4, 0xDBAA, 0x83C5, 0xB5D5, + 0x83C6, 0xDB68, 0x83C7, 0xDBA3, 0x83C8, 0xDB69, 0x83C9, 0xDB77, + 0x83CA, 0xB5E2, 0x83CB, 0xDB73, 0x83CC, 0xB5DF, 0x83CE, 0xDB74, + 0x83CF, 0xDB5D, 0x83D1, 0xDBA4, 0x83D4, 0xB5E8, 0x83D5, 0xDBA1, + 0x83D6, 0xDB75, 0x83D7, 0xDBAC, 0x83D8, 0xDB70, 0x83D9, 0xDFC8, + 0x83DB, 0xDBAF, 0x83DC, 0xB5E6, 0x83DD, 0xDB6E, 0x83DE, 0xDB7A, + 0x83DF, 0xB5E9, 0x83E0, 0xB5D4, 0x83E1, 0xDB72, 0x83E2, 0xDBAD, + 0x83E3, 0xDB6B, 0x83E4, 0xDB64, 0x83E5, 0xDB6F, 0x83E7, 0xDB63, + 0x83E8, 0xDB61, 0x83E9, 0xB5D0, 0x83EA, 0xDBA5, 0x83EB, 0xDB6A, + 0x83EC, 0xDBA8, 0x83EE, 0xDBA9, 0x83EF, 0xB5D8, 0x83F0, 0xB5DD, + 0x83F1, 0xB5D9, 0x83F2, 0xB5E1, 0x83F3, 0xDB7E, 0x83F4, 0xB5DA, + 0x83F5, 0xDB76, 0x83F6, 0xDB66, 0x83F8, 0xB5D2, 0x83F9, 0xDB5E, + 0x83FA, 0xDBA2, 0x83FB, 0xDBAB, 0x83FC, 0xDB65, 0x83FD, 0xB5E0, + 0x83FE, 0xDBB0, 0x83FF, 0xDB71, 0x8401, 0xDB6D, 0x8403, 0xB5D1, + 0x8404, 0xB5E5, 0x8406, 0xDB7C, 0x8407, 0xB5E7, 0x8409, 0xDB78, + 0x840A, 0xB5DC, 0x840B, 0xB5D6, 0x840C, 0xB5DE, 0x840D, 0xB5D3, + 0x840E, 0xB5E4, 0x840F, 0xDB79, 0x8410, 0xDB67, 0x8411, 0xDB7B, + 0x8412, 0xDB62, 0x8413, 0xDBA6, 0x841B, 0xDBAE, 0x8423, 0xDB5F, + 0x8429, 0xDFC7, 0x842B, 0xDFDD, 0x842C, 0xB855, 0x842D, 0xDFCC, + 0x842F, 0xDFCA, 0x8430, 0xDFB5, 0x8431, 0xB8A9, 0x8432, 0xDFC5, + 0x8433, 0xDFD9, 0x8434, 0xDFC1, 0x8435, 0xB8B1, 0x8436, 0xDFD8, + 0x8437, 0xDFBF, 0x8438, 0xB5E3, 0x8439, 0xDFCF, 0x843A, 0xDFC0, + 0x843B, 0xDFD6, 0x843C, 0xB8B0, 0x843D, 0xB8A8, 0x843F, 0xDFAA, + 0x8440, 0xDFB2, 0x8442, 0xDFCB, 0x8443, 0xDFC3, 0x8444, 0xDFDC, + 0x8445, 0xDFC6, 0x8446, 0xB8B6, 0x8447, 0xDFD7, 0x8449, 0xB8AD, + 0x844B, 0xDFC9, 0x844C, 0xDFD1, 0x844D, 0xDFB6, 0x844E, 0xDFD0, + 0x8450, 0xDFE1, 0x8451, 0xDFB1, 0x8452, 0xDFD2, 0x8454, 0xDFDF, + 0x8456, 0xDFAB, 0x8457, 0xB5DB, 0x8459, 0xDFB9, 0x845A, 0xDFB8, + 0x845B, 0xB8AF, 0x845D, 0xDFBC, 0x845E, 0xDFBE, 0x845F, 0xDFCD, + 0x8460, 0xDFDE, 0x8461, 0xB8B2, 0x8463, 0xB8B3, 0x8465, 0xDFB0, + 0x8466, 0xB8AB, 0x8467, 0xDFB4, 0x8468, 0xDFDA, 0x8469, 0xB8B4, + 0x846B, 0xB8AC, 0x846C, 0xB8AE, 0x846D, 0xB8B5, 0x846E, 0xDFE0, + 0x846F, 0xDFD3, 0x8470, 0xDFCE, 0x8473, 0xDFBB, 0x8474, 0xDFBA, + 0x8475, 0xB8AA, 0x8476, 0xDFAC, 0x8477, 0xB8A7, 0x8478, 0xDFC4, + 0x8479, 0xDFAD, 0x847A, 0xDFC2, 0x847D, 0xDFB7, 0x847E, 0xDFDB, + 0x8482, 0xB8A6, 0x8486, 0xDFB3, 0x848D, 0xDFAF, 0x848E, 0xDFD5, + 0x848F, 0xDFAE, 0x8490, 0xBB60, 0x8491, 0xE3D3, 0x8494, 0xE3C2, + 0x8497, 0xE3AC, 0x8498, 0xE3CA, 0x8499, 0xBB58, 0x849A, 0xE3BB, + 0x849B, 0xE3C5, 0x849C, 0xBB5B, 0x849D, 0xE3BE, 0x849E, 0xBB59, + 0x849F, 0xE3AF, 0x84A0, 0xE3CD, 0x84A1, 0xE3AE, 0x84A2, 0xE3C1, + 0x84A4, 0xE3AD, 0x84A7, 0xE3BF, 0x84A8, 0xE3C8, 0x84A9, 0xE3C6, + 0x84AA, 0xE3BA, 0x84AB, 0xE3B5, 0x84AC, 0xE3B3, 0x84AE, 0xE3B4, + 0x84AF, 0xE3C7, 0x84B0, 0xE3D2, 0x84B1, 0xE3BC, 0x84B2, 0xBB5A, + 0x84B4, 0xE3B7, 0x84B6, 0xE3CB, 0x84B8, 0xBB5D, 0x84B9, 0xE3B6, + 0x84BA, 0xE3B0, 0x84BB, 0xE3C0, 0x84BC, 0xBB61, 0x84BF, 0xBB55, + 0x84C0, 0xBB5E, 0x84C1, 0xE3B8, 0x84C2, 0xE3B2, 0x84C4, 0xBB57, + 0x84C5, 0xDFD4, 0x84C6, 0xBB56, 0x84C7, 0xE3C3, 0x84C9, 0xBB54, + 0x84CA, 0xBB63, 0x84CB, 0xBB5C, 0x84CC, 0xE3C4, 0x84CD, 0xE3B9, + 0x84CE, 0xE3B1, 0x84CF, 0xE3CC, 0x84D0, 0xE3BD, 0x84D1, 0xBB62, + 0x84D2, 0xE3D0, 0x84D3, 0xBB5F, 0x84D4, 0xE3CF, 0x84D6, 0xE3C9, + 0x84D7, 0xE3CE, 0x84DB, 0xE3D1, 0x84E7, 0xE773, 0x84E8, 0xE774, + 0x84E9, 0xE767, 0x84EA, 0xE766, 0x84EB, 0xE762, 0x84EC, 0xBDB4, + 0x84EE, 0xBDAC, 0x84EF, 0xE776, 0x84F0, 0xE775, 0x84F1, 0xDFA9, + 0x84F2, 0xE75F, 0x84F3, 0xE763, 0x84F4, 0xE75D, 0x84F6, 0xE770, + 0x84F7, 0xE761, 0x84F9, 0xE777, 0x84FA, 0xE75A, 0x84FB, 0xE758, + 0x84FC, 0xE764, 0x84FD, 0xE76E, 0x84FE, 0xE769, 0x84FF, 0xBDB6, + 0x8500, 0xE74F, 0x8502, 0xE76D, 0x8506, 0xBDB7, 0x8507, 0xDFBD, + 0x8508, 0xE75B, 0x8509, 0xE752, 0x850A, 0xE755, 0x850B, 0xE77B, + 0x850C, 0xE75C, 0x850D, 0xE753, 0x850E, 0xE751, 0x850F, 0xE74E, + 0x8511, 0xBDB0, 0x8512, 0xE765, 0x8513, 0xBDAF, 0x8514, 0xBDB3, + 0x8515, 0xE760, 0x8516, 0xE768, 0x8517, 0xBDA9, 0x8518, 0xE778, + 0x8519, 0xE77C, 0x851A, 0xBDAB, 0x851C, 0xE757, 0x851D, 0xE76B, + 0x851E, 0xE76F, 0x851F, 0xE754, 0x8520, 0xE779, 0x8521, 0xBDB2, + 0x8523, 0xBDB1, 0x8524, 0xE74C, 0x8525, 0xBDB5, 0x8526, 0xE772, + 0x8527, 0xE756, 0x8528, 0xE76A, 0x8529, 0xE750, 0x852A, 0xE75E, + 0x852B, 0xE759, 0x852C, 0xBDAD, 0x852D, 0xBDAE, 0x852E, 0xE76C, + 0x852F, 0xE77D, 0x8530, 0xE77A, 0x8531, 0xE771, 0x853B, 0xE74D, + 0x853D, 0xBDAA, 0x853E, 0xEB49, 0x8540, 0xEB40, 0x8541, 0xEB43, + 0x8543, 0xBFBB, 0x8544, 0xEB45, 0x8545, 0xEAF9, 0x8546, 0xEB41, + 0x8547, 0xEB47, 0x8548, 0xBFB8, 0x8549, 0xBFBC, 0x854A, 0xBFB6, + 0x854D, 0xEAFB, 0x854E, 0xEB4C, 0x8551, 0xEB46, 0x8553, 0xEAFC, + 0x8554, 0xEB55, 0x8555, 0xEB4F, 0x8556, 0xEAF8, 0x8557, 0xEE46, + 0x8558, 0xEAFE, 0x8559, 0xBFB7, 0x855B, 0xEB4A, 0x855D, 0xEB54, + 0x855E, 0xBFBF, 0x8560, 0xEB51, 0x8561, 0xEAFD, 0x8562, 0xEB44, + 0x8563, 0xEB48, 0x8564, 0xEB42, 0x8565, 0xEB56, 0x8566, 0xEB53, + 0x8567, 0xEB50, 0x8568, 0xBFB9, 0x8569, 0xBFBA, 0x856A, 0xBFBE, + 0x856B, 0xEAFA, 0x856C, 0xEB57, 0x856D, 0xBFBD, 0x856E, 0xEB4D, + 0x8571, 0xEB4B, 0x8575, 0xEB4E, 0x8576, 0xEE53, 0x8577, 0xEE40, + 0x8578, 0xEE45, 0x8579, 0xEE52, 0x857A, 0xEE44, 0x857B, 0xEDFB, + 0x857C, 0xEE41, 0x857E, 0xC1A2, 0x8580, 0xEDF4, 0x8581, 0xEE4D, + 0x8582, 0xEE4F, 0x8583, 0xEDF3, 0x8584, 0xC1A1, 0x8585, 0xEE51, + 0x8586, 0xEE49, 0x8587, 0xC1A8, 0x8588, 0xEE50, 0x8589, 0xEE42, + 0x858A, 0xC1AA, 0x858B, 0xEDF9, 0x858C, 0xEB52, 0x858D, 0xEE4A, + 0x858E, 0xEE47, 0x858F, 0xEDF5, 0x8590, 0xEE55, 0x8591, 0xC1A4, + 0x8594, 0xC1A5, 0x8595, 0xEDF7, 0x8596, 0xEE48, 0x8598, 0xEE54, + 0x8599, 0xEE4B, 0x859A, 0xEDFD, 0x859B, 0xC1A7, 0x859C, 0xC1A3, + 0x859D, 0xEE4C, 0x859E, 0xEDFE, 0x859F, 0xEE56, 0x85A0, 0xEDF8, + 0x85A1, 0xEE43, 0x85A2, 0xEE4E, 0x85A3, 0xEDFA, 0x85A4, 0xEDFC, + 0x85A6, 0xC2CB, 0x85A7, 0xEDF6, 0x85A8, 0xC1A9, 0x85A9, 0xC2C4, + 0x85AA, 0xC17E, 0x85AF, 0xC1A6, 0x85B0, 0xC2C8, 0x85B1, 0xF0B3, + 0x85B3, 0xF0A9, 0x85B4, 0xF0A4, 0x85B5, 0xF0AA, 0x85B6, 0xF0B4, + 0x85B7, 0xF0B8, 0x85B8, 0xF0B7, 0x85B9, 0xC2CA, 0x85BA, 0xC2C9, + 0x85BD, 0xF0AB, 0x85BE, 0xF0B9, 0x85BF, 0xF0AE, 0x85C0, 0xF0A6, + 0x85C2, 0xF0A8, 0x85C3, 0xF0A7, 0x85C4, 0xF0AD, 0x85C5, 0xF0B2, + 0x85C6, 0xF0A5, 0x85C7, 0xF0AC, 0x85C8, 0xF0B1, 0x85C9, 0xC2C7, + 0x85CB, 0xF0AF, 0x85CD, 0xC2C5, 0x85CE, 0xF0B0, 0x85CF, 0xC2C3, + 0x85D0, 0xC2C6, 0x85D1, 0xF2D5, 0x85D2, 0xF0B5, 0x85D5, 0xC3C2, + 0x85D7, 0xF2CD, 0x85D8, 0xF2D1, 0x85D9, 0xF2C9, 0x85DA, 0xF2CC, + 0x85DC, 0xF2D4, 0x85DD, 0xC3C0, 0x85DE, 0xF2D9, 0x85DF, 0xF2D2, + 0x85E1, 0xF2CA, 0x85E2, 0xF2DA, 0x85E3, 0xF2D3, 0x85E4, 0xC3C3, + 0x85E5, 0xC3C4, 0x85E6, 0xF2D7, 0x85E8, 0xF2CB, 0x85E9, 0xC3BF, + 0x85EA, 0xC3C1, 0x85EB, 0xF2C6, 0x85EC, 0xF2CE, 0x85ED, 0xF2C8, + 0x85EF, 0xF2D8, 0x85F0, 0xF2D6, 0x85F1, 0xF2C7, 0x85F2, 0xF2CF, + 0x85F6, 0xF4BE, 0x85F7, 0xC3C5, 0x85F8, 0xF2D0, 0x85F9, 0xC4A7, + 0x85FA, 0xC4A9, 0x85FB, 0xC4A6, 0x85FD, 0xF4C3, 0x85FE, 0xF4BB, + 0x85FF, 0xF4B9, 0x8600, 0xF4BD, 0x8601, 0xF4BA, 0x8604, 0xF4BF, + 0x8605, 0xF4C1, 0x8606, 0xC4AA, 0x8607, 0xC4AC, 0x8609, 0xF4C0, + 0x860A, 0xC4AD, 0x860B, 0xC4AB, 0x860C, 0xF4C2, 0x8611, 0xC4A8, + 0x8617, 0xC4F4, 0x8618, 0xF5F1, 0x8619, 0xF5F7, 0x861A, 0xC4F6, + 0x861B, 0xF4BC, 0x861C, 0xF5F6, 0x861E, 0xF5FD, 0x861F, 0xF5F4, + 0x8620, 0xF5FB, 0x8621, 0xF5FA, 0x8622, 0xF4B8, 0x8623, 0xF5F5, + 0x8624, 0xF0B6, 0x8625, 0xF5FE, 0x8626, 0xF5F3, 0x8627, 0xF5F8, + 0x8629, 0xF5FC, 0x862A, 0xF5F2, 0x862C, 0xF74A, 0x862D, 0xC4F5, + 0x862E, 0xF5F9, 0x8631, 0xF7F4, 0x8632, 0xF74B, 0x8633, 0xF749, + 0x8634, 0xF747, 0x8635, 0xF748, 0x8636, 0xF74C, 0x8638, 0xC5D9, + 0x8639, 0xF7F2, 0x863A, 0xF7F0, 0x863B, 0xF7F5, 0x863C, 0xF7F3, + 0x863E, 0xF7F6, 0x863F, 0xC5DA, 0x8640, 0xF7F1, 0x8643, 0xF8BC, + 0x8646, 0xF945, 0x8647, 0xF946, 0x8648, 0xF947, 0x864B, 0xF9C7, + 0x864C, 0xF9BD, 0x864D, 0xCA4F, 0x864E, 0xAAEA, 0x8650, 0xAD68, + 0x8652, 0xD3B8, 0x8653, 0xD3B7, 0x8654, 0xB040, 0x8655, 0xB342, + 0x8656, 0xD77C, 0x8659, 0xD77B, 0x865B, 0xB5EA, 0x865C, 0xB8B8, + 0x865E, 0xB8B7, 0x865F, 0xB8B9, 0x8661, 0xE3D4, 0x8662, 0xE77E, + 0x8663, 0xEB58, 0x8664, 0xEB5A, 0x8665, 0xEB59, 0x8667, 0xC1AB, + 0x8668, 0xEE57, 0x8669, 0xF0BA, 0x866A, 0xF9A5, 0x866B, 0xA6E4, + 0x866D, 0xCDC9, 0x866E, 0xCDCA, 0x866F, 0xCDC8, 0x8670, 0xCDC7, + 0x8671, 0xAAEB, 0x8673, 0xD0A9, 0x8674, 0xD0A7, 0x8677, 0xD0A6, + 0x8679, 0xAD69, 0x867A, 0xAD6B, 0x867B, 0xAD6A, 0x867C, 0xD0A8, + 0x8685, 0xD3C4, 0x8686, 0xD3C1, 0x8687, 0xD3BF, 0x868A, 0xB041, + 0x868B, 0xD3C2, 0x868C, 0xB046, 0x868D, 0xD3BC, 0x868E, 0xD3CB, + 0x8690, 0xD3CD, 0x8691, 0xD3BD, 0x8693, 0xB043, 0x8694, 0xD3CE, + 0x8695, 0xD3C9, 0x8696, 0xD3BB, 0x8697, 0xD3C0, 0x8698, 0xD3CA, + 0x8699, 0xD3C6, 0x869A, 0xD3C3, 0x869C, 0xB048, 0x869D, 0xD3CC, + 0x869E, 0xD3BE, 0x86A1, 0xD3C7, 0x86A2, 0xD3B9, 0x86A3, 0xB047, + 0x86A4, 0xB044, 0x86A5, 0xD3C5, 0x86A7, 0xD3C8, 0x86A8, 0xD3BA, + 0x86A9, 0xB045, 0x86AA, 0xB042, 0x86AF, 0xB34C, 0x86B0, 0xD7A5, + 0x86B1, 0xB34B, 0x86B3, 0xD7A8, 0x86B4, 0xD7AB, 0x86B5, 0xB348, + 0x86B6, 0xB346, 0x86B7, 0xD77E, 0x86B8, 0xD7A9, 0x86B9, 0xD7A7, + 0x86BA, 0xD7A4, 0x86BB, 0xD7AC, 0x86BC, 0xD7AD, 0x86BD, 0xD7AF, + 0x86BE, 0xD7B0, 0x86BF, 0xD77D, 0x86C0, 0xB345, 0x86C1, 0xD7A2, + 0x86C2, 0xD7A1, 0x86C3, 0xD7AE, 0x86C4, 0xB347, 0x86C5, 0xD7A3, + 0x86C6, 0xB349, 0x86C7, 0xB344, 0x86C8, 0xD7A6, 0x86C9, 0xB34D, + 0x86CB, 0xB34A, 0x86CC, 0xD7AA, 0x86D0, 0xB5F1, 0x86D1, 0xDBBF, + 0x86D3, 0xDBB4, 0x86D4, 0xB5EE, 0x86D6, 0xDFE7, 0x86D7, 0xDBBD, + 0x86D8, 0xDBB1, 0x86D9, 0xB5EC, 0x86DA, 0xDBB6, 0x86DB, 0xB5EF, + 0x86DC, 0xDBBA, 0x86DD, 0xDBB8, 0x86DE, 0xB5F2, 0x86DF, 0xB5EB, + 0x86E2, 0xDBB2, 0x86E3, 0xDBB5, 0x86E4, 0xB5F0, 0x86E6, 0xDBB3, + 0x86E8, 0xDBBE, 0x86E9, 0xDBBC, 0x86EA, 0xDBB7, 0x86EB, 0xDBB9, + 0x86EC, 0xDBBB, 0x86ED, 0xB5ED, 0x86F5, 0xDFE8, 0x86F6, 0xDFEE, + 0x86F7, 0xDFE4, 0x86F8, 0xDFEA, 0x86F9, 0xB8BA, 0x86FA, 0xDFE6, + 0x86FB, 0xB8C0, 0x86FE, 0xB8BF, 0x8700, 0xB8BE, 0x8701, 0xDFED, + 0x8702, 0xB8C1, 0x8703, 0xB8C2, 0x8704, 0xDFE3, 0x8705, 0xDFF0, + 0x8706, 0xB8C3, 0x8707, 0xB8BD, 0x8708, 0xB8BC, 0x8709, 0xDFEC, + 0x870A, 0xB8C4, 0x870B, 0xDFE2, 0x870C, 0xDFE5, 0x870D, 0xDFEF, + 0x870E, 0xDFEB, 0x8711, 0xE3F4, 0x8712, 0xE3E9, 0x8713, 0xB8BB, + 0x8718, 0xBB6A, 0x8719, 0xE3DD, 0x871A, 0xE3F2, 0x871B, 0xE3DE, + 0x871C, 0xBB65, 0x871E, 0xE3DB, 0x8720, 0xE3E4, 0x8721, 0xE3DC, + 0x8722, 0xBB67, 0x8723, 0xE3D6, 0x8724, 0xE3F1, 0x8725, 0xBB68, + 0x8726, 0xE3EE, 0x8727, 0xE3EF, 0x8728, 0xE3D7, 0x8729, 0xBB6D, + 0x872A, 0xE3E6, 0x872C, 0xE3E0, 0x872D, 0xE3E7, 0x872E, 0xE3DA, + 0x8730, 0xE3F3, 0x8731, 0xE3EB, 0x8732, 0xE3E5, 0x8733, 0xE3D5, + 0x8734, 0xBB69, 0x8735, 0xE3EC, 0x8737, 0xBB6C, 0x8738, 0xE3F0, + 0x873A, 0xE3EA, 0x873B, 0xBB66, 0x873C, 0xE3E8, 0x873E, 0xE3E2, + 0x873F, 0xBB64, 0x8740, 0xE3D9, 0x8741, 0xE3E1, 0x8742, 0xE3ED, + 0x8743, 0xE3DF, 0x8746, 0xE3E3, 0x874C, 0xBDC1, 0x874D, 0xDFE9, + 0x874E, 0xE7B2, 0x874F, 0xE7BB, 0x8750, 0xE7B1, 0x8751, 0xE7AD, + 0x8752, 0xE7AA, 0x8753, 0xBDC2, 0x8754, 0xE7A8, 0x8755, 0xBB6B, + 0x8756, 0xE7A1, 0x8757, 0xBDC0, 0x8758, 0xE7A7, 0x8759, 0xBDBF, + 0x875A, 0xE7AC, 0x875B, 0xE7A9, 0x875C, 0xE7B9, 0x875D, 0xE7B4, + 0x875E, 0xE7AE, 0x875F, 0xE7B3, 0x8760, 0xBDBB, 0x8761, 0xE7AB, + 0x8762, 0xE7BE, 0x8763, 0xE7A2, 0x8764, 0xE7A3, 0x8765, 0xE7BA, + 0x8766, 0xBDBC, 0x8767, 0xE7BF, 0x8768, 0xBDBE, 0x8769, 0xE7C0, + 0x876A, 0xE7B0, 0x876B, 0xE3D8, 0x876C, 0xE7B6, 0x876D, 0xE7AF, + 0x876E, 0xE7B8, 0x876F, 0xE7B5, 0x8773, 0xE7A6, 0x8774, 0xBDB9, + 0x8775, 0xE7BD, 0x8776, 0xBDBA, 0x8777, 0xE7A4, 0x8778, 0xBDBD, + 0x8779, 0xEB64, 0x877A, 0xE7B7, 0x877B, 0xE7BC, 0x8781, 0xEB61, + 0x8782, 0xBDB8, 0x8783, 0xBFC0, 0x8784, 0xEB6B, 0x8785, 0xEB67, + 0x8787, 0xEB65, 0x8788, 0xEB60, 0x8789, 0xEB6F, 0x878D, 0xBFC4, + 0x878F, 0xEB5C, 0x8790, 0xEB68, 0x8791, 0xEB69, 0x8792, 0xEB5F, + 0x8793, 0xEB5E, 0x8794, 0xEB6C, 0x8796, 0xEB62, 0x8797, 0xEB5D, + 0x8798, 0xEB63, 0x879A, 0xEB6E, 0x879B, 0xEB5B, 0x879C, 0xEB6D, + 0x879D, 0xEB6A, 0x879E, 0xBFC2, 0x879F, 0xBFC1, 0x87A2, 0xBFC3, + 0x87A3, 0xEB66, 0x87A4, 0xF0CB, 0x87AA, 0xEE59, 0x87AB, 0xC1B1, + 0x87AC, 0xEE5D, 0x87AD, 0xEE5A, 0x87AE, 0xEE61, 0x87AF, 0xEE67, + 0x87B0, 0xEE5C, 0x87B2, 0xEE70, 0x87B3, 0xC1AE, 0x87B4, 0xEE6A, + 0x87B5, 0xEE5F, 0x87B6, 0xEE6B, 0x87B7, 0xEE66, 0x87B8, 0xEE6D, + 0x87B9, 0xEE5E, 0x87BA, 0xC1B3, 0x87BB, 0xC1B2, 0x87BC, 0xEE60, + 0x87BD, 0xEE6E, 0x87BE, 0xEE58, 0x87BF, 0xEE6C, 0x87C0, 0xC1AC, + 0x87C2, 0xEE64, 0x87C3, 0xEE63, 0x87C4, 0xEE68, 0x87C5, 0xEE5B, + 0x87C6, 0xC1B0, 0x87C8, 0xC1B4, 0x87C9, 0xEE62, 0x87CA, 0xEE69, + 0x87CB, 0xC1B5, 0x87CC, 0xEE65, 0x87D1, 0xC1AD, 0x87D2, 0xC1AF, + 0x87D3, 0xF0C7, 0x87D4, 0xF0C5, 0x87D7, 0xF0CC, 0x87D8, 0xF0C9, + 0x87D9, 0xF0CD, 0x87DB, 0xF0BE, 0x87DC, 0xF0C6, 0x87DD, 0xF0D1, + 0x87DE, 0xEE6F, 0x87DF, 0xF0C2, 0x87E0, 0xC2CF, 0x87E1, 0xE7A5, + 0x87E2, 0xF0BD, 0x87E3, 0xF0CA, 0x87E4, 0xF0C4, 0x87E5, 0xF0C1, + 0x87E6, 0xF0BC, 0x87E7, 0xF0BB, 0x87E8, 0xF0D0, 0x87EA, 0xF0C0, + 0x87EB, 0xF0BF, 0x87EC, 0xC2CD, 0x87ED, 0xF0C8, 0x87EF, 0xC2CC, + 0x87F2, 0xC2CE, 0x87F3, 0xF0C3, 0x87F4, 0xF0CF, 0x87F6, 0xF2DE, + 0x87F7, 0xF2DF, 0x87F9, 0xC3C9, 0x87FA, 0xF2DC, 0x87FB, 0xC3C6, + 0x87FC, 0xF2E4, 0x87FE, 0xC3CA, 0x87FF, 0xF2E6, 0x8800, 0xF2DB, + 0x8801, 0xF0CE, 0x8802, 0xF2E8, 0x8803, 0xF2DD, 0x8805, 0xC3C7, + 0x8806, 0xF2E3, 0x8808, 0xF2E5, 0x8809, 0xF2E0, 0x880A, 0xF2E7, + 0x880B, 0xF2E2, 0x880C, 0xF2E1, 0x880D, 0xC3C8, 0x8810, 0xF4C5, + 0x8811, 0xF4C6, 0x8813, 0xF4C8, 0x8814, 0xC4AE, 0x8815, 0xC4AF, + 0x8816, 0xF4C9, 0x8817, 0xF4C7, 0x8819, 0xF4C4, 0x881B, 0xF642, + 0x881C, 0xF645, 0x881D, 0xF641, 0x881F, 0xC4FA, 0x8820, 0xF643, + 0x8821, 0xC4F9, 0x8822, 0xC4F8, 0x8823, 0xC4F7, 0x8824, 0xF644, + 0x8825, 0xF751, 0x8826, 0xF74F, 0x8828, 0xF74E, 0x8829, 0xF640, + 0x882A, 0xF750, 0x882B, 0xF646, 0x882C, 0xF74D, 0x882E, 0xF7F9, + 0x882F, 0xF7D7, 0x8830, 0xF7F7, 0x8831, 0xC5DB, 0x8832, 0xF7F8, + 0x8833, 0xF7FA, 0x8835, 0xF8BF, 0x8836, 0xC5FA, 0x8837, 0xF8BE, + 0x8838, 0xF8BD, 0x8839, 0xC5FB, 0x883B, 0xC65A, 0x883C, 0xF96E, + 0x883D, 0xF9A7, 0x883E, 0xF9A6, 0x883F, 0xF9A8, 0x8840, 0xA6E5, + 0x8841, 0xD0AA, 0x8843, 0xD3CF, 0x8844, 0xD3D0, 0x8848, 0xDBC0, + 0x884A, 0xF647, 0x884B, 0xF8C0, 0x884C, 0xA6E6, 0x884D, 0xAD6C, + 0x884E, 0xD0AB, 0x8852, 0xD7B1, 0x8853, 0xB34E, 0x8855, 0xDBC2, + 0x8856, 0xDBC1, 0x8857, 0xB5F3, 0x8859, 0xB8C5, 0x885A, 0xE7C1, + 0x885B, 0xBDC3, 0x885D, 0xBDC4, 0x8861, 0xBFC5, 0x8862, 0xC5FC, + 0x8863, 0xA6E7, 0x8867, 0xD0AC, 0x8868, 0xAAED, 0x8869, 0xD0AE, + 0x886A, 0xD0AD, 0x886B, 0xAD6D, 0x886D, 0xD3D1, 0x886F, 0xD3D8, + 0x8870, 0xB049, 0x8871, 0xD3D6, 0x8872, 0xD3D4, 0x8874, 0xD3DB, + 0x8875, 0xD3D2, 0x8876, 0xD3D3, 0x8877, 0xB04A, 0x8879, 0xB04E, + 0x887C, 0xD3DC, 0x887D, 0xB04D, 0x887E, 0xD3DA, 0x887F, 0xD3D7, + 0x8880, 0xD3D5, 0x8881, 0xB04B, 0x8882, 0xB04C, 0x8883, 0xD3D9, + 0x8888, 0xB350, 0x8889, 0xD7B2, 0x888B, 0xB355, 0x888C, 0xD7C2, + 0x888D, 0xB354, 0x888E, 0xD7C4, 0x8891, 0xD7B8, 0x8892, 0xB352, + 0x8893, 0xD7C3, 0x8895, 0xD7B3, 0x8896, 0xB353, 0x8897, 0xD7BF, + 0x8898, 0xD7BB, 0x8899, 0xD7BD, 0x889A, 0xD7B7, 0x889B, 0xD7BE, + 0x889E, 0xB34F, 0x889F, 0xD7BA, 0x88A1, 0xD7B9, 0x88A2, 0xD7B5, + 0x88A4, 0xD7C0, 0x88A7, 0xD7BC, 0x88A8, 0xD7B4, 0x88AA, 0xD7B6, + 0x88AB, 0xB351, 0x88AC, 0xD7C1, 0x88B1, 0xB5F6, 0x88B2, 0xDBCD, + 0x88B6, 0xDBC9, 0x88B7, 0xDBCB, 0x88B8, 0xDBC6, 0x88B9, 0xDBC5, + 0x88BA, 0xDBC3, 0x88BC, 0xDBCA, 0x88BD, 0xDBCC, 0x88BE, 0xDBC8, + 0x88C0, 0xDBC7, 0x88C1, 0xB5F4, 0x88C2, 0xB5F5, 0x88C9, 0xDBCF, + 0x88CA, 0xB8CD, 0x88CB, 0xDFF2, 0x88CC, 0xDFF8, 0x88CD, 0xDFF3, + 0x88CE, 0xDFF4, 0x88CF, 0xF9D8, 0x88D0, 0xDFF9, 0x88D2, 0xB8CF, + 0x88D4, 0xB8C7, 0x88D5, 0xB8CE, 0x88D6, 0xDFF1, 0x88D7, 0xDBC4, + 0x88D8, 0xB8CA, 0x88D9, 0xB8C8, 0x88DA, 0xDFF7, 0x88DB, 0xDFF6, + 0x88DC, 0xB8C9, 0x88DD, 0xB8CB, 0x88DE, 0xDFF5, 0x88DF, 0xB8C6, + 0x88E1, 0xB8CC, 0x88E7, 0xE3F6, 0x88E8, 0xBB74, 0x88EB, 0xE442, + 0x88EC, 0xE441, 0x88EE, 0xE3FB, 0x88EF, 0xBB76, 0x88F0, 0xE440, + 0x88F1, 0xE3F7, 0x88F2, 0xE3F8, 0x88F3, 0xBB6E, 0x88F4, 0xBB70, + 0x88F6, 0xE3FD, 0x88F7, 0xE3F5, 0x88F8, 0xBB72, 0x88F9, 0xBB71, + 0x88FA, 0xE3F9, 0x88FB, 0xE3FE, 0x88FC, 0xE3FC, 0x88FD, 0xBB73, + 0x88FE, 0xE3FA, 0x8901, 0xDBCE, 0x8902, 0xBB6F, 0x8905, 0xE7C2, + 0x8906, 0xE7C9, 0x8907, 0xBDC6, 0x8909, 0xE7CD, 0x890A, 0xBDCA, + 0x890B, 0xE7C5, 0x890C, 0xE7C3, 0x890E, 0xE7CC, 0x8910, 0xBDC5, + 0x8911, 0xE7CB, 0x8912, 0xBDC7, 0x8913, 0xBDC8, 0x8914, 0xE7C4, + 0x8915, 0xBDC9, 0x8916, 0xE7CA, 0x8917, 0xE7C6, 0x8918, 0xE7C7, + 0x8919, 0xE7C8, 0x891A, 0xBB75, 0x891E, 0xEB70, 0x891F, 0xEB7C, + 0x8921, 0xBFCA, 0x8922, 0xEB77, 0x8923, 0xEB79, 0x8925, 0xBFC8, + 0x8926, 0xEB71, 0x8927, 0xEB75, 0x8929, 0xEB78, 0x892A, 0xBFC6, + 0x892B, 0xBFC9, 0x892C, 0xEB7B, 0x892D, 0xEB73, 0x892E, 0xEB74, + 0x892F, 0xEB7A, 0x8930, 0xEB72, 0x8931, 0xEB76, 0x8932, 0xBFC7, + 0x8933, 0xEE72, 0x8935, 0xEE71, 0x8936, 0xC1B7, 0x8937, 0xEE77, + 0x8938, 0xC1B9, 0x893B, 0xC1B6, 0x893C, 0xEE73, 0x893D, 0xC1BA, + 0x893E, 0xEE74, 0x8941, 0xEE75, 0x8942, 0xEE78, 0x8944, 0xC1B8, + 0x8946, 0xF0D6, 0x8949, 0xF0D9, 0x894B, 0xF0D3, 0x894C, 0xF0D5, + 0x894F, 0xF0D4, 0x8950, 0xF0D7, 0x8951, 0xF0D8, 0x8952, 0xEE76, + 0x8953, 0xF0D2, 0x8956, 0xC3CD, 0x8957, 0xF2EC, 0x8958, 0xF2EF, + 0x8959, 0xF2F1, 0x895A, 0xF2EA, 0x895B, 0xF2EB, 0x895C, 0xF2EE, + 0x895D, 0xF2F0, 0x895E, 0xC3CE, 0x895F, 0xC3CC, 0x8960, 0xC3CB, + 0x8961, 0xF2ED, 0x8962, 0xF2E9, 0x8963, 0xF4CA, 0x8964, 0xC4B0, + 0x8966, 0xF4CB, 0x8969, 0xF649, 0x896A, 0xC4FB, 0x896B, 0xF64B, + 0x896C, 0xC4FC, 0x896D, 0xF648, 0x896E, 0xF64A, 0x896F, 0xC5A8, + 0x8971, 0xF752, 0x8972, 0xC5A7, 0x8973, 0xF7FD, 0x8974, 0xF7FC, + 0x8976, 0xF7FB, 0x8979, 0xF948, 0x897A, 0xF949, 0x897B, 0xF94B, + 0x897C, 0xF94A, 0x897E, 0xCA50, 0x897F, 0xA6E8, 0x8981, 0xAD6E, + 0x8982, 0xD7C5, 0x8983, 0xB5F7, 0x8985, 0xDFFA, 0x8986, 0xC2D0, + 0x8988, 0xF2F2, 0x898B, 0xA8A3, 0x898F, 0xB357, 0x8993, 0xB356, + 0x8995, 0xDBD0, 0x8996, 0xB5F8, 0x8997, 0xDBD2, 0x8998, 0xDBD1, + 0x899B, 0xDFFB, 0x899C, 0xB8D0, 0x899D, 0xE443, 0x899E, 0xE446, + 0x899F, 0xE445, 0x89A1, 0xE444, 0x89A2, 0xE7CE, 0x89A3, 0xE7D0, + 0x89A4, 0xE7CF, 0x89A6, 0xBFCC, 0x89AA, 0xBFCB, 0x89AC, 0xC1BB, + 0x89AD, 0xEE79, 0x89AE, 0xEE7B, 0x89AF, 0xEE7A, 0x89B2, 0xC2D1, + 0x89B6, 0xF2F4, 0x89B7, 0xF2F3, 0x89B9, 0xF4CC, 0x89BA, 0xC4B1, + 0x89BD, 0xC4FD, 0x89BE, 0xF754, 0x89BF, 0xF753, 0x89C0, 0xC65B, + 0x89D2, 0xA8A4, 0x89D3, 0xD0AF, 0x89D4, 0xAD6F, 0x89D5, 0xD7C8, + 0x89D6, 0xD7C6, 0x89D9, 0xD7C7, 0x89DA, 0xDBD4, 0x89DB, 0xDBD5, + 0x89DC, 0xE043, 0x89DD, 0xDBD3, 0x89DF, 0xDFFC, 0x89E0, 0xE041, + 0x89E1, 0xE040, 0x89E2, 0xE042, 0x89E3, 0xB8D1, 0x89E4, 0xDFFE, + 0x89E5, 0xDFFD, 0x89E6, 0xE044, 0x89E8, 0xE449, 0x89E9, 0xE447, + 0x89EB, 0xE448, 0x89EC, 0xE7D3, 0x89ED, 0xE7D1, 0x89F0, 0xE7D2, + 0x89F1, 0xEB7D, 0x89F2, 0xEE7C, 0x89F3, 0xEE7D, 0x89F4, 0xC2D2, + 0x89F6, 0xF2F5, 0x89F7, 0xF4CD, 0x89F8, 0xC4B2, 0x89FA, 0xF64C, + 0x89FB, 0xF755, 0x89FC, 0xC5A9, 0x89FE, 0xF7FE, 0x89FF, 0xF94C, + 0x8A00, 0xA8A5, 0x8A02, 0xAD71, 0x8A03, 0xAD72, 0x8A04, 0xD0B0, + 0x8A07, 0xD0B1, 0x8A08, 0xAD70, 0x8A0A, 0xB054, 0x8A0C, 0xB052, + 0x8A0E, 0xB051, 0x8A0F, 0xB058, 0x8A10, 0xB050, 0x8A11, 0xB059, + 0x8A12, 0xD3DD, 0x8A13, 0xB056, 0x8A15, 0xB053, 0x8A16, 0xB057, + 0x8A17, 0xB055, 0x8A18, 0xB04F, 0x8A1B, 0xB35F, 0x8A1D, 0xB359, + 0x8A1E, 0xD7CC, 0x8A1F, 0xB35E, 0x8A22, 0xB360, 0x8A23, 0xB35A, + 0x8A25, 0xB35B, 0x8A27, 0xD7CA, 0x8A2A, 0xB358, 0x8A2C, 0xD7CB, + 0x8A2D, 0xB35D, 0x8A30, 0xD7C9, 0x8A31, 0xB35C, 0x8A34, 0xB644, + 0x8A36, 0xB646, 0x8A39, 0xDBD8, 0x8A3A, 0xB645, 0x8A3B, 0xB5F9, + 0x8A3C, 0xB5FD, 0x8A3E, 0xB8E4, 0x8A3F, 0xE049, 0x8A40, 0xDBDA, + 0x8A41, 0xB5FE, 0x8A44, 0xDBDD, 0x8A45, 0xDBDE, 0x8A46, 0xB643, + 0x8A48, 0xDBE0, 0x8A4A, 0xDBE2, 0x8A4C, 0xDBE3, 0x8A4D, 0xDBD7, + 0x8A4E, 0xDBD6, 0x8A4F, 0xDBE4, 0x8A50, 0xB642, 0x8A51, 0xDBE1, + 0x8A52, 0xDBDF, 0x8A54, 0xB640, 0x8A55, 0xB5FB, 0x8A56, 0xB647, + 0x8A57, 0xDBDB, 0x8A58, 0xDBDC, 0x8A59, 0xDBD9, 0x8A5B, 0xB641, + 0x8A5E, 0xB5FC, 0x8A60, 0xB5FA, 0x8A61, 0xE048, 0x8A62, 0xB8DF, + 0x8A63, 0xB8DA, 0x8A66, 0xB8D5, 0x8A68, 0xB8E5, 0x8A69, 0xB8D6, + 0x8A6B, 0xB8D2, 0x8A6C, 0xB8E1, 0x8A6D, 0xB8DE, 0x8A6E, 0xB8E0, + 0x8A70, 0xB8D7, 0x8A71, 0xB8DC, 0x8A72, 0xB8D3, 0x8A73, 0xB8D4, + 0x8A74, 0xE050, 0x8A75, 0xE04D, 0x8A76, 0xE045, 0x8A77, 0xE04A, + 0x8A79, 0xB8E2, 0x8A7A, 0xE051, 0x8A7B, 0xB8E3, 0x8A7C, 0xB8D9, + 0x8A7F, 0xE047, 0x8A81, 0xE04F, 0x8A82, 0xE04B, 0x8A83, 0xE04E, + 0x8A84, 0xE04C, 0x8A85, 0xB8DD, 0x8A86, 0xE046, 0x8A87, 0xB8D8, + 0x8A8B, 0xE44C, 0x8A8C, 0xBB78, 0x8A8D, 0xBB7B, 0x8A8F, 0xE44E, + 0x8A91, 0xBBA5, 0x8A92, 0xE44D, 0x8A93, 0xBB7D, 0x8A95, 0xBDCF, + 0x8A96, 0xE44F, 0x8A98, 0xBBA4, 0x8A99, 0xE44B, 0x8A9A, 0xBBA6, + 0x8A9E, 0xBB79, 0x8AA0, 0xB8DB, 0x8AA1, 0xBB7C, 0x8AA3, 0xBB7A, + 0x8AA4, 0xBB7E, 0x8AA5, 0xBBA2, 0x8AA6, 0xBB77, 0x8AA7, 0xBBA7, + 0x8AA8, 0xBBA3, 0x8AAA, 0xBBA1, 0x8AAB, 0xE44A, 0x8AB0, 0xBDD6, + 0x8AB2, 0xBDD2, 0x8AB6, 0xBDD9, 0x8AB8, 0xE7D6, 0x8AB9, 0xBDDA, + 0x8ABA, 0xE7E2, 0x8ABB, 0xE7DB, 0x8ABC, 0xBDCB, 0x8ABD, 0xE7E3, + 0x8ABE, 0xE7DD, 0x8ABF, 0xBDD5, 0x8AC0, 0xE7DE, 0x8AC2, 0xBDD4, + 0x8AC3, 0xE7E1, 0x8AC4, 0xBDCE, 0x8AC5, 0xE7DF, 0x8AC6, 0xE7D5, + 0x8AC7, 0xBDCD, 0x8AC8, 0xEBAA, 0x8AC9, 0xBDD3, 0x8ACB, 0xBDD0, + 0x8ACD, 0xBDD8, 0x8ACF, 0xE7D4, 0x8AD1, 0xE7D8, 0x8AD2, 0xBDCC, + 0x8AD3, 0xE7D7, 0x8AD4, 0xE7D9, 0x8AD5, 0xE7DA, 0x8AD6, 0xBDD7, + 0x8AD7, 0xE7DC, 0x8AD8, 0xE7E0, 0x8AD9, 0xE7E4, 0x8ADB, 0xBDDB, + 0x8ADC, 0xBFD2, 0x8ADD, 0xEBA5, 0x8ADE, 0xEBAB, 0x8ADF, 0xEBA8, + 0x8AE0, 0xEB7E, 0x8AE1, 0xEBAC, 0x8AE2, 0xEBA1, 0x8AE4, 0xEBA7, + 0x8AE6, 0xBFCD, 0x8AE7, 0xBFD3, 0x8AE8, 0xEBAD, 0x8AEB, 0xBFCF, + 0x8AED, 0xBFD9, 0x8AEE, 0xBFD4, 0x8AEF, 0xEBAF, 0x8AF0, 0xEBA9, + 0x8AF1, 0xBFD0, 0x8AF2, 0xEBA2, 0x8AF3, 0xBFDA, 0x8AF4, 0xEBA3, + 0x8AF5, 0xEBA4, 0x8AF6, 0xBFDB, 0x8AF7, 0xBFD8, 0x8AF8, 0xBDD1, + 0x8AFA, 0xBFCE, 0x8AFB, 0xEBB0, 0x8AFC, 0xBFDC, 0x8AFE, 0xBFD5, + 0x8AFF, 0xEBAE, 0x8B00, 0xBFD1, 0x8B01, 0xBFD6, 0x8B02, 0xBFD7, + 0x8B04, 0xC1C3, 0x8B05, 0xEEA4, 0x8B06, 0xEEAD, 0x8B07, 0xEEAA, + 0x8B08, 0xEEAC, 0x8B0A, 0xC1C0, 0x8B0B, 0xEEA5, 0x8B0D, 0xEEAB, + 0x8B0E, 0xC1BC, 0x8B0F, 0xEEA7, 0x8B10, 0xC1C4, 0x8B11, 0xEEA3, + 0x8B12, 0xEEA8, 0x8B13, 0xEEAF, 0x8B14, 0xEBA6, 0x8B15, 0xEEA9, + 0x8B16, 0xEEA2, 0x8B17, 0xC1BD, 0x8B18, 0xEEA1, 0x8B19, 0xC1BE, + 0x8B1A, 0xEEB0, 0x8B1B, 0xC1BF, 0x8B1C, 0xEEAE, 0x8B1D, 0xC1C2, + 0x8B1E, 0xEE7E, 0x8B20, 0xC1C1, 0x8B22, 0xEEA6, 0x8B23, 0xF0DC, + 0x8B24, 0xF0EA, 0x8B25, 0xF0E5, 0x8B26, 0xF0E7, 0x8B27, 0xF0DB, + 0x8B28, 0xC2D3, 0x8B2A, 0xF0DA, 0x8B2B, 0xC2D6, 0x8B2C, 0xC2D5, + 0x8B2E, 0xF0E9, 0x8B2F, 0xF0E1, 0x8B30, 0xF0DE, 0x8B31, 0xF0E4, + 0x8B33, 0xF0DD, 0x8B35, 0xF0DF, 0x8B36, 0xF0E8, 0x8B37, 0xF0E6, + 0x8B39, 0xC2D4, 0x8B3A, 0xF0ED, 0x8B3B, 0xF0EB, 0x8B3C, 0xF0E2, + 0x8B3D, 0xF0EC, 0x8B3E, 0xF0E3, 0x8B40, 0xF2F9, 0x8B41, 0xC3CF, + 0x8B42, 0xF341, 0x8B45, 0xF64F, 0x8B46, 0xC3D6, 0x8B47, 0xF0E0, + 0x8B48, 0xF2F7, 0x8B49, 0xC3D2, 0x8B4A, 0xF2F8, 0x8B4B, 0xF2FD, + 0x8B4E, 0xC3D4, 0x8B4F, 0xC3D5, 0x8B50, 0xF2F6, 0x8B51, 0xF340, + 0x8B52, 0xF342, 0x8B53, 0xF2FA, 0x8B54, 0xF2FC, 0x8B55, 0xF2FE, + 0x8B56, 0xF2FB, 0x8B57, 0xF343, 0x8B58, 0xC3D1, 0x8B59, 0xC3D7, + 0x8B5A, 0xC3D3, 0x8B5C, 0xC3D0, 0x8B5D, 0xF4D0, 0x8B5F, 0xC4B7, + 0x8B60, 0xF4CE, 0x8B63, 0xF4D2, 0x8B65, 0xF4D3, 0x8B66, 0xC4B5, + 0x8B67, 0xF4D4, 0x8B68, 0xF4D1, 0x8B6A, 0xF4CF, 0x8B6B, 0xC4B8, + 0x8B6C, 0xC4B4, 0x8B6D, 0xF4D5, 0x8B6F, 0xC4B6, 0x8B70, 0xC4B3, + 0x8B74, 0xC4FE, 0x8B77, 0xC540, 0x8B78, 0xF64E, 0x8B79, 0xF64D, + 0x8B7A, 0xF650, 0x8B7B, 0xF651, 0x8B7D, 0xC541, 0x8B7E, 0xF756, + 0x8B7F, 0xF75B, 0x8B80, 0xC5AA, 0x8B82, 0xF758, 0x8B84, 0xF757, + 0x8B85, 0xF75A, 0x8B86, 0xF759, 0x8B88, 0xF843, 0x8B8A, 0xC5DC, + 0x8B8B, 0xF842, 0x8B8C, 0xF840, 0x8B8E, 0xF841, 0x8B92, 0xC5FE, + 0x8B93, 0xC5FD, 0x8B94, 0xF8C1, 0x8B95, 0xF8C2, 0x8B96, 0xC640, + 0x8B98, 0xF94D, 0x8B99, 0xF94E, 0x8B9A, 0xC667, 0x8B9C, 0xC66D, + 0x8B9E, 0xF9A9, 0x8B9F, 0xF9C8, 0x8C37, 0xA8A6, 0x8C39, 0xD7CD, + 0x8C3B, 0xD7CE, 0x8C3C, 0xE052, 0x8C3D, 0xE450, 0x8C3E, 0xE7E5, + 0x8C3F, 0xC1C6, 0x8C41, 0xC1C5, 0x8C42, 0xF0EE, 0x8C43, 0xF344, + 0x8C45, 0xF844, 0x8C46, 0xA8A7, 0x8C47, 0xD3DE, 0x8C48, 0xB05A, + 0x8C49, 0xB361, 0x8C4A, 0xE054, 0x8C4B, 0xE053, 0x8C4C, 0xBDDC, + 0x8C4D, 0xE7E6, 0x8C4E, 0xBDDD, 0x8C4F, 0xEEB1, 0x8C50, 0xC2D7, + 0x8C54, 0xC676, 0x8C55, 0xA8A8, 0x8C56, 0xCDCB, 0x8C57, 0xD3DF, + 0x8C5A, 0xB362, 0x8C5C, 0xD7CF, 0x8C5D, 0xD7D0, 0x8C5F, 0xDBE5, + 0x8C61, 0xB648, 0x8C62, 0xB8E6, 0x8C64, 0xE056, 0x8C65, 0xE055, + 0x8C66, 0xE057, 0x8C68, 0xE451, 0x8C69, 0xE452, 0x8C6A, 0xBBA8, + 0x8C6B, 0xBFDD, 0x8C6C, 0xBDDE, 0x8C6D, 0xBFDE, 0x8C6F, 0xEEB5, + 0x8C70, 0xEEB2, 0x8C71, 0xEEB4, 0x8C72, 0xEEB3, 0x8C73, 0xC1C7, + 0x8C75, 0xF0EF, 0x8C76, 0xF346, 0x8C77, 0xF345, 0x8C78, 0xCBA4, + 0x8C79, 0xB05C, 0x8C7A, 0xB05B, 0x8C7B, 0xD3E0, 0x8C7D, 0xD7D1, + 0x8C80, 0xDBE7, 0x8C81, 0xDBE6, 0x8C82, 0xB649, 0x8C84, 0xE059, + 0x8C85, 0xE05A, 0x8C86, 0xE058, 0x8C89, 0xB8E8, 0x8C8A, 0xB8E7, + 0x8C8C, 0xBBAA, 0x8C8D, 0xBBA9, 0x8C8F, 0xE7E7, 0x8C90, 0xEBB3, + 0x8C91, 0xEBB1, 0x8C92, 0xEBB2, 0x8C93, 0xBFDF, 0x8C94, 0xEEB7, + 0x8C95, 0xEEB6, 0x8C97, 0xF0F2, 0x8C98, 0xF0F1, 0x8C99, 0xF0F0, + 0x8C9A, 0xF347, 0x8C9C, 0xF9AA, 0x8C9D, 0xA8A9, 0x8C9E, 0xAD73, + 0x8CA0, 0xAD74, 0x8CA1, 0xB05D, 0x8CA2, 0xB05E, 0x8CA3, 0xD3E2, + 0x8CA4, 0xD3E1, 0x8CA5, 0xD7D2, 0x8CA7, 0xB368, 0x8CA8, 0xB366, + 0x8CA9, 0xB363, 0x8CAA, 0xB367, 0x8CAB, 0xB365, 0x8CAC, 0xB364, + 0x8CAF, 0xB64A, 0x8CB0, 0xDBEA, 0x8CB2, 0xB8ED, 0x8CB3, 0xB64C, + 0x8CB4, 0xB651, 0x8CB5, 0xDBEC, 0x8CB6, 0xB653, 0x8CB7, 0xB652, + 0x8CB8, 0xB655, 0x8CB9, 0xDBEB, 0x8CBA, 0xDBE8, 0x8CBB, 0xB64F, + 0x8CBC, 0xB64B, 0x8CBD, 0xB64D, 0x8CBE, 0xDBE9, 0x8CBF, 0xB654, + 0x8CC0, 0xB650, 0x8CC1, 0xB64E, 0x8CC2, 0xB8EF, 0x8CC3, 0xB8EE, + 0x8CC4, 0xB8EC, 0x8CC5, 0xB8F0, 0x8CC7, 0xB8EA, 0x8CC8, 0xB8EB, + 0x8CCA, 0xB8E9, 0x8CCC, 0xE05B, 0x8CCF, 0xE454, 0x8CD1, 0xBBAC, + 0x8CD2, 0xBBAD, 0x8CD3, 0xBBAB, 0x8CD5, 0xE453, 0x8CD7, 0xE455, + 0x8CD9, 0xE7EA, 0x8CDA, 0xE7EC, 0x8CDC, 0xBDE7, 0x8CDD, 0xE7ED, + 0x8CDE, 0xBDE0, 0x8CDF, 0xE7E9, 0x8CE0, 0xBDDF, 0x8CE1, 0xBDE9, + 0x8CE2, 0xBDE5, 0x8CE3, 0xBDE6, 0x8CE4, 0xBDE2, 0x8CE5, 0xE7E8, + 0x8CE6, 0xBDE1, 0x8CE7, 0xE7EE, 0x8CE8, 0xE7EB, 0x8CEA, 0xBDE8, + 0x8CEC, 0xBDE3, 0x8CED, 0xBDE4, 0x8CEE, 0xEBB5, 0x8CF0, 0xEBB7, + 0x8CF1, 0xEBB6, 0x8CF3, 0xEBB8, 0x8CF4, 0xBFE0, 0x8CF5, 0xEBB4, + 0x8CF8, 0xC1CB, 0x8CF9, 0xEEB8, 0x8CFA, 0xC1C8, 0x8CFB, 0xC1CC, + 0x8CFC, 0xC1CA, 0x8CFD, 0xC1C9, 0x8CFE, 0xF0F3, 0x8D00, 0xF0F6, + 0x8D02, 0xF0F5, 0x8D04, 0xF0F4, 0x8D05, 0xC2D8, 0x8D06, 0xF348, + 0x8D07, 0xF349, 0x8D08, 0xC3D8, 0x8D09, 0xF34A, 0x8D0A, 0xC3D9, + 0x8D0D, 0xC4BA, 0x8D0F, 0xC4B9, 0x8D10, 0xF652, 0x8D13, 0xC542, + 0x8D14, 0xF653, 0x8D15, 0xF75C, 0x8D16, 0xC5AB, 0x8D17, 0xC5AC, + 0x8D19, 0xF845, 0x8D1B, 0xC642, 0x8D64, 0xA8AA, 0x8D66, 0xB36A, + 0x8D67, 0xB369, 0x8D68, 0xE05C, 0x8D69, 0xE05D, 0x8D6B, 0xBBAE, + 0x8D6C, 0xEBB9, 0x8D6D, 0xBDEA, 0x8D6E, 0xEBBA, 0x8D6F, 0xEEB9, + 0x8D70, 0xA8AB, 0x8D72, 0xD0B2, 0x8D73, 0xAD76, 0x8D74, 0xAD75, + 0x8D76, 0xD3E3, 0x8D77, 0xB05F, 0x8D78, 0xD3E4, 0x8D79, 0xD7D5, + 0x8D7B, 0xD7D4, 0x8D7D, 0xD7D3, 0x8D80, 0xDBEE, 0x8D81, 0xB658, + 0x8D84, 0xDBED, 0x8D85, 0xB657, 0x8D89, 0xDBEF, 0x8D8A, 0xB656, + 0x8D8C, 0xE05F, 0x8D8D, 0xE062, 0x8D8E, 0xE060, 0x8D8F, 0xE061, + 0x8D90, 0xE065, 0x8D91, 0xE05E, 0x8D92, 0xE066, 0x8D93, 0xE063, + 0x8D94, 0xE064, 0x8D95, 0xBBB0, 0x8D96, 0xE456, 0x8D99, 0xBBAF, + 0x8D9B, 0xE7F2, 0x8D9C, 0xE7F0, 0x8D9F, 0xBDEB, 0x8DA0, 0xE7EF, + 0x8DA1, 0xE7F1, 0x8DA3, 0xBDEC, 0x8DA5, 0xEBBB, 0x8DA7, 0xEBBC, + 0x8DA8, 0xC1CD, 0x8DAA, 0xF34C, 0x8DAB, 0xF34E, 0x8DAC, 0xF34B, + 0x8DAD, 0xF34D, 0x8DAE, 0xF4D6, 0x8DAF, 0xF654, 0x8DB2, 0xF96F, + 0x8DB3, 0xA8AC, 0x8DB4, 0xAD77, 0x8DB5, 0xD3E5, 0x8DB6, 0xD3E7, + 0x8DB7, 0xD3E6, 0x8DB9, 0xD7D8, 0x8DBA, 0xB36C, 0x8DBC, 0xD7D6, + 0x8DBE, 0xB36B, 0x8DBF, 0xD7D9, 0x8DC1, 0xD7DA, 0x8DC2, 0xD7D7, + 0x8DC5, 0xDBFB, 0x8DC6, 0xB660, 0x8DC7, 0xDBF3, 0x8DC8, 0xDBF9, + 0x8DCB, 0xB65B, 0x8DCC, 0xB65E, 0x8DCD, 0xDBF2, 0x8DCE, 0xB659, + 0x8DCF, 0xDBF6, 0x8DD0, 0xE06C, 0x8DD1, 0xB65D, 0x8DD3, 0xDBF1, + 0x8DD5, 0xDBF7, 0x8DD6, 0xDBF4, 0x8DD7, 0xDBFA, 0x8DD8, 0xDBF0, + 0x8DD9, 0xDBF8, 0x8DDA, 0xB65C, 0x8DDB, 0xB65F, 0x8DDC, 0xDBF5, + 0x8DDD, 0xB65A, 0x8DDF, 0xB8F2, 0x8DE0, 0xE068, 0x8DE1, 0xB8F1, + 0x8DE2, 0xE06F, 0x8DE3, 0xE06E, 0x8DE4, 0xB8F8, 0x8DE6, 0xB8F9, + 0x8DE7, 0xE070, 0x8DE8, 0xB8F3, 0x8DE9, 0xE06D, 0x8DEA, 0xB8F7, + 0x8DEB, 0xE072, 0x8DEC, 0xE069, 0x8DEE, 0xE06B, 0x8DEF, 0xB8F4, + 0x8DF0, 0xE067, 0x8DF1, 0xE06A, 0x8DF2, 0xE071, 0x8DF3, 0xB8F5, + 0x8DF4, 0xE073, 0x8DFA, 0xB8F6, 0x8DFC, 0xBBB1, 0x8DFD, 0xE45B, + 0x8DFE, 0xE461, 0x8DFF, 0xE459, 0x8E00, 0xE462, 0x8E02, 0xE458, + 0x8E03, 0xE45D, 0x8E04, 0xE463, 0x8E05, 0xE460, 0x8E06, 0xE45F, + 0x8E07, 0xE45E, 0x8E09, 0xE457, 0x8E0A, 0xE45C, 0x8E0D, 0xE45A, + 0x8E0F, 0xBDF1, 0x8E10, 0xBDEE, 0x8E11, 0xE7FB, 0x8E12, 0xE841, + 0x8E13, 0xE843, 0x8E14, 0xE840, 0x8E15, 0xE7F8, 0x8E16, 0xE7FA, + 0x8E17, 0xE845, 0x8E18, 0xE842, 0x8E19, 0xE7FC, 0x8E1A, 0xE846, + 0x8E1B, 0xE7F9, 0x8E1C, 0xE844, 0x8E1D, 0xBDEF, 0x8E1E, 0xBDF5, + 0x8E1F, 0xBDF3, 0x8E20, 0xE7F3, 0x8E21, 0xBDF4, 0x8E22, 0xBDF0, + 0x8E23, 0xE7F4, 0x8E24, 0xE7F6, 0x8E25, 0xE7F5, 0x8E26, 0xE7FD, + 0x8E27, 0xE7FE, 0x8E29, 0xBDF2, 0x8E2B, 0xBDED, 0x8E2E, 0xE7F7, + 0x8E30, 0xEBC6, 0x8E31, 0xBFE2, 0x8E33, 0xEBBD, 0x8E34, 0xBFE3, + 0x8E35, 0xBFE6, 0x8E36, 0xEBC2, 0x8E38, 0xEBBF, 0x8E39, 0xBFE5, + 0x8E3C, 0xEBC3, 0x8E3D, 0xEBC4, 0x8E3E, 0xEBBE, 0x8E3F, 0xEBC7, + 0x8E40, 0xEBC0, 0x8E41, 0xEBC5, 0x8E42, 0xBFE4, 0x8E44, 0xBFE1, + 0x8E45, 0xEBC1, 0x8E47, 0xEEBF, 0x8E48, 0xC1D0, 0x8E49, 0xC1CE, + 0x8E4A, 0xC1D1, 0x8E4B, 0xC1CF, 0x8E4C, 0xEEBE, 0x8E4D, 0xEEBB, + 0x8E4E, 0xEEBA, 0x8E50, 0xEEBD, 0x8E53, 0xEEBC, 0x8E54, 0xF145, + 0x8E55, 0xC2DE, 0x8E56, 0xF0FB, 0x8E57, 0xF0FA, 0x8E59, 0xC2D9, + 0x8E5A, 0xF141, 0x8E5B, 0xF140, 0x8E5C, 0xF0F7, 0x8E5D, 0xF143, + 0x8E5E, 0xF0FC, 0x8E5F, 0xC2DD, 0x8E60, 0xF0F9, 0x8E61, 0xF142, + 0x8E62, 0xF0F8, 0x8E63, 0xC2DA, 0x8E64, 0xC2DC, 0x8E65, 0xF0FD, + 0x8E66, 0xC2DB, 0x8E67, 0xF0FE, 0x8E69, 0xF144, 0x8E6A, 0xF352, + 0x8E6C, 0xC3DE, 0x8E6D, 0xF34F, 0x8E6F, 0xF353, 0x8E72, 0xC3DB, + 0x8E73, 0xF351, 0x8E74, 0xC3E0, 0x8E76, 0xC3DD, 0x8E78, 0xF350, + 0x8E7A, 0xC3DF, 0x8E7B, 0xF354, 0x8E7C, 0xC3DA, 0x8E81, 0xC4BC, + 0x8E82, 0xC4BE, 0x8E84, 0xF4D9, 0x8E85, 0xC4BD, 0x8E86, 0xF4D7, + 0x8E87, 0xC3DC, 0x8E88, 0xF4D8, 0x8E89, 0xC4BB, 0x8E8A, 0xC543, + 0x8E8B, 0xC545, 0x8E8C, 0xF656, 0x8E8D, 0xC544, 0x8E8E, 0xF655, + 0x8E90, 0xF761, 0x8E91, 0xC5AD, 0x8E92, 0xF760, 0x8E93, 0xC5AE, + 0x8E94, 0xF75E, 0x8E95, 0xF75D, 0x8E96, 0xF762, 0x8E97, 0xF763, + 0x8E98, 0xF846, 0x8E9A, 0xF75F, 0x8E9D, 0xF8C6, 0x8E9E, 0xF8C3, + 0x8E9F, 0xF8C4, 0x8EA0, 0xF8C5, 0x8EA1, 0xC65C, 0x8EA3, 0xF951, + 0x8EA4, 0xF950, 0x8EA5, 0xF94F, 0x8EA6, 0xF970, 0x8EA8, 0xF9BE, + 0x8EA9, 0xF9AB, 0x8EAA, 0xC66E, 0x8EAB, 0xA8AD, 0x8EAC, 0xB060, + 0x8EB2, 0xB8FA, 0x8EBA, 0xBDF6, 0x8EBD, 0xEBC8, 0x8EC0, 0xC2DF, + 0x8EC2, 0xF355, 0x8EC9, 0xF9AC, 0x8ECA, 0xA8AE, 0x8ECB, 0xAAEE, + 0x8ECC, 0xAD79, 0x8ECD, 0xAD78, 0x8ECF, 0xB063, 0x8ED1, 0xD3E8, + 0x8ED2, 0xB061, 0x8ED3, 0xD3E9, 0x8ED4, 0xB062, 0x8ED7, 0xD7DF, + 0x8ED8, 0xD7DB, 0x8EDB, 0xB36D, 0x8EDC, 0xD7DE, 0x8EDD, 0xD7DD, + 0x8EDE, 0xD7DC, 0x8EDF, 0xB36E, 0x8EE0, 0xD7E0, 0x8EE1, 0xD7E1, + 0x8EE5, 0xDC43, 0x8EE6, 0xDC41, 0x8EE7, 0xDC45, 0x8EE8, 0xDC46, + 0x8EE9, 0xDC4C, 0x8EEB, 0xDC48, 0x8EEC, 0xDC4A, 0x8EEE, 0xDC42, + 0x8EEF, 0xDBFC, 0x8EF1, 0xDC49, 0x8EF4, 0xDC4B, 0x8EF5, 0xDC44, + 0x8EF6, 0xDC47, 0x8EF7, 0xDBFD, 0x8EF8, 0xB662, 0x8EF9, 0xDC40, + 0x8EFA, 0xDBFE, 0x8EFB, 0xB661, 0x8EFC, 0xB663, 0x8EFE, 0xB8FD, + 0x8EFF, 0xE075, 0x8F00, 0xE077, 0x8F01, 0xE076, 0x8F02, 0xE07B, + 0x8F03, 0xB8FB, 0x8F05, 0xE078, 0x8F06, 0xE074, 0x8F07, 0xE079, + 0x8F08, 0xE07A, 0x8F09, 0xB8FC, 0x8F0A, 0xB8FE, 0x8F0B, 0xE07C, + 0x8F0D, 0xE467, 0x8F0E, 0xE466, 0x8F10, 0xE464, 0x8F11, 0xE465, + 0x8F12, 0xBBB3, 0x8F13, 0xBBB5, 0x8F14, 0xBBB2, 0x8F15, 0xBBB4, + 0x8F16, 0xE84D, 0x8F17, 0xE84E, 0x8F18, 0xE849, 0x8F1A, 0xE84A, + 0x8F1B, 0xBDF8, 0x8F1C, 0xBDFD, 0x8F1D, 0xBDF7, 0x8F1E, 0xBDFE, + 0x8F1F, 0xBDF9, 0x8F20, 0xE84B, 0x8F23, 0xE84C, 0x8F24, 0xE848, + 0x8F25, 0xBE40, 0x8F26, 0xBDFB, 0x8F29, 0xBDFA, 0x8F2A, 0xBDFC, + 0x8F2C, 0xE847, 0x8F2E, 0xEBCA, 0x8F2F, 0xBFE8, 0x8F32, 0xEBCC, + 0x8F33, 0xBFEA, 0x8F34, 0xEBCF, 0x8F35, 0xEBCB, 0x8F36, 0xEBC9, + 0x8F37, 0xEBCE, 0x8F38, 0xBFE9, 0x8F39, 0xEBCD, 0x8F3B, 0xBFE7, + 0x8F3E, 0xC1D3, 0x8F3F, 0xC1D6, 0x8F40, 0xEEC1, 0x8F42, 0xC1D4, + 0x8F43, 0xEEC0, 0x8F44, 0xC1D2, 0x8F45, 0xC1D5, 0x8F46, 0xF146, + 0x8F47, 0xF147, 0x8F48, 0xF148, 0x8F49, 0xC2E0, 0x8F4B, 0xF149, + 0x8F4D, 0xC2E1, 0x8F4E, 0xC3E2, 0x8F4F, 0xF358, 0x8F50, 0xF359, + 0x8F51, 0xF357, 0x8F52, 0xF356, 0x8F53, 0xF35A, 0x8F54, 0xC3E1, + 0x8F55, 0xF4DD, 0x8F56, 0xF4DB, 0x8F57, 0xF4DC, 0x8F58, 0xF4DE, + 0x8F59, 0xF4DA, 0x8F5A, 0xF4DF, 0x8F5B, 0xF658, 0x8F5D, 0xF659, + 0x8F5E, 0xF657, 0x8F5F, 0xC546, 0x8F60, 0xF764, 0x8F61, 0xC5AF, + 0x8F62, 0xF765, 0x8F63, 0xF848, 0x8F64, 0xF847, 0x8F9B, 0xA8AF, + 0x8F9C, 0xB664, 0x8F9F, 0xB940, 0x8FA3, 0xBBB6, 0x8FA6, 0xBFEC, + 0x8FA8, 0xBFEB, 0x8FAD, 0xC3E3, 0x8FAE, 0xC47C, 0x8FAF, 0xC547, + 0x8FB0, 0xA8B0, 0x8FB1, 0xB064, 0x8FB2, 0xB941, 0x8FB4, 0xF35B, + 0x8FBF, 0xCBA6, 0x8FC2, 0xA8B1, 0x8FC4, 0xA8B4, 0x8FC5, 0xA8B3, + 0x8FC6, 0xA8B2, 0x8FC9, 0xCBA5, 0x8FCB, 0xCDCD, 0x8FCD, 0xCDCF, + 0x8FCE, 0xAAEF, 0x8FD1, 0xAAF1, 0x8FD2, 0xCDCC, 0x8FD3, 0xCDCE, + 0x8FD4, 0xAAF0, 0x8FD5, 0xCDD1, 0x8FD6, 0xCDD0, 0x8FD7, 0xCDD2, + 0x8FE0, 0xD0B6, 0x8FE1, 0xD0B4, 0x8FE2, 0xAD7C, 0x8FE3, 0xD0B3, + 0x8FE4, 0xADA3, 0x8FE5, 0xAD7E, 0x8FE6, 0xAD7B, 0x8FE8, 0xADA4, + 0x8FEA, 0xAD7D, 0x8FEB, 0xADA2, 0x8FED, 0xADA1, 0x8FEE, 0xD0B5, + 0x8FF0, 0xAD7A, 0x8FF4, 0xB06A, 0x8FF5, 0xD3EB, 0x8FF6, 0xD3F1, + 0x8FF7, 0xB067, 0x8FF8, 0xB06E, 0x8FFA, 0xB069, 0x8FFB, 0xD3EE, + 0x8FFC, 0xD3F0, 0x8FFD, 0xB06C, 0x8FFE, 0xD3EA, 0x8FFF, 0xD3ED, + 0x9000, 0xB068, 0x9001, 0xB065, 0x9002, 0xD3EC, 0x9003, 0xB06B, + 0x9004, 0xD3EF, 0x9005, 0xB06D, 0x9006, 0xB066, 0x900B, 0xD7E3, + 0x900C, 0xD7E6, 0x900D, 0xB370, 0x900F, 0xB37A, 0x9010, 0xB376, + 0x9011, 0xD7E4, 0x9014, 0xB37E, 0x9015, 0xB377, 0x9016, 0xB37C, + 0x9017, 0xB372, 0x9019, 0xB36F, 0x901A, 0xB371, 0x901B, 0xB37D, + 0x901C, 0xD7E5, 0x901D, 0xB375, 0x901E, 0xB378, 0x901F, 0xB374, + 0x9020, 0xB379, 0x9021, 0xD7E7, 0x9022, 0xB37B, 0x9023, 0xB373, + 0x9024, 0xD7E2, 0x902D, 0xDC4D, 0x902E, 0xB665, 0x902F, 0xDC4F, + 0x9031, 0xB667, 0x9032, 0xB669, 0x9034, 0xDC4E, 0x9035, 0xB666, + 0x9036, 0xB66A, 0x9038, 0xB668, 0x903C, 0xB947, 0x903D, 0xE0A3, + 0x903E, 0xB94F, 0x903F, 0xE07E, 0x9041, 0xB950, 0x9042, 0xB945, + 0x9044, 0xE0A1, 0x9047, 0xB94A, 0x9049, 0xE0A2, 0x904A, 0xB943, + 0x904B, 0xB942, 0x904D, 0xB94D, 0x904E, 0xB94C, 0x904F, 0xB94B, + 0x9050, 0xB949, 0x9051, 0xB94E, 0x9052, 0xE07D, 0x9053, 0xB944, + 0x9054, 0xB946, 0x9055, 0xB948, 0x9058, 0xBBB8, 0x9059, 0xBBBB, + 0x905B, 0xBBBF, 0x905C, 0xBBB9, 0x905D, 0xBBBE, 0x905E, 0xBBBC, + 0x9060, 0xBBB7, 0x9062, 0xBBBD, 0x9063, 0xBBBA, 0x9067, 0xE852, + 0x9068, 0xBE43, 0x9069, 0xBE41, 0x906B, 0xE853, 0x906D, 0xBE44, + 0x906E, 0xBE42, 0x906F, 0xE851, 0x9070, 0xE850, 0x9072, 0xBFF0, + 0x9073, 0xE84F, 0x9074, 0xBFEE, 0x9075, 0xBFED, 0x9076, 0xEBD0, + 0x9077, 0xBE45, 0x9078, 0xBFEF, 0x9079, 0xEBD1, 0x907A, 0xBFF2, + 0x907B, 0xEBD2, 0x907C, 0xBFF1, 0x907D, 0xC1D8, 0x907E, 0xEEC3, + 0x907F, 0xC1D7, 0x9080, 0xC1DC, 0x9081, 0xC1DA, 0x9082, 0xC1DB, + 0x9083, 0xC2E3, 0x9084, 0xC1D9, 0x9085, 0xEEC2, 0x9086, 0xEBD3, + 0x9087, 0xC2E2, 0x9088, 0xC2E4, 0x908A, 0xC3E4, 0x908B, 0xC3E5, + 0x908D, 0xF4E0, 0x908F, 0xC5DE, 0x9090, 0xC5DD, 0x9091, 0xA8B6, + 0x9094, 0xCA55, 0x9095, 0xB06F, 0x9097, 0xCA52, 0x9098, 0xCA53, + 0x9099, 0xCA51, 0x909B, 0xCA54, 0x909E, 0xCBAA, 0x909F, 0xCBA7, + 0x90A0, 0xCBAC, 0x90A1, 0xCBA8, 0x90A2, 0xA8B7, 0x90A3, 0xA8BA, + 0x90A5, 0xCBA9, 0x90A6, 0xA8B9, 0x90A7, 0xCBAB, 0x90AA, 0xA8B8, + 0x90AF, 0xCDD5, 0x90B0, 0xCDD7, 0x90B1, 0xAAF4, 0x90B2, 0xCDD3, + 0x90B3, 0xCDD6, 0x90B4, 0xCDD4, 0x90B5, 0xAAF2, 0x90B6, 0xAAF5, + 0x90B8, 0xAAF3, 0x90BD, 0xD0B8, 0x90BE, 0xD0BC, 0x90BF, 0xD0B9, + 0x90C1, 0xADA7, 0x90C3, 0xADA8, 0x90C5, 0xD0BB, 0x90C7, 0xD0BD, + 0x90C8, 0xD0BF, 0x90CA, 0xADA5, 0x90CB, 0xD0BE, 0x90CE, 0xADA6, + 0x90D4, 0xD7EE, 0x90D5, 0xD0BA, 0x90D6, 0xD3F2, 0x90D7, 0xD3FB, + 0x90D8, 0xD3F9, 0x90D9, 0xD3F4, 0x90DA, 0xD3F5, 0x90DB, 0xD3FA, + 0x90DC, 0xD3FC, 0x90DD, 0xB071, 0x90DF, 0xD3F7, 0x90E0, 0xD3F3, + 0x90E1, 0xB070, 0x90E2, 0xB072, 0x90E3, 0xD3F6, 0x90E4, 0xD3FD, + 0x90E5, 0xD3F8, 0x90E8, 0xB3A1, 0x90E9, 0xD7F1, 0x90EA, 0xD7E9, + 0x90EB, 0xD7EF, 0x90EC, 0xD7F0, 0x90ED, 0xB3A2, 0x90EF, 0xD7E8, + 0x90F0, 0xD7EA, 0x90F1, 0xD0B7, 0x90F2, 0xD7EC, 0x90F3, 0xD7ED, + 0x90F4, 0xD7EB, 0x90F5, 0xB66C, 0x90F9, 0xDC56, 0x90FA, 0xEBD4, + 0x90FB, 0xDC57, 0x90FC, 0xDC54, 0x90FD, 0xB3A3, 0x90FE, 0xB66E, + 0x90FF, 0xDC53, 0x9100, 0xDC59, 0x9101, 0xDC58, 0x9102, 0xB66B, + 0x9103, 0xDC5C, 0x9104, 0xDC52, 0x9105, 0xDC5B, 0x9106, 0xDC50, + 0x9107, 0xDC5A, 0x9108, 0xDC55, 0x9109, 0xB66D, 0x910B, 0xE0AA, + 0x910D, 0xE0A5, 0x910E, 0xE0AB, 0x910F, 0xE0A6, 0x9110, 0xE0A4, + 0x9111, 0xE0A7, 0x9112, 0xB951, 0x9114, 0xE0A9, 0x9116, 0xE0A8, + 0x9117, 0xB952, 0x9118, 0xBBC1, 0x9119, 0xBBC0, 0x911A, 0xE46E, + 0x911B, 0xE471, 0x911C, 0xE469, 0x911D, 0xE46D, 0x911E, 0xBBC2, + 0x911F, 0xE46C, 0x9120, 0xE46A, 0x9121, 0xE470, 0x9122, 0xE46B, + 0x9123, 0xE468, 0x9124, 0xE46F, 0x9126, 0xE859, 0x9127, 0xBE48, + 0x9128, 0xF14A, 0x9129, 0xE856, 0x912A, 0xE857, 0x912B, 0xE855, + 0x912C, 0xDC51, 0x912D, 0xBE47, 0x912E, 0xE85A, 0x912F, 0xE854, + 0x9130, 0xBE46, 0x9131, 0xBE49, 0x9132, 0xE858, 0x9133, 0xEBD5, + 0x9134, 0xBFF3, 0x9135, 0xEBD6, 0x9136, 0xEBD7, 0x9138, 0xEEC4, + 0x9139, 0xC1DD, 0x913A, 0xF14B, 0x913B, 0xF14C, 0x913E, 0xF14D, + 0x913F, 0xF35D, 0x9140, 0xF35C, 0x9141, 0xF4E2, 0x9143, 0xF4E1, + 0x9144, 0xF65B, 0x9145, 0xF65C, 0x9146, 0xF65A, 0x9147, 0xF766, + 0x9148, 0xC5B0, 0x9149, 0xA8BB, 0x914A, 0xADAA, 0x914B, 0xADA9, + 0x914C, 0xB075, 0x914D, 0xB074, 0x914E, 0xD440, 0x914F, 0xD441, + 0x9150, 0xD3FE, 0x9152, 0xB073, 0x9153, 0xD7F5, 0x9155, 0xD7F6, + 0x9156, 0xD7F2, 0x9157, 0xB3A4, 0x9158, 0xD7F3, 0x915A, 0xD7F4, + 0x915F, 0xDC5F, 0x9160, 0xDC61, 0x9161, 0xDC5D, 0x9162, 0xDC60, + 0x9163, 0xB66F, 0x9164, 0xDC5E, 0x9165, 0xB670, 0x9168, 0xDD73, + 0x9169, 0xB955, 0x916A, 0xB954, 0x916C, 0xB953, 0x916E, 0xE0AC, + 0x916F, 0xE0AD, 0x9172, 0xE473, 0x9173, 0xE475, 0x9174, 0xBBC6, + 0x9175, 0xBBC3, 0x9177, 0xBBC5, 0x9178, 0xBBC4, 0x9179, 0xE474, + 0x917A, 0xE472, 0x9180, 0xE861, 0x9181, 0xE85E, 0x9182, 0xE85F, + 0x9183, 0xBE4D, 0x9184, 0xE860, 0x9185, 0xE85B, 0x9186, 0xE85C, + 0x9187, 0xBE4A, 0x9189, 0xBE4B, 0x918A, 0xE85D, 0x918B, 0xBE4C, + 0x918D, 0xEBDB, 0x918F, 0xEBDC, 0x9190, 0xEBD9, 0x9191, 0xEBDA, + 0x9192, 0xBFF4, 0x9193, 0xEBD8, 0x9199, 0xEEC8, 0x919A, 0xEEC5, + 0x919B, 0xEEC7, 0x919C, 0xC1E0, 0x919D, 0xEECB, 0x919E, 0xC1DF, + 0x919F, 0xEEC9, 0x91A0, 0xEECC, 0x91A1, 0xEECA, 0x91A2, 0xEEC6, + 0x91A3, 0xC1DE, 0x91A5, 0xF14F, 0x91A7, 0xF150, 0x91A8, 0xF14E, + 0x91AA, 0xF152, 0x91AB, 0xC2E5, 0x91AC, 0xC2E6, 0x91AD, 0xF35F, + 0x91AE, 0xC3E7, 0x91AF, 0xF151, 0x91B0, 0xF35E, 0x91B1, 0xC3E6, + 0x91B2, 0xF4E5, 0x91B3, 0xF4E6, 0x91B4, 0xC4BF, 0x91B5, 0xF4E4, + 0x91B7, 0xF4E3, 0x91B9, 0xF65D, 0x91BA, 0xC548, 0x91BC, 0xF849, + 0x91BD, 0xF8C8, 0x91BE, 0xF8C7, 0x91C0, 0xC643, 0x91C1, 0xC65D, + 0x91C2, 0xF8C9, 0x91C3, 0xF971, 0x91C5, 0xC66F, 0x91C6, 0xA8BC, + 0x91C7, 0xAAF6, 0x91C9, 0xB956, 0x91CB, 0xC4C0, 0x91CC, 0xA8BD, + 0x91CD, 0xADAB, 0x91CE, 0xB3A5, 0x91CF, 0xB671, 0x91D0, 0xC2E7, + 0x91D1, 0xAAF7, 0x91D3, 0xD0C1, 0x91D4, 0xD0C0, 0x91D5, 0xD442, + 0x91D7, 0xB078, 0x91D8, 0xB076, 0x91D9, 0xB07A, 0x91DA, 0xD444, + 0x91DC, 0xB079, 0x91DD, 0xB077, 0x91E2, 0xD443, 0x91E3, 0xB3A8, + 0x91E4, 0xD7FC, 0x91E6, 0xB3A7, 0x91E7, 0xB3A9, 0x91E8, 0xD842, + 0x91E9, 0xB3AB, 0x91EA, 0xD7FE, 0x91EB, 0xD840, 0x91EC, 0xD7F7, + 0x91ED, 0xB3AA, 0x91EE, 0xD843, 0x91F1, 0xD7F9, 0x91F3, 0xD7FA, + 0x91F4, 0xD7F8, 0x91F5, 0xB3A6, 0x91F7, 0xD841, 0x91F8, 0xD7FB, + 0x91F9, 0xD7FD, 0x91FD, 0xDC6D, 0x91FF, 0xDC6C, 0x9200, 0xDC6A, + 0x9201, 0xDC62, 0x9202, 0xDC71, 0x9203, 0xDC65, 0x9204, 0xDC6F, + 0x9205, 0xDC76, 0x9206, 0xDC6E, 0x9207, 0xB679, 0x9209, 0xB675, + 0x920A, 0xDC63, 0x920C, 0xDC69, 0x920D, 0xB677, 0x920F, 0xDC68, + 0x9210, 0xB678, 0x9211, 0xB67A, 0x9212, 0xDC6B, 0x9214, 0xB672, + 0x9215, 0xB673, 0x9216, 0xDC77, 0x9217, 0xDC75, 0x9219, 0xDC74, + 0x921A, 0xDC66, 0x921C, 0xDC72, 0x921E, 0xB676, 0x9223, 0xB674, + 0x9224, 0xDC73, 0x9225, 0xDC64, 0x9226, 0xDC67, 0x9227, 0xDC70, + 0x922D, 0xE4BA, 0x922E, 0xE0B7, 0x9230, 0xE0B0, 0x9231, 0xE0C3, + 0x9232, 0xE0CC, 0x9233, 0xE0B3, 0x9234, 0xB961, 0x9236, 0xE0C0, + 0x9237, 0xB957, 0x9238, 0xB959, 0x9239, 0xB965, 0x923A, 0xE0B1, + 0x923D, 0xB95A, 0x923E, 0xB95C, 0x923F, 0xB966, 0x9240, 0xB95B, + 0x9245, 0xB964, 0x9246, 0xE0B9, 0x9248, 0xE0AE, 0x9249, 0xB962, + 0x924A, 0xE0B8, 0x924B, 0xB95E, 0x924C, 0xE0CA, 0x924D, 0xB963, + 0x924E, 0xE0C8, 0x924F, 0xE0BC, 0x9250, 0xE0C6, 0x9251, 0xB960, + 0x9252, 0xE0AF, 0x9253, 0xE0C9, 0x9254, 0xE0C4, 0x9256, 0xE0CB, + 0x9257, 0xB958, 0x925A, 0xB967, 0x925B, 0xB95D, 0x925E, 0xE0B5, + 0x9260, 0xE0BD, 0x9261, 0xE0C1, 0x9263, 0xE0C5, 0x9264, 0xB95F, + 0x9265, 0xE0B4, 0x9266, 0xE0B2, 0x9267, 0xE0BE, 0x926C, 0xE0BB, + 0x926D, 0xE0BA, 0x926F, 0xE0BF, 0x9270, 0xE0C2, 0x9272, 0xE0C7, + 0x9276, 0xE478, 0x9278, 0xBBC7, 0x9279, 0xE4A4, 0x927A, 0xE47A, + 0x927B, 0xBBCC, 0x927C, 0xBBD0, 0x927D, 0xE4AD, 0x927E, 0xE4B5, + 0x927F, 0xE4A6, 0x9280, 0xBBC8, 0x9282, 0xE4AA, 0x9283, 0xE0B6, + 0x9285, 0xBBC9, 0x9286, 0xE4B1, 0x9287, 0xE4B6, 0x9288, 0xE4AE, + 0x928A, 0xE4B0, 0x928B, 0xE4B9, 0x928C, 0xE4B2, 0x928D, 0xE47E, + 0x928E, 0xE4A9, 0x9291, 0xBBD1, 0x9293, 0xBBCD, 0x9294, 0xE47C, + 0x9295, 0xE4AB, 0x9296, 0xBBCB, 0x9297, 0xE4A5, 0x9298, 0xBBCA, + 0x9299, 0xE4B3, 0x929A, 0xE4A2, 0x929B, 0xE479, 0x929C, 0xBBCE, + 0x929D, 0xE4B8, 0x92A0, 0xE47B, 0x92A1, 0xE4AF, 0x92A2, 0xE4AC, + 0x92A3, 0xE4A7, 0x92A4, 0xE477, 0x92A5, 0xE476, 0x92A6, 0xE4A1, + 0x92A7, 0xE4B4, 0x92A8, 0xBBCF, 0x92A9, 0xE4B7, 0x92AA, 0xE47D, + 0x92AB, 0xE4A3, 0x92AC, 0xBE52, 0x92B2, 0xBE5A, 0x92B3, 0xBE55, + 0x92B4, 0xE8A4, 0x92B5, 0xE8A1, 0x92B6, 0xE867, 0x92B7, 0xBE50, + 0x92B9, 0xF9D7, 0x92BB, 0xBE4F, 0x92BC, 0xBE56, 0x92C0, 0xE865, + 0x92C1, 0xBE54, 0x92C2, 0xE871, 0x92C3, 0xE863, 0x92C4, 0xE864, + 0x92C5, 0xBE4E, 0x92C6, 0xE8A3, 0x92C7, 0xBE58, 0x92C8, 0xE874, + 0x92C9, 0xE879, 0x92CA, 0xE873, 0x92CB, 0xEBEE, 0x92CC, 0xE86F, + 0x92CD, 0xE877, 0x92CE, 0xE875, 0x92CF, 0xE868, 0x92D0, 0xE862, + 0x92D1, 0xE87D, 0x92D2, 0xBE57, 0x92D3, 0xE87E, 0x92D5, 0xE878, + 0x92D7, 0xE86D, 0x92D8, 0xE86B, 0x92D9, 0xE866, 0x92DD, 0xE86E, + 0x92DE, 0xE87B, 0x92DF, 0xE86A, 0x92E0, 0xE87A, 0x92E1, 0xE8A2, + 0x92E4, 0xBE53, 0x92E6, 0xE876, 0x92E7, 0xE87C, 0x92E8, 0xE872, + 0x92E9, 0xE86C, 0x92EA, 0xBE51, 0x92EE, 0xE4A8, 0x92EF, 0xE870, + 0x92F0, 0xBE59, 0x92F1, 0xE869, 0x92F7, 0xEBF4, 0x92F8, 0xBFF7, + 0x92F9, 0xEBF3, 0x92FA, 0xEBF0, 0x92FB, 0xEC44, 0x92FC, 0xBFFB, + 0x92FE, 0xEC41, 0x92FF, 0xEBF8, 0x9300, 0xEC43, 0x9301, 0xEBE9, + 0x9302, 0xEBF6, 0x9304, 0xBFFD, 0x9306, 0xEBE1, 0x9308, 0xEBDF, + 0x9309, 0xEC42, 0x930B, 0xEC40, 0x930C, 0xEBFE, 0x930D, 0xEBED, + 0x930E, 0xEBEC, 0x930F, 0xEBE2, 0x9310, 0xC040, 0x9312, 0xEBE8, + 0x9313, 0xEBF2, 0x9314, 0xEBFD, 0x9315, 0xC043, 0x9316, 0xEC45, + 0x9318, 0xC1E8, 0x9319, 0xC045, 0x931A, 0xBFFE, 0x931B, 0xEBE6, + 0x931D, 0xEBEF, 0x931E, 0xEBDE, 0x931F, 0xEBE0, 0x9320, 0xBFF5, + 0x9321, 0xC042, 0x9322, 0xBFFA, 0x9323, 0xEBE7, 0x9324, 0xEBF7, + 0x9325, 0xEBF1, 0x9326, 0xC041, 0x9327, 0xEBDD, 0x9328, 0xC1E3, + 0x9329, 0xEBF9, 0x932A, 0xEBFC, 0x932B, 0xBFFC, 0x932D, 0xEBEB, + 0x932E, 0xC044, 0x932F, 0xBFF9, 0x9333, 0xBFF8, 0x9334, 0xEBF5, + 0x9335, 0xEBFB, 0x9336, 0xBFF6, 0x9338, 0xEBE4, 0x9339, 0xEBFA, + 0x933C, 0xEBE5, 0x9346, 0xEBEA, 0x9347, 0xEED2, 0x9349, 0xEED7, + 0x934A, 0xC1E5, 0x934B, 0xC1E7, 0x934C, 0xEEDD, 0x934D, 0xC1E1, + 0x934E, 0xEEEC, 0x934F, 0xEEE3, 0x9350, 0xEED8, 0x9351, 0xEED9, + 0x9352, 0xEEE2, 0x9354, 0xC1EE, 0x9355, 0xEEE1, 0x9356, 0xEED1, + 0x9357, 0xEEE0, 0x9358, 0xEED4, 0x9359, 0xEEED, 0x935A, 0xC1ED, + 0x935B, 0xC1EB, 0x935C, 0xEED5, 0x935E, 0xEEE8, 0x9360, 0xEEDA, + 0x9361, 0xEEE7, 0x9363, 0xEEE9, 0x9364, 0xEED0, 0x9365, 0xC1E6, + 0x9367, 0xEEEA, 0x936A, 0xEEDE, 0x936C, 0xC1EA, 0x936D, 0xEEDB, + 0x9370, 0xC1EC, 0x9371, 0xEEE4, 0x9375, 0xC1E4, 0x9376, 0xEED6, + 0x9377, 0xEEE5, 0x9379, 0xEEDF, 0x937A, 0xEBE3, 0x937B, 0xEEE6, + 0x937C, 0xEED3, 0x937E, 0xC1E9, 0x9380, 0xEEEB, 0x9382, 0xC1E2, + 0x9383, 0xEECE, 0x9388, 0xF160, 0x9389, 0xF159, 0x938A, 0xC2E9, + 0x938C, 0xF154, 0x938D, 0xF163, 0x938E, 0xF15B, 0x938F, 0xEEDC, + 0x9391, 0xF165, 0x9392, 0xF155, 0x9394, 0xC2E8, 0x9395, 0xF15F, + 0x9396, 0xC2EA, 0x9397, 0xC2F2, 0x9398, 0xC2F0, 0x9399, 0xF161, + 0x939A, 0xC2F1, 0x939B, 0xF157, 0x939D, 0xF158, 0x939E, 0xF15D, + 0x939F, 0xF162, 0x93A1, 0xEECD, 0x93A2, 0xC2EB, 0x93A3, 0xF16A, + 0x93A4, 0xF167, 0x93A5, 0xF16B, 0x93A6, 0xF15E, 0x93A7, 0xF15A, + 0x93A8, 0xF168, 0x93A9, 0xF36A, 0x93AA, 0xF15C, 0x93AC, 0xC2EE, + 0x93AE, 0xC2ED, 0x93AF, 0xEECF, 0x93B0, 0xC2EF, 0x93B1, 0xF164, + 0x93B2, 0xF166, 0x93B3, 0xC2EC, 0x93B4, 0xF169, 0x93B5, 0xF153, + 0x93B7, 0xF156, 0x93C0, 0xF373, 0x93C2, 0xF363, 0x93C3, 0xC3EB, + 0x93C4, 0xF371, 0x93C7, 0xF361, 0x93C8, 0xC3EC, 0x93CA, 0xF36C, + 0x93CC, 0xF368, 0x93CD, 0xC3F1, 0x93CE, 0xF372, 0x93CF, 0xF362, + 0x93D0, 0xF365, 0x93D1, 0xC3E9, 0x93D2, 0xF374, 0x93D4, 0xF36D, + 0x93D5, 0xF370, 0x93D6, 0xC3EF, 0x93D7, 0xC3F4, 0x93D8, 0xC3F2, + 0x93D9, 0xF369, 0x93DA, 0xF364, 0x93DC, 0xC3ED, 0x93DD, 0xC3EE, + 0x93DE, 0xF360, 0x93DF, 0xC3EA, 0x93E1, 0xC3E8, 0x93E2, 0xC3F0, + 0x93E3, 0xF36F, 0x93E4, 0xC3F3, 0x93E6, 0xF36B, 0x93E7, 0xF375, + 0x93E8, 0xC3F5, 0x93EC, 0xF367, 0x93EE, 0xF36E, 0x93F5, 0xF4F3, + 0x93F6, 0xF542, 0x93F7, 0xF4F5, 0x93F8, 0xF4FC, 0x93F9, 0xF366, + 0x93FA, 0xF4FA, 0x93FB, 0xF4E9, 0x93FC, 0xF540, 0x93FD, 0xC4C3, + 0x93FE, 0xF4ED, 0x93FF, 0xF4FE, 0x9400, 0xF4F4, 0x9403, 0xC4C2, + 0x9406, 0xF544, 0x9407, 0xF4F6, 0x9409, 0xF4FB, 0x940A, 0xF4FD, + 0x940B, 0xF4E7, 0x940C, 0xF541, 0x940D, 0xF4F2, 0x940E, 0xF4F7, + 0x940F, 0xF4EB, 0x9410, 0xF4EF, 0x9411, 0xF543, 0x9412, 0xF4F9, + 0x9413, 0xF4E8, 0x9414, 0xF4EC, 0x9415, 0xF4EE, 0x9416, 0xF4F8, + 0x9418, 0xC4C1, 0x9419, 0xF4F1, 0x9420, 0xF4EA, 0x9428, 0xF4F0, + 0x9429, 0xF661, 0x942A, 0xF666, 0x942B, 0xC54F, 0x942C, 0xF668, + 0x942E, 0xC549, 0x9430, 0xF664, 0x9431, 0xF66A, 0x9432, 0xC54E, + 0x9433, 0xC54A, 0x9435, 0xC54B, 0x9436, 0xF660, 0x9437, 0xF667, + 0x9438, 0xC54D, 0x9439, 0xF665, 0x943A, 0xC54C, 0x943B, 0xF65F, + 0x943C, 0xF663, 0x943D, 0xF662, 0x943F, 0xF65E, 0x9440, 0xF669, + 0x9444, 0xC5B1, 0x9445, 0xF76D, 0x9446, 0xF770, 0x9447, 0xF76C, + 0x9448, 0xF76E, 0x9449, 0xF76F, 0x944A, 0xF769, 0x944B, 0xF76A, + 0x944C, 0xF767, 0x944F, 0xF76B, 0x9450, 0xF768, 0x9451, 0xC5B2, + 0x9452, 0xC5B3, 0x9455, 0xF84B, 0x9457, 0xF84D, 0x945D, 0xF84C, + 0x945E, 0xF84E, 0x9460, 0xC5E0, 0x9462, 0xF84A, 0x9463, 0xC5DF, + 0x9464, 0xC5E1, 0x9468, 0xF8CB, 0x9469, 0xF8CC, 0x946A, 0xC644, + 0x946B, 0xF8CA, 0x946D, 0xF953, 0x946E, 0xF952, 0x946F, 0xF954, + 0x9470, 0xC65F, 0x9471, 0xF955, 0x9472, 0xC65E, 0x9473, 0xF956, + 0x9474, 0xF972, 0x9475, 0xF975, 0x9476, 0xF974, 0x9477, 0xC668, + 0x9478, 0xF973, 0x947C, 0xC672, 0x947D, 0xC670, 0x947E, 0xC671, + 0x947F, 0xC677, 0x9480, 0xF9C0, 0x9481, 0xF9C1, 0x9482, 0xF9BF, + 0x9483, 0xF9C9, 0x9577, 0xAAF8, 0x957A, 0xD844, 0x957B, 0xDC78, + 0x957C, 0xE8A5, 0x957D, 0xF376, 0x9580, 0xAAF9, 0x9582, 0xADAC, + 0x9583, 0xB07B, 0x9586, 0xD845, 0x9588, 0xD846, 0x9589, 0xB3AC, + 0x958B, 0xB67D, 0x958C, 0xDC7A, 0x958D, 0xDC79, 0x958E, 0xB6A3, + 0x958F, 0xB67C, 0x9590, 0xDC7B, 0x9591, 0xB67E, 0x9592, 0xB6A2, + 0x9593, 0xB6A1, 0x9594, 0xB67B, 0x9598, 0xB968, 0x959B, 0xE0D0, + 0x959C, 0xE0CE, 0x959E, 0xE0CF, 0x959F, 0xE0CD, 0x95A1, 0xBBD2, + 0x95A3, 0xBBD5, 0x95A4, 0xBBD7, 0x95A5, 0xBBD6, 0x95A8, 0xBBD3, + 0x95A9, 0xBBD4, 0x95AB, 0xE8A7, 0x95AC, 0xE8A6, 0x95AD, 0xBE5B, + 0x95AE, 0xE8A8, 0x95B0, 0xE8A9, 0x95B1, 0xBE5C, 0x95B5, 0xEC4D, + 0x95B6, 0xEC4B, 0x95B7, 0xEEF3, 0x95B9, 0xEC49, 0x95BA, 0xEC4A, + 0x95BB, 0xC046, 0x95BC, 0xEC46, 0x95BD, 0xEC4E, 0x95BE, 0xEC48, + 0x95BF, 0xEC4C, 0x95C0, 0xEEEF, 0x95C3, 0xEEF1, 0x95C5, 0xEEF2, + 0x95C6, 0xC1F3, 0x95C7, 0xEEEE, 0x95C8, 0xC1F2, 0x95C9, 0xEEF0, + 0x95CA, 0xC1EF, 0x95CB, 0xC1F0, 0x95CC, 0xC1F1, 0x95CD, 0xEC47, + 0x95D0, 0xC2F5, 0x95D1, 0xF16E, 0x95D2, 0xF16C, 0x95D3, 0xF16D, + 0x95D4, 0xC2F3, 0x95D5, 0xC2F6, 0x95D6, 0xC2F4, 0x95DA, 0xF377, + 0x95DB, 0xF378, 0x95DC, 0xC3F6, 0x95DE, 0xF545, 0x95DF, 0xF547, + 0x95E0, 0xF546, 0x95E1, 0xC4C4, 0x95E2, 0xC550, 0x95E3, 0xF66D, + 0x95E4, 0xF66C, 0x95E5, 0xF66B, 0x961C, 0xAAFA, 0x961E, 0xC9AA, + 0x9620, 0xCA58, 0x9621, 0xA6E9, 0x9622, 0xCA56, 0x9623, 0xCA59, + 0x9624, 0xCA57, 0x9628, 0xCBAE, 0x962A, 0xA8C1, 0x962C, 0xA8C2, + 0x962D, 0xCBB0, 0x962E, 0xA8BF, 0x962F, 0xCBAF, 0x9630, 0xCBAD, + 0x9631, 0xA8C0, 0x9632, 0xA8BE, 0x9639, 0xCDD8, 0x963A, 0xCDDB, + 0x963B, 0xAAFD, 0x963C, 0xCDDA, 0x963D, 0xCDD9, 0x963F, 0xAAFC, + 0x9640, 0xAAFB, 0x9642, 0xAB40, 0x9643, 0xCDDC, 0x9644, 0xAAFE, + 0x964A, 0xD0C6, 0x964B, 0xADAE, 0x964C, 0xADAF, 0x964D, 0xADB0, + 0x964E, 0xD0C7, 0x964F, 0xD0C3, 0x9650, 0xADAD, 0x9651, 0xD0C4, + 0x9653, 0xD0C5, 0x9654, 0xD0C2, 0x9658, 0xB0A4, 0x965B, 0xB0A1, + 0x965C, 0xD445, 0x965D, 0xB0A2, 0x965E, 0xB0A5, 0x965F, 0xD446, + 0x9661, 0xB07E, 0x9662, 0xB07C, 0x9663, 0xB07D, 0x9664, 0xB0A3, + 0x966A, 0xB3AD, 0x966B, 0xD849, 0x966C, 0xB3B5, 0x966D, 0xD848, + 0x966F, 0xD84B, 0x9670, 0xB3B1, 0x9671, 0xD84A, 0x9672, 0xB6AB, + 0x9673, 0xB3AF, 0x9674, 0xB3B2, 0x9675, 0xB3AE, 0x9676, 0xB3B3, + 0x9677, 0xB3B4, 0x9678, 0xB3B0, 0x967C, 0xD847, 0x967D, 0xB6A7, + 0x967E, 0xDC7D, 0x9680, 0xDCA3, 0x9683, 0xDCA2, 0x9684, 0xB6AC, + 0x9685, 0xB6A8, 0x9686, 0xB6A9, 0x9687, 0xDC7C, 0x9688, 0xDC7E, + 0x9689, 0xDCA1, 0x968A, 0xB6A4, 0x968B, 0xB6A6, 0x968D, 0xB6AA, + 0x968E, 0xB6A5, 0x9691, 0xE0D3, 0x9692, 0xE0D1, 0x9693, 0xE0D2, + 0x9694, 0xB96A, 0x9695, 0xB96B, 0x9697, 0xE0D4, 0x9698, 0xB969, + 0x9699, 0xBBD8, 0x969B, 0xBBDA, 0x969C, 0xBBD9, 0x969E, 0xE4BB, + 0x96A1, 0xE4BC, 0x96A2, 0xE8AB, 0x96A4, 0xE8AA, 0x96A7, 0xC047, + 0x96A8, 0xC048, 0x96A9, 0xEC4F, 0x96AA, 0xC049, 0x96AC, 0xEEF6, + 0x96AE, 0xEEF4, 0x96B0, 0xEEF5, 0x96B1, 0xC1F4, 0x96B3, 0xF16F, + 0x96B4, 0xC3F7, 0x96B8, 0xC1F5, 0x96B9, 0xAB41, 0x96BB, 0xB0A6, + 0x96BC, 0xD447, 0x96BF, 0xD84C, 0x96C0, 0xB3B6, 0x96C1, 0xB6AD, + 0x96C2, 0xDCA4, 0x96C3, 0xDCA6, 0x96C4, 0xB6AF, 0x96C5, 0xB6AE, + 0x96C6, 0xB6B0, 0x96C7, 0xB6B1, 0x96C8, 0xDCA5, 0x96C9, 0xB96E, + 0x96CA, 0xB96F, 0x96CB, 0xB96D, 0x96CC, 0xBBDB, 0x96CD, 0xB96C, + 0x96CE, 0xE0D5, 0x96D2, 0xBBDC, 0x96D3, 0xE8AC, 0x96D4, 0xEC50, + 0x96D5, 0xC04A, 0x96D6, 0xC1F6, 0x96D7, 0xF170, 0x96D8, 0xF174, + 0x96D9, 0xC2F9, 0x96DA, 0xF171, 0x96DB, 0xC2FA, 0x96DC, 0xC2F8, + 0x96DD, 0xF175, 0x96DE, 0xC2FB, 0x96DF, 0xF173, 0x96E1, 0xF379, + 0x96E2, 0xC2F7, 0x96E3, 0xC3F8, 0x96E5, 0xF8CD, 0x96E8, 0xAB42, + 0x96E9, 0xB3B8, 0x96EA, 0xB3B7, 0x96EF, 0xB6B2, 0x96F0, 0xDCA8, + 0x96F1, 0xDCA7, 0x96F2, 0xB6B3, 0x96F5, 0xE0D9, 0x96F6, 0xB973, + 0x96F7, 0xB970, 0x96F8, 0xE0D8, 0x96F9, 0xB972, 0x96FA, 0xE0D6, + 0x96FB, 0xB971, 0x96FD, 0xE0D7, 0x96FF, 0xE4BD, 0x9700, 0xBBDD, + 0x9702, 0xE8AF, 0x9704, 0xBE5D, 0x9705, 0xE8AD, 0x9706, 0xBE5E, + 0x9707, 0xBE5F, 0x9708, 0xE8AE, 0x9709, 0xBE60, 0x970B, 0xEC51, + 0x970D, 0xC04E, 0x970E, 0xC04B, 0x970F, 0xC050, 0x9710, 0xEC53, + 0x9711, 0xC04C, 0x9712, 0xEC52, 0x9713, 0xC04F, 0x9716, 0xC04D, + 0x9718, 0xEEF9, 0x9719, 0xEEFB, 0x971C, 0xC1F7, 0x971D, 0xEEFA, + 0x971E, 0xC1F8, 0x971F, 0xEEF8, 0x9720, 0xEEF7, 0x9722, 0xF177, + 0x9723, 0xF176, 0x9724, 0xC2FC, 0x9725, 0xF178, 0x9726, 0xF37E, + 0x9727, 0xC3FA, 0x9728, 0xF37D, 0x9729, 0xF37A, 0x972A, 0xC3F9, + 0x972B, 0xF37B, 0x972C, 0xF37C, 0x972E, 0xF548, 0x972F, 0xF549, + 0x9730, 0xC4C5, 0x9732, 0xC553, 0x9735, 0xF66E, 0x9738, 0xC551, + 0x9739, 0xC552, 0x973A, 0xF66F, 0x973D, 0xC5B4, 0x973E, 0xC5B5, + 0x973F, 0xF771, 0x9742, 0xC645, 0x9743, 0xF8CF, 0x9744, 0xC647, + 0x9746, 0xF8CE, 0x9747, 0xF8D0, 0x9748, 0xC646, 0x9749, 0xF957, + 0x974B, 0xF9AD, 0x9752, 0xAB43, 0x9756, 0xB974, 0x9758, 0xE4BE, + 0x975A, 0xE8B0, 0x975B, 0xC051, 0x975C, 0xC052, 0x975E, 0xAB44, + 0x9760, 0xBE61, 0x9761, 0xC3FB, 0x9762, 0xADB1, 0x9766, 0xC053, + 0x9768, 0xC5E2, 0x9769, 0xADB2, 0x976A, 0xD84D, 0x976C, 0xDCA9, + 0x976E, 0xDCAB, 0x9770, 0xDCAA, 0x9772, 0xE0DD, 0x9773, 0xE0DA, + 0x9774, 0xB975, 0x9776, 0xB976, 0x9777, 0xE0DB, 0x9778, 0xE0DC, + 0x977A, 0xE4C0, 0x977B, 0xE4C5, 0x977C, 0xBBDE, 0x977D, 0xE4BF, + 0x977E, 0xE4C1, 0x977F, 0xE4C8, 0x9780, 0xE4C3, 0x9781, 0xE4C7, + 0x9782, 0xE4C4, 0x9783, 0xE4C2, 0x9784, 0xE4C6, 0x9785, 0xBBDF, + 0x9788, 0xE8B3, 0x978A, 0xE8B1, 0x978B, 0xBE63, 0x978D, 0xBE62, + 0x978E, 0xE8B2, 0x978F, 0xBE64, 0x9794, 0xEC56, 0x9797, 0xEC55, + 0x9798, 0xC054, 0x9799, 0xEC54, 0x979A, 0xEEFC, 0x979C, 0xEEFE, + 0x979D, 0xEF41, 0x979E, 0xEF40, 0x97A0, 0xC1F9, 0x97A1, 0xEEFD, + 0x97A2, 0xF1A1, 0x97A3, 0xC2FD, 0x97A4, 0xF17D, 0x97A5, 0xF1A2, + 0x97A6, 0xC2FE, 0x97A8, 0xF17B, 0x97AA, 0xF17E, 0x97AB, 0xF17C, + 0x97AC, 0xF179, 0x97AD, 0xC340, 0x97AE, 0xF17A, 0x97B3, 0xF3A1, + 0x97B6, 0xF3A3, 0x97B7, 0xF3A2, 0x97B9, 0xF54A, 0x97BB, 0xF54B, + 0x97BF, 0xF670, 0x97C1, 0xC5B7, 0x97C3, 0xC5B6, 0x97C4, 0xF84F, + 0x97C5, 0xF850, 0x97C6, 0xC648, 0x97C7, 0xF8D1, 0x97C9, 0xC669, + 0x97CB, 0xADB3, 0x97CC, 0xB6B4, 0x97CD, 0xE4CA, 0x97CE, 0xE4C9, + 0x97CF, 0xE8B5, 0x97D0, 0xE8B4, 0x97D3, 0xC1FA, 0x97D4, 0xEF43, + 0x97D5, 0xEF42, 0x97D6, 0xF1A5, 0x97D7, 0xF1A3, 0x97D8, 0xF1A6, + 0x97D9, 0xF1A4, 0x97DC, 0xC3FC, 0x97DD, 0xF3A4, 0x97DE, 0xF3A5, + 0x97DF, 0xF3A6, 0x97E1, 0xF671, 0x97E3, 0xF772, 0x97E5, 0xF8D2, + 0x97ED, 0xADB4, 0x97F0, 0xEC57, 0x97F1, 0xEF44, 0x97F3, 0xADB5, + 0x97F6, 0xBBE0, 0x97F8, 0xEC58, 0x97F9, 0xC341, 0x97FA, 0xF1A7, + 0x97FB, 0xC3FD, 0x97FD, 0xF54C, 0x97FE, 0xF54D, 0x97FF, 0xC554, + 0x9800, 0xF851, 0x9801, 0xADB6, 0x9802, 0xB3BB, 0x9803, 0xB3BC, + 0x9804, 0xD84E, 0x9805, 0xB6B5, 0x9806, 0xB6B6, 0x9807, 0xDCAC, + 0x9808, 0xB6B7, 0x980A, 0xB97A, 0x980C, 0xB97C, 0x980D, 0xE0DF, + 0x980E, 0xE0E0, 0x980F, 0xE0DE, 0x9810, 0xB977, 0x9811, 0xB978, + 0x9812, 0xB97B, 0x9813, 0xB979, 0x9816, 0xE4CB, 0x9817, 0xBBE1, + 0x9818, 0xBBE2, 0x981B, 0xE8BC, 0x981C, 0xBE67, 0x981D, 0xE8B7, + 0x981E, 0xE8B6, 0x9820, 0xE8BB, 0x9821, 0xBE65, 0x9824, 0xC05B, + 0x9826, 0xE8B8, 0x9827, 0xE8BD, 0x9828, 0xE8BA, 0x9829, 0xE8B9, + 0x982B, 0xBE66, 0x982D, 0xC059, 0x982F, 0xEC5A, 0x9830, 0xC055, + 0x9832, 0xEC5B, 0x9835, 0xEC59, 0x9837, 0xC058, 0x9838, 0xC056, + 0x9839, 0xC05A, 0x983B, 0xC057, 0x9841, 0xEF45, 0x9843, 0xEF4A, + 0x9844, 0xEF46, 0x9845, 0xEF49, 0x9846, 0xC1FB, 0x9848, 0xEDD4, + 0x9849, 0xEF48, 0x984A, 0xEF47, 0x984C, 0xC344, 0x984D, 0xC342, + 0x984E, 0xC345, 0x984F, 0xC343, 0x9850, 0xF1A8, 0x9851, 0xF1A9, + 0x9852, 0xF1AA, 0x9853, 0xC346, 0x9857, 0xF3AA, 0x9858, 0xC440, + 0x9859, 0xF3A8, 0x985B, 0xC441, 0x985C, 0xF3A7, 0x985D, 0xF3A9, + 0x985E, 0xC3FE, 0x985F, 0xF551, 0x9860, 0xF54E, 0x9862, 0xF54F, + 0x9863, 0xF550, 0x9864, 0xF672, 0x9865, 0xC556, 0x9867, 0xC555, + 0x9869, 0xF774, 0x986A, 0xF773, 0x986B, 0xC5B8, 0x986F, 0xC5E3, + 0x9870, 0xC649, 0x9871, 0xC660, 0x9872, 0xF958, 0x9873, 0xF9AE, + 0x9874, 0xF9AF, 0x98A8, 0xADB7, 0x98A9, 0xDCAD, 0x98AC, 0xE0E1, + 0x98AD, 0xE4CC, 0x98AE, 0xE4CD, 0x98AF, 0xBBE3, 0x98B1, 0xBBE4, + 0x98B2, 0xE8BE, 0x98B3, 0xBE68, 0x98B6, 0xC1FC, 0x98B8, 0xF1AB, + 0x98BA, 0xC347, 0x98BB, 0xF3AD, 0x98BC, 0xC442, 0x98BD, 0xF3AC, + 0x98BE, 0xF3AE, 0x98BF, 0xF3AB, 0x98C0, 0xF675, 0x98C1, 0xF552, + 0x98C2, 0xF553, 0x98C4, 0xC4C6, 0x98C6, 0xF674, 0x98C9, 0xF673, + 0x98CB, 0xF775, 0x98CC, 0xF9B0, 0x98DB, 0xADB8, 0x98DF, 0xADB9, + 0x98E2, 0xB0A7, 0x98E3, 0xD448, 0x98E5, 0xD84F, 0x98E7, 0xB6B8, + 0x98E9, 0xB6BB, 0x98EA, 0xB6B9, 0x98EB, 0xDCAE, 0x98ED, 0xB6BD, + 0x98EF, 0xB6BA, 0x98F2, 0xB6BC, 0x98F4, 0xB97E, 0x98F6, 0xE0E2, + 0x98F9, 0xE0E3, 0x98FA, 0xE8C0, 0x98FC, 0xB97D, 0x98FD, 0xB9A1, + 0x98FE, 0xB9A2, 0x9900, 0xE4CF, 0x9902, 0xE4CE, 0x9903, 0xBBE5, + 0x9905, 0xBBE6, 0x9907, 0xE4D0, 0x9908, 0xE8BF, 0x9909, 0xBBE8, + 0x990A, 0xBE69, 0x990C, 0xBBE7, 0x9910, 0xC05C, 0x9911, 0xE8C1, + 0x9912, 0xBE6B, 0x9913, 0xBE6A, 0x9914, 0xE8C2, 0x9915, 0xE8C5, + 0x9916, 0xE8C3, 0x9917, 0xE8C4, 0x9918, 0xBE6C, 0x991A, 0xC061, + 0x991B, 0xC05F, 0x991E, 0xC05E, 0x991F, 0xEC5D, 0x9921, 0xC060, + 0x9924, 0xEC5C, 0x9925, 0xEF4B, 0x9927, 0xEC5E, 0x9928, 0xC05D, + 0x9929, 0xEC5F, 0x992A, 0xEF4E, 0x992B, 0xEF4C, 0x992C, 0xEF4D, + 0x992D, 0xEF52, 0x992E, 0xC34B, 0x992F, 0xEF51, 0x9930, 0xEF54, + 0x9931, 0xEF53, 0x9932, 0xEF50, 0x9933, 0xEF4F, 0x9935, 0xC1FD, + 0x993A, 0xF1AE, 0x993C, 0xF1AD, 0x993D, 0xC34A, 0x993E, 0xC348, + 0x993F, 0xC349, 0x9941, 0xF1AC, 0x9943, 0xF3B1, 0x9945, 0xC443, + 0x9947, 0xF3B0, 0x9948, 0xF3AF, 0x9949, 0xC444, 0x994B, 0xF558, + 0x994C, 0xF557, 0x994E, 0xF555, 0x9950, 0xF554, 0x9951, 0xC4C8, + 0x9952, 0xC4C7, 0x9953, 0xF559, 0x9954, 0xF776, 0x9955, 0xC5B9, + 0x9956, 0xF677, 0x9957, 0xC557, 0x9958, 0xF676, 0x9959, 0xF556, + 0x995B, 0xF777, 0x995C, 0xC5E4, 0x995E, 0xC661, 0x995F, 0xF959, + 0x9961, 0xF9B1, 0x9996, 0xADBA, 0x9997, 0xD850, 0x9998, 0xEF55, + 0x9999, 0xADBB, 0x999C, 0xE4D2, 0x999D, 0xE4D1, 0x999E, 0xEC60, + 0x99A1, 0xEF57, 0x99A3, 0xEF56, 0x99A5, 0xC34C, 0x99A6, 0xF3B2, + 0x99A7, 0xF3B3, 0x99A8, 0xC4C9, 0x99AB, 0xF9B2, 0x99AC, 0xB0A8, + 0x99AD, 0xB6BF, 0x99AE, 0xB6BE, 0x99AF, 0xE0E4, 0x99B0, 0xE0E6, + 0x99B1, 0xB9A4, 0x99B2, 0xE0E5, 0x99B3, 0xB9A3, 0x99B4, 0xB9A5, + 0x99B5, 0xE0E7, 0x99B9, 0xE4D4, 0x99BA, 0xE4D6, 0x99BB, 0xE4D5, + 0x99BD, 0xE4D8, 0x99C1, 0xBBE9, 0x99C2, 0xE4D7, 0x99C3, 0xE4D3, + 0x99C7, 0xE4D9, 0x99C9, 0xE8CC, 0x99CB, 0xE8CF, 0x99CC, 0xE8D1, + 0x99CD, 0xE8C7, 0x99CE, 0xE8CB, 0x99CF, 0xE8C8, 0x99D0, 0xBE6E, + 0x99D1, 0xBE71, 0x99D2, 0xBE73, 0x99D3, 0xE8C9, 0x99D4, 0xE8CA, + 0x99D5, 0xBE72, 0x99D6, 0xE8CD, 0x99D7, 0xE8D0, 0x99D8, 0xE8CE, + 0x99D9, 0xBE74, 0x99DB, 0xBE70, 0x99DC, 0xE8C6, 0x99DD, 0xBE6D, + 0x99DF, 0xBE6F, 0x99E2, 0xC063, 0x99E3, 0xEC66, 0x99E4, 0xEC64, + 0x99E5, 0xEC63, 0x99E7, 0xEC69, 0x99E9, 0xEC68, 0x99EA, 0xEC67, + 0x99EC, 0xEC62, 0x99ED, 0xC062, 0x99EE, 0xEC61, 0x99F0, 0xEC65, + 0x99F1, 0xC064, 0x99F4, 0xEF5A, 0x99F6, 0xEF5E, 0x99F7, 0xEF5B, + 0x99F8, 0xEF5D, 0x99F9, 0xEF5C, 0x99FA, 0xEF59, 0x99FB, 0xEF5F, + 0x99FC, 0xEF62, 0x99FD, 0xEF60, 0x99FE, 0xEF61, 0x99FF, 0xC240, + 0x9A01, 0xC1FE, 0x9A02, 0xEF58, 0x9A03, 0xEF63, 0x9A04, 0xF1B3, + 0x9A05, 0xF1B6, 0x9A06, 0xF1B8, 0x9A07, 0xF1B7, 0x9A09, 0xF1B1, + 0x9A0A, 0xF1B5, 0x9A0B, 0xF1B0, 0x9A0D, 0xF1B2, 0x9A0E, 0xC34D, + 0x9A0F, 0xF1AF, 0x9A11, 0xF1B4, 0x9A14, 0xF3C0, 0x9A15, 0xF3B5, + 0x9A16, 0xC445, 0x9A19, 0xC446, 0x9A1A, 0xF3B4, 0x9A1B, 0xF3B9, + 0x9A1C, 0xF3BF, 0x9A1D, 0xF3B7, 0x9A1E, 0xF3BE, 0x9A20, 0xF3BB, + 0x9A22, 0xF3BA, 0x9A23, 0xF3BD, 0x9A24, 0xF3B8, 0x9A25, 0xF3B6, + 0x9A27, 0xF3BC, 0x9A29, 0xF560, 0x9A2A, 0xF55E, 0x9A2B, 0xC4CA, + 0x9A2C, 0xF55D, 0x9A2D, 0xF563, 0x9A2E, 0xF561, 0x9A30, 0xC4CB, + 0x9A31, 0xF55C, 0x9A32, 0xF55A, 0x9A34, 0xF55B, 0x9A35, 0xC4CD, + 0x9A36, 0xF55F, 0x9A37, 0xC4CC, 0x9A38, 0xF562, 0x9A39, 0xF678, + 0x9A3A, 0xF67E, 0x9A3D, 0xF679, 0x9A3E, 0xC55B, 0x9A3F, 0xF6A1, + 0x9A40, 0xC55A, 0x9A41, 0xF67D, 0x9A42, 0xF67C, 0x9A43, 0xC559, + 0x9A44, 0xF67B, 0x9A45, 0xC558, 0x9A46, 0xF67A, 0x9A48, 0xF77D, + 0x9A49, 0xF7A1, 0x9A4A, 0xF77E, 0x9A4C, 0xF77B, 0x9A4D, 0xC5BB, + 0x9A4E, 0xF778, 0x9A4F, 0xF77C, 0x9A50, 0xF7A3, 0x9A52, 0xF7A2, + 0x9A53, 0xF779, 0x9A54, 0xF77A, 0x9A55, 0xC5BA, 0x9A56, 0xF852, + 0x9A57, 0xC5E7, 0x9A59, 0xF853, 0x9A5A, 0xC5E5, 0x9A5B, 0xC5E6, + 0x9A5E, 0xF8D3, 0x9A5F, 0xC64A, 0x9A60, 0xF976, 0x9A62, 0xC66A, + 0x9A64, 0xF9B3, 0x9A65, 0xC66B, 0x9A66, 0xF9B4, 0x9A67, 0xF9B5, + 0x9A68, 0xF9C3, 0x9A69, 0xF9C2, 0x9A6A, 0xC67A, 0x9A6B, 0xF9CD, + 0x9AA8, 0xB0A9, 0x9AAB, 0xE0E9, 0x9AAD, 0xE0E8, 0x9AAF, 0xBBEA, + 0x9AB0, 0xBBEB, 0x9AB1, 0xE4DA, 0x9AB3, 0xE8D2, 0x9AB4, 0xEC6C, + 0x9AB7, 0xBE75, 0x9AB8, 0xC065, 0x9AB9, 0xEC6A, 0x9ABB, 0xEC6D, + 0x9ABC, 0xC066, 0x9ABE, 0xEF64, 0x9ABF, 0xEC6B, 0x9AC0, 0xF1B9, + 0x9AC1, 0xC34E, 0x9AC2, 0xF3C1, 0x9AC6, 0xF566, 0x9AC7, 0xF564, + 0x9ACA, 0xF565, 0x9ACD, 0xF6A2, 0x9ACF, 0xC55C, 0x9AD0, 0xF7A4, + 0x9AD1, 0xC5EA, 0x9AD2, 0xC5BC, 0x9AD3, 0xC5E8, 0x9AD4, 0xC5E9, + 0x9AD5, 0xF8D4, 0x9AD6, 0xC662, 0x9AD8, 0xB0AA, 0x9ADC, 0xF1BA, + 0x9ADF, 0xD449, 0x9AE1, 0xB9A6, 0x9AE3, 0xE4DB, 0x9AE6, 0xBBEC, + 0x9AE7, 0xE4DC, 0x9AEB, 0xE8D4, 0x9AEC, 0xE8D3, 0x9AED, 0xC068, + 0x9AEE, 0xBE76, 0x9AEF, 0xBE77, 0x9AF1, 0xE8D7, 0x9AF2, 0xE8D6, + 0x9AF3, 0xE8D5, 0x9AF6, 0xEC6E, 0x9AF7, 0xEC71, 0x9AF9, 0xEC70, + 0x9AFA, 0xEC6F, 0x9AFB, 0xC067, 0x9AFC, 0xEF68, 0x9AFD, 0xEF66, + 0x9AFE, 0xEF65, 0x9B01, 0xEF67, 0x9B03, 0xC34F, 0x9B04, 0xF1BC, + 0x9B05, 0xF1BD, 0x9B06, 0xC350, 0x9B08, 0xF1BB, 0x9B0A, 0xF3C3, + 0x9B0B, 0xF3C2, 0x9B0C, 0xF3C5, 0x9B0D, 0xC447, 0x9B0E, 0xF3C4, + 0x9B10, 0xF567, 0x9B11, 0xF569, 0x9B12, 0xF568, 0x9B15, 0xF6A3, + 0x9B16, 0xF6A6, 0x9B17, 0xF6A4, 0x9B18, 0xF6A5, 0x9B19, 0xF7A5, + 0x9B1A, 0xC5BD, 0x9B1E, 0xF854, 0x9B1F, 0xF855, 0x9B20, 0xF856, + 0x9B22, 0xC64B, 0x9B23, 0xC663, 0x9B24, 0xF9B6, 0x9B25, 0xB0AB, + 0x9B27, 0xBE78, 0x9B28, 0xC069, 0x9B29, 0xF1BE, 0x9B2B, 0xF7A6, + 0x9B2E, 0xF9C4, 0x9B2F, 0xD44A, 0x9B31, 0xC67B, 0x9B32, 0xB0AC, + 0x9B33, 0xEC72, 0x9B35, 0xF1BF, 0x9B37, 0xF3C6, 0x9B3A, 0xF6A7, + 0x9B3B, 0xF7A7, 0x9B3C, 0xB0AD, 0x9B3E, 0xE4DD, 0x9B3F, 0xE4DE, + 0x9B41, 0xBBED, 0x9B42, 0xBBEE, 0x9B43, 0xE8D9, 0x9B44, 0xBE7A, + 0x9B45, 0xBE79, 0x9B46, 0xE8D8, 0x9B48, 0xEF69, 0x9B4A, 0xF1C0, + 0x9B4B, 0xF1C2, 0x9B4C, 0xF1C1, 0x9B4D, 0xC353, 0x9B4E, 0xC352, + 0x9B4F, 0xC351, 0x9B51, 0xC55E, 0x9B52, 0xF6A8, 0x9B54, 0xC55D, + 0x9B55, 0xF7A9, 0x9B56, 0xF7A8, 0x9B58, 0xC64C, 0x9B59, 0xF8D5, + 0x9B5A, 0xB3BD, 0x9B5B, 0xE0EA, 0x9B5F, 0xE4E1, 0x9B60, 0xE4DF, + 0x9B61, 0xE4E0, 0x9B64, 0xE8E2, 0x9B66, 0xE8DD, 0x9B67, 0xE8DA, + 0x9B68, 0xE8E1, 0x9B6C, 0xE8E3, 0x9B6F, 0xBE7C, 0x9B70, 0xE8E0, + 0x9B71, 0xE8DC, 0x9B74, 0xE8DB, 0x9B75, 0xE8DF, 0x9B76, 0xE8DE, + 0x9B77, 0xBE7B, 0x9B7A, 0xEC7D, 0x9B7B, 0xEC78, 0x9B7C, 0xEC76, + 0x9B7D, 0xECA1, 0x9B7E, 0xEC77, 0x9B80, 0xEC73, 0x9B82, 0xEC79, + 0x9B85, 0xEC74, 0x9B86, 0xEF72, 0x9B87, 0xEC75, 0x9B88, 0xECA2, + 0x9B90, 0xEC7C, 0x9B91, 0xC06A, 0x9B92, 0xEC7B, 0x9B93, 0xEC7A, + 0x9B95, 0xEC7E, 0x9B9A, 0xEF6A, 0x9B9B, 0xEF6D, 0x9B9E, 0xEF6C, + 0x9BA0, 0xEF74, 0x9BA1, 0xEF6F, 0x9BA2, 0xEF73, 0x9BA4, 0xEF71, + 0x9BA5, 0xEF70, 0x9BA6, 0xEF6E, 0x9BA8, 0xEF6B, 0x9BAA, 0xC243, + 0x9BAB, 0xC242, 0x9BAD, 0xC244, 0x9BAE, 0xC241, 0x9BAF, 0xEF75, + 0x9BB5, 0xF1C8, 0x9BB6, 0xF1CB, 0x9BB8, 0xF1C9, 0x9BB9, 0xF1CD, + 0x9BBD, 0xF1CE, 0x9BBF, 0xF1C6, 0x9BC0, 0xC358, 0x9BC1, 0xF1C7, + 0x9BC3, 0xF1C5, 0x9BC4, 0xF1CC, 0x9BC6, 0xF1C4, 0x9BC7, 0xF1C3, + 0x9BC8, 0xC357, 0x9BC9, 0xC355, 0x9BCA, 0xC354, 0x9BD3, 0xF1CA, + 0x9BD4, 0xF3CF, 0x9BD5, 0xF3D5, 0x9BD6, 0xC44A, 0x9BD7, 0xF3D0, + 0x9BD9, 0xF3D3, 0x9BDA, 0xF3D7, 0x9BDB, 0xC44B, 0x9BDC, 0xF3D2, + 0x9BDE, 0xF3CA, 0x9BE0, 0xF3C9, 0x9BE1, 0xF3D6, 0x9BE2, 0xF3CD, + 0x9BE4, 0xF3CB, 0x9BE5, 0xF3D4, 0x9BE6, 0xF3CC, 0x9BE7, 0xC449, + 0x9BE8, 0xC448, 0x9BEA, 0xF3C7, 0x9BEB, 0xF3C8, 0x9BEC, 0xF3D1, + 0x9BF0, 0xF3CE, 0x9BF7, 0xF56C, 0x9BF8, 0xF56F, 0x9BFD, 0xC356, + 0x9C05, 0xF56D, 0x9C06, 0xF573, 0x9C07, 0xF571, 0x9C08, 0xF56B, + 0x9C09, 0xF576, 0x9C0B, 0xF56A, 0x9C0D, 0xC4CF, 0x9C0E, 0xF572, + 0x9C12, 0xF56E, 0x9C13, 0xC4CE, 0x9C14, 0xF575, 0x9C17, 0xF574, + 0x9C1C, 0xF6AB, 0x9C1D, 0xF6AA, 0x9C21, 0xF6B1, 0x9C23, 0xF6AD, + 0x9C24, 0xF6B0, 0x9C25, 0xC560, 0x9C28, 0xF6AE, 0x9C29, 0xF6AF, + 0x9C2B, 0xF6A9, 0x9C2C, 0xF6AC, 0x9C2D, 0xC55F, 0x9C31, 0xC5BF, + 0x9C32, 0xF7B4, 0x9C33, 0xF7AF, 0x9C34, 0xF7B3, 0x9C36, 0xF7B6, + 0x9C37, 0xF7B2, 0x9C39, 0xF7AE, 0x9C3B, 0xC5C1, 0x9C3C, 0xF7B1, + 0x9C3D, 0xF7B5, 0x9C3E, 0xC5C0, 0x9C3F, 0xF7AC, 0x9C40, 0xF570, + 0x9C41, 0xF7B0, 0x9C44, 0xF7AD, 0x9C46, 0xF7AA, 0x9C48, 0xF7AB, + 0x9C49, 0xC5BE, 0x9C4A, 0xF85A, 0x9C4B, 0xF85C, 0x9C4C, 0xF85F, + 0x9C4D, 0xF85B, 0x9C4E, 0xF860, 0x9C50, 0xF859, 0x9C52, 0xF857, + 0x9C54, 0xC5EB, 0x9C55, 0xF85D, 0x9C56, 0xC5ED, 0x9C57, 0xC5EC, + 0x9C58, 0xF858, 0x9C59, 0xF85E, 0x9C5E, 0xF8DA, 0x9C5F, 0xC64D, + 0x9C60, 0xF8DB, 0x9C62, 0xF8D9, 0x9C63, 0xF8D6, 0x9C66, 0xF8D8, + 0x9C67, 0xF8D7, 0x9C68, 0xF95A, 0x9C6D, 0xF95C, 0x9C6E, 0xF95B, + 0x9C71, 0xF979, 0x9C73, 0xF978, 0x9C74, 0xF977, 0x9C75, 0xF97A, + 0x9C77, 0xC673, 0x9C78, 0xC674, 0x9C79, 0xF9CA, 0x9C7A, 0xF9CE, + 0x9CE5, 0xB3BE, 0x9CE6, 0xDCAF, 0x9CE7, 0xE0ED, 0x9CE9, 0xB9A7, + 0x9CEA, 0xE0EB, 0x9CED, 0xE0EC, 0x9CF1, 0xE4E2, 0x9CF2, 0xE4E3, + 0x9CF3, 0xBBF1, 0x9CF4, 0xBBEF, 0x9CF5, 0xE4E4, 0x9CF6, 0xBBF0, + 0x9CF7, 0xE8E8, 0x9CF9, 0xE8EB, 0x9CFA, 0xE8E5, 0x9CFB, 0xE8EC, + 0x9CFC, 0xE8E4, 0x9CFD, 0xE8E6, 0x9CFF, 0xE8E7, 0x9D00, 0xE8EA, + 0x9D03, 0xBEA1, 0x9D04, 0xE8EF, 0x9D05, 0xE8EE, 0x9D06, 0xBE7D, + 0x9D07, 0xE8E9, 0x9D08, 0xE8ED, 0x9D09, 0xBE7E, 0x9D10, 0xECAC, + 0x9D12, 0xC06F, 0x9D14, 0xECA7, 0x9D15, 0xC06B, 0x9D17, 0xECA4, + 0x9D18, 0xECAA, 0x9D19, 0xECAD, 0x9D1B, 0xC070, 0x9D1D, 0xECA9, + 0x9D1E, 0xECA6, 0x9D1F, 0xECAE, 0x9D20, 0xECA5, 0x9D22, 0xECAB, + 0x9D23, 0xC06C, 0x9D25, 0xECA3, 0x9D26, 0xC06D, 0x9D28, 0xC06E, + 0x9D29, 0xECA8, 0x9D2D, 0xEFA9, 0x9D2E, 0xEF7A, 0x9D2F, 0xEF7B, + 0x9D30, 0xEF7E, 0x9D31, 0xEF7C, 0x9D33, 0xEF76, 0x9D36, 0xEF79, + 0x9D37, 0xEFA5, 0x9D38, 0xEF7D, 0x9D3B, 0xC245, 0x9D3D, 0xEFA7, + 0x9D3E, 0xEFA4, 0x9D3F, 0xC246, 0x9D40, 0xEFA6, 0x9D41, 0xEF77, + 0x9D42, 0xEFA2, 0x9D43, 0xEFA3, 0x9D45, 0xEFA1, 0x9D4A, 0xF1D2, + 0x9D4B, 0xF1D4, 0x9D4C, 0xF1D7, 0x9D4F, 0xF1D1, 0x9D51, 0xC359, + 0x9D52, 0xF1D9, 0x9D53, 0xF1D0, 0x9D54, 0xF1DA, 0x9D56, 0xF1D6, + 0x9D57, 0xF1D8, 0x9D58, 0xF1DC, 0x9D59, 0xF1D5, 0x9D5A, 0xF1DD, + 0x9D5B, 0xF1D3, 0x9D5C, 0xF1CF, 0x9D5D, 0xC35A, 0x9D5F, 0xF1DB, + 0x9D60, 0xC35B, 0x9D61, 0xC44D, 0x9D67, 0xEF78, 0x9D68, 0xF3F1, + 0x9D69, 0xF3E8, 0x9D6A, 0xC44F, 0x9D6B, 0xF3E4, 0x9D6C, 0xC450, + 0x9D6F, 0xF3ED, 0x9D70, 0xF3E7, 0x9D71, 0xF3DD, 0x9D72, 0xC44E, + 0x9D73, 0xF3EA, 0x9D74, 0xF3E5, 0x9D75, 0xF3E6, 0x9D77, 0xF3D8, + 0x9D78, 0xF3DF, 0x9D79, 0xF3EE, 0x9D7B, 0xF3EB, 0x9D7D, 0xF3E3, + 0x9D7F, 0xF3EF, 0x9D80, 0xF3DE, 0x9D81, 0xF3D9, 0x9D82, 0xF3EC, + 0x9D84, 0xF3DB, 0x9D85, 0xF3E9, 0x9D86, 0xF3E0, 0x9D87, 0xF3F0, + 0x9D88, 0xF3DC, 0x9D89, 0xC44C, 0x9D8A, 0xF3DA, 0x9D8B, 0xF3E1, + 0x9D8C, 0xF3E2, 0x9D90, 0xF57D, 0x9D92, 0xF57B, 0x9D94, 0xF5A2, + 0x9D96, 0xF5AE, 0x9D97, 0xF5A5, 0x9D98, 0xF57C, 0x9D99, 0xF578, + 0x9D9A, 0xF5A7, 0x9D9B, 0xF57E, 0x9D9C, 0xF5A3, 0x9D9D, 0xF57A, + 0x9D9E, 0xF5AA, 0x9D9F, 0xF577, 0x9DA0, 0xF5A1, 0x9DA1, 0xF5A6, + 0x9DA2, 0xF5A8, 0x9DA3, 0xF5AB, 0x9DA4, 0xF579, 0x9DA6, 0xF5AF, + 0x9DA7, 0xF5B0, 0x9DA8, 0xF5A9, 0x9DA9, 0xF5AD, 0x9DAA, 0xF5A4, + 0x9DAC, 0xF6C1, 0x9DAD, 0xF6C4, 0x9DAF, 0xC561, 0x9DB1, 0xF6C3, + 0x9DB2, 0xF6C8, 0x9DB3, 0xF6C6, 0x9DB4, 0xC562, 0x9DB5, 0xF6BD, + 0x9DB6, 0xF6B3, 0x9DB7, 0xF6B2, 0x9DB8, 0xC564, 0x9DB9, 0xF6BF, + 0x9DBA, 0xF6C0, 0x9DBB, 0xF6BC, 0x9DBC, 0xF6B4, 0x9DBE, 0xF6B9, + 0x9DBF, 0xF5AC, 0x9DC1, 0xF6B5, 0x9DC2, 0xC563, 0x9DC3, 0xF6BB, + 0x9DC5, 0xF6BA, 0x9DC7, 0xF6B6, 0x9DC8, 0xF6C2, 0x9DCA, 0xF6B7, + 0x9DCB, 0xF7BB, 0x9DCC, 0xF6C5, 0x9DCD, 0xF6C7, 0x9DCE, 0xF6BE, + 0x9DCF, 0xF6B8, 0x9DD0, 0xF7BC, 0x9DD1, 0xF7BE, 0x9DD2, 0xF7B8, + 0x9DD3, 0xC5C2, 0x9DD5, 0xF7C5, 0x9DD6, 0xF7C3, 0x9DD7, 0xC5C3, + 0x9DD8, 0xF7C2, 0x9DD9, 0xF7C1, 0x9DDA, 0xF7BA, 0x9DDB, 0xF7B7, + 0x9DDC, 0xF7BD, 0x9DDD, 0xF7C6, 0x9DDE, 0xF7B9, 0x9DDF, 0xF7BF, + 0x9DE1, 0xF869, 0x9DE2, 0xF86E, 0x9DE3, 0xF864, 0x9DE4, 0xF867, + 0x9DE5, 0xC5EE, 0x9DE6, 0xF86B, 0x9DE8, 0xF872, 0x9DE9, 0xF7C0, + 0x9DEB, 0xF865, 0x9DEC, 0xF86F, 0x9DED, 0xF873, 0x9DEE, 0xF86A, + 0x9DEF, 0xF863, 0x9DF0, 0xF86D, 0x9DF2, 0xF86C, 0x9DF3, 0xF871, + 0x9DF4, 0xF870, 0x9DF5, 0xF7C4, 0x9DF6, 0xF868, 0x9DF7, 0xF862, + 0x9DF8, 0xF866, 0x9DF9, 0xC64E, 0x9DFA, 0xC64F, 0x9DFB, 0xF861, + 0x9DFD, 0xF8E6, 0x9DFE, 0xF8DD, 0x9DFF, 0xF8E5, 0x9E00, 0xF8E2, + 0x9E01, 0xF8E3, 0x9E02, 0xF8DC, 0x9E03, 0xF8DF, 0x9E04, 0xF8E7, + 0x9E05, 0xF8E1, 0x9E06, 0xF8E0, 0x9E07, 0xF8DE, 0x9E09, 0xF8E4, + 0x9E0B, 0xF95D, 0x9E0D, 0xF95E, 0x9E0F, 0xF960, 0x9E10, 0xF95F, + 0x9E11, 0xF962, 0x9E12, 0xF961, 0x9E13, 0xF97C, 0x9E14, 0xF97B, + 0x9E15, 0xF9B7, 0x9E17, 0xF9B8, 0x9E19, 0xF9C5, 0x9E1A, 0xC678, + 0x9E1B, 0xC67C, 0x9E1D, 0xF9CF, 0x9E1E, 0xC67D, 0x9E75, 0xB3BF, + 0x9E79, 0xC4D0, 0x9E7A, 0xF6C9, 0x9E7C, 0xC650, 0x9E7D, 0xC651, + 0x9E7F, 0xB3C0, 0x9E80, 0xE0EE, 0x9E82, 0xB9A8, 0x9E83, 0xE8F0, + 0x9E86, 0xECB0, 0x9E87, 0xECB1, 0x9E88, 0xECAF, 0x9E89, 0xEFAB, + 0x9E8A, 0xEFAA, 0x9E8B, 0xC247, 0x9E8C, 0xF1DF, 0x9E8D, 0xEFAC, + 0x9E8E, 0xF1DE, 0x9E91, 0xF3F3, 0x9E92, 0xC451, 0x9E93, 0xC453, + 0x9E94, 0xF3F2, 0x9E97, 0xC452, 0x9E99, 0xF5B1, 0x9E9A, 0xF5B3, + 0x9E9B, 0xF5B2, 0x9E9C, 0xF6CA, 0x9E9D, 0xC565, 0x9E9F, 0xC5EF, + 0x9EA0, 0xF8E8, 0x9EA1, 0xF963, 0x9EA4, 0xF9D2, 0x9EA5, 0xB3C1, + 0x9EA7, 0xE4E5, 0x9EA9, 0xBEA2, 0x9EAD, 0xECB3, 0x9EAE, 0xECB2, + 0x9EB0, 0xEFAD, 0x9EB4, 0xC454, 0x9EB5, 0xC4D1, 0x9EB6, 0xF7C7, + 0x9EB7, 0xF9CB, 0x9EBB, 0xB3C2, 0x9EBC, 0xBBF2, 0x9EBE, 0xBEA3, + 0x9EC0, 0xF3F4, 0x9EC2, 0xF874, 0x9EC3, 0xB6C0, 0x9EC8, 0xEFAE, + 0x9ECC, 0xC664, 0x9ECD, 0xB6C1, 0x9ECE, 0xBEA4, 0x9ECF, 0xC248, + 0x9ED0, 0xF875, 0x9ED1, 0xB6C2, 0x9ED3, 0xE8F1, 0x9ED4, 0xC072, + 0x9ED5, 0xECB4, 0x9ED6, 0xECB5, 0x9ED8, 0xC071, 0x9EDA, 0xEFAF, + 0x9EDB, 0xC24C, 0x9EDC, 0xC24A, 0x9EDD, 0xC24B, 0x9EDE, 0xC249, + 0x9EDF, 0xF1E0, 0x9EE0, 0xC35C, 0x9EE4, 0xF5B5, 0x9EE5, 0xF5B4, + 0x9EE6, 0xF5B7, 0x9EE7, 0xF5B6, 0x9EE8, 0xC4D2, 0x9EEB, 0xF6CB, + 0x9EED, 0xF6CD, 0x9EEE, 0xF6CC, 0x9EEF, 0xC566, 0x9EF0, 0xF7C8, + 0x9EF2, 0xF876, 0x9EF3, 0xF877, 0x9EF4, 0xC5F0, 0x9EF5, 0xF964, + 0x9EF6, 0xF97D, 0x9EF7, 0xC675, 0x9EF9, 0xDCB0, 0x9EFA, 0xECB6, + 0x9EFB, 0xEFB0, 0x9EFC, 0xF3F5, 0x9EFD, 0xE0EF, 0x9EFF, 0xEFB1, + 0x9F00, 0xF1E2, 0x9F01, 0xF1E1, 0x9F06, 0xF878, 0x9F07, 0xC652, + 0x9F09, 0xF965, 0x9F0A, 0xF97E, 0x9F0E, 0xB9A9, 0x9F0F, 0xE8F2, + 0x9F10, 0xE8F3, 0x9F12, 0xECB7, 0x9F13, 0xB9AA, 0x9F15, 0xC35D, + 0x9F16, 0xF1E3, 0x9F18, 0xF6CF, 0x9F19, 0xC567, 0x9F1A, 0xF6D0, + 0x9F1B, 0xF6CE, 0x9F1C, 0xF879, 0x9F1E, 0xF8E9, 0x9F20, 0xB9AB, + 0x9F22, 0xEFB4, 0x9F23, 0xEFB3, 0x9F24, 0xEFB2, 0x9F25, 0xF1E4, + 0x9F28, 0xF1E8, 0x9F29, 0xF1E7, 0x9F2A, 0xF1E6, 0x9F2B, 0xF1E5, + 0x9F2C, 0xC35E, 0x9F2D, 0xF3F6, 0x9F2E, 0xF5B9, 0x9F2F, 0xC4D3, + 0x9F30, 0xF5B8, 0x9F31, 0xF6D1, 0x9F32, 0xF7CB, 0x9F33, 0xF7CA, + 0x9F34, 0xC5C4, 0x9F35, 0xF7C9, 0x9F36, 0xF87C, 0x9F37, 0xF87B, + 0x9F38, 0xF87A, 0x9F3B, 0xBBF3, 0x9F3D, 0xECB8, 0x9F3E, 0xC24D, + 0x9F40, 0xF3F7, 0x9F41, 0xF3F8, 0x9F42, 0xF7CC, 0x9F43, 0xF87D, + 0x9F46, 0xF8EA, 0x9F47, 0xF966, 0x9F48, 0xF9B9, 0x9F49, 0xF9D4, + 0x9F4A, 0xBBF4, 0x9F4B, 0xC24E, 0x9F4C, 0xF1E9, 0x9F4D, 0xF3F9, + 0x9F4E, 0xF6D2, 0x9F4F, 0xF87E, 0x9F52, 0xBEA6, 0x9F54, 0xEFB5, + 0x9F55, 0xF1EA, 0x9F56, 0xF3FA, 0x9F57, 0xF3FB, 0x9F58, 0xF3FC, + 0x9F59, 0xF5BE, 0x9F5B, 0xF5BA, 0x9F5C, 0xC568, 0x9F5D, 0xF5BD, + 0x9F5E, 0xF5BC, 0x9F5F, 0xC4D4, 0x9F60, 0xF5BB, 0x9F61, 0xC4D6, + 0x9F63, 0xC4D5, 0x9F64, 0xF6D4, 0x9F65, 0xF6D3, 0x9F66, 0xC569, + 0x9F67, 0xC56A, 0x9F6A, 0xC5C6, 0x9F6B, 0xF7CD, 0x9F6C, 0xC5C5, + 0x9F6E, 0xF8A3, 0x9F6F, 0xF8A4, 0x9F70, 0xF8A2, 0x9F71, 0xF8A1, + 0x9F72, 0xC654, 0x9F74, 0xF8EB, 0x9F75, 0xF8EC, 0x9F76, 0xF8ED, + 0x9F77, 0xC653, 0x9F78, 0xF967, 0x9F79, 0xF96A, 0x9F7A, 0xF969, + 0x9F7B, 0xF968, 0x9F7E, 0xF9D3, 0x9F8D, 0xC073, 0x9F90, 0xC365, + 0x9F91, 0xF5BF, 0x9F92, 0xF6D5, 0x9F94, 0xC5C7, 0x9F95, 0xF7CE, + 0x9F98, 0xF9D5, 0x9F9C, 0xC074, 0x9FA0, 0xEFB6, 0x9FA2, 0xF7CF, + 0x9FA4, 0xF9A1, 0xFA0C, 0xC94A, 0xFA0D, 0xDDFC, 0xFE30, 0xA14A, + 0xFE31, 0xA157, 0xFE33, 0xA159, 0xFE34, 0xA15B, 0xFE35, 0xA15F, + 0xFE36, 0xA160, 0xFE37, 0xA163, 0xFE38, 0xA164, 0xFE39, 0xA167, + 0xFE3A, 0xA168, 0xFE3B, 0xA16B, 0xFE3C, 0xA16C, 0xFE3D, 0xA16F, + 0xFE3E, 0xA170, 0xFE3F, 0xA173, 0xFE40, 0xA174, 0xFE41, 0xA177, + 0xFE42, 0xA178, 0xFE43, 0xA17B, 0xFE44, 0xA17C, 0xFE49, 0xA1C6, + 0xFE4A, 0xA1C7, 0xFE4B, 0xA1CA, 0xFE4C, 0xA1CB, 0xFE4D, 0xA1C8, + 0xFE4E, 0xA1C9, 0xFE4F, 0xA15C, 0xFE50, 0xA14D, 0xFE51, 0xA14E, + 0xFE52, 0xA14F, 0xFE54, 0xA151, 0xFE55, 0xA152, 0xFE56, 0xA153, + 0xFE57, 0xA154, 0xFE59, 0xA17D, 0xFE5A, 0xA17E, 0xFE5B, 0xA1A1, + 0xFE5C, 0xA1A2, 0xFE5D, 0xA1A3, 0xFE5E, 0xA1A4, 0xFE5F, 0xA1CC, + 0xFE60, 0xA1CD, 0xFE61, 0xA1CE, 0xFE62, 0xA1DE, 0xFE63, 0xA1DF, + 0xFE64, 0xA1E0, 0xFE65, 0xA1E1, 0xFE66, 0xA1E2, 0xFE68, 0xA242, + 0xFE69, 0xA24C, 0xFE6A, 0xA24D, 0xFE6B, 0xA24E, 0xFF01, 0xA149, + 0xFF03, 0xA1AD, 0xFF04, 0xA243, 0xFF05, 0xA248, 0xFF06, 0xA1AE, + 0xFF08, 0xA15D, 0xFF09, 0xA15E, 0xFF0A, 0xA1AF, 0xFF0B, 0xA1CF, + 0xFF0C, 0xA141, 0xFF0D, 0xA1D0, 0xFF0E, 0xA144, 0xFF0F, 0xA1FE, + 0xFF10, 0xA2AF, 0xFF11, 0xA2B0, 0xFF12, 0xA2B1, 0xFF13, 0xA2B2, + 0xFF14, 0xA2B3, 0xFF15, 0xA2B4, 0xFF16, 0xA2B5, 0xFF17, 0xA2B6, + 0xFF18, 0xA2B7, 0xFF19, 0xA2B8, 0xFF1A, 0xA147, 0xFF1B, 0xA146, + 0xFF1C, 0xA1D5, 0xFF1D, 0xA1D7, 0xFF1E, 0xA1D6, 0xFF1F, 0xA148, + 0xFF20, 0xA249, 0xFF21, 0xA2CF, 0xFF22, 0xA2D0, 0xFF23, 0xA2D1, + 0xFF24, 0xA2D2, 0xFF25, 0xA2D3, 0xFF26, 0xA2D4, 0xFF27, 0xA2D5, + 0xFF28, 0xA2D6, 0xFF29, 0xA2D7, 0xFF2A, 0xA2D8, 0xFF2B, 0xA2D9, + 0xFF2C, 0xA2DA, 0xFF2D, 0xA2DB, 0xFF2E, 0xA2DC, 0xFF2F, 0xA2DD, + 0xFF30, 0xA2DE, 0xFF31, 0xA2DF, 0xFF32, 0xA2E0, 0xFF33, 0xA2E1, + 0xFF34, 0xA2E2, 0xFF35, 0xA2E3, 0xFF36, 0xA2E4, 0xFF37, 0xA2E5, + 0xFF38, 0xA2E6, 0xFF39, 0xA2E7, 0xFF3A, 0xA2E8, 0xFF3C, 0xA240, + 0xFF3F, 0xA1C4, 0xFF41, 0xA2E9, 0xFF42, 0xA2EA, 0xFF43, 0xA2EB, + 0xFF44, 0xA2EC, 0xFF45, 0xA2ED, 0xFF46, 0xA2EE, 0xFF47, 0xA2EF, + 0xFF48, 0xA2F0, 0xFF49, 0xA2F1, 0xFF4A, 0xA2F2, 0xFF4B, 0xA2F3, + 0xFF4C, 0xA2F4, 0xFF4D, 0xA2F5, 0xFF4E, 0xA2F6, 0xFF4F, 0xA2F7, + 0xFF50, 0xA2F8, 0xFF51, 0xA2F9, 0xFF52, 0xA2FA, 0xFF53, 0xA2FB, + 0xFF54, 0xA2FC, 0xFF55, 0xA2FD, 0xFF56, 0xA2FE, 0xFF57, 0xA340, + 0xFF58, 0xA341, 0xFF59, 0xA342, 0xFF5A, 0xA343, 0xFF5B, 0xA161, + 0xFF5C, 0xA155, 0xFF5D, 0xA162, 0xFF5E, 0xA1E3, 0xFFE0, 0xA246, + 0xFFE1, 0xA247, 0xFFE3, 0xA1C3, 0xFFE5, 0xA244, 0, 0 +}; + +static +const WCHAR oem2uni[] = { +/* OEM - Unicode, OEM - Unicode, OEM - Unicode, OEM - Unicode */ + 0xA140, 0x3000, 0xA141, 0xFF0C, 0xA142, 0x3001, 0xA143, 0x3002, + 0xA144, 0xFF0E, 0xA145, 0x2027, 0xA146, 0xFF1B, 0xA147, 0xFF1A, + 0xA148, 0xFF1F, 0xA149, 0xFF01, 0xA14A, 0xFE30, 0xA14B, 0x2026, + 0xA14C, 0x2025, 0xA14D, 0xFE50, 0xA14E, 0xFE51, 0xA14F, 0xFE52, + 0xA150, 0x00B7, 0xA151, 0xFE54, 0xA152, 0xFE55, 0xA153, 0xFE56, + 0xA154, 0xFE57, 0xA155, 0xFF5C, 0xA156, 0x2013, 0xA157, 0xFE31, + 0xA158, 0x2014, 0xA159, 0xFE33, 0xA15A, 0x2574, 0xA15B, 0xFE34, + 0xA15C, 0xFE4F, 0xA15D, 0xFF08, 0xA15E, 0xFF09, 0xA15F, 0xFE35, + 0xA160, 0xFE36, 0xA161, 0xFF5B, 0xA162, 0xFF5D, 0xA163, 0xFE37, + 0xA164, 0xFE38, 0xA165, 0x3014, 0xA166, 0x3015, 0xA167, 0xFE39, + 0xA168, 0xFE3A, 0xA169, 0x3010, 0xA16A, 0x3011, 0xA16B, 0xFE3B, + 0xA16C, 0xFE3C, 0xA16D, 0x300A, 0xA16E, 0x300B, 0xA16F, 0xFE3D, + 0xA170, 0xFE3E, 0xA171, 0x3008, 0xA172, 0x3009, 0xA173, 0xFE3F, + 0xA174, 0xFE40, 0xA175, 0x300C, 0xA176, 0x300D, 0xA177, 0xFE41, + 0xA178, 0xFE42, 0xA179, 0x300E, 0xA17A, 0x300F, 0xA17B, 0xFE43, + 0xA17C, 0xFE44, 0xA17D, 0xFE59, 0xA17E, 0xFE5A, 0xA1A1, 0xFE5B, + 0xA1A2, 0xFE5C, 0xA1A3, 0xFE5D, 0xA1A4, 0xFE5E, 0xA1A5, 0x2018, + 0xA1A6, 0x2019, 0xA1A7, 0x201C, 0xA1A8, 0x201D, 0xA1A9, 0x301D, + 0xA1AA, 0x301E, 0xA1AB, 0x2035, 0xA1AC, 0x2032, 0xA1AD, 0xFF03, + 0xA1AE, 0xFF06, 0xA1AF, 0xFF0A, 0xA1B0, 0x203B, 0xA1B1, 0x00A7, + 0xA1B2, 0x3003, 0xA1B3, 0x25CB, 0xA1B4, 0x25CF, 0xA1B5, 0x25B3, + 0xA1B6, 0x25B2, 0xA1B7, 0x25CE, 0xA1B8, 0x2606, 0xA1B9, 0x2605, + 0xA1BA, 0x25C7, 0xA1BB, 0x25C6, 0xA1BC, 0x25A1, 0xA1BD, 0x25A0, + 0xA1BE, 0x25BD, 0xA1BF, 0x25BC, 0xA1C0, 0x32A3, 0xA1C1, 0x2105, + 0xA1C2, 0x00AF, 0xA1C3, 0xFFE3, 0xA1C4, 0xFF3F, 0xA1C5, 0x02CD, + 0xA1C6, 0xFE49, 0xA1C7, 0xFE4A, 0xA1C8, 0xFE4D, 0xA1C9, 0xFE4E, + 0xA1CA, 0xFE4B, 0xA1CB, 0xFE4C, 0xA1CC, 0xFE5F, 0xA1CD, 0xFE60, + 0xA1CE, 0xFE61, 0xA1CF, 0xFF0B, 0xA1D0, 0xFF0D, 0xA1D1, 0x00D7, + 0xA1D2, 0x00F7, 0xA1D3, 0x00B1, 0xA1D4, 0x221A, 0xA1D5, 0xFF1C, + 0xA1D6, 0xFF1E, 0xA1D7, 0xFF1D, 0xA1D8, 0x2266, 0xA1D9, 0x2267, + 0xA1DA, 0x2260, 0xA1DB, 0x221E, 0xA1DC, 0x2252, 0xA1DD, 0x2261, + 0xA1DE, 0xFE62, 0xA1DF, 0xFE63, 0xA1E0, 0xFE64, 0xA1E1, 0xFE65, + 0xA1E2, 0xFE66, 0xA1E3, 0xFF5E, 0xA1E4, 0x2229, 0xA1E5, 0x222A, + 0xA1E6, 0x22A5, 0xA1E7, 0x2220, 0xA1E8, 0x221F, 0xA1E9, 0x22BF, + 0xA1EA, 0x33D2, 0xA1EB, 0x33D1, 0xA1EC, 0x222B, 0xA1ED, 0x222E, + 0xA1EE, 0x2235, 0xA1EF, 0x2234, 0xA1F0, 0x2640, 0xA1F1, 0x2642, + 0xA1F2, 0x2295, 0xA1F3, 0x2299, 0xA1F4, 0x2191, 0xA1F5, 0x2193, + 0xA1F6, 0x2190, 0xA1F7, 0x2192, 0xA1F8, 0x2196, 0xA1F9, 0x2197, + 0xA1FA, 0x2199, 0xA1FB, 0x2198, 0xA1FC, 0x2225, 0xA1FD, 0x2223, + 0xA1FE, 0xFF0F, 0xA240, 0xFF3C, 0xA241, 0x2215, 0xA242, 0xFE68, + 0xA243, 0xFF04, 0xA244, 0xFFE5, 0xA245, 0x3012, 0xA246, 0xFFE0, + 0xA247, 0xFFE1, 0xA248, 0xFF05, 0xA249, 0xFF20, 0xA24A, 0x2103, + 0xA24B, 0x2109, 0xA24C, 0xFE69, 0xA24D, 0xFE6A, 0xA24E, 0xFE6B, + 0xA24F, 0x33D5, 0xA250, 0x339C, 0xA251, 0x339D, 0xA252, 0x339E, + 0xA253, 0x33CE, 0xA254, 0x33A1, 0xA255, 0x338E, 0xA256, 0x338F, + 0xA257, 0x33C4, 0xA258, 0x00B0, 0xA259, 0x5159, 0xA25A, 0x515B, + 0xA25B, 0x515E, 0xA25C, 0x515D, 0xA25D, 0x5161, 0xA25E, 0x5163, + 0xA25F, 0x55E7, 0xA260, 0x74E9, 0xA261, 0x7CCE, 0xA262, 0x2581, + 0xA263, 0x2582, 0xA264, 0x2583, 0xA265, 0x2584, 0xA266, 0x2585, + 0xA267, 0x2586, 0xA268, 0x2587, 0xA269, 0x2588, 0xA26A, 0x258F, + 0xA26B, 0x258E, 0xA26C, 0x258D, 0xA26D, 0x258C, 0xA26E, 0x258B, + 0xA26F, 0x258A, 0xA270, 0x2589, 0xA271, 0x253C, 0xA272, 0x2534, + 0xA273, 0x252C, 0xA274, 0x2524, 0xA275, 0x251C, 0xA276, 0x2594, + 0xA277, 0x2500, 0xA278, 0x2502, 0xA279, 0x2595, 0xA27A, 0x250C, + 0xA27B, 0x2510, 0xA27C, 0x2514, 0xA27D, 0x2518, 0xA27E, 0x256D, + 0xA2A1, 0x256E, 0xA2A2, 0x2570, 0xA2A3, 0x256F, 0xA2A4, 0x2550, + 0xA2A5, 0x255E, 0xA2A6, 0x256A, 0xA2A7, 0x2561, 0xA2A8, 0x25E2, + 0xA2A9, 0x25E3, 0xA2AA, 0x25E5, 0xA2AB, 0x25E4, 0xA2AC, 0x2571, + 0xA2AD, 0x2572, 0xA2AE, 0x2573, 0xA2AF, 0xFF10, 0xA2B0, 0xFF11, + 0xA2B1, 0xFF12, 0xA2B2, 0xFF13, 0xA2B3, 0xFF14, 0xA2B4, 0xFF15, + 0xA2B5, 0xFF16, 0xA2B6, 0xFF17, 0xA2B7, 0xFF18, 0xA2B8, 0xFF19, + 0xA2B9, 0x2160, 0xA2BA, 0x2161, 0xA2BB, 0x2162, 0xA2BC, 0x2163, + 0xA2BD, 0x2164, 0xA2BE, 0x2165, 0xA2BF, 0x2166, 0xA2C0, 0x2167, + 0xA2C1, 0x2168, 0xA2C2, 0x2169, 0xA2C3, 0x3021, 0xA2C4, 0x3022, + 0xA2C5, 0x3023, 0xA2C6, 0x3024, 0xA2C7, 0x3025, 0xA2C8, 0x3026, + 0xA2C9, 0x3027, 0xA2CA, 0x3028, 0xA2CB, 0x3029, 0xA2CC, 0x5341, + 0xA2CD, 0x5344, 0xA2CE, 0x5345, 0xA2CF, 0xFF21, 0xA2D0, 0xFF22, + 0xA2D1, 0xFF23, 0xA2D2, 0xFF24, 0xA2D3, 0xFF25, 0xA2D4, 0xFF26, + 0xA2D5, 0xFF27, 0xA2D6, 0xFF28, 0xA2D7, 0xFF29, 0xA2D8, 0xFF2A, + 0xA2D9, 0xFF2B, 0xA2DA, 0xFF2C, 0xA2DB, 0xFF2D, 0xA2DC, 0xFF2E, + 0xA2DD, 0xFF2F, 0xA2DE, 0xFF30, 0xA2DF, 0xFF31, 0xA2E0, 0xFF32, + 0xA2E1, 0xFF33, 0xA2E2, 0xFF34, 0xA2E3, 0xFF35, 0xA2E4, 0xFF36, + 0xA2E5, 0xFF37, 0xA2E6, 0xFF38, 0xA2E7, 0xFF39, 0xA2E8, 0xFF3A, + 0xA2E9, 0xFF41, 0xA2EA, 0xFF42, 0xA2EB, 0xFF43, 0xA2EC, 0xFF44, + 0xA2ED, 0xFF45, 0xA2EE, 0xFF46, 0xA2EF, 0xFF47, 0xA2F0, 0xFF48, + 0xA2F1, 0xFF49, 0xA2F2, 0xFF4A, 0xA2F3, 0xFF4B, 0xA2F4, 0xFF4C, + 0xA2F5, 0xFF4D, 0xA2F6, 0xFF4E, 0xA2F7, 0xFF4F, 0xA2F8, 0xFF50, + 0xA2F9, 0xFF51, 0xA2FA, 0xFF52, 0xA2FB, 0xFF53, 0xA2FC, 0xFF54, + 0xA2FD, 0xFF55, 0xA2FE, 0xFF56, 0xA340, 0xFF57, 0xA341, 0xFF58, + 0xA342, 0xFF59, 0xA343, 0xFF5A, 0xA344, 0x0391, 0xA345, 0x0392, + 0xA346, 0x0393, 0xA347, 0x0394, 0xA348, 0x0395, 0xA349, 0x0396, + 0xA34A, 0x0397, 0xA34B, 0x0398, 0xA34C, 0x0399, 0xA34D, 0x039A, + 0xA34E, 0x039B, 0xA34F, 0x039C, 0xA350, 0x039D, 0xA351, 0x039E, + 0xA352, 0x039F, 0xA353, 0x03A0, 0xA354, 0x03A1, 0xA355, 0x03A3, + 0xA356, 0x03A4, 0xA357, 0x03A5, 0xA358, 0x03A6, 0xA359, 0x03A7, + 0xA35A, 0x03A8, 0xA35B, 0x03A9, 0xA35C, 0x03B1, 0xA35D, 0x03B2, + 0xA35E, 0x03B3, 0xA35F, 0x03B4, 0xA360, 0x03B5, 0xA361, 0x03B6, + 0xA362, 0x03B7, 0xA363, 0x03B8, 0xA364, 0x03B9, 0xA365, 0x03BA, + 0xA366, 0x03BB, 0xA367, 0x03BC, 0xA368, 0x03BD, 0xA369, 0x03BE, + 0xA36A, 0x03BF, 0xA36B, 0x03C0, 0xA36C, 0x03C1, 0xA36D, 0x03C3, + 0xA36E, 0x03C4, 0xA36F, 0x03C5, 0xA370, 0x03C6, 0xA371, 0x03C7, + 0xA372, 0x03C8, 0xA373, 0x03C9, 0xA374, 0x3105, 0xA375, 0x3106, + 0xA376, 0x3107, 0xA377, 0x3108, 0xA378, 0x3109, 0xA379, 0x310A, + 0xA37A, 0x310B, 0xA37B, 0x310C, 0xA37C, 0x310D, 0xA37D, 0x310E, + 0xA37E, 0x310F, 0xA3A1, 0x3110, 0xA3A2, 0x3111, 0xA3A3, 0x3112, + 0xA3A4, 0x3113, 0xA3A5, 0x3114, 0xA3A6, 0x3115, 0xA3A7, 0x3116, + 0xA3A8, 0x3117, 0xA3A9, 0x3118, 0xA3AA, 0x3119, 0xA3AB, 0x311A, + 0xA3AC, 0x311B, 0xA3AD, 0x311C, 0xA3AE, 0x311D, 0xA3AF, 0x311E, + 0xA3B0, 0x311F, 0xA3B1, 0x3120, 0xA3B2, 0x3121, 0xA3B3, 0x3122, + 0xA3B4, 0x3123, 0xA3B5, 0x3124, 0xA3B6, 0x3125, 0xA3B7, 0x3126, + 0xA3B8, 0x3127, 0xA3B9, 0x3128, 0xA3BA, 0x3129, 0xA3BB, 0x02D9, + 0xA3BC, 0x02C9, 0xA3BD, 0x02CA, 0xA3BE, 0x02C7, 0xA3BF, 0x02CB, + 0xA3E1, 0x20AC, 0xA440, 0x4E00, 0xA441, 0x4E59, 0xA442, 0x4E01, + 0xA443, 0x4E03, 0xA444, 0x4E43, 0xA445, 0x4E5D, 0xA446, 0x4E86, + 0xA447, 0x4E8C, 0xA448, 0x4EBA, 0xA449, 0x513F, 0xA44A, 0x5165, + 0xA44B, 0x516B, 0xA44C, 0x51E0, 0xA44D, 0x5200, 0xA44E, 0x5201, + 0xA44F, 0x529B, 0xA450, 0x5315, 0xA451, 0x5341, 0xA452, 0x535C, + 0xA453, 0x53C8, 0xA454, 0x4E09, 0xA455, 0x4E0B, 0xA456, 0x4E08, + 0xA457, 0x4E0A, 0xA458, 0x4E2B, 0xA459, 0x4E38, 0xA45A, 0x51E1, + 0xA45B, 0x4E45, 0xA45C, 0x4E48, 0xA45D, 0x4E5F, 0xA45E, 0x4E5E, + 0xA45F, 0x4E8E, 0xA460, 0x4EA1, 0xA461, 0x5140, 0xA462, 0x5203, + 0xA463, 0x52FA, 0xA464, 0x5343, 0xA465, 0x53C9, 0xA466, 0x53E3, + 0xA467, 0x571F, 0xA468, 0x58EB, 0xA469, 0x5915, 0xA46A, 0x5927, + 0xA46B, 0x5973, 0xA46C, 0x5B50, 0xA46D, 0x5B51, 0xA46E, 0x5B53, + 0xA46F, 0x5BF8, 0xA470, 0x5C0F, 0xA471, 0x5C22, 0xA472, 0x5C38, + 0xA473, 0x5C71, 0xA474, 0x5DDD, 0xA475, 0x5DE5, 0xA476, 0x5DF1, + 0xA477, 0x5DF2, 0xA478, 0x5DF3, 0xA479, 0x5DFE, 0xA47A, 0x5E72, + 0xA47B, 0x5EFE, 0xA47C, 0x5F0B, 0xA47D, 0x5F13, 0xA47E, 0x624D, + 0xA4A1, 0x4E11, 0xA4A2, 0x4E10, 0xA4A3, 0x4E0D, 0xA4A4, 0x4E2D, + 0xA4A5, 0x4E30, 0xA4A6, 0x4E39, 0xA4A7, 0x4E4B, 0xA4A8, 0x5C39, + 0xA4A9, 0x4E88, 0xA4AA, 0x4E91, 0xA4AB, 0x4E95, 0xA4AC, 0x4E92, + 0xA4AD, 0x4E94, 0xA4AE, 0x4EA2, 0xA4AF, 0x4EC1, 0xA4B0, 0x4EC0, + 0xA4B1, 0x4EC3, 0xA4B2, 0x4EC6, 0xA4B3, 0x4EC7, 0xA4B4, 0x4ECD, + 0xA4B5, 0x4ECA, 0xA4B6, 0x4ECB, 0xA4B7, 0x4EC4, 0xA4B8, 0x5143, + 0xA4B9, 0x5141, 0xA4BA, 0x5167, 0xA4BB, 0x516D, 0xA4BC, 0x516E, + 0xA4BD, 0x516C, 0xA4BE, 0x5197, 0xA4BF, 0x51F6, 0xA4C0, 0x5206, + 0xA4C1, 0x5207, 0xA4C2, 0x5208, 0xA4C3, 0x52FB, 0xA4C4, 0x52FE, + 0xA4C5, 0x52FF, 0xA4C6, 0x5316, 0xA4C7, 0x5339, 0xA4C8, 0x5348, + 0xA4C9, 0x5347, 0xA4CA, 0x5345, 0xA4CB, 0x535E, 0xA4CC, 0x5384, + 0xA4CD, 0x53CB, 0xA4CE, 0x53CA, 0xA4CF, 0x53CD, 0xA4D0, 0x58EC, + 0xA4D1, 0x5929, 0xA4D2, 0x592B, 0xA4D3, 0x592A, 0xA4D4, 0x592D, + 0xA4D5, 0x5B54, 0xA4D6, 0x5C11, 0xA4D7, 0x5C24, 0xA4D8, 0x5C3A, + 0xA4D9, 0x5C6F, 0xA4DA, 0x5DF4, 0xA4DB, 0x5E7B, 0xA4DC, 0x5EFF, + 0xA4DD, 0x5F14, 0xA4DE, 0x5F15, 0xA4DF, 0x5FC3, 0xA4E0, 0x6208, + 0xA4E1, 0x6236, 0xA4E2, 0x624B, 0xA4E3, 0x624E, 0xA4E4, 0x652F, + 0xA4E5, 0x6587, 0xA4E6, 0x6597, 0xA4E7, 0x65A4, 0xA4E8, 0x65B9, + 0xA4E9, 0x65E5, 0xA4EA, 0x66F0, 0xA4EB, 0x6708, 0xA4EC, 0x6728, + 0xA4ED, 0x6B20, 0xA4EE, 0x6B62, 0xA4EF, 0x6B79, 0xA4F0, 0x6BCB, + 0xA4F1, 0x6BD4, 0xA4F2, 0x6BDB, 0xA4F3, 0x6C0F, 0xA4F4, 0x6C34, + 0xA4F5, 0x706B, 0xA4F6, 0x722A, 0xA4F7, 0x7236, 0xA4F8, 0x723B, + 0xA4F9, 0x7247, 0xA4FA, 0x7259, 0xA4FB, 0x725B, 0xA4FC, 0x72AC, + 0xA4FD, 0x738B, 0xA4FE, 0x4E19, 0xA540, 0x4E16, 0xA541, 0x4E15, + 0xA542, 0x4E14, 0xA543, 0x4E18, 0xA544, 0x4E3B, 0xA545, 0x4E4D, + 0xA546, 0x4E4F, 0xA547, 0x4E4E, 0xA548, 0x4EE5, 0xA549, 0x4ED8, + 0xA54A, 0x4ED4, 0xA54B, 0x4ED5, 0xA54C, 0x4ED6, 0xA54D, 0x4ED7, + 0xA54E, 0x4EE3, 0xA54F, 0x4EE4, 0xA550, 0x4ED9, 0xA551, 0x4EDE, + 0xA552, 0x5145, 0xA553, 0x5144, 0xA554, 0x5189, 0xA555, 0x518A, + 0xA556, 0x51AC, 0xA557, 0x51F9, 0xA558, 0x51FA, 0xA559, 0x51F8, + 0xA55A, 0x520A, 0xA55B, 0x52A0, 0xA55C, 0x529F, 0xA55D, 0x5305, + 0xA55E, 0x5306, 0xA55F, 0x5317, 0xA560, 0x531D, 0xA561, 0x4EDF, + 0xA562, 0x534A, 0xA563, 0x5349, 0xA564, 0x5361, 0xA565, 0x5360, + 0xA566, 0x536F, 0xA567, 0x536E, 0xA568, 0x53BB, 0xA569, 0x53EF, + 0xA56A, 0x53E4, 0xA56B, 0x53F3, 0xA56C, 0x53EC, 0xA56D, 0x53EE, + 0xA56E, 0x53E9, 0xA56F, 0x53E8, 0xA570, 0x53FC, 0xA571, 0x53F8, + 0xA572, 0x53F5, 0xA573, 0x53EB, 0xA574, 0x53E6, 0xA575, 0x53EA, + 0xA576, 0x53F2, 0xA577, 0x53F1, 0xA578, 0x53F0, 0xA579, 0x53E5, + 0xA57A, 0x53ED, 0xA57B, 0x53FB, 0xA57C, 0x56DB, 0xA57D, 0x56DA, + 0xA57E, 0x5916, 0xA5A1, 0x592E, 0xA5A2, 0x5931, 0xA5A3, 0x5974, + 0xA5A4, 0x5976, 0xA5A5, 0x5B55, 0xA5A6, 0x5B83, 0xA5A7, 0x5C3C, + 0xA5A8, 0x5DE8, 0xA5A9, 0x5DE7, 0xA5AA, 0x5DE6, 0xA5AB, 0x5E02, + 0xA5AC, 0x5E03, 0xA5AD, 0x5E73, 0xA5AE, 0x5E7C, 0xA5AF, 0x5F01, + 0xA5B0, 0x5F18, 0xA5B1, 0x5F17, 0xA5B2, 0x5FC5, 0xA5B3, 0x620A, + 0xA5B4, 0x6253, 0xA5B5, 0x6254, 0xA5B6, 0x6252, 0xA5B7, 0x6251, + 0xA5B8, 0x65A5, 0xA5B9, 0x65E6, 0xA5BA, 0x672E, 0xA5BB, 0x672C, + 0xA5BC, 0x672A, 0xA5BD, 0x672B, 0xA5BE, 0x672D, 0xA5BF, 0x6B63, + 0xA5C0, 0x6BCD, 0xA5C1, 0x6C11, 0xA5C2, 0x6C10, 0xA5C3, 0x6C38, + 0xA5C4, 0x6C41, 0xA5C5, 0x6C40, 0xA5C6, 0x6C3E, 0xA5C7, 0x72AF, + 0xA5C8, 0x7384, 0xA5C9, 0x7389, 0xA5CA, 0x74DC, 0xA5CB, 0x74E6, + 0xA5CC, 0x7518, 0xA5CD, 0x751F, 0xA5CE, 0x7528, 0xA5CF, 0x7529, + 0xA5D0, 0x7530, 0xA5D1, 0x7531, 0xA5D2, 0x7532, 0xA5D3, 0x7533, + 0xA5D4, 0x758B, 0xA5D5, 0x767D, 0xA5D6, 0x76AE, 0xA5D7, 0x76BF, + 0xA5D8, 0x76EE, 0xA5D9, 0x77DB, 0xA5DA, 0x77E2, 0xA5DB, 0x77F3, + 0xA5DC, 0x793A, 0xA5DD, 0x79BE, 0xA5DE, 0x7A74, 0xA5DF, 0x7ACB, + 0xA5E0, 0x4E1E, 0xA5E1, 0x4E1F, 0xA5E2, 0x4E52, 0xA5E3, 0x4E53, + 0xA5E4, 0x4E69, 0xA5E5, 0x4E99, 0xA5E6, 0x4EA4, 0xA5E7, 0x4EA6, + 0xA5E8, 0x4EA5, 0xA5E9, 0x4EFF, 0xA5EA, 0x4F09, 0xA5EB, 0x4F19, + 0xA5EC, 0x4F0A, 0xA5ED, 0x4F15, 0xA5EE, 0x4F0D, 0xA5EF, 0x4F10, + 0xA5F0, 0x4F11, 0xA5F1, 0x4F0F, 0xA5F2, 0x4EF2, 0xA5F3, 0x4EF6, + 0xA5F4, 0x4EFB, 0xA5F5, 0x4EF0, 0xA5F6, 0x4EF3, 0xA5F7, 0x4EFD, + 0xA5F8, 0x4F01, 0xA5F9, 0x4F0B, 0xA5FA, 0x5149, 0xA5FB, 0x5147, + 0xA5FC, 0x5146, 0xA5FD, 0x5148, 0xA5FE, 0x5168, 0xA640, 0x5171, + 0xA641, 0x518D, 0xA642, 0x51B0, 0xA643, 0x5217, 0xA644, 0x5211, + 0xA645, 0x5212, 0xA646, 0x520E, 0xA647, 0x5216, 0xA648, 0x52A3, + 0xA649, 0x5308, 0xA64A, 0x5321, 0xA64B, 0x5320, 0xA64C, 0x5370, + 0xA64D, 0x5371, 0xA64E, 0x5409, 0xA64F, 0x540F, 0xA650, 0x540C, + 0xA651, 0x540A, 0xA652, 0x5410, 0xA653, 0x5401, 0xA654, 0x540B, + 0xA655, 0x5404, 0xA656, 0x5411, 0xA657, 0x540D, 0xA658, 0x5408, + 0xA659, 0x5403, 0xA65A, 0x540E, 0xA65B, 0x5406, 0xA65C, 0x5412, + 0xA65D, 0x56E0, 0xA65E, 0x56DE, 0xA65F, 0x56DD, 0xA660, 0x5733, + 0xA661, 0x5730, 0xA662, 0x5728, 0xA663, 0x572D, 0xA664, 0x572C, + 0xA665, 0x572F, 0xA666, 0x5729, 0xA667, 0x5919, 0xA668, 0x591A, + 0xA669, 0x5937, 0xA66A, 0x5938, 0xA66B, 0x5984, 0xA66C, 0x5978, + 0xA66D, 0x5983, 0xA66E, 0x597D, 0xA66F, 0x5979, 0xA670, 0x5982, + 0xA671, 0x5981, 0xA672, 0x5B57, 0xA673, 0x5B58, 0xA674, 0x5B87, + 0xA675, 0x5B88, 0xA676, 0x5B85, 0xA677, 0x5B89, 0xA678, 0x5BFA, + 0xA679, 0x5C16, 0xA67A, 0x5C79, 0xA67B, 0x5DDE, 0xA67C, 0x5E06, + 0xA67D, 0x5E76, 0xA67E, 0x5E74, 0xA6A1, 0x5F0F, 0xA6A2, 0x5F1B, + 0xA6A3, 0x5FD9, 0xA6A4, 0x5FD6, 0xA6A5, 0x620E, 0xA6A6, 0x620C, + 0xA6A7, 0x620D, 0xA6A8, 0x6210, 0xA6A9, 0x6263, 0xA6AA, 0x625B, + 0xA6AB, 0x6258, 0xA6AC, 0x6536, 0xA6AD, 0x65E9, 0xA6AE, 0x65E8, + 0xA6AF, 0x65EC, 0xA6B0, 0x65ED, 0xA6B1, 0x66F2, 0xA6B2, 0x66F3, + 0xA6B3, 0x6709, 0xA6B4, 0x673D, 0xA6B5, 0x6734, 0xA6B6, 0x6731, + 0xA6B7, 0x6735, 0xA6B8, 0x6B21, 0xA6B9, 0x6B64, 0xA6BA, 0x6B7B, + 0xA6BB, 0x6C16, 0xA6BC, 0x6C5D, 0xA6BD, 0x6C57, 0xA6BE, 0x6C59, + 0xA6BF, 0x6C5F, 0xA6C0, 0x6C60, 0xA6C1, 0x6C50, 0xA6C2, 0x6C55, + 0xA6C3, 0x6C61, 0xA6C4, 0x6C5B, 0xA6C5, 0x6C4D, 0xA6C6, 0x6C4E, + 0xA6C7, 0x7070, 0xA6C8, 0x725F, 0xA6C9, 0x725D, 0xA6CA, 0x767E, + 0xA6CB, 0x7AF9, 0xA6CC, 0x7C73, 0xA6CD, 0x7CF8, 0xA6CE, 0x7F36, + 0xA6CF, 0x7F8A, 0xA6D0, 0x7FBD, 0xA6D1, 0x8001, 0xA6D2, 0x8003, + 0xA6D3, 0x800C, 0xA6D4, 0x8012, 0xA6D5, 0x8033, 0xA6D6, 0x807F, + 0xA6D7, 0x8089, 0xA6D8, 0x808B, 0xA6D9, 0x808C, 0xA6DA, 0x81E3, + 0xA6DB, 0x81EA, 0xA6DC, 0x81F3, 0xA6DD, 0x81FC, 0xA6DE, 0x820C, + 0xA6DF, 0x821B, 0xA6E0, 0x821F, 0xA6E1, 0x826E, 0xA6E2, 0x8272, + 0xA6E3, 0x827E, 0xA6E4, 0x866B, 0xA6E5, 0x8840, 0xA6E6, 0x884C, + 0xA6E7, 0x8863, 0xA6E8, 0x897F, 0xA6E9, 0x9621, 0xA6EA, 0x4E32, + 0xA6EB, 0x4EA8, 0xA6EC, 0x4F4D, 0xA6ED, 0x4F4F, 0xA6EE, 0x4F47, + 0xA6EF, 0x4F57, 0xA6F0, 0x4F5E, 0xA6F1, 0x4F34, 0xA6F2, 0x4F5B, + 0xA6F3, 0x4F55, 0xA6F4, 0x4F30, 0xA6F5, 0x4F50, 0xA6F6, 0x4F51, + 0xA6F7, 0x4F3D, 0xA6F8, 0x4F3A, 0xA6F9, 0x4F38, 0xA6FA, 0x4F43, + 0xA6FB, 0x4F54, 0xA6FC, 0x4F3C, 0xA6FD, 0x4F46, 0xA6FE, 0x4F63, + 0xA740, 0x4F5C, 0xA741, 0x4F60, 0xA742, 0x4F2F, 0xA743, 0x4F4E, + 0xA744, 0x4F36, 0xA745, 0x4F59, 0xA746, 0x4F5D, 0xA747, 0x4F48, + 0xA748, 0x4F5A, 0xA749, 0x514C, 0xA74A, 0x514B, 0xA74B, 0x514D, + 0xA74C, 0x5175, 0xA74D, 0x51B6, 0xA74E, 0x51B7, 0xA74F, 0x5225, + 0xA750, 0x5224, 0xA751, 0x5229, 0xA752, 0x522A, 0xA753, 0x5228, + 0xA754, 0x52AB, 0xA755, 0x52A9, 0xA756, 0x52AA, 0xA757, 0x52AC, + 0xA758, 0x5323, 0xA759, 0x5373, 0xA75A, 0x5375, 0xA75B, 0x541D, + 0xA75C, 0x542D, 0xA75D, 0x541E, 0xA75E, 0x543E, 0xA75F, 0x5426, + 0xA760, 0x544E, 0xA761, 0x5427, 0xA762, 0x5446, 0xA763, 0x5443, + 0xA764, 0x5433, 0xA765, 0x5448, 0xA766, 0x5442, 0xA767, 0x541B, + 0xA768, 0x5429, 0xA769, 0x544A, 0xA76A, 0x5439, 0xA76B, 0x543B, + 0xA76C, 0x5438, 0xA76D, 0x542E, 0xA76E, 0x5435, 0xA76F, 0x5436, + 0xA770, 0x5420, 0xA771, 0x543C, 0xA772, 0x5440, 0xA773, 0x5431, + 0xA774, 0x542B, 0xA775, 0x541F, 0xA776, 0x542C, 0xA777, 0x56EA, + 0xA778, 0x56F0, 0xA779, 0x56E4, 0xA77A, 0x56EB, 0xA77B, 0x574A, + 0xA77C, 0x5751, 0xA77D, 0x5740, 0xA77E, 0x574D, 0xA7A1, 0x5747, + 0xA7A2, 0x574E, 0xA7A3, 0x573E, 0xA7A4, 0x5750, 0xA7A5, 0x574F, + 0xA7A6, 0x573B, 0xA7A7, 0x58EF, 0xA7A8, 0x593E, 0xA7A9, 0x599D, + 0xA7AA, 0x5992, 0xA7AB, 0x59A8, 0xA7AC, 0x599E, 0xA7AD, 0x59A3, + 0xA7AE, 0x5999, 0xA7AF, 0x5996, 0xA7B0, 0x598D, 0xA7B1, 0x59A4, + 0xA7B2, 0x5993, 0xA7B3, 0x598A, 0xA7B4, 0x59A5, 0xA7B5, 0x5B5D, + 0xA7B6, 0x5B5C, 0xA7B7, 0x5B5A, 0xA7B8, 0x5B5B, 0xA7B9, 0x5B8C, + 0xA7BA, 0x5B8B, 0xA7BB, 0x5B8F, 0xA7BC, 0x5C2C, 0xA7BD, 0x5C40, + 0xA7BE, 0x5C41, 0xA7BF, 0x5C3F, 0xA7C0, 0x5C3E, 0xA7C1, 0x5C90, + 0xA7C2, 0x5C91, 0xA7C3, 0x5C94, 0xA7C4, 0x5C8C, 0xA7C5, 0x5DEB, + 0xA7C6, 0x5E0C, 0xA7C7, 0x5E8F, 0xA7C8, 0x5E87, 0xA7C9, 0x5E8A, + 0xA7CA, 0x5EF7, 0xA7CB, 0x5F04, 0xA7CC, 0x5F1F, 0xA7CD, 0x5F64, + 0xA7CE, 0x5F62, 0xA7CF, 0x5F77, 0xA7D0, 0x5F79, 0xA7D1, 0x5FD8, + 0xA7D2, 0x5FCC, 0xA7D3, 0x5FD7, 0xA7D4, 0x5FCD, 0xA7D5, 0x5FF1, + 0xA7D6, 0x5FEB, 0xA7D7, 0x5FF8, 0xA7D8, 0x5FEA, 0xA7D9, 0x6212, + 0xA7DA, 0x6211, 0xA7DB, 0x6284, 0xA7DC, 0x6297, 0xA7DD, 0x6296, + 0xA7DE, 0x6280, 0xA7DF, 0x6276, 0xA7E0, 0x6289, 0xA7E1, 0x626D, + 0xA7E2, 0x628A, 0xA7E3, 0x627C, 0xA7E4, 0x627E, 0xA7E5, 0x6279, + 0xA7E6, 0x6273, 0xA7E7, 0x6292, 0xA7E8, 0x626F, 0xA7E9, 0x6298, + 0xA7EA, 0x626E, 0xA7EB, 0x6295, 0xA7EC, 0x6293, 0xA7ED, 0x6291, + 0xA7EE, 0x6286, 0xA7EF, 0x6539, 0xA7F0, 0x653B, 0xA7F1, 0x6538, + 0xA7F2, 0x65F1, 0xA7F3, 0x66F4, 0xA7F4, 0x675F, 0xA7F5, 0x674E, + 0xA7F6, 0x674F, 0xA7F7, 0x6750, 0xA7F8, 0x6751, 0xA7F9, 0x675C, + 0xA7FA, 0x6756, 0xA7FB, 0x675E, 0xA7FC, 0x6749, 0xA7FD, 0x6746, + 0xA7FE, 0x6760, 0xA840, 0x6753, 0xA841, 0x6757, 0xA842, 0x6B65, + 0xA843, 0x6BCF, 0xA844, 0x6C42, 0xA845, 0x6C5E, 0xA846, 0x6C99, + 0xA847, 0x6C81, 0xA848, 0x6C88, 0xA849, 0x6C89, 0xA84A, 0x6C85, + 0xA84B, 0x6C9B, 0xA84C, 0x6C6A, 0xA84D, 0x6C7A, 0xA84E, 0x6C90, + 0xA84F, 0x6C70, 0xA850, 0x6C8C, 0xA851, 0x6C68, 0xA852, 0x6C96, + 0xA853, 0x6C92, 0xA854, 0x6C7D, 0xA855, 0x6C83, 0xA856, 0x6C72, + 0xA857, 0x6C7E, 0xA858, 0x6C74, 0xA859, 0x6C86, 0xA85A, 0x6C76, + 0xA85B, 0x6C8D, 0xA85C, 0x6C94, 0xA85D, 0x6C98, 0xA85E, 0x6C82, + 0xA85F, 0x7076, 0xA860, 0x707C, 0xA861, 0x707D, 0xA862, 0x7078, + 0xA863, 0x7262, 0xA864, 0x7261, 0xA865, 0x7260, 0xA866, 0x72C4, + 0xA867, 0x72C2, 0xA868, 0x7396, 0xA869, 0x752C, 0xA86A, 0x752B, + 0xA86B, 0x7537, 0xA86C, 0x7538, 0xA86D, 0x7682, 0xA86E, 0x76EF, + 0xA86F, 0x77E3, 0xA870, 0x79C1, 0xA871, 0x79C0, 0xA872, 0x79BF, + 0xA873, 0x7A76, 0xA874, 0x7CFB, 0xA875, 0x7F55, 0xA876, 0x8096, + 0xA877, 0x8093, 0xA878, 0x809D, 0xA879, 0x8098, 0xA87A, 0x809B, + 0xA87B, 0x809A, 0xA87C, 0x80B2, 0xA87D, 0x826F, 0xA87E, 0x8292, + 0xA8A1, 0x828B, 0xA8A2, 0x828D, 0xA8A3, 0x898B, 0xA8A4, 0x89D2, + 0xA8A5, 0x8A00, 0xA8A6, 0x8C37, 0xA8A7, 0x8C46, 0xA8A8, 0x8C55, + 0xA8A9, 0x8C9D, 0xA8AA, 0x8D64, 0xA8AB, 0x8D70, 0xA8AC, 0x8DB3, + 0xA8AD, 0x8EAB, 0xA8AE, 0x8ECA, 0xA8AF, 0x8F9B, 0xA8B0, 0x8FB0, + 0xA8B1, 0x8FC2, 0xA8B2, 0x8FC6, 0xA8B3, 0x8FC5, 0xA8B4, 0x8FC4, + 0xA8B5, 0x5DE1, 0xA8B6, 0x9091, 0xA8B7, 0x90A2, 0xA8B8, 0x90AA, + 0xA8B9, 0x90A6, 0xA8BA, 0x90A3, 0xA8BB, 0x9149, 0xA8BC, 0x91C6, + 0xA8BD, 0x91CC, 0xA8BE, 0x9632, 0xA8BF, 0x962E, 0xA8C0, 0x9631, + 0xA8C1, 0x962A, 0xA8C2, 0x962C, 0xA8C3, 0x4E26, 0xA8C4, 0x4E56, + 0xA8C5, 0x4E73, 0xA8C6, 0x4E8B, 0xA8C7, 0x4E9B, 0xA8C8, 0x4E9E, + 0xA8C9, 0x4EAB, 0xA8CA, 0x4EAC, 0xA8CB, 0x4F6F, 0xA8CC, 0x4F9D, + 0xA8CD, 0x4F8D, 0xA8CE, 0x4F73, 0xA8CF, 0x4F7F, 0xA8D0, 0x4F6C, + 0xA8D1, 0x4F9B, 0xA8D2, 0x4F8B, 0xA8D3, 0x4F86, 0xA8D4, 0x4F83, + 0xA8D5, 0x4F70, 0xA8D6, 0x4F75, 0xA8D7, 0x4F88, 0xA8D8, 0x4F69, + 0xA8D9, 0x4F7B, 0xA8DA, 0x4F96, 0xA8DB, 0x4F7E, 0xA8DC, 0x4F8F, + 0xA8DD, 0x4F91, 0xA8DE, 0x4F7A, 0xA8DF, 0x5154, 0xA8E0, 0x5152, + 0xA8E1, 0x5155, 0xA8E2, 0x5169, 0xA8E3, 0x5177, 0xA8E4, 0x5176, + 0xA8E5, 0x5178, 0xA8E6, 0x51BD, 0xA8E7, 0x51FD, 0xA8E8, 0x523B, + 0xA8E9, 0x5238, 0xA8EA, 0x5237, 0xA8EB, 0x523A, 0xA8EC, 0x5230, + 0xA8ED, 0x522E, 0xA8EE, 0x5236, 0xA8EF, 0x5241, 0xA8F0, 0x52BE, + 0xA8F1, 0x52BB, 0xA8F2, 0x5352, 0xA8F3, 0x5354, 0xA8F4, 0x5353, + 0xA8F5, 0x5351, 0xA8F6, 0x5366, 0xA8F7, 0x5377, 0xA8F8, 0x5378, + 0xA8F9, 0x5379, 0xA8FA, 0x53D6, 0xA8FB, 0x53D4, 0xA8FC, 0x53D7, + 0xA8FD, 0x5473, 0xA8FE, 0x5475, 0xA940, 0x5496, 0xA941, 0x5478, + 0xA942, 0x5495, 0xA943, 0x5480, 0xA944, 0x547B, 0xA945, 0x5477, + 0xA946, 0x5484, 0xA947, 0x5492, 0xA948, 0x5486, 0xA949, 0x547C, + 0xA94A, 0x5490, 0xA94B, 0x5471, 0xA94C, 0x5476, 0xA94D, 0x548C, + 0xA94E, 0x549A, 0xA94F, 0x5462, 0xA950, 0x5468, 0xA951, 0x548B, + 0xA952, 0x547D, 0xA953, 0x548E, 0xA954, 0x56FA, 0xA955, 0x5783, + 0xA956, 0x5777, 0xA957, 0x576A, 0xA958, 0x5769, 0xA959, 0x5761, + 0xA95A, 0x5766, 0xA95B, 0x5764, 0xA95C, 0x577C, 0xA95D, 0x591C, + 0xA95E, 0x5949, 0xA95F, 0x5947, 0xA960, 0x5948, 0xA961, 0x5944, + 0xA962, 0x5954, 0xA963, 0x59BE, 0xA964, 0x59BB, 0xA965, 0x59D4, + 0xA966, 0x59B9, 0xA967, 0x59AE, 0xA968, 0x59D1, 0xA969, 0x59C6, + 0xA96A, 0x59D0, 0xA96B, 0x59CD, 0xA96C, 0x59CB, 0xA96D, 0x59D3, + 0xA96E, 0x59CA, 0xA96F, 0x59AF, 0xA970, 0x59B3, 0xA971, 0x59D2, + 0xA972, 0x59C5, 0xA973, 0x5B5F, 0xA974, 0x5B64, 0xA975, 0x5B63, + 0xA976, 0x5B97, 0xA977, 0x5B9A, 0xA978, 0x5B98, 0xA979, 0x5B9C, + 0xA97A, 0x5B99, 0xA97B, 0x5B9B, 0xA97C, 0x5C1A, 0xA97D, 0x5C48, + 0xA97E, 0x5C45, 0xA9A1, 0x5C46, 0xA9A2, 0x5CB7, 0xA9A3, 0x5CA1, + 0xA9A4, 0x5CB8, 0xA9A5, 0x5CA9, 0xA9A6, 0x5CAB, 0xA9A7, 0x5CB1, + 0xA9A8, 0x5CB3, 0xA9A9, 0x5E18, 0xA9AA, 0x5E1A, 0xA9AB, 0x5E16, + 0xA9AC, 0x5E15, 0xA9AD, 0x5E1B, 0xA9AE, 0x5E11, 0xA9AF, 0x5E78, + 0xA9B0, 0x5E9A, 0xA9B1, 0x5E97, 0xA9B2, 0x5E9C, 0xA9B3, 0x5E95, + 0xA9B4, 0x5E96, 0xA9B5, 0x5EF6, 0xA9B6, 0x5F26, 0xA9B7, 0x5F27, + 0xA9B8, 0x5F29, 0xA9B9, 0x5F80, 0xA9BA, 0x5F81, 0xA9BB, 0x5F7F, + 0xA9BC, 0x5F7C, 0xA9BD, 0x5FDD, 0xA9BE, 0x5FE0, 0xA9BF, 0x5FFD, + 0xA9C0, 0x5FF5, 0xA9C1, 0x5FFF, 0xA9C2, 0x600F, 0xA9C3, 0x6014, + 0xA9C4, 0x602F, 0xA9C5, 0x6035, 0xA9C6, 0x6016, 0xA9C7, 0x602A, + 0xA9C8, 0x6015, 0xA9C9, 0x6021, 0xA9CA, 0x6027, 0xA9CB, 0x6029, + 0xA9CC, 0x602B, 0xA9CD, 0x601B, 0xA9CE, 0x6216, 0xA9CF, 0x6215, + 0xA9D0, 0x623F, 0xA9D1, 0x623E, 0xA9D2, 0x6240, 0xA9D3, 0x627F, + 0xA9D4, 0x62C9, 0xA9D5, 0x62CC, 0xA9D6, 0x62C4, 0xA9D7, 0x62BF, + 0xA9D8, 0x62C2, 0xA9D9, 0x62B9, 0xA9DA, 0x62D2, 0xA9DB, 0x62DB, + 0xA9DC, 0x62AB, 0xA9DD, 0x62D3, 0xA9DE, 0x62D4, 0xA9DF, 0x62CB, + 0xA9E0, 0x62C8, 0xA9E1, 0x62A8, 0xA9E2, 0x62BD, 0xA9E3, 0x62BC, + 0xA9E4, 0x62D0, 0xA9E5, 0x62D9, 0xA9E6, 0x62C7, 0xA9E7, 0x62CD, + 0xA9E8, 0x62B5, 0xA9E9, 0x62DA, 0xA9EA, 0x62B1, 0xA9EB, 0x62D8, + 0xA9EC, 0x62D6, 0xA9ED, 0x62D7, 0xA9EE, 0x62C6, 0xA9EF, 0x62AC, + 0xA9F0, 0x62CE, 0xA9F1, 0x653E, 0xA9F2, 0x65A7, 0xA9F3, 0x65BC, + 0xA9F4, 0x65FA, 0xA9F5, 0x6614, 0xA9F6, 0x6613, 0xA9F7, 0x660C, + 0xA9F8, 0x6606, 0xA9F9, 0x6602, 0xA9FA, 0x660E, 0xA9FB, 0x6600, + 0xA9FC, 0x660F, 0xA9FD, 0x6615, 0xA9FE, 0x660A, 0xAA40, 0x6607, + 0xAA41, 0x670D, 0xAA42, 0x670B, 0xAA43, 0x676D, 0xAA44, 0x678B, + 0xAA45, 0x6795, 0xAA46, 0x6771, 0xAA47, 0x679C, 0xAA48, 0x6773, + 0xAA49, 0x6777, 0xAA4A, 0x6787, 0xAA4B, 0x679D, 0xAA4C, 0x6797, + 0xAA4D, 0x676F, 0xAA4E, 0x6770, 0xAA4F, 0x677F, 0xAA50, 0x6789, + 0xAA51, 0x677E, 0xAA52, 0x6790, 0xAA53, 0x6775, 0xAA54, 0x679A, + 0xAA55, 0x6793, 0xAA56, 0x677C, 0xAA57, 0x676A, 0xAA58, 0x6772, + 0xAA59, 0x6B23, 0xAA5A, 0x6B66, 0xAA5B, 0x6B67, 0xAA5C, 0x6B7F, + 0xAA5D, 0x6C13, 0xAA5E, 0x6C1B, 0xAA5F, 0x6CE3, 0xAA60, 0x6CE8, + 0xAA61, 0x6CF3, 0xAA62, 0x6CB1, 0xAA63, 0x6CCC, 0xAA64, 0x6CE5, + 0xAA65, 0x6CB3, 0xAA66, 0x6CBD, 0xAA67, 0x6CBE, 0xAA68, 0x6CBC, + 0xAA69, 0x6CE2, 0xAA6A, 0x6CAB, 0xAA6B, 0x6CD5, 0xAA6C, 0x6CD3, + 0xAA6D, 0x6CB8, 0xAA6E, 0x6CC4, 0xAA6F, 0x6CB9, 0xAA70, 0x6CC1, + 0xAA71, 0x6CAE, 0xAA72, 0x6CD7, 0xAA73, 0x6CC5, 0xAA74, 0x6CF1, + 0xAA75, 0x6CBF, 0xAA76, 0x6CBB, 0xAA77, 0x6CE1, 0xAA78, 0x6CDB, + 0xAA79, 0x6CCA, 0xAA7A, 0x6CAC, 0xAA7B, 0x6CEF, 0xAA7C, 0x6CDC, + 0xAA7D, 0x6CD6, 0xAA7E, 0x6CE0, 0xAAA1, 0x7095, 0xAAA2, 0x708E, + 0xAAA3, 0x7092, 0xAAA4, 0x708A, 0xAAA5, 0x7099, 0xAAA6, 0x722C, + 0xAAA7, 0x722D, 0xAAA8, 0x7238, 0xAAA9, 0x7248, 0xAAAA, 0x7267, + 0xAAAB, 0x7269, 0xAAAC, 0x72C0, 0xAAAD, 0x72CE, 0xAAAE, 0x72D9, + 0xAAAF, 0x72D7, 0xAAB0, 0x72D0, 0xAAB1, 0x73A9, 0xAAB2, 0x73A8, + 0xAAB3, 0x739F, 0xAAB4, 0x73AB, 0xAAB5, 0x73A5, 0xAAB6, 0x753D, + 0xAAB7, 0x759D, 0xAAB8, 0x7599, 0xAAB9, 0x759A, 0xAABA, 0x7684, + 0xAABB, 0x76C2, 0xAABC, 0x76F2, 0xAABD, 0x76F4, 0xAABE, 0x77E5, + 0xAABF, 0x77FD, 0xAAC0, 0x793E, 0xAAC1, 0x7940, 0xAAC2, 0x7941, + 0xAAC3, 0x79C9, 0xAAC4, 0x79C8, 0xAAC5, 0x7A7A, 0xAAC6, 0x7A79, + 0xAAC7, 0x7AFA, 0xAAC8, 0x7CFE, 0xAAC9, 0x7F54, 0xAACA, 0x7F8C, + 0xAACB, 0x7F8B, 0xAACC, 0x8005, 0xAACD, 0x80BA, 0xAACE, 0x80A5, + 0xAACF, 0x80A2, 0xAAD0, 0x80B1, 0xAAD1, 0x80A1, 0xAAD2, 0x80AB, + 0xAAD3, 0x80A9, 0xAAD4, 0x80B4, 0xAAD5, 0x80AA, 0xAAD6, 0x80AF, + 0xAAD7, 0x81E5, 0xAAD8, 0x81FE, 0xAAD9, 0x820D, 0xAADA, 0x82B3, + 0xAADB, 0x829D, 0xAADC, 0x8299, 0xAADD, 0x82AD, 0xAADE, 0x82BD, + 0xAADF, 0x829F, 0xAAE0, 0x82B9, 0xAAE1, 0x82B1, 0xAAE2, 0x82AC, + 0xAAE3, 0x82A5, 0xAAE4, 0x82AF, 0xAAE5, 0x82B8, 0xAAE6, 0x82A3, + 0xAAE7, 0x82B0, 0xAAE8, 0x82BE, 0xAAE9, 0x82B7, 0xAAEA, 0x864E, + 0xAAEB, 0x8671, 0xAAEC, 0x521D, 0xAAED, 0x8868, 0xAAEE, 0x8ECB, + 0xAAEF, 0x8FCE, 0xAAF0, 0x8FD4, 0xAAF1, 0x8FD1, 0xAAF2, 0x90B5, + 0xAAF3, 0x90B8, 0xAAF4, 0x90B1, 0xAAF5, 0x90B6, 0xAAF6, 0x91C7, + 0xAAF7, 0x91D1, 0xAAF8, 0x9577, 0xAAF9, 0x9580, 0xAAFA, 0x961C, + 0xAAFB, 0x9640, 0xAAFC, 0x963F, 0xAAFD, 0x963B, 0xAAFE, 0x9644, + 0xAB40, 0x9642, 0xAB41, 0x96B9, 0xAB42, 0x96E8, 0xAB43, 0x9752, + 0xAB44, 0x975E, 0xAB45, 0x4E9F, 0xAB46, 0x4EAD, 0xAB47, 0x4EAE, + 0xAB48, 0x4FE1, 0xAB49, 0x4FB5, 0xAB4A, 0x4FAF, 0xAB4B, 0x4FBF, + 0xAB4C, 0x4FE0, 0xAB4D, 0x4FD1, 0xAB4E, 0x4FCF, 0xAB4F, 0x4FDD, + 0xAB50, 0x4FC3, 0xAB51, 0x4FB6, 0xAB52, 0x4FD8, 0xAB53, 0x4FDF, + 0xAB54, 0x4FCA, 0xAB55, 0x4FD7, 0xAB56, 0x4FAE, 0xAB57, 0x4FD0, + 0xAB58, 0x4FC4, 0xAB59, 0x4FC2, 0xAB5A, 0x4FDA, 0xAB5B, 0x4FCE, + 0xAB5C, 0x4FDE, 0xAB5D, 0x4FB7, 0xAB5E, 0x5157, 0xAB5F, 0x5192, + 0xAB60, 0x5191, 0xAB61, 0x51A0, 0xAB62, 0x524E, 0xAB63, 0x5243, + 0xAB64, 0x524A, 0xAB65, 0x524D, 0xAB66, 0x524C, 0xAB67, 0x524B, + 0xAB68, 0x5247, 0xAB69, 0x52C7, 0xAB6A, 0x52C9, 0xAB6B, 0x52C3, + 0xAB6C, 0x52C1, 0xAB6D, 0x530D, 0xAB6E, 0x5357, 0xAB6F, 0x537B, + 0xAB70, 0x539A, 0xAB71, 0x53DB, 0xAB72, 0x54AC, 0xAB73, 0x54C0, + 0xAB74, 0x54A8, 0xAB75, 0x54CE, 0xAB76, 0x54C9, 0xAB77, 0x54B8, + 0xAB78, 0x54A6, 0xAB79, 0x54B3, 0xAB7A, 0x54C7, 0xAB7B, 0x54C2, + 0xAB7C, 0x54BD, 0xAB7D, 0x54AA, 0xAB7E, 0x54C1, 0xABA1, 0x54C4, + 0xABA2, 0x54C8, 0xABA3, 0x54AF, 0xABA4, 0x54AB, 0xABA5, 0x54B1, + 0xABA6, 0x54BB, 0xABA7, 0x54A9, 0xABA8, 0x54A7, 0xABA9, 0x54BF, + 0xABAA, 0x56FF, 0xABAB, 0x5782, 0xABAC, 0x578B, 0xABAD, 0x57A0, + 0xABAE, 0x57A3, 0xABAF, 0x57A2, 0xABB0, 0x57CE, 0xABB1, 0x57AE, + 0xABB2, 0x5793, 0xABB3, 0x5955, 0xABB4, 0x5951, 0xABB5, 0x594F, + 0xABB6, 0x594E, 0xABB7, 0x5950, 0xABB8, 0x59DC, 0xABB9, 0x59D8, + 0xABBA, 0x59FF, 0xABBB, 0x59E3, 0xABBC, 0x59E8, 0xABBD, 0x5A03, + 0xABBE, 0x59E5, 0xABBF, 0x59EA, 0xABC0, 0x59DA, 0xABC1, 0x59E6, + 0xABC2, 0x5A01, 0xABC3, 0x59FB, 0xABC4, 0x5B69, 0xABC5, 0x5BA3, + 0xABC6, 0x5BA6, 0xABC7, 0x5BA4, 0xABC8, 0x5BA2, 0xABC9, 0x5BA5, + 0xABCA, 0x5C01, 0xABCB, 0x5C4E, 0xABCC, 0x5C4F, 0xABCD, 0x5C4D, + 0xABCE, 0x5C4B, 0xABCF, 0x5CD9, 0xABD0, 0x5CD2, 0xABD1, 0x5DF7, + 0xABD2, 0x5E1D, 0xABD3, 0x5E25, 0xABD4, 0x5E1F, 0xABD5, 0x5E7D, + 0xABD6, 0x5EA0, 0xABD7, 0x5EA6, 0xABD8, 0x5EFA, 0xABD9, 0x5F08, + 0xABDA, 0x5F2D, 0xABDB, 0x5F65, 0xABDC, 0x5F88, 0xABDD, 0x5F85, + 0xABDE, 0x5F8A, 0xABDF, 0x5F8B, 0xABE0, 0x5F87, 0xABE1, 0x5F8C, + 0xABE2, 0x5F89, 0xABE3, 0x6012, 0xABE4, 0x601D, 0xABE5, 0x6020, + 0xABE6, 0x6025, 0xABE7, 0x600E, 0xABE8, 0x6028, 0xABE9, 0x604D, + 0xABEA, 0x6070, 0xABEB, 0x6068, 0xABEC, 0x6062, 0xABED, 0x6046, + 0xABEE, 0x6043, 0xABEF, 0x606C, 0xABF0, 0x606B, 0xABF1, 0x606A, + 0xABF2, 0x6064, 0xABF3, 0x6241, 0xABF4, 0x62DC, 0xABF5, 0x6316, + 0xABF6, 0x6309, 0xABF7, 0x62FC, 0xABF8, 0x62ED, 0xABF9, 0x6301, + 0xABFA, 0x62EE, 0xABFB, 0x62FD, 0xABFC, 0x6307, 0xABFD, 0x62F1, + 0xABFE, 0x62F7, 0xAC40, 0x62EF, 0xAC41, 0x62EC, 0xAC42, 0x62FE, + 0xAC43, 0x62F4, 0xAC44, 0x6311, 0xAC45, 0x6302, 0xAC46, 0x653F, + 0xAC47, 0x6545, 0xAC48, 0x65AB, 0xAC49, 0x65BD, 0xAC4A, 0x65E2, + 0xAC4B, 0x6625, 0xAC4C, 0x662D, 0xAC4D, 0x6620, 0xAC4E, 0x6627, + 0xAC4F, 0x662F, 0xAC50, 0x661F, 0xAC51, 0x6628, 0xAC52, 0x6631, + 0xAC53, 0x6624, 0xAC54, 0x66F7, 0xAC55, 0x67FF, 0xAC56, 0x67D3, + 0xAC57, 0x67F1, 0xAC58, 0x67D4, 0xAC59, 0x67D0, 0xAC5A, 0x67EC, + 0xAC5B, 0x67B6, 0xAC5C, 0x67AF, 0xAC5D, 0x67F5, 0xAC5E, 0x67E9, + 0xAC5F, 0x67EF, 0xAC60, 0x67C4, 0xAC61, 0x67D1, 0xAC62, 0x67B4, + 0xAC63, 0x67DA, 0xAC64, 0x67E5, 0xAC65, 0x67B8, 0xAC66, 0x67CF, + 0xAC67, 0x67DE, 0xAC68, 0x67F3, 0xAC69, 0x67B0, 0xAC6A, 0x67D9, + 0xAC6B, 0x67E2, 0xAC6C, 0x67DD, 0xAC6D, 0x67D2, 0xAC6E, 0x6B6A, + 0xAC6F, 0x6B83, 0xAC70, 0x6B86, 0xAC71, 0x6BB5, 0xAC72, 0x6BD2, + 0xAC73, 0x6BD7, 0xAC74, 0x6C1F, 0xAC75, 0x6CC9, 0xAC76, 0x6D0B, + 0xAC77, 0x6D32, 0xAC78, 0x6D2A, 0xAC79, 0x6D41, 0xAC7A, 0x6D25, + 0xAC7B, 0x6D0C, 0xAC7C, 0x6D31, 0xAC7D, 0x6D1E, 0xAC7E, 0x6D17, + 0xACA1, 0x6D3B, 0xACA2, 0x6D3D, 0xACA3, 0x6D3E, 0xACA4, 0x6D36, + 0xACA5, 0x6D1B, 0xACA6, 0x6CF5, 0xACA7, 0x6D39, 0xACA8, 0x6D27, + 0xACA9, 0x6D38, 0xACAA, 0x6D29, 0xACAB, 0x6D2E, 0xACAC, 0x6D35, + 0xACAD, 0x6D0E, 0xACAE, 0x6D2B, 0xACAF, 0x70AB, 0xACB0, 0x70BA, + 0xACB1, 0x70B3, 0xACB2, 0x70AC, 0xACB3, 0x70AF, 0xACB4, 0x70AD, + 0xACB5, 0x70B8, 0xACB6, 0x70AE, 0xACB7, 0x70A4, 0xACB8, 0x7230, + 0xACB9, 0x7272, 0xACBA, 0x726F, 0xACBB, 0x7274, 0xACBC, 0x72E9, + 0xACBD, 0x72E0, 0xACBE, 0x72E1, 0xACBF, 0x73B7, 0xACC0, 0x73CA, + 0xACC1, 0x73BB, 0xACC2, 0x73B2, 0xACC3, 0x73CD, 0xACC4, 0x73C0, + 0xACC5, 0x73B3, 0xACC6, 0x751A, 0xACC7, 0x752D, 0xACC8, 0x754F, + 0xACC9, 0x754C, 0xACCA, 0x754E, 0xACCB, 0x754B, 0xACCC, 0x75AB, + 0xACCD, 0x75A4, 0xACCE, 0x75A5, 0xACCF, 0x75A2, 0xACD0, 0x75A3, + 0xACD1, 0x7678, 0xACD2, 0x7686, 0xACD3, 0x7687, 0xACD4, 0x7688, + 0xACD5, 0x76C8, 0xACD6, 0x76C6, 0xACD7, 0x76C3, 0xACD8, 0x76C5, + 0xACD9, 0x7701, 0xACDA, 0x76F9, 0xACDB, 0x76F8, 0xACDC, 0x7709, + 0xACDD, 0x770B, 0xACDE, 0x76FE, 0xACDF, 0x76FC, 0xACE0, 0x7707, + 0xACE1, 0x77DC, 0xACE2, 0x7802, 0xACE3, 0x7814, 0xACE4, 0x780C, + 0xACE5, 0x780D, 0xACE6, 0x7946, 0xACE7, 0x7949, 0xACE8, 0x7948, + 0xACE9, 0x7947, 0xACEA, 0x79B9, 0xACEB, 0x79BA, 0xACEC, 0x79D1, + 0xACED, 0x79D2, 0xACEE, 0x79CB, 0xACEF, 0x7A7F, 0xACF0, 0x7A81, + 0xACF1, 0x7AFF, 0xACF2, 0x7AFD, 0xACF3, 0x7C7D, 0xACF4, 0x7D02, + 0xACF5, 0x7D05, 0xACF6, 0x7D00, 0xACF7, 0x7D09, 0xACF8, 0x7D07, + 0xACF9, 0x7D04, 0xACFA, 0x7D06, 0xACFB, 0x7F38, 0xACFC, 0x7F8E, + 0xACFD, 0x7FBF, 0xACFE, 0x8004, 0xAD40, 0x8010, 0xAD41, 0x800D, + 0xAD42, 0x8011, 0xAD43, 0x8036, 0xAD44, 0x80D6, 0xAD45, 0x80E5, + 0xAD46, 0x80DA, 0xAD47, 0x80C3, 0xAD48, 0x80C4, 0xAD49, 0x80CC, + 0xAD4A, 0x80E1, 0xAD4B, 0x80DB, 0xAD4C, 0x80CE, 0xAD4D, 0x80DE, + 0xAD4E, 0x80E4, 0xAD4F, 0x80DD, 0xAD50, 0x81F4, 0xAD51, 0x8222, + 0xAD52, 0x82E7, 0xAD53, 0x8303, 0xAD54, 0x8305, 0xAD55, 0x82E3, + 0xAD56, 0x82DB, 0xAD57, 0x82E6, 0xAD58, 0x8304, 0xAD59, 0x82E5, + 0xAD5A, 0x8302, 0xAD5B, 0x8309, 0xAD5C, 0x82D2, 0xAD5D, 0x82D7, + 0xAD5E, 0x82F1, 0xAD5F, 0x8301, 0xAD60, 0x82DC, 0xAD61, 0x82D4, + 0xAD62, 0x82D1, 0xAD63, 0x82DE, 0xAD64, 0x82D3, 0xAD65, 0x82DF, + 0xAD66, 0x82EF, 0xAD67, 0x8306, 0xAD68, 0x8650, 0xAD69, 0x8679, + 0xAD6A, 0x867B, 0xAD6B, 0x867A, 0xAD6C, 0x884D, 0xAD6D, 0x886B, + 0xAD6E, 0x8981, 0xAD6F, 0x89D4, 0xAD70, 0x8A08, 0xAD71, 0x8A02, + 0xAD72, 0x8A03, 0xAD73, 0x8C9E, 0xAD74, 0x8CA0, 0xAD75, 0x8D74, + 0xAD76, 0x8D73, 0xAD77, 0x8DB4, 0xAD78, 0x8ECD, 0xAD79, 0x8ECC, + 0xAD7A, 0x8FF0, 0xAD7B, 0x8FE6, 0xAD7C, 0x8FE2, 0xAD7D, 0x8FEA, + 0xAD7E, 0x8FE5, 0xADA1, 0x8FED, 0xADA2, 0x8FEB, 0xADA3, 0x8FE4, + 0xADA4, 0x8FE8, 0xADA5, 0x90CA, 0xADA6, 0x90CE, 0xADA7, 0x90C1, + 0xADA8, 0x90C3, 0xADA9, 0x914B, 0xADAA, 0x914A, 0xADAB, 0x91CD, + 0xADAC, 0x9582, 0xADAD, 0x9650, 0xADAE, 0x964B, 0xADAF, 0x964C, + 0xADB0, 0x964D, 0xADB1, 0x9762, 0xADB2, 0x9769, 0xADB3, 0x97CB, + 0xADB4, 0x97ED, 0xADB5, 0x97F3, 0xADB6, 0x9801, 0xADB7, 0x98A8, + 0xADB8, 0x98DB, 0xADB9, 0x98DF, 0xADBA, 0x9996, 0xADBB, 0x9999, + 0xADBC, 0x4E58, 0xADBD, 0x4EB3, 0xADBE, 0x500C, 0xADBF, 0x500D, + 0xADC0, 0x5023, 0xADC1, 0x4FEF, 0xADC2, 0x5026, 0xADC3, 0x5025, + 0xADC4, 0x4FF8, 0xADC5, 0x5029, 0xADC6, 0x5016, 0xADC7, 0x5006, + 0xADC8, 0x503C, 0xADC9, 0x501F, 0xADCA, 0x501A, 0xADCB, 0x5012, + 0xADCC, 0x5011, 0xADCD, 0x4FFA, 0xADCE, 0x5000, 0xADCF, 0x5014, + 0xADD0, 0x5028, 0xADD1, 0x4FF1, 0xADD2, 0x5021, 0xADD3, 0x500B, + 0xADD4, 0x5019, 0xADD5, 0x5018, 0xADD6, 0x4FF3, 0xADD7, 0x4FEE, + 0xADD8, 0x502D, 0xADD9, 0x502A, 0xADDA, 0x4FFE, 0xADDB, 0x502B, + 0xADDC, 0x5009, 0xADDD, 0x517C, 0xADDE, 0x51A4, 0xADDF, 0x51A5, + 0xADE0, 0x51A2, 0xADE1, 0x51CD, 0xADE2, 0x51CC, 0xADE3, 0x51C6, + 0xADE4, 0x51CB, 0xADE5, 0x5256, 0xADE6, 0x525C, 0xADE7, 0x5254, + 0xADE8, 0x525B, 0xADE9, 0x525D, 0xADEA, 0x532A, 0xADEB, 0x537F, + 0xADEC, 0x539F, 0xADED, 0x539D, 0xADEE, 0x53DF, 0xADEF, 0x54E8, + 0xADF0, 0x5510, 0xADF1, 0x5501, 0xADF2, 0x5537, 0xADF3, 0x54FC, + 0xADF4, 0x54E5, 0xADF5, 0x54F2, 0xADF6, 0x5506, 0xADF7, 0x54FA, + 0xADF8, 0x5514, 0xADF9, 0x54E9, 0xADFA, 0x54ED, 0xADFB, 0x54E1, + 0xADFC, 0x5509, 0xADFD, 0x54EE, 0xADFE, 0x54EA, 0xAE40, 0x54E6, + 0xAE41, 0x5527, 0xAE42, 0x5507, 0xAE43, 0x54FD, 0xAE44, 0x550F, + 0xAE45, 0x5703, 0xAE46, 0x5704, 0xAE47, 0x57C2, 0xAE48, 0x57D4, + 0xAE49, 0x57CB, 0xAE4A, 0x57C3, 0xAE4B, 0x5809, 0xAE4C, 0x590F, + 0xAE4D, 0x5957, 0xAE4E, 0x5958, 0xAE4F, 0x595A, 0xAE50, 0x5A11, + 0xAE51, 0x5A18, 0xAE52, 0x5A1C, 0xAE53, 0x5A1F, 0xAE54, 0x5A1B, + 0xAE55, 0x5A13, 0xAE56, 0x59EC, 0xAE57, 0x5A20, 0xAE58, 0x5A23, + 0xAE59, 0x5A29, 0xAE5A, 0x5A25, 0xAE5B, 0x5A0C, 0xAE5C, 0x5A09, + 0xAE5D, 0x5B6B, 0xAE5E, 0x5C58, 0xAE5F, 0x5BB0, 0xAE60, 0x5BB3, + 0xAE61, 0x5BB6, 0xAE62, 0x5BB4, 0xAE63, 0x5BAE, 0xAE64, 0x5BB5, + 0xAE65, 0x5BB9, 0xAE66, 0x5BB8, 0xAE67, 0x5C04, 0xAE68, 0x5C51, + 0xAE69, 0x5C55, 0xAE6A, 0x5C50, 0xAE6B, 0x5CED, 0xAE6C, 0x5CFD, + 0xAE6D, 0x5CFB, 0xAE6E, 0x5CEA, 0xAE6F, 0x5CE8, 0xAE70, 0x5CF0, + 0xAE71, 0x5CF6, 0xAE72, 0x5D01, 0xAE73, 0x5CF4, 0xAE74, 0x5DEE, + 0xAE75, 0x5E2D, 0xAE76, 0x5E2B, 0xAE77, 0x5EAB, 0xAE78, 0x5EAD, + 0xAE79, 0x5EA7, 0xAE7A, 0x5F31, 0xAE7B, 0x5F92, 0xAE7C, 0x5F91, + 0xAE7D, 0x5F90, 0xAE7E, 0x6059, 0xAEA1, 0x6063, 0xAEA2, 0x6065, + 0xAEA3, 0x6050, 0xAEA4, 0x6055, 0xAEA5, 0x606D, 0xAEA6, 0x6069, + 0xAEA7, 0x606F, 0xAEA8, 0x6084, 0xAEA9, 0x609F, 0xAEAA, 0x609A, + 0xAEAB, 0x608D, 0xAEAC, 0x6094, 0xAEAD, 0x608C, 0xAEAE, 0x6085, + 0xAEAF, 0x6096, 0xAEB0, 0x6247, 0xAEB1, 0x62F3, 0xAEB2, 0x6308, + 0xAEB3, 0x62FF, 0xAEB4, 0x634E, 0xAEB5, 0x633E, 0xAEB6, 0x632F, + 0xAEB7, 0x6355, 0xAEB8, 0x6342, 0xAEB9, 0x6346, 0xAEBA, 0x634F, + 0xAEBB, 0x6349, 0xAEBC, 0x633A, 0xAEBD, 0x6350, 0xAEBE, 0x633D, + 0xAEBF, 0x632A, 0xAEC0, 0x632B, 0xAEC1, 0x6328, 0xAEC2, 0x634D, + 0xAEC3, 0x634C, 0xAEC4, 0x6548, 0xAEC5, 0x6549, 0xAEC6, 0x6599, + 0xAEC7, 0x65C1, 0xAEC8, 0x65C5, 0xAEC9, 0x6642, 0xAECA, 0x6649, + 0xAECB, 0x664F, 0xAECC, 0x6643, 0xAECD, 0x6652, 0xAECE, 0x664C, + 0xAECF, 0x6645, 0xAED0, 0x6641, 0xAED1, 0x66F8, 0xAED2, 0x6714, + 0xAED3, 0x6715, 0xAED4, 0x6717, 0xAED5, 0x6821, 0xAED6, 0x6838, + 0xAED7, 0x6848, 0xAED8, 0x6846, 0xAED9, 0x6853, 0xAEDA, 0x6839, + 0xAEDB, 0x6842, 0xAEDC, 0x6854, 0xAEDD, 0x6829, 0xAEDE, 0x68B3, + 0xAEDF, 0x6817, 0xAEE0, 0x684C, 0xAEE1, 0x6851, 0xAEE2, 0x683D, + 0xAEE3, 0x67F4, 0xAEE4, 0x6850, 0xAEE5, 0x6840, 0xAEE6, 0x683C, + 0xAEE7, 0x6843, 0xAEE8, 0x682A, 0xAEE9, 0x6845, 0xAEEA, 0x6813, + 0xAEEB, 0x6818, 0xAEEC, 0x6841, 0xAEED, 0x6B8A, 0xAEEE, 0x6B89, + 0xAEEF, 0x6BB7, 0xAEF0, 0x6C23, 0xAEF1, 0x6C27, 0xAEF2, 0x6C28, + 0xAEF3, 0x6C26, 0xAEF4, 0x6C24, 0xAEF5, 0x6CF0, 0xAEF6, 0x6D6A, + 0xAEF7, 0x6D95, 0xAEF8, 0x6D88, 0xAEF9, 0x6D87, 0xAEFA, 0x6D66, + 0xAEFB, 0x6D78, 0xAEFC, 0x6D77, 0xAEFD, 0x6D59, 0xAEFE, 0x6D93, + 0xAF40, 0x6D6C, 0xAF41, 0x6D89, 0xAF42, 0x6D6E, 0xAF43, 0x6D5A, + 0xAF44, 0x6D74, 0xAF45, 0x6D69, 0xAF46, 0x6D8C, 0xAF47, 0x6D8A, + 0xAF48, 0x6D79, 0xAF49, 0x6D85, 0xAF4A, 0x6D65, 0xAF4B, 0x6D94, + 0xAF4C, 0x70CA, 0xAF4D, 0x70D8, 0xAF4E, 0x70E4, 0xAF4F, 0x70D9, + 0xAF50, 0x70C8, 0xAF51, 0x70CF, 0xAF52, 0x7239, 0xAF53, 0x7279, + 0xAF54, 0x72FC, 0xAF55, 0x72F9, 0xAF56, 0x72FD, 0xAF57, 0x72F8, + 0xAF58, 0x72F7, 0xAF59, 0x7386, 0xAF5A, 0x73ED, 0xAF5B, 0x7409, + 0xAF5C, 0x73EE, 0xAF5D, 0x73E0, 0xAF5E, 0x73EA, 0xAF5F, 0x73DE, + 0xAF60, 0x7554, 0xAF61, 0x755D, 0xAF62, 0x755C, 0xAF63, 0x755A, + 0xAF64, 0x7559, 0xAF65, 0x75BE, 0xAF66, 0x75C5, 0xAF67, 0x75C7, + 0xAF68, 0x75B2, 0xAF69, 0x75B3, 0xAF6A, 0x75BD, 0xAF6B, 0x75BC, + 0xAF6C, 0x75B9, 0xAF6D, 0x75C2, 0xAF6E, 0x75B8, 0xAF6F, 0x768B, + 0xAF70, 0x76B0, 0xAF71, 0x76CA, 0xAF72, 0x76CD, 0xAF73, 0x76CE, + 0xAF74, 0x7729, 0xAF75, 0x771F, 0xAF76, 0x7720, 0xAF77, 0x7728, + 0xAF78, 0x77E9, 0xAF79, 0x7830, 0xAF7A, 0x7827, 0xAF7B, 0x7838, + 0xAF7C, 0x781D, 0xAF7D, 0x7834, 0xAF7E, 0x7837, 0xAFA1, 0x7825, + 0xAFA2, 0x782D, 0xAFA3, 0x7820, 0xAFA4, 0x781F, 0xAFA5, 0x7832, + 0xAFA6, 0x7955, 0xAFA7, 0x7950, 0xAFA8, 0x7960, 0xAFA9, 0x795F, + 0xAFAA, 0x7956, 0xAFAB, 0x795E, 0xAFAC, 0x795D, 0xAFAD, 0x7957, + 0xAFAE, 0x795A, 0xAFAF, 0x79E4, 0xAFB0, 0x79E3, 0xAFB1, 0x79E7, + 0xAFB2, 0x79DF, 0xAFB3, 0x79E6, 0xAFB4, 0x79E9, 0xAFB5, 0x79D8, + 0xAFB6, 0x7A84, 0xAFB7, 0x7A88, 0xAFB8, 0x7AD9, 0xAFB9, 0x7B06, + 0xAFBA, 0x7B11, 0xAFBB, 0x7C89, 0xAFBC, 0x7D21, 0xAFBD, 0x7D17, + 0xAFBE, 0x7D0B, 0xAFBF, 0x7D0A, 0xAFC0, 0x7D20, 0xAFC1, 0x7D22, + 0xAFC2, 0x7D14, 0xAFC3, 0x7D10, 0xAFC4, 0x7D15, 0xAFC5, 0x7D1A, + 0xAFC6, 0x7D1C, 0xAFC7, 0x7D0D, 0xAFC8, 0x7D19, 0xAFC9, 0x7D1B, + 0xAFCA, 0x7F3A, 0xAFCB, 0x7F5F, 0xAFCC, 0x7F94, 0xAFCD, 0x7FC5, + 0xAFCE, 0x7FC1, 0xAFCF, 0x8006, 0xAFD0, 0x8018, 0xAFD1, 0x8015, + 0xAFD2, 0x8019, 0xAFD3, 0x8017, 0xAFD4, 0x803D, 0xAFD5, 0x803F, + 0xAFD6, 0x80F1, 0xAFD7, 0x8102, 0xAFD8, 0x80F0, 0xAFD9, 0x8105, + 0xAFDA, 0x80ED, 0xAFDB, 0x80F4, 0xAFDC, 0x8106, 0xAFDD, 0x80F8, + 0xAFDE, 0x80F3, 0xAFDF, 0x8108, 0xAFE0, 0x80FD, 0xAFE1, 0x810A, + 0xAFE2, 0x80FC, 0xAFE3, 0x80EF, 0xAFE4, 0x81ED, 0xAFE5, 0x81EC, + 0xAFE6, 0x8200, 0xAFE7, 0x8210, 0xAFE8, 0x822A, 0xAFE9, 0x822B, + 0xAFEA, 0x8228, 0xAFEB, 0x822C, 0xAFEC, 0x82BB, 0xAFED, 0x832B, + 0xAFEE, 0x8352, 0xAFEF, 0x8354, 0xAFF0, 0x834A, 0xAFF1, 0x8338, + 0xAFF2, 0x8350, 0xAFF3, 0x8349, 0xAFF4, 0x8335, 0xAFF5, 0x8334, + 0xAFF6, 0x834F, 0xAFF7, 0x8332, 0xAFF8, 0x8339, 0xAFF9, 0x8336, + 0xAFFA, 0x8317, 0xAFFB, 0x8340, 0xAFFC, 0x8331, 0xAFFD, 0x8328, + 0xAFFE, 0x8343, 0xB040, 0x8654, 0xB041, 0x868A, 0xB042, 0x86AA, + 0xB043, 0x8693, 0xB044, 0x86A4, 0xB045, 0x86A9, 0xB046, 0x868C, + 0xB047, 0x86A3, 0xB048, 0x869C, 0xB049, 0x8870, 0xB04A, 0x8877, + 0xB04B, 0x8881, 0xB04C, 0x8882, 0xB04D, 0x887D, 0xB04E, 0x8879, + 0xB04F, 0x8A18, 0xB050, 0x8A10, 0xB051, 0x8A0E, 0xB052, 0x8A0C, + 0xB053, 0x8A15, 0xB054, 0x8A0A, 0xB055, 0x8A17, 0xB056, 0x8A13, + 0xB057, 0x8A16, 0xB058, 0x8A0F, 0xB059, 0x8A11, 0xB05A, 0x8C48, + 0xB05B, 0x8C7A, 0xB05C, 0x8C79, 0xB05D, 0x8CA1, 0xB05E, 0x8CA2, + 0xB05F, 0x8D77, 0xB060, 0x8EAC, 0xB061, 0x8ED2, 0xB062, 0x8ED4, + 0xB063, 0x8ECF, 0xB064, 0x8FB1, 0xB065, 0x9001, 0xB066, 0x9006, + 0xB067, 0x8FF7, 0xB068, 0x9000, 0xB069, 0x8FFA, 0xB06A, 0x8FF4, + 0xB06B, 0x9003, 0xB06C, 0x8FFD, 0xB06D, 0x9005, 0xB06E, 0x8FF8, + 0xB06F, 0x9095, 0xB070, 0x90E1, 0xB071, 0x90DD, 0xB072, 0x90E2, + 0xB073, 0x9152, 0xB074, 0x914D, 0xB075, 0x914C, 0xB076, 0x91D8, + 0xB077, 0x91DD, 0xB078, 0x91D7, 0xB079, 0x91DC, 0xB07A, 0x91D9, + 0xB07B, 0x9583, 0xB07C, 0x9662, 0xB07D, 0x9663, 0xB07E, 0x9661, + 0xB0A1, 0x965B, 0xB0A2, 0x965D, 0xB0A3, 0x9664, 0xB0A4, 0x9658, + 0xB0A5, 0x965E, 0xB0A6, 0x96BB, 0xB0A7, 0x98E2, 0xB0A8, 0x99AC, + 0xB0A9, 0x9AA8, 0xB0AA, 0x9AD8, 0xB0AB, 0x9B25, 0xB0AC, 0x9B32, + 0xB0AD, 0x9B3C, 0xB0AE, 0x4E7E, 0xB0AF, 0x507A, 0xB0B0, 0x507D, + 0xB0B1, 0x505C, 0xB0B2, 0x5047, 0xB0B3, 0x5043, 0xB0B4, 0x504C, + 0xB0B5, 0x505A, 0xB0B6, 0x5049, 0xB0B7, 0x5065, 0xB0B8, 0x5076, + 0xB0B9, 0x504E, 0xB0BA, 0x5055, 0xB0BB, 0x5075, 0xB0BC, 0x5074, + 0xB0BD, 0x5077, 0xB0BE, 0x504F, 0xB0BF, 0x500F, 0xB0C0, 0x506F, + 0xB0C1, 0x506D, 0xB0C2, 0x515C, 0xB0C3, 0x5195, 0xB0C4, 0x51F0, + 0xB0C5, 0x526A, 0xB0C6, 0x526F, 0xB0C7, 0x52D2, 0xB0C8, 0x52D9, + 0xB0C9, 0x52D8, 0xB0CA, 0x52D5, 0xB0CB, 0x5310, 0xB0CC, 0x530F, + 0xB0CD, 0x5319, 0xB0CE, 0x533F, 0xB0CF, 0x5340, 0xB0D0, 0x533E, + 0xB0D1, 0x53C3, 0xB0D2, 0x66FC, 0xB0D3, 0x5546, 0xB0D4, 0x556A, + 0xB0D5, 0x5566, 0xB0D6, 0x5544, 0xB0D7, 0x555E, 0xB0D8, 0x5561, + 0xB0D9, 0x5543, 0xB0DA, 0x554A, 0xB0DB, 0x5531, 0xB0DC, 0x5556, + 0xB0DD, 0x554F, 0xB0DE, 0x5555, 0xB0DF, 0x552F, 0xB0E0, 0x5564, + 0xB0E1, 0x5538, 0xB0E2, 0x552E, 0xB0E3, 0x555C, 0xB0E4, 0x552C, + 0xB0E5, 0x5563, 0xB0E6, 0x5533, 0xB0E7, 0x5541, 0xB0E8, 0x5557, + 0xB0E9, 0x5708, 0xB0EA, 0x570B, 0xB0EB, 0x5709, 0xB0EC, 0x57DF, + 0xB0ED, 0x5805, 0xB0EE, 0x580A, 0xB0EF, 0x5806, 0xB0F0, 0x57E0, + 0xB0F1, 0x57E4, 0xB0F2, 0x57FA, 0xB0F3, 0x5802, 0xB0F4, 0x5835, + 0xB0F5, 0x57F7, 0xB0F6, 0x57F9, 0xB0F7, 0x5920, 0xB0F8, 0x5962, + 0xB0F9, 0x5A36, 0xB0FA, 0x5A41, 0xB0FB, 0x5A49, 0xB0FC, 0x5A66, + 0xB0FD, 0x5A6A, 0xB0FE, 0x5A40, 0xB140, 0x5A3C, 0xB141, 0x5A62, + 0xB142, 0x5A5A, 0xB143, 0x5A46, 0xB144, 0x5A4A, 0xB145, 0x5B70, + 0xB146, 0x5BC7, 0xB147, 0x5BC5, 0xB148, 0x5BC4, 0xB149, 0x5BC2, + 0xB14A, 0x5BBF, 0xB14B, 0x5BC6, 0xB14C, 0x5C09, 0xB14D, 0x5C08, + 0xB14E, 0x5C07, 0xB14F, 0x5C60, 0xB150, 0x5C5C, 0xB151, 0x5C5D, + 0xB152, 0x5D07, 0xB153, 0x5D06, 0xB154, 0x5D0E, 0xB155, 0x5D1B, + 0xB156, 0x5D16, 0xB157, 0x5D22, 0xB158, 0x5D11, 0xB159, 0x5D29, + 0xB15A, 0x5D14, 0xB15B, 0x5D19, 0xB15C, 0x5D24, 0xB15D, 0x5D27, + 0xB15E, 0x5D17, 0xB15F, 0x5DE2, 0xB160, 0x5E38, 0xB161, 0x5E36, + 0xB162, 0x5E33, 0xB163, 0x5E37, 0xB164, 0x5EB7, 0xB165, 0x5EB8, + 0xB166, 0x5EB6, 0xB167, 0x5EB5, 0xB168, 0x5EBE, 0xB169, 0x5F35, + 0xB16A, 0x5F37, 0xB16B, 0x5F57, 0xB16C, 0x5F6C, 0xB16D, 0x5F69, + 0xB16E, 0x5F6B, 0xB16F, 0x5F97, 0xB170, 0x5F99, 0xB171, 0x5F9E, + 0xB172, 0x5F98, 0xB173, 0x5FA1, 0xB174, 0x5FA0, 0xB175, 0x5F9C, + 0xB176, 0x607F, 0xB177, 0x60A3, 0xB178, 0x6089, 0xB179, 0x60A0, + 0xB17A, 0x60A8, 0xB17B, 0x60CB, 0xB17C, 0x60B4, 0xB17D, 0x60E6, + 0xB17E, 0x60BD, 0xB1A1, 0x60C5, 0xB1A2, 0x60BB, 0xB1A3, 0x60B5, + 0xB1A4, 0x60DC, 0xB1A5, 0x60BC, 0xB1A6, 0x60D8, 0xB1A7, 0x60D5, + 0xB1A8, 0x60C6, 0xB1A9, 0x60DF, 0xB1AA, 0x60B8, 0xB1AB, 0x60DA, + 0xB1AC, 0x60C7, 0xB1AD, 0x621A, 0xB1AE, 0x621B, 0xB1AF, 0x6248, + 0xB1B0, 0x63A0, 0xB1B1, 0x63A7, 0xB1B2, 0x6372, 0xB1B3, 0x6396, + 0xB1B4, 0x63A2, 0xB1B5, 0x63A5, 0xB1B6, 0x6377, 0xB1B7, 0x6367, + 0xB1B8, 0x6398, 0xB1B9, 0x63AA, 0xB1BA, 0x6371, 0xB1BB, 0x63A9, + 0xB1BC, 0x6389, 0xB1BD, 0x6383, 0xB1BE, 0x639B, 0xB1BF, 0x636B, + 0xB1C0, 0x63A8, 0xB1C1, 0x6384, 0xB1C2, 0x6388, 0xB1C3, 0x6399, + 0xB1C4, 0x63A1, 0xB1C5, 0x63AC, 0xB1C6, 0x6392, 0xB1C7, 0x638F, + 0xB1C8, 0x6380, 0xB1C9, 0x637B, 0xB1CA, 0x6369, 0xB1CB, 0x6368, + 0xB1CC, 0x637A, 0xB1CD, 0x655D, 0xB1CE, 0x6556, 0xB1CF, 0x6551, + 0xB1D0, 0x6559, 0xB1D1, 0x6557, 0xB1D2, 0x555F, 0xB1D3, 0x654F, + 0xB1D4, 0x6558, 0xB1D5, 0x6555, 0xB1D6, 0x6554, 0xB1D7, 0x659C, + 0xB1D8, 0x659B, 0xB1D9, 0x65AC, 0xB1DA, 0x65CF, 0xB1DB, 0x65CB, + 0xB1DC, 0x65CC, 0xB1DD, 0x65CE, 0xB1DE, 0x665D, 0xB1DF, 0x665A, + 0xB1E0, 0x6664, 0xB1E1, 0x6668, 0xB1E2, 0x6666, 0xB1E3, 0x665E, + 0xB1E4, 0x66F9, 0xB1E5, 0x52D7, 0xB1E6, 0x671B, 0xB1E7, 0x6881, + 0xB1E8, 0x68AF, 0xB1E9, 0x68A2, 0xB1EA, 0x6893, 0xB1EB, 0x68B5, + 0xB1EC, 0x687F, 0xB1ED, 0x6876, 0xB1EE, 0x68B1, 0xB1EF, 0x68A7, + 0xB1F0, 0x6897, 0xB1F1, 0x68B0, 0xB1F2, 0x6883, 0xB1F3, 0x68C4, + 0xB1F4, 0x68AD, 0xB1F5, 0x6886, 0xB1F6, 0x6885, 0xB1F7, 0x6894, + 0xB1F8, 0x689D, 0xB1F9, 0x68A8, 0xB1FA, 0x689F, 0xB1FB, 0x68A1, + 0xB1FC, 0x6882, 0xB1FD, 0x6B32, 0xB1FE, 0x6BBA, 0xB240, 0x6BEB, + 0xB241, 0x6BEC, 0xB242, 0x6C2B, 0xB243, 0x6D8E, 0xB244, 0x6DBC, + 0xB245, 0x6DF3, 0xB246, 0x6DD9, 0xB247, 0x6DB2, 0xB248, 0x6DE1, + 0xB249, 0x6DCC, 0xB24A, 0x6DE4, 0xB24B, 0x6DFB, 0xB24C, 0x6DFA, + 0xB24D, 0x6E05, 0xB24E, 0x6DC7, 0xB24F, 0x6DCB, 0xB250, 0x6DAF, + 0xB251, 0x6DD1, 0xB252, 0x6DAE, 0xB253, 0x6DDE, 0xB254, 0x6DF9, + 0xB255, 0x6DB8, 0xB256, 0x6DF7, 0xB257, 0x6DF5, 0xB258, 0x6DC5, + 0xB259, 0x6DD2, 0xB25A, 0x6E1A, 0xB25B, 0x6DB5, 0xB25C, 0x6DDA, + 0xB25D, 0x6DEB, 0xB25E, 0x6DD8, 0xB25F, 0x6DEA, 0xB260, 0x6DF1, + 0xB261, 0x6DEE, 0xB262, 0x6DE8, 0xB263, 0x6DC6, 0xB264, 0x6DC4, + 0xB265, 0x6DAA, 0xB266, 0x6DEC, 0xB267, 0x6DBF, 0xB268, 0x6DE6, + 0xB269, 0x70F9, 0xB26A, 0x7109, 0xB26B, 0x710A, 0xB26C, 0x70FD, + 0xB26D, 0x70EF, 0xB26E, 0x723D, 0xB26F, 0x727D, 0xB270, 0x7281, + 0xB271, 0x731C, 0xB272, 0x731B, 0xB273, 0x7316, 0xB274, 0x7313, + 0xB275, 0x7319, 0xB276, 0x7387, 0xB277, 0x7405, 0xB278, 0x740A, + 0xB279, 0x7403, 0xB27A, 0x7406, 0xB27B, 0x73FE, 0xB27C, 0x740D, + 0xB27D, 0x74E0, 0xB27E, 0x74F6, 0xB2A1, 0x74F7, 0xB2A2, 0x751C, + 0xB2A3, 0x7522, 0xB2A4, 0x7565, 0xB2A5, 0x7566, 0xB2A6, 0x7562, + 0xB2A7, 0x7570, 0xB2A8, 0x758F, 0xB2A9, 0x75D4, 0xB2AA, 0x75D5, + 0xB2AB, 0x75B5, 0xB2AC, 0x75CA, 0xB2AD, 0x75CD, 0xB2AE, 0x768E, + 0xB2AF, 0x76D4, 0xB2B0, 0x76D2, 0xB2B1, 0x76DB, 0xB2B2, 0x7737, + 0xB2B3, 0x773E, 0xB2B4, 0x773C, 0xB2B5, 0x7736, 0xB2B6, 0x7738, + 0xB2B7, 0x773A, 0xB2B8, 0x786B, 0xB2B9, 0x7843, 0xB2BA, 0x784E, + 0xB2BB, 0x7965, 0xB2BC, 0x7968, 0xB2BD, 0x796D, 0xB2BE, 0x79FB, + 0xB2BF, 0x7A92, 0xB2C0, 0x7A95, 0xB2C1, 0x7B20, 0xB2C2, 0x7B28, + 0xB2C3, 0x7B1B, 0xB2C4, 0x7B2C, 0xB2C5, 0x7B26, 0xB2C6, 0x7B19, + 0xB2C7, 0x7B1E, 0xB2C8, 0x7B2E, 0xB2C9, 0x7C92, 0xB2CA, 0x7C97, + 0xB2CB, 0x7C95, 0xB2CC, 0x7D46, 0xB2CD, 0x7D43, 0xB2CE, 0x7D71, + 0xB2CF, 0x7D2E, 0xB2D0, 0x7D39, 0xB2D1, 0x7D3C, 0xB2D2, 0x7D40, + 0xB2D3, 0x7D30, 0xB2D4, 0x7D33, 0xB2D5, 0x7D44, 0xB2D6, 0x7D2F, + 0xB2D7, 0x7D42, 0xB2D8, 0x7D32, 0xB2D9, 0x7D31, 0xB2DA, 0x7F3D, + 0xB2DB, 0x7F9E, 0xB2DC, 0x7F9A, 0xB2DD, 0x7FCC, 0xB2DE, 0x7FCE, + 0xB2DF, 0x7FD2, 0xB2E0, 0x801C, 0xB2E1, 0x804A, 0xB2E2, 0x8046, + 0xB2E3, 0x812F, 0xB2E4, 0x8116, 0xB2E5, 0x8123, 0xB2E6, 0x812B, + 0xB2E7, 0x8129, 0xB2E8, 0x8130, 0xB2E9, 0x8124, 0xB2EA, 0x8202, + 0xB2EB, 0x8235, 0xB2EC, 0x8237, 0xB2ED, 0x8236, 0xB2EE, 0x8239, + 0xB2EF, 0x838E, 0xB2F0, 0x839E, 0xB2F1, 0x8398, 0xB2F2, 0x8378, + 0xB2F3, 0x83A2, 0xB2F4, 0x8396, 0xB2F5, 0x83BD, 0xB2F6, 0x83AB, + 0xB2F7, 0x8392, 0xB2F8, 0x838A, 0xB2F9, 0x8393, 0xB2FA, 0x8389, + 0xB2FB, 0x83A0, 0xB2FC, 0x8377, 0xB2FD, 0x837B, 0xB2FE, 0x837C, + 0xB340, 0x8386, 0xB341, 0x83A7, 0xB342, 0x8655, 0xB343, 0x5F6A, + 0xB344, 0x86C7, 0xB345, 0x86C0, 0xB346, 0x86B6, 0xB347, 0x86C4, + 0xB348, 0x86B5, 0xB349, 0x86C6, 0xB34A, 0x86CB, 0xB34B, 0x86B1, + 0xB34C, 0x86AF, 0xB34D, 0x86C9, 0xB34E, 0x8853, 0xB34F, 0x889E, + 0xB350, 0x8888, 0xB351, 0x88AB, 0xB352, 0x8892, 0xB353, 0x8896, + 0xB354, 0x888D, 0xB355, 0x888B, 0xB356, 0x8993, 0xB357, 0x898F, + 0xB358, 0x8A2A, 0xB359, 0x8A1D, 0xB35A, 0x8A23, 0xB35B, 0x8A25, + 0xB35C, 0x8A31, 0xB35D, 0x8A2D, 0xB35E, 0x8A1F, 0xB35F, 0x8A1B, + 0xB360, 0x8A22, 0xB361, 0x8C49, 0xB362, 0x8C5A, 0xB363, 0x8CA9, + 0xB364, 0x8CAC, 0xB365, 0x8CAB, 0xB366, 0x8CA8, 0xB367, 0x8CAA, + 0xB368, 0x8CA7, 0xB369, 0x8D67, 0xB36A, 0x8D66, 0xB36B, 0x8DBE, + 0xB36C, 0x8DBA, 0xB36D, 0x8EDB, 0xB36E, 0x8EDF, 0xB36F, 0x9019, + 0xB370, 0x900D, 0xB371, 0x901A, 0xB372, 0x9017, 0xB373, 0x9023, + 0xB374, 0x901F, 0xB375, 0x901D, 0xB376, 0x9010, 0xB377, 0x9015, + 0xB378, 0x901E, 0xB379, 0x9020, 0xB37A, 0x900F, 0xB37B, 0x9022, + 0xB37C, 0x9016, 0xB37D, 0x901B, 0xB37E, 0x9014, 0xB3A1, 0x90E8, + 0xB3A2, 0x90ED, 0xB3A3, 0x90FD, 0xB3A4, 0x9157, 0xB3A5, 0x91CE, + 0xB3A6, 0x91F5, 0xB3A7, 0x91E6, 0xB3A8, 0x91E3, 0xB3A9, 0x91E7, + 0xB3AA, 0x91ED, 0xB3AB, 0x91E9, 0xB3AC, 0x9589, 0xB3AD, 0x966A, + 0xB3AE, 0x9675, 0xB3AF, 0x9673, 0xB3B0, 0x9678, 0xB3B1, 0x9670, + 0xB3B2, 0x9674, 0xB3B3, 0x9676, 0xB3B4, 0x9677, 0xB3B5, 0x966C, + 0xB3B6, 0x96C0, 0xB3B7, 0x96EA, 0xB3B8, 0x96E9, 0xB3B9, 0x7AE0, + 0xB3BA, 0x7ADF, 0xB3BB, 0x9802, 0xB3BC, 0x9803, 0xB3BD, 0x9B5A, + 0xB3BE, 0x9CE5, 0xB3BF, 0x9E75, 0xB3C0, 0x9E7F, 0xB3C1, 0x9EA5, + 0xB3C2, 0x9EBB, 0xB3C3, 0x50A2, 0xB3C4, 0x508D, 0xB3C5, 0x5085, + 0xB3C6, 0x5099, 0xB3C7, 0x5091, 0xB3C8, 0x5080, 0xB3C9, 0x5096, + 0xB3CA, 0x5098, 0xB3CB, 0x509A, 0xB3CC, 0x6700, 0xB3CD, 0x51F1, + 0xB3CE, 0x5272, 0xB3CF, 0x5274, 0xB3D0, 0x5275, 0xB3D1, 0x5269, + 0xB3D2, 0x52DE, 0xB3D3, 0x52DD, 0xB3D4, 0x52DB, 0xB3D5, 0x535A, + 0xB3D6, 0x53A5, 0xB3D7, 0x557B, 0xB3D8, 0x5580, 0xB3D9, 0x55A7, + 0xB3DA, 0x557C, 0xB3DB, 0x558A, 0xB3DC, 0x559D, 0xB3DD, 0x5598, + 0xB3DE, 0x5582, 0xB3DF, 0x559C, 0xB3E0, 0x55AA, 0xB3E1, 0x5594, + 0xB3E2, 0x5587, 0xB3E3, 0x558B, 0xB3E4, 0x5583, 0xB3E5, 0x55B3, + 0xB3E6, 0x55AE, 0xB3E7, 0x559F, 0xB3E8, 0x553E, 0xB3E9, 0x55B2, + 0xB3EA, 0x559A, 0xB3EB, 0x55BB, 0xB3EC, 0x55AC, 0xB3ED, 0x55B1, + 0xB3EE, 0x557E, 0xB3EF, 0x5589, 0xB3F0, 0x55AB, 0xB3F1, 0x5599, + 0xB3F2, 0x570D, 0xB3F3, 0x582F, 0xB3F4, 0x582A, 0xB3F5, 0x5834, + 0xB3F6, 0x5824, 0xB3F7, 0x5830, 0xB3F8, 0x5831, 0xB3F9, 0x5821, + 0xB3FA, 0x581D, 0xB3FB, 0x5820, 0xB3FC, 0x58F9, 0xB3FD, 0x58FA, + 0xB3FE, 0x5960, 0xB440, 0x5A77, 0xB441, 0x5A9A, 0xB442, 0x5A7F, + 0xB443, 0x5A92, 0xB444, 0x5A9B, 0xB445, 0x5AA7, 0xB446, 0x5B73, + 0xB447, 0x5B71, 0xB448, 0x5BD2, 0xB449, 0x5BCC, 0xB44A, 0x5BD3, + 0xB44B, 0x5BD0, 0xB44C, 0x5C0A, 0xB44D, 0x5C0B, 0xB44E, 0x5C31, + 0xB44F, 0x5D4C, 0xB450, 0x5D50, 0xB451, 0x5D34, 0xB452, 0x5D47, + 0xB453, 0x5DFD, 0xB454, 0x5E45, 0xB455, 0x5E3D, 0xB456, 0x5E40, + 0xB457, 0x5E43, 0xB458, 0x5E7E, 0xB459, 0x5ECA, 0xB45A, 0x5EC1, + 0xB45B, 0x5EC2, 0xB45C, 0x5EC4, 0xB45D, 0x5F3C, 0xB45E, 0x5F6D, + 0xB45F, 0x5FA9, 0xB460, 0x5FAA, 0xB461, 0x5FA8, 0xB462, 0x60D1, + 0xB463, 0x60E1, 0xB464, 0x60B2, 0xB465, 0x60B6, 0xB466, 0x60E0, + 0xB467, 0x611C, 0xB468, 0x6123, 0xB469, 0x60FA, 0xB46A, 0x6115, + 0xB46B, 0x60F0, 0xB46C, 0x60FB, 0xB46D, 0x60F4, 0xB46E, 0x6168, + 0xB46F, 0x60F1, 0xB470, 0x610E, 0xB471, 0x60F6, 0xB472, 0x6109, + 0xB473, 0x6100, 0xB474, 0x6112, 0xB475, 0x621F, 0xB476, 0x6249, + 0xB477, 0x63A3, 0xB478, 0x638C, 0xB479, 0x63CF, 0xB47A, 0x63C0, + 0xB47B, 0x63E9, 0xB47C, 0x63C9, 0xB47D, 0x63C6, 0xB47E, 0x63CD, + 0xB4A1, 0x63D2, 0xB4A2, 0x63E3, 0xB4A3, 0x63D0, 0xB4A4, 0x63E1, + 0xB4A5, 0x63D6, 0xB4A6, 0x63ED, 0xB4A7, 0x63EE, 0xB4A8, 0x6376, + 0xB4A9, 0x63F4, 0xB4AA, 0x63EA, 0xB4AB, 0x63DB, 0xB4AC, 0x6452, + 0xB4AD, 0x63DA, 0xB4AE, 0x63F9, 0xB4AF, 0x655E, 0xB4B0, 0x6566, + 0xB4B1, 0x6562, 0xB4B2, 0x6563, 0xB4B3, 0x6591, 0xB4B4, 0x6590, + 0xB4B5, 0x65AF, 0xB4B6, 0x666E, 0xB4B7, 0x6670, 0xB4B8, 0x6674, + 0xB4B9, 0x6676, 0xB4BA, 0x666F, 0xB4BB, 0x6691, 0xB4BC, 0x667A, + 0xB4BD, 0x667E, 0xB4BE, 0x6677, 0xB4BF, 0x66FE, 0xB4C0, 0x66FF, + 0xB4C1, 0x671F, 0xB4C2, 0x671D, 0xB4C3, 0x68FA, 0xB4C4, 0x68D5, + 0xB4C5, 0x68E0, 0xB4C6, 0x68D8, 0xB4C7, 0x68D7, 0xB4C8, 0x6905, + 0xB4C9, 0x68DF, 0xB4CA, 0x68F5, 0xB4CB, 0x68EE, 0xB4CC, 0x68E7, + 0xB4CD, 0x68F9, 0xB4CE, 0x68D2, 0xB4CF, 0x68F2, 0xB4D0, 0x68E3, + 0xB4D1, 0x68CB, 0xB4D2, 0x68CD, 0xB4D3, 0x690D, 0xB4D4, 0x6912, + 0xB4D5, 0x690E, 0xB4D6, 0x68C9, 0xB4D7, 0x68DA, 0xB4D8, 0x696E, + 0xB4D9, 0x68FB, 0xB4DA, 0x6B3E, 0xB4DB, 0x6B3A, 0xB4DC, 0x6B3D, + 0xB4DD, 0x6B98, 0xB4DE, 0x6B96, 0xB4DF, 0x6BBC, 0xB4E0, 0x6BEF, + 0xB4E1, 0x6C2E, 0xB4E2, 0x6C2F, 0xB4E3, 0x6C2C, 0xB4E4, 0x6E2F, + 0xB4E5, 0x6E38, 0xB4E6, 0x6E54, 0xB4E7, 0x6E21, 0xB4E8, 0x6E32, + 0xB4E9, 0x6E67, 0xB4EA, 0x6E4A, 0xB4EB, 0x6E20, 0xB4EC, 0x6E25, + 0xB4ED, 0x6E23, 0xB4EE, 0x6E1B, 0xB4EF, 0x6E5B, 0xB4F0, 0x6E58, + 0xB4F1, 0x6E24, 0xB4F2, 0x6E56, 0xB4F3, 0x6E6E, 0xB4F4, 0x6E2D, + 0xB4F5, 0x6E26, 0xB4F6, 0x6E6F, 0xB4F7, 0x6E34, 0xB4F8, 0x6E4D, + 0xB4F9, 0x6E3A, 0xB4FA, 0x6E2C, 0xB4FB, 0x6E43, 0xB4FC, 0x6E1D, + 0xB4FD, 0x6E3E, 0xB4FE, 0x6ECB, 0xB540, 0x6E89, 0xB541, 0x6E19, + 0xB542, 0x6E4E, 0xB543, 0x6E63, 0xB544, 0x6E44, 0xB545, 0x6E72, + 0xB546, 0x6E69, 0xB547, 0x6E5F, 0xB548, 0x7119, 0xB549, 0x711A, + 0xB54A, 0x7126, 0xB54B, 0x7130, 0xB54C, 0x7121, 0xB54D, 0x7136, + 0xB54E, 0x716E, 0xB54F, 0x711C, 0xB550, 0x724C, 0xB551, 0x7284, + 0xB552, 0x7280, 0xB553, 0x7336, 0xB554, 0x7325, 0xB555, 0x7334, + 0xB556, 0x7329, 0xB557, 0x743A, 0xB558, 0x742A, 0xB559, 0x7433, + 0xB55A, 0x7422, 0xB55B, 0x7425, 0xB55C, 0x7435, 0xB55D, 0x7436, + 0xB55E, 0x7434, 0xB55F, 0x742F, 0xB560, 0x741B, 0xB561, 0x7426, + 0xB562, 0x7428, 0xB563, 0x7525, 0xB564, 0x7526, 0xB565, 0x756B, + 0xB566, 0x756A, 0xB567, 0x75E2, 0xB568, 0x75DB, 0xB569, 0x75E3, + 0xB56A, 0x75D9, 0xB56B, 0x75D8, 0xB56C, 0x75DE, 0xB56D, 0x75E0, + 0xB56E, 0x767B, 0xB56F, 0x767C, 0xB570, 0x7696, 0xB571, 0x7693, + 0xB572, 0x76B4, 0xB573, 0x76DC, 0xB574, 0x774F, 0xB575, 0x77ED, + 0xB576, 0x785D, 0xB577, 0x786C, 0xB578, 0x786F, 0xB579, 0x7A0D, + 0xB57A, 0x7A08, 0xB57B, 0x7A0B, 0xB57C, 0x7A05, 0xB57D, 0x7A00, + 0xB57E, 0x7A98, 0xB5A1, 0x7A97, 0xB5A2, 0x7A96, 0xB5A3, 0x7AE5, + 0xB5A4, 0x7AE3, 0xB5A5, 0x7B49, 0xB5A6, 0x7B56, 0xB5A7, 0x7B46, + 0xB5A8, 0x7B50, 0xB5A9, 0x7B52, 0xB5AA, 0x7B54, 0xB5AB, 0x7B4D, + 0xB5AC, 0x7B4B, 0xB5AD, 0x7B4F, 0xB5AE, 0x7B51, 0xB5AF, 0x7C9F, + 0xB5B0, 0x7CA5, 0xB5B1, 0x7D5E, 0xB5B2, 0x7D50, 0xB5B3, 0x7D68, + 0xB5B4, 0x7D55, 0xB5B5, 0x7D2B, 0xB5B6, 0x7D6E, 0xB5B7, 0x7D72, + 0xB5B8, 0x7D61, 0xB5B9, 0x7D66, 0xB5BA, 0x7D62, 0xB5BB, 0x7D70, + 0xB5BC, 0x7D73, 0xB5BD, 0x5584, 0xB5BE, 0x7FD4, 0xB5BF, 0x7FD5, + 0xB5C0, 0x800B, 0xB5C1, 0x8052, 0xB5C2, 0x8085, 0xB5C3, 0x8155, + 0xB5C4, 0x8154, 0xB5C5, 0x814B, 0xB5C6, 0x8151, 0xB5C7, 0x814E, + 0xB5C8, 0x8139, 0xB5C9, 0x8146, 0xB5CA, 0x813E, 0xB5CB, 0x814C, + 0xB5CC, 0x8153, 0xB5CD, 0x8174, 0xB5CE, 0x8212, 0xB5CF, 0x821C, + 0xB5D0, 0x83E9, 0xB5D1, 0x8403, 0xB5D2, 0x83F8, 0xB5D3, 0x840D, + 0xB5D4, 0x83E0, 0xB5D5, 0x83C5, 0xB5D6, 0x840B, 0xB5D7, 0x83C1, + 0xB5D8, 0x83EF, 0xB5D9, 0x83F1, 0xB5DA, 0x83F4, 0xB5DB, 0x8457, + 0xB5DC, 0x840A, 0xB5DD, 0x83F0, 0xB5DE, 0x840C, 0xB5DF, 0x83CC, + 0xB5E0, 0x83FD, 0xB5E1, 0x83F2, 0xB5E2, 0x83CA, 0xB5E3, 0x8438, + 0xB5E4, 0x840E, 0xB5E5, 0x8404, 0xB5E6, 0x83DC, 0xB5E7, 0x8407, + 0xB5E8, 0x83D4, 0xB5E9, 0x83DF, 0xB5EA, 0x865B, 0xB5EB, 0x86DF, + 0xB5EC, 0x86D9, 0xB5ED, 0x86ED, 0xB5EE, 0x86D4, 0xB5EF, 0x86DB, + 0xB5F0, 0x86E4, 0xB5F1, 0x86D0, 0xB5F2, 0x86DE, 0xB5F3, 0x8857, + 0xB5F4, 0x88C1, 0xB5F5, 0x88C2, 0xB5F6, 0x88B1, 0xB5F7, 0x8983, + 0xB5F8, 0x8996, 0xB5F9, 0x8A3B, 0xB5FA, 0x8A60, 0xB5FB, 0x8A55, + 0xB5FC, 0x8A5E, 0xB5FD, 0x8A3C, 0xB5FE, 0x8A41, 0xB640, 0x8A54, + 0xB641, 0x8A5B, 0xB642, 0x8A50, 0xB643, 0x8A46, 0xB644, 0x8A34, + 0xB645, 0x8A3A, 0xB646, 0x8A36, 0xB647, 0x8A56, 0xB648, 0x8C61, + 0xB649, 0x8C82, 0xB64A, 0x8CAF, 0xB64B, 0x8CBC, 0xB64C, 0x8CB3, + 0xB64D, 0x8CBD, 0xB64E, 0x8CC1, 0xB64F, 0x8CBB, 0xB650, 0x8CC0, + 0xB651, 0x8CB4, 0xB652, 0x8CB7, 0xB653, 0x8CB6, 0xB654, 0x8CBF, + 0xB655, 0x8CB8, 0xB656, 0x8D8A, 0xB657, 0x8D85, 0xB658, 0x8D81, + 0xB659, 0x8DCE, 0xB65A, 0x8DDD, 0xB65B, 0x8DCB, 0xB65C, 0x8DDA, + 0xB65D, 0x8DD1, 0xB65E, 0x8DCC, 0xB65F, 0x8DDB, 0xB660, 0x8DC6, + 0xB661, 0x8EFB, 0xB662, 0x8EF8, 0xB663, 0x8EFC, 0xB664, 0x8F9C, + 0xB665, 0x902E, 0xB666, 0x9035, 0xB667, 0x9031, 0xB668, 0x9038, + 0xB669, 0x9032, 0xB66A, 0x9036, 0xB66B, 0x9102, 0xB66C, 0x90F5, + 0xB66D, 0x9109, 0xB66E, 0x90FE, 0xB66F, 0x9163, 0xB670, 0x9165, + 0xB671, 0x91CF, 0xB672, 0x9214, 0xB673, 0x9215, 0xB674, 0x9223, + 0xB675, 0x9209, 0xB676, 0x921E, 0xB677, 0x920D, 0xB678, 0x9210, + 0xB679, 0x9207, 0xB67A, 0x9211, 0xB67B, 0x9594, 0xB67C, 0x958F, + 0xB67D, 0x958B, 0xB67E, 0x9591, 0xB6A1, 0x9593, 0xB6A2, 0x9592, + 0xB6A3, 0x958E, 0xB6A4, 0x968A, 0xB6A5, 0x968E, 0xB6A6, 0x968B, + 0xB6A7, 0x967D, 0xB6A8, 0x9685, 0xB6A9, 0x9686, 0xB6AA, 0x968D, + 0xB6AB, 0x9672, 0xB6AC, 0x9684, 0xB6AD, 0x96C1, 0xB6AE, 0x96C5, + 0xB6AF, 0x96C4, 0xB6B0, 0x96C6, 0xB6B1, 0x96C7, 0xB6B2, 0x96EF, + 0xB6B3, 0x96F2, 0xB6B4, 0x97CC, 0xB6B5, 0x9805, 0xB6B6, 0x9806, + 0xB6B7, 0x9808, 0xB6B8, 0x98E7, 0xB6B9, 0x98EA, 0xB6BA, 0x98EF, + 0xB6BB, 0x98E9, 0xB6BC, 0x98F2, 0xB6BD, 0x98ED, 0xB6BE, 0x99AE, + 0xB6BF, 0x99AD, 0xB6C0, 0x9EC3, 0xB6C1, 0x9ECD, 0xB6C2, 0x9ED1, + 0xB6C3, 0x4E82, 0xB6C4, 0x50AD, 0xB6C5, 0x50B5, 0xB6C6, 0x50B2, + 0xB6C7, 0x50B3, 0xB6C8, 0x50C5, 0xB6C9, 0x50BE, 0xB6CA, 0x50AC, + 0xB6CB, 0x50B7, 0xB6CC, 0x50BB, 0xB6CD, 0x50AF, 0xB6CE, 0x50C7, + 0xB6CF, 0x527F, 0xB6D0, 0x5277, 0xB6D1, 0x527D, 0xB6D2, 0x52DF, + 0xB6D3, 0x52E6, 0xB6D4, 0x52E4, 0xB6D5, 0x52E2, 0xB6D6, 0x52E3, + 0xB6D7, 0x532F, 0xB6D8, 0x55DF, 0xB6D9, 0x55E8, 0xB6DA, 0x55D3, + 0xB6DB, 0x55E6, 0xB6DC, 0x55CE, 0xB6DD, 0x55DC, 0xB6DE, 0x55C7, + 0xB6DF, 0x55D1, 0xB6E0, 0x55E3, 0xB6E1, 0x55E4, 0xB6E2, 0x55EF, + 0xB6E3, 0x55DA, 0xB6E4, 0x55E1, 0xB6E5, 0x55C5, 0xB6E6, 0x55C6, + 0xB6E7, 0x55E5, 0xB6E8, 0x55C9, 0xB6E9, 0x5712, 0xB6EA, 0x5713, + 0xB6EB, 0x585E, 0xB6EC, 0x5851, 0xB6ED, 0x5858, 0xB6EE, 0x5857, + 0xB6EF, 0x585A, 0xB6F0, 0x5854, 0xB6F1, 0x586B, 0xB6F2, 0x584C, + 0xB6F3, 0x586D, 0xB6F4, 0x584A, 0xB6F5, 0x5862, 0xB6F6, 0x5852, + 0xB6F7, 0x584B, 0xB6F8, 0x5967, 0xB6F9, 0x5AC1, 0xB6FA, 0x5AC9, + 0xB6FB, 0x5ACC, 0xB6FC, 0x5ABE, 0xB6FD, 0x5ABD, 0xB6FE, 0x5ABC, + 0xB740, 0x5AB3, 0xB741, 0x5AC2, 0xB742, 0x5AB2, 0xB743, 0x5D69, + 0xB744, 0x5D6F, 0xB745, 0x5E4C, 0xB746, 0x5E79, 0xB747, 0x5EC9, + 0xB748, 0x5EC8, 0xB749, 0x5F12, 0xB74A, 0x5F59, 0xB74B, 0x5FAC, + 0xB74C, 0x5FAE, 0xB74D, 0x611A, 0xB74E, 0x610F, 0xB74F, 0x6148, + 0xB750, 0x611F, 0xB751, 0x60F3, 0xB752, 0x611B, 0xB753, 0x60F9, + 0xB754, 0x6101, 0xB755, 0x6108, 0xB756, 0x614E, 0xB757, 0x614C, + 0xB758, 0x6144, 0xB759, 0x614D, 0xB75A, 0x613E, 0xB75B, 0x6134, + 0xB75C, 0x6127, 0xB75D, 0x610D, 0xB75E, 0x6106, 0xB75F, 0x6137, + 0xB760, 0x6221, 0xB761, 0x6222, 0xB762, 0x6413, 0xB763, 0x643E, + 0xB764, 0x641E, 0xB765, 0x642A, 0xB766, 0x642D, 0xB767, 0x643D, + 0xB768, 0x642C, 0xB769, 0x640F, 0xB76A, 0x641C, 0xB76B, 0x6414, + 0xB76C, 0x640D, 0xB76D, 0x6436, 0xB76E, 0x6416, 0xB76F, 0x6417, + 0xB770, 0x6406, 0xB771, 0x656C, 0xB772, 0x659F, 0xB773, 0x65B0, + 0xB774, 0x6697, 0xB775, 0x6689, 0xB776, 0x6687, 0xB777, 0x6688, + 0xB778, 0x6696, 0xB779, 0x6684, 0xB77A, 0x6698, 0xB77B, 0x668D, + 0xB77C, 0x6703, 0xB77D, 0x6994, 0xB77E, 0x696D, 0xB7A1, 0x695A, + 0xB7A2, 0x6977, 0xB7A3, 0x6960, 0xB7A4, 0x6954, 0xB7A5, 0x6975, + 0xB7A6, 0x6930, 0xB7A7, 0x6982, 0xB7A8, 0x694A, 0xB7A9, 0x6968, + 0xB7AA, 0x696B, 0xB7AB, 0x695E, 0xB7AC, 0x6953, 0xB7AD, 0x6979, + 0xB7AE, 0x6986, 0xB7AF, 0x695D, 0xB7B0, 0x6963, 0xB7B1, 0x695B, + 0xB7B2, 0x6B47, 0xB7B3, 0x6B72, 0xB7B4, 0x6BC0, 0xB7B5, 0x6BBF, + 0xB7B6, 0x6BD3, 0xB7B7, 0x6BFD, 0xB7B8, 0x6EA2, 0xB7B9, 0x6EAF, + 0xB7BA, 0x6ED3, 0xB7BB, 0x6EB6, 0xB7BC, 0x6EC2, 0xB7BD, 0x6E90, + 0xB7BE, 0x6E9D, 0xB7BF, 0x6EC7, 0xB7C0, 0x6EC5, 0xB7C1, 0x6EA5, + 0xB7C2, 0x6E98, 0xB7C3, 0x6EBC, 0xB7C4, 0x6EBA, 0xB7C5, 0x6EAB, + 0xB7C6, 0x6ED1, 0xB7C7, 0x6E96, 0xB7C8, 0x6E9C, 0xB7C9, 0x6EC4, + 0xB7CA, 0x6ED4, 0xB7CB, 0x6EAA, 0xB7CC, 0x6EA7, 0xB7CD, 0x6EB4, + 0xB7CE, 0x714E, 0xB7CF, 0x7159, 0xB7D0, 0x7169, 0xB7D1, 0x7164, + 0xB7D2, 0x7149, 0xB7D3, 0x7167, 0xB7D4, 0x715C, 0xB7D5, 0x716C, + 0xB7D6, 0x7166, 0xB7D7, 0x714C, 0xB7D8, 0x7165, 0xB7D9, 0x715E, + 0xB7DA, 0x7146, 0xB7DB, 0x7168, 0xB7DC, 0x7156, 0xB7DD, 0x723A, + 0xB7DE, 0x7252, 0xB7DF, 0x7337, 0xB7E0, 0x7345, 0xB7E1, 0x733F, + 0xB7E2, 0x733E, 0xB7E3, 0x746F, 0xB7E4, 0x745A, 0xB7E5, 0x7455, + 0xB7E6, 0x745F, 0xB7E7, 0x745E, 0xB7E8, 0x7441, 0xB7E9, 0x743F, + 0xB7EA, 0x7459, 0xB7EB, 0x745B, 0xB7EC, 0x745C, 0xB7ED, 0x7576, + 0xB7EE, 0x7578, 0xB7EF, 0x7600, 0xB7F0, 0x75F0, 0xB7F1, 0x7601, + 0xB7F2, 0x75F2, 0xB7F3, 0x75F1, 0xB7F4, 0x75FA, 0xB7F5, 0x75FF, + 0xB7F6, 0x75F4, 0xB7F7, 0x75F3, 0xB7F8, 0x76DE, 0xB7F9, 0x76DF, + 0xB7FA, 0x775B, 0xB7FB, 0x776B, 0xB7FC, 0x7766, 0xB7FD, 0x775E, + 0xB7FE, 0x7763, 0xB840, 0x7779, 0xB841, 0x776A, 0xB842, 0x776C, + 0xB843, 0x775C, 0xB844, 0x7765, 0xB845, 0x7768, 0xB846, 0x7762, + 0xB847, 0x77EE, 0xB848, 0x788E, 0xB849, 0x78B0, 0xB84A, 0x7897, + 0xB84B, 0x7898, 0xB84C, 0x788C, 0xB84D, 0x7889, 0xB84E, 0x787C, + 0xB84F, 0x7891, 0xB850, 0x7893, 0xB851, 0x787F, 0xB852, 0x797A, + 0xB853, 0x797F, 0xB854, 0x7981, 0xB855, 0x842C, 0xB856, 0x79BD, + 0xB857, 0x7A1C, 0xB858, 0x7A1A, 0xB859, 0x7A20, 0xB85A, 0x7A14, + 0xB85B, 0x7A1F, 0xB85C, 0x7A1E, 0xB85D, 0x7A9F, 0xB85E, 0x7AA0, + 0xB85F, 0x7B77, 0xB860, 0x7BC0, 0xB861, 0x7B60, 0xB862, 0x7B6E, + 0xB863, 0x7B67, 0xB864, 0x7CB1, 0xB865, 0x7CB3, 0xB866, 0x7CB5, + 0xB867, 0x7D93, 0xB868, 0x7D79, 0xB869, 0x7D91, 0xB86A, 0x7D81, + 0xB86B, 0x7D8F, 0xB86C, 0x7D5B, 0xB86D, 0x7F6E, 0xB86E, 0x7F69, + 0xB86F, 0x7F6A, 0xB870, 0x7F72, 0xB871, 0x7FA9, 0xB872, 0x7FA8, + 0xB873, 0x7FA4, 0xB874, 0x8056, 0xB875, 0x8058, 0xB876, 0x8086, + 0xB877, 0x8084, 0xB878, 0x8171, 0xB879, 0x8170, 0xB87A, 0x8178, + 0xB87B, 0x8165, 0xB87C, 0x816E, 0xB87D, 0x8173, 0xB87E, 0x816B, + 0xB8A1, 0x8179, 0xB8A2, 0x817A, 0xB8A3, 0x8166, 0xB8A4, 0x8205, + 0xB8A5, 0x8247, 0xB8A6, 0x8482, 0xB8A7, 0x8477, 0xB8A8, 0x843D, + 0xB8A9, 0x8431, 0xB8AA, 0x8475, 0xB8AB, 0x8466, 0xB8AC, 0x846B, + 0xB8AD, 0x8449, 0xB8AE, 0x846C, 0xB8AF, 0x845B, 0xB8B0, 0x843C, + 0xB8B1, 0x8435, 0xB8B2, 0x8461, 0xB8B3, 0x8463, 0xB8B4, 0x8469, + 0xB8B5, 0x846D, 0xB8B6, 0x8446, 0xB8B7, 0x865E, 0xB8B8, 0x865C, + 0xB8B9, 0x865F, 0xB8BA, 0x86F9, 0xB8BB, 0x8713, 0xB8BC, 0x8708, + 0xB8BD, 0x8707, 0xB8BE, 0x8700, 0xB8BF, 0x86FE, 0xB8C0, 0x86FB, + 0xB8C1, 0x8702, 0xB8C2, 0x8703, 0xB8C3, 0x8706, 0xB8C4, 0x870A, + 0xB8C5, 0x8859, 0xB8C6, 0x88DF, 0xB8C7, 0x88D4, 0xB8C8, 0x88D9, + 0xB8C9, 0x88DC, 0xB8CA, 0x88D8, 0xB8CB, 0x88DD, 0xB8CC, 0x88E1, + 0xB8CD, 0x88CA, 0xB8CE, 0x88D5, 0xB8CF, 0x88D2, 0xB8D0, 0x899C, + 0xB8D1, 0x89E3, 0xB8D2, 0x8A6B, 0xB8D3, 0x8A72, 0xB8D4, 0x8A73, + 0xB8D5, 0x8A66, 0xB8D6, 0x8A69, 0xB8D7, 0x8A70, 0xB8D8, 0x8A87, + 0xB8D9, 0x8A7C, 0xB8DA, 0x8A63, 0xB8DB, 0x8AA0, 0xB8DC, 0x8A71, + 0xB8DD, 0x8A85, 0xB8DE, 0x8A6D, 0xB8DF, 0x8A62, 0xB8E0, 0x8A6E, + 0xB8E1, 0x8A6C, 0xB8E2, 0x8A79, 0xB8E3, 0x8A7B, 0xB8E4, 0x8A3E, + 0xB8E5, 0x8A68, 0xB8E6, 0x8C62, 0xB8E7, 0x8C8A, 0xB8E8, 0x8C89, + 0xB8E9, 0x8CCA, 0xB8EA, 0x8CC7, 0xB8EB, 0x8CC8, 0xB8EC, 0x8CC4, + 0xB8ED, 0x8CB2, 0xB8EE, 0x8CC3, 0xB8EF, 0x8CC2, 0xB8F0, 0x8CC5, + 0xB8F1, 0x8DE1, 0xB8F2, 0x8DDF, 0xB8F3, 0x8DE8, 0xB8F4, 0x8DEF, + 0xB8F5, 0x8DF3, 0xB8F6, 0x8DFA, 0xB8F7, 0x8DEA, 0xB8F8, 0x8DE4, + 0xB8F9, 0x8DE6, 0xB8FA, 0x8EB2, 0xB8FB, 0x8F03, 0xB8FC, 0x8F09, + 0xB8FD, 0x8EFE, 0xB8FE, 0x8F0A, 0xB940, 0x8F9F, 0xB941, 0x8FB2, + 0xB942, 0x904B, 0xB943, 0x904A, 0xB944, 0x9053, 0xB945, 0x9042, + 0xB946, 0x9054, 0xB947, 0x903C, 0xB948, 0x9055, 0xB949, 0x9050, + 0xB94A, 0x9047, 0xB94B, 0x904F, 0xB94C, 0x904E, 0xB94D, 0x904D, + 0xB94E, 0x9051, 0xB94F, 0x903E, 0xB950, 0x9041, 0xB951, 0x9112, + 0xB952, 0x9117, 0xB953, 0x916C, 0xB954, 0x916A, 0xB955, 0x9169, + 0xB956, 0x91C9, 0xB957, 0x9237, 0xB958, 0x9257, 0xB959, 0x9238, + 0xB95A, 0x923D, 0xB95B, 0x9240, 0xB95C, 0x923E, 0xB95D, 0x925B, + 0xB95E, 0x924B, 0xB95F, 0x9264, 0xB960, 0x9251, 0xB961, 0x9234, + 0xB962, 0x9249, 0xB963, 0x924D, 0xB964, 0x9245, 0xB965, 0x9239, + 0xB966, 0x923F, 0xB967, 0x925A, 0xB968, 0x9598, 0xB969, 0x9698, + 0xB96A, 0x9694, 0xB96B, 0x9695, 0xB96C, 0x96CD, 0xB96D, 0x96CB, + 0xB96E, 0x96C9, 0xB96F, 0x96CA, 0xB970, 0x96F7, 0xB971, 0x96FB, + 0xB972, 0x96F9, 0xB973, 0x96F6, 0xB974, 0x9756, 0xB975, 0x9774, + 0xB976, 0x9776, 0xB977, 0x9810, 0xB978, 0x9811, 0xB979, 0x9813, + 0xB97A, 0x980A, 0xB97B, 0x9812, 0xB97C, 0x980C, 0xB97D, 0x98FC, + 0xB97E, 0x98F4, 0xB9A1, 0x98FD, 0xB9A2, 0x98FE, 0xB9A3, 0x99B3, + 0xB9A4, 0x99B1, 0xB9A5, 0x99B4, 0xB9A6, 0x9AE1, 0xB9A7, 0x9CE9, + 0xB9A8, 0x9E82, 0xB9A9, 0x9F0E, 0xB9AA, 0x9F13, 0xB9AB, 0x9F20, + 0xB9AC, 0x50E7, 0xB9AD, 0x50EE, 0xB9AE, 0x50E5, 0xB9AF, 0x50D6, + 0xB9B0, 0x50ED, 0xB9B1, 0x50DA, 0xB9B2, 0x50D5, 0xB9B3, 0x50CF, + 0xB9B4, 0x50D1, 0xB9B5, 0x50F1, 0xB9B6, 0x50CE, 0xB9B7, 0x50E9, + 0xB9B8, 0x5162, 0xB9B9, 0x51F3, 0xB9BA, 0x5283, 0xB9BB, 0x5282, + 0xB9BC, 0x5331, 0xB9BD, 0x53AD, 0xB9BE, 0x55FE, 0xB9BF, 0x5600, + 0xB9C0, 0x561B, 0xB9C1, 0x5617, 0xB9C2, 0x55FD, 0xB9C3, 0x5614, + 0xB9C4, 0x5606, 0xB9C5, 0x5609, 0xB9C6, 0x560D, 0xB9C7, 0x560E, + 0xB9C8, 0x55F7, 0xB9C9, 0x5616, 0xB9CA, 0x561F, 0xB9CB, 0x5608, + 0xB9CC, 0x5610, 0xB9CD, 0x55F6, 0xB9CE, 0x5718, 0xB9CF, 0x5716, + 0xB9D0, 0x5875, 0xB9D1, 0x587E, 0xB9D2, 0x5883, 0xB9D3, 0x5893, + 0xB9D4, 0x588A, 0xB9D5, 0x5879, 0xB9D6, 0x5885, 0xB9D7, 0x587D, + 0xB9D8, 0x58FD, 0xB9D9, 0x5925, 0xB9DA, 0x5922, 0xB9DB, 0x5924, + 0xB9DC, 0x596A, 0xB9DD, 0x5969, 0xB9DE, 0x5AE1, 0xB9DF, 0x5AE6, + 0xB9E0, 0x5AE9, 0xB9E1, 0x5AD7, 0xB9E2, 0x5AD6, 0xB9E3, 0x5AD8, + 0xB9E4, 0x5AE3, 0xB9E5, 0x5B75, 0xB9E6, 0x5BDE, 0xB9E7, 0x5BE7, + 0xB9E8, 0x5BE1, 0xB9E9, 0x5BE5, 0xB9EA, 0x5BE6, 0xB9EB, 0x5BE8, + 0xB9EC, 0x5BE2, 0xB9ED, 0x5BE4, 0xB9EE, 0x5BDF, 0xB9EF, 0x5C0D, + 0xB9F0, 0x5C62, 0xB9F1, 0x5D84, 0xB9F2, 0x5D87, 0xB9F3, 0x5E5B, + 0xB9F4, 0x5E63, 0xB9F5, 0x5E55, 0xB9F6, 0x5E57, 0xB9F7, 0x5E54, + 0xB9F8, 0x5ED3, 0xB9F9, 0x5ED6, 0xB9FA, 0x5F0A, 0xB9FB, 0x5F46, + 0xB9FC, 0x5F70, 0xB9FD, 0x5FB9, 0xB9FE, 0x6147, 0xBA40, 0x613F, + 0xBA41, 0x614B, 0xBA42, 0x6177, 0xBA43, 0x6162, 0xBA44, 0x6163, + 0xBA45, 0x615F, 0xBA46, 0x615A, 0xBA47, 0x6158, 0xBA48, 0x6175, + 0xBA49, 0x622A, 0xBA4A, 0x6487, 0xBA4B, 0x6458, 0xBA4C, 0x6454, + 0xBA4D, 0x64A4, 0xBA4E, 0x6478, 0xBA4F, 0x645F, 0xBA50, 0x647A, + 0xBA51, 0x6451, 0xBA52, 0x6467, 0xBA53, 0x6434, 0xBA54, 0x646D, + 0xBA55, 0x647B, 0xBA56, 0x6572, 0xBA57, 0x65A1, 0xBA58, 0x65D7, + 0xBA59, 0x65D6, 0xBA5A, 0x66A2, 0xBA5B, 0x66A8, 0xBA5C, 0x669D, + 0xBA5D, 0x699C, 0xBA5E, 0x69A8, 0xBA5F, 0x6995, 0xBA60, 0x69C1, + 0xBA61, 0x69AE, 0xBA62, 0x69D3, 0xBA63, 0x69CB, 0xBA64, 0x699B, + 0xBA65, 0x69B7, 0xBA66, 0x69BB, 0xBA67, 0x69AB, 0xBA68, 0x69B4, + 0xBA69, 0x69D0, 0xBA6A, 0x69CD, 0xBA6B, 0x69AD, 0xBA6C, 0x69CC, + 0xBA6D, 0x69A6, 0xBA6E, 0x69C3, 0xBA6F, 0x69A3, 0xBA70, 0x6B49, + 0xBA71, 0x6B4C, 0xBA72, 0x6C33, 0xBA73, 0x6F33, 0xBA74, 0x6F14, + 0xBA75, 0x6EFE, 0xBA76, 0x6F13, 0xBA77, 0x6EF4, 0xBA78, 0x6F29, + 0xBA79, 0x6F3E, 0xBA7A, 0x6F20, 0xBA7B, 0x6F2C, 0xBA7C, 0x6F0F, + 0xBA7D, 0x6F02, 0xBA7E, 0x6F22, 0xBAA1, 0x6EFF, 0xBAA2, 0x6EEF, + 0xBAA3, 0x6F06, 0xBAA4, 0x6F31, 0xBAA5, 0x6F38, 0xBAA6, 0x6F32, + 0xBAA7, 0x6F23, 0xBAA8, 0x6F15, 0xBAA9, 0x6F2B, 0xBAAA, 0x6F2F, + 0xBAAB, 0x6F88, 0xBAAC, 0x6F2A, 0xBAAD, 0x6EEC, 0xBAAE, 0x6F01, + 0xBAAF, 0x6EF2, 0xBAB0, 0x6ECC, 0xBAB1, 0x6EF7, 0xBAB2, 0x7194, + 0xBAB3, 0x7199, 0xBAB4, 0x717D, 0xBAB5, 0x718A, 0xBAB6, 0x7184, + 0xBAB7, 0x7192, 0xBAB8, 0x723E, 0xBAB9, 0x7292, 0xBABA, 0x7296, + 0xBABB, 0x7344, 0xBABC, 0x7350, 0xBABD, 0x7464, 0xBABE, 0x7463, + 0xBABF, 0x746A, 0xBAC0, 0x7470, 0xBAC1, 0x746D, 0xBAC2, 0x7504, + 0xBAC3, 0x7591, 0xBAC4, 0x7627, 0xBAC5, 0x760D, 0xBAC6, 0x760B, + 0xBAC7, 0x7609, 0xBAC8, 0x7613, 0xBAC9, 0x76E1, 0xBACA, 0x76E3, + 0xBACB, 0x7784, 0xBACC, 0x777D, 0xBACD, 0x777F, 0xBACE, 0x7761, + 0xBACF, 0x78C1, 0xBAD0, 0x789F, 0xBAD1, 0x78A7, 0xBAD2, 0x78B3, + 0xBAD3, 0x78A9, 0xBAD4, 0x78A3, 0xBAD5, 0x798E, 0xBAD6, 0x798F, + 0xBAD7, 0x798D, 0xBAD8, 0x7A2E, 0xBAD9, 0x7A31, 0xBADA, 0x7AAA, + 0xBADB, 0x7AA9, 0xBADC, 0x7AED, 0xBADD, 0x7AEF, 0xBADE, 0x7BA1, + 0xBADF, 0x7B95, 0xBAE0, 0x7B8B, 0xBAE1, 0x7B75, 0xBAE2, 0x7B97, + 0xBAE3, 0x7B9D, 0xBAE4, 0x7B94, 0xBAE5, 0x7B8F, 0xBAE6, 0x7BB8, + 0xBAE7, 0x7B87, 0xBAE8, 0x7B84, 0xBAE9, 0x7CB9, 0xBAEA, 0x7CBD, + 0xBAEB, 0x7CBE, 0xBAEC, 0x7DBB, 0xBAED, 0x7DB0, 0xBAEE, 0x7D9C, + 0xBAEF, 0x7DBD, 0xBAF0, 0x7DBE, 0xBAF1, 0x7DA0, 0xBAF2, 0x7DCA, + 0xBAF3, 0x7DB4, 0xBAF4, 0x7DB2, 0xBAF5, 0x7DB1, 0xBAF6, 0x7DBA, + 0xBAF7, 0x7DA2, 0xBAF8, 0x7DBF, 0xBAF9, 0x7DB5, 0xBAFA, 0x7DB8, + 0xBAFB, 0x7DAD, 0xBAFC, 0x7DD2, 0xBAFD, 0x7DC7, 0xBAFE, 0x7DAC, + 0xBB40, 0x7F70, 0xBB41, 0x7FE0, 0xBB42, 0x7FE1, 0xBB43, 0x7FDF, + 0xBB44, 0x805E, 0xBB45, 0x805A, 0xBB46, 0x8087, 0xBB47, 0x8150, + 0xBB48, 0x8180, 0xBB49, 0x818F, 0xBB4A, 0x8188, 0xBB4B, 0x818A, + 0xBB4C, 0x817F, 0xBB4D, 0x8182, 0xBB4E, 0x81E7, 0xBB4F, 0x81FA, + 0xBB50, 0x8207, 0xBB51, 0x8214, 0xBB52, 0x821E, 0xBB53, 0x824B, + 0xBB54, 0x84C9, 0xBB55, 0x84BF, 0xBB56, 0x84C6, 0xBB57, 0x84C4, + 0xBB58, 0x8499, 0xBB59, 0x849E, 0xBB5A, 0x84B2, 0xBB5B, 0x849C, + 0xBB5C, 0x84CB, 0xBB5D, 0x84B8, 0xBB5E, 0x84C0, 0xBB5F, 0x84D3, + 0xBB60, 0x8490, 0xBB61, 0x84BC, 0xBB62, 0x84D1, 0xBB63, 0x84CA, + 0xBB64, 0x873F, 0xBB65, 0x871C, 0xBB66, 0x873B, 0xBB67, 0x8722, + 0xBB68, 0x8725, 0xBB69, 0x8734, 0xBB6A, 0x8718, 0xBB6B, 0x8755, + 0xBB6C, 0x8737, 0xBB6D, 0x8729, 0xBB6E, 0x88F3, 0xBB6F, 0x8902, + 0xBB70, 0x88F4, 0xBB71, 0x88F9, 0xBB72, 0x88F8, 0xBB73, 0x88FD, + 0xBB74, 0x88E8, 0xBB75, 0x891A, 0xBB76, 0x88EF, 0xBB77, 0x8AA6, + 0xBB78, 0x8A8C, 0xBB79, 0x8A9E, 0xBB7A, 0x8AA3, 0xBB7B, 0x8A8D, + 0xBB7C, 0x8AA1, 0xBB7D, 0x8A93, 0xBB7E, 0x8AA4, 0xBBA1, 0x8AAA, + 0xBBA2, 0x8AA5, 0xBBA3, 0x8AA8, 0xBBA4, 0x8A98, 0xBBA5, 0x8A91, + 0xBBA6, 0x8A9A, 0xBBA7, 0x8AA7, 0xBBA8, 0x8C6A, 0xBBA9, 0x8C8D, + 0xBBAA, 0x8C8C, 0xBBAB, 0x8CD3, 0xBBAC, 0x8CD1, 0xBBAD, 0x8CD2, + 0xBBAE, 0x8D6B, 0xBBAF, 0x8D99, 0xBBB0, 0x8D95, 0xBBB1, 0x8DFC, + 0xBBB2, 0x8F14, 0xBBB3, 0x8F12, 0xBBB4, 0x8F15, 0xBBB5, 0x8F13, + 0xBBB6, 0x8FA3, 0xBBB7, 0x9060, 0xBBB8, 0x9058, 0xBBB9, 0x905C, + 0xBBBA, 0x9063, 0xBBBB, 0x9059, 0xBBBC, 0x905E, 0xBBBD, 0x9062, + 0xBBBE, 0x905D, 0xBBBF, 0x905B, 0xBBC0, 0x9119, 0xBBC1, 0x9118, + 0xBBC2, 0x911E, 0xBBC3, 0x9175, 0xBBC4, 0x9178, 0xBBC5, 0x9177, + 0xBBC6, 0x9174, 0xBBC7, 0x9278, 0xBBC8, 0x9280, 0xBBC9, 0x9285, + 0xBBCA, 0x9298, 0xBBCB, 0x9296, 0xBBCC, 0x927B, 0xBBCD, 0x9293, + 0xBBCE, 0x929C, 0xBBCF, 0x92A8, 0xBBD0, 0x927C, 0xBBD1, 0x9291, + 0xBBD2, 0x95A1, 0xBBD3, 0x95A8, 0xBBD4, 0x95A9, 0xBBD5, 0x95A3, + 0xBBD6, 0x95A5, 0xBBD7, 0x95A4, 0xBBD8, 0x9699, 0xBBD9, 0x969C, + 0xBBDA, 0x969B, 0xBBDB, 0x96CC, 0xBBDC, 0x96D2, 0xBBDD, 0x9700, + 0xBBDE, 0x977C, 0xBBDF, 0x9785, 0xBBE0, 0x97F6, 0xBBE1, 0x9817, + 0xBBE2, 0x9818, 0xBBE3, 0x98AF, 0xBBE4, 0x98B1, 0xBBE5, 0x9903, + 0xBBE6, 0x9905, 0xBBE7, 0x990C, 0xBBE8, 0x9909, 0xBBE9, 0x99C1, + 0xBBEA, 0x9AAF, 0xBBEB, 0x9AB0, 0xBBEC, 0x9AE6, 0xBBED, 0x9B41, + 0xBBEE, 0x9B42, 0xBBEF, 0x9CF4, 0xBBF0, 0x9CF6, 0xBBF1, 0x9CF3, + 0xBBF2, 0x9EBC, 0xBBF3, 0x9F3B, 0xBBF4, 0x9F4A, 0xBBF5, 0x5104, + 0xBBF6, 0x5100, 0xBBF7, 0x50FB, 0xBBF8, 0x50F5, 0xBBF9, 0x50F9, + 0xBBFA, 0x5102, 0xBBFB, 0x5108, 0xBBFC, 0x5109, 0xBBFD, 0x5105, + 0xBBFE, 0x51DC, 0xBC40, 0x5287, 0xBC41, 0x5288, 0xBC42, 0x5289, + 0xBC43, 0x528D, 0xBC44, 0x528A, 0xBC45, 0x52F0, 0xBC46, 0x53B2, + 0xBC47, 0x562E, 0xBC48, 0x563B, 0xBC49, 0x5639, 0xBC4A, 0x5632, + 0xBC4B, 0x563F, 0xBC4C, 0x5634, 0xBC4D, 0x5629, 0xBC4E, 0x5653, + 0xBC4F, 0x564E, 0xBC50, 0x5657, 0xBC51, 0x5674, 0xBC52, 0x5636, + 0xBC53, 0x562F, 0xBC54, 0x5630, 0xBC55, 0x5880, 0xBC56, 0x589F, + 0xBC57, 0x589E, 0xBC58, 0x58B3, 0xBC59, 0x589C, 0xBC5A, 0x58AE, + 0xBC5B, 0x58A9, 0xBC5C, 0x58A6, 0xBC5D, 0x596D, 0xBC5E, 0x5B09, + 0xBC5F, 0x5AFB, 0xBC60, 0x5B0B, 0xBC61, 0x5AF5, 0xBC62, 0x5B0C, + 0xBC63, 0x5B08, 0xBC64, 0x5BEE, 0xBC65, 0x5BEC, 0xBC66, 0x5BE9, + 0xBC67, 0x5BEB, 0xBC68, 0x5C64, 0xBC69, 0x5C65, 0xBC6A, 0x5D9D, + 0xBC6B, 0x5D94, 0xBC6C, 0x5E62, 0xBC6D, 0x5E5F, 0xBC6E, 0x5E61, + 0xBC6F, 0x5EE2, 0xBC70, 0x5EDA, 0xBC71, 0x5EDF, 0xBC72, 0x5EDD, + 0xBC73, 0x5EE3, 0xBC74, 0x5EE0, 0xBC75, 0x5F48, 0xBC76, 0x5F71, + 0xBC77, 0x5FB7, 0xBC78, 0x5FB5, 0xBC79, 0x6176, 0xBC7A, 0x6167, + 0xBC7B, 0x616E, 0xBC7C, 0x615D, 0xBC7D, 0x6155, 0xBC7E, 0x6182, + 0xBCA1, 0x617C, 0xBCA2, 0x6170, 0xBCA3, 0x616B, 0xBCA4, 0x617E, + 0xBCA5, 0x61A7, 0xBCA6, 0x6190, 0xBCA7, 0x61AB, 0xBCA8, 0x618E, + 0xBCA9, 0x61AC, 0xBCAA, 0x619A, 0xBCAB, 0x61A4, 0xBCAC, 0x6194, + 0xBCAD, 0x61AE, 0xBCAE, 0x622E, 0xBCAF, 0x6469, 0xBCB0, 0x646F, + 0xBCB1, 0x6479, 0xBCB2, 0x649E, 0xBCB3, 0x64B2, 0xBCB4, 0x6488, + 0xBCB5, 0x6490, 0xBCB6, 0x64B0, 0xBCB7, 0x64A5, 0xBCB8, 0x6493, + 0xBCB9, 0x6495, 0xBCBA, 0x64A9, 0xBCBB, 0x6492, 0xBCBC, 0x64AE, + 0xBCBD, 0x64AD, 0xBCBE, 0x64AB, 0xBCBF, 0x649A, 0xBCC0, 0x64AC, + 0xBCC1, 0x6499, 0xBCC2, 0x64A2, 0xBCC3, 0x64B3, 0xBCC4, 0x6575, + 0xBCC5, 0x6577, 0xBCC6, 0x6578, 0xBCC7, 0x66AE, 0xBCC8, 0x66AB, + 0xBCC9, 0x66B4, 0xBCCA, 0x66B1, 0xBCCB, 0x6A23, 0xBCCC, 0x6A1F, + 0xBCCD, 0x69E8, 0xBCCE, 0x6A01, 0xBCCF, 0x6A1E, 0xBCD0, 0x6A19, + 0xBCD1, 0x69FD, 0xBCD2, 0x6A21, 0xBCD3, 0x6A13, 0xBCD4, 0x6A0A, + 0xBCD5, 0x69F3, 0xBCD6, 0x6A02, 0xBCD7, 0x6A05, 0xBCD8, 0x69ED, + 0xBCD9, 0x6A11, 0xBCDA, 0x6B50, 0xBCDB, 0x6B4E, 0xBCDC, 0x6BA4, + 0xBCDD, 0x6BC5, 0xBCDE, 0x6BC6, 0xBCDF, 0x6F3F, 0xBCE0, 0x6F7C, + 0xBCE1, 0x6F84, 0xBCE2, 0x6F51, 0xBCE3, 0x6F66, 0xBCE4, 0x6F54, + 0xBCE5, 0x6F86, 0xBCE6, 0x6F6D, 0xBCE7, 0x6F5B, 0xBCE8, 0x6F78, + 0xBCE9, 0x6F6E, 0xBCEA, 0x6F8E, 0xBCEB, 0x6F7A, 0xBCEC, 0x6F70, + 0xBCED, 0x6F64, 0xBCEE, 0x6F97, 0xBCEF, 0x6F58, 0xBCF0, 0x6ED5, + 0xBCF1, 0x6F6F, 0xBCF2, 0x6F60, 0xBCF3, 0x6F5F, 0xBCF4, 0x719F, + 0xBCF5, 0x71AC, 0xBCF6, 0x71B1, 0xBCF7, 0x71A8, 0xBCF8, 0x7256, + 0xBCF9, 0x729B, 0xBCFA, 0x734E, 0xBCFB, 0x7357, 0xBCFC, 0x7469, + 0xBCFD, 0x748B, 0xBCFE, 0x7483, 0xBD40, 0x747E, 0xBD41, 0x7480, + 0xBD42, 0x757F, 0xBD43, 0x7620, 0xBD44, 0x7629, 0xBD45, 0x761F, + 0xBD46, 0x7624, 0xBD47, 0x7626, 0xBD48, 0x7621, 0xBD49, 0x7622, + 0xBD4A, 0x769A, 0xBD4B, 0x76BA, 0xBD4C, 0x76E4, 0xBD4D, 0x778E, + 0xBD4E, 0x7787, 0xBD4F, 0x778C, 0xBD50, 0x7791, 0xBD51, 0x778B, + 0xBD52, 0x78CB, 0xBD53, 0x78C5, 0xBD54, 0x78BA, 0xBD55, 0x78CA, + 0xBD56, 0x78BE, 0xBD57, 0x78D5, 0xBD58, 0x78BC, 0xBD59, 0x78D0, + 0xBD5A, 0x7A3F, 0xBD5B, 0x7A3C, 0xBD5C, 0x7A40, 0xBD5D, 0x7A3D, + 0xBD5E, 0x7A37, 0xBD5F, 0x7A3B, 0xBD60, 0x7AAF, 0xBD61, 0x7AAE, + 0xBD62, 0x7BAD, 0xBD63, 0x7BB1, 0xBD64, 0x7BC4, 0xBD65, 0x7BB4, + 0xBD66, 0x7BC6, 0xBD67, 0x7BC7, 0xBD68, 0x7BC1, 0xBD69, 0x7BA0, + 0xBD6A, 0x7BCC, 0xBD6B, 0x7CCA, 0xBD6C, 0x7DE0, 0xBD6D, 0x7DF4, + 0xBD6E, 0x7DEF, 0xBD6F, 0x7DFB, 0xBD70, 0x7DD8, 0xBD71, 0x7DEC, + 0xBD72, 0x7DDD, 0xBD73, 0x7DE8, 0xBD74, 0x7DE3, 0xBD75, 0x7DDA, + 0xBD76, 0x7DDE, 0xBD77, 0x7DE9, 0xBD78, 0x7D9E, 0xBD79, 0x7DD9, + 0xBD7A, 0x7DF2, 0xBD7B, 0x7DF9, 0xBD7C, 0x7F75, 0xBD7D, 0x7F77, + 0xBD7E, 0x7FAF, 0xBDA1, 0x7FE9, 0xBDA2, 0x8026, 0xBDA3, 0x819B, + 0xBDA4, 0x819C, 0xBDA5, 0x819D, 0xBDA6, 0x81A0, 0xBDA7, 0x819A, + 0xBDA8, 0x8198, 0xBDA9, 0x8517, 0xBDAA, 0x853D, 0xBDAB, 0x851A, + 0xBDAC, 0x84EE, 0xBDAD, 0x852C, 0xBDAE, 0x852D, 0xBDAF, 0x8513, + 0xBDB0, 0x8511, 0xBDB1, 0x8523, 0xBDB2, 0x8521, 0xBDB3, 0x8514, + 0xBDB4, 0x84EC, 0xBDB5, 0x8525, 0xBDB6, 0x84FF, 0xBDB7, 0x8506, + 0xBDB8, 0x8782, 0xBDB9, 0x8774, 0xBDBA, 0x8776, 0xBDBB, 0x8760, + 0xBDBC, 0x8766, 0xBDBD, 0x8778, 0xBDBE, 0x8768, 0xBDBF, 0x8759, + 0xBDC0, 0x8757, 0xBDC1, 0x874C, 0xBDC2, 0x8753, 0xBDC3, 0x885B, + 0xBDC4, 0x885D, 0xBDC5, 0x8910, 0xBDC6, 0x8907, 0xBDC7, 0x8912, + 0xBDC8, 0x8913, 0xBDC9, 0x8915, 0xBDCA, 0x890A, 0xBDCB, 0x8ABC, + 0xBDCC, 0x8AD2, 0xBDCD, 0x8AC7, 0xBDCE, 0x8AC4, 0xBDCF, 0x8A95, + 0xBDD0, 0x8ACB, 0xBDD1, 0x8AF8, 0xBDD2, 0x8AB2, 0xBDD3, 0x8AC9, + 0xBDD4, 0x8AC2, 0xBDD5, 0x8ABF, 0xBDD6, 0x8AB0, 0xBDD7, 0x8AD6, + 0xBDD8, 0x8ACD, 0xBDD9, 0x8AB6, 0xBDDA, 0x8AB9, 0xBDDB, 0x8ADB, + 0xBDDC, 0x8C4C, 0xBDDD, 0x8C4E, 0xBDDE, 0x8C6C, 0xBDDF, 0x8CE0, + 0xBDE0, 0x8CDE, 0xBDE1, 0x8CE6, 0xBDE2, 0x8CE4, 0xBDE3, 0x8CEC, + 0xBDE4, 0x8CED, 0xBDE5, 0x8CE2, 0xBDE6, 0x8CE3, 0xBDE7, 0x8CDC, + 0xBDE8, 0x8CEA, 0xBDE9, 0x8CE1, 0xBDEA, 0x8D6D, 0xBDEB, 0x8D9F, + 0xBDEC, 0x8DA3, 0xBDED, 0x8E2B, 0xBDEE, 0x8E10, 0xBDEF, 0x8E1D, + 0xBDF0, 0x8E22, 0xBDF1, 0x8E0F, 0xBDF2, 0x8E29, 0xBDF3, 0x8E1F, + 0xBDF4, 0x8E21, 0xBDF5, 0x8E1E, 0xBDF6, 0x8EBA, 0xBDF7, 0x8F1D, + 0xBDF8, 0x8F1B, 0xBDF9, 0x8F1F, 0xBDFA, 0x8F29, 0xBDFB, 0x8F26, + 0xBDFC, 0x8F2A, 0xBDFD, 0x8F1C, 0xBDFE, 0x8F1E, 0xBE40, 0x8F25, + 0xBE41, 0x9069, 0xBE42, 0x906E, 0xBE43, 0x9068, 0xBE44, 0x906D, + 0xBE45, 0x9077, 0xBE46, 0x9130, 0xBE47, 0x912D, 0xBE48, 0x9127, + 0xBE49, 0x9131, 0xBE4A, 0x9187, 0xBE4B, 0x9189, 0xBE4C, 0x918B, + 0xBE4D, 0x9183, 0xBE4E, 0x92C5, 0xBE4F, 0x92BB, 0xBE50, 0x92B7, + 0xBE51, 0x92EA, 0xBE52, 0x92AC, 0xBE53, 0x92E4, 0xBE54, 0x92C1, + 0xBE55, 0x92B3, 0xBE56, 0x92BC, 0xBE57, 0x92D2, 0xBE58, 0x92C7, + 0xBE59, 0x92F0, 0xBE5A, 0x92B2, 0xBE5B, 0x95AD, 0xBE5C, 0x95B1, + 0xBE5D, 0x9704, 0xBE5E, 0x9706, 0xBE5F, 0x9707, 0xBE60, 0x9709, + 0xBE61, 0x9760, 0xBE62, 0x978D, 0xBE63, 0x978B, 0xBE64, 0x978F, + 0xBE65, 0x9821, 0xBE66, 0x982B, 0xBE67, 0x981C, 0xBE68, 0x98B3, + 0xBE69, 0x990A, 0xBE6A, 0x9913, 0xBE6B, 0x9912, 0xBE6C, 0x9918, + 0xBE6D, 0x99DD, 0xBE6E, 0x99D0, 0xBE6F, 0x99DF, 0xBE70, 0x99DB, + 0xBE71, 0x99D1, 0xBE72, 0x99D5, 0xBE73, 0x99D2, 0xBE74, 0x99D9, + 0xBE75, 0x9AB7, 0xBE76, 0x9AEE, 0xBE77, 0x9AEF, 0xBE78, 0x9B27, + 0xBE79, 0x9B45, 0xBE7A, 0x9B44, 0xBE7B, 0x9B77, 0xBE7C, 0x9B6F, + 0xBE7D, 0x9D06, 0xBE7E, 0x9D09, 0xBEA1, 0x9D03, 0xBEA2, 0x9EA9, + 0xBEA3, 0x9EBE, 0xBEA4, 0x9ECE, 0xBEA5, 0x58A8, 0xBEA6, 0x9F52, + 0xBEA7, 0x5112, 0xBEA8, 0x5118, 0xBEA9, 0x5114, 0xBEAA, 0x5110, + 0xBEAB, 0x5115, 0xBEAC, 0x5180, 0xBEAD, 0x51AA, 0xBEAE, 0x51DD, + 0xBEAF, 0x5291, 0xBEB0, 0x5293, 0xBEB1, 0x52F3, 0xBEB2, 0x5659, + 0xBEB3, 0x566B, 0xBEB4, 0x5679, 0xBEB5, 0x5669, 0xBEB6, 0x5664, + 0xBEB7, 0x5678, 0xBEB8, 0x566A, 0xBEB9, 0x5668, 0xBEBA, 0x5665, + 0xBEBB, 0x5671, 0xBEBC, 0x566F, 0xBEBD, 0x566C, 0xBEBE, 0x5662, + 0xBEBF, 0x5676, 0xBEC0, 0x58C1, 0xBEC1, 0x58BE, 0xBEC2, 0x58C7, + 0xBEC3, 0x58C5, 0xBEC4, 0x596E, 0xBEC5, 0x5B1D, 0xBEC6, 0x5B34, + 0xBEC7, 0x5B78, 0xBEC8, 0x5BF0, 0xBEC9, 0x5C0E, 0xBECA, 0x5F4A, + 0xBECB, 0x61B2, 0xBECC, 0x6191, 0xBECD, 0x61A9, 0xBECE, 0x618A, + 0xBECF, 0x61CD, 0xBED0, 0x61B6, 0xBED1, 0x61BE, 0xBED2, 0x61CA, + 0xBED3, 0x61C8, 0xBED4, 0x6230, 0xBED5, 0x64C5, 0xBED6, 0x64C1, + 0xBED7, 0x64CB, 0xBED8, 0x64BB, 0xBED9, 0x64BC, 0xBEDA, 0x64DA, + 0xBEDB, 0x64C4, 0xBEDC, 0x64C7, 0xBEDD, 0x64C2, 0xBEDE, 0x64CD, + 0xBEDF, 0x64BF, 0xBEE0, 0x64D2, 0xBEE1, 0x64D4, 0xBEE2, 0x64BE, + 0xBEE3, 0x6574, 0xBEE4, 0x66C6, 0xBEE5, 0x66C9, 0xBEE6, 0x66B9, + 0xBEE7, 0x66C4, 0xBEE8, 0x66C7, 0xBEE9, 0x66B8, 0xBEEA, 0x6A3D, + 0xBEEB, 0x6A38, 0xBEEC, 0x6A3A, 0xBEED, 0x6A59, 0xBEEE, 0x6A6B, + 0xBEEF, 0x6A58, 0xBEF0, 0x6A39, 0xBEF1, 0x6A44, 0xBEF2, 0x6A62, + 0xBEF3, 0x6A61, 0xBEF4, 0x6A4B, 0xBEF5, 0x6A47, 0xBEF6, 0x6A35, + 0xBEF7, 0x6A5F, 0xBEF8, 0x6A48, 0xBEF9, 0x6B59, 0xBEFA, 0x6B77, + 0xBEFB, 0x6C05, 0xBEFC, 0x6FC2, 0xBEFD, 0x6FB1, 0xBEFE, 0x6FA1, + 0xBF40, 0x6FC3, 0xBF41, 0x6FA4, 0xBF42, 0x6FC1, 0xBF43, 0x6FA7, + 0xBF44, 0x6FB3, 0xBF45, 0x6FC0, 0xBF46, 0x6FB9, 0xBF47, 0x6FB6, + 0xBF48, 0x6FA6, 0xBF49, 0x6FA0, 0xBF4A, 0x6FB4, 0xBF4B, 0x71BE, + 0xBF4C, 0x71C9, 0xBF4D, 0x71D0, 0xBF4E, 0x71D2, 0xBF4F, 0x71C8, + 0xBF50, 0x71D5, 0xBF51, 0x71B9, 0xBF52, 0x71CE, 0xBF53, 0x71D9, + 0xBF54, 0x71DC, 0xBF55, 0x71C3, 0xBF56, 0x71C4, 0xBF57, 0x7368, + 0xBF58, 0x749C, 0xBF59, 0x74A3, 0xBF5A, 0x7498, 0xBF5B, 0x749F, + 0xBF5C, 0x749E, 0xBF5D, 0x74E2, 0xBF5E, 0x750C, 0xBF5F, 0x750D, + 0xBF60, 0x7634, 0xBF61, 0x7638, 0xBF62, 0x763A, 0xBF63, 0x76E7, + 0xBF64, 0x76E5, 0xBF65, 0x77A0, 0xBF66, 0x779E, 0xBF67, 0x779F, + 0xBF68, 0x77A5, 0xBF69, 0x78E8, 0xBF6A, 0x78DA, 0xBF6B, 0x78EC, + 0xBF6C, 0x78E7, 0xBF6D, 0x79A6, 0xBF6E, 0x7A4D, 0xBF6F, 0x7A4E, + 0xBF70, 0x7A46, 0xBF71, 0x7A4C, 0xBF72, 0x7A4B, 0xBF73, 0x7ABA, + 0xBF74, 0x7BD9, 0xBF75, 0x7C11, 0xBF76, 0x7BC9, 0xBF77, 0x7BE4, + 0xBF78, 0x7BDB, 0xBF79, 0x7BE1, 0xBF7A, 0x7BE9, 0xBF7B, 0x7BE6, + 0xBF7C, 0x7CD5, 0xBF7D, 0x7CD6, 0xBF7E, 0x7E0A, 0xBFA1, 0x7E11, + 0xBFA2, 0x7E08, 0xBFA3, 0x7E1B, 0xBFA4, 0x7E23, 0xBFA5, 0x7E1E, + 0xBFA6, 0x7E1D, 0xBFA7, 0x7E09, 0xBFA8, 0x7E10, 0xBFA9, 0x7F79, + 0xBFAA, 0x7FB2, 0xBFAB, 0x7FF0, 0xBFAC, 0x7FF1, 0xBFAD, 0x7FEE, + 0xBFAE, 0x8028, 0xBFAF, 0x81B3, 0xBFB0, 0x81A9, 0xBFB1, 0x81A8, + 0xBFB2, 0x81FB, 0xBFB3, 0x8208, 0xBFB4, 0x8258, 0xBFB5, 0x8259, + 0xBFB6, 0x854A, 0xBFB7, 0x8559, 0xBFB8, 0x8548, 0xBFB9, 0x8568, + 0xBFBA, 0x8569, 0xBFBB, 0x8543, 0xBFBC, 0x8549, 0xBFBD, 0x856D, + 0xBFBE, 0x856A, 0xBFBF, 0x855E, 0xBFC0, 0x8783, 0xBFC1, 0x879F, + 0xBFC2, 0x879E, 0xBFC3, 0x87A2, 0xBFC4, 0x878D, 0xBFC5, 0x8861, + 0xBFC6, 0x892A, 0xBFC7, 0x8932, 0xBFC8, 0x8925, 0xBFC9, 0x892B, + 0xBFCA, 0x8921, 0xBFCB, 0x89AA, 0xBFCC, 0x89A6, 0xBFCD, 0x8AE6, + 0xBFCE, 0x8AFA, 0xBFCF, 0x8AEB, 0xBFD0, 0x8AF1, 0xBFD1, 0x8B00, + 0xBFD2, 0x8ADC, 0xBFD3, 0x8AE7, 0xBFD4, 0x8AEE, 0xBFD5, 0x8AFE, + 0xBFD6, 0x8B01, 0xBFD7, 0x8B02, 0xBFD8, 0x8AF7, 0xBFD9, 0x8AED, + 0xBFDA, 0x8AF3, 0xBFDB, 0x8AF6, 0xBFDC, 0x8AFC, 0xBFDD, 0x8C6B, + 0xBFDE, 0x8C6D, 0xBFDF, 0x8C93, 0xBFE0, 0x8CF4, 0xBFE1, 0x8E44, + 0xBFE2, 0x8E31, 0xBFE3, 0x8E34, 0xBFE4, 0x8E42, 0xBFE5, 0x8E39, + 0xBFE6, 0x8E35, 0xBFE7, 0x8F3B, 0xBFE8, 0x8F2F, 0xBFE9, 0x8F38, + 0xBFEA, 0x8F33, 0xBFEB, 0x8FA8, 0xBFEC, 0x8FA6, 0xBFED, 0x9075, + 0xBFEE, 0x9074, 0xBFEF, 0x9078, 0xBFF0, 0x9072, 0xBFF1, 0x907C, + 0xBFF2, 0x907A, 0xBFF3, 0x9134, 0xBFF4, 0x9192, 0xBFF5, 0x9320, + 0xBFF6, 0x9336, 0xBFF7, 0x92F8, 0xBFF8, 0x9333, 0xBFF9, 0x932F, + 0xBFFA, 0x9322, 0xBFFB, 0x92FC, 0xBFFC, 0x932B, 0xBFFD, 0x9304, + 0xBFFE, 0x931A, 0xC040, 0x9310, 0xC041, 0x9326, 0xC042, 0x9321, + 0xC043, 0x9315, 0xC044, 0x932E, 0xC045, 0x9319, 0xC046, 0x95BB, + 0xC047, 0x96A7, 0xC048, 0x96A8, 0xC049, 0x96AA, 0xC04A, 0x96D5, + 0xC04B, 0x970E, 0xC04C, 0x9711, 0xC04D, 0x9716, 0xC04E, 0x970D, + 0xC04F, 0x9713, 0xC050, 0x970F, 0xC051, 0x975B, 0xC052, 0x975C, + 0xC053, 0x9766, 0xC054, 0x9798, 0xC055, 0x9830, 0xC056, 0x9838, + 0xC057, 0x983B, 0xC058, 0x9837, 0xC059, 0x982D, 0xC05A, 0x9839, + 0xC05B, 0x9824, 0xC05C, 0x9910, 0xC05D, 0x9928, 0xC05E, 0x991E, + 0xC05F, 0x991B, 0xC060, 0x9921, 0xC061, 0x991A, 0xC062, 0x99ED, + 0xC063, 0x99E2, 0xC064, 0x99F1, 0xC065, 0x9AB8, 0xC066, 0x9ABC, + 0xC067, 0x9AFB, 0xC068, 0x9AED, 0xC069, 0x9B28, 0xC06A, 0x9B91, + 0xC06B, 0x9D15, 0xC06C, 0x9D23, 0xC06D, 0x9D26, 0xC06E, 0x9D28, + 0xC06F, 0x9D12, 0xC070, 0x9D1B, 0xC071, 0x9ED8, 0xC072, 0x9ED4, + 0xC073, 0x9F8D, 0xC074, 0x9F9C, 0xC075, 0x512A, 0xC076, 0x511F, + 0xC077, 0x5121, 0xC078, 0x5132, 0xC079, 0x52F5, 0xC07A, 0x568E, + 0xC07B, 0x5680, 0xC07C, 0x5690, 0xC07D, 0x5685, 0xC07E, 0x5687, + 0xC0A1, 0x568F, 0xC0A2, 0x58D5, 0xC0A3, 0x58D3, 0xC0A4, 0x58D1, + 0xC0A5, 0x58CE, 0xC0A6, 0x5B30, 0xC0A7, 0x5B2A, 0xC0A8, 0x5B24, + 0xC0A9, 0x5B7A, 0xC0AA, 0x5C37, 0xC0AB, 0x5C68, 0xC0AC, 0x5DBC, + 0xC0AD, 0x5DBA, 0xC0AE, 0x5DBD, 0xC0AF, 0x5DB8, 0xC0B0, 0x5E6B, + 0xC0B1, 0x5F4C, 0xC0B2, 0x5FBD, 0xC0B3, 0x61C9, 0xC0B4, 0x61C2, + 0xC0B5, 0x61C7, 0xC0B6, 0x61E6, 0xC0B7, 0x61CB, 0xC0B8, 0x6232, + 0xC0B9, 0x6234, 0xC0BA, 0x64CE, 0xC0BB, 0x64CA, 0xC0BC, 0x64D8, + 0xC0BD, 0x64E0, 0xC0BE, 0x64F0, 0xC0BF, 0x64E6, 0xC0C0, 0x64EC, + 0xC0C1, 0x64F1, 0xC0C2, 0x64E2, 0xC0C3, 0x64ED, 0xC0C4, 0x6582, + 0xC0C5, 0x6583, 0xC0C6, 0x66D9, 0xC0C7, 0x66D6, 0xC0C8, 0x6A80, + 0xC0C9, 0x6A94, 0xC0CA, 0x6A84, 0xC0CB, 0x6AA2, 0xC0CC, 0x6A9C, + 0xC0CD, 0x6ADB, 0xC0CE, 0x6AA3, 0xC0CF, 0x6A7E, 0xC0D0, 0x6A97, + 0xC0D1, 0x6A90, 0xC0D2, 0x6AA0, 0xC0D3, 0x6B5C, 0xC0D4, 0x6BAE, + 0xC0D5, 0x6BDA, 0xC0D6, 0x6C08, 0xC0D7, 0x6FD8, 0xC0D8, 0x6FF1, + 0xC0D9, 0x6FDF, 0xC0DA, 0x6FE0, 0xC0DB, 0x6FDB, 0xC0DC, 0x6FE4, + 0xC0DD, 0x6FEB, 0xC0DE, 0x6FEF, 0xC0DF, 0x6F80, 0xC0E0, 0x6FEC, + 0xC0E1, 0x6FE1, 0xC0E2, 0x6FE9, 0xC0E3, 0x6FD5, 0xC0E4, 0x6FEE, + 0xC0E5, 0x6FF0, 0xC0E6, 0x71E7, 0xC0E7, 0x71DF, 0xC0E8, 0x71EE, + 0xC0E9, 0x71E6, 0xC0EA, 0x71E5, 0xC0EB, 0x71ED, 0xC0EC, 0x71EC, + 0xC0ED, 0x71F4, 0xC0EE, 0x71E0, 0xC0EF, 0x7235, 0xC0F0, 0x7246, + 0xC0F1, 0x7370, 0xC0F2, 0x7372, 0xC0F3, 0x74A9, 0xC0F4, 0x74B0, + 0xC0F5, 0x74A6, 0xC0F6, 0x74A8, 0xC0F7, 0x7646, 0xC0F8, 0x7642, + 0xC0F9, 0x764C, 0xC0FA, 0x76EA, 0xC0FB, 0x77B3, 0xC0FC, 0x77AA, + 0xC0FD, 0x77B0, 0xC0FE, 0x77AC, 0xC140, 0x77A7, 0xC141, 0x77AD, + 0xC142, 0x77EF, 0xC143, 0x78F7, 0xC144, 0x78FA, 0xC145, 0x78F4, + 0xC146, 0x78EF, 0xC147, 0x7901, 0xC148, 0x79A7, 0xC149, 0x79AA, + 0xC14A, 0x7A57, 0xC14B, 0x7ABF, 0xC14C, 0x7C07, 0xC14D, 0x7C0D, + 0xC14E, 0x7BFE, 0xC14F, 0x7BF7, 0xC150, 0x7C0C, 0xC151, 0x7BE0, + 0xC152, 0x7CE0, 0xC153, 0x7CDC, 0xC154, 0x7CDE, 0xC155, 0x7CE2, + 0xC156, 0x7CDF, 0xC157, 0x7CD9, 0xC158, 0x7CDD, 0xC159, 0x7E2E, + 0xC15A, 0x7E3E, 0xC15B, 0x7E46, 0xC15C, 0x7E37, 0xC15D, 0x7E32, + 0xC15E, 0x7E43, 0xC15F, 0x7E2B, 0xC160, 0x7E3D, 0xC161, 0x7E31, + 0xC162, 0x7E45, 0xC163, 0x7E41, 0xC164, 0x7E34, 0xC165, 0x7E39, + 0xC166, 0x7E48, 0xC167, 0x7E35, 0xC168, 0x7E3F, 0xC169, 0x7E2F, + 0xC16A, 0x7F44, 0xC16B, 0x7FF3, 0xC16C, 0x7FFC, 0xC16D, 0x8071, + 0xC16E, 0x8072, 0xC16F, 0x8070, 0xC170, 0x806F, 0xC171, 0x8073, + 0xC172, 0x81C6, 0xC173, 0x81C3, 0xC174, 0x81BA, 0xC175, 0x81C2, + 0xC176, 0x81C0, 0xC177, 0x81BF, 0xC178, 0x81BD, 0xC179, 0x81C9, + 0xC17A, 0x81BE, 0xC17B, 0x81E8, 0xC17C, 0x8209, 0xC17D, 0x8271, + 0xC17E, 0x85AA, 0xC1A1, 0x8584, 0xC1A2, 0x857E, 0xC1A3, 0x859C, + 0xC1A4, 0x8591, 0xC1A5, 0x8594, 0xC1A6, 0x85AF, 0xC1A7, 0x859B, + 0xC1A8, 0x8587, 0xC1A9, 0x85A8, 0xC1AA, 0x858A, 0xC1AB, 0x8667, + 0xC1AC, 0x87C0, 0xC1AD, 0x87D1, 0xC1AE, 0x87B3, 0xC1AF, 0x87D2, + 0xC1B0, 0x87C6, 0xC1B1, 0x87AB, 0xC1B2, 0x87BB, 0xC1B3, 0x87BA, + 0xC1B4, 0x87C8, 0xC1B5, 0x87CB, 0xC1B6, 0x893B, 0xC1B7, 0x8936, + 0xC1B8, 0x8944, 0xC1B9, 0x8938, 0xC1BA, 0x893D, 0xC1BB, 0x89AC, + 0xC1BC, 0x8B0E, 0xC1BD, 0x8B17, 0xC1BE, 0x8B19, 0xC1BF, 0x8B1B, + 0xC1C0, 0x8B0A, 0xC1C1, 0x8B20, 0xC1C2, 0x8B1D, 0xC1C3, 0x8B04, + 0xC1C4, 0x8B10, 0xC1C5, 0x8C41, 0xC1C6, 0x8C3F, 0xC1C7, 0x8C73, + 0xC1C8, 0x8CFA, 0xC1C9, 0x8CFD, 0xC1CA, 0x8CFC, 0xC1CB, 0x8CF8, + 0xC1CC, 0x8CFB, 0xC1CD, 0x8DA8, 0xC1CE, 0x8E49, 0xC1CF, 0x8E4B, + 0xC1D0, 0x8E48, 0xC1D1, 0x8E4A, 0xC1D2, 0x8F44, 0xC1D3, 0x8F3E, + 0xC1D4, 0x8F42, 0xC1D5, 0x8F45, 0xC1D6, 0x8F3F, 0xC1D7, 0x907F, + 0xC1D8, 0x907D, 0xC1D9, 0x9084, 0xC1DA, 0x9081, 0xC1DB, 0x9082, + 0xC1DC, 0x9080, 0xC1DD, 0x9139, 0xC1DE, 0x91A3, 0xC1DF, 0x919E, + 0xC1E0, 0x919C, 0xC1E1, 0x934D, 0xC1E2, 0x9382, 0xC1E3, 0x9328, + 0xC1E4, 0x9375, 0xC1E5, 0x934A, 0xC1E6, 0x9365, 0xC1E7, 0x934B, + 0xC1E8, 0x9318, 0xC1E9, 0x937E, 0xC1EA, 0x936C, 0xC1EB, 0x935B, + 0xC1EC, 0x9370, 0xC1ED, 0x935A, 0xC1EE, 0x9354, 0xC1EF, 0x95CA, + 0xC1F0, 0x95CB, 0xC1F1, 0x95CC, 0xC1F2, 0x95C8, 0xC1F3, 0x95C6, + 0xC1F4, 0x96B1, 0xC1F5, 0x96B8, 0xC1F6, 0x96D6, 0xC1F7, 0x971C, + 0xC1F8, 0x971E, 0xC1F9, 0x97A0, 0xC1FA, 0x97D3, 0xC1FB, 0x9846, + 0xC1FC, 0x98B6, 0xC1FD, 0x9935, 0xC1FE, 0x9A01, 0xC240, 0x99FF, + 0xC241, 0x9BAE, 0xC242, 0x9BAB, 0xC243, 0x9BAA, 0xC244, 0x9BAD, + 0xC245, 0x9D3B, 0xC246, 0x9D3F, 0xC247, 0x9E8B, 0xC248, 0x9ECF, + 0xC249, 0x9EDE, 0xC24A, 0x9EDC, 0xC24B, 0x9EDD, 0xC24C, 0x9EDB, + 0xC24D, 0x9F3E, 0xC24E, 0x9F4B, 0xC24F, 0x53E2, 0xC250, 0x5695, + 0xC251, 0x56AE, 0xC252, 0x58D9, 0xC253, 0x58D8, 0xC254, 0x5B38, + 0xC255, 0x5F5D, 0xC256, 0x61E3, 0xC257, 0x6233, 0xC258, 0x64F4, + 0xC259, 0x64F2, 0xC25A, 0x64FE, 0xC25B, 0x6506, 0xC25C, 0x64FA, + 0xC25D, 0x64FB, 0xC25E, 0x64F7, 0xC25F, 0x65B7, 0xC260, 0x66DC, + 0xC261, 0x6726, 0xC262, 0x6AB3, 0xC263, 0x6AAC, 0xC264, 0x6AC3, + 0xC265, 0x6ABB, 0xC266, 0x6AB8, 0xC267, 0x6AC2, 0xC268, 0x6AAE, + 0xC269, 0x6AAF, 0xC26A, 0x6B5F, 0xC26B, 0x6B78, 0xC26C, 0x6BAF, + 0xC26D, 0x7009, 0xC26E, 0x700B, 0xC26F, 0x6FFE, 0xC270, 0x7006, + 0xC271, 0x6FFA, 0xC272, 0x7011, 0xC273, 0x700F, 0xC274, 0x71FB, + 0xC275, 0x71FC, 0xC276, 0x71FE, 0xC277, 0x71F8, 0xC278, 0x7377, + 0xC279, 0x7375, 0xC27A, 0x74A7, 0xC27B, 0x74BF, 0xC27C, 0x7515, + 0xC27D, 0x7656, 0xC27E, 0x7658, 0xC2A1, 0x7652, 0xC2A2, 0x77BD, + 0xC2A3, 0x77BF, 0xC2A4, 0x77BB, 0xC2A5, 0x77BC, 0xC2A6, 0x790E, + 0xC2A7, 0x79AE, 0xC2A8, 0x7A61, 0xC2A9, 0x7A62, 0xC2AA, 0x7A60, + 0xC2AB, 0x7AC4, 0xC2AC, 0x7AC5, 0xC2AD, 0x7C2B, 0xC2AE, 0x7C27, + 0xC2AF, 0x7C2A, 0xC2B0, 0x7C1E, 0xC2B1, 0x7C23, 0xC2B2, 0x7C21, + 0xC2B3, 0x7CE7, 0xC2B4, 0x7E54, 0xC2B5, 0x7E55, 0xC2B6, 0x7E5E, + 0xC2B7, 0x7E5A, 0xC2B8, 0x7E61, 0xC2B9, 0x7E52, 0xC2BA, 0x7E59, + 0xC2BB, 0x7F48, 0xC2BC, 0x7FF9, 0xC2BD, 0x7FFB, 0xC2BE, 0x8077, + 0xC2BF, 0x8076, 0xC2C0, 0x81CD, 0xC2C1, 0x81CF, 0xC2C2, 0x820A, + 0xC2C3, 0x85CF, 0xC2C4, 0x85A9, 0xC2C5, 0x85CD, 0xC2C6, 0x85D0, + 0xC2C7, 0x85C9, 0xC2C8, 0x85B0, 0xC2C9, 0x85BA, 0xC2CA, 0x85B9, + 0xC2CB, 0x85A6, 0xC2CC, 0x87EF, 0xC2CD, 0x87EC, 0xC2CE, 0x87F2, + 0xC2CF, 0x87E0, 0xC2D0, 0x8986, 0xC2D1, 0x89B2, 0xC2D2, 0x89F4, + 0xC2D3, 0x8B28, 0xC2D4, 0x8B39, 0xC2D5, 0x8B2C, 0xC2D6, 0x8B2B, + 0xC2D7, 0x8C50, 0xC2D8, 0x8D05, 0xC2D9, 0x8E59, 0xC2DA, 0x8E63, + 0xC2DB, 0x8E66, 0xC2DC, 0x8E64, 0xC2DD, 0x8E5F, 0xC2DE, 0x8E55, + 0xC2DF, 0x8EC0, 0xC2E0, 0x8F49, 0xC2E1, 0x8F4D, 0xC2E2, 0x9087, + 0xC2E3, 0x9083, 0xC2E4, 0x9088, 0xC2E5, 0x91AB, 0xC2E6, 0x91AC, + 0xC2E7, 0x91D0, 0xC2E8, 0x9394, 0xC2E9, 0x938A, 0xC2EA, 0x9396, + 0xC2EB, 0x93A2, 0xC2EC, 0x93B3, 0xC2ED, 0x93AE, 0xC2EE, 0x93AC, + 0xC2EF, 0x93B0, 0xC2F0, 0x9398, 0xC2F1, 0x939A, 0xC2F2, 0x9397, + 0xC2F3, 0x95D4, 0xC2F4, 0x95D6, 0xC2F5, 0x95D0, 0xC2F6, 0x95D5, + 0xC2F7, 0x96E2, 0xC2F8, 0x96DC, 0xC2F9, 0x96D9, 0xC2FA, 0x96DB, + 0xC2FB, 0x96DE, 0xC2FC, 0x9724, 0xC2FD, 0x97A3, 0xC2FE, 0x97A6, + 0xC340, 0x97AD, 0xC341, 0x97F9, 0xC342, 0x984D, 0xC343, 0x984F, + 0xC344, 0x984C, 0xC345, 0x984E, 0xC346, 0x9853, 0xC347, 0x98BA, + 0xC348, 0x993E, 0xC349, 0x993F, 0xC34A, 0x993D, 0xC34B, 0x992E, + 0xC34C, 0x99A5, 0xC34D, 0x9A0E, 0xC34E, 0x9AC1, 0xC34F, 0x9B03, + 0xC350, 0x9B06, 0xC351, 0x9B4F, 0xC352, 0x9B4E, 0xC353, 0x9B4D, + 0xC354, 0x9BCA, 0xC355, 0x9BC9, 0xC356, 0x9BFD, 0xC357, 0x9BC8, + 0xC358, 0x9BC0, 0xC359, 0x9D51, 0xC35A, 0x9D5D, 0xC35B, 0x9D60, + 0xC35C, 0x9EE0, 0xC35D, 0x9F15, 0xC35E, 0x9F2C, 0xC35F, 0x5133, + 0xC360, 0x56A5, 0xC361, 0x58DE, 0xC362, 0x58DF, 0xC363, 0x58E2, + 0xC364, 0x5BF5, 0xC365, 0x9F90, 0xC366, 0x5EEC, 0xC367, 0x61F2, + 0xC368, 0x61F7, 0xC369, 0x61F6, 0xC36A, 0x61F5, 0xC36B, 0x6500, + 0xC36C, 0x650F, 0xC36D, 0x66E0, 0xC36E, 0x66DD, 0xC36F, 0x6AE5, + 0xC370, 0x6ADD, 0xC371, 0x6ADA, 0xC372, 0x6AD3, 0xC373, 0x701B, + 0xC374, 0x701F, 0xC375, 0x7028, 0xC376, 0x701A, 0xC377, 0x701D, + 0xC378, 0x7015, 0xC379, 0x7018, 0xC37A, 0x7206, 0xC37B, 0x720D, + 0xC37C, 0x7258, 0xC37D, 0x72A2, 0xC37E, 0x7378, 0xC3A1, 0x737A, + 0xC3A2, 0x74BD, 0xC3A3, 0x74CA, 0xC3A4, 0x74E3, 0xC3A5, 0x7587, + 0xC3A6, 0x7586, 0xC3A7, 0x765F, 0xC3A8, 0x7661, 0xC3A9, 0x77C7, + 0xC3AA, 0x7919, 0xC3AB, 0x79B1, 0xC3AC, 0x7A6B, 0xC3AD, 0x7A69, + 0xC3AE, 0x7C3E, 0xC3AF, 0x7C3F, 0xC3B0, 0x7C38, 0xC3B1, 0x7C3D, + 0xC3B2, 0x7C37, 0xC3B3, 0x7C40, 0xC3B4, 0x7E6B, 0xC3B5, 0x7E6D, + 0xC3B6, 0x7E79, 0xC3B7, 0x7E69, 0xC3B8, 0x7E6A, 0xC3B9, 0x7F85, + 0xC3BA, 0x7E73, 0xC3BB, 0x7FB6, 0xC3BC, 0x7FB9, 0xC3BD, 0x7FB8, + 0xC3BE, 0x81D8, 0xC3BF, 0x85E9, 0xC3C0, 0x85DD, 0xC3C1, 0x85EA, + 0xC3C2, 0x85D5, 0xC3C3, 0x85E4, 0xC3C4, 0x85E5, 0xC3C5, 0x85F7, + 0xC3C6, 0x87FB, 0xC3C7, 0x8805, 0xC3C8, 0x880D, 0xC3C9, 0x87F9, + 0xC3CA, 0x87FE, 0xC3CB, 0x8960, 0xC3CC, 0x895F, 0xC3CD, 0x8956, + 0xC3CE, 0x895E, 0xC3CF, 0x8B41, 0xC3D0, 0x8B5C, 0xC3D1, 0x8B58, + 0xC3D2, 0x8B49, 0xC3D3, 0x8B5A, 0xC3D4, 0x8B4E, 0xC3D5, 0x8B4F, + 0xC3D6, 0x8B46, 0xC3D7, 0x8B59, 0xC3D8, 0x8D08, 0xC3D9, 0x8D0A, + 0xC3DA, 0x8E7C, 0xC3DB, 0x8E72, 0xC3DC, 0x8E87, 0xC3DD, 0x8E76, + 0xC3DE, 0x8E6C, 0xC3DF, 0x8E7A, 0xC3E0, 0x8E74, 0xC3E1, 0x8F54, + 0xC3E2, 0x8F4E, 0xC3E3, 0x8FAD, 0xC3E4, 0x908A, 0xC3E5, 0x908B, + 0xC3E6, 0x91B1, 0xC3E7, 0x91AE, 0xC3E8, 0x93E1, 0xC3E9, 0x93D1, + 0xC3EA, 0x93DF, 0xC3EB, 0x93C3, 0xC3EC, 0x93C8, 0xC3ED, 0x93DC, + 0xC3EE, 0x93DD, 0xC3EF, 0x93D6, 0xC3F0, 0x93E2, 0xC3F1, 0x93CD, + 0xC3F2, 0x93D8, 0xC3F3, 0x93E4, 0xC3F4, 0x93D7, 0xC3F5, 0x93E8, + 0xC3F6, 0x95DC, 0xC3F7, 0x96B4, 0xC3F8, 0x96E3, 0xC3F9, 0x972A, + 0xC3FA, 0x9727, 0xC3FB, 0x9761, 0xC3FC, 0x97DC, 0xC3FD, 0x97FB, + 0xC3FE, 0x985E, 0xC440, 0x9858, 0xC441, 0x985B, 0xC442, 0x98BC, + 0xC443, 0x9945, 0xC444, 0x9949, 0xC445, 0x9A16, 0xC446, 0x9A19, + 0xC447, 0x9B0D, 0xC448, 0x9BE8, 0xC449, 0x9BE7, 0xC44A, 0x9BD6, + 0xC44B, 0x9BDB, 0xC44C, 0x9D89, 0xC44D, 0x9D61, 0xC44E, 0x9D72, + 0xC44F, 0x9D6A, 0xC450, 0x9D6C, 0xC451, 0x9E92, 0xC452, 0x9E97, + 0xC453, 0x9E93, 0xC454, 0x9EB4, 0xC455, 0x52F8, 0xC456, 0x56A8, + 0xC457, 0x56B7, 0xC458, 0x56B6, 0xC459, 0x56B4, 0xC45A, 0x56BC, + 0xC45B, 0x58E4, 0xC45C, 0x5B40, 0xC45D, 0x5B43, 0xC45E, 0x5B7D, + 0xC45F, 0x5BF6, 0xC460, 0x5DC9, 0xC461, 0x61F8, 0xC462, 0x61FA, + 0xC463, 0x6518, 0xC464, 0x6514, 0xC465, 0x6519, 0xC466, 0x66E6, + 0xC467, 0x6727, 0xC468, 0x6AEC, 0xC469, 0x703E, 0xC46A, 0x7030, + 0xC46B, 0x7032, 0xC46C, 0x7210, 0xC46D, 0x737B, 0xC46E, 0x74CF, + 0xC46F, 0x7662, 0xC470, 0x7665, 0xC471, 0x7926, 0xC472, 0x792A, + 0xC473, 0x792C, 0xC474, 0x792B, 0xC475, 0x7AC7, 0xC476, 0x7AF6, + 0xC477, 0x7C4C, 0xC478, 0x7C43, 0xC479, 0x7C4D, 0xC47A, 0x7CEF, + 0xC47B, 0x7CF0, 0xC47C, 0x8FAE, 0xC47D, 0x7E7D, 0xC47E, 0x7E7C, + 0xC4A1, 0x7E82, 0xC4A2, 0x7F4C, 0xC4A3, 0x8000, 0xC4A4, 0x81DA, + 0xC4A5, 0x8266, 0xC4A6, 0x85FB, 0xC4A7, 0x85F9, 0xC4A8, 0x8611, + 0xC4A9, 0x85FA, 0xC4AA, 0x8606, 0xC4AB, 0x860B, 0xC4AC, 0x8607, + 0xC4AD, 0x860A, 0xC4AE, 0x8814, 0xC4AF, 0x8815, 0xC4B0, 0x8964, + 0xC4B1, 0x89BA, 0xC4B2, 0x89F8, 0xC4B3, 0x8B70, 0xC4B4, 0x8B6C, + 0xC4B5, 0x8B66, 0xC4B6, 0x8B6F, 0xC4B7, 0x8B5F, 0xC4B8, 0x8B6B, + 0xC4B9, 0x8D0F, 0xC4BA, 0x8D0D, 0xC4BB, 0x8E89, 0xC4BC, 0x8E81, + 0xC4BD, 0x8E85, 0xC4BE, 0x8E82, 0xC4BF, 0x91B4, 0xC4C0, 0x91CB, + 0xC4C1, 0x9418, 0xC4C2, 0x9403, 0xC4C3, 0x93FD, 0xC4C4, 0x95E1, + 0xC4C5, 0x9730, 0xC4C6, 0x98C4, 0xC4C7, 0x9952, 0xC4C8, 0x9951, + 0xC4C9, 0x99A8, 0xC4CA, 0x9A2B, 0xC4CB, 0x9A30, 0xC4CC, 0x9A37, + 0xC4CD, 0x9A35, 0xC4CE, 0x9C13, 0xC4CF, 0x9C0D, 0xC4D0, 0x9E79, + 0xC4D1, 0x9EB5, 0xC4D2, 0x9EE8, 0xC4D3, 0x9F2F, 0xC4D4, 0x9F5F, + 0xC4D5, 0x9F63, 0xC4D6, 0x9F61, 0xC4D7, 0x5137, 0xC4D8, 0x5138, + 0xC4D9, 0x56C1, 0xC4DA, 0x56C0, 0xC4DB, 0x56C2, 0xC4DC, 0x5914, + 0xC4DD, 0x5C6C, 0xC4DE, 0x5DCD, 0xC4DF, 0x61FC, 0xC4E0, 0x61FE, + 0xC4E1, 0x651D, 0xC4E2, 0x651C, 0xC4E3, 0x6595, 0xC4E4, 0x66E9, + 0xC4E5, 0x6AFB, 0xC4E6, 0x6B04, 0xC4E7, 0x6AFA, 0xC4E8, 0x6BB2, + 0xC4E9, 0x704C, 0xC4EA, 0x721B, 0xC4EB, 0x72A7, 0xC4EC, 0x74D6, + 0xC4ED, 0x74D4, 0xC4EE, 0x7669, 0xC4EF, 0x77D3, 0xC4F0, 0x7C50, + 0xC4F1, 0x7E8F, 0xC4F2, 0x7E8C, 0xC4F3, 0x7FBC, 0xC4F4, 0x8617, + 0xC4F5, 0x862D, 0xC4F6, 0x861A, 0xC4F7, 0x8823, 0xC4F8, 0x8822, + 0xC4F9, 0x8821, 0xC4FA, 0x881F, 0xC4FB, 0x896A, 0xC4FC, 0x896C, + 0xC4FD, 0x89BD, 0xC4FE, 0x8B74, 0xC540, 0x8B77, 0xC541, 0x8B7D, + 0xC542, 0x8D13, 0xC543, 0x8E8A, 0xC544, 0x8E8D, 0xC545, 0x8E8B, + 0xC546, 0x8F5F, 0xC547, 0x8FAF, 0xC548, 0x91BA, 0xC549, 0x942E, + 0xC54A, 0x9433, 0xC54B, 0x9435, 0xC54C, 0x943A, 0xC54D, 0x9438, + 0xC54E, 0x9432, 0xC54F, 0x942B, 0xC550, 0x95E2, 0xC551, 0x9738, + 0xC552, 0x9739, 0xC553, 0x9732, 0xC554, 0x97FF, 0xC555, 0x9867, + 0xC556, 0x9865, 0xC557, 0x9957, 0xC558, 0x9A45, 0xC559, 0x9A43, + 0xC55A, 0x9A40, 0xC55B, 0x9A3E, 0xC55C, 0x9ACF, 0xC55D, 0x9B54, + 0xC55E, 0x9B51, 0xC55F, 0x9C2D, 0xC560, 0x9C25, 0xC561, 0x9DAF, + 0xC562, 0x9DB4, 0xC563, 0x9DC2, 0xC564, 0x9DB8, 0xC565, 0x9E9D, + 0xC566, 0x9EEF, 0xC567, 0x9F19, 0xC568, 0x9F5C, 0xC569, 0x9F66, + 0xC56A, 0x9F67, 0xC56B, 0x513C, 0xC56C, 0x513B, 0xC56D, 0x56C8, + 0xC56E, 0x56CA, 0xC56F, 0x56C9, 0xC570, 0x5B7F, 0xC571, 0x5DD4, + 0xC572, 0x5DD2, 0xC573, 0x5F4E, 0xC574, 0x61FF, 0xC575, 0x6524, + 0xC576, 0x6B0A, 0xC577, 0x6B61, 0xC578, 0x7051, 0xC579, 0x7058, + 0xC57A, 0x7380, 0xC57B, 0x74E4, 0xC57C, 0x758A, 0xC57D, 0x766E, + 0xC57E, 0x766C, 0xC5A1, 0x79B3, 0xC5A2, 0x7C60, 0xC5A3, 0x7C5F, + 0xC5A4, 0x807E, 0xC5A5, 0x807D, 0xC5A6, 0x81DF, 0xC5A7, 0x8972, + 0xC5A8, 0x896F, 0xC5A9, 0x89FC, 0xC5AA, 0x8B80, 0xC5AB, 0x8D16, + 0xC5AC, 0x8D17, 0xC5AD, 0x8E91, 0xC5AE, 0x8E93, 0xC5AF, 0x8F61, + 0xC5B0, 0x9148, 0xC5B1, 0x9444, 0xC5B2, 0x9451, 0xC5B3, 0x9452, + 0xC5B4, 0x973D, 0xC5B5, 0x973E, 0xC5B6, 0x97C3, 0xC5B7, 0x97C1, + 0xC5B8, 0x986B, 0xC5B9, 0x9955, 0xC5BA, 0x9A55, 0xC5BB, 0x9A4D, + 0xC5BC, 0x9AD2, 0xC5BD, 0x9B1A, 0xC5BE, 0x9C49, 0xC5BF, 0x9C31, + 0xC5C0, 0x9C3E, 0xC5C1, 0x9C3B, 0xC5C2, 0x9DD3, 0xC5C3, 0x9DD7, + 0xC5C4, 0x9F34, 0xC5C5, 0x9F6C, 0xC5C6, 0x9F6A, 0xC5C7, 0x9F94, + 0xC5C8, 0x56CC, 0xC5C9, 0x5DD6, 0xC5CA, 0x6200, 0xC5CB, 0x6523, + 0xC5CC, 0x652B, 0xC5CD, 0x652A, 0xC5CE, 0x66EC, 0xC5CF, 0x6B10, + 0xC5D0, 0x74DA, 0xC5D1, 0x7ACA, 0xC5D2, 0x7C64, 0xC5D3, 0x7C63, + 0xC5D4, 0x7C65, 0xC5D5, 0x7E93, 0xC5D6, 0x7E96, 0xC5D7, 0x7E94, + 0xC5D8, 0x81E2, 0xC5D9, 0x8638, 0xC5DA, 0x863F, 0xC5DB, 0x8831, + 0xC5DC, 0x8B8A, 0xC5DD, 0x9090, 0xC5DE, 0x908F, 0xC5DF, 0x9463, + 0xC5E0, 0x9460, 0xC5E1, 0x9464, 0xC5E2, 0x9768, 0xC5E3, 0x986F, + 0xC5E4, 0x995C, 0xC5E5, 0x9A5A, 0xC5E6, 0x9A5B, 0xC5E7, 0x9A57, + 0xC5E8, 0x9AD3, 0xC5E9, 0x9AD4, 0xC5EA, 0x9AD1, 0xC5EB, 0x9C54, + 0xC5EC, 0x9C57, 0xC5ED, 0x9C56, 0xC5EE, 0x9DE5, 0xC5EF, 0x9E9F, + 0xC5F0, 0x9EF4, 0xC5F1, 0x56D1, 0xC5F2, 0x58E9, 0xC5F3, 0x652C, + 0xC5F4, 0x705E, 0xC5F5, 0x7671, 0xC5F6, 0x7672, 0xC5F7, 0x77D7, + 0xC5F8, 0x7F50, 0xC5F9, 0x7F88, 0xC5FA, 0x8836, 0xC5FB, 0x8839, + 0xC5FC, 0x8862, 0xC5FD, 0x8B93, 0xC5FE, 0x8B92, 0xC640, 0x8B96, + 0xC641, 0x8277, 0xC642, 0x8D1B, 0xC643, 0x91C0, 0xC644, 0x946A, + 0xC645, 0x9742, 0xC646, 0x9748, 0xC647, 0x9744, 0xC648, 0x97C6, + 0xC649, 0x9870, 0xC64A, 0x9A5F, 0xC64B, 0x9B22, 0xC64C, 0x9B58, + 0xC64D, 0x9C5F, 0xC64E, 0x9DF9, 0xC64F, 0x9DFA, 0xC650, 0x9E7C, + 0xC651, 0x9E7D, 0xC652, 0x9F07, 0xC653, 0x9F77, 0xC654, 0x9F72, + 0xC655, 0x5EF3, 0xC656, 0x6B16, 0xC657, 0x7063, 0xC658, 0x7C6C, + 0xC659, 0x7C6E, 0xC65A, 0x883B, 0xC65B, 0x89C0, 0xC65C, 0x8EA1, + 0xC65D, 0x91C1, 0xC65E, 0x9472, 0xC65F, 0x9470, 0xC660, 0x9871, + 0xC661, 0x995E, 0xC662, 0x9AD6, 0xC663, 0x9B23, 0xC664, 0x9ECC, + 0xC665, 0x7064, 0xC666, 0x77DA, 0xC667, 0x8B9A, 0xC668, 0x9477, + 0xC669, 0x97C9, 0xC66A, 0x9A62, 0xC66B, 0x9A65, 0xC66C, 0x7E9C, + 0xC66D, 0x8B9C, 0xC66E, 0x8EAA, 0xC66F, 0x91C5, 0xC670, 0x947D, + 0xC671, 0x947E, 0xC672, 0x947C, 0xC673, 0x9C77, 0xC674, 0x9C78, + 0xC675, 0x9EF7, 0xC676, 0x8C54, 0xC677, 0x947F, 0xC678, 0x9E1A, + 0xC679, 0x7228, 0xC67A, 0x9A6A, 0xC67B, 0x9B31, 0xC67C, 0x9E1B, + 0xC67D, 0x9E1E, 0xC67E, 0x7C72, 0xC940, 0x4E42, 0xC941, 0x4E5C, + 0xC942, 0x51F5, 0xC943, 0x531A, 0xC944, 0x5382, 0xC945, 0x4E07, + 0xC946, 0x4E0C, 0xC947, 0x4E47, 0xC948, 0x4E8D, 0xC949, 0x56D7, + 0xC94A, 0xFA0C, 0xC94B, 0x5C6E, 0xC94C, 0x5F73, 0xC94D, 0x4E0F, + 0xC94E, 0x5187, 0xC94F, 0x4E0E, 0xC950, 0x4E2E, 0xC951, 0x4E93, + 0xC952, 0x4EC2, 0xC953, 0x4EC9, 0xC954, 0x4EC8, 0xC955, 0x5198, + 0xC956, 0x52FC, 0xC957, 0x536C, 0xC958, 0x53B9, 0xC959, 0x5720, + 0xC95A, 0x5903, 0xC95B, 0x592C, 0xC95C, 0x5C10, 0xC95D, 0x5DFF, + 0xC95E, 0x65E1, 0xC95F, 0x6BB3, 0xC960, 0x6BCC, 0xC961, 0x6C14, + 0xC962, 0x723F, 0xC963, 0x4E31, 0xC964, 0x4E3C, 0xC965, 0x4EE8, + 0xC966, 0x4EDC, 0xC967, 0x4EE9, 0xC968, 0x4EE1, 0xC969, 0x4EDD, + 0xC96A, 0x4EDA, 0xC96B, 0x520C, 0xC96C, 0x531C, 0xC96D, 0x534C, + 0xC96E, 0x5722, 0xC96F, 0x5723, 0xC970, 0x5917, 0xC971, 0x592F, + 0xC972, 0x5B81, 0xC973, 0x5B84, 0xC974, 0x5C12, 0xC975, 0x5C3B, + 0xC976, 0x5C74, 0xC977, 0x5C73, 0xC978, 0x5E04, 0xC979, 0x5E80, + 0xC97A, 0x5E82, 0xC97B, 0x5FC9, 0xC97C, 0x6209, 0xC97D, 0x6250, + 0xC97E, 0x6C15, 0xC9A1, 0x6C36, 0xC9A2, 0x6C43, 0xC9A3, 0x6C3F, + 0xC9A4, 0x6C3B, 0xC9A5, 0x72AE, 0xC9A6, 0x72B0, 0xC9A7, 0x738A, + 0xC9A8, 0x79B8, 0xC9A9, 0x808A, 0xC9AA, 0x961E, 0xC9AB, 0x4F0E, + 0xC9AC, 0x4F18, 0xC9AD, 0x4F2C, 0xC9AE, 0x4EF5, 0xC9AF, 0x4F14, + 0xC9B0, 0x4EF1, 0xC9B1, 0x4F00, 0xC9B2, 0x4EF7, 0xC9B3, 0x4F08, + 0xC9B4, 0x4F1D, 0xC9B5, 0x4F02, 0xC9B6, 0x4F05, 0xC9B7, 0x4F22, + 0xC9B8, 0x4F13, 0xC9B9, 0x4F04, 0xC9BA, 0x4EF4, 0xC9BB, 0x4F12, + 0xC9BC, 0x51B1, 0xC9BD, 0x5213, 0xC9BE, 0x5209, 0xC9BF, 0x5210, + 0xC9C0, 0x52A6, 0xC9C1, 0x5322, 0xC9C2, 0x531F, 0xC9C3, 0x534D, + 0xC9C4, 0x538A, 0xC9C5, 0x5407, 0xC9C6, 0x56E1, 0xC9C7, 0x56DF, + 0xC9C8, 0x572E, 0xC9C9, 0x572A, 0xC9CA, 0x5734, 0xC9CB, 0x593C, + 0xC9CC, 0x5980, 0xC9CD, 0x597C, 0xC9CE, 0x5985, 0xC9CF, 0x597B, + 0xC9D0, 0x597E, 0xC9D1, 0x5977, 0xC9D2, 0x597F, 0xC9D3, 0x5B56, + 0xC9D4, 0x5C15, 0xC9D5, 0x5C25, 0xC9D6, 0x5C7C, 0xC9D7, 0x5C7A, + 0xC9D8, 0x5C7B, 0xC9D9, 0x5C7E, 0xC9DA, 0x5DDF, 0xC9DB, 0x5E75, + 0xC9DC, 0x5E84, 0xC9DD, 0x5F02, 0xC9DE, 0x5F1A, 0xC9DF, 0x5F74, + 0xC9E0, 0x5FD5, 0xC9E1, 0x5FD4, 0xC9E2, 0x5FCF, 0xC9E3, 0x625C, + 0xC9E4, 0x625E, 0xC9E5, 0x6264, 0xC9E6, 0x6261, 0xC9E7, 0x6266, + 0xC9E8, 0x6262, 0xC9E9, 0x6259, 0xC9EA, 0x6260, 0xC9EB, 0x625A, + 0xC9EC, 0x6265, 0xC9ED, 0x65EF, 0xC9EE, 0x65EE, 0xC9EF, 0x673E, + 0xC9F0, 0x6739, 0xC9F1, 0x6738, 0xC9F2, 0x673B, 0xC9F3, 0x673A, + 0xC9F4, 0x673F, 0xC9F5, 0x673C, 0xC9F6, 0x6733, 0xC9F7, 0x6C18, + 0xC9F8, 0x6C46, 0xC9F9, 0x6C52, 0xC9FA, 0x6C5C, 0xC9FB, 0x6C4F, + 0xC9FC, 0x6C4A, 0xC9FD, 0x6C54, 0xC9FE, 0x6C4B, 0xCA40, 0x6C4C, + 0xCA41, 0x7071, 0xCA42, 0x725E, 0xCA43, 0x72B4, 0xCA44, 0x72B5, + 0xCA45, 0x738E, 0xCA46, 0x752A, 0xCA47, 0x767F, 0xCA48, 0x7A75, + 0xCA49, 0x7F51, 0xCA4A, 0x8278, 0xCA4B, 0x827C, 0xCA4C, 0x8280, + 0xCA4D, 0x827D, 0xCA4E, 0x827F, 0xCA4F, 0x864D, 0xCA50, 0x897E, + 0xCA51, 0x9099, 0xCA52, 0x9097, 0xCA53, 0x9098, 0xCA54, 0x909B, + 0xCA55, 0x9094, 0xCA56, 0x9622, 0xCA57, 0x9624, 0xCA58, 0x9620, + 0xCA59, 0x9623, 0xCA5A, 0x4F56, 0xCA5B, 0x4F3B, 0xCA5C, 0x4F62, + 0xCA5D, 0x4F49, 0xCA5E, 0x4F53, 0xCA5F, 0x4F64, 0xCA60, 0x4F3E, + 0xCA61, 0x4F67, 0xCA62, 0x4F52, 0xCA63, 0x4F5F, 0xCA64, 0x4F41, + 0xCA65, 0x4F58, 0xCA66, 0x4F2D, 0xCA67, 0x4F33, 0xCA68, 0x4F3F, + 0xCA69, 0x4F61, 0xCA6A, 0x518F, 0xCA6B, 0x51B9, 0xCA6C, 0x521C, + 0xCA6D, 0x521E, 0xCA6E, 0x5221, 0xCA6F, 0x52AD, 0xCA70, 0x52AE, + 0xCA71, 0x5309, 0xCA72, 0x5363, 0xCA73, 0x5372, 0xCA74, 0x538E, + 0xCA75, 0x538F, 0xCA76, 0x5430, 0xCA77, 0x5437, 0xCA78, 0x542A, + 0xCA79, 0x5454, 0xCA7A, 0x5445, 0xCA7B, 0x5419, 0xCA7C, 0x541C, + 0xCA7D, 0x5425, 0xCA7E, 0x5418, 0xCAA1, 0x543D, 0xCAA2, 0x544F, + 0xCAA3, 0x5441, 0xCAA4, 0x5428, 0xCAA5, 0x5424, 0xCAA6, 0x5447, + 0xCAA7, 0x56EE, 0xCAA8, 0x56E7, 0xCAA9, 0x56E5, 0xCAAA, 0x5741, + 0xCAAB, 0x5745, 0xCAAC, 0x574C, 0xCAAD, 0x5749, 0xCAAE, 0x574B, + 0xCAAF, 0x5752, 0xCAB0, 0x5906, 0xCAB1, 0x5940, 0xCAB2, 0x59A6, + 0xCAB3, 0x5998, 0xCAB4, 0x59A0, 0xCAB5, 0x5997, 0xCAB6, 0x598E, + 0xCAB7, 0x59A2, 0xCAB8, 0x5990, 0xCAB9, 0x598F, 0xCABA, 0x59A7, + 0xCABB, 0x59A1, 0xCABC, 0x5B8E, 0xCABD, 0x5B92, 0xCABE, 0x5C28, + 0xCABF, 0x5C2A, 0xCAC0, 0x5C8D, 0xCAC1, 0x5C8F, 0xCAC2, 0x5C88, + 0xCAC3, 0x5C8B, 0xCAC4, 0x5C89, 0xCAC5, 0x5C92, 0xCAC6, 0x5C8A, + 0xCAC7, 0x5C86, 0xCAC8, 0x5C93, 0xCAC9, 0x5C95, 0xCACA, 0x5DE0, + 0xCACB, 0x5E0A, 0xCACC, 0x5E0E, 0xCACD, 0x5E8B, 0xCACE, 0x5E89, + 0xCACF, 0x5E8C, 0xCAD0, 0x5E88, 0xCAD1, 0x5E8D, 0xCAD2, 0x5F05, + 0xCAD3, 0x5F1D, 0xCAD4, 0x5F78, 0xCAD5, 0x5F76, 0xCAD6, 0x5FD2, + 0xCAD7, 0x5FD1, 0xCAD8, 0x5FD0, 0xCAD9, 0x5FED, 0xCADA, 0x5FE8, + 0xCADB, 0x5FEE, 0xCADC, 0x5FF3, 0xCADD, 0x5FE1, 0xCADE, 0x5FE4, + 0xCADF, 0x5FE3, 0xCAE0, 0x5FFA, 0xCAE1, 0x5FEF, 0xCAE2, 0x5FF7, + 0xCAE3, 0x5FFB, 0xCAE4, 0x6000, 0xCAE5, 0x5FF4, 0xCAE6, 0x623A, + 0xCAE7, 0x6283, 0xCAE8, 0x628C, 0xCAE9, 0x628E, 0xCAEA, 0x628F, + 0xCAEB, 0x6294, 0xCAEC, 0x6287, 0xCAED, 0x6271, 0xCAEE, 0x627B, + 0xCAEF, 0x627A, 0xCAF0, 0x6270, 0xCAF1, 0x6281, 0xCAF2, 0x6288, + 0xCAF3, 0x6277, 0xCAF4, 0x627D, 0xCAF5, 0x6272, 0xCAF6, 0x6274, + 0xCAF7, 0x6537, 0xCAF8, 0x65F0, 0xCAF9, 0x65F4, 0xCAFA, 0x65F3, + 0xCAFB, 0x65F2, 0xCAFC, 0x65F5, 0xCAFD, 0x6745, 0xCAFE, 0x6747, + 0xCB40, 0x6759, 0xCB41, 0x6755, 0xCB42, 0x674C, 0xCB43, 0x6748, + 0xCB44, 0x675D, 0xCB45, 0x674D, 0xCB46, 0x675A, 0xCB47, 0x674B, + 0xCB48, 0x6BD0, 0xCB49, 0x6C19, 0xCB4A, 0x6C1A, 0xCB4B, 0x6C78, + 0xCB4C, 0x6C67, 0xCB4D, 0x6C6B, 0xCB4E, 0x6C84, 0xCB4F, 0x6C8B, + 0xCB50, 0x6C8F, 0xCB51, 0x6C71, 0xCB52, 0x6C6F, 0xCB53, 0x6C69, + 0xCB54, 0x6C9A, 0xCB55, 0x6C6D, 0xCB56, 0x6C87, 0xCB57, 0x6C95, + 0xCB58, 0x6C9C, 0xCB59, 0x6C66, 0xCB5A, 0x6C73, 0xCB5B, 0x6C65, + 0xCB5C, 0x6C7B, 0xCB5D, 0x6C8E, 0xCB5E, 0x7074, 0xCB5F, 0x707A, + 0xCB60, 0x7263, 0xCB61, 0x72BF, 0xCB62, 0x72BD, 0xCB63, 0x72C3, + 0xCB64, 0x72C6, 0xCB65, 0x72C1, 0xCB66, 0x72BA, 0xCB67, 0x72C5, + 0xCB68, 0x7395, 0xCB69, 0x7397, 0xCB6A, 0x7393, 0xCB6B, 0x7394, + 0xCB6C, 0x7392, 0xCB6D, 0x753A, 0xCB6E, 0x7539, 0xCB6F, 0x7594, + 0xCB70, 0x7595, 0xCB71, 0x7681, 0xCB72, 0x793D, 0xCB73, 0x8034, + 0xCB74, 0x8095, 0xCB75, 0x8099, 0xCB76, 0x8090, 0xCB77, 0x8092, + 0xCB78, 0x809C, 0xCB79, 0x8290, 0xCB7A, 0x828F, 0xCB7B, 0x8285, + 0xCB7C, 0x828E, 0xCB7D, 0x8291, 0xCB7E, 0x8293, 0xCBA1, 0x828A, + 0xCBA2, 0x8283, 0xCBA3, 0x8284, 0xCBA4, 0x8C78, 0xCBA5, 0x8FC9, + 0xCBA6, 0x8FBF, 0xCBA7, 0x909F, 0xCBA8, 0x90A1, 0xCBA9, 0x90A5, + 0xCBAA, 0x909E, 0xCBAB, 0x90A7, 0xCBAC, 0x90A0, 0xCBAD, 0x9630, + 0xCBAE, 0x9628, 0xCBAF, 0x962F, 0xCBB0, 0x962D, 0xCBB1, 0x4E33, + 0xCBB2, 0x4F98, 0xCBB3, 0x4F7C, 0xCBB4, 0x4F85, 0xCBB5, 0x4F7D, + 0xCBB6, 0x4F80, 0xCBB7, 0x4F87, 0xCBB8, 0x4F76, 0xCBB9, 0x4F74, + 0xCBBA, 0x4F89, 0xCBBB, 0x4F84, 0xCBBC, 0x4F77, 0xCBBD, 0x4F4C, + 0xCBBE, 0x4F97, 0xCBBF, 0x4F6A, 0xCBC0, 0x4F9A, 0xCBC1, 0x4F79, + 0xCBC2, 0x4F81, 0xCBC3, 0x4F78, 0xCBC4, 0x4F90, 0xCBC5, 0x4F9C, + 0xCBC6, 0x4F94, 0xCBC7, 0x4F9E, 0xCBC8, 0x4F92, 0xCBC9, 0x4F82, + 0xCBCA, 0x4F95, 0xCBCB, 0x4F6B, 0xCBCC, 0x4F6E, 0xCBCD, 0x519E, + 0xCBCE, 0x51BC, 0xCBCF, 0x51BE, 0xCBD0, 0x5235, 0xCBD1, 0x5232, + 0xCBD2, 0x5233, 0xCBD3, 0x5246, 0xCBD4, 0x5231, 0xCBD5, 0x52BC, + 0xCBD6, 0x530A, 0xCBD7, 0x530B, 0xCBD8, 0x533C, 0xCBD9, 0x5392, + 0xCBDA, 0x5394, 0xCBDB, 0x5487, 0xCBDC, 0x547F, 0xCBDD, 0x5481, + 0xCBDE, 0x5491, 0xCBDF, 0x5482, 0xCBE0, 0x5488, 0xCBE1, 0x546B, + 0xCBE2, 0x547A, 0xCBE3, 0x547E, 0xCBE4, 0x5465, 0xCBE5, 0x546C, + 0xCBE6, 0x5474, 0xCBE7, 0x5466, 0xCBE8, 0x548D, 0xCBE9, 0x546F, + 0xCBEA, 0x5461, 0xCBEB, 0x5460, 0xCBEC, 0x5498, 0xCBED, 0x5463, + 0xCBEE, 0x5467, 0xCBEF, 0x5464, 0xCBF0, 0x56F7, 0xCBF1, 0x56F9, + 0xCBF2, 0x576F, 0xCBF3, 0x5772, 0xCBF4, 0x576D, 0xCBF5, 0x576B, + 0xCBF6, 0x5771, 0xCBF7, 0x5770, 0xCBF8, 0x5776, 0xCBF9, 0x5780, + 0xCBFA, 0x5775, 0xCBFB, 0x577B, 0xCBFC, 0x5773, 0xCBFD, 0x5774, + 0xCBFE, 0x5762, 0xCC40, 0x5768, 0xCC41, 0x577D, 0xCC42, 0x590C, + 0xCC43, 0x5945, 0xCC44, 0x59B5, 0xCC45, 0x59BA, 0xCC46, 0x59CF, + 0xCC47, 0x59CE, 0xCC48, 0x59B2, 0xCC49, 0x59CC, 0xCC4A, 0x59C1, + 0xCC4B, 0x59B6, 0xCC4C, 0x59BC, 0xCC4D, 0x59C3, 0xCC4E, 0x59D6, + 0xCC4F, 0x59B1, 0xCC50, 0x59BD, 0xCC51, 0x59C0, 0xCC52, 0x59C8, + 0xCC53, 0x59B4, 0xCC54, 0x59C7, 0xCC55, 0x5B62, 0xCC56, 0x5B65, + 0xCC57, 0x5B93, 0xCC58, 0x5B95, 0xCC59, 0x5C44, 0xCC5A, 0x5C47, + 0xCC5B, 0x5CAE, 0xCC5C, 0x5CA4, 0xCC5D, 0x5CA0, 0xCC5E, 0x5CB5, + 0xCC5F, 0x5CAF, 0xCC60, 0x5CA8, 0xCC61, 0x5CAC, 0xCC62, 0x5C9F, + 0xCC63, 0x5CA3, 0xCC64, 0x5CAD, 0xCC65, 0x5CA2, 0xCC66, 0x5CAA, + 0xCC67, 0x5CA7, 0xCC68, 0x5C9D, 0xCC69, 0x5CA5, 0xCC6A, 0x5CB6, + 0xCC6B, 0x5CB0, 0xCC6C, 0x5CA6, 0xCC6D, 0x5E17, 0xCC6E, 0x5E14, + 0xCC6F, 0x5E19, 0xCC70, 0x5F28, 0xCC71, 0x5F22, 0xCC72, 0x5F23, + 0xCC73, 0x5F24, 0xCC74, 0x5F54, 0xCC75, 0x5F82, 0xCC76, 0x5F7E, + 0xCC77, 0x5F7D, 0xCC78, 0x5FDE, 0xCC79, 0x5FE5, 0xCC7A, 0x602D, + 0xCC7B, 0x6026, 0xCC7C, 0x6019, 0xCC7D, 0x6032, 0xCC7E, 0x600B, + 0xCCA1, 0x6034, 0xCCA2, 0x600A, 0xCCA3, 0x6017, 0xCCA4, 0x6033, + 0xCCA5, 0x601A, 0xCCA6, 0x601E, 0xCCA7, 0x602C, 0xCCA8, 0x6022, + 0xCCA9, 0x600D, 0xCCAA, 0x6010, 0xCCAB, 0x602E, 0xCCAC, 0x6013, + 0xCCAD, 0x6011, 0xCCAE, 0x600C, 0xCCAF, 0x6009, 0xCCB0, 0x601C, + 0xCCB1, 0x6214, 0xCCB2, 0x623D, 0xCCB3, 0x62AD, 0xCCB4, 0x62B4, + 0xCCB5, 0x62D1, 0xCCB6, 0x62BE, 0xCCB7, 0x62AA, 0xCCB8, 0x62B6, + 0xCCB9, 0x62CA, 0xCCBA, 0x62AE, 0xCCBB, 0x62B3, 0xCCBC, 0x62AF, + 0xCCBD, 0x62BB, 0xCCBE, 0x62A9, 0xCCBF, 0x62B0, 0xCCC0, 0x62B8, + 0xCCC1, 0x653D, 0xCCC2, 0x65A8, 0xCCC3, 0x65BB, 0xCCC4, 0x6609, + 0xCCC5, 0x65FC, 0xCCC6, 0x6604, 0xCCC7, 0x6612, 0xCCC8, 0x6608, + 0xCCC9, 0x65FB, 0xCCCA, 0x6603, 0xCCCB, 0x660B, 0xCCCC, 0x660D, + 0xCCCD, 0x6605, 0xCCCE, 0x65FD, 0xCCCF, 0x6611, 0xCCD0, 0x6610, + 0xCCD1, 0x66F6, 0xCCD2, 0x670A, 0xCCD3, 0x6785, 0xCCD4, 0x676C, + 0xCCD5, 0x678E, 0xCCD6, 0x6792, 0xCCD7, 0x6776, 0xCCD8, 0x677B, + 0xCCD9, 0x6798, 0xCCDA, 0x6786, 0xCCDB, 0x6784, 0xCCDC, 0x6774, + 0xCCDD, 0x678D, 0xCCDE, 0x678C, 0xCCDF, 0x677A, 0xCCE0, 0x679F, + 0xCCE1, 0x6791, 0xCCE2, 0x6799, 0xCCE3, 0x6783, 0xCCE4, 0x677D, + 0xCCE5, 0x6781, 0xCCE6, 0x6778, 0xCCE7, 0x6779, 0xCCE8, 0x6794, + 0xCCE9, 0x6B25, 0xCCEA, 0x6B80, 0xCCEB, 0x6B7E, 0xCCEC, 0x6BDE, + 0xCCED, 0x6C1D, 0xCCEE, 0x6C93, 0xCCEF, 0x6CEC, 0xCCF0, 0x6CEB, + 0xCCF1, 0x6CEE, 0xCCF2, 0x6CD9, 0xCCF3, 0x6CB6, 0xCCF4, 0x6CD4, + 0xCCF5, 0x6CAD, 0xCCF6, 0x6CE7, 0xCCF7, 0x6CB7, 0xCCF8, 0x6CD0, + 0xCCF9, 0x6CC2, 0xCCFA, 0x6CBA, 0xCCFB, 0x6CC3, 0xCCFC, 0x6CC6, + 0xCCFD, 0x6CED, 0xCCFE, 0x6CF2, 0xCD40, 0x6CD2, 0xCD41, 0x6CDD, + 0xCD42, 0x6CB4, 0xCD43, 0x6C8A, 0xCD44, 0x6C9D, 0xCD45, 0x6C80, + 0xCD46, 0x6CDE, 0xCD47, 0x6CC0, 0xCD48, 0x6D30, 0xCD49, 0x6CCD, + 0xCD4A, 0x6CC7, 0xCD4B, 0x6CB0, 0xCD4C, 0x6CF9, 0xCD4D, 0x6CCF, + 0xCD4E, 0x6CE9, 0xCD4F, 0x6CD1, 0xCD50, 0x7094, 0xCD51, 0x7098, + 0xCD52, 0x7085, 0xCD53, 0x7093, 0xCD54, 0x7086, 0xCD55, 0x7084, + 0xCD56, 0x7091, 0xCD57, 0x7096, 0xCD58, 0x7082, 0xCD59, 0x709A, + 0xCD5A, 0x7083, 0xCD5B, 0x726A, 0xCD5C, 0x72D6, 0xCD5D, 0x72CB, + 0xCD5E, 0x72D8, 0xCD5F, 0x72C9, 0xCD60, 0x72DC, 0xCD61, 0x72D2, + 0xCD62, 0x72D4, 0xCD63, 0x72DA, 0xCD64, 0x72CC, 0xCD65, 0x72D1, + 0xCD66, 0x73A4, 0xCD67, 0x73A1, 0xCD68, 0x73AD, 0xCD69, 0x73A6, + 0xCD6A, 0x73A2, 0xCD6B, 0x73A0, 0xCD6C, 0x73AC, 0xCD6D, 0x739D, + 0xCD6E, 0x74DD, 0xCD6F, 0x74E8, 0xCD70, 0x753F, 0xCD71, 0x7540, + 0xCD72, 0x753E, 0xCD73, 0x758C, 0xCD74, 0x7598, 0xCD75, 0x76AF, + 0xCD76, 0x76F3, 0xCD77, 0x76F1, 0xCD78, 0x76F0, 0xCD79, 0x76F5, + 0xCD7A, 0x77F8, 0xCD7B, 0x77FC, 0xCD7C, 0x77F9, 0xCD7D, 0x77FB, + 0xCD7E, 0x77FA, 0xCDA1, 0x77F7, 0xCDA2, 0x7942, 0xCDA3, 0x793F, + 0xCDA4, 0x79C5, 0xCDA5, 0x7A78, 0xCDA6, 0x7A7B, 0xCDA7, 0x7AFB, + 0xCDA8, 0x7C75, 0xCDA9, 0x7CFD, 0xCDAA, 0x8035, 0xCDAB, 0x808F, + 0xCDAC, 0x80AE, 0xCDAD, 0x80A3, 0xCDAE, 0x80B8, 0xCDAF, 0x80B5, + 0xCDB0, 0x80AD, 0xCDB1, 0x8220, 0xCDB2, 0x82A0, 0xCDB3, 0x82C0, + 0xCDB4, 0x82AB, 0xCDB5, 0x829A, 0xCDB6, 0x8298, 0xCDB7, 0x829B, + 0xCDB8, 0x82B5, 0xCDB9, 0x82A7, 0xCDBA, 0x82AE, 0xCDBB, 0x82BC, + 0xCDBC, 0x829E, 0xCDBD, 0x82BA, 0xCDBE, 0x82B4, 0xCDBF, 0x82A8, + 0xCDC0, 0x82A1, 0xCDC1, 0x82A9, 0xCDC2, 0x82C2, 0xCDC3, 0x82A4, + 0xCDC4, 0x82C3, 0xCDC5, 0x82B6, 0xCDC6, 0x82A2, 0xCDC7, 0x8670, + 0xCDC8, 0x866F, 0xCDC9, 0x866D, 0xCDCA, 0x866E, 0xCDCB, 0x8C56, + 0xCDCC, 0x8FD2, 0xCDCD, 0x8FCB, 0xCDCE, 0x8FD3, 0xCDCF, 0x8FCD, + 0xCDD0, 0x8FD6, 0xCDD1, 0x8FD5, 0xCDD2, 0x8FD7, 0xCDD3, 0x90B2, + 0xCDD4, 0x90B4, 0xCDD5, 0x90AF, 0xCDD6, 0x90B3, 0xCDD7, 0x90B0, + 0xCDD8, 0x9639, 0xCDD9, 0x963D, 0xCDDA, 0x963C, 0xCDDB, 0x963A, + 0xCDDC, 0x9643, 0xCDDD, 0x4FCD, 0xCDDE, 0x4FC5, 0xCDDF, 0x4FD3, + 0xCDE0, 0x4FB2, 0xCDE1, 0x4FC9, 0xCDE2, 0x4FCB, 0xCDE3, 0x4FC1, + 0xCDE4, 0x4FD4, 0xCDE5, 0x4FDC, 0xCDE6, 0x4FD9, 0xCDE7, 0x4FBB, + 0xCDE8, 0x4FB3, 0xCDE9, 0x4FDB, 0xCDEA, 0x4FC7, 0xCDEB, 0x4FD6, + 0xCDEC, 0x4FBA, 0xCDED, 0x4FC0, 0xCDEE, 0x4FB9, 0xCDEF, 0x4FEC, + 0xCDF0, 0x5244, 0xCDF1, 0x5249, 0xCDF2, 0x52C0, 0xCDF3, 0x52C2, + 0xCDF4, 0x533D, 0xCDF5, 0x537C, 0xCDF6, 0x5397, 0xCDF7, 0x5396, + 0xCDF8, 0x5399, 0xCDF9, 0x5398, 0xCDFA, 0x54BA, 0xCDFB, 0x54A1, + 0xCDFC, 0x54AD, 0xCDFD, 0x54A5, 0xCDFE, 0x54CF, 0xCE40, 0x54C3, + 0xCE41, 0x830D, 0xCE42, 0x54B7, 0xCE43, 0x54AE, 0xCE44, 0x54D6, + 0xCE45, 0x54B6, 0xCE46, 0x54C5, 0xCE47, 0x54C6, 0xCE48, 0x54A0, + 0xCE49, 0x5470, 0xCE4A, 0x54BC, 0xCE4B, 0x54A2, 0xCE4C, 0x54BE, + 0xCE4D, 0x5472, 0xCE4E, 0x54DE, 0xCE4F, 0x54B0, 0xCE50, 0x57B5, + 0xCE51, 0x579E, 0xCE52, 0x579F, 0xCE53, 0x57A4, 0xCE54, 0x578C, + 0xCE55, 0x5797, 0xCE56, 0x579D, 0xCE57, 0x579B, 0xCE58, 0x5794, + 0xCE59, 0x5798, 0xCE5A, 0x578F, 0xCE5B, 0x5799, 0xCE5C, 0x57A5, + 0xCE5D, 0x579A, 0xCE5E, 0x5795, 0xCE5F, 0x58F4, 0xCE60, 0x590D, + 0xCE61, 0x5953, 0xCE62, 0x59E1, 0xCE63, 0x59DE, 0xCE64, 0x59EE, + 0xCE65, 0x5A00, 0xCE66, 0x59F1, 0xCE67, 0x59DD, 0xCE68, 0x59FA, + 0xCE69, 0x59FD, 0xCE6A, 0x59FC, 0xCE6B, 0x59F6, 0xCE6C, 0x59E4, + 0xCE6D, 0x59F2, 0xCE6E, 0x59F7, 0xCE6F, 0x59DB, 0xCE70, 0x59E9, + 0xCE71, 0x59F3, 0xCE72, 0x59F5, 0xCE73, 0x59E0, 0xCE74, 0x59FE, + 0xCE75, 0x59F4, 0xCE76, 0x59ED, 0xCE77, 0x5BA8, 0xCE78, 0x5C4C, + 0xCE79, 0x5CD0, 0xCE7A, 0x5CD8, 0xCE7B, 0x5CCC, 0xCE7C, 0x5CD7, + 0xCE7D, 0x5CCB, 0xCE7E, 0x5CDB, 0xCEA1, 0x5CDE, 0xCEA2, 0x5CDA, + 0xCEA3, 0x5CC9, 0xCEA4, 0x5CC7, 0xCEA5, 0x5CCA, 0xCEA6, 0x5CD6, + 0xCEA7, 0x5CD3, 0xCEA8, 0x5CD4, 0xCEA9, 0x5CCF, 0xCEAA, 0x5CC8, + 0xCEAB, 0x5CC6, 0xCEAC, 0x5CCE, 0xCEAD, 0x5CDF, 0xCEAE, 0x5CF8, + 0xCEAF, 0x5DF9, 0xCEB0, 0x5E21, 0xCEB1, 0x5E22, 0xCEB2, 0x5E23, + 0xCEB3, 0x5E20, 0xCEB4, 0x5E24, 0xCEB5, 0x5EB0, 0xCEB6, 0x5EA4, + 0xCEB7, 0x5EA2, 0xCEB8, 0x5E9B, 0xCEB9, 0x5EA3, 0xCEBA, 0x5EA5, + 0xCEBB, 0x5F07, 0xCEBC, 0x5F2E, 0xCEBD, 0x5F56, 0xCEBE, 0x5F86, + 0xCEBF, 0x6037, 0xCEC0, 0x6039, 0xCEC1, 0x6054, 0xCEC2, 0x6072, + 0xCEC3, 0x605E, 0xCEC4, 0x6045, 0xCEC5, 0x6053, 0xCEC6, 0x6047, + 0xCEC7, 0x6049, 0xCEC8, 0x605B, 0xCEC9, 0x604C, 0xCECA, 0x6040, + 0xCECB, 0x6042, 0xCECC, 0x605F, 0xCECD, 0x6024, 0xCECE, 0x6044, + 0xCECF, 0x6058, 0xCED0, 0x6066, 0xCED1, 0x606E, 0xCED2, 0x6242, + 0xCED3, 0x6243, 0xCED4, 0x62CF, 0xCED5, 0x630D, 0xCED6, 0x630B, + 0xCED7, 0x62F5, 0xCED8, 0x630E, 0xCED9, 0x6303, 0xCEDA, 0x62EB, + 0xCEDB, 0x62F9, 0xCEDC, 0x630F, 0xCEDD, 0x630C, 0xCEDE, 0x62F8, + 0xCEDF, 0x62F6, 0xCEE0, 0x6300, 0xCEE1, 0x6313, 0xCEE2, 0x6314, + 0xCEE3, 0x62FA, 0xCEE4, 0x6315, 0xCEE5, 0x62FB, 0xCEE6, 0x62F0, + 0xCEE7, 0x6541, 0xCEE8, 0x6543, 0xCEE9, 0x65AA, 0xCEEA, 0x65BF, + 0xCEEB, 0x6636, 0xCEEC, 0x6621, 0xCEED, 0x6632, 0xCEEE, 0x6635, + 0xCEEF, 0x661C, 0xCEF0, 0x6626, 0xCEF1, 0x6622, 0xCEF2, 0x6633, + 0xCEF3, 0x662B, 0xCEF4, 0x663A, 0xCEF5, 0x661D, 0xCEF6, 0x6634, + 0xCEF7, 0x6639, 0xCEF8, 0x662E, 0xCEF9, 0x670F, 0xCEFA, 0x6710, + 0xCEFB, 0x67C1, 0xCEFC, 0x67F2, 0xCEFD, 0x67C8, 0xCEFE, 0x67BA, + 0xCF40, 0x67DC, 0xCF41, 0x67BB, 0xCF42, 0x67F8, 0xCF43, 0x67D8, + 0xCF44, 0x67C0, 0xCF45, 0x67B7, 0xCF46, 0x67C5, 0xCF47, 0x67EB, + 0xCF48, 0x67E4, 0xCF49, 0x67DF, 0xCF4A, 0x67B5, 0xCF4B, 0x67CD, + 0xCF4C, 0x67B3, 0xCF4D, 0x67F7, 0xCF4E, 0x67F6, 0xCF4F, 0x67EE, + 0xCF50, 0x67E3, 0xCF51, 0x67C2, 0xCF52, 0x67B9, 0xCF53, 0x67CE, + 0xCF54, 0x67E7, 0xCF55, 0x67F0, 0xCF56, 0x67B2, 0xCF57, 0x67FC, + 0xCF58, 0x67C6, 0xCF59, 0x67ED, 0xCF5A, 0x67CC, 0xCF5B, 0x67AE, + 0xCF5C, 0x67E6, 0xCF5D, 0x67DB, 0xCF5E, 0x67FA, 0xCF5F, 0x67C9, + 0xCF60, 0x67CA, 0xCF61, 0x67C3, 0xCF62, 0x67EA, 0xCF63, 0x67CB, + 0xCF64, 0x6B28, 0xCF65, 0x6B82, 0xCF66, 0x6B84, 0xCF67, 0x6BB6, + 0xCF68, 0x6BD6, 0xCF69, 0x6BD8, 0xCF6A, 0x6BE0, 0xCF6B, 0x6C20, + 0xCF6C, 0x6C21, 0xCF6D, 0x6D28, 0xCF6E, 0x6D34, 0xCF6F, 0x6D2D, + 0xCF70, 0x6D1F, 0xCF71, 0x6D3C, 0xCF72, 0x6D3F, 0xCF73, 0x6D12, + 0xCF74, 0x6D0A, 0xCF75, 0x6CDA, 0xCF76, 0x6D33, 0xCF77, 0x6D04, + 0xCF78, 0x6D19, 0xCF79, 0x6D3A, 0xCF7A, 0x6D1A, 0xCF7B, 0x6D11, + 0xCF7C, 0x6D00, 0xCF7D, 0x6D1D, 0xCF7E, 0x6D42, 0xCFA1, 0x6D01, + 0xCFA2, 0x6D18, 0xCFA3, 0x6D37, 0xCFA4, 0x6D03, 0xCFA5, 0x6D0F, + 0xCFA6, 0x6D40, 0xCFA7, 0x6D07, 0xCFA8, 0x6D20, 0xCFA9, 0x6D2C, + 0xCFAA, 0x6D08, 0xCFAB, 0x6D22, 0xCFAC, 0x6D09, 0xCFAD, 0x6D10, + 0xCFAE, 0x70B7, 0xCFAF, 0x709F, 0xCFB0, 0x70BE, 0xCFB1, 0x70B1, + 0xCFB2, 0x70B0, 0xCFB3, 0x70A1, 0xCFB4, 0x70B4, 0xCFB5, 0x70B5, + 0xCFB6, 0x70A9, 0xCFB7, 0x7241, 0xCFB8, 0x7249, 0xCFB9, 0x724A, + 0xCFBA, 0x726C, 0xCFBB, 0x7270, 0xCFBC, 0x7273, 0xCFBD, 0x726E, + 0xCFBE, 0x72CA, 0xCFBF, 0x72E4, 0xCFC0, 0x72E8, 0xCFC1, 0x72EB, + 0xCFC2, 0x72DF, 0xCFC3, 0x72EA, 0xCFC4, 0x72E6, 0xCFC5, 0x72E3, + 0xCFC6, 0x7385, 0xCFC7, 0x73CC, 0xCFC8, 0x73C2, 0xCFC9, 0x73C8, + 0xCFCA, 0x73C5, 0xCFCB, 0x73B9, 0xCFCC, 0x73B6, 0xCFCD, 0x73B5, + 0xCFCE, 0x73B4, 0xCFCF, 0x73EB, 0xCFD0, 0x73BF, 0xCFD1, 0x73C7, + 0xCFD2, 0x73BE, 0xCFD3, 0x73C3, 0xCFD4, 0x73C6, 0xCFD5, 0x73B8, + 0xCFD6, 0x73CB, 0xCFD7, 0x74EC, 0xCFD8, 0x74EE, 0xCFD9, 0x752E, + 0xCFDA, 0x7547, 0xCFDB, 0x7548, 0xCFDC, 0x75A7, 0xCFDD, 0x75AA, + 0xCFDE, 0x7679, 0xCFDF, 0x76C4, 0xCFE0, 0x7708, 0xCFE1, 0x7703, + 0xCFE2, 0x7704, 0xCFE3, 0x7705, 0xCFE4, 0x770A, 0xCFE5, 0x76F7, + 0xCFE6, 0x76FB, 0xCFE7, 0x76FA, 0xCFE8, 0x77E7, 0xCFE9, 0x77E8, + 0xCFEA, 0x7806, 0xCFEB, 0x7811, 0xCFEC, 0x7812, 0xCFED, 0x7805, + 0xCFEE, 0x7810, 0xCFEF, 0x780F, 0xCFF0, 0x780E, 0xCFF1, 0x7809, + 0xCFF2, 0x7803, 0xCFF3, 0x7813, 0xCFF4, 0x794A, 0xCFF5, 0x794C, + 0xCFF6, 0x794B, 0xCFF7, 0x7945, 0xCFF8, 0x7944, 0xCFF9, 0x79D5, + 0xCFFA, 0x79CD, 0xCFFB, 0x79CF, 0xCFFC, 0x79D6, 0xCFFD, 0x79CE, + 0xCFFE, 0x7A80, 0xD040, 0x7A7E, 0xD041, 0x7AD1, 0xD042, 0x7B00, + 0xD043, 0x7B01, 0xD044, 0x7C7A, 0xD045, 0x7C78, 0xD046, 0x7C79, + 0xD047, 0x7C7F, 0xD048, 0x7C80, 0xD049, 0x7C81, 0xD04A, 0x7D03, + 0xD04B, 0x7D08, 0xD04C, 0x7D01, 0xD04D, 0x7F58, 0xD04E, 0x7F91, + 0xD04F, 0x7F8D, 0xD050, 0x7FBE, 0xD051, 0x8007, 0xD052, 0x800E, + 0xD053, 0x800F, 0xD054, 0x8014, 0xD055, 0x8037, 0xD056, 0x80D8, + 0xD057, 0x80C7, 0xD058, 0x80E0, 0xD059, 0x80D1, 0xD05A, 0x80C8, + 0xD05B, 0x80C2, 0xD05C, 0x80D0, 0xD05D, 0x80C5, 0xD05E, 0x80E3, + 0xD05F, 0x80D9, 0xD060, 0x80DC, 0xD061, 0x80CA, 0xD062, 0x80D5, + 0xD063, 0x80C9, 0xD064, 0x80CF, 0xD065, 0x80D7, 0xD066, 0x80E6, + 0xD067, 0x80CD, 0xD068, 0x81FF, 0xD069, 0x8221, 0xD06A, 0x8294, + 0xD06B, 0x82D9, 0xD06C, 0x82FE, 0xD06D, 0x82F9, 0xD06E, 0x8307, + 0xD06F, 0x82E8, 0xD070, 0x8300, 0xD071, 0x82D5, 0xD072, 0x833A, + 0xD073, 0x82EB, 0xD074, 0x82D6, 0xD075, 0x82F4, 0xD076, 0x82EC, + 0xD077, 0x82E1, 0xD078, 0x82F2, 0xD079, 0x82F5, 0xD07A, 0x830C, + 0xD07B, 0x82FB, 0xD07C, 0x82F6, 0xD07D, 0x82F0, 0xD07E, 0x82EA, + 0xD0A1, 0x82E4, 0xD0A2, 0x82E0, 0xD0A3, 0x82FA, 0xD0A4, 0x82F3, + 0xD0A5, 0x82ED, 0xD0A6, 0x8677, 0xD0A7, 0x8674, 0xD0A8, 0x867C, + 0xD0A9, 0x8673, 0xD0AA, 0x8841, 0xD0AB, 0x884E, 0xD0AC, 0x8867, + 0xD0AD, 0x886A, 0xD0AE, 0x8869, 0xD0AF, 0x89D3, 0xD0B0, 0x8A04, + 0xD0B1, 0x8A07, 0xD0B2, 0x8D72, 0xD0B3, 0x8FE3, 0xD0B4, 0x8FE1, + 0xD0B5, 0x8FEE, 0xD0B6, 0x8FE0, 0xD0B7, 0x90F1, 0xD0B8, 0x90BD, + 0xD0B9, 0x90BF, 0xD0BA, 0x90D5, 0xD0BB, 0x90C5, 0xD0BC, 0x90BE, + 0xD0BD, 0x90C7, 0xD0BE, 0x90CB, 0xD0BF, 0x90C8, 0xD0C0, 0x91D4, + 0xD0C1, 0x91D3, 0xD0C2, 0x9654, 0xD0C3, 0x964F, 0xD0C4, 0x9651, + 0xD0C5, 0x9653, 0xD0C6, 0x964A, 0xD0C7, 0x964E, 0xD0C8, 0x501E, + 0xD0C9, 0x5005, 0xD0CA, 0x5007, 0xD0CB, 0x5013, 0xD0CC, 0x5022, + 0xD0CD, 0x5030, 0xD0CE, 0x501B, 0xD0CF, 0x4FF5, 0xD0D0, 0x4FF4, + 0xD0D1, 0x5033, 0xD0D2, 0x5037, 0xD0D3, 0x502C, 0xD0D4, 0x4FF6, + 0xD0D5, 0x4FF7, 0xD0D6, 0x5017, 0xD0D7, 0x501C, 0xD0D8, 0x5020, + 0xD0D9, 0x5027, 0xD0DA, 0x5035, 0xD0DB, 0x502F, 0xD0DC, 0x5031, + 0xD0DD, 0x500E, 0xD0DE, 0x515A, 0xD0DF, 0x5194, 0xD0E0, 0x5193, + 0xD0E1, 0x51CA, 0xD0E2, 0x51C4, 0xD0E3, 0x51C5, 0xD0E4, 0x51C8, + 0xD0E5, 0x51CE, 0xD0E6, 0x5261, 0xD0E7, 0x525A, 0xD0E8, 0x5252, + 0xD0E9, 0x525E, 0xD0EA, 0x525F, 0xD0EB, 0x5255, 0xD0EC, 0x5262, + 0xD0ED, 0x52CD, 0xD0EE, 0x530E, 0xD0EF, 0x539E, 0xD0F0, 0x5526, + 0xD0F1, 0x54E2, 0xD0F2, 0x5517, 0xD0F3, 0x5512, 0xD0F4, 0x54E7, + 0xD0F5, 0x54F3, 0xD0F6, 0x54E4, 0xD0F7, 0x551A, 0xD0F8, 0x54FF, + 0xD0F9, 0x5504, 0xD0FA, 0x5508, 0xD0FB, 0x54EB, 0xD0FC, 0x5511, + 0xD0FD, 0x5505, 0xD0FE, 0x54F1, 0xD140, 0x550A, 0xD141, 0x54FB, + 0xD142, 0x54F7, 0xD143, 0x54F8, 0xD144, 0x54E0, 0xD145, 0x550E, + 0xD146, 0x5503, 0xD147, 0x550B, 0xD148, 0x5701, 0xD149, 0x5702, + 0xD14A, 0x57CC, 0xD14B, 0x5832, 0xD14C, 0x57D5, 0xD14D, 0x57D2, + 0xD14E, 0x57BA, 0xD14F, 0x57C6, 0xD150, 0x57BD, 0xD151, 0x57BC, + 0xD152, 0x57B8, 0xD153, 0x57B6, 0xD154, 0x57BF, 0xD155, 0x57C7, + 0xD156, 0x57D0, 0xD157, 0x57B9, 0xD158, 0x57C1, 0xD159, 0x590E, + 0xD15A, 0x594A, 0xD15B, 0x5A19, 0xD15C, 0x5A16, 0xD15D, 0x5A2D, + 0xD15E, 0x5A2E, 0xD15F, 0x5A15, 0xD160, 0x5A0F, 0xD161, 0x5A17, + 0xD162, 0x5A0A, 0xD163, 0x5A1E, 0xD164, 0x5A33, 0xD165, 0x5B6C, + 0xD166, 0x5BA7, 0xD167, 0x5BAD, 0xD168, 0x5BAC, 0xD169, 0x5C03, + 0xD16A, 0x5C56, 0xD16B, 0x5C54, 0xD16C, 0x5CEC, 0xD16D, 0x5CFF, + 0xD16E, 0x5CEE, 0xD16F, 0x5CF1, 0xD170, 0x5CF7, 0xD171, 0x5D00, + 0xD172, 0x5CF9, 0xD173, 0x5E29, 0xD174, 0x5E28, 0xD175, 0x5EA8, + 0xD176, 0x5EAE, 0xD177, 0x5EAA, 0xD178, 0x5EAC, 0xD179, 0x5F33, + 0xD17A, 0x5F30, 0xD17B, 0x5F67, 0xD17C, 0x605D, 0xD17D, 0x605A, + 0xD17E, 0x6067, 0xD1A1, 0x6041, 0xD1A2, 0x60A2, 0xD1A3, 0x6088, + 0xD1A4, 0x6080, 0xD1A5, 0x6092, 0xD1A6, 0x6081, 0xD1A7, 0x609D, + 0xD1A8, 0x6083, 0xD1A9, 0x6095, 0xD1AA, 0x609B, 0xD1AB, 0x6097, + 0xD1AC, 0x6087, 0xD1AD, 0x609C, 0xD1AE, 0x608E, 0xD1AF, 0x6219, + 0xD1B0, 0x6246, 0xD1B1, 0x62F2, 0xD1B2, 0x6310, 0xD1B3, 0x6356, + 0xD1B4, 0x632C, 0xD1B5, 0x6344, 0xD1B6, 0x6345, 0xD1B7, 0x6336, + 0xD1B8, 0x6343, 0xD1B9, 0x63E4, 0xD1BA, 0x6339, 0xD1BB, 0x634B, + 0xD1BC, 0x634A, 0xD1BD, 0x633C, 0xD1BE, 0x6329, 0xD1BF, 0x6341, + 0xD1C0, 0x6334, 0xD1C1, 0x6358, 0xD1C2, 0x6354, 0xD1C3, 0x6359, + 0xD1C4, 0x632D, 0xD1C5, 0x6347, 0xD1C6, 0x6333, 0xD1C7, 0x635A, + 0xD1C8, 0x6351, 0xD1C9, 0x6338, 0xD1CA, 0x6357, 0xD1CB, 0x6340, + 0xD1CC, 0x6348, 0xD1CD, 0x654A, 0xD1CE, 0x6546, 0xD1CF, 0x65C6, + 0xD1D0, 0x65C3, 0xD1D1, 0x65C4, 0xD1D2, 0x65C2, 0xD1D3, 0x664A, + 0xD1D4, 0x665F, 0xD1D5, 0x6647, 0xD1D6, 0x6651, 0xD1D7, 0x6712, + 0xD1D8, 0x6713, 0xD1D9, 0x681F, 0xD1DA, 0x681A, 0xD1DB, 0x6849, + 0xD1DC, 0x6832, 0xD1DD, 0x6833, 0xD1DE, 0x683B, 0xD1DF, 0x684B, + 0xD1E0, 0x684F, 0xD1E1, 0x6816, 0xD1E2, 0x6831, 0xD1E3, 0x681C, + 0xD1E4, 0x6835, 0xD1E5, 0x682B, 0xD1E6, 0x682D, 0xD1E7, 0x682F, + 0xD1E8, 0x684E, 0xD1E9, 0x6844, 0xD1EA, 0x6834, 0xD1EB, 0x681D, + 0xD1EC, 0x6812, 0xD1ED, 0x6814, 0xD1EE, 0x6826, 0xD1EF, 0x6828, + 0xD1F0, 0x682E, 0xD1F1, 0x684D, 0xD1F2, 0x683A, 0xD1F3, 0x6825, + 0xD1F4, 0x6820, 0xD1F5, 0x6B2C, 0xD1F6, 0x6B2F, 0xD1F7, 0x6B2D, + 0xD1F8, 0x6B31, 0xD1F9, 0x6B34, 0xD1FA, 0x6B6D, 0xD1FB, 0x8082, + 0xD1FC, 0x6B88, 0xD1FD, 0x6BE6, 0xD1FE, 0x6BE4, 0xD240, 0x6BE8, + 0xD241, 0x6BE3, 0xD242, 0x6BE2, 0xD243, 0x6BE7, 0xD244, 0x6C25, + 0xD245, 0x6D7A, 0xD246, 0x6D63, 0xD247, 0x6D64, 0xD248, 0x6D76, + 0xD249, 0x6D0D, 0xD24A, 0x6D61, 0xD24B, 0x6D92, 0xD24C, 0x6D58, + 0xD24D, 0x6D62, 0xD24E, 0x6D6D, 0xD24F, 0x6D6F, 0xD250, 0x6D91, + 0xD251, 0x6D8D, 0xD252, 0x6DEF, 0xD253, 0x6D7F, 0xD254, 0x6D86, + 0xD255, 0x6D5E, 0xD256, 0x6D67, 0xD257, 0x6D60, 0xD258, 0x6D97, + 0xD259, 0x6D70, 0xD25A, 0x6D7C, 0xD25B, 0x6D5F, 0xD25C, 0x6D82, + 0xD25D, 0x6D98, 0xD25E, 0x6D2F, 0xD25F, 0x6D68, 0xD260, 0x6D8B, + 0xD261, 0x6D7E, 0xD262, 0x6D80, 0xD263, 0x6D84, 0xD264, 0x6D16, + 0xD265, 0x6D83, 0xD266, 0x6D7B, 0xD267, 0x6D7D, 0xD268, 0x6D75, + 0xD269, 0x6D90, 0xD26A, 0x70DC, 0xD26B, 0x70D3, 0xD26C, 0x70D1, + 0xD26D, 0x70DD, 0xD26E, 0x70CB, 0xD26F, 0x7F39, 0xD270, 0x70E2, + 0xD271, 0x70D7, 0xD272, 0x70D2, 0xD273, 0x70DE, 0xD274, 0x70E0, + 0xD275, 0x70D4, 0xD276, 0x70CD, 0xD277, 0x70C5, 0xD278, 0x70C6, + 0xD279, 0x70C7, 0xD27A, 0x70DA, 0xD27B, 0x70CE, 0xD27C, 0x70E1, + 0xD27D, 0x7242, 0xD27E, 0x7278, 0xD2A1, 0x7277, 0xD2A2, 0x7276, + 0xD2A3, 0x7300, 0xD2A4, 0x72FA, 0xD2A5, 0x72F4, 0xD2A6, 0x72FE, + 0xD2A7, 0x72F6, 0xD2A8, 0x72F3, 0xD2A9, 0x72FB, 0xD2AA, 0x7301, + 0xD2AB, 0x73D3, 0xD2AC, 0x73D9, 0xD2AD, 0x73E5, 0xD2AE, 0x73D6, + 0xD2AF, 0x73BC, 0xD2B0, 0x73E7, 0xD2B1, 0x73E3, 0xD2B2, 0x73E9, + 0xD2B3, 0x73DC, 0xD2B4, 0x73D2, 0xD2B5, 0x73DB, 0xD2B6, 0x73D4, + 0xD2B7, 0x73DD, 0xD2B8, 0x73DA, 0xD2B9, 0x73D7, 0xD2BA, 0x73D8, + 0xD2BB, 0x73E8, 0xD2BC, 0x74DE, 0xD2BD, 0x74DF, 0xD2BE, 0x74F4, + 0xD2BF, 0x74F5, 0xD2C0, 0x7521, 0xD2C1, 0x755B, 0xD2C2, 0x755F, + 0xD2C3, 0x75B0, 0xD2C4, 0x75C1, 0xD2C5, 0x75BB, 0xD2C6, 0x75C4, + 0xD2C7, 0x75C0, 0xD2C8, 0x75BF, 0xD2C9, 0x75B6, 0xD2CA, 0x75BA, + 0xD2CB, 0x768A, 0xD2CC, 0x76C9, 0xD2CD, 0x771D, 0xD2CE, 0x771B, + 0xD2CF, 0x7710, 0xD2D0, 0x7713, 0xD2D1, 0x7712, 0xD2D2, 0x7723, + 0xD2D3, 0x7711, 0xD2D4, 0x7715, 0xD2D5, 0x7719, 0xD2D6, 0x771A, + 0xD2D7, 0x7722, 0xD2D8, 0x7727, 0xD2D9, 0x7823, 0xD2DA, 0x782C, + 0xD2DB, 0x7822, 0xD2DC, 0x7835, 0xD2DD, 0x782F, 0xD2DE, 0x7828, + 0xD2DF, 0x782E, 0xD2E0, 0x782B, 0xD2E1, 0x7821, 0xD2E2, 0x7829, + 0xD2E3, 0x7833, 0xD2E4, 0x782A, 0xD2E5, 0x7831, 0xD2E6, 0x7954, + 0xD2E7, 0x795B, 0xD2E8, 0x794F, 0xD2E9, 0x795C, 0xD2EA, 0x7953, + 0xD2EB, 0x7952, 0xD2EC, 0x7951, 0xD2ED, 0x79EB, 0xD2EE, 0x79EC, + 0xD2EF, 0x79E0, 0xD2F0, 0x79EE, 0xD2F1, 0x79ED, 0xD2F2, 0x79EA, + 0xD2F3, 0x79DC, 0xD2F4, 0x79DE, 0xD2F5, 0x79DD, 0xD2F6, 0x7A86, + 0xD2F7, 0x7A89, 0xD2F8, 0x7A85, 0xD2F9, 0x7A8B, 0xD2FA, 0x7A8C, + 0xD2FB, 0x7A8A, 0xD2FC, 0x7A87, 0xD2FD, 0x7AD8, 0xD2FE, 0x7B10, + 0xD340, 0x7B04, 0xD341, 0x7B13, 0xD342, 0x7B05, 0xD343, 0x7B0F, + 0xD344, 0x7B08, 0xD345, 0x7B0A, 0xD346, 0x7B0E, 0xD347, 0x7B09, + 0xD348, 0x7B12, 0xD349, 0x7C84, 0xD34A, 0x7C91, 0xD34B, 0x7C8A, + 0xD34C, 0x7C8C, 0xD34D, 0x7C88, 0xD34E, 0x7C8D, 0xD34F, 0x7C85, + 0xD350, 0x7D1E, 0xD351, 0x7D1D, 0xD352, 0x7D11, 0xD353, 0x7D0E, + 0xD354, 0x7D18, 0xD355, 0x7D16, 0xD356, 0x7D13, 0xD357, 0x7D1F, + 0xD358, 0x7D12, 0xD359, 0x7D0F, 0xD35A, 0x7D0C, 0xD35B, 0x7F5C, + 0xD35C, 0x7F61, 0xD35D, 0x7F5E, 0xD35E, 0x7F60, 0xD35F, 0x7F5D, + 0xD360, 0x7F5B, 0xD361, 0x7F96, 0xD362, 0x7F92, 0xD363, 0x7FC3, + 0xD364, 0x7FC2, 0xD365, 0x7FC0, 0xD366, 0x8016, 0xD367, 0x803E, + 0xD368, 0x8039, 0xD369, 0x80FA, 0xD36A, 0x80F2, 0xD36B, 0x80F9, + 0xD36C, 0x80F5, 0xD36D, 0x8101, 0xD36E, 0x80FB, 0xD36F, 0x8100, + 0xD370, 0x8201, 0xD371, 0x822F, 0xD372, 0x8225, 0xD373, 0x8333, + 0xD374, 0x832D, 0xD375, 0x8344, 0xD376, 0x8319, 0xD377, 0x8351, + 0xD378, 0x8325, 0xD379, 0x8356, 0xD37A, 0x833F, 0xD37B, 0x8341, + 0xD37C, 0x8326, 0xD37D, 0x831C, 0xD37E, 0x8322, 0xD3A1, 0x8342, + 0xD3A2, 0x834E, 0xD3A3, 0x831B, 0xD3A4, 0x832A, 0xD3A5, 0x8308, + 0xD3A6, 0x833C, 0xD3A7, 0x834D, 0xD3A8, 0x8316, 0xD3A9, 0x8324, + 0xD3AA, 0x8320, 0xD3AB, 0x8337, 0xD3AC, 0x832F, 0xD3AD, 0x8329, + 0xD3AE, 0x8347, 0xD3AF, 0x8345, 0xD3B0, 0x834C, 0xD3B1, 0x8353, + 0xD3B2, 0x831E, 0xD3B3, 0x832C, 0xD3B4, 0x834B, 0xD3B5, 0x8327, + 0xD3B6, 0x8348, 0xD3B7, 0x8653, 0xD3B8, 0x8652, 0xD3B9, 0x86A2, + 0xD3BA, 0x86A8, 0xD3BB, 0x8696, 0xD3BC, 0x868D, 0xD3BD, 0x8691, + 0xD3BE, 0x869E, 0xD3BF, 0x8687, 0xD3C0, 0x8697, 0xD3C1, 0x8686, + 0xD3C2, 0x868B, 0xD3C3, 0x869A, 0xD3C4, 0x8685, 0xD3C5, 0x86A5, + 0xD3C6, 0x8699, 0xD3C7, 0x86A1, 0xD3C8, 0x86A7, 0xD3C9, 0x8695, + 0xD3CA, 0x8698, 0xD3CB, 0x868E, 0xD3CC, 0x869D, 0xD3CD, 0x8690, + 0xD3CE, 0x8694, 0xD3CF, 0x8843, 0xD3D0, 0x8844, 0xD3D1, 0x886D, + 0xD3D2, 0x8875, 0xD3D3, 0x8876, 0xD3D4, 0x8872, 0xD3D5, 0x8880, + 0xD3D6, 0x8871, 0xD3D7, 0x887F, 0xD3D8, 0x886F, 0xD3D9, 0x8883, + 0xD3DA, 0x887E, 0xD3DB, 0x8874, 0xD3DC, 0x887C, 0xD3DD, 0x8A12, + 0xD3DE, 0x8C47, 0xD3DF, 0x8C57, 0xD3E0, 0x8C7B, 0xD3E1, 0x8CA4, + 0xD3E2, 0x8CA3, 0xD3E3, 0x8D76, 0xD3E4, 0x8D78, 0xD3E5, 0x8DB5, + 0xD3E6, 0x8DB7, 0xD3E7, 0x8DB6, 0xD3E8, 0x8ED1, 0xD3E9, 0x8ED3, + 0xD3EA, 0x8FFE, 0xD3EB, 0x8FF5, 0xD3EC, 0x9002, 0xD3ED, 0x8FFF, + 0xD3EE, 0x8FFB, 0xD3EF, 0x9004, 0xD3F0, 0x8FFC, 0xD3F1, 0x8FF6, + 0xD3F2, 0x90D6, 0xD3F3, 0x90E0, 0xD3F4, 0x90D9, 0xD3F5, 0x90DA, + 0xD3F6, 0x90E3, 0xD3F7, 0x90DF, 0xD3F8, 0x90E5, 0xD3F9, 0x90D8, + 0xD3FA, 0x90DB, 0xD3FB, 0x90D7, 0xD3FC, 0x90DC, 0xD3FD, 0x90E4, + 0xD3FE, 0x9150, 0xD440, 0x914E, 0xD441, 0x914F, 0xD442, 0x91D5, + 0xD443, 0x91E2, 0xD444, 0x91DA, 0xD445, 0x965C, 0xD446, 0x965F, + 0xD447, 0x96BC, 0xD448, 0x98E3, 0xD449, 0x9ADF, 0xD44A, 0x9B2F, + 0xD44B, 0x4E7F, 0xD44C, 0x5070, 0xD44D, 0x506A, 0xD44E, 0x5061, + 0xD44F, 0x505E, 0xD450, 0x5060, 0xD451, 0x5053, 0xD452, 0x504B, + 0xD453, 0x505D, 0xD454, 0x5072, 0xD455, 0x5048, 0xD456, 0x504D, + 0xD457, 0x5041, 0xD458, 0x505B, 0xD459, 0x504A, 0xD45A, 0x5062, + 0xD45B, 0x5015, 0xD45C, 0x5045, 0xD45D, 0x505F, 0xD45E, 0x5069, + 0xD45F, 0x506B, 0xD460, 0x5063, 0xD461, 0x5064, 0xD462, 0x5046, + 0xD463, 0x5040, 0xD464, 0x506E, 0xD465, 0x5073, 0xD466, 0x5057, + 0xD467, 0x5051, 0xD468, 0x51D0, 0xD469, 0x526B, 0xD46A, 0x526D, + 0xD46B, 0x526C, 0xD46C, 0x526E, 0xD46D, 0x52D6, 0xD46E, 0x52D3, + 0xD46F, 0x532D, 0xD470, 0x539C, 0xD471, 0x5575, 0xD472, 0x5576, + 0xD473, 0x553C, 0xD474, 0x554D, 0xD475, 0x5550, 0xD476, 0x5534, + 0xD477, 0x552A, 0xD478, 0x5551, 0xD479, 0x5562, 0xD47A, 0x5536, + 0xD47B, 0x5535, 0xD47C, 0x5530, 0xD47D, 0x5552, 0xD47E, 0x5545, + 0xD4A1, 0x550C, 0xD4A2, 0x5532, 0xD4A3, 0x5565, 0xD4A4, 0x554E, + 0xD4A5, 0x5539, 0xD4A6, 0x5548, 0xD4A7, 0x552D, 0xD4A8, 0x553B, + 0xD4A9, 0x5540, 0xD4AA, 0x554B, 0xD4AB, 0x570A, 0xD4AC, 0x5707, + 0xD4AD, 0x57FB, 0xD4AE, 0x5814, 0xD4AF, 0x57E2, 0xD4B0, 0x57F6, + 0xD4B1, 0x57DC, 0xD4B2, 0x57F4, 0xD4B3, 0x5800, 0xD4B4, 0x57ED, + 0xD4B5, 0x57FD, 0xD4B6, 0x5808, 0xD4B7, 0x57F8, 0xD4B8, 0x580B, + 0xD4B9, 0x57F3, 0xD4BA, 0x57CF, 0xD4BB, 0x5807, 0xD4BC, 0x57EE, + 0xD4BD, 0x57E3, 0xD4BE, 0x57F2, 0xD4BF, 0x57E5, 0xD4C0, 0x57EC, + 0xD4C1, 0x57E1, 0xD4C2, 0x580E, 0xD4C3, 0x57FC, 0xD4C4, 0x5810, + 0xD4C5, 0x57E7, 0xD4C6, 0x5801, 0xD4C7, 0x580C, 0xD4C8, 0x57F1, + 0xD4C9, 0x57E9, 0xD4CA, 0x57F0, 0xD4CB, 0x580D, 0xD4CC, 0x5804, + 0xD4CD, 0x595C, 0xD4CE, 0x5A60, 0xD4CF, 0x5A58, 0xD4D0, 0x5A55, + 0xD4D1, 0x5A67, 0xD4D2, 0x5A5E, 0xD4D3, 0x5A38, 0xD4D4, 0x5A35, + 0xD4D5, 0x5A6D, 0xD4D6, 0x5A50, 0xD4D7, 0x5A5F, 0xD4D8, 0x5A65, + 0xD4D9, 0x5A6C, 0xD4DA, 0x5A53, 0xD4DB, 0x5A64, 0xD4DC, 0x5A57, + 0xD4DD, 0x5A43, 0xD4DE, 0x5A5D, 0xD4DF, 0x5A52, 0xD4E0, 0x5A44, + 0xD4E1, 0x5A5B, 0xD4E2, 0x5A48, 0xD4E3, 0x5A8E, 0xD4E4, 0x5A3E, + 0xD4E5, 0x5A4D, 0xD4E6, 0x5A39, 0xD4E7, 0x5A4C, 0xD4E8, 0x5A70, + 0xD4E9, 0x5A69, 0xD4EA, 0x5A47, 0xD4EB, 0x5A51, 0xD4EC, 0x5A56, + 0xD4ED, 0x5A42, 0xD4EE, 0x5A5C, 0xD4EF, 0x5B72, 0xD4F0, 0x5B6E, + 0xD4F1, 0x5BC1, 0xD4F2, 0x5BC0, 0xD4F3, 0x5C59, 0xD4F4, 0x5D1E, + 0xD4F5, 0x5D0B, 0xD4F6, 0x5D1D, 0xD4F7, 0x5D1A, 0xD4F8, 0x5D20, + 0xD4F9, 0x5D0C, 0xD4FA, 0x5D28, 0xD4FB, 0x5D0D, 0xD4FC, 0x5D26, + 0xD4FD, 0x5D25, 0xD4FE, 0x5D0F, 0xD540, 0x5D30, 0xD541, 0x5D12, + 0xD542, 0x5D23, 0xD543, 0x5D1F, 0xD544, 0x5D2E, 0xD545, 0x5E3E, + 0xD546, 0x5E34, 0xD547, 0x5EB1, 0xD548, 0x5EB4, 0xD549, 0x5EB9, + 0xD54A, 0x5EB2, 0xD54B, 0x5EB3, 0xD54C, 0x5F36, 0xD54D, 0x5F38, + 0xD54E, 0x5F9B, 0xD54F, 0x5F96, 0xD550, 0x5F9F, 0xD551, 0x608A, + 0xD552, 0x6090, 0xD553, 0x6086, 0xD554, 0x60BE, 0xD555, 0x60B0, + 0xD556, 0x60BA, 0xD557, 0x60D3, 0xD558, 0x60D4, 0xD559, 0x60CF, + 0xD55A, 0x60E4, 0xD55B, 0x60D9, 0xD55C, 0x60DD, 0xD55D, 0x60C8, + 0xD55E, 0x60B1, 0xD55F, 0x60DB, 0xD560, 0x60B7, 0xD561, 0x60CA, + 0xD562, 0x60BF, 0xD563, 0x60C3, 0xD564, 0x60CD, 0xD565, 0x60C0, + 0xD566, 0x6332, 0xD567, 0x6365, 0xD568, 0x638A, 0xD569, 0x6382, + 0xD56A, 0x637D, 0xD56B, 0x63BD, 0xD56C, 0x639E, 0xD56D, 0x63AD, + 0xD56E, 0x639D, 0xD56F, 0x6397, 0xD570, 0x63AB, 0xD571, 0x638E, + 0xD572, 0x636F, 0xD573, 0x6387, 0xD574, 0x6390, 0xD575, 0x636E, + 0xD576, 0x63AF, 0xD577, 0x6375, 0xD578, 0x639C, 0xD579, 0x636D, + 0xD57A, 0x63AE, 0xD57B, 0x637C, 0xD57C, 0x63A4, 0xD57D, 0x633B, + 0xD57E, 0x639F, 0xD5A1, 0x6378, 0xD5A2, 0x6385, 0xD5A3, 0x6381, + 0xD5A4, 0x6391, 0xD5A5, 0x638D, 0xD5A6, 0x6370, 0xD5A7, 0x6553, + 0xD5A8, 0x65CD, 0xD5A9, 0x6665, 0xD5AA, 0x6661, 0xD5AB, 0x665B, + 0xD5AC, 0x6659, 0xD5AD, 0x665C, 0xD5AE, 0x6662, 0xD5AF, 0x6718, + 0xD5B0, 0x6879, 0xD5B1, 0x6887, 0xD5B2, 0x6890, 0xD5B3, 0x689C, + 0xD5B4, 0x686D, 0xD5B5, 0x686E, 0xD5B6, 0x68AE, 0xD5B7, 0x68AB, + 0xD5B8, 0x6956, 0xD5B9, 0x686F, 0xD5BA, 0x68A3, 0xD5BB, 0x68AC, + 0xD5BC, 0x68A9, 0xD5BD, 0x6875, 0xD5BE, 0x6874, 0xD5BF, 0x68B2, + 0xD5C0, 0x688F, 0xD5C1, 0x6877, 0xD5C2, 0x6892, 0xD5C3, 0x687C, + 0xD5C4, 0x686B, 0xD5C5, 0x6872, 0xD5C6, 0x68AA, 0xD5C7, 0x6880, + 0xD5C8, 0x6871, 0xD5C9, 0x687E, 0xD5CA, 0x689B, 0xD5CB, 0x6896, + 0xD5CC, 0x688B, 0xD5CD, 0x68A0, 0xD5CE, 0x6889, 0xD5CF, 0x68A4, + 0xD5D0, 0x6878, 0xD5D1, 0x687B, 0xD5D2, 0x6891, 0xD5D3, 0x688C, + 0xD5D4, 0x688A, 0xD5D5, 0x687D, 0xD5D6, 0x6B36, 0xD5D7, 0x6B33, + 0xD5D8, 0x6B37, 0xD5D9, 0x6B38, 0xD5DA, 0x6B91, 0xD5DB, 0x6B8F, + 0xD5DC, 0x6B8D, 0xD5DD, 0x6B8E, 0xD5DE, 0x6B8C, 0xD5DF, 0x6C2A, + 0xD5E0, 0x6DC0, 0xD5E1, 0x6DAB, 0xD5E2, 0x6DB4, 0xD5E3, 0x6DB3, + 0xD5E4, 0x6E74, 0xD5E5, 0x6DAC, 0xD5E6, 0x6DE9, 0xD5E7, 0x6DE2, + 0xD5E8, 0x6DB7, 0xD5E9, 0x6DF6, 0xD5EA, 0x6DD4, 0xD5EB, 0x6E00, + 0xD5EC, 0x6DC8, 0xD5ED, 0x6DE0, 0xD5EE, 0x6DDF, 0xD5EF, 0x6DD6, + 0xD5F0, 0x6DBE, 0xD5F1, 0x6DE5, 0xD5F2, 0x6DDC, 0xD5F3, 0x6DDD, + 0xD5F4, 0x6DDB, 0xD5F5, 0x6DF4, 0xD5F6, 0x6DCA, 0xD5F7, 0x6DBD, + 0xD5F8, 0x6DED, 0xD5F9, 0x6DF0, 0xD5FA, 0x6DBA, 0xD5FB, 0x6DD5, + 0xD5FC, 0x6DC2, 0xD5FD, 0x6DCF, 0xD5FE, 0x6DC9, 0xD640, 0x6DD0, + 0xD641, 0x6DF2, 0xD642, 0x6DD3, 0xD643, 0x6DFD, 0xD644, 0x6DD7, + 0xD645, 0x6DCD, 0xD646, 0x6DE3, 0xD647, 0x6DBB, 0xD648, 0x70FA, + 0xD649, 0x710D, 0xD64A, 0x70F7, 0xD64B, 0x7117, 0xD64C, 0x70F4, + 0xD64D, 0x710C, 0xD64E, 0x70F0, 0xD64F, 0x7104, 0xD650, 0x70F3, + 0xD651, 0x7110, 0xD652, 0x70FC, 0xD653, 0x70FF, 0xD654, 0x7106, + 0xD655, 0x7113, 0xD656, 0x7100, 0xD657, 0x70F8, 0xD658, 0x70F6, + 0xD659, 0x710B, 0xD65A, 0x7102, 0xD65B, 0x710E, 0xD65C, 0x727E, + 0xD65D, 0x727B, 0xD65E, 0x727C, 0xD65F, 0x727F, 0xD660, 0x731D, + 0xD661, 0x7317, 0xD662, 0x7307, 0xD663, 0x7311, 0xD664, 0x7318, + 0xD665, 0x730A, 0xD666, 0x7308, 0xD667, 0x72FF, 0xD668, 0x730F, + 0xD669, 0x731E, 0xD66A, 0x7388, 0xD66B, 0x73F6, 0xD66C, 0x73F8, + 0xD66D, 0x73F5, 0xD66E, 0x7404, 0xD66F, 0x7401, 0xD670, 0x73FD, + 0xD671, 0x7407, 0xD672, 0x7400, 0xD673, 0x73FA, 0xD674, 0x73FC, + 0xD675, 0x73FF, 0xD676, 0x740C, 0xD677, 0x740B, 0xD678, 0x73F4, + 0xD679, 0x7408, 0xD67A, 0x7564, 0xD67B, 0x7563, 0xD67C, 0x75CE, + 0xD67D, 0x75D2, 0xD67E, 0x75CF, 0xD6A1, 0x75CB, 0xD6A2, 0x75CC, + 0xD6A3, 0x75D1, 0xD6A4, 0x75D0, 0xD6A5, 0x768F, 0xD6A6, 0x7689, + 0xD6A7, 0x76D3, 0xD6A8, 0x7739, 0xD6A9, 0x772F, 0xD6AA, 0x772D, + 0xD6AB, 0x7731, 0xD6AC, 0x7732, 0xD6AD, 0x7734, 0xD6AE, 0x7733, + 0xD6AF, 0x773D, 0xD6B0, 0x7725, 0xD6B1, 0x773B, 0xD6B2, 0x7735, + 0xD6B3, 0x7848, 0xD6B4, 0x7852, 0xD6B5, 0x7849, 0xD6B6, 0x784D, + 0xD6B7, 0x784A, 0xD6B8, 0x784C, 0xD6B9, 0x7826, 0xD6BA, 0x7845, + 0xD6BB, 0x7850, 0xD6BC, 0x7964, 0xD6BD, 0x7967, 0xD6BE, 0x7969, + 0xD6BF, 0x796A, 0xD6C0, 0x7963, 0xD6C1, 0x796B, 0xD6C2, 0x7961, + 0xD6C3, 0x79BB, 0xD6C4, 0x79FA, 0xD6C5, 0x79F8, 0xD6C6, 0x79F6, + 0xD6C7, 0x79F7, 0xD6C8, 0x7A8F, 0xD6C9, 0x7A94, 0xD6CA, 0x7A90, + 0xD6CB, 0x7B35, 0xD6CC, 0x7B47, 0xD6CD, 0x7B34, 0xD6CE, 0x7B25, + 0xD6CF, 0x7B30, 0xD6D0, 0x7B22, 0xD6D1, 0x7B24, 0xD6D2, 0x7B33, + 0xD6D3, 0x7B18, 0xD6D4, 0x7B2A, 0xD6D5, 0x7B1D, 0xD6D6, 0x7B31, + 0xD6D7, 0x7B2B, 0xD6D8, 0x7B2D, 0xD6D9, 0x7B2F, 0xD6DA, 0x7B32, + 0xD6DB, 0x7B38, 0xD6DC, 0x7B1A, 0xD6DD, 0x7B23, 0xD6DE, 0x7C94, + 0xD6DF, 0x7C98, 0xD6E0, 0x7C96, 0xD6E1, 0x7CA3, 0xD6E2, 0x7D35, + 0xD6E3, 0x7D3D, 0xD6E4, 0x7D38, 0xD6E5, 0x7D36, 0xD6E6, 0x7D3A, + 0xD6E7, 0x7D45, 0xD6E8, 0x7D2C, 0xD6E9, 0x7D29, 0xD6EA, 0x7D41, + 0xD6EB, 0x7D47, 0xD6EC, 0x7D3E, 0xD6ED, 0x7D3F, 0xD6EE, 0x7D4A, + 0xD6EF, 0x7D3B, 0xD6F0, 0x7D28, 0xD6F1, 0x7F63, 0xD6F2, 0x7F95, + 0xD6F3, 0x7F9C, 0xD6F4, 0x7F9D, 0xD6F5, 0x7F9B, 0xD6F6, 0x7FCA, + 0xD6F7, 0x7FCB, 0xD6F8, 0x7FCD, 0xD6F9, 0x7FD0, 0xD6FA, 0x7FD1, + 0xD6FB, 0x7FC7, 0xD6FC, 0x7FCF, 0xD6FD, 0x7FC9, 0xD6FE, 0x801F, + 0xD740, 0x801E, 0xD741, 0x801B, 0xD742, 0x8047, 0xD743, 0x8043, + 0xD744, 0x8048, 0xD745, 0x8118, 0xD746, 0x8125, 0xD747, 0x8119, + 0xD748, 0x811B, 0xD749, 0x812D, 0xD74A, 0x811F, 0xD74B, 0x812C, + 0xD74C, 0x811E, 0xD74D, 0x8121, 0xD74E, 0x8115, 0xD74F, 0x8127, + 0xD750, 0x811D, 0xD751, 0x8122, 0xD752, 0x8211, 0xD753, 0x8238, + 0xD754, 0x8233, 0xD755, 0x823A, 0xD756, 0x8234, 0xD757, 0x8232, + 0xD758, 0x8274, 0xD759, 0x8390, 0xD75A, 0x83A3, 0xD75B, 0x83A8, + 0xD75C, 0x838D, 0xD75D, 0x837A, 0xD75E, 0x8373, 0xD75F, 0x83A4, + 0xD760, 0x8374, 0xD761, 0x838F, 0xD762, 0x8381, 0xD763, 0x8395, + 0xD764, 0x8399, 0xD765, 0x8375, 0xD766, 0x8394, 0xD767, 0x83A9, + 0xD768, 0x837D, 0xD769, 0x8383, 0xD76A, 0x838C, 0xD76B, 0x839D, + 0xD76C, 0x839B, 0xD76D, 0x83AA, 0xD76E, 0x838B, 0xD76F, 0x837E, + 0xD770, 0x83A5, 0xD771, 0x83AF, 0xD772, 0x8388, 0xD773, 0x8397, + 0xD774, 0x83B0, 0xD775, 0x837F, 0xD776, 0x83A6, 0xD777, 0x8387, + 0xD778, 0x83AE, 0xD779, 0x8376, 0xD77A, 0x839A, 0xD77B, 0x8659, + 0xD77C, 0x8656, 0xD77D, 0x86BF, 0xD77E, 0x86B7, 0xD7A1, 0x86C2, + 0xD7A2, 0x86C1, 0xD7A3, 0x86C5, 0xD7A4, 0x86BA, 0xD7A5, 0x86B0, + 0xD7A6, 0x86C8, 0xD7A7, 0x86B9, 0xD7A8, 0x86B3, 0xD7A9, 0x86B8, + 0xD7AA, 0x86CC, 0xD7AB, 0x86B4, 0xD7AC, 0x86BB, 0xD7AD, 0x86BC, + 0xD7AE, 0x86C3, 0xD7AF, 0x86BD, 0xD7B0, 0x86BE, 0xD7B1, 0x8852, + 0xD7B2, 0x8889, 0xD7B3, 0x8895, 0xD7B4, 0x88A8, 0xD7B5, 0x88A2, + 0xD7B6, 0x88AA, 0xD7B7, 0x889A, 0xD7B8, 0x8891, 0xD7B9, 0x88A1, + 0xD7BA, 0x889F, 0xD7BB, 0x8898, 0xD7BC, 0x88A7, 0xD7BD, 0x8899, + 0xD7BE, 0x889B, 0xD7BF, 0x8897, 0xD7C0, 0x88A4, 0xD7C1, 0x88AC, + 0xD7C2, 0x888C, 0xD7C3, 0x8893, 0xD7C4, 0x888E, 0xD7C5, 0x8982, + 0xD7C6, 0x89D6, 0xD7C7, 0x89D9, 0xD7C8, 0x89D5, 0xD7C9, 0x8A30, + 0xD7CA, 0x8A27, 0xD7CB, 0x8A2C, 0xD7CC, 0x8A1E, 0xD7CD, 0x8C39, + 0xD7CE, 0x8C3B, 0xD7CF, 0x8C5C, 0xD7D0, 0x8C5D, 0xD7D1, 0x8C7D, + 0xD7D2, 0x8CA5, 0xD7D3, 0x8D7D, 0xD7D4, 0x8D7B, 0xD7D5, 0x8D79, + 0xD7D6, 0x8DBC, 0xD7D7, 0x8DC2, 0xD7D8, 0x8DB9, 0xD7D9, 0x8DBF, + 0xD7DA, 0x8DC1, 0xD7DB, 0x8ED8, 0xD7DC, 0x8EDE, 0xD7DD, 0x8EDD, + 0xD7DE, 0x8EDC, 0xD7DF, 0x8ED7, 0xD7E0, 0x8EE0, 0xD7E1, 0x8EE1, + 0xD7E2, 0x9024, 0xD7E3, 0x900B, 0xD7E4, 0x9011, 0xD7E5, 0x901C, + 0xD7E6, 0x900C, 0xD7E7, 0x9021, 0xD7E8, 0x90EF, 0xD7E9, 0x90EA, + 0xD7EA, 0x90F0, 0xD7EB, 0x90F4, 0xD7EC, 0x90F2, 0xD7ED, 0x90F3, + 0xD7EE, 0x90D4, 0xD7EF, 0x90EB, 0xD7F0, 0x90EC, 0xD7F1, 0x90E9, + 0xD7F2, 0x9156, 0xD7F3, 0x9158, 0xD7F4, 0x915A, 0xD7F5, 0x9153, + 0xD7F6, 0x9155, 0xD7F7, 0x91EC, 0xD7F8, 0x91F4, 0xD7F9, 0x91F1, + 0xD7FA, 0x91F3, 0xD7FB, 0x91F8, 0xD7FC, 0x91E4, 0xD7FD, 0x91F9, + 0xD7FE, 0x91EA, 0xD840, 0x91EB, 0xD841, 0x91F7, 0xD842, 0x91E8, + 0xD843, 0x91EE, 0xD844, 0x957A, 0xD845, 0x9586, 0xD846, 0x9588, + 0xD847, 0x967C, 0xD848, 0x966D, 0xD849, 0x966B, 0xD84A, 0x9671, + 0xD84B, 0x966F, 0xD84C, 0x96BF, 0xD84D, 0x976A, 0xD84E, 0x9804, + 0xD84F, 0x98E5, 0xD850, 0x9997, 0xD851, 0x509B, 0xD852, 0x5095, + 0xD853, 0x5094, 0xD854, 0x509E, 0xD855, 0x508B, 0xD856, 0x50A3, + 0xD857, 0x5083, 0xD858, 0x508C, 0xD859, 0x508E, 0xD85A, 0x509D, + 0xD85B, 0x5068, 0xD85C, 0x509C, 0xD85D, 0x5092, 0xD85E, 0x5082, + 0xD85F, 0x5087, 0xD860, 0x515F, 0xD861, 0x51D4, 0xD862, 0x5312, + 0xD863, 0x5311, 0xD864, 0x53A4, 0xD865, 0x53A7, 0xD866, 0x5591, + 0xD867, 0x55A8, 0xD868, 0x55A5, 0xD869, 0x55AD, 0xD86A, 0x5577, + 0xD86B, 0x5645, 0xD86C, 0x55A2, 0xD86D, 0x5593, 0xD86E, 0x5588, + 0xD86F, 0x558F, 0xD870, 0x55B5, 0xD871, 0x5581, 0xD872, 0x55A3, + 0xD873, 0x5592, 0xD874, 0x55A4, 0xD875, 0x557D, 0xD876, 0x558C, + 0xD877, 0x55A6, 0xD878, 0x557F, 0xD879, 0x5595, 0xD87A, 0x55A1, + 0xD87B, 0x558E, 0xD87C, 0x570C, 0xD87D, 0x5829, 0xD87E, 0x5837, + 0xD8A1, 0x5819, 0xD8A2, 0x581E, 0xD8A3, 0x5827, 0xD8A4, 0x5823, + 0xD8A5, 0x5828, 0xD8A6, 0x57F5, 0xD8A7, 0x5848, 0xD8A8, 0x5825, + 0xD8A9, 0x581C, 0xD8AA, 0x581B, 0xD8AB, 0x5833, 0xD8AC, 0x583F, + 0xD8AD, 0x5836, 0xD8AE, 0x582E, 0xD8AF, 0x5839, 0xD8B0, 0x5838, + 0xD8B1, 0x582D, 0xD8B2, 0x582C, 0xD8B3, 0x583B, 0xD8B4, 0x5961, + 0xD8B5, 0x5AAF, 0xD8B6, 0x5A94, 0xD8B7, 0x5A9F, 0xD8B8, 0x5A7A, + 0xD8B9, 0x5AA2, 0xD8BA, 0x5A9E, 0xD8BB, 0x5A78, 0xD8BC, 0x5AA6, + 0xD8BD, 0x5A7C, 0xD8BE, 0x5AA5, 0xD8BF, 0x5AAC, 0xD8C0, 0x5A95, + 0xD8C1, 0x5AAE, 0xD8C2, 0x5A37, 0xD8C3, 0x5A84, 0xD8C4, 0x5A8A, + 0xD8C5, 0x5A97, 0xD8C6, 0x5A83, 0xD8C7, 0x5A8B, 0xD8C8, 0x5AA9, + 0xD8C9, 0x5A7B, 0xD8CA, 0x5A7D, 0xD8CB, 0x5A8C, 0xD8CC, 0x5A9C, + 0xD8CD, 0x5A8F, 0xD8CE, 0x5A93, 0xD8CF, 0x5A9D, 0xD8D0, 0x5BEA, + 0xD8D1, 0x5BCD, 0xD8D2, 0x5BCB, 0xD8D3, 0x5BD4, 0xD8D4, 0x5BD1, + 0xD8D5, 0x5BCA, 0xD8D6, 0x5BCE, 0xD8D7, 0x5C0C, 0xD8D8, 0x5C30, + 0xD8D9, 0x5D37, 0xD8DA, 0x5D43, 0xD8DB, 0x5D6B, 0xD8DC, 0x5D41, + 0xD8DD, 0x5D4B, 0xD8DE, 0x5D3F, 0xD8DF, 0x5D35, 0xD8E0, 0x5D51, + 0xD8E1, 0x5D4E, 0xD8E2, 0x5D55, 0xD8E3, 0x5D33, 0xD8E4, 0x5D3A, + 0xD8E5, 0x5D52, 0xD8E6, 0x5D3D, 0xD8E7, 0x5D31, 0xD8E8, 0x5D59, + 0xD8E9, 0x5D42, 0xD8EA, 0x5D39, 0xD8EB, 0x5D49, 0xD8EC, 0x5D38, + 0xD8ED, 0x5D3C, 0xD8EE, 0x5D32, 0xD8EF, 0x5D36, 0xD8F0, 0x5D40, + 0xD8F1, 0x5D45, 0xD8F2, 0x5E44, 0xD8F3, 0x5E41, 0xD8F4, 0x5F58, + 0xD8F5, 0x5FA6, 0xD8F6, 0x5FA5, 0xD8F7, 0x5FAB, 0xD8F8, 0x60C9, + 0xD8F9, 0x60B9, 0xD8FA, 0x60CC, 0xD8FB, 0x60E2, 0xD8FC, 0x60CE, + 0xD8FD, 0x60C4, 0xD8FE, 0x6114, 0xD940, 0x60F2, 0xD941, 0x610A, + 0xD942, 0x6116, 0xD943, 0x6105, 0xD944, 0x60F5, 0xD945, 0x6113, + 0xD946, 0x60F8, 0xD947, 0x60FC, 0xD948, 0x60FE, 0xD949, 0x60C1, + 0xD94A, 0x6103, 0xD94B, 0x6118, 0xD94C, 0x611D, 0xD94D, 0x6110, + 0xD94E, 0x60FF, 0xD94F, 0x6104, 0xD950, 0x610B, 0xD951, 0x624A, + 0xD952, 0x6394, 0xD953, 0x63B1, 0xD954, 0x63B0, 0xD955, 0x63CE, + 0xD956, 0x63E5, 0xD957, 0x63E8, 0xD958, 0x63EF, 0xD959, 0x63C3, + 0xD95A, 0x649D, 0xD95B, 0x63F3, 0xD95C, 0x63CA, 0xD95D, 0x63E0, + 0xD95E, 0x63F6, 0xD95F, 0x63D5, 0xD960, 0x63F2, 0xD961, 0x63F5, + 0xD962, 0x6461, 0xD963, 0x63DF, 0xD964, 0x63BE, 0xD965, 0x63DD, + 0xD966, 0x63DC, 0xD967, 0x63C4, 0xD968, 0x63D8, 0xD969, 0x63D3, + 0xD96A, 0x63C2, 0xD96B, 0x63C7, 0xD96C, 0x63CC, 0xD96D, 0x63CB, + 0xD96E, 0x63C8, 0xD96F, 0x63F0, 0xD970, 0x63D7, 0xD971, 0x63D9, + 0xD972, 0x6532, 0xD973, 0x6567, 0xD974, 0x656A, 0xD975, 0x6564, + 0xD976, 0x655C, 0xD977, 0x6568, 0xD978, 0x6565, 0xD979, 0x658C, + 0xD97A, 0x659D, 0xD97B, 0x659E, 0xD97C, 0x65AE, 0xD97D, 0x65D0, + 0xD97E, 0x65D2, 0xD9A1, 0x667C, 0xD9A2, 0x666C, 0xD9A3, 0x667B, + 0xD9A4, 0x6680, 0xD9A5, 0x6671, 0xD9A6, 0x6679, 0xD9A7, 0x666A, + 0xD9A8, 0x6672, 0xD9A9, 0x6701, 0xD9AA, 0x690C, 0xD9AB, 0x68D3, + 0xD9AC, 0x6904, 0xD9AD, 0x68DC, 0xD9AE, 0x692A, 0xD9AF, 0x68EC, + 0xD9B0, 0x68EA, 0xD9B1, 0x68F1, 0xD9B2, 0x690F, 0xD9B3, 0x68D6, + 0xD9B4, 0x68F7, 0xD9B5, 0x68EB, 0xD9B6, 0x68E4, 0xD9B7, 0x68F6, + 0xD9B8, 0x6913, 0xD9B9, 0x6910, 0xD9BA, 0x68F3, 0xD9BB, 0x68E1, + 0xD9BC, 0x6907, 0xD9BD, 0x68CC, 0xD9BE, 0x6908, 0xD9BF, 0x6970, + 0xD9C0, 0x68B4, 0xD9C1, 0x6911, 0xD9C2, 0x68EF, 0xD9C3, 0x68C6, + 0xD9C4, 0x6914, 0xD9C5, 0x68F8, 0xD9C6, 0x68D0, 0xD9C7, 0x68FD, + 0xD9C8, 0x68FC, 0xD9C9, 0x68E8, 0xD9CA, 0x690B, 0xD9CB, 0x690A, + 0xD9CC, 0x6917, 0xD9CD, 0x68CE, 0xD9CE, 0x68C8, 0xD9CF, 0x68DD, + 0xD9D0, 0x68DE, 0xD9D1, 0x68E6, 0xD9D2, 0x68F4, 0xD9D3, 0x68D1, + 0xD9D4, 0x6906, 0xD9D5, 0x68D4, 0xD9D6, 0x68E9, 0xD9D7, 0x6915, + 0xD9D8, 0x6925, 0xD9D9, 0x68C7, 0xD9DA, 0x6B39, 0xD9DB, 0x6B3B, + 0xD9DC, 0x6B3F, 0xD9DD, 0x6B3C, 0xD9DE, 0x6B94, 0xD9DF, 0x6B97, + 0xD9E0, 0x6B99, 0xD9E1, 0x6B95, 0xD9E2, 0x6BBD, 0xD9E3, 0x6BF0, + 0xD9E4, 0x6BF2, 0xD9E5, 0x6BF3, 0xD9E6, 0x6C30, 0xD9E7, 0x6DFC, + 0xD9E8, 0x6E46, 0xD9E9, 0x6E47, 0xD9EA, 0x6E1F, 0xD9EB, 0x6E49, + 0xD9EC, 0x6E88, 0xD9ED, 0x6E3C, 0xD9EE, 0x6E3D, 0xD9EF, 0x6E45, + 0xD9F0, 0x6E62, 0xD9F1, 0x6E2B, 0xD9F2, 0x6E3F, 0xD9F3, 0x6E41, + 0xD9F4, 0x6E5D, 0xD9F5, 0x6E73, 0xD9F6, 0x6E1C, 0xD9F7, 0x6E33, + 0xD9F8, 0x6E4B, 0xD9F9, 0x6E40, 0xD9FA, 0x6E51, 0xD9FB, 0x6E3B, + 0xD9FC, 0x6E03, 0xD9FD, 0x6E2E, 0xD9FE, 0x6E5E, 0xDA40, 0x6E68, + 0xDA41, 0x6E5C, 0xDA42, 0x6E61, 0xDA43, 0x6E31, 0xDA44, 0x6E28, + 0xDA45, 0x6E60, 0xDA46, 0x6E71, 0xDA47, 0x6E6B, 0xDA48, 0x6E39, + 0xDA49, 0x6E22, 0xDA4A, 0x6E30, 0xDA4B, 0x6E53, 0xDA4C, 0x6E65, + 0xDA4D, 0x6E27, 0xDA4E, 0x6E78, 0xDA4F, 0x6E64, 0xDA50, 0x6E77, + 0xDA51, 0x6E55, 0xDA52, 0x6E79, 0xDA53, 0x6E52, 0xDA54, 0x6E66, + 0xDA55, 0x6E35, 0xDA56, 0x6E36, 0xDA57, 0x6E5A, 0xDA58, 0x7120, + 0xDA59, 0x711E, 0xDA5A, 0x712F, 0xDA5B, 0x70FB, 0xDA5C, 0x712E, + 0xDA5D, 0x7131, 0xDA5E, 0x7123, 0xDA5F, 0x7125, 0xDA60, 0x7122, + 0xDA61, 0x7132, 0xDA62, 0x711F, 0xDA63, 0x7128, 0xDA64, 0x713A, + 0xDA65, 0x711B, 0xDA66, 0x724B, 0xDA67, 0x725A, 0xDA68, 0x7288, + 0xDA69, 0x7289, 0xDA6A, 0x7286, 0xDA6B, 0x7285, 0xDA6C, 0x728B, + 0xDA6D, 0x7312, 0xDA6E, 0x730B, 0xDA6F, 0x7330, 0xDA70, 0x7322, + 0xDA71, 0x7331, 0xDA72, 0x7333, 0xDA73, 0x7327, 0xDA74, 0x7332, + 0xDA75, 0x732D, 0xDA76, 0x7326, 0xDA77, 0x7323, 0xDA78, 0x7335, + 0xDA79, 0x730C, 0xDA7A, 0x742E, 0xDA7B, 0x742C, 0xDA7C, 0x7430, + 0xDA7D, 0x742B, 0xDA7E, 0x7416, 0xDAA1, 0x741A, 0xDAA2, 0x7421, + 0xDAA3, 0x742D, 0xDAA4, 0x7431, 0xDAA5, 0x7424, 0xDAA6, 0x7423, + 0xDAA7, 0x741D, 0xDAA8, 0x7429, 0xDAA9, 0x7420, 0xDAAA, 0x7432, + 0xDAAB, 0x74FB, 0xDAAC, 0x752F, 0xDAAD, 0x756F, 0xDAAE, 0x756C, + 0xDAAF, 0x75E7, 0xDAB0, 0x75DA, 0xDAB1, 0x75E1, 0xDAB2, 0x75E6, + 0xDAB3, 0x75DD, 0xDAB4, 0x75DF, 0xDAB5, 0x75E4, 0xDAB6, 0x75D7, + 0xDAB7, 0x7695, 0xDAB8, 0x7692, 0xDAB9, 0x76DA, 0xDABA, 0x7746, + 0xDABB, 0x7747, 0xDABC, 0x7744, 0xDABD, 0x774D, 0xDABE, 0x7745, + 0xDABF, 0x774A, 0xDAC0, 0x774E, 0xDAC1, 0x774B, 0xDAC2, 0x774C, + 0xDAC3, 0x77DE, 0xDAC4, 0x77EC, 0xDAC5, 0x7860, 0xDAC6, 0x7864, + 0xDAC7, 0x7865, 0xDAC8, 0x785C, 0xDAC9, 0x786D, 0xDACA, 0x7871, + 0xDACB, 0x786A, 0xDACC, 0x786E, 0xDACD, 0x7870, 0xDACE, 0x7869, + 0xDACF, 0x7868, 0xDAD0, 0x785E, 0xDAD1, 0x7862, 0xDAD2, 0x7974, + 0xDAD3, 0x7973, 0xDAD4, 0x7972, 0xDAD5, 0x7970, 0xDAD6, 0x7A02, + 0xDAD7, 0x7A0A, 0xDAD8, 0x7A03, 0xDAD9, 0x7A0C, 0xDADA, 0x7A04, + 0xDADB, 0x7A99, 0xDADC, 0x7AE6, 0xDADD, 0x7AE4, 0xDADE, 0x7B4A, + 0xDADF, 0x7B3B, 0xDAE0, 0x7B44, 0xDAE1, 0x7B48, 0xDAE2, 0x7B4C, + 0xDAE3, 0x7B4E, 0xDAE4, 0x7B40, 0xDAE5, 0x7B58, 0xDAE6, 0x7B45, + 0xDAE7, 0x7CA2, 0xDAE8, 0x7C9E, 0xDAE9, 0x7CA8, 0xDAEA, 0x7CA1, + 0xDAEB, 0x7D58, 0xDAEC, 0x7D6F, 0xDAED, 0x7D63, 0xDAEE, 0x7D53, + 0xDAEF, 0x7D56, 0xDAF0, 0x7D67, 0xDAF1, 0x7D6A, 0xDAF2, 0x7D4F, + 0xDAF3, 0x7D6D, 0xDAF4, 0x7D5C, 0xDAF5, 0x7D6B, 0xDAF6, 0x7D52, + 0xDAF7, 0x7D54, 0xDAF8, 0x7D69, 0xDAF9, 0x7D51, 0xDAFA, 0x7D5F, + 0xDAFB, 0x7D4E, 0xDAFC, 0x7F3E, 0xDAFD, 0x7F3F, 0xDAFE, 0x7F65, + 0xDB40, 0x7F66, 0xDB41, 0x7FA2, 0xDB42, 0x7FA0, 0xDB43, 0x7FA1, + 0xDB44, 0x7FD7, 0xDB45, 0x8051, 0xDB46, 0x804F, 0xDB47, 0x8050, + 0xDB48, 0x80FE, 0xDB49, 0x80D4, 0xDB4A, 0x8143, 0xDB4B, 0x814A, + 0xDB4C, 0x8152, 0xDB4D, 0x814F, 0xDB4E, 0x8147, 0xDB4F, 0x813D, + 0xDB50, 0x814D, 0xDB51, 0x813A, 0xDB52, 0x81E6, 0xDB53, 0x81EE, + 0xDB54, 0x81F7, 0xDB55, 0x81F8, 0xDB56, 0x81F9, 0xDB57, 0x8204, + 0xDB58, 0x823C, 0xDB59, 0x823D, 0xDB5A, 0x823F, 0xDB5B, 0x8275, + 0xDB5C, 0x833B, 0xDB5D, 0x83CF, 0xDB5E, 0x83F9, 0xDB5F, 0x8423, + 0xDB60, 0x83C0, 0xDB61, 0x83E8, 0xDB62, 0x8412, 0xDB63, 0x83E7, + 0xDB64, 0x83E4, 0xDB65, 0x83FC, 0xDB66, 0x83F6, 0xDB67, 0x8410, + 0xDB68, 0x83C6, 0xDB69, 0x83C8, 0xDB6A, 0x83EB, 0xDB6B, 0x83E3, + 0xDB6C, 0x83BF, 0xDB6D, 0x8401, 0xDB6E, 0x83DD, 0xDB6F, 0x83E5, + 0xDB70, 0x83D8, 0xDB71, 0x83FF, 0xDB72, 0x83E1, 0xDB73, 0x83CB, + 0xDB74, 0x83CE, 0xDB75, 0x83D6, 0xDB76, 0x83F5, 0xDB77, 0x83C9, + 0xDB78, 0x8409, 0xDB79, 0x840F, 0xDB7A, 0x83DE, 0xDB7B, 0x8411, + 0xDB7C, 0x8406, 0xDB7D, 0x83C2, 0xDB7E, 0x83F3, 0xDBA1, 0x83D5, + 0xDBA2, 0x83FA, 0xDBA3, 0x83C7, 0xDBA4, 0x83D1, 0xDBA5, 0x83EA, + 0xDBA6, 0x8413, 0xDBA7, 0x83C3, 0xDBA8, 0x83EC, 0xDBA9, 0x83EE, + 0xDBAA, 0x83C4, 0xDBAB, 0x83FB, 0xDBAC, 0x83D7, 0xDBAD, 0x83E2, + 0xDBAE, 0x841B, 0xDBAF, 0x83DB, 0xDBB0, 0x83FE, 0xDBB1, 0x86D8, + 0xDBB2, 0x86E2, 0xDBB3, 0x86E6, 0xDBB4, 0x86D3, 0xDBB5, 0x86E3, + 0xDBB6, 0x86DA, 0xDBB7, 0x86EA, 0xDBB8, 0x86DD, 0xDBB9, 0x86EB, + 0xDBBA, 0x86DC, 0xDBBB, 0x86EC, 0xDBBC, 0x86E9, 0xDBBD, 0x86D7, + 0xDBBE, 0x86E8, 0xDBBF, 0x86D1, 0xDBC0, 0x8848, 0xDBC1, 0x8856, + 0xDBC2, 0x8855, 0xDBC3, 0x88BA, 0xDBC4, 0x88D7, 0xDBC5, 0x88B9, + 0xDBC6, 0x88B8, 0xDBC7, 0x88C0, 0xDBC8, 0x88BE, 0xDBC9, 0x88B6, + 0xDBCA, 0x88BC, 0xDBCB, 0x88B7, 0xDBCC, 0x88BD, 0xDBCD, 0x88B2, + 0xDBCE, 0x8901, 0xDBCF, 0x88C9, 0xDBD0, 0x8995, 0xDBD1, 0x8998, + 0xDBD2, 0x8997, 0xDBD3, 0x89DD, 0xDBD4, 0x89DA, 0xDBD5, 0x89DB, + 0xDBD6, 0x8A4E, 0xDBD7, 0x8A4D, 0xDBD8, 0x8A39, 0xDBD9, 0x8A59, + 0xDBDA, 0x8A40, 0xDBDB, 0x8A57, 0xDBDC, 0x8A58, 0xDBDD, 0x8A44, + 0xDBDE, 0x8A45, 0xDBDF, 0x8A52, 0xDBE0, 0x8A48, 0xDBE1, 0x8A51, + 0xDBE2, 0x8A4A, 0xDBE3, 0x8A4C, 0xDBE4, 0x8A4F, 0xDBE5, 0x8C5F, + 0xDBE6, 0x8C81, 0xDBE7, 0x8C80, 0xDBE8, 0x8CBA, 0xDBE9, 0x8CBE, + 0xDBEA, 0x8CB0, 0xDBEB, 0x8CB9, 0xDBEC, 0x8CB5, 0xDBED, 0x8D84, + 0xDBEE, 0x8D80, 0xDBEF, 0x8D89, 0xDBF0, 0x8DD8, 0xDBF1, 0x8DD3, + 0xDBF2, 0x8DCD, 0xDBF3, 0x8DC7, 0xDBF4, 0x8DD6, 0xDBF5, 0x8DDC, + 0xDBF6, 0x8DCF, 0xDBF7, 0x8DD5, 0xDBF8, 0x8DD9, 0xDBF9, 0x8DC8, + 0xDBFA, 0x8DD7, 0xDBFB, 0x8DC5, 0xDBFC, 0x8EEF, 0xDBFD, 0x8EF7, + 0xDBFE, 0x8EFA, 0xDC40, 0x8EF9, 0xDC41, 0x8EE6, 0xDC42, 0x8EEE, + 0xDC43, 0x8EE5, 0xDC44, 0x8EF5, 0xDC45, 0x8EE7, 0xDC46, 0x8EE8, + 0xDC47, 0x8EF6, 0xDC48, 0x8EEB, 0xDC49, 0x8EF1, 0xDC4A, 0x8EEC, + 0xDC4B, 0x8EF4, 0xDC4C, 0x8EE9, 0xDC4D, 0x902D, 0xDC4E, 0x9034, + 0xDC4F, 0x902F, 0xDC50, 0x9106, 0xDC51, 0x912C, 0xDC52, 0x9104, + 0xDC53, 0x90FF, 0xDC54, 0x90FC, 0xDC55, 0x9108, 0xDC56, 0x90F9, + 0xDC57, 0x90FB, 0xDC58, 0x9101, 0xDC59, 0x9100, 0xDC5A, 0x9107, + 0xDC5B, 0x9105, 0xDC5C, 0x9103, 0xDC5D, 0x9161, 0xDC5E, 0x9164, + 0xDC5F, 0x915F, 0xDC60, 0x9162, 0xDC61, 0x9160, 0xDC62, 0x9201, + 0xDC63, 0x920A, 0xDC64, 0x9225, 0xDC65, 0x9203, 0xDC66, 0x921A, + 0xDC67, 0x9226, 0xDC68, 0x920F, 0xDC69, 0x920C, 0xDC6A, 0x9200, + 0xDC6B, 0x9212, 0xDC6C, 0x91FF, 0xDC6D, 0x91FD, 0xDC6E, 0x9206, + 0xDC6F, 0x9204, 0xDC70, 0x9227, 0xDC71, 0x9202, 0xDC72, 0x921C, + 0xDC73, 0x9224, 0xDC74, 0x9219, 0xDC75, 0x9217, 0xDC76, 0x9205, + 0xDC77, 0x9216, 0xDC78, 0x957B, 0xDC79, 0x958D, 0xDC7A, 0x958C, + 0xDC7B, 0x9590, 0xDC7C, 0x9687, 0xDC7D, 0x967E, 0xDC7E, 0x9688, + 0xDCA1, 0x9689, 0xDCA2, 0x9683, 0xDCA3, 0x9680, 0xDCA4, 0x96C2, + 0xDCA5, 0x96C8, 0xDCA6, 0x96C3, 0xDCA7, 0x96F1, 0xDCA8, 0x96F0, + 0xDCA9, 0x976C, 0xDCAA, 0x9770, 0xDCAB, 0x976E, 0xDCAC, 0x9807, + 0xDCAD, 0x98A9, 0xDCAE, 0x98EB, 0xDCAF, 0x9CE6, 0xDCB0, 0x9EF9, + 0xDCB1, 0x4E83, 0xDCB2, 0x4E84, 0xDCB3, 0x4EB6, 0xDCB4, 0x50BD, + 0xDCB5, 0x50BF, 0xDCB6, 0x50C6, 0xDCB7, 0x50AE, 0xDCB8, 0x50C4, + 0xDCB9, 0x50CA, 0xDCBA, 0x50B4, 0xDCBB, 0x50C8, 0xDCBC, 0x50C2, + 0xDCBD, 0x50B0, 0xDCBE, 0x50C1, 0xDCBF, 0x50BA, 0xDCC0, 0x50B1, + 0xDCC1, 0x50CB, 0xDCC2, 0x50C9, 0xDCC3, 0x50B6, 0xDCC4, 0x50B8, + 0xDCC5, 0x51D7, 0xDCC6, 0x527A, 0xDCC7, 0x5278, 0xDCC8, 0x527B, + 0xDCC9, 0x527C, 0xDCCA, 0x55C3, 0xDCCB, 0x55DB, 0xDCCC, 0x55CC, + 0xDCCD, 0x55D0, 0xDCCE, 0x55CB, 0xDCCF, 0x55CA, 0xDCD0, 0x55DD, + 0xDCD1, 0x55C0, 0xDCD2, 0x55D4, 0xDCD3, 0x55C4, 0xDCD4, 0x55E9, + 0xDCD5, 0x55BF, 0xDCD6, 0x55D2, 0xDCD7, 0x558D, 0xDCD8, 0x55CF, + 0xDCD9, 0x55D5, 0xDCDA, 0x55E2, 0xDCDB, 0x55D6, 0xDCDC, 0x55C8, + 0xDCDD, 0x55F2, 0xDCDE, 0x55CD, 0xDCDF, 0x55D9, 0xDCE0, 0x55C2, + 0xDCE1, 0x5714, 0xDCE2, 0x5853, 0xDCE3, 0x5868, 0xDCE4, 0x5864, + 0xDCE5, 0x584F, 0xDCE6, 0x584D, 0xDCE7, 0x5849, 0xDCE8, 0x586F, + 0xDCE9, 0x5855, 0xDCEA, 0x584E, 0xDCEB, 0x585D, 0xDCEC, 0x5859, + 0xDCED, 0x5865, 0xDCEE, 0x585B, 0xDCEF, 0x583D, 0xDCF0, 0x5863, + 0xDCF1, 0x5871, 0xDCF2, 0x58FC, 0xDCF3, 0x5AC7, 0xDCF4, 0x5AC4, + 0xDCF5, 0x5ACB, 0xDCF6, 0x5ABA, 0xDCF7, 0x5AB8, 0xDCF8, 0x5AB1, + 0xDCF9, 0x5AB5, 0xDCFA, 0x5AB0, 0xDCFB, 0x5ABF, 0xDCFC, 0x5AC8, + 0xDCFD, 0x5ABB, 0xDCFE, 0x5AC6, 0xDD40, 0x5AB7, 0xDD41, 0x5AC0, + 0xDD42, 0x5ACA, 0xDD43, 0x5AB4, 0xDD44, 0x5AB6, 0xDD45, 0x5ACD, + 0xDD46, 0x5AB9, 0xDD47, 0x5A90, 0xDD48, 0x5BD6, 0xDD49, 0x5BD8, + 0xDD4A, 0x5BD9, 0xDD4B, 0x5C1F, 0xDD4C, 0x5C33, 0xDD4D, 0x5D71, + 0xDD4E, 0x5D63, 0xDD4F, 0x5D4A, 0xDD50, 0x5D65, 0xDD51, 0x5D72, + 0xDD52, 0x5D6C, 0xDD53, 0x5D5E, 0xDD54, 0x5D68, 0xDD55, 0x5D67, + 0xDD56, 0x5D62, 0xDD57, 0x5DF0, 0xDD58, 0x5E4F, 0xDD59, 0x5E4E, + 0xDD5A, 0x5E4A, 0xDD5B, 0x5E4D, 0xDD5C, 0x5E4B, 0xDD5D, 0x5EC5, + 0xDD5E, 0x5ECC, 0xDD5F, 0x5EC6, 0xDD60, 0x5ECB, 0xDD61, 0x5EC7, + 0xDD62, 0x5F40, 0xDD63, 0x5FAF, 0xDD64, 0x5FAD, 0xDD65, 0x60F7, + 0xDD66, 0x6149, 0xDD67, 0x614A, 0xDD68, 0x612B, 0xDD69, 0x6145, + 0xDD6A, 0x6136, 0xDD6B, 0x6132, 0xDD6C, 0x612E, 0xDD6D, 0x6146, + 0xDD6E, 0x612F, 0xDD6F, 0x614F, 0xDD70, 0x6129, 0xDD71, 0x6140, + 0xDD72, 0x6220, 0xDD73, 0x9168, 0xDD74, 0x6223, 0xDD75, 0x6225, + 0xDD76, 0x6224, 0xDD77, 0x63C5, 0xDD78, 0x63F1, 0xDD79, 0x63EB, + 0xDD7A, 0x6410, 0xDD7B, 0x6412, 0xDD7C, 0x6409, 0xDD7D, 0x6420, + 0xDD7E, 0x6424, 0xDDA1, 0x6433, 0xDDA2, 0x6443, 0xDDA3, 0x641F, + 0xDDA4, 0x6415, 0xDDA5, 0x6418, 0xDDA6, 0x6439, 0xDDA7, 0x6437, + 0xDDA8, 0x6422, 0xDDA9, 0x6423, 0xDDAA, 0x640C, 0xDDAB, 0x6426, + 0xDDAC, 0x6430, 0xDDAD, 0x6428, 0xDDAE, 0x6441, 0xDDAF, 0x6435, + 0xDDB0, 0x642F, 0xDDB1, 0x640A, 0xDDB2, 0x641A, 0xDDB3, 0x6440, + 0xDDB4, 0x6425, 0xDDB5, 0x6427, 0xDDB6, 0x640B, 0xDDB7, 0x63E7, + 0xDDB8, 0x641B, 0xDDB9, 0x642E, 0xDDBA, 0x6421, 0xDDBB, 0x640E, + 0xDDBC, 0x656F, 0xDDBD, 0x6592, 0xDDBE, 0x65D3, 0xDDBF, 0x6686, + 0xDDC0, 0x668C, 0xDDC1, 0x6695, 0xDDC2, 0x6690, 0xDDC3, 0x668B, + 0xDDC4, 0x668A, 0xDDC5, 0x6699, 0xDDC6, 0x6694, 0xDDC7, 0x6678, + 0xDDC8, 0x6720, 0xDDC9, 0x6966, 0xDDCA, 0x695F, 0xDDCB, 0x6938, + 0xDDCC, 0x694E, 0xDDCD, 0x6962, 0xDDCE, 0x6971, 0xDDCF, 0x693F, + 0xDDD0, 0x6945, 0xDDD1, 0x696A, 0xDDD2, 0x6939, 0xDDD3, 0x6942, + 0xDDD4, 0x6957, 0xDDD5, 0x6959, 0xDDD6, 0x697A, 0xDDD7, 0x6948, + 0xDDD8, 0x6949, 0xDDD9, 0x6935, 0xDDDA, 0x696C, 0xDDDB, 0x6933, + 0xDDDC, 0x693D, 0xDDDD, 0x6965, 0xDDDE, 0x68F0, 0xDDDF, 0x6978, + 0xDDE0, 0x6934, 0xDDE1, 0x6969, 0xDDE2, 0x6940, 0xDDE3, 0x696F, + 0xDDE4, 0x6944, 0xDDE5, 0x6976, 0xDDE6, 0x6958, 0xDDE7, 0x6941, + 0xDDE8, 0x6974, 0xDDE9, 0x694C, 0xDDEA, 0x693B, 0xDDEB, 0x694B, + 0xDDEC, 0x6937, 0xDDED, 0x695C, 0xDDEE, 0x694F, 0xDDEF, 0x6951, + 0xDDF0, 0x6932, 0xDDF1, 0x6952, 0xDDF2, 0x692F, 0xDDF3, 0x697B, + 0xDDF4, 0x693C, 0xDDF5, 0x6B46, 0xDDF6, 0x6B45, 0xDDF7, 0x6B43, + 0xDDF8, 0x6B42, 0xDDF9, 0x6B48, 0xDDFA, 0x6B41, 0xDDFB, 0x6B9B, + 0xDDFC, 0xFA0D, 0xDDFD, 0x6BFB, 0xDDFE, 0x6BFC, 0xDE40, 0x6BF9, + 0xDE41, 0x6BF7, 0xDE42, 0x6BF8, 0xDE43, 0x6E9B, 0xDE44, 0x6ED6, + 0xDE45, 0x6EC8, 0xDE46, 0x6E8F, 0xDE47, 0x6EC0, 0xDE48, 0x6E9F, + 0xDE49, 0x6E93, 0xDE4A, 0x6E94, 0xDE4B, 0x6EA0, 0xDE4C, 0x6EB1, + 0xDE4D, 0x6EB9, 0xDE4E, 0x6EC6, 0xDE4F, 0x6ED2, 0xDE50, 0x6EBD, + 0xDE51, 0x6EC1, 0xDE52, 0x6E9E, 0xDE53, 0x6EC9, 0xDE54, 0x6EB7, + 0xDE55, 0x6EB0, 0xDE56, 0x6ECD, 0xDE57, 0x6EA6, 0xDE58, 0x6ECF, + 0xDE59, 0x6EB2, 0xDE5A, 0x6EBE, 0xDE5B, 0x6EC3, 0xDE5C, 0x6EDC, + 0xDE5D, 0x6ED8, 0xDE5E, 0x6E99, 0xDE5F, 0x6E92, 0xDE60, 0x6E8E, + 0xDE61, 0x6E8D, 0xDE62, 0x6EA4, 0xDE63, 0x6EA1, 0xDE64, 0x6EBF, + 0xDE65, 0x6EB3, 0xDE66, 0x6ED0, 0xDE67, 0x6ECA, 0xDE68, 0x6E97, + 0xDE69, 0x6EAE, 0xDE6A, 0x6EA3, 0xDE6B, 0x7147, 0xDE6C, 0x7154, + 0xDE6D, 0x7152, 0xDE6E, 0x7163, 0xDE6F, 0x7160, 0xDE70, 0x7141, + 0xDE71, 0x715D, 0xDE72, 0x7162, 0xDE73, 0x7172, 0xDE74, 0x7178, + 0xDE75, 0x716A, 0xDE76, 0x7161, 0xDE77, 0x7142, 0xDE78, 0x7158, + 0xDE79, 0x7143, 0xDE7A, 0x714B, 0xDE7B, 0x7170, 0xDE7C, 0x715F, + 0xDE7D, 0x7150, 0xDE7E, 0x7153, 0xDEA1, 0x7144, 0xDEA2, 0x714D, + 0xDEA3, 0x715A, 0xDEA4, 0x724F, 0xDEA5, 0x728D, 0xDEA6, 0x728C, + 0xDEA7, 0x7291, 0xDEA8, 0x7290, 0xDEA9, 0x728E, 0xDEAA, 0x733C, + 0xDEAB, 0x7342, 0xDEAC, 0x733B, 0xDEAD, 0x733A, 0xDEAE, 0x7340, + 0xDEAF, 0x734A, 0xDEB0, 0x7349, 0xDEB1, 0x7444, 0xDEB2, 0x744A, + 0xDEB3, 0x744B, 0xDEB4, 0x7452, 0xDEB5, 0x7451, 0xDEB6, 0x7457, + 0xDEB7, 0x7440, 0xDEB8, 0x744F, 0xDEB9, 0x7450, 0xDEBA, 0x744E, + 0xDEBB, 0x7442, 0xDEBC, 0x7446, 0xDEBD, 0x744D, 0xDEBE, 0x7454, + 0xDEBF, 0x74E1, 0xDEC0, 0x74FF, 0xDEC1, 0x74FE, 0xDEC2, 0x74FD, + 0xDEC3, 0x751D, 0xDEC4, 0x7579, 0xDEC5, 0x7577, 0xDEC6, 0x6983, + 0xDEC7, 0x75EF, 0xDEC8, 0x760F, 0xDEC9, 0x7603, 0xDECA, 0x75F7, + 0xDECB, 0x75FE, 0xDECC, 0x75FC, 0xDECD, 0x75F9, 0xDECE, 0x75F8, + 0xDECF, 0x7610, 0xDED0, 0x75FB, 0xDED1, 0x75F6, 0xDED2, 0x75ED, + 0xDED3, 0x75F5, 0xDED4, 0x75FD, 0xDED5, 0x7699, 0xDED6, 0x76B5, + 0xDED7, 0x76DD, 0xDED8, 0x7755, 0xDED9, 0x775F, 0xDEDA, 0x7760, + 0xDEDB, 0x7752, 0xDEDC, 0x7756, 0xDEDD, 0x775A, 0xDEDE, 0x7769, + 0xDEDF, 0x7767, 0xDEE0, 0x7754, 0xDEE1, 0x7759, 0xDEE2, 0x776D, + 0xDEE3, 0x77E0, 0xDEE4, 0x7887, 0xDEE5, 0x789A, 0xDEE6, 0x7894, + 0xDEE7, 0x788F, 0xDEE8, 0x7884, 0xDEE9, 0x7895, 0xDEEA, 0x7885, + 0xDEEB, 0x7886, 0xDEEC, 0x78A1, 0xDEED, 0x7883, 0xDEEE, 0x7879, + 0xDEEF, 0x7899, 0xDEF0, 0x7880, 0xDEF1, 0x7896, 0xDEF2, 0x787B, + 0xDEF3, 0x797C, 0xDEF4, 0x7982, 0xDEF5, 0x797D, 0xDEF6, 0x7979, + 0xDEF7, 0x7A11, 0xDEF8, 0x7A18, 0xDEF9, 0x7A19, 0xDEFA, 0x7A12, + 0xDEFB, 0x7A17, 0xDEFC, 0x7A15, 0xDEFD, 0x7A22, 0xDEFE, 0x7A13, + 0xDF40, 0x7A1B, 0xDF41, 0x7A10, 0xDF42, 0x7AA3, 0xDF43, 0x7AA2, + 0xDF44, 0x7A9E, 0xDF45, 0x7AEB, 0xDF46, 0x7B66, 0xDF47, 0x7B64, + 0xDF48, 0x7B6D, 0xDF49, 0x7B74, 0xDF4A, 0x7B69, 0xDF4B, 0x7B72, + 0xDF4C, 0x7B65, 0xDF4D, 0x7B73, 0xDF4E, 0x7B71, 0xDF4F, 0x7B70, + 0xDF50, 0x7B61, 0xDF51, 0x7B78, 0xDF52, 0x7B76, 0xDF53, 0x7B63, + 0xDF54, 0x7CB2, 0xDF55, 0x7CB4, 0xDF56, 0x7CAF, 0xDF57, 0x7D88, + 0xDF58, 0x7D86, 0xDF59, 0x7D80, 0xDF5A, 0x7D8D, 0xDF5B, 0x7D7F, + 0xDF5C, 0x7D85, 0xDF5D, 0x7D7A, 0xDF5E, 0x7D8E, 0xDF5F, 0x7D7B, + 0xDF60, 0x7D83, 0xDF61, 0x7D7C, 0xDF62, 0x7D8C, 0xDF63, 0x7D94, + 0xDF64, 0x7D84, 0xDF65, 0x7D7D, 0xDF66, 0x7D92, 0xDF67, 0x7F6D, + 0xDF68, 0x7F6B, 0xDF69, 0x7F67, 0xDF6A, 0x7F68, 0xDF6B, 0x7F6C, + 0xDF6C, 0x7FA6, 0xDF6D, 0x7FA5, 0xDF6E, 0x7FA7, 0xDF6F, 0x7FDB, + 0xDF70, 0x7FDC, 0xDF71, 0x8021, 0xDF72, 0x8164, 0xDF73, 0x8160, + 0xDF74, 0x8177, 0xDF75, 0x815C, 0xDF76, 0x8169, 0xDF77, 0x815B, + 0xDF78, 0x8162, 0xDF79, 0x8172, 0xDF7A, 0x6721, 0xDF7B, 0x815E, + 0xDF7C, 0x8176, 0xDF7D, 0x8167, 0xDF7E, 0x816F, 0xDFA1, 0x8144, + 0xDFA2, 0x8161, 0xDFA3, 0x821D, 0xDFA4, 0x8249, 0xDFA5, 0x8244, + 0xDFA6, 0x8240, 0xDFA7, 0x8242, 0xDFA8, 0x8245, 0xDFA9, 0x84F1, + 0xDFAA, 0x843F, 0xDFAB, 0x8456, 0xDFAC, 0x8476, 0xDFAD, 0x8479, + 0xDFAE, 0x848F, 0xDFAF, 0x848D, 0xDFB0, 0x8465, 0xDFB1, 0x8451, + 0xDFB2, 0x8440, 0xDFB3, 0x8486, 0xDFB4, 0x8467, 0xDFB5, 0x8430, + 0xDFB6, 0x844D, 0xDFB7, 0x847D, 0xDFB8, 0x845A, 0xDFB9, 0x8459, + 0xDFBA, 0x8474, 0xDFBB, 0x8473, 0xDFBC, 0x845D, 0xDFBD, 0x8507, + 0xDFBE, 0x845E, 0xDFBF, 0x8437, 0xDFC0, 0x843A, 0xDFC1, 0x8434, + 0xDFC2, 0x847A, 0xDFC3, 0x8443, 0xDFC4, 0x8478, 0xDFC5, 0x8432, + 0xDFC6, 0x8445, 0xDFC7, 0x8429, 0xDFC8, 0x83D9, 0xDFC9, 0x844B, + 0xDFCA, 0x842F, 0xDFCB, 0x8442, 0xDFCC, 0x842D, 0xDFCD, 0x845F, + 0xDFCE, 0x8470, 0xDFCF, 0x8439, 0xDFD0, 0x844E, 0xDFD1, 0x844C, + 0xDFD2, 0x8452, 0xDFD3, 0x846F, 0xDFD4, 0x84C5, 0xDFD5, 0x848E, + 0xDFD6, 0x843B, 0xDFD7, 0x8447, 0xDFD8, 0x8436, 0xDFD9, 0x8433, + 0xDFDA, 0x8468, 0xDFDB, 0x847E, 0xDFDC, 0x8444, 0xDFDD, 0x842B, + 0xDFDE, 0x8460, 0xDFDF, 0x8454, 0xDFE0, 0x846E, 0xDFE1, 0x8450, + 0xDFE2, 0x870B, 0xDFE3, 0x8704, 0xDFE4, 0x86F7, 0xDFE5, 0x870C, + 0xDFE6, 0x86FA, 0xDFE7, 0x86D6, 0xDFE8, 0x86F5, 0xDFE9, 0x874D, + 0xDFEA, 0x86F8, 0xDFEB, 0x870E, 0xDFEC, 0x8709, 0xDFED, 0x8701, + 0xDFEE, 0x86F6, 0xDFEF, 0x870D, 0xDFF0, 0x8705, 0xDFF1, 0x88D6, + 0xDFF2, 0x88CB, 0xDFF3, 0x88CD, 0xDFF4, 0x88CE, 0xDFF5, 0x88DE, + 0xDFF6, 0x88DB, 0xDFF7, 0x88DA, 0xDFF8, 0x88CC, 0xDFF9, 0x88D0, + 0xDFFA, 0x8985, 0xDFFB, 0x899B, 0xDFFC, 0x89DF, 0xDFFD, 0x89E5, + 0xDFFE, 0x89E4, 0xE040, 0x89E1, 0xE041, 0x89E0, 0xE042, 0x89E2, + 0xE043, 0x89DC, 0xE044, 0x89E6, 0xE045, 0x8A76, 0xE046, 0x8A86, + 0xE047, 0x8A7F, 0xE048, 0x8A61, 0xE049, 0x8A3F, 0xE04A, 0x8A77, + 0xE04B, 0x8A82, 0xE04C, 0x8A84, 0xE04D, 0x8A75, 0xE04E, 0x8A83, + 0xE04F, 0x8A81, 0xE050, 0x8A74, 0xE051, 0x8A7A, 0xE052, 0x8C3C, + 0xE053, 0x8C4B, 0xE054, 0x8C4A, 0xE055, 0x8C65, 0xE056, 0x8C64, + 0xE057, 0x8C66, 0xE058, 0x8C86, 0xE059, 0x8C84, 0xE05A, 0x8C85, + 0xE05B, 0x8CCC, 0xE05C, 0x8D68, 0xE05D, 0x8D69, 0xE05E, 0x8D91, + 0xE05F, 0x8D8C, 0xE060, 0x8D8E, 0xE061, 0x8D8F, 0xE062, 0x8D8D, + 0xE063, 0x8D93, 0xE064, 0x8D94, 0xE065, 0x8D90, 0xE066, 0x8D92, + 0xE067, 0x8DF0, 0xE068, 0x8DE0, 0xE069, 0x8DEC, 0xE06A, 0x8DF1, + 0xE06B, 0x8DEE, 0xE06C, 0x8DD0, 0xE06D, 0x8DE9, 0xE06E, 0x8DE3, + 0xE06F, 0x8DE2, 0xE070, 0x8DE7, 0xE071, 0x8DF2, 0xE072, 0x8DEB, + 0xE073, 0x8DF4, 0xE074, 0x8F06, 0xE075, 0x8EFF, 0xE076, 0x8F01, + 0xE077, 0x8F00, 0xE078, 0x8F05, 0xE079, 0x8F07, 0xE07A, 0x8F08, + 0xE07B, 0x8F02, 0xE07C, 0x8F0B, 0xE07D, 0x9052, 0xE07E, 0x903F, + 0xE0A1, 0x9044, 0xE0A2, 0x9049, 0xE0A3, 0x903D, 0xE0A4, 0x9110, + 0xE0A5, 0x910D, 0xE0A6, 0x910F, 0xE0A7, 0x9111, 0xE0A8, 0x9116, + 0xE0A9, 0x9114, 0xE0AA, 0x910B, 0xE0AB, 0x910E, 0xE0AC, 0x916E, + 0xE0AD, 0x916F, 0xE0AE, 0x9248, 0xE0AF, 0x9252, 0xE0B0, 0x9230, + 0xE0B1, 0x923A, 0xE0B2, 0x9266, 0xE0B3, 0x9233, 0xE0B4, 0x9265, + 0xE0B5, 0x925E, 0xE0B6, 0x9283, 0xE0B7, 0x922E, 0xE0B8, 0x924A, + 0xE0B9, 0x9246, 0xE0BA, 0x926D, 0xE0BB, 0x926C, 0xE0BC, 0x924F, + 0xE0BD, 0x9260, 0xE0BE, 0x9267, 0xE0BF, 0x926F, 0xE0C0, 0x9236, + 0xE0C1, 0x9261, 0xE0C2, 0x9270, 0xE0C3, 0x9231, 0xE0C4, 0x9254, + 0xE0C5, 0x9263, 0xE0C6, 0x9250, 0xE0C7, 0x9272, 0xE0C8, 0x924E, + 0xE0C9, 0x9253, 0xE0CA, 0x924C, 0xE0CB, 0x9256, 0xE0CC, 0x9232, + 0xE0CD, 0x959F, 0xE0CE, 0x959C, 0xE0CF, 0x959E, 0xE0D0, 0x959B, + 0xE0D1, 0x9692, 0xE0D2, 0x9693, 0xE0D3, 0x9691, 0xE0D4, 0x9697, + 0xE0D5, 0x96CE, 0xE0D6, 0x96FA, 0xE0D7, 0x96FD, 0xE0D8, 0x96F8, + 0xE0D9, 0x96F5, 0xE0DA, 0x9773, 0xE0DB, 0x9777, 0xE0DC, 0x9778, + 0xE0DD, 0x9772, 0xE0DE, 0x980F, 0xE0DF, 0x980D, 0xE0E0, 0x980E, + 0xE0E1, 0x98AC, 0xE0E2, 0x98F6, 0xE0E3, 0x98F9, 0xE0E4, 0x99AF, + 0xE0E5, 0x99B2, 0xE0E6, 0x99B0, 0xE0E7, 0x99B5, 0xE0E8, 0x9AAD, + 0xE0E9, 0x9AAB, 0xE0EA, 0x9B5B, 0xE0EB, 0x9CEA, 0xE0EC, 0x9CED, + 0xE0ED, 0x9CE7, 0xE0EE, 0x9E80, 0xE0EF, 0x9EFD, 0xE0F0, 0x50E6, + 0xE0F1, 0x50D4, 0xE0F2, 0x50D7, 0xE0F3, 0x50E8, 0xE0F4, 0x50F3, + 0xE0F5, 0x50DB, 0xE0F6, 0x50EA, 0xE0F7, 0x50DD, 0xE0F8, 0x50E4, + 0xE0F9, 0x50D3, 0xE0FA, 0x50EC, 0xE0FB, 0x50F0, 0xE0FC, 0x50EF, + 0xE0FD, 0x50E3, 0xE0FE, 0x50E0, 0xE140, 0x51D8, 0xE141, 0x5280, + 0xE142, 0x5281, 0xE143, 0x52E9, 0xE144, 0x52EB, 0xE145, 0x5330, + 0xE146, 0x53AC, 0xE147, 0x5627, 0xE148, 0x5615, 0xE149, 0x560C, + 0xE14A, 0x5612, 0xE14B, 0x55FC, 0xE14C, 0x560F, 0xE14D, 0x561C, + 0xE14E, 0x5601, 0xE14F, 0x5613, 0xE150, 0x5602, 0xE151, 0x55FA, + 0xE152, 0x561D, 0xE153, 0x5604, 0xE154, 0x55FF, 0xE155, 0x55F9, + 0xE156, 0x5889, 0xE157, 0x587C, 0xE158, 0x5890, 0xE159, 0x5898, + 0xE15A, 0x5886, 0xE15B, 0x5881, 0xE15C, 0x587F, 0xE15D, 0x5874, + 0xE15E, 0x588B, 0xE15F, 0x587A, 0xE160, 0x5887, 0xE161, 0x5891, + 0xE162, 0x588E, 0xE163, 0x5876, 0xE164, 0x5882, 0xE165, 0x5888, + 0xE166, 0x587B, 0xE167, 0x5894, 0xE168, 0x588F, 0xE169, 0x58FE, + 0xE16A, 0x596B, 0xE16B, 0x5ADC, 0xE16C, 0x5AEE, 0xE16D, 0x5AE5, + 0xE16E, 0x5AD5, 0xE16F, 0x5AEA, 0xE170, 0x5ADA, 0xE171, 0x5AED, + 0xE172, 0x5AEB, 0xE173, 0x5AF3, 0xE174, 0x5AE2, 0xE175, 0x5AE0, + 0xE176, 0x5ADB, 0xE177, 0x5AEC, 0xE178, 0x5ADE, 0xE179, 0x5ADD, + 0xE17A, 0x5AD9, 0xE17B, 0x5AE8, 0xE17C, 0x5ADF, 0xE17D, 0x5B77, + 0xE17E, 0x5BE0, 0xE1A1, 0x5BE3, 0xE1A2, 0x5C63, 0xE1A3, 0x5D82, + 0xE1A4, 0x5D80, 0xE1A5, 0x5D7D, 0xE1A6, 0x5D86, 0xE1A7, 0x5D7A, + 0xE1A8, 0x5D81, 0xE1A9, 0x5D77, 0xE1AA, 0x5D8A, 0xE1AB, 0x5D89, + 0xE1AC, 0x5D88, 0xE1AD, 0x5D7E, 0xE1AE, 0x5D7C, 0xE1AF, 0x5D8D, + 0xE1B0, 0x5D79, 0xE1B1, 0x5D7F, 0xE1B2, 0x5E58, 0xE1B3, 0x5E59, + 0xE1B4, 0x5E53, 0xE1B5, 0x5ED8, 0xE1B6, 0x5ED1, 0xE1B7, 0x5ED7, + 0xE1B8, 0x5ECE, 0xE1B9, 0x5EDC, 0xE1BA, 0x5ED5, 0xE1BB, 0x5ED9, + 0xE1BC, 0x5ED2, 0xE1BD, 0x5ED4, 0xE1BE, 0x5F44, 0xE1BF, 0x5F43, + 0xE1C0, 0x5F6F, 0xE1C1, 0x5FB6, 0xE1C2, 0x612C, 0xE1C3, 0x6128, + 0xE1C4, 0x6141, 0xE1C5, 0x615E, 0xE1C6, 0x6171, 0xE1C7, 0x6173, + 0xE1C8, 0x6152, 0xE1C9, 0x6153, 0xE1CA, 0x6172, 0xE1CB, 0x616C, + 0xE1CC, 0x6180, 0xE1CD, 0x6174, 0xE1CE, 0x6154, 0xE1CF, 0x617A, + 0xE1D0, 0x615B, 0xE1D1, 0x6165, 0xE1D2, 0x613B, 0xE1D3, 0x616A, + 0xE1D4, 0x6161, 0xE1D5, 0x6156, 0xE1D6, 0x6229, 0xE1D7, 0x6227, + 0xE1D8, 0x622B, 0xE1D9, 0x642B, 0xE1DA, 0x644D, 0xE1DB, 0x645B, + 0xE1DC, 0x645D, 0xE1DD, 0x6474, 0xE1DE, 0x6476, 0xE1DF, 0x6472, + 0xE1E0, 0x6473, 0xE1E1, 0x647D, 0xE1E2, 0x6475, 0xE1E3, 0x6466, + 0xE1E4, 0x64A6, 0xE1E5, 0x644E, 0xE1E6, 0x6482, 0xE1E7, 0x645E, + 0xE1E8, 0x645C, 0xE1E9, 0x644B, 0xE1EA, 0x6453, 0xE1EB, 0x6460, + 0xE1EC, 0x6450, 0xE1ED, 0x647F, 0xE1EE, 0x643F, 0xE1EF, 0x646C, + 0xE1F0, 0x646B, 0xE1F1, 0x6459, 0xE1F2, 0x6465, 0xE1F3, 0x6477, + 0xE1F4, 0x6573, 0xE1F5, 0x65A0, 0xE1F6, 0x66A1, 0xE1F7, 0x66A0, + 0xE1F8, 0x669F, 0xE1F9, 0x6705, 0xE1FA, 0x6704, 0xE1FB, 0x6722, + 0xE1FC, 0x69B1, 0xE1FD, 0x69B6, 0xE1FE, 0x69C9, 0xE240, 0x69A0, + 0xE241, 0x69CE, 0xE242, 0x6996, 0xE243, 0x69B0, 0xE244, 0x69AC, + 0xE245, 0x69BC, 0xE246, 0x6991, 0xE247, 0x6999, 0xE248, 0x698E, + 0xE249, 0x69A7, 0xE24A, 0x698D, 0xE24B, 0x69A9, 0xE24C, 0x69BE, + 0xE24D, 0x69AF, 0xE24E, 0x69BF, 0xE24F, 0x69C4, 0xE250, 0x69BD, + 0xE251, 0x69A4, 0xE252, 0x69D4, 0xE253, 0x69B9, 0xE254, 0x69CA, + 0xE255, 0x699A, 0xE256, 0x69CF, 0xE257, 0x69B3, 0xE258, 0x6993, + 0xE259, 0x69AA, 0xE25A, 0x69A1, 0xE25B, 0x699E, 0xE25C, 0x69D9, + 0xE25D, 0x6997, 0xE25E, 0x6990, 0xE25F, 0x69C2, 0xE260, 0x69B5, + 0xE261, 0x69A5, 0xE262, 0x69C6, 0xE263, 0x6B4A, 0xE264, 0x6B4D, + 0xE265, 0x6B4B, 0xE266, 0x6B9E, 0xE267, 0x6B9F, 0xE268, 0x6BA0, + 0xE269, 0x6BC3, 0xE26A, 0x6BC4, 0xE26B, 0x6BFE, 0xE26C, 0x6ECE, + 0xE26D, 0x6EF5, 0xE26E, 0x6EF1, 0xE26F, 0x6F03, 0xE270, 0x6F25, + 0xE271, 0x6EF8, 0xE272, 0x6F37, 0xE273, 0x6EFB, 0xE274, 0x6F2E, + 0xE275, 0x6F09, 0xE276, 0x6F4E, 0xE277, 0x6F19, 0xE278, 0x6F1A, + 0xE279, 0x6F27, 0xE27A, 0x6F18, 0xE27B, 0x6F3B, 0xE27C, 0x6F12, + 0xE27D, 0x6EED, 0xE27E, 0x6F0A, 0xE2A1, 0x6F36, 0xE2A2, 0x6F73, + 0xE2A3, 0x6EF9, 0xE2A4, 0x6EEE, 0xE2A5, 0x6F2D, 0xE2A6, 0x6F40, + 0xE2A7, 0x6F30, 0xE2A8, 0x6F3C, 0xE2A9, 0x6F35, 0xE2AA, 0x6EEB, + 0xE2AB, 0x6F07, 0xE2AC, 0x6F0E, 0xE2AD, 0x6F43, 0xE2AE, 0x6F05, + 0xE2AF, 0x6EFD, 0xE2B0, 0x6EF6, 0xE2B1, 0x6F39, 0xE2B2, 0x6F1C, + 0xE2B3, 0x6EFC, 0xE2B4, 0x6F3A, 0xE2B5, 0x6F1F, 0xE2B6, 0x6F0D, + 0xE2B7, 0x6F1E, 0xE2B8, 0x6F08, 0xE2B9, 0x6F21, 0xE2BA, 0x7187, + 0xE2BB, 0x7190, 0xE2BC, 0x7189, 0xE2BD, 0x7180, 0xE2BE, 0x7185, + 0xE2BF, 0x7182, 0xE2C0, 0x718F, 0xE2C1, 0x717B, 0xE2C2, 0x7186, + 0xE2C3, 0x7181, 0xE2C4, 0x7197, 0xE2C5, 0x7244, 0xE2C6, 0x7253, + 0xE2C7, 0x7297, 0xE2C8, 0x7295, 0xE2C9, 0x7293, 0xE2CA, 0x7343, + 0xE2CB, 0x734D, 0xE2CC, 0x7351, 0xE2CD, 0x734C, 0xE2CE, 0x7462, + 0xE2CF, 0x7473, 0xE2D0, 0x7471, 0xE2D1, 0x7475, 0xE2D2, 0x7472, + 0xE2D3, 0x7467, 0xE2D4, 0x746E, 0xE2D5, 0x7500, 0xE2D6, 0x7502, + 0xE2D7, 0x7503, 0xE2D8, 0x757D, 0xE2D9, 0x7590, 0xE2DA, 0x7616, + 0xE2DB, 0x7608, 0xE2DC, 0x760C, 0xE2DD, 0x7615, 0xE2DE, 0x7611, + 0xE2DF, 0x760A, 0xE2E0, 0x7614, 0xE2E1, 0x76B8, 0xE2E2, 0x7781, + 0xE2E3, 0x777C, 0xE2E4, 0x7785, 0xE2E5, 0x7782, 0xE2E6, 0x776E, + 0xE2E7, 0x7780, 0xE2E8, 0x776F, 0xE2E9, 0x777E, 0xE2EA, 0x7783, + 0xE2EB, 0x78B2, 0xE2EC, 0x78AA, 0xE2ED, 0x78B4, 0xE2EE, 0x78AD, + 0xE2EF, 0x78A8, 0xE2F0, 0x787E, 0xE2F1, 0x78AB, 0xE2F2, 0x789E, + 0xE2F3, 0x78A5, 0xE2F4, 0x78A0, 0xE2F5, 0x78AC, 0xE2F6, 0x78A2, + 0xE2F7, 0x78A4, 0xE2F8, 0x7998, 0xE2F9, 0x798A, 0xE2FA, 0x798B, + 0xE2FB, 0x7996, 0xE2FC, 0x7995, 0xE2FD, 0x7994, 0xE2FE, 0x7993, + 0xE340, 0x7997, 0xE341, 0x7988, 0xE342, 0x7992, 0xE343, 0x7990, + 0xE344, 0x7A2B, 0xE345, 0x7A4A, 0xE346, 0x7A30, 0xE347, 0x7A2F, + 0xE348, 0x7A28, 0xE349, 0x7A26, 0xE34A, 0x7AA8, 0xE34B, 0x7AAB, + 0xE34C, 0x7AAC, 0xE34D, 0x7AEE, 0xE34E, 0x7B88, 0xE34F, 0x7B9C, + 0xE350, 0x7B8A, 0xE351, 0x7B91, 0xE352, 0x7B90, 0xE353, 0x7B96, + 0xE354, 0x7B8D, 0xE355, 0x7B8C, 0xE356, 0x7B9B, 0xE357, 0x7B8E, + 0xE358, 0x7B85, 0xE359, 0x7B98, 0xE35A, 0x5284, 0xE35B, 0x7B99, + 0xE35C, 0x7BA4, 0xE35D, 0x7B82, 0xE35E, 0x7CBB, 0xE35F, 0x7CBF, + 0xE360, 0x7CBC, 0xE361, 0x7CBA, 0xE362, 0x7DA7, 0xE363, 0x7DB7, + 0xE364, 0x7DC2, 0xE365, 0x7DA3, 0xE366, 0x7DAA, 0xE367, 0x7DC1, + 0xE368, 0x7DC0, 0xE369, 0x7DC5, 0xE36A, 0x7D9D, 0xE36B, 0x7DCE, + 0xE36C, 0x7DC4, 0xE36D, 0x7DC6, 0xE36E, 0x7DCB, 0xE36F, 0x7DCC, + 0xE370, 0x7DAF, 0xE371, 0x7DB9, 0xE372, 0x7D96, 0xE373, 0x7DBC, + 0xE374, 0x7D9F, 0xE375, 0x7DA6, 0xE376, 0x7DAE, 0xE377, 0x7DA9, + 0xE378, 0x7DA1, 0xE379, 0x7DC9, 0xE37A, 0x7F73, 0xE37B, 0x7FE2, + 0xE37C, 0x7FE3, 0xE37D, 0x7FE5, 0xE37E, 0x7FDE, 0xE3A1, 0x8024, + 0xE3A2, 0x805D, 0xE3A3, 0x805C, 0xE3A4, 0x8189, 0xE3A5, 0x8186, + 0xE3A6, 0x8183, 0xE3A7, 0x8187, 0xE3A8, 0x818D, 0xE3A9, 0x818C, + 0xE3AA, 0x818B, 0xE3AB, 0x8215, 0xE3AC, 0x8497, 0xE3AD, 0x84A4, + 0xE3AE, 0x84A1, 0xE3AF, 0x849F, 0xE3B0, 0x84BA, 0xE3B1, 0x84CE, + 0xE3B2, 0x84C2, 0xE3B3, 0x84AC, 0xE3B4, 0x84AE, 0xE3B5, 0x84AB, + 0xE3B6, 0x84B9, 0xE3B7, 0x84B4, 0xE3B8, 0x84C1, 0xE3B9, 0x84CD, + 0xE3BA, 0x84AA, 0xE3BB, 0x849A, 0xE3BC, 0x84B1, 0xE3BD, 0x84D0, + 0xE3BE, 0x849D, 0xE3BF, 0x84A7, 0xE3C0, 0x84BB, 0xE3C1, 0x84A2, + 0xE3C2, 0x8494, 0xE3C3, 0x84C7, 0xE3C4, 0x84CC, 0xE3C5, 0x849B, + 0xE3C6, 0x84A9, 0xE3C7, 0x84AF, 0xE3C8, 0x84A8, 0xE3C9, 0x84D6, + 0xE3CA, 0x8498, 0xE3CB, 0x84B6, 0xE3CC, 0x84CF, 0xE3CD, 0x84A0, + 0xE3CE, 0x84D7, 0xE3CF, 0x84D4, 0xE3D0, 0x84D2, 0xE3D1, 0x84DB, + 0xE3D2, 0x84B0, 0xE3D3, 0x8491, 0xE3D4, 0x8661, 0xE3D5, 0x8733, + 0xE3D6, 0x8723, 0xE3D7, 0x8728, 0xE3D8, 0x876B, 0xE3D9, 0x8740, + 0xE3DA, 0x872E, 0xE3DB, 0x871E, 0xE3DC, 0x8721, 0xE3DD, 0x8719, + 0xE3DE, 0x871B, 0xE3DF, 0x8743, 0xE3E0, 0x872C, 0xE3E1, 0x8741, + 0xE3E2, 0x873E, 0xE3E3, 0x8746, 0xE3E4, 0x8720, 0xE3E5, 0x8732, + 0xE3E6, 0x872A, 0xE3E7, 0x872D, 0xE3E8, 0x873C, 0xE3E9, 0x8712, + 0xE3EA, 0x873A, 0xE3EB, 0x8731, 0xE3EC, 0x8735, 0xE3ED, 0x8742, + 0xE3EE, 0x8726, 0xE3EF, 0x8727, 0xE3F0, 0x8738, 0xE3F1, 0x8724, + 0xE3F2, 0x871A, 0xE3F3, 0x8730, 0xE3F4, 0x8711, 0xE3F5, 0x88F7, + 0xE3F6, 0x88E7, 0xE3F7, 0x88F1, 0xE3F8, 0x88F2, 0xE3F9, 0x88FA, + 0xE3FA, 0x88FE, 0xE3FB, 0x88EE, 0xE3FC, 0x88FC, 0xE3FD, 0x88F6, + 0xE3FE, 0x88FB, 0xE440, 0x88F0, 0xE441, 0x88EC, 0xE442, 0x88EB, + 0xE443, 0x899D, 0xE444, 0x89A1, 0xE445, 0x899F, 0xE446, 0x899E, + 0xE447, 0x89E9, 0xE448, 0x89EB, 0xE449, 0x89E8, 0xE44A, 0x8AAB, + 0xE44B, 0x8A99, 0xE44C, 0x8A8B, 0xE44D, 0x8A92, 0xE44E, 0x8A8F, + 0xE44F, 0x8A96, 0xE450, 0x8C3D, 0xE451, 0x8C68, 0xE452, 0x8C69, + 0xE453, 0x8CD5, 0xE454, 0x8CCF, 0xE455, 0x8CD7, 0xE456, 0x8D96, + 0xE457, 0x8E09, 0xE458, 0x8E02, 0xE459, 0x8DFF, 0xE45A, 0x8E0D, + 0xE45B, 0x8DFD, 0xE45C, 0x8E0A, 0xE45D, 0x8E03, 0xE45E, 0x8E07, + 0xE45F, 0x8E06, 0xE460, 0x8E05, 0xE461, 0x8DFE, 0xE462, 0x8E00, + 0xE463, 0x8E04, 0xE464, 0x8F10, 0xE465, 0x8F11, 0xE466, 0x8F0E, + 0xE467, 0x8F0D, 0xE468, 0x9123, 0xE469, 0x911C, 0xE46A, 0x9120, + 0xE46B, 0x9122, 0xE46C, 0x911F, 0xE46D, 0x911D, 0xE46E, 0x911A, + 0xE46F, 0x9124, 0xE470, 0x9121, 0xE471, 0x911B, 0xE472, 0x917A, + 0xE473, 0x9172, 0xE474, 0x9179, 0xE475, 0x9173, 0xE476, 0x92A5, + 0xE477, 0x92A4, 0xE478, 0x9276, 0xE479, 0x929B, 0xE47A, 0x927A, + 0xE47B, 0x92A0, 0xE47C, 0x9294, 0xE47D, 0x92AA, 0xE47E, 0x928D, + 0xE4A1, 0x92A6, 0xE4A2, 0x929A, 0xE4A3, 0x92AB, 0xE4A4, 0x9279, + 0xE4A5, 0x9297, 0xE4A6, 0x927F, 0xE4A7, 0x92A3, 0xE4A8, 0x92EE, + 0xE4A9, 0x928E, 0xE4AA, 0x9282, 0xE4AB, 0x9295, 0xE4AC, 0x92A2, + 0xE4AD, 0x927D, 0xE4AE, 0x9288, 0xE4AF, 0x92A1, 0xE4B0, 0x928A, + 0xE4B1, 0x9286, 0xE4B2, 0x928C, 0xE4B3, 0x9299, 0xE4B4, 0x92A7, + 0xE4B5, 0x927E, 0xE4B6, 0x9287, 0xE4B7, 0x92A9, 0xE4B8, 0x929D, + 0xE4B9, 0x928B, 0xE4BA, 0x922D, 0xE4BB, 0x969E, 0xE4BC, 0x96A1, + 0xE4BD, 0x96FF, 0xE4BE, 0x9758, 0xE4BF, 0x977D, 0xE4C0, 0x977A, + 0xE4C1, 0x977E, 0xE4C2, 0x9783, 0xE4C3, 0x9780, 0xE4C4, 0x9782, + 0xE4C5, 0x977B, 0xE4C6, 0x9784, 0xE4C7, 0x9781, 0xE4C8, 0x977F, + 0xE4C9, 0x97CE, 0xE4CA, 0x97CD, 0xE4CB, 0x9816, 0xE4CC, 0x98AD, + 0xE4CD, 0x98AE, 0xE4CE, 0x9902, 0xE4CF, 0x9900, 0xE4D0, 0x9907, + 0xE4D1, 0x999D, 0xE4D2, 0x999C, 0xE4D3, 0x99C3, 0xE4D4, 0x99B9, + 0xE4D5, 0x99BB, 0xE4D6, 0x99BA, 0xE4D7, 0x99C2, 0xE4D8, 0x99BD, + 0xE4D9, 0x99C7, 0xE4DA, 0x9AB1, 0xE4DB, 0x9AE3, 0xE4DC, 0x9AE7, + 0xE4DD, 0x9B3E, 0xE4DE, 0x9B3F, 0xE4DF, 0x9B60, 0xE4E0, 0x9B61, + 0xE4E1, 0x9B5F, 0xE4E2, 0x9CF1, 0xE4E3, 0x9CF2, 0xE4E4, 0x9CF5, + 0xE4E5, 0x9EA7, 0xE4E6, 0x50FF, 0xE4E7, 0x5103, 0xE4E8, 0x5130, + 0xE4E9, 0x50F8, 0xE4EA, 0x5106, 0xE4EB, 0x5107, 0xE4EC, 0x50F6, + 0xE4ED, 0x50FE, 0xE4EE, 0x510B, 0xE4EF, 0x510C, 0xE4F0, 0x50FD, + 0xE4F1, 0x510A, 0xE4F2, 0x528B, 0xE4F3, 0x528C, 0xE4F4, 0x52F1, + 0xE4F5, 0x52EF, 0xE4F6, 0x5648, 0xE4F7, 0x5642, 0xE4F8, 0x564C, + 0xE4F9, 0x5635, 0xE4FA, 0x5641, 0xE4FB, 0x564A, 0xE4FC, 0x5649, + 0xE4FD, 0x5646, 0xE4FE, 0x5658, 0xE540, 0x565A, 0xE541, 0x5640, + 0xE542, 0x5633, 0xE543, 0x563D, 0xE544, 0x562C, 0xE545, 0x563E, + 0xE546, 0x5638, 0xE547, 0x562A, 0xE548, 0x563A, 0xE549, 0x571A, + 0xE54A, 0x58AB, 0xE54B, 0x589D, 0xE54C, 0x58B1, 0xE54D, 0x58A0, + 0xE54E, 0x58A3, 0xE54F, 0x58AF, 0xE550, 0x58AC, 0xE551, 0x58A5, + 0xE552, 0x58A1, 0xE553, 0x58FF, 0xE554, 0x5AFF, 0xE555, 0x5AF4, + 0xE556, 0x5AFD, 0xE557, 0x5AF7, 0xE558, 0x5AF6, 0xE559, 0x5B03, + 0xE55A, 0x5AF8, 0xE55B, 0x5B02, 0xE55C, 0x5AF9, 0xE55D, 0x5B01, + 0xE55E, 0x5B07, 0xE55F, 0x5B05, 0xE560, 0x5B0F, 0xE561, 0x5C67, + 0xE562, 0x5D99, 0xE563, 0x5D97, 0xE564, 0x5D9F, 0xE565, 0x5D92, + 0xE566, 0x5DA2, 0xE567, 0x5D93, 0xE568, 0x5D95, 0xE569, 0x5DA0, + 0xE56A, 0x5D9C, 0xE56B, 0x5DA1, 0xE56C, 0x5D9A, 0xE56D, 0x5D9E, + 0xE56E, 0x5E69, 0xE56F, 0x5E5D, 0xE570, 0x5E60, 0xE571, 0x5E5C, + 0xE572, 0x7DF3, 0xE573, 0x5EDB, 0xE574, 0x5EDE, 0xE575, 0x5EE1, + 0xE576, 0x5F49, 0xE577, 0x5FB2, 0xE578, 0x618B, 0xE579, 0x6183, + 0xE57A, 0x6179, 0xE57B, 0x61B1, 0xE57C, 0x61B0, 0xE57D, 0x61A2, + 0xE57E, 0x6189, 0xE5A1, 0x619B, 0xE5A2, 0x6193, 0xE5A3, 0x61AF, + 0xE5A4, 0x61AD, 0xE5A5, 0x619F, 0xE5A6, 0x6192, 0xE5A7, 0x61AA, + 0xE5A8, 0x61A1, 0xE5A9, 0x618D, 0xE5AA, 0x6166, 0xE5AB, 0x61B3, + 0xE5AC, 0x622D, 0xE5AD, 0x646E, 0xE5AE, 0x6470, 0xE5AF, 0x6496, + 0xE5B0, 0x64A0, 0xE5B1, 0x6485, 0xE5B2, 0x6497, 0xE5B3, 0x649C, + 0xE5B4, 0x648F, 0xE5B5, 0x648B, 0xE5B6, 0x648A, 0xE5B7, 0x648C, + 0xE5B8, 0x64A3, 0xE5B9, 0x649F, 0xE5BA, 0x6468, 0xE5BB, 0x64B1, + 0xE5BC, 0x6498, 0xE5BD, 0x6576, 0xE5BE, 0x657A, 0xE5BF, 0x6579, + 0xE5C0, 0x657B, 0xE5C1, 0x65B2, 0xE5C2, 0x65B3, 0xE5C3, 0x66B5, + 0xE5C4, 0x66B0, 0xE5C5, 0x66A9, 0xE5C6, 0x66B2, 0xE5C7, 0x66B7, + 0xE5C8, 0x66AA, 0xE5C9, 0x66AF, 0xE5CA, 0x6A00, 0xE5CB, 0x6A06, + 0xE5CC, 0x6A17, 0xE5CD, 0x69E5, 0xE5CE, 0x69F8, 0xE5CF, 0x6A15, + 0xE5D0, 0x69F1, 0xE5D1, 0x69E4, 0xE5D2, 0x6A20, 0xE5D3, 0x69FF, + 0xE5D4, 0x69EC, 0xE5D5, 0x69E2, 0xE5D6, 0x6A1B, 0xE5D7, 0x6A1D, + 0xE5D8, 0x69FE, 0xE5D9, 0x6A27, 0xE5DA, 0x69F2, 0xE5DB, 0x69EE, + 0xE5DC, 0x6A14, 0xE5DD, 0x69F7, 0xE5DE, 0x69E7, 0xE5DF, 0x6A40, + 0xE5E0, 0x6A08, 0xE5E1, 0x69E6, 0xE5E2, 0x69FB, 0xE5E3, 0x6A0D, + 0xE5E4, 0x69FC, 0xE5E5, 0x69EB, 0xE5E6, 0x6A09, 0xE5E7, 0x6A04, + 0xE5E8, 0x6A18, 0xE5E9, 0x6A25, 0xE5EA, 0x6A0F, 0xE5EB, 0x69F6, + 0xE5EC, 0x6A26, 0xE5ED, 0x6A07, 0xE5EE, 0x69F4, 0xE5EF, 0x6A16, + 0xE5F0, 0x6B51, 0xE5F1, 0x6BA5, 0xE5F2, 0x6BA3, 0xE5F3, 0x6BA2, + 0xE5F4, 0x6BA6, 0xE5F5, 0x6C01, 0xE5F6, 0x6C00, 0xE5F7, 0x6BFF, + 0xE5F8, 0x6C02, 0xE5F9, 0x6F41, 0xE5FA, 0x6F26, 0xE5FB, 0x6F7E, + 0xE5FC, 0x6F87, 0xE5FD, 0x6FC6, 0xE5FE, 0x6F92, 0xE640, 0x6F8D, + 0xE641, 0x6F89, 0xE642, 0x6F8C, 0xE643, 0x6F62, 0xE644, 0x6F4F, + 0xE645, 0x6F85, 0xE646, 0x6F5A, 0xE647, 0x6F96, 0xE648, 0x6F76, + 0xE649, 0x6F6C, 0xE64A, 0x6F82, 0xE64B, 0x6F55, 0xE64C, 0x6F72, + 0xE64D, 0x6F52, 0xE64E, 0x6F50, 0xE64F, 0x6F57, 0xE650, 0x6F94, + 0xE651, 0x6F93, 0xE652, 0x6F5D, 0xE653, 0x6F00, 0xE654, 0x6F61, + 0xE655, 0x6F6B, 0xE656, 0x6F7D, 0xE657, 0x6F67, 0xE658, 0x6F90, + 0xE659, 0x6F53, 0xE65A, 0x6F8B, 0xE65B, 0x6F69, 0xE65C, 0x6F7F, + 0xE65D, 0x6F95, 0xE65E, 0x6F63, 0xE65F, 0x6F77, 0xE660, 0x6F6A, + 0xE661, 0x6F7B, 0xE662, 0x71B2, 0xE663, 0x71AF, 0xE664, 0x719B, + 0xE665, 0x71B0, 0xE666, 0x71A0, 0xE667, 0x719A, 0xE668, 0x71A9, + 0xE669, 0x71B5, 0xE66A, 0x719D, 0xE66B, 0x71A5, 0xE66C, 0x719E, + 0xE66D, 0x71A4, 0xE66E, 0x71A1, 0xE66F, 0x71AA, 0xE670, 0x719C, + 0xE671, 0x71A7, 0xE672, 0x71B3, 0xE673, 0x7298, 0xE674, 0x729A, + 0xE675, 0x7358, 0xE676, 0x7352, 0xE677, 0x735E, 0xE678, 0x735F, + 0xE679, 0x7360, 0xE67A, 0x735D, 0xE67B, 0x735B, 0xE67C, 0x7361, + 0xE67D, 0x735A, 0xE67E, 0x7359, 0xE6A1, 0x7362, 0xE6A2, 0x7487, + 0xE6A3, 0x7489, 0xE6A4, 0x748A, 0xE6A5, 0x7486, 0xE6A6, 0x7481, + 0xE6A7, 0x747D, 0xE6A8, 0x7485, 0xE6A9, 0x7488, 0xE6AA, 0x747C, + 0xE6AB, 0x7479, 0xE6AC, 0x7508, 0xE6AD, 0x7507, 0xE6AE, 0x757E, + 0xE6AF, 0x7625, 0xE6B0, 0x761E, 0xE6B1, 0x7619, 0xE6B2, 0x761D, + 0xE6B3, 0x761C, 0xE6B4, 0x7623, 0xE6B5, 0x761A, 0xE6B6, 0x7628, + 0xE6B7, 0x761B, 0xE6B8, 0x769C, 0xE6B9, 0x769D, 0xE6BA, 0x769E, + 0xE6BB, 0x769B, 0xE6BC, 0x778D, 0xE6BD, 0x778F, 0xE6BE, 0x7789, + 0xE6BF, 0x7788, 0xE6C0, 0x78CD, 0xE6C1, 0x78BB, 0xE6C2, 0x78CF, + 0xE6C3, 0x78CC, 0xE6C4, 0x78D1, 0xE6C5, 0x78CE, 0xE6C6, 0x78D4, + 0xE6C7, 0x78C8, 0xE6C8, 0x78C3, 0xE6C9, 0x78C4, 0xE6CA, 0x78C9, + 0xE6CB, 0x799A, 0xE6CC, 0x79A1, 0xE6CD, 0x79A0, 0xE6CE, 0x799C, + 0xE6CF, 0x79A2, 0xE6D0, 0x799B, 0xE6D1, 0x6B76, 0xE6D2, 0x7A39, + 0xE6D3, 0x7AB2, 0xE6D4, 0x7AB4, 0xE6D5, 0x7AB3, 0xE6D6, 0x7BB7, + 0xE6D7, 0x7BCB, 0xE6D8, 0x7BBE, 0xE6D9, 0x7BAC, 0xE6DA, 0x7BCE, + 0xE6DB, 0x7BAF, 0xE6DC, 0x7BB9, 0xE6DD, 0x7BCA, 0xE6DE, 0x7BB5, + 0xE6DF, 0x7CC5, 0xE6E0, 0x7CC8, 0xE6E1, 0x7CCC, 0xE6E2, 0x7CCB, + 0xE6E3, 0x7DF7, 0xE6E4, 0x7DDB, 0xE6E5, 0x7DEA, 0xE6E6, 0x7DE7, + 0xE6E7, 0x7DD7, 0xE6E8, 0x7DE1, 0xE6E9, 0x7E03, 0xE6EA, 0x7DFA, + 0xE6EB, 0x7DE6, 0xE6EC, 0x7DF6, 0xE6ED, 0x7DF1, 0xE6EE, 0x7DF0, + 0xE6EF, 0x7DEE, 0xE6F0, 0x7DDF, 0xE6F1, 0x7F76, 0xE6F2, 0x7FAC, + 0xE6F3, 0x7FB0, 0xE6F4, 0x7FAD, 0xE6F5, 0x7FED, 0xE6F6, 0x7FEB, + 0xE6F7, 0x7FEA, 0xE6F8, 0x7FEC, 0xE6F9, 0x7FE6, 0xE6FA, 0x7FE8, + 0xE6FB, 0x8064, 0xE6FC, 0x8067, 0xE6FD, 0x81A3, 0xE6FE, 0x819F, + 0xE740, 0x819E, 0xE741, 0x8195, 0xE742, 0x81A2, 0xE743, 0x8199, + 0xE744, 0x8197, 0xE745, 0x8216, 0xE746, 0x824F, 0xE747, 0x8253, + 0xE748, 0x8252, 0xE749, 0x8250, 0xE74A, 0x824E, 0xE74B, 0x8251, + 0xE74C, 0x8524, 0xE74D, 0x853B, 0xE74E, 0x850F, 0xE74F, 0x8500, + 0xE750, 0x8529, 0xE751, 0x850E, 0xE752, 0x8509, 0xE753, 0x850D, + 0xE754, 0x851F, 0xE755, 0x850A, 0xE756, 0x8527, 0xE757, 0x851C, + 0xE758, 0x84FB, 0xE759, 0x852B, 0xE75A, 0x84FA, 0xE75B, 0x8508, + 0xE75C, 0x850C, 0xE75D, 0x84F4, 0xE75E, 0x852A, 0xE75F, 0x84F2, + 0xE760, 0x8515, 0xE761, 0x84F7, 0xE762, 0x84EB, 0xE763, 0x84F3, + 0xE764, 0x84FC, 0xE765, 0x8512, 0xE766, 0x84EA, 0xE767, 0x84E9, + 0xE768, 0x8516, 0xE769, 0x84FE, 0xE76A, 0x8528, 0xE76B, 0x851D, + 0xE76C, 0x852E, 0xE76D, 0x8502, 0xE76E, 0x84FD, 0xE76F, 0x851E, + 0xE770, 0x84F6, 0xE771, 0x8531, 0xE772, 0x8526, 0xE773, 0x84E7, + 0xE774, 0x84E8, 0xE775, 0x84F0, 0xE776, 0x84EF, 0xE777, 0x84F9, + 0xE778, 0x8518, 0xE779, 0x8520, 0xE77A, 0x8530, 0xE77B, 0x850B, + 0xE77C, 0x8519, 0xE77D, 0x852F, 0xE77E, 0x8662, 0xE7A1, 0x8756, + 0xE7A2, 0x8763, 0xE7A3, 0x8764, 0xE7A4, 0x8777, 0xE7A5, 0x87E1, + 0xE7A6, 0x8773, 0xE7A7, 0x8758, 0xE7A8, 0x8754, 0xE7A9, 0x875B, + 0xE7AA, 0x8752, 0xE7AB, 0x8761, 0xE7AC, 0x875A, 0xE7AD, 0x8751, + 0xE7AE, 0x875E, 0xE7AF, 0x876D, 0xE7B0, 0x876A, 0xE7B1, 0x8750, + 0xE7B2, 0x874E, 0xE7B3, 0x875F, 0xE7B4, 0x875D, 0xE7B5, 0x876F, + 0xE7B6, 0x876C, 0xE7B7, 0x877A, 0xE7B8, 0x876E, 0xE7B9, 0x875C, + 0xE7BA, 0x8765, 0xE7BB, 0x874F, 0xE7BC, 0x877B, 0xE7BD, 0x8775, + 0xE7BE, 0x8762, 0xE7BF, 0x8767, 0xE7C0, 0x8769, 0xE7C1, 0x885A, + 0xE7C2, 0x8905, 0xE7C3, 0x890C, 0xE7C4, 0x8914, 0xE7C5, 0x890B, + 0xE7C6, 0x8917, 0xE7C7, 0x8918, 0xE7C8, 0x8919, 0xE7C9, 0x8906, + 0xE7CA, 0x8916, 0xE7CB, 0x8911, 0xE7CC, 0x890E, 0xE7CD, 0x8909, + 0xE7CE, 0x89A2, 0xE7CF, 0x89A4, 0xE7D0, 0x89A3, 0xE7D1, 0x89ED, + 0xE7D2, 0x89F0, 0xE7D3, 0x89EC, 0xE7D4, 0x8ACF, 0xE7D5, 0x8AC6, + 0xE7D6, 0x8AB8, 0xE7D7, 0x8AD3, 0xE7D8, 0x8AD1, 0xE7D9, 0x8AD4, + 0xE7DA, 0x8AD5, 0xE7DB, 0x8ABB, 0xE7DC, 0x8AD7, 0xE7DD, 0x8ABE, + 0xE7DE, 0x8AC0, 0xE7DF, 0x8AC5, 0xE7E0, 0x8AD8, 0xE7E1, 0x8AC3, + 0xE7E2, 0x8ABA, 0xE7E3, 0x8ABD, 0xE7E4, 0x8AD9, 0xE7E5, 0x8C3E, + 0xE7E6, 0x8C4D, 0xE7E7, 0x8C8F, 0xE7E8, 0x8CE5, 0xE7E9, 0x8CDF, + 0xE7EA, 0x8CD9, 0xE7EB, 0x8CE8, 0xE7EC, 0x8CDA, 0xE7ED, 0x8CDD, + 0xE7EE, 0x8CE7, 0xE7EF, 0x8DA0, 0xE7F0, 0x8D9C, 0xE7F1, 0x8DA1, + 0xE7F2, 0x8D9B, 0xE7F3, 0x8E20, 0xE7F4, 0x8E23, 0xE7F5, 0x8E25, + 0xE7F6, 0x8E24, 0xE7F7, 0x8E2E, 0xE7F8, 0x8E15, 0xE7F9, 0x8E1B, + 0xE7FA, 0x8E16, 0xE7FB, 0x8E11, 0xE7FC, 0x8E19, 0xE7FD, 0x8E26, + 0xE7FE, 0x8E27, 0xE840, 0x8E14, 0xE841, 0x8E12, 0xE842, 0x8E18, + 0xE843, 0x8E13, 0xE844, 0x8E1C, 0xE845, 0x8E17, 0xE846, 0x8E1A, + 0xE847, 0x8F2C, 0xE848, 0x8F24, 0xE849, 0x8F18, 0xE84A, 0x8F1A, + 0xE84B, 0x8F20, 0xE84C, 0x8F23, 0xE84D, 0x8F16, 0xE84E, 0x8F17, + 0xE84F, 0x9073, 0xE850, 0x9070, 0xE851, 0x906F, 0xE852, 0x9067, + 0xE853, 0x906B, 0xE854, 0x912F, 0xE855, 0x912B, 0xE856, 0x9129, + 0xE857, 0x912A, 0xE858, 0x9132, 0xE859, 0x9126, 0xE85A, 0x912E, + 0xE85B, 0x9185, 0xE85C, 0x9186, 0xE85D, 0x918A, 0xE85E, 0x9181, + 0xE85F, 0x9182, 0xE860, 0x9184, 0xE861, 0x9180, 0xE862, 0x92D0, + 0xE863, 0x92C3, 0xE864, 0x92C4, 0xE865, 0x92C0, 0xE866, 0x92D9, + 0xE867, 0x92B6, 0xE868, 0x92CF, 0xE869, 0x92F1, 0xE86A, 0x92DF, + 0xE86B, 0x92D8, 0xE86C, 0x92E9, 0xE86D, 0x92D7, 0xE86E, 0x92DD, + 0xE86F, 0x92CC, 0xE870, 0x92EF, 0xE871, 0x92C2, 0xE872, 0x92E8, + 0xE873, 0x92CA, 0xE874, 0x92C8, 0xE875, 0x92CE, 0xE876, 0x92E6, + 0xE877, 0x92CD, 0xE878, 0x92D5, 0xE879, 0x92C9, 0xE87A, 0x92E0, + 0xE87B, 0x92DE, 0xE87C, 0x92E7, 0xE87D, 0x92D1, 0xE87E, 0x92D3, + 0xE8A1, 0x92B5, 0xE8A2, 0x92E1, 0xE8A3, 0x92C6, 0xE8A4, 0x92B4, + 0xE8A5, 0x957C, 0xE8A6, 0x95AC, 0xE8A7, 0x95AB, 0xE8A8, 0x95AE, + 0xE8A9, 0x95B0, 0xE8AA, 0x96A4, 0xE8AB, 0x96A2, 0xE8AC, 0x96D3, + 0xE8AD, 0x9705, 0xE8AE, 0x9708, 0xE8AF, 0x9702, 0xE8B0, 0x975A, + 0xE8B1, 0x978A, 0xE8B2, 0x978E, 0xE8B3, 0x9788, 0xE8B4, 0x97D0, + 0xE8B5, 0x97CF, 0xE8B6, 0x981E, 0xE8B7, 0x981D, 0xE8B8, 0x9826, + 0xE8B9, 0x9829, 0xE8BA, 0x9828, 0xE8BB, 0x9820, 0xE8BC, 0x981B, + 0xE8BD, 0x9827, 0xE8BE, 0x98B2, 0xE8BF, 0x9908, 0xE8C0, 0x98FA, + 0xE8C1, 0x9911, 0xE8C2, 0x9914, 0xE8C3, 0x9916, 0xE8C4, 0x9917, + 0xE8C5, 0x9915, 0xE8C6, 0x99DC, 0xE8C7, 0x99CD, 0xE8C8, 0x99CF, + 0xE8C9, 0x99D3, 0xE8CA, 0x99D4, 0xE8CB, 0x99CE, 0xE8CC, 0x99C9, + 0xE8CD, 0x99D6, 0xE8CE, 0x99D8, 0xE8CF, 0x99CB, 0xE8D0, 0x99D7, + 0xE8D1, 0x99CC, 0xE8D2, 0x9AB3, 0xE8D3, 0x9AEC, 0xE8D4, 0x9AEB, + 0xE8D5, 0x9AF3, 0xE8D6, 0x9AF2, 0xE8D7, 0x9AF1, 0xE8D8, 0x9B46, + 0xE8D9, 0x9B43, 0xE8DA, 0x9B67, 0xE8DB, 0x9B74, 0xE8DC, 0x9B71, + 0xE8DD, 0x9B66, 0xE8DE, 0x9B76, 0xE8DF, 0x9B75, 0xE8E0, 0x9B70, + 0xE8E1, 0x9B68, 0xE8E2, 0x9B64, 0xE8E3, 0x9B6C, 0xE8E4, 0x9CFC, + 0xE8E5, 0x9CFA, 0xE8E6, 0x9CFD, 0xE8E7, 0x9CFF, 0xE8E8, 0x9CF7, + 0xE8E9, 0x9D07, 0xE8EA, 0x9D00, 0xE8EB, 0x9CF9, 0xE8EC, 0x9CFB, + 0xE8ED, 0x9D08, 0xE8EE, 0x9D05, 0xE8EF, 0x9D04, 0xE8F0, 0x9E83, + 0xE8F1, 0x9ED3, 0xE8F2, 0x9F0F, 0xE8F3, 0x9F10, 0xE8F4, 0x511C, + 0xE8F5, 0x5113, 0xE8F6, 0x5117, 0xE8F7, 0x511A, 0xE8F8, 0x5111, + 0xE8F9, 0x51DE, 0xE8FA, 0x5334, 0xE8FB, 0x53E1, 0xE8FC, 0x5670, + 0xE8FD, 0x5660, 0xE8FE, 0x566E, 0xE940, 0x5673, 0xE941, 0x5666, + 0xE942, 0x5663, 0xE943, 0x566D, 0xE944, 0x5672, 0xE945, 0x565E, + 0xE946, 0x5677, 0xE947, 0x571C, 0xE948, 0x571B, 0xE949, 0x58C8, + 0xE94A, 0x58BD, 0xE94B, 0x58C9, 0xE94C, 0x58BF, 0xE94D, 0x58BA, + 0xE94E, 0x58C2, 0xE94F, 0x58BC, 0xE950, 0x58C6, 0xE951, 0x5B17, + 0xE952, 0x5B19, 0xE953, 0x5B1B, 0xE954, 0x5B21, 0xE955, 0x5B14, + 0xE956, 0x5B13, 0xE957, 0x5B10, 0xE958, 0x5B16, 0xE959, 0x5B28, + 0xE95A, 0x5B1A, 0xE95B, 0x5B20, 0xE95C, 0x5B1E, 0xE95D, 0x5BEF, + 0xE95E, 0x5DAC, 0xE95F, 0x5DB1, 0xE960, 0x5DA9, 0xE961, 0x5DA7, + 0xE962, 0x5DB5, 0xE963, 0x5DB0, 0xE964, 0x5DAE, 0xE965, 0x5DAA, + 0xE966, 0x5DA8, 0xE967, 0x5DB2, 0xE968, 0x5DAD, 0xE969, 0x5DAF, + 0xE96A, 0x5DB4, 0xE96B, 0x5E67, 0xE96C, 0x5E68, 0xE96D, 0x5E66, + 0xE96E, 0x5E6F, 0xE96F, 0x5EE9, 0xE970, 0x5EE7, 0xE971, 0x5EE6, + 0xE972, 0x5EE8, 0xE973, 0x5EE5, 0xE974, 0x5F4B, 0xE975, 0x5FBC, + 0xE976, 0x619D, 0xE977, 0x61A8, 0xE978, 0x6196, 0xE979, 0x61C5, + 0xE97A, 0x61B4, 0xE97B, 0x61C6, 0xE97C, 0x61C1, 0xE97D, 0x61CC, + 0xE97E, 0x61BA, 0xE9A1, 0x61BF, 0xE9A2, 0x61B8, 0xE9A3, 0x618C, + 0xE9A4, 0x64D7, 0xE9A5, 0x64D6, 0xE9A6, 0x64D0, 0xE9A7, 0x64CF, + 0xE9A8, 0x64C9, 0xE9A9, 0x64BD, 0xE9AA, 0x6489, 0xE9AB, 0x64C3, + 0xE9AC, 0x64DB, 0xE9AD, 0x64F3, 0xE9AE, 0x64D9, 0xE9AF, 0x6533, + 0xE9B0, 0x657F, 0xE9B1, 0x657C, 0xE9B2, 0x65A2, 0xE9B3, 0x66C8, + 0xE9B4, 0x66BE, 0xE9B5, 0x66C0, 0xE9B6, 0x66CA, 0xE9B7, 0x66CB, + 0xE9B8, 0x66CF, 0xE9B9, 0x66BD, 0xE9BA, 0x66BB, 0xE9BB, 0x66BA, + 0xE9BC, 0x66CC, 0xE9BD, 0x6723, 0xE9BE, 0x6A34, 0xE9BF, 0x6A66, + 0xE9C0, 0x6A49, 0xE9C1, 0x6A67, 0xE9C2, 0x6A32, 0xE9C3, 0x6A68, + 0xE9C4, 0x6A3E, 0xE9C5, 0x6A5D, 0xE9C6, 0x6A6D, 0xE9C7, 0x6A76, + 0xE9C8, 0x6A5B, 0xE9C9, 0x6A51, 0xE9CA, 0x6A28, 0xE9CB, 0x6A5A, + 0xE9CC, 0x6A3B, 0xE9CD, 0x6A3F, 0xE9CE, 0x6A41, 0xE9CF, 0x6A6A, + 0xE9D0, 0x6A64, 0xE9D1, 0x6A50, 0xE9D2, 0x6A4F, 0xE9D3, 0x6A54, + 0xE9D4, 0x6A6F, 0xE9D5, 0x6A69, 0xE9D6, 0x6A60, 0xE9D7, 0x6A3C, + 0xE9D8, 0x6A5E, 0xE9D9, 0x6A56, 0xE9DA, 0x6A55, 0xE9DB, 0x6A4D, + 0xE9DC, 0x6A4E, 0xE9DD, 0x6A46, 0xE9DE, 0x6B55, 0xE9DF, 0x6B54, + 0xE9E0, 0x6B56, 0xE9E1, 0x6BA7, 0xE9E2, 0x6BAA, 0xE9E3, 0x6BAB, + 0xE9E4, 0x6BC8, 0xE9E5, 0x6BC7, 0xE9E6, 0x6C04, 0xE9E7, 0x6C03, + 0xE9E8, 0x6C06, 0xE9E9, 0x6FAD, 0xE9EA, 0x6FCB, 0xE9EB, 0x6FA3, + 0xE9EC, 0x6FC7, 0xE9ED, 0x6FBC, 0xE9EE, 0x6FCE, 0xE9EF, 0x6FC8, + 0xE9F0, 0x6F5E, 0xE9F1, 0x6FC4, 0xE9F2, 0x6FBD, 0xE9F3, 0x6F9E, + 0xE9F4, 0x6FCA, 0xE9F5, 0x6FA8, 0xE9F6, 0x7004, 0xE9F7, 0x6FA5, + 0xE9F8, 0x6FAE, 0xE9F9, 0x6FBA, 0xE9FA, 0x6FAC, 0xE9FB, 0x6FAA, + 0xE9FC, 0x6FCF, 0xE9FD, 0x6FBF, 0xE9FE, 0x6FB8, 0xEA40, 0x6FA2, + 0xEA41, 0x6FC9, 0xEA42, 0x6FAB, 0xEA43, 0x6FCD, 0xEA44, 0x6FAF, + 0xEA45, 0x6FB2, 0xEA46, 0x6FB0, 0xEA47, 0x71C5, 0xEA48, 0x71C2, + 0xEA49, 0x71BF, 0xEA4A, 0x71B8, 0xEA4B, 0x71D6, 0xEA4C, 0x71C0, + 0xEA4D, 0x71C1, 0xEA4E, 0x71CB, 0xEA4F, 0x71D4, 0xEA50, 0x71CA, + 0xEA51, 0x71C7, 0xEA52, 0x71CF, 0xEA53, 0x71BD, 0xEA54, 0x71D8, + 0xEA55, 0x71BC, 0xEA56, 0x71C6, 0xEA57, 0x71DA, 0xEA58, 0x71DB, + 0xEA59, 0x729D, 0xEA5A, 0x729E, 0xEA5B, 0x7369, 0xEA5C, 0x7366, + 0xEA5D, 0x7367, 0xEA5E, 0x736C, 0xEA5F, 0x7365, 0xEA60, 0x736B, + 0xEA61, 0x736A, 0xEA62, 0x747F, 0xEA63, 0x749A, 0xEA64, 0x74A0, + 0xEA65, 0x7494, 0xEA66, 0x7492, 0xEA67, 0x7495, 0xEA68, 0x74A1, + 0xEA69, 0x750B, 0xEA6A, 0x7580, 0xEA6B, 0x762F, 0xEA6C, 0x762D, + 0xEA6D, 0x7631, 0xEA6E, 0x763D, 0xEA6F, 0x7633, 0xEA70, 0x763C, + 0xEA71, 0x7635, 0xEA72, 0x7632, 0xEA73, 0x7630, 0xEA74, 0x76BB, + 0xEA75, 0x76E6, 0xEA76, 0x779A, 0xEA77, 0x779D, 0xEA78, 0x77A1, + 0xEA79, 0x779C, 0xEA7A, 0x779B, 0xEA7B, 0x77A2, 0xEA7C, 0x77A3, + 0xEA7D, 0x7795, 0xEA7E, 0x7799, 0xEAA1, 0x7797, 0xEAA2, 0x78DD, + 0xEAA3, 0x78E9, 0xEAA4, 0x78E5, 0xEAA5, 0x78EA, 0xEAA6, 0x78DE, + 0xEAA7, 0x78E3, 0xEAA8, 0x78DB, 0xEAA9, 0x78E1, 0xEAAA, 0x78E2, + 0xEAAB, 0x78ED, 0xEAAC, 0x78DF, 0xEAAD, 0x78E0, 0xEAAE, 0x79A4, + 0xEAAF, 0x7A44, 0xEAB0, 0x7A48, 0xEAB1, 0x7A47, 0xEAB2, 0x7AB6, + 0xEAB3, 0x7AB8, 0xEAB4, 0x7AB5, 0xEAB5, 0x7AB1, 0xEAB6, 0x7AB7, + 0xEAB7, 0x7BDE, 0xEAB8, 0x7BE3, 0xEAB9, 0x7BE7, 0xEABA, 0x7BDD, + 0xEABB, 0x7BD5, 0xEABC, 0x7BE5, 0xEABD, 0x7BDA, 0xEABE, 0x7BE8, + 0xEABF, 0x7BF9, 0xEAC0, 0x7BD4, 0xEAC1, 0x7BEA, 0xEAC2, 0x7BE2, + 0xEAC3, 0x7BDC, 0xEAC4, 0x7BEB, 0xEAC5, 0x7BD8, 0xEAC6, 0x7BDF, + 0xEAC7, 0x7CD2, 0xEAC8, 0x7CD4, 0xEAC9, 0x7CD7, 0xEACA, 0x7CD0, + 0xEACB, 0x7CD1, 0xEACC, 0x7E12, 0xEACD, 0x7E21, 0xEACE, 0x7E17, + 0xEACF, 0x7E0C, 0xEAD0, 0x7E1F, 0xEAD1, 0x7E20, 0xEAD2, 0x7E13, + 0xEAD3, 0x7E0E, 0xEAD4, 0x7E1C, 0xEAD5, 0x7E15, 0xEAD6, 0x7E1A, + 0xEAD7, 0x7E22, 0xEAD8, 0x7E0B, 0xEAD9, 0x7E0F, 0xEADA, 0x7E16, + 0xEADB, 0x7E0D, 0xEADC, 0x7E14, 0xEADD, 0x7E25, 0xEADE, 0x7E24, + 0xEADF, 0x7F43, 0xEAE0, 0x7F7B, 0xEAE1, 0x7F7C, 0xEAE2, 0x7F7A, + 0xEAE3, 0x7FB1, 0xEAE4, 0x7FEF, 0xEAE5, 0x802A, 0xEAE6, 0x8029, + 0xEAE7, 0x806C, 0xEAE8, 0x81B1, 0xEAE9, 0x81A6, 0xEAEA, 0x81AE, + 0xEAEB, 0x81B9, 0xEAEC, 0x81B5, 0xEAED, 0x81AB, 0xEAEE, 0x81B0, + 0xEAEF, 0x81AC, 0xEAF0, 0x81B4, 0xEAF1, 0x81B2, 0xEAF2, 0x81B7, + 0xEAF3, 0x81A7, 0xEAF4, 0x81F2, 0xEAF5, 0x8255, 0xEAF6, 0x8256, + 0xEAF7, 0x8257, 0xEAF8, 0x8556, 0xEAF9, 0x8545, 0xEAFA, 0x856B, + 0xEAFB, 0x854D, 0xEAFC, 0x8553, 0xEAFD, 0x8561, 0xEAFE, 0x8558, + 0xEB40, 0x8540, 0xEB41, 0x8546, 0xEB42, 0x8564, 0xEB43, 0x8541, + 0xEB44, 0x8562, 0xEB45, 0x8544, 0xEB46, 0x8551, 0xEB47, 0x8547, + 0xEB48, 0x8563, 0xEB49, 0x853E, 0xEB4A, 0x855B, 0xEB4B, 0x8571, + 0xEB4C, 0x854E, 0xEB4D, 0x856E, 0xEB4E, 0x8575, 0xEB4F, 0x8555, + 0xEB50, 0x8567, 0xEB51, 0x8560, 0xEB52, 0x858C, 0xEB53, 0x8566, + 0xEB54, 0x855D, 0xEB55, 0x8554, 0xEB56, 0x8565, 0xEB57, 0x856C, + 0xEB58, 0x8663, 0xEB59, 0x8665, 0xEB5A, 0x8664, 0xEB5B, 0x879B, + 0xEB5C, 0x878F, 0xEB5D, 0x8797, 0xEB5E, 0x8793, 0xEB5F, 0x8792, + 0xEB60, 0x8788, 0xEB61, 0x8781, 0xEB62, 0x8796, 0xEB63, 0x8798, + 0xEB64, 0x8779, 0xEB65, 0x8787, 0xEB66, 0x87A3, 0xEB67, 0x8785, + 0xEB68, 0x8790, 0xEB69, 0x8791, 0xEB6A, 0x879D, 0xEB6B, 0x8784, + 0xEB6C, 0x8794, 0xEB6D, 0x879C, 0xEB6E, 0x879A, 0xEB6F, 0x8789, + 0xEB70, 0x891E, 0xEB71, 0x8926, 0xEB72, 0x8930, 0xEB73, 0x892D, + 0xEB74, 0x892E, 0xEB75, 0x8927, 0xEB76, 0x8931, 0xEB77, 0x8922, + 0xEB78, 0x8929, 0xEB79, 0x8923, 0xEB7A, 0x892F, 0xEB7B, 0x892C, + 0xEB7C, 0x891F, 0xEB7D, 0x89F1, 0xEB7E, 0x8AE0, 0xEBA1, 0x8AE2, + 0xEBA2, 0x8AF2, 0xEBA3, 0x8AF4, 0xEBA4, 0x8AF5, 0xEBA5, 0x8ADD, + 0xEBA6, 0x8B14, 0xEBA7, 0x8AE4, 0xEBA8, 0x8ADF, 0xEBA9, 0x8AF0, + 0xEBAA, 0x8AC8, 0xEBAB, 0x8ADE, 0xEBAC, 0x8AE1, 0xEBAD, 0x8AE8, + 0xEBAE, 0x8AFF, 0xEBAF, 0x8AEF, 0xEBB0, 0x8AFB, 0xEBB1, 0x8C91, + 0xEBB2, 0x8C92, 0xEBB3, 0x8C90, 0xEBB4, 0x8CF5, 0xEBB5, 0x8CEE, + 0xEBB6, 0x8CF1, 0xEBB7, 0x8CF0, 0xEBB8, 0x8CF3, 0xEBB9, 0x8D6C, + 0xEBBA, 0x8D6E, 0xEBBB, 0x8DA5, 0xEBBC, 0x8DA7, 0xEBBD, 0x8E33, + 0xEBBE, 0x8E3E, 0xEBBF, 0x8E38, 0xEBC0, 0x8E40, 0xEBC1, 0x8E45, + 0xEBC2, 0x8E36, 0xEBC3, 0x8E3C, 0xEBC4, 0x8E3D, 0xEBC5, 0x8E41, + 0xEBC6, 0x8E30, 0xEBC7, 0x8E3F, 0xEBC8, 0x8EBD, 0xEBC9, 0x8F36, + 0xEBCA, 0x8F2E, 0xEBCB, 0x8F35, 0xEBCC, 0x8F32, 0xEBCD, 0x8F39, + 0xEBCE, 0x8F37, 0xEBCF, 0x8F34, 0xEBD0, 0x9076, 0xEBD1, 0x9079, + 0xEBD2, 0x907B, 0xEBD3, 0x9086, 0xEBD4, 0x90FA, 0xEBD5, 0x9133, + 0xEBD6, 0x9135, 0xEBD7, 0x9136, 0xEBD8, 0x9193, 0xEBD9, 0x9190, + 0xEBDA, 0x9191, 0xEBDB, 0x918D, 0xEBDC, 0x918F, 0xEBDD, 0x9327, + 0xEBDE, 0x931E, 0xEBDF, 0x9308, 0xEBE0, 0x931F, 0xEBE1, 0x9306, + 0xEBE2, 0x930F, 0xEBE3, 0x937A, 0xEBE4, 0x9338, 0xEBE5, 0x933C, + 0xEBE6, 0x931B, 0xEBE7, 0x9323, 0xEBE8, 0x9312, 0xEBE9, 0x9301, + 0xEBEA, 0x9346, 0xEBEB, 0x932D, 0xEBEC, 0x930E, 0xEBED, 0x930D, + 0xEBEE, 0x92CB, 0xEBEF, 0x931D, 0xEBF0, 0x92FA, 0xEBF1, 0x9325, + 0xEBF2, 0x9313, 0xEBF3, 0x92F9, 0xEBF4, 0x92F7, 0xEBF5, 0x9334, + 0xEBF6, 0x9302, 0xEBF7, 0x9324, 0xEBF8, 0x92FF, 0xEBF9, 0x9329, + 0xEBFA, 0x9339, 0xEBFB, 0x9335, 0xEBFC, 0x932A, 0xEBFD, 0x9314, + 0xEBFE, 0x930C, 0xEC40, 0x930B, 0xEC41, 0x92FE, 0xEC42, 0x9309, + 0xEC43, 0x9300, 0xEC44, 0x92FB, 0xEC45, 0x9316, 0xEC46, 0x95BC, + 0xEC47, 0x95CD, 0xEC48, 0x95BE, 0xEC49, 0x95B9, 0xEC4A, 0x95BA, + 0xEC4B, 0x95B6, 0xEC4C, 0x95BF, 0xEC4D, 0x95B5, 0xEC4E, 0x95BD, + 0xEC4F, 0x96A9, 0xEC50, 0x96D4, 0xEC51, 0x970B, 0xEC52, 0x9712, + 0xEC53, 0x9710, 0xEC54, 0x9799, 0xEC55, 0x9797, 0xEC56, 0x9794, + 0xEC57, 0x97F0, 0xEC58, 0x97F8, 0xEC59, 0x9835, 0xEC5A, 0x982F, + 0xEC5B, 0x9832, 0xEC5C, 0x9924, 0xEC5D, 0x991F, 0xEC5E, 0x9927, + 0xEC5F, 0x9929, 0xEC60, 0x999E, 0xEC61, 0x99EE, 0xEC62, 0x99EC, + 0xEC63, 0x99E5, 0xEC64, 0x99E4, 0xEC65, 0x99F0, 0xEC66, 0x99E3, + 0xEC67, 0x99EA, 0xEC68, 0x99E9, 0xEC69, 0x99E7, 0xEC6A, 0x9AB9, + 0xEC6B, 0x9ABF, 0xEC6C, 0x9AB4, 0xEC6D, 0x9ABB, 0xEC6E, 0x9AF6, + 0xEC6F, 0x9AFA, 0xEC70, 0x9AF9, 0xEC71, 0x9AF7, 0xEC72, 0x9B33, + 0xEC73, 0x9B80, 0xEC74, 0x9B85, 0xEC75, 0x9B87, 0xEC76, 0x9B7C, + 0xEC77, 0x9B7E, 0xEC78, 0x9B7B, 0xEC79, 0x9B82, 0xEC7A, 0x9B93, + 0xEC7B, 0x9B92, 0xEC7C, 0x9B90, 0xEC7D, 0x9B7A, 0xEC7E, 0x9B95, + 0xECA1, 0x9B7D, 0xECA2, 0x9B88, 0xECA3, 0x9D25, 0xECA4, 0x9D17, + 0xECA5, 0x9D20, 0xECA6, 0x9D1E, 0xECA7, 0x9D14, 0xECA8, 0x9D29, + 0xECA9, 0x9D1D, 0xECAA, 0x9D18, 0xECAB, 0x9D22, 0xECAC, 0x9D10, + 0xECAD, 0x9D19, 0xECAE, 0x9D1F, 0xECAF, 0x9E88, 0xECB0, 0x9E86, + 0xECB1, 0x9E87, 0xECB2, 0x9EAE, 0xECB3, 0x9EAD, 0xECB4, 0x9ED5, + 0xECB5, 0x9ED6, 0xECB6, 0x9EFA, 0xECB7, 0x9F12, 0xECB8, 0x9F3D, + 0xECB9, 0x5126, 0xECBA, 0x5125, 0xECBB, 0x5122, 0xECBC, 0x5124, + 0xECBD, 0x5120, 0xECBE, 0x5129, 0xECBF, 0x52F4, 0xECC0, 0x5693, + 0xECC1, 0x568C, 0xECC2, 0x568D, 0xECC3, 0x5686, 0xECC4, 0x5684, + 0xECC5, 0x5683, 0xECC6, 0x567E, 0xECC7, 0x5682, 0xECC8, 0x567F, + 0xECC9, 0x5681, 0xECCA, 0x58D6, 0xECCB, 0x58D4, 0xECCC, 0x58CF, + 0xECCD, 0x58D2, 0xECCE, 0x5B2D, 0xECCF, 0x5B25, 0xECD0, 0x5B32, + 0xECD1, 0x5B23, 0xECD2, 0x5B2C, 0xECD3, 0x5B27, 0xECD4, 0x5B26, + 0xECD5, 0x5B2F, 0xECD6, 0x5B2E, 0xECD7, 0x5B7B, 0xECD8, 0x5BF1, + 0xECD9, 0x5BF2, 0xECDA, 0x5DB7, 0xECDB, 0x5E6C, 0xECDC, 0x5E6A, + 0xECDD, 0x5FBE, 0xECDE, 0x5FBB, 0xECDF, 0x61C3, 0xECE0, 0x61B5, + 0xECE1, 0x61BC, 0xECE2, 0x61E7, 0xECE3, 0x61E0, 0xECE4, 0x61E5, + 0xECE5, 0x61E4, 0xECE6, 0x61E8, 0xECE7, 0x61DE, 0xECE8, 0x64EF, + 0xECE9, 0x64E9, 0xECEA, 0x64E3, 0xECEB, 0x64EB, 0xECEC, 0x64E4, + 0xECED, 0x64E8, 0xECEE, 0x6581, 0xECEF, 0x6580, 0xECF0, 0x65B6, + 0xECF1, 0x65DA, 0xECF2, 0x66D2, 0xECF3, 0x6A8D, 0xECF4, 0x6A96, + 0xECF5, 0x6A81, 0xECF6, 0x6AA5, 0xECF7, 0x6A89, 0xECF8, 0x6A9F, + 0xECF9, 0x6A9B, 0xECFA, 0x6AA1, 0xECFB, 0x6A9E, 0xECFC, 0x6A87, + 0xECFD, 0x6A93, 0xECFE, 0x6A8E, 0xED40, 0x6A95, 0xED41, 0x6A83, + 0xED42, 0x6AA8, 0xED43, 0x6AA4, 0xED44, 0x6A91, 0xED45, 0x6A7F, + 0xED46, 0x6AA6, 0xED47, 0x6A9A, 0xED48, 0x6A85, 0xED49, 0x6A8C, + 0xED4A, 0x6A92, 0xED4B, 0x6B5B, 0xED4C, 0x6BAD, 0xED4D, 0x6C09, + 0xED4E, 0x6FCC, 0xED4F, 0x6FA9, 0xED50, 0x6FF4, 0xED51, 0x6FD4, + 0xED52, 0x6FE3, 0xED53, 0x6FDC, 0xED54, 0x6FED, 0xED55, 0x6FE7, + 0xED56, 0x6FE6, 0xED57, 0x6FDE, 0xED58, 0x6FF2, 0xED59, 0x6FDD, + 0xED5A, 0x6FE2, 0xED5B, 0x6FE8, 0xED5C, 0x71E1, 0xED5D, 0x71F1, + 0xED5E, 0x71E8, 0xED5F, 0x71F2, 0xED60, 0x71E4, 0xED61, 0x71F0, + 0xED62, 0x71E2, 0xED63, 0x7373, 0xED64, 0x736E, 0xED65, 0x736F, + 0xED66, 0x7497, 0xED67, 0x74B2, 0xED68, 0x74AB, 0xED69, 0x7490, + 0xED6A, 0x74AA, 0xED6B, 0x74AD, 0xED6C, 0x74B1, 0xED6D, 0x74A5, + 0xED6E, 0x74AF, 0xED6F, 0x7510, 0xED70, 0x7511, 0xED71, 0x7512, + 0xED72, 0x750F, 0xED73, 0x7584, 0xED74, 0x7643, 0xED75, 0x7648, + 0xED76, 0x7649, 0xED77, 0x7647, 0xED78, 0x76A4, 0xED79, 0x76E9, + 0xED7A, 0x77B5, 0xED7B, 0x77AB, 0xED7C, 0x77B2, 0xED7D, 0x77B7, + 0xED7E, 0x77B6, 0xEDA1, 0x77B4, 0xEDA2, 0x77B1, 0xEDA3, 0x77A8, + 0xEDA4, 0x77F0, 0xEDA5, 0x78F3, 0xEDA6, 0x78FD, 0xEDA7, 0x7902, + 0xEDA8, 0x78FB, 0xEDA9, 0x78FC, 0xEDAA, 0x78F2, 0xEDAB, 0x7905, + 0xEDAC, 0x78F9, 0xEDAD, 0x78FE, 0xEDAE, 0x7904, 0xEDAF, 0x79AB, + 0xEDB0, 0x79A8, 0xEDB1, 0x7A5C, 0xEDB2, 0x7A5B, 0xEDB3, 0x7A56, + 0xEDB4, 0x7A58, 0xEDB5, 0x7A54, 0xEDB6, 0x7A5A, 0xEDB7, 0x7ABE, + 0xEDB8, 0x7AC0, 0xEDB9, 0x7AC1, 0xEDBA, 0x7C05, 0xEDBB, 0x7C0F, + 0xEDBC, 0x7BF2, 0xEDBD, 0x7C00, 0xEDBE, 0x7BFF, 0xEDBF, 0x7BFB, + 0xEDC0, 0x7C0E, 0xEDC1, 0x7BF4, 0xEDC2, 0x7C0B, 0xEDC3, 0x7BF3, + 0xEDC4, 0x7C02, 0xEDC5, 0x7C09, 0xEDC6, 0x7C03, 0xEDC7, 0x7C01, + 0xEDC8, 0x7BF8, 0xEDC9, 0x7BFD, 0xEDCA, 0x7C06, 0xEDCB, 0x7BF0, + 0xEDCC, 0x7BF1, 0xEDCD, 0x7C10, 0xEDCE, 0x7C0A, 0xEDCF, 0x7CE8, + 0xEDD0, 0x7E2D, 0xEDD1, 0x7E3C, 0xEDD2, 0x7E42, 0xEDD3, 0x7E33, + 0xEDD4, 0x9848, 0xEDD5, 0x7E38, 0xEDD6, 0x7E2A, 0xEDD7, 0x7E49, + 0xEDD8, 0x7E40, 0xEDD9, 0x7E47, 0xEDDA, 0x7E29, 0xEDDB, 0x7E4C, + 0xEDDC, 0x7E30, 0xEDDD, 0x7E3B, 0xEDDE, 0x7E36, 0xEDDF, 0x7E44, + 0xEDE0, 0x7E3A, 0xEDE1, 0x7F45, 0xEDE2, 0x7F7F, 0xEDE3, 0x7F7E, + 0xEDE4, 0x7F7D, 0xEDE5, 0x7FF4, 0xEDE6, 0x7FF2, 0xEDE7, 0x802C, + 0xEDE8, 0x81BB, 0xEDE9, 0x81C4, 0xEDEA, 0x81CC, 0xEDEB, 0x81CA, + 0xEDEC, 0x81C5, 0xEDED, 0x81C7, 0xEDEE, 0x81BC, 0xEDEF, 0x81E9, + 0xEDF0, 0x825B, 0xEDF1, 0x825A, 0xEDF2, 0x825C, 0xEDF3, 0x8583, + 0xEDF4, 0x8580, 0xEDF5, 0x858F, 0xEDF6, 0x85A7, 0xEDF7, 0x8595, + 0xEDF8, 0x85A0, 0xEDF9, 0x858B, 0xEDFA, 0x85A3, 0xEDFB, 0x857B, + 0xEDFC, 0x85A4, 0xEDFD, 0x859A, 0xEDFE, 0x859E, 0xEE40, 0x8577, + 0xEE41, 0x857C, 0xEE42, 0x8589, 0xEE43, 0x85A1, 0xEE44, 0x857A, + 0xEE45, 0x8578, 0xEE46, 0x8557, 0xEE47, 0x858E, 0xEE48, 0x8596, + 0xEE49, 0x8586, 0xEE4A, 0x858D, 0xEE4B, 0x8599, 0xEE4C, 0x859D, + 0xEE4D, 0x8581, 0xEE4E, 0x85A2, 0xEE4F, 0x8582, 0xEE50, 0x8588, + 0xEE51, 0x8585, 0xEE52, 0x8579, 0xEE53, 0x8576, 0xEE54, 0x8598, + 0xEE55, 0x8590, 0xEE56, 0x859F, 0xEE57, 0x8668, 0xEE58, 0x87BE, + 0xEE59, 0x87AA, 0xEE5A, 0x87AD, 0xEE5B, 0x87C5, 0xEE5C, 0x87B0, + 0xEE5D, 0x87AC, 0xEE5E, 0x87B9, 0xEE5F, 0x87B5, 0xEE60, 0x87BC, + 0xEE61, 0x87AE, 0xEE62, 0x87C9, 0xEE63, 0x87C3, 0xEE64, 0x87C2, + 0xEE65, 0x87CC, 0xEE66, 0x87B7, 0xEE67, 0x87AF, 0xEE68, 0x87C4, + 0xEE69, 0x87CA, 0xEE6A, 0x87B4, 0xEE6B, 0x87B6, 0xEE6C, 0x87BF, + 0xEE6D, 0x87B8, 0xEE6E, 0x87BD, 0xEE6F, 0x87DE, 0xEE70, 0x87B2, + 0xEE71, 0x8935, 0xEE72, 0x8933, 0xEE73, 0x893C, 0xEE74, 0x893E, + 0xEE75, 0x8941, 0xEE76, 0x8952, 0xEE77, 0x8937, 0xEE78, 0x8942, + 0xEE79, 0x89AD, 0xEE7A, 0x89AF, 0xEE7B, 0x89AE, 0xEE7C, 0x89F2, + 0xEE7D, 0x89F3, 0xEE7E, 0x8B1E, 0xEEA1, 0x8B18, 0xEEA2, 0x8B16, + 0xEEA3, 0x8B11, 0xEEA4, 0x8B05, 0xEEA5, 0x8B0B, 0xEEA6, 0x8B22, + 0xEEA7, 0x8B0F, 0xEEA8, 0x8B12, 0xEEA9, 0x8B15, 0xEEAA, 0x8B07, + 0xEEAB, 0x8B0D, 0xEEAC, 0x8B08, 0xEEAD, 0x8B06, 0xEEAE, 0x8B1C, + 0xEEAF, 0x8B13, 0xEEB0, 0x8B1A, 0xEEB1, 0x8C4F, 0xEEB2, 0x8C70, + 0xEEB3, 0x8C72, 0xEEB4, 0x8C71, 0xEEB5, 0x8C6F, 0xEEB6, 0x8C95, + 0xEEB7, 0x8C94, 0xEEB8, 0x8CF9, 0xEEB9, 0x8D6F, 0xEEBA, 0x8E4E, + 0xEEBB, 0x8E4D, 0xEEBC, 0x8E53, 0xEEBD, 0x8E50, 0xEEBE, 0x8E4C, + 0xEEBF, 0x8E47, 0xEEC0, 0x8F43, 0xEEC1, 0x8F40, 0xEEC2, 0x9085, + 0xEEC3, 0x907E, 0xEEC4, 0x9138, 0xEEC5, 0x919A, 0xEEC6, 0x91A2, + 0xEEC7, 0x919B, 0xEEC8, 0x9199, 0xEEC9, 0x919F, 0xEECA, 0x91A1, + 0xEECB, 0x919D, 0xEECC, 0x91A0, 0xEECD, 0x93A1, 0xEECE, 0x9383, + 0xEECF, 0x93AF, 0xEED0, 0x9364, 0xEED1, 0x9356, 0xEED2, 0x9347, + 0xEED3, 0x937C, 0xEED4, 0x9358, 0xEED5, 0x935C, 0xEED6, 0x9376, + 0xEED7, 0x9349, 0xEED8, 0x9350, 0xEED9, 0x9351, 0xEEDA, 0x9360, + 0xEEDB, 0x936D, 0xEEDC, 0x938F, 0xEEDD, 0x934C, 0xEEDE, 0x936A, + 0xEEDF, 0x9379, 0xEEE0, 0x9357, 0xEEE1, 0x9355, 0xEEE2, 0x9352, + 0xEEE3, 0x934F, 0xEEE4, 0x9371, 0xEEE5, 0x9377, 0xEEE6, 0x937B, + 0xEEE7, 0x9361, 0xEEE8, 0x935E, 0xEEE9, 0x9363, 0xEEEA, 0x9367, + 0xEEEB, 0x9380, 0xEEEC, 0x934E, 0xEEED, 0x9359, 0xEEEE, 0x95C7, + 0xEEEF, 0x95C0, 0xEEF0, 0x95C9, 0xEEF1, 0x95C3, 0xEEF2, 0x95C5, + 0xEEF3, 0x95B7, 0xEEF4, 0x96AE, 0xEEF5, 0x96B0, 0xEEF6, 0x96AC, + 0xEEF7, 0x9720, 0xEEF8, 0x971F, 0xEEF9, 0x9718, 0xEEFA, 0x971D, + 0xEEFB, 0x9719, 0xEEFC, 0x979A, 0xEEFD, 0x97A1, 0xEEFE, 0x979C, + 0xEF40, 0x979E, 0xEF41, 0x979D, 0xEF42, 0x97D5, 0xEF43, 0x97D4, + 0xEF44, 0x97F1, 0xEF45, 0x9841, 0xEF46, 0x9844, 0xEF47, 0x984A, + 0xEF48, 0x9849, 0xEF49, 0x9845, 0xEF4A, 0x9843, 0xEF4B, 0x9925, + 0xEF4C, 0x992B, 0xEF4D, 0x992C, 0xEF4E, 0x992A, 0xEF4F, 0x9933, + 0xEF50, 0x9932, 0xEF51, 0x992F, 0xEF52, 0x992D, 0xEF53, 0x9931, + 0xEF54, 0x9930, 0xEF55, 0x9998, 0xEF56, 0x99A3, 0xEF57, 0x99A1, + 0xEF58, 0x9A02, 0xEF59, 0x99FA, 0xEF5A, 0x99F4, 0xEF5B, 0x99F7, + 0xEF5C, 0x99F9, 0xEF5D, 0x99F8, 0xEF5E, 0x99F6, 0xEF5F, 0x99FB, + 0xEF60, 0x99FD, 0xEF61, 0x99FE, 0xEF62, 0x99FC, 0xEF63, 0x9A03, + 0xEF64, 0x9ABE, 0xEF65, 0x9AFE, 0xEF66, 0x9AFD, 0xEF67, 0x9B01, + 0xEF68, 0x9AFC, 0xEF69, 0x9B48, 0xEF6A, 0x9B9A, 0xEF6B, 0x9BA8, + 0xEF6C, 0x9B9E, 0xEF6D, 0x9B9B, 0xEF6E, 0x9BA6, 0xEF6F, 0x9BA1, + 0xEF70, 0x9BA5, 0xEF71, 0x9BA4, 0xEF72, 0x9B86, 0xEF73, 0x9BA2, + 0xEF74, 0x9BA0, 0xEF75, 0x9BAF, 0xEF76, 0x9D33, 0xEF77, 0x9D41, + 0xEF78, 0x9D67, 0xEF79, 0x9D36, 0xEF7A, 0x9D2E, 0xEF7B, 0x9D2F, + 0xEF7C, 0x9D31, 0xEF7D, 0x9D38, 0xEF7E, 0x9D30, 0xEFA1, 0x9D45, + 0xEFA2, 0x9D42, 0xEFA3, 0x9D43, 0xEFA4, 0x9D3E, 0xEFA5, 0x9D37, + 0xEFA6, 0x9D40, 0xEFA7, 0x9D3D, 0xEFA8, 0x7FF5, 0xEFA9, 0x9D2D, + 0xEFAA, 0x9E8A, 0xEFAB, 0x9E89, 0xEFAC, 0x9E8D, 0xEFAD, 0x9EB0, + 0xEFAE, 0x9EC8, 0xEFAF, 0x9EDA, 0xEFB0, 0x9EFB, 0xEFB1, 0x9EFF, + 0xEFB2, 0x9F24, 0xEFB3, 0x9F23, 0xEFB4, 0x9F22, 0xEFB5, 0x9F54, + 0xEFB6, 0x9FA0, 0xEFB7, 0x5131, 0xEFB8, 0x512D, 0xEFB9, 0x512E, + 0xEFBA, 0x5698, 0xEFBB, 0x569C, 0xEFBC, 0x5697, 0xEFBD, 0x569A, + 0xEFBE, 0x569D, 0xEFBF, 0x5699, 0xEFC0, 0x5970, 0xEFC1, 0x5B3C, + 0xEFC2, 0x5C69, 0xEFC3, 0x5C6A, 0xEFC4, 0x5DC0, 0xEFC5, 0x5E6D, + 0xEFC6, 0x5E6E, 0xEFC7, 0x61D8, 0xEFC8, 0x61DF, 0xEFC9, 0x61ED, + 0xEFCA, 0x61EE, 0xEFCB, 0x61F1, 0xEFCC, 0x61EA, 0xEFCD, 0x61F0, + 0xEFCE, 0x61EB, 0xEFCF, 0x61D6, 0xEFD0, 0x61E9, 0xEFD1, 0x64FF, + 0xEFD2, 0x6504, 0xEFD3, 0x64FD, 0xEFD4, 0x64F8, 0xEFD5, 0x6501, + 0xEFD6, 0x6503, 0xEFD7, 0x64FC, 0xEFD8, 0x6594, 0xEFD9, 0x65DB, + 0xEFDA, 0x66DA, 0xEFDB, 0x66DB, 0xEFDC, 0x66D8, 0xEFDD, 0x6AC5, + 0xEFDE, 0x6AB9, 0xEFDF, 0x6ABD, 0xEFE0, 0x6AE1, 0xEFE1, 0x6AC6, + 0xEFE2, 0x6ABA, 0xEFE3, 0x6AB6, 0xEFE4, 0x6AB7, 0xEFE5, 0x6AC7, + 0xEFE6, 0x6AB4, 0xEFE7, 0x6AAD, 0xEFE8, 0x6B5E, 0xEFE9, 0x6BC9, + 0xEFEA, 0x6C0B, 0xEFEB, 0x7007, 0xEFEC, 0x700C, 0xEFED, 0x700D, + 0xEFEE, 0x7001, 0xEFEF, 0x7005, 0xEFF0, 0x7014, 0xEFF1, 0x700E, + 0xEFF2, 0x6FFF, 0xEFF3, 0x7000, 0xEFF4, 0x6FFB, 0xEFF5, 0x7026, + 0xEFF6, 0x6FFC, 0xEFF7, 0x6FF7, 0xEFF8, 0x700A, 0xEFF9, 0x7201, + 0xEFFA, 0x71FF, 0xEFFB, 0x71F9, 0xEFFC, 0x7203, 0xEFFD, 0x71FD, + 0xEFFE, 0x7376, 0xF040, 0x74B8, 0xF041, 0x74C0, 0xF042, 0x74B5, + 0xF043, 0x74C1, 0xF044, 0x74BE, 0xF045, 0x74B6, 0xF046, 0x74BB, + 0xF047, 0x74C2, 0xF048, 0x7514, 0xF049, 0x7513, 0xF04A, 0x765C, + 0xF04B, 0x7664, 0xF04C, 0x7659, 0xF04D, 0x7650, 0xF04E, 0x7653, + 0xF04F, 0x7657, 0xF050, 0x765A, 0xF051, 0x76A6, 0xF052, 0x76BD, + 0xF053, 0x76EC, 0xF054, 0x77C2, 0xF055, 0x77BA, 0xF056, 0x78FF, + 0xF057, 0x790C, 0xF058, 0x7913, 0xF059, 0x7914, 0xF05A, 0x7909, + 0xF05B, 0x7910, 0xF05C, 0x7912, 0xF05D, 0x7911, 0xF05E, 0x79AD, + 0xF05F, 0x79AC, 0xF060, 0x7A5F, 0xF061, 0x7C1C, 0xF062, 0x7C29, + 0xF063, 0x7C19, 0xF064, 0x7C20, 0xF065, 0x7C1F, 0xF066, 0x7C2D, + 0xF067, 0x7C1D, 0xF068, 0x7C26, 0xF069, 0x7C28, 0xF06A, 0x7C22, + 0xF06B, 0x7C25, 0xF06C, 0x7C30, 0xF06D, 0x7E5C, 0xF06E, 0x7E50, + 0xF06F, 0x7E56, 0xF070, 0x7E63, 0xF071, 0x7E58, 0xF072, 0x7E62, + 0xF073, 0x7E5F, 0xF074, 0x7E51, 0xF075, 0x7E60, 0xF076, 0x7E57, + 0xF077, 0x7E53, 0xF078, 0x7FB5, 0xF079, 0x7FB3, 0xF07A, 0x7FF7, + 0xF07B, 0x7FF8, 0xF07C, 0x8075, 0xF07D, 0x81D1, 0xF07E, 0x81D2, + 0xF0A1, 0x81D0, 0xF0A2, 0x825F, 0xF0A3, 0x825E, 0xF0A4, 0x85B4, + 0xF0A5, 0x85C6, 0xF0A6, 0x85C0, 0xF0A7, 0x85C3, 0xF0A8, 0x85C2, + 0xF0A9, 0x85B3, 0xF0AA, 0x85B5, 0xF0AB, 0x85BD, 0xF0AC, 0x85C7, + 0xF0AD, 0x85C4, 0xF0AE, 0x85BF, 0xF0AF, 0x85CB, 0xF0B0, 0x85CE, + 0xF0B1, 0x85C8, 0xF0B2, 0x85C5, 0xF0B3, 0x85B1, 0xF0B4, 0x85B6, + 0xF0B5, 0x85D2, 0xF0B6, 0x8624, 0xF0B7, 0x85B8, 0xF0B8, 0x85B7, + 0xF0B9, 0x85BE, 0xF0BA, 0x8669, 0xF0BB, 0x87E7, 0xF0BC, 0x87E6, + 0xF0BD, 0x87E2, 0xF0BE, 0x87DB, 0xF0BF, 0x87EB, 0xF0C0, 0x87EA, + 0xF0C1, 0x87E5, 0xF0C2, 0x87DF, 0xF0C3, 0x87F3, 0xF0C4, 0x87E4, + 0xF0C5, 0x87D4, 0xF0C6, 0x87DC, 0xF0C7, 0x87D3, 0xF0C8, 0x87ED, + 0xF0C9, 0x87D8, 0xF0CA, 0x87E3, 0xF0CB, 0x87A4, 0xF0CC, 0x87D7, + 0xF0CD, 0x87D9, 0xF0CE, 0x8801, 0xF0CF, 0x87F4, 0xF0D0, 0x87E8, + 0xF0D1, 0x87DD, 0xF0D2, 0x8953, 0xF0D3, 0x894B, 0xF0D4, 0x894F, + 0xF0D5, 0x894C, 0xF0D6, 0x8946, 0xF0D7, 0x8950, 0xF0D8, 0x8951, + 0xF0D9, 0x8949, 0xF0DA, 0x8B2A, 0xF0DB, 0x8B27, 0xF0DC, 0x8B23, + 0xF0DD, 0x8B33, 0xF0DE, 0x8B30, 0xF0DF, 0x8B35, 0xF0E0, 0x8B47, + 0xF0E1, 0x8B2F, 0xF0E2, 0x8B3C, 0xF0E3, 0x8B3E, 0xF0E4, 0x8B31, + 0xF0E5, 0x8B25, 0xF0E6, 0x8B37, 0xF0E7, 0x8B26, 0xF0E8, 0x8B36, + 0xF0E9, 0x8B2E, 0xF0EA, 0x8B24, 0xF0EB, 0x8B3B, 0xF0EC, 0x8B3D, + 0xF0ED, 0x8B3A, 0xF0EE, 0x8C42, 0xF0EF, 0x8C75, 0xF0F0, 0x8C99, + 0xF0F1, 0x8C98, 0xF0F2, 0x8C97, 0xF0F3, 0x8CFE, 0xF0F4, 0x8D04, + 0xF0F5, 0x8D02, 0xF0F6, 0x8D00, 0xF0F7, 0x8E5C, 0xF0F8, 0x8E62, + 0xF0F9, 0x8E60, 0xF0FA, 0x8E57, 0xF0FB, 0x8E56, 0xF0FC, 0x8E5E, + 0xF0FD, 0x8E65, 0xF0FE, 0x8E67, 0xF140, 0x8E5B, 0xF141, 0x8E5A, + 0xF142, 0x8E61, 0xF143, 0x8E5D, 0xF144, 0x8E69, 0xF145, 0x8E54, + 0xF146, 0x8F46, 0xF147, 0x8F47, 0xF148, 0x8F48, 0xF149, 0x8F4B, + 0xF14A, 0x9128, 0xF14B, 0x913A, 0xF14C, 0x913B, 0xF14D, 0x913E, + 0xF14E, 0x91A8, 0xF14F, 0x91A5, 0xF150, 0x91A7, 0xF151, 0x91AF, + 0xF152, 0x91AA, 0xF153, 0x93B5, 0xF154, 0x938C, 0xF155, 0x9392, + 0xF156, 0x93B7, 0xF157, 0x939B, 0xF158, 0x939D, 0xF159, 0x9389, + 0xF15A, 0x93A7, 0xF15B, 0x938E, 0xF15C, 0x93AA, 0xF15D, 0x939E, + 0xF15E, 0x93A6, 0xF15F, 0x9395, 0xF160, 0x9388, 0xF161, 0x9399, + 0xF162, 0x939F, 0xF163, 0x938D, 0xF164, 0x93B1, 0xF165, 0x9391, + 0xF166, 0x93B2, 0xF167, 0x93A4, 0xF168, 0x93A8, 0xF169, 0x93B4, + 0xF16A, 0x93A3, 0xF16B, 0x93A5, 0xF16C, 0x95D2, 0xF16D, 0x95D3, + 0xF16E, 0x95D1, 0xF16F, 0x96B3, 0xF170, 0x96D7, 0xF171, 0x96DA, + 0xF172, 0x5DC2, 0xF173, 0x96DF, 0xF174, 0x96D8, 0xF175, 0x96DD, + 0xF176, 0x9723, 0xF177, 0x9722, 0xF178, 0x9725, 0xF179, 0x97AC, + 0xF17A, 0x97AE, 0xF17B, 0x97A8, 0xF17C, 0x97AB, 0xF17D, 0x97A4, + 0xF17E, 0x97AA, 0xF1A1, 0x97A2, 0xF1A2, 0x97A5, 0xF1A3, 0x97D7, + 0xF1A4, 0x97D9, 0xF1A5, 0x97D6, 0xF1A6, 0x97D8, 0xF1A7, 0x97FA, + 0xF1A8, 0x9850, 0xF1A9, 0x9851, 0xF1AA, 0x9852, 0xF1AB, 0x98B8, + 0xF1AC, 0x9941, 0xF1AD, 0x993C, 0xF1AE, 0x993A, 0xF1AF, 0x9A0F, + 0xF1B0, 0x9A0B, 0xF1B1, 0x9A09, 0xF1B2, 0x9A0D, 0xF1B3, 0x9A04, + 0xF1B4, 0x9A11, 0xF1B5, 0x9A0A, 0xF1B6, 0x9A05, 0xF1B7, 0x9A07, + 0xF1B8, 0x9A06, 0xF1B9, 0x9AC0, 0xF1BA, 0x9ADC, 0xF1BB, 0x9B08, + 0xF1BC, 0x9B04, 0xF1BD, 0x9B05, 0xF1BE, 0x9B29, 0xF1BF, 0x9B35, + 0xF1C0, 0x9B4A, 0xF1C1, 0x9B4C, 0xF1C2, 0x9B4B, 0xF1C3, 0x9BC7, + 0xF1C4, 0x9BC6, 0xF1C5, 0x9BC3, 0xF1C6, 0x9BBF, 0xF1C7, 0x9BC1, + 0xF1C8, 0x9BB5, 0xF1C9, 0x9BB8, 0xF1CA, 0x9BD3, 0xF1CB, 0x9BB6, + 0xF1CC, 0x9BC4, 0xF1CD, 0x9BB9, 0xF1CE, 0x9BBD, 0xF1CF, 0x9D5C, + 0xF1D0, 0x9D53, 0xF1D1, 0x9D4F, 0xF1D2, 0x9D4A, 0xF1D3, 0x9D5B, + 0xF1D4, 0x9D4B, 0xF1D5, 0x9D59, 0xF1D6, 0x9D56, 0xF1D7, 0x9D4C, + 0xF1D8, 0x9D57, 0xF1D9, 0x9D52, 0xF1DA, 0x9D54, 0xF1DB, 0x9D5F, + 0xF1DC, 0x9D58, 0xF1DD, 0x9D5A, 0xF1DE, 0x9E8E, 0xF1DF, 0x9E8C, + 0xF1E0, 0x9EDF, 0xF1E1, 0x9F01, 0xF1E2, 0x9F00, 0xF1E3, 0x9F16, + 0xF1E4, 0x9F25, 0xF1E5, 0x9F2B, 0xF1E6, 0x9F2A, 0xF1E7, 0x9F29, + 0xF1E8, 0x9F28, 0xF1E9, 0x9F4C, 0xF1EA, 0x9F55, 0xF1EB, 0x5134, + 0xF1EC, 0x5135, 0xF1ED, 0x5296, 0xF1EE, 0x52F7, 0xF1EF, 0x53B4, + 0xF1F0, 0x56AB, 0xF1F1, 0x56AD, 0xF1F2, 0x56A6, 0xF1F3, 0x56A7, + 0xF1F4, 0x56AA, 0xF1F5, 0x56AC, 0xF1F6, 0x58DA, 0xF1F7, 0x58DD, + 0xF1F8, 0x58DB, 0xF1F9, 0x5912, 0xF1FA, 0x5B3D, 0xF1FB, 0x5B3E, + 0xF1FC, 0x5B3F, 0xF1FD, 0x5DC3, 0xF1FE, 0x5E70, 0xF240, 0x5FBF, + 0xF241, 0x61FB, 0xF242, 0x6507, 0xF243, 0x6510, 0xF244, 0x650D, + 0xF245, 0x6509, 0xF246, 0x650C, 0xF247, 0x650E, 0xF248, 0x6584, + 0xF249, 0x65DE, 0xF24A, 0x65DD, 0xF24B, 0x66DE, 0xF24C, 0x6AE7, + 0xF24D, 0x6AE0, 0xF24E, 0x6ACC, 0xF24F, 0x6AD1, 0xF250, 0x6AD9, + 0xF251, 0x6ACB, 0xF252, 0x6ADF, 0xF253, 0x6ADC, 0xF254, 0x6AD0, + 0xF255, 0x6AEB, 0xF256, 0x6ACF, 0xF257, 0x6ACD, 0xF258, 0x6ADE, + 0xF259, 0x6B60, 0xF25A, 0x6BB0, 0xF25B, 0x6C0C, 0xF25C, 0x7019, + 0xF25D, 0x7027, 0xF25E, 0x7020, 0xF25F, 0x7016, 0xF260, 0x702B, + 0xF261, 0x7021, 0xF262, 0x7022, 0xF263, 0x7023, 0xF264, 0x7029, + 0xF265, 0x7017, 0xF266, 0x7024, 0xF267, 0x701C, 0xF268, 0x702A, + 0xF269, 0x720C, 0xF26A, 0x720A, 0xF26B, 0x7207, 0xF26C, 0x7202, + 0xF26D, 0x7205, 0xF26E, 0x72A5, 0xF26F, 0x72A6, 0xF270, 0x72A4, + 0xF271, 0x72A3, 0xF272, 0x72A1, 0xF273, 0x74CB, 0xF274, 0x74C5, + 0xF275, 0x74B7, 0xF276, 0x74C3, 0xF277, 0x7516, 0xF278, 0x7660, + 0xF279, 0x77C9, 0xF27A, 0x77CA, 0xF27B, 0x77C4, 0xF27C, 0x77F1, + 0xF27D, 0x791D, 0xF27E, 0x791B, 0xF2A1, 0x7921, 0xF2A2, 0x791C, + 0xF2A3, 0x7917, 0xF2A4, 0x791E, 0xF2A5, 0x79B0, 0xF2A6, 0x7A67, + 0xF2A7, 0x7A68, 0xF2A8, 0x7C33, 0xF2A9, 0x7C3C, 0xF2AA, 0x7C39, + 0xF2AB, 0x7C2C, 0xF2AC, 0x7C3B, 0xF2AD, 0x7CEC, 0xF2AE, 0x7CEA, + 0xF2AF, 0x7E76, 0xF2B0, 0x7E75, 0xF2B1, 0x7E78, 0xF2B2, 0x7E70, + 0xF2B3, 0x7E77, 0xF2B4, 0x7E6F, 0xF2B5, 0x7E7A, 0xF2B6, 0x7E72, + 0xF2B7, 0x7E74, 0xF2B8, 0x7E68, 0xF2B9, 0x7F4B, 0xF2BA, 0x7F4A, + 0xF2BB, 0x7F83, 0xF2BC, 0x7F86, 0xF2BD, 0x7FB7, 0xF2BE, 0x7FFD, + 0xF2BF, 0x7FFE, 0xF2C0, 0x8078, 0xF2C1, 0x81D7, 0xF2C2, 0x81D5, + 0xF2C3, 0x8264, 0xF2C4, 0x8261, 0xF2C5, 0x8263, 0xF2C6, 0x85EB, + 0xF2C7, 0x85F1, 0xF2C8, 0x85ED, 0xF2C9, 0x85D9, 0xF2CA, 0x85E1, + 0xF2CB, 0x85E8, 0xF2CC, 0x85DA, 0xF2CD, 0x85D7, 0xF2CE, 0x85EC, + 0xF2CF, 0x85F2, 0xF2D0, 0x85F8, 0xF2D1, 0x85D8, 0xF2D2, 0x85DF, + 0xF2D3, 0x85E3, 0xF2D4, 0x85DC, 0xF2D5, 0x85D1, 0xF2D6, 0x85F0, + 0xF2D7, 0x85E6, 0xF2D8, 0x85EF, 0xF2D9, 0x85DE, 0xF2DA, 0x85E2, + 0xF2DB, 0x8800, 0xF2DC, 0x87FA, 0xF2DD, 0x8803, 0xF2DE, 0x87F6, + 0xF2DF, 0x87F7, 0xF2E0, 0x8809, 0xF2E1, 0x880C, 0xF2E2, 0x880B, + 0xF2E3, 0x8806, 0xF2E4, 0x87FC, 0xF2E5, 0x8808, 0xF2E6, 0x87FF, + 0xF2E7, 0x880A, 0xF2E8, 0x8802, 0xF2E9, 0x8962, 0xF2EA, 0x895A, + 0xF2EB, 0x895B, 0xF2EC, 0x8957, 0xF2ED, 0x8961, 0xF2EE, 0x895C, + 0xF2EF, 0x8958, 0xF2F0, 0x895D, 0xF2F1, 0x8959, 0xF2F2, 0x8988, + 0xF2F3, 0x89B7, 0xF2F4, 0x89B6, 0xF2F5, 0x89F6, 0xF2F6, 0x8B50, + 0xF2F7, 0x8B48, 0xF2F8, 0x8B4A, 0xF2F9, 0x8B40, 0xF2FA, 0x8B53, + 0xF2FB, 0x8B56, 0xF2FC, 0x8B54, 0xF2FD, 0x8B4B, 0xF2FE, 0x8B55, + 0xF340, 0x8B51, 0xF341, 0x8B42, 0xF342, 0x8B52, 0xF343, 0x8B57, + 0xF344, 0x8C43, 0xF345, 0x8C77, 0xF346, 0x8C76, 0xF347, 0x8C9A, + 0xF348, 0x8D06, 0xF349, 0x8D07, 0xF34A, 0x8D09, 0xF34B, 0x8DAC, + 0xF34C, 0x8DAA, 0xF34D, 0x8DAD, 0xF34E, 0x8DAB, 0xF34F, 0x8E6D, + 0xF350, 0x8E78, 0xF351, 0x8E73, 0xF352, 0x8E6A, 0xF353, 0x8E6F, + 0xF354, 0x8E7B, 0xF355, 0x8EC2, 0xF356, 0x8F52, 0xF357, 0x8F51, + 0xF358, 0x8F4F, 0xF359, 0x8F50, 0xF35A, 0x8F53, 0xF35B, 0x8FB4, + 0xF35C, 0x9140, 0xF35D, 0x913F, 0xF35E, 0x91B0, 0xF35F, 0x91AD, + 0xF360, 0x93DE, 0xF361, 0x93C7, 0xF362, 0x93CF, 0xF363, 0x93C2, + 0xF364, 0x93DA, 0xF365, 0x93D0, 0xF366, 0x93F9, 0xF367, 0x93EC, + 0xF368, 0x93CC, 0xF369, 0x93D9, 0xF36A, 0x93A9, 0xF36B, 0x93E6, + 0xF36C, 0x93CA, 0xF36D, 0x93D4, 0xF36E, 0x93EE, 0xF36F, 0x93E3, + 0xF370, 0x93D5, 0xF371, 0x93C4, 0xF372, 0x93CE, 0xF373, 0x93C0, + 0xF374, 0x93D2, 0xF375, 0x93E7, 0xF376, 0x957D, 0xF377, 0x95DA, + 0xF378, 0x95DB, 0xF379, 0x96E1, 0xF37A, 0x9729, 0xF37B, 0x972B, + 0xF37C, 0x972C, 0xF37D, 0x9728, 0xF37E, 0x9726, 0xF3A1, 0x97B3, + 0xF3A2, 0x97B7, 0xF3A3, 0x97B6, 0xF3A4, 0x97DD, 0xF3A5, 0x97DE, + 0xF3A6, 0x97DF, 0xF3A7, 0x985C, 0xF3A8, 0x9859, 0xF3A9, 0x985D, + 0xF3AA, 0x9857, 0xF3AB, 0x98BF, 0xF3AC, 0x98BD, 0xF3AD, 0x98BB, + 0xF3AE, 0x98BE, 0xF3AF, 0x9948, 0xF3B0, 0x9947, 0xF3B1, 0x9943, + 0xF3B2, 0x99A6, 0xF3B3, 0x99A7, 0xF3B4, 0x9A1A, 0xF3B5, 0x9A15, + 0xF3B6, 0x9A25, 0xF3B7, 0x9A1D, 0xF3B8, 0x9A24, 0xF3B9, 0x9A1B, + 0xF3BA, 0x9A22, 0xF3BB, 0x9A20, 0xF3BC, 0x9A27, 0xF3BD, 0x9A23, + 0xF3BE, 0x9A1E, 0xF3BF, 0x9A1C, 0xF3C0, 0x9A14, 0xF3C1, 0x9AC2, + 0xF3C2, 0x9B0B, 0xF3C3, 0x9B0A, 0xF3C4, 0x9B0E, 0xF3C5, 0x9B0C, + 0xF3C6, 0x9B37, 0xF3C7, 0x9BEA, 0xF3C8, 0x9BEB, 0xF3C9, 0x9BE0, + 0xF3CA, 0x9BDE, 0xF3CB, 0x9BE4, 0xF3CC, 0x9BE6, 0xF3CD, 0x9BE2, + 0xF3CE, 0x9BF0, 0xF3CF, 0x9BD4, 0xF3D0, 0x9BD7, 0xF3D1, 0x9BEC, + 0xF3D2, 0x9BDC, 0xF3D3, 0x9BD9, 0xF3D4, 0x9BE5, 0xF3D5, 0x9BD5, + 0xF3D6, 0x9BE1, 0xF3D7, 0x9BDA, 0xF3D8, 0x9D77, 0xF3D9, 0x9D81, + 0xF3DA, 0x9D8A, 0xF3DB, 0x9D84, 0xF3DC, 0x9D88, 0xF3DD, 0x9D71, + 0xF3DE, 0x9D80, 0xF3DF, 0x9D78, 0xF3E0, 0x9D86, 0xF3E1, 0x9D8B, + 0xF3E2, 0x9D8C, 0xF3E3, 0x9D7D, 0xF3E4, 0x9D6B, 0xF3E5, 0x9D74, + 0xF3E6, 0x9D75, 0xF3E7, 0x9D70, 0xF3E8, 0x9D69, 0xF3E9, 0x9D85, + 0xF3EA, 0x9D73, 0xF3EB, 0x9D7B, 0xF3EC, 0x9D82, 0xF3ED, 0x9D6F, + 0xF3EE, 0x9D79, 0xF3EF, 0x9D7F, 0xF3F0, 0x9D87, 0xF3F1, 0x9D68, + 0xF3F2, 0x9E94, 0xF3F3, 0x9E91, 0xF3F4, 0x9EC0, 0xF3F5, 0x9EFC, + 0xF3F6, 0x9F2D, 0xF3F7, 0x9F40, 0xF3F8, 0x9F41, 0xF3F9, 0x9F4D, + 0xF3FA, 0x9F56, 0xF3FB, 0x9F57, 0xF3FC, 0x9F58, 0xF3FD, 0x5337, + 0xF3FE, 0x56B2, 0xF440, 0x56B5, 0xF441, 0x56B3, 0xF442, 0x58E3, + 0xF443, 0x5B45, 0xF444, 0x5DC6, 0xF445, 0x5DC7, 0xF446, 0x5EEE, + 0xF447, 0x5EEF, 0xF448, 0x5FC0, 0xF449, 0x5FC1, 0xF44A, 0x61F9, + 0xF44B, 0x6517, 0xF44C, 0x6516, 0xF44D, 0x6515, 0xF44E, 0x6513, + 0xF44F, 0x65DF, 0xF450, 0x66E8, 0xF451, 0x66E3, 0xF452, 0x66E4, + 0xF453, 0x6AF3, 0xF454, 0x6AF0, 0xF455, 0x6AEA, 0xF456, 0x6AE8, + 0xF457, 0x6AF9, 0xF458, 0x6AF1, 0xF459, 0x6AEE, 0xF45A, 0x6AEF, + 0xF45B, 0x703C, 0xF45C, 0x7035, 0xF45D, 0x702F, 0xF45E, 0x7037, + 0xF45F, 0x7034, 0xF460, 0x7031, 0xF461, 0x7042, 0xF462, 0x7038, + 0xF463, 0x703F, 0xF464, 0x703A, 0xF465, 0x7039, 0xF466, 0x7040, + 0xF467, 0x703B, 0xF468, 0x7033, 0xF469, 0x7041, 0xF46A, 0x7213, + 0xF46B, 0x7214, 0xF46C, 0x72A8, 0xF46D, 0x737D, 0xF46E, 0x737C, + 0xF46F, 0x74BA, 0xF470, 0x76AB, 0xF471, 0x76AA, 0xF472, 0x76BE, + 0xF473, 0x76ED, 0xF474, 0x77CC, 0xF475, 0x77CE, 0xF476, 0x77CF, + 0xF477, 0x77CD, 0xF478, 0x77F2, 0xF479, 0x7925, 0xF47A, 0x7923, + 0xF47B, 0x7927, 0xF47C, 0x7928, 0xF47D, 0x7924, 0xF47E, 0x7929, + 0xF4A1, 0x79B2, 0xF4A2, 0x7A6E, 0xF4A3, 0x7A6C, 0xF4A4, 0x7A6D, + 0xF4A5, 0x7AF7, 0xF4A6, 0x7C49, 0xF4A7, 0x7C48, 0xF4A8, 0x7C4A, + 0xF4A9, 0x7C47, 0xF4AA, 0x7C45, 0xF4AB, 0x7CEE, 0xF4AC, 0x7E7B, + 0xF4AD, 0x7E7E, 0xF4AE, 0x7E81, 0xF4AF, 0x7E80, 0xF4B0, 0x7FBA, + 0xF4B1, 0x7FFF, 0xF4B2, 0x8079, 0xF4B3, 0x81DB, 0xF4B4, 0x81D9, + 0xF4B5, 0x820B, 0xF4B6, 0x8268, 0xF4B7, 0x8269, 0xF4B8, 0x8622, + 0xF4B9, 0x85FF, 0xF4BA, 0x8601, 0xF4BB, 0x85FE, 0xF4BC, 0x861B, + 0xF4BD, 0x8600, 0xF4BE, 0x85F6, 0xF4BF, 0x8604, 0xF4C0, 0x8609, + 0xF4C1, 0x8605, 0xF4C2, 0x860C, 0xF4C3, 0x85FD, 0xF4C4, 0x8819, + 0xF4C5, 0x8810, 0xF4C6, 0x8811, 0xF4C7, 0x8817, 0xF4C8, 0x8813, + 0xF4C9, 0x8816, 0xF4CA, 0x8963, 0xF4CB, 0x8966, 0xF4CC, 0x89B9, + 0xF4CD, 0x89F7, 0xF4CE, 0x8B60, 0xF4CF, 0x8B6A, 0xF4D0, 0x8B5D, + 0xF4D1, 0x8B68, 0xF4D2, 0x8B63, 0xF4D3, 0x8B65, 0xF4D4, 0x8B67, + 0xF4D5, 0x8B6D, 0xF4D6, 0x8DAE, 0xF4D7, 0x8E86, 0xF4D8, 0x8E88, + 0xF4D9, 0x8E84, 0xF4DA, 0x8F59, 0xF4DB, 0x8F56, 0xF4DC, 0x8F57, + 0xF4DD, 0x8F55, 0xF4DE, 0x8F58, 0xF4DF, 0x8F5A, 0xF4E0, 0x908D, + 0xF4E1, 0x9143, 0xF4E2, 0x9141, 0xF4E3, 0x91B7, 0xF4E4, 0x91B5, + 0xF4E5, 0x91B2, 0xF4E6, 0x91B3, 0xF4E7, 0x940B, 0xF4E8, 0x9413, + 0xF4E9, 0x93FB, 0xF4EA, 0x9420, 0xF4EB, 0x940F, 0xF4EC, 0x9414, + 0xF4ED, 0x93FE, 0xF4EE, 0x9415, 0xF4EF, 0x9410, 0xF4F0, 0x9428, + 0xF4F1, 0x9419, 0xF4F2, 0x940D, 0xF4F3, 0x93F5, 0xF4F4, 0x9400, + 0xF4F5, 0x93F7, 0xF4F6, 0x9407, 0xF4F7, 0x940E, 0xF4F8, 0x9416, + 0xF4F9, 0x9412, 0xF4FA, 0x93FA, 0xF4FB, 0x9409, 0xF4FC, 0x93F8, + 0xF4FD, 0x940A, 0xF4FE, 0x93FF, 0xF540, 0x93FC, 0xF541, 0x940C, + 0xF542, 0x93F6, 0xF543, 0x9411, 0xF544, 0x9406, 0xF545, 0x95DE, + 0xF546, 0x95E0, 0xF547, 0x95DF, 0xF548, 0x972E, 0xF549, 0x972F, + 0xF54A, 0x97B9, 0xF54B, 0x97BB, 0xF54C, 0x97FD, 0xF54D, 0x97FE, + 0xF54E, 0x9860, 0xF54F, 0x9862, 0xF550, 0x9863, 0xF551, 0x985F, + 0xF552, 0x98C1, 0xF553, 0x98C2, 0xF554, 0x9950, 0xF555, 0x994E, + 0xF556, 0x9959, 0xF557, 0x994C, 0xF558, 0x994B, 0xF559, 0x9953, + 0xF55A, 0x9A32, 0xF55B, 0x9A34, 0xF55C, 0x9A31, 0xF55D, 0x9A2C, + 0xF55E, 0x9A2A, 0xF55F, 0x9A36, 0xF560, 0x9A29, 0xF561, 0x9A2E, + 0xF562, 0x9A38, 0xF563, 0x9A2D, 0xF564, 0x9AC7, 0xF565, 0x9ACA, + 0xF566, 0x9AC6, 0xF567, 0x9B10, 0xF568, 0x9B12, 0xF569, 0x9B11, + 0xF56A, 0x9C0B, 0xF56B, 0x9C08, 0xF56C, 0x9BF7, 0xF56D, 0x9C05, + 0xF56E, 0x9C12, 0xF56F, 0x9BF8, 0xF570, 0x9C40, 0xF571, 0x9C07, + 0xF572, 0x9C0E, 0xF573, 0x9C06, 0xF574, 0x9C17, 0xF575, 0x9C14, + 0xF576, 0x9C09, 0xF577, 0x9D9F, 0xF578, 0x9D99, 0xF579, 0x9DA4, + 0xF57A, 0x9D9D, 0xF57B, 0x9D92, 0xF57C, 0x9D98, 0xF57D, 0x9D90, + 0xF57E, 0x9D9B, 0xF5A1, 0x9DA0, 0xF5A2, 0x9D94, 0xF5A3, 0x9D9C, + 0xF5A4, 0x9DAA, 0xF5A5, 0x9D97, 0xF5A6, 0x9DA1, 0xF5A7, 0x9D9A, + 0xF5A8, 0x9DA2, 0xF5A9, 0x9DA8, 0xF5AA, 0x9D9E, 0xF5AB, 0x9DA3, + 0xF5AC, 0x9DBF, 0xF5AD, 0x9DA9, 0xF5AE, 0x9D96, 0xF5AF, 0x9DA6, + 0xF5B0, 0x9DA7, 0xF5B1, 0x9E99, 0xF5B2, 0x9E9B, 0xF5B3, 0x9E9A, + 0xF5B4, 0x9EE5, 0xF5B5, 0x9EE4, 0xF5B6, 0x9EE7, 0xF5B7, 0x9EE6, + 0xF5B8, 0x9F30, 0xF5B9, 0x9F2E, 0xF5BA, 0x9F5B, 0xF5BB, 0x9F60, + 0xF5BC, 0x9F5E, 0xF5BD, 0x9F5D, 0xF5BE, 0x9F59, 0xF5BF, 0x9F91, + 0xF5C0, 0x513A, 0xF5C1, 0x5139, 0xF5C2, 0x5298, 0xF5C3, 0x5297, + 0xF5C4, 0x56C3, 0xF5C5, 0x56BD, 0xF5C6, 0x56BE, 0xF5C7, 0x5B48, + 0xF5C8, 0x5B47, 0xF5C9, 0x5DCB, 0xF5CA, 0x5DCF, 0xF5CB, 0x5EF1, + 0xF5CC, 0x61FD, 0xF5CD, 0x651B, 0xF5CE, 0x6B02, 0xF5CF, 0x6AFC, + 0xF5D0, 0x6B03, 0xF5D1, 0x6AF8, 0xF5D2, 0x6B00, 0xF5D3, 0x7043, + 0xF5D4, 0x7044, 0xF5D5, 0x704A, 0xF5D6, 0x7048, 0xF5D7, 0x7049, + 0xF5D8, 0x7045, 0xF5D9, 0x7046, 0xF5DA, 0x721D, 0xF5DB, 0x721A, + 0xF5DC, 0x7219, 0xF5DD, 0x737E, 0xF5DE, 0x7517, 0xF5DF, 0x766A, + 0xF5E0, 0x77D0, 0xF5E1, 0x792D, 0xF5E2, 0x7931, 0xF5E3, 0x792F, + 0xF5E4, 0x7C54, 0xF5E5, 0x7C53, 0xF5E6, 0x7CF2, 0xF5E7, 0x7E8A, + 0xF5E8, 0x7E87, 0xF5E9, 0x7E88, 0xF5EA, 0x7E8B, 0xF5EB, 0x7E86, + 0xF5EC, 0x7E8D, 0xF5ED, 0x7F4D, 0xF5EE, 0x7FBB, 0xF5EF, 0x8030, + 0xF5F0, 0x81DD, 0xF5F1, 0x8618, 0xF5F2, 0x862A, 0xF5F3, 0x8626, + 0xF5F4, 0x861F, 0xF5F5, 0x8623, 0xF5F6, 0x861C, 0xF5F7, 0x8619, + 0xF5F8, 0x8627, 0xF5F9, 0x862E, 0xF5FA, 0x8621, 0xF5FB, 0x8620, + 0xF5FC, 0x8629, 0xF5FD, 0x861E, 0xF5FE, 0x8625, 0xF640, 0x8829, + 0xF641, 0x881D, 0xF642, 0x881B, 0xF643, 0x8820, 0xF644, 0x8824, + 0xF645, 0x881C, 0xF646, 0x882B, 0xF647, 0x884A, 0xF648, 0x896D, + 0xF649, 0x8969, 0xF64A, 0x896E, 0xF64B, 0x896B, 0xF64C, 0x89FA, + 0xF64D, 0x8B79, 0xF64E, 0x8B78, 0xF64F, 0x8B45, 0xF650, 0x8B7A, + 0xF651, 0x8B7B, 0xF652, 0x8D10, 0xF653, 0x8D14, 0xF654, 0x8DAF, + 0xF655, 0x8E8E, 0xF656, 0x8E8C, 0xF657, 0x8F5E, 0xF658, 0x8F5B, + 0xF659, 0x8F5D, 0xF65A, 0x9146, 0xF65B, 0x9144, 0xF65C, 0x9145, + 0xF65D, 0x91B9, 0xF65E, 0x943F, 0xF65F, 0x943B, 0xF660, 0x9436, + 0xF661, 0x9429, 0xF662, 0x943D, 0xF663, 0x943C, 0xF664, 0x9430, + 0xF665, 0x9439, 0xF666, 0x942A, 0xF667, 0x9437, 0xF668, 0x942C, + 0xF669, 0x9440, 0xF66A, 0x9431, 0xF66B, 0x95E5, 0xF66C, 0x95E4, + 0xF66D, 0x95E3, 0xF66E, 0x9735, 0xF66F, 0x973A, 0xF670, 0x97BF, + 0xF671, 0x97E1, 0xF672, 0x9864, 0xF673, 0x98C9, 0xF674, 0x98C6, + 0xF675, 0x98C0, 0xF676, 0x9958, 0xF677, 0x9956, 0xF678, 0x9A39, + 0xF679, 0x9A3D, 0xF67A, 0x9A46, 0xF67B, 0x9A44, 0xF67C, 0x9A42, + 0xF67D, 0x9A41, 0xF67E, 0x9A3A, 0xF6A1, 0x9A3F, 0xF6A2, 0x9ACD, + 0xF6A3, 0x9B15, 0xF6A4, 0x9B17, 0xF6A5, 0x9B18, 0xF6A6, 0x9B16, + 0xF6A7, 0x9B3A, 0xF6A8, 0x9B52, 0xF6A9, 0x9C2B, 0xF6AA, 0x9C1D, + 0xF6AB, 0x9C1C, 0xF6AC, 0x9C2C, 0xF6AD, 0x9C23, 0xF6AE, 0x9C28, + 0xF6AF, 0x9C29, 0xF6B0, 0x9C24, 0xF6B1, 0x9C21, 0xF6B2, 0x9DB7, + 0xF6B3, 0x9DB6, 0xF6B4, 0x9DBC, 0xF6B5, 0x9DC1, 0xF6B6, 0x9DC7, + 0xF6B7, 0x9DCA, 0xF6B8, 0x9DCF, 0xF6B9, 0x9DBE, 0xF6BA, 0x9DC5, + 0xF6BB, 0x9DC3, 0xF6BC, 0x9DBB, 0xF6BD, 0x9DB5, 0xF6BE, 0x9DCE, + 0xF6BF, 0x9DB9, 0xF6C0, 0x9DBA, 0xF6C1, 0x9DAC, 0xF6C2, 0x9DC8, + 0xF6C3, 0x9DB1, 0xF6C4, 0x9DAD, 0xF6C5, 0x9DCC, 0xF6C6, 0x9DB3, + 0xF6C7, 0x9DCD, 0xF6C8, 0x9DB2, 0xF6C9, 0x9E7A, 0xF6CA, 0x9E9C, + 0xF6CB, 0x9EEB, 0xF6CC, 0x9EEE, 0xF6CD, 0x9EED, 0xF6CE, 0x9F1B, + 0xF6CF, 0x9F18, 0xF6D0, 0x9F1A, 0xF6D1, 0x9F31, 0xF6D2, 0x9F4E, + 0xF6D3, 0x9F65, 0xF6D4, 0x9F64, 0xF6D5, 0x9F92, 0xF6D6, 0x4EB9, + 0xF6D7, 0x56C6, 0xF6D8, 0x56C5, 0xF6D9, 0x56CB, 0xF6DA, 0x5971, + 0xF6DB, 0x5B4B, 0xF6DC, 0x5B4C, 0xF6DD, 0x5DD5, 0xF6DE, 0x5DD1, + 0xF6DF, 0x5EF2, 0xF6E0, 0x6521, 0xF6E1, 0x6520, 0xF6E2, 0x6526, + 0xF6E3, 0x6522, 0xF6E4, 0x6B0B, 0xF6E5, 0x6B08, 0xF6E6, 0x6B09, + 0xF6E7, 0x6C0D, 0xF6E8, 0x7055, 0xF6E9, 0x7056, 0xF6EA, 0x7057, + 0xF6EB, 0x7052, 0xF6EC, 0x721E, 0xF6ED, 0x721F, 0xF6EE, 0x72A9, + 0xF6EF, 0x737F, 0xF6F0, 0x74D8, 0xF6F1, 0x74D5, 0xF6F2, 0x74D9, + 0xF6F3, 0x74D7, 0xF6F4, 0x766D, 0xF6F5, 0x76AD, 0xF6F6, 0x7935, + 0xF6F7, 0x79B4, 0xF6F8, 0x7A70, 0xF6F9, 0x7A71, 0xF6FA, 0x7C57, + 0xF6FB, 0x7C5C, 0xF6FC, 0x7C59, 0xF6FD, 0x7C5B, 0xF6FE, 0x7C5A, + 0xF740, 0x7CF4, 0xF741, 0x7CF1, 0xF742, 0x7E91, 0xF743, 0x7F4F, + 0xF744, 0x7F87, 0xF745, 0x81DE, 0xF746, 0x826B, 0xF747, 0x8634, + 0xF748, 0x8635, 0xF749, 0x8633, 0xF74A, 0x862C, 0xF74B, 0x8632, + 0xF74C, 0x8636, 0xF74D, 0x882C, 0xF74E, 0x8828, 0xF74F, 0x8826, + 0xF750, 0x882A, 0xF751, 0x8825, 0xF752, 0x8971, 0xF753, 0x89BF, + 0xF754, 0x89BE, 0xF755, 0x89FB, 0xF756, 0x8B7E, 0xF757, 0x8B84, + 0xF758, 0x8B82, 0xF759, 0x8B86, 0xF75A, 0x8B85, 0xF75B, 0x8B7F, + 0xF75C, 0x8D15, 0xF75D, 0x8E95, 0xF75E, 0x8E94, 0xF75F, 0x8E9A, + 0xF760, 0x8E92, 0xF761, 0x8E90, 0xF762, 0x8E96, 0xF763, 0x8E97, + 0xF764, 0x8F60, 0xF765, 0x8F62, 0xF766, 0x9147, 0xF767, 0x944C, + 0xF768, 0x9450, 0xF769, 0x944A, 0xF76A, 0x944B, 0xF76B, 0x944F, + 0xF76C, 0x9447, 0xF76D, 0x9445, 0xF76E, 0x9448, 0xF76F, 0x9449, + 0xF770, 0x9446, 0xF771, 0x973F, 0xF772, 0x97E3, 0xF773, 0x986A, + 0xF774, 0x9869, 0xF775, 0x98CB, 0xF776, 0x9954, 0xF777, 0x995B, + 0xF778, 0x9A4E, 0xF779, 0x9A53, 0xF77A, 0x9A54, 0xF77B, 0x9A4C, + 0xF77C, 0x9A4F, 0xF77D, 0x9A48, 0xF77E, 0x9A4A, 0xF7A1, 0x9A49, + 0xF7A2, 0x9A52, 0xF7A3, 0x9A50, 0xF7A4, 0x9AD0, 0xF7A5, 0x9B19, + 0xF7A6, 0x9B2B, 0xF7A7, 0x9B3B, 0xF7A8, 0x9B56, 0xF7A9, 0x9B55, + 0xF7AA, 0x9C46, 0xF7AB, 0x9C48, 0xF7AC, 0x9C3F, 0xF7AD, 0x9C44, + 0xF7AE, 0x9C39, 0xF7AF, 0x9C33, 0xF7B0, 0x9C41, 0xF7B1, 0x9C3C, + 0xF7B2, 0x9C37, 0xF7B3, 0x9C34, 0xF7B4, 0x9C32, 0xF7B5, 0x9C3D, + 0xF7B6, 0x9C36, 0xF7B7, 0x9DDB, 0xF7B8, 0x9DD2, 0xF7B9, 0x9DDE, + 0xF7BA, 0x9DDA, 0xF7BB, 0x9DCB, 0xF7BC, 0x9DD0, 0xF7BD, 0x9DDC, + 0xF7BE, 0x9DD1, 0xF7BF, 0x9DDF, 0xF7C0, 0x9DE9, 0xF7C1, 0x9DD9, + 0xF7C2, 0x9DD8, 0xF7C3, 0x9DD6, 0xF7C4, 0x9DF5, 0xF7C5, 0x9DD5, + 0xF7C6, 0x9DDD, 0xF7C7, 0x9EB6, 0xF7C8, 0x9EF0, 0xF7C9, 0x9F35, + 0xF7CA, 0x9F33, 0xF7CB, 0x9F32, 0xF7CC, 0x9F42, 0xF7CD, 0x9F6B, + 0xF7CE, 0x9F95, 0xF7CF, 0x9FA2, 0xF7D0, 0x513D, 0xF7D1, 0x5299, + 0xF7D2, 0x58E8, 0xF7D3, 0x58E7, 0xF7D4, 0x5972, 0xF7D5, 0x5B4D, + 0xF7D6, 0x5DD8, 0xF7D7, 0x882F, 0xF7D8, 0x5F4F, 0xF7D9, 0x6201, + 0xF7DA, 0x6203, 0xF7DB, 0x6204, 0xF7DC, 0x6529, 0xF7DD, 0x6525, + 0xF7DE, 0x6596, 0xF7DF, 0x66EB, 0xF7E0, 0x6B11, 0xF7E1, 0x6B12, + 0xF7E2, 0x6B0F, 0xF7E3, 0x6BCA, 0xF7E4, 0x705B, 0xF7E5, 0x705A, + 0xF7E6, 0x7222, 0xF7E7, 0x7382, 0xF7E8, 0x7381, 0xF7E9, 0x7383, + 0xF7EA, 0x7670, 0xF7EB, 0x77D4, 0xF7EC, 0x7C67, 0xF7ED, 0x7C66, + 0xF7EE, 0x7E95, 0xF7EF, 0x826C, 0xF7F0, 0x863A, 0xF7F1, 0x8640, + 0xF7F2, 0x8639, 0xF7F3, 0x863C, 0xF7F4, 0x8631, 0xF7F5, 0x863B, + 0xF7F6, 0x863E, 0xF7F7, 0x8830, 0xF7F8, 0x8832, 0xF7F9, 0x882E, + 0xF7FA, 0x8833, 0xF7FB, 0x8976, 0xF7FC, 0x8974, 0xF7FD, 0x8973, + 0xF7FE, 0x89FE, 0xF840, 0x8B8C, 0xF841, 0x8B8E, 0xF842, 0x8B8B, + 0xF843, 0x8B88, 0xF844, 0x8C45, 0xF845, 0x8D19, 0xF846, 0x8E98, + 0xF847, 0x8F64, 0xF848, 0x8F63, 0xF849, 0x91BC, 0xF84A, 0x9462, + 0xF84B, 0x9455, 0xF84C, 0x945D, 0xF84D, 0x9457, 0xF84E, 0x945E, + 0xF84F, 0x97C4, 0xF850, 0x97C5, 0xF851, 0x9800, 0xF852, 0x9A56, + 0xF853, 0x9A59, 0xF854, 0x9B1E, 0xF855, 0x9B1F, 0xF856, 0x9B20, + 0xF857, 0x9C52, 0xF858, 0x9C58, 0xF859, 0x9C50, 0xF85A, 0x9C4A, + 0xF85B, 0x9C4D, 0xF85C, 0x9C4B, 0xF85D, 0x9C55, 0xF85E, 0x9C59, + 0xF85F, 0x9C4C, 0xF860, 0x9C4E, 0xF861, 0x9DFB, 0xF862, 0x9DF7, + 0xF863, 0x9DEF, 0xF864, 0x9DE3, 0xF865, 0x9DEB, 0xF866, 0x9DF8, + 0xF867, 0x9DE4, 0xF868, 0x9DF6, 0xF869, 0x9DE1, 0xF86A, 0x9DEE, + 0xF86B, 0x9DE6, 0xF86C, 0x9DF2, 0xF86D, 0x9DF0, 0xF86E, 0x9DE2, + 0xF86F, 0x9DEC, 0xF870, 0x9DF4, 0xF871, 0x9DF3, 0xF872, 0x9DE8, + 0xF873, 0x9DED, 0xF874, 0x9EC2, 0xF875, 0x9ED0, 0xF876, 0x9EF2, + 0xF877, 0x9EF3, 0xF878, 0x9F06, 0xF879, 0x9F1C, 0xF87A, 0x9F38, + 0xF87B, 0x9F37, 0xF87C, 0x9F36, 0xF87D, 0x9F43, 0xF87E, 0x9F4F, + 0xF8A1, 0x9F71, 0xF8A2, 0x9F70, 0xF8A3, 0x9F6E, 0xF8A4, 0x9F6F, + 0xF8A5, 0x56D3, 0xF8A6, 0x56CD, 0xF8A7, 0x5B4E, 0xF8A8, 0x5C6D, + 0xF8A9, 0x652D, 0xF8AA, 0x66ED, 0xF8AB, 0x66EE, 0xF8AC, 0x6B13, + 0xF8AD, 0x705F, 0xF8AE, 0x7061, 0xF8AF, 0x705D, 0xF8B0, 0x7060, + 0xF8B1, 0x7223, 0xF8B2, 0x74DB, 0xF8B3, 0x74E5, 0xF8B4, 0x77D5, + 0xF8B5, 0x7938, 0xF8B6, 0x79B7, 0xF8B7, 0x79B6, 0xF8B8, 0x7C6A, + 0xF8B9, 0x7E97, 0xF8BA, 0x7F89, 0xF8BB, 0x826D, 0xF8BC, 0x8643, + 0xF8BD, 0x8838, 0xF8BE, 0x8837, 0xF8BF, 0x8835, 0xF8C0, 0x884B, + 0xF8C1, 0x8B94, 0xF8C2, 0x8B95, 0xF8C3, 0x8E9E, 0xF8C4, 0x8E9F, + 0xF8C5, 0x8EA0, 0xF8C6, 0x8E9D, 0xF8C7, 0x91BE, 0xF8C8, 0x91BD, + 0xF8C9, 0x91C2, 0xF8CA, 0x946B, 0xF8CB, 0x9468, 0xF8CC, 0x9469, + 0xF8CD, 0x96E5, 0xF8CE, 0x9746, 0xF8CF, 0x9743, 0xF8D0, 0x9747, + 0xF8D1, 0x97C7, 0xF8D2, 0x97E5, 0xF8D3, 0x9A5E, 0xF8D4, 0x9AD5, + 0xF8D5, 0x9B59, 0xF8D6, 0x9C63, 0xF8D7, 0x9C67, 0xF8D8, 0x9C66, + 0xF8D9, 0x9C62, 0xF8DA, 0x9C5E, 0xF8DB, 0x9C60, 0xF8DC, 0x9E02, + 0xF8DD, 0x9DFE, 0xF8DE, 0x9E07, 0xF8DF, 0x9E03, 0xF8E0, 0x9E06, + 0xF8E1, 0x9E05, 0xF8E2, 0x9E00, 0xF8E3, 0x9E01, 0xF8E4, 0x9E09, + 0xF8E5, 0x9DFF, 0xF8E6, 0x9DFD, 0xF8E7, 0x9E04, 0xF8E8, 0x9EA0, + 0xF8E9, 0x9F1E, 0xF8EA, 0x9F46, 0xF8EB, 0x9F74, 0xF8EC, 0x9F75, + 0xF8ED, 0x9F76, 0xF8EE, 0x56D4, 0xF8EF, 0x652E, 0xF8F0, 0x65B8, + 0xF8F1, 0x6B18, 0xF8F2, 0x6B19, 0xF8F3, 0x6B17, 0xF8F4, 0x6B1A, + 0xF8F5, 0x7062, 0xF8F6, 0x7226, 0xF8F7, 0x72AA, 0xF8F8, 0x77D8, + 0xF8F9, 0x77D9, 0xF8FA, 0x7939, 0xF8FB, 0x7C69, 0xF8FC, 0x7C6B, + 0xF8FD, 0x7CF6, 0xF8FE, 0x7E9A, 0xF940, 0x7E98, 0xF941, 0x7E9B, + 0xF942, 0x7E99, 0xF943, 0x81E0, 0xF944, 0x81E1, 0xF945, 0x8646, + 0xF946, 0x8647, 0xF947, 0x8648, 0xF948, 0x8979, 0xF949, 0x897A, + 0xF94A, 0x897C, 0xF94B, 0x897B, 0xF94C, 0x89FF, 0xF94D, 0x8B98, + 0xF94E, 0x8B99, 0xF94F, 0x8EA5, 0xF950, 0x8EA4, 0xF951, 0x8EA3, + 0xF952, 0x946E, 0xF953, 0x946D, 0xF954, 0x946F, 0xF955, 0x9471, + 0xF956, 0x9473, 0xF957, 0x9749, 0xF958, 0x9872, 0xF959, 0x995F, + 0xF95A, 0x9C68, 0xF95B, 0x9C6E, 0xF95C, 0x9C6D, 0xF95D, 0x9E0B, + 0xF95E, 0x9E0D, 0xF95F, 0x9E10, 0xF960, 0x9E0F, 0xF961, 0x9E12, + 0xF962, 0x9E11, 0xF963, 0x9EA1, 0xF964, 0x9EF5, 0xF965, 0x9F09, + 0xF966, 0x9F47, 0xF967, 0x9F78, 0xF968, 0x9F7B, 0xF969, 0x9F7A, + 0xF96A, 0x9F79, 0xF96B, 0x571E, 0xF96C, 0x7066, 0xF96D, 0x7C6F, + 0xF96E, 0x883C, 0xF96F, 0x8DB2, 0xF970, 0x8EA6, 0xF971, 0x91C3, + 0xF972, 0x9474, 0xF973, 0x9478, 0xF974, 0x9476, 0xF975, 0x9475, + 0xF976, 0x9A60, 0xF977, 0x9C74, 0xF978, 0x9C73, 0xF979, 0x9C71, + 0xF97A, 0x9C75, 0xF97B, 0x9E14, 0xF97C, 0x9E13, 0xF97D, 0x9EF6, + 0xF97E, 0x9F0A, 0xF9A1, 0x9FA4, 0xF9A2, 0x7068, 0xF9A3, 0x7065, + 0xF9A4, 0x7CF7, 0xF9A5, 0x866A, 0xF9A6, 0x883E, 0xF9A7, 0x883D, + 0xF9A8, 0x883F, 0xF9A9, 0x8B9E, 0xF9AA, 0x8C9C, 0xF9AB, 0x8EA9, + 0xF9AC, 0x8EC9, 0xF9AD, 0x974B, 0xF9AE, 0x9873, 0xF9AF, 0x9874, + 0xF9B0, 0x98CC, 0xF9B1, 0x9961, 0xF9B2, 0x99AB, 0xF9B3, 0x9A64, + 0xF9B4, 0x9A66, 0xF9B5, 0x9A67, 0xF9B6, 0x9B24, 0xF9B7, 0x9E15, + 0xF9B8, 0x9E17, 0xF9B9, 0x9F48, 0xF9BA, 0x6207, 0xF9BB, 0x6B1E, + 0xF9BC, 0x7227, 0xF9BD, 0x864C, 0xF9BE, 0x8EA8, 0xF9BF, 0x9482, + 0xF9C0, 0x9480, 0xF9C1, 0x9481, 0xF9C2, 0x9A69, 0xF9C3, 0x9A68, + 0xF9C4, 0x9B2E, 0xF9C5, 0x9E19, 0xF9C6, 0x7229, 0xF9C7, 0x864B, + 0xF9C8, 0x8B9F, 0xF9C9, 0x9483, 0xF9CA, 0x9C79, 0xF9CB, 0x9EB7, + 0xF9CC, 0x7675, 0xF9CD, 0x9A6B, 0xF9CE, 0x9C7A, 0xF9CF, 0x9E1D, + 0xF9D0, 0x7069, 0xF9D1, 0x706A, 0xF9D2, 0x9EA4, 0xF9D3, 0x9F7E, + 0xF9D4, 0x9F49, 0xF9D5, 0x9F98, 0xF9D6, 0x7881, 0xF9D7, 0x92B9, + 0xF9D8, 0x88CF, 0xF9D9, 0x58BB, 0xF9DA, 0x6052, 0xF9DB, 0x7CA7, + 0xF9DC, 0x5AFA, 0xF9DD, 0x2554, 0xF9DE, 0x2566, 0xF9DF, 0x2557, + 0xF9E0, 0x2560, 0xF9E1, 0x256C, 0xF9E2, 0x2563, 0xF9E3, 0x255A, + 0xF9E4, 0x2569, 0xF9E5, 0x255D, 0xF9E6, 0x2552, 0xF9E7, 0x2564, + 0xF9E8, 0x2555, 0xF9E9, 0x255E, 0xF9EA, 0x256A, 0xF9EB, 0x2561, + 0xF9EC, 0x2558, 0xF9ED, 0x2567, 0xF9EE, 0x255B, 0xF9EF, 0x2553, + 0xF9F0, 0x2565, 0xF9F1, 0x2556, 0xF9F2, 0x255F, 0xF9F3, 0x256B, + 0xF9F4, 0x2562, 0xF9F5, 0x2559, 0xF9F6, 0x2568, 0xF9F7, 0x255C, + 0xF9F8, 0x2551, 0xF9F9, 0x2550, 0xF9FA, 0x256D, 0xF9FB, 0x256E, + 0xF9FC, 0x2570, 0xF9FD, 0x256F, 0xF9FE, 0x2593, 0, 0 +}; + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR src, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (src < 0x80) { /* ASCII */ + c = src; + } else { + if (dir) { /* OEMCP to unicode */ + p = oem2uni; + hi = sizeof(oem2uni) / 4 - 1; + } else { /* Unicode to OEMCP */ + p = uni2oem; + hi = sizeof(uni2oem) / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (src == p[i * 2]) break; + if (src > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; + } + + return c; +} +#else +#error This file is not needed in current configuration. + +#endif diff --git a/2.5/bertos/fs/fatfs/option/ccsbcs.c b/2.5/bertos/fs/fatfs/option/ccsbcs.c new file mode 100644 index 00000000..0d544b68 --- /dev/null +++ b/2.5/bertos/fs/fatfs/option/ccsbcs.c @@ -0,0 +1,528 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - Local code bidirectional converter (C)ChaN, 2009 */ +/* (SBCS code pages) */ +/*------------------------------------------------------------------------*/ +/* 437 U.S. (OEM) +/ 720 Arabic (OEM) +/ 1256 Arabic (Windows) +/ 737 Greek (OEM) +/ 1253 Greek (Windows) +/ 1250 Central Europe (Windows) +/ 775 Baltic (OEM) +/ 1257 Baltic (Windows) +/ 850 Multilingual Latin 1 (OEM) +/ 852 Latin 2 (OEM) +/ 1252 Latin 1 (Windows) +/ 855 Cyrillic (OEM) +/ 1251 Cyrillic (Windows) +/ 866 Russian (OEM) +/ 857 Turkish (OEM) +/ 1254 Turkish (Windows) +/ 858 Multilingual Latin 1 + Euro (OEM) +/ 862 Hebrew (OEM) +/ 1255 Hebrew (Windows) +/ 874 Thai (OEM, Windows) +/ 1258 Vietnam (OEM, Windows) +*/ + +#include "../ff.h" + + +#if _USE_LFN && _CODE_PAGE == 437 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP437(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 720 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP720(0x80-0xFF) to Unicode conversion table */ + 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, + 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, + 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, + 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0xO650, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 737 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP737(0x80-0xFF) to Unicode conversion table */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, + 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, + 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, + 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, + 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 775 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP775(0x80-0xFF) to Unicode conversion table */ + 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, + 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, + 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, + 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, + 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, + 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, + 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, + 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, + 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, + 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, + 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 850 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP850(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, + 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 852 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP852(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, + 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, + 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, + 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, + 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, + 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, + 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, + 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, + 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 855 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP855(0x80-0xFF) to Unicode conversion table */ + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, + 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, + 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, + 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, + 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, + 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, + 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, + 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, + 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, + 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 857 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP857(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, + 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 858 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP858(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x2550, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x20AC, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00C6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, + 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 862 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP862(0x80-0xFF) to Unicode conversion table */ + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 866 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP866(0x80-0xFF) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 874 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP874(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, + 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, + 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, + 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, + 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, + 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, + 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, + 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F, + 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, + 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, + 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, + 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +#elif _CODE_PAGE == 1250 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1250(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, + 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, + 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, + 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, + 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 +}; + +#elif _CODE_PAGE == 1251 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1251(0x80-0xFF) to Unicode conversion table */ + 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, + 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, + 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2111, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, + 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, + 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, + 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, + 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042D, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F +}; + +#elif _CODE_PAGE == 1252 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1252(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF +}; + +#elif _CODE_PAGE == 1253 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1253(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x000C, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, + 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, + 0x03A8, 0x03A9, 0x03AA, 0x03AD, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 +}; + +#elif _CODE_PAGE == 1254 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1254(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x210A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF +}; + +#elif _CODE_PAGE == 1255 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1255(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, + 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, + 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, + 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000 +}; + +#elif _CODE_PAGE == 1256 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1256(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, + 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, + 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, + 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, + 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0640, 0x0642, 0x0643, + 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, + 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, + 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 +} + +#elif _CODE_PAGE == 1257 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1257(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000, + 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, + 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, + 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, + 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, + 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, + 0x0173, 0x014E, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 +}; + +#elif _CODE_PAGE == 1258 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1258(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, + 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, + 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF +}; + +#endif + + +#if _TBLDEF + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR src, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + + + if (src < 0x80) { /* ASCII */ + c = src; + + } else { + if (dir) { /* OEMCP to Unicode */ + c = (src >= 0x100) ? 0 : Tbl[src - 0x80]; + + } else { /* Unicode to OEMCP */ + for (c = 0; c < 0x80; c++) { + if (src == Tbl[c]) break; + } + c = (c + 0x80) & 0xFF; + } + } + + return c; +} + +#else +#error This file is not needed in current configuration + +#endif diff --git a/2.5/bertos/fs/fatfs/option/syncobj.c b/2.5/bertos/fs/fatfs/option/syncobj.c new file mode 100644 index 00000000..d5075920 --- /dev/null +++ b/2.5/bertos/fs/fatfs/option/syncobj.c @@ -0,0 +1,115 @@ +/*------------------------------------------------------------------------*/ +/* Sample code of OS dependent synchronization object controls */ +/* for FatFs R0.07a (C)ChaN, 2009 */ +/*------------------------------------------------------------------------*/ + +#include // Win32 +//#include // uC/OS-II + +#include "../ff.h" + +#if _FS_REENTRANT + +/*------------------------------------------------------------------------*/ +/* Create a Synchronization Object for a Volume +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount function to create a new +/ synchronization object, such as semaphore and mutex. When a FALSE is +/ returned, the f_mount function fails with FR_INT_ERR. +*/ + +BOOL ff_cre_syncobj ( /* TRUE:Function succeeded, FALSE:Could not create due to any error */ + BYTE vol, /* Corresponding logical drive being processed */ + _SYNC_t *sobj /* Pointer to return the created sync object */ +) +{ + BOOL ret; + + *sobj = CreateMutex(NULL, FALSE, NULL); // Win32 + ret = (*sobj != INVALID_HANDLE_VALUE) ? TRUE : FALSE; // + +// *sobj = VolumeSemId[vol]; // uITRON (give a static created sync object) +// ret = TRUE; // The initial value of the semaphore must be 1. + +// *sobj = OSMutexCreate(0, &err); // uC/OS-II +// ret = (err == OS_NO_ERR) ? TRUE : FALSE; // + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Delete a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount function to delete a synchronization +/ object that created with ff_cre_syncobj function. When a FALSE is +/ returned, the f_mount function fails with FR_INT_ERR. +*/ + +BOOL ff_del_syncobj ( /* TRUE:Function succeeded, FALSE:Could not delete due to any error */ + _SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ +) +{ + BOOL ret; + + ret = CloseHandle(sobj); // Win32 + +// ret = TRUE; // uITRON (nothing to do) + +// OSMutexDel(sobj, OS_DEL_ALWAYS, &err); // uC/OS-II +// ret = (err == OS_NO_ERR) ? TRUE : FALSE; // + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Request Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on entering file functions to lock the volume. +/ When a FALSE is returned, the file function fails with FR_TIMEOUT. +*/ + +BOOL ff_req_grant ( /* TRUE:Got a grant to access the volume, FALSE:Could not get a grant */ + _SYNC_t sobj /* Sync object to wait */ +) +{ + BOOL ret; + + ret = (WaitForSingleObject(sobj, _TIMEOUT) == WAIT_OBJECT_0) ? TRUE : FALSE; // Win32 + +// ret = (wai_sem(sobj) == E_OK) ? TRUE : FALSE; // uITRON + +// OSMutexPend(sobj, _TIMEOUT, &err)); // uC/OS-II +// ret = (err == OS_NO_ERR) ? TRUE : FALSE; // + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Release Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on leaving file functions to unlock the volume. +*/ + +void ff_rel_grant ( + _SYNC_t sobj /* Sync object to be signaled */ +) +{ + ReleaseMutex(sobj); // Win32 + +// sig_sem(sobj); // uITRON + +// OSMutexPost(sobj); // uC/OS-II +} + + +#else + +#error This file is not needed in this configuration. + +#endif diff --git a/2.5/bertos/gfx/bitmap.c b/2.5/bertos/gfx/bitmap.c new file mode 100644 index 00000000..c94306a9 --- /dev/null +++ b/2.5/bertos/gfx/bitmap.c @@ -0,0 +1,267 @@ +/** + * \file + * + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + * \brief Bitmap manipulation routines. + * \sa gfx.h + */ + +#include "gfx.h" +#include "gfx_p.h" + +#include "cfg/cfg_gfx.h" /* CONFIG_GFX_CLIPPING */ +#include /* MIN() */ +#include /* ASSERT() */ + +#include /* CPU_HARVARD */ + +#include /* memset() */ + +#if CONFIG_GFX_TEXT +#include /* default_font */ +#endif + + +/** + * Initialize a Bitmap structure with the provided parameters. + * + * \note The pen position is reset to the origin. + */ +void gfx_bitmapInit(Bitmap *bm, uint8_t *raster, coord_t w, coord_t h) +{ + bm->raster = raster; + bm->width = w; + bm->height = h; + #if (CONFIG_BITMAP_FMT == BITMAP_FMT_PLANAR_H_MSB) + bm->stride = (w + 7) / 8; + #elif CONFIG_BITMAP_FMT == BITMAP_FMT_PLANAR_V_LSB + bm->stride = w; + #else + #error Unknown value of CONFIG_BITMAP_FMT + #endif /* CONFIG_BITMAP_FMT */ + bm->penX = 0; + bm->penY = 0; + +#if CONFIG_GFX_TEXT + gfx_setFont(bm, &default_font); + bm->styles = 0; +#endif + +#if CONFIG_GFX_CLIPPING + bm->cr.xmin = 0; + bm->cr.ymin = 0; + bm->cr.xmax = w; + bm->cr.ymax = h; +#endif /* CONFIG_GFX_CLIPPING */ +} + + +/** + * Clear the whole bitmap surface to the background color. + * + * \note This function does \b not update the current pen position. + * \note This function bypasses the current clipping area. + */ +void gfx_bitmapClear(Bitmap *bm) +{ + memset(bm->raster, 0, RAST_SIZE(bm->width, bm->height)); +} + + +#if CPU_HARVARD + +#include /* FIXME: memcpy_P() */ + +/** + * Copy a raster picture located in program memory in the bitmap. + * The size of the raster to copy *must* be the same of the raster bitmap. + * + * \note This function does \b not update the current pen position + */ +void gfx_blit_P(Bitmap *bm, const pgm_uint8_t *raster) +{ + memcpy_P(bm->raster, raster, RAST_SIZE(bm->width, bm->height)); +} +#endif /* CPU_HARVARD */ + +#if CONFIG_GFX_CLIPPING + /** + * Clip destination coordinates inside a clipping range. + * + * This macro helps a drawing operation to adjust its + * destination X and Y coordinates inside the destination + * clipping range. + * + * The source start coordinate is adjusted as well + * when destination start clipping occurs. + */ + #define gfx_clip(dmin, dmax, smin, cmin, cmax) \ + do { \ + if ((dmin) < (cmin)) \ + { \ + (smin) += (cmin) - (dmin); \ + (dmin) = (cmin); \ + } \ + (dmax) = MIN((dmax), (cmax)); \ + } while(0) + +#else /* !CONFIG_GFX_CLIPPING */ + + #define gfx_clip(dmin, dmax, smin, cmin, cmax) do { } while (0) + +#endif /* !CONFIG_GFX_CLIPPING */ + + +/** + * Copy a rectangular area of a bitmap on another bitmap. + * + * Blitting is a common copy operation involving two bitmaps. + * A rectangular area of the source bitmap is copied bit-wise + * to a different position in the destination bitmap. + * + * \note Using the same bitmap for \a src and \a dst is unsupported. + * + * \param dst Bitmap where the operation writes. + * \param rect The (xmin;ymin) coordinates provide the top/left offset + * for drawing in the destination bitmap. If the source + * bitmap is larger than the rectangle, drawing is clipped. + * \param src Bitmap containing the source pixels. + * \param srcx Starting X offset in the source bitmap. + * \param srcy Starting Y offset in the source bitmap. + */ +void gfx_blit(Bitmap *dst, const Rect *rect, const Bitmap *src, coord_t srcx, coord_t srcy) +{ + coord_t dxmin, dymin, dxmax, dymax; + coord_t dx, dy, sx, sy; + + /* + * Pre-clip coordinates inside src->width/height. + */ + dxmin = rect->xmin; + dymin = rect->ymin; + dxmax = MIN(rect->xmax, rect->xmin + src->width); + dymax = MIN(rect->ymax, rect->ymin + src->height); + + /* Perform regular clipping */ + gfx_clip(dxmin, dxmax, srcx, dst->cr.xmin, dst->cr.xmax); + gfx_clip(dymin, dymax, srcy, dst->cr.ymin, dst->cr.ymax); + + //kprintf("dxmin=%d, sxmin=%d, dxmax=%d; ", dxmin, sxmin, dxmax); + //kprintf("dymin=%d, symin=%d, dymax=%d\n", dymin, symin, dymax); + + /* TODO: make it not as dog slow as this */ + for (dx = dxmin, sx = srcx; dx < dxmax; ++dx, ++sx) + for (dy = dymin, sy = srcy; dy < dymax; ++dy, ++sy) + BM_DRAWPIXEL(dst, dx, dy, BM_READPIXEL(src, sx, sy)); +} + +/** + * Blit a raster to a Bitmap. + * + * \todo Merge this function into gfx_blit() + * + * \see gfx_blit() + */ +void gfx_blitRaster(Bitmap *dst, coord_t dxmin, coord_t dymin, + const uint8_t *raster, coord_t w, coord_t h, coord_t stride) +{ + coord_t dxmax = dxmin + w, dymax = dymin + h; + coord_t sxmin = 0, symin = 0; + coord_t dx, dy, sx, sy; + + /* Perform regular clipping */ + gfx_clip(dxmin, dxmax, sxmin, dst->cr.xmin, dst->cr.xmax); + gfx_clip(dymin, dymax, symin, dst->cr.ymin, dst->cr.ymax); + + //kprintf("dxmin=%d, sxmin=%d, dxmax=%d; ", dxmin, sxmin, dxmax); + //kprintf("dymin=%d, symin=%d, dymax=%d\n", dymin, symin, dymax); + + /* TODO: make it not as dog slow as this */ + for (dx = dxmin, sx = sxmin; dx < dxmax; ++dx, ++sx) + for (dy = dymin, sy = symin; dy < dymax; ++dy, ++sy) + BM_DRAWPIXEL(dst, dx, dy, RAST_READPIXEL(raster, sx, sy, stride)); +} + +/** + * Blit an Image to a Bitmap. + * + * \see gfx_blit() + */ +void gfx_blitImage(Bitmap *dst, coord_t dxmin, coord_t dymin, const Image *image) +{ + ASSERT(image); + + gfx_blitRaster(dst, dxmin, dymin, + image->raster, image->width, image->height, image->stride); +} + + +#if CONFIG_GFX_CLIPPING || CONFIG_GFX_VCOORDS + +/** + * Set the bitmap clipping rectangle to the specified coordinates. + * + * All drawing performed on the bitmap will be clipped inside this + * rectangle. + * + * The clipping rectangle is also used as a bounding box for the + * logical view of the virtual coordinate system. + * + * \note Following the convention used for all other operations, the + * top-left pixels of the rectangle are included, while the + * bottom-right pixels are considered outside the clipping region. + * + * \see gfx_setViewRect + */ +void gfx_setClipRect(Bitmap *bm, coord_t minx, coord_t miny, coord_t maxx, coord_t maxy) +{ + ASSERT(minx < maxx); + ASSERT(miny < maxy); + ASSERT(miny >= 0); + ASSERT(minx >= 0); + ASSERT(maxx <= bm->width); + ASSERT(maxy <= bm->height); + + bm->cr.xmin = minx; + bm->cr.ymin = miny; + bm->cr.xmax = maxx; + bm->cr.ymax = maxy; + +// kprintf("cr.xmin = %d, cr.ymin = %d, cr.xmax = %d, cr.ymax = %d\n", +// bm->cr.xMin, bm->cr.ymin, bm->cr.xmax, bm->cr.ymax); +} + +#endif /* CONFIG_GFX_CLIPPING */ + diff --git a/2.5/bertos/gfx/charts.c b/2.5/bertos/gfx/charts.c new file mode 100644 index 00000000..718d0b78 --- /dev/null +++ b/2.5/bertos/gfx/charts.c @@ -0,0 +1,153 @@ +/** + * \file + * + * + * \version $Id$ + * \author Bernie Innocenti + * + * \brief Simple charts on top of mware/gfx routines (implementation). + * + */ + +#include "charts.h" +#include + + +#ifndef CONFIG_CHART_ARROWS +#define CONFIG_CHART_ARROWS 0 +#endif + + +void chart_init(Bitmap *bm, coord_t xmin, coord_t ymin, coord_t xmax, coord_t ymax) +{ + /* Clear the chart area */ + gfx_rectClear(bm, xmin, ymin, xmax, ymax); + + gfx_setClipRect(bm, xmin + CHART_BORDERLEFT, ymin + CHART_BORDERTOP, + xmax - CHART_BORDERRIGHT, ymax - CHART_BORDERBOTTOM); + + chart_drawAxis(bm); +} + + +void chart_setScale(Bitmap *bm, chart_x_t xmin, chart_y_t ymin, chart_x_t xmax, chart_y_t ymax) +{ + gfx_setViewRect(bm, xmin, ymin, xmax, ymax); +} + + +/** + * Draw the chart axes + */ +void chart_drawAxis(Bitmap *bm) +{ +#if CONFIG_CHART_ARROWS + + /* Draw axis */ + gfx_moveTo(bm, bm->cr.xmin, bm->cr.ymin + 4); + gfx_lineTo(bm, bm->cr.xmin, bm->cr.ymax - 1); + gfx_lineTo(bm, bm->cr.xmax - 4 - 1, bm->cr.ymax - 1); + + /* Draw up arrow */ + gfx_moveTo(bm, bm->cr.xmin - 2, bm->cr.ymin + 3); + gfx_lineTo(bm, bm->cr.xmin + 2, bm->cr.ymin + 3); + gfx_lineTo(bm, bm->cr.xmin, bm->cr.ymin); + gfx_lineTo(bm, bm->cr.xmin - 2, bm->cr.ymin + 3); + + /* Draw right arrow */ + gfx_moveTo(bm, bm->cr.xmax - 4, bm->cr.ymax - 3); + gfx_lineTo(bm, bm->cr.xmax - 4, bm->cr.ymax + 1); + gfx_lineTo(bm, bm->cr.xmax - 1, bm->cr.ymax - 1); + gfx_lineTo(bm, bm->cr.xmax - 4, bm->cr.ymax - 3); + +#else /* CONFIG_CHART_ARROWS */ + + /* Draw a box around the chart */ + gfx_rectDraw(bm, bm->cr.xmin, bm->cr.ymin, bm->cr.xmax, bm->cr.ymax); + +#endif /* CONFIG_CHART_ARROWS */ + + //CHECK_WALL(wall_before_raster, WALL_SIZE); + //CHECK_WALL(wall_after_raster, WALL_SIZE); +} + + +/** + * Draw a set of \a curve_cnt connected segments, whose Y coordinates + * are identified by the \a curve_y array and X-coordinates are + * are evenly spaced by one virtual unit. + */ +void chart_drawCurve(Bitmap *bm, const chart_y_t *curve_y, int curve_cnt) +{ + int i; + + gfx_moveTo(bm, gfx_transformX(bm, 0), gfx_transformY(bm, curve_y[0])); + + for (i = 1; i < curve_cnt; i++) + gfx_lineTo(bm, gfx_transformX(bm, i), gfx_transformY(bm, curve_y[i])); + + //CHECK_WALL(wall_before_raster, WALL_SIZE); + //CHECK_WALL(wall_after_raster, WALL_SIZE); +} + + +/** + * Disegna dei dot in corrispondenza delle coppie (dotsx[i];dotsy[i]) + * Se dotsx e' NULL, i punti vengono disegnati ad intervalli regolari. + */ +void chart_drawDots(Bitmap *bm, const chart_x_t *dots_x, const chart_y_t *dots_y, int cnt) +{ + int i; + coord_t x, y; + + for (i = 0; i < cnt; i++) + { + if (dots_x) + x = gfx_transformX(bm, dots_x[i]); + else + x = gfx_transformX(bm, i); + + y = gfx_transformY(bm, dots_y[i]); + + /* Draw tick over the curve */ + gfx_rectFill(bm, + x - TICKS_WIDTH / 2, y - TICKS_HEIGHT / 2, + x + (TICKS_WIDTH + 1) / 2, y + (TICKS_HEIGHT + 1) / 2); + + /* Draw vertical line from the curve to the X-axis */ + //gfx_drawLine(bm, x, y, x, bm->cr.ymax - 1); + } + + //CHECK_WALL(wall_before_raster, WALL_SIZE); + //CHECK_WALL(wall_after_raster, WALL_SIZE); +} + diff --git a/2.5/bertos/gfx/charts.h b/2.5/bertos/gfx/charts.h new file mode 100644 index 00000000..8b4e3458 --- /dev/null +++ b/2.5/bertos/gfx/charts.h @@ -0,0 +1,99 @@ +/** + * \file + * + * + * \brief Simple charts on top of mware/gfx routines (interface). + * + * Configuration: + * - \c CONFIG_CHART_TYPE_X: type for the input dataset of X-coordinates + * - \c CONFIG_CHART_TYPE_Y: type for the input dataset of Y-coordinates + * + * Sample usage: + * + * \code + * bm = chart_init(0, ymax, N_POINTS_CURVE, ymin); + * + * chart_drawCurve(bm, curve_y, curve_points + 1); + * gfx_setViewRect(bm, xmin, ymax, xmax, ymin); + * chart_drawDots(bm, samples_x, samples_y, samples_cnt); + * + * print_bitmap(bm); + * \endcode + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef GFX_CHARTS_H +#define GFX_CHARTS_H + +#include "cfg/cfg_gfx.h" /* CONFIG_ stuff */ + +#include /* vcoord_t */ + +/** + * \name Width/height of the small ticks drawn over the axes + * \{ + */ +#define TICKS_HEIGHT 2 +#define TICKS_WIDTH 2 +/*\}*/ + +/** + * \name Chart frame dimensions + * \{ + */ +#define CHART_BORDERTOP 0 +#define CHART_BORDERBOTTOM 0 +#define CHART_BORDERLEFT 0 +#define CHART_BORDERRIGHT 0 +/*\}*/ + +#ifndef CONFIG_CHART_TYPE_X +#define CONFIG_CHART_TYPE_X vcoord_t +#endif +#ifndef CONFIG_CHART_TYPE_Y +#define CONFIG_CHART_TYPE_Y vcoord_t +#endif + + +typedef CONFIG_CHART_TYPE_X chart_x_t; +typedef CONFIG_CHART_TYPE_Y chart_y_t; + + +/* Public function protos */ +void chart_init(Bitmap *bm, coord_t xmin, coord_t ymin, coord_t xmax, coord_t ymax); +void chart_setScale(Bitmap *bm, chart_x_t xmin, chart_y_t ymin, chart_x_t xmax, chart_y_t ymax); +void chart_drawAxis(Bitmap *bm); +void chart_drawCurve(Bitmap *bm, const chart_y_t *curve_y, int curve_cnt); +void chart_drawDots(Bitmap *bm, const chart_x_t *dots_x, const chart_y_t *dots_y, int cnt); + +#endif /* GFX_CHARTS_H */ diff --git a/2.5/bertos/gfx/fillpoly.cpp b/2.5/bertos/gfx/fillpoly.cpp new file mode 100644 index 00000000..36483bf6 --- /dev/null +++ b/2.5/bertos/gfx/fillpoly.cpp @@ -0,0 +1,405 @@ +/** + * \file + * + * + * \version $Id$ + * \author Massimiliano Corsini + * + * + * \brief Low-level drawing routines. + * + * This file contains the implementation of the low-level drawing routines + * to draw fill rectangle, fill triangle and so on. + * + */ + +/*#* + *#* $Log$ + *#* Revision 1.1 2006/07/19 13:00:01 bernie + *#* Import into DevLib. + *#* + *#* Revision 1.10 2005/10/15 15:03:43 rasky + *#* Remove per-pixel clipping from line(). + *#* Use clipLine() also for a-scope. + *#* + *#* Revision 1.9 2005/10/14 15:21:32 eldes + *#* Implement the cohen-sutherland clipping on the buffer + *#* + *#* Revision 1.8 2005/09/27 13:28:10 rasky + *#* Add clipping capabilities to line() + *#* Fix off-by-one computation of rectangles of drawing. + *#* + *#* Revision 1.7 2005/09/27 10:41:35 rasky + *#* Import line-drawing routine from Devlib + *#* + *#* Revision 1.6 2005/09/19 16:36:05 chad + *#* Fix doxygen autobrief + *#* + *#* Revision 1.5 2005/07/06 12:51:47 chad + *#* Make the fillRectangle() independent of the order of the points of the rectangle + *#* + *#* Revision 1.4 2005/06/17 15:06:36 chad + *#* Remove conversion warning + *#* + *#* Revision 1.3 2005/06/17 15:04:47 chad + *#* Add line clipping capability + *#* + *#* Revision 1.2 2005/06/15 14:04:43 chad + *#* Add line routine + *#* + *#* Revision 1.1 2005/06/15 13:34:34 chad + *#* Low-level drawing routines + *#* + *#*/ + +// Qt-specific headers +#include + + +/** + * Low-level routine to draw a line. + * + * This routine is based on the Bresenham Line-Drawing Algorithm. + * + * The \a stride represents the width of the image buffer. + * (\a x1, \a y1) are the coordinates of the starting point. + * (\a x2, \a y2) are the coordinates of the ending point. + * + * The line has no anti-alias, and clipping is not performed. The line + * must be fully contained in the buffer (use clipLine() if you need + * to clip it). + */ +void line(unsigned char *buf, + unsigned long bufw, unsigned long bufh, unsigned long stride, + int x1, int y1, int x2, int y2, unsigned char color) +{ + int x, y, e, len, adx, ady, signx, signy; + + if (x2 > x1) + { + /* left to right */ + signx = +1; + adx = x2 - x1; + } + else + { + /* right to left */ + signx = -1; + adx = x1 - x2; + } + + if (y2 > y1) + { + /* top to bottom */ + signy = +1; + ady = y2 - y1; + } + else + { + /* bottom to top */ + signy = -1; + ady = y1 - y2; + } + + x = x1; + y = y1; + + if (adx > ady) + { + /* X-major line (octants 1/4/5/8) */ + len = adx; + e = -adx; + while (len--) + { + /* Sanity check */ + assert(y >= 0 && y < static_cast(bufh) && + x >= 0 && x < static_cast(bufw)); + buf[y * stride + x] = color; + x += signx; + e += ady; + if (e >= 0) + { + y += signy; + e -= adx; + } + } + } + else + { + /* Y-major line (octants 2/3/6/7) */ + len = ady; + e = -ady; + while (len--) + { + /* Sanity check */ + assert(y >= 0 && y < static_cast(bufh) && + x >= 0 && x < static_cast(bufw)); + buf[y * stride + x] = color; + y += signy; + e += adx; + if (e >= 0) + { + x += signx; + e -= ady; + } + } + } +} + +/// Helper routine for clipLine(). +static int region(int x, int y, int w, int h) +{ + int code = 0; + + if (y >= h) + code |= 1; // top + else if (y < 0) + code |= 2; // bottom + + if (x >= w) + code |= 4; // right + else if (x < 0) + code |= 8; // left + + return code; +} + +/** + * Low-level routine to draw a line, clipped to the buffer extents. + * + * This routine executes the clipping, and then invokes line(). + * Parameters are the same of line(). The clipping is performed + * using the Cohen-Sutherland algorithm, which is very fast. + */ +void clipLine(unsigned char *buf, + unsigned long w, unsigned long h, unsigned long stride, + int x1, int y1, int x2, int y2, unsigned char color) +{ + int code1 = region(x1, y1, w, h); + int code2 = region(x2, y2, w, h); + + // Loop while there is at least one point outside + while (code1 | code2) + { + // Check for line totally outside + if (code1 & code2) + return; + + int c = code1 ? code1 : code2; + int x, y; + + if (c & 1) // top + { + x = x1 + (x2 - x1) * (h - y1) / (y2 - y1); + y = h - 1; + } + else if (c & 2) //bottom + { + x = x1 + (x2 - x1) * -y1 / (y2 - y1); + y = 0; + } + else if (c & 4) //right + { + y = y1 + (y2 - y1) * (w - x1) / (x2 - x1); + x = w - 1; + } + else //left + { + y = y1 + (y2 - y1) * -x1 / (x2 - x1); + x = 0; + } + + if (c == code1) // first endpoint was clipped + { + x1 = x; y1 = y; + code1 = region(x1, y1, w, h); + } + else //second endpoint was clipped + { + x2 = x; y2 = y; + code2 = region(x2, y2, w, h); + } + } + + line(buf, w, h, stride, x1, y1, x2, y2, color); +} + + +/** + * Low-level routine to draw a filled rectangle. + * + * The triangle is filled with the given color. + * + * The \a stride represents the width of the image buffer. + * The points \a p1 and \a p2 are two opposite corners of the + * rectangle. + */ +void fillRectangle(unsigned char *buf, unsigned long stride, + QPoint p1, QPoint p2, unsigned char color) +{ + QPoint ul; // upper-left corner + QPoint lr; // lower-right corner + + if (p2.x() > p1.x()) + { + ul.setX(p1.x()); + lr.setX(p2.x()); + } + else + { + ul.setX(p2.x()); + lr.setX(p1.x()); + } + + if (p2.y() > p1.y()) + { + ul.setY(p1.y()); + lr.setY(p2.y()); + } + else + { + ul.setY(p2.y()); + lr.setY(p1.y()); + } + + int width = lr.x() - ul.x(); + unsigned long offset = ul.x() + ul.y()*stride; + + for (int h = ul.y(); h < lr.y(); h++) + { + memset(buf+offset, color, width); + offset += stride; + } +} + +/** + * Low-level routines to draw a filled triangle. + * + * The triangle is filled with the given \a color. + * The \a stride represents the width of the image buffer (\a buf). + * + * The routine use fixed-point arithmetic. + */ +void fillTriangle(unsigned char* buf, unsigned long stride, + QPoint v1, QPoint v2, QPoint v3, unsigned char color) +{ + int altezza[3]; + + // Sort by vertical coordinate + if (v1.y() > v2.y()) + std::swap(v1, v2); + if (v1.y() > v3.y()) + std::swap(v1, v3); + if (v2.y() > v3.y()) + std::swap(v2, v3); + + altezza[0] = v3.y() - v1.y(); + if (!altezza[0]) + return; + + int sezioni = 2; + int sezione = 1; + + buf += v1.y() * stride; + + altezza[1] = v2.y() - v1.y(); + altezza[2] = v3.y() - v2.y(); + + int sinistra = v1.x(); + int destra = sinistra; + + if (v1.y() == v2.y()) + { + if (v1.x() < v2.x()) + destra = v2.x(); + else + sinistra = v2.x(); + } + + sinistra <<= 16; + destra <<= 16; + + int stmp1, stmp2, stmp3; + + stmp1 = (altezza[1] << 16) / altezza[0]; + int lunghezza = stmp1 * (v3.x() - v1.x()) + ((v1.x() - v2.x()) << 16); + + if (!lunghezza ) + return; + + int delta_sinistra[2]; + int delta_destra[2]; + + stmp1 = ((v3.x() - v1.x()) << 16) / altezza[0]; + + if (altezza[1]) + stmp2 = ((v2.x() - v1.x()) << 16) / altezza[1]; + if (altezza[2]) + stmp3 = ((v3.x() - v2.x()) << 16) / altezza[2]; + + if (lunghezza < 0) // Il secondo vertice ~J a destra + { + delta_sinistra[0] = stmp1; + delta_sinistra[1] = stmp1; + delta_destra[0] = stmp2; + delta_destra[1] = stmp3; + } + else // Il secondo vertice ~J a sinistra + { + delta_sinistra[0] = stmp2; + delta_sinistra[1] = stmp3; + delta_destra[0] = stmp1; + delta_destra[1] = stmp1; + } + + int len2 = lunghezza; + + do + { + while (altezza [sezione]) + { + unsigned char* curpos = buf + ((sinistra )>> 16); + lunghezza = ((destra ) >> 16) - ((sinistra ) >> 16); + assert(lunghezza >= 0); + if (lunghezza) + memset(curpos, color, lunghezza); + buf += stride; + destra += delta_destra[sezione - 1]; + sinistra += delta_sinistra[sezione - 1]; + altezza[sezione]--; + } + if (len2 < 0) + destra = v2.x() << 16; + else + sinistra = v2.x() << 16; + sezione++; + } while (--sezioni); +} diff --git a/2.5/bertos/gfx/font.h b/2.5/bertos/gfx/font.h new file mode 100644 index 00000000..cc1a3794 --- /dev/null +++ b/2.5/bertos/gfx/font.h @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \brief Font 8x6 IBM-PC 8bit + * + * \version $Id$ + * + * \author Stefano Fedrigo + * + */ + +#ifndef GFX_FONT_H +#define GFX_FONT_H + +#include /* uint8_t */ +#include /* PROGMEM */ + +typedef struct Font +{ + /** + * Pointer to glyph data. + * + * Data is an array of at most 256 glyphs packed together. + * Raster format must be the same of the bitmap. + */ + const pgm_uint8_t *glyph; + + uint8_t width; /**< Pixel width of character cell. */ + uint8_t height; /**< Pixel height of character cell. */ + + uint8_t first; /**< First encoded character in glyph array. */ + uint8_t last; /**< Last encoded character in glyph array (inclusive). */ + + /** Array of glyph offsets in bytes. NULL for fixed-width fonts. */ + const pgm_uint16_t *offset; + const pgm_uint8_t *widths; + +} Font; + + +/** Return true if glyph \a c is available in \a font. */ +#define FONT_HAS_GLYPH(font, c) ((c) >= (font)->first && (c) <= (font)->last) + + +/** The default font. */ +#define default_font font_luBS14 +extern const struct Font default_font; + +#endif /* GFX_FONT_H */ diff --git a/2.5/bertos/gfx/font_10x20.c b/2.5/bertos/gfx/font_10x20.c new file mode 100644 index 00000000..51911c12 --- /dev/null +++ b/2.5/bertos/gfx/font_10x20.c @@ -0,0 +1,5740 @@ +/* Generated by convbdf on Fri Feb 10 01:05:15 CET 2006. */ +#include "font.h" + +/* Font information: + + name: -Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO8859-1 + pixel size: 20 + ascent: 16 + descent: 4 +*/ + +/* Font character bitmap data. */ +static const PROGMEM uint8_t font_10x20_glyphs[] = { + +/* Character (0x00): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | *** *** | + | * * | + | * * | + | | + | | + | * * | + | * * | + | * * | + | | + | | + | * * | + | * * | + | *** *** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0073, 0x0080, +0x0040, 0x0080, +0x0040, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0040, 0x0080, +0x0040, 0x0080, +0x0040, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0040, 0x0080, +0x0040, 0x0080, +0x0073, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x01): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | ** | + | **** | + | ****** | + | ******** | + | ******** | + | ****** | + | **** | + | ** | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x001e, 0x0000, +0x003f, 0x0000, +0x007f, 0x0080, +0x007f, 0x0080, +0x003f, 0x0000, +0x001e, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x02): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | * * * * * | + |* * * * * | + | * * * * * | + |* * * * * | + | * * * * * | + |* * * * * | + | * * * * * | + |* * * * * | + | * * * * * | + |* * * * * | + | * * * * * | + |* * * * * | + | * * * * * | + |* * * * * | + | * * * * * | + |* * * * * | + | * * * * * | + |* * * * * | + | * * * * * | + |* * * * * | + +----------------+ */ +0x0055, 0x0040, +0x00aa, 0x0080, +0x0055, 0x0040, +0x00aa, 0x0080, +0x0055, 0x0040, +0x00aa, 0x0080, +0x0055, 0x0040, +0x00aa, 0x0080, +0x0055, 0x0040, +0x00aa, 0x0080, +0x0055, 0x0040, +0x00aa, 0x0080, +0x0055, 0x0040, +0x00aa, 0x0080, +0x0055, 0x0040, +0x00aa, 0x0080, +0x0055, 0x0040, +0x00aa, 0x0080, +0x0055, 0x0040, +0x00aa, 0x0080, + +/* Character (0x03): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ****** | + | ** ** | + | ** ** | + | ** ** | + | | + | ****** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0066, 0x0000, +0x0066, 0x0000, +0x0066, 0x0000, +0x007e, 0x0000, +0x0066, 0x0000, +0x0066, 0x0000, +0x0066, 0x0000, +0x0000, 0x0000, +0x001f, 0x0080, +0x0006, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x04): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | ***** | + | ** | + | ** | + | **** | + | ** | + | ** | + | ** | + | ***** | + | ** | + | ** | + | **** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x007c, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0078, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x000f, 0x0080, +0x000c, 0x0000, +0x000c, 0x0000, +0x000f, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x05): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | **** | + | ** ** | + | ** | + | ** | + | ** ** | + | **** | + | | + | ***** | + | ** ** | + | ** ** | + | ***** | + | **** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x003c, 0x0000, +0x0066, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0066, 0x0000, +0x003c, 0x0000, +0x0000, 0x0000, +0x001f, 0x0000, +0x0019, 0x0080, +0x0019, 0x0080, +0x001f, 0x0000, +0x001e, 0x0000, +0x001b, 0x0000, +0x0019, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x06): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | ***** | + | | + | ***** | + | ** | + | ** | + | **** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x003e, 0x0000, +0x0000, 0x0000, +0x000f, 0x0080, +0x000c, 0x0000, +0x000c, 0x0000, +0x000f, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x07): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | **** | + | ** ** | + | ** ** | + | **** | + | ** | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x001e, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x08): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | ** | + | ** | + | ******** | + | ** | + | ** | + | | + | ******** | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x007f, 0x0080, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x007f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x09): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | ** ** | + | *** ** | + | ****** | + | ****** | + | ** *** | + | ** ** | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ***** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0066, 0x0000, +0x0076, 0x0000, +0x007e, 0x0000, +0x007e, 0x0000, +0x006e, 0x0000, +0x0066, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x0a): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | ** ** | + | ** ** | + | ** ** | + | **** | + | **** | + | ** | + | ** | + | | + | ****** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0066, 0x0000, +0x0066, 0x0000, +0x0066, 0x0000, +0x003c, 0x0000, +0x003c, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0000, 0x0000, +0x001f, 0x0080, +0x0006, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x0b): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + |***** | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x00f8, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x0c): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | | + |***** | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x00f8, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, + +/* Character (0x0d): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | | + | ****** | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000f, 0x00c0, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, + +/* Character (0x0e): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | ****** | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x000f, 0x00c0, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x0f): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + |********** | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + +----------------+ */ +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x00ff, 0x00c0, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, + +/* Character (0x10): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + |********** | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x00ff, 0x00c0, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x11): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + |********** | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x00ff, 0x00c0, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x12): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | | + |********** | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x00ff, 0x00c0, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x13): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + |********** | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x00ff, 0x00c0, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x14): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + |********** | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x00ff, 0x00c0, + +/* Character (0x15): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | ****** | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + +----------------+ */ +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x000f, 0x00c0, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, + +/* Character (0x16): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + |***** | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + +----------------+ */ +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x00f8, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, + +/* Character (0x17): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + |********** | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x00ff, 0x00c0, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x18): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | | + |********** | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x00ff, 0x00c0, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, + +/* Character (0x19): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + | * | + +----------------+ */ +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, +0x0008, 0x0000, + +/* Character (0x1a): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | *** | + | *** | + | *** | + |*** | + | *** | + | *** | + | *** | + | | + | | + |********* | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0003, 0x0080, +0x000e, 0x0000, +0x0038, 0x0000, +0x00e0, 0x0000, +0x0038, 0x0000, +0x000e, 0x0000, +0x0003, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x00ff, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x1b): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + |*** | + | *** | + | *** | + | *** | + | *** | + | *** | + |*** | + | | + | | + |********* | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x00e0, 0x0000, +0x0038, 0x0000, +0x000e, 0x0000, +0x0003, 0x0080, +0x000e, 0x0000, +0x0038, 0x0000, +0x00e0, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x00ff, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x1c): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ******** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007f, 0x0080, +0x0033, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x1d): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | ** | + | ** | + | ** | + | ******** | + | ** | + | ** | + | ******** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0006, 0x0000, +0x007f, 0x0080, +0x000c, 0x0000, +0x000c, 0x0000, +0x007f, 0x0080, +0x0018, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x1e): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** | + | ** | + | ****** | + | ** | + | ** | + | ** | + | ***** | + | * * ** ** | + | *** *** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000f, 0x0000, +0x0019, 0x0080, +0x0019, 0x0080, +0x0018, 0x0000, +0x0018, 0x0000, +0x007e, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x007c, 0x0000, +0x0056, 0x00c0, +0x0073, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x1f): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | *** | + | *** | + | *** | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000e, 0x0000, +0x000e, 0x0000, +0x000e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x20): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x21): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x22): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | * * | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x0012, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x23): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ******** | + | ** ** | + | ** ** | + | ** ** | + | ******** | + | ** ** | + | ** ** | + | ** ** | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000d, 0x0080, +0x000d, 0x0080, +0x000d, 0x0080, +0x003f, 0x00c0, +0x001b, 0x0000, +0x001b, 0x0000, +0x001b, 0x0000, +0x007f, 0x0080, +0x0036, 0x0000, +0x0036, 0x0000, +0x0036, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x24): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | ****** | + | ** ** ** | + | ** ** | + | ** ** | + | ** ** | + | ****** | + | ** ** | + | ** ** | + | ** ** | + | ** ** ** | + | ****** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x003f, 0x0000, +0x006d, 0x0080, +0x006c, 0x0000, +0x006c, 0x0000, +0x006c, 0x0000, +0x003f, 0x0000, +0x000d, 0x0080, +0x000d, 0x0080, +0x000d, 0x0080, +0x006d, 0x0080, +0x003f, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x25): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | *** ** | + | ** ** ** | + | ** **** | + | *** ** | + | ** | + | ** | + | ** | + | ** | + | ** *** | + | **** ** | + | ** ** ** | + | ** *** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0039, 0x0080, +0x006d, 0x0080, +0x006f, 0x0000, +0x003b, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x001b, 0x0080, +0x001e, 0x00c0, +0x0036, 0x00c0, +0x0033, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x26): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | *** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | ** | + | *** | + | ** ** | + | ** ** ** | + | ** *** | + | ** ** | + | *** **** | + | **** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001c, 0x0000, +0x0036, 0x0000, +0x0036, 0x0000, +0x0036, 0x0000, +0x003c, 0x0000, +0x0018, 0x0000, +0x0038, 0x0000, +0x006c, 0x0000, +0x0066, 0x00c0, +0x0063, 0x0080, +0x0063, 0x0000, +0x0077, 0x0080, +0x003c, 0x00c0, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x27): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | ** | + | ** | + | ** | + | * | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0008, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x28): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0003, 0x0000, +0x0006, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0006, 0x0000, +0x0003, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x29): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0030, 0x0000, +0x0018, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0018, 0x0000, +0x0030, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x2a): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | ** ** | + | ** ** | + | **** | + | ******** | + | **** | + | ** ** | + | ** ** | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x001e, 0x0000, +0x007f, 0x0080, +0x001e, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x2b): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | ** | + | ** | + | ** | + | ******** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x007f, 0x0080, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x2c): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | *** | + | *** | + | *** | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000e, 0x0000, +0x000e, 0x0000, +0x001c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x2d): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | | + | ******** | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x2e): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | *** | + | *** | + | *** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000e, 0x0000, +0x000e, 0x0000, +0x000e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x2f): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0001, 0x0080, +0x0001, 0x0080, +0x0003, 0x0000, +0x0003, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x30): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x0033, 0x0000, +0x001e, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x31): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | *** | + | **** | + | ** ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ******** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x001c, 0x0000, +0x003c, 0x0000, +0x006c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x007f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x32): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** | + | ** | + | ** | + | *** | + | ** | + | ** | + | ** | + | ** | + | ******** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0003, 0x0000, +0x000e, 0x0000, +0x0018, 0x0000, +0x0030, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x007f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x33): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** | + | ** | + | *** | + | ** | + | ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0001, 0x0080, +0x0003, 0x0000, +0x000e, 0x0000, +0x0003, 0x0000, +0x0001, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x34): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | * | + | ** | + | *** | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ******** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0001, 0x0000, +0x0003, 0x0000, +0x0007, 0x0000, +0x000f, 0x0000, +0x001b, 0x0000, +0x0033, 0x0000, +0x0063, 0x0000, +0x0063, 0x0000, +0x007f, 0x0080, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x35): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ******** | + | ** | + | ** | + | ** | + | ** | + | ** *** | + | *** ** | + | ** | + | ** | + | ** | + | ** ** | + | ** ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007f, 0x0080, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x006e, 0x0000, +0x0073, 0x0000, +0x0001, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x36): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** * | + | ** | + | ** | + | ** *** | + | *** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x006e, 0x0000, +0x0073, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x37): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ******** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007f, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0003, 0x0000, +0x0003, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x38): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x39): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** *** | + | *** ** | + | ** | + | ** | + | * ** | + | ** ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0080, +0x001d, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0021, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x3a): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | *** | + | *** | + | | + | | + | | + | | + | *** | + | *** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000e, 0x0000, +0x000e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000e, 0x0000, +0x000e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x3b): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | *** | + | *** | + | | + | | + | | + | | + | *** | + | *** | + | *** | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000e, 0x0000, +0x000e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000e, 0x0000, +0x000e, 0x0000, +0x001c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x3c): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | * | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | * | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0001, 0x0000, +0x0003, 0x0000, +0x0006, 0x0000, +0x000c, 0x0000, +0x0018, 0x0000, +0x0030, 0x0000, +0x0060, 0x0000, +0x0030, 0x0000, +0x0018, 0x0000, +0x000c, 0x0000, +0x0006, 0x0000, +0x0003, 0x0000, +0x0001, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x3d): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | ******** | + | | + | | + | | + | | + | ******** | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x3e): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | * | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | * | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0020, 0x0000, +0x0030, 0x0000, +0x0018, 0x0000, +0x000c, 0x0000, +0x0006, 0x0000, +0x0003, 0x0000, +0x0001, 0x0080, +0x0003, 0x0000, +0x0006, 0x0000, +0x000c, 0x0000, +0x0018, 0x0000, +0x0030, 0x0000, +0x0020, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x3f): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0003, 0x0000, +0x0006, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x40): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** **** | + | ** ***** | + | ** ** ** | + | ** ** ** | + | ** ** ** | + | ** **** | + | ** ** | + | ** | + | ** ** | + | ***** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0067, 0x0080, +0x006f, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x006f, 0x0000, +0x0066, 0x0000, +0x0060, 0x0000, +0x0031, 0x0080, +0x001f, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x41): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ******** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x007f, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x42): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ***** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ****** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ****** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007c, 0x0000, +0x0066, 0x0000, +0x0063, 0x0000, +0x0063, 0x0000, +0x0063, 0x0000, +0x0066, 0x0000, +0x007e, 0x0000, +0x0063, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0063, 0x0000, +0x007e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x43): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** ** | + | ** ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0061, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x44): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ****** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ****** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007e, 0x0000, +0x0063, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0063, 0x0000, +0x007e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x45): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ******** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ****** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ******** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007f, 0x0080, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x007e, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x007f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x46): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ******** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ****** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007f, 0x0080, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x007e, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x47): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** | + | ** | + | ** | + | ** **** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** *** | + | **** * | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0067, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0080, +0x001e, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x48): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ******** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x007f, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x49): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ******** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ******** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007f, 0x0080, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x007f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x4a): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ****** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** ** | + | ** ** | + | ** ** | + | *** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000f, 0x00c0, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0063, 0x0000, +0x0063, 0x0000, +0x0036, 0x0000, +0x001c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x4b): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ***** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0063, 0x0000, +0x0063, 0x0000, +0x0066, 0x0000, +0x0066, 0x0000, +0x007c, 0x0000, +0x0066, 0x0000, +0x0066, 0x0000, +0x0063, 0x0000, +0x0063, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x4c): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ******** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x007f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x4d): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** ** | + | ** ** | + | *** *** | + | *** *** | + | ******** | + | ** ** ** | + | ** ** ** | + | ** ** ** | + | ** ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0073, 0x0080, +0x0073, 0x0080, +0x007f, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x4e): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** ** | + | *** ** | + | *** ** | + | **** ** | + | **** ** | + | ** ** ** | + | ** ** ** | + | ** **** | + | ** **** | + | ** *** | + | ** *** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0071, 0x0080, +0x0071, 0x0080, +0x0079, 0x0080, +0x0079, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x0067, 0x0080, +0x0067, 0x0080, +0x0063, 0x0080, +0x0063, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x4f): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x50): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ****** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ****** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007e, 0x0000, +0x0063, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0063, 0x0000, +0x007e, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x51): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** ** | + | ** **** | + | ** ** | + | ***** | + | ** | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x006d, 0x0080, +0x0067, 0x0080, +0x0033, 0x0000, +0x001f, 0x0000, +0x0001, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x52): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ****** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ****** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007e, 0x0000, +0x0063, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0063, 0x0000, +0x007e, 0x0000, +0x0066, 0x0000, +0x0063, 0x0000, +0x0063, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x53): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** | + | ** | + | ** | + | **** | + | ** | + | ** | + | ** | + | ** ** | + | ** ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0060, 0x0000, +0x0060, 0x0000, +0x0030, 0x0000, +0x001e, 0x0000, +0x0003, 0x0000, +0x0001, 0x0080, +0x0001, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x54): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ******** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007f, 0x0080, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x55): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x56): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | **** | + | **** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x001e, 0x0000, +0x001e, 0x0000, +0x001e, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x57): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** ** | + | ** ** ** | + | ** ** ** | + | ** ** ** | + | *** *** | + | *** *** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x0073, 0x0080, +0x0073, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x58): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | **** | + | ** | + | **** | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x0033, 0x0000, +0x001e, 0x0000, +0x001e, 0x0000, +0x000c, 0x0000, +0x001e, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x59): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | **** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x0033, 0x0000, +0x001e, 0x0000, +0x001e, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x5a): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ******** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ******** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007f, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0003, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x000c, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0030, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x007f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x5b): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ****** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ****** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x003f, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x003f, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x5c): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0006, 0x0000, +0x0006, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0001, 0x0080, +0x0001, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x5d): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ****** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ****** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x003f, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x0003, 0x0000, +0x003f, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x5e): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | **** | + | ** ** | + | ** ** | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x5f): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | ********* | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x007f, 0x00c0, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x60): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | ** | + | ** | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0018, 0x0000, +0x000c, 0x0000, +0x0006, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x61): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ***** | + | ** ** | + | ** | + | ******* | + | ** ** | + | ** ** | + | ** ** | + | ***** * | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001f, 0x0000, +0x0031, 0x0080, +0x0001, 0x0080, +0x003f, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x003e, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x62): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** *** | + | *** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | *** ** | + | ** *** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x006e, 0x0000, +0x0073, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0073, 0x0000, +0x006e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x63): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ***** | + | ** ** | + | ** | + | ** | + | ** | + | ** | + | ** ** | + | ***** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001f, 0x0000, +0x0031, 0x0080, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0031, 0x0080, +0x001f, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x64): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | *** ** | + | ** *** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** *** | + | *** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0001, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x001d, 0x0080, +0x0033, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0080, +0x001d, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x65): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ******** | + | ** | + | ** | + | ** ** | + | ***** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x007f, 0x0080, +0x0060, 0x0000, +0x0060, 0x0000, +0x0031, 0x0080, +0x001f, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x66): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** | + | ** | + | ****** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000f, 0x0000, +0x0019, 0x0080, +0x0019, 0x0080, +0x0018, 0x0000, +0x0018, 0x0000, +0x007e, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x67): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ***** * | + | ** *** | + | ** ** | + | ** ** | + | ** ** | + | ***** | + | ** | + | ****** | + | ** ** | + | ** ** | + | ** ** | + | ****** | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x003e, 0x0080, +0x0063, 0x0080, +0x0063, 0x0000, +0x0063, 0x0000, +0x0063, 0x0000, +0x003e, 0x0000, +0x0060, 0x0000, +0x003f, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x003f, 0x0000, + +/* Character (0x68): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** *** | + | *** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x006e, 0x0000, +0x0073, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x69): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | ** | + | ** | + | | + | **** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ******** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x003c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x007f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x6a): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | ** | + | ** | + | | + | **** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** ** | + | ** ** | + | ** ** | + | ***** | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0001, 0x0080, +0x0001, 0x0080, +0x0000, 0x0000, +0x0007, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0031, 0x0080, +0x0031, 0x0080, +0x0031, 0x0080, +0x001f, 0x0000, + +/* Character (0x6b): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | ***** | + | ** ** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0063, 0x0000, +0x0066, 0x0000, +0x006c, 0x0000, +0x0078, 0x0000, +0x007c, 0x0000, +0x0066, 0x0000, +0x0063, 0x0000, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x6c): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ******** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x003c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x007f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x6d): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | * ** ** | + | ******** | + | ** ** ** | + | ** ** ** | + | ** ** ** | + | ** ** ** | + | ** ** ** | + | ** ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x005b, 0x0000, +0x007f, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x6e): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ** *** | + | *** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x006e, 0x0000, +0x0073, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x6f): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | **** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x70): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ** *** | + | *** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | *** ** | + | ** *** | + | ** | + | ** | + | ** | + | ** | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x006e, 0x0000, +0x0073, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0073, 0x0000, +0x006e, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, +0x0060, 0x0000, + +/* Character (0x71): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | *** ** | + | ** *** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** *** | + | *** ** | + | ** | + | ** | + | ** | + | ** | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x001d, 0x0080, +0x0033, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0080, +0x001d, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, +0x0001, 0x0080, + +/* Character (0x72): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ** **** | + | *** ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x006f, 0x0000, +0x0039, 0x0080, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0030, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x73): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ****** | + | ** ** | + | ** | + | ****** | + | ** | + | ** | + | ** ** | + | ****** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x003f, 0x0000, +0x0061, 0x0080, +0x0060, 0x0000, +0x003f, 0x0000, +0x0001, 0x0080, +0x0001, 0x0080, +0x0061, 0x0080, +0x003f, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x74): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | ** | + | ** | + | ** | + | ****** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x007e, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0018, 0x0000, +0x0019, 0x0080, +0x000f, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x75): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** *** | + | *** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0080, +0x001d, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x76): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | **** | + | **** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x0033, 0x0000, +0x001e, 0x0000, +0x001e, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x77): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ** ** ** | + | ** ** ** | + | ** ** ** | + | ******** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x006d, 0x0080, +0x007f, 0x0080, +0x0033, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x78): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ** ** | + | ** ** | + | **** | + | ** | + | ** | + | **** | + | ** ** | + | ** ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x001e, 0x0000, +0x0033, 0x0000, +0x0061, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x79): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** ** | + | ** *** | + | *** ** | + | ** | + | ** ** | + | ** ** | + | **** | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0061, 0x0080, +0x0033, 0x0080, +0x001d, 0x0080, +0x0001, 0x0080, +0x0061, 0x0080, +0x0033, 0x0000, +0x001e, 0x0000, + +/* Character (0x7a): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | | + | | + | | + | | + | | + | ******* | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ******* | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x003f, 0x0080, +0x0001, 0x0080, +0x0003, 0x0000, +0x0006, 0x0000, +0x000c, 0x0000, +0x0018, 0x0000, +0x0030, 0x0000, +0x003f, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x7b): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** | + | ** | + | ** | + | ** | + | ** | + | **** | + | ** | + | ** | + | ** | + | ** | + | ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0007, 0x0080, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0078, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0007, 0x0080, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x7c): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | ** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x7d): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | **** | + | ** | + | ** | + | ** | + | ** | + | ** | + | **** | + | ** | + | ** | + | ** | + | ** | + | ** | + | **** | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0078, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0007, 0x0080, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x000c, 0x0000, +0x0078, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, + +/* Character (0x7e): + bbw=10, bbh=20, bbx=0, bby=-4, width=10 + +----------------+ + | | + | | + | | + | *** ** | + | ** ** ** | + | ** *** | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + | | + +----------------+ */ +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0039, 0x0080, +0x006d, 0x0080, +0x0067, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +0x0000, 0x0000, +}; + +#warning TODO: Fill the structure with missing parameter (see font.h for more detail). +/* Exported structure definition. */ +#if 0 +Font font_10x20 = { + font_10x20_glyphs, + 10, + 20 +}; +#endif + diff --git a/2.5/bertos/gfx/gfx.h b/2.5/bertos/gfx/gfx.h new file mode 100644 index 00000000..971c1298 --- /dev/null +++ b/2.5/bertos/gfx/gfx.h @@ -0,0 +1,237 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Graphics private header. + */ + +/*#* + *#* $Log$ + *#* Revision 1.7 2006/07/19 12:56:26 bernie + *#* Convert to new Doxygen style. + *#* + *#* Revision 1.6 2006/05/27 17:17:34 bernie + *#* Optimize away divisions in RAST_ADDR/MASK macros. + *#* + *#* Revision 1.5 2006/05/25 23:35:40 bernie + *#* Cleanup. + *#* + *#* Revision 1.4 2006/03/22 09:50:37 bernie + *#* Use the same format for fonts and rasters. + *#* + *#* Revision 1.3 2006/02/15 09:10:15 bernie + *#* Implement prop fonts; Fix algo styles. + *#* + *#* Revision 1.2 2006/02/10 12:28:33 bernie + *#* Add font support in bitmaps; Make bitmap formats public. + *#* + *#* Revision 1.1 2006/01/26 00:32:49 bernie + *#* Graphics private header. + *#* + *#*/ + +#ifndef GFX_GFX_P_H +#define GFX_GFX_P_H + +#include + +#if CONFIG_BITMAP_FMT == BITMAP_FMT_PLANAR_H_MSB + + /* We use ucoord_t to let the compiler optimize away the division/modulo. */ + #define RAST_ADDR(raster, x, y, stride) \ + ((raster) + (ucoord_t)(y) * (ucoord_t)(stride) + (ucoord_t)(x) / 8) + #define RAST_MASK(raster, x, y) \ + (1 << (7 - (ucoord_t)(x) % 8)) + +#elif CONFIG_BITMAP_FMT == BITMAP_FMT_PLANAR_V_LSB + + /* We use ucoord_t to let the compiler optimize away the division/modulo. */ + #define RAST_ADDR(raster, x, y, stride) \ + ((raster) + ((ucoord_t)(y) / 8) * (ucoord_t)(stride) + (ucoord_t)(x)) + #define RAST_MASK(raster, x, y) \ + (1 << ((ucoord_t)(y) % 8)) + +#else + #error Unknown value of CONFIG_BITMAP_FMT +#endif /* CONFIG_BITMAP_FMT */ + +#define BM_ADDR(bm, x, y) RAST_ADDR((bm)->raster, (x), (y), (bm)->stride) +#define BM_MASK(bm, x, y) RAST_MASK((bm)->raster, (x), (y)) + +/** + * Plot a pixel in bitmap \a bm. + * + * \note bm is evaluated twice. + * \see BM_CLEAR BM_DRAWPIXEL + */ +#define BM_PLOT(bm, x, y) \ + ( *BM_ADDR(bm, x, y) |= BM_MASK(bm, x, y) ) + +/** + * Clear a pixel in bitmap \a bm. + * + * \note bm is evaluated twice. + * \see BM_PLOT BM_DRAWPIXEL + */ +#define BM_CLEAR(bm, x, y) \ + ( *BM_ADDR(bm, x, y) &= ~BM_MASK(bm, x, y) ) + +/** + * Set a pixel in bitmap \a bm to the specified color. + * + * \note bm is evaluated twice. + * \note This macro is somewhat slower than BM_PLOT and BM_CLEAR. + * \see BM_PLOT BM_CLEAR + */ +#define BM_DRAWPIXEL(bm, x, y, fg_pen) \ + do { \ + uint8_t *p = BM_ADDR(bm, x, y); \ + uint8_t mask = BM_MASK(bm, x, y); \ + *p = (*p & ~mask) | ((fg_pen) ? mask : 0); \ + } while (0) + +/** + * Get the value of the pixel in bitmap \a bm. + * + * \return The returned value is either 0 or 1. + * + * \note bm is evaluated twice. + * \see BM_DRAWPIXEL + */ +#define BM_READPIXEL(bm, x, y) \ + ( *BM_ADDR(bm, x, y) & BM_MASK(bm, x, y) ? 1 : 0 ) + +#define RAST_READPIXEL(raster, x, y, stride) \ + ( *RAST_ADDR(raster, x, y, stride) & RAST_MASK(raster, x, y) ? 1 : 0 ) + +#endif /* GFX_GFX_P_H */ diff --git a/2.5/bertos/gfx/line.c b/2.5/bertos/gfx/line.c new file mode 100644 index 00000000..4d756fe6 --- /dev/null +++ b/2.5/bertos/gfx/line.c @@ -0,0 +1,409 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + * \brief Line drawing graphics routines + * \sa gfx.h + */ + +#include "gfx.h" +#include "gfx_p.h" + +#include "cfg/cfg_gfx.h" /* CONFIG_GFX_CLIPPING */ +#include /* ASSERT() */ +#include /* SWAP() */ + +/* Configuration sanity checks */ +#if !defined(CONFIG_GFX_CLIPPING) || (CONFIG_GFX_CLIPPING != 0 && CONFIG_GFX_CLIPPING != 1) + #error CONFIG_GFX_CLIPPING must be defined to either 0 or 1 +#endif +#if !defined(CONFIG_GFX_VCOORDS) || (CONFIG_GFX_VCOORDS != 0 && CONFIG_GFX_VCOORDS != 1) + #error CONFIG_GFX_VCOORDS must be defined to either 0 or 1 +#endif + +/** + * Draw a sloped line without performing clipping. + * + * Parameters are the same of gfx_line(). + * This routine is based on the Bresenham Line-Drawing Algorithm. + * + * \note Passing coordinates outside the bitmap boundaries will + * result in memory trashing. + * + * \todo Optimize for vertical and horiziontal lines. + * + * \sa gfx_line() + */ +static void gfx_lineUnclipped(Bitmap *bm, coord_t x1, coord_t y1, coord_t x2, coord_t y2) +{ + int x, y, e, len, adx, ady, signx, signy; + + if (x2 > x1) + { + /* left to right */ + signx = +1; + adx = x2 - x1; + } + else + { + /* right to left */ + signx = -1; + adx = x1 - x2; + } + + if (y2 > y1) + { + /* top to bottom */ + signy = +1; + ady = y2 - y1; + } + else + { + /* bottom to top */ + signy = -1; + ady = y1 - y2; + } + + x = x1; + y = y1; + + if (adx > ady) + { + /* X-major line (octants 1/4/5/8) */ + + len = adx; + e = -adx; + while (len--) + { + /* Sanity check */ + ASSERT((x >= 0) && (x < bm->width) && (y >= 0) && (y < bm->height)); + BM_PLOT(bm, x, y); + x += signx; + e += ady; + if (e >= 0) + { + y += signy; + e -= adx; + } + } + } + else + { + /* Y-major line (octants 2/3/6/7) */ + + len = ady; + e = -ady; + while (len--) + { + /* Sanity check */ + ASSERT ((x >= 0) && (x < bm->width) && (y >= 0) && (y < bm->height)); + BM_PLOT(bm, x, y); + y += signy; + e += adx; + if (e >= 0) + { + x += signx; + e -= ady; + } + } + } +} + +#if CONFIG_GFX_CLIPPING + +/// Helper routine for gfx_line(). +static int gfx_findRegion(int x, int y, Rect *cr) +{ + int code = 0; + + if (y >= cr->ymax) + code |= 1; /* below */ + else if (y < cr->ymin) + code |= 2; /* above */ + + if (x >= cr->xmax) + code |= 4; /* right */ + else if (x < cr->xmin) + code |= 8; /* left */ + + return code; +} + +#endif /* CONFIG_CLIPPING */ + +/** + * Draw a sloped line segment. + * + * Draw a sloped line segment identified by the provided + * start and end coordinates on the bitmap \a bm. + * + * The line endpoints are clipped inside the current bitmap + * clipping rectangle using the Cohen-Sutherland algorithm, + * which is very fast. + * + * \note The point at coordinates \a x2 \a y2 is not drawn. + * + * \note This function does \b not update the current pen position. + * + * \todo Compute updated Bresenham error term. + */ +void gfx_line(Bitmap *bm, coord_t x1, coord_t y1, coord_t x2, coord_t y2) +{ +#if CONFIG_GFX_CLIPPING + int clip1 = gfx_findRegion(x1, y1, &bm->cr); + int clip2 = gfx_findRegion(x2, y2, &bm->cr); + + /* Loop while there is at least one point outside */ + while (clip1 | clip2) + { + /* Check for line totally outside */ + if (clip1 & clip2) + return; + + int c = clip1 ? clip1 : clip2; + int x, y; + + if (c & 1) /* Below */ + { + x = x1 + (x2 - x1) * (bm->cr.ymax - y1) / (y2 - y1); + y = bm->cr.ymax - 1; + } + else if (c & 2) /* Above */ + { + x = x1 + (x2 - x1) * (bm->cr.ymin - y1) / (y2 - y1); + y = bm->cr.ymin; + } + else if (c & 4) /* Right */ + { + y = y1 + (y2 - y1) * (bm->cr.xmax - x1) / (x2 - x1); + x = bm->cr.xmax - 1; + } + else /* Left */ + { + y = y1 + (y2 - y1) * (bm->cr.xmin - x1) / (x2 - x1); + x = bm->cr.xmin; + } + + if (c == clip1) /* First endpoint was clipped */ + { + // TODO: adjust Bresenham error term + //coord_t clipdx = ABS(x - x1); + //coord_t clipdy = ABS(y - y1); + //e += (clipdy * e2) + ((clipdx - clipdy) * e1); + + x1 = x; + y1 = y; + clip1 = gfx_findRegion(x1, y1, &bm->cr); + } + else /* Second endpoint was clipped */ + { + x2 = x; + y2 = y; + clip2 = gfx_findRegion(x2, y2, &bm->cr); + } + } +#endif /* CONFIG_GFX_CLIPPING */ + + gfx_lineUnclipped(bm, x1, y1, x2, y2); +} + +/** + * Move the current pen position to the specified coordinates. + * + * The pen position is used for drawing operations such as + * gfx_lineTo(), which can be used to draw polygons. + */ +void gfx_moveTo(Bitmap *bm, coord_t x, coord_t y) +{ + bm->penX = x; + bm->penY = y; +} + +/** + * Draw a line from the current pen position to the new coordinates. + * + * \note This function moves the current pen position to the + * new coordinates. + * + * \sa gfx_line() + */ +void gfx_lineTo(Bitmap *bm, coord_t x, coord_t y) +{ + gfx_line(bm, bm->penX, bm->penY, x, y); + gfx_moveTo(bm, x, y); +} + + +/** + * Draw the perimeter of an hollow rectangle. + * + * \note The bottom-right corner of the rectangle is drawn at (x2-1;y2-1). + * \note This function does \b not update the current pen position. + */ +void gfx_rectDraw(Bitmap *bm, coord_t x1, coord_t y1, coord_t x2, coord_t y2) +{ + /* Sort coords (needed for correct bottom-right semantics) */ + if (x1 > x2) SWAP(x1, x2); + if (y1 > y2) SWAP(y1, y2); + + /* Draw rectangle */ + gfx_line(bm, x1, y1, x2-1, y1); + gfx_line(bm, x2-1, y1, x2-1, y2-1); + gfx_line(bm, x2-1, y2-1, x1, y2-1); + gfx_line(bm, x1, y2-1, x1, y1); +} + + +/** + * Fill a rectangular area with \a color. + * + * \note The bottom-right border of the rectangle is not drawn. + * + * \note This function does \b not update the current pen position. + */ +void gfx_rectFillC(Bitmap *bm, coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t color) +{ + coord_t x, y; + + /* Sort coords */ + if (x1 > x2) SWAP(x1, x2); + if (y1 > y2) SWAP(y1, y2); + +#if CONFIG_GFX_CLIPPING + /* Clip rect to bitmap clip region */ + if (x1 < bm->cr.xmin) x1 = bm->cr.xmin; + if (x2 < bm->cr.xmin) x2 = bm->cr.xmin; + if (x1 > bm->cr.xmax) x1 = bm->cr.xmax; + if (x2 > bm->cr.xmax) x2 = bm->cr.xmax; + if (y1 < bm->cr.ymin) y1 = bm->cr.ymin; + if (y2 < bm->cr.ymin) y2 = bm->cr.ymin; + if (y1 > bm->cr.ymax) y1 = bm->cr.ymax; + if (y2 > bm->cr.ymax) y2 = bm->cr.ymax; +#endif /* CONFIG_GFX_CLIPPING */ + + /* NOTE: Code paths are duplicated for efficiency */ + if (color) /* fill */ + { + for (x = x1; x < x2; x++) + for (y = y1; y < y2; y++) + BM_PLOT(bm, x, y); + } + else /* clear */ + { + for (x = x1; x < x2; x++) + for (y = y1; y < y2; y++) + BM_CLEAR(bm, x, y); + } +} + + +/** + * Draw a filled rectangle. + * + * \note The bottom-right border of the rectangle is not drawn. + * + * \note This function does \b not update the current pen position. + */ +void gfx_rectFill(Bitmap *bm, coord_t x1, coord_t y1, coord_t x2, coord_t y2) +{ + gfx_rectFillC(bm, x1, y1, x2, y2, 0xFF); +} + + +/** + * Clear a rectangular area. + * + * \note The bottom-right border of the rectangle is not cleared. + * + * \note This function does \b not update the current pen position. + */ +void gfx_rectClear(Bitmap *bm, coord_t x1, coord_t y1, coord_t x2, coord_t y2) +{ + gfx_rectFillC(bm, x1, y1, x2, y2, 0x00); +} + + +#if CONFIG_GFX_VCOORDS +/** + * Imposta gli estremi del sistema di coordinate cartesiane rispetto + * al rettangolo di clipping della bitmap. + */ +void gfx_setViewRect(Bitmap *bm, vcoord_t x1, vcoord_t y1, vcoord_t x2, vcoord_t y2) +{ + ASSERT(x1 != x2); + ASSERT(y1 != y2); + + bm->orgX = x1; + bm->orgY = y1; + bm->scaleX = (vcoord_t)(bm->cr.xmax - bm->cr.xmin - 1) / (vcoord_t)(x2 - x1); + bm->scaleY = (vcoord_t)(bm->cr.ymax - bm->cr.ymin - 1) / (vcoord_t)(y2 - y1); + +/* DB(kprintf("orgX = %f, orgY = %f, scaleX = %f, scaleY = %f\n", + bm->orgX, bm->orgY, bm->scaleX, bm->scaleY);) +*/ +} + + +/** + * Transform a coordinate from the current reference system to a + * pixel offset within the bitmap. + */ +coord_t gfx_transformX(Bitmap *bm, vcoord_t x) +{ + return bm->cr.xmin + (coord_t)((x - bm->orgX) * bm->scaleX); +} + +/** + * Transform a coordinate from the current reference system to a + * pixel offset within the bitmap. + */ +coord_t gfx_transformY(Bitmap *bm, vcoord_t y) +{ + return bm->cr.ymin + (coord_t)((y - bm->orgY) * bm->scaleY); +} + + +/** + * Draw a line from (x1;y1) to (x2;y2). + */ +void gfx_vline(Bitmap *bm, vcoord_t x1, vcoord_t y1, vcoord_t x2, vcoord_t y2) +{ + gfx_line(bm, + gfx_transformX(bm, x1), gfx_transformY(bm, y1), + gfx_transformY(bm, x2), gfx_transformY(bm, y2)); +} +#endif /* CONFIG_GFX_VCOORDS */ diff --git a/2.5/bertos/gfx/text.c b/2.5/bertos/gfx/text.c new file mode 100644 index 00000000..d827daa4 --- /dev/null +++ b/2.5/bertos/gfx/text.c @@ -0,0 +1,321 @@ +/** + * \file + * + * + * \version $Id$ + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + * \brief Text graphic routines + */ + +#include +#include +#include + +#include // FIXME: BM_DRAWPIXEL + +#include + + +/** + * ANSI escape sequences flag: true for ESC state on. + * + * \todo Move to Bitmap.flags. + */ +static bool ansi_mode = false; + +/** + * Move (imaginary) cursor to coordinates specified. + */ +void text_setCoord(struct Bitmap *bm, int x, int y) +{ + bm->penX = x; + bm->penY = y; +} + + +/** + * Move (imaginary) cursor to column and row specified. + * Next text write will start a that row and col. + */ +void text_moveTo(struct Bitmap *bm, int row, int col) +{ + ASSERT(col >= 0); + ASSERT(col < bm->width / bm->font->width); + ASSERT(row >= 0); + ASSERT(row < bm->height / bm->font->height); + + text_setCoord(bm, col * bm->font->width, row * bm->font->height); +} + + +/** + * Render char \a c on Bitmap \a bm. + */ +static int text_putglyph(char c, struct Bitmap *bm) +{ + const uint8_t * PROGMEM glyph; /* font is in progmem */ + uint8_t glyph_width, glyph_height, glyph_height_bytes; + unsigned char index = (unsigned char)c; + + /* Check for out of range char and replace with '?' or first char in font. */ + if (UNLIKELY(!FONT_HAS_GLYPH(bm->font, index))) + { + kprintf("Illegal char '%c' (0x%02x)\n", index, index); + if (FONT_HAS_GLYPH(bm->font, '?')) + index = '?'; + else + index = bm->font->first; + } + + /* Make character relative to font start */ + index -= bm->font->first; + + glyph_height = bm->font->height; + // FIXME: for vertical fonts only + glyph_height_bytes = (glyph_height + 7) / 8; + + if (bm->font->offset) + { + /* Proportional font */ + glyph_width = bm->font->widths[index]; /* TODO: optimize away */ + glyph = bm->font->glyph + bm->font->offset[index]; + } + else + { + /* + * Fixed-width font: compute the first column of pixels + * of the selected glyph using the character code to index + * the glyph array. + */ + glyph_width = bm->font->width; + + //For horizontal fonts + //glyph = bm->font->glyph + index * (((glyph_width + 7) / 8) * glyph_height); + glyph = bm->font->glyph + index * glyph_height_bytes * glyph_width; + } + + /* Slow path for styled glyphs */ + if (UNLIKELY(bm->styles)) + { + uint8_t styles = bm->styles; + uint8_t prev_dots = 0, italic_prev_dots = 0; + uint8_t dots; + uint8_t row, col, row_bit; + + /* + * To avoid repeating clipping and other expensive computations, + * we cluster calls to gfx_blitRaster() using a small buffer. + */ + #define CONFIG_TEXT_RENDER_OPTIMIZE 1 + #if CONFIG_TEXT_RENDER_OPTIMIZE + #define RENDER_BUF_WIDTH 12 + #define RENDER_BUF_HEIGHT 8 + uint8_t render_buf[RAST_SIZE(RENDER_BUF_WIDTH, RENDER_BUF_HEIGHT)]; + uint8_t render_xpos = 0; + #endif + + /* This style alone could be handled by the fast path too */ + if (bm->styles & STYLEF_CONDENSED) + --glyph_width; + + if (bm->styles & STYLEF_EXPANDED) + glyph_width *= 2; + + for (row = 0, row_bit = 0; row < glyph_height_bytes; ++row, row_bit += 8) + { + /* For each dot column in the glyph... */ + for (col = 0; col < glyph_width; ++col) + { + uint8_t src_col = col; + + /* Expanded style: advances only once every two columns. */ + if (styles & STYLEF_EXPANDED) + src_col /= 2; + + /* Fetch a column of dots from glyph. */ + dots = PGM_READ_CHAR(RAST_ADDR(glyph, src_col, row_bit, glyph_width)); + + /* Italic: get lower 4 dots from previous column */ + if (styles & STYLEF_ITALIC) + { + uint8_t new_dots = dots; + dots = (dots & 0xF0) | italic_prev_dots; + italic_prev_dots = new_dots & 0x0F; + } + + /* Bold: "or" pixels with the previous column */ + if (styles & STYLEF_BOLD) + { + uint8_t new_dots = dots; + dots |= prev_dots; + prev_dots = new_dots; + } + + /* Underlined: turn on base pixel */ + if ((styles & STYLEF_UNDERLINE) + && (row == glyph_height_bytes - 1)) + dots |= (1 << (glyph_height - row_bit - 1)); + + /* Inverted: invert pixels */ + if (styles & STYLEF_INVERT) + dots = ~dots; + + /* Output dots */ + #if CONFIG_TEXT_RENDER_OPTIMIZE + render_buf[render_xpos++] = dots; + if (render_xpos == RENDER_BUF_WIDTH) + { + gfx_blitRaster(bm, bm->penX + col - render_xpos + 1, bm->penY + row_bit, + render_buf, render_xpos, + MIN((uint8_t)RENDER_BUF_HEIGHT, (uint8_t)(glyph_height - row_bit)), + RENDER_BUF_WIDTH); + render_xpos = 0; + } + #else + gfx_blitRaster(bm, bm->penX + col, bm->penY + row_bit, + &dots, 1, MIN((uint8_t)8, glyph_height - row_bit), 1); + #endif + } + + #if CONFIG_TEXT_RENDER_OPTIMIZE + /* Flush out rest of render buffer */ + if (render_xpos != 0) + { + gfx_blitRaster(bm, bm->penX + col - render_xpos, bm->penY + row_bit, + render_buf, render_xpos, + MIN((uint8_t)RENDER_BUF_HEIGHT, (uint8_t)(glyph_height - row_bit)), + RENDER_BUF_WIDTH); + render_xpos = 0; + } + #endif + } + } + else + { + /* No style: fast vanilla copy of glyph to bitmap */ + gfx_blitRaster(bm, bm->penX, bm->penY, glyph, glyph_width, glyph_height, glyph_width); + } + + /* Update current pen position */ + bm->penX += glyph_width; + + return c; +} + + +/** + * Render char \c c, with (currently) limited ANSI escapes + * emulation support and '\n' for newline. + */ +int text_putchar(char c, struct Bitmap *bm) +{ + /* Handle ANSI escape sequences */ + if (UNLIKELY(ansi_mode)) + { + switch (c) + { + case ANSI_ESC_CLEARSCREEN: + gfx_bitmapClear(bm); + bm->penX = 0; + bm->penY = 0; + text_style(bm, 0, STYLEF_MASK); + break; + DB(default: + kprintf("Unknown ANSI esc code: %x\n", c);) + } + ansi_mode = false; + } + else if (c == '\033') /* Enter ANSI ESC mode */ + { + ansi_mode = true; + } + else if (c == '\n') /* Go one line down on a line-feed */ + { + if (bm->penY + bm->font->height < bm->height) + { + bm->penY += bm->font->height; + bm->penX = 0; + } + } + else + { + text_putglyph(c, bm); + } + return c; +} + + +/** + * Clear the screen and reset cursor position + */ +void text_clear(struct Bitmap *bmp) +{ + text_putchar('\x1b', bmp); + text_putchar('c', bmp); +} + + +void text_clearLine(struct Bitmap *bm, int line) +{ + gfx_rectClear(bm, 0, line * bm->font->height, bm->width, (line + 1) * bm->font->height); +} + + +/** + * Set/clear algorithmic font style bits. + * + * \param bm Pointer to Bitmap to affect. + * \param flags Style flags to set + * \param mask Mask of flags to modify + * \return Old style flags + * + * Examples: + * Turn on bold, leave other styles alone + * \code text_style(bm, STYLEF_BOLD, STYLEF_BOLD); \endcode + * + * Turn off bold and turn on italic, leave others as they are + * \code text_style(bm, STYLEF_ITALIC, STYLEF_BOLD | STYLEF_ITALIC); \endcode + * + * Query current style without chaning it + * \code style = text_style(bm, 0, 0); \endcode + * + * Reset all styles (plain text) + * \code text_style(bm, 0, STYLE_MASK); \endcode + */ +uint8_t text_style(struct Bitmap *bm, uint8_t flags, uint8_t mask) +{ + uint8_t old = bm->styles; + bm->styles = (bm->styles & ~mask) | flags; + return old; +} diff --git a/2.5/bertos/gfx/text.h b/2.5/bertos/gfx/text.h new file mode 100644 index 00000000..e7ac8c77 --- /dev/null +++ b/2.5/bertos/gfx/text.h @@ -0,0 +1,122 @@ +/** + * \file + * + * + * \brief Text graphic routines (interface) + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + * $WIZ$ module_name = "text" + * $WIZ$ module_depends = "bitmap", "line" + */ + +#ifndef GFX_TEXT_H +#define GFX_TEXT_H + +#include +#include /* BV() */ +#include /* CPU_HARVARD */ +#include /* coord_t */ + +#include + +/** + * \name Style flags + * \see text_style() + * \{ + */ +#define STYLEF_BOLD BV(0) +#define STYLEF_ITALIC BV(1) +#define STYLEF_UNDERLINE BV(2) +#define STYLEF_INVERT BV(3) +#define STYLEF_EXPANDED BV(4) +#define STYLEF_CONDENSED BV(5) +#define STYLEF_STRIKEOUT BV(6) /* +int text_puts_P(const char * PROGMEM str, struct Bitmap *bm); +int text_vprintf_P(struct Bitmap *bm, const char * PROGMEM fmt, va_list ap); +int text_printf_P(struct Bitmap *bm, const char * PROGMEM fmt, ...) FORMAT(__printf__, 2, 3); +int text_xyvprintf_P(struct Bitmap *bm, coord_t x, coord_t y, uint16_t mode, const char *fmt, va_list ap); +int text_xyprintf_P(struct Bitmap *bm, coord_t x, coord_t col, uint16_t mode, const char *fmt, ...) FORMAT(__printf__, 5, 6); +int text_xprintf_P(struct Bitmap *bm, uint8_t row, uint8_t col, uint16_t mode, const char * PROGMEM fmt, ...) FORMAT(__printf__, 5, 6); +int text_vwidthf_P(struct Bitmap *bm, const char * PROGMEM fmt, va_list ap); +int text_widthf_P(struct Bitmap *bm, const char * PROGMEM fmt, ...); +#endif /* CPU_HARVARD */ + +#endif /* GFX_TEXT_H */ diff --git a/2.5/bertos/gfx/text_format.c b/2.5/bertos/gfx/text_format.c new file mode 100644 index 00000000..445254c8 --- /dev/null +++ b/2.5/bertos/gfx/text_format.c @@ -0,0 +1,294 @@ +/** + * \file + * + * + * \version $Id$ + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + * \brief printf-family routines for text output + * + * $WIZ$ module_name = "text_format" + * $WIZ$ module_depends = "sprintf", "formatwr", "text" + * $WIZ$ module_harvard = "both" + */ + +#include "text.h" + +#include /* _formatted_write() */ +#include +#include + +#include /* vsprintf() */ +#include +#include /* strlen() */ + +/** + * Render string \a str in Bitmap \a bm at current cursor position + * + * \note Text formatting functions are also available with an _P suffix + * accepting the source string from program memory. This feature + * is only available (and useful) on Harvard microprocessors such + * as the AVR. + * + * \see text_putchar() + */ +int PGM_FUNC(text_puts)(const char * PGM_ATTR str, struct Bitmap *bm) +{ + char c; + + while ((c = PGM_READ_CHAR(str++))) + text_putchar(c, bm); + + return 0; +} + + +/** + * vprintf()-like formatter to render text in a Bitmap. + * + * Perform vprintf()-like formatting on the \a fmt format string using the + * variable-argument list \a ap. + * Render the resulting string in Bitmap \a bm starting at the current + * cursor position. + * + * \see text_puts() text_putchar() text_printf() + */ +int PGM_FUNC(text_vprintf)(struct Bitmap *bm, const char * PGM_ATTR fmt, va_list ap) +{ + return PGM_FUNC(_formatted_write)(fmt, (void (*)(char, void *))text_putchar, bm, ap); +} + +/** + * printf()-like formatter to render text in a Bitmap. + * + * Perform printf()-like formatting on the \a fmt format string. + * Render the resulting string in Bitmap \a bm starting at the + * current cursor position. + * + * \see text_puts() text_putchar() text_vprintf() + */ +int PGM_FUNC(text_printf)(struct Bitmap *bm, const char * PGM_ATTR fmt, ...) +{ + int len; + + va_list ap; + va_start(ap, fmt); + len = PGM_FUNC(text_vprintf)(bm, fmt, ap); + va_end(ap); + + return len; +} + +/** + * Render text with vprintf()-like formatting at a specified pixel position. + * + * \see text_xyprintf() + */ +int PGM_FUNC(text_xyvprintf)(struct Bitmap *bm, + coord_t x, coord_t y, uint16_t style, const char * PGM_ATTR fmt, va_list ap) +{ + int len; + uint8_t oldstyle = 0; + + text_setCoord(bm, x, y); + + if (style & STYLEF_MASK) + oldstyle = text_style(bm, style, STYLEF_MASK); + + if (style & (TEXT_CENTER | TEXT_RIGHT)) + { + uint8_t pad = bm->width - PGM_FUNC(text_vwidthf)(bm, fmt, ap); + + if (style & TEXT_CENTER) + pad /= 2; + + if (style & TEXT_FILL) + gfx_rectFillC(bm, 0, y, pad, y + bm->font->height, + (style & STYLEF_INVERT) ? 0xFF : 0x00); + + text_setCoord(bm, pad, y); + } + + len = PGM_FUNC(text_vprintf)(bm, fmt, ap); + + if (style & TEXT_FILL) + gfx_rectFillC(bm, bm->penX, y, bm->width, y + bm->font->height, + (style & STYLEF_INVERT) ? 0xFF : 0x00); + + /* Restore old style */ + if (style & STYLEF_MASK) + text_style(bm, oldstyle, STYLEF_MASK); + + return len; +} + + +/** + * Render text with printf()-like formatting at a specified pixel position. + * + * \param bm Bitmap where to render the text + * \param x [pixels] Initial X coordinate of text. + * \param y [pixels] Coordinate of top border of text. + * \param style Formatting style to use. In addition to any STYLEF_ + * flag, it can be TEXT_NORMAL, TEXT_FILL, TEXT_INVERT or + * TEXT_RIGHT, or a combination of these flags ORed together. + * \param fmt String possibly containing printf() formatting commands. + * + * \see text_puts() text_putchar() text_printf() text_vprintf() + * \see text_moveTo() text_style() + */ +int PGM_FUNC(text_xyprintf)(struct Bitmap *bm, + coord_t x, coord_t y, uint16_t style, const char * PGM_ATTR fmt, ...) +{ + int len; + va_list ap; + + va_start(ap, fmt); + len = PGM_FUNC(text_xyvprintf)(bm, x, y, style, fmt, ap); + va_end(ap); + + return len; +} + + +/** + * Render text with printf()-like formatting at a specified row/column position. + * + * \see text_xyprintf() + */ +int PGM_FUNC(text_xprintf)(struct Bitmap *bm, + uint8_t row, uint8_t col, uint16_t style, const char * PGM_ATTR fmt, ...) +{ + int len; + va_list ap; + + va_start(ap, fmt); + len = PGM_FUNC(text_xyvprintf)( + bm, col * bm->font->width, row * bm->font->height, + style, fmt, ap); + va_end(ap); + + return len; +} + + +struct TextWidthData +{ + Bitmap *bitmap; + coord_t width; +}; + +/** + * Compute width in pixels of a character. + * + * Compute the on screen width of a character, taking the + * current style and font into account. + * + * The width is accumulated in the WidthData structure + * passed as second argument. + * + * This is a formatted_write() callback used by text_vwidthf() + * to compute the length of a formatted string. + */ +static int text_charWidth(int c, struct TextWidthData *twd) +{ + unsigned char index = (unsigned char)c; + Bitmap *bm = twd->bitmap; + coord_t glyph_width; + + + if (UNLIKELY(!FONT_HAS_GLYPH(bm->font, index))) + { + if (!FONT_HAS_GLYPH(bm->font, '?')) + index = '?'; + else + index = bm->font->first; + } + + /* Make character relative to font start */ + index -= bm->font->first; + + if (bm->font->offset) + /* Proportional font */ + glyph_width = bm->font->widths[index]; /* TODO: optimize away */ + else + /* Fixed width font */ + glyph_width = bm->font->width; + + if (bm->styles & STYLEF_CONDENSED) + --glyph_width; + + if (bm->styles & STYLEF_EXPANDED) + glyph_width *= 2; + + twd->width += glyph_width; + + return c; +} + +/** + * Return the width in pixels of a vprintf()-formatted string. + */ +int PGM_FUNC(text_vwidthf)( + UNUSED_ARG(struct Bitmap *, bm), + const char * PGM_ATTR fmt, + va_list ap) +{ + /* Fixed font with no styles affecting the width? */ + if (!bm->font->offset && !(bm->styles & (STYLEF_CONDENSED | STYLEF_EXPANDED))) + return PGM_FUNC(vsprintf)(NULL, fmt, ap) * bm->font->width; + else + { + struct TextWidthData twd; + twd.bitmap = bm; + twd.width = 0; + _formatted_write(fmt, (void (*)(char, void *))text_charWidth, &twd, ap); + return twd.width; + } +} + + +/** + * Return the width in pixels of a printf()-formatted string. + */ +int PGM_FUNC(text_widthf)(struct Bitmap *bm, const char * PGM_ATTR fmt, ...) +{ + int width; + + va_list ap; + va_start(ap, fmt); + width = PGM_FUNC(text_vwidthf)(bm, fmt, ap); + va_end(ap); + + return width; +} diff --git a/2.5/bertos/gfx/win.c b/2.5/bertos/gfx/win.c new file mode 100644 index 00000000..dd1755a5 --- /dev/null +++ b/2.5/bertos/gfx/win.c @@ -0,0 +1,232 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Very simple hierarchical windowing system. + * + * All functions in this module are to be intended as methods + * of the Window class. Please see its documentation + * for a module-wise introduction. + * + * \see struct Window + */ + +/*#* + *#* $Log$ + *#* Revision 1.2 2006/08/01 17:26:04 batt + *#* Update docs. + *#* + *#* Revision 1.1 2006/08/01 15:43:01 batt + *#* Add in board_kd current edited channel visualization. + *#* + *#* Revision 1.4 2006/07/19 12:56:26 bernie + *#* Convert to new Doxygen style. + *#* + *#* Revision 1.3 2006/02/10 12:25:41 bernie + *#* Add missing header. + *#* + *#* Revision 1.2 2006/01/26 00:36:48 bernie + *#* Const correctness for some new functions. + *#* + *#* Revision 1.1 2006/01/23 23:14:29 bernie + *#* Implement simple, but impressive windowing system. + *#* + *#*/ + +#include "win.h" +#include + +/** + * Map the contents of all child-windows into the bitmap of \a w. + * + * \note Recursively drawing children into their parent + * effectively damages the parent buffer. + */ +void win_compose(Window *w) +{ + Window *child; + + /* + * Walk over all children, in back to front order and tell them + * to compose into us. + */ + REVERSE_FOREACH_NODE(child, &w->children) + { + /* Recursively compose child first. */ + win_compose(child); + + /* Draw child into our bitmap. */ + if (w->bitmap) + gfx_blit(w->bitmap, &child->geom, child->bitmap, 0, 0); + } +} + +/** + * Map window \a w into \a parent. + * + * The new window becomes the topmost window. + * + * \note Opening a window twice is illegal. + * + * \see win_close() + */ +void win_open(Window *w, Window *parent) +{ + ASSERT(!w->parent); + w->parent = parent; + ADDHEAD(&parent->children, &w->link); +} + +/** + * Detach window from its parent. + * + * Closing a window causes it to become orphan of its + * parent. Its content will no longer appear in its + * parent after the next refresh cycle. + * + * \note Closing a window that has not been previously + * opened is illegal. + * + * \see win_open() + */ +void win_close(Window *w) +{ + ASSERT(w->parent); + REMOVE(&w->link); + w->parent = NULL; +} + +/** + * Move window to the topmost position relative to its sibling. + * + * \see win_move(), win_resize(), win_setGeometry() + */ +void win_raise(Window *w) +{ + ASSERT(w->parent); + REMOVE(&w->link); + ADDHEAD(&w->parent->children, &w->link); +} + +/** + * Set window position and size at the same time. + * + * This function is equivalent to subsequent calls to win_move() + * and win_resize() using the coordinates provided by the + * \a new_geom rectangle. + * + * \note The xmax and ymax members of \a new_geom are non-inclusive, + * as usual for the Rect interface. + * + * \see win_move() + * \see win_resize() + */ +void win_setGeometry(Window *w, const Rect *new_geom) +{ + // requires C99? + // memcpy(&w->geom, new_geom, sizeof(w->geom)); + w->geom = *new_geom; +} + +/** + * Move window to specified position. + * + * Move the window top-left corner to the pixel coordinates + * \a left and \a top, which are relative to the parent window. + * + * \note A window can also be moved outside the borders + * of its parent, or at negative coordinates. + * + * \note It is allowed to move an orphan window. + */ +void win_move(Window *w, coord_t left, coord_t top) +{ + Rect r; + + r.xmin = left; + r.ymin = top; + r.xmax = r.xmin + RECT_WIDTH(&w->geom); + r.ymax = r.ymin + RECT_WIDTH(&w->geom); + + win_setGeometry(w, &r); +} + +/** + * Resize the rectangle of a window. + * + * The window shrinks or grows to the specified size. + * + * \note Growing a window beyond the size of its + * backing bitmap results in unspecified behavior. + * + * \note It is allowed to resize an orphan window. + */ +void win_resize(Window *w, coord_t width, coord_t height) +{ + Rect r; + + r.xmin = w->geom.xmin; + r.ymin = w->geom.ymin; + r.xmax = r.xmin + width; + r.ymax = r.ymin + height; + + win_setGeometry(w, &r); +} + +/** + * Initialize a new window structure. + * + * The new window initial position is set to (0,0). + * The size is set to the size of the installed bitmap, + * or (0,0) if there's no backing store. + * + * \arg bm The bitmap to install as backing store + * for drawing into the window, or NULL if + * the window is not drawable. + */ +void win_create(Window *w, Bitmap *bm) +{ + w->parent = NULL; + w->bitmap = bm; + w->geom.xmin = 0; + w->geom.ymin = 0; + if (bm) + { + w->geom.xmax = bm->width; + w->geom.ymax = bm->height; + } + LIST_INIT(&w->children); +} + diff --git a/2.5/bertos/gfx/win.h b/2.5/bertos/gfx/win.h new file mode 100644 index 00000000..853eda96 --- /dev/null +++ b/2.5/bertos/gfx/win.h @@ -0,0 +1,120 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Very simple hierarchical windowing system. + * + * All functions in this module are to be intended as methods + * of the Window class. Please see its documentation + * for a module-wise introduction. + * + * \see struct Window + */ + +/*#* + *#* $Log$ + *#* Revision 1.3 2006/07/19 12:56:27 bernie + *#* Convert to new Doxygen style. + *#* + *#* Revision 1.2 2006/01/26 00:36:48 bernie + *#* Const correctness for some new functions. + *#* + *#* Revision 1.1 2006/01/23 23:14:29 bernie + *#* Implement simple, but impressive windowing system. + *#* + *#*/ + +#ifndef GFX_WIN_H +#define GFX_WIN_H + +#include /* Node, List */ +#include /* coord_t */ + + +EXTERN_C_BEGIN + +/** + * Window handle and context structure. + * + * A window is a small rectangular area on the + * screen backed by its own bitmap where you + * can draw. + * + * A window can contain any number of children + * sub-windows that can be depth arranged with + * respect to their siblings. + * + * At any time, a window and all its children + * can be drawn into another bitmap to display + * a complete screen, taking depth and + * overlapping into account. + * + * This rendering model is commonly referred to as + * screen composition, and is quite popular among + * modern windowing systems. + */ +typedef struct Window +{ + Node link; /**< Link us with other siblings into our parent. */ + struct Window *parent; /**< Our parent window. NULL for the root window. */ + + Bitmap *bitmap; /**< Pixel storage for window contents. */ + Rect geom; /**< [px] Window size and position relative to parent. */ + + /** + * List of child windows, arranged by depth (front to back). + * + * Child top/left coordinates are relative to us. + */ + List children; + +} Window; + +/* + * Public function prototypes + */ +void win_compose(Window *w); +void win_open(Window *w, Window *parent); +void win_close(Window *w); +void win_raise(Window *w); +void win_setGeometry(Window *w, const Rect *new_geom); +void win_move(Window *w, coord_t left, coord_t top); +void win_resize(Window *w, coord_t width, coord_t height); +void win_create(Window *w, Bitmap *bm); + +EXTERN_C_END + +#endif /* GFX_WIN_H */ + diff --git a/2.5/bertos/gui/levelbar.c b/2.5/bertos/gui/levelbar.c new file mode 100644 index 00000000..8b75d15b --- /dev/null +++ b/2.5/bertos/gui/levelbar.c @@ -0,0 +1,106 @@ +/** + * \file + * Copyright 2004, 2006 Develer S.r.l. (http://www.develer.com/) + * + * + * \brief Graphics user interface element to display a level bar. + * + * \version $Id$ + * \author Stefano Fedrigo + */ + +#include "levelbar.h" + + +/** + * Initialize the LevelBar widget with the bitmap associated, + * the value range and the coordinates in the bitmap. + * \note The levelbar should be at least 5 pixels wide and high + * for correct borders drawing. No check is done on this. + */ +void lbar_init(struct LevelBar *lb, struct Bitmap *bmp, int type, int min, int max, int pos, + coord_t x1, coord_t y1, coord_t x2, coord_t y2) +{ + lb->bitmap = bmp; + lb->type = type; + lb->min = min; + lb->max = max; + lb->pos = pos; + lb->x1 = x1; + lb->y1 = y1; + lb->x2 = x2; + lb->y2 = y2; +} + + +/** + * Set the level. + */ +void lbar_setLevel(struct LevelBar *lb, int level) +{ + if (level < lb->min) + level = lb->min; + if (level > lb->max) + level = lb->max; + + lb->pos = level; +} + + +/** + * Get current level. + */ +int lbar_getLevel(struct LevelBar *lb) +{ + return lb->pos; +} + + +/** + * Change level with respect to previous value + * (delta can be negative). + */ +void lbar_changeLevel(struct LevelBar *lb, int delta) +{ + lbar_setLevel(lb, lb->pos + delta); +} + + +/** + * Change the top limit. + */ +void lbar_setMax(struct LevelBar *lb, int max) +{ + lb->max = max; +} + + +/** + * Render the LevelBar on the bitmap. + */ +void lbar_draw(struct LevelBar *lb) +{ +#define BORDERW 1 +#define BORDERH 1 + + /* Compute filled bar length in pixels */ + int totlen = (lb->type & LBAR_HORIZONTAL) ? lb->x2 - lb->x1 - BORDERW*4 : lb->y2 - lb->y1 - BORDERH*4; + int range = lb->max - lb->min; + int barlen = ((long)(lb->pos - lb->min) * (long)totlen + range - 1) / range; + + // Draw border + gfx_rectDraw(lb->bitmap, lb->x1, lb->y1, lb->x2, lb->y2); + + // Clear inside + gfx_rectClear(lb->bitmap, lb->x1 + BORDERW, lb->y1 + BORDERH, lb->x2 - BORDERW, lb->y2 - BORDERH); + + // Draw bar + if (lb->type & LBAR_HORIZONTAL) + gfx_rectFill(lb->bitmap, + lb->x1 + BORDERW*2, lb->y1 + BORDERH*2, + lb->x1 + BORDERW*2 + barlen, lb->y2 - BORDERH*2); + else + gfx_rectFill(lb->bitmap, + lb->x1 + BORDERW*2, lb->y2 - BORDERH*2 - barlen, + lb->x2 - BORDERW*2, lb->y2 - BORDERH*2); +} diff --git a/2.5/bertos/gui/levelbar.h b/2.5/bertos/gui/levelbar.h new file mode 100644 index 00000000..d1d36926 --- /dev/null +++ b/2.5/bertos/gui/levelbar.h @@ -0,0 +1,39 @@ +/** + * \file + * Copyright 2004, 2006 Develer S.r.l. (http://www.develer.com/) + * + * + * \author Stefano Fedrigo + * + * \brief Graphics level bar widget + */ + +#ifndef GUI_LEVELBAR_H +#define GUI_LEVELBAR_H + +#include + + +/** Type of levelbar */ +#define LBAR_HORIZONTAL 1 +#define LBAR_VERTICAL 2 + +typedef struct LevelBar +{ + struct Bitmap *bitmap; + int type; + int pos; ///< Current level + int min; ///< Minimum level + int max; ///< Maximum level + coord_t x1, y1, x2, y2; ///< Position of widget in the bitmap +} LevelBar; + +void lbar_init(struct LevelBar *lb, struct Bitmap *bmp, int type, int min, int max, int pos, + coord_t x1, coord_t y1, coord_t x2, coord_t y2); +void lbar_setLevel(struct LevelBar *lb, int level); +int lbar_getLevel(struct LevelBar *lb); +void lbar_changeLevel(struct LevelBar *lb, int delta); +void lbar_setMax(struct LevelBar *lb, int max); +void lbar_draw(struct LevelBar *lb); + +#endif /* GUI_LEVELBAR_H */ diff --git a/2.5/bertos/gui/leveledit.c b/2.5/bertos/gui/leveledit.c new file mode 100644 index 00000000..27a46683 --- /dev/null +++ b/2.5/bertos/gui/leveledit.c @@ -0,0 +1,321 @@ +/** + * \file + * + * + * \brief Generic editor for (volume/gain/contrast/...) setting. + * + * \author Stefano Fedrigo + */ + +#include "leveledit.h" + +#include "cfg/cfg_menu.h" +#include /* MAX() */ + +#include +#include + +#include + +#include + +#include +#include + +#if CONFIG_MENU_MENUBAR +#include +#endif + +#warning FIXME: Revise me! + +#define LBAR_HEIGHT 16 + +/** + * Allow user to change level. + */ +void level_edit(struct LevelEdit *lev) +{ +#if CONFIG_MENU_MENUBAR + /* Labels for menubars */ + enum LabelId ch_labels[] = { LABEL_C1PLUS2, LABEL_CH_1, LABEL_CH_2 }; + const_iptr_t labels[] = + { + (const_iptr_t)LABEL_BACK, + (const_iptr_t)LABEL_MINUS, + (const_iptr_t)LABEL_PLUS, + (const_iptr_t)LABEL_EMPTY + }; + struct MenuBar mb; +#endif /* CONFIG_MENU_MENUBAR */ + + struct LevelBar bar1, bar2; + keymask_t keys, old_rpt_mask; + int step, rep_step; + + rep_step = MAX(lev->step, ((lev->max - lev->min) / 200)); + step = lev->step; + + // Allow keys repetition. + old_rpt_mask = kbd_setRepeatMask(K_UP | K_DOWN); + + text_clear(lev->bitmap); + //text_style(STYLEF_UNDERLINE, STYLEF_UNDERLINE); + text_puts(lev->title, lev->bitmap); + //text_style(0, STYLEF_UNDERLINE); + + if (lev->type & LEVELEDIT_DOUBLE) + { + int chn = 0; /* edit both channels */ + + /* Levelbars init */ + lbar_init(&bar1, lev->bitmap, LBAR_HORIZONTAL, + lev->min, lev->max, *lev->ch1_val, 0, 16, lev->bitmap->width / 2 - 1, 23); + lbar_init(&bar2, lev->bitmap, LBAR_HORIZONTAL, + lev->min, lev->max, *lev->ch2_val, lev->bitmap->width / 2 + 1, 16, lev->bitmap->width, 23); + + #if CONFIG_MENU_MENUBAR + labels[3] = (const_iptr_t)ch_labels[chn]; + mbar_init(&mb, lev->bitmap, labels, countof(labels)); + mbar_draw(&mb); + #endif /* CONFIG_MENU_MENUBAR */ + + /* Input loop for double level setting */ + for (;;) + { + #if CONFIG_LEVELEDIT_TIMEOUT != 0 + ticks_t idle_timeout = timer_clock(); + #endif + do + { + if (lev->display_hook) + lev->display_hook(lev); + else + { + text_xprintf(lev->bitmap, 1, 0, TEXT_CENTER | TEXT_FILL, lev->unit); + PGM_FUNC(text_xprintf)(lev->bitmap, 1, 3, 0, PGM_STR("%d"), *lev->ch1_val); + PGM_FUNC(text_xprintf)(lev->bitmap, 1, 14, 0, PGM_STR("%d"), *lev->ch2_val); + + lbar_setLevel(&bar1, *lev->ch1_val); + lbar_setLevel(&bar2, *lev->ch2_val); + lbar_draw(&bar1); + lbar_draw(&bar2); + } + + #if CONFIG_LEVELEDIT_TIMEOUT != 0 + if (timer_clock() - idle_timeout > ms_to_ticks(CONFIG_LEVELEDIT_TIMEOUT)) + { + /* Accept input implicitly */ + keys = K_OK; + break; + } + #endif + } + while (!(keys = kbd_peek())); + + if (keys & K_CANCEL) + break; + + if (keys & K_OK) + { + chn = (chn + 1) % 3; + + #if CONFIG_MENU_MENUBAR + labels[3] = (const_iptr_t)ch_labels[chn]; + mbar_draw(&mb); + #endif /* CONFIG_MENU_MENUBAR */ + } + + /* Increment step to achieve greater accelerations on larger values */ + if (keys & K_REPEAT) + step = MIN(rep_step, step + 1); + else + step = lev->step; + + if (keys & (K_UP | K_DOWN)) + { + if (keys & K_UP) + { + /* If changing both channels (chn == 0), don't change + * level if one of two is at min or max */ + if (chn != 0 || + (*lev->ch1_val + step <= lev->max + && *lev->ch2_val + step <= lev->max)) + { + /* If chn == 0 change both channels */ + if (chn != 2) + { + *lev->ch1_val += step; + if (*lev->ch1_val > lev->max) + *lev->ch1_val = lev->max; + } + if (chn != 1) + { + *lev->ch2_val += step; + if (*lev->ch2_val > lev->max) + *lev->ch2_val = lev->max; + } + } + } + else + { + if (chn != 0 || + (*lev->ch1_val - step >= lev->min + && *lev->ch2_val - step >= lev->min)) + { + if (chn != 2) + { + *lev->ch1_val -= step; + if (*lev->ch1_val < lev->min) + *lev->ch1_val = lev->min; + } + if (chn != 1) + { + *lev->ch2_val -= step; + if (*lev->ch2_val < lev->min) + *lev->ch2_val = lev->min; + } + } + } + + if (lev->set_hook) + lev->set_hook(); + } + } // end for(;;) + } + else + { + const PGM_ATTR char *fmt = lev->unit ? PGM_STR("%d %s") : PGM_STR("%d"); + +/* + const int textw = MAX(PGM_FUNC(text_widthf)(lev->bitmap, fmt, lev->max, lev->unit), + PGM_FUNC(text_widthf)(lev->bitmap, fmt, lev->min, lev->unit)); + + const coord_t barlen = lev->bitmap->width - 6 - textw; +*/ + const coord_t barlen = lev->bitmap->width; + const coord_t barvtop = lev->bitmap->height / 2 - LBAR_HEIGHT/2 + lev->bitmap->font->height; + lbar_init(&bar1, lev->bitmap, LBAR_HORIZONTAL, + lev->min, lev->max, *lev->ch1_val, + 0, barvtop, barlen, barvtop + LBAR_HEIGHT); + + #if CONFIG_MENU_MENUBAR + mbar_init(&mb, lev->bitmap, labels, countof(labels)); + mbar_draw(&mb); + #endif /* CONFIG_MENU_MENUBAR */ + + /* Input loop for single level setting */ + for (;;) + { + #if CONFIG_LEVELEDIT_TIMEOUT != 0 + ticks_t idle_timeout = timer_clock(); + #endif + do + { + if (lev->display_hook) + lev->display_hook(lev); + else + { + if (lev->type != LEVELEDIT_NOBAR) + { + lbar_setLevel(&bar1, *lev->ch1_val); + lbar_draw(&bar1); + } + PGM_FUNC(text_xyprintf)(lev->bitmap, 0, bar1.y1 - lev->bitmap->font->height, + TEXT_CENTER | TEXT_FILL, fmt, *lev->ch1_val, lev->unit); + } + + #if CONFIG_LEVELEDIT_TIMEOUT != 0 + if (timer_clock() - idle_timeout > CONFIG_LEVELEDIT_TIMEOUT) + { + /* Accept input implicitly */ + keys = K_CANCEL; + break; + } + #endif + + } + while (!(keys = kbd_peek())); + + if (keys & K_CANCEL) + break; + + /* Increment step to achieve greater accelerations on larger values */ + if (keys & K_REPEAT) + step = MIN(rep_step, step + 1); + else + step = lev->step; + + if (keys & K_UP) + { + *lev->ch1_val += step; + if (*lev->ch1_val > lev->max) + *lev->ch1_val = lev->max; + } + + if (keys & K_DOWN) + { + *lev->ch1_val -= step; + if (*lev->ch1_val < lev->min) + *lev->ch1_val = lev->min; + } + + if (lev->set_hook) + lev->set_hook(); + } + } + + kbd_setRepeatMask(old_rpt_mask); +} + +/** + * LevelEdit structure initialization. + * Init data structure and init LevelEdit widgets. + */ +void level_init(struct LevelEdit *lev, + int type, + struct Bitmap *bmp, const char *title, const char *unit, + int min, int max, int step, + int *ch1_val, int *ch2_val, + level_set_callback *set_hook, display_callback *display_hook) +{ + lev->type = type; + lev->bitmap = bmp; + lev->title = title; + lev->unit = unit; + lev->min = min; + lev->max = max; + lev->step = step; + + lev->ch1_val = ch1_val; + lev->ch2_val = ch2_val; + lev->set_hook = set_hook; + lev->display_hook = display_hook; +} diff --git a/2.5/bertos/gui/leveledit.h b/2.5/bertos/gui/leveledit.h new file mode 100644 index 00000000..0158efbd --- /dev/null +++ b/2.5/bertos/gui/leveledit.h @@ -0,0 +1,87 @@ +/** + * \file + * + * + * \brief Generic editor for (volume/gain/contrast/...) setting. + * + * \author Stefano Fedrigo + */ +#ifndef GUI_LEVELEDIT_H +#define GUI_LEVELEDIT_H + +//#include + +/* Type for level_init */ +#define LEVELEDIT_NOBAR 0 /**< Edit number only, without bar nor units */ +#define LEVELEDIT_SINGLE 1 /**< Single channel editing */ +#define LEVELEDIT_DOUBLE 2 /**< Double channel editing */ + + + +/* Fwd decl */ +struct Bitmap; +struct LevelEdit; + +/** Type for callback used to set meter levels */ +typedef void level_set_callback(void); + +/** Type for callback used to customize display of units */ +typedef void display_callback(struct LevelEdit *); + +/** + * State of a level meter + */ +typedef struct LevelEdit { + int type; /* + * + * --> + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + * \brief General pourpose menu handling functions + */ + +#include "menu.h" + +#include "cfg/cfg_menu.h" +#include "cfg/cfg_arch.h" + +#include +#include + +#include +#include +#include + +#include + +#include /* strcpy() */ + +#if CPU_HARVARD +#include /* strncpy_P() */ +#endif + +#if (CONFIG_MENU_TIMEOUT != 0) +#include +#endif + +#if CONFIG_MENU_MENUBAR +#include "menubar.h" +#endif + +#if defined(CONFIG_LOCALE) && (CONFIG_LOCALE == 1) +#include "msg.h" +#else +#define PTRMSG(x) ((const char *)x) +#endif + + +/* Temporary fake defines for ABORT stuff... */ +#define abort_top 0 +#define PUSH_ABORT false +#define POP_ABORT do {} while(0) +#define DO_ABORT do {} while(0) + + +/** + * Return the total number of items in in a menu. + */ +static int menu_count(const struct Menu *menu) +{ + int cnt = 0; + + for (cnt = 0; /*NOP*/; ++cnt) + { + const MenuItem *item = &menu->items[cnt]; +#if CPU_HARVARD + MenuItem ram_item; + if (menu->flags & MF_ROMITEMS) + { + memcpy_P(&ram_item, item, sizeof(ram_item)); + item = &ram_item; + } +#endif + if (!(item->label || item->hook)) + break; + } + + return cnt; +} + +#if CONFIG_MENU_MENUBAR + +/** + * Update the menu bar according to the selected item and redraw it. + */ +static void menu_update_menubar( + const struct Menu *menu, + struct MenuBar *mb, + int selected) +{ + int item_flags; +#if CPU_HARVARD + if (menu->flags & MF_ROMITEMS) + { + ASSERT(sizeof(menu->items[selected].flags) == sizeof(int)); + item_flags = pgm_read_int(&menu->items[selected].flags); + } + else +#endif + item_flags = menu->items[selected].flags; + + const_iptr_t newlabel = (const_iptr_t)LABEL_OK; + + if (item_flags & MIF_DISABLED) + newlabel = (const_iptr_t)LABEL_EMPTY; + else if (item_flags & MIF_TOGGLE) + newlabel = (const_iptr_t)LABEL_SEL; + else if (item_flags & MIF_CHECKIT) + { + newlabel = (item_flags & MIF_CHECKED) ? + (const_iptr_t)LABEL_EMPTY : (const_iptr_t)LABEL_SEL; + } + + mb->labels[3] = newlabel; + mbar_draw(mb); +} +#endif /* CONFIG_MENU_MENUBAR */ + + +static void menu_defaultRenderHook(struct Bitmap *bm, int ypos, bool selected, const struct MenuItem *item) +{ + if (item->flags & MIF_CHECKIT) + { + gfx_rectClear(bm, 0, ypos, + bm->font->height, ypos + bm->font->height); + + if (item->flags & MIF_TOGGLE) + gfx_rectDraw(bm, 2, ypos + 2, + bm->font->height - 2, ypos + bm->font->height - 2); + if (item->flags & MIF_CHECKED) + { + gfx_line(bm, + 3, ypos + 3, + bm->font->height - 3, ypos + bm->font->height - 3); + gfx_line(bm, + bm->font->height - 3, ypos + 3, + 3, ypos + bm->font->height - 3); + } + } + +#if CPU_HARVARD + ((item->flags & MIF_RAMLABEL) ? text_xyprintf : text_xyprintf_P) +#else + text_xyprintf +#endif + ( + bm, (item->flags & MIF_CHECKIT) ? bm->font->height : 0, ypos, + selected ? (STYLEF_INVERT | TEXT_FILL) : TEXT_FILL, + PTRMSG(item->label) + ); +} + +/** + * Show a menu on the display. + */ +static void menu_layout( + const struct Menu *menu, + int first_item, + int selected, + bool redraw) +{ + coord_t ypos; + int i; + const char * PROGMEM title = PTRMSG(menu->title); + Bitmap *bm = menu->bitmap; + + ypos = bm->cr.ymin; + + if (redraw) + { + /* Clear screen */ + text_clear(menu->bitmap); + } + + if (title) + { + if (redraw) + text_xyprintf(bm, 0, ypos, STYLEF_UNDERLINE | STYLEF_BOLD | TEXT_CENTER | TEXT_FILL, title); + ypos += bm->font->height; + } + +#if CONFIG_MENU_SMOOTH + static coord_t yoffset = 0; + static int old_first_item = 0; + static int speed; + coord_t old_ymin = bm->cr.ymin; + + /* Clip drawing inside menu items area */ + gfx_setClipRect(bm, + bm->cr.xmin, bm->cr.ymin + ypos, + bm->cr.xmax, bm->cr.ymax); + + if (old_first_item != first_item) + { + /* Speed proportional to distance */ + speed = ABS(old_first_item - first_item) * 3; + + if (old_first_item > first_item) + { + yoffset += speed; + if (yoffset > bm->font->height) + { + yoffset = 0; + --old_first_item; + } + } + else + { + yoffset -= speed; + if (yoffset < -bm->font->height) + { + yoffset = 0; + ++old_first_item; + } + } + first_item = MIN(old_first_item, menu_count(menu)); + + ypos += yoffset; + redraw = true; + } +#endif /* CONFIG_MENU_SMOOTH */ + + if (redraw) for (i = first_item; /**/; ++i) + { + const MenuItem *item = &menu->items[i]; +#if CPU_HARVARD + MenuItem ram_item; + if (menu->flags & MF_ROMITEMS) + { + memcpy_P(&ram_item, item, sizeof(ram_item)); + item = &ram_item; + } +#endif /* CPU_HARVARD */ + + /* Check for end of room */ + if (ypos > bm->cr.ymax) + break; + + /* Check for end of menu */ + if (!(item->label || item->hook)) + break; + + /* Only print visible items */ + if (!(item->flags & MIF_HIDDEN)) + { + /* Check if a special render function is supplied, otherwise use defaults */ + #if (ARCH & ARCH_NIGHTTEST) + #warning __FILTER_NEXT_WARNING__ + #endif + RenderHook renderhook = (item->flags & MIF_RENDERHOOK) ? (RenderHook)item->label : menu_defaultRenderHook; + + /* Render menuitem */ + renderhook(menu->bitmap, ypos++, (i == selected), item); + + ypos += bm->font->height; + } + } + +#if CONFIG_MENU_SMOOTH + if (redraw) + { + /* Clear rest of area */ + gfx_rectClear(bm, bm->cr.xmin, ypos, bm->cr.xmax, bm->cr.ymax); + + menu->lcd_blitBitmap(bm); + } + + /* Restore old cliprect */ + gfx_setClipRect(bm, + bm->cr.xmin, old_ymin, + bm->cr.xmax, bm->cr.ymax); + +#endif /* CONFIG_MENU_SMOOTH */ +} + + +/** + * Handle menu item selection + */ +static iptr_t menu_doselect(const struct Menu *menu, struct MenuItem *item) +{ + iptr_t result = 0; + + /* Exclude other items */ + int mask, i; + for (mask = item->flags & MIF_EXCLUDE_MASK, i = 0; mask; mask >>= 1, ++i) + { + if (mask & 1) + menu->items[i].flags &= ~MIF_CHECKED; + } + + if (item->flags & MIF_DISABLED) + return MENU_DISABLED; + + /* Handle checkable items */ + if (item->flags & MIF_TOGGLE) + item->flags ^= MIF_CHECKED; + else if (item->flags & MIF_CHECKIT) + item->flags |= MIF_CHECKED; + + /* Handle items with callback hooks */ + if (item->hook) + { + /* Push a jmp buffer to abort the operation with the STOP/CANCEL key */ + if (!PUSH_ABORT) + { + result = item->hook(item->userdata); + POP_ABORT; + } + } + else + result = item->userdata; + + return result; +} + + +/** + * Return the next visible item (rolls back to the first item) + */ +static int menu_next_visible_item(const struct Menu *menu, int index) +{ + int total = menu_count(menu); + int item_flags; + + do + { + if (++index >= total) + index = 0; + +#if CPU_HARVARD + if (menu->flags & MF_ROMITEMS) + { + ASSERT(sizeof(menu->items[index].flags) == sizeof(int)); + item_flags = pgm_read_int(&menu->items[index].flags); + } + else +#endif + item_flags = menu->items[index].flags; + } + while (item_flags & MIF_HIDDEN); + + return index; +} + + +/** + * Return the previous visible item (rolls back to the last item) + */ +static int menu_prev_visible_item(const struct Menu *menu, int index) +{ + int total = menu_count(menu); + int item_flags; + + do + { + if (--index < 0) + index = total - 1; + +#if CPU_HARVARD + if (menu->flags & MF_ROMITEMS) + { + ASSERT(sizeof(menu->items[index].flags) == sizeof(int)); + item_flags = pgm_read_int(&menu->items[index].flags); + } + else +#endif + item_flags = menu->items[index].flags; + } + while (item_flags & MIF_HIDDEN); + + return index; +} + + +/** + * Handle a menu and invoke hook functions for the selected menu items. + */ +iptr_t menu_handle(const struct Menu *menu) +{ + uint8_t items_per_page; + uint8_t first_item = 0; + uint8_t selected; + iptr_t result = 0; + bool redraw = true; + +#if (CONFIG_MENU_TIMEOUT != 0) + ticks_t now, menu_idle_time = timer_clock(); +#endif + +#if CONFIG_MENU_MENUBAR + struct MenuBar mb; + const_iptr_t labels[] = + { + (const_iptr_t)LABEL_BACK, + (const_iptr_t)LABEL_UPARROW, + (const_iptr_t)LABEL_DOWNARROW, + (const_iptr_t)0 + }; + + /* + * Initialize menu bar + */ + if (menu->flags & MF_TOPLEVEL) + labels[0] = (const_iptr_t)LABEL_EMPTY; + + mbar_init(&mb, menu->bitmap, labels, countof(labels)); +#endif /* CONFIG_MENU_MENUBAR */ + + + items_per_page = + (menu->bitmap->height / menu->bitmap->font->height - 1) +#if CONFIG_MENU_MENUBAR + - 1 /* menu bar labels */ +#endif + - (menu->title ? 1 : 0); + + /* Selected item should be a visible entry */ + //first_item = selected = menu_next_visible_item(menu, menu->selected - 1); + selected = menu->selected; + first_item = 0; + + for(;;) + { + keymask_t key; + + /* + * Keep selected item visible + */ + while (selected < first_item) + first_item = menu_prev_visible_item(menu, first_item); + while (selected >= first_item + items_per_page) + first_item = menu_next_visible_item(menu, first_item); + + menu_layout(menu, first_item, selected, redraw); + redraw = false; + + #if CONFIG_MENU_MENUBAR + menu_update_menubar(menu, &mb, selected); + #endif + + #if CONFIG_MENU_SMOOTH || (CONFIG_MENU_TIMEOUT != 0) + key = kbd_peek(); + #else + key = kbd_get(); + #endif + + #if (CONFIG_MENU_TIMEOUT != 0) + /* Reset idle timer on key press. */ + now = timer_clock(); + if (key) + menu_idle_time = now; + #endif + + if (key & K_OK) + { + struct MenuItem *item = &(menu->items[selected]); +#if CPU_HARVARD + MenuItem ram_item; + if (menu->flags & MF_ROMITEMS) + { + memcpy_P(&ram_item, item, sizeof(ram_item)); + item = &ram_item; + } +#endif + result = menu_doselect(menu, item); + redraw = true; + + /* Return immediately */ + if (!(menu->flags & MF_STICKY)) + break; + + #if (CONFIG_MENU_TIMEOUT != 0) + /* Chain timeout */ + if ((result == MENU_TIMEOUT) && !(menu->flags & MF_TOPLEVEL)) + break; + + /* Reset timeout */ + menu_idle_time = timer_clock(); + #endif + } + else if (key & K_UP) + { + selected = menu_prev_visible_item(menu, selected); + redraw = true; + } + else if (key & K_DOWN) + { + selected = menu_next_visible_item(menu, selected); + redraw = true; + } + else if (!(menu->flags & MF_TOPLEVEL)) + { + if (key & K_CANCEL) + { + result = MENU_CANCEL; + break; + } + + #if CONFIG_MENU_TIMEOUT != 0 + if (now - menu_idle_time > ms_to_ticks(CONFIG_MENU_TIMEOUT)) + { + result = MENU_TIMEOUT; + break; + } + #endif + } + } + + /* Store currently selected item before leaving. */ + if (menu->flags & MF_SAVESEL) + #if (ARCH & ARCH_NIGHTTEST) + #warning __FILTER_NEXT_WARNING__ + #endif + CONST_CAST(struct Menu *, menu)->selected = selected; + + return result; +} + + +/** + * Set flags on a menuitem. + * + * \param menu Menu owner of the item to change. + * \param idx Index of the menu item. + * \param flags Bit mask of the flags to set. + * + * \return Old flags. + */ +int menu_setFlags(struct Menu *menu, int idx, int flags) +{ + ASSERT(idx < menu_count(menu)); + ASSERT(!(menu->flags & MF_ROMITEMS)); + + int old = menu->items[idx].flags; + menu->items[idx].flags |= flags; + return old; +} + + +/** + * Clear flags on a menuitem. + * + * \param menu Menu owner of the item to change. + * \param idx Index of the menu item. + * \param flags Bit mask of the flags to clear. + * + * \return Old flags. + */ +int menu_clearFlags(struct Menu *menu, int idx, int flags) +{ + ASSERT(idx < menu_count(menu)); + ASSERT(!(menu->flags & MF_ROMITEMS)); + + int old = menu->items[idx].flags; + menu->items[idx].flags &= ~flags; + return old; +} diff --git a/2.5/bertos/gui/menu.h b/2.5/bertos/gui/menu.h new file mode 100644 index 00000000..b21b023f --- /dev/null +++ b/2.5/bertos/gui/menu.h @@ -0,0 +1,131 @@ +/** + * \file + * + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + * \brief Common menu handling API + * + * $WIZ$ module_name = "menu" + * $WIZ$ module_depends = "text", "gfx", "timer", "kbd" + */ + +#ifndef GUI_MENU_H +#define GUI_MENU_H + +#include + +#include + +/** Menu callback function */ +typedef iptr_t (*MenuHook)(iptr_t userdata); +typedef void (*BlitBitmap)(const Bitmap *bm); + +/** + * Menu item description. + */ +typedef struct MenuItem +{ + const_iptr_t label; /**< Item label (ID or ptr to string, 0 to disable) */ + int flags; /**< See MIF_#? definitions below */ + MenuHook hook; /**< Callback function (NULL to terminate item list) */ + iptr_t userdata; /**< User data to be passed back to the hook */ +} MenuItem; + +/** Render hook callback function prototype */ +typedef void (*RenderHook)(struct Bitmap *bitmap, int ypos, bool selected, const struct MenuItem *item); + +/** + * \name Flags for MenuItem.flags. + * \{ + */ +#define MIF_EXCLUDE_MASK 0x00FF /**< Mask for mutual exclusion map (shared with priority). */ +#define MIF_PRI_MASK 0x00FF /**< Mask for priority value (shared with mutual exclusion). */ +#define MIF_PRI(x) ((x) & MIF_PRI_MASK) /**< Set menu item priority. */ +#define MIF_EXCLUDE_0 BV(0) /**< Exclude item 0 when this item is checked */ +#define MIF_EXCLUDE_1 BV(1) /**< Exclude item 1 when this item is checked */ +#define MIF_EXCLUDE_2 BV(2) /**< Exclude item 2 when this item is checked */ +#define MIF_EXCLUDE_3 BV(3) /**< Exclude item 3 when this item is checked */ +#define MIF_EXCLUDE_4 BV(4) /**< Exclude item 4 when this item is checked */ +#define MIF_EXCLUDE_5 BV(5) /**< Exclude item 5 when this item is checked */ +#define MIF_EXCLUDE_6 BV(6) /**< Exclude item 6 when this item is checked */ +#define MIF_EXCLUDE_7 BV(7) /**< Exclude item 7 when this item is checked */ +#define MIF_CHECKED BV(8) /**< Item is currently checked */ +#define MIF_CHECKIT BV(9) /**< Automatically check this item when selected */ +#define MIF_TOGGLE BV(10) /**< Toggle MIF_CHECKED when item is selected */ +#define MIF_HIDDEN BV(11) /**< This menu item is not visible */ +#define MIF_DISABLED BV(12) /**< This menu item is not visible */ +#define MIF_RAMLABEL BV(13) /**< Item label is stored in RAM, not in program memory */ +#define MIF_RENDERHOOK BV(14) /**< Menu render function is passed in label field */ +/* \} */ + +/** + * Menu description. + */ +typedef struct Menu +{ + MenuItem *items; /**< Array of items (end with a NULL hook) */ + const_iptr_t title; /**< Menu title (ID or ptr to string, 0 to disable) */ + int flags; /**< See MF_#? definitions below */ + struct Bitmap *bitmap; /**< Bitmap where the menu is rendered */ + int selected; /**< Initial selection (written to if MF_SAVESEL is set). */ + BlitBitmap lcd_blitBitmap; /**< Callback to call to do smooth the display */ +} Menu; + +/** + * \name Flags for Menu.flags. + * \{ + */ +#define MF_STICKY BV(0) /**< Stay in the menu when the items called return */ +#define MF_TOPLEVEL BV(1) /**< Top-level menu (do not display "back" label) */ +#define MF_ROMITEMS BV(2) /**< Menu items are stored in ROM (default is RAM) */ +#define MF_SAVESEL BV(3) /**< Remember the selected item across invocations. */ +/* \} */ + +/** + * \name Special result codes for menu_handle(). + * \{ + */ +#define MENU_OK ((iptr_t)0) +#define MENU_CANCEL ((iptr_t)-1) +#define MENU_TIMEOUT ((iptr_t)-2) +#define MENU_ABORT ((iptr_t)-3) +#define MENU_DISABLED ((iptr_t)-4) +/* \} */ + +/* Function prototypes */ +iptr_t menu_handle(const struct Menu *menu); +int menu_setFlags(struct Menu *menu, int idx, int flags); +int menu_clearFlags(struct Menu *menu, int idx, int flags); + +#endif /* GUI_MENU_H */ diff --git a/2.5/bertos/gui/menubar.c b/2.5/bertos/gui/menubar.c new file mode 100644 index 00000000..81576bd8 --- /dev/null +++ b/2.5/bertos/gui/menubar.c @@ -0,0 +1,177 @@ +/** + * \file + * + * + * \brief Graphics Menu bar widget + * + * \author Stefano Fedrigo + * \author Francesco Sacchi + * + */ + +#include "menubar.h" + +#include +#include +#include +#include + +#warning FIXME:This module is obsolete, you must refactor it! + +#if 0 +#if CPU_AVR + #include /* strlen_P() */ +#else + #define strlen_P(s) strlen(s) + #define text_puts_P(s, b) text_puts(s, b) + #define pgm_read_uint16_t(addr) (*(addr)) +#endif + +#include /* strlen, memcpy */ + + +/** Predefined labels */ +static const pgm_char lab_1[] = ""; +static const pgm_char lab_2[] = "mute"; +static const pgm_char lab_3[] = "menu"; +static const pgm_char lab_4[] = "back"; +static const pgm_char lab_5[] = " ok "; +static const pgm_char lab_6[] = "Ch 1"; +static const pgm_char lab_7[] = "Ch 2"; +static const pgm_char lab_8[] = "C1+2"; +static const pgm_char lab_9[] = " "UP_ARROW" "; +static const pgm_char lab_10[] = " "DOWN_ARROW" "; +static const pgm_char lab_11[] = " - "; +static const pgm_char lab_12[] = " + "; +static const pgm_char lab_13[] = "sel "; +static const pgm_char lab_14[] = "lock"; +static const pgm_char lab_15[] = "unlock"; +static const pgm_char lab_16[] = "more"; +static const pgm_char lab_17[] = "edit"; +static const pgm_char lab_18[] = "fast"; +static const pgm_char lab_19[] = LEFT_ARROW" "; +static const pgm_char lab_20[] = " "RIGHT_ARROW; +static const pgm_char lab_21[] = "slow"; +static const pgm_char lab_22[] = "yes"; +static const pgm_char lab_23[] = "no"; + + +static const pgm_char * PROGMEM label_strings[LABEL_CNT] = { + lab_1, lab_2, lab_3, lab_4, lab_5, lab_6, lab_7, lab_8, lab_9, + lab_10, lab_11, lab_12, lab_13, lab_14, lab_15, lab_16, lab_17, + lab_18, lab_19, lab_20, lab_21, lab_22, lab_23 +}; + +/** + * Macro to access a label iptr_t: if a char pointer get the string pointed to + * in program memory, otherwise return the corrispondent predefined string + * (see label_strings in menubar.c) + */ +#define PTRLBL(x) ((unsigned int)(x) < 256 ? \ + (const pgm_char *)pgm_read_uint16_t(label_strings + (unsigned int)(x)) \ + : (const pgm_char *)(x)) + + +/** + * Initialize the MenuBar widget with the bitmap associated, + * the label names and the number of labels. + */ +void mbar_init( + struct MenuBar *mb, + struct Bitmap *bmp, + const_iptr_t labels[], + int num_labels) +{ + mb->bitmap = bmp; + mb->labels = labels; + mb->num_labels = num_labels; +} + + +/** + * Render the MenuBar on the bitmap. + */ +void mbar_draw(const struct MenuBar *mb) +{ + uint8_t oldstyle; + int i; + size_t maxlen = 0; /* Length of the longest label */ + coord_t x1, x2, y1, y2, label_padding; + + /* Maximum space available for a label */ + coord_t slot_width = mb->bitmap->width / mb->num_labels; + + /* Find longest label */ + for (i = 0; i < mb->num_labels; i++) + if (strlen_P(PTRLBL(mb->labels[i])) > maxlen) + maxlen = strlen_P(PTRLBL(mb->labels[i])); + + oldstyle = text_style(mb->bitmap, STYLEF_INVERT, STYLEF_MASK); + + /* y coords for menubar: bottom of the bitmap */ + y1 = mb->bitmap->height - FONT_HEIGHT; + y2 = mb->bitmap->height; + + /* Clear menubar area */ + gfx_rectClear(mb->bitmap, 0, y1, mb->bitmap->width, y2); + + for (i = 0; i < mb->num_labels; i++) + { + size_t lablen = strlen_P(PTRLBL(mb->labels[i])); + + /* Don't draw empty labels */ + if (mb->labels[i] == (const_iptr_t)LABEL_EMPTY) + continue; + + /* x coords: magic formula for equal distribution of the + * labels along bitmap + */ + label_padding = slot_width - (FONT_WIDTH * lablen + 2); + x1 = i * (slot_width + (label_padding / (mb->num_labels - 1))); + x2 = x1 + lablen * FONT_WIDTH + 1; + + /* Draw vertical line before. + * Uncomment +1 for "rounded" menubars */ + gfx_line(mb->bitmap, x1, y1 /* + 1 */, x1, y2); + + /* Draw text */ + text_setCoord(mb->bitmap, x1 + 1, y1); + text_puts_P(PTRLBL(mb->labels[i]), mb->bitmap); + + /* Draw vertical line after + * Uncomment +1 for "rounded" menubars */ + gfx_line(mb->bitmap, x2, y1 /* + 1 */, x2, y2); + } + + text_style(mb->bitmap, oldstyle, STYLEF_MASK); +} +#endif + diff --git a/2.5/bertos/gui/menubar.h b/2.5/bertos/gui/menubar.h new file mode 100644 index 00000000..a30dd46a --- /dev/null +++ b/2.5/bertos/gui/menubar.h @@ -0,0 +1,97 @@ +/** + * \file + * + * + * \brief Graphic menu bar widget. + * + * \author Stefano Fedrigo + * + */ + +#ifndef GUI_MENUBAR_H +#define GUI_MENUBAR_H + +#include + +/** Predefined labels ids */ +enum LabelId +{ + LABEL_EMPTY, /* empty label */ + LABEL_MUTE, + LABEL_MENU, + LABEL_BACK, + LABEL_OK, + LABEL_CH_1, + LABEL_CH_2, + LABEL_C1PLUS2, + LABEL_UPARROW, + LABEL_DOWNARROW, + LABEL_MINUS, + LABEL_PLUS, + LABEL_SEL, + LABEL_LOCK, + LABEL_UNLOCK, + LABEL_MORE, + LABEL_EDIT, + LABEL_FAST, + LABEL_PREV, + LABEL_NEXT, + LABEL_SLOW, + LABEL_YES, + LABEL_NO, + + + LABEL_CNT +}; + +#define UP_ARROW "\x18" +#define DOWN_ARROW "\x19" +#define RIGHT_ARROW "\xC4\x1A" +#define LEFT_ARROW "\x10\xC4" + +/* Forward decl */ +struct Bitmap; + +typedef struct MenuBar +{ + struct Bitmap *bitmap; + const_iptr_t *labels; + int num_labels; +} MenuBar; + +void mbar_init( + struct MenuBar *mb, + struct Bitmap *bmp, + const_iptr_t *labels, + int num_labels); +void mbar_draw(const struct MenuBar *mb); + +#endif /* GUI_MENUBAR_H */ diff --git a/2.5/bertos/hw/hw_afsk.h b/2.5/bertos/hw/hw_afsk.h new file mode 100644 index 00000000..eae0ef73 --- /dev/null +++ b/2.5/bertos/hw/hw_afsk.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * \author Francesco Sacchi + */ + +#ifndef HW_AFSK_H +#define HW_AFSK_H + +#include "cfg/cfg_arch.h" + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Initialize the specified channel of the ADC for AFSK needs. + * The adc should be configured to have a continuos stream of convertions. + * For every convertion there must be an ISR that read the sample + * and call afsk_adc_isr(), passing the context and the sample. + * + * \param ch channel to be used for AFSK demodulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_adc_isr() for every convertion. + */ +#define AFSK_ADC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) + +#define AFSK_STROBE_INIT() do { /* Implement me */ } while (0) +#define AFSK_STROBE_ON() do { /* Implement me */ } while (0) +#define AFSK_STROBE_OFF() do { /* Implement me */ } while (0) + +/** + * Initialize the specified channel of the DAC for AFSK needs. + * The DAC has to be configured in order to call an ISR for every sample sent. + * The DAC doesn't have to start the IRQ immediatly but have to wait + * the AFSK driver to call AFSK_DAC_IRQ_START(). + * The ISR must then call afsk_dac_isr() passing the AFSK context. + * \param ch DAC channel to be used for AFSK modulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_dac_isr() for every convertion. + */ +#define AFSK_DAC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) + +/** + * Start DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_START(ch) do { (void)ch; /* Implement me */ } while (0) + +/** + * Stop DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_STOP(ch) do { (void)ch; /* Implement me */ } while (0) + +#endif /* HW_AFSK_H */ diff --git a/2.5/bertos/hw/hw_blanker.h b/2.5/bertos/hw/hw_blanker.h new file mode 100644 index 00000000..442ce3f1 --- /dev/null +++ b/2.5/bertos/hw/hw_blanker.h @@ -0,0 +1,50 @@ +/** + * \file + * + * + * \brief Hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_BALNCKER_H +#define HW_BALNCKER_H + +#warning TODO:This is an example implementation, you must implement it! + +#define BLK_LCDON /* power_LcdOn() Implement me! */ +#define BLK_LCDOFF /* power_LcdOff() Implement me! */ + + +#endif /* HW_BLANCKER_H */ + diff --git a/2.5/bertos/hw/hw_boot.h b/2.5/bertos/hw/hw_boot.h new file mode 100644 index 00000000..34238102 --- /dev/null +++ b/2.5/bertos/hw/hw_boot.h @@ -0,0 +1,50 @@ +/** + * \file + * + * + * \brief Bootloader hardware specific definition. + * + * \author Daniele Basile + */ + +#ifndef HW_BOOT_H +#define HW_BOOT_H + +/** + * Define bootloader flash size. + * + * Note: Remember that this size should be comply + * to size defined in linker script, otherwise you + * could not find the main program application. + */ +#define FLASH_BOOT_SIZE 0x8000 // 32kbyte + +#endif /* HW_BOOT_H */ diff --git a/2.5/bertos/hw/hw_buzzer.h b/2.5/bertos/hw/hw_buzzer.h new file mode 100644 index 00000000..858ecbfb --- /dev/null +++ b/2.5/bertos/hw/hw_buzzer.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Buzzer hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_BUZZER_H +#define HW_BUZZER_H + +#warning TODO:This is an example implementation, you must implement it! + +#define BUZZER_BIT 1 +#define IS_BUZZER_ON 0 +#define BUZZER_HW_INIT do { /* Implement me! */ } while (0) +#define BUZZER_ON do { /* Implement me! */ } while (0) +#define BUZZER_OFF do { /* Implement me! */ } while (0) + +#endif /* HW_BUZZER_H */ diff --git a/2.5/bertos/hw/hw_buzzerled.h b/2.5/bertos/hw/hw_buzzerled.h new file mode 100644 index 00000000..afa01544 --- /dev/null +++ b/2.5/bertos/hw/hw_buzzerled.h @@ -0,0 +1,47 @@ +/** + * \file + * + * + * \brief Buzzerled hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + + +#ifndef HW_BUZZERLED_H +#define HW_BUZZERLED_H + +#warning TODO:This is an example implementation, you must implement it! + + +#endif /* HW_BUZZERLED_H */ diff --git a/2.5/bertos/hw/hw_cpufreq.h b/2.5/bertos/hw/hw_cpufreq.h new file mode 100644 index 00000000..41e3359d --- /dev/null +++ b/2.5/bertos/hw/hw_cpufreq.h @@ -0,0 +1,64 @@ +/** + * \file + * + * + * \brief Hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_CPUFREQ_H +#define HW_CPUFREQ_H + +#ifndef CPU_FREQ + #warning CPU_FREQ is not defined, you should upgrade to the newer clock frequency defining method. + + /* + * This file is DEPRECATED, it will be removed in the next major release. + * We have set up a new cpu frequency definition method. + * The new macro CPU_FREQ should be defined as a compiler flag in the + * makefile instead of the old CLOCK_FREQ macro. With new projects you should only + * use the CPU_FREQ macro. + * + * With gcc you should add something like this: + * + * -D'CPU_FREQ=(12288000UL)' + * + * For backward compatibility the old method is still supported. + */ + #include "hw/hw_cpu.h" + + #define CPU_FREQ (CLOCK_FREQ) +#endif /* CPU_FREQ */ + +#endif /* HW_CPUFREQ_H */ diff --git a/2.5/bertos/hw/hw_dataflash.c b/2.5/bertos/hw/hw_dataflash.c new file mode 100644 index 00000000..844dd922 --- /dev/null +++ b/2.5/bertos/hw/hw_dataflash.c @@ -0,0 +1,126 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_dataflash.h" + +#include +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +MOD_DEFINE(hw_dataflash); + +/** + * Data flash init function. + * + * This function provide to initialize all that + * needs to drive a dataflash memory. + * Generaly needs to init pins to drive a CS line + * and reset line. + */ +void dataflash_hw_init(void) +{ + + //Disable CS line (remove if not needed) + dataflash_hw_setCS(false); + + /* + * Put here your code! + * + * Note: + * - if you drive manualy CS line, here init a CS pin + * - if you use a dedicated reset line, here init a reset pin + */ + + MOD_INIT(hw_dataflash); +} + +/** + * Chip Select drive. + * + * This function enable or disable a CS line. + * You must implement this function comply to a dataflash + * memory datasheet to allow the drive to enable a memory + * when \p enable flag is true, and disable it when is false. + */ +void dataflash_hw_setCS(bool enable) +{ + if (enable) + { + /* + * Put here your code to enable + * dataflash memory + */ + } + else + { + /* + * Put here your code to disable + * dataflash memory + */ + } +} + +/** + * Reset data flash memory. + * + * This function provide to send reset signal to + * dataflash memory. You must impement it comly to a dataflash + * memory datasheet to allow the drive to set a reset pin + * when \p enable flag is true, and disable it when is false. + * + */ +void dataflash_hw_setReset(bool enable) +{ + if (enable) + { + /* + * Put here your code to set reset of + * dataflash memory + */ + } + else + { + /* + * Put here your code to clear reset of + * dataflash memory + */ + } +} + diff --git a/2.5/bertos/hw/hw_dataflash.h b/2.5/bertos/hw/hw_dataflash.h new file mode 100644 index 00000000..5254446b --- /dev/null +++ b/2.5/bertos/hw/hw_dataflash.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines (interface). + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_DATAFLASH_H +#define HW_DATAFLASH_H + +#include + +void dataflash_hw_init(void); +void dataflash_hw_setCS(bool enable); +void dataflash_hw_setReset(bool enable); + +#endif /* HW_DATAFLASH_H */ diff --git a/2.5/bertos/hw/hw_dc_motor.h b/2.5/bertos/hw/hw_dc_motor.h new file mode 100644 index 00000000..f39388df --- /dev/null +++ b/2.5/bertos/hw/hw_dc_motor.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief DC motor hardware-specific definitions + * + * \author Daniele Basile + */ + +#ifndef HW_DC_MOTOR_H +#define HW_DC_MOTOR_H + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Define fuctions which read adc value from specific device + */ + #define HW_DC_MOTOR_READ_VALUE(dev, min, max) \ + ({ \ + /* Put here the fuction that read from ADC */ \ + (void)(dev); \ + (void)(min); \ + (void)(max); \ + (0); \ + }) + +// Macro that enable the select DC motor +#define DC_MOTOR_ENABLE(dev) /* Implement me! */ +// Macro that disable the select DC motor +#define DC_MOTOR_DISABLE(dev) /* Implement me! */ + +// Macro that left the DC motor rotor float +#define DC_MOTOR_STOP_FLOAT(dev) DC_MOTOR_DISABLE(dev) +// Macro that put in short circuit DC motor supply pins +#define DC_MOTOR_STOP_BRAKED(dev) do { /* Implement me! */ } while (0) + +// Macro that set motor direction +#define DC_MOTOR_SET_DIR(dev, dir) do { /* Implement me! */ } while (0) + +#define MOTOR_DC_INIT() do { /* Implement me! */ } while (0) + + +#endif /* HW_DC_MOTOR_H */ diff --git a/2.5/bertos/hw/hw_ft245rl.h b/2.5/bertos/hw/hw_ft245rl.h new file mode 100644 index 00000000..cc0c8193 --- /dev/null +++ b/2.5/bertos/hw/hw_ft245rl.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief FT245RL USB interface hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_FT245RL_H +#define HW_FT245RL_H + +#warning TODO:This is an example implementation, you must implement it! + +#define FT245RL_DATA_IN() /* Implement me! */ +#define FT245RL_DATA_OUT() /* Implement me! */ +#define WR_HI /* Implement me! */ +#define WR_LO /* Implement me! */ + +#define RD_HI /* Implement me! */ +#define RD_LO /* Implement me! */ + +#define FT245RL_INIT() \ +do \ +{ \ + /* Implement me! */ \ +} while(0) + +#define FT245RL_DATA_RDY() (/* Implement me! */ false) +#define FT245RL_GETDATA() ({/* Implement me! */ (0);}) +#define FT245RL_TX_ALLOWED() (/* Implement me! */ false) +#define FT245RL_SETDATA(data) do {/* Implement me! */ (void)((data)); } while(0) + +#endif /* HW_FT245RL_H */ + diff --git a/2.5/bertos/hw/hw_i2c_bitbang.h b/2.5/bertos/hw/hw_i2c_bitbang.h new file mode 100644 index 00000000..4822af7c --- /dev/null +++ b/2.5/bertos/hw/hw_i2c_bitbang.h @@ -0,0 +1,66 @@ +/** + * \file + * + * + * \brief Macro for I2C bitbang operation. + * + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_I2C_BITBANG_H +#define HW_I2C_BITBANG_H + +#warning TODO:This is an example implementation, you must implement it! + +#define SDA_HI do { /* Implement me:Set SDA High by setting SDA pin as input */ } while (0) +#define SDA_LO do { /* Implement me:Set SDA Low by setting SDA pin as open collector output */ } while (0) +#define SCL_HI do { /* Implement me:Set SCL High by setting SCL pin as input */ } while (0) +#define SCL_LO do { /* Implement me:Set SCL Low by setting SCL pin as open collector output */ } while (0) + + +#define SCL_IN (true) /* Implement me: read SDA pin state */ +#define SDA_IN (true) /* Implement me: read SCL pin state */ + +/** + * This macro should set SDA and SCL lines as input. + */ +#define I2C_BITBANG_HW_INIT do { /* Implement me! */ } while (0) + +/** + * Half bit delay routine used to generate the correct timings. + */ +#define I2C_HALFBIT_DELAY() do { /* Implement me! */ } while (0) + +#endif /* HW_I2C_BITBANG_H */ diff --git a/2.5/bertos/hw/hw_input.h b/2.5/bertos/hw/hw_input.h new file mode 100644 index 00000000..dbf3bc50 --- /dev/null +++ b/2.5/bertos/hw/hw_input.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Macro for HW_INPUT_H + * + * \author Andrea Grandi + */ + +#ifndef HW_INPUT_H +#define HW_INPUT_H + +#warning FIXME: This is an example implementation, you must implement it + +#define INPUT_INIT() do { /* implement me */} while(0) + +#endif /* HW_INPUT_H */ diff --git a/2.5/bertos/hw/hw_kbd.h b/2.5/bertos/hw/hw_kbd.h new file mode 100644 index 00000000..9ca228cb --- /dev/null +++ b/2.5/bertos/hw/hw_kbd.h @@ -0,0 +1,72 @@ +/** + * \file + * + * + * \brief Keyboard hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_H +#define HW_KBD_H + +#include "hw/kbd_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define K_RPT_MASK (K_UP | K_DOWN | K_OK | K_CANCEL) + +#define KBD_HW_INIT \ + do { \ + /* Put here code to init hw */ \ + } while (0) + +EXTERN_C int emul_kbdReadCols(void); + +/** + * Read the keyboard ports and return the mask of + * depressed keys. + */ +INLINE keymask_t kbd_readkeys(void) +{ + /* Implement me! */ + + //Only for test remove when implement this function + return 0; +} + +#endif /* HW_KBD_H */ diff --git a/2.5/bertos/hw/hw_lcd_32122a.h b/2.5/bertos/hw/hw_lcd_32122a.h new file mode 100644 index 00000000..6ec29c5c --- /dev/null +++ b/2.5/bertos/hw/hw_lcd_32122a.h @@ -0,0 +1,155 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_32122A_H +#define HW_LCD_32122A_H + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Predefined LCD PWM contrast values + */ +#define LCD_DEF_PWM 145 +#define LCD_MAX_PWM 505 +#define LCD_MIN_PWM 130 +#define LCD_PWM_CH 0 + + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_PE_E1 /* Implement me! */ +#define LCD_PE_E2 /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +#define LCD_PF_DB0 /* Implment me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_A0 do { /* Implement me! */ } while (0) +#define LCD_SET_A0 do { /* Implement me! */ } while (0) +#define LCD_CLR_RD do { /* Implement me! */ } while (0) +#define LCD_SET_RD do { /* Implement me! */ } while (0) +#define LCD_CLR_E1 do { /* Implement me! */ } while (0) +#define LCD_SET_E1 do { /* Implement me! */ } while (0) +#define LCD_CLR_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E(x) do { (void)x; /* Implement me! */ } while (0) +#define LCD_CLR_E(x) do { (void)x; /* Implement me! */ } while (0) +/*@}*/ + +/** + * \name Chip select bits for LCD_SET_E() + * @{ + */ +#define LCDF_E1 ( 0/* Implement me! */) +#define LCDF_E2 ( 0/* Implement me! */) +/*@}*/ +/** Read from the LCD data bus (DB[0-7]) */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/** Write to the LCD data bus (DB[0-7]) */ +#define LCD_READ (0 /* Implement me! */ ) + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ + +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + +#define LCD_32122_RESET() do { /* Implement me! */ } while (0) + +INLINE void lcd_32122a_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_32122A_H */ + diff --git a/2.5/bertos/hw/hw_lcd_hd44.h b/2.5/bertos/hw/hw_lcd_hd44.h new file mode 100644 index 00000000..dfebbcab --- /dev/null +++ b/2.5/bertos/hw/hw_lcd_hd44.h @@ -0,0 +1,157 @@ +/** + * \file + * + * + * \brief LCD low-level hardware macros + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_HD44_H +#define HW_LCD_HD44_H + +#include "cfg/cfg_lcd_hd44.h" /* CONFIG_LCD_4BIT */ + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_E /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +/*@}*/ + +/** + * \name DB high nibble (DB[4-7]) + * @{ + */ + +#if CONFIG_LCD_4BIT + #define LCD_MASK (LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4) + #define LCD_SHIFT 4 +#else + #define LCD_MASK (uint8_t)0xff + #define LCD_SHIFT 0 +#endif +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_RS /* Implement me! */ +#define LCD_SET_RS /* Implement me! */ +#define LCD_CLR_RD /* Implement me! */ +#define LCD_SET_RD /* Implement me! */ +#define LCD_CLR_E /* Implement me! */ +#define LCD_SET_E /* Implement me! */ + +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +#if CONFIG_LCD_4BIT + #define LCD_WRITE_H(x) ((void)x)/* Implement me! */ + #define LCD_WRITE_L(x) ((void)x)/* Implement me! */ + #define LCD_READ_H ( 0 /* Implement me! */ ) + #define LCD_READ_L ( 0 /* Implement me! */ ) +#else + #define LCD_WRITE(x) ((void)x)/* Implement me! */ + #define LCD_READ (0 /* Implement me! */ ) +#endif +/*@}*/ + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + + +INLINE void lcd_hd44_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_HD44_H */ diff --git a/2.5/bertos/hw/hw_led.h b/2.5/bertos/hw/hw_led.h new file mode 100644 index 00000000..615b071b --- /dev/null +++ b/2.5/bertos/hw/hw_led.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Led on/off macros. + * + * \author Daniele Basile + */ + +#ifndef HW_LED_H +#define HW_LED_H + +#warning FIXME: This is an example implementation, you must implement it + +#define LED_ON() do { /* implement me */} while(0) +#define LED_OFF() do { /* implement me */} while(0) + +#define LED_INIT() do { /* implement me */} while(0) + +#endif /* HW_LED_H */ diff --git a/2.5/bertos/hw/hw_lm75.h b/2.5/bertos/hw/hw_lm75.h new file mode 100644 index 00000000..290dae09 --- /dev/null +++ b/2.5/bertos/hw/hw_lm75.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_LM75_H +#define HW_LM75_H + +#warning TODO:This is an example implentation, you must implement it! + +#define LM75_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_LM75_H */ + diff --git a/2.5/bertos/hw/hw_mcp41.c b/2.5/bertos/hw/hw_mcp41.c new file mode 100644 index 00000000..dc2a051c --- /dev/null +++ b/2.5/bertos/hw/hw_mcp41.c @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_mcp41.h" + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +const uint16_t mcp41_ports[MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; +const uint8_t mcp41_pins [MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; + diff --git a/2.5/bertos/hw/hw_mcp41.h b/2.5/bertos/hw/hw_mcp41.h new file mode 100644 index 00000000..645b6dac --- /dev/null +++ b/2.5/bertos/hw/hw_mcp41.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_MCP41_H +#define HW_MCP41_H + +#include "hw/mcp41_map.h" + +#include + + +#warning TODO:This is an example implementation, you must implement it! + + +INLINE void SET_MCP41_DDR(Mcp41Dev dev) +{ + /* Implement me! */ + //Warning: this funtions is like avr target name, + //fix it to comply for all target. + + //Only for test remove when implement this function + (void)dev; +} + +INLINE void MCP41_ON(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void MCP41_OFF(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +#endif /* HW_MCP41_H */ diff --git a/2.5/bertos/hw/hw_ntc.c b/2.5/bertos/hw/hw_ntc.c new file mode 100644 index 00000000..b8c56914 --- /dev/null +++ b/2.5/bertos/hw/hw_ntc.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id: hw_ntc.h 1359 2008-05-26 09:42:37Z asterix $ + * \author Lorenzo Berni + * + */ + +#include +#include "hw/ntc_map.h" + +const res_t NTC_RSER[NTC_CNT]; +const res_t NTC_RPAR[NTC_CNT]; +const amp_t NTC_AMP[NTC_CNT]; +const NtcHwInfo* NTC_INFO[NTC_CNT]; diff --git a/2.5/bertos/hw/hw_ntc.h b/2.5/bertos/hw/hw_ntc.h new file mode 100644 index 00000000..49152a45 --- /dev/null +++ b/2.5/bertos/hw/hw_ntc.h @@ -0,0 +1,136 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id$ + * \author Francesco Sacchi + * + * A NTC acts as a variable resistor, whose resistance changes as a + * function of the temperature it measures. To sample it correctly, it is + * usually parallelized and serialized with two fixed resistor. The following diagram shows + * what is the exact disposition of the components, as handled by this + * library: + * + *
+ *                 o Vref
+ *                 |
+ *                 |                               o Vref
+ *                 |                               |
+ *               -----                             |
+ *              |     |                        ---------
+ *              | Rser|                       |         |
+ *              |     |                       |         |
+ *               -----     -----              |   ADC   |
+ *                 | Vp   |     |             |         |
+ *      -----------|------| Amp |-------------|         |
+ *     |           |      |     |      Vadc   |         |
+ *   -----       -----     -----               ---------
+ *  |     |     |     |
+ *  | NTC |     | Rpar|
+ *  |     |     |     |
+ *   -----       -----
+ *     |           |
+ *     |           |
+ *   -----       -----
+ *    ---         ---
+ *
+ * Amp is an amplifier that amplify of AMP times the signal. + * If we indicate Rp as the parallel of NTC with Rpar, ADCBITS as the bits of the ad converter + * and ADCVAL as the result from the adc convertion (Not Vadc but just the value read + * from the adc register), after various calculation, the expression of Rp is: + * + *
+ *
+ *            ADCVAL * Rser
+ * Rp = ------------------------
+ *         ADCBITS
+ *	2         * AMP - ADCVAL
+ *
+ * + * And after that NTC obvisiously is: + *
+ *        Rpar * Rp
+ * NTC = ----------
+ *        Rpar - Rp
+ *
+ * + * + * The function ntc_hw_read() compute the resistence using these formulas above. + */ + +#ifndef HW_NTC_H +#define HW_NTC_H + +#include "ntc_map.h" + +#include + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +extern const res_t NTC_RSER[NTC_CNT]; +extern const res_t NTC_RPAR[NTC_CNT]; +extern const amp_t NTC_AMP[NTC_CNT]; +extern const NtcHwInfo* NTC_INFO[NTC_CNT]; + + +/*! + * Read the resistence of ntc device \a dev. + * Return the result in res_t type. + */ +INLINE res_t ntc_hw_read(NtcDev dev) +{ + ASSERT(dev < NTC_CNT); + // See above for formula explanation. + adcread_t adcval = adc_read((uint16_t)dev); + float rp = (adcval * NTC_RSER[dev] ) / ((1 << adc_bits()) * NTC_AMP[dev] - adcval); + + //kprintf("Rp[%f], Rntc[%f]\n", rp/100, ((NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp)) / 100.0); + + return ( (NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp) ); +} + + +/*! + * Return the info (aka the table) associated with ntc device \a dev. + */ +INLINE const NtcHwInfo* ntc_hw_getInfo(NtcDev dev) +{ + return NTC_INFO[dev]; +} + +#define NTC_HW_INIT do { /* Implement me! */ } while(0) + +#endif /* HW_NTC_H */ diff --git a/2.5/bertos/hw/hw_phase.c b/2.5/bertos/hw/hw_phase.c new file mode 100644 index 00000000..54509ef3 --- /dev/null +++ b/2.5/bertos/hw/hw_phase.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/hw_phase.h" + +#warning TODO:This is an example implementation, you must implement it! + +#endif /* HW_PHASE_H */ diff --git a/2.5/bertos/hw/hw_phase.h b/2.5/bertos/hw/hw_phase.h new file mode 100644 index 00000000..7649e702 --- /dev/null +++ b/2.5/bertos/hw/hw_phase.h @@ -0,0 +1,80 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/phase_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define PHASE_HW_INIT do { /* Implement me! */ }while (0) + +INLINE void TRIAC_OFF(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + + +INLINE void TRIAC_ON(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void SET_TRIAC_DDR(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +void zerocross_isr(void); +#define DEFINE_ZEROCROSS_ISR() void zerocross_isr(void) + + +#endif /* HW_PHASE_H */ diff --git a/2.5/bertos/hw/hw_rit128x96.h b/2.5/bertos/hw/hw_rit128x96.h new file mode 100644 index 00000000..c24d1a87 --- /dev/null +++ b/2.5/bertos/hw/hw_rit128x96.h @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \brief LM3S1986: OLED-RIT-128x96 (P14201) low-level hardware macros + * + * \author Andrea Righi + */ + +#ifndef HW_RIT128x96_H +#define HW_RIT128x96_H + +#include "cfg/macros.h" /* BV() */ +#include "cfg/debug.h" + +#include +#include +#include + +/** + * \name LCD I/O pins/ports + * @{ + */ +/* OLED Data/Command control pin */ +#define GPIO_OLEDDC_PIN 0 /* Implement me! */ + +/* OLED enable pin */ +#define GPIO_OLEDEN_PIN 0 /* Implement me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +/* Send data to the display */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/*@}*/ + +INLINE void lcd_rit128x96_hw_bus_init(void) +{ + /* Implement me! */ +} + +#endif /* HW_RIT128x96_H */ diff --git a/2.5/bertos/hw/hw_sd.h b/2.5/bertos/hw/hw_sd.h new file mode 100644 index 00000000..d15b5506 --- /dev/null +++ b/2.5/bertos/hw/hw_sd.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief SD driver hardware-specific definitions. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef HW_SD_H +#define HW_SD_H + +#warning FIXME: This is an example implementation, you must implement it + +#define SD_CS_INIT() do { /* implement me */} while(0) +#define SD_CS_ON() do { /* implement me */} while(0) +#define SD_CS_OFF() do { /* implement me */} while(0) + +#define SD_PIN_INIT() do { /* implement me */} while(0) +#define SD_CARD_PRESENT() true /* implement me */ +#define SD_WRITE_PROTECT() false /* implement me */ + +#endif /* HW_SD_H */ diff --git a/2.5/bertos/hw/hw_sensor.h b/2.5/bertos/hw/hw_sensor.h new file mode 100644 index 00000000..113e468f --- /dev/null +++ b/2.5/bertos/hw/hw_sensor.h @@ -0,0 +1,93 @@ +/** + * \file + * + * + * \brief Sensor hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_SENSOR_H +#define HW_SENSOR_H + +#warning TODO:This is an example implementation, you must implement it! + +#define NUM_HOME_SENSORS 1 + + +INLINE bool hw_home_sensor_read(int sensor) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)sensor; + return 0; +} + +INLINE void hw_home_sensor_set_inverted(int sensor, bool inverted) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)sensor; + (void)inverted; +} + +INLINE bool hw_level_sensor_read(int sensor) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)sensor; + return 0; +} + +INLINE void hw_level_sensor_set_inverted(int sensor, bool inverted) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)sensor; + (void)inverted; +} + +INLINE bool bld_hw_sensor_read(int sensor) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)sensor; + return 0; +} + +#endif /* HW_SENSOR_H */ diff --git a/2.5/bertos/hw/hw_ser.h b/2.5/bertos/hw/hw_ser.h new file mode 100644 index 00000000..2489c433 --- /dev/null +++ b/2.5/bertos/hw/hw_ser.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Serial hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_SER_H +#define HW_SER_H + +#include "cfg/cfg_ser.h" + +#if CONFIG_SER_STROBE + #warning FIXME: this is an example implementation, you must implement it + + #define SER_STROBE_INIT do { /* implement me */ } while (0) + #define SER_STROBE_ON do { /* implement me */ } while (0) + #define SER_STROBE_OFF do { /* implement me */ } while (0) +#endif + +#endif /* HW_SER_H */ diff --git a/2.5/bertos/hw/hw_sipo.h b/2.5/bertos/hw/hw_sipo.h new file mode 100644 index 00000000..3371c2c0 --- /dev/null +++ b/2.5/bertos/hw/hw_sipo.h @@ -0,0 +1,109 @@ +/** + * \file + * + * + * \brief Macro for HW_SIPO_H + * + * + * \version $Id$ + * + * \author Andrea Grandi + * \author Daniele Basile + */ + +#ifndef HW_SIPO_H +#define HW_SIPO_H + +/** + * Map sipo connection on board. + */ +typedef enum SipoMap +{ + SIPO_CNT +} SipoMap; + +/** + * Define generic macro to set pins logic level + */ +#define SIPO_SET_LEVEL_LOW(dev) do { /* Implement me! */ } while (0) +#define SIPO_SET_LEVEL_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Generate one low pulse on select line. + */ +#define PULSE_LOW(dev) do { /* Implement me! */ } while (0) + +/** + * Generate one hight pulse on select line. + */ +#define PULSE_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Define the procedure to drive serial input in sipo device (SI). + */ +#define SIPO_SI_HIGH() do { /* Implement me! */ } while (0) +#define SIPO_SI_LOW() do { /* Implement me! */ } while (0) + +/** + * Drive clock to shift SI data into latch. + */ +#define SIPO_SI_CLOCK(clk_pol) \ + do { \ + (void)clk_pol; \ + /* Implement me! */ \ + } while (0) + +/** + * Do everything needed in order to load dato into sipo. + */ +#define SIPO_LOAD(device, load_pol) do { /* Implement me! */ } while (0) + +/** + * Enable the shift register output. + */ +#define SIPO_ENABLE() do { /* Implement me! */ } while (0) + +/** + * Set polarity for Load, Clk, SI signals. + */ +#define SIPO_SET_LD_LEVEL(device, load_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_CLK_LEVEL(clock_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_SI_LEVEL() do { /* Implement me! */ } while (0) + +/** + * Do anything that needed to init sipo pins. + */ +#define SIPO_INIT_PIN() do { /* Implement me! */ } while (0) + +#endif /* HW_SIPO_H */ diff --git a/2.5/bertos/hw/hw_spi.h b/2.5/bertos/hw/hw_spi.h new file mode 100644 index 00000000..04e4893a --- /dev/null +++ b/2.5/bertos/hw/hw_spi.h @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef HW_SPI_H +#define HW_SPI_H + +#warning TODO:This is an example implentation, you must implement it! + +#include + +/** + * SPI pin definition. + * + * \note CS is assert when level + * is low. + * + * \{ + */ +#define CS /* pin */ ///Connect to CS pin of Flash memory. +#define SCK /* pin */ ///Connect to SCK pin of Flash memory. +#define MOSI /* pin */ ///Connect to SI pin of Flash memory. +#define MISO /* pin */ ///Connect to SO pin of Flash memory. +#define SPI_PORT /* pin */ ///Micro pin PORT register. +#define SPI_PIN /* pin */ ///Micro pin PIN register. +#define SPI_DDR /* pin */ ///Micro pin DDR register. +/*\}*/ + +/** + * Pin logic level. + * + * \{ + */ +#define MOSI_LOW() do { /* Implement me! */ } while(0) +#define MOSI_HIGH() do { /* Implement me! */ } while(0) +#define MISO_HIGH() do { /* Implement me! */ } while(0) +#define SCK_LOW() do { /* Implement me! */ } while(0) +#define SCK_HIGH() do { /* Implement me! */ } while(0) +#define CS_LOW() do { /* Implement me! */ } while(0) +#define CS_HIGH() do { /* Implement me! */ } while(0) +/*\}*/ + +/** + * SPI pin commands. + * + * \{ + */ +#define CS_ENABLE() CS_LOW() +#define CS_DISABLE() CS_HIGH() +#define SS_ACTIVE() CS_LOW() +#define SS_INACTIVE() CS_HIGH() +#define SCK_INACTIVE() SCK_LOW() +#define SCK_ACTIVE() SCK_HIGH() +#define CS_OUT() do { /* Implement me! */ } while(0) +#define MOSI_IN() do { /* Implement me! */ } while(0) +#define MOSI_OUT() do { /* Implement me! */ } while(0) +#define IS_MISO_HIGH() (false /* Implement me! */ ) +#define MISO_IN() do { /* Implement me! */ } while(0) +#define MISO_OUT() do { /* Implement me! */ } while(0) +#define SCK_OUT() do { /* Implement me! */ } while(0) + +#define SCK_PULSE()\ + do {\ + SCK_HIGH();\ + SCK_LOW();\ + } while (0) +/*\}*/ + + +#define SPI_HW_INIT() \ + CS_DISABLE();\ + MOSI_LOW();\ + SCK_LOW();\ + MISO_IN();\ + MOSI_OUT();\ + SCK_OUT();\ + CS_OUT(); + +#endif /* HW_SPI_H */ + diff --git a/2.5/bertos/hw/hw_spi_dma.h b/2.5/bertos/hw/hw_spi_dma.h new file mode 100644 index 00000000..e0714d43 --- /dev/null +++ b/2.5/bertos/hw/hw_spi_dma.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief SPI DMA driver hardware-specific definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_SPI_DMA_H +#define HW_SPI_DMA_H + +#define SPI_DMA_STROBE_INIT() do {/*PIOA_PER = BV(13); PIOA_OER = BV(13);*/} while(0) + +#define SPI_DMA_STROBE_ON() do {/*PIOA_CODR = BV(13);*/} while(0) +#define SPI_DMA_STROBE_OFF() do {/*PIOA_SODR = BV(13);*/} while(0) + +#endif /* HW_SPI_DMA_H */ diff --git a/2.5/bertos/hw/hw_stepper.h b/2.5/bertos/hw/hw_stepper.h new file mode 100644 index 00000000..13141124 --- /dev/null +++ b/2.5/bertos/hw/hw_stepper.h @@ -0,0 +1,309 @@ +/** + * \file + * + * + * \brief Stepper hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + + +#ifndef HW_STEPPER_H +#define HW_STEPPER_H + +#include + +#include + +#include + +#warning TODO:This is an example implentation, you must implement it! + +#define STEPPER_STROBE_INIT \ +do { \ + /* put init code for strobe */ \ +} while (0) + + +#define STEPPER_STROBE_ON do { /* Implement me! */ } while(0) +#define STEPPER_STROBE_OFF do { /* Implement me! */ } while(0) + +/** + * CPU clock frequency is divided by 2^STEPPER_PRESCALER_LOG2 to + * obtain stepper clock. + */ +#define STEPPER_PRESCALER_LOG2 1 + +/** + * Stepper timer clock frequency. + */ +#define STEPPER_CLOCK ((CPU_FREQ) >> STEPPER_PRESCALER_LOG2) + +/** + * us delay to reset a stepper motor. + * This is the time neccessary to reset + * the stepper controll chip. (see datasheet for more detail). + */ +#define STEPPER_RESET_DELAY 1 + +/* + * Pins define for each stepper + */ +#define STEPPER_1_CW_CCW_PIN 0 +#define STEPPER_1_HALF_FULL_PIN 0 +#define STEPPER_1_CONTROL_PIN 0 +#define STEPPER_1_ENABLE_PIN 0 +#define STEPPER_1_RESET_PIN 0 + +/* put here other stepper motor */ + +#define STEPPER_1_SET do { /* Implement me! */ } while(0) +/* add here the set for other stepper motor */ + +#define STEPPER_1_CLEAR do { /* Implement me! */ } while(0) +/* add here the clear for other stepper motor */ + +/* + * Generic macro definition + */ + +/* + * Stepper init macro + */ +#define STEPPER_PIN_INIT_MACRO(port, index) do { \ + /* Add here init pin code */ \ + } while (0) + +/* + * Stepper commands macros + */ +#define STEPPER_SET_CW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CCW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_HALF(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_FULL(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_LOW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_HIGHT(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_DISABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_DISABLE(index) do { /* Implement me! */ } while (0) + + +/* + * Reset stepper macro + */ + +#define STEPPER_RESET_MACRO(index) do { \ + STEPPER_SET_RESET_ENABLE(index); \ + timer_udelay(STEPPER_RESET_DELAY); \ + STEPPER_SET_RESET_DISABLE(index); \ + } while (0) + +/* + * Set half or full step macro + */ +#define STEPPER_SET_STEP_MODE_MACRO(index, flag) do { \ + if (flag) \ + STEPPER_SET_HALF(index); \ + else \ + STEPPER_SET_FULL(index); \ + } while (0) + +/* + * Set control status macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_CONTROL_BIT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macros not implemented */ \ + /* else */ \ + /* WARNING This macros not implemented */ \ + } while (0) + +/* + * Set current power macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_POWER_CURRENT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macrois not implemented */ \ + /* else */ \ + /* WARNING This macrois not implemented */ \ + } while (0) + +/* + * Set rotation of stepper motor + * - dir = 1: positive rotation + * - dir = 0: no motor moviment + * - dir = -1: negative rotation + * + */ +#define STEPPER_SET_DIRECTION_MACRO(index, dir) do { \ + switch (dir) \ + { \ + case 1: \ + STEPPER_SET_CW(index); \ + break; \ + case -1: \ + STEPPER_SET_CCW(index); \ + break; \ + case 0: \ + break; \ + } \ + } while (0) + + +/* + * Define macros for manage low level of stepper. + */ + +#define STEPPER_INIT() do { \ + STEPPER_PIN_INIT_MACRO(A, 1); \ + /* Add here code for other stepper motor */ \ + } while (0) + + +/* + * Enable select stepper motor + */ +#define STEPPER_ENABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_ENABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Enable all stepper connect to micro + */ +#define STEPPER_ENABLE_ALL() do { \ + STEPPER_SET_ENABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Disable select stepper motor + */ +#define STEPPER_DISABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DISABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Disable all stepper connect to micro + */ +#define STEPPER_DISABLE_ALL() do { \ + STEPPER_SET_DISABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Reset selected stepper motor + */ +#define STEPPER_RESET(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_RESET_MACRO(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Reset all stepper motor + */ +#define STEPPER_RESET_ALL() do { \ + STEPPER_RESET_MACRO(1) \ + /* Add here code for other stepper motor */ \ + } while (0) + +// Set half/full step macros +#define STEPPER_SET_HALF_STEP(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_STEP_MODE_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Control status +#define STEPPER_SET_CONTROL_BIT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_CONTROL_BIT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Set stepper power current +#define STEPPER_SET_POWER_CURRENT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_POWER_CURRENT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +// Set rotation dirction of stepper motor +#define STEPPER_SET_DIRECTION(index, dir) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DIRECTION_MACRO(1, dir); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +#endif /* HW_STEPPER_H */ + + diff --git a/2.5/bertos/hw/hw_tas5706a.h b/2.5/bertos/hw/hw_tas5706a.h new file mode 100644 index 00000000..d1e1a2e6 --- /dev/null +++ b/2.5/bertos/hw/hw_tas5706a.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief HW pin handling. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_TAS5706A_H +#define HW_TAS5706A_H + +#include + +#warning FIXME: This is an example implementation, you must implement it + +#define TAS5706A_SETPOWERDOWN(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETRESET(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETMUTE(val) do { (void) val; /* implement me */ } while (0) + +#define TAS5706A_PIN_INIT() \ + do { \ + TAS5706A_SETPOWERDOWN(true); \ + TAS5706A_SETRESET(true); \ + TAS5706A_SETMUTE(true); \ + /* complete me */ \ + } while (0) + +#define TAS5706A_MCLK_INIT() \ + do { \ + /* implement me */ \ + } while(0) + + +#endif /* HW_TAS5706A_H */ diff --git a/2.5/bertos/hw/hw_tc520.h b/2.5/bertos/hw/hw_tc520.h new file mode 100644 index 00000000..3ff492d5 --- /dev/null +++ b/2.5/bertos/hw/hw_tc520.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * + * \brief TC520 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_TC520_H +#define HW_TC520_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + +#define CE_PIN 0 +#define DV_PIN 0 +#define LOAD_PIN 0 +#define READ_PIN 0 + + +#define DV_HIGH() /* Implement me! */ +#define DV_LOW() /* Implement me! */ + +#define CE_HIGH() /* Implement me! */ +#define CE_LOW() /* Implement me! */ + +#define LOAD_HIGH() /* Implement me! */ +#define LOAD_LOW() /* Implement me! */ + +#define READ_HIGH() /* Implement me! */ +#define READ_LOW() /* Implement me! */ + +#define TC520_HW_INIT \ +do\ +{\ + /* Put here your code to init hardware */ \ +} while(0) + +#endif /* HW_TC520_H */ diff --git a/2.5/bertos/hw/hw_thermo.h b/2.5/bertos/hw/hw_thermo.h new file mode 100644 index 00000000..6f478068 --- /dev/null +++ b/2.5/bertos/hw/hw_thermo.h @@ -0,0 +1,121 @@ +/** + * \file + * + * + * \brief thermo hardware-specific control functions. + * + * \author Francesco Sacchi + * + */ + +#ifndef HW_THERMO_H +#define HW_THERMO_H + +#include "hw/thermo_map.h" + +#include + +#include + + +INLINE ticks_t thermo_hw_timeout(ThermoDev dev) +{ + (void)dev; + return 0; +} + +/** + * This function should return the temperature set tolerance. + */ +INLINE deg_t thermo_hw_tolerance(ThermoDev dev) +{ + (void)dev; + return 0; +} + +/** + * Read the temperature of the hw device \a dev. + */ +INLINE deg_t thermo_hw_read(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + /* Put here the code to read current temperature */ + return 0; +} + + +/** + * Turns off a specific device. + * This function is usefull to handle errors. + */ +INLINE void thermo_hw_off(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + /* Put here the code to turn off the thermo device */ +} + +/** + * Based on the current temperature \a cur_temp and the target temperature \a target, + * this function turns on and off specific thermo device. + * It may use also PID control for thermo-regolations. + */ +INLINE void thermo_hw_set(ThermoDev dev, deg_t target, deg_t cur_temp) +{ + ASSERT(dev < THERMO_CNT); + + if (target - cur_temp > 0) + { + /* + * We are leveaving the target temperature, so + * turn on the thermo device! + */ + } + else + { + /* + * Ok, we are near the target temperature, so + * turn off the thermo device! + */ + } + +} + +#define THERMO_HW_INIT _thermo_hw_init() + +/** + * Init hw associated with thermo-control. + */ +INLINE void _thermo_hw_init(void) +{ + /* Init your devices here! */ +} + +#endif /* HW_THERMO_H */ diff --git a/2.5/bertos/hw/hw_timer.h b/2.5/bertos/hw/hw_timer.h new file mode 100644 index 00000000..ce1b985c --- /dev/null +++ b/2.5/bertos/hw/hw_timer.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Timer hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_TIMER_H +#define HW_TIMER_H + +#include "cfg/cfg_timer.h" + +#if CONFIG_TIMER_STROBE + #warning TODO:This is an example implementation, you must implement it! + #define TIMER_STROBE_INIT do { /* implement me */ } while (0) + #define TIMER_STROBE_ON do { /* implement me */ } while (0) + #define TIMER_STROBE_OFF do { /* implement me */ } while (0) +#endif + +#endif /* HW_TIMER_H */ diff --git a/2.5/bertos/hw/hw_tlv5618.h b/2.5/bertos/hw/hw_tlv5618.h new file mode 100644 index 00000000..4a2b4202 --- /dev/null +++ b/2.5/bertos/hw/hw_tlv5618.h @@ -0,0 +1,69 @@ +/** + * \file + * + * + * \brief TLV5816 DAC hardware-specific definitions + * + * + * \author Francesco Sacchi + */ + +#ifndef HW_TLV5816_H +#define HW_TLV5816_H + +#warning TODO:This is an example implementation, you must implement it! + +#define TLV5618_CSINIT(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ + TLV5618_CSHIGH(pin); \ +} while(0) + +#define TLV5618_CSLOW(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#define TLV5618_CSHIGH(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#endif /* HW_TLV5816_H */ + diff --git a/2.5/bertos/hw/hw_tmp123.h b/2.5/bertos/hw/hw_tmp123.h new file mode 100644 index 00000000..adb18588 --- /dev/null +++ b/2.5/bertos/hw/hw_tmp123.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_TMP123_H +#define HW_TMP123_H + +#warning TODO:This is an example implentation, you must implement it! + +#define TMP123_HW_CS_EN() /* Implement me! */ +#define TMP123_HW_CS_DIS() /* Implement me! */ + +#define TMP123_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_TMP123_H */ + diff --git a/2.5/bertos/hw/kbd_map.h b/2.5/bertos/hw/kbd_map.h new file mode 100644 index 00000000..ffe14311 --- /dev/null +++ b/2.5/bertos/hw/kbd_map.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Keyboard map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_MAP_H +#define HW_KBD_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + + +/** + * Type for keyboard mask. + */ +typedef uint16_t keymask_t; + +/** + * \name Keycodes. + */ +/*@{*/ +#define K_UP BV(0) +#define K_DOWN BV(1) +#define K_OK BV(2) +#define K_CANCEL BV(3) + +#define K_REPEAT BV(13) /**< This is a repeated keyevent. */ +#define K_TIMEOUT BV(14) /**< Fake key event for timeouts. */ +#define K_LONG BV(15) +/*@}*/ + +#define K_LNG_MASK 0 + +#endif /* HW_KBD_MAP_H */ diff --git a/2.5/bertos/hw/mcp41_map.h b/2.5/bertos/hw/mcp41_map.h new file mode 100644 index 00000000..6646391c --- /dev/null +++ b/2.5/bertos/hw/mcp41_map.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief MCP41 digital potentiometer map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef MCP41_MAP_H +#define MCP41_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/** \name Enum for mcp41 pot evices. + * \{ + * + */ +typedef enum Mcp41Dev +{ + MCP41_LED, + + /* put here other mcp41 device */ + + MCP41_CNT, +} Mcp41Dev; +/* \} */ + +#endif /* MCP41_MAP_H */ diff --git a/2.5/bertos/hw/ntc_map.h b/2.5/bertos/hw/ntc_map.h new file mode 100644 index 00000000..505f1c31 --- /dev/null +++ b/2.5/bertos/hw/ntc_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief NTC map definitions. + * + * \version $Id$ + * + * \author Giovanni Bajo + * \author Francesco Sacchi + */ + +#ifndef NTC_MAP_H +#define NTC_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for ntc devices. + * \{ + */ +typedef enum NtcDev +{ + NTC_TEST, + + /* Put here your thermo device */ + + NTC_CNT +} NtcDev; +/* \} */ + +#endif /* NTC_MAP_H */ diff --git a/2.5/bertos/hw/phase_map.h b/2.5/bertos/hw/phase_map.h new file mode 100644 index 00000000..7436e5e8 --- /dev/null +++ b/2.5/bertos/hw/phase_map.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief Triac map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef PHASE_MAP_H +#define PHASE_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for triac devices. + * \{ + */ +typedef enum TriacDev +{ + TRIAC_TEST, + + /* Put here other triac device */ + + TRIAC_CNT +} TriacDev; +/* \} */ + +#endif /* PHASE_MAP_H */ diff --git a/2.5/bertos/hw/pwm_map.h b/2.5/bertos/hw/pwm_map.h new file mode 100644 index 00000000..723da2f1 --- /dev/null +++ b/2.5/bertos/hw/pwm_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * + * \brief PWM map device. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_PWM_MAP_H +#define HW_PWM_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +typedef enum +{ + PWM_CH0 = 0, + PWM_CH1, + PWM_CH2, + PWM_CH3, + +/* + * add other PWM channel or + * change above. + */ + + PWM_CNT +} PwmDev; + +#endif /* HW_PWM_MAP_H */ diff --git a/2.5/bertos/hw/thermo_map.h b/2.5/bertos/hw/thermo_map.h new file mode 100644 index 00000000..7dbe27bc --- /dev/null +++ b/2.5/bertos/hw/thermo_map.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Thermo regulation control map definitions. + * + * \author Francesco Sacchi + */ + +#ifndef THERMO_MAP_H +#define THERMO_MAP_H + +#include +#include + + +#warning TODO:This is an example implentation, you must implement it! + +typedef enum ThermoDev +{ + THERMO_TEST, + + /* Put here your thermo device */ + + THERMO_CNT +} ThermoDev; + +#endif /* THERMO_MAP_H */ diff --git a/2.5/bertos/icons/Makefile b/2.5/bertos/icons/Makefile new file mode 100644 index 00000000..50469549 --- /dev/null +++ b/2.5/bertos/icons/Makefile @@ -0,0 +1,45 @@ +# +# $Id: Makefile 18234 2007-10-08 13:39:48Z rasky $ +# Copyright 2004, 2006 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Author: Stefano Fedrigo +# +# $Log$ +# Revision 1.2 2006/09/20 14:18:01 marco +# Use only icons neede by demo. +# +# Revision 1.1 2006/09/19 17:48:00 bernie +# Add temporary logo. +# +# + +# Set to 1 for debug builds +DEBUG = 1 + +RASTERS = logo.raster + +FLIPIMAGE = flipimage +flipimage_SRC = flipimage.cpp +flipimage_OBJ = $(flipimage_SRC:%.cpp=%.o) + +.PHONY: all +all: $(RASTERS) + +# Link rule +$(FLIPIMAGE): $(flipimage_OBJ) + $(CXX) $^ $(flipimage_LIBS) $(LDFLAGS) -o $@ + +.PHONY: clean +clean: + rm -f $(TRG) $(flipimage_OBJ) + rm -f $(RASTERS) + +.PHONY: rasters +rasters: $(FLIPIMAGE) $(RASTERS) + +%.raster: %.png $(FLIPIMAGE) + convert $< txt:- | ./flipimage >$@ + +# Include dependencies +-include *.d diff --git a/2.5/bertos/icons/flipimage.cpp b/2.5/bertos/icons/flipimage.cpp new file mode 100644 index 00000000..3cf58197 --- /dev/null +++ b/2.5/bertos/icons/flipimage.cpp @@ -0,0 +1,125 @@ +/** + * \file + * + * + * \version $Id$ + * \author Stefano Fedrigo + * + * \brief Conversion tool from image TXT format to LCD bitmap + */ + +/* + * $Log$ + * Revision 1.1 2006/09/19 17:48:00 bernie + * Add temporary logo. + * + * Revision 1.3 2004/09/24 17:25:32 powersoft + * Fix for new version of ImageMagick. + * + * Revision 1.2 2004/03/13 22:52:54 aleph + * documentation fixes + * + * Revision 1.1 2004/01/26 15:31:17 aleph + * Add boot images and tools for importing them + * + */ + +#include +#include +#include + +extern "C" { +#include +#include +} + +#define RASTER_WIDTH 82 +#define RASTER_HEIGHT 64 + +// Minimum color level to consider a pixel on +#define COLOR_THRESHOLD 128 + + +using namespace std; + + +int main(void) +{ + char buf[64]; + int n; + unsigned char mask; + unsigned char line[RASTER_WIDTH]; + + for (int l = 0; l < RASTER_HEIGHT/8; l++) + { + mask = 1; + memset(line, 0, sizeof(line)); + + do + { + for (int x = 0; x < RASTER_WIDTH; x++) + { + if (!cin.getline(buf, sizeof(buf))) + goto print_line; + + istringstream ss(buf); + string s; + char c; + + ss + >> s // skip glob coord spec + >> c // skip open paren + >> n; // this is the red level + + //DEBUG + //cout << "s='" << s << "' n='" << n << "'" << endl; + + if (n < COLOR_THRESHOLD) + line[x] |= mask; + } + } + while (mask <<= 1); + +print_line: + cout << "\n\t"; + for (int x = 0; x < RASTER_WIDTH; x++) + { + printf("0x%02X", line[x]); + if (x % 8 == 7) + cout << ",\n\t"; + else + cout << ", "; + } + cout << endl; + } + + return 0; +} diff --git a/2.5/bertos/icons/logo.c b/2.5/bertos/icons/logo.c new file mode 100644 index 00000000..bdf14a3b --- /dev/null +++ b/2.5/bertos/icons/logo.c @@ -0,0 +1,115 @@ + +#include "logo.h" +#include +#include + +/** + * BeRTOS logo + */ +const PROGMEM uint8_t bertos_logo_raster[] = { + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 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, 0xFE, 0xFE, 0xFE, 0x0E, 0x0E, + 0x0E, 0x0E, 0xFE, 0xFE, 0xFE, 0xFC, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, + 0xFE, 0x0E, 0x0E, 0x0E, 0xFE, 0xFE, 0xFE, 0xFE, + 0xFC, 0x00, 0x1E, 0x1E, 0x1E, 0x1E, 0xFE, 0xFE, + 0xFE, 0xFE, 0x1E, 0x1E, 0x1E, 0x1E, 0x00, 0xFC, + 0xFE, 0xFE, 0xFE, 0xFE, 0x0E, 0x0E, 0x0E, 0x0E, + 0xFE, 0xFE, 0xFE, 0xFE, 0xFC, 0x00, 0xFC, 0xFE, + 0xFE, 0xFE, 0xFE, 0x0E, 0x0E, 0x0E, 0xFE, 0xFE, + 0xFE, 0xFE, + + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x78, 0x78, + 0x7C, 0xFC, 0xFF, 0xFF, 0xEF, 0xCF, 0x00, 0x00, + 0xFC, 0xFE, 0xFE, 0xFE, 0x1E, 0x1E, 0xFE, 0xFE, + 0xFE, 0xFE, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0xF8, 0xF8, 0xFF, 0xFF, 0x7F, 0x3F, + 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x07, 0x0F, + 0x1F, 0x1F, 0x3F, 0x7E, 0xFC, 0xF8, 0xF1, 0xE1, + 0xC1, 0x81, + + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, + 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xC7, 0xF7, 0xF7, + 0xF7, 0xF7, 0xF3, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x01, 0x0F, 0x3F, 0xFF, 0xFF, 0xFE, 0xF0, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFE, 0xFE, + 0xFE, 0xFE, 0xFE, 0xC0, 0xC0, 0xC1, 0xFF, 0xFF, + 0xFF, 0xFF, + + 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0xF1, 0x60, 0x80, + 0xF1, 0x43, 0xE3, 0x13, 0x13, 0xE3, 0x13, 0x13, + 0xF3, 0x13, 0x01, 0x00, 0xE3, 0x13, 0x13, 0xF3, + 0x43, 0xF0, 0x60, 0xC0, 0xF1, 0x03, 0xF3, 0x03, + 0x03, 0x30, 0xC0, 0x60, 0x10, 0x00, 0x03, 0xF3, + 0x43, 0xB3, 0x00, 0xF0, 0x50, 0x50, 0x00, 0xF1, + 0x53, 0xF3, 0x03, 0xF3, 0x63, 0xC3, 0xF3, 0x03, + 0xF3, 0x53, 0x53, 0x03, 0xF0, 0x00, 0x01, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, +}; + +EXTERN_CONST struct Image bertos_logo = +{ + /* .raster = */ bertos_logo_raster, + /* .width = */ 82, + /* .height = */ 64, + /* .stride = */ 82 +}; + diff --git a/2.5/bertos/icons/logo.h b/2.5/bertos/icons/logo.h new file mode 100644 index 00000000..e0bbc636 --- /dev/null +++ b/2.5/bertos/icons/logo.h @@ -0,0 +1,3 @@ +#include + +extern const struct Image bertos_logo; diff --git a/2.5/bertos/icons/logo.png b/2.5/bertos/icons/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..68fecaa8fe55dc774acb2e059ba61fd6d5f9fec5 GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^And@%3?w)I+2jGF7>k44ofy`glX(f`um$*pxB}__ z|Nk$&IsYz@#aZAHS<*&cu@Q1rlnk$;=$g^~h zA0HO;$=F#O{(QUh(3_a)8nptyFK^p^Yvaba_Xl$}o8Kw!vuHfJKd1WjUUM@JoqucJ jCm)Lo*L=EgW*Wnsd7oHHpT}$kdXd4?)z4*}Q$iB}c;kbD literal 0 HcmV?d00001 diff --git a/2.5/bertos/kern/coop.c b/2.5/bertos/kern/coop.c new file mode 100644 index 00000000..078724b4 --- /dev/null +++ b/2.5/bertos/kern/coop.c @@ -0,0 +1,32 @@ +/** + * \file + * + */ diff --git a/2.5/bertos/kern/irq.c b/2.5/bertos/kern/irq.c new file mode 100644 index 00000000..85608147 --- /dev/null +++ b/2.5/bertos/kern/irq.c @@ -0,0 +1,80 @@ +/** + * \file + * + * + * \brief Process scheduler (public interface). + * + * \version $Id$ + * \author Bernie Innocenti + * + * Still in development, disable nightly test for now + * notest: avr + * notest: arm + */ +#include "irq.h" + +#include +#include +#include + +#include "cfg/cfg_proc.h" + +#include // FIXME: move POSIX stuff to irq_posix.h + +MOD_DEFINE(irq) + +// FIXME +static void (*irq_handlers[100])(void); + +/* signal handler */ +void irq_entry(int signum) +{ + irq_handlers[signum](); +} + +void irq_register(int irq, void (*callback)(void)) +{ + irq_handlers[irq] = callback; +} + +void irq_init(void) +{ + struct sigaction act; + + act.sa_handler = irq_entry; + sigemptyset(&act.sa_mask); + //sigaddset(&act.sa_mask, irq); + act.sa_flags = SA_RESTART; // | SA_SIGINFO; + + sigaction(SIGUSR1, &act, NULL); + sigaction(SIGALRM, &act, NULL); + + MOD_INIT(irq); +} diff --git a/2.5/bertos/kern/irq.h b/2.5/bertos/kern/irq.h new file mode 100644 index 00000000..eb637021 --- /dev/null +++ b/2.5/bertos/kern/irq.h @@ -0,0 +1,44 @@ +/** + * \file + * + * + * \brief Process scheduler (public interface). + * + * \version $Id$ + * \author Bernie Innocenti + */ +#ifndef KERN_IRQ_H +#define KERN_IRQ_H + +void irq_entry(int irq); +void irq_register(int irq, void (*handler)(void)); +void irq_init(void); + +#endif // KERN_IRQ_H diff --git a/2.5/bertos/kern/kfile.c b/2.5/bertos/kern/kfile.c new file mode 100644 index 00000000..d98f1548 --- /dev/null +++ b/2.5/bertos/kern/kfile.c @@ -0,0 +1,284 @@ +/** + * \file + * + * + * \brief Virtual KFile I/O interface. + * + * This module implements some generic I/O interfaces for kfile. + * + * \version $Id$ + * \author Francesco Sacchi + * \author Daniele Basile + */ + +#include "kfile.h" + +#include "cfg/cfg_kfile.h" +#include +#include + +#include +#include + +#include + +/* + * Sanity check for config parameters required by this module. + */ +#if !defined(CONFIG_KFILE_GETS) || ((CONFIG_KFILE_GETS != 0) && CONFIG_KFILE_GETS != 1) + #error CONFIG_KFILE_GETS must be set to either 0 or 1 in appconfig.h +#endif +#if !defined(CONFIG_PRINTF) + #error CONFIG_PRINTF missing in appconfig.h +#endif + + +/** + * Generic putc() implementation using \a fd->write. + */ +int kfile_putc(int _c, struct KFile *fd) +{ + unsigned char c = (unsigned char)_c; + + if (kfile_write(fd, &c, sizeof(c)) == sizeof(c)) + return (int)((unsigned char)_c); + else + return EOF; +} + +/** + * Generic getc() implementation using \a fd->read. + */ +int kfile_getc(struct KFile *fd) +{ + unsigned char c; + + if (kfile_read(fd, &c, sizeof(c)) == sizeof(c)) + return (int)((unsigned char)c); + else + return EOF; +} + +#if CONFIG_PRINTF +/** + * Formatted write. + */ +int kfile_printf(struct KFile *fd, const char *format, ...) +{ + va_list ap; + int len; + + va_start(ap, format); + len = _formatted_write(format, (void (*)(char, void *))kfile_putc, fd, ap); + va_end(ap); + + return len; +} +#endif /* CONFIG_PRINTF */ + +/** + * Write a string to kfile \a fd. + * \return 0 if OK, EOF in case of error. + */ +int kfile_print(struct KFile *fd, const char *s) +{ + while (*s) + { + if (kfile_putc(*s++, fd) == EOF) + return EOF; + } + return 0; +} + +#if CONFIG_KFILE_GETS +/** + * Read a line long at most as size and put it + * in buf. + * \return number of chars read or EOF in case + * of error. + */ +int kfile_gets(struct KFile *fd, char *buf, int size) +{ + return kfile_gets_echo(fd, buf, size, false); +} + + +/** + * Read a line long at most as size and put it + * in buf, with optional echo. + * + * \return number of chars read, or EOF in case + * of error. + */ +int kfile_gets_echo(struct KFile *fd, char *buf, int size, bool echo) +{ + int i = 0; + int c; + + for (;;) + { + if ((c = kfile_getc(fd)) == EOF) + { + buf[i] = '\0'; + return -1; + } + + /* FIXME */ + if (c == '\r' || c == '\n' || i >= size-1) + { + buf[i] = '\0'; + if (echo) + kfile_print(fd, "\r\n"); + break; + } + buf[i++] = c; + if (echo) + kfile_putc(c, fd); + } + + return i; +} +#endif /* !CONFIG_KFILE_GETS */ + + +/** + * Move \a fd file seek position of \a offset bytes from \a whence. + * + * This is a generic implementation of seek function, you can redefine + * it in your local module if needed. + */ +kfile_off_t kfile_genericSeek(struct KFile *fd, kfile_off_t offset, KSeekMode whence) +{ + kfile_off_t seek_pos; + + switch (whence) + { + + case KSM_SEEK_SET: + seek_pos = 0; + break; + case KSM_SEEK_END: + seek_pos = fd->size; + break; + case KSM_SEEK_CUR: + seek_pos = fd->seek_pos; + break; + default: + ASSERT(0); + return EOF; + break; + } + + #if LOG_LEVEL >= LOG_LVL_INFO + /* Bound check */ + if (seek_pos + offset > fd->size) + LOG_INFO("seek outside EOF\n"); + #endif + + fd->seek_pos = seek_pos + offset; + + return fd->seek_pos; +} + +/** + * Reopen file \a fd. + * This is a generic implementation that only flush file + * and reset seek_pos to 0. + */ +struct KFile * kfile_genericReopen(struct KFile *fd) +{ + kfile_flush(fd); + kfile_seek(fd, 0, KSM_SEEK_SET); + return fd; +} + +/** + * Close file \a fd. + * This is a generic implementation that only return 0. + */ +int kfile_genericClose(UNUSED_ARG(struct KFile *, fd)) +{ + return 0; +}; + + +/** + * Discard input to resynchronize with remote end. + * + * Discard incoming data until the kfile_getc stops receiving + * characters for at least \a delay milliseconds. + * + * \note If the timeout occur, we reset the error before to + * quit. + */ +void kfile_resync(KFile *fd, mtime_t delay) +{ + ticks_t start_time = timer_clock(); + for(;;) + { + if(kfile_getc(fd) != EOF) + start_time = timer_clock(); + + if ((timer_clock() - start_time) > ms_to_ticks(delay)) + { + kfile_clearerr(fd); + break; + } + + } +} + +/** + * Stub function that does nothing. + * This is a generic implementation that only return 0. + */ +static int kfile_generic(UNUSED_ARG(struct KFile *, fd)) +{ + return 0; +}; + + +/** + * Base class KFile constructor. + */ +void kfile_init(struct KFile *fd) +{ + ASSERT(fd); + memset(fd, 0, sizeof(*fd)); + fd->clearerr = (ClearErrFunc_t)kfile_generic; + fd->close = kfile_genericClose; + fd->error = kfile_generic; + fd->flush = kfile_generic; + fd->read = (ReadFunc_t)kfile_generic; + fd->reopen = kfile_genericReopen; + fd->seek = kfile_genericSeek; + fd->write = (WriteFunc_t)kfile_generic; +} + diff --git a/2.5/bertos/kern/kfile.h b/2.5/bertos/kern/kfile.h new file mode 100644 index 00000000..44c32b06 --- /dev/null +++ b/2.5/bertos/kern/kfile.h @@ -0,0 +1,289 @@ +/** + * \file + * + * + * \brief Virtual KFile I/O interface. + * + * KFile is a simple, generic interface for file I/O. It uses an + * object-oriented model to supply a device-neutral interface to + * communicate with drivers. + * + * This module contains only definitions, the instance structure + * and the common API. + * Each KFile subclass can override one or more methods of the interface, + * and can extend the base KFile structure with its own private data. + * For instance, a serial driver might implement the KFile interface by + * declaring a context structure like this: + * + * \code + * typedef struct Serial + * { + * // base class instance + * KFile fd; + * + * // private instance data + * FIFOBuffer txfifo, rxfifo; + * } Serial; + * \endcode + * + * You should also supply a macro for casting KFile to Serial: + * + * \code + * INLINE Serial * SERIAL_CAST(KFile *fd) + * { + * ASSERT(fd->_type == KFT_SERIAL); + * return (Serial *)fd; + * } + * \endcode + * + * Then you can implement as many interface functions as needed + * and leave the rest to NULL. + * + * Example implementation of the close KFile method for Serial: + * + * \code + * static int ser_kfile_close(struct KFile *fd) + * { + * Serial *fds = SERIAL_CAST(fd); + * // [driver specific code here] + * return 0; + * } + * \endcode + * + * The SERIAL_CAST() macro helps ensure that the passed object is + * really of type Serial. + * + * The KFile interface does not supply an open function: this is deliberate, + * because in embedded systems each device has its own init parameters. + * For the same reason, specific device settings like, for example, + * the baudrate, are not part of interface and should be handled by the + * driver-specific API. + * + * \version $Id$ + * \author Bernie Innocenti + * \author Francesco Sacchi + * \author Daniele Basile + * + * $WIZ$ module_name = "kfile" + * $WIZ$ module_configuration = "bertos/cfg/cfg_kfile.h" + * $WIZ$ module_depends = "timer", "formatwr" + */ + +#ifndef KERN_KFILE_H +#define KERN_KFILE_H + +#include +#include +#include + +/* fwd decl */ +struct KFile; + +typedef int32_t kfile_off_t; ///< KFile offset type, used by kfile_seek(). + +/** + * Costants for repositioning read/write file offset. + * These are needed because on some embedded platforms + * ANSI I/O library may not be present. + */ +typedef enum KSeekMode +{ + KSM_SEEK_SET, ///< Seek from file beginning. + KSM_SEEK_CUR, ///< Seek from file current position. + KSM_SEEK_END, ///< Seek from file end. +} KSeekMode; + +/** + * Prototypes for KFile access functions. + * I/O file functions must be ANSI compliant. + * \note A KFile user can choose which function subset to implement, + * but has to set to NULL unimplemented features. + * \{ + */ + +/** + * Read from file. + * \return the number of bytes read. + */ +typedef size_t (*ReadFunc_t) (struct KFile *fd, void *buf, size_t size); + +/** + * Write to file. + * \return the number of bytes written. + */ +typedef size_t (*WriteFunc_t) (struct KFile *fd, const void *buf, size_t size); + +/** + * Seek into file (if seekable). + * \return the new file offset or EOF on errors. + */ +typedef kfile_off_t (*SeekFunc_t) (struct KFile *fd, kfile_off_t offset, KSeekMode whence); + +/** + * Close and reopen file \a fd. + * The reopening is done with the former file parameters and access modes. + */ +typedef struct KFile * (*ReOpenFunc_t) (struct KFile *fd); + +/** + * Close file. + * \return 0 on success, EOF on errors. + */ +typedef int (*CloseFunc_t) (struct KFile *fd); + +/** + * Flush file I/O. + * \return 0 on success, EOF on errors. + */ +typedef int (*FlushFunc_t) (struct KFile *fd); + +/** + * Get file error mask. + * \return 0 on success or file error code, device specific. + */ +typedef int (*ErrorFunc_t) (struct KFile *fd); + +/** + * Clear errors. + */ +typedef void (*ClearErrFunc_t) (struct KFile *fd); +/* \} */ + +/** + * Context data for callback functions which operate on + * pseudo files. + * + * \note Remember to add the corresponding accessor functions + * when extending this interface. + */ +typedef struct KFile +{ + ReadFunc_t read; + WriteFunc_t write; + ReOpenFunc_t reopen; + CloseFunc_t close; + SeekFunc_t seek; + FlushFunc_t flush; + ErrorFunc_t error; + ClearErrFunc_t clearerr; + DB(id_t _type); ///< Used to keep track, at runtime, of the class type. + + /* NOTE: these must _NOT_ be size_t on 16bit CPUs! */ + kfile_off_t seek_pos; + kfile_off_t size; +} KFile; + +/** + * Generic implementation of kfile_seek. + */ +kfile_off_t kfile_genericSeek(struct KFile *fd, kfile_off_t offset, KSeekMode whence); + +/** + * Generic implementation of kfile_reopen. + */ +struct KFile * kfile_genericReopen(struct KFile *fd); + +int kfile_genericClose(struct KFile *fd); + +int kfile_putc(int c, struct KFile *fd); ///< Generic putc implementation using kfile_write. +int kfile_getc(struct KFile *fd); ///< Generic getc implementation using kfile_read. +int kfile_printf(struct KFile *fd, const char *format, ...); +int kfile_print(struct KFile *fd, const char *s); +int kfile_gets(struct KFile *fd, char *buf, int size); +int kfile_gets_echo(struct KFile *fd, char *buf, int size, bool echo); +void kfile_resync(KFile *fd, mtime_t delay); +void kfile_init(struct KFile *fd); + +/** + * Interface functions for KFile access. + * \note Remember to change following functions if KFile interface changes. + * \{ + */ +INLINE size_t kfile_read(struct KFile *fd, void *buf, size_t size) +{ + ASSERT(fd->read); + return fd->read(fd, buf, size); +} + +INLINE size_t kfile_write(struct KFile *fd, const void *buf, size_t size) +{ + ASSERT(fd->write); + return fd->write(fd, buf, size); +} + +INLINE KFile * kfile_reopen(struct KFile *fd) +{ + ASSERT(fd->reopen); + return fd->reopen(fd); +} + +INLINE int kfile_close(struct KFile *fd) +{ + ASSERT(fd->close); + return fd->close(fd); +} + +INLINE kfile_off_t kfile_seek(struct KFile *fd, kfile_off_t offset, KSeekMode whence) +{ + ASSERT(fd->seek); + return fd->seek(fd, offset, whence); +} + +INLINE int kfile_flush(struct KFile *fd) +{ + ASSERT(fd->flush); + return fd->flush(fd); +} + +INLINE int kfile_error(struct KFile *fd) +{ + ASSERT(fd->error); + return fd->error(fd); +} + +INLINE void kfile_clearerr(struct KFile *fd) +{ + ASSERT(fd->clearerr); + fd->clearerr(fd); +} +/* \} */ + +/** + * Kfile test function. + */ +int kfile_testSetup(void); +int kfile_testRun(void); +int kfile_testRunGeneric(KFile *fd, uint8_t *test_buf, uint8_t *save_buf, size_t size); +int kfile_testTearDown(void); + + +#endif /* KERN_KFILE_H */ diff --git a/2.5/bertos/kern/kfile_test.c b/2.5/bertos/kern/kfile_test.c new file mode 100644 index 00000000..36fde490 --- /dev/null +++ b/2.5/bertos/kern/kfile_test.c @@ -0,0 +1,323 @@ +/** + * \file + * + * + * \brief Test suite for virtual KFile I/O interface. + * + * This module implements a test for some generic I/O interfaces for kfile. + * + * \version $Id$ + * \author Francesco Sacchi + * \author Daniele Basile + */ + + +#include "kfile.h" +#include + +#include "cfg/cfg_kfile.h" +#include +#include +#include + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL KFILE_LOG_LEVEL +#define LOG_FORMAT KFILE_LOG_FORMAT +#include + +#include + +#include + +MOD_DEFINE(kfile_test); + +// Size of the "virtual" disk that +// we want to test. +#define BUF_TEST_LEN 3209 + +// Buffer for test +uint8_t test_buf[BUF_TEST_LEN]; +uint8_t test_buf_save[BUF_TEST_LEN]; + +uint8_t test_disk[BUF_TEST_LEN]; +KFileMem mem; + +/* + * Help function to init disk and the buffers. + */ +static void init_testBuf(void) +{ + + kprintf("Init fake buffer..\n"); + for (int i = 0; i < BUF_TEST_LEN; i++) + { + test_disk[i] = i; + kprintf("%d ", test_disk[i]); + } + kprintf("\nend\n"); + + memset(test_buf, 0, sizeof(test_buf)); + memset(test_buf_save, 0, sizeof(test_buf_save)); +} + +/** + * KFile read/write subtest. + * Try to write/read in the same \a f file location \a size bytes. + * \return true if all is ok, false otherwise + * \note Restore file position at exit (if no error) + * \note Test buffer \a buf must be filled with + * the following statement: + *
+ * buf[i] = i & 0xff
+ * 
+ */ +static bool kfile_rwTest(KFile *f, uint8_t *buf, size_t size) +{ + /* + * Write test buffer + */ + if (kfile_write(f, buf, size) != size) + return false; + + kfile_seek(f, -(kfile_off_t)size, KSM_SEEK_CUR); + + /* + * Reset test buffer + */ + memset(buf, 0, size); + + /* + * Read file in test buffer + */ + if (kfile_read(f, buf, size) != size) + return false; + + kfile_seek(f, -(kfile_off_t)size, KSM_SEEK_CUR); + + /* + * Check test result + */ + for (size_t i = 0; i < size; i++) + if (buf[i] != (i & 0xff)) + return false; + + return true; +} + +/** + * KFile read/write test. + * This function write and read \a test_buf long \a size + * on \a fd handler. + * \a save_buf can be NULL or a buffer where to save previous file content. + */ +int kfile_testRunGeneric(KFile *fd, uint8_t *test_buf, uint8_t *save_buf, size_t size) +{ + + /* + * Part of test buf size that you would write. + * This var is used in test 3 to check kfile_write + * when writing beyond filesize limit. + */ + kfile_off_t len = size / 2; + + + /* Fill test buffer */ + for (size_t i = 0; i < size; i++) + test_buf[i] = (i & 0xff); + + /* + * If necessary, user can save content, + * for later restore. + */ + if (save_buf) + { + LOG_INFO("Saved content..form [%ld] to [%ld]\n", fd->seek_pos, fd->seek_pos + size); + kfile_read(fd, save_buf, size); + } + + /* TEST 1 BEGIN. */ + LOG_INFO("Test 1: write from pos 0 to [%ld]\n", (long)size); + + /* + * Seek to addr 0. + */ + if (kfile_seek(fd, 0, KSM_SEEK_SET) != 0) + goto kfile_test_end; + + /* + * Test read/write to address 0..size + */ + if (!kfile_rwTest(fd, test_buf, size)) + goto kfile_test_end; + + LOG_INFO("Test 1: ok!\n"); + + /* + * Restore previous read content. + */ + if (save_buf) + { + kfile_seek(fd, 0, KSM_SEEK_SET); + + if (kfile_write(fd, save_buf, size) != size) + goto kfile_test_end; + + LOG_INFO("Restore content..form [%ld] to [%ld]\n", fd->seek_pos, fd->seek_pos + size); + } + /* TEST 1 END. */ + + /* TEST 2 BEGIN. */ + LOG_INFO("Test 2: write from pos [%ld] to [%ld]\n", fd->size/2 , fd->size/2 + size); + + /* + * Go to half test size. + */ + kfile_seek(fd, (fd->size / 2), KSM_SEEK_SET); + + /* + * If necessary, user can save content + * for later restore. + */ + if (save_buf) + { + kfile_read(fd, save_buf, size); + kfile_seek(fd, -(kfile_off_t)size, KSM_SEEK_CUR); + LOG_INFO("Saved content..form [%ld] to [%ld]\n", fd->seek_pos, fd->seek_pos + size); + } + + /* + * Test read/write to address filesize/2 ... filesize/2 + size + */ + if (!kfile_rwTest(fd, test_buf, size)) + goto kfile_test_end; + + LOG_INFO("Test 2: ok!\n"); + + /* + * Restore previous content. + */ + if (save_buf) + { + kfile_seek(fd, -(kfile_off_t)size, KSM_SEEK_CUR); + + if (kfile_write(fd, save_buf, size) != size) + goto kfile_test_end; + + LOG_INFO("Restore content..form [%ld] to [%ld]\n", fd->seek_pos, fd->seek_pos + size); + } + + /* TEST 2 END. */ + + /* TEST 3 BEGIN. */ + LOG_INFO("Test 3: write outside of fd->size limit [%ld]\n", fd->size); + + /* + * Go to the Flash end + */ + kfile_seek(fd, -len, KSM_SEEK_END); + + /* + * If necessary, user can save content, + * for later restore. + */ + if (save_buf) + { + kfile_read(fd, save_buf, len); + kfile_seek(fd, -len, KSM_SEEK_CUR); + LOG_INFO("Saved content..form [%ld] to [%ld]\n", fd->seek_pos, fd->seek_pos + len); + } + + /* + * Test read/write to address (filesize - size) ... filesize + */ + if (kfile_rwTest(fd, test_buf, size)) + goto kfile_test_end; + + kprintf("Test 3: ok!\n"); + + /* + * Restore previous read content + */ + if (save_buf) + { + kfile_seek(fd, -len, KSM_SEEK_END); + + if ((kfile_off_t)kfile_write(fd, save_buf, len) != len) + goto kfile_test_end; + + LOG_INFO("Restore content..form [%ld] to [%ld]\n", fd->seek_pos, fd->seek_pos + len); + } + + /* TEST 3 END. */ + + kfile_close(fd); + return 0; + +kfile_test_end: + kfile_close(fd); + LOG_ERR("One kfile_test failed!\n"); + return EOF; +} + + + + +/** + * Setup all needed for kfile test + */ +int kfile_testSetup(void) +{ + MOD_INIT(kfile_test); + LOG_INFO("Mod init..ok\n"); + + // Init our backend and the buffers + kfilemem_init(&mem, test_disk, BUF_TEST_LEN); + init_testBuf(); + + return 0; +} + +int kfile_testRun(void) +{ + return kfile_testRunGeneric(&mem.fd, test_buf, test_buf_save, BUF_TEST_LEN); +} + +/** + * End a dataflash Test. + * (Unused) + */ +int kfile_testTearDown(void) +{ + return 0; +} + +TEST_MAIN(kfile); + diff --git a/2.5/bertos/kern/monitor.c b/2.5/bertos/kern/monitor.c new file mode 100644 index 00000000..edcf7776 --- /dev/null +++ b/2.5/bertos/kern/monitor.c @@ -0,0 +1,167 @@ +/** + * \file + * + * + * \brief Monitor to check for stack overflows + * + * \version $Id$ + * \author Giovanni Bajo + */ + + +#include "monitor.h" + +#if CONFIG_KERN_MONITOR + +#include "proc_p.h" +#include +#include + +#include + +#include + +#include + +#include /* CPU_STACK_GROWS_UPWARD */ + +/* Access to this list must be protected against the scheduler */ +static List MonitorProcs; + +void monitor_init(void) +{ + LIST_INIT(&MonitorProcs); +} + + +void monitor_add(Process *proc, const char *name) +{ + proc->monitor.name = name; + + PROC_ATOMIC(ADDTAIL(&MonitorProcs, &proc->monitor.link)); +} + + +void monitor_remove(Process *proc) +{ + PROC_ATOMIC(REMOVE(&proc->monitor.link)); +} + +void monitor_rename(Process *proc, const char *name) +{ + proc->monitor.name = name; +} + +size_t monitor_checkStack(cpu_stack_t *stack_base, size_t stack_size) +{ + cpu_stack_t *beg; + cpu_stack_t *cur; + cpu_stack_t *end; + int inc; + size_t sp_free; + + + beg = stack_base; + end = stack_base + stack_size / sizeof(cpu_stack_t); + inc = +1; + + if (CPU_STACK_GROWS_UPWARD) + { + SWAP(beg, end); + inc = -1; + } + + cur = beg; + while (cur != end) + { + if (*cur != CONFIG_KERN_STACKFILLCODE) + break; + + cur += inc; + } + + sp_free = ABS(cur - beg) * sizeof(cpu_stack_t); + return sp_free; +} + + +void monitor_report(void) +{ + Node *node; + int i; + + proc_forbid(); + kprintf("%-9s%-9s%-9s%-9s%s\n", "TCB", "SPbase", "SPsize", "SPfree", "Name"); + for (i = 0; i < 56; i++) + kputchar('-'); + kputchar('\n'); + + FOREACH_NODE(node, &MonitorProcs) + { + Process *p = containerof(node, Process, monitor.link); + size_t free = monitor_checkStack(p->stack_base, p->stack_size); + kprintf("%-9p%-9p%-9zu%-9zu%s\n", + p, p->stack_base, p->stack_size, free, p->monitor.name); + } + proc_permit(); +} + + +static void NORETURN monitor(void) +{ + Node *node; + + for (;;) + { + proc_forbid(); + FOREACH_NODE(node, &MonitorProcs) + { + Process *p = containerof(node, Process, monitor.link); + size_t free = monitor_checkStack(p->stack_base, p->stack_size); + + if (p->stack_base && free < 0x20) + kprintf("MONITOR: Free stack of process '%s' is only %u chars\n", + p->monitor.name, (unsigned int)free); + } + proc_permit(); + + /* Give some rest to the system */ + timer_delay(500); + } +} + +void monitor_start(size_t stacksize, cpu_stack_t *stack) +{ + struct Process *p = proc_new(monitor, NULL, stacksize, stack); + proc_setPri(p, -10); +} + +#endif /* CONFIG_KERN_MONITOR */ diff --git a/2.5/bertos/kern/monitor.h b/2.5/bertos/kern/monitor.h new file mode 100644 index 00000000..e2a4742a --- /dev/null +++ b/2.5/bertos/kern/monitor.h @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \brief Monitor to check for stack overflows + * + * \version $Id$ + * + * \author Giovanni Bajo + * + * $WIZ$ module_name = "monitor" + * $WIZ$ module_depends = "kernel" + * $WIZ$ module_configuration = "bertos/cfg/cfg_monitor.h" + */ + +#ifndef KERN_MONITOR_H +#define KERN_MONITOR_H + +#include "cfg/cfg_monitor.h" + +#include + +/** + * Start the kernel monitor. It is a special process which checks every second the stacks of the + * running processes trying to detect stack overflows. + * + * \param stacksize Size of stack in chars + * \param stack Pointer to the stack that will be used by the monitor + * + * \note The stack is provided by the caller so that there is no wasted space if the monitor + * is not used. + */ +void monitor_start(size_t stacksize, cpu_stack_t *stack); + + +/** + * Manually check if a given stack has overflown. This is used to check for stacks + * of processes handled externally form the kernel, or for other stacks (for instance + * the interrupt supervisor stack). + * + * \note For this function to work, the stack must have been filled at startup with + * CONFIG_KERN_STACKFILLCODE. + */ +size_t monitor_checkStack(cpu_stack_t *stack_base, size_t stack_size); + + +/** Print a report of the stack status through kdebug */ +void monitor_report(void); + +#endif /* KERN_MONITOR_H */ diff --git a/2.5/bertos/kern/msg.h b/2.5/bertos/kern/msg.h new file mode 100644 index 00000000..f00f6060 --- /dev/null +++ b/2.5/bertos/kern/msg.h @@ -0,0 +1,298 @@ +/** + * \file + * + * + * + * This module implements a common system for executing + * a user defined action calling a hook function. + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Simple inter-process messaging system + * + * Handle queues of messages associated an action. + * + * A message port is an abstraction used to exchange information + * asynchronously between processes or other entities such as + * interrupts and call-back functions. + * + * This form of IPC is higher-level than bare signals and + * semaphores, because it sets a policy for exchanging + * structured data with well-defined synchronization and + * ownership semantics. + * + * Before using it, a message port must be initialized by + * calling msg_initPort(), which associates the port with + * an Event object, which can be setup to signal a process + * or invoke a call-back hook. + * + * A process or interrupt routine can deliver messages to any + * message port by calling msg_put(). By sending a message, + * the sender temporarly or permanently transfers ownership + * of its associated data to the receiver. + * + * Queuing a message to a port automatically triggers the + * associated Event to notify the receiver. When the + * receiver wakes up, it usually invokes msg_get() to pick + * the next message from the port. + * + * \note + * When you put a message into a port, such message becomes + * unavailable until you retrieve it using msg_get(), eg. + * you must not delete it or put it into another port. + * + * Message ports can hold any number of pending messages, + * and receivers usually process them in FIFO order. + * Other scheduling policies are possible, but not implemented + * in this API. + * + * After the receiver has done processing a message, it replies + * it back to the sender with msg_reply(), which transfer + * ownership back to the original sender. Replies are delivered + * to a reply port, which is nothing more than another MsgPort + * structure designated by the sender. + * + * Returning messages to senders is not mandatory, but it provides + * a convenient way to provide some kind of result and simplify + * the resource allocation scheme at the same time. + * + * When using signals to receive messages in a process, you + * call sig_wait() in an event-loop to wake up when messages + * are delivered to any of your ports. When your process + * wakes up with the port signal active, multiple messages + * may already have queued up at the message port, and the + * process must process them all before returning to sleep. + * Signals don't keep a nesting count. + * + * A simple message loop works like this: + * + * \code + * // Our message port. + * static MsgPort test_port; + * + * // A test message with two parameters and a result. + * typedef struct + * { + * Msg msg; + * + * int x, y; + * int result; + * } TestMsg; + * + * + * PROC_DEFINE_STACK(sender_stack, KERN_MINSTACKSIZE); + * + * // A process that sends two messages and waits for replies. + * static void sender_proc(void) + * { + * MsgPort test_reply_port; + * TestMsg msg1; + * TestMsg msg2; + * Msg *reply; + * + * msg_initPort(&test_reply_port, + * event_createSignal(proc_current(), SIG_SINGLE); + * + * // Fill-in first message and send it out. + * msg1.x = 3; + * msg1.y = 2; + * msg1.msg.replyPort = &test_reply_port; + * msg_put(&test_port, &msg1.msg); + * + * // Fill-in second message and send it out too. + * msg2.x = 5; + * msg2.y = 4; + * msg2.msg.replyPort = &test_reply_port; + * msg_put(&test_port, &msg2.msg); + * + * // Wait for a reply... + * sig_wait(SIG_SINGLE); + * + reply = containerof(msg_get(&test_reply_port), TestMsg, msg); + * ASSERT(reply != NULL); + * ASSERT(reply->result == 5); + * + * // Get reply to second message. + * while (!(reply = containerof(msg_get(&test_reply_port), TestMsg, msg))) + * { + * // Not yet, be patient and wait some more. + * sig_wait(SIG_SINGLE); + * } + * + * ASSERT(reply->result == 9); + * } + * + * + * // Receive messages and do something boring with them. + * static void receiver_proc(void) + * { + * msg_initPort(&test_port, + * event_createSignal(proc_current(), SIG_EXAMPLE); + * + * proc_new(sender_proc, NULL,sizeof(sender_stack), sender_stack); + * + * for (;;) + * { + * sigmask_t sigs = sig_wait(SIG_EXAMPLE | more_signals); + * + * if (sigs & SIG_EXAMPLE) + * { + * TestMsg *emsg; + * while((emsg = containerof(msg_get(&test_port), TestMsg, msg))) + * { + * // Do something with the message + * emsg->result = emsg->x + emsg->y; + * msg_reply(emsg->msg); + * } + * } + * } + * } + * \endcode + * + * $WIZ$ module_name = "msg" + * $WIZ$ module_depends = "event", "signal", "kernel" + */ + + +#ifndef KERN_MSG_H +#define KERN_MSG_H + +#include +#include +#include + +typedef struct MsgPort +{ + List queue; /**< Messages queued at this port. */ + Event event; /**< Event to trigger when a message arrives. */ +} MsgPort; + + +typedef struct Msg +{ + Node link; /**< Link into message port queue. */ + MsgPort *replyPort; /**< Port to which the msg is to be replied. */ + /* User data may follow */ +} Msg; + + +/** + * Lock a message port. + * + * This is required before reading or manipulating + * any field of the MsgPort structure. + * + * \note Ports may be locked multiple times and each + * call to msg_lockPort() must be paired with + * a corresponding call to msg_unlockPort(). + * + * \todo Add a configurable policy for locking against + * interrupts and locking with semaphorse. + * + * \see msg_unlockPort() + */ +INLINE void msg_lockPort(UNUSED_ARG(MsgPort *, port)) +{ + proc_forbid(); +} + +/** + * Unlock a message port. + * + * \see msg_lockPort() + */ +INLINE void msg_unlockPort(UNUSED_ARG(MsgPort *, port)) +{ + proc_permit(); +} + + +/** Initialize a message port */ +INLINE void msg_initPort(MsgPort *port, Event event) +{ + LIST_INIT(&port->queue); + port->event = event; +} + +/** Queue \a msg into \a port, triggering the associated event */ +INLINE void msg_put(MsgPort *port, Msg *msg) +{ + msg_lockPort(port); + ADDTAIL(&port->queue, &msg->link); + msg_unlockPort(port); + + event_do(&port->event); +} + +/** + * Get the first message from the queue of \a port. + * + * \return Pointer to the message or NULL if the port was empty. + */ +INLINE Msg *msg_get(MsgPort *port) +{ + Msg *msg; + + msg_lockPort(port); + msg = (Msg *)list_remHead(&port->queue); + msg_unlockPort(port); + + return msg; +} + +/** Peek the first message in the queue of \a port, or NULL if the port is empty. */ +INLINE Msg *msg_peek(MsgPort *port) +{ + Msg *msg; + + msg_lockPort(port); + msg = (Msg *)port->queue.head.succ; + if (LIST_EMPTY(&port->queue)) + msg = NULL; + msg_unlockPort(port); + + return msg; +} + +/** Send back (reply) \a msg to its sender. */ +INLINE void msg_reply(Msg *msg) +{ + msg_put(msg->replyPort, msg); +} + +int msg_testRun(void); +int msg_testSetup(void); +int msg_testTearDown(void); + +#endif /* KERN_MSG_H */ diff --git a/2.5/bertos/kern/msg_test.c b/2.5/bertos/kern/msg_test.c new file mode 100644 index 00000000..bcb20ea2 --- /dev/null +++ b/2.5/bertos/kern/msg_test.c @@ -0,0 +1,292 @@ +/** + * \file + * + * + * \brief Message test. + * + * \version $Id$ + * + * \author Daniele Basile + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + */ + +#include "cfg/cfg_timer.h" +#include +#include +#include + +#include +#include +#include + +#include + +#include + +/* + * In the nightly build test, signals are disables, so this + * code won't compile. + * Since this code is used when we run "make check" it will be + * compiled and therefor tested there. + */ +#if CONFIG_KERN_SIGNALS + + +// Global settings for the test. +#define MAX_GLOBAL_COUNT 11040 +#define TEST_TIME_OUT_MS 5000 +#define DELAY 5 + +// Settings for the test message. +//Process 0 +#define INC_PROC_T0 1 +#define DELAY_PROC_T0 INC_PROC_T0*DELAY +//Process 1 +#define INC_PROC_T1 3 +#define DELAY_PROC_T1 INC_PROC_T1*DELAY +//Process 2 +#define INC_PROC_T2 5 +#define DELAY_PROC_T2 INC_PROC_T2*DELAY +//Process 3 +#define INC_PROC_T3 7 +#define DELAY_PROC_T3 INC_PROC_T3*DELAY +//Process 4 +#define INC_PROC_T4 11 +#define DELAY_PROC_T4 INC_PROC_T4*DELAY +//Process 5 +#define INC_PROC_T5 13 +#define DELAY_PROC_T5 INC_PROC_T5*DELAY + +/* + * These macros generate the code needed to create the test process functions. + */ +#define RECV_PROC(num, sig) \ +static NORETURN void receiver_proc##num(void) \ +{ \ + TestMsg *rec_msg; \ + for(;;) \ + { \ + sig_wait(sig); \ + kprintf("Proc[%d]..get message\n", num); \ + rec_msg = containerof(msg_get(&test_port##num), TestMsg, msg); \ + timer_delay(rec_msg->delay); \ + rec_msg->result += rec_msg->val; \ + kprintf("Proc[%d]..process message val[%d],delay[%d],res[%d]\n", num, rec_msg->val, rec_msg->delay, rec_msg->result); \ + msg_reply(&rec_msg->msg); \ + process_num++; \ + kprintf("Proc[%d] reply\n", num); \ + } \ +} + +#define SEND_MSG(num) \ + do { \ + kprintf("Main send message to proc[%d]\n", num); \ + msg##num.msg.replyPort = &test_portMain; \ + msg_put(&test_port##num, &msg##num.msg); \ + } while(0) + +#define RECV_STACK(num) PROC_DEFINE_STACK(receiver_stack##num, KERN_MINSTACKSIZE * 2) +#define RECV_INIT_PROC(num) proc_new(receiver_proc##num, NULL, sizeof(receiver_stack##num), receiver_stack##num) +#define RECV_INIT_MSG(num, proc, sig) msg_initPort(&test_port##num, event_createSignal(proc, sig)) + +// A test message with the parameters and a result. +typedef struct +{ + Msg msg; + + int val; + int delay; + int result; +} TestMsg; + +// Global count to check if the test is going ok. +static int count = 0; +static int process_num; + +// Our message port. +static MsgPort test_port0; +static MsgPort test_port1; +static MsgPort test_port2; +static MsgPort test_port3; +static MsgPort test_port4; +static MsgPort test_port5; + +/* + * Generate the process to test message. + */ +RECV_PROC(0, SIG_USER0) +RECV_PROC(1, SIG_USER1) +RECV_PROC(2, SIG_USER2) +RECV_PROC(3, SIG_USER3) +RECV_PROC(4, SIG_SYSTEM5) +RECV_PROC(5, SIG_SYSTEM6) +/* + * These signal are already use from + * main process and the sig_waitWithTimeout functions, so we don't + * use it. + * + * RECV_PROC(6, SIG_SINGLE) + * RECV_PROC(7, SIG_TIMEOUT) + */ + +RECV_STACK(0); +RECV_STACK(1); +RECV_STACK(2); +RECV_STACK(3); +RECV_STACK(4); +RECV_STACK(5); + +/* + * Help function to fill the message to send + */ +static void fill_msg(TestMsg *msg, int val, int delay, int res) +{ + msg->val = val; + msg->delay = delay; + msg->result = res; +} + +/** + * Run signal test + */ +int msg_testRun(void) +{ + MsgPort test_portMain; + TestMsg msg0; + TestMsg msg1; + TestMsg msg2; + TestMsg msg3; + TestMsg msg4; + TestMsg msg5; + TestMsg *reply; + + // Allocate and start the test process + struct Process *recv0 = RECV_INIT_PROC(0); + struct Process *recv1 = RECV_INIT_PROC(1); + struct Process *recv2 = RECV_INIT_PROC(2); + struct Process *recv3 = RECV_INIT_PROC(3); + struct Process *recv4 = RECV_INIT_PROC(4); + struct Process *recv5 = RECV_INIT_PROC(5); + + kprintf("Run Message test..\n"); + + // Init port and message + RECV_INIT_MSG(Main, proc_current(), SIG_SINGLE); + RECV_INIT_MSG(0, recv0, SIG_USER0); + RECV_INIT_MSG(1, recv1, SIG_USER1); + RECV_INIT_MSG(2, recv2, SIG_USER2); + RECV_INIT_MSG(3, recv3, SIG_USER3); + RECV_INIT_MSG(4, recv4, SIG_SYSTEM5); + RECV_INIT_MSG(5, recv5, SIG_SYSTEM6); + + // Fill-in first message and send it out. + fill_msg(&msg0, INC_PROC_T0, DELAY_PROC_T0, 0); + fill_msg(&msg1, INC_PROC_T1, DELAY_PROC_T1, 0); + fill_msg(&msg2, INC_PROC_T2, DELAY_PROC_T2, 0); + fill_msg(&msg3, INC_PROC_T3, DELAY_PROC_T3, 0); + fill_msg(&msg4, INC_PROC_T4, DELAY_PROC_T4, 0); + fill_msg(&msg5, INC_PROC_T5, DELAY_PROC_T5, 0); + + + // Send and wait the message + for (int i = 0; i < 23; ++i) + { + process_num = 0; + SEND_MSG(0); + SEND_MSG(1); + SEND_MSG(2); + SEND_MSG(3); + SEND_MSG(4); + SEND_MSG(5); + while(1) + { + sigmask_t sigs = sig_waitTimeout(SIG_SINGLE, ms_to_ticks(TEST_TIME_OUT_MS)); + if (sigs & SIG_SINGLE) + { + // Wait for a reply... + while ((reply = (TestMsg *)msg_get(&test_portMain))) + { + count += reply->result; + kprintf("Main recv[%d] count[%d]\n", reply->result, count); + } + } + + if (process_num == 6) + break; + + if (sigs & SIG_TIMEOUT) + { + kputs("Main: sig timeout\n"); + goto error; + } + } + } + + if(count == MAX_GLOBAL_COUNT) + { + kprintf("Message test finished..ok!\n"); + return 0; + } + +error: + kprintf("Message test finished..fail!\n"); + return -1; +} + +int msg_testSetup(void) +{ + kdbg_init(); + + kprintf("Init Timer.."); + timer_init(); + kprintf("Done.\n"); + + kprintf("Init Process.."); + proc_init(); + kprintf("Done.\n"); + return 0; +} + +int msg_testTearDown(void) +{ + kputs("TearDown Message test.\n"); + return 0; +} + +TEST_MAIN(msg); + +#endif /* CONFIG_KERN_SIGNALS */ diff --git a/2.5/bertos/kern/preempt.c b/2.5/bertos/kern/preempt.c new file mode 100644 index 00000000..078724b4 --- /dev/null +++ b/2.5/bertos/kern/preempt.c @@ -0,0 +1,32 @@ +/** + * \file + * + */ diff --git a/2.5/bertos/kern/proc.c b/2.5/bertos/kern/proc.c new file mode 100644 index 00000000..781bd553 --- /dev/null +++ b/2.5/bertos/kern/proc.c @@ -0,0 +1,648 @@ +/** + * \file + * + * + * \brief Simple cooperative and preemptive multitasking scheduler. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * \author Andrea Righi + */ + +#include "proc_p.h" +#include "proc.h" + +#include "cfg/cfg_proc.h" +#define LOG_LEVEL KERN_LOG_LEVEL +#define LOG_FORMAT KERN_LOG_FORMAT +#include + +#include "cfg/cfg_monitor.h" +#include // ROUND_UP2 +#include +#include // CONFIG_DEPEND() + +#include +#include +#include +#include + +#if CONFIG_KERN_HEAP + #include +#endif + +#include /* memset() */ + +#define PROC_SIZE_WORDS (ROUND_UP2(sizeof(Process), sizeof(cpu_stack_t)) / sizeof(cpu_stack_t)) + +/* + * The scheduer tracks ready processes by enqueuing them in the + * ready list. + * + * \note Access to the list must occur while interrupts are disabled. + */ +REGISTER List proc_ready_list; + +/* + * Holds a pointer to the TCB of the currently running process. + * + * \note User applications should use proc_current() to retrieve this value. + */ +REGISTER Process *current_process; + +/** The main process (the one that executes main()). */ +static struct Process main_process; + +#if CONFIG_KERN_HEAP + +/** + * Local heap dedicated to allocate the memory used by the processes. + */ +static HEAP_DEFINE_BUF(heap_buf, CONFIG_KERN_HEAP_SIZE); +static Heap proc_heap; + +/* + * Keep track of zombie processes (processes that are exiting and need to + * release some resources). + * + * \note Access to the list must occur while kernel preemption is disabled. + */ +static List zombie_list; + +#endif /* CONFIG_KERN_HEAP */ + +/* + * Check if the process context switch can be performed directly by the + * architecture-dependent asm_switch_context() or if it must be delayed + * because we're in the middle of an ISR. + * + * Return true if asm_switch_context() can be executed, false + * otherwise. + * + * NOTE: if an architecture does not implement IRQ_RUNNING() this function + * always returns true. + */ +#define CONTEXT_SWITCH_FROM_ISR() (!IRQ_RUNNING()) + +/* + * Save context of old process and switch to new process. + */ +static void proc_context_switch(Process *next, Process *prev) +{ + cpu_stack_t *dummy; + + if (UNLIKELY(next == prev)) + return; + /* + * If there is no old process, we save the old stack pointer into a + * dummy variable that we ignore. In fact, this happens only when the + * old process has just exited. + */ + asm_switch_context(&next->stack, prev ? &prev->stack : &dummy); +} + +static void proc_initStruct(Process *proc) +{ + /* Avoid warning for unused argument. */ + (void)proc; + +#if CONFIG_KERN_SIGNALS + proc->sig_recv = 0; + proc->sig_wait = 0; +#endif + +#if CONFIG_KERN_HEAP + proc->flags = 0; +#endif + +#if CONFIG_KERN_PRI + proc->link.pri = 0; +#endif +} + +MOD_DEFINE(proc); + +void proc_init(void) +{ + LIST_INIT(&proc_ready_list); + +#if CONFIG_KERN_HEAP + LIST_INIT(&zombie_list); + heap_init(&proc_heap, heap_buf, sizeof(heap_buf)); +#endif + /* + * We "promote" the current context into a real process. The only thing we have + * to do is create a PCB and make it current. We don't need to setup the stack + * pointer because it will be written the first time we switch to another process. + */ + proc_initStruct(&main_process); + current_process = &main_process; + +#if CONFIG_KERN_MONITOR + monitor_init(); + monitor_add(current_process, "main"); +#endif + MOD_INIT(proc); +} + + +#if CONFIG_KERN_HEAP + +/** + * Free all the resources of all zombie processes previously added to the zombie + * list. + */ +static void proc_freeZombies(void) +{ + Process *proc; + + while (1) + { + PROC_ATOMIC(proc = (Process *)list_remHead(&zombie_list)); + if (proc == NULL) + return; + + if (proc->flags & PF_FREESTACK) + { + PROC_ATOMIC(heap_freemem(&proc_heap, proc->stack_base, + proc->stack_size + PROC_SIZE_WORDS * sizeof(cpu_stack_t))); + } + } +} + +/** + * Enqueue a process in the zombie list. + */ +static void proc_addZombie(Process *proc) +{ + Node *node; +#if CONFIG_KERN_PREEMPT + ASSERT(!proc_preemptAllowed()); +#endif + +#if CONFIG_KERN_PRI + node = &(proc)->link.link; +#else + node = &(proc)->link; +#endif + LIST_ASSERT_VALID(&zombie_list); + ADDTAIL(&zombie_list, node); +} + +#endif /* CONFIG_KERN_HEAP */ + +/** + * Create a new process, starting at the provided entry point. + * + * + * \note The function + * \code + * proc_new(entry, data, stacksize, stack) + * \endcode + * is a more convenient way to create a process, as you don't have to specify + * the name. + * + * \return Process structure of new created process + * if successful, NULL otherwise. + */ +struct Process *proc_new_with_name(UNUSED_ARG(const char *, name), void (*entry)(void), iptr_t data, size_t stack_size, cpu_stack_t *stack_base) +{ + Process *proc; + LOG_INFO("name=%s", name); +#if CONFIG_KERN_HEAP + bool free_stack = false; + + /* + * Free up resources of a zombie process. + * + * We're implementing a kind of lazy garbage collector here for + * efficiency reasons: we can avoid to introduce overhead into another + * kernel task dedicated to free up resources (e.g., idle) and we're + * not introducing any overhead into the scheduler after a context + * switch (that would be *very* bad, because the scheduler runs with + * IRQ disabled). + * + * In this way we are able to release the memory of the zombie tasks + * without disabling IRQs and without introducing any significant + * overhead in any other kernel task. + */ + proc_freeZombies(); + + /* Did the caller provide a stack for us? */ + if (!stack_base) + { + /* Did the caller specify the desired stack size? */ + if (!stack_size) + stack_size = KERN_MINSTACKSIZE; + + /* Allocate stack dinamically */ + PROC_ATOMIC(stack_base = + (cpu_stack_t *)heap_allocmem(&proc_heap, stack_size)); + if (stack_base == NULL) + return NULL; + + free_stack = true; + } + +#else // CONFIG_KERN_HEAP + + /* Stack must have been provided by the user */ + ASSERT_VALID_PTR(stack_base); + ASSERT(stack_size); + +#endif // CONFIG_KERN_HEAP + +#if CONFIG_KERN_MONITOR + /* + * Fill-in the stack with a special marker to help debugging. + * On 64bit platforms, CONFIG_KERN_STACKFILLCODE is larger + * than an int, so the (int) cast is required to silence the + * warning for truncating its size. + */ + memset(stack_base, (int)CONFIG_KERN_STACKFILLCODE, stack_size); +#endif + + /* Initialize the process control block */ + if (CPU_STACK_GROWS_UPWARD) + { + proc = (Process *)stack_base; + proc->stack = stack_base + PROC_SIZE_WORDS; + // On some architecture stack should be aligned, so we do it. + proc->stack = (cpu_stack_t *)((uintptr_t)proc->stack + (sizeof(cpu_aligned_stack_t) - ((uintptr_t)proc->stack % sizeof(cpu_aligned_stack_t)))); + if (CPU_SP_ON_EMPTY_SLOT) + proc->stack++; + } + else + { + proc = (Process *)(stack_base + stack_size / sizeof(cpu_stack_t) - PROC_SIZE_WORDS); + // On some architecture stack should be aligned, so we do it. + proc->stack = (cpu_stack_t *)((uintptr_t)proc - ((uintptr_t)proc % sizeof(cpu_aligned_stack_t))); + if (CPU_SP_ON_EMPTY_SLOT) + proc->stack--; + } + /* Ensure stack is aligned */ + ASSERT((uintptr_t)proc->stack % sizeof(cpu_aligned_stack_t) == 0); + + stack_size -= PROC_SIZE_WORDS * sizeof(cpu_stack_t); + proc_initStruct(proc); + proc->user_data = data; + +#if CONFIG_KERN_HEAP | CONFIG_KERN_MONITOR + proc->stack_base = stack_base; + proc->stack_size = stack_size; + #if CONFIG_KERN_HEAP + if (free_stack) + proc->flags |= PF_FREESTACK; + #endif +#endif + proc->user_entry = entry; + CPU_CREATE_NEW_STACK(proc->stack); + +#if CONFIG_KERN_MONITOR + monitor_add(proc, name); +#endif + + /* Add to ready list */ + ATOMIC(SCHED_ENQUEUE(proc)); + + return proc; +} + +/** + * Return the name of the specified process. + * + * NULL is a legal argument and will return the name "". + */ +const char *proc_name(struct Process *proc) +{ +#if CONFIG_KERN_MONITOR + return proc ? proc->monitor.name : ""; +#else + (void)proc; + return "---"; +#endif +} + +/// Return the name of the currently running process +const char *proc_currentName(void) +{ + return proc_name(proc_current()); +} + +/// Rename a process +void proc_rename(struct Process *proc, const char *name) +{ +#if CONFIG_KERN_MONITOR + monitor_rename(proc, name); +#else + (void)proc; (void)name; +#endif +} + + +#if CONFIG_KERN_PRI +/** + * Change the scheduling priority of a process. + * + * Process piorities are signed ints, whereas a larger integer value means + * higher scheduling priority. The default priority for new processes is 0. + * The idle process runs with the lowest possible priority: INT_MIN. + * + * A process with a higher priority always preempts lower priority processes. + * Processes of equal priority share the CPU time according to a simple + * round-robin policy. + * + * As a general rule to maximize responsiveness, compute-bound processes + * should be assigned negative priorities and tight, interactive processes + * should be assigned positive priorities. + * + * To avoid interfering with system background activities such as input + * processing, application processes should remain within the range -10 + * and +10. + */ +void proc_setPri(struct Process *proc, int pri) +{ + if (proc->link.pri == pri) + return; + + proc->link.pri = pri; + + if (proc != current_process) + ATOMIC(sched_reenqueue(proc)); +} +#endif // CONFIG_KERN_PRI + +INLINE void proc_run(void) +{ + void (*entry)(void) = current_process->user_entry; + + LOG_INFO("New process starting at %p", entry); + entry(); +} + +/** + * Entry point for all the processes. + */ +void proc_entry(void) +{ + /* + * Return from a context switch assumes interrupts are disabled, so + * we need to explicitly re-enable them as soon as possible. + */ + IRQ_ENABLE; + /* Call the actual process's entry point */ + proc_run(); + proc_exit(); +} + +/** + * Terminate the current process + */ +void proc_exit(void) +{ + LOG_INFO("%p:%s", current_process, proc_currentName()); + +#if CONFIG_KERN_MONITOR + monitor_remove(current_process); +#endif + + proc_forbid(); +#if CONFIG_KERN_HEAP + /* + * Set the task as zombie, its resources will be freed in proc_new() in + * a lazy way, when another process will be created. + */ + proc_addZombie(current_process); +#endif + current_process = NULL; + proc_permit(); + + proc_switch(); + + /* never reached */ + ASSERT(0); +} + +/** + * Call the scheduler and eventually replace the current running process. + */ +static void proc_schedule(void) +{ + Process *old_process = current_process; + + IRQ_ASSERT_DISABLED(); + + /* Poll on the ready queue for the first ready process */ + LIST_ASSERT_VALID(&proc_ready_list); + while (!(current_process = (struct Process *)list_remHead(&proc_ready_list))) + { + /* + * Make sure we physically reenable interrupts here, no matter what + * the current task status is. This is important because if we + * are idle-spinning, we must allow interrupts, otherwise no + * process will ever wake up. + * + * During idle-spinning, an interrupt can occur and it may + * modify \p proc_ready_list. To ensure that compiler reload this + * variable every while cycle we call CPU_MEMORY_BARRIER. + * The memory barrier ensure that all variables used in this context + * are reloaded. + * \todo If there was a way to write sig_wait() so that it does not + * disable interrupts while waiting, there would not be any + * reason to do this. + */ + IRQ_ENABLE; + CPU_IDLE; + MEMORY_BARRIER; + IRQ_DISABLE; + } + if (CONTEXT_SWITCH_FROM_ISR()) + proc_context_switch(current_process, old_process); + /* This RET resumes the execution on the new process */ + LOG_INFO("resuming %p:%s\n", current_process, proc_currentName()); +} + +#if CONFIG_KERN_PREEMPT +/* Global preemption nesting counter */ +cpu_atomic_t preempt_count; + +/* + * The time sharing interval: when a process is scheduled on a CPU it gets an + * amount of CONFIG_KERN_QUANTUM clock ticks. When these ticks expires and + * preemption is enabled a new process is selected to run. + */ +int _proc_quantum; + +/** + * Check if we need to schedule another task + */ +bool proc_needPreempt(void) +{ + if (UNLIKELY(current_process == NULL)) + return false; + if (!proc_preemptAllowed()) + return false; + if (LIST_EMPTY(&proc_ready_list)) + return false; + return preempt_quantum() ? prio_next() > prio_curr() : + prio_next() >= prio_curr(); +} + +/** + * Preempt the current task. + */ +void proc_preempt(void) +{ + IRQ_ASSERT_DISABLED(); + ASSERT(current_process); + + /* Perform the kernel preemption */ + LOG_INFO("preempting %p:%s\n", current_process, proc_currentName()); + /* We are inside a IRQ context, so ATOMIC is not needed here */ + SCHED_ENQUEUE(current_process); + preempt_reset_quantum(); + proc_schedule(); +} +#endif /* CONFIG_KERN_PREEMPT */ + +/* Immediately switch to a particular process */ +static void proc_switchTo(Process *proc) +{ + Process *old_process = current_process; + + SCHED_ENQUEUE(current_process); + preempt_reset_quantum(); + current_process = proc; + proc_context_switch(current_process, old_process); +} + +/** + * Give the control of the CPU to another process. + * + * \note Assume the current process has been already added to a wait queue. + * + * \warning This should be considered an internal kernel function, even if it + * is allowed, usage from application code is strongly discouraged. + */ +void proc_switch(void) +{ + ASSERT(proc_preemptAllowed()); + ATOMIC( + preempt_reset_quantum(); + proc_schedule(); + ); +} + +/** + * Immediately wakeup a process, dispatching it to the CPU. + */ +void proc_wakeup(Process *proc) +{ + ASSERT(proc_preemptAllowed()); + ASSERT(current_process); + IRQ_ASSERT_DISABLED(); + + if (prio_proc(proc) >= prio_curr()) + proc_switchTo(proc); + else + SCHED_ENQUEUE_HEAD(proc); +} + +/** + * Voluntarily release the CPU. + */ +void proc_yield(void) +{ + Process *proc; + + /* + * Voluntary preemption while preemption is disabled is considered + * illegal, as not very useful in practice. + * + * ASSERT if it happens. + */ + ASSERT(proc_preemptAllowed()); + IRQ_ASSERT_ENABLED(); + + IRQ_DISABLE; + proc = (struct Process *)list_remHead(&proc_ready_list); + if (proc) + proc_switchTo(proc); + IRQ_ENABLE; +} diff --git a/2.5/bertos/kern/proc.h b/2.5/bertos/kern/proc.h new file mode 100644 index 00000000..e1181747 --- /dev/null +++ b/2.5/bertos/kern/proc.h @@ -0,0 +1,400 @@ +/** + * \file + * + * + * \brief BeRTOS Kernel core (Process scheduler). + * + * \author Bernie Innocenti + * + * $WIZ$ module_name = "kernel" + * $WIZ$ module_configuration = "bertos/cfg/cfg_proc.h" + * $WIZ$ module_depends = "switch_ctx" + * $WIZ$ module_supports = "not atmega103" + */ + +#ifndef KERN_PROC_H +#define KERN_PROC_H + +#include "cfg/cfg_proc.h" +#include "cfg/cfg_signal.h" +#include "cfg/cfg_monitor.h" + +#include // Node, PriNode + +#include +#include // ASSERT() + +#include // cpu_stack_t +#include // CPU_SAVED_REGS_CNT + +/* + * WARNING: struct Process is considered private, so its definition can change any time + * without notice. DO NOT RELY on any field defined here, use only the interface + * functions below. + * + * You have been warned. + */ +typedef struct Process +{ +#if CONFIG_KERN_PRI + PriNode link; /**< Link Process into scheduler lists */ +#else + Node link; /**< Link Process into scheduler lists */ +#endif + cpu_stack_t *stack; /**< Per-process SP */ + iptr_t user_data; /**< Custom data passed to the process */ + +#if CONFIG_KERN_SIGNALS + sigmask_t sig_wait; /**< Signals the process is waiting for */ + sigmask_t sig_recv; /**< Received signals */ +#endif + +#if CONFIG_KERN_HEAP + uint16_t flags; /**< Flags */ +#endif + +#if CONFIG_KERN_HEAP | CONFIG_KERN_MONITOR + cpu_stack_t *stack_base; /**< Base of process stack */ + size_t stack_size; /**< Size of process stack */ +#endif + + /* The actual process entry point */ + void (*user_entry)(void); + +#if CONFIG_KERN_MONITOR + struct ProcMonitor + { + Node link; + const char *name; + } monitor; +#endif + +} Process; + +/** + * Initialize the process subsystem (kernel). + * It must be called before using any process related function. + */ +void proc_init(void); + +struct Process *proc_new_with_name(const char *name, void (*entry)(void), iptr_t data, size_t stacksize, cpu_stack_t *stack); + +#if !CONFIG_KERN_MONITOR + /** + * Create a new named process and schedules it for execution. + * + * When defining the stacksize take into account that you may want at least: + * \li save all the registers for each nested function call; + * \li have memory for the struct Process, which is positioned at the bottom + * of the stack; + * \li have some memory for temporary variables inside called functions. + * + * The value given by KERN_MINSTACKSIZE is rather safe to use in the first place. + * + * \param entry Function that the process will execute. + * \param data Pointer to user data. + * \param size Length of the stack. + * \param stack Pointer to the memory area to be used as a stack. + * + * \return Process structure of new created process + * if successful, NULL otherwise. + */ + #define proc_new(entry,data,size,stack) proc_new_with_name(NULL,(entry),(data),(size),(stack)) +#else + #define proc_new(entry,data,size,stack) proc_new_with_name(#entry,(entry),(data),(size),(stack)) +#endif + +/** + * Terminate the execution of the current process. + */ +void proc_exit(void); + +/** + * Public scheduling class methods. + */ +void proc_yield(void); + +#if CONFIG_KERN_PREEMPT +bool proc_needPreempt(void); +void proc_preempt(void); +#else +INLINE bool proc_needPreempt(void) +{ + return false; +} + +INLINE void proc_preempt(void) +{ +} +#endif + +void proc_rename(struct Process *proc, const char *name); +const char *proc_name(struct Process *proc); +const char *proc_currentName(void); + +/** + * Return a pointer to the user data of the current process. + * + * To obtain user data, just call this function inside the process. Remember to cast + * the returned pointer to the correct type. + * \return Pointer to the user data of the current process. + */ +INLINE iptr_t proc_currentUserData(void) +{ + extern struct Process *current_process; + return current_process->user_data; +} + +int proc_testSetup(void); +int proc_testRun(void); +int proc_testTearDown(void); + +/** + * Return the context structure of the currently running process. + * + * The details of the Process structure are private to the scheduler. + * The address returned by this function is an opaque pointer that can + * be passed as an argument to other process-related functions. + */ +INLINE struct Process *proc_current(void) +{ + extern struct Process *current_process; + return current_process; +} + +#if CONFIG_KERN_PRI + void proc_setPri(struct Process *proc, int pri); +#else + INLINE void proc_setPri(UNUSED_ARG(struct Process *,proc), UNUSED_ARG(int, pri)) + { + } +#endif + +#if CONFIG_KERN_PREEMPT + + /** + * Disable preemptive task switching. + * + * The scheduler maintains a global nesting counter. Task switching is + * effectively re-enabled only when the number of calls to proc_permit() + * matches the number of calls to proc_forbid(). + * + * \note Calling functions that could sleep while task switching is disabled + * is dangerous and unsupported. + * + * \note proc_permit() expands inline to 1-2 asm instructions, so it's a + * very efficient locking primitive in simple but performance-critical + * situations. In all other cases, semaphores offer a more flexible and + * fine-grained locking primitive. + * + * \sa proc_permit() + */ + INLINE void proc_forbid(void) + { + extern cpu_atomic_t preempt_count; + /* + * We don't need to protect the counter against other processes. + * The reason why is a bit subtle. + * + * If a process gets here, preempt_forbid_cnt can be either 0, + * or != 0. In the latter case, preemption is already disabled + * and no concurrency issues can occur. + * + * In the former case, we could be preempted just after reading the + * value 0 from memory, and a concurrent process might, in fact, + * bump the value of preempt_forbid_cnt under our nose! + * + * BUT: if this ever happens, then we won't get another chance to + * run until the other process calls proc_permit() to re-enable + * preemption. At this point, the value of preempt_forbid_cnt + * must be back to 0, and thus what we had originally read from + * memory happens to be valid. + * + * No matter how hard you think about it, and how complicated you + * make your scenario, the above holds true as long as + * "preempt_forbid_cnt != 0" means that no task switching is + * possible. + */ + ++preempt_count; + + /* + * Make sure preempt_count is flushed to memory so the preemption + * softirq will see the correct value from now on. + */ + MEMORY_BARRIER; + } + + /** + * Re-enable preemptive task switching. + * + * \sa proc_forbid() + */ + INLINE void proc_permit(void) + { + extern cpu_atomic_t preempt_count; + + /* + * This is to ensure any global state changed by the process gets + * flushed to memory before task switching is re-enabled. + */ + MEMORY_BARRIER; + /* No need to protect against interrupts here. */ + ASSERT(preempt_count > 0); + --preempt_count; + /* + * This ensures preempt_count is flushed to memory immediately so the + * preemption interrupt sees the correct value. + */ + MEMORY_BARRIER; + } + + /** + * \return true if preemptive task switching is allowed. + * \note This accessor is needed because preempt_count + * must be absoultely private. + */ + INLINE bool proc_preemptAllowed(void) + { + extern cpu_atomic_t preempt_count; + return (preempt_count == 0); + } +#else /* CONFIG_KERN_PREEMPT */ + #define proc_forbid() /* NOP */ + #define proc_permit() /* NOP */ + #define proc_preemptAllowed() (true) +#endif /* CONFIG_KERN_PREEMPT */ + +/** Deprecated, use the proc_preemptAllowed() macro. */ +#define proc_allowed() proc_preemptAllowed() + +/** + * Execute a block of \a CODE atomically with respect to task scheduling. + */ +#define PROC_ATOMIC(CODE) \ + do { \ + proc_forbid(); \ + CODE; \ + proc_permit(); \ + } while(0) + +/** + * Default stack size for each thread, in bytes. + * + * The goal here is to allow a minimal task to save all of its + * registers twice, plus push a maximum of 32 variables on the + * stack. We add also struct Process size since we save it into the process' + * stack. + * + * The actual size computed by the default formula greatly depends on what + * options are active and on the architecture. + * + * Note that on most 16bit architectures, interrupts will also + * run on the stack of the currently running process. Nested + * interrupts will greatly increases the amount of stack space + * required per process. Use irqmanager to minimize stack + * usage. + */ + +#if (ARCH & ARCH_EMUL) + /* We need a large stack because system libraries are bloated */ + #define KERN_MINSTACKSIZE 65536 +#else + #if CONFIG_KERN_PREEMPT + /* + * A preemptible kernel needs a larger stack compared to the + * cooperative case. A task can be interrupted anytime in each + * node of the call graph, at any level of depth. This may + * result in a higher stack consumption, to call the ISR, save + * the current user context and to execute the kernel + * preemption routines implemented as ISR prologue and + * epilogue. All these calls are nested into the process stack. + * + * So, to reduce the risk of stack overflow/underflow problems + * add a x2 to the portion stack reserved to the user process. + */ + #define KERN_MINSTACKSIZE \ + (sizeof(Process) + CPU_SAVED_REGS_CNT * 2 * sizeof(cpu_stack_t) \ + + 32 * sizeof(int) * 2) + #else + #define KERN_MINSTACKSIZE \ + (sizeof(Process) + CPU_SAVED_REGS_CNT * 2 * sizeof(cpu_stack_t) \ + + 32 * sizeof(int)) + #endif /* CONFIG_KERN_PREEMPT */ + +#endif + +#ifndef CONFIG_KERN_MINSTACKSIZE + /* For backward compatibility */ + #define CONFIG_KERN_MINSTACKSIZE KERN_MINSTACKSIZE +#else + #warning FIXME: This macro is deprecated, use KERN_MINSTACKSIZE instead +#endif + +/** + * Utility macro to allocate a stack of size \a size. + * + * This macro define a static stack for one process and do + * check if given stack size is enough to run process. + * \note If you plan to use kprintf() and similar functions, you will need + * at least KERN_MINSTACKSIZE * 2 bytes. + * + * \param name Variable name for the stack. + * \param size Stack size in bytes. It must be at least KERN_MINSTACKSIZE. + */ +#define PROC_DEFINE_STACK(name, size) \ + cpu_stack_t name[((size) + sizeof(cpu_stack_t) - 1) / sizeof(cpu_stack_t)]; \ + STATIC_ASSERT((size) >= KERN_MINSTACKSIZE); + +/* Memory fill codes to help debugging */ +#if CONFIG_KERN_MONITOR + #include + #if (SIZEOF_CPUSTACK_T == 1) + /* 8bit cpu_stack_t */ + #define CONFIG_KERN_STACKFILLCODE 0xA5 + #define CONFIG_KERN_MEMFILLCODE 0xDB + #elif (SIZEOF_CPUSTACK_T == 2) + /* 16bit cpu_stack_t */ + #define CONFIG_KERN_STACKFILLCODE 0xA5A5 + #define CONFIG_KERN_MEMFILLCODE 0xDBDB + #elif (SIZEOF_CPUSTACK_T == 4) + /* 32bit cpu_stack_t */ + #define CONFIG_KERN_STACKFILLCODE 0xA5A5A5A5UL + #define CONFIG_KERN_MEMFILLCODE 0xDBDBDBDBUL + #elif (SIZEOF_CPUSTACK_T == 8) + /* 64bit cpu_stack_t */ + #define CONFIG_KERN_STACKFILLCODE 0xA5A5A5A5A5A5A5A5ULL + #define CONFIG_KERN_MEMFILLCODE 0xDBDBDBDBDBDBDBDBULL + #else + #error No cpu_stack_t size supported! + #endif +#endif + +#endif /* KERN_PROC_H */ diff --git a/2.5/bertos/kern/proc_p.h b/2.5/bertos/kern/proc_p.h new file mode 100644 index 00000000..5469dfcd --- /dev/null +++ b/2.5/bertos/kern/proc_p.h @@ -0,0 +1,223 @@ +/** + * \file + * + * + * \brief Internal scheduler structures and definitions for processes. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef KERN_PROC_P_H +#define KERN_PROC_P_H + +#include "cfg/cfg_proc.h" +#include "cfg/cfg_monitor.h" + +#include + +#include /* for cpu_stack_t */ +#include // IRQ_ASSERT_DISABLED() + +#include // struct Process + +#ifndef asm_switch_context +/** + * CPU dependent context switching routines. + * + * Saving and restoring the context on the stack is done by a CPU-dependent + * support routine which usually needs to be written in assembly. + */ +EXTERN_C void asm_switch_context(cpu_stack_t **new_sp, cpu_stack_t **save_sp); +#endif + +/** + * \name Flags for Process.flags. + * \{ + */ +#define PF_FREESTACK BV(0) /**< Free the stack when process dies */ +/*\}*/ + + +/** Track running processes. */ +extern REGISTER Process *current_process; + +/** + * Track ready processes. + * + * Access to this list must be performed with interrupts disabled + */ +extern REGISTER List proc_ready_list; + +#if CONFIG_KERN_PRI + #define prio_next() (LIST_EMPTY(&proc_ready_list) ? INT_MIN : \ + ((PriNode *)LIST_HEAD(&proc_ready_list))->pri) + #define prio_proc(proc) (proc->link.pri) + #define prio_curr() prio_proc(current_process) + + #define SCHED_ENQUEUE_INTERNAL(proc) \ + LIST_ENQUEUE(&proc_ready_list, &(proc)->link) + #define SCHED_ENQUEUE_HEAD_INTERNAL(proc) \ + LIST_ENQUEUE_HEAD(&proc_ready_list, &(proc)->link) +#else + #define prio_next() 0 + #define prio_proc(proc) 0 + #define prio_curr() 0 + + #define SCHED_ENQUEUE_INTERNAL(proc) ADDTAIL(&proc_ready_list, &(proc)->link) + #define SCHED_ENQUEUE_HEAD_INTERNAL(proc) ADDHEAD(&proc_ready_list, &(proc)->link) +#endif + +/** + * Enqueue a process in the ready list. + * + * Always use this macro to instert a process in the ready list, as its + * might vary to implement a different scheduling algorithms. + * + * \note Access to the scheduler ready list must be performed with + * interrupts disabled. + */ +#define SCHED_ENQUEUE(proc) do { \ + IRQ_ASSERT_DISABLED(); \ + LIST_ASSERT_VALID(&proc_ready_list); \ + SCHED_ENQUEUE_INTERNAL(proc); \ + } while (0) + +#define SCHED_ENQUEUE_HEAD(proc) do { \ + IRQ_ASSERT_DISABLED(); \ + LIST_ASSERT_VALID(&proc_ready_list); \ + SCHED_ENQUEUE_HEAD_INTERNAL(proc); \ + } while (0) + + +#if CONFIG_KERN_PRI +/** + * Changes the priority of an already enqueued process. + * + * Searches and removes the process from the ready list, then uses LIST_ENQUEUE(() + * to insert again to fix priority. + * + * No action is performed for processes that aren't in the ready list, eg. in semaphore queues. + * + * \note Performance could be improved with a different implementation of priority list. + */ +INLINE void sched_reenqueue(struct Process *proc) +{ + IRQ_ASSERT_DISABLED(); + LIST_ASSERT_VALID(&proc_ready_list); + Node *n; + PriNode *pos = NULL; + FOREACH_NODE(n, &proc_ready_list) + { + if (n == &proc->link.link) + { + pos = (PriNode *)n; + break; + } + } + + // only remove and enqueue again if process is already in the ready list + // otherwise leave it alone + if (pos) + { + REMOVE(&proc->link.link); + LIST_ENQUEUE(&proc_ready_list, &proc->link); + } +} +#endif //CONFIG_KERN_PRI + +/* Process trampoline */ +void proc_entry(void); + +/* Schedule another process *without* adding the current one to the ready list. */ +void proc_switch(void); + +/* Immediately schedule a particular process bypassing the scheduler. */ +void proc_wakeup(Process *proc); + +/* Initialize a scheduler class. */ +void proc_schedInit(void); + +#if CONFIG_KERN_MONITOR + /** Initialize the monitor */ + void monitor_init(void); + + /** Register a process into the monitor */ + void monitor_add(Process *proc, const char *name); + + /** Unregister a process from the monitor */ + void monitor_remove(Process *proc); + + /** Rename a process */ + void monitor_rename(Process *proc, const char *name); +#endif /* CONFIG_KERN_MONITOR */ + +/* + * Quantum related macros are used in the + * timer module and must be empty when + * kernel is disabled. + */ +#if (CONFIG_KERN && CONFIG_KERN_PREEMPT) +INLINE int preempt_quantum(void) +{ + extern int _proc_quantum; + return _proc_quantum; +} + +INLINE void proc_decQuantum(void) +{ + extern int _proc_quantum; + if (_proc_quantum > 0) + _proc_quantum--; +} + +INLINE void preempt_reset_quantum(void) +{ + extern int _proc_quantum; + _proc_quantum = CONFIG_KERN_QUANTUM; +} +#else /* !(CONFIG_KERN && CONFIG_KERN_PREEMPT) */ +INLINE int preempt_quantum(void) +{ + return 0; +} + +INLINE void proc_decQuantum(void) +{ +} + +INLINE void preempt_reset_quantum(void) +{ +} +#endif /* (CONFIG_KERN && CONFIG_KERN_PREEMPT) */ + +#endif /* KERN_PROC_P_H */ diff --git a/2.5/bertos/kern/proc_test.c b/2.5/bertos/kern/proc_test.c new file mode 100644 index 00000000..b2319faa --- /dev/null +++ b/2.5/bertos/kern/proc_test.c @@ -0,0 +1,406 @@ +/** + * \file + * + * + * + * \brief Test kernel preemption. + * + * This testcase spawns TASKS parallel threads that runs for TIME seconds. They + * continuously spin updating a global counter (one counter for each thread). + * + * At exit each thread checks if the others have been che chance to update + * their own counter. If not, it means the preemption didn't occur and the + * testcase returns an error message. + * + * Otherwise, if all the threads have been able to update their own counter it + * means preemption successfully occurs, since there is no active sleep inside + * each thread's implementation. + * + * \author Andrea Righi + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PRI" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PRI 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PREEMPT" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PREEMPT 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_HEAP" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_HEAP 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_HEAP_SIZE" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_HEAP_SIZE 2097152L" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_monitor.h $cfgdir/ + * $test$: sed -i "s/CONFIG_KERN_MONITOR 0/CONFIG_KERN_MONITOR 1/" $cfgdir/cfg_monitor.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + */ + +#include // sprintf +#include // memset + +#include +#include +#include + +#include +#include +#include + +enum +{ + TEST_OK = 1, + TEST_FAIL = 2, +}; + +/* Number of tasks to spawn */ +#define TASKS 8 + +static char name[TASKS][32]; + +static unsigned int done[TASKS]; + +static cpu_atomic_t barrier[TASKS]; +static cpu_atomic_t main_barrier; + +/* Base time delay for processes using timer_delay() */ +#define DELAY 5 + +// Define process stacks for test. +#define WORKER_STACK_SIZE KERN_MINSTACKSIZE * 3 + +#if CONFIG_KERN_HEAP +#define WORKER_STACK(id) NULL +#else /* !CONFIG_KERN_HEAP */ +static cpu_stack_t worker_stack[TASKS][(WORKER_STACK_SIZE + + sizeof(cpu_stack_t) - 1) / sizeof(cpu_stack_t)]; +#define WORKER_STACK(id) (&worker_stack[id][0]) +#endif /* CONFIG_KERN_HEAP */ + +static int prime_numbers[] = +{ + 1, 3, 5, 7, 11, 13, 17, 19, + 23, 29, 31, 37, 41, 43, 47, 53, +}; +STATIC_ASSERT(TASKS <= countof(prime_numbers)); + +#if CONFIG_KERN_PREEMPT +/* Time to run each preemptible thread (in seconds) */ +#define TIME 10 + +static unsigned long preempt_counter[TASKS]; +static unsigned int preempt_done[TASKS]; +#endif + +static void cleanup(void) +{ +#if CONFIG_KERN_PREEMPT + // Clear shared data (this is needed when this testcase is embedded in + // the demo application). + memset(preempt_counter, 0, sizeof(preempt_counter)); + memset(preempt_done, 0, sizeof(preempt_done)); +#endif /* CONFIG_KERN_PREEMPT */ + memset(done, 0, sizeof(done)); + memset(barrier, 0, sizeof(barrier)); + main_barrier = 0; +} + +static void worker(void) +{ + ssize_t pid = (ssize_t)proc_currentUserData(); + long tot = prime_numbers[pid - 1]; + unsigned int my_count = 0; + int i; + + barrier[pid - 1] = 1; + /* Synchronize on the main barrier */ + while (!main_barrier) + proc_yield(); + for (i = 0; i < tot; i++) + { + my_count++; + PROC_ATOMIC(kprintf("> %s[%zd] running\n", __func__, pid)); + timer_delay(tot * DELAY); + } + done[pid - 1] = 1; + PROC_ATOMIC(kprintf("> %s[%zd] completed\n", __func__, pid)); +} + +static int worker_test(void) +{ + ssize_t i; + + // Init the test processes + cleanup(); + kputs("Run Proc test..\n"); + for (i = 0; i < TASKS; i++) + { + name[i][0] = '\0'; + snprintf(&name[i][0], sizeof(name[i]), "worker_%zd", i + 1); + name[i][sizeof(name[i]) - 1] = '\0'; + proc_new_with_name(name[i], worker, (iptr_t)(i + 1), + WORKER_STACK_SIZE, WORKER_STACK(i)); + } + /* Synchronize on start */ + while (1) + { + for (i = 0; i < TASKS; i++) + if (!barrier[i]) + break; + if (i == TASKS) + break; + proc_yield(); + } + main_barrier = 1; + MEMORY_BARRIER; + kputs("> Main: Processes started\n"); + while (1) + { + for (i = 0; i < TASKS; i++) + { + if (!done[i]) + break; + } + if (i == TASKS) + break; + monitor_report(); + timer_delay(93); + } + kputs("> Main: process test finished..ok!\n"); + return 0; +} + +#if CONFIG_KERN_PREEMPT +static void preempt_worker(void) +{ + ssize_t pid = (ssize_t)proc_currentUserData(); + unsigned long *my_count = &preempt_counter[pid - 1]; + ticks_t start, stop; + int i; + + barrier[pid - 1] = 1; + /* Synchronize on the main barrier */ + while (!main_barrier) + proc_yield(); + PROC_ATOMIC(kprintf("> %s[%zd] running\n", __func__, pid)); + start = timer_clock(); + stop = ms_to_ticks(TIME * 1000); + while (timer_clock() - start < stop) + { + IRQ_ASSERT_ENABLED(); + (*my_count)++; + /* be sure to wrap to a value different than 0 */ + if (UNLIKELY(*my_count == (unsigned int)~0)) + *my_count = 1; + } + PROC_ATOMIC(kprintf("> %s[%zd] completed: (counter = %lu)\n", + __func__, pid, *my_count)); + for (i = 0; i < TASKS; i++) + if (!preempt_counter[i]) + { + preempt_done[pid - 1] = TEST_FAIL; + return; + } + preempt_done[pid - 1] = TEST_OK; +} + +static int preempt_worker_test(void) +{ + unsigned long score = 0; + ssize_t i; + + // Init the test processes + cleanup(); + kputs("Run Preemption test..\n"); + for (i = 0; i < TASKS; i++) + { + name[i][0] = '\0'; + snprintf(&name[i][0], sizeof(name[i]), + "preempt_worker_%zd", i + 1); + name[i][sizeof(name[i]) - 1] = '\0'; + proc_new_with_name(name[i], preempt_worker, (iptr_t)(i + 1), + WORKER_STACK_SIZE, WORKER_STACK(i)); + } + kputs("> Main: Processes created\n"); + /* Synchronize on start */ + while (1) + { + for (i = 0; i < TASKS; i++) + if (!barrier[i]) + break; + if (i == TASKS) + break; + proc_yield(); + } + /* Now all threads have been created, start them all */ + main_barrier = 1; + MEMORY_BARRIER; + kputs("> Main: Processes started\n"); + while (1) + { + for (i = 0; i < TASKS; i++) + { + if (!preempt_done[i]) + break; + else if (preempt_done[i] == TEST_FAIL) + { + kputs("> Main: process test finished..fail!\n"); + return -1; + } + } + if (i == TASKS) + break; + monitor_report(); + timer_delay(1000); + } + for (i = 0; i < TASKS; i++) + score += preempt_counter[i]; + kputs("> Main: process test finished..ok!\n"); + kprintf("> Score: %lu\n", score); + return 0; +} +#endif /* CONFIG_KERN_PREEMPT */ + +#if CONFIG_KERN_SIGNALS & CONFIG_KERN_PRI + +// Define params to test priority +#define PROC_PRI_TEST(num) static void proc_pri_test##num(void) \ +{ \ + struct Process *main_proc = (struct Process *) proc_currentUserData(); \ + kputs("> Process: " #num "\n"); \ + sig_send(main_proc, SIG_USER##num); \ +} + +// Default priority is 0 +#define PROC_PRI_TEST_INIT(num, proc) \ +do { \ + struct Process *p = proc_new(proc_pri_test##num, (proc), \ + WORKER_STACK_SIZE, \ + WORKER_STACK(num)); \ + proc_setPri(p, num + 1); \ +} while (0) + +PROC_PRI_TEST(0) +PROC_PRI_TEST(1) +PROC_PRI_TEST(2) + +static int prio_worker_test(void) +{ + struct Process *curr = proc_current(); + int orig_pri = curr->link.pri; + int ret = 0; + + // test process priority + // main process must have the higher priority to check signals received + proc_setPri(proc_current(), 10); + + kputs("Run Priority test..\n"); + // the order in which the processes are created is important! + PROC_PRI_TEST_INIT(0, curr); + PROC_PRI_TEST_INIT(1, curr); + PROC_PRI_TEST_INIT(2, curr); + + // signals must be: USER2, 1, 0 in order + sigmask_t signals = sig_wait(SIG_USER0 | SIG_USER1 | SIG_USER2); + if (!(signals & SIG_USER2)) + { + ret = -1; + goto out; + } + signals = sig_wait(SIG_USER0 | SIG_USER1 | SIG_USER2); + if (!(signals & SIG_USER1)) + { + ret = -1; + goto out; + } + signals = sig_wait(SIG_USER0 | SIG_USER1 | SIG_USER2); + if (!(signals & SIG_USER0)) + { + ret = -1; + goto out; + } + // All processes must have quit by now, but just in case... + signals = sig_waitTimeout(SIG_USER0 | SIG_USER1 | SIG_USER2, 200); + if (signals & (SIG_USER0 | SIG_USER1 | SIG_USER2)) + { + ret = -1; + goto out; + } + if (signals & SIG_TIMEOUT) + { + kputs("Priority test successfull.\n"); + } +out: + proc_setPri(proc_current(), orig_pri); + if (ret != 0) + kputs("Priority test failed.\n"); + return ret; +} +#endif /* CONFIG_KERN_SIGNALS & CONFIG_KERN_PRI */ + +/** + * Process scheduling test + */ +int proc_testRun(void) +{ + /* Start tests */ + worker_test(); +#if CONFIG_KERN_PREEMPT + preempt_worker_test(); +#endif /* CONFIG_KERN_PREEMPT */ +#if CONFIG_KERN_SIGNALS & CONFIG_KERN_PRI + prio_worker_test(); +#endif /* CONFIG_KERN_SIGNALS & CONFIG_KERN_PRI */ + return 0; +} + +int proc_testSetup(void) +{ + kdbg_init(); + + kprintf("Init Timer.."); + timer_init(); + kprintf("Done.\n"); + + kprintf("Init Process.."); + proc_init(); + kprintf("Done.\n"); + + return 0; +} + +int proc_testTearDown(void) +{ + kputs("TearDown Process test.\n"); + return 0; +} + +TEST_MAIN(proc); diff --git a/2.5/bertos/kern/proc_test/coop_heap_test.c b/2.5/bertos/kern/proc_test/coop_heap_test.c new file mode 100644 index 00000000..fe84f01d --- /dev/null +++ b/2.5/bertos/kern/proc_test/coop_heap_test.c @@ -0,0 +1,65 @@ +/** + * \file + * + * + * + * \brief Test kernel preemption. + * + * This testcase spawns TASKS parallel threads that runs for TIME seconds. They + * continuously spin updating a global counter (one counter for each thread). + * + * At exit each thread checks if the others have been che chance to update + * their own counter. If not, it means the preemption didn't occur and the + * testcase returns an error message. + * + * Otherwise, if all the threads have been able to update their own counter it + * means preemption successfully occurs, since there is no active sleep inside + * each thread's implementation. + * + * \author Andrea Righi + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_HEAP " >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_HEAP 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_HEAP_SIZE" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_HEAP_SIZE 2097152L" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_monitor.h $cfgdir/ + * $test$: sed -i "s/CONFIG_KERN_MONITOR 0/CONFIG_KERN_MONITOR 1/" $cfgdir/cfg_monitor.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + * notest: all + * + */ + +#include "../proc_test.c" diff --git a/2.5/bertos/kern/proc_test/coop_msg_test.c b/2.5/bertos/kern/proc_test/coop_msg_test.c new file mode 100644 index 00000000..896f8fbd --- /dev/null +++ b/2.5/bertos/kern/proc_test/coop_msg_test.c @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Message test. + * + * \version $Id$ + * + * \author Daniele Basile + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + * notest: all + */ + +#include "../msg_test.c" diff --git a/2.5/bertos/kern/proc_test/coop_pri_heap_test.c b/2.5/bertos/kern/proc_test/coop_pri_heap_test.c new file mode 100644 index 00000000..caf78fc7 --- /dev/null +++ b/2.5/bertos/kern/proc_test/coop_pri_heap_test.c @@ -0,0 +1,67 @@ +/** + * \file + * + * + * + * \brief Test kernel preemption. + * + * This testcase spawns TASKS parallel threads that runs for TIME seconds. They + * continuously spin updating a global counter (one counter for each thread). + * + * At exit each thread checks if the others have been che chance to update + * their own counter. If not, it means the preemption didn't occur and the + * testcase returns an error message. + * + * Otherwise, if all the threads have been able to update their own counter it + * means preemption successfully occurs, since there is no active sleep inside + * each thread's implementation. + * + * \author Andrea Righi + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PRI" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PRI 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_HEAP " >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_HEAP 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_HEAP_SIZE" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_HEAP_SIZE 2097152L" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_monitor.h $cfgdir/ + * $test$: sed -i "s/CONFIG_KERN_MONITOR 0/CONFIG_KERN_MONITOR 1/" $cfgdir/cfg_monitor.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + * notest: all + * + */ + +#include "../proc_test.c" diff --git a/2.5/bertos/kern/proc_test/coop_pri_test.c b/2.5/bertos/kern/proc_test/coop_pri_test.c new file mode 100644 index 00000000..b2996ab0 --- /dev/null +++ b/2.5/bertos/kern/proc_test/coop_pri_test.c @@ -0,0 +1,63 @@ +/** + * \file + * + * + * + * \brief Test kernel preemption. + * + * This testcase spawns TASKS parallel threads that runs for TIME seconds. They + * continuously spin updating a global counter (one counter for each thread). + * + * At exit each thread checks if the others have been che chance to update + * their own counter. If not, it means the preemption didn't occur and the + * testcase returns an error message. + * + * Otherwise, if all the threads have been able to update their own counter it + * means preemption successfully occurs, since there is no active sleep inside + * each thread's implementation. + * + * \author Andrea Righi + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PRI" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PRI 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_monitor.h $cfgdir/ + * $test$: sed -i "s/CONFIG_KERN_MONITOR 0/CONFIG_KERN_MONITOR 1/" $cfgdir/cfg_monitor.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + * notest: all + * + */ + +#include "../proc_test.c" diff --git a/2.5/bertos/kern/proc_test/coop_sem_test.c b/2.5/bertos/kern/proc_test/coop_sem_test.c new file mode 100644 index 00000000..eaf6bc99 --- /dev/null +++ b/2.5/bertos/kern/proc_test/coop_sem_test.c @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Semaphore test. + * + * \version $Id$ + * + * \author Daniele Basile + * \author Stefano Fedrigo + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_sem.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SEMAPHORES" >> $cfgdir/cfg_sem.h + * $test$: echo "#define CONFIG_KERN_SEMAPHORES 1" >> $cfgdir/cfg_sem.h + * + * notest:all + */ + +#include "../sem_test.c" diff --git a/2.5/bertos/kern/proc_test/coop_signal_test.c b/2.5/bertos/kern/proc_test/coop_signal_test.c new file mode 100644 index 00000000..f1ab4ca7 --- /dev/null +++ b/2.5/bertos/kern/proc_test/coop_signal_test.c @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Signals test. + * + * \version $Id$ + * + * \author Daniele Basile + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + * notest: all + */ + +#include "../signal_test.c" diff --git a/2.5/bertos/kern/proc_test/coop_test.c b/2.5/bertos/kern/proc_test/coop_test.c new file mode 100644 index 00000000..c8ec86a9 --- /dev/null +++ b/2.5/bertos/kern/proc_test/coop_test.c @@ -0,0 +1,60 @@ +/** + * \file + * + * + * + * \brief Test kernel preemption. + * + * This testcase spawns TASKS parallel threads that runs for TIME seconds. They + * continuously spin updating a global counter (one counter for each thread). + * + * At exit each thread checks if the others have been che chance to update + * their own counter. If not, it means the preemption didn't occur and the + * testcase returns an error message. + * + * Otherwise, if all the threads have been able to update their own counter it + * means preemption successfully occurs, since there is no active sleep inside + * each thread's implementation. + * + * \author Andrea Righi + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_monitor.h $cfgdir/ + * $test$: sed -i "s/CONFIG_KERN_MONITOR 0/CONFIG_KERN_MONITOR 1/" $cfgdir/cfg_monitor.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + * notest: all + */ + +#include "../proc_test.c" diff --git a/2.5/bertos/kern/proc_test/preempt_heap_test.c b/2.5/bertos/kern/proc_test/preempt_heap_test.c new file mode 100644 index 00000000..5040a56f --- /dev/null +++ b/2.5/bertos/kern/proc_test/preempt_heap_test.c @@ -0,0 +1,66 @@ +/** + * \file + * + * + * + * \brief Test kernel preemption. + * + * This testcase spawns TASKS parallel threads that runs for TIME seconds. They + * continuously spin updating a global counter (one counter for each thread). + * + * At exit each thread checks if the others have been che chance to update + * their own counter. If not, it means the preemption didn't occur and the + * testcase returns an error message. + * + * Otherwise, if all the threads have been able to update their own counter it + * means preemption successfully occurs, since there is no active sleep inside + * each thread's implementation. + * + * \author Andrea Righi + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PREEMPT" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PREEMPT 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_HEAP " >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_HEAP 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_HEAP_SIZE" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_HEAP_SIZE 2097152L" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_monitor.h $cfgdir/ + * $test$: sed -i "s/CONFIG_KERN_MONITOR 0/CONFIG_KERN_MONITOR 1/" $cfgdir/cfg_monitor.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + * notest: all + */ + +#include "../proc_test.c" diff --git a/2.5/bertos/kern/proc_test/preempt_msg_test.c b/2.5/bertos/kern/proc_test/preempt_msg_test.c new file mode 100644 index 00000000..88348d49 --- /dev/null +++ b/2.5/bertos/kern/proc_test/preempt_msg_test.c @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Message test. + * + * \version $Id$ + * + * \author Daniele Basile + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PREEMPT" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PREEMPT 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + * notest:all + */ + +#include "../msg_test.c" diff --git a/2.5/bertos/kern/proc_test/preempt_pri_heap_test.c b/2.5/bertos/kern/proc_test/preempt_pri_heap_test.c new file mode 100644 index 00000000..17888709 --- /dev/null +++ b/2.5/bertos/kern/proc_test/preempt_pri_heap_test.c @@ -0,0 +1,68 @@ +/** + * \file + * + * + * + * \brief Test kernel preemption. + * + * This testcase spawns TASKS parallel threads that runs for TIME seconds. They + * continuously spin updating a global counter (one counter for each thread). + * + * At exit each thread checks if the others have been che chance to update + * their own counter. If not, it means the preemption didn't occur and the + * testcase returns an error message. + * + * Otherwise, if all the threads have been able to update their own counter it + * means preemption successfully occurs, since there is no active sleep inside + * each thread's implementation. + * + * \author Andrea Righi + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PRI" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PRI 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PREEMPT" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PREEMPT 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_HEAP " >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_HEAP 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_HEAP_SIZE" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_HEAP_SIZE 2097152L" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_monitor.h $cfgdir/ + * $test$: sed -i "s/CONFIG_KERN_MONITOR 0/CONFIG_KERN_MONITOR 1/" $cfgdir/cfg_monitor.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + * notest: all + */ + +#include "../proc_test.c" diff --git a/2.5/bertos/kern/proc_test/preempt_pri_test.c b/2.5/bertos/kern/proc_test/preempt_pri_test.c new file mode 100644 index 00000000..a75150be --- /dev/null +++ b/2.5/bertos/kern/proc_test/preempt_pri_test.c @@ -0,0 +1,64 @@ +/** + * \file + * + * + * + * \brief Test kernel preemption. + * + * This testcase spawns TASKS parallel threads that runs for TIME seconds. They + * continuously spin updating a global counter (one counter for each thread). + * + * At exit each thread checks if the others have been che chance to update + * their own counter. If not, it means the preemption didn't occur and the + * testcase returns an error message. + * + * Otherwise, if all the threads have been able to update their own counter it + * means preemption successfully occurs, since there is no active sleep inside + * each thread's implementation. + * + * \author Andrea Righi + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PRI" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PRI 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PREEMPT" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PREEMPT 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_monitor.h $cfgdir/ + * $test$: sed -i "s/CONFIG_KERN_MONITOR 0/CONFIG_KERN_MONITOR 1/" $cfgdir/cfg_monitor.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + * notest: all + */ + +#include "../proc_test.c" diff --git a/2.5/bertos/kern/proc_test/preempt_sem_test.c b/2.5/bertos/kern/proc_test/preempt_sem_test.c new file mode 100644 index 00000000..0738bfac --- /dev/null +++ b/2.5/bertos/kern/proc_test/preempt_sem_test.c @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Semaphore test. + * + * \version $Id$ + * + * \author Daniele Basile + * \author Stefano Fedrigo + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PREEMPT" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PREEMPT 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_sem.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SEMAPHORES" >> $cfgdir/cfg_sem.h + * $test$: echo "#define CONFIG_KERN_SEMAPHORES 1" >> $cfgdir/cfg_sem.h + * + * notest:all + */ + +#include "../sem_test.c" diff --git a/2.5/bertos/kern/proc_test/preempt_signal_test.c b/2.5/bertos/kern/proc_test/preempt_signal_test.c new file mode 100644 index 00000000..cd02ae70 --- /dev/null +++ b/2.5/bertos/kern/proc_test/preempt_signal_test.c @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Signals test. + * + * \version $Id$ + * + * \author Daniele Basile + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PREEMPT" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PREEMPT 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + * notest: all + */ + +#include "../signal_test.c" diff --git a/2.5/bertos/kern/proc_test/preempt_test.c b/2.5/bertos/kern/proc_test/preempt_test.c new file mode 100644 index 00000000..b1c0e131 --- /dev/null +++ b/2.5/bertos/kern/proc_test/preempt_test.c @@ -0,0 +1,62 @@ +/** + * \file + * + * + * + * \brief Test kernel preemption. + * + * This testcase spawns TASKS parallel threads that runs for TIME seconds. They + * continuously spin updating a global counter (one counter for each thread). + * + * At exit each thread checks if the others have been che chance to update + * their own counter. If not, it means the preemption didn't occur and the + * testcase returns an error message. + * + * Otherwise, if all the threads have been able to update their own counter it + * means preemption successfully occurs, since there is no active sleep inside + * each thread's implementation. + * + * \author Andrea Righi + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: echo "#undef CONFIG_KERN_PREEMPT" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN_PREEMPT 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_monitor.h $cfgdir/ + * $test$: sed -i "s/CONFIG_KERN_MONITOR 0/CONFIG_KERN_MONITOR 1/" $cfgdir/cfg_monitor.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + * + * notest: all + */ + +#include "../proc_test.c" diff --git a/2.5/bertos/kern/sem.c b/2.5/bertos/kern/sem.c new file mode 100644 index 00000000..3c645e95 --- /dev/null +++ b/2.5/bertos/kern/sem.c @@ -0,0 +1,187 @@ +/** + * \file + * + * + * \brief Semaphore based synchronization services. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#include "sem.h" +#include + +#include // ASSERT_IRQ_DISABLED() + +#include +#include +#include + +INLINE void sem_verify(struct Semaphore *s) +{ + (void)s; + ASSERT(s); + LIST_ASSERT_VALID(&s->wait_queue); + ASSERT(s->nest_count >= 0); + ASSERT(s->nest_count < 128); // heuristic max +} + +/** + * \brief Initialize a Semaphore structure. + */ +void sem_init(struct Semaphore *s) +{ + LIST_INIT(&s->wait_queue); + s->owner = NULL; + s->nest_count = 0; +} + + +/** + * \brief Attempt to lock a semaphore without waiting. + * + * \return true in case of success, false if the semaphore + * was already locked by someone else. + * + * \note each call to sem_attempt() must be matched by a + * call to sem_release(). + * + * \see sem_obtain() sem_release() + */ +bool sem_attempt(struct Semaphore *s) +{ + bool result = false; + + proc_forbid(); + sem_verify(s); + if ((!s->owner) || (s->owner == current_process)) + { + s->owner = current_process; + s->nest_count++; + result = true; + } + proc_permit(); + + return result; +} + + +/** + * \brief Lock a semaphore. + * + * If the semaphore is already owned by another process, the caller + * process will be enqueued into the waiting list and sleep until + * the semaphore is available. + * + * \note Each call to sem_obtain() must be matched by a + * call to sem_release(). + * + * \note This routine is optimized for highest speed in + * the most common case: the semaphore is free or locked + * by the calling process itself. Rearranging this code + * is probably a bad idea. + * + * \sa sem_release() sem_attempt() + */ +void sem_obtain(struct Semaphore *s) +{ + proc_forbid(); + sem_verify(s); + + /* Is the semaphore already locked by another process? */ + if (UNLIKELY(s->owner && (s->owner != current_process))) + { + /* Append calling process to the wait queue */ + ADDTAIL(&s->wait_queue, (Node *)current_process); + + /* + * We will wake up only when the current owner calls + * sem_release(). Then, the semaphore will already + * be locked for us. + */ + proc_permit(); + proc_switch(); + } + else + { + ASSERT(LIST_EMPTY(&s->wait_queue)); + + /* The semaphore was free: lock it */ + s->owner = current_process; + s->nest_count++; + proc_permit(); + } +} + + +/** + * \brief Release a lock on a previously locked semaphore. + * + * If the nesting count of the semaphore reaches zero, + * the next process waiting for it will be awaken. + * + * \note This routine is optimized for highest speed in + * the most common case: the semaphore has been locked just + * once and nobody else was waiting for it. Rearranging + * this code is probably a bad idea. + * + * \sa sem_obtain() sem_attempt() + */ +void sem_release(struct Semaphore *s) +{ + Process *proc = NULL; + + proc_forbid(); + sem_verify(s); + + ASSERT(s->owner == current_process); + + /* + * Decrement nesting count and check if the semaphore + * has been fully unlocked. + */ + if (--s->nest_count == 0) + { + /* Disown semaphore */ + s->owner = NULL; + + /* Give semaphore to the first applicant, if any */ + if (UNLIKELY((proc = (Process *)list_remHead(&s->wait_queue)))) + { + s->nest_count = 1; + s->owner = proc; + } + } + proc_permit(); + + if (proc) + ATOMIC(proc_wakeup(proc)); +} diff --git a/2.5/bertos/kern/sem.h b/2.5/bertos/kern/sem.h new file mode 100644 index 00000000..1e3ef205 --- /dev/null +++ b/2.5/bertos/kern/sem.h @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \brief Mutually exclusive semaphores. + * Shared locking not supported in this implementation. + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * $WIZ$ module_name = "semaphores" + * $WIZ$ module_depends = "kernel" + * $WIZ$ module_configuration = "bertos/cfg/cfg_sem.h" + */ + + +#ifndef KERN_SEM_H +#define KERN_SEM_H + +#include +#include + +/* Fwd decl */ +struct Process; + + +typedef struct Semaphore +{ + struct Process *owner; + List wait_queue; + int nest_count; +} Semaphore; + +/** + * \name Process synchronization services + * \{ + */ +void sem_init(struct Semaphore *s); +bool sem_attempt(struct Semaphore *s); +void sem_obtain(struct Semaphore *s); +void sem_release(struct Semaphore *s); +/* \} */ + +int sem_testRun(void); +int sem_testSetup(void); +int sem_testTearDown(void); + +#endif /* KERN_SEM_H */ diff --git a/2.5/bertos/kern/sem_test.c b/2.5/bertos/kern/sem_test.c new file mode 100644 index 00000000..555f755d --- /dev/null +++ b/2.5/bertos/kern/sem_test.c @@ -0,0 +1,204 @@ +/** + * \file + * + * + * \brief Semaphore test. + * + * \version $Id$ + * + * \author Daniele Basile + * \author Stefano Fedrigo + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_sem.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SEMAPHORES" >> $cfgdir/cfg_sem.h + * $test$: echo "#define CONFIG_KERN_SEMAPHORES 1" >> $cfgdir/cfg_sem.h + */ + +#include +#include + +#include +#include +#include + +#include + +// Global settings for the test. +#define MAX_GLOBAL_COUNT 1024 +#define TEST_TIME_OUT_MS 6000 +#define DELAY 5 + +// Settings for the test process. +//Process 1 +#define INC_PROC_T1 1 +#define DELAY_PROC_T1 INC_PROC_T1*DELAY +//Process 2 +#define INC_PROC_T2 3 +#define DELAY_PROC_T2 INC_PROC_T2*DELAY +//Process 3 +#define INC_PROC_T3 5 +#define DELAY_PROC_T3 INC_PROC_T3*DELAY +//Process 4 +#define INC_PROC_T4 7 +#define DELAY_PROC_T4 INC_PROC_T4*DELAY +//Process 5 +#define INC_PROC_T5 11 +#define DELAY_PROC_T5 INC_PROC_T5*DELAY +//Process 6 +#define INC_PROC_T6 13 +#define DELAY_PROC_T6 INC_PROC_T6*DELAY +//Process 7 +#define INC_PROC_T7 17 +#define DELAY_PROC_T7 INC_PROC_T7*DELAY +//Process 8 +#define INC_PROC_T8 19 +#define DELAY_PROC_T8 INC_PROC_T8*DELAY + +Semaphore sem; +unsigned int global_count = 0; + +/* + * These macros generate the code needed to create the test process functions. + */ +#define PROC_TEST(num) static void proc_semTest##num(void) \ +{ \ + unsigned int local_count = 0; \ + \ + for (int i = 0; i < INC_PROC_T##num; ++i) \ + { \ + sem_obtain(&sem); \ + kprintf("> test%d: Obtain semaphore.\n", num); \ + local_count = global_count; \ + kprintf("> test%d: Read global count [%d]\n", num, local_count); \ + timer_delay(DELAY_PROC_T##num); \ + local_count += INC_PROC_T##num; \ + global_count = local_count; \ + kprintf("> test%d: Update count g[%d] l[%d]\n", num, global_count, local_count); \ + sem_release(&sem); \ + kprintf("> test%d: Relase semaphore.\n", num); \ + } \ +} \ + +#define PROC_TEST_STACK(num) PROC_DEFINE_STACK(proc_sem_test##num##_stack, KERN_MINSTACKSIZE * 2) +#define PROC_TEST_INIT(num) proc_new(proc_semTest##num, NULL, sizeof(proc_sem_test##num##_stack), proc_sem_test##num##_stack); + +// Define process +PROC_TEST(1) +PROC_TEST(2) +PROC_TEST(3) +PROC_TEST(4) +PROC_TEST(5) +PROC_TEST(6) +PROC_TEST(7) +PROC_TEST(8) + +// Define process stacks for test. +PROC_TEST_STACK(1) +PROC_TEST_STACK(2) +PROC_TEST_STACK(3) +PROC_TEST_STACK(4) +PROC_TEST_STACK(5) +PROC_TEST_STACK(6) +PROC_TEST_STACK(7) +PROC_TEST_STACK(8) + +/** + * Run semaphore test + */ +int sem_testRun(void) +{ + ticks_t start_time = timer_clock(); + + kprintf("Run semaphore test..\n"); + + //Init the process tests + PROC_TEST_INIT(1) + PROC_TEST_INIT(2) + PROC_TEST_INIT(3) + PROC_TEST_INIT(4) + PROC_TEST_INIT(5) + PROC_TEST_INIT(6) + PROC_TEST_INIT(7) + PROC_TEST_INIT(8) + kputs("> Main: Processes created\n"); + + /* + * Wait until all processes exit, if something goes wrong we return an + * error after timeout_ms. + */ + while((timer_clock() - start_time) < ms_to_ticks(TEST_TIME_OUT_MS)) + { + if (sem_attempt(&sem)) + { + kputs("> Main: Check if test has finished..\n"); + if(global_count == MAX_GLOBAL_COUNT) + { + kputs("> Main: Test Finished..Ok!\n"); + return 0; + } + sem_release(&sem); + kputs("> Main: Test is still running..\n"); + } + proc_yield(); + } + + kputs("Semaphore Test fail..\n"); + return -1; +} + +int sem_testSetup(void) +{ + kdbg_init(); + + kprintf("Init Semaphore.."); + sem_init(&sem); + kprintf("Done.\n"); + + kprintf("Init Timer.."); + timer_init(); + kprintf("Done.\n"); + + kprintf("Init Process.."); + proc_init(); + kprintf("Done.\n"); + + return 0; +} + +int sem_testTearDown(void) +{ + kputs("TearDown Semaphore test.\n"); + return 0; +} + +TEST_MAIN(sem); diff --git a/2.5/bertos/kern/signal.c b/2.5/bertos/kern/signal.c new file mode 100644 index 00000000..139e69da --- /dev/null +++ b/2.5/bertos/kern/signal.c @@ -0,0 +1,303 @@ +/** + * \file + * + * + * \brief IPC signals implementation. + * + * Signals are a low-level IPC primitive. A process receives a signal + * when some external event has happened. Like interrupt requests, + * signals do not carry any additional information. If processing a + * specific event requires additional data, the process must obtain it + * through some other mechanism. + * + * Despite the name, one shouldn't confuse these signals with POSIX + * signals. POSIX signals are usually executed synchronously, like + * software interrupts. + * + * Signals are very low overhead. Using them exclusively to wait + * for multiple asynchronous events results in very simple dispatch + * logic with low processor and resource usage. + * + * The "event" module is a higher-level interface that can optionally + * deliver signals to processes. Messages provide even higher-level + * IPC services built on signals. Semaphore arbitration is also + * implemented using signals. + * + * In this implementation, each process has a limited set of signal + * bits (usually 32) and can wait for multiple signals at the same + * time using sig_wait(). Signals can also be polled using sig_check(), + * but a process spinning on its signals usually defeats their purpose + * of providing a multitasking-friendly infrastructure for event-driven + * applications. + * + * Signals are like flags: they are either active or inactive. After an + * external event has delivered a particular signal, it remains raised until + * the process acknowledges it using either sig_wait() or sig_check(). + * Counting signals is not a reliable way to count how many times a + * particular event has occurred, because the same signal may be + * delivered twice before the process can notice. + * + * Signals can be delivered synchronously via sig_send() or asynchronously via + * sig_post(). + * + * In the synchronous case the process is awakened if it was waiting for any + * signal and immediately dispatched for execution via a direct context switch, + * if its priority is greater than the running process. + * + *
+ * - Synchronous-signal delivery:
+ *
+ *     [P1]____sig_send()____proc_wakeup()____[P2]
+ * 
+ * + * In the asynchronous case, the process is scheduled for execution as a + * consequence of the delivery, but it will be dispatched by the scheduler as + * usual, according to the scheduling policy. + * + *
+ * - Asynchronous-signal delivery:
+ *
+ *     [P1]____sig_post()____[P1]____proc_schedule()____[P2]
+ * 
+ * + * In this way, any execution context, including an interrupt handler, can + * deliver a signal to a process. However, synchronous signal delivery from a + * non-sleepable context (like an interrupt handler) is forbidden in order to + * avoid potential deadlock conditions. Instead, sig_post() can be used from + * any context, expecially from interrupt context or when the preemption is + * disabled. + * + * Multiple independent signals may be delivered at once with a single + * invocation of sig_send() or sig_post(), although this is rarely useful. + * + * \section signal_allocation Signal Allocation + * + * There's no hardcoded mapping of specific events to signal bits. + * The meaning of a particular signal bit is defined by an agreement + * between the delivering entity and the receiving process. + * For instance, a terminal driver may be designed to deliver + * a signal bit called SIG_INT when it reads the CTRL-C sequence + * from the keyboard, and a process may react to it by quitting. + * + * \section sig_single SIG_SINGLE + * + * The SIG_SINGLE bit is reserved as a convenient shortcut in those + * simple scenarios where a process needs to wait on just one event + * synchronously. By using SIG_SINGLE, there's no need to allocate + * a specific signal from the free pool. The constraints for safely + * accessing SIG_SINGLE are: + * - The process MUST sig_wait() exclusively on SIG_SINGLE + * - SIG_SIGNAL MUST NOT be left pending after use (sig_wait() will reset + * it automatically) + * - Do not sleep between starting the asynchronous task that will fire + * SIG_SINGLE, and the call to sig_wait(). + * - Do not call system functions that may implicitly sleep, such as + * timer_delayTicks(). + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#include "signal.h" + +#include "cfg/cfg_timer.h" +#include +#include + +#include +#include +#include + + +#if CONFIG_KERN_SIGNALS + +// Check config dependencies +CONFIG_DEPEND(CONFIG_KERN_SIGNALS, CONFIG_KERN); + +/** + * Check if any of the signals in \a sigs has occurred and clear them. + * + * \return the signals that have occurred. + */ +sigmask_t sig_check(sigmask_t sigs) +{ + sigmask_t result; + cpu_flags_t flags; + + IRQ_SAVE_DISABLE(flags); + result = current_process->sig_recv & sigs; + current_process->sig_recv &= ~sigs; + IRQ_RESTORE(flags); + + return result; +} + + +/** + * Sleep until any of the signals in \a sigs occurs. + * \return the signal(s) that have awoken the process. + */ +sigmask_t sig_wait(sigmask_t sigs) +{ + sigmask_t result; + + /* Sleeping with IRQs disabled or preemption forbidden is illegal */ + IRQ_ASSERT_ENABLED(); + ASSERT(proc_preemptAllowed()); + + /* + * This is subtle: there's a race condition where a concurrent process + * or an interrupt may call sig_send()/sig_post() to set a bit in + * Process.sig_recv just after we have checked for it, but before we've + * set Process.sig_wait to let them know we want to be awaken. + * + * In this case, we'd deadlock with the signal bit already set and the + * process never being reinserted into the ready list. + */ + IRQ_DISABLE; + + /* Loop until we get at least one of the signals */ + while (!(result = current_process->sig_recv & sigs)) + { + /* + * Tell "them" that we want to be awaken when any of these + * signals arrives. + */ + current_process->sig_wait = sigs; + + /* Go to sleep and proc_switch() to another process. */ + proc_switch(); + /* + * When we come back here, the wait mask must have been + * cleared by someone through sig_send()/sig_post(), and at + * least one of the signals we were expecting must have been + * delivered to us. + */ + ASSERT(!current_process->sig_wait); + ASSERT(current_process->sig_recv & sigs); + } + + /* Signals found: clear them and return */ + current_process->sig_recv &= ~sigs; + + IRQ_ENABLE; + return result; +} + +#if CONFIG_TIMER_EVENTS + +#include +/** + * Sleep until any of the signals in \a sigs or \a timeout ticks elapse. + * If the timeout elapse a SIG_TIMEOUT is added to the received signal(s). + * \return the signal(s) that have awoken the process. + * \note Caller must check return value to check which signal awoke the process. + */ +sigmask_t sig_waitTimeout(sigmask_t sigs, ticks_t timeout) +{ + Timer t; + sigmask_t res; + cpu_flags_t flags; + + ASSERT(!sig_check(SIG_TIMEOUT)); + ASSERT(!(sigs & SIG_TIMEOUT)); + /* IRQ are needed to run timer */ + ASSERT(IRQ_ENABLED()); + + timer_set_event_signal(&t, proc_current(), SIG_TIMEOUT); + timer_setDelay(&t, timeout); + timer_add(&t); + res = sig_wait(SIG_TIMEOUT | sigs); + + IRQ_SAVE_DISABLE(flags); + /* Remove timer if sigs occur before timer signal */ + if (!(res & SIG_TIMEOUT) && !sig_check(SIG_TIMEOUT)) + timer_abort(&t); + IRQ_RESTORE(flags); + return res; +} + +#endif // CONFIG_TIMER_EVENTS + +INLINE void __sig_signal(Process *proc, sigmask_t sigs, bool wakeup) +{ + cpu_flags_t flags; + + IRQ_SAVE_DISABLE(flags); + + /* Set the signals */ + proc->sig_recv |= sigs; + + /* Check if process needs to be awoken */ + if (proc->sig_recv & proc->sig_wait) + { + ASSERT(proc != current_process); + + proc->sig_wait = 0; + if (wakeup) + proc_wakeup(proc); + else + SCHED_ENQUEUE_HEAD(proc); + } + IRQ_RESTORE(flags); +} + +/** + * Send the signals \a sigs to the process \a proc and immeditaly dispatch it + * for execution. + * + * The process will be awoken if it was waiting for any of them and immediately + * dispatched for execution. + * + * \note This function can't be called from IRQ context, use sig_post() + * instead. + */ +void sig_send(Process *proc, sigmask_t sigs) +{ + ASSERT_USER_CONTEXT(); + IRQ_ASSERT_ENABLED(); + ASSERT(proc_preemptAllowed()); + + __sig_signal(proc, sigs, true); +} + +/** + * Send the signals \a sigs to the process \a proc. + * The process will be awoken if it was waiting for any of them. + * + * \note This call is interrupt safe. + */ +void sig_post(Process *proc, sigmask_t sigs) +{ + __sig_signal(proc, sigs, false); +} + +#endif /* CONFIG_KERN_SIGNALS */ diff --git a/2.5/bertos/kern/signal.h b/2.5/bertos/kern/signal.h new file mode 100644 index 00000000..bef44a9e --- /dev/null +++ b/2.5/bertos/kern/signal.h @@ -0,0 +1,87 @@ +/** + * \file + * + * + * \brief Signal module for IPC. + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * $WIZ$ module_name = "signal" + * $WIZ$ module_depends = "kernel", "timer" + * $WIZ$ module_configuration = "bertos/cfg/cfg_signal.h" + */ + +#ifndef KERN_SIGNAL_H +#define KERN_SIGNAL_H + +#include +#include // BV() + +/* Fwd decl */ +struct Process; + +/* Inter-process Communication services */ +sigmask_t sig_check(sigmask_t sigs); +void sig_send(struct Process *proc, sigmask_t sig); +void sig_post(struct Process *proc, sigmask_t sig); +/* + * XXX: this is provided for backword compatibility, consider to make this + * deprecated for the future. + */ +INLINE void sig_signal(struct Process *proc, sigmask_t sig) +{ + sig_post(proc, sig); +} +sigmask_t sig_wait(sigmask_t sigs); +sigmask_t sig_waitTimeout(sigmask_t sigs, ticks_t timeout); + +int signal_testRun(void); +int signal_testSetup(void); +int signal_testTearDown(void); + +/** + * \name Signal definitions + * \{ + */ +#define SIG_USER0 BV(0) /**< Free for user usage */ +#define SIG_USER1 BV(1) /**< Free for user usage */ +#define SIG_USER2 BV(2) /**< Free for user usage */ +#define SIG_USER3 BV(3) /**< Free for user usage */ +#define SIG_TIMEOUT BV(4) /**< Reserved for timeout use */ +#define SIG_SYSTEM5 BV(5) /**< Reserved for system use */ +#define SIG_SYSTEM6 BV(6) /**< Reserved for system use */ +#define SIG_SINGLE BV(7) /**< Used to wait for a single event */ +/*\}*/ + +#endif /* KERN_SIGNAL_H */ diff --git a/2.5/bertos/kern/signal_test.c b/2.5/bertos/kern/signal_test.c new file mode 100644 index 00000000..3b5ff1cb --- /dev/null +++ b/2.5/bertos/kern/signal_test.c @@ -0,0 +1,190 @@ +/** + * \file + * + * + * \brief Signals test. + * + * \version $Id$ + * + * \author Daniele Basile + * + * $test$: cp bertos/cfg/cfg_proc.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN" >> $cfgdir/cfg_proc.h + * $test$: echo "#define CONFIG_KERN 1" >> $cfgdir/cfg_proc.h + * $test$: cp bertos/cfg/cfg_signal.h $cfgdir/ + * $test$: echo "#undef CONFIG_KERN_SIGNALS" >> $cfgdir/cfg_signal.h + * $test$: echo "#define CONFIG_KERN_SIGNALS 1" >> $cfgdir/cfg_signal.h + */ + +#include "cfg/cfg_timer.h" +#include +#include + +#include +#include +#include + +#include + +// Set mask with all signal that we want to test. +int test_signal[] = { + SIG_USER0, + SIG_USER1, + SIG_USER2, + SIG_USER3, + SIG_TIMEOUT, + SIG_SYSTEM5, + SIG_SYSTEM6, + SIG_SINGLE +}; + +// Current signal to send +int count = 0; + +sigmask_t sig_to_master; +sigmask_t sig_to_slave; + +/* + * These macros generate the code needed to create the test process functions. + */ +#define PROC_TEST_SLAVE(index, signal) \ +static void proc_signalTest##index(void) \ +{ \ + kputs("> Slave [" #index "]: Wait signal [" #signal "]\n"); \ + sig_wait(signal); \ + kputs("> Slave [" #index "]: send signal [" #signal "]\n"); \ + sig_send(proc_currentUserData(), signal); \ +} + +#define MAIN_CHECK_SIGNAL(index, slave) \ + do { \ + kprintf("> Main: send signal [%d]\n", test_signal[index]); \ + sig_send(slave, test_signal[index]); \ + kprintf("> Main: wait signal [%d]\n", test_signal[index]); \ + sig_wait(test_signal[index]); \ + count++; \ + } while(0) \ + +#if CONFIG_KERN_HEAP + +#define PROC_TEST_SLAVE_INIT(index, master_process) proc_new(proc_signalTest##index, master_process, KERN_MINSTACKSIZE * 2, NULL) + +#else + +#define PROC_TEST_SLAVE_STACK(index) PROC_DEFINE_STACK(proc_signal_test##index##_stack, KERN_MINSTACKSIZE * 2); +#define PROC_TEST_SLAVE_INIT(index, master_process) proc_new(proc_signalTest##index, master_process, sizeof(proc_signal_test##index##_stack), proc_signal_test##index##_stack) + +PROC_TEST_SLAVE_STACK(0) +PROC_TEST_SLAVE_STACK(1) +PROC_TEST_SLAVE_STACK(2) +PROC_TEST_SLAVE_STACK(3) +PROC_TEST_SLAVE_STACK(4) +PROC_TEST_SLAVE_STACK(5) +PROC_TEST_SLAVE_STACK(6) +PROC_TEST_SLAVE_STACK(7) + +#endif + +// Generate the code for signal test. +PROC_TEST_SLAVE(0, SIG_USER0) +PROC_TEST_SLAVE(1, SIG_USER1) +PROC_TEST_SLAVE(2, SIG_USER2) +PROC_TEST_SLAVE(3, SIG_USER3) +PROC_TEST_SLAVE(4, SIG_TIMEOUT) +PROC_TEST_SLAVE(5, SIG_SYSTEM5) +PROC_TEST_SLAVE(6, SIG_SYSTEM6) +PROC_TEST_SLAVE(7, SIG_SINGLE) + +/** + * Run signal test + */ +int signal_testRun(void) +{ + struct Process *main_process = proc_current(); + struct Process *slave_0; + struct Process *slave_1; + struct Process *slave_2; + struct Process *slave_3; + struct Process *slave_4; + struct Process *slave_5; + struct Process *slave_6; + struct Process *slave_7; + + kprintf("Run Signal test..\n"); + slave_0 = PROC_TEST_SLAVE_INIT(0, main_process); + slave_1 = PROC_TEST_SLAVE_INIT(1, main_process); + slave_2 = PROC_TEST_SLAVE_INIT(2, main_process); + slave_3 = PROC_TEST_SLAVE_INIT(3, main_process); + slave_4 = PROC_TEST_SLAVE_INIT(4, main_process); + slave_5 = PROC_TEST_SLAVE_INIT(5, main_process); + slave_6 = PROC_TEST_SLAVE_INIT(6, main_process); + slave_7 = PROC_TEST_SLAVE_INIT(7, main_process); + + MAIN_CHECK_SIGNAL(0, slave_0); + MAIN_CHECK_SIGNAL(1, slave_1); + MAIN_CHECK_SIGNAL(2, slave_2); + MAIN_CHECK_SIGNAL(3, slave_3); + MAIN_CHECK_SIGNAL(4, slave_4); + MAIN_CHECK_SIGNAL(5, slave_5); + MAIN_CHECK_SIGNAL(6, slave_6); + MAIN_CHECK_SIGNAL(7, slave_7); + + if(count == countof(test_signal)) + { + kprintf("Signal test finished..ok!\n"); + return 0; + } + + kprintf("Signal test finished..fail!\n"); + return -1; +} + +int signal_testSetup(void) +{ + kdbg_init(); + + kprintf("Init Timer.."); + timer_init(); + kprintf("Done.\n"); + + kprintf("Init Process.."); + proc_init(); + kprintf("Done.\n"); + return 0; +} + +int signal_testTearDown(void) +{ + kputs("TearDown Signal test.\n"); + return 0; +} + +TEST_MAIN(signal); diff --git a/2.5/bertos/mware/blanker.c b/2.5/bertos/mware/blanker.c new file mode 100644 index 00000000..4168504c --- /dev/null +++ b/2.5/bertos/mware/blanker.c @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Display Blanker (implementation). + * + * \version $Id$ + * + * \author Bernie Innocenti + */ + +#include "blanker.h" +#include "hw/hw_blanker.h" + +#include +#include + +/* Time without input events before starting blanker */ +#define BLK_BLANKTIMEOUT (15 * 1000) /* ms */ + + +#warning FIXME:Revise me! + +/** Keyboard event handler to listen for key presses in blanker. */ +static KbdHandler blk_KbdHandler; + +/** Time since last key event. */ +static ticks_t blk_lastevent; + +/** Display blanking function is enabled. */ +static bool blk_enabled; + +/** Display blanker is engaged right now. */ +static bool blk_active; + + +static bool blk_on(void) +{ + if (!blk_active) + { + blk_active = true; + BLK_LCDOFF; + } + return true; +} + + +static void blk_off(void) +{ + if (blk_active) + { + blk_active = false; + BLK_LCDON; + } +} + + +void blk_retrigger(void) +{ + blk_lastevent = timer_clock(); + blk_off(); +} + +#if 0 +/** + * Matrix-like screen saver effect + */ +static void blk_hack(void) +{ + static signed char blk_colstart[CONFIG_LCD_COLS]; + UBYTE row, col; + + + if (rand()%3 == 0) + { + /* Modify one column */ + col = rand() % CONFIG_LCD_COLS; + blk_colstart[col] += rand() % 12 - 5; + } + + for (col = 0; col < CONFIG_LCD_COLS; ++col) + { + if (blk_colstart[col] > 0) + { + --blk_colstart[col]; + + /* Scroll down */ + for(row = CONFIG_LCD_ROWS-1; row; --row) + { + lcd_SetAddr(blk_layer, LCD_POS(col,row)); + lcd_PutChar(blk_layer->Buf[LCD_POS(col,row-1)], blk_layer); + } + + /* Add new kanji */ + lcd_SetAddr(blk_layer, LCD_POS(col,0)); + lcd_PutChar((char)(rand() % 127 + 128), blk_layer); + } + else if (blk_colstart[col] < 0) + { + ++blk_colstart[col]; + + /* Clear tail */ + for(row = 0; row < CONFIG_LCD_ROWS; ++row) + { + if (blk_layer->Buf[LCD_POS(col,row)] != ' ') + { + lcd_SetAddr(blk_layer, LCD_POS(col,row)); + lcd_PutChar(' ', blk_layer); + break; + } + } + } + } +} +#endif + + +static keymask_t blk_handlerFunc(keymask_t key) +{ + /* key used to turn off blanker */ + static keymask_t offkey; + + ticks_t now = timer_clock(); + + /* If key pressed */ + if (key != 0) + { + blk_lastevent = now; + if (blk_active) + { + blk_off(); + + /* remember and eat key event */ + offkey = key; + key = 0; + } + else if (key == offkey) + { + /* keep eating the key until released */ + key = 0; + } + + /* pass key through */ + return key; + } + + /* reset off key */ + offkey = 0; + + /* Blank timeout reached? */ + if (now - blk_lastevent > ms_to_ticks(BLK_BLANKTIMEOUT)) + { + /* Enable blanker unless already done */ + if (!blk_active && !blk_on()) + return 0; + +#if 0 + /* Do some nice visual effect */ + blk_hack(); +#endif /* _DEBUG */ + } + + return 0; +} + + +void blk_enable(void) +{ + if (!blk_enabled) + { + blk_active = false; + blk_lastevent = timer_clock(); + + /* Add display blanker handler */ + blk_KbdHandler.hook = blk_handlerFunc; + blk_KbdHandler.pri = 100; /* high priority */ + blk_KbdHandler.flags = KHF_RAWKEYS; + kbd_addHandler(&blk_KbdHandler); + + blk_enabled = true; + } +} + + +void blk_disable(void) +{ + if (blk_enabled) + { + kbd_remHandler(&blk_KbdHandler); + blk_off(); + blk_enabled = false; + } +} + diff --git a/2.5/bertos/mware/blanker.h b/2.5/bertos/mware/blanker.h new file mode 100644 index 00000000..9af09189 --- /dev/null +++ b/2.5/bertos/mware/blanker.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Display Blanker (implementation). + * + * \version $Id$ + * + * \author Bernie Innocenti + */ +#ifndef MWARE_BLANKER_H +#define MWARE_BLANKER_H + +extern void blk_enable(void); +extern void blk_disable(void); +extern void blk_retrigger(void); + +#endif /* MWARE_BLANKER_H */ diff --git a/2.5/bertos/mware/byteorder.h b/2.5/bertos/mware/byteorder.h new file mode 100644 index 00000000..2d5bede6 --- /dev/null +++ b/2.5/bertos/mware/byteorder.h @@ -0,0 +1,2 @@ +#warning This header is OBSOLETE +#include diff --git a/2.5/bertos/mware/cmd_hunk.h b/2.5/bertos/mware/cmd_hunk.h new file mode 100644 index 00000000..878e93bb --- /dev/null +++ b/2.5/bertos/mware/cmd_hunk.h @@ -0,0 +1,147 @@ +/** + * \file + * + * + * \brief Preprocessor magic to create hunks for the commands executed from the parser + * + * This module permits to create hunks for the functions that must be executed through + * RPC commands. For instance, given this code: + * + * \code + * ResultCode cmd_add(long a, long b, long* result); + * DECLARE_COMMAND_HUNK(add, (long)(long)(NIL), (long)(NIL)); + * // ^ parameters ^ return values + * \endcode + * + * The macro is expanded to: + * + * \code + * ResultCode cmd_add_hunk(params argv[], params results[]) + * { + * return cmd_add(argv[0].l, argv[1].l, &results[0].l); + * } + * + * const struct CmdTemplate cmd_add_template = + * { + * "add", "dd", "d", cmd_add_hunk + * }; + * \endcode + * + * which is all the boilerplate needed to make the function ready for the RPC. + * The implementation uses the Boost Preprocessor Library (part of the Boost + * library, available at http://www.boost.org). The version we developed the + * code with is 1.31. + * + * \version $Id$ + * + * \author Giovanni Bajo + * + */ + +#ifndef CMD_HUNK_H +#define CMD_HUNK_H + +#include "parser.h" + +// Bring in the Boost Preprocess Library +#include + +#define HUNK_INDEX_FOR_NIL 0 +#define HUNK_INDEX_FOR_string 1 +#define HUNK_INDEX_FOR_long 2 +#define HUNK_ARRAY_LETTERS (3, (NIL, s, l)) +#define HUNK_ARRAY_STRINGS (3, ("", "s", "d")) + +// Transform int->l, float->f, etc. +#define HUNK_TYPE_LETTER(s, _, type) \ + BOOST_PP_CAT(HUNK_INDEX_FOR_, type) \ + /**/ + +#define HUNK_TRANSFORMER(_, array, elem) \ + BOOST_PP_ARRAY_ELEM(elem, array) \ + /**/ + +#define HUNK_SEQ_TRANS_ARRAY(seq, array) \ + BOOST_PP_SEQ_TRANSFORM(HUNK_TRANSFORMER, array, seq) \ + /**/ + +#define HUNK_PARAM(_, n, seq) \ + args_results[n+1]. BOOST_PP_SEQ_ELEM(n, seq) \ + /**/ + +#define HUNK_RESULT(_, n, seq) \ + &args_results[n]. BOOST_PP_SEQ_ELEM(n, seq) \ + /**/ + +#define HUNK_IDENTITY(_, dummy, x) x +#define CMD_HUNK_TEMPLATE(func) cmd_##func###_template + +#define DECLARE_CMD_HUNK_2(func, name, param_types, result_types, flags) \ + static ResultCode cmd_##name##_hunk(parms args_results[]) \ + { \ + return cmd_##func( \ + BOOST_PP_ENUM(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(param_types)), HUNK_PARAM, HUNK_SEQ_TRANS_ARRAY(param_types, HUNK_ARRAY_LETTERS)) \ + BOOST_PP_COMMA_IF(BOOST_PP_AND(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(param_types)), BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(result_types)))) \ + BOOST_PP_ENUM(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(result_types)), HUNK_RESULT, HUNK_SEQ_TRANS_ARRAY(result_types, HUNK_ARRAY_LETTERS)) \ + ); \ + } \ + const struct CmdTemplate CMD_HUNK_TEMPLATE(name) = { \ + #name, \ + BOOST_PP_SEQ_FOR_EACH(HUNK_IDENTITY, _, HUNK_SEQ_TRANS_ARRAY(param_types, HUNK_ARRAY_STRINGS)), \ + BOOST_PP_SEQ_FOR_EACH(HUNK_IDENTITY, _, HUNK_SEQ_TRANS_ARRAY(result_types, HUNK_ARRAY_STRINGS)), \ + cmd_##name##_hunk, \ + flags \ + } \ + /**/ + +#define DECLARE_CMD_HUNK(func, param_types, result_types) \ + DECLARE_CMD_HUNK_2(func, func, \ + BOOST_PP_SEQ_TRANSFORM(HUNK_TYPE_LETTER, _, param_types), \ + BOOST_PP_SEQ_TRANSFORM(HUNK_TYPE_LETTER, _, result_types), \ + 0) \ + /**/ + +#define DECLARE_CMD_HUNK_NAME(func, name, param_types, result_types) \ + DECLARE_CMD_HUNK_2(func, name, \ + BOOST_PP_SEQ_TRANSFORM(HUNK_TYPE_LETTER, _, param_types), \ + BOOST_PP_SEQ_TRANSFORM(HUNK_TYPE_LETTER, _, result_types), \ + 0) \ + /**/ + +#define DECLARE_CMD_HUNK_FLAGS(func, param_types, result_types, flags) \ + DECLARE_CMD_HUNK_2(func, func, \ + BOOST_PP_SEQ_TRANSFORM(HUNK_TYPE_LETTER, _, param_types), \ + BOOST_PP_SEQ_TRANSFORM(HUNK_TYPE_LETTER, _, result_types), \ + flags) \ + /**/ + +#endif diff --git a/2.5/bertos/mware/event.c b/2.5/bertos/mware/event.c new file mode 100644 index 00000000..c596e12f --- /dev/null +++ b/2.5/bertos/mware/event.c @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Events handling implementation + * + * \version $Id$ + * + * \author Giovanni Bajo + */ + + +#include "event.h" + +void event_hook_ignore(UNUSED_ARG(Event *, e)) +{ +} + +#if defined(CONFIG_KERN_SIGNALS) && CONFIG_KERN_SIGNALS +void event_hook_signal(Event *e) +{ + sig_post((e)->Ev.Sig.sig_proc, (e)->Ev.Sig.sig_bit); +} +#endif + +void event_hook_softint(Event *e) +{ + e->Ev.Int.func(e->Ev.Int.user_data); +} diff --git a/2.5/bertos/mware/event.h b/2.5/bertos/mware/event.h new file mode 100644 index 00000000..74a46793 --- /dev/null +++ b/2.5/bertos/mware/event.h @@ -0,0 +1,137 @@ +/** + * \file + * + * + * \brief Events handling + * + * This module implements a common system for executing + * a user defined action calling a hook function. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef KERN_EVENT_H +#define KERN_EVENT_H + +#include +#include "cfg/cfg_proc.h" +#include "cfg/cfg_signal.h" + +#if CONFIG_KERN + #if defined(CONFIG_KERN_SIGNALS) && CONFIG_KERN_SIGNALS + #include + #endif + + /* Forward decl */ + struct Process; +#endif + + +/// User defined callback type +typedef void (*Hook)(void *); + +typedef struct Event +{ + void (*action)(struct Event *); + union + { +#if defined(CONFIG_KERN_SIGNALS) && CONFIG_KERN_SIGNALS + struct + { + struct Process *sig_proc; /* Process to be signalled */ + sigbit_t sig_bit; /* Signal to send */ + } Sig; +#endif + struct + { + Hook func; /* Pointer to softint hook */ + void *user_data; /* Data to be passed back to user hook */ + } Int; + } Ev; +} Event; + +void event_hook_ignore(Event *event); +void event_hook_signal(Event *event); +void event_hook_softint(Event *event); + +/** Initialize the event \a e as a no-op */ +#define event_initNone(e) \ + ((e)->action = event_hook_ignore) + +/** Same as event_initNone(), but returns the initialized event */ +INLINE Event event_createNone(void); +INLINE Event event_createNone(void) +{ + Event e; + e.action = event_hook_ignore; + return e; +} + +/** Initialize the event \a e with a software interrupt (call function \a f, with parameter \a u) */ +#define event_initSoftint(e,f,u) \ + ((e)->action = event_hook_softint,(e)->Ev.Int.func = (f), (e)->Ev.Int.user_data = (u)) + +/** Same as event_initSoftint(), but returns the initialized event */ +INLINE Event event_createSoftint(Hook func, void *user_data) +{ + Event e; + e.action = event_hook_softint; + e.Ev.Int.func = func; + e.Ev.Int.user_data = user_data; + return e; +} + +#if defined(CONFIG_KERN_SIGNALS) && CONFIG_KERN_SIGNALS + +/** Initialize the event \a e with a signal (send signal \a s to process \a p) */ +#define event_initSignal(e,p,s) \ + ((e)->action = event_hook_signal,(e)->Ev.Sig.sig_proc = (p), (e)->Ev.Sig.sig_bit = (s)) + +/** Same as event_initSignal(), but returns the initialized event */ +INLINE Event event_createSignal(struct Process *proc, sigbit_t bit) +{ + Event e; + e.action = event_hook_signal; + e.Ev.Sig.sig_proc = proc; + e.Ev.Sig.sig_bit = bit; + return e; +} + +#endif + +/** Trigger an event */ +INLINE void event_do(struct Event *e) +{ + e->action(e); +} + +#endif /* KERN_EVENT_H */ diff --git a/2.5/bertos/mware/except.h b/2.5/bertos/mware/except.h new file mode 100644 index 00000000..c600828d --- /dev/null +++ b/2.5/bertos/mware/except.h @@ -0,0 +1,125 @@ +/** + * \file + * + * + * \brief C++-like structured exception handling for C programs + * + * \version $Id$ + * \author Bernie Innocenti + */ +#ifndef MWARE_EXCEPT_H +#define MWARE_EXCEPT_H + +#include + +#include + +#define EXCEPT_CONTEXTS 8 + +/** + * A stack of jump buffers used to record try sites + * so they can be reached from throw sites. + * + * The stack contains return points for each nested + * context. jmp_buf's are pushed into the stack at + * try points and popped out when the try block ends + * normally or when an exception is thrown. + */ +extern jmp_buf except_stack[EXCEPT_CONTEXTS]; +extern int except_top; + +#define PUSH_EXCEPT (ASSERT(except_top < EXCEPT_CONTEXTS), setjmp(except_stack[except_top++])) +#define POP_EXCEPT (ASSERT(except_top > 0), --except_top) +#define DO_EXCEPT (ASSERT(except_top > 0), longjmp(except_stack[--except_top], true)) + +/** + * Jump buffer to use when throwing an exception or aborting an operation + * + * User code can throw exceptions like this: + * + * \code + * void a_function_throwing_exceptions(void) + * { + * if (some_error_condition) + * THROW; + * } + * \endcode + * + * Catching exceptions (brackets are optional): + * + * \code + * EXCEPT_DEFINE; + * + * void a_function_catching_an_exception(void) + * { + * TRY + * { + * printf("Entered try block\n"); + * a_function_throwing_exceptions(); + * printf("Survived execution of critical code\n"); + * } + * CATCH + * { + * printf("Exception caught!\n"); + * } + * CATCH_END + * } + * \endcode + * + * Simple syntax when you don't need to do anything when catching an excaption: + * + * \code + * TRY + * printf("Entered try block\n"); + * a_function_throwing_exceptions(); + * printf("Survived execution of critical code\n"); + * TRY_END + * \endcode + * + * You also need to declare the exception stack once in + * your global declarations: + * \code + * EXCEPT_DEFINE; + * \endcode + */ +#define TRY if (PUSH_EXCEPT) { { +#define TRY_END } POP_EXCEPT; } +#define CATCH } POP_EXCEPT; } else { +#define CATCH_END } +#define THROW DO_EXCEPT + + +#define EXCEPT_DEFINE \ + jmp_buf except_stack[EXCEPT_CONTEXTS]; \ + int except_top; + +#endif /* MWARE_EXCEPT_H */ diff --git a/2.5/bertos/mware/formatwr.c b/2.5/bertos/mware/formatwr.c new file mode 100644 index 00000000..7293c4dc --- /dev/null +++ b/2.5/bertos/mware/formatwr.c @@ -0,0 +1,979 @@ +/** + * \file + * + * + * \version $Id$ + * + * \brief Basic "printf", "sprintf" and "fprintf" formatter. + * + * This module is 100% reentrant and can be adapted to user-defined routines + * that needs formatters with special properties like different output + * channels or new format specifiers. + * + * To reduce size in applications not using real numbers or long integers + * the formatter may be compiled to exclude certain parts. This is + * controlled by giving a -D option a compilation time: + * + * \code + * -D CONFIG_PRINTF=PRINTF_FULL Full ANSI printf formatter, with some C99 extensions + * -D CONFIG_PRINTF=PRINTF_NOFLOAT Exclude support for floats + * -D CONFIG_PRINTF=PRINTF_REDUCED Simplified formatter (see below) + * -D CONFIG_PRINTF=PRINTF_NOMODIFIERS Exclude "l", "z" and "h" modifiers in reduced version + * -D CONFIG_PRINTF=PRINTF_DISABLED No formatter at all + * \endcode + * + * Code size on AVR4 with GCC 3.4.1 (-O2): + * \li PRINTF_FULL 2912byte (0xB60) + * \li PRINTF_NOFLOAT 1684byte (0x694) + * \li PRINTF_REDUCED 924byte (0x39C) + * \li PRINTF_NOMODIFIERS 416byte (0x1A0) + * + * Code/data size in words on DSP56K with CodeWarrior 6.0: + * \li PRINTF_FULL 1493/45 + * \li PRINTF_NOFLOAT 795/45 + * \li PRINTF_REDUCED 482/0 + * \li PRINTF_NOMODIFIERS 301/0 + * + * The reduced version of formatter is suitable when program size is critical + * rather than formatting power. This routine uses less than 20 bytes of + * stack space which makes it practical even in systems with less than 256 + * bytes of user RAM. + * + * The only formatting specifiers supported by the reduced formatter are: + * \code + * %% %c %s %d %o %x %X and %hd %ho %hx %hX %ld %lo %lx %lX + * \endcode + * + * It means that real variables are not supported as well as field + * width and precision arguments. + */ + + +#include "formatwr.h" + +#include "cfg/cfg_formatwr.h" /* CONFIG_ macros */ +#include /* ASSERT */ + +#include +#include + +#ifndef CONFIG_PRINTF_N_FORMATTER + /** Disable the arcane %n formatter. */ + #define CONFIG_PRINTF_N_FORMATTER 0 +#endif + +#ifndef CONFIG_PRINTF_OCTAL_FORMATTER + /** Disable the %o formatter. */ + #define CONFIG_PRINTF_OCTAL_FORMATTER 0 +#endif + +/* True if we must keep a count of the number of characters we print. */ +#define CONFIG_PRINTF_COUNT_CHARS (CONFIG_PRINTF_RETURN_COUNT || CONFIG_PRINTF_N_FORMATTER) + +#if CONFIG_PRINTF + +#if CONFIG_PRINTF > PRINTF_NOFLOAT + #include + + /* Maximum precision for floating point values */ + typedef long double max_float_t; + + #if CONFIG_FRMWRI_BUFSIZE + #define FRMWRI_BUFSIZE CONFIG_FRMWRI_BUFSIZE + #else + /* Conservative estimate. Max float is 3.40282e+038, so %f (but not %e or %g) must have + * space for: sign + all 38 digits + '.' + 6 decimal digits (default) + * Use a high value to avoid unexpected buffer overflows. + */ + #define FRMWRI_BUFSIZE 134 + #endif +#else + #if CONFIG_FRMWRI_BUFSIZE + #define FRMWRI_BUFSIZE CONFIG_FRMWRI_BUFSIZE + #else + /* + * Conservative estimate. Should be (probably) 12 (which is the size necessary + * to represent (2^32-1) in octal plus the sign bit. + */ + #define FRMWRI_BUFSIZE 16 + #endif +#endif + +/* Probably useful for fancy microcontrollers such as the PIC, nobody knows. */ +#ifndef MEM_ATTRIBUTE +#define MEM_ATTRIBUTE +#endif + +#if CONFIG_PRINTF > PRINTF_NOMODIFIERS + #define IS_SHORT (h_modifier || (sizeof(int) == 2 && !l_modifier)) +#else + #define IS_SHORT (sizeof(int) == 2) +#endif /* CONFIG_PRINTF > PRINTF_NOMODIFIERS */ + + +#if CONFIG_PRINTF > PRINTF_NOFLOAT + +static char *float_conversion(MEM_ATTRIBUTE max_float_t value, + MEM_ATTRIBUTE short nr_of_digits, + MEM_ATTRIBUTE char *buf, + MEM_ATTRIBUTE char format_flag, + MEM_ATTRIBUTE char g_flag, + MEM_ATTRIBUTE bool alternate_flag) +{ + MEM_ATTRIBUTE char *cp; + MEM_ATTRIBUTE char *buf_pointer; + MEM_ATTRIBUTE short n, i, dec_point_pos, integral_10_log; + + buf_pointer = buf; + integral_10_log = 0; + + if (value >= 1) + { + while (value >= 1e11) /* To speed up things a bit */ + { + value /= 1e10; + integral_10_log += 10; + } + while (value >= 10) + { + value /= 10; + integral_10_log++; + } + } + else if (value) /* Not just 0.0 */ + { + while (value <= 1e-10) /* To speed up things a bit */ + { + value *= 1e10; + integral_10_log -= 10; + } + while (value < 1) + { + value *= 10; + integral_10_log--; + } + } + if (g_flag) + { + if (integral_10_log < nr_of_digits && integral_10_log >= -4) + { + format_flag = 0; + nr_of_digits -= integral_10_log; + } + nr_of_digits--; + if (alternate_flag) + /* %#G - No removal of trailing zeros */ + g_flag = 0; + else + /* %G - Removal of trailing zeros */ + alternate_flag = true; + } + + /* %e or %E */ + if (format_flag) + { + dec_point_pos = 0; + } + else + { + /* Less than one... */ + if (integral_10_log < 0) + { + *buf_pointer++ = '0'; + if ((n = nr_of_digits) || alternate_flag) + *buf_pointer++ = '.'; + i = 0; + while (--i > integral_10_log && nr_of_digits) + { + *buf_pointer++ = '0'; + nr_of_digits--; + } + if (integral_10_log < (-n - 1)) + /* Nothing more to do */ + goto CLEAN_UP; + dec_point_pos = 1; + } + else + { + dec_point_pos = - integral_10_log; + } + } + + i = dec_point_pos; + while (i <= nr_of_digits ) + { + value -= (max_float_t)(n = (short)value); /* n=Digit value=Remainder */ + value *= 10; /* Prepare for next shot */ + *buf_pointer++ = n + '0'; + if ( ! i++ && (nr_of_digits || alternate_flag)) + *buf_pointer++ = '.'; + } + + /* Rounding possible */ + if (value >= 5) + { + n = 1; /* Carry */ + cp = buf_pointer - 1; + do + { + if (*cp != '.') + { + if ( (*cp += n) == ('9' + 1) ) + { + *cp = '0'; + n = 1; + } + else + n = 0; + } + } while (cp-- > buf); + if (n) + { + /* %e or %E */ + if (format_flag) + { + cp = buf_pointer; + while (cp > buf) + { + if (*(cp - 1) == '.') + { + *cp = *(cp - 2); + cp--; + } + else + *cp = *(cp - 1); + cp--; + } + integral_10_log++; + } + else + { + cp = ++buf_pointer; + while (cp > buf) + { + *cp = *(cp - 1); + cp--; + } + } + *buf = '1'; + } + } + +CLEAN_UP: + /* %G - Remove trailing zeros */ + if (g_flag) + { + while (*(buf_pointer - 1) == '0') + buf_pointer--; + if (*(buf_pointer - 1) == '.') + buf_pointer--; + } + + /* %e or %E */ + if (format_flag) + { + *buf_pointer++ = format_flag; + if (integral_10_log < 0) + { + *buf_pointer++ = '-'; + integral_10_log = -integral_10_log; + } + else + *buf_pointer++ = '+'; + n = 0; + buf_pointer +=10; + do + { + n++; + *buf_pointer++ = (integral_10_log % 10) + '0'; + integral_10_log /= 10; + } while ( integral_10_log || n < 2 ); + for ( i = n ; n > 0 ; n-- ) + *(buf_pointer - 11 - i + n) = *(buf_pointer - n); + buf_pointer -= 10; + } + return (buf_pointer); +} + +#endif /* CONFIG_PRINTF > PRINTF_NOFLOAT */ + +/** + * This routine forms the core and entry of the formatter. + * + * The conversion performed conforms to the ANSI specification for "printf". + */ +int +PGM_FUNC(_formatted_write)(const char * PGM_ATTR format, + void put_one_char(char, void *), + void *secret_pointer, + va_list ap) +{ +#if CONFIG_PRINTF > PRINTF_REDUCED + MEM_ATTRIBUTE static char bad_conversion[] = "???"; + MEM_ATTRIBUTE static char null_pointer[] = ""; + + MEM_ATTRIBUTE int precision; + MEM_ATTRIBUTE int n; +#if CONFIG_PRINTF_COUNT_CHARS + MEM_ATTRIBUTE int nr_of_chars; +#endif + MEM_ATTRIBUTE int field_width; + MEM_ATTRIBUTE char format_flag; + enum PLUS_SPACE_FLAGS { + PSF_NONE, PSF_PLUS, PSF_MINUS + }; + enum DIV_FACTOR { + DIV_DEC, DIV_HEX, +#if CONFIG_PRINTF_OCTAL_FORMATTER + DIV_OCT, +#endif + }; + MEM_ATTRIBUTE struct { + enum PLUS_SPACE_FLAGS plus_space_flag : 2; +#if CONFIG_PRINTF_OCTAL_FORMATTER + enum DIV_FACTOR div_factor : 2; +#else + enum DIV_FACTOR div_factor : 1; +#endif + bool left_adjust : 1; + bool l_L_modifier : 1; + bool h_modifier : 1; + bool alternate_flag : 1; + bool nonzero_value : 1; + bool zeropad : 1; +#if CPU_HARVARD + bool progmem : 1; +#endif + } flags; + MEM_ATTRIBUTE unsigned long ulong; + +#if CONFIG_PRINTF > PRINTF_NOFLOAT + MEM_ATTRIBUTE max_float_t fvalue; +#endif + + MEM_ATTRIBUTE char *buf_pointer; + MEM_ATTRIBUTE char *ptr; + MEM_ATTRIBUTE const char *hex; + MEM_ATTRIBUTE char buf[FRMWRI_BUFSIZE]; + +#if CONFIG_PRINTF_COUNT_CHARS + nr_of_chars = 0; +#endif + for (;;) /* Until full format string read */ + { + while ((format_flag = PGM_READ_CHAR(format++)) != '%') /* Until '%' or '\0' */ + { + if (!format_flag) +#if CONFIG_PRINTF_RETURN_COUNT + return (nr_of_chars); +#else + return 0; +#endif + put_one_char(format_flag, secret_pointer); +#if CONFIG_PRINTF_COUNT_CHARS + nr_of_chars++; +#endif + } + if (PGM_READ_CHAR(format) == '%') /* %% prints as % */ + { + format++; + put_one_char('%', secret_pointer); +#if CONFIG_PRINTF_COUNT_CHARS + nr_of_chars++; +#endif + continue; + } + + flags.left_adjust = false; + flags.alternate_flag = false; + flags.plus_space_flag = PSF_NONE; + flags.zeropad = false; +#if CPU_HARVARD + flags.progmem = false; +#endif + ptr = buf_pointer = &buf[0]; + hex = HEX_tab; + + /* check for leading '-', '+', ' ','#' or '0' flags */ + for (;;) + { + switch (PGM_READ_CHAR(format)) + { + case ' ': + if (flags.plus_space_flag) + goto NEXT_FLAG; + case '+': + flags.plus_space_flag = PSF_PLUS; + goto NEXT_FLAG; + case '-': + flags.left_adjust = true; + goto NEXT_FLAG; + case '#': + flags.alternate_flag = true; + goto NEXT_FLAG; + case '0': + flags.zeropad = true; + goto NEXT_FLAG; + } + break; +NEXT_FLAG: + format++; + } + + /* Optional field width (may be '*') */ + if (PGM_READ_CHAR(format) == '*') + { + field_width = va_arg(ap, int); + if (field_width < 0) + { + field_width = -field_width; + flags.left_adjust = true; + } + format++; + } + else + { + field_width = 0; + while (PGM_READ_CHAR(format) >= '0' && PGM_READ_CHAR(format) <= '9') + field_width = field_width * 10 + (PGM_READ_CHAR(format++) - '0'); + } + + if (flags.left_adjust) + flags.zeropad = false; + + /* Optional precision (or '*') */ + if (PGM_READ_CHAR(format) == '.') + { + if (PGM_READ_CHAR(++format) == '*') + { + precision = va_arg(ap, int); + format++; + } + else + { + precision = 0; + while (PGM_READ_CHAR(format) >= '0' && PGM_READ_CHAR(format) <= '9') + precision = precision * 10 + (PGM_READ_CHAR(format++) - '0'); + } + } + else + precision = -1; + + /* At this point, "left_adjust" is nonzero if there was + * a sign, "zeropad" is 1 if there was a leading zero + * and 0 otherwise, "field_width" and "precision" + * contain numbers corresponding to the digit strings + * before and after the decimal point, respectively, + * and "plus_space_flag" is either 0 (no flag) or + * contains a plus or space character. If there was no + * decimal point, "precision" will be -1. + */ + + flags.l_L_modifier = false; + flags.h_modifier = false; + + /* Optional 'l','L','z' or 'h' modifier? */ + switch (PGM_READ_CHAR(format)) + { + case 'l': + case 'L': + #if SIZEOF_SIZE_T == SIZEOF_LONG + case 'z': + flags.l_L_modifier = true; + #elif SIZEOF_SIZE_T == SIZEOF_INT + flags.l_L_modifier = true; + case 'z': + #endif + format++; + break; + + case 'h': + flags.h_modifier = true; + format++; + break; + + } + + /* + * At exit from the following switch, we will emit + * the characters starting at "buf_pointer" and + * ending at "ptr"-1 + */ + switch (format_flag = PGM_READ_CHAR(format++)) + { +#if CONFIG_PRINTF_N_FORMATTER + case 'n': + if (sizeof(short) != sizeof(int)) + { + if (sizeof(int) != sizeof(long)) + { + if (h_modifier) + *va_arg(ap, short *) = nr_of_chars; + else if (flags.l_L_modifier) + *va_arg(ap, long *) = nr_of_chars; + else + *va_arg(ap, int *) = nr_of_chars; + } + else + { + if (h_modifier) + *va_arg(ap, short *) = nr_of_chars; + else + *va_arg(ap, int *) = nr_of_chars; + } + } + else + { + if (flags.l_L_modifier) + *va_arg(ap, long *) = nr_of_chars; + else + *va_arg(ap, int *) = nr_of_chars; + } + continue; +#endif + case 'c': + buf[0] = va_arg(ap, int); + ptr++; + break; + + /* Custom formatter for strings in program memory. */ + case 'S': +#if CPU_HARVARD + flags.progmem = true; +#endif + /* Fall trough */ + + case 's': + if ( !(buf_pointer = va_arg(ap, char *)) ) + buf_pointer = null_pointer; + if (precision < 0) + precision = 10000; + + /* + * Move `ptr' to the last character of the + * string that will be actually printed. + */ + ptr = buf_pointer; +#if CPU_HARVARD + if (flags.progmem) + { + for (n=0; pgm_read_char(ptr) && n < precision; n++) + ++ptr; + } + else +#endif + for (n=0; *ptr && n < precision; n++) + ++ptr; + break; + +#if CONFIG_PRINTF_OCTAL_FORMATTER + case 'o': + if (flags.alternate_flag && !precision) + precision++; +#endif + case 'x': + hex = hex_tab; + case 'u': + case 'p': + case 'X': + if (format_flag == 'p') +#if defined(__AVR__) || defined(__I196__) /* 16bit pointers */ + ulong = (unsigned long)(unsigned short)va_arg(ap, char *); +#else /* 32bit pointers */ + ulong = (unsigned long)va_arg(ap, char *); +#endif /* 32bit pointers */ + else if (flags.l_L_modifier) + ulong = va_arg(ap, unsigned long); + else if (flags.h_modifier) + ulong = (unsigned long)(unsigned short)va_arg(ap, unsigned int); + else + ulong = va_arg(ap, unsigned int); + + flags.div_factor = +#if CONFIG_PRINTF_OCTAL_FORMATTER + (format_flag == 'o') ? DIV_OCT : +#endif + (format_flag == 'u') ? DIV_DEC : DIV_HEX; + flags.plus_space_flag = PSF_NONE; + goto INTEGRAL_CONVERSION; + + case 'd': + case 'i': + if (flags.l_L_modifier) + ulong = (unsigned long)(long)va_arg(ap, long); + else + ulong = (unsigned long)(long)va_arg(ap, int); + + /* Extract sign */ + if ((signed long)ulong < 0) + { + flags.plus_space_flag = PSF_MINUS; + ulong = (unsigned long)(-((signed long)ulong)); + } + + flags.div_factor = DIV_DEC; + + /* Now convert to digits */ +INTEGRAL_CONVERSION: + ptr = buf_pointer = &buf[FRMWRI_BUFSIZE - 1]; + flags.nonzero_value = (ulong != 0); + + /* No char if zero and zero precision */ + if (precision != 0 || flags.nonzero_value) + { + switch (flags.div_factor) + { + case DIV_DEC: + do + *--buf_pointer = hex[ulong % 10]; + while (ulong /= 10); + break; + + case DIV_HEX: + do + *--buf_pointer = hex[ulong % 16]; + while (ulong /= 16); + break; +#if CONFIG_PRINTF_OCTAL_FORMATTER + case DIV_OCT: + do + *--buf_pointer = hex[ulong % 8]; + while (ulong /= 8); + break; +#endif + } + } + + /* "precision" takes precedence */ + if (precision < 0) + if (flags.zeropad) + precision = field_width - (flags.plus_space_flag != PSF_NONE); + while (precision > (int)(ptr - buf_pointer)) + *--buf_pointer = '0'; + + if (flags.alternate_flag && flags.nonzero_value) + { + if (format_flag == 'x' || format_flag == 'X') + { + *--buf_pointer = format_flag; + *--buf_pointer = '0'; + } +#if CONFIG_PRINTF_OCTAL_FORMATTER + else if ((format_flag == 'o') && (*buf_pointer != '0')) + { + *--buf_pointer = '0'; + } +#endif + } + ASSERT(buf_pointer >= buf); + break; + +#if CONFIG_PRINTF > PRINTF_NOFLOAT + case 'g': + case 'G': + n = 1; + format_flag -= 2; + if (! precision) + { + precision = 1; + } + goto FLOATING_CONVERSION; + case 'f': + format_flag = 0; + case 'e': + case 'E': + n = 0; +FLOATING_CONVERSION: + if (precision < 0) + { + precision = 6; + } + + if (sizeof(double) != sizeof(max_float_t)) + { + fvalue = flags.l_L_modifier ? + va_arg(ap,max_float_t) : va_arg(ap,double); + } + else + fvalue = va_arg(ap,max_float_t); + + if (fvalue < 0) + { + flags.plus_space_flag = PSF_MINUS; + fvalue = -fvalue; + } + ptr = float_conversion (fvalue, + (short)precision, + buf_pointer += field_width, + format_flag, + (char)n, + flags.alternate_flag); + if (flags.zeropad) + { + precision = field_width - (flags.plus_space_flag != PSF_NONE); + while (precision > ptr - buf_pointer) + *--buf_pointer = '0'; + } + break; + +#endif /* CONFIG_PRINTF <= PRINTF_NOFLOAT */ + + case '\0': /* Really bad place to find NUL in */ + format--; + + default: + /* Undefined conversion! */ + ptr = buf_pointer = bad_conversion; + ptr += sizeof(bad_conversion) - 1; + break; + + } + + /* + * This part emittes the formatted string to "put_one_char". + */ + + /* If field_width == 0 then nothing should be written. */ + precision = ptr - buf_pointer; + + if ( precision > field_width) + { + n = 0; + } + else + { + n = field_width - precision - (flags.plus_space_flag != PSF_NONE); + } + + /* emit any leading pad characters */ + if (!flags.left_adjust) + while (--n >= 0) + { + put_one_char(' ', secret_pointer); +#if CONFIG_PRINTF_COUNT_CHARS + nr_of_chars++; +#endif + } + + /* emit flag characters (if any) */ + if (flags.plus_space_flag) + { + put_one_char(flags.plus_space_flag == PSF_PLUS ? '+' : '-', secret_pointer); +#if CONFIG_PRINTF_COUNT_CHARS + nr_of_chars++; +#endif + } + +#if CPU_HARVARD + if (flags.progmem) + { + while (--precision >= 0) + { + put_one_char(pgm_read_char(buf_pointer++), secret_pointer); +#if CONFIG_PRINTF_COUNT_CHARS + nr_of_chars++; +#endif + } + } + else +#endif /* CPU_HARVARD */ + { + /* emit the string itself */ + while (--precision >= 0) + { + put_one_char(*buf_pointer++, secret_pointer); +#if CONFIG_PRINTF_COUNT_CHARS + nr_of_chars++; +#endif + } + } + + /* emit trailing space characters */ + if (flags.left_adjust) + while (--n >= 0) + { + put_one_char(' ', secret_pointer); +#if CONFIG_PRINTF_COUNT_CHARS + nr_of_chars++; +#endif + } + } + +#else /* PRINTF_REDUCED starts here */ + +#if CONFIG_PRINTF > PRINTF_NOMODIFIERS + bool l_modifier, h_modifier; + unsigned long u_val, div_val; +#else + unsigned int u_val, div_val; +#endif /* CONFIG_PRINTF > PRINTF_NOMODIFIERS */ + + char format_flag; + unsigned int nr_of_chars, base; + char outChar; + char *ptr; + + nr_of_chars = 0; + for (;;) /* Until full format string read */ + { + while ((format_flag = PGM_READ_CHAR(format++)) != '%') /* Until '%' or '\0' */ + { + if (!format_flag) + return (nr_of_chars); + put_one_char(format_flag, secret_pointer); + nr_of_chars++; + } + +#if CONFIG_PRINTF > PRINTF_NOMODIFIERS + /* + * Optional 'l', 'z' or 'h' modifiers? + */ + l_modifier = h_modifier = false; + switch (PGM_READ_CHAR(format)) + { + case 'l': + #if SIZEOF_SIZE_T == SIZEOF_LONG + case 'z': + l_modifier = true; + #elif SIZEOF_SIZE_T == SIZEOF_INT + l_modifier = true; + case 'z': + #endif + format++; + break; + + case 'h': + h_modifier = true; + format++; + break; + } +#endif /* CONFIG_PRINTF > PRINTF_NOMODIFIERS */ + + switch (format_flag = PGM_READ_CHAR(format++)) + { + case 'c': + format_flag = va_arg(ap, int); + default: + put_one_char(format_flag, secret_pointer); + nr_of_chars++; + continue; + + case 's': + ptr = va_arg(ap, char *); + while ((format_flag = *ptr++)) + { + put_one_char(format_flag, secret_pointer); + nr_of_chars++; + } + continue; + + case 'o': + base = 8; + if (IS_SHORT) + div_val = 0x8000; + else + div_val = 0x40000000; + goto CONVERSION_LOOP; + + case 'd': + base = 10; + if (IS_SHORT) + div_val = 10000; + else + div_val = 1000000000; + goto CONVERSION_LOOP; + + case 'X': + case 'x': + base = 16; + if (IS_SHORT) + div_val = 0x1000; + else + div_val = 0x10000000; + +CONVERSION_LOOP: +#if CONFIG_PRINTF > PRINTF_NOMODIFIERS + if (h_modifier) + { + if (format_flag == 'd') + u_val = (short)va_arg(ap, int); + else + u_val = (unsigned short)va_arg(ap, int); + } + else if (l_modifier) + u_val = va_arg(ap, long); + else + { + if (format_flag == 'd') + u_val = va_arg(ap, int); + else + u_val = va_arg(ap, unsigned int); + } + +#else /* CONFIG_PRINTF > PRINTF_NOMODIFIERS */ + u_val = va_arg(ap,int); +#endif /* CONFIG_PRINTF > PRINTF_NOMODIFIERS */ + if (format_flag == 'd') + { + if (((int)u_val) < 0) + { + u_val = - u_val; + put_one_char('-', secret_pointer); + nr_of_chars++; + } + } + while (div_val > 1 && div_val > u_val) + { + div_val /= base; + } + do + { + outChar = (u_val / div_val) + '0'; + if (outChar > '9') + { + if (format_flag == 'x') + outChar += 'a'-'9'-1; + else + outChar += 'A'-'9'-1; + } + put_one_char(outChar, secret_pointer); + nr_of_chars++; + u_val %= div_val; + div_val /= base; + } + while (div_val); + + } /* end switch(format_flag...) */ + } +#endif /* CONFIG_PRINTF > PRINTF_REDUCED */ +} + +#endif /* CONFIG_PRINTF */ diff --git a/2.5/bertos/mware/formatwr.h b/2.5/bertos/mware/formatwr.h new file mode 100644 index 00000000..8ede6f24 --- /dev/null +++ b/2.5/bertos/mware/formatwr.h @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \version $Id$ + * + * \brief Basic "printf", "sprintf" and "fprintf" formatter. + * + * $WIZ$ module_name = "formatwr" + * $WIZ$ module_configuration = "bertos/cfg/cfg_formatwr.h" + * $WIZ$ module_depends = "hex" + * $WIZ$ module_harvard = "both" + */ + +#ifndef MWARE_FORMATWR_H +#define MWARE_FORMATWR_H + +#include "cfg/cfg_formatwr.h" + +#include /* CPU_HARVARD */ + +#include /* va_list */ + +/** + * \name _formatted_write() configuration + * $WIZ$ printf_list = "PRINTF_DISABLED", "PRINTF_NOMODIFIERS", "PRINTF_REDUCED", "PRINTF_NOFLOAT", "PRINTF_FULL" + * \{ + */ +#define PRINTF_DISABLED 0 +#define PRINTF_NOMODIFIERS 1 +#define PRINTF_REDUCED 2 +#define PRINTF_NOFLOAT 3 +#define PRINTF_FULL 4 +/* \} */ + +#ifndef CONFIG_PRINTF_RETURN_COUNT + /** Enable/disable _formatted_write return value */ + #define CONFIG_PRINTF_RETURN_COUNT 1 +#endif + +int +_formatted_write( + const char *format, + void put_char_func(char c, void *user_data), + void *user_data, + va_list ap); + +#if CPU_HARVARD + #include + int _formatted_write_P( + const char * PROGMEM format, + void put_char_func(char c, void *user_data), + void *user_data, + va_list ap); +#endif /* CPU_HARVARD */ + +int sprintf_testSetup(void); +int sprintf_testRun(void); +int sprintf_testTearDown(void); + +#endif /* MWARE_FORMATWR_H */ + diff --git a/2.5/bertos/mware/hex.c b/2.5/bertos/mware/hex.c new file mode 100644 index 00000000..4b22f1ef --- /dev/null +++ b/2.5/bertos/mware/hex.c @@ -0,0 +1,42 @@ +/** + * \file + * + * + * \brief Poor man's hex arrays (implementation). + * + * \version $Id$ + * \author Bernie Innocenti + */ + + +#include "hex.h" + +const char hex_tab[16] = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' }; +const char HEX_tab[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; diff --git a/2.5/bertos/mware/hex.h b/2.5/bertos/mware/hex.h new file mode 100644 index 00000000..5e036dfe --- /dev/null +++ b/2.5/bertos/mware/hex.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Poor man's hex arrays (implementation). + * + * \version $Id$ + * + * \author Bernie Innocenti + */ + +#ifndef MWARE_HEX_H +#define MWARE_HEX_H + +extern const char hex_tab[16]; +extern const char HEX_tab[16]; + +#endif /* MWARE_HEX_H */ diff --git a/2.5/bertos/mware/ini_reader.c b/2.5/bertos/mware/ini_reader.c new file mode 100644 index 00000000..d48f9ead --- /dev/null +++ b/2.5/bertos/mware/ini_reader.c @@ -0,0 +1,162 @@ +/** + * \file + * + * + * \brief Ini file reader module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#include "ini_reader.h" +#include "cfg/cfg_ini_reader.h" +#include +#include +#include + +/* + * Returns when the line containing the section is found. + * The file pointer is positioned at the start of the next line. + * Returns EOF if no section was found, 0 otherwise. + */ +static int findSection(KFile *fd, const char *section, size_t section_len, char *line, size_t size) +{ + while (kfile_gets(fd, line, size) != EOF) + { + char *ptr = line; + unsigned i; + /* accept only sections that begin at first char */ + if (*ptr++ != '[') + continue; + + /* find the end-of-section character */ + for (i = 0; i < size && *ptr != ']'; ++i, ++ptr) + ; + + /* The found section could be long that our section key */ + if (section_len != i) + continue; + + /* did we find the correct section? */ + if(strncmp(&line[1], section, section_len)) + continue; + else + return 0; + } + return EOF; +} + +/* + * Fills the argument with the key found in line + */ +static char *getKey(const char *line, char *key, size_t size) +{ + /* null-terminated string */ + while (isspace(*line)) + ++line; + int i = 0; + while (*line != '=' && !isspace(*line) && size) + { + key[i++] = *line; + ++line; + --size; + } + size ? (key[i] = '\0') : (key[i-1] = '\0'); + return key; +} + +/* + * Fills the argument with the value found in line. + */ +static char *getValue(const char *line, char *value, size_t size) +{ + while (*line++ != '=') + ; + while (isspace(*line)) + ++line; + int i = 0; + while (*line && size) + { + value[i++] = *line++; + --size; + } + size ? (value[i] = '\0') : (value[i-1] = '\0'); + return value; +} + +/** + * Look for key inside a section. + * + * The function reads lines from input file. It fills the line parameter to allow splitting + * the key-value couple. It returns with error if a new section begins and no key was found. + * \return 0 if key was found, EOF on errors. + */ +static int findKey(KFile *fd, const char *key, char *line, size_t size) +{ + int err; + do + { + err = kfile_gets(fd, line, size); + char curr_key[30]; + getKey(line, curr_key, 30); + /* check key */ + if (!strcmp(curr_key, key)) + return 0; + } + while (err != EOF && *line != '['); + return EOF; +} + +/* + * On errors, the function returns EOF and fills the buffer with the default value. + */ +int ini_getString(KFile *fd, const char *section, const char *key, const char *default_value, char *buf, size_t size) +{ + char line[CONFIG_INI_MAX_LINE_LEN]; + + if (kfile_seek(fd, 0, KSM_SEEK_SET) == EOF) + goto error; + + if (findSection(fd, section, strlen(section), line, CONFIG_INI_MAX_LINE_LEN) == EOF) + goto error; + + if (findKey(fd, key, line, CONFIG_INI_MAX_LINE_LEN) == EOF) + goto error; + else + getValue(line, buf, size); + return 0; + +error: + strncpy(buf, default_value, size); + if (size > 0) + buf[size - 1] = '\0'; + return EOF; +} diff --git a/2.5/bertos/mware/ini_reader.h b/2.5/bertos/mware/ini_reader.h new file mode 100644 index 00000000..ef5d9489 --- /dev/null +++ b/2.5/bertos/mware/ini_reader.h @@ -0,0 +1,73 @@ +/** + * \file + * + * + * \brief Ini file reader module. + * + * The format accepted is: + * - Sections must begin at beginning of line. [ Long name ] will be found only if " Long name " is specified as section name. + * - key can contain any spaces at the beginning and before '=' but not in the middle. Eg. "long key name" is not valid. + * - values will be stripped of spaces at the beginning and will run until end-of-line. Eg. "= long value" will be treated as "long value". + * - no nested sections are allowed. + * - no comments are allowed inside a line with key=value pair. + * - every line that doesn't contain a '=' or doesn't start with '[' will be ignored. + * + * \author Luca Ottaviano + * + * $WIZ$ module_name = "ini_reader" + * $WIZ$ module_configuration = "bertos/cfg/cfg_ini_reader.h" + * $WIZ$ module_depends = "kfile" + */ + +#ifndef INI_READER_H +#define INI_READER_H + +#include + +/** + * \brief Returns the value for the given string in char* format. + * Reads the whole input file looking for section and key and fills the provided buffer with + * the corresponding value. + * On errors, the function fills the provided buffer with the default value and returns EOF. + * \param fd An initialized KFile structure. + * \param section The section to be looked for. + * \param key The key to search for. + * \param default_value The default value. + * \param buf The buffer to be filled. + * \param size The size of the provided buffer. + * \return 0 if section and key were found, EOF on errors. + */ +int ini_getString(KFile *fd, const char *section, const char *key, const char *default_value, char *buf, size_t size); + +int ini_reader_testSetup(void); +int ini_reader_testRun(void); +int ini_reader_testTearDown(void); +#endif /* INI_READER_H */ diff --git a/2.5/bertos/mware/ini_reader_test.c b/2.5/bertos/mware/ini_reader_test.c new file mode 100644 index 00000000..8237d970 --- /dev/null +++ b/2.5/bertos/mware/ini_reader_test.c @@ -0,0 +1,101 @@ +/** + * \file + * + * + * \brief Test function for ini_reader module. + * + * $test$: cp bertos/cfg/cfg_kfile.h $cfgdir/ + * $test$: echo "#undef CONFIG_KFILE_GETS" >> $cfgdir/cfg_kfile.h + * $test$: echo "#define CONFIG_KFILE_GETS 1" >> $cfgdir/cfg_kfile.h + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#include +#include + +#include // strcmp + +#include "ini_reader.h" + +const char ini_file[] = "./test/ini_reader_file.ini"; +static KFilePosix kf; + +int ini_reader_testSetup(void) +{ + kdbg_init(); + if (!kfile_posix_init(&kf, ini_file, "r")) + { + kprintf("No test file found\n"); + return -1; + } + return 0; +} + +int ini_reader_testRun(void) +{ + char buf[30]; + memset(buf, 0, 30); + + ASSERT(ini_getString(&kf.fd, "First", "String", "default", buf, 30) != EOF); + ASSERT(strcmp(buf, "noot") == 0); + + ASSERT(ini_getString(&kf.fd, "Second", "Val", "default", buf, 30) != EOF); + ASSERT(strcmp(buf, "2") == 0); + + ASSERT(ini_getString(&kf.fd, "First", "Empty", "default", buf, 30) != EOF); + ASSERT(strcmp(buf, "") == 0); + + ASSERT(ini_getString(&kf.fd, "Second", "Bar", "default", buf, 30) == EOF); + ASSERT(strcmp(buf, "default") == 0); + + ASSERT(ini_getString(&kf.fd, "Foo", "Bar", "default", buf, 30) == EOF); + ASSERT(strcmp(buf, "default") == 0); + + ASSERT(ini_getString(&kf.fd, "Second", "Long key", "", buf, 30) == EOF); + + ASSERT(ini_getString(&kf.fd, "Second", "comment", "", buf, 30) != EOF); + ASSERT(strcmp(buf, "line with #comment") == 0); + + ASSERT(ini_getString(&kf.fd, "Long section with spaces", "value", "", buf, 30) != EOF); + ASSERT(strcmp(buf, "long value") == 0); + + ASSERT(ini_getString(&kf.fd, "Long section with spaces", "no_new_line", "", buf, 30) != EOF); + ASSERT(strcmp(buf, "value") == 0); + return 0; +} + +int ini_reader_testTearDown(void) +{ + return kfile_close(&kf.fd); +} + +TEST_MAIN(ini_reader); diff --git a/2.5/bertos/mware/messages.c b/2.5/bertos/mware/messages.c new file mode 100644 index 00000000..52c720c4 --- /dev/null +++ b/2.5/bertos/mware/messages.c @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Messages for LCD. + * + * \version $Id$ + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + */ + +#include "messages.h" + +/** + * Array of pointers to localized strings. Should be filled + * by localization stuff, but not for now. + */ +const char *msg_strings[MSG_COUNT] = { + 0, + // TODO: add your strings here +}; + +/* Buffer for catalog file */ +/* char msg_buf[MSG_BUFSIZE]; */ + + +/* The following does not work (move string tables into the DMSG/CMSG segments) + * #pragma memory=dataseg(DMSG) + * #pragma memory=constseg(CMSG) + */ + + +/** + * Untranslated constant strings used more than once are + * grouped here to save ROM space. + */ +const char str_empty[] = ""; + diff --git a/2.5/bertos/mware/messages.h b/2.5/bertos/mware/messages.h new file mode 100644 index 00000000..0eaff8fd --- /dev/null +++ b/2.5/bertos/mware/messages.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Definitions of constant string messages. + * + * \version $Id$ + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + */ + +#ifndef MWARE_MESSAGES_H +#define MWARE_MESSAGES_H + +enum +{ + MSG_NULL, + + // TODO: add your labels here. + + MSG_COUNT +}; + +#warning FIXME:Revise me! + +#define MSG_BUFSIZE 6144 /* FIXME: how much? */ + +/* String tables */ +/* extern const char *msg_strings const [MSG_COUNT]; */ +/* extern char msg_buf[MSG_BUFSIZE]; */ + + +/* Macros to access translated messages */ +#define MSG(x) msg_strings[x] +#define PTRMSG(x) ((x) < (const_iptr_t)256 ? msg_strings[(unsigned int)(x)] : (const char *)(x)) + + +#endif /* MWARE_MESSAGES_H */ + diff --git a/2.5/bertos/mware/observer.c b/2.5/bertos/mware/observer.c new file mode 100644 index 00000000..2a9358a5 --- /dev/null +++ b/2.5/bertos/mware/observer.c @@ -0,0 +1,81 @@ +/** + * \file + * + * + * \brief Simple notifier for the observer/subject pattern (implementation) + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#include "observer.h" +#include // IRQ_DISABLE/IRQ_ENABLE + + +void observer_SetEvent(Observer *observer, void (*event)(int event_id, void *param)) +{ + observer->event = event; +} + +void observer_InitSubject(Subject *subject) +{ + LIST_INIT(&subject->observers); +} + +void observer_Subscribe(Subject *subject, Observer *observer) +{ + ATOMIC(ADDHEAD(&subject->observers, &observer->link)); +} + +void observer_Unsubscribe(UNUSED_ARG(Subject *,subject), Observer *observer) +{ + ATOMIC(REMOVE(&observer->link)); +} + +void observer_notify(Subject *subject, int event_id, void *param) +{ + Observer *observer; + cpu_flags_t irqstate; + IRQ_SAVE_DISABLE(irqstate); + + /* + * Run over list with protection against other + * threads, but re-enable irqs in callbacks. + */ + FOREACH_NODE(observer, &subject->observers) + { + IRQ_RESTORE(irqstate); + observer->event(event_id, param); + IRQ_SAVE_DISABLE(irqstate); + } + + IRQ_RESTORE(irqstate); +} diff --git a/2.5/bertos/mware/observer.h b/2.5/bertos/mware/observer.h new file mode 100644 index 00000000..e970c7d6 --- /dev/null +++ b/2.5/bertos/mware/observer.h @@ -0,0 +1,96 @@ +/** + * \file + * + * + * \brief Simple notifier for the subject/observer pattern (interface) + * + * \version $Id$ + * \author Bernie Innocenti + */ +#ifndef MWARE_OBSERVER_H +#define MWARE_OBSERVER_H + +#include + +/** + * + * Here's a simple example: + * + * \code + * Subject kbd_driver; + * + * Observer kbd_observer; + * + * void key_pressed(int event, void *_param) + * { + * char *param = (char *)_param; + * + * if (event == EVENT_KBD_PRESSED) + * printf("You pressed %c\n", *param); + * } + * + * void register_kbd_listener(void) + * { + * observer_SetEvent(&kbd_observer, key_pressed); + * observer_Subscribe(&kbd_driver, &kbd_observer); + * } + * \endcode + */ +typedef struct Observer +{ + Node link; + void (*event)(int event_id, void *param); +} Observer; + +typedef struct Subject +{ + /// Subscribed observers. + List observers; + +} Subject; + +void observer_SetEvent(Observer *observer, void (*event)(int event_id, void *param)); + +#define OBSERVER_INITIALIZER(callback) { { NULL, NULL }, callback } + +void observer_InitSubject(Subject *subject); + +/// Aggiunge un Observer all'insieme +void observer_Subscribe(Subject *subject, Observer *observer); + +/// Rimuove un Observer dall'insieme +void observer_Unsubscribe(Subject *subject, Observer *observer); + +/// per tutti gli elementi nel set notifica l'evento, chiamando la relativa +/// funzione event +void observer_notify(Subject *subject, int event_id, void *param); + +#endif /* MWARE_OBSERVER_H */ diff --git a/2.5/bertos/mware/parser.c b/2.5/bertos/mware/parser.c new file mode 100644 index 00000000..b06013c8 --- /dev/null +++ b/2.5/bertos/mware/parser.c @@ -0,0 +1,396 @@ +/** + * \file + * + * + * \brief Channel protocol parser and commands. + * + * This file contains the channel protocol parser and + * the definition of the protocol commands. Commands are defined + * in a "CmdTemplate" type array, containing: + * - the name of the command, + * - the arguments it expects to receive, + * - the output values, + * - the name of the function implementing the command. + * + * The arguments and results are passed to command function + * using an union: the element of the union to use for each + * argument is determined by format strings present in the + * CmdTemplate table. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * \author Giovanni Bajo + * + * + */ + + +#include "parser.h" + +#include "cfg/cfg_parser.h" + +#include +#include + +#include // atol(), NULL +#include // strchr(), strcmp() + +//TODO: +#define CONFIG_INTERNAL_COMMANDS 0 + +#define ARG_SEP_S " " +#define ARG_SEP_C ' ' + +#define MAX_COMMANDS_NUMBER 128 // 64 + +/// Hashtable hook to extract the key from a command +static const void* get_key_from_command(const void* cmd, uint8_t* length); + +/// Hashtable that handles the commands that can be executed +DECLARE_HASHTABLE_STATIC(commands, MAX_COMMANDS_NUMBER, get_key_from_command); + + +/** + * \brief Tokenize one word at a time from a text. + * + * This function is similar to strtok, but does not use any implicit + * context, nor it does modify the input buffer in any form. + * The word is returned as a STL-like [begin,end) range. + * + * To extract the first word, make both begin and end point at the + * start of the text, and call the function. Then, subsequent + * calls will return the following words (assuming the begin/end + * variable are not modified between calls). + * + * \param begin Will contain the index of the first character of the word + * \param end Will contain the index of the character after the last + * character of the word + * + * \return True if a word was extracted, false if we got to the end + * of the string without extracting any word. + */ +static bool get_word(const char **begin, const char **end) +{ + const char *cur = *end; + + while ((*cur == ' ' || *cur == '\t') && *cur) + ++cur; + + *begin = cur; + + while ((*cur != ' ' && *cur != '\t') && *cur) + ++cur; + + *end = cur; + + return (*end != *begin); +} + + +/** + * \brief Command arguments parser. + * + * Using the format pointed by the argument fmt + * parses the input string filling the array argv + * with input parameters of the correct type. + * + * \param fmt Parameters format string. + * \param input Input string. + * \param argv Array filled with parameters. + * + * \return False in case of errors, otherwise true. + */ +static bool parseArgs(const char *fmt, const char *input, parms argv[]) +{ + const char *begin = input, *end = input; + + while (*fmt) + { + // Extract the argument + if (!get_word(&begin, &end)) + return false; + + switch (*fmt) + { + case 'd': + (*argv++).l = atol(begin); + break; + + case 's': + (*argv++).s = begin; + break; + + default: + ASSERT2(0, "Unknown format for argument"); + return false; + } + + ++fmt; + } + + /* check if there are remaining args */ + if (get_word(&begin, &end)) + return false; + + return true; +} + + +#ifdef UNUSED_CODE +/** + * \brief Command result formatting and printing. + * + * Prints out on device fd the values contained + * in the array result, using the format specified + * in fmt. + * + * \param ch Channel handle. + * \param fmt Values format string. + * \param result Array containing result to be printed. + * + * \return -1 in case of errors, otherwise 0. + */ +static int printResult(KFile *ch, const char *fmt, parms result[]) +{ + long n; + char repeat_cnt = 0; + + while (*fmt) + { + if (*fmt >= '0' && *fmt <= '9') + { + /* Collect repeat count digit (left to right order) */ + repeat_cnt = (repeat_cnt * 10) + (*fmt - '0'); + } + else + { + /* Set default repeat cnt of 1 when not specified */ + if (repeat_cnt == 0) + repeat_cnt = 1; + + /* Loop repeat_cnt times */ + do + { + switch (*fmt) + { + case 'd': + kfile_printf(ch, ARG_SEP_S "%ld", (*result).l); + result++; + break; + case 'c': + kfile_print(ch, ARG_SEP_S); + kfile_print(ch, (*result).s); + result++; + break; + case 's': + kfile_printf(ch, ARG_SEP_S "%s", (*result).s); + result++; + break; + case 'n': + n = (*result++).l; + kfile_printf(ch, ARG_SEP_S "%ld", n); + while (n--) { + kfile_printf(ch, ARG_SEP_S "%ld", (*result).l); + result++; + } + break; + default: + break; + } + } + while (--repeat_cnt); + } + + /* Skip to next format char */ + ++fmt; + + } /* while (*fmt) */ + + + kfile_print(ch, "\r\n"); + return 0; +} +#endif /* UNUSED_CODE */ + +/// Hook provided by the parser for matching of command names (TAB completion) for readline +const char* parser_rl_match(UNUSED_ARG(void *,dummy), const char *word, int word_len) +{ + HashIterator cur; + HashIterator end = ht_iter_end(&commands); + const char *found = NULL; + + for (cur = ht_iter_begin(&commands); + !ht_iter_cmp(cur, end); + cur = ht_iter_next(cur)) + { + const struct CmdTemplate* cmdp = (const struct CmdTemplate*)ht_iter_get(cur); + if (strncmp(cmdp->name, word, word_len) == 0) + { + // If there was another matching word, it means that we have a multiple + // match: then return NULL. + if (found) + return NULL; + + found = cmdp->name; + } + } + + return found; +} + +bool parser_get_cmd_id(const char* line, unsigned long* ID) +{ + const char *begin = line, *end = line; + char *end2; + + // The first word is the ID + if (!get_word(&begin, &end)) + return false; + + *ID = strtoul(begin, &end2, 10); + if (end2 != end) + return false; + + return true; +} + +const struct CmdTemplate* parser_get_cmd_template(const char *input) +{ +// const struct CmdTemplate *cmdp; +// int cmdlen; + const char *begin = input, *end = input; + + // Skip the ID, and get the command + if (!get_word(&begin, &end)) + return NULL; + if (!get_word(&begin, &end)) + return NULL; + + return (const struct CmdTemplate*)ht_find(&commands, begin, end-begin); +} + +static const char *skip_to_params(const char *input, const struct CmdTemplate *cmdp) +{ + const char *begin = input, *end = input; + + // Skip the ID, and get the command + if (!get_word(&begin, &end)) + return NULL; + if (!get_word(&begin, &end)) + return NULL; + + ASSERT2(strlen(cmdp->name) == (size_t)(end-begin), "Invalid command template specified"); + ASSERT2(!strncmp(begin, cmdp->name, end-begin), "Invalid command template specified"); + + return end; +} + +bool parser_get_cmd_arguments(const char* input, const struct CmdTemplate* cmdp, parms args[PARSER_MAX_ARGS]) +{ + input = skip_to_params(input, cmdp); + if (!input) + return false; + + args[0].s = cmdp->name; + if (!parseArgs(cmdp->arg_fmt, input, args + 1)) + return false; + + return true; +} + +static const void* get_key_from_command(const void* cmd, uint8_t* length) +{ + const struct CmdTemplate* c = cmd; + *length = strlen(c->name); + return c->name; +} + +bool parser_process_line(const char* input) +{ + const struct CmdTemplate *cmdp; + parms args[PARSER_MAX_ARGS]; + + cmdp = parser_get_cmd_template(input); + if (!cmdp) + return false; + + if (!parser_get_cmd_arguments(input, cmdp, args)) + return false; + + if (!parser_execute_cmd(cmdp, args)) + return false; + + return true; +} + +void parser_register_cmd(const struct CmdTemplate* cmd) +{ + ht_insert(&commands, cmd); +} + +#if CONFIG_INTERNAL_COMMANDS +#warning FIXME:This code use boost lib, if you compile with internal command you must fix it. +static ResultCode cmd_help(void) +{ +#ifdef _DEBUG + + // FIXME: There is no way at the moment to access the serial port. Dump + // this through JTAG for now + for (HashIterator iter = ht_iter_begin(&commands); + !ht_iter_cmp(iter, ht_iter_end(&commands)); + iter = ht_iter_next(iter)) + { + struct CmdTemplate* cmd = (struct CmdTemplate*)ht_iter_get(iter); + kprintf("%-20s", cmd->name); + for (unsigned j = 0; cmd->arg_fmt[j]; ++j) + kprintf("%c ", 'a' + j); + kprintf("\r\n"); + } +#endif + + return RC_OK; +} + +#include "cmd_hunk.h" +DECLARE_CMD_HUNK(help, (NIL), (NIL)); + +#endif // CONFIG_INTERNAL_COMMANDS + + +void parser_init(void) +{ + // Initialize the hashtable used to store the command description + ht_init(&commands); + +#if CONFIG_INTERNAL_COMMANDS + parser_register_cmd(&CMD_HUNK_TEMPLATE(help)); +#endif +} diff --git a/2.5/bertos/mware/parser.h b/2.5/bertos/mware/parser.h new file mode 100644 index 00000000..16fa4534 --- /dev/null +++ b/2.5/bertos/mware/parser.h @@ -0,0 +1,187 @@ +/** + * \file + * + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * \author Giovanni Bajo + * + * \brief Channel protocol parser and commands. + * + * $WIZ$ module_name = "parser" + * $WIZ$ module_configuration = "bertos/cfg/cfg_parser.h" + * $WIZ$ module_depends = "kfile", "hashtable" + */ + + +#ifndef MWARE_PARSER_H +#define MWARE_PARSER_H + +#include + +/** Max number of arguments and results for each command */ +#define PARSER_MAX_ARGS 8 + +/** + * Error generated by the commands through the return code. + */ +typedef enum +{ + RC_ERROR = -1, ///< Reply with error. + RC_OK = 0, ///< No reply (ignore reply arguments). + RC_REPLY = 1, ///< Reply command arguments. + RC_SKIP = 2 ///< Skip following commands +} ResultCode; + +/** union that contains parameters passed to and from commands */ +typedef union { long l; const char *s; } parms; +/** pointer to commands */ +typedef ResultCode (*CmdFuncPtr)(parms args_results[]); + +/** + * Define a command that can be tokenized by the parser. + * + * The format strings are sequences of characters, one for each + * parameter/result. Valid characters are: + * + * d - a long integer, in decimal format + * s - a var string (in RAM) + * + * \note To create and fill an instance for this function, it is strongly + * advised to use \c DECLARE_CMD_HUNK (cmd_hunk.h). + */ +struct CmdTemplate +{ + const char *name; ///< Name of command + const char *arg_fmt; ///< Format string for the input + const char *result_fmt; ///< Format string for the output + CmdFuncPtr func; ///< Pointer to the handler function + uint16_t flags; ///< Currently unused. +}; + +/** + * Initialize the parser module + * + * \note This function must be called before any other function in this module + */ +void parser_init(void); + + +/** + * Register a new command into the parser + * + * \param cmd Command template describing the command + * + */ +void parser_register_cmd(const struct CmdTemplate* cmd); + + +/** + * Hook for readline to provide completion support for the commands + * registered in the parser. + * + * \note This is meant to be used with mware/readline.c. See the + * documentation there for a description of this hook. + */ +const char* parser_rl_match(void* dummy, const char* word, int word_len); + + +/** + * \brief Command input handler. + * + * Process the input, calling the requested command + * (if found) and calling printResult() to give out + * the result (on device specified with parameter fd). + * + * \param line Text line to be processed (ASCIIZ) + * + * \return true if everything is OK, false in case of errors + */ +bool parser_process_line(const char* line); + + +/** + * Execute a command with its arguments, and fetch its results. + * + * \param templ Template of the command to be executed + * \param args Arguments for the command, and will contain the results + * + * \return False if the command returned an error, true otherwise + */ +INLINE bool parser_execute_cmd(const struct CmdTemplate* templ, parms args[PARSER_MAX_ARGS]) +{ + return (templ->func(args) == 0); +} + + +/** + * Find the template for the command contained in the text line. + * The template can be used to tokenize the command and interpret + * it. + * + * This function can be used to find out which command is contained + * in a given text line without parsing all the parameters and + * executing it. + * + * \param line Text line to be processed (ASCIIZ) + * + * \return The command template associated with the command contained + * in the line, or NULL if the command is invalid. + */ +const struct CmdTemplate* parser_get_cmd_template(const char* line); + + +/** + * Extract the arguments for the command contained in the text line. + * + * \param line Text line to be processed (ASCIIZ) + * \param templ Command template for this line + * \param args Will contain the extracted parameters + * + * \return True if everything OK, false in case of parsing error. + */ +bool parser_get_cmd_arguments(const char* line, const struct CmdTemplate* templ, parms args[PARSER_MAX_ARGS]); + + +/** + * Extract the ID from the command text line. + * + * \param line Text line to be processed (ASCIIZ) + * \param ID Will contain the ID extracted. + * + * \return True if everything ok, false if there is no ID + * + */ +bool parser_get_cmd_id(const char* line, unsigned long* ID); + + +#endif /* MWARE_PARSER_H */ + diff --git a/2.5/bertos/mware/pgm.h b/2.5/bertos/mware/pgm.h new file mode 100644 index 00000000..8f6ce491 --- /dev/null +++ b/2.5/bertos/mware/pgm.h @@ -0,0 +1,2 @@ +#warning This header is OBSOLETE +#include diff --git a/2.5/bertos/mware/readline.c b/2.5/bertos/mware/readline.c new file mode 100644 index 00000000..dcad52b4 --- /dev/null +++ b/2.5/bertos/mware/readline.c @@ -0,0 +1,497 @@ +/** + * \file + * + * + * \brief Line editing support with history + * + * Rationale for basic implementation choices: + * + * \li The history is implemented storing consecutive ASCIIZ strings within an array of memory. When + * the history is full, the first (oldest) line is cancelled and the whole buffer is memmoved to + * overwrite it and make room. while this is is obviously not the fastest algorithm (which would + * require the use of a circular buffer) it is surely good enough for this module, which does not + * aim at fast performances (line editing does not require to be blazingly fast). + * + * \li The first character in the history is always \c \\0, and it is used as a guard. By 'wasting' it + * in this way, the code actually gets much simpler in that we remove many checks when moving + * backward (\c i>0 and similar). + * + * \li While editing, the current index points to the position of the buffer which contains the + * last character typed in (exactly like a stack pointer). This also allows to simplify calculations + * and to make easier using the last byte of history. + * + * \li While editing, the current line is always kept null-terminated. This is important because + * if the user press ENTER, we must have room to add a \c \\0 to terminate the line. If the line + * is as long as the whole history buffer, there would not be space for it. By always keeping the + * \c \\0 at the end, we properly ensure this without making index checks harder. + * + * \li When removing a line from the history (see \c pop_history()), instead of updating all the + * indices we have around, we move backward the pointer to the history we use. This way, we don't + * have to update anything. This means that we keep two pointers to the history: \c real_history + * always points to the physical start, while \c history is the adjusted pointer (that is + * dereference to read/write to it). + * + * \todo Use up/down to move through history The history line will be copied to the current line, + * making sure there is room for it. + * + * \author Giovanni Bajo + */ + + +#include "readline.h" + +#include +#include + +#include + +/// Enable compilation of the unit test code +#define DEBUG_UNIT_TEST 0 + +/// Enable dump of the history after each line +#define DEBUG_DUMP_HISTORY 0 + + +/** Special keys (escape sequences converted to a single code) */ +enum RL_KEYS { + SPECIAL_KEYS = 0x1000, + + /* + * Three byte keys: + * ################# + * UpArrow: 0x1B 0x5B 0X41 + * DownArrow: 0x1B 0x5B 0X42 + * RightArrow: 0x1B 0x5B 0x43 + * LeftArrow: 0x1b 0x5B 0x44 + * Beak(Pause): 0x1b 0x5B 0x50 + */ + KEY_UP_ARROW, + KEY_DOWN_ARROW, + KEY_LEFT_ARROW, + KEY_RIGHT_ARROW, + KEY_PAUSE, + + /* + * Four byte keys: + * ################ + * F1: 0x1b 0x5B 0x5B 0x41 + * F2: 0x1b 0x5B 0x5B 0x42 + * F3: 0x1b 0x5B 0x5B 0x43 + * F4: 0x1b 0x5B 0x5B 0x44 + * F5: 0x1b 0x5B 0x5B 0x45 + * Ins: 0x1b 0x5B 0x32 0x7E + * Home: 0x1b 0x5B 0x31 0x7E + * PgUp: 0x1b 0x5B 0x35 0x7E + * Del: 0x1b 0x5B 0x33 0x7E + * End: 0x1b 0x5B 0x34 0x7E + * PgDn: 0x1b 0x5B 0x36 0x7E + */ + KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, + KEY_INS, KEY_HOME, KEY_PGUP, KEY_DEL, KEY_END, KEY_PGDN, + + /* + * Five byte keys: + * ################ + * F6: 0x1b 0x5B 0x31 0x37 0x7E + * F7: 0x1b 0x5B 0x31 0x38 0x7E + * F8: 0x1b 0x5B 0x31 0x39 0x7E + * F9: 0x1b 0x5B 0x32 0x30 0x7E + * F10: 0x1b 0x5B 0x32 0x31 0x7E + * F11: 0x1b 0x5B 0x32 0x33 0x7E + * F12: 0x1b 0x5B 0x32 0x34 0x7E + */ + KEY_F6, KEY_F7, KEY_F8, KEY_F9, + KEY_F10, KEY_F11, KEY_F12, +}; + +/** Check if \a c is a separator between words. + * \note Parameter \a c is evaluated multiple times + */ +#define IS_WORD_SEPARATOR(c) ((c) == ' ' || (c) == '\0') + +/// Write the string \a txt to the IO output (without any kind of termination) +INLINE void rl_puts(const struct RLContext* ctx, const char* txt) +{ + if (!ctx->put) + return; + + while (*txt) + ctx->put(*txt++, ctx->put_param); +} + +/// Write character \a ch to the IO output. +INLINE void rl_putc(const struct RLContext* ctx, char ch) +{ + if (ctx->put) + ctx->put(ch, ctx->put_param); +} + +/** Read a character from the IO into \a ch. This function also takes + * care of converting the ANSI escape sequences into one of the codes + * defined in \c RL_KEYS. + */ +static bool rl_getc(const struct RLContext* ctx, int* ch) +{ + int c = ctx->get(ctx->get_param); + + if (c == EOF) + { + if (ctx->clear) + ctx->clear(ctx->clear_param); + + return false; + } + + if (c == 0x1B) + { + // Unknown ESC sequence. Ignore it and read + // return next character. + if (ctx->get(ctx->get_param) != 0x5B) + return rl_getc(ctx, ch); + + /* To be added: + * Home: 0x1b 0x5B 0x31 0x7E + * F6: 0x1b 0x5B 0x31 0x37 0x7E + * F7: 0x1b 0x5B 0x31 0x38 0x7E + * F8: 0x1b 0x5B 0x31 0x39 0x7E + * Ins: 0x1b 0x5B 0x32 0x7E + * F9: 0x1b 0x5B 0x32 0x30 0x7E + * F10: 0x1b 0x5B 0x32 0x31 0x7E + * F11: 0x1b 0x5B 0x32 0x33 0x7E + * F12: 0x1b 0x5B 0x32 0x34 0x7E + * Del: 0x1b 0x5B 0x33 0x7E + * End: 0x1b 0x5B 0x34 0x7E + * PgUp: 0x1b 0x5B 0x35 0x7E + * PgDn: 0x1b 0x5B 0x36 0x7E + */ + + c = ctx->get(ctx->get_param); + switch (c) + { + case 0x41: c = KEY_UP_ARROW; break; + case 0x42: c = KEY_DOWN_ARROW; break; + case 0x43: c = KEY_RIGHT_ARROW; break; + case 0x44: c = KEY_LEFT_ARROW; break; + case 0x50: c = KEY_PAUSE; break; + case 0x5B: + c = ctx->get(ctx->get_param); + switch (c) + { + case 0x41: c = KEY_F1; break; + case 0x42: c = KEY_F2; break; + case 0x43: c = KEY_F3; break; + case 0x44: c = KEY_F4; break; + case 0x45: c = KEY_F5; break; + default: return rl_getc(ctx, ch); + } + break; + default: return rl_getc(ctx, ch); + } + } + + *ch = c; + return true; +} + +INLINE void beep(struct RLContext* ctx) +{ + rl_putc(ctx, '\a'); +} + +static bool pop_history(struct RLContext* ctx, int total_len) +{ + // Compute the length of the first command (including terminator). + int len = strlen(ctx->real_history+1)+1; + + // (the first byte of the history should always be 0) + ASSERT(ctx->real_history[0] == '\0'); + + // If it is the only one in the history, do nothing + if (len == total_len) + return false; + + // Overwrite the first command with the second one + memmove(ctx->real_history, ctx->real_history+len, HISTORY_SIZE-len); + + // Move back the ctx->buffer pointer so that all the indices are still valid + ctx->history -= len; + + return true; +} + +/// Check if index \a i points to the begin of the history. +INLINE bool is_history_begin(struct RLContext* ctx, int i) +{ return ctx->history + i == ctx->real_history; } + +/// Check if index \a i points to the (exclusive) end of history +INLINE bool is_history_end(struct RLContext* ctx, int i) +{ return ctx->history + i == ctx->real_history + HISTORY_SIZE; } + +/// Check if index \a i points to the (exclusive) end of history, or somewhere past the end. +INLINE bool is_history_past_end(struct RLContext* ctx, int i) +{ return ctx->history + i >= ctx->real_history + HISTORY_SIZE; } + +/** Insert \a num_chars characters from \a ch into the history buffer at the + * position indicated by \a curpos. If needed, remove old history to make room. + * Returns true if everything was successful, false if there was no room to + * add the characters. + * \note \a num_chars can be 0, in which case we just make sure the line is + * correctly zero-terminated (ASCIIZ format). + */ +static bool insert_chars(struct RLContext* ctx, size_t *curpos, const char* ch, int num_chars) +{ + ASSERT(!is_history_past_end(ctx, *curpos)); + + while (is_history_past_end(ctx, *curpos+num_chars+1)) + { + if (!pop_history(ctx, *curpos)) + return false; + } + + while (num_chars--) + ctx->history[++(*curpos)] = *ch++; + + ASSERT(!is_history_past_end(ctx, *curpos + 1)); + ctx->history[*curpos+1] = '\0'; + return true; +} + +/// Insert a single character \a ch into the buffer (with the same semantic of \c insert_chars()) +static bool insert_char(struct RLContext* ctx, size_t *curpos, char ch) +{ + return insert_chars(ctx, curpos, &ch, 1); +} + +#if DEBUG_DUMP_HISTORY +/// Dump the internal history of a context (used only for debug purposes) +static void dump_history(struct RLContext* ctx) +{ + int k; + char buf[8]; + ASSERT(ctx->real_history[0] == '\0'); + rl_puts(ctx, "History dump:"); + rl_puts(ctx, "\r\n"); + for (k = 1; + ctx->real_history + k != ctx->history + ctx->history_pos + 1; + k += strlen(&ctx->real_history[k]) + 1) + { + rl_puts(ctx, &ctx->real_history[k]); + rl_puts(ctx, "\r\n"); + } + + sprintf(buf, "%d\r\n", ctx->history_pos + (ctx->history - ctx->real_history)); + rl_puts(ctx, buf); +} +#endif /* DEBUG_DUMP_HISTORY */ + +/// Complete the current word. Return false if no unambiguous completion was found +static bool complete_word(struct RLContext *ctx, size_t *curpos) +{ + const char* completed_word; + size_t wstart; + + // If the current character is a separator, + // there is nothing to complete + wstart = *curpos; + if (IS_WORD_SEPARATOR(ctx->history[wstart])) + { + beep(ctx); + return false; + } + + // Find the separator before the current word + do + --wstart; + while (!IS_WORD_SEPARATOR(ctx->history[wstart])); + + // Complete the word through the hook + completed_word = ctx->match(ctx->match_param, ctx->history + wstart + 1, *curpos - wstart); + if (!completed_word) + return false; + + // Move back the terminal cursor to the separator + while (*curpos != wstart) + { + rl_putc(ctx, '\b'); + --*curpos; + } + + // Insert the completed command + insert_chars(ctx, curpos, completed_word, strlen(completed_word)); + rl_puts(ctx, completed_word); + insert_char(ctx, curpos, ' '); + rl_putc(ctx, ' '); + + return true; +} + +void rl_refresh(struct RLContext* ctx) +{ + rl_puts(ctx, "\r\n"); + if (ctx->prompt) + rl_puts(ctx, ctx->prompt); + rl_puts(ctx, ctx->history + ctx->history_pos + 1); +} + +const char* rl_readline(struct RLContext* ctx) +{ + while (1) + { + char ch; + int c; + + ASSERT(ctx->history - ctx->real_history + ctx->line_pos < HISTORY_SIZE); + + if (!rl_getc(ctx, &c)) + return NULL; + + // Just ignore special keys for now + if (c > SPECIAL_KEYS) + continue; + + if (c == '\t') + { + // Ask the match hook if available + if (!ctx->match) + return NULL; + + complete_word(ctx, &ctx->line_pos); + continue; + } + + // Backspace cancels a character, or it is ignored if at + // the start of the line + if (c == '\b') + { + if (ctx->history[ctx->line_pos] != '\0') + { + --ctx->line_pos; + rl_puts(ctx, "\b \b"); + } + continue; + } + + if (c == '\r' || c == '\n') + { + rl_puts(ctx, "\r\n"); + break; + } + + + // Add a character to the buffer, if possible + ch = (char)c; + ASSERT2(ch == c, "a special key was not properly handled"); + if (insert_chars(ctx, &ctx->line_pos, &ch, 1)) + rl_putc(ctx, ch); + else + beep(ctx); + } + + ctx->history_pos = ctx->line_pos + 1; + while (ctx->history[ctx->line_pos] != '\0') + --ctx->line_pos; + + // Do not store empty lines in the history + if (ctx->line_pos == ctx->history_pos - 1) + ctx->history_pos -= 1; + +#if DEBUG_DUMP_HISTORY + dump_history(ctx); +#endif + + const char *buf = &ctx->history[ctx->line_pos + 1]; + + ctx->line_pos = ctx->history_pos; + + if (ctx->prompt) + rl_puts(ctx, ctx->prompt); + + insert_chars(ctx, &ctx->line_pos, NULL, 0); + + // Since the current pointer now points to the separator, we need + // to return the first character + return buf; +} + + +#if DEBUG_UNIT_TEST + +/** Perform the unit test for the readline library */ +void rl_test(void); + +#if HISTORY_SIZE != 32 + #error This test needs HISTORY_SIZE to be set at 32 +#endif + +static struct RLContext test_ctx; + +static char* test_getc_ptr; +static int test_getc(void* data) +{ + return *test_getc_ptr++; +} + +/** Perform a readline test. The function pipes the characters from \a input_buffer + * through the I/O to \c rl_readline(). After the whole string is sent, \c do_test() + * checks if the current history within the context match \a expected_history. + */ +static bool do_test(char* input_buffer, char* expected_history) +{ + rl_init_ctx(&test_ctx); + rl_sethook_get(&test_ctx, test_getc, NULL); + + test_getc_ptr = input_buffer; + while (*test_getc_ptr) + rl_readline(&test_ctx); + + if (memcmp(test_ctx.real_history, expected_history, HISTORY_SIZE) != 0) + { + ASSERT2(0, "history compare failed"); + return false; + } + + return true; +} + +void rl_test(void) +{ + char* test1_in = "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nw\nx\ny\nz\n"; + char test1_hist[HISTORY_SIZE] = "\0l\0m\0n\0o\0p\0q\0r\0s\0t\0u\0v\0w\0x\0y\0z"; + + if (!do_test(test1_in, test1_hist)) + return; + + kprintf("rl_test successful\n"); +} + +#endif /* DEBUG_UNIT_TEST */ + diff --git a/2.5/bertos/mware/readline.h b/2.5/bertos/mware/readline.h new file mode 100644 index 00000000..5f420f96 --- /dev/null +++ b/2.5/bertos/mware/readline.h @@ -0,0 +1,121 @@ +/** + * \file + * + * + * \brief Line editing support with history + * + * This file implements a kernel for line editing through a terminal, with history of the typed lines. + * Basic feature of this module: + * + * \li Abstracted from I/O. The user must provide hooks for getc and putc functions. + * \li Basic support for ANSI escape sequences for input of special codes. + * \li Support for command name completion (through a hook). + * + * \version $Id$ + * + * \author Giovanni Bajo + * + * $WIZ$ module_name = "readline" + * $WIZ$ module_depends = "sprintf" + */ + + +#ifndef MWARE_READLINE_H +#define MWARE_READLINE_H + +#include + +#include + +#define HISTORY_SIZE 32 + +typedef int (*getc_hook)(void* user_data); +typedef void (*putc_hook)(char ch, void* user_data); +typedef const char* (*match_hook)(void* user_data, const char* word, int word_len); +typedef void (*clear_hook)(void* user_data); + +struct RLContext +{ + getc_hook get; + void* get_param; + + putc_hook put; + void* put_param; + + match_hook match; + void* match_param; + + clear_hook clear; + void* clear_param; + + const char* prompt; + + char real_history[HISTORY_SIZE]; + char* history; + size_t history_pos; + size_t line_pos; +}; + +INLINE void rl_init_ctx(struct RLContext *ctx) +{ + memset(ctx, 0, sizeof(*ctx)); + ctx->history = ctx->real_history; +} + +INLINE void rl_clear_history(struct RLContext *ctx) +{ + memset(ctx->real_history, 0, sizeof(ctx->real_history)); + ctx->history_pos = 0; + ctx->line_pos = ctx->history_pos; + ctx->history = ctx->real_history; +} + +INLINE void rl_sethook_get(struct RLContext* ctx, getc_hook get, void* get_param) +{ ctx->get = get; ctx->get_param = get_param; } + +INLINE void rl_sethook_put(struct RLContext* ctx, putc_hook put, void* put_param) +{ ctx->put = put; ctx->put_param = put_param; } + +INLINE void rl_sethook_match(struct RLContext* ctx, match_hook match, void* match_param) +{ ctx->match = match; ctx->match_param = match_param; } + +INLINE void rl_sethook_clear(struct RLContext* ctx, clear_hook clear, void* clear_param) +{ ctx->clear = clear; ctx->clear_param = clear_param; } + +INLINE void rl_setprompt(struct RLContext* ctx, const char* prompt) +{ ctx->prompt = prompt; } + +const char* rl_readline(struct RLContext* ctx); + +void rl_refresh(struct RLContext* ctx); + +#endif /* MWARE_READLINE_H */ diff --git a/2.5/bertos/mware/resource.c b/2.5/bertos/mware/resource.c new file mode 100644 index 00000000..c723bd64 --- /dev/null +++ b/2.5/bertos/mware/resource.c @@ -0,0 +1,113 @@ + +#include "resource.h" +#include + +/** + * Internal structure for building a priority queue + * of processes waiting for the resource to become free. + */ +typedef struct ResourceWaiter +{ + PriNode link; + struct Observer *owner; + +} ResourceWaiter; + + +bool ResMan_Alloc(Resource *res, int pri, ResMan_time_t timeout, struct Observer *releaseRequest) +{ + bool success = false; + + ASSERT(releaseRequest); + + sem_obtain(&res->lock); + + if (res->owner == releaseRequest) + { + // Already ours + res->pri = pri; + success = true; + } + else if (!res->owner) + { + // Trivial acquire: nobody was owning the resource + res->pri = pri; + res->owner = releaseRequest; + success = true; + } + else + { + ResourceWaiter waiter; + + // Setup waiter structure and enqueue it to resource + waiter.owner = releaseRequest; + waiter.link.pri = pri; + LIST_ENQUEUE(&res->queue, &waiter.link); + + // Resource busy: are we eligible for preemption? + if ((res->pri < pri) && res->owner->event) + res->owner->event(EVENT_RELEASE, res); + + // Wait in the queue until the timeout occurs. + do + { + sem_release(&res->lock); + // TODO: use a semaphore here instead + ResMan_sleep(); + sem_obtain(&res->lock); + + // Check for ownership + if (res->owner == releaseRequest) + { + success = true; + break; + } + } + while (timeout--); + + // Remove pending waiter + if (!success) + REMOVE(&waiter.link.link); + } + + sem_release(&res->lock); + return success; +} + +void ResMan_Free(Resource *res) +{ + ResourceWaiter *waiter; + + sem_obtain(&res->lock); + + + ASSERT(res->owner); + //TODO: check for real owner calling free + + // Check for new owner candidates. + if ((waiter = (ResourceWaiter *)list_remHead(&res->queue))) + { + // Transfer ownership of the resource + res->owner = waiter->owner; + res->pri = waiter->link.pri; + //ResMan_wakeup(waiter); + } + else + { + // Nobody waiting, free the resource + res->owner = NULL; + res->pri = -1; + } + + sem_release(&res->lock); +} + +void ResMan_Init(Resource *res) +{ + res->owner = NULL; + res->pri = -1; + + sem_init(&res->lock); + LIST_INIT(&res->queue); +} + diff --git a/2.5/bertos/mware/resource.h b/2.5/bertos/mware/resource.h new file mode 100644 index 00000000..15736a75 --- /dev/null +++ b/2.5/bertos/mware/resource.h @@ -0,0 +1,106 @@ +/** + * \file + * + * + * \brief TODO: + * + * \version $Id$ + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + */ + +#ifndef MWARE_RESOURCE_H +#define MWARE_RESOURCE_H + +#include // time_t +#include + +#warning FIXME:Revise me! + +/* + * Abstract locking primitives used by host OS. + */ +typedef Semaphore ResourceLock; +#define ResMan_sleep() timer_delay(1) +#define ResMan_time_t mtime_t + + + +// Forward decl +struct Observer; + +/** + * Hold context information for a resource such as an audio channel. + * + * Each driver registers one or more Resource instances with the + * ResMan using ResMan_Register(). + * + * Clients can then allocate the resource through ResMan_Alloc() + * providing a desired priority and an Observer for asynchronous + * notification. + * + * Allocated resources can be stolen by other clients asking for a + * higher priority. ResMan notifies a preemption request by invoking + * the Observer of the current owner. + * + * The Observer callback must take whatever action is needed to + * release the resource as soon as possible to avoid blocking the + * new owner. + */ +typedef struct Resource +{ +//Private + /// Control access to fields below. + Semaphore lock; + + /// Pointer to current owner's observer. NULL if resource is free. + struct Observer *owner; + + /// Priority of current owner (higher values mean higher priority). + int pri; + + /// Queue of processes waiting to obtain the resource. + List queue; +} Resource; + +/// Event sent by ResMan to owners when to request resource release. +enum { EVENT_RELEASE = 1 }; + +/// Try to allocate a resource \a res with priority \a pri for at most \a timeout ticks. +bool ResMan_Alloc(Resource *res, int pri, ResMan_time_t timeout, struct Observer *releaseRequest); + +/// Free resource \a res. Will eventually wake-up other queued owners. +void ResMan_Free(Resource *res); + +void ResMan_Init(Resource *res); + +#endif /* MWARE_RESOURCE_H */ diff --git a/2.5/bertos/mware/rle.h b/2.5/bertos/mware/rle.h new file mode 100644 index 00000000..0ca9a28d --- /dev/null +++ b/2.5/bertos/mware/rle.h @@ -0,0 +1,2 @@ +#warning This header is OBSOLETE +#include diff --git a/2.5/bertos/mware/sprintf.c b/2.5/bertos/mware/sprintf.c new file mode 100644 index 00000000..158012fd --- /dev/null +++ b/2.5/bertos/mware/sprintf.c @@ -0,0 +1,158 @@ +/** + * \file + * + * + * \brief sprintf() implementation based on _formatted_write() + * + * \version $Id$ + * \author Bernie Innocenti + * + * $WIZ$ module_name = "sprintf" + * $WIZ$ module_depends = "formatwr" + * $WIZ$ module_harvard = "both" + */ + +#include +#include +#include + +#include + + +static void __str_put_char(char c, void *ptr) +{ + /* + * This Does not work on Code Warrior. Hmm... + * *(*((char **)ptr))++ = c; + */ + + **((char **)ptr) = c; + (*((char **)ptr))++; +} + +static void __null_put_char(UNUSED_ARG(char, c), UNUSED_ARG(void *, ptr)) +{ + /* nop */ +} + + +int PGM_FUNC(vsprintf)(char *str, const char * PGM_ATTR fmt, va_list ap) +{ + int result; + + if (str) + { + result = PGM_FUNC(_formatted_write)(fmt, __str_put_char, &str, ap); + + /* Terminate string */ + *str = '\0'; + } + else + result = PGM_FUNC(_formatted_write)(fmt, __null_put_char, 0, ap); + + + return result; +} + + +int PGM_FUNC(sprintf)(char *str, const char * fmt, ...) +{ + int result; + va_list ap; + + va_start(ap, fmt); + result = PGM_FUNC(vsprintf)(str, fmt, ap); + va_end(ap); + + return result; +} + +/** + * State information for __sn_put_char() + */ +struct __sn_state +{ + char *str; + size_t len; +}; + +/** + * formatted_write() callback used [v]snprintf(). + */ +static void __sn_put_char(char c, void *ptr) +{ + struct __sn_state *state = (struct __sn_state *)ptr; + + if (state->len) + { + --state->len; + *state->str++ = c; + } +} + + +int PGM_FUNC(vsnprintf)(char *str, size_t size, const char * PGM_ATTR fmt, va_list ap) +{ + int result = 0; + + /* Make room for traling '\0'. */ + if (size--) + { + if (str) + { + struct __sn_state state; + state.str = str; + state.len = size; + + result = PGM_FUNC(_formatted_write)(fmt, __sn_put_char, &state, ap); + + /* Terminate string. */ + *state.str = '\0'; + } + else + result = PGM_FUNC(_formatted_write)(fmt, __null_put_char, 0, ap); + } + + return result; +} + + +int PGM_FUNC(snprintf)(char *str, size_t size, const char * fmt, ...) +{ + int result; + va_list ap; + + va_start(ap, fmt); + result = PGM_FUNC(vsnprintf)(str, size, fmt, ap); + va_end(ap); + + return result; +} diff --git a/2.5/bertos/mware/sprintf_test.c b/2.5/bertos/mware/sprintf_test.c new file mode 100644 index 00000000..eba0da66 --- /dev/null +++ b/2.5/bertos/mware/sprintf_test.c @@ -0,0 +1,115 @@ +/** + * \file + * + * + * notest: avr + * notest: arm + * \brief sprintf() implementation based on _formatted_write() + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#include "formatwr.h" +#include +#include +#include + +#include + +#include + +#include /* strcmp() */ + + +int sprintf_testSetup(void) +{ + kdbg_init(); + return 0; +} + +int sprintf_testRun(void) +{ + char buf[256]; + static const char test_string[] = "Hello, world!\n"; + static const pgm_char test_string_pgm[] = "Hello, world!\n"; + + snprintf(buf, sizeof buf, "%s", test_string); + if (strcmp(buf, test_string) != 0) + return 1; + + snprintf(buf, sizeof buf, "%S", (const wchar_t *)test_string_pgm); + if (strcmp(buf, test_string_pgm) != 0) + return 2; + + #define TEST(FMT, VALUE, EXPECT) do { \ + snprintf(buf, sizeof buf, FMT, VALUE); \ + if (strcmp(buf, EXPECT) != 0) \ + return -1; \ + } while (0) + + TEST("%d", 12345, "12345"); + TEST("%ld", 123456789L, "123456789"); + TEST("%ld", -12345678L, "-12345678"); + TEST("%lu", 4294967295UL, "4294967295"); + TEST("%hd", -12345, "-12345"); + TEST("%hu", 65535U, "65535"); + + TEST("%8d", 123, " 123"); + TEST("%8d", -123, " -123"); + TEST("%-8d", -123, "-123 "); + TEST("%08d", -123, "-0000123"); + + TEST("%8.2f", -123.456, " -123.46"); + TEST("%-8.2f", -123.456, "-123.46 "); + TEST("%8.0f", -123.456, " -123"); + + + /* + * Stress tests. + */ + snprintf(buf, sizeof buf, "%s", (char *)(NULL)); + if (strcmp(buf, "") != 0) + return 3; + snprintf(buf, sizeof buf, "%k"); + if (strcmp(buf, "???") != 0) + return 4; + sprintf(NULL, test_string); /* must not crash */ + + return 0; +} + +int sprintf_testTearDown(void) +{ + return 0; +} + +TEST_MAIN(sprintf); diff --git a/2.5/bertos/mware/strtol10.c b/2.5/bertos/mware/strtol10.c new file mode 100644 index 00000000..3fac2e2c --- /dev/null +++ b/2.5/bertos/mware/strtol10.c @@ -0,0 +1,100 @@ +/** + * \file + * + * + * \brief Poor man's hex arrays (implementation). + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#include "strtol10.h" + +/** + * Convert a formatted base-10 ASCII number to unsigned long binary representation. + * + * Unlike the standard strtoul(), this function has an interface + * that makes it better suited for protocol parsers. It's also + * much simpler and smaller than a full featured strtoul(). + * + * \param first Pointer to first byte of input range (STL-style). + * \param last Pointer to end of input range (STL-style). + * Pass NULL to parse up to the first \\0. + * \param val Pointer to converted value. + * + * \return true for success, false for failure. + * + * \see strtol10() + */ +bool strtoul10(const char *first, const char *last, unsigned long *val) +{ + // Check for no input + if (*first == '\0') + return false; + + *val = 0; + for(/*nop*/; first != last && *first != '\0'; ++first) + { + if ((*first < '0') || (*first > '9')) + return false; + + *val = (*val * 10L) + (*first - '0'); + } + + return true; +} + + +/** + * Convert a formatted base-10 ASCII number to signed long binary representation. + * + * \see strtoul10() + */ +bool strtol10(const char *first, const char *last, long *val) +{ + bool negative = false; + + if (*first == '+') + ++first; /* skip unary plus sign */ + else if (*first == '-') + { + negative = true; + ++first; + } + + bool result = strtoul10(first, last, (unsigned long *)val); + + if (negative) + *val = - *val; + + return result; +} + diff --git a/2.5/bertos/mware/strtol10.h b/2.5/bertos/mware/strtol10.h new file mode 100644 index 00000000..8c191cf9 --- /dev/null +++ b/2.5/bertos/mware/strtol10.h @@ -0,0 +1,66 @@ +/** + * \file + * + * + * \brief Poor man's hex arrays (implementation). + * + * \version $Id$ + * \author Bernie Innocenti + */ + + +#ifndef MWARE_STRTOL10_H +#define MWARE_STRTOL10_H + +#include /* bool */ + +bool strtoul10(const char *first, const char *last, unsigned long *val); +bool strtol10(const char *first, const char *last, long *val); + +/** + * Replacement for standard library function atol(). + */ +INLINE long atol(const char *str) +{ + long val; + strtol10(str, NULL, &val); + return val; +} + +/** + * Replacement for standard library function atoi(). + */ +INLINE int atoi(const char *str) +{ + return (int)atol(str); +} + +#endif /* MWARE_STRTOL10_H */ diff --git a/2.5/bertos/net/afsk.c b/2.5/bertos/net/afsk.c new file mode 100644 index 00000000..0db7956a --- /dev/null +++ b/2.5/bertos/net/afsk.c @@ -0,0 +1,571 @@ +/** + * \file + * + * + * \brief AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#include "afsk.h" +#include + +#include "cfg/cfg_afsk.h" +#include "hw/hw_afsk.h" + +#include + +#include + +#define LOG_LEVEL AFSK_LOG_LEVEL +#define LOG_FORMAT AFSK_LOG_FORMAT +#include + +#include +#include +#include + +#include /* memset */ + +#define PHASE_BIT 8 +#define PHASE_INC 1 + +#define PHASE_MAX (SAMPLEPERBIT * PHASE_BIT) +#define PHASE_THRES (PHASE_MAX / 2) // - PHASE_BIT / 2) + +// Modulator constants +#define MARK_FREQ 1200 +#define MARK_INC (uint16_t)(DIV_ROUND(SIN_LEN * (uint32_t)MARK_FREQ, CONFIG_AFSK_DAC_SAMPLERATE)) + +#define SPACE_FREQ 2200 +#define SPACE_INC (uint16_t)(DIV_ROUND(SIN_LEN * (uint32_t)SPACE_FREQ, CONFIG_AFSK_DAC_SAMPLERATE)) + +//Ensure sample rate is a multiple of bit rate +STATIC_ASSERT(!(CONFIG_AFSK_DAC_SAMPLERATE % BITRATE)); + +#define DAC_SAMPLEPERBIT (CONFIG_AFSK_DAC_SAMPLERATE / BITRATE) + +/** + * Sine table for the first quarter of wave. + * The rest of the wave is computed from this first quarter. + * This table is used to generate the modulated data. + */ +static const uint8_t PROGMEM sin_table[] = +{ + 128, 129, 131, 132, 134, 135, 137, 138, 140, 142, 143, 145, 146, 148, 149, 151, + 152, 154, 155, 157, 158, 160, 162, 163, 165, 166, 167, 169, 170, 172, 173, 175, + 176, 178, 179, 181, 182, 183, 185, 186, 188, 189, 190, 192, 193, 194, 196, 197, + 198, 200, 201, 202, 203, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 234, 235, 236, 237, 238, 238, 239, 240, 241, 241, 242, 243, 243, 244, 245, + 245, 246, 246, 247, 248, 248, 249, 249, 250, 250, 250, 251, 251, 252, 252, 252, + 253, 253, 253, 253, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, +}; + +#define SIN_LEN 512 ///< Full wave length + +STATIC_ASSERT(sizeof(sin_table) == SIN_LEN / 4); + + +/** + * Given the index, this function computes the correct sine sample + * based only on the first quarter of wave. + */ +INLINE uint8_t sin_sample(uint16_t idx) +{ + ASSERT(idx < SIN_LEN); + uint16_t new_idx = idx % (SIN_LEN / 2); + new_idx = (new_idx >= (SIN_LEN / 4)) ? (SIN_LEN / 2 - new_idx - 1) : new_idx; + + #if CPU_HARVARD + uint8_t data = pgm_read_char(&sin_table[new_idx]); + #else + uint8_t data = sin_table[new_idx]; + #endif + + return (idx >= (SIN_LEN / 2)) ? (255 - data) : data; +} + + +#define BIT_DIFFER(bitline1, bitline2) (((bitline1) ^ (bitline2)) & 0x01) +#define EDGE_FOUND(bitline) BIT_DIFFER((bitline), (bitline) >> 1) + +/** + * High-Level Data Link Control parsing function. + * Parse bitstream in order to find characters. + * + * \param hdlc HDLC context. + * \param bit current bit to be parsed. + * \param fifo FIFO buffer used to push characters. + * + * \return true if all is ok, false if the fifo is full. + */ +static bool hdlc_parse(Hdlc *hdlc, bool bit, FIFOBuffer *fifo) +{ + bool ret = true; + + hdlc->demod_bits <<= 1; + hdlc->demod_bits |= bit ? 1 : 0; + + /* HDLC Flag */ + if (hdlc->demod_bits == HDLC_FLAG) + { + if (!fifo_isfull(fifo)) + { + fifo_push(fifo, HDLC_FLAG); + hdlc->rxstart = true; + } + else + { + ret = false; + hdlc->rxstart = false; + } + + hdlc->currchar = 0; + hdlc->bit_idx = 0; + return ret; + } + + /* Reset */ + if ((hdlc->demod_bits & HDLC_RESET) == HDLC_RESET) + { + hdlc->rxstart = false; + return ret; + } + + if (!hdlc->rxstart) + return ret; + + /* Stuffed bit */ + if ((hdlc->demod_bits & 0x3f) == 0x3e) + return ret; + + if (hdlc->demod_bits & 0x01) + hdlc->currchar |= 0x80; + + if (++hdlc->bit_idx >= 8) + { + if ((hdlc->currchar == HDLC_FLAG + || hdlc->currchar == HDLC_RESET + || hdlc->currchar == AX25_ESC)) + { + if (!fifo_isfull(fifo)) + fifo_push(fifo, AX25_ESC); + else + { + hdlc->rxstart = false; + ret = false; + } + } + + if (!fifo_isfull(fifo)) + fifo_push(fifo, hdlc->currchar); + else + { + hdlc->rxstart = false; + ret = false; + } + + hdlc->currchar = 0; + hdlc->bit_idx = 0; + } + else + hdlc->currchar >>= 1; + + return ret; +} + + +/** + * ADC ISR callback. + * This function has to be called by the ADC ISR when a sample of the configured + * channel is available. + * \param af Afsk context to operate on. + * \param curr_sample current sample from the ADC. + */ +void afsk_adc_isr(Afsk *af, int8_t curr_sample) +{ + AFSK_STROBE_ON(); + + /* + * Frequency discriminator and LP IIR filter. + * This filter is designed to work + * at the given sample rate and bit rate. + */ + STATIC_ASSERT(SAMPLERATE == 9600); + STATIC_ASSERT(BITRATE == 1200); + + /* + * Frequency discrimination is achieved by simply multiplying + * the sample with a delayed sample of (samples per bit) / 2. + * Then the signal is lowpass filtered with a first order, + * 600 Hz filter. The filter implementation is selectable + * through the CONFIG_AFSK_FILTER config variable. + */ + + af->iir_x[0] = af->iir_x[1]; + + #if (CONFIG_AFSK_FILTER == AFSK_BUTTERWORTH) + af->iir_x[1] = ((int8_t)fifo_pop(&af->delay_fifo) * curr_sample) >> 2; + //af->iir_x[1] = ((int8_t)fifo_pop(&af->delay_fifo) * curr_sample) / 6.027339492; + #elif (CONFIG_AFSK_FILTER == AFSK_CHEBYSHEV) + af->iir_x[1] = ((int8_t)fifo_pop(&af->delay_fifo) * curr_sample) >> 2; + //af->iir_x[1] = ((int8_t)fifo_pop(&af->delay_fifo) * curr_sample) / 3.558147322; + #else + #error Filter type not found! + #endif + + af->iir_y[0] = af->iir_y[1]; + + #if CONFIG_AFSK_FILTER == AFSK_BUTTERWORTH + /* + * This strange sum + shift is an optimization for af->iir_y[0] * 0.668. + * iir * 0.668 ~= (iir * 21) / 32 = + * = (iir * 16) / 32 + (iir * 4) / 32 + iir / 32 = + * = iir / 2 + iir / 8 + iir / 32 = + * = iir >> 1 + iir >> 3 + iir >> 5 + */ + af->iir_y[1] = af->iir_x[0] + af->iir_x[1] + (af->iir_y[0] >> 1) + (af->iir_y[0] >> 3) + (af->iir_y[0] >> 5); + //af->iir_y[1] = af->iir_x[0] + af->iir_x[1] + af->iir_y[0] * 0.6681786379; + #elif CONFIG_AFSK_FILTER == AFSK_CHEBYSHEV + /* + * This should be (af->iir_y[0] * 0.438) but + * (af->iir_y[0] >> 1) is a faster approximation :-) + */ + af->iir_y[1] = af->iir_x[0] + af->iir_x[1] + (af->iir_y[0] >> 1); + //af->iir_y[1] = af->iir_x[0] + af->iir_x[1] + af->iir_y[0] * 0.4379097269; + #endif + + /* Save this sampled bit in a delay line */ + af->sampled_bits <<= 1; + af->sampled_bits |= (af->iir_y[1] > 0) ? 1 : 0; + + /* Store current ADC sample in the af->delay_fifo */ + fifo_push(&af->delay_fifo, curr_sample); + + /* If there is an edge, adjust phase sampling */ + if (EDGE_FOUND(af->sampled_bits)) + { + if (af->curr_phase < PHASE_THRES) + af->curr_phase += PHASE_INC; + else + af->curr_phase -= PHASE_INC; + } + af->curr_phase += PHASE_BIT; + + /* sample the bit */ + if (af->curr_phase >= PHASE_MAX) + { + af->curr_phase %= PHASE_MAX; + + /* Shift 1 position in the shift register of the found bits */ + af->found_bits <<= 1; + + /* + * Determine bit value by reading the last 3 sampled bits. + * If the number of ones is two or greater, the bit value is a 1, + * otherwise is a 0. + * This algorithm presumes that there are 8 samples per bit. + */ + STATIC_ASSERT(SAMPLEPERBIT == 8); + uint8_t bits = af->sampled_bits & 0x07; + if (bits == 0x07 // 111, 3 bits set to 1 + || bits == 0x06 // 110, 2 bits + || bits == 0x05 // 101, 2 bits + || bits == 0x03 // 011, 2 bits + ) + af->found_bits |= 1; + + /* + * NRZI coding: if 2 consecutive bits have the same value + * a 1 is received, otherwise it's a 0. + */ + if (!hdlc_parse(&af->hdlc, !EDGE_FOUND(af->found_bits), &af->rx_fifo)) + af->status |= AFSK_RXFIFO_OVERRUN; + } + + + AFSK_STROBE_OFF(); +} + +static void afsk_txStart(Afsk *af) +{ + if (!af->sending) + { + af->phase_inc = MARK_INC; + af->phase_acc = 0; + af->stuff_cnt = 0; + af->sending = true; + af->preamble_len = DIV_ROUND(CONFIG_AFSK_PREAMBLE_LEN * BITRATE, 8000); + AFSK_DAC_IRQ_START(af->dac_ch); + } + ATOMIC(af->trailer_len = DIV_ROUND(CONFIG_AFSK_TRAILER_LEN * BITRATE, 8000)); +} + +#define BIT_STUFF_LEN 5 + +#define SWITCH_TONE(inc) (((inc) == MARK_INC) ? SPACE_INC : MARK_INC) + +/** + * DAC ISR callback. + * This function has to be called by the DAC ISR when a sample of the configured + * channel has been converted out. + * + * \param af Afsk context to operate on. + * + * \return The next DAC output sample. + */ +uint8_t afsk_dac_isr(Afsk *af) +{ + AFSK_STROBE_ON(); + + /* Check if we are at a start of a sample cycle */ + if (af->sample_count == 0) + { + if (af->tx_bit == 0) + { + /* We have just finished transimitting a char, get a new one. */ + if (fifo_isempty(&af->tx_fifo) && af->trailer_len == 0) + { + AFSK_DAC_IRQ_STOP(af->dac_ch); + af->sending = false; + AFSK_STROBE_OFF(); + return 0; + } + else + { + /* + * If we have just finished sending an unstuffed byte, + * reset bitstuff counter. + */ + if (!af->bit_stuff) + af->stuff_cnt = 0; + + af->bit_stuff = true; + + /* + * Handle preamble and trailer + */ + if (af->preamble_len == 0) + { + if (fifo_isempty(&af->tx_fifo)) + { + af->trailer_len--; + af->curr_out = HDLC_FLAG; + } + else + af->curr_out = fifo_pop(&af->tx_fifo); + } + else + { + af->preamble_len--; + af->curr_out = HDLC_FLAG; + } + + /* Handle char escape */ + if (af->curr_out == AX25_ESC) + { + if (fifo_isempty(&af->tx_fifo)) + { + AFSK_DAC_IRQ_STOP(af->dac_ch); + af->sending = false; + AFSK_STROBE_OFF(); + return 0; + } + else + af->curr_out = fifo_pop(&af->tx_fifo); + } + else if (af->curr_out == HDLC_FLAG || af->curr_out == HDLC_RESET) + /* If these chars are not escaped disable bit stuffing */ + af->bit_stuff = false; + } + /* Start with LSB mask */ + af->tx_bit = 0x01; + } + + /* check for bit stuffing */ + if (af->bit_stuff && af->stuff_cnt >= BIT_STUFF_LEN) + { + /* If there are more than 5 ones in a row insert a 0 */ + af->stuff_cnt = 0; + /* switch tone */ + af->phase_inc = SWITCH_TONE(af->phase_inc); + } + else + { + /* + * NRZI: if we want to transmit a 1 the modulated frequency will stay + * unchanged; with a 0, there will be a change in the tone. + */ + if (af->curr_out & af->tx_bit) + { + /* + * Transmit a 1: + * - Stay on the previous tone + * - Increase bit stuff counter + */ + af->stuff_cnt++; + } + else + { + /* + * Transmit a 0: + * - Reset bit stuff counter + * - Switch tone + */ + af->stuff_cnt = 0; + af->phase_inc = SWITCH_TONE(af->phase_inc); + } + + /* Go to the next bit */ + af->tx_bit <<= 1; + } + af->sample_count = DAC_SAMPLEPERBIT; + } + + /* Get new sample and put it out on the DAC */ + af->phase_acc += af->phase_inc; + af->phase_acc %= SIN_LEN; + + af->sample_count--; + AFSK_STROBE_OFF(); + return sin_sample(af->phase_acc); +} + + +static size_t afsk_read(KFile *fd, void *_buf, size_t size) +{ + Afsk *af = AFSK_CAST(fd); + uint8_t *buf = (uint8_t *)_buf; + + #if CONFIG_AFSK_RXTIMEOUT == 0 + while (size-- && !fifo_isempty_locked(&af->rx_fifo)) + #else + while (size--) + #endif + { + #if CONFIG_AFSK_RXTIMEOUT != -1 + ticks_t start = timer_clock(); + #endif + + while (fifo_isempty_locked(&af->rx_fifo)) + { + cpu_relax(); + #if CONFIG_AFSK_RXTIMEOUT != -1 + if (timer_clock() - start > ms_to_ticks(CONFIG_AFSK_RXTIMEOUT)) + return buf - (uint8_t *)_buf; + #endif + } + + *buf++ = fifo_pop_locked(&af->rx_fifo); + } + + return buf - (uint8_t *)_buf; +} + +static size_t afsk_write(KFile *fd, const void *_buf, size_t size) +{ + Afsk *af = AFSK_CAST(fd); + const uint8_t *buf = (const uint8_t *)_buf; + + while (size--) + { + while (fifo_isfull_locked(&af->tx_fifo)) + cpu_relax(); + + fifo_push_locked(&af->tx_fifo, *buf++); + afsk_txStart(af); + } + + return buf - (const uint8_t *)_buf; +} + +static int afsk_flush(KFile *fd) +{ + Afsk *af = AFSK_CAST(fd); + while (af->sending) + cpu_relax(); + return 0; +} + +static int afsk_error(KFile *fd) +{ + Afsk *af = AFSK_CAST(fd); + int err; + + ATOMIC(err = af->status); + return err; +} + +static void afsk_clearerr(KFile *fd) +{ + Afsk *af = AFSK_CAST(fd); + ATOMIC(af->status = 0); +} + + +/** + * Initialize an AFSK1200 modem. + * \param af Afsk context to operate on. + * \param adc_ch ADC channel used by the demodulator. + * \param dac_ch DAC channel used by the modulator. + */ +void afsk_init(Afsk *af, int adc_ch, int dac_ch) +{ + #if CONFIG_AFSK_RXTIMEOUT != -1 + MOD_CHECK(timer); + #endif + memset(af, 0, sizeof(*af)); + af->adc_ch = adc_ch; + af->dac_ch = dac_ch; + + fifo_init(&af->delay_fifo, (uint8_t *)af->delay_buf, sizeof(af->delay_buf)); + fifo_init(&af->rx_fifo, af->rx_buf, sizeof(af->rx_buf)); + + /* Fill sample FIFO with 0 */ + for (int i = 0; i < SAMPLEPERBIT / 2; i++) + fifo_push(&af->delay_fifo, 0); + + fifo_init(&af->tx_fifo, af->tx_buf, sizeof(af->tx_buf)); + + AFSK_ADC_INIT(adc_ch, af); + AFSK_DAC_INIT(dac_ch, af); + AFSK_STROBE_INIT(); + LOG_INFO("MARK_INC %d, SPACE_INC %d\n", MARK_INC, SPACE_INC); + + DB(af->fd._type = KFT_AFSK); + af->fd.write = afsk_write; + af->fd.read = afsk_read; + af->fd.flush = afsk_flush; + af->fd.error = afsk_error; + af->fd.clearerr = afsk_clearerr; + af->phase_inc = MARK_INC; +} diff --git a/2.5/bertos/net/afsk.h b/2.5/bertos/net/afsk.h new file mode 100644 index 00000000..57d3da8e --- /dev/null +++ b/2.5/bertos/net/afsk.h @@ -0,0 +1,224 @@ +/** + * \file + * + * + * \brief AFSK1200 modem. + * + * \author Francesco Sacchi + * + * $WIZ$ module_name = "afsk" + * $WIZ$ module_configuration = "bertos/cfg/cfg_afsk.h" + * $WIZ$ module_depends = "timer", "kfile" + * $WIZ$ module_hw = "bertos/hw/hw_afsk.h" + */ + +#ifndef NET_AFSK_H +#define NET_AFSK_H + +#include "cfg/cfg_afsk.h" +#include "hw/hw_afsk.h" + +#include +#include +#include + + + +/** + * ADC sample rate. + * The demodulator filters are designed to work at this frequency. + * If you need to change this remember to update afsk_adc_isr(). + */ +#define SAMPLERATE 9600 + +/** + * Bitrate of the received/transmitted data. + * The demodulator filters and decoderes are designed to work at this frequency. + * If you need to change this remember to update afsk_adc_isr(). + */ +#define BITRATE 1200 + +#define SAMPLEPERBIT (SAMPLERATE / BITRATE) + +/** + * HDLC (High-Level Data Link Control) context. + * Maybe to be moved in a separate HDLC module one day. + */ +typedef struct Hdlc +{ + uint8_t demod_bits; ///< Bitstream from the demodulator. + uint8_t bit_idx; ///< Current received bit. + uint8_t currchar; ///< Current received character. + bool rxstart; ///< True if an HDLC_FLAG char has been found in the bitstream. +} Hdlc; + +/** + * RX FIFO buffer full error. + */ +#define AFSK_RXFIFO_OVERRUN BV(0) + +/** + * AFSK1200 modem context. + */ +typedef struct Afsk +{ + /** Base "class" */ + KFile fd; + + /** ADC channel to be used by the demodulator */ + int adc_ch; + + /** DAC channel to be used by the modulator */ + int dac_ch; + + /** Current sample of bit for output data. */ + uint8_t sample_count; + + /** Current character to be modulated */ + uint8_t curr_out; + + /** Mask of current modulated bit */ + uint8_t tx_bit; + + /** True if bit stuff is allowed, false otherwise */ + bool bit_stuff; + + /** Counter for bit stuffing */ + uint8_t stuff_cnt; + /** + * DDS phase accumulator for generating modulated data. + */ + uint16_t phase_acc; + + /** Current phase increment for current modulated bit */ + uint16_t phase_inc; + + /** Delay line used to delay samples by (SAMPLEPERBIT / 2) */ + FIFOBuffer delay_fifo; + + /** + * Buffer for delay FIFO. + * The 1 is added because the FIFO macros need + * 1 byte more to handle a buffer (SAMPLEPERBIT / 2) bytes long. + */ + int8_t delay_buf[SAMPLEPERBIT / 2 + 1]; + + /** FIFO for received data */ + FIFOBuffer rx_fifo; + + /** FIFO rx buffer */ + uint8_t rx_buf[CONFIG_AFSK_RX_BUFLEN]; + + /** FIFO for transmitted data */ + FIFOBuffer tx_fifo; + + /** FIFO tx buffer */ + uint8_t tx_buf[CONFIG_AFSK_TX_BUFLEN]; + + /** IIR filter X cells, used to filter sampled data by the demodulator */ + int16_t iir_x[2]; + + /** IIR filter Y cells, used to filter sampled data by the demodulator */ + int16_t iir_y[2]; + + /** + * Bits sampled by the demodulator are here. + * Since ADC samplerate is higher than the bitrate, the bits here are + * SAMPLEPERBIT times the bitrate. + */ + uint8_t sampled_bits; + + /** + * Current phase, needed to know when the bitstream at ADC speed + * should be sampled. + */ + int8_t curr_phase; + + /** Bits found by the demodulator at the correct bitrate speed. */ + uint8_t found_bits; + + /** True while modem sends data */ + volatile bool sending; + + /** + * AFSK modem status. + * If 0 all is ok, otherwise errors are present. + */ + volatile int status; + + /** Hdlc context */ + Hdlc hdlc; + + /** + * Preamble length. + * When the AFSK modem wants to send data, before sending the actual data, + * shifts out preamble_len HDLC_FLAG characters. + * This helps to synchronize the demodulator filters on the receiver side. + */ + uint16_t preamble_len; + + /** + * Trailer length. + * After sending the actual data, the AFSK shifts out + * trailer_len HDLC_FLAG characters. + * This helps to synchronize the demodulator filters on the receiver side. + */ + uint16_t trailer_len; +} Afsk; + +#define KFT_AFSK MAKE_ID('A', 'F', 'S', 'K') + +INLINE Afsk *AFSK_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_AFSK); + return (Afsk *)fd; +} + + +void afsk_adc_isr(Afsk *af, int8_t sample); +uint8_t afsk_dac_isr(Afsk *af); +void afsk_init(Afsk *af, int adc_ch, int dac_ch); + + +/** + * \name Afsk filter types. + * $WIZ$ afsk_filter_list = "AFSK_BUTTERWORTH", "AFSK_CHEBYSHEV" + * \{ + */ +#define AFSK_BUTTERWORTH 0 +#define AFSK_CHEBYSHEV 1 +/* \} */ + +int afsk_testSetup(void); +int afsk_testRun(void); +int afsk_testTearDown(void); + +#endif /* NET_AFSK_H */ diff --git a/2.5/bertos/net/afsk_test.c b/2.5/bertos/net/afsk_test.c new file mode 100644 index 00000000..cd434084 --- /dev/null +++ b/2.5/bertos/net/afsk_test.c @@ -0,0 +1,223 @@ +/** + * \file + * + * + * \brief AFSK demodulator test. + * + * \version $Id$ + * \author Francesco Sacchi + * $test$: cp bertos/cfg/cfg_ax25.h $cfgdir/ + * $test$: echo "#undef AX25_LOG_LEVEL" >> $cfgdir/cfg_ax25.h + * $test$: echo "#define AX25_LOG_LEVEL LOG_LVL_INFO" >> $cfgdir/cfg_ax25.h + * $test$: cp bertos/cfg/cfg_afsk.h $cfgdir/ + * $test$: echo "#undef CONFIG_AFSK_TX_BUFLEN" >> $cfgdir/cfg_afsk.h + * $test$: echo "#define CONFIG_AFSK_TX_BUFLEN 512" >> $cfgdir/cfg_afsk.h + */ + + +#include "afsk.h" +#include "cfg/cfg_afsk.h" + +#include +#include + +#include +#include +#include + +#include + +#include +#include + +FILE *fp_adc; +FILE *fp_dac; +uint32_t data_size; +uint32_t data_written; +Afsk afsk_fd; +AX25Ctx ax25; +KFileDebug dbg; + +int msg_cnt; +static void message_hook(struct AX25Msg *msg) +{ + msg_cnt++; + ax25_print(&dbg.fd, msg); +} + +static FILE *afsk_fileOpen(const char *name) +{ + FILE *fp = 0; + #if CPU_AVR + (void)name; + #warning TODO: open the file? + #else + fp = fopen(name, "rb"); + #endif + ASSERT(fp); + + char snd[5]; + ASSERT(fread(snd, 1, 4, fp) == 4); + snd[4] = 0; + ASSERT(strcmp(snd, ".snd") == 0); + + uint32_t offset; + ASSERT(fread(&offset, 1, sizeof(offset), fp) == sizeof(offset)); + offset = be32_to_cpu(offset); + kprintf("AU file offset: %ld\n", (long)offset); + ASSERT(offset >= 24); + + ASSERT(fread(&data_size, 1, sizeof(data_size), fp) == sizeof(data_size)); + data_size = be32_to_cpu(data_size); + kprintf("AU file data_size: %ld\n", (long)data_size); + ASSERT(data_size); + + uint32_t encoding; + ASSERT(fread(&encoding, 1, sizeof(encoding), fp) == sizeof(encoding)); + encoding = be32_to_cpu(encoding); + kprintf("AU file encoding: %ld\n", (long)encoding); + ASSERT(encoding == 2); // 8 bit linear PCM + + uint32_t sample_rate; + ASSERT(fread(&sample_rate, 1, sizeof(sample_rate), fp) == sizeof(sample_rate)); + sample_rate = be32_to_cpu(sample_rate); + kprintf("AU file sample_rate: %ld\n", (long)sample_rate); + ASSERT(sample_rate == 9600); + + uint32_t channels; + ASSERT(fread(&channels, 1, sizeof(channels), fp) == sizeof(channels)); + channels = be32_to_cpu(channels); + kprintf("AU file channels: %ld\n", (long)channels); + ASSERT(channels == 1); + + #if CPU_AVR + #warning TODO: fseek? + #else + ASSERT(fseek(fp, offset, SEEK_SET) == 0); + #endif + return fp; +} + +int afsk_testSetup(void) +{ + kdbg_init(); + kfiledebug_init(&dbg); + fp_adc = afsk_fileOpen("test/afsk_test.au"); + #if CPU_AVR + #warning TODO: open the file? + #else + fp_dac = fopen("test/afsk_test_out.au", "w+b"); + #endif + ASSERT(fp_dac); + #define FS_HH (((uint32_t)CONFIG_AFSK_DAC_SAMPLERATE) >> 24) + #define FS_HL ((((uint32_t)CONFIG_AFSK_DAC_SAMPLERATE) >> 16) & 0xff) + #define FS_LH ((((uint32_t)CONFIG_AFSK_DAC_SAMPLERATE) >> 8) & 0xff) + #define FS_LL (((uint32_t)CONFIG_AFSK_DAC_SAMPLERATE) & 0xff) + + uint8_t snd_header[] = { '.','s','n','d', 0,0,0,24, 0,0,0,0, 0,0,0,2, FS_HH,FS_HL,FS_LH,FS_LL, 0,0,0,1}; + + ASSERT(fwrite(snd_header, 1, sizeof(snd_header), fp_dac) == sizeof(snd_header)); + + timer_init(); + afsk_init(&afsk_fd, 0 ,0); + ax25_init(&ax25, &afsk_fd.fd, message_hook); + return 0; +} + + +static void messageout_hook(struct AX25Msg *msg) +{ + ASSERT(strncmp(msg->dst.call, "ABCDEF", 6) == 0); + ASSERT(strncmp(msg->src.call, "123456", 6) == 0); + ASSERT(msg->src.ssid == 1); + ASSERT(msg->dst.ssid == 0); + ASSERT(msg->ctrl == AX25_CTRL_UI); + ASSERT(msg->pid == AX25_PID_NOLAYER3); + ASSERT(msg->len == 256); + for (int i = 0; i < 256; i++) + ASSERT(msg->info[i] == i); +} + +int afsk_testRun(void) +{ + int c; + while ((c = fgetc(fp_adc)) != EOF) + { + afsk_adc_isr(&afsk_fd, (int8_t)c); + + ax25_poll(&ax25); + } + kprintf("Messages correctly received: %d\n", msg_cnt); + ASSERT(msg_cnt >= 15); + + char buf[256]; + for (unsigned i = 0; i < sizeof(buf); i++) + buf[i] = i; + + ax25_send(&ax25, AX25_CALL("abcdef", 0), AX25_CALL("123456", 1), buf, sizeof(buf)); + + do + { + int8_t val = afsk_dac_isr(&afsk_fd) - 128; + ASSERT(fwrite(&val, 1, sizeof(val), fp_dac) == sizeof(val)); + data_written++; + } + while (afsk_fd.sending); + + #define SND_DATASIZE_OFF 8 + #if CPU_AVR + #warning TODO: fseek? + #else + ASSERT(fseek(fp_dac, SND_DATASIZE_OFF, SEEK_SET) == 0); + #endif + data_written = cpu_to_be32(data_written); + ASSERT(fwrite(&data_written, 1, sizeof(data_written), fp_dac) == sizeof(data_written)); + ASSERT(fclose(fp_adc) + fclose(fp_dac) == 0); + + fp_adc = afsk_fileOpen("test/afsk_test_out.au"); + ax25_init(&ax25, &afsk_fd.fd, messageout_hook); + + while ((c = fgetc(fp_adc)) != EOF) + { + afsk_adc_isr(&afsk_fd, (int8_t)c); + + ax25_poll(&ax25); + } + + return 0; +} + +int afsk_testTearDown(void) +{ + return fclose(fp_adc); +} + +TEST_MAIN(afsk); diff --git a/2.5/bertos/net/ax25.c b/2.5/bertos/net/ax25.c new file mode 100644 index 00000000..3d5ac343 --- /dev/null +++ b/2.5/bertos/net/ax25.c @@ -0,0 +1,308 @@ +/** + * \file + * + * \brief Simple AX25 data link layer implementation. + * + * For now, only UI frames without any Layer 3 protocol are handled. + * This however is enough to send/receive APRS packets. + * + * \author Francesco Sacchi + * + */ + +#include "ax25.h" +#include "cfg/cfg_ax25.h" + +#include + +#define LOG_LEVEL AX25_LOG_LEVEL +#define LOG_FORMAT AX25_LOG_FORMAT +#include + +#include //memset, memcmp +#include //isalnum, toupper + +#define DECODE_CALL(buf, addr) \ + for (unsigned i = 0; i < sizeof((addr)); i++) \ + { \ + char c = (*(buf)++ >> 1); \ + (addr)[i] = (c == ' ') ? '\x0' : c; \ + } + +static void ax25_decode(AX25Ctx *ctx) +{ + AX25Msg msg; + uint8_t *buf = ctx->buf; + + DECODE_CALL(buf, msg.dst.call); + msg.dst.ssid = (*buf++ >> 1) & 0x0F; + + DECODE_CALL(buf, msg.src.call); + msg.src.ssid = (*buf >> 1) & 0x0F; + + LOG_INFO("SRC[%.6s-%d], DST[%.6s-%d]\n", msg.src.call, msg.src.ssid, msg.dst.call, msg.dst.ssid); + + /* Repeater addresses */ + #if CONFIG_AX25_RPT_LST + for (msg.rpt_cnt = 0; !(*buf++ & 0x01) && (msg.rpt_cnt < countof(msg.rpt_lst)); msg.rpt_cnt++) + { + DECODE_CALL(buf, msg.rpt_lst[msg.rpt_cnt].call); + msg.rpt_lst[msg.rpt_cnt].ssid = (*buf >> 1) & 0x0F; + LOG_INFO("RPT%d[%.6s-%d]\n", msg.rpt_cnt, msg.rpt_lst[msg.rpt_cnt].call, msg.rpt_lst[msg.rpt_cnt].ssid); + } + #else + while (!(*buf++ & 0x01)) + { + char rpt[6]; + uint8_t ssid; + DECODE_CALL(buf, rpt); + ssid = (*buf >> 1) & 0x0F; + LOG_INFO("RPT[%.6s-%d]\n", rpt, ssid); + } + #endif + + msg.ctrl = *buf++; + if (msg.ctrl != AX25_CTRL_UI) + { + LOG_WARN("Only UI frames are handled, got [%02X]\n", msg.ctrl); + return; + } + + msg.pid = *buf++; + if (msg.pid != AX25_PID_NOLAYER3) + { + LOG_WARN("Only frames without layer3 protocol are handled, got [%02X]\n", msg.pid); + return; + } + + msg.len = ctx->frm_len - 2 - (buf - ctx->buf); + msg.info = buf; + LOG_INFO("DATA: %.*s\n", msg.len, msg.info); + + if (ctx->hook) + ctx->hook(&msg); +} + + +/** + * Check if there are any AX25 messages to be processed. + * This function read available characters from the medium and search for + * any AX25 messages. + * If a message is found it is decoded and the linked callback executed. + * This function may be blocking if there are no available chars and the KFile + * used in \a ctx to access the medium is configured in blocking mode. + * + * \param ctx AX25 context to operate on. + */ +void ax25_poll(AX25Ctx *ctx) +{ + int c; + + while ((c = kfile_getc(ctx->ch)) != EOF) + { + if (!ctx->escape && c == HDLC_FLAG) + { + if (ctx->frm_len >= AX25_MIN_FRAME_LEN) + { + if (ctx->crc_in == AX25_CRC_CORRECT) + { + LOG_INFO("Frame found!\n"); + ax25_decode(ctx); + } + else + { + LOG_INFO("CRC error, computed [%04X]\n", ctx->crc_in); + } + } + ctx->sync = true; + ctx->crc_in = CRC_CCITT_INIT_VAL; + ctx->frm_len = 0; + continue; + } + + if (!ctx->escape && c == HDLC_RESET) + { + LOG_INFO("HDLC reset\n"); + ctx->sync = false; + continue; + } + + if (!ctx->escape && c == AX25_ESC) + { + ctx->escape = true; + continue; + } + + if (ctx->sync) + { + if (ctx->frm_len < CONFIG_AX25_FRAME_BUF_LEN) + { + ctx->buf[ctx->frm_len++] = c; + ctx->crc_in = updcrc_ccitt(c, ctx->crc_in); + } + else + { + LOG_INFO("Buffer overrun"); + ctx->sync = false; + } + } + ctx->escape = false; + } + + if (kfile_error(ctx->ch)) + { + LOG_ERR("Channel error [%04x]\n", kfile_error(ctx->ch)); + kfile_clearerr(ctx->ch); + } +} + +static void ax25_putchar(AX25Ctx *ctx, uint8_t c) +{ + if (c == HDLC_FLAG || c == HDLC_RESET + || c == AX25_ESC) + kfile_putc(AX25_ESC, ctx->ch); + ctx->crc_out = updcrc_ccitt(c, ctx->crc_out); + kfile_putc(c, ctx->ch); +} + +static void ax25_sendCall(AX25Ctx *ctx, const AX25Call *addr, bool last) +{ + unsigned len = MIN(sizeof(addr->call), strlen(addr->call)); + + for (unsigned i = 0; i < len; i++) + { + uint8_t c = addr->call[i]; + ASSERT(isalnum(c) || c == ' '); + c = toupper(c); + ax25_putchar(ctx, c << 1); + } + + /* Fill with spaces the rest of the CALL if it's shorter */ + if (len < sizeof(addr->call)) + for (unsigned i = 0; i < sizeof(addr->call) - len; i++) + ax25_putchar(ctx, ' ' << 1); + + /* The bit0 of last call SSID should be set to 1 */ + uint8_t ssid = addr->ssid << 1 | (last ? 0x01 : 0); + ax25_putchar(ctx, ssid); +} + +/** + * Send an AX25 frame on the channel through a specific path. + * \param ctx AX25 context to operate on. + * \param path An array of callsigns used as path, \see AX25_PATH for + * an handy way to create a path. + * \param path_len callsigns path lenght. + * \param _buf payload buffer. + * \param len length of the payload. + */ +void ax25_sendVia(AX25Ctx *ctx, const AX25Call *path, size_t path_len, const void *_buf, size_t len) +{ + const uint8_t *buf = (const uint8_t *)_buf; + ASSERT(path); + ASSERT(path_len >= 2); + + ctx->crc_out = CRC_CCITT_INIT_VAL; + kfile_putc(HDLC_FLAG, ctx->ch); + + + /* Send call */ + for (size_t i = 0; i < path_len; i++) + ax25_sendCall(ctx, &path[i], (i == path_len - 1)); + + ax25_putchar(ctx, AX25_CTRL_UI); + ax25_putchar(ctx, AX25_PID_NOLAYER3); + + while (len--) + ax25_putchar(ctx, *buf++); + + /* + * According to AX25 protocol, + * CRC is sent in reverse order! + */ + uint8_t crcl = (ctx->crc_out & 0xff) ^ 0xff; + uint8_t crch = (ctx->crc_out >> 8) ^ 0xff; + ax25_putchar(ctx, crcl); + ax25_putchar(ctx, crch); + + ASSERT(ctx->crc_out == AX25_CRC_CORRECT); + + kfile_putc(HDLC_FLAG, ctx->ch); +} + +static void print_call(KFile *ch, const AX25Call *call) +{ + kfile_printf(ch, "%.6s", call->call); + if (call->ssid) + kfile_printf(ch, "-%d", call->ssid); +} + +/** + * Print a AX25 message in TNC-2 packet monitor format. + * \param ch a kfile channel where the message will be printed. + * \param msg the message to be printed. + */ +void ax25_print(KFile *ch, const AX25Msg *msg) +{ + print_call(ch, &msg->src); + kfile_putc('>', ch); + print_call(ch, &msg->dst); + + #if CONFIG_AX25_RPT_LST + for (int i = 0; i < msg->rpt_cnt; i++) + { + kfile_putc(',', ch); + print_call(ch, &msg->rpt_lst[i]); + // TODO: add * to the trasmitting digi + } + #endif + + kfile_printf(ch, ":%.*s\n", msg->len, msg->info); +} + + +/** + * Init the AX25 protocol decoder. + * + * \param ctx AX25 context to init. + * \param channel Used to gain access to the physical medium + * \param hook Callback function called when a message is received + */ +void ax25_init(AX25Ctx *ctx, KFile *channel, ax25_callback_t hook) +{ + ASSERT(ctx); + ASSERT(channel); + + memset(ctx, 0, sizeof(*ctx)); + ctx->ch = channel; + ctx->hook = hook; + ctx->crc_in = ctx->crc_out = CRC_CCITT_INIT_VAL; +} diff --git a/2.5/bertos/net/ax25.h b/2.5/bertos/net/ax25.h new file mode 100644 index 00000000..0e609136 --- /dev/null +++ b/2.5/bertos/net/ax25.h @@ -0,0 +1,188 @@ +/** + * \file + * + * \brief Simple AX25 data link layer implementation. + * + * For now, only UI frames without any Layer 3 protocol are handled. + * This however is enough to send/receive APRS packets. + * + * \version $Id$ + * \author Francesco Sacchi + * + * $WIZ$ module_name = "ax25" + * $WIZ$ module_configuration = "bertos/cfg/cfg_ax25.h" + * $WIZ$ module_depends = "kfile", "crc-ccitt" + */ + + +#ifndef NET_AX25_H +#define NET_AX25_H + +#include "cfg/cfg_ax25.h" + +#include +#include + +/** + * Maximum size of a AX25 frame. + */ +#define AX25_MIN_FRAME_LEN 18 + +/** + * CRC computation on correct AX25 packets should + * give this result (don't ask why). + */ +#define AX25_CRC_CORRECT 0xF0B8 + +struct AX25Msg; // fwd declaration + +/** + * Type for AX25 messages callback. + */ +typedef void (*ax25_callback_t)(struct AX25Msg *msg); + + +/** + * AX25 Protocol context. + */ +typedef struct AX25Ctx +{ + uint8_t buf[CONFIG_AX25_FRAME_BUF_LEN]; ///< buffer for received chars + KFile *ch; ///< KFile used to access the physical medium + size_t frm_len; ///< received frame length. + uint16_t crc_in; ///< CRC for current received frame + uint16_t crc_out; ///< CRC of current sent frame + ax25_callback_t hook; ///< Hook function to be called when a message is received + bool sync; ///< True if we have received a HDLC flag. + bool escape; ///< True when we have to escape the following char. +} AX25Ctx; + + +/** + * AX25 Call sign. + */ +typedef struct AX25Call +{ + char call[6]; ///< Call string, max 6 character + uint8_t ssid; ///< SSID (secondary station ID) for the call +} AX25Call; + +/** + * Create an AX25Call structure on the fly. + * \param str callsign, can be 6 characters or shorter. + * \param id ssid associated with the callsign. + */ +#define AX25_CALL(str, id) {.call = (str), .ssid = (id) } + +/** + * Maximum number of Repeaters in a AX25 message. + */ +#define AX25_MAX_RPT 8 + + +/** + * AX25 Message. + * Used to handle AX25 sent/received messages. + */ +typedef struct AX25Msg +{ + AX25Call src; ///< Source adress + AX25Call dst; ///< Destination address + #if CONFIG_AX25_RPT_LST + AX25Call rpt_lst[AX25_MAX_RPT]; ///< List of repeaters + uint8_t rpt_cnt; ///< Number of repeaters in this message + #endif + uint16_t ctrl; ///< AX25 control field + uint8_t pid; ///< AX25 PID field + const uint8_t *info; ///< Pointer to the info field (payload) of the message + size_t len; ///< Payload length +} AX25Msg; + +#define AX25_CTRL_UI 0x03 +#define AX25_PID_NOLAYER3 0xF0 + +/** + * \name HDLC flags. + * These should be moved in + * a separated HDLC related file one day... + * \{ + */ +#define HDLC_FLAG 0x7E +#define HDLC_RESET 0x7F +#define AX25_ESC 0x1B +/* \} */ + + +/** + * Declare an AX25 path. + * \param dst the destination callsign for the path, \see AX25_CALL + * for a handy way to create a callsign on the fly. + * \param src the source callsign for the path, \see AX25_CALL + * for a handy way to create a callsign on the fly. + * + * Additional optional callsigns can be specified at the end of this macro + * in order to add repeater callsigns or specific unproto paths. + * + * This macro can be used to simply path array declaration. + * Should be used in this way: + * \code + * AX25Call path[] = AX25_PATH(AX25_CALL("abcdef", 0), AX25_CALL("ghjklm", 0), AX25_CALL("wide1", 1), AX25_CALL("wide2", 2)); + * \endcode + * + * The declared path can then be passed to ax25_sendVia(). + */ +#define AX25_PATH(dst, src, ...) { dst, src, ## __VA_ARGS__ } + +void ax25_poll(AX25Ctx *ctx); +void ax25_sendVia(AX25Ctx *ctx, const AX25Call *path, size_t path_len, const void *_buf, size_t len); + +/** + * Send an AX25 frame on the channel. + * \param ctx AX25 context to operate on. + * \param dst the destination callsign for the frame, \see AX25_CALL + * for a handy way to create a callsign on the fly. + * \param src the source callsign for the frame, \see AX25_CALL + * for a handy way to create a callsign on the fly. + * \param buf payload buffer. + * \param len length of the payload. + * + * \see ax25_sendVia() if you want to send a frame with a specific path. + */ +#define ax25_send(ctx, dst, src, buf, len) ax25_sendVia(ctx, ({static AX25Call __path[]={dst, src}; __path;}), 2, buf, len) +void ax25_init(AX25Ctx *ctx, KFile *channel, ax25_callback_t hook); + +void ax25_print(KFile *ch, const AX25Msg *msg); + +int ax25_testSetup(void); +int ax25_testTearDown(void); +int ax25_testRun(void); + +#endif /* NET_AX25_H */ diff --git a/2.5/bertos/net/ax25_test.c b/2.5/bertos/net/ax25_test.c new file mode 100644 index 00000000..fc3736cc --- /dev/null +++ b/2.5/bertos/net/ax25_test.c @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief AX25 test. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "ax25.h" + +#include + +#include +#include +#include + +#include //strncmp + +static AX25Ctx ax25; +static KFileMem mem; +static KFileDebug dbg; + +#define APRS_MSG \ + 0x3D, 0x34, 0x36, 0x30, 0x33, 0x2E, 0x36, 0x33, \ + 0x4E, 0x2F, 0x30, 0x31, 0x34, 0x33, 0x31, 0x2E, \ + 0x32, 0x36, 0x45, 0x2D, 0x4F, 0x70, 0x2E, 0x20, \ + 0x41, 0x6E, 0x64, 0x72, 0x65, 0x6A + +uint8_t aprs_packet[] = +{ + HDLC_FLAG, + 0x82, 0xA0, 0xA4, 0xA6, 0x40, 0x40, 0xE0, /* dst */ + 0xA6, 0x6A, 0x6E, 0x98, 0x9C, 0x40, 0x61, /* src */ + 0x03, /* ctrl */ + 0xF0, /* pid */ + APRS_MSG, /* payload */ + 0x40, 0x65, /* CRC */ + HDLC_FLAG, +}; + +uint8_t buf[] = { APRS_MSG }; +KFileMem mem1; +uint8_t aprs_packet_check[256]; + + +static void msg_callback(AX25Msg *msg) +{ + ax25_print(&dbg.fd, msg); + ASSERT(strncmp(msg->dst.call, "APRS\x0\x0", 6) == 0); + ASSERT(strncmp(msg->src.call, "S57LN\x0", 6) == 0); + ASSERT(msg->src.ssid == 0); + ASSERT(msg->dst.ssid == 0); + ASSERT(msg->ctrl == AX25_CTRL_UI); + ASSERT(msg->pid == AX25_PID_NOLAYER3); + ASSERT(msg->len == 30); + ASSERT(strncmp((const char *)msg->info, "=4603.63N/01431.26E-Op. Andrej", 30) == 0); +} + +int ax25_testSetup(void) +{ + kdbg_init(); + kfiledebug_init(&dbg); + kfilemem_init(&mem, aprs_packet, sizeof(aprs_packet)); + kfilemem_init(&mem1, aprs_packet_check, sizeof(aprs_packet_check)); + ax25_init(&ax25, &mem.fd, msg_callback); + return 0; +} + +int ax25_testTearDown(void) +{ + return 0; +} + +int ax25_testRun(void) +{ + ax25_poll(&ax25); + ax25_init(&ax25, &mem1.fd, NULL); + ax25_send(&ax25, AX25_CALL("aprs", 0x70), AX25_CALL("s57ln", 0x30), buf, sizeof(buf)); + ASSERT(memcmp(aprs_packet, aprs_packet_check, sizeof(aprs_packet)) == 0); + return 0; +} + +TEST_MAIN(ax25); diff --git a/2.5/bertos/net/keytag.c b/2.5/bertos/net/keytag.c new file mode 100644 index 00000000..32473ceb --- /dev/null +++ b/2.5/bertos/net/keytag.c @@ -0,0 +1,164 @@ +/** + * \file + * + * + * \author Andrea Grandi + * \author Daniele Basile + * + * \brief KeyTAG parser. + * + * This module parse TAG message that come from comunication channel, + * and convert the tag value into string. + * + * TAG protocol is decribed in this way: + *
+ * ---------------------------------------------------
+ * |STX (0x02)|data...(10 HEX chars)|CR|LF|ETX (0x03)|
+ * ---------------------------------------------------
+ * 
+ */ + +#include "keytag.h" + +#include +// Define log settings for cfg/log.h +#define LOG_LEVEL CONFIG_KEYTAG_LOG_LEVEL +#define LOG_FORMAT CONFIG_KEYTAG_LOG_FORMAT +#include +#include + +#include + +#include +/** + * Starting communication char (STX). + */ +#define TAG_STX 0x02 + +/** + * Ending communication char (ETX). + */ +#define TAG_ETX 0x03 + +static void keytag_clearPkt(struct TagPacket *pkt) +{ + pkt->sync = false; + pkt->len = 0; +} + +/** + * DEPRECATED FUCNTIONS + * To read the tag string from device you shoul use the keytag_recv + * fuction, that return the string if we had received it. + */ +void keytag_poll(struct TagPacket *pkt) +{ + #warning __FILTER_NEXT_WARNING__ + #warning keytag_poll function is depreca use keytag_recv instead + uint8_t buf[CONFIG_TAG_MAX_LEN]; + int len; + if ((len = keytag_recv(pkt, buf, sizeof(buf))) != EOF) + kfile_write(pkt->host, buf, len); +} + +/** + * Receive the tag message from channel, and if + * the tag is good put the converted string into given buffer. + * The fuction return the len of found tag string, otherwise EOF. + */ +int keytag_recv(struct TagPacket *pkt, uint8_t *tag, size_t len) +{ + int c; + + /* Get all chars from buffer */ + while ((c = kfile_getc(pkt->tag)) != EOF) + { + /* Search for STX char in received chars */ + if (c == TAG_STX) + { + /* When STX is found a new packet begins */ + if (pkt->sync) + LOG_WARN("TAG double sync!\n"); + keytag_clearPkt(pkt); + pkt->sync = true; + } + else if (pkt->sync) + { + /* Check for end of packet */ + if (c == TAG_ETX) + { + /* Terminate the tag string */ + size_t tag_len = MIN(len, pkt->len); + + /* Save read tag */ + memcpy(tag, pkt->buf, tag_len); + pkt->sync = false; + return tag_len; + } + else + { + /* Check for buffer overflow */ + if (pkt->len >= CONFIG_TAG_MAX_LEN) + { + LOG_ERR("TAG buffer overflow\n"); + pkt->sync = false; + } + else + { + /* Add every char after STX to tag reading buffer */ + if (pkt->sync) + { + pkt->buf[pkt->len] = c; + pkt->len++; + } + } + } + } + } + if (kfile_error(pkt->tag) != 0) + { + LOG_ERR("Error %04x\n", kfile_error(pkt->tag)); + kfile_clearerr(pkt->tag); + } + + return EOF; +} + +/** + * Init the keytag module. + */ +void keytag_init(struct TagPacket *pkt, struct KFile *comm, struct KFile *tag) +{ + keytag_clearPkt(pkt); + pkt->tag = tag; + pkt->host = comm; +} + diff --git a/2.5/bertos/net/keytag.h b/2.5/bertos/net/keytag.h new file mode 100644 index 00000000..f086bc34 --- /dev/null +++ b/2.5/bertos/net/keytag.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \author Andrea Grandi + * + * \brief Tag protocol. (interface). + * + * $WIZ$ module_name = "keytag" + * $WIZ$ module_configuration = "bertos/cfg/cfg_keytag.h" + * $WIZ$ module_depends = "kfile" + * $WIZ$ module_hw = "" + */ + +#ifndef NET_KEYTAG_H +#define NET_KEYTAG_H + +#include + +#include + + +/** + * Structure of a Tag packet + */ +typedef struct TagPacket +{ + KFile *tag; ///< Tag communication channel + KFile *host; ///< Host communication channel + bool sync; ///< Status flag: true if we find an STX + size_t len; ///< Packet lenght + uint8_t buf[CONFIG_TAG_MAX_LEN]; ///< Reception buffer +} TagPacket; + +void keytag_init(struct TagPacket *pkt, struct KFile *comm, struct KFile *tag); +int keytag_recv(struct TagPacket *pkt, uint8_t *tag, size_t len); + +void keytag_poll(struct TagPacket *pkt); + +#endif /* NET_TAG_H */ diff --git a/2.5/bertos/net/nmea.c b/2.5/bertos/net/nmea.c new file mode 100644 index 00000000..d232c73a --- /dev/null +++ b/2.5/bertos/net/nmea.c @@ -0,0 +1,474 @@ +/** + * \file + * + * + * \brief NMEA parser implementation. + * + * NMEA 0183 is acronym of National Marine Electronics Association that + * combined electrical and data specification for communication between marine + * electronic devices such as echo sounder, sonars, anemometer (wind speed and direction), + * gyrocompass, autopilot, GPS receivers and many other types of instruments. + * It has been defined by, and is controlled by, the U.S.-based National Marine + * Electronics Association. + * The NMEA 0183 standard uses a simple ASCII, serial communications protocol + * that defines how data is transmitted in a "sentence" from one "talker" + * to multiple "listeners" at a time. + * At the application layer, the standard also defines the contents of each sentence + * (message) type so that all listeners can parse messages accurately. + * + * + * \author Daniele Basile + * + * notest:avr + */ + +#include "nmea.h" + +#include "cfg/cfg_nmea.h" + +#include + +#define LOG_LEVEL NMEA_LOG_LEVEL +#define LOG_FORMAT NMEA_LOG_FORMAT +#include + +#include + +#include +#include +#include +#include + +/* + * Make conversion from one string to int. + * + * You can specify the precision if the string is a float + * number. The result is an int multiplied to 10^precision. + */ +static uint32_t tokenToInt(const char *s, int precision) +{ + uint32_t num = 0; + bool sep_found = false; + int i; + + if (!s) + return 0; + + for(i = 0; i < NMEAP_MAX_SENTENCE_LENGTH; i++) + { + char c = *s++; + + if (c == '.') + { + sep_found = true; + continue; + } + + if (c == '\0' || !isdigit(c) || (precision == 0 && sep_found)) + break; + + if (sep_found) + precision--; + + num *= 10; + num += c - '0'; + } + + while (precision--) + num *= 10; + + return num; +} + +/* + * Convert a string to micro degree. + */ +static udegree_t convertToDegree(const char *str) +{ + uint32_t dec; + uint32_t deg; + uint32_t min; + + if (*str == 0) + return 0; + + dec = tokenToInt(str, 4); + deg = dec / 1000000; + min = dec - deg * 1000000; + dec = deg * 1000000 + ((min * 5) + 1) / 3; + + return dec; +} + +/* + * Retun latitude in micro degree from a string. + */ +static udegree_t nmea_latitude(const char *plat, const char *phem) +{ + int ns; + + if (*phem == 0) + return 0; + + /* north lat is +, south lat is - */ + ns = (*phem == 'N') ? 1 : -1; + + + return ns * convertToDegree(plat); +} + +/* + * Retun longitude in micro degree from a string. + */ +static udegree_t nmea_longitude(const char *plot, const char *phem) +{ + int ew; + + if (*phem == 0) + return 0; + + /* west long is negative, east long is positive */ + ew = (*phem == 'E') ? 1 : -1; + + return ew * convertToDegree(plot); +} + +/* + * Return altitude in meter from a string. + * + */ +static int32_t nmea_altitude(const char *palt, const char *punits) +{ + int32_t alt; + + if (*palt == 0) + return 0; + + alt = atoi(palt); + + if (*punits == 'F') + { + /* convert to feet */ + /* alt = alt * 3.2808399 */ + alt = alt * 3 + /* 3.0 */ + (alt >> 2) + /* 0.25 */ + (alt >> 6) + /* 0.015625 */ + (alt >> 7) + /* 0.0078125 */ + (alt >> 8); /* 0,00390625 */ + + } + + return alt; +} + +/* + * Convert time and date stamp string to unix time. + */ +static time_t timestampToSec(uint32_t time_stamp, uint32_t date_stamp) +{ + struct tm t; + uint16_t msec; + uint16_t tmr[3]; + uint16_t date[3]; + + memset(&t, 0, sizeof(t)); + memset(&tmr, 0, sizeof(tmr)); + memset(&date, 0, sizeof(date)); + + LOG_INFO("time_s[%lu],date[%lu]\n", (long)time_stamp, (long)date_stamp); + uint32_t res = time_stamp / 1000; + uint32_t all = time_stamp; + msec = all - res * 1000; + + for (int i = 0; i < 3; i++) + { + all = res; + res = all / 100; + tmr[i] = all - res * 100; + LOG_INFO("t[%d]%d\n", tmr[i],i); + } + + t.tm_sec = tmr[0] + (ROUND_UP(msec, 1000) / 1000); + t.tm_min = tmr[1]; + t.tm_hour = tmr[2]; + //If we do not have refence data, we set 1/1/1970 as default + t.tm_mday = 1; + t.tm_mon = 0; + t.tm_year = 70; + + if (date_stamp) + { + res = all = date_stamp; + for (int i = 0; i < 3; i++) + { + all = res; + res = all / 100; + date[i] = all - res * 100; + LOG_INFO("d[%d]%d\n", date[i],i); + } + t.tm_mday = date[2]; + t.tm_mon = date[1] - 1; // time struct count month from 0 to 11; + // we should specify the number of years from 1900, but the year field + // is only two digits, so we add 100 (2000 - 1900).. + t.tm_year = date[0] + 100; + } + LOG_INFO("times=%d,%d,%d,%d,%d,%d\n",t.tm_sec, t.tm_min, t.tm_hour, t.tm_year, t.tm_mon, t.tm_mday); + + return mktime(&t); +} + +/** + * Callout example for GGA data + */ +void gpgga_callout(nmeap_context_t *context, void *data, void *user_data) +{ + (void)context; + (void)user_data; + (void)data; + LOG_INFOB( + NmeaGga *gga = (NmeaGga *)data; + LOG_INFO("Found GPGGA message %ld %ld %d %lu %d %d %d %d\n", + (long)gga->latitude, + (long)gga->longitude, + gga->altitude, + gga->time, + gga->satellites, + gga->quality, + gga->hdop, + gga->geoid); + ); +} + +/** + * Callout example for RMC + */ +void gprmc_callout(nmeap_context_t *context, void *data, void *user_data) +{ + (void)context; + (void)user_data; + (void)data; + LOG_INFOB( + NmeaRmc *rmc = (NmeaRmc *)data; + + LOG_INFO("Found GPRMC message %lu %c %ld %ld %d %d %d\n", + rmc->time, + rmc->warn, + (long)rmc->latitude, + (long)rmc->longitude, + rmc->speed, + rmc->course, + rmc->mag_var); + ); +} + +/** + * Callout example for GSV data + */ +void gpgsv_callout(nmeap_context_t *context, void *data, void *user_data) +{ + (void)context; + (void)user_data; + (void)data; + LOG_INFOB( + NmeaGsv *gsv = (NmeaGsv *)data; + + LOG_INFO("Found GPGSV message %d %d %d\n", gsv->tot_message, gsv->message_num, gsv->tot_svv); + + for (int i = 0; i < 4; i++) + LOG_INFO("%d %d %d %d\n", gsv->info[i].sv_prn, gsv->info[i].elevation, gsv->info[i].azimut, gsv->info[i].snr); + ); +} + +/** + * Callout example for VTG data + */ +void gpvtg_callout(nmeap_context_t *context, void *data, void *user_data) +{ + (void)context; + (void)user_data; + (void)data; + LOG_INFOB( + NmeaVtg *vtg = (NmeaVtg *)data; + LOG_INFO("Found GPVTG message %d %d %d\n", vtg->track_good, vtg->knot_speed, vtg->km_speed); + ); +} + + + +/** + * standard GPGGA sentence parser + */ +int nmea_gpgga(nmeap_context_t *context, nmeap_sentence_t *sentence) +{ + /* + * get pointer to sentence data + */ + NmeaGga *gga = (NmeaGga *)sentence->data; + + ASSERT(gga); + ASSERT(context->tokens >= 12); + + gga->latitude = nmea_latitude(context->token[2],context->token[3]); + gga->longitude = nmea_longitude(context->token[4],context->token[5]); + gga->altitude = nmea_altitude(context->token[9],context->token[10]); + gga->time = timestampToSec(tokenToInt(context->token[1], 3), 0); + gga->satellites = atoi(context->token[7]); + gga->quality = atoi(context->token[6]); + gga->hdop = tokenToInt(context->token[8], 1); + gga->geoid = nmea_altitude(context->token[11],context->token[12]); + + /* + * if the sentence has a callout, call it + */ + + if (sentence->callout != 0) + (*sentence->callout)(context, gga, context->user_data); + + return NMEA_GPGGA; +} + +/** + * standard GPRMCntence parser + */ +int nmea_gprmc(nmeap_context_t *context, nmeap_sentence_t *sentence) +{ + + /* + * get pointer to sentence data + */ + NmeaRmc *rmc = (NmeaRmc *)sentence->data; + + ASSERT(rmc); + ASSERT(context->tokens >= 10); + + /* + * extract data from the tokens + */ + rmc->time = timestampToSec(tokenToInt(context->token[1], 3), tokenToInt(context->token[9], 0)); + rmc->warn = *context->token[2]; + rmc->latitude = nmea_latitude(context->token[3],context->token[4]); + rmc->longitude = nmea_longitude(context->token[5],context->token[6]); + rmc->speed = atoi(context->token[7]); + rmc->course = atoi(context->token[8]); + rmc->mag_var = atoi(context->token[10]); + + if (sentence->callout != 0) + (*sentence->callout)(context, rmc, context->user_data); + + return NMEA_GPRMC; +} + + +/** + * standard GPVTG sentence parser + */ +int nmea_gpvtg(nmeap_context_t *context, nmeap_sentence_t *sentence) +{ + + /* + * get pointer to sentence data + */ + NmeaVtg *vtg = (NmeaVtg *)sentence->data; + + ASSERT(vtg); + ASSERT(context->tokens >= 7); + + /* + * extract data from the tokens + */ + vtg->track_good = atoi(context->token[1]); + vtg->knot_speed = atoi(context->token[5]); + vtg->km_speed = atoi(context->token[7]); + + /* + * if the sentence has a callout, call it + */ + if (sentence->callout != 0) + (*sentence->callout)(context, vtg, context->user_data); + + return NMEA_GPVTG; +} + +/** + * standard GPGDSV sentence parser + */ +int nmea_gpgsv(nmeap_context_t *context, nmeap_sentence_t *sentence) +{ + /* + * get pointer to sentence data + */ + NmeaGsv *gsv = (NmeaGsv *)sentence->data; + + + /* + * extract data from the tokens + */ + gsv->tot_message = atoi(context->token[1]); + gsv->message_num = atoi(context->token[2]); + gsv->tot_svv = atoi(context->token[3]); + + // Fill remaning member until we have token + int j = 0; + for (int i = 4; i < context->tokens - 3; i += 4, j++) + { + + gsv->info[j].sv_prn = atoi(context->token[i]); + gsv->info[j].elevation = atoi(context->token[i + 1]); + gsv->info[j].azimut = atoi(context->token[i + 2]); + gsv->info[j].snr = atoi(context->token[i + 3]); + } + + /* + * if the sentence has a callout, call it + */ + if (sentence->callout != 0) + (*sentence->callout)(context, gsv, context->user_data); + + return NMEA_GPGSV; +} + + +/** + * Parse NMEA sentence from a channel. + */ +void nmea_poll(nmeap_context_t *context, KFile *channel) +{ + int c, e; + while ((c = kfile_getc(channel)) != EOF) + nmeap_parse(context, c); + + if ((e = kfile_error(channel))) + { + LOG_ERR("ch error [%0X]\n", e); + kfile_clearerr(channel); + } +} + diff --git a/2.5/bertos/net/nmea.h b/2.5/bertos/net/nmea.h new file mode 100644 index 00000000..f0a8b3de --- /dev/null +++ b/2.5/bertos/net/nmea.h @@ -0,0 +1,151 @@ +/** + * \file + * + * \brief NMEA Parser. + * + * \author Daniele Basile + * + * $WIZ$ module_name = "nmea" + * $WIZ$ module_configuration = "bertos/cfg/cfg_nmea.h" + * $WIZ$ module_depends = "kfile", "nmeap01" + */ + +#ifndef NET_NMEA_H +#define NET_NMEA_H + +#include "cfg/cfg_nmea.h" + +#include + +#include + +#include + +/* + * Implemented NMEA parser strings. + */ +#define NMEA_GPGGA 1 // GGA MESSAGE ID +#define NMEA_GPRMC 2 // RMC MESSAGE ID +#define NMEA_GPVTG 3 // VTG MESSAGE ID +#define NMEA_GPGSV 4 // GSV MESSAGE ID + +// Standart type to rappresent fiels. +typedef int32_t udegree_t; // Micro degrees +typedef int32_t mdegree_t; // Milli degrees +typedef int16_t degree_t; // Degrees + + +/** + * Global Positioning System Fix Data. + * Extracted data from a GGA message + * + * Note: time member contains the seconds elapsed from 00:00:00 1/1/1970, + * because from nmea sentence we read only the time of UTC position, we + * have not any reference of date (day, month and year) so time is referred to + * the start of unix time. + */ +typedef struct NmeaGga +{ + udegree_t latitude; /* Latitude (micro degree) */ + udegree_t longitude; /* Longitude (micro degree) */ + int32_t altitude; /* Altitude (Meter) */ + time_t time; /* UTC of position (Unix time) */ + uint16_t satellites; /* Satellites are in view */ + uint16_t quality; /* Fix Quality: 0 = Invalid; 1 = GPS fix; 2 = DGPS fix; */ + uint16_t hdop; /* Relative accuracy of horizontal position (hdop * 10) */ + int16_t geoid; /* Height of geoid above WGS84 ellipsoid (Meter) */ +} NmeaGga; + +/** + * Recommended minimum specific GPS/Transit data. + * Extracted data from an RMC message + * + * Note: RMC sentences contain also date stamp so, time contains real seconds elapsed + * from 0:00:00 1/1/1970. + */ +typedef struct NmeaRmc +{ + time_t time; /* UTC of position (Unix time) */ + char warn; /* Navigation receiver warning A = OK, V = warning */ + udegree_t latitude; /* Latitude (micro degree) */ + udegree_t longitude; /* Longitude (micro degree) */ + uint16_t speed; /* Speed over ground (knots) */ + degree_t course; /* Track made good in degrees True (degree) */ + degree_t mag_var; /* Magnetic variation degrees (degree) */ +} NmeaRmc; + +/** + * Extracted data from an vtg message + */ +typedef struct NmeaVtg +{ + degree_t track_good; /* True track made good (degree) */ + uint16_t knot_speed; /* Speed over ground (knots) */ + uint16_t km_speed; /* Speed over ground in kilometers/hour */ +} NmeaVtg; + +/** + * Extracted data from an gsv message + */ +struct SvInfo +{ + uint16_t sv_prn; /* SV PRN number */ + degree_t elevation; /* Elevation in degrees, 90 maximum */ + degree_t azimut; /* Azimuth, degrees from true north, 000 to 359 */ + uint16_t snr; /* SNR, 00-99 dB (null when not tracking) */ +}; + +typedef struct NmeaGsv +{ + uint16_t tot_message; /* Total number of messages of this type in this cycle */ + uint16_t message_num; /* Message number */ + uint16_t tot_svv; /* Total number of SVs in view */ + struct SvInfo info[4]; /* Stanrd gsv nmea report up to 4 sv info */ +} NmeaGsv; + +void nmea_poll(nmeap_context_t *context, KFile *channel); + +int nmea_gpgsv(nmeap_context_t *context, nmeap_sentence_t *sentence); +int nmea_gpvtg(nmeap_context_t *context, nmeap_sentence_t *sentence); +int nmea_gprmc(nmeap_context_t *context, nmeap_sentence_t *sentence); +int nmea_gpgga(nmeap_context_t *context, nmeap_sentence_t *sentence); + +// Example of callout +void gpgga_callout(nmeap_context_t *context, void *data, void *user_data); +void gprmc_callout(nmeap_context_t *context, void *data, void *user_data); +void gpgsv_callout(nmeap_context_t *context, void *data, void *user_data); +void gpvtg_callout(nmeap_context_t *context, void *data, void *user_data); + +int nmea_testSetup(void); +int nmea_testTearDown(void); +int nmea_testRun(void); + +#endif /* NET_NMEA_H */ diff --git a/2.5/bertos/net/nmea_test.c b/2.5/bertos/net/nmea_test.c new file mode 100644 index 00000000..62927746 --- /dev/null +++ b/2.5/bertos/net/nmea_test.c @@ -0,0 +1,1034 @@ +/** + * \file + * + * + * \brief NMEA parser test. + * + * \author Daniele Basile + * + * notest:avr + */ + +#include "nmea.h" + +#include + +#include +#define LOG_LEVEL 3 +#define LOG_FORMAT NMEA_LOG_FORMAT +#include + +#include + +#include //strncmp + +static nmeap_context_t nmea; /* parser context */ +static NmeaRmc rmc; +static NmeaGga gga; +static NmeaGsv gsv; +static NmeaVtg vtg; + +static KFileMem mem; + +static uint8_t nmea_test[] = +{ +/* For these first sentences, we have a test_vector */ +"$GPRMC,170525.949,A,4351.0843,N,01108.8687,E,0.00,237.67,051009,,,A*61\r\n" /* acquired */ +"$GPVTG,237.67,T,,,0.00,N,0.00,K,A*77\r\n" /* acquired */ +"$GPGSV,3,1,09,3,78,302,37,6,87,031,,7,05,292,37,14,05,135,*48\r\n" /* acquired */ +"$GPGGA,170527.949,4351.0842,N,01108.8685,E,1,05,02.6,57.4,M,45.2,M,,*5C\r\n" /* acquired */ +"$GPGGA,170527.949,4351.0842,N,01108.8685,E,1,05,02.6,-57.4,M,45.2,M,,*71\r\n" /* acquired */ +"$GPGGA,170527.949,4351.0842,S,01108.8685,W,1,05,02.6,-57.4,M,-45.2,M,,*53\r\n" + +"$GPGGA,100019.604,4351.1480,N,01108.8750,E,1,03,16.8,0.0,M,45.2,M,,*64\r\n" +"$GPRMC,100019.604,A,4351.1480,N,01108.8750,E,2.03,134.29,131009,,,A*6F\r\n" +"$GPVTG,134.29,T,,,2.03,N,3.75,K,A*7D\r\n" +"$GPGGA,100020.604,4351.1491,N,01108.8751,E,1,03,16.8,0.0,M,45.2,M,,*6F\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.8,16.8,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,142,31,14,38,267,*49\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,34,29,42,214,35,30,68,313,*73\r\n" +"$GPGSV,3,3,09,31,09,314,,,,,,,,,,,,,*4D\r\n" +"$GPRMC,100020.604,A,4351.1491,N,01108.8751,E,2.11,134.29,131009,,,A*67\r\n" +"$GPVTG,134.29,T,,,2.11,N,3.91,K,A*74\r\n" +"$GPGGA,100021.603,4351.1486,N,01108.8751,E,1,03,16.8,0.0,M,45.2,M,,*6F\r\n" +"$GPRMC,100021.603,A,4351.1486,N,01108.8751,E,2.18,134.29,131009,,,A*6E\r\n" +"$GPVTG,134.29,T,,,2.18,N,4.05,K,A*77\r\n" +"$GPGGA,100022.603,4351.1470,N,01108.8750,E,1,03,16.8,0.0,M,45.2,M,,*64\r\n" +"$GPRMC,100022.603,A,4351.1470,N,01108.8750,E,2.17,134.29,131009,,,A*6A\r\n" +"$GPVTG,134.29,T,,,2.17,N,4.01,K,A*7C\r\n" +"$GPGGA,100023.603,4351.1453,N,01108.8747,E,1,03,16.8,0.0,M,45.2,M,,*62\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.8,16.8,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,142,31,14,38,267,*49\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,33,29,42,214,36,30,68,313,*77\r\n" +"$GPGSV,3,3,09,31,09,314,,,,,,,,,,,,,*4D\r\n" +"$GPRMC,100023.603,A,4351.1453,N,01108.8747,E,2.28,134.29,131009,,,A*60\r\n" +"$GPVTG,134.29,T,,,2.28,N,4.22,K,A*71\r\n" +"$GPGGA,100024.603,4351.1450,N,01108.8746,E,1,03,16.8,0.0,M,45.2,M,,*67\r\n" +"$GPRMC,100024.603,A,4351.1450,N,01108.8746,E,2.28,134.29,131009,,,A*65\r\n" +"$GPVTG,134.29,T,,,2.28,N,4.22,K,A*71\r\n$GPGG25.603,4351.1442,N,01108.8745,E,1,03,16.8,0.0,M,45.2,M,,*66\n" +"$GPRMC,100025.603,A,4351.1442,N,01108.8745,E,2.40,134.29,131009,,,A*6A\r\n" +"$GPVTG,134.29,T,,,2.40,N,4.45,K,A*7E\r\n" +"$GPGGA,100026.602,4351.1433,N,01108.8744,E,1,03,16.8,0.0,M,45.2,M,,*63\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.8,16.8,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,142,31,14,38,267,*49\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,33,29,42,214,36,30,68,313,*77\r\n" +"$GPGSV,3,3,09,31,09,314,,,,,,,,,,,,,*4D\r\n" +"$GPRMC,100026.602,A,4351.1433,N,01108.8744,E,2.48,187.14,131009,,,A*61\r\n" +"$GPVTG,187.14,T,,,2.48,N,4.59,K,A*7D\r\n" +"$GPGGA,100027.602,4351.1425,N,01108.8743,E,1,03,16.8,0.0,M,45.2,M,,*62\r\n" +"$GPRMC,100027.602,A,4351.1425,N,01108.8743,E,2.39,185.89,131009,,,A*60\r\n" +"$GPVTG,185.89,T,,,2.39,N,4.42,K,A*77\r\n" +"$GPGGA,100028.602,4351.1424,N,01108.8743,E,1,03,16.8,0.0,M,45.2,M,,*6C\r\n" +"$GPRMC,100028.602,A,4351.1424,N,01108.8743,E,2.18,187.33,131009,,,A*6E\r\n" +"$GPVTG,187.33,T,,,2.18,N,4.04,K,A*75\r\n" +"$GPGGA,100029.602,4351.1399,N,01108.8739,E,1,03,16.8,0.0,M,45.2,M,,*61\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.8,16.8,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,142,31,14,38,267,*49\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,34,29,42,214,35,30,68,313,*73\r\n" +"$GPGSV,3,3,09,31,09,314,,,,,,,,,,,,,*4D\r\n" +"$GPRMC,100029.602,A,4351.1399,N,01108.8739,E,1.98,188.78,131009,,,A*68\r\n" +"$GPVTG,188.78,T,,,1.98,N,3.67,K,A*7C\r\n" +"$GPGGA,100030.602,4351.1393,N,01108.8738,E,1,03,16.8,0.0,M,45.2,M,,*6ds2\r\n" +"$GPRMC,100030.602,A,4351.1393,N,01108.8738,E,1.90,188.62,131009,,,A*68\r\n" +"$GPVTG,188.62,T,,,1.90,N,3.53,K,A*78\r\n" +"$GPGGA,100031.601,4351.1389,N,01108.8737,E,1,03,16.8,0.0,M,45.2,M,,*64\r\n" +"$GPRMC,100031.601,A,adfsd4351.1389,N,01108.8737,E,1.82,188.25,131009,,,A*6E\r\n" +"$GPVTG,188.25,T,,,1.82,N,3.37,K,A*7A\r" +"$GadafPGGA,100032.601,4351.1384,N,01108.8737,E,1,03,16.8,0.0,M,45.2,M,,*6A\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.8,16.8,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,142,30,14,38,267,*48\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,33,29,42,214,35,30,68,313,*74\r\n" +"$GPGSV,3,3,09,31,09,314,,,,,,,,,,,,,*4D\r\n" +"$GPRMC,100032.601,A,4351.1384,N,01108.8737,E,1.76,187.49,131009,,,A*6E\r\n" +"$GPVTG,187.49,T,,,1.76,N,3.27,K,A*75\r\n" +"$GPGGA,100033.601,4351.1379,N,01108.8735,E,1,02,16.8,0.0,M,45.2,M,,*6A\r\n" +"$GPRMC,100033.601,A,4351.1379,N,01108.8735,E,1.72,187.49,131009,,,A*6B\r\n" +"$GPVTG,187.49,T,,,1.72,N,3.18,K,A*7D\r\n" +"$GPGGA,100034.601,4351.1376,N,01108.8735,E,1,03,16.8,0.0,M,45.2,M,,*63\r\n" +"$GPRMC,100034.601,A,4351.1376,N,01108.8735,E,1.49,187.49,131009,,,A*6B\r\n" +"$GPVTG,187.49,T,,,1.49,N,2.76,K,A*7C\r\n" +"$GPGGA,100035.600,4351.1374,N,01108.8735,E,1,03,16.8,0.0,M,45.2,M,,*61\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.8,16.8,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,142,30,14,38,267,*48\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,33,29,42,214,36,30,68,313,*77\r\n" +"$GPGSV,3,3,09,31,09,314,,,,,,,,,,,,,*4D\r\n" +"$GPRMC,100035.600,A,4351.1374,N,01108.8735,E,1.22,187.49,131009,,,A*64\r\n" +"$GPVTG,187.49,T,,,1.22,N,2.26,K,A*74\r\n" +"$GPGGA,100036.600,4351.1374,N,01108.8736,E,1,03,16.8,0.0,M,45.2,M,,*61\r\n" +"$GPRMC,100036.600,A,4351.1374,N,01108.8736,E,0.00,187.49,131009,,,A*65\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100037.600,4351.1373,N,01108.8734,E,1,03,16.8,-0.0,M,45.2,M,,*48\r\n" +"$GPRMC,100037.600,A,4351.1373,N,01108.8734,E,0.00,187.49,131009,,,A*61\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100038.600,4351.1371,N,01108.8734,E,1,03,16.8,-0.0,M,45.2,M,,*45\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.8,16.8,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,142,30,14,38,267,*48\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,34,29,42,214,36,30,68,313,*70\r\n" +"$GPGSV,3,3,09,31,09,314,,,,,,,,,,,,,*4D\r\n" +"$GPRMC,100038.600,A,4351.1371,N,01108.8734,E,0.00,187.49,131009,,,A*6C\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100039.600,4351.1370,N,01108.8734,E,1,03,16.8,-0.0,M,45.2,M,,*45\r\n" +"$GPRMC,100039.600,A,4351.1370,N,01108.8734,E,0.00,187.49,131009,,,A*6C\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100040.599,4351.1368,N,01108.8733,E,1,03,16.8,-0.0,M,45.2,M,,*46\r\n" +"$GPRMC,100040.599,A,4351.1368,N,01108.8733,E,0.00,187.49,131009,,,A*6F\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100041.599,4351.1367,N,01108.8733,E,1,03,16.8,-0.0,M,45.2,M,,*48\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.8,16.8,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,142,30,14,38,267,*48\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,34,29,42,214,36,30,68,313,30*73\r\n" +"$GPGSV,3,3,09,31,09,314,,,,,,,,,,,,,*4D\r\n" +"$GPRMC,100041.599,A,4351.1367,N,01108.8733,E,1.04,187.49,131009,,,A*64\r\n" +"$GPVTG,187.49,T,,,1.04,N,1.93,K,A*7D\r\n" +"$GPGGA,100042.599,4351.1365,N,01108.8732,E,1,03,16.8,-0.0,M,45.2,M,,*48\r\n" +"$GPRMC,100042.599,A,4351.1365,N,01108.8732,E,1.10,187.49,131009,,,A*61\r\n" +"$GPVTG,187.49,T,,,1.10,N,2.04,K,A*75\r\n" +"$GPGGA,100043.599,4351.1361,N,01108.ad2,E,1,03,16.8,-0.0,M,45.2,M,,*4D\r\n" +"$GPRMC,100043.599,A,4351.1361,N,01108.8732,E,1.12,187.49,131009,,,A*66\r\n" +"$GPVTG,187.49,T,,,1.12,N,2.07,K,A*74\r\n" +"$GPGGA,100044.599,4351.1358,N,01108.8732,E,1,03,16.8,-0.0,M,45.2,M,,*40\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.8,16.8,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,142,30,14,38,267,*48\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,34,29,42,214,36,30,68,313,30*73\r\n" +"$GPGSV,3,3,09,31,09,314,,,,,,,,,,,,,*4D\r\n" +"$GPRMC,100044.599,A,4351.1358,N,01108.8732,E,1.06,187.49,131009,,,A*6E\r\n" +"$GPVTG,187.49,T,,,1.06,N,1.95,K,A*79\r\n" +"$GPGGA,100045.598,4351.1357,N,01108.8731,E,1,03,16.8,-0.0,M,45.2,M,,*4C\r\n" +"$GPRMC,100045.598,A,4351.1357,N,01108.8731,E,0.00,187.49,131009,,,A*65\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100046.598,4351.1356,N,01108.8731,E,1,03,16.8,-0.0,M,45.2,M,,*4E\r\n" +"$GPRMC,100046.598,A,4351.1356,N,01108.8731,E,0.00,187.49,131009,,,A*67\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100047.598,4351.1356,N,01108.8731,E,1,03,16.8,-0.0,M,45.2,M,,*4F\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.8,16.8,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,143,29,14,38,267,*41\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,34,29,42,214,36,30,68,313,30*73\r\n" +"$GPGSV,3,3,09,31,09,314,,,,,,,,,,,,,*4D\r\n" +"$GPRMC," +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100048.598,4351.1355,N,01108.8732,E,1,03,16.8,-0.0,M,45.2,M,,*40\r\n" +"$GPRMC,100048.598,A,4351.1355,N,01108.8732,E,0.00,187.49,131009,,,A*69\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100049.597,4351.1356,N,01108.8731,E,1,03,16.9,-0.0,M,45.2,M,,*4F\r\n" +"$GPRMC,100049.597,A,4351.1356,N,01108.8731,E,0.00,187.49,131009,,,A*67\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100050.597,4351.1354,N,01108.8732,E,1,03,16.9,-0.0,M,45.2,M,,*46\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.9,16.9,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,143,29,14,38,266,*40\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,34,29,42,214,35,30,69,313,30*71\r\n" +"$GPGSV,3,3,09,31,10,314,,,,,,,,,,,,,*45\r\n" +"$GPRMC,100050.597,A,4351.1354,N,01108.8732,E,0.00,187.49,131009,,,A*6E\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100051.597,4351.1354,N,01108.8731,E,1,03,16.9,-0.0,M,45.2,M,,*44\r\n" +"$GPRMC,100051.597,A,4351.1354,N,01108.8731,E,0.00,187.49,131009,,,A*6C\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100052.597,4351.1353,N,01108.8731,E,1,03,16.9,-0.0,M,45.2,M,,*40\r\n" +"$GPRMC,100052.597,A,4351.1353,N,01108.8731,E,0.00,187.49,131009,,,A*68\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100053.597,4351.1352,N,01108.8731,E,1,03,16.9,-0.0,M,45.2,M,,*40\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.9,16.9,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,143,29,14,38,266,*40\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,34,29,42,214,35,30,69,313,30*71\r\n" +"$GPGSV,3,3,09,31,10,314,,,,,,,,,,,,,*45\r\n" +"$GPRMC,100053.597,A,4351.1352,N,01108.8731,E,0.00,187.49,131009,,,A*68\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100054.596,4351.1351,N,01108.8730,E,1,03,16.9,-0.0,M,45.2,M,,*44\r\n" +"$GPRMC,100054.596,A,4351.1351,N,01108.8730,E,0.00,187.49,131009,,,A*6C\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100055.596,4351.1349,N,01108.8731,E,1,03,16.9,-0.0,M,45.2,M,,*4D\r\n" +"$GPRMC,100055.596,A,4351.1349,N,01108.8731,E,0.00,187.49,131009,,,A*65\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100056.596,4351.1347,N,01108.8730,E,1,03,16.9,-0.0,M,45.2,M,,*41\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.9,16.9,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,32,143,29,14,38,266,*40\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,34,29,42,214,35,30,69,313,30*71\r\n" +"$GPGSV,3,3,09,31,10,314,,,,,,,,,,,,,*45\r\n" +"$GPRMC,100056.596,A,4351.1347,N,01108.8730,E,0.00,187.49,131009,,,A*69\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100057.596,4351.1344,N,01108.8729,E,1,03,16.9,-0.0,M,45.2,M,,*4B\r\n" +"$GPRMC,100057.596,A,4351.1344,N,01108.8729,E,0.00,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100058.595,4351.1343,N,01108.8730,E,1,03,16.9,-0.0,M,45.2,M,,*48\r\n" +"$GPRMC,100058.595,A,4351.1343,N,01108.8730,E,1.01,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,1.01,N,1.86,K,A*7C\r\n" +"$GPGGA,100059.595,4351.1341,N,01108.8729,E,1,03,16.9,0.0,M,45.2,M,,*6E\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.9,16.9,0.0*34\r\n" +"$GPGSV,3,1,09,2,34,087,,4,20,052,,9,31,143,30,14,38,266,*4B\r\n" +"$GPGSV,3,2,09,26,35,232,,27,25,143,34,29,42,214,36,30,69,313,30*72\r\n" +"$GPGSV,3,3,09,31,10,314,,,,,,,,,,,,,*45\r\n" +"$GPRMC,100059.595,A,4351.1341,N,01108.8729,E,1.28,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,1.28,N,2.37,K,A*7E\r\n" +"$GPGGA,100100.595,4351.1337,N,01108.8728,E,1,03,16.9,0.0,M,45.2,M,,*63\r\n" +"$GPRMC,100100.595,A,4351.1337,N,01108.8728,E,1.38,187.49,131009,,,A*6C\r\n" +"$GPVTG,187.49,T,,,1.38,N,2.55,K,A*7B\r\n" +"$GPGGA,100101.595,4351.1334,N,01108.8728,E,1,03,16.9,0.0,M,45.2,M,,*61\r\n" +"$GPRMC,100101.595,A,4351.1334,N,01108.8728,E,1.51,187.49,131009,,,A*61\r\n" +"$GPVTG,187.49,T,,,1.51,N,2.79,K,A*7A\r\n" +"$GPGGA,100102.595,4351.1331,N,01108.8727,E,1,03,16.9,0.0,M,45.2,M,,*68\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.9,16.9,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,30,12,62,057,*4B\r\n" +"$GPGSV,3,2,10,14,38,266,,26,35,232,,27,25,143,34,29,42,214,35*7B\r\n" +"$GPGSV,3,3,10,30,69,313,30,31,10,314,,,,,,,,,*73\r\n" +"$GPRMC,100102.595,A,4351.1331,N,01108.8727,E,1.57,187.49,131009,,,A*6E\r\n" +"$GPVTG,187.49,T,,,1.57,N,2.91,K,A*7A\r\n" +"$GPGGA,100103.594,4351.1328,N,01108.8727,E,1,03,16.9,0.0,M,45.2,M,,*60\r\n" +"$GPRMC,100103.594,A,4351.1328,N,01108.8727,E,1.54,187.49,131009,,,A*65\r\n" +"$GPVTG,187.49,T,,,1.54,N,2.86,K,A*7F\r\n" +"$GPGGA,100104.594,4351.1326,N,01108.8727,E,1,03,16.9,0.0,M,45.2,M,,*69\r\n" +"$GPRMC,100104.594,A,4351.1326,N,01108.8727,E,1.38,187.49,131009,,,A*66\r\n" +"$GPVTG,187.49,T,,,1.38,N,2.56,K,A*78\r\n" +"$GPGGA,100105.594,4351.1322,N,01108.8726,E,1,03,16.9,0.0,M,45.2,M,,*6D\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.9,16.9,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,29,12,62,057,*43\r\n" +"$GPGSV,3,2,10,14,38,266,,26,35,232,,27,25,143,34,29,42,214,36*78\r\n" +"$GPGSV,3,3,10,30,69,313,30,31,10,314,,,,,,,,,*73\r\n" +"$GPRMC,100105.594,A,4351.1322,N,01108.8726,E,1.36,187.49,131009,,,A*6C\r\n" +"$GPVTG,187.49,T,,,1.36,N,2.53,K,A*73\r\n" +"$GPGGA,100106.594,4351.1318,N,01108.8726,E,1,03,16.9,0.0,M,45.2,M,,*67\r\n" +"$GPRMC,100106.594,A,4351.1318,N,01108.8726,E,1.47,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,1.47,N,2.73,K,A*77\r\n" +"$GPGGA,100107.594,4351.1313,N,01108.8725,E,1,03,16.9,0.0,M,45.2,M,,*6E\r\n" +"$GPRMC,100107.594,A,4351.1313,N,01108.8725,E,1.64,187.49,131009,,,A*68\r\n" +"$GPVTG,187.49,T,,,1.64,N,3.03,K,A*70\r\n" +"$GPGGA,100108.593,4351.1310,N,01108.8724,E,1,03,16.9,0.0,M,45.2,M,,*64\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.9,16.9,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,29,12,62,057,*43\r\n" +"$GPGSV,3,2,10,14,38,266,,26,35,232,,27,25,143,34,29,42,214,36*78\r\n" +"$GPGSV,3,3,10,30,69,313,30,31,10,314,,,,,,,,,*73\r\n" +"$GPRMC,100108.593,A,4351.1310,N,01108.8724,E,1.66,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,1.66,N,3.07,K,A*76\r\n" +"$GPGGA,100109.593,4351.1304,N,01108.8723,E,1,03,16.9,0.0,M,45.2,M,,*67\r\n" +"$GPRMC,100109.593,A,4351.1304,N,01108.8723,E,1.72,187.49,131009,,,A*66\r\n" +"$GPVTG,187.49,T,,,1.72,N,3.18,K,A*7D\r\n" +"$GPGGA,100110.593,4351.1301,N,01108.8722,E,1,03,16.9,0.0,M,45.2,M,,*6B\r\n" +"$GPRMC,100110.593,A,4351.1301,N,01108.8722,E,1.72,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,1.72,N,3.18,K,A*7D\r\n" +"$GPGGA,100111.593,4351.1297,N,01108.8722,E,1,03,16.9,0.0,M,45.2,M,,*64\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.9,16.9,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,29,12,62,057,*43\r\n" +"$GPGSV,3,2,10,14,38,266,,26,35,231,,27,25,143,34,29,42,214,35*78\r\n" +"$GPGSV,3,3,10,30,69,313,30,31,10,314,,,,,,,,,*73\r\n" +"$GPRMC,100111.593,A,4351.1297,N,01108.8722,E,1.65,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,1.65,N,3.05,K,A*77\r\n" +"$GPGGA,100112.592,4351.1295,N,01108.8722,E,1,03,16.9,0.0,M,45.2,M,,*64\r\n" +"$GPRMC,100112.592,A,4351.1295,N,01108.8722,E,1.50,187.49,131009,,,A*65\r\n" +"$GPVTG,187.49,T,,,1.50,N,2.78,K,A*7A\r\n" +"$GPGGA,100113.592,4351.1291,N,01108.8721,E,1,03,16.9,0.0,M,45.2,M,,*62\r\n" +"$GPRMC,100113.592,A,4351.1291,N,01108.8721,E,1.38,187.49,131009,,,A*6D\r\n" +"$GPVTG,187.49,T,,,1.38,N,2.55,K,A*7B\r\n" +"$GPGGA,100114.592,4351.1288,N,01108.8721,E,1,03,16.9,0.0,M,45.2,M,,*6D\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.9,16.9,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,29,12,62,057,*43\r\n" +"$GPGSV,3,2,10,14,38,266,,26,35,231,,27,25,143,34,29,43,214,35*79\r\n" +"$GPGSV,3,3,10,30,69,313,30,31,10,314,,,,,,,,,*73\r\n" +"$GPRMC,100114.592,A,4351.1288,N,01108.8721,E,1.24,187.49,131009,,,A*6F\r\n" +"$GPVTG,187.49,T,,,1.24,N,2.29,K,A*7D\r\n" +"$GPGGA,100115.592,4351.1285,N,01108.8719,E,1,03,16.9,0.0,M,45.2,M,,*6A\r\n" +"$GPRMC,100115.592,A,4351.1285,N,01108.8719,E,1.01,187.49,131009,,,A*6F\r\n" +"$GPVTG,187.49,T,,,1.01,N,1.87,K,A*7D\r\n" +"$GPGGA,100116.592,4351.1283,N,01108.8719,E,1,03,16.9,0.0,M,45.2,M,,*6F\r\n" +"$GPRMC,100116.592,A,4351.1283,N,01108.8719,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100117.591,4351.1282,N,01108.8719,E,1,03,16.9,0.0,M,45.2,M,,*6C\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,16.9,16.9,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,29,12,62,057,*43\r\n" +"$GPGSV,3,2,10,14,38,266,,26,35,231,,27,25,143,34,29,43,214,35*79\r\n" +"$GPGSV,3,3,10,30,69,313,30,31,10,314,,,,,,,,,*73\r\n" +"$GPRMC,100117.591,A,4351.1282,N,01108.8719,E,0.00,187.49,131009,,,A*69\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100118.591,4351.1280,N,01108.8718,E,1,03,16.9,-0.0,M,45.2,M,,*4D\r\n" +"$GPRMC,100118.591,A,4351.1280,N,01108.8718,E,0.00,187.49,131009,,,A*65\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100119.591,4351.1278,N,01108.8718,E,1,03,17.1,-0.0,M,45.2,M,,*42\r\n" +"$GPRMC,100119.591,A,4351.1278,N,01108.8718,E,0.00,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100120.591,4351.1278,N,01108.8717,E,1,03,17.1,-0.0,M,45.2,M,,*47\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.1,17.1,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,28,12,62,057,*42\r\n" +"$GPGSV,3,2,10,14,38,266,,26,35,231,,27,25,143,34,29,43,214,35*79\r\n" +"$GPGSV,3,3,10,30,69,313,30,31,10,314,,,,,,,,,*73\r\n" +"$GPRMC,100120.591,A,4351.1278,N,01108.8717,E,0.00,187.49,131009,,,A*66\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100121.590,4351.1276,N,01108.8717,E,1,02,17.1,-0.0,M,45.2,M,,*48\r\n" +"$GPRMC,100121.590,A,4351.1276,N,01108.8717,E,0.00,187.49,131009,,,A*68\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100122.590,4351.1275,N,01108.8717,E,1,03,17.1,-0.0,M,45.2,M,,*49\r\n" +"$GPRMC,100122.590,A,4351.1275,N,01108.8717,E,0.00,187.49,131009,,,A*68\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100123.590,4351.1275,N,01108.8717,E,1,03,17.1,-0.0,M,45.2,M,,*48\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.1,17.1,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,29,12,62,057,*43\r\n" +"$GPGSV,3,2,10,14,38,266,,26,35,231,,27,25,143,34,29,43,214,36*7A\r\n" +"$GPGSV,3,3,10,30,69,313,30,31,10,314,,,,,,,,,*73\r\n" +"$GPRMC,100123.590,A,4351.1275,N,01108.8717,E,0.00,187.49,131009,,,A*69\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100124.590,4351.1274,N,01108.8717,E,1,03,17.1,-0.0,M,45.2,M,,*4E\r\n" +"$GPRMC,100124.590,A,4351.1274,N,01108.8717,E,0.00,187.49,131009,,,A*6F\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100125.590,4351.1272,N,01108.8717,E,1,03,17.1,-0.0,M,45.2,M,,*49\r\n" +"$GPRMC,100125.590,A,4351.1272,N,01108.8717,E,0.00,187.49,131009,,,A*68\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100126.589,4351.1271,N,01108.8716,E,1,03,17.1,-0.0,M,45.2,M,,*40\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.1,17.1,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,28,12,62,057,*42\r\n" +"$GPGSV,3,2,10,14,38,266,,26,35,231,,27,24,143,34,29,43,214,35*78\r\n" +"$GPGSV,3,3,10,30,69,313,30,31,10,314,,,,,,,,,*73\r\n" +"$GPRMC,100126.589,A,4351.1271,N,01108.8716,E,0.00,187.49,131009,,,A*61\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100127.589,4351.1270,N,01108.8715,E,1,03,17.1,-0.0,M,45.2,M,,*43\r\n" +"$GPRMC,100127.589,A,4351.1270,N,01108.8715,E,0.00,187.49,131009,,,A*62\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100128.589,4351.1269,N,01108.8715,E,1,03,17.1,-0.0,M,45.2,M,,*44\r\n" +"$GPRMC,100128.589,A,4351.1269,N,01108.8715,E,0.00,187.49,131009,,,A*65\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100129.589,4351.1268,N,01108.8715,E,1,03,17.1,-0.0,M,45.2,M,,*44\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.1,17.1,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,28,12,62,058,*4D\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,34,29,43,214,35*76\r\n" +"$GPGSV,3,3,10,30,69,314,29,31,10,314,,,,,,,,,*7C\r\n" +"$GPRMC,100129.589,A,4351.1268,N,01108.8715,E,0.00,187.49,131009,,,A*65\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100130.589,4351.1266,N,01108.8715,E,1,03,17.1,-0.0,M,45.2,M,,*42\r\n" +"$GPRMC,100130.589,A,4351.1266,N,01108.8715,E,0.00,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100131.588,4351.1265,N,01108.8714,E,1,03,17.1,-0.0,M,45.2,M,,*40\r\n" +"$GPRMC,100131.588,A,4351.1265,N,01108.8714,E,0.00,187.49,131009,,,A*61\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100132.588,4351.1264,N,01108.8714,E,1,03,17.1,-0.0,M,45.2,M,,*42\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.1,17.1,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,28,12,62,058,*4D\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,214,35*71\r\n" +"$GPGSV,3,3,10,30,69,314,29,31,10,314,,,,,,,,,*7C\r\n" +"$GPRMC,100132.588,A,4351.1264,N,01108.8714,E,0.00,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100133.588,4351.1264,N,01108.8715,E,1,03,17.1,-0.0,M,45.2,M,,*42\r\n" +"$GPRMC,100133.588,A,4351.1264,N,01108.8715,E,0.00,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100134.588,4351.1262,N,01108.8714,E,1,03,17.1,-0.0,M,45.2,M,,*42\r\n" +"$GPRMC,100134.588,A,4351.1262,N,01108.8714,E,0.00,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100135.587,4351.1263,N,01108.8715,E,1,03,17.1,-0.0,M,45.2,M,,*4C\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.1,17.1,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,214,35*71\r\n" +"$GPGSV,3,3,10,30,69,314,29,31,10,314,,,,,,,,,*7C\r\n" +"$GPRMC,100135.587,A,4351.1263,N,01108.8715,E,0.00,187.49,131009,,,A*6D\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100136.587,4351.1263,N,01108.8714,E,1,03,17.1,-0.0,M,45.2,M,,*4E\r\n" +"$GPRMC,100136.587,A,4351.1263,N,01108.8714,E,0.00,187.49,131009,,,A*6F\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100137.587,4351.1263,N,01108.8714,E,1,03,17.1,-0.0,M,45.2,M,,*4F\r\n" +"$GPRMC,100137.587,A,4351.1263,N,01108.8714,E,0.00,187.49,131009,,,A*6E\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100138.587,4351.1263,N,01108.8714,E,1,03,17.1,-0.0,M,45.2,M,,*40\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.1,17.1,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,34*71\r\n" +"$GPGSV,3,3,10,30,69,314,29,31,10,314,,,,,,,,,*7C\r\n" +"$GPRMC,100138.587,A,4351.1263,N,01108.8714,E,0.00,187.49,131009,,,A*61\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100139.587,4351.1263,N,01108.8714,E,1,03,17.1,-0.0,M,45.2,M,,*41\r\n" +"$GPRMC,100139.587,A,4351.1263,N,01108.8714,E,0.00,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100140.586,4351.1263,N,01108.8714,E,1,03,17.1,-0.0,M,45.2,M,,*4E\r\n" +"$GPRMC,100140.586,A,4351.1263,N,01108.8714,E,0.00,187.49,131009,,,A*6F\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100141.586,4351.1263,N,01108.8714,E,1,03,17.1,-0.0,M,45.2,M,,*4F\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.1,17.1,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,34*71\r\n" +"$GPGSV,3,3,10,30,69,314,29,31,10,314,,,,,,,,,*7C\r\n" +"$GPRMC,100141.586,A,4351.1263,N,01108.8714,E,0.00,187.49,131009,,,A*6E\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100142.586,4351.1262,N,01108.8714,E,1,03,17.1,-0.0,M,45.2,M,,*4D\r\n" +"$GPRMC,100142.586,A,4351.1262,N,01108.8714,E,0.00,187.49,131009,,,A*6C\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100143.586,4351.1263,N,01108.8713,E,1,03,17.1,-0.0,M,45.2,M,,*4A\r\n" +"$GPRMC,100143.586,A,4351.1263,N,01108.8713,E,0.00,187.49,131009,,,A*6B\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100144.585,4351.1263,N,01108.8713,E,1,03,17.1,-0.0,M,45.2,M,,*4E\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.1,17.1,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,34*71\r\n" +"$GPGSV,3,3,10,30,69,314,29,31,10,314,,,,,,,,,*7C\r\n" +"$GPRMC,100144.585,A,4351.1263,N,01108.8713,E,0.00,187.49,131009,,,A*6F\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100145.585,4351.1263,N,01108.8713,E,1,03,17.1,-0.0,M,45.2,M,,*4F\r\n" +"$GPRMC,100145.585,A,4351.1263,N,01108.8713,E,0.00,187.49,131009,,,A*6E\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100146.585,4351.1262,N,01108.8712,E,1,03,17.1,-0.0,M,45.2,M,,*4C\r\n" +"$GPRMC,100146.585,A,4351.1262,N,01108.8712,E,0.00,187.49,131009,,,A*6D\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100147.585,4351.1262,N,01108.8712,E,1,03,17.1,-0.0,M,45.2,M,,*4D\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.1,17.1,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,34*71\r\n" +"$GPGSV,3,3,10,30,69,314,30,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100147.585,A,4351.1262,N,01108.8712,E,0.00,187.49,131009,,,A*6C\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100148.585,4351.1263,N,01108.8712,E,1,03,17.1,-0.0,M,45.2,M,,*43\r\n" +"$GPRMC,100148.585,A,4351.1263,N,01108.8712,E,0.00,187.49,131009,,,A*62\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100149.584,4351.1262,N,01108.8712,E,1,03,17.1,-0.0,M,45.2,M,,*42\r\n" +"$GPRMC,100149.584,A,4351.1262,N,01108.8712,E,0.00,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100150.584,4351.1263,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*48\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.2,17.2,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,34*71\r\n" +"$GPGSV,3,3,10,30,69,314,29,31,10,314,,,,,,,,,*7C\r\n" +"$GPRMC,100150.584,A,4351.1263,N,01108.8712,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100151.584,4351.1261,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*4B\r\n" +"$GPRMC,100151.584,A,4351.1261,N,01108.8712,E,0.00,187.49,131009,,,A*69\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100152.584,4351.1259,N,01108.8713,E,1,03,17.2,-0.0,M,45.2,M,,*42\r\n" +"$GPRMC,100152.584,A,4351.1259,N,01108.8713,E,0.00,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,10015,N,01108.8713,E,1,03,17.2,-0.0,M,45.2,M,,*48\r" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.2,17.2,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"*74\r\n" +"$GPRMC,100153.584,A,4351.1261,N,01108.8713,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100154.583,4351.1260,N,01108.8713,E,1,03,17.2,0.0,M,45.2,M,,*64\r\n" +"$GPRMC,100154.583,A,4351.1260,N,01108.8713,E,0.00,187.49,131009,,,A*6B\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100155.583,4351.1259,N,01108.8712,E,1,03,17.2,0.0,M,45.2,M,,*6E\r\n" +"$GPRMC,100155.583,A,4351.1259,N,01108.8712,E,0.00,187.49,131009,,,A*61\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100156.583,4351.1258,N,01108.8712,E,1,03,17.2,0.0,M,45.2,M,,*6C\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.2,17.2,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,28,12,62,058,*4D\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,314,30,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100156.583,A,4351.1258,N,01108.8712,E,0.00,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100157.583,4351.1257,N,01108.8712,E,1,03,17.2,0.0,M,45.2,M,,*62\r\n" +"$GPRMC,100157.583,A,4351.1257,N,01108.8712,E,0.00,187.49,131009,,,A*6D\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100158.582,4351.1256,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*40\r\n" +"$GPRMC,100158.582,A,4351.1256,N,01108.8712,E,0.00,187.49,131009,,,A*62\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100159.582,4351.1255,N,01108.8712,E,1,03,17.2,0.0,M,45.2,M,,*6F\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.2,17.2,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,314,30,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100159.582,A,4351.1255,N,01108.8712,E,0.00,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100200.582,4351.1255,N,01108.8712,E,1,03,17.2,0.0,M,45.2,M,,*60\r\n" +"$GPRMC,100200.582,A,4351.1255,N,01108.8712,E,0.00,187.49,131009,,,A*6F\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100201.582,4351.1256,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*4F\r\n" +"$GPRMC,100201.582,A,4351.1256,N,01108.8712,E,0.00,187.49,131009,,,A*6D\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100202.582,4351.1256,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*4C\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.2,17.2,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,314,30,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100202.582,A,4351.1256,N,01108.8712,E,0.00,187.49,131009,,,A*6E\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100203.581,4351.1249,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*43\r\n" +"$GPRMC,100203.581,A,4351.1249,N,01108.8711,E,0.00,187.49,131009,,,A*61\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100204.581,4351.1250,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*4F\r\n" +"$GPRMC,100204.581,A,4351.1250,N,01108.8712,E,0.00,187.49,131009,,,A*6D\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100205.581,4351.1253,N,01108.8713,E,1,03,17.2,-0.0,M,45.2,M,,*4C\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.2,17.2,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,26,12,62,058,*43\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,36*73\r\n" +"$GPGSV,3,3,10,30,69,314,30,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100205.581,A,4351.1253,N,01108.8713,E,0.00,187.49,131009,,,A*6E\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGSV,3,3,10,30,69,315,30,31,10,314,,,,,,,,,*75\r\n" +"$GPRMC,100211.580,A,4351.1260,N,01108.8712,E,0.00,187.49,131009,,,A*6B\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100212.579,4351.1260,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*4C\r\n" +"$GPRMC,100212.579,A,4351.1260,N,01108.8712,E,0.00,187.49,131009,,,A*6E\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100213.579,4351.1255,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*48\r\n" +"$GPRMC,100213.579,A,4351.1255,N,01108.8711,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100214.579,4351.1258,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*42\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.2,17.2,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,25,12,62,058,*40\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,315,30,31,10,314,,,,,,,,,*75\r\n" +"$GPRMC,100214.579,A,4351.1258,N,01108.8711,E,0.00,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100215.579,4351.1260,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*48\r\n" +"$GPRMC,100215.579,A,4351.1260,N,01108.8711,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100216.579,4351.1261,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*4A\r\n" +"$GPRMC,100216.579,A,4351.1261,N,01108.8711,E,0.00,187.49,131009,,,A*68\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100217.578,4351.1263,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*4B\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.2,17.2,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,25,12,62,058,*40\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,315,31,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100217.578,A,4351.1263,N,01108.8712,E,0.00,187.49,131009,,,A*69\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100218.578,4351.1263,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*44\r\n" +"$GPRMC,100218.578,A,4351.1263,N,01108.8712,E,0.00,187.49,131009,,,A*66\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100219.578,4351.1261,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*44\r\n" +"$GPRMC,100219.578,A,4351.1261,N,01108.8711,E,0.00,187.49,131009,,,A*66\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100220.578,4351.1264,N,01108.8712,E,1,03,17.4,-0.0,M,45.2,M,,*4E\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,26,12,62,058,*43\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,315,31,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100220.578,A,4351.1264,N,01108.8712,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100221.577,4351.1265,N,01108.8713,E,1,03,17.4,-0.0,M,45.2,M,,*40\r\n" +"$GPRMC,100221.577,A,4351.1265,N,01108.8713,E,0.00,187.49,131009,,,A*64\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100222.577,4351.1266,N,01108.8713,E,1,03,17.4,-0.0,M,45.2,M,,*40\r\n" +"$GPRMC,100222.577,A,4351.1266,N,01108.8713,E,0.00,187.49,131009,,,A*64\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100223.577,4351.1267,N,01108.8714,E,1,03,17.4,-0.0,M,45.2,M,,*47\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,26,12,62,058,*43\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,32,29,43,215,36*72\r\n" +"$GPGSV,3,3,10,30,69,315,31,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100223.577,A,4351.1267,N,01108.8714,E,0.00,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100224.577,4351.1271,N,01108.8713,E,1,03,17.4,-0.0,M,45.2,M,,*40\r\n" +"$GPRMC,100224.577,A,4351.1271,N,01108.8713,E,0.00,187.49,131009,,,A*64\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100225.577,4351.1273,N,01108.8714,E,1,03,17.4,-0.0,M,45.2,M,,*44\r\n" +"$GPRMC,100225.577,A,4351.1273,N,01108.8714,E,0.00,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100226.576,4351.1274,N,01108.8714,E,1,03,17.4,-0.0,M,45.2,M,,*41\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,25,12,62,058,*40\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,32,29,43,215,35*71\r\n" +"$GPGSV,3,3,10,30,69,315,30,31,10,314,,,,,,,,,*75\r\n" +"$GPRMC,100226.576,A,4351.1274,N,01108.8714,E,0.00,187.49,131009,,,A*65\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100227.576,4351.1274,N,01108.8714,E,1,03,17.4,-0.0,M,45.2,M,,*40\r\n" +"$GPRMC,100227.576,A,4351.1274,N,01108.8714,E,0.00,187.49,131009,,,A*64\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100228.576,4351.1276,N,01108.8715,E,1,03,17.4,-0.0,M,45.2,M,,*4C\r\n" +"$GPRMC,100228.576,A,4351.1276,N,01108.8715,E,0.00,187.49,131009,,,A*68\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100229.576,4351.1280,N,01108.8715,E,1,03,17.4,-0.0,M,45.2,M,,*44\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,26,12,62,058,*43\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,315,31,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100229.576,A,4351.1280,N,01108.8715,E,0.00,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100230.576,4351.1282,N,01108.8715,E,1,03,17.4,-0.0,M,45.2,M,,*4E\r\n" +"$GPRMC,100230.576,A,4351.1282,N,01108.8715,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100231.575,4351.1294,N,01108.8718,E,1,03,17.4,-0.0,M,45.2,M,,*46\r\n" +"$GPRMC,100231.575,A,4351.1294,N,01108.8718,E,0.00,187.49,131009,,,A*62\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100232.575,4351.1295,N,01108.8718,E,1,03,17.4,-0.0,M,45.2,M,,*44\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,32,29,43,215,34*70\r\n" +"$GPGSV,3,3,10,30,69,315,30,31,10,314,,,,,,,,,*75\r\n" +"$GPRMC,100232.575,A,4351.1295,N,01108.8718,E,0.00,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100233.575,4351.1297,N,01108.8718,E,1,03,17.4,0.0,M,45.2,M,,*6A\r\n" +"$GPRMC,100233.575,A,4351.1297,N,01108.8718,E,0.00,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100234.575,4351.1301,N,01108.8719,E,1,03,17.4,-0.0,M,45.2,M,,*4F\r\n" +"$GPRMC,100234.575,A,4351.1301,N,01108.8719,E,0.00,187.49,131009,,,A*6B\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100235.574,4351.1305,N,01108.8719,E,1,03,17.4,-0.0,M,45.2,M,,*4B\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,32,29,43,215,34*70\r\n" +"$GPGSV,3,3,10,30,69,315,30,31,10,314,,,,,,,,,*75\r\n" +"$GPRMC,100235.574,A,4351.1305,N,01108.8719,E,0.00,187.49,131009,,,A*6F\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100236.574,4351.1308,N,01108.8720,E,1,03,17.4,-0.0,M,45.2,M,,*4F\r\n" +"$GPRMC,100236.574,A,4351.1308,N,01108.8720,E,0.00,187.49,131009,,,A*6B\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100237.574,4351.1311,N,01108.8720,E,1,03,17.4,-0.0,M,45.2,M,,*46\r\n" +"$GPRMC,100237.574,A,4351.1311,N,01108.8720,E,0.00,187.49,131009,,,A*62\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100238.574,4351.1314,N,01108.8721,E,1,03,17.4,-0.0,M,45.2,M,,*4D\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,26,12,62,058,*43\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,32,29,43,215,34*70\r\n" +"$GPGSV,3,3,10,30,69,315,30,31,10,314,,,,,,,,,*75\r\n" +"$GP351.1314,N,01108.8721,E,0.00,187.49,131009,,,A*69\r" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100239.574,4351.1316,N,01108.8722,E,1,03,17.4,-0.0,M,45.2,M,,*4D\r\n" +"$GPGGA,100206.581,4351.1256,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*48\r\n" +"$GPRMC,100206.581,A,4351.1256,N,01108.8711,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100207.581,4351.1257,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*48\r\n" +"$GPRMC,100207.581,A,4351.1257,N,01108.8711,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100208.580,4351.1258,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*4A\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.2,17.2,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,26,12,62,058,*43\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,314,30,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100208.580,A,4351.1258,N,01108.8712,E,0.00,187.49,131009,,,A*68\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100209.580,4351.1258,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*4B\r\n" +"$GPRMC,100209.580,A,4351.1258,N,01108.8712,E,0.00,187.49,131009,,,A*69\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100210.580,4351.1258,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*43\r\n" +"$GPRMC,100210.580,A,4351.1258,N,01108.8712,E,0.00,187.49,131009,,,A*61\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100211.580,4351.1260,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*49\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.2,17.2,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,26,12,62,058,*43\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,315,30,31,10,314,,,,,,,,,*75\r\n" +"$GPRMC,100211.580,A,4351.1260,N,01108.8712,E,0.00,187.49,131009,,,A*6B\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100212.579,4351.1260,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*4C\r\n" +"$GPRMC,100212.579,A,4351.1260,N,01108.8712,E,0.00,187.49,131009,,,A*6E\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100213.579,4351.1255,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*48\r\n" +"$GPRMC,100213.579,A,4351.1255,N,01108.8711,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100214.579,4351.1258,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*42\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.2,17.2,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,25,12,62,058,*40\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,315,30,31,10,314,,,,,,,,,*75\r\n" +"$GPRMC,100214.579,A,4351.1258,N,01108.8711,E,0.00,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100215.579,4351.1260,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*48\r\n" +"$GPRMC,100215.579,A,4351.1260,N,01108.8711,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100216.579,4351.1261,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*4A\r\n" +"$GPRMC,100216.579,A,4351.1261,N,01108.8711,E,0.00,187.49,131009,,,A*68\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100217.578,4351.1263,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*4B\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.2,17.2,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,25,12,62,058,*40\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,315,31,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100217.578,A,4351.1263,N,01108.8712,E,0.00,187.49,131009,,,A*69\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100218.578,4351.1263,N,01108.8712,E,1,03,17.2,-0.0,M,45.2,M,,*44\r\n" +"$GPRMC,100218.578,A,4351.1263,N,01108.8712,E,0.00,187.49,131009,,,A*66\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100219.578,4351.1261,N,01108.8711,E,1,03,17.2,-0.0,M,45.2,M,,*44\r\n" +"$GPRMC,100219.578,A,4351.1261,N,01108.8711,E,0.00,187.49,131009,,,A*66\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100220.578,4351.1264,N,01108.8712,E,1,03,17.4,-0.0,M,45.2,M,,*4E\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,26,12,62,058,*43\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,315,31,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100220.578,A,4351.1264,N,01108.8712,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100221.577,4351.1265,N,01108.8713,E,1,03,17.4,-0.0,M,45.2,M,,*40\r\n" +"$GPRMC,100221.577,A,4351.1265,N,01108.8713,E,0.00,187.49,131009,,,A*64\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100222.577,4351.1266,N,01108.8713,E,1,03,17.4,-0.0,M,45.2,M,,*40\r\n" +"$GPRMC,100222.577,A,4351.1266,N,01108.8713,E,0.00,187.49,131009,,,A*64\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100223.577,4351.1267,N,01108.8714,E,1,03,17.4,-0.0,M,45.2,M,,*47\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,26,12,62,058,*43\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,32,29,43,215,36*72\r\n" +"$GPGSV,3,3,10,30,69,315,31,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100223.577,A,4351.1267,N,01108.8714,E,0.00,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100224.577,4351.1271,N,01108.8713,E,1,03,17.4,-0.0,M,45.2,M,,*40\r\n" +"$GPRMC,100224.577,A,4351.1271,N,01108.8713,E,0.00,187.49,131009,,,A*64\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100225.577,4351.1273,N,01108.8714,E,1,03,17.4,-0.0,M,45.2,M,,*44\r\n" +"$GPRMC,100225.577,A,4351.1273,N,01108.8714,E,0.00,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100226.576,4351.1274,N,01108.8714,E,1,03,17.4,-0.0,M,45.2,M,,*41\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,25,12,62,058,*40\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,32,29,43,215,35*71\r\n" +"$GPGSV,3,3,10,30,69,315,30,31,10,314,,,,,,,,,*75\r\n" +"$GPRMC,100226.576,A,4351.1274,N,01108.8714,E,0.00,187.49,131009,,,A*65\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100227.576,4351.1274,N,01108.8714,E,1,03,17.4,-0.0,M,45.2,M,,*40\r\n" +"$GPRMC,100227.576,A,4351.1274,N,01108.8714,E,0.00,187.49,131009,,,A*64\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100228.576,4351.1276,N,01108.8715,E,1,03,17.4,-0.0,M,45.2,M,,*4C\r\n" +"$GPRMC,100228.576,A,4351.1276,N,01108.8715,E,0.00,187.49,131009,,,A*68\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100229.576,4351.1280,N,01108.8715,E,1,03,17.4,-0.0,M,45.2,M,,*44\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,26,12,62,058,*43\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,33,29,43,215,35*70\r\n" +"$GPGSV,3,3,10,30,69,315,31,31,10,314,,,,,,,,,*74\r\n" +"$GPRMC,100229.576,A,4351.1280,N,01108.8715,E,0.00,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100230.576,4351.1282,N,01108.8715,E,1,03,17.4,-0.0,M,45.2,M,,*4E\r\n" +"$GPRMC,100230.576,A,4351.1282,N,01108.8715,E,0.00,187.49,131009,,,A*6A\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100231.575,4351.1294,N,01108.8718,E,1,03,17.4,-0.0,M,45.2,M,,*46\r\n" +"$GPRMC,100231.575,A,4351.1294,N,01108.8718,E,0.00,187.49,131009,,,A*62\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100232.575,4351.1295,N,01108.8718,E,1,03,17.4,-0.0,M,45.2,M,,*44\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,32,29,43,215,34*70\r\n" +"$GPGSV,3,3,10,30,69,315,30,31,10,314,,,,,,,,,*75\r\n" +"$GPRMC,100232.575,A,4351.1295,N,01108.8718,E,0.00,187.49,131009,,,A*60\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100233.575,4351.1297,N,01108.8718,E,1,03,17.4,0.0,M,45.2,M,,*6A\r\n" +"$GPRMC,100233.575,A,4351.1297,N,01108.8718,E,0.00,187.49,131009,,,A*63\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100234.575,4351.1301,N,01108.8719,E,1,03,17.4,-0.0,M,45.2,M,,*4F\r\n" +"$GPRMC,100234.575,A,4351.1301,N,01108.8719,E,0.00,187.49,131009,,,A*6B\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100235.574,4351.1305,N,01108.8719,E,1,03,17.4,-0.0,M,45.2,M,,*4B\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,27,12,62,058,*42\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,32,29,43,215,34*70\r\n" +"$GPGSV,3,3,10,30,69,315,30,31,10,314,,,,,,,,,*75\r\n" +"$GPRMC,100235.574,A,4351.1305,N,01108.8719,E,0.00,187.49,131009,,,A*6F\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100236.574,4351.1308,N,01108.8720,E,1,03,17.4,-0.0,M,45.2,M,,*4F\r\n" +"$GPRMC,100236.574,A,4351.1308,N,01108.8720,E,0.00,187.49,131009,,,A*6B\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100237.574,4351.1311,N,01108.8720,E,1,03,17.4,-0.0,M,45.2,M,,*46\r\n" +"$GPRMC,100237.574,A,4351.1311,N,01108.8720,E,0.00,187.49,131009,,,A*62\r\n" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100238.574,4351.1314,N,01108.8721,E,1,03,17.4,-0.0,M,45.2,M,,*4D\r\n" +"$GPGSA,A,2,09,27,29,,,,,,,,,,17.4,17.4,0.0*34\r\n" +"$GPGSV,3,1,10,2,34,086,,4,20,052,,9,31,143,26,12,62,058,*43\r\n" +"$GPGSV,3,2,10,14,37,266,,26,34,231,,27,24,143,32,29,43,215,34*70\r\n" +"$GPGSV,3,3,10,30,69,315,30,31,10,314,,,,,,,,,*75\r\n" +"$GP351.1314,N,01108.8721,E,0.00,187.49,131009,,,A*69\r" +"$GPVTG,187.49,T,,,0.00,N,0.00,K,A*73\r\n" +"$GPGGA,100239.574,4351.1316,N,01108.8722,E,1,03,17.4,-0.0,M,45.2,M,,*4D\r\n" +}; + +static NmeaGga gga_test1 = +{ + .latitude = 43851403, + .longitude = 11147808, + .altitude = 57, + .time = 57928, + .satellites = 5, + .quality = 1, + .hdop = 26, + .geoid = 45, +}; + +static NmeaGga gga_test2 = +{ + .latitude = 43851403, + .longitude = 11147808, + .altitude = -57, + .time = 57928, + .satellites = 5, + .quality = 1, + .hdop = 26, + .geoid = 45, +}; + +static NmeaGga gga_test3 = +{ + .latitude = -43851403, + .longitude = -11147808, + .altitude = -57, + .time = 57928, + .satellites = 5, + .quality = 1, + .hdop = 26, + .geoid = -45, +}; + +static NmeaRmc rmc_test = +{ + .time = 1254758726, + .warn = 'A', + .latitude = 43851405, + .longitude = 11147812, + .speed = 0, + .course = 237, + .mag_var = 0 +}; + + +static NmeaVtg vtg_test = +{ + .track_good = 237, + .knot_speed = 0, + .km_speed = 0 +}; + +static NmeaGsv gsv_test = +{ + .tot_message = 3, + .message_num = 1, + .tot_svv = 9, + .info = + { + { 3, 78, 302, 37 }, + { 6, 87, 31, 0 }, + { 7, 5, 292, 37 }, + { 14, 5, 135, 0 } + + } +}; + +typedef struct NmeaTest +{ + int test_num; + void *val; +} NmeaTest; + +NmeaTest test_vector[] = +{ + {1, &rmc_test}, + {2, &vtg_test}, + {3, &gsv_test}, + {4, &gga_test1}, + {5, &gga_test2}, + {6, &gga_test3}, +}; + + +static void *find_test(int n) +{ + for (unsigned i=0; i < countof(test_vector); i++) + if (n == test_vector[i].test_num) + return test_vector[i].val; + + return NULL; +} + +#define TOT_GOOD_SENTENCE_NUM 665 +#define TOT_SENTENCE_NUM 731 + +static int tot_sentence_parsed = 0; + +/** + * do something with the GGA data + */ +static void gpgga_callout_test(nmeap_context_t *context, void *data, void *user_data) +{ + (void)context; + (void)user_data; + NmeaGga *gga = (NmeaGga *)data; + + tot_sentence_parsed++; + void *test = find_test(tot_sentence_parsed); + if (test) + ASSERT(memcmp(test, gga, sizeof(*gga)) == 0); + + LOG_INFO("[%d]found GPGGA message %ld %ld %ld %lu %d %d %d %d\n",tot_sentence_parsed, + (long)gga->latitude, + (long)gga->longitude, + (long)gga->altitude, + gga->time, + gga->satellites, + gga->quality, + gga->hdop, + gga->geoid); +} + +/** + * do something with the RMC data + */ +static void gprmc_callout_test(nmeap_context_t *context, void *data, void *user_data) +{ + (void)context; + (void)user_data; + NmeaRmc *rmc = (NmeaRmc *)data; + + tot_sentence_parsed++; + void *test = find_test(tot_sentence_parsed); + if (test) + ASSERT(memcmp(test, rmc, sizeof(*rmc)) == 0); + + LOG_INFO("[%d]found GPRMC Message %lu %c %ld %ld %d %d %d\n",tot_sentence_parsed, + rmc->time, + rmc->warn, + (long)rmc->latitude, + (long)rmc->longitude, + rmc->speed, + rmc->course, + rmc->mag_var); +} + +/** + * do something with the GSV data + */ +static void gpgsv_callout_test(nmeap_context_t *context, void *data, void *user_data) +{ + (void)context; + (void)user_data; + NmeaGsv *gsv = (NmeaGsv *)data; + + tot_sentence_parsed++; + void *test = find_test(tot_sentence_parsed); + if (test) + ASSERT(memcmp(test, gsv, sizeof(*gsv)) == 0); + + LOG_INFO("[%d]Found GPGSV message %d %d %d\n",tot_sentence_parsed, + gsv->tot_message, + gsv->message_num, + gsv->tot_svv); + + for (int i = 0; i < 4; i++) + LOG_INFO("\t[%d]%d %d %d %d\n", i, gsv->info[i].sv_prn, gsv->info[i].elevation, gsv->info[i].azimut, gsv->info[i].snr); +} + +/** + * do something with the VTG data + */ +static void gpvtg_callout_test(nmeap_context_t *context, void *data, void *user_data) +{ + (void)context; + (void)user_data; + NmeaVtg *vtg = (NmeaVtg *)data; + + tot_sentence_parsed++; + void *test = find_test(tot_sentence_parsed); + if (test) + ASSERT(memcmp(test, vtg, sizeof(*vtg)) == 0); + + LOG_INFO("[%d]Found GPVTG message %d %d %d\n",tot_sentence_parsed, + vtg->track_good, + vtg->knot_speed, + vtg->km_speed); +} + +int nmea_testSetup(void) +{ + kdbg_init(); + + kfilemem_init(&mem, nmea_test, sizeof(nmea_test)); + LOG_INFO("Init test buffer..done.\n"); + + nmeap_init(&nmea, NULL); + nmeap_addParser(&nmea, "GPGGA", nmea_gpgga, gpgga_callout_test, &gga); + nmeap_addParser(&nmea, "GPRMC", nmea_gprmc, gprmc_callout_test, &rmc); + nmeap_addParser(&nmea, "GPGSV", nmea_gpgsv, gpgsv_callout_test, &gsv); + nmeap_addParser(&nmea, "GPVTG", nmea_gpvtg, gpvtg_callout_test, &vtg); + + return 0; +} + +int nmea_testTearDown(void) +{ + return 0; +} + +int nmea_testRun(void) +{ + for (int i = 0; i < TOT_SENTENCE_NUM; i++) + nmea_poll(&nmea, &mem.fd); + + kprintf("tot sentence %d\n", tot_sentence_parsed); + + if (tot_sentence_parsed != TOT_GOOD_SENTENCE_NUM) + { + LOG_ERR("Incorrect number of parsed sentence.\n"); + return -1; + } + + + return 0; +} + +TEST_MAIN(nmea); + diff --git a/2.5/bertos/net/nmeap/COPYING b/2.5/bertos/net/nmeap/COPYING new file mode 100644 index 00000000..9c542461 --- /dev/null +++ b/2.5/bertos/net/nmeap/COPYING @@ -0,0 +1,31 @@ +/* +Copyright (c) 2005, David M Howard (daveh at dmh2000.com) +All rights reserved. + +This product is licensed for use and distribution under the BSD Open Source License: + +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 holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, 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. +*/ + diff --git a/2.5/bertos/net/nmeap/Doxyfile b/2.5/bertos/net/nmeap/Doxyfile new file mode 100644 index 00000000..aae008ec --- /dev/null +++ b/2.5/bertos/net/nmeap/Doxyfile @@ -0,0 +1,1153 @@ +# Doxyfile 1.3.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = NMEAP + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 0.1 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of source +# files, where putting all generated files in the same directory would otherwise +# cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = inc/nmeap.h + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = NO + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/2.5/bertos/net/nmeap/Makefile b/2.5/bertos/net/nmeap/Makefile new file mode 100644 index 00000000..425079a3 --- /dev/null +++ b/2.5/bertos/net/nmeap/Makefile @@ -0,0 +1,23 @@ +# rules +export CC=gcc +export CDEFS = -DNDEBUG + +# directories +BASE :=$(shell pwd) +export SRC=$(BASE)/src +export TST=$(BASE)/tst +export INC=$(BASE)/inc +export LIB=$(BASE)/lib + +all : + cd $(SRC) && $(MAKE) all + cd $(TST) && $(MAKE) all + + +clean : + cd $(SRC) && $(MAKE) clean + cd $(TST) && $(MAKE) clean + +doc : + doxygen + diff --git a/2.5/bertos/net/nmeap/README b/2.5/bertos/net/nmeap/README new file mode 100644 index 00000000..bc2a6a08 --- /dev/null +++ b/2.5/bertos/net/nmeap/README @@ -0,0 +1,24 @@ +NMEAP is licensed under the BSD Open Source License. See the file COPYING for terms of the license + +VERSION 0.2 - bug fixes and tutorial + a. fixed a bug in test3.c + b. added a tutorial in doc/tutorial.html + +Installation: + +Unpack the tarball or zip file into the desired working directory. + +Building: + +Under Linux, execute 'make' from the top level directory. + +Under Win32, execute 'nmake -f win32.mak' from the top level directory + +Using: + +This library is statically linked to the application. Just include it in +your linker command line. See the file 'nmeap.h' and the examples in the +'tst' directory for usage instructions. + + + diff --git a/2.5/bertos/net/nmeap/doc/tutorial.html b/2.5/bertos/net/nmeap/doc/tutorial.html new file mode 100644 index 00000000..539a05ac --- /dev/null +++ b/2.5/bertos/net/nmeap/doc/tutorial.html @@ -0,0 +1,151 @@ + + +

NMEAP TUTORIAL AND REFERENCE

+
+
+copyright (c) 2005 David M. Howard
+This work is licensed under the Creative Commons Attribution License.
+To view a copy of this license, visit
+http://creativecommons.org/licenses/by/2.0/ or send a letter to
+Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305,USA
+You are free:
+    * to copy, distribute, display, and perform the work
+    * to make derivative works
+    * to make commercial use of the work
+Under the following conditions:
+Attribution. You must give the original author credit.
+    * For any reuse or distribution, you must make clear to others the
+      license terms of this work.
+    * Any of these conditions can be waived if you get permission from
+      the author.
+
+
+

Table Of Contents

+
    +
  1. Installing the Source Code
  2. +
  3. Building the Library
  4. +
  5. Description and Examples
  6. +
  7. API Documentation
  8. +
+  +

1. Installing the source code

+Get the source code from NMEAP at sourceforge.net +
+
+Linux:
+	expand the tarball to a directory of your choice.
+	>tar --gzip -xf [tarball name]
+	>cd [nmeap...]
+	
+Windows:
+	use Winzip to unzip the zipfile to a directory of your choice
+	
+
+ +  +

2. Building the library

+
+
+Linux:
+	>cd [working directory]
+	>make
+	This builds a static library named libnmeap.a in the 'lib' directory. there is no option for a dynamic library. 
+	This thing is so small that it isn't worth the trouble. It also builds the test/examples programs in
+	'tst'.
+	
+Windows:
+	>cd [working directory]
+	>nmake -f win32.mak
+	Again, this builds a static library names libnmeap.lib in the 'lib' direcotry, plus the test programs in 'tst'
+
+  +

3. Description and Examples

+

The NMEA-0183 standard specifies how the output is formatted for GPS data output, usually on a serial port. The data +consists of 'sentences' delimited by CR/LF end of line markers. A lot has been written about the format, so this document +won't cover the specifics. A good place to start is the NMEA FAQ +maintained by Peter Bennett.

+

NMEAP is an extensible C language parser library that takes NMEA sentences as input and spits out the decoded data as output. You link +NMEAP in to your application, set it up, initialize it and feed it bytes. It signals you when it has found a complete valid sentence and +provides the parsed out data to you. Parsing NMEA-0183 is pretty easy but it has a few tricky bits. The value of NMEAP is not that it is +rocket science to write an NMEA parser, but that it provides a relatively efficient implementation that works, along with an +extension framework to add more sentence parsers without hacking the base source code.

+

An NMEA 'sentence' has the following format:

+
+	$name,data1,data2,...,dataN*XX[CR/LF]
+	OR
+	$name,data1,data2,...,dataN[CR/LF]
+	
+where
+	header       := a 5 digit sentence identifier. all ASCII upper case. e.g. GPGGA
+	data1..dataN := some number of data elements, all ASCII numbers or letters, in all kinds of weird formats.
+                    fields can be empty, in which case 2 commas will be side by side.
+                    normally data fields are identified by their position in the sentence. 
+	*XX          := a '*' plus two ASCII hex digits of checksum. this field is optional.
+	[CR/LF]      := end of line is terminated by a carriage return/linefeed pair.
+	
+example from the NMEA FAQ:
+ 	$GPGGA,123519,4807.038,N,01131.324,E,1,08,0.9,545.4,M,46.9,M,,*42
+
+

The NMEAP parser works as follows: +

    +
  1. the application sets up the parser and specifies which sentences are to be parsed + and what is to be done with the output data from the parser.
  2. +
  3. the application reads raw bytes from its IO device and passes the bytes to the parser, + either byte by byte or as a buffer/length pair.
  4. +
  5. nmeap: +
      +
    • runs the input bytes through a lexical scanner that recognizes complete and valid sentences
    • +
    • when a sentence is recognized, a second lexical scanner divides the sentence into discrete tokens.
    • +
    • the name field is matched internally to a sentence parser for that name
    • +
    • the sentence parser picks out the data strings and decodes them into an nmeap or user + defined data structure with normal data types such as integer, float, double etc.
    • +
    • notifies the client application that a sentence was found and decoded, either thru a callout + to an event handler (ala Expat) or via a return code and a shared data structure, or both.
    • +
    +
  6. +
+

Sentence Parsers

+

Most of the work in NMEAP is done by the sentence parsers. Each type of NMEA sentence string has an associated parser. NMEAP provides +standard ones, and the user can add more in a systematic way. +The sentence parser is responsible for knowing the token position of the data elements and whatever format they +are in. There are functions in nmeap to decode standard data element formats. If something is nonstandard, +the sentence parser decodes it. Each sentence parser has a 'struct' type associated with it +that the decoded data gets poked into an instance of that data structure, which is provided by the client application when nmeap is set +up.

+

Memory Allocation

+

All memory allocation is done by the application. Several data items are required. The application can declare them statically or use +malloc or whatever. NMEAP doesn't do any memory allocation on its own. This is an important requirement for portability and especially in +embedded systems where memory allocation needs to be tightly defined and controlled. +

+

Threads

+

NMEAP as implemented is not meant to be called from multiple threads. It expects to execute within the context of a single thread. The sentence callouts execute +in the context of the thread of the nmeap client thread. Given how nmeap works, it doesn't really make sense to make nmeap thread-safe +because the usage pattern is intrinsically single thread. If one wanted to, one could add some mutex locking within the nmeap function +calls to make it thread safe. In a multithreaded environment, a more likely approach to thread-safety is to put synchronization in the client side of the application, +within the sentence parser callouts or inline handling of sentence data. +

+

IO

+

NMEAP is IO agnostic. That is a pompous way of saying that NMEAP doesn't do the IO, the client application does it. There are way too +many IO schemes to handle to keep it portable, especially in the embedded world. That said, the example programs contain a Linux and a Win32 specific +program that includes serial IO for those two platforms. +

+ +

Examples

+Look at the code for the following example programs to see the usage patterns. The are all located in the +'tst' directory. There are big, obvious comments delineating the steps to setting up and using NMEAP. +The IO is simulated in the samples. Follow the comments in the code +to see the sequence of operations to setup and run the parser. When you are ready just plug in your own IO. +
    +
  1. tst/test1.c Setup for standard GGA and RMC sentences with byte by byte IO (easiest to code up)
  2. +
  3. tst/test2.c Setup for standard GGA and RMC sentences with block IO (more efficient from a system call standpoint)
  4. +
  5. tst/test3.c Adding a custom parser
  6. +
  7. tst/wingps.c A console program that reads a serial port and writes the decoded data to standard out for WIN32 applications
  8. +
+  +

API Documentation

+The documentation for the actual API is in Doxygen HTML format and is contained in the 'doc' directory of +the source distribution. Or, all the external data structures, constants and functions are defined in 'inc/nmeap.h'. + +

END

+ + diff --git a/2.5/bertos/net/nmeap/inc/nmeap.h b/2.5/bertos/net/nmeap/inc/nmeap.h new file mode 100644 index 00000000..f9bcc0fb --- /dev/null +++ b/2.5/bertos/net/nmeap/inc/nmeap.h @@ -0,0 +1,227 @@ +/* +Copyright (c) 2005, David M Howard (daveh at dmh2000.com) +All rights reserved. + +This product is licensed for use and distribution under the BSD Open Source License. +see the file COPYING for more details. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, 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. + +*/ + +#ifndef __NMEAP_H__ +#define __NMEAP_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "cfg/cfg_nmea.h" + +/* +============================================ +COMPILE TIME CONFIGURATION CONSTANTS +============================================ +*/ + +/* these constants affect the size of the context object. tweak them as desired but know what you are doing */ + +/** maximum number of sentence parsers supported */ +#define NMEAP_MAX_SENTENCES CONFIG_NMEAP_MAX_SENTENCES +/** length of sentence name. leave this at 5 unless you really know what you are doing */ +#define NMEAP_MAX_SENTENCE_NAME_LENGTH 5 +/** max length of a complete sentence. the standard says 82 bytes, but its probably better to go at least 128 since + * some units don't adhere to the 82 bytes especially for proprietary sentences */ +#define NMEAP_MAX_SENTENCE_LENGTH CONFIG_NMEAP_MAX_SENTENCE_LENGTH +/** max tokens in one sentence. 24 is enough for any standard sentence */ +#define NMEAP_MAX_TOKENS CONFIG_NMEAP_MAX_TOKENS + +/* predefined message ID's */ + +/* GGA MESSAGE ID */ +#define NMEAP_GPGGA 1 +/* RMC MESSAGE ID */ +#define NMEAP_GPRMC 2 + +/** user defined parsers should make ID numbers using NMEAP_USER as the base value, plus some increment */ +#define NMEAP_USER 100 + +/* forward references */ +struct nmeap_context; +struct nmeap_sentence; + +/* +============================================ +CALLOUTS +============================================ +*/ + +/** + * sentence callout function type + * a callout is fired for each registered sentence type + * the callout gets the object context and a pointer to sentence specific data. + * the callout must cast the 'sentence_data' to the appropriate type for that callout + * @param context nmea object context + * @param sentence_data sentence specific data +*/ +typedef void (*nmeap_callout_t)(struct nmeap_context *context,void *sentence_data,void *user_data); + +/** + * sentence parser function type + * stored in the object context and called internally when the sentence name matches + * the specified value + * the callout gets the object context and a pointer to sentence specific data. + * the callout must cast the 'sentence_data' to the appropriate type for that callout + * @param context nmea object context + * @param sentence_data sentence specific data + * @return id of sentence (each sentence parser knows its own ID) +*/ +typedef int (*nmeap_sentence_parser_t)(struct nmeap_context *context,struct nmeap_sentence *sentence); + + +/* ==== opaque types === */ +#include "nmeap_def.h" + + +/* +============================================ +STANDARD SENTENCE DATA STRUCTURES +============================================ +*/ + +/** extracted data from a GGA message */ +struct nmeap_gga { + double latitude; + double longitude; + double altitude; + unsigned long time; + int satellites; + int quality; + double hdop; + double geoid; +}; +typedef struct nmeap_gga nmeap_gga_t; + +/** extracted data from an RMC message */ +struct nmeap_rmc { + unsigned long time; + char warn; + double latitude; + double longitude; + double speed; + double course; + unsigned long date; + double magvar; +}; + +typedef struct nmeap_rmc nmeap_rmc_t; + +/* +============================================ +METHODS +============================================ +*/ + +/** + * initialize an NMEA parser. call this function to initialize a user allocated context object + * @param context nmea object context. allocated by user statically or dynamically. + * @param user_data pointer to user defined data + * @return 0 if ok, -1 if initialization failed + */ +int nmeap_init(nmeap_context_t *context,void *user_data); + +/** + * register an NMEA sentence parser + * @param context nmea object context + * @param sentence_name string matching the sentence name for this parser. e.g. "GPGGA". not including the '$' + * @param sentence_parser parser function for this sentence + * @param sentence_callout callout triggered when this sentence is received and parsed. + * if null, no callout is triggered for this sentence + * @param sentence_data user allocated sentence specific data defined by the application. the parser uses + this data item to store the extracted data. This data object needs to persist over the life + of the parser, so be careful if allocated on the stack. + * @return 0 if registered ok, -1 if registration failed + */ +int nmeap_addParser(nmeap_context_t *context, + const char *sentence_name, + nmeap_sentence_parser_t sentence_parser, + nmeap_callout_t sentence_callout, + void *sentence_data + ); + +/** + * parse a buffer of nmea data. + * @param context nmea object context + * @param buffer buffer of input characters + * @param length [in,out] pointer to length of buffer. on return, contains number of characters not used for + * the current sentence + * @return -1 if error, 0 if the data did not complete a sentence, sentence code if a sentence was found in the stream + */ +int nmeap_parseBuffer(nmeap_context_t *context,const char *buffer,int *length); + +/** + * parse one character of nmea data. + * @param context nmea object context + * @param ch input character + * @return -1 if error, 0 if the data did not complete a sentence, sentence code if a sentence was found in the stream + */ +int nmeap_parse(nmeap_context_t *context,char ch); + + +/** + * built-in parser for GGA sentences. + * @param context nmea object context + * @param sentence sentence object for this parser + */ +int nmeap_gpgga(nmeap_context_t *context,nmeap_sentence_t *sentence); + +/** + * built-in parser for RMC sentences. + * @param context nmea object context + * @param sentence sentence object for this parser + */ +int nmeap_gprmc(nmeap_context_t *context,nmeap_sentence_t *sentence); + +/** + * extract latitude from 2 tokens in ddmm.mmmm,h format. + * @param plat pointer to token with numerical latitude + * @param phem pointer to token with hemisphere + * @return latitude in degrees and fractional degrees + */ +double nmeap_latitude(const char *plat,const char *phem); + + +/** + * extract longitude from 2 tokens in ddmm.mmmm,h format. + * @param plat pointer to token with numerical longitude + * @param phem pointer to token with hemisphere + * @return longitude in degrees and fractional degrees + */ +double nmeap_longitude(const char *plat,const char *phem); + + +/** + * extract altitude from 2 tokens in xx.x format. + * @param palt pointer to token with numerical altitude + * @param punits pointer to token with measure unint + * @return altitude in meter or feet + */ +double nmeap_altitude(const char *palt,const char *punits); + +#ifdef __cplusplus +} // extern C +#endif + + +#endif + diff --git a/2.5/bertos/net/nmeap/inc/nmeap_def.h b/2.5/bertos/net/nmeap/inc/nmeap_def.h new file mode 100644 index 00000000..e8c44e32 --- /dev/null +++ b/2.5/bertos/net/nmeap/inc/nmeap_def.h @@ -0,0 +1,72 @@ +/* +Copyright (c) 2005, David M Howard (daveh at dmh2000.com) +All rights reserved. + +This product is licensed for use and distribution under the BSD Open Source License. +see the file COPYING for more details. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, 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. + +*/ + +#ifndef __NMEAP_DEF_H__ +#define __NMEAP_DEF_H__ + +/** + * context for a single sentence + */ +typedef struct nmeap_sentence { + char name[NMEAP_MAX_SENTENCE_NAME_LENGTH + 1]; + int id; + nmeap_sentence_parser_t parser; + nmeap_callout_t callout; + void *data; +} nmeap_sentence_t; + +/** + * parser context + */ +struct nmeap_context { + /** support up to 8 sentences */ + nmeap_sentence_t sentence[NMEAP_MAX_SENTENCES]; /* sentence descriptors */ + int sentence_count; /* number of initialized descriptors */ + + /** sentence input buffer */ + char input[NMEAP_MAX_SENTENCE_LENGTH + 1]; /* input line buffer */ + int input_count; /* index into 'input */ + int input_state; /* current lexical scanner state */ + char input_name[6]; /* sentence name */ + char icks; /* input checksum */ + char ccks; /* computed checksum */ + + /* tokenization */ + char *token[NMEAP_MAX_TOKENS]; /* list of delimited tokens */ + int tokens; /* list of tokens */ + + /** errors and debug. optimize these as desired */ + unsigned long msgs; /* count of good messages */ + unsigned long err_hdr; /* header error */ + unsigned long err_ovr; /* overrun error */ + unsigned long err_unk; /* unknown error */ + unsigned long err_id; /* bad character in id */ + unsigned long err_cks; /* bad checksum */ + unsigned long err_crl; /* expecting cr or lf, got something else */ + char debug_input[NMEAP_MAX_SENTENCE_LENGTH + 1]; /* input line buffer for debug */ + + /** opaque user data */ + void *user_data; +}; + +typedef struct nmeap_context nmeap_context_t; + +#endif /* __NMEAP_DEF_H__ */ diff --git a/2.5/bertos/net/nmeap/src/Makefile b/2.5/bertos/net/nmeap/src/Makefile new file mode 100644 index 00000000..5e94960c --- /dev/null +++ b/2.5/bertos/net/nmeap/src/Makefile @@ -0,0 +1,31 @@ +# specify compiler flags +CFLAGS = -I $(INC) $(CDEFS) -g -O0 -Werror -Wall + +# set library name +LIBNAME = libnmeap.a + +COBJ = nmeap01.o + +INCLUDES= $(INC)/nmeap.h $(INC)/nmeap_def.h + +# build everything +all : $(LIB)/$(LIBNAME) + +# build the library +$(LIB)/$(LIBNAME) : $(COBJ) + -$(RM) $(LIB)/$(LIBNAME) + $(AR) -q $(LIB)/$(LIBNAME) $(COBJ) + +# build all c files into .o files +$(COBJ): %.o: %.c + $(CC) -c $(CFLAGS) $(SRC)/$< -o $@ + +# erase all intermediate and output files +clean : + -$(RM) *.o + -$(RM) *~ + -$(RM) $(LIB)/$(LIBNAME) + +# include file dependencies +$(COBJ) : $(INCLUDES) + diff --git a/2.5/bertos/net/nmeap/src/nmeap.mak b/2.5/bertos/net/nmeap/src/nmeap.mak new file mode 100644 index 00000000..703ffc9d --- /dev/null +++ b/2.5/bertos/net/nmeap/src/nmeap.mak @@ -0,0 +1,20 @@ +INCLUDES= ..\inc\nmeap.h ..\inc\nmeap_def.h +CSRC = nmeap01.c +LIBNAME = ..\lib\libnmeap.lib + +# build everything +all : $(LIBNAME) + +$(LIBNAME) : nmeap01.obj + -erase $(LIBNAME) + lib /OUT:$(LIBNAME) nmeap01.obj + +nmeap01.obj : nmeap01.c $(INCLUDES) + cl /DNDEBUG /c /I..\inc nmeap01.c + +# erase all intermediate and output files +clean : + -erase *.obj + -erase $(LIBNAME) + + diff --git a/2.5/bertos/net/nmeap/src/nmeap01.c b/2.5/bertos/net/nmeap/src/nmeap01.c new file mode 100644 index 00000000..c3912428 --- /dev/null +++ b/2.5/bertos/net/nmeap/src/nmeap01.c @@ -0,0 +1,634 @@ +/* +Copyright (c) 2005, David M Howard (daveh at dmh2000.com) +All rights reserved. + +This product is licensed for use and distribution under the BSD Open Source License. +see the file COPYING for more details. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, 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. + +*/ + +/** + * nmeap01.c + * nmeap gps data parser + * + * see the file COPYING for terms of the licnese +*/ + +#include +#include +#include +#include + +#include "../inc/nmeap.h" + +#include + +#define assert(x) ASSERT(x) + +#include "cfg/cfg_nmea.h" + +#define LOG_LEVEL NMEA_LOG_LEVEL +#define LOG_FORMAT NMEA_LOG_FORMAT +#include + +#ifdef _DEBUG + #undef NDEBUG + #define printf(str,...) LOG_INFO(str, ## __VA_ARGS__) +#endif + +/* this only works if you are sure you have an upper case hex digit */ +#define HEXTOBIN(ch) ((ch <= '9') ? ch - '0' : ch - ('A' - 10)) + +/* forward references */ +int nmeap_init(nmeap_context_t *context,void *user_data); +int nmeap_addParser(nmeap_context_t *context, + const char *sentence_name, + nmeap_sentence_parser_t sentence_parser, + nmeap_callout_t sentence_callout, + void *sentence_data + ); +int nmeap_tokenize(nmeap_context_t *context); +int nmeap_process(nmeap_context_t *context); +int nmeap_parse(nmeap_context_t *context,char ch); +int nmeap_parseBuffer(nmeap_context_t *context,const char *buffer,int *length); + +/** + * get a latitude out of a pair of nmea tokens + */ +double nmeap_latitude(const char *plat,const char *phem) +{ + double lat; + int deg; + double min; + int ns; + + assert(plat != 0); + assert(phem != 0); + + if (*plat == 0) { + return 0.0; + } + if (*phem == 0) { + return 0.0; + } + + /* north lat is +, south lat is - */ + if (*phem == 'N') { + ns = 1; + } + else { + ns = -1; + } + + /* latitude is degrees, minutes, fractional minutes */ + /* no validation is performed on the token. it better be good.*/ + /* if it comes back 0.0 then probably the token was bad */ + lat = atof(plat); + + /* extract the degree part */ + deg = (int)(lat / 100.0); + + /* mask out the degrees */ + min = lat - (deg * 100.0); + + /* compute the actual latitude in degrees.decimal-degrees */ + lat = (deg + (min / 60.0)) * ns; + + return lat; +} + +/** + * get a longitude out of a pair of nmea tokens + */ +double nmeap_longitude(const char *plon,const char *phem) +{ + double lon; + int deg; + double min; + int ew; + + assert(plon != 0); + assert(phem != 0); + + if (*plon == 0) { + return 0.0; + } + if (*phem == 0) { + return 0.0; + } + + /* west long is negative, east long is positive */ + if (*phem == 'E') { + ew = 1; + } + else { + ew = -1; + } + + /* longitude is degrees, minutes, fractional minutes */ + /* no validation is performed on the token. it better be good.*/ + /* if it comes back 0.0 then probably the token was bad */ + lon = atof(plon); + + /* extract the degree part */ + deg = (int)(lon / 100.0); + + /* mask out the degrees */ + min = lon - (deg * 100.0); + + /* compute the actual lonitude in degrees.decimal-degrees */ + lon = (deg + (min / 60.0)) * ew; + + + return lon; +} + +/** + * get an altitude longitude out of a pair of nmea tokens + * ALTITUDE is returned in METERS + */ +double nmeap_altitude(const char *palt,const char *punits) +{ + double alt; + + if (*palt == 0) { + return 0.0; + } + + /* convert with no error checking */ + alt = atof(palt); + + if (*punits == 'M') { + /* already in meters */ + } + else if (*punits == 'F') { + /* convert to feet */ + alt = alt * 3.2808399; + } + + return alt; +} + +/** + * initialize an NMEA parser + */ +int nmeap_init(nmeap_context_t *context,void *user_data) +{ + assert(context != 0); + + memset(context,0,sizeof(*context)); + + context->user_data = user_data; + + return 0; +} + +/** + * register an NMEA sentence parser + */ +int nmeap_addParser(nmeap_context_t *context, + const char *sentence_name, + nmeap_sentence_parser_t sentence_parser, + nmeap_callout_t sentence_callout, + void *sentence_data + ) +{ + nmeap_sentence_t *s = 0; + + /* runtime error */ + assert(context != 0); + + /* sentence capacity overflow */ + if (context->sentence_count >= NMEAP_MAX_SENTENCES) { + return -1; + } + + /* point at next empty sentence buffer */ + s = &context->sentence[context->sentence_count]; + + /* advance sentence data count */ + context->sentence_count++; + + /* clear the sentence data */ + memset(s,0,sizeof(*s)); + + /* name */ + strncpy(s->name,sentence_name,NMEAP_MAX_SENTENCE_NAME_LENGTH); + + /* parser */ + s->parser = sentence_parser; + + /* callout */ + s->callout = sentence_callout; + + /* data */ + s->data = sentence_data; + + return 0; +} + +/** + * tokenize a buffer + */ +int nmeap_tokenize(nmeap_context_t *context) +{ + char *s; + int tokens; + int state; + + /* first token is header. assume it is there */ + tokens = 0; + s = context->input; + context->token[tokens] = s; + + /* get rest of tokens */ + tokens = 1; + state = 0; + while((*s != 0)&&(tokens < NMEAP_MAX_TOKENS)) { + switch(state) { + case 0: + /* looking for end of a token */ + if (*s == ',') { + /* delimit at the comma */ + *s = 0; + /* new token */ + state = 1; + } + break; + case 1: + /* start of next token, might be another comma */ + context->token[tokens++] = s; + if (*s == ',') { + /* delimit at the comma */ + *s = 0; + } + else { + /* not a comma */ + state = 0; + } + break; + default: + state = 0; + break; + } + + // next character + s++; + } + return tokens; +} + +/** + * process a sentence + */ +int nmeap_process(nmeap_context_t *context) +{ + int id; + int i; + nmeap_sentence_t *s; + + /* copy the input to a debug buffer */ + /* remove debug_input when everything is working. */ + strncpy(context->debug_input,context->input,sizeof(context->debug_input)); + + /* tokenize the input */ + context->tokens = nmeap_tokenize(context); + + /* try to find a matching sentence parser */ + /* this search is O(n). it has a lot of potential for optimization, at the expense of complexity, if you have a lot of sentences */ + /* binary search instead of linear (have to keep sentences in sorted order) O(NlogN) */ + /* OR, when sentences are added, create a TRIE structure to find the names with a constant time search O(5) */ + for(i=0;isentence_count;i++) { + s = &context->sentence[i]; + assert(s != 0); + if (strncmp(context->input_name,s->name,5) == 0) { + /* found a match, call its parser */ + id = (*context->sentence[i].parser)(context,s); + if (id > 0) { + break; + } + } + } + + return id; +} + +/** + +-5-+ +---+ + v | v | + +------+ +------+ +------+ +------+ +------+ + | 0 |--$--> |1-hdr |--alnum--> |2-data|----\r-->| 6-LF |---\n--->| done |--> 0 + +------+ +------+ +------+ +------+ +------+ + | ^ + * +--------\r-------+ + V | + +------+ +------+ +------+ + |3-cks |--xdigit-->|4-cks |-xdigit->| 5-CR | + +------+ +------+ +------+ + +return to start conditions: +1. buffer overflow +2. invalid character for state + +checksum calculation +two hex digits represent the XOR of all characters between, but not +including, the "$" and "*". A checksum is required on some +sentences. + +*/ +int nmeap_parse(nmeap_context_t *context,char ch) +{ + int status = 0; + + /* check for input buffer overrun first to avoid duplicating code in the + individual states + */ + if ((size_t)context->input_count >= (sizeof(context->input)-1)) { + /* input buffer overrun, restart state machine */ + context->input_state = 0; + /* reset input count */ + context->input_count = 0; + } + + /* store the byte */ + context->input[context->input_count] = ch; + + /* next buffer position */ + context->input_count++; + + /* run it through the lexical scanner */ + switch(context->input_state) { + /* LOOKING FOR $ */ + case 0: + if (ch == '$') { + /*look for id */ + context->input_state = 1; + context->ccks = 0; + context->icks = 0; + } + else { + /* header error, start over */ + context->err_hdr++; + context->input_state = 0; + context->input_count = 0; + } + break; + /* LOOKING FOR 5 CHARACTER SENTENCE ID */ + case 1: + /* allow numbers even though it isn't usually done */ + /* a proprietary id might have a numeral */ + if (isalnum(ch)) { + /* store name separately */ + context->input_name[context->input_count - 2] = ch; + /* checksum */ + context->ccks ^= ch; + /* end of header? */ + if (context->input_count >= 6) { + /* yes, get body */ + context->input_state = 2; + } + } + else { + /* bad character, start over */ + context->err_id++; + context->input_state = 0; + context->input_count = 0; + } + break; + /* LOOKING FOR CR OR CHECKSUM INDICATOR */ + case 2: + if (ch == '*') { + /* this sentence has a checksum */ + context->input_state = 3; + } + else if (ch == '\r') { + /* carriage return, no checksum, force a match */ + context->icks = 0; + context->ccks = 0; + context->input_state = 6; + } + else { + /* continue accumulating data */ + /* checksum */ + context->ccks ^= ch; + } + break; + /* LOOKING FOR FIRST CHECKSUM CHARACTER */ + case 3: + /* must be upper case hex digit */ + if (isxdigit(ch) && (ch <= 'F')) { + /* got first checksum byte */ + context->input_state = 4; + context->icks = HEXTOBIN(ch) << 4; + } + else { + /* input error, restart */ + context->err_cks++; + context->input_state = 0; + context->input_count = 0; + } + break; + /* LOOKING FOR SECOND CHECKSUM CHARACTER */ + case 4: + /* must be upper case hex digit */ + if (isxdigit(ch) && (ch <= 'F')) { + /* got second checksum byte */ + context->input_state = 5; + context->icks += HEXTOBIN(ch); + } + else { + /* input error, restart */ + context->err_cks++; + context->input_state = 0; + context->input_count = 0; + } + break; + /* LOOKING FOR CR */ + case 5: + if (ch == '\r') { + /* carriage return */ + context->input_state = 6; + } + else { + /* input error, restart */ + context->err_crl++; + context->input_state = 0; + context->input_count = 0; + } + break; + /* LOOKING FOR LINE FEED */ + case 6: + if (ch == '\n') { + /* linefeed, line complete */ + + /* delimit buffer */ + context->input[context->input_count] = 0; + + /* if the checksums match, process the sentence */ + if (context->ccks == context->icks) { + /* process */ + status = nmeap_process(context); + + /* count good messages */ + context->msgs++; + } + else { + /* count checksum errors */ + context->err_cks++; + } + + /* restart next time */ + context->input_state = 0; + context->input_count = 0; + } + else { + /* input error, restart */ + context->err_crl++; + context->input_state = 0; + context->input_count = 0; + } + break; + default: + context->err_unk++; + context->input_state = 0; + break; + } + + return status; +} + +/** + * parse a buffer of nmea data + */ +int nmeap_parseBuffer(nmeap_context_t *context,const char *buffer,int *length) +{ + int i; + int status; + int rem; + int tlen; + + tlen = *length; + rem = *length; + status = 0; + /* for each byte in the buffer */ + for(i=0;idata; + + /* if there is a data element, extract data from the tokens */ + if (gga != 0) { + gga->latitude = nmeap_latitude(context->token[2],context->token[3]); + gga->longitude = nmeap_longitude(context->token[4],context->token[5]); + gga->altitude = nmeap_altitude(context->token[9],context->token[10]); + gga->time = atoi(context->token[1]); + gga->satellites = atoi(context->token[7]); + gga->quality = atoi(context->token[6]); + gga->hdop = atof(context->token[8]); + gga->geoid = nmeap_altitude(context->token[11],context->token[12]); + } + +#ifndef NDEBUG + /* print raw input string */ + printf("%s",context->debug_input); + + /* print some validation data */ + printf("%s==%s %02x==%02x\n",context->input_name,sentence->name,context->icks,context->ccks); + + /* print the tokens */ + for(i=0;itokens;i++) { + printf("%d:%s\n",i,context->token[i]); + } +#endif + + /* if the sentence has a callout, call it */ + if (sentence->callout != 0) { + (*sentence->callout)(context,gga,context->user_data); + } + + return NMEAP_GPGGA; +} + +/** + * standard GPRMCntence parser + */ +int nmeap_gprmc(nmeap_context_t *context,nmeap_sentence_t *sentence) +{ +#ifndef NDEBUG + int i; +#endif + + /* get pointer to sentence data */ + nmeap_rmc_t *rmc = (nmeap_rmc_t *)sentence->data; + + /* if there is a data element, use it */ + if (rmc != 0) { + /* extract data from the tokens */ + rmc->time = atoi(context->token[1]); + rmc->warn = *context->token[2]; + rmc->latitude = nmeap_latitude(context->token[3],context->token[4]); + rmc->longitude = nmeap_longitude(context->token[5],context->token[6]); + rmc->speed = atof(context->token[7]); + rmc->course = atof(context->token[8]); + rmc->date = atoi(context->token[9]); + rmc->magvar = atof(context->token[10]); + } + +#ifndef NDEBUG + /* print raw input string */ + printf("%s",context->debug_input); + + /* print some validation data */ + printf("%s==%s %02x==%02x\n",context->input_name,sentence->name,context->icks,context->ccks); + + /* print the tokens */ + for(i=0;itokens;i++) { + printf("%d:%s\n",i,context->token[i]); + } +#endif + + /* if the sentence has a callout, call it */ + if (sentence->callout != 0) { + (*sentence->callout)(context,rmc,context->user_data); + } + + return NMEAP_GPRMC; +} + + diff --git a/2.5/bertos/net/nmeap/tst/Makefile b/2.5/bertos/net/nmeap/tst/Makefile new file mode 100644 index 00000000..e8407529 --- /dev/null +++ b/2.5/bertos/net/nmeap/tst/Makefile @@ -0,0 +1,17 @@ +all : test1 test2 test3 + +test1 : $(LIB)/libnmeap.a $(TST)/test1.c + gcc -g -O0 -I $(INC) $(CDEFS) -Wall -Werror -o test1 $(TST)/test1.c $(LIB)/libnmeap.a + +test2 : $(LIB)/libnmeap.a $(TST)/test2.c + gcc -g -O0 -I $(INC) $(CDEFS) -Wall -Werror -o test2 $(TST)/test2.c $(LIB)/libnmeap.a + +test3 : $(LIB)/libnmeap.a $(TST)/test3.c + gcc -g -O0 -I $(INC) $(CDEFS) -Wall -Werror -o test3 $(TST)/test3.c $(LIB)/libnmeap.a + +clean: + -$(RM) test1 + -$(RM) test2 + -$(RM) test3 + + diff --git a/2.5/bertos/net/nmeap/tst/test1.c b/2.5/bertos/net/nmeap/tst/test1.c new file mode 100644 index 00000000..3c5e18b5 --- /dev/null +++ b/2.5/bertos/net/nmeap/tst/test1.c @@ -0,0 +1,193 @@ +/* +Copyright (c) 2005, David M Howard (daveh at dmh2000.com) +All rights reserved. + +This product is licensed for use and distribution under the BSD Open Source License. +see the file COPYING for more details. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, 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. + +*/ + +/* +======================================================================================================== +EXAMPLE : SETUP FOR GGA AND RMC SENTENCES WITH CHARACTER BY CHARACTER IO +======================================================================================================= +*/ + + +#include +#include +#include +#include "nmeap.h" + +nmeap_gga_t g_gga; + +char test_vector[] = { +"$GPGGA,123519,3929.946667,N,11946.086667,E,1,08,0.9,545.4,M,46.9,M,,*4A\r\n" /* good */ +"$xyz,1234,asdfadfasdfasdfljsadfkjasdfk\r\n" /* junk */ +"$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68\r\n" /* good */ +"$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*48\r\n" /* checksum error */ +}; + +char *pvec = test_vector; + +/** simulate character by character IO */ +int readchar() +{ + int ch; + if (*pvec == 0) { + ch = -1; + } + else { + ch = *pvec++; + } + return ch; +} + +/** do something with the GGA data */ +static void print_gga(nmeap_gga_t *gga) +{ + printf("found GPGGA message %.6f %.6f %.0f %lu %d %d %f %f\n", + gga->latitude , + gga->longitude, + gga->altitude , + gga->time , + gga->satellites, + gga->quality , + gga->hdop , + gga->geoid + ); +} + +/** called when a gpgga message is received and parsed */ +static void gpgga_callout(nmeap_context_t *context,void *data,void *user_data) +{ + nmeap_gga_t *gga = (nmeap_gga_t *)data; + + printf("-------------callout\n"); + print_gga(gga); +} + + +/** do something with the RMC data */ +static void print_rmc(nmeap_rmc_t *rmc) +{ + printf("found GPRMC Message %lu %c %.6f %.6f %f %f %lu %f\n", + rmc->time, + rmc->warn, + rmc->latitude, + rmc->longitude, + rmc->speed, + rmc->course, + rmc->date, + rmc->magvar + ); +} + +/** called when a gprmc message is received and parsed */ +static void gprmc_callout(nmeap_context_t *context,void *data,void *user_data) +{ + nmeap_rmc_t *rmc = (nmeap_rmc_t *)data; + + printf("-------------callout\n"); + print_rmc(rmc); +} + +/* ---------------------------------------------------------------------------------------*/ +/* STEP 1 : allocate the data structures. be careful if you put them on the stack because */ +/* they need to be live for the duration of the parser */ +/* ---------------------------------------------------------------------------------------*/ +static nmeap_context_t nmea; /* parser context */ +static nmeap_gga_t gga; /* this is where the data from GGA messages will show up */ +static nmeap_rmc_t rmc; /* this is where the data from RMC messages will show up */ +static int user_data; /* user can pass in anything. typically it will be a pointer to some user data */ + +int main(int argc,char *argv[]) +{ + int status; + char ch; + + /* ---------------------------------------*/ + /*STEP 2 : initialize the nmea context */ + /* ---------------------------------------*/ + status = nmeap_init(&nmea,(void *)&user_data); + if (status != 0) { + printf("nmeap_init %d\n",status); + exit(1); + } + + /* ---------------------------------------*/ + /*STEP 3 : add standard GPGGA parser */ + /* -------------------------------------- */ + status = nmeap_addParser(&nmea,"GPGGA",nmeap_gpgga,gpgga_callout,&gga); + if (status != 0) { + printf("nmeap_add %d\n",status); + exit(1); + } + + /* ---------------------------------------*/ + /*STEP 4 : add standard GPRMC parser */ + /* -------------------------------------- */ + status = nmeap_addParser(&nmea,"GPRMC",nmeap_gprmc,gprmc_callout,&rmc); + if (status != 0) { + printf("nmeap_add %d\n",status); + exit(1); + } + + /* ---------------------------------------*/ + /*STEP 5 : process input until done */ + /* -------------------------------------- */ + for(;;) { + /* ---------------------------------------*/ + /*STEP 6 : get a byte at a time */ + /* -------------------------------------- */ + ch = readchar(); + if (ch <= 0) { + break; + } + + /* --------------------------------------- */ + /*STEP 7 : pass it to the parser */ + /* status indicates whether a complete msg */ + /* arrived for this byte */ + /* NOTE : in addition to the return status */ + /* the message callout will be fired when */ + /* a complete message is processed */ + /* --------------------------------------- */ + status = nmeap_parse(&nmea,ch); + + /* ---------------------------------------*/ + /*STEP 8 : process the return code */ + /* -------------------------------------- */ + switch(status) { + case NMEAP_GPGGA: + /* GOT A GPGGA MESSAGE */ + printf("-------------switch\n"); + print_gga(&gga); + printf("-------------\n"); + break; + case NMEAP_GPRMC: + /* GOT A GPRMC MESSAGE */ + printf("-------------switch\n"); + print_rmc(&rmc); + printf("-------------\n"); + break; + default: + break; + } + } + + return 0; +} + diff --git a/2.5/bertos/net/nmeap/tst/test2.c b/2.5/bertos/net/nmeap/tst/test2.c new file mode 100644 index 00000000..39a700f3 --- /dev/null +++ b/2.5/bertos/net/nmeap/tst/test2.c @@ -0,0 +1,208 @@ +/* +Copyright (c) 2005, David M Howard (daveh at dmh2000.com) +All rights reserved. + +This product is licensed for use and distribution under the BSD Open Source License. +see the file COPYING for more details. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, 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. + +*/ + +/* +======================================================================================================== +EXAMPLE : SETUP FOR GGA AND RMC SENTENCES WITH CHARACTER BY CHARACTER IO +======================================================================================================= +*/ + + +#include +#include +#include +#include "nmeap.h" + +nmeap_gga_t g_gga; + +char test_vector[] = { +"$GPGGA,123519,3929.946667,N,11946.086667,E,1,08,0.9,545.4,M,46.9,M,,*4A\r\n" /* good */ +"$xyz,1234,asdfadfasdfasdfljsadfkjasdfk\r\n" /* junk */ +"$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68\r\n" /* good */ +"$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*48\r\n" /* checksum error */ +}; + +char *pvec = test_vector; + +/** simulate block IO */ +int readbuffer(char *buffer,int len) +{ + int i; + + if (*pvec == 0) { + // end of file + return -1; + } + + for(i=0;ilatitude , + gga->longitude, + gga->altitude , + gga->time , + gga->satellites, + gga->quality , + gga->hdop , + gga->geoid + ); +} + +/** called when a gpgga message is received and parsed */ +static void gpgga_callout(nmeap_context_t *context,void *data,void *user_data) +{ + nmeap_gga_t *gga = (nmeap_gga_t *)data; + + printf("-------------callout\n"); + print_gga(gga); +} + + +/** do something with the RMC data */ +static void print_rmc(nmeap_rmc_t *rmc) +{ + printf("found GPRMC Message %lu %c %.6f %.6f %f %f %lu %f\n", + rmc->time, + rmc->warn, + rmc->latitude, + rmc->longitude, + rmc->speed, + rmc->course, + rmc->date, + rmc->magvar + ); +} + +/** called when a gprmc message is received and parsed */ +static void gprmc_callout(nmeap_context_t *context,void *data,void *user_data) +{ + nmeap_rmc_t *rmc = (nmeap_rmc_t *)data; + + printf("-------------callout\n"); + print_rmc(rmc); +} + +/* ---------------------------------------------------------------------------------------*/ +/* STEP 1 : allocate the data structures. be careful if you put them on the stack because */ +/* they need to be live for the duration of the parser */ +/* ---------------------------------------------------------------------------------------*/ +static nmeap_context_t nmea; /* parser context */ +static nmeap_gga_t gga; /* this is where the data from GGA messages will show up */ +static nmeap_rmc_t rmc; /* this is where the data from RMC messages will show up */ +static int user_data; /* user can pass in anything. typically it will be a pointer to some user data */ + +int main(int argc,char *argv[]) +{ + int status; + int rem; + int offset; + int len; + char buffer[32]; + + /* ---------------------------------------*/ + /*STEP 2 : initialize the nmea context */ + /* ---------------------------------------*/ + status = nmeap_init(&nmea,(void *)&user_data); + if (status != 0) { + printf("nmeap_init %d\n",status); + exit(1); + } + + /* ---------------------------------------*/ + /*STEP 3 : add standard GPGGA parser */ + /* -------------------------------------- */ + status = nmeap_addParser(&nmea,"GPGGA",nmeap_gpgga,gpgga_callout,&gga); + if (status != 0) { + printf("nmeap_add %d\n",status); + exit(1); + } + + /* ---------------------------------------*/ + /*STEP 4 : add standard GPRMC parser */ + /* -------------------------------------- */ + status = nmeap_addParser(&nmea,"GPRMC",nmeap_gprmc,gprmc_callout,&rmc); + if (status != 0) { + printf("nmeap_add %d\n",status); + exit(1); + } + + /* ---------------------------------------*/ + /*STEP 5 : process input until done */ + /* -------------------------------------- */ + for(;;) { + /* ---------------------------------------*/ + /*STEP 6 : get a buffer of input */ + /* -------------------------------------- */ + len = rem = readbuffer(buffer,sizeof(buffer)); + if (len <= 0) { + break; + } + + /* ----------------------------------------------*/ + /*STEP 7 : process input until buffer is used up */ + /* --------------------------------------------- */ + offset = 0; + while(rem > 0) { + /* --------------------------------------- */ + /*STEP 8 : pass it to the parser */ + /* status indicates whether a complete msg */ + /* arrived for this byte */ + /* NOTE : in addition to the return status */ + /* the message callout will be fired when */ + /* a complete message is processed */ + /* --------------------------------------- */ + status = nmeap_parseBuffer(&nmea,&buffer[offset],&rem); + offset += (len - rem); + + /* ---------------------------------------*/ + /*STEP 9 : process the return code */ + /* -------------------------------------- */ + switch(status) { + case NMEAP_GPGGA: + printf("-------------switch\n"); + print_gga(&gga); + printf("-------------\n"); + break; + case NMEAP_GPRMC: + printf("-------------switch\n"); + print_rmc(&rmc); + printf("-------------\n"); + break; + default: + break; + } + } + } + + return 0; +} + diff --git a/2.5/bertos/net/nmeap/tst/test3.c b/2.5/bertos/net/nmeap/tst/test3.c new file mode 100644 index 00000000..250f53c4 --- /dev/null +++ b/2.5/bertos/net/nmeap/tst/test3.c @@ -0,0 +1,306 @@ +/* +Copyright (c) 2005, David M Howard (daveh at dmh2000.com) +All rights reserved. + +This product is licensed for use and distribution under the BSD Open Source License. +see the file COPYING for more details. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, 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. + +*/ + +/* +======================================================================================================== +EXAMPLE : SETUP FOR GGA AND RMC SENTENCES + A CUSTOM SENTENCE PARSER WITH CHARACTER BY CHARACTER IO +======================================================================================================= +*/ + + +/* +$PGRMF + +GARMIN PROPRIETARY GPS Position Fix Data + +$PGRMF,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15*HH +1 = GPS week number +2 = GPS seconds in current week +3 = UTC date, ddmmyy format +4 = UTC time, hhmmss format +5 = GPS leap second count +6 = Latitude, dddmm.mmmm format +7 = Latitude hemisphere, N or S +8 = Longitude, dddmm.mmmm format +9 = Longitude hemisphere, E or W +10 = Mode (M=Manual, A=Automatic) +11 = Fix type (0=No fix, 1=2D fix, 2=3D fix) +12 = Speed over ground, kilometres / hour +13 = Course over ground, degrees true +14 = PDOP (Position dilution of precision), rounded to nearest integer +15 = TDOP (Time dilution of precision), rounded to nearest integer +HH = Checksum +*/ + + + +#include +#include +#include +#include +#include "nmeap.h" + +nmeap_gga_t g_gga; + +char test_vector[] = { +"$GPGGA,123519,3929.946667,N,11946.086667,E,1,08,0.9,545.4,M,46.9,M,,*4A\r\n" +"$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68\r\n" +"$PGRMF,1,100,191105,123519,13,3929.946667,N,12311.12,W,A,2,100.1,181.2,3,8*35\r\n" +}; + +char *pvec = test_vector; + +/** simulate character by character IO */ +int readchar() +{ + int ch; + if (*pvec == 0) { + ch = -1; + } + else { + ch = *pvec++; + } + return ch; +} +/* --------------------------------------------------------------*/ +/*STEP 1a : define a data structure to contain the sentence data */ +/* ------------------------------------------------------------- */ +struct garmin_rmf { + /* field position in sentence */ + int week; /* 1 = GPS week number */ + int seconds_of_week; /* 2 = GPS seconds in current week */ + unsigned long date; /* 3 = UTC date, ddmmyy format */ + unsigned long time; /* 4 = UTC time, hhmmss format */ + int leap; /* 5 = GPS leap second count */ + double lat; /* 6,7 = Latitude, dddmm.mmmm format (north positive) */ + double lon; /* 8,9 = Longitude, dddmm.mmmm format (east positive) */ + int mode; /* 10 = Mode (M=Manual, A=Automatic) */ + int fix; /* 11 = Fix type (0=No fix, 1=2D fix, 2=3D fix) */ + double speed; /* 12 = Speed over ground, kilometres / hour */ + double course; /* 13 = Course over ground, degrees true */ + int pdop; /* 14 = PDOP (Position dilution of precision), rounded to nearest integer */ + int tdop; /* 15 = TDOP (Time dilution of precision), rounded to nearest integer */ +}; +typedef struct garmin_rmf garmin_rmf_t; + +/* --------------------------------------------------------------*/ +/*STEP 1b : define an id value for the message */ +/* ------------------------------------------------------------- */ +#define GARMIN_PGRMF (NMEAP_USER + 0) + + +/* --------------------------------------------------------------*/ +/* STEP 1c : write the sentence parser */ +/* ------------------------------------------------------------- */ +int custom_pgrmf(nmeap_context_t *context,nmeap_sentence_t *sentence) +{ +#ifndef NDEBUG + int i; +#endif + + /* get pointer to sentence data */ + garmin_rmf_t *rmf = (garmin_rmf_t *)sentence->data; + + if (rmf != 0) { + /* if the sentence has a data storage element, use it */ + + + /* extract data from the tokens */ + rmf->week = atoi(context->token[1]); + rmf->seconds_of_week = atoi(context->token[2]); + rmf->date = (unsigned long)atol(context->token[3]); + rmf->time = (unsigned long)atol(context->token[4]); + rmf->leap = atoi(context->token[5]); + rmf->lat = nmeap_latitude(context->token[6],context->token[7]); + rmf->lon = nmeap_longitude(context->token[8],context->token[9]); + rmf->mode = atoi(context->token[10]); + rmf->fix = atoi(context->token[11]); + rmf->speed = atof(context->token[12]); + rmf->course = atof(context->token[13]); + rmf->pdop = atoi(context->token[14]); + rmf->tdop = atoi(context->token[15]); + } + /* else there was no data element to store into */ + +#ifndef NDEBUG + /* print raw input string */ + printf("%s",context->debug_input); + + /* print some validation data */ + printf("%s==%s %02x==%02x\n",context->input_name,sentence->name,context->icks,context->ccks); + + /* print the tokens */ + for(i=0;itokens;i++) { + printf("%d:%s\n",i,context->token[i]); + } +#endif + + /* if the sentence has a callout, call it */ + if (sentence->callout != 0) { + (*sentence->callout)(context,rmf,context->user_data); + } + + return GARMIN_PGRMF; +} + + +/* -------------------------------------------------------------*/ +/*STEP 2 : write a function to do something with the data */ +/* ------------------------------------------------------------ */ +static void print_pgrmf(garmin_rmf_t *rmf) +{ + assert(rmf != 0); + + printf(" w sec date time lp lat lon m f spd crs p t\n"); + printf("found PGRMF message %d %d %lu %lu %d %.6f %.6f %d %d %.2f %.2f %d %d\n", + rmf->week, + rmf->seconds_of_week, + rmf->date, + rmf->time, + rmf->leap, + rmf->lat, + rmf->lon, + rmf->mode, + rmf->fix, + rmf->speed, + rmf->course, + rmf->pdop, + rmf->tdop + ); +} + +/* -------------------------------------------------------------*/ +/*STEP 3 : if using the callout method, write the callout */ +/* ------------------------------------------------------------ */ +static void pgrmf_callout(nmeap_context_t *context,void *data,void *user_data) +{ + garmin_rmf_t *rmf = (garmin_rmf_t *)data; + + printf("-------------callout\n"); + print_pgrmf(rmf); +} + + +/* ---------------------------------------------------------------------------------------*/ +/* STEP 4 : allocate the data structures. be careful if you put them on the stack because */ +/* they need to be live for the duration of the parser */ +/* ---------------------------------------------------------------------------------------*/ +static nmeap_context_t nmea; /* parser context */ +static nmeap_gga_t gga; /* this is where the data from GGA messages will show up */ +static nmeap_rmc_t rmc; /* this is where the data from RMC messages will show up */ +static garmin_rmf_t rmf; /* this is where the data from RMF messages will show up */ +static int user_data; /* user can pass in anything. typically it will be a pointer to some user data */ + +int main(int argc,char *argv[]) +{ + int status; + char ch; + + /* ---------------------------------------*/ + /*STEP 5 : initialize the nmea context */ + /* ---------------------------------------*/ + status = nmeap_init(&nmea,(void *)&user_data); + if (status != 0) { + printf("nmeap_init %d\n",status); + exit(1); + } + + /* ---------------------------------------*/ + /*STEP 6 : add standard GPGGA parser */ + /* (no callout this time) */ + /* -------------------------------------- */ + status = nmeap_addParser(&nmea,"GPGGA",nmeap_gpgga,0,&gga); + if (status != 0) { + printf("nmeap_add %d\n",status); + exit(1); + } + + /* ---------------------------------------*/ + /*STEP 7 : add standard GPRMC parser */ + /* (no callout this time) */ + /* -------------------------------------- */ + status = nmeap_addParser(&nmea,"GPRMC",nmeap_gprmc,0,&rmc); + if (status != 0) { + printf("nmeap_add %d\n",status); + exit(1); + } + + /* ---------------------------------------*/ + /*STEP 8 : ADD THE CUSTOM PARSER */ + /* with callout ) */ + /* -------------------------------------- */ + status = nmeap_addParser(&nmea,"PGRMF",custom_pgrmf,pgrmf_callout,&rmf); + if (status != 0) { + printf("nmeap_add %d\n",status); + exit(1); + } + /* ---------------------------------------*/ + /*STEP 9 : process input until done */ + /* -------------------------------------- */ + for(;;) { + /* ---------------------------------------*/ + /*STEP 10: get a byte at a time */ + /* -------------------------------------- */ + ch = readchar(); + if (ch <= 0) { + break; + } + + /* --------------------------------------- */ + /*STEP 11: pass it to the parser */ + /* status indicates whether a complete msg */ + /* arrived for this byte */ + /* NOTE : in addition to the return status */ + /* the message callout will be fired when */ + /* a complete message is processed */ + /* --------------------------------------- */ + status = nmeap_parse(&nmea,ch); + + /* ---------------------------------------*/ + /*STEP 12 : process the return code */ + /* -------------------------------------- */ + switch(status) { + case NMEAP_GPGGA: + /* GOT A GPGGA MESSAGE */ + printf("-------------switch\n"); + printf("GPGGA\n"); + printf("-------------\n"); + break; + case NMEAP_GPRMC: + /* GOT A GPRMC MESSAGE */ + printf("-------------switch\n"); + printf("GPRMC\n"); + printf("-------------\n"); + break; + case GARMIN_PGRMF: + /* GOT A PGRMF MESSAGE */ + printf("-------------switch\n"); + print_pgrmf(&rmf); + printf("-------------\n"); + break; + default: + break; + } + } + + return 0; +} + diff --git a/2.5/bertos/net/nmeap/tst/tst.mak b/2.5/bertos/net/nmeap/tst/tst.mak new file mode 100644 index 00000000..df5f3493 --- /dev/null +++ b/2.5/bertos/net/nmeap/tst/tst.mak @@ -0,0 +1,29 @@ +INCLUDES= ..\inc\nmeap.h ..\inc\nmeap_def.h +CSRC = nmeap01.c +LIBNAME = ..\lib\libnmeap.lib + +# build everything +all : test1.exe test2.exe test3.exe wingps.exe + +test1.exe : test1.c $(LIBNAME) + cl /DNDEBUG /c /I..\inc test1.c + link /OUT:test1.exe test1.obj $(LIBNAME) + +test2.exe : test2.c $(LIBNAME) + cl /DNDEBUG /c /I..\inc test2.c + link /OUT:test2.exe test2.obj $(LIBNAME) + +test3.exe : test3.c $(LIBNAME) + cl /DNDEBUG /c /I..\inc test3.c + link /OUT:test3.exe test3.obj $(LIBNAME) + +wingps.exe : wingps.c $(LIBNAME) + cl /DNDEBUG /c /I..\inc wingps.c + link /OUT:wingps.exe wingps.obj $(LIBNAME) + +# erase all intermediate and output files +clean : + -erase *.obj + -erase *.exe + + diff --git a/2.5/bertos/net/nmeap/tst/wingps.c b/2.5/bertos/net/nmeap/tst/wingps.c new file mode 100644 index 00000000..7e6b093a --- /dev/null +++ b/2.5/bertos/net/nmeap/tst/wingps.c @@ -0,0 +1,244 @@ +/* +Copyright (c) 2005, David M Howard (daveh at dmh2000.com) +All rights reserved. + +This product is licensed for use and distribution under the BSD Open Source License. +see the file COPYING for more details. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, 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. + +*/ + +/* +======================================================================================================== +EXAMPLE : SETUP FOR GGA AND RMC SENTENCES WITH SERIAL IO FOR WIN32 +======================================================================================================= +*/ +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include "nmeap.h" + +/** open a serial port */ +static HANDLE openPort(const char *port,int baud) +{ + HANDLE h; + DCB dcb; + COMMTIMEOUTS tmo; + int status; + + /* open the port */ + h = CreateFile( port, + GENERIC_READ | GENERIC_WRITE, + 0, + 0, + OPEN_EXISTING, + 0, + 0); + if (h == INVALID_HANDLE_VALUE) { + /* quit on error */ + return h; + } + + + /* read current configuration */ + status = GetCommState(h,&dcb); + if (status == 0) { + CloseHandle(h); + return INVALID_HANDLE_VALUE; + } + + /* set the baud rate and other parameters */ + dcb.BaudRate = baud; + dcb.ByteSize = 8; + dcb.Parity = NOPARITY; + dcb.StopBits = ONESTOPBIT; + + /* set configuration */ + status = SetCommState(h, &dcb); + if (status == 0) { + CloseHandle(h); + return INVALID_HANDLE_VALUE; + } + + /* read timeout configuration */ + status = GetCommTimeouts(h,&tmo); + if (status == 0) { + CloseHandle(h); + return INVALID_HANDLE_VALUE; + } + + /* set to indefinite blocking */ + tmo.ReadIntervalTimeout = 0; + tmo.ReadTotalTimeoutConstant = 0; + tmo.ReadTotalTimeoutMultiplier = 0; + status = SetCommTimeouts(h,&tmo); + if (status == 0) { + CloseHandle(h); + return INVALID_HANDLE_VALUE; + } + + return h; +} + +/** read a byte (blocking) */ +static int readPort(HANDLE h) +{ + BOOL status; + char ch; + DWORD count; + status = ReadFile(h,&ch,1,&count,0); + if (status == 0) { + return -1; + } + + return (int)ch; +} + + +static void closePort(HANDLE h) +{ + CloseHandle(h); +} + + +/** print current data */ +static void printGps(nmeap_gga_t *gga,nmeap_rmc_t *rmc) +{ + printf("%lu %lu %.6f %.6f %.0f %f %f %d %d\n", + gga->time, + rmc->date, + gga->latitude , + gga->longitude, + gga->altitude , + rmc->course, + rmc->speed, + gga->satellites, + gga->quality + ); +} + +/* ---------------------------------------------------------------------------------------*/ +/* STEP 1 : allocate the data structures. be careful if you put them on the stack because */ +/* they need to be live for the duration of the parser */ +/* ---------------------------------------------------------------------------------------*/ +static nmeap_context_t nmea; /* parser context */ +static nmeap_gga_t gga; /* this is where the data from GGA messages will show up */ +static nmeap_rmc_t rmc; /* this is where the data from RMC messages will show up */ +static int user_data; /* user can pass in anything. typically it will be a pointer to some user data */ + +int main(int argc,char *argv[]) +{ + int status; + char ch; + const char *port; + int baud; + HANDLE h; + + /* require both arguments */ + if (argc != 3) { + printf("%s \n",argv[0]); + return 1; + } + + /* serial port argument */ + port = argv[1]; + + /* baud rate argument */ + status = sscanf(argv[2],"%d",&baud); + if (status != 1) { + printf("%s \n",argv[0]); + printf("invalid : %s\n",argv[2]); + return 1; + } + + /** open the serial port */ + h = openPort(port,baud); + if (h == INVALID_HANDLE_VALUE) { + printf("can't open port : %s\n",port); + return 1; + } + + /* ---------------------------------------*/ + /*STEP 2 : initialize the nmea context */ + /* ---------------------------------------*/ + status = nmeap_init(&nmea,(void *)&user_data); + if (status != 0) { + printf("nmeap_init %d\n",status); + exit(1); + } + + /* ---------------------------------------*/ + /*STEP 3 : add standard GPGGA parser */ + /* -------------------------------------- */ + status = nmeap_addParser(&nmea,"GPGGA",nmeap_gpgga,0,&gga); + if (status != 0) { + printf("nmeap_add %d\n",status); + exit(1); + } + + /* ---------------------------------------*/ + /*STEP 4 : add standard GPRMC parser */ + /* -------------------------------------- */ + status = nmeap_addParser(&nmea,"GPRMC",nmeap_gprmc,0,&rmc); + if (status != 0) { + printf("nmeap_add %d\n",status); + exit(1); + } + + /* ---------------------------------------*/ + /*STEP 5 : process input until done */ + /* -------------------------------------- */ + for(;;) { + /* ---------------------------------------*/ + /*STEP 6 : get a byte at a time */ + /* -------------------------------------- */ + ch = readPort(h); + if (ch <= 0) { + break; + } + + /* --------------------------------------- */ + /*STEP 7 : pass it to the parser */ + /* status indicates whether a complete msg */ + /* arrived for this byte */ + /* NOTE : in addition to the return status */ + /* the message callout will be fired when */ + /* a complete message is processed */ + /* --------------------------------------- */ + status = nmeap_parse(&nmea,ch); + + /* ---------------------------------------*/ + /*STEP 8 : process the return code */ + /* -------------------------------------- */ + switch(status) { + case NMEAP_GPGGA: + /* GOT A GPGGA MESSAGE */ + printGps(&gga,&rmc); + break; + case NMEAP_GPRMC: + /* GOT A GPRMC MESSAGE */ + printGps(&gga,&rmc); + break; + default: + break; + } + } + + /* close and quit */ + closePort(h); + + return 0; +} diff --git a/2.5/bertos/net/nmeap/win32.mak b/2.5/bertos/net/nmeap/win32.mak new file mode 100644 index 00000000..5c79366f --- /dev/null +++ b/2.5/bertos/net/nmeap/win32.mak @@ -0,0 +1,22 @@ +# directories +SRC=src +TST=tst + +all : + cd $(SRC) + $(MAKE) -f nmeap.mak all + cd ..\$(TST) + $(MAKE) -f tst.mak all + cd .. + + +clean : + cd $(SRC) + $(MAKE) -f nmeap.mak clean + cd ..\$(TST) + $(MAKE) -f tst.mak clean + cd .. + +doc : + doxygen + diff --git a/2.5/bertos/net/pocketbus.c b/2.5/bertos/net/pocketbus.c new file mode 100644 index 00000000..117e40d0 --- /dev/null +++ b/2.5/bertos/net/pocketbus.c @@ -0,0 +1,291 @@ +/** + * \file + * + * + * \brief pocketBus protocol implementation. + * + * pocketBus protocol is a simple strictly master-slave protocol, usable + * in embedded systems. + * pocketBus frame is as follows: + *
+ * +----------------------------------------+
+ * | STX | VER | ADDR | PAYLOAD | CKS | ETX |
+ * +----------------------------------------+
+ * |     |     |      |         |     |     |
+ * + 1B  + 1B  +  2B  + N Byte  + 2B  + 1B  +
+ * 
+ * + * - STX, 1 byte (0x02), packet start + * - VER, 1 byte, packet version + * - ADDR, 2 byte, slave address + * - PAYLOAD, N byte, data field + * - CKS, 2 byte, checksum + * - ETX, 1 byte, (0x03) packet end + * + * Protocol parsing start on STX reception. When the receiving routine + * finds an STX char, it starts to read characters from the bus + * until an ETX is received. Once a packet is received, + * the parser checks packet correctness and checksum. If all is OK + * the payload is returned. + * + * STX (0x02), ETX(0x03) and ESC(0x1B) are special characters and cannot be + * transmitted inside payload without escaping them. + * To escape a character you must precede it by the ESC char. + * E.G. STX -> ESC + STX + * ETX -> ESC + ETX + * ESC -> ESC + ESC + * + * In the ADDR field is always specified the slave address. + * In the case of master trasmitting, ADDR contains the slave destination + * address. + * In case of slave replying, ADDR contains the slave address itself. + * Thus, the master device does not have an address. Packet must be routed to + * master by hardware bus design. + * + * The checksum algorithm used is rotating hash algortihm, quite simple but more + * reliable than simple checksum. + * The checksum in computed on all fields excluding STX, ETX and CHK fields itself. + * Checksum is computed on the packet *before* escaping. + * Escape sequence counts for 1 character only (the escaped one). + */ + +#include "pocketbus.h" + +#include "cfg/cfg_pocketbus.h" + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL POCKETBUS_LOG_LEVEL +#define LOG_VERBOSITY POCKETBUS_LOG_FORMAT +#include +#include +#include + +#include + +#include + +#include + +/** + * Send a character over pocketBus channel stream, handling escape mode. + */ +void pocketbus_putchar(struct PocketBusCtx *ctx, uint8_t c) +{ + /* Update checksum */ + rotating_update1(c, &ctx->out_cks); + + /* Escape characters with special meaning */ + if (c == POCKETBUS_ESC || c == POCKETBUS_STX || c == POCKETBUS_ETX) + kfile_putc(POCKETBUS_ESC, ctx->fd); + + kfile_putc(c, ctx->fd); +} + +/** + * Send pocketBus packet header. + */ +void pocketbus_begin(struct PocketBusCtx *ctx, pocketbus_addr_t addr) +{ + PocketBusHdr hdr; + + hdr.ver = POCKETBUS_VER; + hdr.addr = cpu_to_be16(addr); + rotating_init(&ctx->out_cks); + + /* Send STX */ + kfile_putc(POCKETBUS_STX, ctx->fd); + + /* Send header */ + pocketbus_write(ctx, &hdr, sizeof(hdr)); +} + +/** + * Send buffer \a _data over bus, handling escape. + */ +void pocketbus_write(struct PocketBusCtx *ctx, const void *_data, size_t len) +{ + const uint8_t *data = (const uint8_t *)_data; + + while (len--) + pocketbus_putchar(ctx, *data++); +} + +/** + * Send pocketBus packet tail. + */ +void pocketbus_end(struct PocketBusCtx *ctx) +{ + /* Send checksum */ + rotating_t cks = cpu_to_be16(ctx->out_cks); + pocketbus_write(ctx, &cks, sizeof(cks)); + + /* Send ETX */ + kfile_putc(POCKETBUS_ETX, ctx->fd); +} + +/** + * Send buffer of \a data to address \a addr with a pocketBus packet over channel stream. + */ +void pocketbus_send(struct PocketBusCtx *ctx, pocketbus_addr_t addr, const void *data, size_t len) +{ + pocketbus_begin(ctx, addr); + + /* Send data */ + pocketbus_write(ctx, data, len); + + pocketbus_end(ctx); +} + + +/** + * Try to read a packet from the pocketBus. + * \return true if a packet is received, false otherwise. + */ +bool pocketbus_recv(struct PocketBusCtx *ctx, struct PocketMsg *msg) +{ + int c; + + /* Process incoming characters until buffer is not empty */ + while ((c = kfile_getc(ctx->fd)) != EOF) + { + /* Look for STX char */ + if (c == POCKETBUS_STX && !ctx->escape) + { + /* When an STX is found, inconditionally start a new packet */ + if (ctx->sync) + kprintf("pocketBus double sync!\n"); + + ctx->sync = true; + ctx->len = 0; + rotating_init(&ctx->in_cks); + continue; + } + + if (ctx->sync) + { + /* Handle escape mode */ + if (c == POCKETBUS_ESC && !ctx->escape) + { + ctx->escape = true; + continue; + } + + /* Handle message end */ + if (c == POCKETBUS_ETX && !ctx->escape) + { + ctx->sync = false; + + /* Check minimum size */ + if (ctx->len < sizeof(PocketBusHdr) + sizeof(rotating_t)) + { + kprintf("pocketBus short pkt!\n"); + continue; + } + + /* Remove checksum bytes from packet len */ + ctx->len -= sizeof(rotating_t); + + /* Compute checksum */ + rotating_update(ctx->buf, ctx->len, &ctx->in_cks); + uint8_t cks_h = *(ctx->buf + ctx->len); + uint8_t cks_l = *(ctx->buf + ctx->len + 1); + + rotating_t recv_cks = (cks_h << 8) | cks_l; + + /* Checksum check */ + if (recv_cks == ctx->in_cks) + { + PocketBusHdr *hdr = (PocketBusHdr *)ctx; + + /* Check packet version */ + if (hdr->ver == POCKETBUS_VER) + { + /* Packet received, set msg fields */ + msg->payload = ctx->buf + sizeof(PocketBusHdr); + msg->addr = be16_to_cpu(hdr->addr); + msg->len = ctx->len - sizeof(PocketBusHdr); + msg->ctx = ctx; + return true; + } + else + { + kprintf("pocketBus version mismatch, here[%d], there[%d]\n", POCKETBUS_VER, hdr->ver); + continue; + } + } + else + { + kprintf("pocketBus cks error, here[%04X], there[%04X]\n", ctx->in_cks, recv_cks); + continue; + } + + } + + ctx->escape = false; + + /* Check buffer overflow: simply ignore + received data and go to unsynced state. */ + if (ctx->len >= CONFIG_POCKETBUS_BUFLEN) + { + kprintf("pocketBus buffer overflow\n"); + ctx->sync = false; + continue; + } + + /* Put received data in the buffer */ + ctx->buf[ctx->len] = c; + ctx->len++; + } + } + + /* + * Check stream status. + */ + if (kfile_error(ctx->fd)) + { + LOG_ERR("fd status[%04X]\n", kfile_error(ctx->fd)); + kfile_clearerr(ctx->fd); + } + + return false; +} + + +/** + * Initialize pocketBus protocol handler. + */ +void pocketbus_init(struct PocketBusCtx *ctx, struct KFile *fd) +{ + ASSERT(ctx); + ASSERT(fd); + + memset(ctx, 0, sizeof(*ctx)); + ctx->fd = fd; +} diff --git a/2.5/bertos/net/pocketbus.h b/2.5/bertos/net/pocketbus.h new file mode 100644 index 00000000..e67f2634 --- /dev/null +++ b/2.5/bertos/net/pocketbus.h @@ -0,0 +1,130 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Francesco Sacchi + * + * \brief Basical functions to use pocketBus protocol. + * + * $WIZ$ module_name = "pocketbus" + * $WIZ$ module_depends = "rotating_hash", "kfile" + * $WIZ$ module_configuration = "bertos/cfg/cfg_pocketbus.h" + */ + +#ifndef NET_POCKETBUS_H +#define NET_POCKETBUS_H + +#include "cfg/cfg_pocketbus.h" /* for CONFIG_POCKETBUS_BUFLEN */ +#include + +#include + +#include + +/** + * pocketBus special characters definitions. + * \{ + */ +#define POCKETBUS_STX 0x02 //ASCII STX +#define POCKETBUS_ETX 0x03 //ASCII ETX +#define POCKETBUS_ESC 0x1B //ASCII ESC +#define POCKETBUS_ACK 0x06 //ASCII ACK +#define POCKETBUS_NAK 0x15 //ASCII NAK +/*\}*/ + +#define POCKETBUS_BROADCAST_ADDR 0xFFFF ///< pocketBus broadcast address + +/** + * Type for pocketBus length. + */ +typedef uint16_t pocketbus_len_t; + +/** + * Type for pocketBus addresses. + */ +typedef uint16_t pocketbus_addr_t; + +/** + * Header of pocketBus messages. + */ +typedef struct PocketBusHdr +{ + #define POCKETBUS_VER 1 + uint8_t ver; ///< packet version + pocketbus_addr_t addr; ///< slave address +} PocketBusHdr; + +/** + * pocketBus context structure. + */ +typedef struct PocketBusCtx +{ + uint8_t buf[CONFIG_POCKETBUS_BUFLEN]; ///< receiving Buffer + struct KFile *fd; ///< File descriptor + bool sync; ///< Status flag: true if we have received an STX, false otherwise + bool escape; ///< Status flag: true if we are in escape mode, false otherwise + rotating_t in_cks; ///< Checksum computation for received data. + rotating_t out_cks; ///< Checksum computation for transmitted data. + pocketbus_len_t len; ///< Received length +} PocketBusCtx; + +STATIC_ASSERT(offsetof(PocketBusCtx, buf) == 0); +/** + * Structure holding pocketBus message parameters. + */ +typedef struct PocketMsg +{ + struct PocketBusCtx *ctx; ///< pocketBus message context + pocketbus_addr_t addr; ///< address for received packet + pocketbus_len_t len; ///< payload length + const uint8_t *payload; ///< payload data +} PocketMsg; + +/** + * This ensure that endianess convertion functions work on + * the right data size. + * \{ + */ +STATIC_ASSERT(sizeof(pocketbus_addr_t) == sizeof(uint16_t)); +STATIC_ASSERT(sizeof(rotating_t) == sizeof(uint16_t)); +/*\}*/ + +void pocketbus_putchar(struct PocketBusCtx *ctx, uint8_t c); +void pocketbus_begin(struct PocketBusCtx *ctx, pocketbus_addr_t addr); +void pocketbus_write(struct PocketBusCtx *ctx, const void *_data, size_t len); +void pocketbus_end(struct PocketBusCtx *ctx); + +void pocketbus_send(struct PocketBusCtx *ctx, pocketbus_addr_t addr, const void *data, size_t len); +bool pocketbus_recv(struct PocketBusCtx *ctx, struct PocketMsg *msg); +void pocketbus_init(struct PocketBusCtx *ctx, struct KFile *fd); + +#endif /* NET_POCKETBUS_H */ diff --git a/2.5/bertos/net/pocketcmd.c b/2.5/bertos/net/pocketcmd.c new file mode 100644 index 00000000..14bdc020 --- /dev/null +++ b/2.5/bertos/net/pocketcmd.c @@ -0,0 +1,229 @@ +/** + * \file + * + * + * \brief pocketBus protocol Command layer implementation. + * + * This module implements command layer over pocketBus + * protocol. + * Payload packets received by pocketBus are first checked for + * address matching. + * If a packet is addressed to us we look for a suitable + * callback function to call. + * + * The received payload format is as follows: + *
+ * +----------------------------------------+
+ * |  CMD |            DATA                 |
+ * +----------------------------------------+
+ * |      |                                 |
+ * +  2B  +           0..N Byte             +
+ * 
+ * + * The CMD ID used is the same supplied by the master when + * the command was sent. + * + * \author Francesco Sacchi + */ + +#include "pocketcmd.h" +#include "pocketbus.h" + +#include "cfg/cfg_pocketbus.h" + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL POCKETBUS_LOG_LEVEL +#define LOG_VERBOSITY POCKETBUS_LOG_FORMAT +#include +#include +#include +#include + +#include + +#include +#include + +#include + +/** + * pocketBus Command poll function. + * Call it to read and process pocketBus commands. + */ +void pocketcmd_poll(struct PocketCmdCtx *ctx) +{ + PocketCmdMsg msg; + while (pocketcmd_recv(ctx, &msg)) + { + /* Check for command callback */ + pocketcmd_hook_t callback = ctx->search(msg.cmd); + + /* Call it if exists */ + if (callback) + callback(&msg); + } +} + + + +/** + * pocketBus Command recv function. + * Call it to read and process pocketBus commands. + */ +bool pocketcmd_recv(struct PocketCmdCtx *ctx, PocketCmdMsg *recv_msg) +{ + PocketMsg msg; + + /* Try to read a packet from pocketBus */ + while (pocketbus_recv(ctx->bus_ctx, &msg)) + { + /* Check address */ + if (msg.addr == ctx->addr || + msg.addr == POCKETBUS_BROADCAST_ADDR) + { + + #if CPU_AVR + const PocketCmdHdr *hdr = (const PocketCmdHdr *)msg.payload; + #else + #if !CPU_ARM + #warning Fix alignment problem.. + /* + * The code below make one memcopy, this the only way to + * solve alignment problem on ARM. If you are use other + * architecture you should find other way to optimize + * this code. + */ + #endif + PocketCmdHdr hd; + memcpy(&hd, msg.payload, sizeof(PocketCmdHdr)); + const PocketCmdHdr *hdr = &hd; + #endif + + pocketcmd_t cmd = be16_to_cpu(hdr->cmd); + + /* We're no longer waiting for a reply (in case we were) */ + if (cmd == ctx->waiting) + ctx->waiting = PKTCMD_NULL; + + recv_msg->cmd_ctx = ctx; + recv_msg->cmd = cmd; + recv_msg->len = msg.len - sizeof(PocketCmdHdr); + recv_msg->buf = msg.payload + sizeof(PocketCmdHdr); + + return true; + } + } + + return false; +} + + +/** + * Send command \a cmd to/from slave adding \a len arguments in \a buf. + * Address used is contained in \a ctx->addr . + * If we are master and the message has a reply, you must set \a wait_reply to true. + * \return true if all is ok, false if we are already waiting a replay from another slave. + */ +bool pocketcmd_send(struct PocketCmdCtx *ctx, pocketcmd_t cmd, const void *buf, size_t len, bool wait_reply) +{ + /* Check if we are waiting a reply from someone */ + if (ctx->waiting != PKTCMD_NULL) + { + /* Check is reply timeout is elapsed */ + if (timer_clock() - ctx->reply_timer < ms_to_ticks(CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT)) + { + LOG_ERR("Pkt discard! waiting cmd[%04X]\n", ctx->waiting); + return false; + } + else + { + LOG_INFO("Timeout waiting cmd[%04X]\n", ctx->waiting); + ctx->waiting = PKTCMD_NULL; + } + } + + /* Endianess! */ + cmd = cpu_to_be16(cmd); + + /* Send packet */ + pocketbus_begin(ctx->bus_ctx, ctx->addr); + pocketbus_write(ctx->bus_ctx, &cmd, sizeof(cmd)); + pocketbus_write(ctx->bus_ctx, buf, len); + pocketbus_end(ctx->bus_ctx); + + if (wait_reply) + { + ctx->waiting = be16_to_cpu(cmd); + ctx->reply_timer = timer_clock(); + } + + return true; +} + +/** + * Init pocketBus command layer. + * \a ctx is pocketBus command layer context. + * \a bus_ctx is pocketBus context. + * \a addr is slave address (see pocketcmd_setAddr for details.) + * \a search is the lookup function used to search command ID callbacks. + */ +void pocketcmd_init(struct PocketCmdCtx *ctx, struct PocketBusCtx *bus_ctx, pocketbus_addr_t addr, pocketcmd_lookup_t search) +{ + ASSERT(ctx); + ASSERT(bus_ctx); + ASSERT(search); + MOD_CHECK(timer); + + memset(ctx, 0, sizeof(*ctx)); + ctx->bus_ctx = bus_ctx; + ctx->search = search; + pocketcmd_setAddr(ctx, addr); +} + +/** + * Helper function used to reply to master with an ACK. + */ +void pocketcmd_replyAck(struct PocketCmdMsg *msg) +{ + uint8_t ack[] = { POCKETBUS_ACK }; + + pocketcmd_slaveReply(msg->cmd_ctx, msg->cmd, ack, sizeof(ack)); +} + +/** + * Helper function used to reply to master with a NAK. + */ +void pocketcmd_replyNak(struct PocketCmdMsg *msg) +{ + uint8_t nak[] = { POCKETBUS_NAK }; + + pocketcmd_slaveReply(msg->cmd_ctx, msg->cmd, nak, sizeof(nak)); +} + diff --git a/2.5/bertos/net/pocketcmd.h b/2.5/bertos/net/pocketcmd.h new file mode 100644 index 00000000..8bfd5e09 --- /dev/null +++ b/2.5/bertos/net/pocketcmd.h @@ -0,0 +1,149 @@ +/** + * \file + * + * + * \brief PocketBus command abstraction layer. + * + * \author Francesco Sacchi + * + * $WIZ$ module_name = "pocketcmd" + * $WIZ$ module_depends = "timer", "pocketbus" + */ + +#ifndef NET_POCKETCMD_H +#define NET_POCKETCMD_H + +#include "pocketbus.h" +#include + +#define PKTCMD_NULL 0 ///< pocketBus Null command + +typedef uint16_t pocketcmd_t; ///< Type for Command IDs + +/** + * Header for transmitted pocketBus Commands. + */ +typedef struct PocketCmdHdr +{ + pocketcmd_t cmd; ///< command ID +} PocketCmdHdr; + +/** + * This ensure that endianess convertion functions work on + * the right data size. + * \{ + */ +STATIC_ASSERT(sizeof(pocketcmd_t) == sizeof(uint16_t)); +/*\}*/ + +/* fwd declaration */ +struct PocketCmdCtx; + +/** + * pocketBus command message structure. + */ +typedef struct PocketCmdMsg +{ + struct PocketCmdCtx *cmd_ctx; ///< command context + pocketcmd_t cmd; ///< command id + pocketbus_len_t len; ///< optional arg length + const uint8_t *buf; ///< optional arguments +} PocketCmdMsg; + +/** + * Type for command hooks. + */ +typedef void (*pocketcmd_hook_t)(struct PocketCmdMsg *cmd_msg); + +/** + * Type for lookup function hooks. + */ +typedef pocketcmd_hook_t (*pocketcmd_lookup_t)(pocketcmd_t cmd); + +/** + * pocketBus context for command layer communications. + */ +typedef struct PocketCmdCtx +{ + struct PocketBusCtx *bus_ctx; ///< pocketBus context + pocketbus_addr_t addr; ///< Our address + pocketcmd_lookup_t search; ///< Lookup function used to search for command callbacks + pocketcmd_t waiting; ///< The command ID we are waiting for or PKTCMD_NULL. + ticks_t reply_timer; ///< For waiting_reply +} PocketCmdCtx; + +/** + * Set slave address \a addr for pocketBus command layer. + * If we are a slave this is *our* address. + * If we are the master this is the slave address to send messages to. + */ +INLINE void pocketcmd_setAddr(struct PocketCmdCtx *ctx, pocketbus_addr_t addr) +{ + ctx->addr = addr; +} + +void pocketcmd_init(struct PocketCmdCtx *ctx, struct PocketBusCtx *bus_ctx, pocketbus_addr_t addr, pocketcmd_lookup_t search); +void pocketcmd_poll(struct PocketCmdCtx *ctx); +bool pocketcmd_send(struct PocketCmdCtx *ctx, pocketcmd_t cmd, const void *buf, size_t len, bool has_replay); +bool pocketcmd_recv(struct PocketCmdCtx *ctx, PocketCmdMsg *recv_msg); +void pocketcmd_replyNak(struct PocketCmdMsg *msg); +void pocketcmd_replyAck(struct PocketCmdMsg *msg); + +/** + * Helper function used by master to send a command to slave \a addr. + */ +INLINE bool pocketcmd_masterSend(struct PocketCmdCtx *ctx, pocketbus_addr_t addr, pocketcmd_t cmd, const void *buf, size_t len) +{ + pocketcmd_setAddr(ctx, addr); + return pocketcmd_send(ctx, cmd, buf, len, true); +} + +/** + * Helper function used by slave to reply to a master command. + */ +INLINE bool pocketcmd_slaveReply(struct PocketCmdCtx *ctx, pocketcmd_t cmd, const void *buf, size_t len) +{ + return pocketcmd_send(ctx, cmd, buf, len, false); +} + +/** + * Return true if message contain NAK. + */ +INLINE bool pocketcmd_checkNak(struct PocketCmdMsg *msg) +{ + if (msg->buf[0] == POCKETBUS_NAK) + return true; + + return false; +} + + + +#endif /* NET_POCKETCMD_H */ diff --git a/2.5/bertos/net/xmodem.c b/2.5/bertos/net/xmodem.c new file mode 100644 index 00000000..ce8d038e --- /dev/null +++ b/2.5/bertos/net/xmodem.c @@ -0,0 +1,436 @@ +/** + * \file + * + * + * \brief X-Modem serial transmission protocol (implementation) + * + * Supports the CRC-16 and 1K-blocks variants of the standard. + * \see ymodem.txt for the protocol description. + * + * \todo Break xmodem_send() and xmodem_recv() in smaller functions. + * + * \author Bernie Innocenti + * \author Francesco Sacchi + */ + + +#include "xmodem.h" + +#include "cfg/cfg_xmodem.h" + +#include +// Define log settings for cfg/log.h +#define LOG_LEVEL CONFIG_XMODEM_LOG_LEVEL +#define LOG_FORMAT CONFIG_XMODEM_LOG_FORMAT +#include + + +#include + +#include /* for memset() */ + +/** + * \name Protocol control codes + * \{ + */ +#define XM_SOH 0x01 /**< Start Of Header (128-byte block) */ +#define XM_STX 0x02 /**< Start Of Header (1024-byte block) */ +#define XM_EOT 0x04 /**< End Of Transmission */ +#define XM_ACK 0x06 /**< Acknowledge block */ +#define XM_NAK 0x15 /**< Negative Acknowledge */ +#define XM_C 0x43 /**< Request CRC-16 transmission */ +#define XM_CAN 0x18 /**< CANcel transmission */ +/*\}*/ + +#if CONFIG_XMODEM_1KCRC == 1 + #define XM_BUFSIZE 1024 /**< 1024 bytes of block buffer */ +#else + #define XM_BUFSIZE 128 /**< 128 bytes of block buffer */ +#endif + + +#if CONFIG_XMODEM_RECV +/** + * \brief Receive a file using the XModem protocol. + * + * \param ch Channel to use for transfer + * \param fd Destination file + * + * \note This function allocates a large amount of stack (\see XM_BUFSIZE). + */ +bool xmodem_recv(KFile *ch, KFile *fd) +{ + char block_buffer[XM_BUFSIZE]; /* Buffer to hold a block of data */ + int c, i, blocksize; + int blocknr = 0, last_block_done = 0, retries = 0; + char *buf; + uint8_t checksum; + uint16_t crc; + bool purge = false; + bool usecrc = true; + + + LOG_INFO("Starting Transfer...\n"); + purge = true; + kfile_clearerr(ch); + + /* Send initial NAK to start transmission */ + for(;;) + { + if (XMODEM_CHECK_ABORT) + { + kfile_putc(XM_CAN, ch); + kfile_putc(XM_CAN, ch); + LOG_INFO("Transfer aborted\n"); + return false; + } + + /* + * Discard incoming input until a timeout occurs, then send + * a NAK to the transmitter. + */ + if (purge) + { + purge = false; + + if (kfile_error(ch)) + { + LOG_ERR("Retries %d\n", retries); + } + + kfile_resync(ch, 200); + retries++; + + if (retries >= CONFIG_XMODEM_MAXRETRIES) + { + kfile_putc(XM_CAN, ch); + kfile_putc(XM_CAN, ch); + LOG_INFO("Transfer aborted\n"); + return false; + } + + /* Transmission start? */ + if (blocknr == 0) + { + if (retries < CONFIG_XMODEM_MAXCRCRETRIES) + { + LOG_INFO("Request Tx (CRC)\n"); + kfile_putc(XM_C, ch); + } + else + { + /* Give up with CRC and fall back to checksum */ + usecrc = false; + LOG_INFO("Request Tx (BCC)\n"); + kfile_putc(XM_NAK, ch); + } + } + else + kfile_putc(XM_NAK, ch); + } + + switch (kfile_getc(ch)) + { + #if XM_BUFSIZE >= 1024 + case XM_STX: /* Start of header (1024-byte block) */ + blocksize = 1024; + goto getblock; + #endif + + case XM_SOH: /* Start of header (128-byte block) */ + blocksize = 128; + /* Needed to avoid warning if XM_BUFSIZE < 1024 */ + + getblock: + /* Get block number */ + c = kfile_getc(ch); + + /* Check complemented block number */ + if ((~c & 0xff) != kfile_getc(ch)) + { + LOG_WARN("Bad blk (%d)\n", c); + purge = true; + break; + } + + /* Determine which block is being sent */ + if (c == (blocknr & 0xff)) + { + /* Last block repeated */ + LOG_INFO("Repeat blk %d\n", blocknr); + } + else if (c == ((blocknr + 1) & 0xff)) + { + /* Next block */ + LOG_INFO("Recv blk %d\n", ++blocknr); + } + else + { + /* Sync lost */ + LOG_WARN("Sync lost (%d/%d)\n", c, blocknr); + purge = true; + break; + } + + buf = block_buffer; /* Reset pointer to start of buffer */ + checksum = 0; + crc = 0; + for (i = 0; i < blocksize; i++) + { + if ((c = kfile_getc(ch)) == EOF) + { + purge = true; + break; + } + + /* Store in buffer */ + *buf++ = (char)c; + + /* Calculate block checksum or CRC */ + if (usecrc) + crc = UPDCRC16(c, crc); + else + checksum += (char)c; + } + + if (purge) + break; + + /* Get the checksum byte or the CRC-16 MSB */ + if ((c = kfile_getc(ch)) == EOF) + { + purge = true; + break; + } + + if (usecrc) + { + crc = UPDCRC16(c, crc); + + /* Get CRC-16 LSB */ + if ((c = kfile_getc(ch)) == EOF) + { + purge = true; + break; + } + + crc = UPDCRC16(c, crc); + + if (crc) + { + LOG_ERR("Bad CRC: %04x\n", crc); + purge = true; + break; + } + } + /* Compare the checksum */ + else if (c != checksum) + { + LOG_ERR("Bad sum: %04x/%04x\n", checksum, c); + purge = true; + break; + } + + /* + * Avoid flushing the same block twice. + * This could happen when the sender does not receive our + * acknowledge and resends the same block. + */ + if (last_block_done < blocknr) + { + /* Call user function to flush the buffer */ + if (kfile_write(fd, block_buffer, blocksize)) + { + /* Acknowledge block and clear error counter */ + kfile_putc(XM_ACK, ch); + retries = 0; + last_block_done = blocknr; + } + else + { + /* User callback failed: abort transfer immediately */ + retries = CONFIG_XMODEM_MAXRETRIES; + purge = true; + } + } + break; + + case XM_EOT: /* End of transmission */ + kfile_putc(XM_ACK, ch); + LOG_INFO("Transfer completed\n"); + return true; + + case EOF: /* Timeout or serial error */ + purge = true; + break; + + default: + LOG_INFO("Skipping garbage\n"); + purge = true; + break; + } + } /* End forever */ +} +#endif + + +#if CONFIG_XMODEM_SEND +/** + * \brief Transmit some data using the XModem protocol. + * + * \param ch Channel to use for transfer + * \param fd Source file + * + * \note This function allocates a large amount of stack for + * the XModem transfer buffer (\see XM_BUFSIZE). + */ +bool xmodem_send(KFile *ch, KFile *fd) +{ + char block_buffer[XM_BUFSIZE]; /* Buffer to hold a block of data */ + size_t size = -1; + int blocknr = 1, retries = 0, c, i; + bool proceed, usecrc = false; + uint16_t crc; + uint8_t sum; + + /* + * Reading a block can be very slow, so we read the first block early + * to avoid receiving double XM_C char. + * This could happen if we check for XM_C and then read the block, giving + * the receiving device time to send another XM_C char misinterpretating + * the blocks sent. + */ + size = kfile_read(fd, block_buffer, XM_BUFSIZE); + + kfile_clearerr(ch); + LOG_INFO("Wait remote host\n"); + + for(;;) + { + proceed = false; + do + { + if (XMODEM_CHECK_ABORT) + return false; + + switch (c = kfile_getc(ch)) + { + case XM_NAK: + LOG_INFO("Resend blk %d\n", blocknr); + proceed = true; + break; + + case XM_C: + if (c == XM_C) + { + LOG_INFO("Tx start (CRC)\n"); + usecrc = true; + } + else + { + LOG_INFO("Tx start (BCC)\n"); + } + + proceed = true; + break; + + case XM_ACK: + /* End of transfer? */ + if (!size) + return true; + + /* Call user function to read in one block */ + size = kfile_read(fd, block_buffer, XM_BUFSIZE); + LOG_INFO("Send blk %d\n", blocknr); + blocknr++; + retries = 0; + proceed = true; + break; + + case EOF: + kfile_clearerr(ch); + retries++; + LOG_INFO("Retries %d\n", retries); + if (retries <= CONFIG_XMODEM_MAXRETRIES) + break; + /* falling through! */ + + case XM_CAN: + LOG_INFO("Transfer aborted\n"); + return false; + + default: + LOG_INFO("Skipping garbage\n"); + break; + } + } + while (!proceed); + + if (!size) + { + kfile_putc(XM_EOT, ch); + continue; + } + + /* Pad block with 0xFF if it's partially full */ + memset(block_buffer + size, 0xFF, XM_BUFSIZE - size); + + /* Send block header (STX, blocknr, ~blocknr) */ + #if XM_BUFSIZE == 128 + kfile_putc(XM_SOH, ch); + #else + kfile_putc(XM_STX, ch); + #endif + kfile_putc(blocknr & 0xFF, ch); + kfile_putc(~blocknr & 0xFF, ch); + + /* Send block and compute its CRC/checksum */ + sum = 0; + crc = 0; + for (i = 0; i < XM_BUFSIZE; i++) + { + kfile_putc(block_buffer[i], ch); + crc = UPDCRC16(block_buffer[i], crc); + sum += block_buffer[i]; + } + + /* Send CRC/Checksum */ + if (usecrc) + { + kfile_putc(crc >> 8, ch); + kfile_putc(crc & 0xFF, ch); + } + else + kfile_putc(sum, ch); + } +} +#endif diff --git a/2.5/bertos/net/xmodem.h b/2.5/bertos/net/xmodem.h new file mode 100644 index 00000000..db27cf41 --- /dev/null +++ b/2.5/bertos/net/xmodem.h @@ -0,0 +1,63 @@ +/** + * \file + * + * \brief X-Modem serial transmission protocol. + * + * \author Bernie Innocenti + * \author Francesco Sacchi + * + * $WIZ$ module_name = "xmodem" + * $WIZ$ module_depends = "kfile", "crc16" + * $WIZ$ module_configuration = "bertos/cfg/cfg_xmodem.h" + */ + + +#ifndef NET_XMODEM_H +#define NET_XMODEM_H + +#include +#include + +/** + * Called to know if we want to abort data tranfer. + * Redefine to whatever you need. + * \{ + */ +#ifndef XMODEM_CHECK_ABORT +#define XMODEM_CHECK_ABORT (false) +#endif +/*\}*/ + +bool xmodem_recv(KFile *ch, KFile *fd); +bool xmodem_send(KFile *ch, KFile *fd); + +#endif /* NET_XMODEM_H */ diff --git a/2.5/bertos/os/hptime.c b/2.5/bertos/os/hptime.c new file mode 100644 index 00000000..23807580 --- /dev/null +++ b/2.5/bertos/os/hptime.c @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Portable abstraction for high-resolution time handling (implementation) + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#include "hptime.h" + +#if defined(_WIN32) + +#include + +hptime_t hptime_get(void) +{ + FILETIME ft; + + /* + * La precisione dei FileTime sarebbe 100ns, ma il + * valore viene ottenuto convertendo una struttura + * SYSTEMTIME, che ha precisione di 1ms. Il numero + * che otteniamo e' quindi sempre un multiplo di + * 100000. + */ + GetSystemTimeAsFileTime(&ft); + + /* Copy the upper/lower into a quadword. */ + return (((hptime_t)ft.dwHighDateTime) << 32) + (hptime_t)ft.dwLowDateTime; +} + +#elif defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) + +#include /* for gettimeofday() */ +#include /* for NULL */ + +hptime_t hptime_get(void) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + return (hptime_t)tv.tv_sec * HPTIME_TICKS_PER_SECOND + + (hptime_t)tv.tv_usec; +} + +#else /* !__unix__ */ + #error OS dependent support code missing for this OS +#endif /* !__unix__ */ + diff --git a/2.5/bertos/os/hptime.h b/2.5/bertos/os/hptime.h new file mode 100644 index 00000000..d7699d0e --- /dev/null +++ b/2.5/bertos/os/hptime.h @@ -0,0 +1,86 @@ +/** + * \file + * + * + * \brief Portable abstraction for high-resolution time handling (interface) + * + * \author Bernie Innocenti + */ +#ifndef HPTIME_H +#define HPTIME_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifdef _WIN32 + + /** our type for "high precision absolute time" */ + typedef __int64 hptime_t; + #define SIZEOF_HPTIME_T 8 + + #define HPTIME_TICKS_PER_SECOND (10000000I64) + #define HPTIME_TICKS_PER_MILLISEC (10000I64) + #define HPTIME_TICKS_PER_MICRO (10I64) + +#elif defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) + + #include /* int64_t */ + + #ifndef DEVLIB_MTIME_DEFINED + #define DEVLIB_MTIME_DEFINED 1 /* Resolve conflict with */ + typedef int32_t mtime_t; + #define SIZEOF_MTIME_T (32 / CPU_BITS_PER_CHAR) + #define MTIME_INFINITE 0x7FFFFFFFL + #endif + + /** Type for "high precision absolute time". */ + typedef int64_t hptime_t; + #define SIZEOF_HPTIME_T 8 + + #define HPTIME_TICKS_PER_SECOND (1000000LL) + #define HPTIME_TICKS_PER_MILLISEC (1000LL) + #define HPTIME_TICKS_PER_MICRO (1LL) + +#else /* !__unix__ */ + #error OS dependent support code missing for this OS +#endif /* !__unix__ */ + +/** + * Return the current time with the maximum precision made available from the hosting OS + */ +extern hptime_t hptime_get(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* HPTIME_H */ diff --git a/2.5/bertos/remote_merge b/2.5/bertos/remote_merge new file mode 100755 index 00000000..5afde9b2 --- /dev/null +++ b/2.5/bertos/remote_merge @@ -0,0 +1,48 @@ +#!/bin/bash +#set -x + +if [ $# -lt 2 ] ; then + printf "\nMerge remote url commits into local BeRTOS svn repository.\n" + printf "Usage: $0 []\n" + printf "If remote end revision is not supplied HEAD will be used.\n" + exit 1 +fi + + +MERGE_URL="$1" +START_REV="$2" +if [ z"$3" = z ] ; then + END_REV=HEAD +else + END_REV="$3" +fi + +#Check for local uncommitted modifications +STATUS=`svn status -q` +if [[ z"$STATUS" != z && "${STATUS:0:1}" != $'\n' ]] ; then + printf "Project has local modifications, it must be clean\n" + exit 1 +fi + +#Get list of revisions to merge. +REV_LIST=`svn log $MERGE_URL -r$START_REV:$END_REV --quiet 2>&1| perl -ne 'if(m/^r([0-9]+)/) {print $1, "\n";}'` + +printf "Merged from external project:\n" > header +for rev in $REV_LIST +do + #Get commit log message only + #svn pg --revprop -r$rev svn:log $MERGE_URL > tmp_msg + + #Get revision commit log with date and author + svn log -r$rev $MERGE_URL > tmp_msg + #Replace leading and trailing banners "---------------------..." + sed -i 's/^-\+/\*\*\*\*\*\*\*\*\*\*/' tmp_msg + #Indent all message + sed -i 's/\(^.*\)/\t\1/' tmp_msg + cat header tmp_msg > commit_msg + #Try to merge ... + svn merge $MERGE_URL -c$rev || exit 1 + #and commit! + svn ci -Fcommit_msg +done +rm -rf header tmp_msg commit_msg diff --git a/2.5/bertos/rules.mk b/2.5/bertos/rules.mk new file mode 100644 index 00000000..8ec098ae --- /dev/null +++ b/2.5/bertos/rules.mk @@ -0,0 +1,408 @@ +# +# $Id$ +# Copyright 2002,2003,2004,2005,2006 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Based on: +# GCC-AVR standard Makefile part 2 +# Volker Oth 1/2000 +# +# Author: Bernie Innocenti +# + +# Remove all default pattern rules +.SUFFIXES: + +# Verbosity +ifeq ($(V),1) +# Verbose build +Q := +L := @echo >/dev/null +else +# Quiet build +Q := @ +L := @echo +endif + +# Select Bourne Again SHell as default make shell +SHELL := bash + +# Checker build +ifeq ($(C),1) +CC = $(CHECKER) +CFLAGS += -Wundef -D__x86_64__=1 -D__unix__=1 -D__linux__=1 -D__STDC_VERSION__=199901L +endif + +# Initialize $(top_srcdir) with current directory, unless it was already initialized +top_srcdir ?= $(shell pwd) + +# Virtual Product: based on target products may be different. +# e.g. Embedded target = hex, s19, bin +# Hosted = exe +# Library = lib.a +TRG_TGT = $(TRG:%=$(OUTDIR)/%.tgt) + +RECURSIVE_TARGETS = all-recursive install-recursive clean-recursive + +# The default target +.PHONY: all +all:: all-recursive $(TRG_TGT) + +# Generate project documentation +.PHONY: docs +docs: + $L "Building documentation" + $Q $(DOXYGEN) + +# Generate ctags +.PHONY: tags +tags: + $L "Rebuilding C tags database" + $Q ctags -R --exclude=doc + +# Run testsuite +.PHONY: check +check: + $L "Running testsuite" + $Q test/run_tests.sh + +define build_target + +ifeq ($$($(1)_HOSTED),1) + #On Darwin architecture the assembly doesn't link correctly if these flags are set. + ifeq ($(shell uname | grep -c "Darwin"),1) + LIST_FLAGS := "" + MAP_FLAGS := "" + LDFLAGS := "" + endif + #use hosted specific map flags + $(1)_MAP_FLAGS = $$(MAP_FLAGS_HOST) + + #Handle library creation + ifeq ($$($(1)_MAKELIB),1) + $$(OUTDIR)/$(1).tgt : $$(OUTDIR)/$(1).a + else + #Otherwise in hosted application we need only executable file. + $$(OUTDIR)/$(1).tgt : $$(OUTDIR)/$(1) + endif +else + #use embedded specific map flags + $(1)_MAP_FLAGS = $$(MAP_FLAGS_EMB) + #In embedded we need s19, hex and bin + $$(OUTDIR)/$(1).tgt : $$(OUTDIR)/$(1).s19 $$(OUTDIR)/$(1).hex $$(OUTDIR)/$(1).bin +endif + +$(1)_LDFLAGS += $$($(1)_MAP_FLAGS) + +# In embedded systems the target CPU is needed, +# but there are different options on how to pass +# it to the compiler. +ifneq ($$(strip $$($(1)_MCU)),) + $(1)_MCPU = -mmcu=$$($(1)_MCU) +endif +ifneq ($$(strip $$($(1)_CPU)),) + $(1)_MCPU = -mcpu=$$($(1)_CPU) +endif + +# If a CPU is specified add to +# project specific flags. +ifneq ($$($(1)_MCPU),) + $(1)_CFLAGS += $$($(1)_MCPU) + $(1)_CXXFLAGS += $$($(1)_MCPU) + $(1)_ASFLAGS += $$($(1)_MCPU) + $(1)_CPPAFLAGS += $$($(1)_MCPU) + $(1)_LDFLAGS += $$($(1)_MCPU) +endif + +ifneq ($$(strip $$($(1)_LDSCRIPT)),) + $(1)_LDFLAGS += -Wl,-T$$($(1)_LDSCRIPT) +endif + +ifneq ($$($(1)_CROSS),) + #deprecated: use PREFIX, SUFFIX and HOSTED mechanism instead + $(1)_PREFIX = $$($(1)_CROSS) + $(1)_SUFFIX = +endif + +$(1)_CC ?= $$($(1)_PREFIX)$$(CC)$$($(1)_SUFFIX) +$(1)_CXX ?= $$($(1)_PREFIX)$$(CXX)$$($(1)_SUFFIX) +$(1)_AS ?= $$($(1)_PREFIX)$$(AS)$$($(1)_SUFFIX) +$(1)_AR ?= $$($(1)_PREFIX)$$(AR)$$($(1)_SUFFIX) +$(1)_OBJCOPY ?= $$($(1)_PREFIX)$$(OBJCOPY)$$($(1)_SUFFIX) +$(1)_STRIP ?= $$($(1)_PREFIX)$$(STRIP)$$($(1)_SUFFIX) +ifneq ($$(strip $$($(1)_CXXSRC)),) + $(1)_LD = $$($(1)_PREFIX)$$(LDXX)$$($(1)_SUFFIX) +else + $(1)_LD = $$($(1)_PREFIX)$$(LD)$$($(1)_SUFFIX) +endif + +# Debug stuff +ifeq ($$($(1)_DEBUG),1) + # AVR is an harvard processor + # and needs debug module + # to be compiled in program memory + ifeq ($$(findstring avr, $$($(1)_PREFIX)),avr) + $(1)_DEBUGSRC = $(1)_PCSRC + else + $(1)_DEBUGSRC = $(1)_CSRC + endif + + $$($(1)_DEBUGSRC) += bertos/drv/kdebug.c + + # Also add formatwr.c (printf) if not already present + ifneq ($$(findstring formatwr.c, $$($$($(1)_DEBUGSRC))),formatwr.c) + $$($(1)_DEBUGSRC) += bertos/mware/formatwr.c + endif + + # Also add hex.c (for printf) if not already present + ifneq ($$(findstring hex.c, $$($$($(1)_CSRC))),hex.c) + $$($(1)_CSRC) += bertos/mware/hex.c + endif + + $(1)_CFLAGS += -D_DEBUG + $(1)_CXXFLAGS += -D_DEBUG +else + $(1)_CFLAGS += -fomit-frame-pointer + $(1)_CXXFLAGS += -fomit-frame-pointer +endif + +$(1)_COBJ = $$(foreach file,$$($(1)_CSRC:%.c=%.o),$$(OBJDIR)/$(1)/$$(file)) +$(1)_CXXOBJ = $$(foreach file,$$($(1)_CXXSRC:%.cpp=%.o),$$(OBJDIR)/$(1)/$$(file)) +$(1)_PCOBJ = $$(foreach file,$$($(1)_PCSRC:%.c=%_P.o),$$(OBJDIR)/$(1)/$$(file)) +$(1)_AOBJ = $$(foreach file,$$($(1)_ASRC:%.s=%.o),$$(OBJDIR)/$(1)/$$(file)) +$(1)_CPPAOBJ = $$(foreach file,$$($(1)_CPPASRC:%.S=%.o),$$(OBJDIR)/$(1)/$$(file)) +$(1)_OBJ := $$($(1)_COBJ) $$($(1)_CXXOBJ) $$($(1)_PCOBJ) $$($(1)_AOBJ) $$($(1)_CPPAOBJ) +$(1)_SRC := $$($(1)_CSRC) $$($(1)_CXXSRC) $$($(1)_PCSRC) $$($(1)_ASRC) $$($(1)_CPPASRC) +OBJ += $$($(1)_OBJ) + +# Sometimes $(CC) is actually set to a C++ compiler in disguise, and it +# would whine if we passed it C-only flags. Checking for the presence of +# "++" in the name is a kludge that seems to work mostly. +ifeq (++,$$(findstring ++,$$($(1)_CC))) + $(1)_REAL_CFLAGS = $$(CXXFLAGS) +else + $(1)_REAL_CFLAGS = $$(CFLAGS) +endif + +# Compile: instructions to create assembler and/or object files from C source +$$($(1)_COBJ) : $$(OBJDIR)/$(1)/%.o : %.c + $L "$(1): Compiling $$< (C)" + @$$(MKDIR_P) $$(dir $$@) + $Q $$($(1)_CC) -c $$($(1)_REAL_CFLAGS) $$($(1)_CFLAGS) $$($(1)_CPPFLAGS) $$(CPPFLAGS) $$($$(*F)_CFLAGS) $$< -o $$@ + +# Compile: instructions to create assembler and/or object files from C++ source +$$($(1)_CXXOBJ) : $$(OBJDIR)/$(1)/%.o : %.cpp + $L "$(1): Compiling $$< (C++)" + @$$(MKDIR_P) $$(dir $$@) + $Q $$($(1)_CXX) -c $$(CXXFLAGS) $$($(1)_CXXFLAGS) $$($(1)_CPPFLAGS) $$(CPPFLAGS) $$($$(*F)_CXXFLAGS) $$< -o $$@ + +# Generate assembly sources from C files (debug) +$$(OBJDIR)/$(1)/%.s : %.c + $L "$(1): Generating asm source $$<" + @$$(MKDIR_P) $$(dir $$@) + $Q $$($(1)_CC) -S $$(CFLAGS) $$($(1)_CFLAGS) $$($(1)_CPPFLAGS) $$($$(*F)_CFLAGS) $$< -o $$@ + +# Generate special progmem variant of a source file +$$($(1)_PCOBJ) : $$(OBJDIR)/$(1)/%_P.o : %.c + $L "$(1): Compiling $$< (PROGMEM)" + @$$(MKDIR_P) $$(dir $$@) + $Q $$($(1)_CC) -c -D_PROGMEM $$(CFLAGS) $$($(1)_CFLAGS) $$($(1)_CPPFLAGS) $$(CPPFLAGS) $$($$(*F)_CFLAGS) $$< -o $$@ + +# Assemble: instructions to create object file from assembler files +$$($(1)_AOBJ): $$(OBJDIR)/$(1)/%.o : %.s + $L "$(1): Assembling $$<" + @$$(MKDIR_P) $$(dir $$@) + $Q $$($(1)_AS) -c $$(ASFLAGS) $$($(1)_ASFLAGS) $$($$(*F)_ASFLAGS) $$< -o $$@ + +$$($(1)_CPPAOBJ): $$(OBJDIR)/$(1)/%.o : %.S + $L "$(1): Assembling with CPP $$<" + @$$(MKDIR_P) $$(dir $$@) + $Q $$($(1)_CC) -c $$(CPPAFLAGS) $$($(1)_CPPAFLAGS) $$($(1)_CPPFLAGS) $$(CPPFLAGS) $$($$(*F)_CPPAFLAGS) $$< -o $$@ + + +# Link: instructions to create elf output file from object files +$$(OUTDIR)/$(1).elf $$(OUTDIR)/$(1)_nostrip: bumprev $$($(1)_OBJ) $$($(1)_LDSCRIPT) + $L "$(1): Linking $$@" + @$$(MKDIR_P) $$(dir $$@) + $Q $$($(1)_LD) $$($(1)_OBJ) $$(LIB) $$(LDFLAGS) $$($(1)_LDFLAGS) -o $$@ + + +# Instructions to create a static library from object files +$$(OUTDIR)/$(1).a: bumprev $$($(1)_OBJ) + $L "$(1): Creating static library $$@" + @$$(MKDIR_P) $$(dir $$@) + $Q $$($(1)_AR) $$(ARFLAGS) $$($(1)_ARFLAGS) $$@ $$($(1)_OBJ) + +# Strip debug info +$$(OUTDIR)/$(1): $$(OUTDIR)/$(1)_nostrip + $L "$(1): Generating stripped executable $$@" + $Q $$($(1)_STRIP) -o $$@ $$^ + +# Compile and link (program-at-a-time) +$$(OUTDIR)/$(1)_whole.elf: bumprev $$($(1)_SRC) $$($(1)_LDSCRIPT) + $L "$(1): Compiling and Linking whole program $$@" + @$$(MKDIR_P) $$(dir $$@) + $Q $$($(1)_CC) $$($(1)_SRC) $$(CFLAGS) $$($(1)_CFLAGS) $$(LIB) $$(LDFLAGS) $$($(1)_LDFLAGS) -o $$@ + +# Flash target +.PHONY: flash_$(1) +flash_$(1): $(OUTDIR)/$(1).hex flash_$(1)_local + $L "$(1): Flashing target" + $Q if [ ! -f $$($(1)_FLASH_SCRIPT) ] ; then \ + printf "CLDLG: No flash script found.\n" ; \ + exit 1 ; \ + fi + $Q if [ ! "$$($(1)_PROGRAMMER_TYPE)" == "none" ] ; then \ + PROGRAMMER_CPU=$$($(1)_PROGRAMMER_CPU) PROGRAMMER_TYPE=$$($(1)_PROGRAMMER_TYPE) \ + PROGRAMMER_PORT=$$($(1)_PROGRAMMER_PORT) IMAGE_FILE=$$< \ + $$($(1)_FLASH_SCRIPT) ; \ + else \ + printf "CLDLG: No programmer interface configured, see http://dev.bertos.org/wiki/ProgrammerInterface\n" ; \ + exit 1 ; \ + fi + +.PHONY: flash_$(1)_local +flash_$(1)_local: + +.PHONY: stopflash_$(1) +stopflash_$(1): + $L "$(1): Stopping target flashing" + $Q if [ ! -f $$($(1)_STOPFLASH_SCRIPT) ] ; then \ + printf "CLDLG: No stopflash script found.\n" ; \ + exit 1 ; \ + fi + $Q $$($(1)_STOPFLASH_SCRIPT) ; + + +# Debug target +.PHONY: debug_$(1) +debug_$(1): $(OUTDIR)/$(1).elf + $L "$(1): Debugging target" + $Q if [ ! -f $$($(1)_DEBUG_SCRIPT) ] ; then \ + printf "CLDLG: No debug script found.\n" ; \ + exit 1 ; \ + fi + $Q if [ ! "$$($(1)_PROGRAMMER_TYPE)" == "none" ] ; then \ + PROGRAMMER_CPU=$$($(1)_PROGRAMMER_CPU) PROGRAMMER_TYPE=$$($(1)_PROGRAMMER_TYPE) \ + PROGRAMMER_PORT=$$($(1)_PROGRAMMER_PORT) GDB_PORT=3333 \ + ELF_FILE=$$< \ + $$($(1)_DEBUG_SCRIPT) ; \ + else \ + printf "CLDLG: No programmer interface configured, see http://dev.bertos.org/wiki/ProgrammerInterface\n" ; \ + exit 1 ; \ + fi + +.PHONY: stopdebug_$(1) +stopdebug_$(1): + $L "$(1): Stopping debugger" + $Q if [ ! -f $$($(1)_STOPDEBUG_SCRIPT) ] ; then \ + printf "CLDLG: No stopdebug script found.\n" ; \ + exit 1 ; \ + fi + $Q $$($(1)_STOPDEBUG_SCRIPT) ; + +.PHONY: fuses_$(!) +fuses_$(1): + if [ ! -z "$$($(1)_efuse)" ] ; then \ + if ! $(AVRDUDE) $(DPROG) -p $$($(1)_MCU) -U efuse:w:$$($(1)_efuse):m ; then \ + $(AVRDUDE) $(DPROG) -p $$($(1)_MCU) -U efuse:w:$$($(1)_efuse):m ; \ + fi \ + fi + if [ ! -z "$$($(1)_hfuse)" ] ; then \ + if ! $(AVRDUDE) $(DPROG) -p $$($(1)_MCU) -U hfuse:w:$$($(1)_hfuse):m ; then \ + $(AVRDUDE) $(DPROG) -p $$($(1)_MCU) -U hfuse:w:$$($(1)_hfuse):m ; \ + fi \ + fi + if [ ! -z "$$($(1)_lfuse)" ] ; then \ + if ! $(AVRDUDE) $(DPROG) -p $$($(1)_MCU) -U lfuse:w:$$($(1)_lfuse):m ; then \ + $(AVRDUDE) $(DPROG) -p $$($(1)_MCU) -U lfuse:w:$$($(1)_lfuse):m ; \ + fi \ + fi + if [ ! -z "$$($(1)_lock)" ] ; then \ + if ! $(AVRDUDE) $(DPROG) -p $$($(1)_MCU) -U lock:w:$$($(1)_lock):m ; then \ + $(AVRDUDE) $(DPROG) -p $$($(1)_MCU) -U lock:w:$$($(1)_lock):m ; \ + fi \ + fi + +$$(OUTDIR)/$(1).hex: $$(OUTDIR)/$(1).elf + $$($(1)_OBJCOPY) -O ihex $$< $$@ + +$$(OUTDIR)/$(1).s19: $$(OUTDIR)/$(1).elf + $$($(1)_OBJCOPY) -O srec $$< $$@ + +$$(OUTDIR)/$(1).bin: $$(OUTDIR)/$(1).elf + $$($(1)_OBJCOPY) -O binary $$< $$@ + +$$(OUTDIR)/$(1).obj: $$(OUTDIR)/$(1).elf + $$($(1)_OBJCOPY) -O avrobj $$< $$@ + +$$(OUTDIR)/$(1).rom: $$(OUTDIR)/$(1).elf + $$($(1)_OBJCOPY) -O $$(FORMAT) $$< $$@ +# $$($(1)_OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" -O $$(FORMAT) $$< $$(@:.rom=.eep) + +endef + +# Generate build rules for all targets +$(foreach t,$(TRG),$(eval $(call build_target,$(t)))) + +# Generate Qt's moc files from headers +# NOTE: moc totally sucks and can generate empty files for some error conditions, +# leading to puzzling linker errors. Kill 'em and abort build. +%_moc.cpp: %.h + $(QT_MOC) -o $@ $< + if [ ! -s $< ]; then \ + rm -f $@; \ + exit 1; \ + fi + + +%.cof: %.elf + $(COFFCONVERT) -O coff-ext-avr $< $@ +# $(COFFCONVERT) -O coff-avr $< $@ # For use with AVRstudio 3 + +#make instruction to delete created files +cleanall: clean +clean: clean-recursive + -$(RM_R) $(OBJDIR) + -$(RM_R) $(OUTDIR) + +$(RECURSIVE_TARGETS): + @target=`echo $@ | sed s/-recursive//`; \ + for dir in $(SUBDIRS); do \ + if [ -e $$dir/configure.in ] || [ -e $$dir/configure.ac ] && [ ! -x $$dir/configure ]; then \ + echo "Running autogen.sh in $$dir..."; \ + ( cd $$dir && chmod a+x autogen.sh && ./autogen.sh && rm -f Makefile || exit 1 ); \ + fi; \ + if [ ! -e $$dir/Makefile ]; then \ + if [ -e "$$dir/build-$(ARCH)" ]; then \ + echo "Running build script in $$dir..."; \ + ( cd $$dir && chmod a+x build && ./build || exit 1 ); \ + else \ + echo "Running configure in $$dir..."; \ + ( cd $$dir && ./configure --prefix=$(PREFIX) || exit 1 ); \ + fi; \ + fi; \ + $(MAKE) -C $$dir $$target || exit 1; \ + done + +BUILDREV_H = buildrev.h + +.PHONY: bumprev +bumprev: + @if [ -e bertos/verstag.c ]; then \ + buildnr=0; \ + if [ -f $(BUILDREV_H) ]; then \ + buildnr=`sed <"$(BUILDREV_H)" -n -e 's/#define VERS_BUILD \([0-9][0-9]*\)/\1/p'`; \ + fi; \ + buildnr=`expr $$buildnr + 1`; \ + buildhost=`hostname | sed -n -e '1h;2,$$H;$${g;s/\n//g;p;}'`; \ + echo "#define VERS_BUILD $$buildnr" >"$(BUILDREV_H)"; \ + echo "#define VERS_HOST \"$$buildhost\"" >>"$(BUILDREV_H)"; \ + echo "Building revision $$buildnr"; \ + fi; \ + # + +# Include dependencies +ifneq ($(strip $(OBJ)),) +-include $(OBJ:%.o=%.d) +endif diff --git a/2.5/bertos/struct/fifobuf.h b/2.5/bertos/struct/fifobuf.h new file mode 100644 index 00000000..a749d89f --- /dev/null +++ b/2.5/bertos/struct/fifobuf.h @@ -0,0 +1,358 @@ +/** + * \file + * + * + * \brief General pourpose FIFO buffer implemented with a ring buffer + * + * \li \c begin points to the first buffer element; + * \li \c end points to the last buffer element (unlike the STL convention); + * \li \c head points to the element to be extracted next; + * \li \c tail points to the location following the last insertion; + * \li when any of the pointers advances beyond \c end, it is reset + * back to \c begin. + * + * \code + * + * +-----------------------------------+ + * | empty | valid data | empty | + * +-----------------------------------+ + * ^ ^ ^ ^ + * begin head tail end + * + * \endcode + * + * The buffer is EMPTY when \c head and \c tail point to the same location: + * \code head == tail \endcode + * + * The buffer is FULL when \c tail points to the location immediately + * after \c head: + * \code tail == head - 1 \endcode + * + * The buffer is also FULL when \c tail points to the last buffer + * location and head points to the first one: + * \code head == begin && tail == end \endcode + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef STRUCT_FIFO_H +#define STRUCT_FIFO_H + +#include +#include +#include + +typedef struct FIFOBuffer +{ + unsigned char * volatile head; + unsigned char * volatile tail; + unsigned char *begin; + unsigned char *end; +} FIFOBuffer; + + +#define ASSERT_VALID_FIFO(fifo) \ + ATOMIC( \ + ASSERT((fifo)->head >= (fifo)->begin); \ + ASSERT((fifo)->head <= (fifo)->end); \ + ASSERT((fifo)->tail >= (fifo)->begin); \ + ASSERT((fifo)->tail <= (fifo)->end); \ + ) + + +/** + * Check whether the fifo is empty + * + * \note Calling fifo_isempty() is safe while a concurrent + * execution context is calling fifo_push() or fifo_pop() + * only if the CPU can atomically update a pointer + * (which the AVR and other 8-bit processors can't do). + * + * \sa fifo_isempty_locked + */ +INLINE bool fifo_isempty(const FIFOBuffer *fb) +{ + //ASSERT_VALID_FIFO(fb); + return fb->head == fb->tail; +} + + +/** + * Check whether the fifo is full + * + * \note Calling fifo_isfull() is safe while a concurrent + * execution context is calling fifo_pop() and the + * CPU can update a pointer atomically. + * It is NOT safe when the other context calls + * fifo_push(). + * This limitation is not usually problematic in a + * consumer/producer scenario because the + * fifo_isfull() and fifo_push() are usually called + * in the producer context. + */ +INLINE bool fifo_isfull(const FIFOBuffer *fb) +{ + //ASSERT_VALID_FIFO(fb); + return + ((fb->head == fb->begin) && (fb->tail == fb->end)) + || (fb->tail == fb->head - 1); +} + + +/** + * Push a character on the fifo buffer. + * + * \note Calling \c fifo_push() on a full buffer is undefined. + * The caller must make sure the buffer has at least + * one free slot before calling this function. + * + * \note It is safe to call fifo_pop() and fifo_push() from + * concurrent contexts, unless the CPU can't update + * a pointer atomically (which the AVR and other 8-bit + * processors can't do). + * + * \sa fifo_push_locked + */ +INLINE void fifo_push(FIFOBuffer *fb, unsigned char c) +{ +#ifdef __MWERKS__ +#pragma interrupt called +#endif + //ASSERT_VALID_FIFO(fb); + + /* Write at tail position */ + *(fb->tail) = c; + + if (UNLIKELY(fb->tail == fb->end)) + /* wrap tail around */ + fb->tail = fb->begin; + else + /* Move tail forward */ + fb->tail++; +} + + +/** + * Pop a character from the fifo buffer. + * + * \note Calling \c fifo_pop() on an empty buffer is undefined. + * The caller must make sure the buffer contains at least + * one character before calling this function. + * + * \note It is safe to call fifo_pop() and fifo_push() from + * concurrent contexts. + */ +INLINE unsigned char fifo_pop(FIFOBuffer *fb) +{ +#ifdef __MWERKS__ +#pragma interrupt called +#endif + //ASSERT_VALID_FIFO(fb); + + if (UNLIKELY(fb->head == fb->end)) + { + /* wrap head around */ + fb->head = fb->begin; + return *(fb->end); + } + else + /* move head forward */ + return *(fb->head++); +} + + +/** + * Make the fifo empty, discarding all its current contents. + */ +INLINE void fifo_flush(FIFOBuffer *fb) +{ + //ASSERT_VALID_FIFO(fb); + fb->head = fb->tail; +} + + +#if CPU_REG_BITS >= CPU_BITS_PER_PTR + + /* + * 16/32bit CPUs that can update a pointer with a single write + * operation, no need to disable interrupts. + */ + #define fifo_isempty_locked(fb) fifo_isempty((fb)) + #define fifo_push_locked(fb, c) fifo_push((fb), (c)) + #define fifo_pop_locked(fb) fifo_pop((fb)) + #define fifo_flush_locked(fb) fifo_flush((fb)) + +#else /* CPU_REG_BITS < CPU_BITS_PER_PTR */ + + /** + * Similar to fifo_isempty(), but with stronger guarantees for + * concurrent access between user and interrupt code. + * + * \note This is actually only needed for 8-bit processors. + * + * \sa fifo_isempty() + */ + INLINE bool fifo_isempty_locked(const FIFOBuffer *fb) + { + bool result; + ATOMIC(result = fifo_isempty(fb)); + return result; + } + + + /** + * Similar to fifo_push(), but with stronger guarantees for + * concurrent access between user and interrupt code. + * + * \note This is actually only needed for 8-bit processors. + * + * \sa fifo_push() + */ + INLINE void fifo_push_locked(FIFOBuffer *fb, unsigned char c) + { + ATOMIC(fifo_push(fb, c)); + } + + /* Probably not really needed, but hard to prove. */ + INLINE unsigned char fifo_pop_locked(FIFOBuffer *fb) + { + unsigned char c; + ATOMIC(c = fifo_pop(fb)); + return c; + } + + /** + * Similar to fifo_flush(), but with stronger guarantees for + * concurrent access between user and interrupt code. + * + * \note This is actually only needed for 8-bit processors. + * + * \sa fifo_flush() + */ + INLINE void fifo_flush_locked(FIFOBuffer *fb) + { + ATOMIC(fifo_flush(fb)); + } + +#endif /* CPU_REG_BITS < BITS_PER_PTR */ + + +/** + * Thread safe version of fifo_isfull() + */ +INLINE bool fifo_isfull_locked(const FIFOBuffer *_fb) +{ + bool result; + ATOMIC(result = fifo_isfull(_fb)); + return result; +} + + +/** + * FIFO Initialization. + */ +INLINE void fifo_init(FIFOBuffer *fb, unsigned char *buf, size_t size) +{ + /* FIFO buffers have a known bug with 1-byte buffers. */ + ASSERT(size > 1); + + fb->head = fb->tail = fb->begin = buf; + fb->end = buf + size - 1; +} + +/** + * \return Lenght of the FIFOBuffer \a fb. + */ +INLINE size_t fifo_len(FIFOBuffer *fb) +{ + return fb->end - fb->begin; +} + + +#if 0 + +/* + * UNTESTED: if uncommented, to be moved in fifobuf.c + */ +void fifo_pushblock(FIFOBuffer *fb, unsigned char *block, size_t len) +{ + size_t freelen; + + /* Se c'e' spazio da tail alla fine del buffer */ + if (fb->tail >= fb->head) + { + freelen = fb->end - fb->tail + 1; + + /* C'e' abbastanza spazio per scrivere tutto il blocco? */ + if (freelen < len) + { + /* Scrivi quello che entra fino alla fine del buffer */ + memcpy(fb->tail, block, freelen); + block += freelen; + len -= freelen; + fb->tail = fb->begin; + } + else + { + /* Scrivi tutto il blocco */ + memcpy(fb->tail, block, len); + fb->tail += len; + return; + } + } + + for(;;) + { + while (!(freelen = fb->head - fb->tail - 1)) + Delay(FIFO_POLLDELAY); + + /* C'e' abbastanza spazio per scrivere tutto il blocco? */ + if (freelen < len) + { + /* Scrivi quello che entra fino alla fine del buffer */ + memcpy(fb->tail, block, freelen); + block += freelen; + len -= freelen; + fb->tail += freelen; + } + else + { + /* Scrivi tutto il blocco */ + memcpy(fb->tail, block, len); + fb->tail += len; + return; + } + } +} +#endif + +#endif /* STRUCT_FIFO_H */ diff --git a/2.5/bertos/struct/hashtable.c b/2.5/bertos/struct/hashtable.c new file mode 100644 index 00000000..d895fe75 --- /dev/null +++ b/2.5/bertos/struct/hashtable.c @@ -0,0 +1,287 @@ +/** + * \file + * + * + * \brief Portable hash table implementation + * + * Some rationales of our choices in implementation: + * + * \li For embedded systems, it is vital to allocate the table in static memory. To do + * so, it is necessary to expose the \c HashNode and \c HashTable structures in the header file. + * Nevertheless, they should be used as opaque types (that is, the users should not + * access the structure fields directly). + * + * \li To statically allocate the structures, a macro is provided. With this macro, we + * are hiding completely \c HashNode to the user (who only manipulates \c HashTable). Without + * the macro, the user would have had to define both the \c HashNode and the \c HashTable + * manually, and pass both of them to \c ht_init() (which would have created the link between + * the two). Instead, the link is created with a literal initialization. + * + * \li The hash table is created as power of two to remove the divisions from the code. + * Of course, hash functions work at their best when the table size is a prime number. + * When calculating the modulus to convert the hash value to an index, the actual operation + * becomes a bitwise AND: this is fast, but truncates the value losing bits. Thus, the higher + * bits are first "merged" with the lower bits through some XOR operations (see the last line of + * \c calc_hash()). + * + * \li To minimize the memory occupation, there is no flag to set for the empty node. An + * empty node is recognized by its data pointer set to NULL. It is then invalid to store + * NULL as data pointer in the table. + * + * \li The visiting interface through iterators is implemented with pass-by-value semantic. + * While this is overkill for medium-to-stupid compilers, it is the best designed from an + * user point of view. Moreover, being totally inlined (defined completely in the header), + * even a stupid compiler should be able to perform basic optimizations on it. + * We thought about using a pass-by-pointer semantic but it was much more awful to use, and + * the compiler is then forced to spill everything to the stack (unless it is *very* smart). + * + * \li The current implementation allows to either store the key internally (that is, copy + * the key within the hash table) or keep it external (that is, a hook is used to extract + * the key from the data in the node). The former is more memory-hungry of course, as it + * allocated static space to store the key copies. The overhead to keep both methods at + * the same time is minimal: + *
    + *
  • There is a run-time check in node_get_key which is execute per each node visited.
  • + *
  • Theoretically, there is no memory overhead. In practice, there were no + * flags in \c struct HashTable till now, so we had to add a first bit flag, but the + * overhead will disappear if a second flag is added for a different reason later.
  • + *
  • There is a little interface overhead, since we have two different versions of + * \c ht_insert(), one with the key passed as parameter and one without, but in + * the common case (external keys) both can be used.
  • + *
+ * + * \author Giovanni Bajo + */ + +#include "hashtable.h" + +#include "cfg/cfg_hashtable.h" +#include +#include +#include //ROTL(), ROTR(); + +#include + + +typedef const void** HashNodePtr; +#define NODE_EMPTY(node) (!*(node)) +#define HT_HAS_INTERNAL_KEY(ht) (CONFIG_HT_OPTIONAL_INTERNAL_KEY && ht->flags.key_internal) + +/** For hash tables with internal keys, compute the pointer to the internal key for a given \a node. */ +INLINE uint8_t *key_internal_get_ptr(struct HashTable *ht, HashNodePtr node) +{ + uint8_t* key_buf = ht->key_data.mem; + size_t index; + + // Compute the index of the node and use it to move within the whole key buffer + index = node - &ht->mem[0]; + ASSERT(index < (size_t)(1 << ht->max_elts_log2)); + key_buf += index * (INTERNAL_KEY_MAX_LENGTH + 1); + + return key_buf; +} + + +INLINE void node_get_key(struct HashTable* ht, HashNodePtr node, const void** key, uint8_t* key_length) +{ + if (HT_HAS_INTERNAL_KEY(ht)) + { + uint8_t* k = key_internal_get_ptr(ht, node); + + // Key has its length stored in the first byte + *key_length = *k++; + *key = k; + } + else + *key = ht->key_data.hook(*node, key_length); +} + + +INLINE bool node_key_match(struct HashTable* ht, HashNodePtr node, const void* key, uint8_t key_length) +{ + const void* key2; + uint8_t key2_length; + + node_get_key(ht, node, &key2, &key2_length); + + return (key_length == key2_length && memcmp(key, key2, key_length) == 0); +} + + +static uint16_t calc_hash(const void* _key, uint8_t key_length) +{ + const char* key = (const char*)_key; + uint16_t hash = key_length; + int i; + int len = (int)key_length; + + for (i = 0; i < len; ++i) + hash = ROTL(hash, 4) ^ key[i]; + + return hash ^ (hash >> 6) ^ (hash >> 13); +} + + +static HashNodePtr perform_lookup(struct HashTable* ht, + const void* key, uint8_t key_length) +{ + uint16_t hash = calc_hash(key, key_length); + uint16_t mask = ((1 << ht->max_elts_log2) - 1); + uint16_t index = hash & mask; + uint16_t first_index = index; + uint16_t step; + HashNodePtr node; + + // Fast-path optimization: we check immediately if the current node + // is the one we were looking for, so we save the computation of the + // increment step in the common case. + node = &ht->mem[index]; + if (NODE_EMPTY(node) + || node_key_match(ht, node, key, key_length)) + return node; + + // Increment while going through the hash table in case of collision. + // This implements the double-hash technique: we use the higher part + // of the hash as a step increment instead of just going to the next + // element, to minimize the collisions. + // Notice that the number must be odd to be sure that the whole table + // is traversed. Actually MCD(table_size, step) must be 1, but + // table_size is always a power of 2, so we just ensure that step is + // never a multiple of 2. + step = (ROTR(hash, ht->max_elts_log2) & mask) | 1; + + do + { + index += step; + index &= mask; + + node = &ht->mem[index]; + if (NODE_EMPTY(node) + || node_key_match(ht, node, key, key_length)) + return node; + + // The check is done after the key compare. This actually causes + // one more compare in the case the table is full (since the first + // element was compared at the very start, and then at the end), + // but it makes faster the common path where we enter this loop + // for the first time, and index will not match first_index for + // sure. + } while (index != first_index); + + return NULL; +} + + +void ht_init(struct HashTable* ht) +{ + memset(ht->mem, 0, sizeof(ht->mem[0]) * (1 << ht->max_elts_log2)); +} + + +static bool insert(struct HashTable* ht, const void* key, uint8_t key_length, const void* data) +{ + HashNodePtr node; + + if (!data) + return false; + + if (HT_HAS_INTERNAL_KEY(ht)) + key_length = MIN(key_length, (uint8_t)INTERNAL_KEY_MAX_LENGTH); + + node = perform_lookup(ht, key, key_length); + if (!node) + return false; + + if (HT_HAS_INTERNAL_KEY(ht)) + { + uint8_t* k = key_internal_get_ptr(ht, node); + *k++ = key_length; + memcpy(k, key, key_length); + } + + *node = data; + return true; +} + + +bool ht_insert_with_key(struct HashTable* ht, const void* key, uint8_t key_length, const void* data) +{ +#ifdef _DEBUG + if (!HT_HAS_INTERNAL_KEY(ht)) + { + // Construct a fake node and use it to match the key + HashNodePtr node = &data; + if (!node_key_match(ht, node, key, key_length)) + { + ASSERT2(0, "parameter key is different from the external key"); + return false; + } + } +#endif + + return insert(ht, key, key_length, data); +} + + +bool ht_insert(struct HashTable* ht, const void* data) +{ + const void* key; + uint8_t key_length; + +#ifdef _DEBUG + if (HT_HAS_INTERNAL_KEY(ht)) + { + ASSERT("parameter cannot be a hash table with internal keys - use ht_insert_with_key()" + && 0); + return false; + } +#endif + + key = ht->key_data.hook(data, &key_length); + + return insert(ht, key, key_length, data); +} + + +const void* ht_find(struct HashTable* ht, const void* key, uint8_t key_length) +{ + HashNodePtr node; + + if (HT_HAS_INTERNAL_KEY(ht)) + key_length = MIN(key_length, (uint8_t)INTERNAL_KEY_MAX_LENGTH); + + node = perform_lookup(ht, key, key_length); + + if (!node || NODE_EMPTY(node)) + return NULL; + + return *node; +} diff --git a/2.5/bertos/struct/hashtable.h b/2.5/bertos/struct/hashtable.h new file mode 100644 index 00000000..0b6f4c8f --- /dev/null +++ b/2.5/bertos/struct/hashtable.h @@ -0,0 +1,292 @@ +/** + * \file + * + * + * \author Giovanni Bajo + * + * \brief Portable hash table + * + * This file implements a portable hash table, with the following features: + * + * \li Open double-hashing. The maximum number of elements is fixed. The double hashing + * function improves recovery in case of collisions. + * \li Configurable size (which is clamped to a power of two) + * \li Visiting interface through iterator (returns the element in random order). + * \li The key is stored within the data and a hook is used to extract it. Optionally, it + * is possible to store a copy of the key within the hash table. + * + * Since the hashing is open, there is no way to remove elements from the table. Instead, a + * function is provided to clear the table completely. + * + * The data stored within the table must be a pointer. The NULL pointer is used as + * a marker for a free node, so it is invalid to store a NULL pointer in the table + * with \c ht_insert(). + * + * $WIZ$ module_name = "hashtable" + * $WIZ$ module_configuration = "bertos/cfg/cfg_hashtable.h" + */ + +#ifndef STRUCT_HASHTABLE_H +#define STRUCT_HASHTABLE_H + +#include "cfg/cfg_hashtable.h" + +#include +#include +#include + +/// Maximum length of the internal key (use (2^n)-1 for slight speedup) +#define INTERNAL_KEY_MAX_LENGTH 15 + +/** + * Hook to get the key from \a data, which is an element of the hash table. The + * key must be returned together with \a key_length (in words). + */ +typedef const void *(*hook_get_key)(const void *data, uint8_t *key_length); + + +/** + * Hash table description + * + * \note This structures MUST NOT be accessed directly. Its definition is + * provided in the header file only for optimization purposes (see the rationale + * in hashtable.c). + * + * \note If new elements must be added to this list, please double check + * \c DECLARE_HASHTABLE, which requires the existing elements to be at the top. + */ +struct HashTable +{ + const void **mem; ///< Buckets of data + uint16_t max_elts_log2; ///< Log2 of the size of the table + struct { + bool key_internal : 1; ///< true if the key is copied internally + } flags; + union { + hook_get_key hook; ///< Hook to get the key + uint8_t *mem; ///< Pointer to the key memory + } key_data; +}; + + +/// Iterator to walk the hash table +typedef struct +{ + const void** pos; + const void** end; +} HashIterator; + + +/** + * Declare a hash table in the current scope + * + * \param name Variable name + * \param size Number of elements + * \param hook_gk Hook to be used to extract the key from the node + * + * \note The number of elements will be rounded down to the nearest + * power of two. + * + */ +#define DECLARE_HASHTABLE(name, size, hook_gk) \ + static const void* name##_nodes[1 << UINT32_LOG2(size)]; \ + struct HashTable name = \ + { \ + .mem = name##_nodes, \ + .max_elts_log2 = UINT32_LOG2(size), \ + .flags = { .key_internal = false }, \ + .key_data.hook = hook_gk \ + } + + +/** Exactly like \c DECLARE_HASHTABLE, but the variable will be declared as static. */ +#define DECLARE_HASHTABLE_STATIC(name, size, hook_gk) \ + static const void* name##_nodes[1 << UINT32_LOG2(size)]; \ + static struct HashTable name = \ + { \ + .mem = name##_nodes, \ + .max_elts_log2 = UINT32_LOG2(size), \ + .flags = { .key_internal = false }, \ + .key_data.hook = hook_gk \ + } + +#if CONFIG_HT_OPTIONAL_INTERNAL_KEY + /** Declare a hash table with internal copies of the keys. This version does not + * require a hook, nor it requires the user to allocate static memory for the keys. + * It is mostly suggested for tables whose keys are computed on the fly and need + * to be stored somewhere. + */ + #define DECLARE_HASHTABLE_INTERNALKEY(name, size) \ + static uint8_t name##_keys[(1 << UINT32_LOG2(size)) * (INTERNAL_KEY_MAX_LENGTH + 1)]; \ + static const void* name##_nodes[1 << UINT32_LOG2(size)]; \ + struct HashTable name = { name##_nodes, UINT32_LOG2(size), { true }, name##_keys } + + /** Exactly like \c DECLARE_HASHTABLE_INTERNALKEY, but the variable will be declared as static. */ + #define DECLARE_HASHTABLE_INTERNALKEY_STATIC(name, size) \ + static uint8_t name##_keys[(1 << UINT32_LOG2(size)) * (INTERNAL_KEY_MAX_LENGTH + 1)]; \ + static const void* name##_nodes[1 << UINT32_LOG2(size)]; \ + static struct HashTable name = \ + { \ + .mem = name##_nodes, \ + .max_elts_log2 = UINT32_LOG2(size), \ + .flags = { .key_internal = true }, \ + .key_data.mem = name##_keys \ + } +#endif + +/** + * Initialize (and clear) a hash table in a memory buffer. + * + * \param ht Hash table declared with \c DECLARE_HASHTABLE + * + * \note This function must be called before using the hash table. Optionally, + * it can be called later in the program to clear the hash table, + * removing all its elements. + */ +void ht_init(struct HashTable* ht); + +/** + * Insert an element into the hash table + * + * \param ht Handle of the hash table + * \param data Data to be inserted into the table + * \return true if insertion was successful, false otherwise (table is full) + * + * \note The key for the element to insert is extract from the data with + * the hook. This means that this function cannot be called for hashtables + * with internal keys. + * + * \note If an element with the same key already exists in the table, + * it will be overwritten. + * + * \note It is not allowed to store NULL in the table. If you pass NULL as data, + * the function call will fail. + */ +bool ht_insert(struct HashTable* ht, const void* data); + +/** + * Insert an element into the hash table + * + * \param ht Handle of the hash table + * \param key Key of the element + * \param key_length Length of the key in characters + * \param data Data to be inserted into the table + * \return true if insertion was successful, false otherwise (table is full) + * + * \note If this function is called for hash table with external keys, + * the key provided must be match the key that would be extracted with the + * hook, otherwise the function will fail. + * + * \note If an element with the same key already exists in the table, + * it will be overwritten. + * + * \note It is not allowed to store NULL in the table. If you pass NULL as data, + * the function call will fail. + */ +bool ht_insert_with_key(struct HashTable* ht, const void* key, uint8_t key_length, const void* data); + +/** + * Find an element in the hash table + * + * \param ht Handle of the hash table + * \param key Key of the element + * \param key_length Length of the key in characters + * \return Data of the element, or NULL if no element was found for the given key. + */ +const void* ht_find(struct HashTable* ht, const void* key, uint8_t key_length); + +/** Similar to \c ht_insert_with_key() but \a key is an ASCIIZ string */ +#define ht_insert_str(ht, key, data) ht_insert_with_key(ht, key, strlen(key), data) + +/** Similar to \c ht_find() but \a key is an ASCIIZ string */ +#define ht_find_str(ht, key) ht_find(ht, key, strlen(key)) + +/// Get an iterator to the begin of the hash table \a ht +INLINE HashIterator ht_iter_begin(struct HashTable* ht) +{ + HashIterator h; + + h.pos = &ht->mem[0]; + h.end = &ht->mem[1 << ht->max_elts_log2]; + + while (h.pos != h.end && !*h.pos) + ++h.pos; + + return h; +} + +/** + * Get an iterator to the (exclusive) end of the hash table \a ht + * + * \note Like in STL, the end iterator is not a valid iterator (you + * cannot call \c ht_iter_get() on it), and it must be used only to + * detect if we reached the end of the iteration (through \c ht_iter_cmp()). + */ +INLINE HashIterator ht_iter_end(struct HashTable* ht) +{ + HashIterator h; + + h.pos = h.end = &ht->mem[1 << ht->max_elts_log2]; + + return h; +} + +/// Compare \a it1 and \a it2 for equality +INLINE bool ht_iter_cmp(HashIterator it1, HashIterator it2) +{ + ASSERT(it1.end == it2.end); + return it1.pos == it2.pos; +} + +/// Get the element within the hash table \a ht pointed by the iterator \a iter +INLINE const void* ht_iter_get(HashIterator iter) +{ return *iter.pos; } + +/** Return an iterator pointing to the element following \a h + * + * \note The order of the elements visited during the iteration is casual, + * and depends on the implementation. + * + */ +INLINE HashIterator ht_iter_next(HashIterator h) +{ + ++h.pos; + while (h.pos != h.end && !(*h.pos)) + ++h.pos; + + return h; +} + +int hashtable_testSetup(void); +int hashtable_testRun(void); +int hashtable_testTearDown(void); + +#endif /* STRUCT_HASHTABLE_H */ diff --git a/2.5/bertos/struct/hashtable_test.c b/2.5/bertos/struct/hashtable_test.c new file mode 100644 index 00000000..4e5492bd --- /dev/null +++ b/2.5/bertos/struct/hashtable_test.c @@ -0,0 +1,120 @@ +/** + * \file + * + * + * \brief Test hashtable module. + * + * Test the hashtable module (insertion and find). + * + * \author Andrea Righi + * + * $test$: cp bertos/cfg/cfg_hashtable.h $cfgdir/ + */ + +#include +#include +#include /* strlen() */ +#include "struct/hashtable.h" + +static const void *test_get_key(const void *ptr, uint8_t *length) +{ + const char *s = ptr; + + *length = strlen(s); + return s; +} + +#define NUM_ELEMENTS 256 +DECLARE_HASHTABLE_STATIC(hash1, NUM_ELEMENTS, test_get_key); +DECLARE_HASHTABLE_INTERNALKEY_STATIC(hash2, NUM_ELEMENTS); + +static char data[NUM_ELEMENTS][10]; +static char keydomain[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + +static bool single_test(void) +{ + int i; + + ht_init(&hash1); + ht_init(&hash2); + + for (i = 0; i < NUM_ELEMENTS; i++) + { + int k, klen; + + klen = (i % 8) + 1; + for (k = 0; k < klen; k++) + data[i][k] = keydomain[i % (sizeof(keydomain) - 1)]; + data[i][k] = 0; + + ASSERT(ht_insert(&hash1, data[i])); + ASSERT(ht_insert_str(&hash2, data[i], data[i])); + } + for (i = 0; i < NUM_ELEMENTS; i++) + { + const char *found1, *found2; + + found1 = ht_find_str(&hash1, data[i]); + if (strcmp(found1, data[i])) + return false; + kprintf("hash1: found data[%d] = %s\n", i, found1); + + found2 = ht_find_str(&hash2, data[i]); + if (strcmp(found2, data[i])) + return false; + kprintf("hash2: found data[%d] = %s\n", i, found2); + } + return true; +} + +int hashtable_testRun(void) +{ + if (!single_test()) + { + kprintf("hashtable_test failed\n"); + return -1; + } + kprintf("hashtable_test successful\n"); + return 0; +} + +int hashtable_testSetup(void) +{ + kdbg_init(); + return 0; +} + +int hashtable_testTearDown(void) +{ + kputs("TearDown hashtable test.\n"); + return 0; +} + +TEST_MAIN(hashtable); diff --git a/2.5/bertos/struct/heap.c b/2.5/bertos/struct/heap.c new file mode 100644 index 00000000..4800f1b2 --- /dev/null +++ b/2.5/bertos/struct/heap.c @@ -0,0 +1,252 @@ +/** + * \file + * + * + * \brief Heap subsystem (public interface). + * + * \author Bernie Innocenti + */ + +#include "heap.h" + +#include // ASSERT() +#include // memset() + +#define FREE_FILL_CODE 0xDEAD +#define ALLOC_FILL_CODE 0xBEEF + + +/* + * This function prototype is deprecated, will change in: + * void heap_init(struct Heap* h, heap_buf_t* memory, size_t size) + * in the next BeRTOS release. + */ +void heap_init(struct Heap* h, void* memory, size_t size) +{ + #ifdef _DEBUG + memset(memory, FREE_FILL_CODE, size); + #endif + + ASSERT2(((size_t)memory % alignof(heap_buf_t)) == 0, + "memory buffer is unaligned, please use the HEAP_DEFINE_BUF() macro to declare heap buffers!\n"); + + /* Initialize heap with a single big chunk */ + h->FreeList = (MemChunk *)memory; + h->FreeList->next = NULL; + h->FreeList->size = size; +} + + +void *heap_allocmem(struct Heap* h, size_t size) +{ + MemChunk *chunk, *prev; + + /* Round size up to the allocation granularity */ + size = ROUND_UP2(size, sizeof(MemChunk)); + + /* Handle allocations of 0 bytes */ + if (!size) + size = sizeof(MemChunk); + + /* Walk on the free list looking for any chunk big enough to + * fit the requested block size. + */ + for (prev = (MemChunk *)&h->FreeList, chunk = h->FreeList; + chunk; + prev = chunk, chunk = chunk->next) + { + if (chunk->size >= size) + { + if (chunk->size == size) + { + /* Just remove this chunk from the free list */ + prev->next = chunk->next; + #ifdef _DEBUG + memset(chunk, ALLOC_FILL_CODE, size); + #endif + return (void *)chunk; + } + else + { + /* Allocate from the END of an existing chunk */ + chunk->size -= size; + #ifdef _DEBUG + memset((uint8_t *)chunk + chunk->size, ALLOC_FILL_CODE, size); + #endif + return (void *)((uint8_t *)chunk + chunk->size); + } + } + } + + return NULL; /* fail */ +} + + +void heap_freemem(struct Heap* h, void *mem, size_t size) +{ + MemChunk *prev; + ASSERT(mem); + +#ifdef _DEBUG + memset(mem, FREE_FILL_CODE, size); +#endif + + /* Round size up to the allocation granularity */ + size = ROUND_UP2(size, sizeof(MemChunk)); + + /* Handle allocations of 0 bytes */ + if (!size) + size = sizeof(MemChunk); + + /* Special cases: first chunk in the free list or memory completely full */ + ASSERT((uint8_t*)mem != (uint8_t*)h->FreeList); + if (((uint8_t *)mem) < ((uint8_t *)h->FreeList) || !h->FreeList) + { + /* Insert memory block before the current free list head */ + prev = (MemChunk *)mem; + prev->next = h->FreeList; + prev->size = size; + h->FreeList = prev; + } + else /* Normal case: not the first chunk in the free list */ + { + /* + * Walk on the free list. Stop at the insertion point (when mem + * is between prev and prev->next) + */ + prev = h->FreeList; + while (prev->next < (MemChunk *)mem && prev->next) + prev = prev->next; + + /* Make sure mem is not *within* prev */ + ASSERT((uint8_t*)mem >= (uint8_t*)prev + prev->size); + + /* Should it be merged with previous block? */ + if (((uint8_t *)prev) + prev->size == ((uint8_t *)mem)) + { + /* Yes */ + prev->size += size; + } + else /* not merged with previous chunk */ + { + MemChunk *curr = (MemChunk*)mem; + + /* insert it after the previous node + * and move the 'prev' pointer forward + * for the following operations + */ + curr->next = prev->next; + curr->size = size; + prev->next = curr; + + /* Adjust for the following test */ + prev = curr; + } + } + + /* Also merge with next chunk? */ + if (((uint8_t *)prev) + prev->size == ((uint8_t *)prev->next)) + { + prev->size += prev->next->size; + prev->next = prev->next->next; + + /* There should be only one merge opportunity, becuase we always merge on free */ + ASSERT((uint8_t*)prev + prev->size != (uint8_t*)prev->next); + } +} + +/** + * Returns the number of free bytes in a heap. + * \param h the heap to check. + * + * \note The returned value is the sum of all free memory regions + * in the heap. + * Those regions are likely to be *not* contiguous, + * so a successive allocation may fail even if the + * requested amount of memory is lower than the current free space. + */ +size_t heap_freeSpace(struct Heap *h) +{ + size_t free_mem = 0; + for (MemChunk *chunk = h->FreeList; chunk; chunk = chunk->next) + free_mem += chunk->size; + + return free_mem; +} + +#if CONFIG_HEAP_MALLOC + +void *heap_malloc(struct Heap* h, size_t size) +{ + size_t *mem; + + size += sizeof(size_t); + if ((mem = (size_t*)heap_allocmem(h, size))) + *mem++ = size; + + return mem; +} + +void *heap_calloc(struct Heap* h, size_t size) +{ + void *mem; + + if ((mem = heap_malloc(h, size))) + memset(mem, 0, size); + + return mem; +} + +/** + * Free a block of memory, determining its size automatically. + * + * \param h Heap from which the block was allocated. + * \param mem Pointer to a block of memory previously allocated with + * either heap_malloc() or heap_calloc(). + * + * \note If \a mem is a NULL pointer, no operation is performed. + * + * \note Freeing the same memory block twice has undefined behavior. + * + * \note This function works like the ANSI C free(). + */ +void heap_free(struct Heap *h, void *mem) +{ + size_t *_mem = (size_t *)mem; + + if (_mem) + { + --_mem; + heap_freemem(h, _mem, *_mem); + } +} + +#endif /* CONFIG_HEAP_MALLOC */ diff --git a/2.5/bertos/struct/heap.h b/2.5/bertos/struct/heap.h new file mode 100644 index 00000000..efd02c28 --- /dev/null +++ b/2.5/bertos/struct/heap.h @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \brief Heap subsystem (public interface). + * + * \todo Heap memory could be defined as an array of MemChunk, and used + * in this form also within the implementation. This would probably remove + * memory alignment problems, and also some aliasing issues. + * + * \version $Id$ + * \author Bernie Innocenti + * + * $WIZ$ module_name = "heap" + * $WIZ$ module_configuration = "bertos/cfg/cfg_heap.h" + */ + +#ifndef STRUCT_HEAP_H +#define STRUCT_HEAP_H + +#include "cfg/cfg_heap.h" +#include +#include // IS_POW2() + +/* NOTE: struct size must be a 2's power! */ +typedef struct _MemChunk +{ + struct _MemChunk *next; + size_t size; +} MemChunk; + +STATIC_ASSERT(IS_POW2(sizeof(MemChunk))); + +typedef MemChunk heap_buf_t; + +/// A heap +typedef struct Heap +{ + struct _MemChunk *FreeList; ///< Head of the free list +} Heap; + +/** + * Utility macro to allocate a heap of size \a size. + * + * \param name Variable name for the heap. + * \param size Heap size in bytes. + */ +#define HEAP_DEFINE_BUF(name, size) \ + heap_buf_t name[((size) + sizeof(heap_buf_t) - 1) / sizeof(heap_buf_t)] + +/// Initialize \a heap within the buffer pointed by \a memory which is of \a size bytes +void heap_init(struct Heap* heap, void* memory, size_t size); + +/// Allocate a chunk of memory of \a size bytes from the heap +void *heap_allocmem(struct Heap* heap, size_t size); + +/// Free a chunk of memory of \a size bytes from the heap +void heap_freemem(struct Heap* heap, void *mem, size_t size); + +size_t heap_freeSpace(struct Heap *h); + +#define HNEW(heap, type) \ + (type*)heap_allocmem(heap, sizeof(type)) + +#define HNEWVEC(heap, type, nelem) \ + (type*)heap_allocmem(heap, sizeof(type) * (nelem)) + +#define HDELETE(heap, type, mem) \ + heap_freemem(heap, mem, sizeof(type)) + +#define HDELETEVEC(heap, type, nelem, mem) \ + heap_freemem(heap, mem, sizeof(type) * (nelem)) + + +#if CONFIG_HEAP_MALLOC + +void *heap_malloc(struct Heap* heap, size_t size); +void *heap_calloc(struct Heap* heap, size_t size); +void heap_free(struct Heap* heap, void * mem); + +#endif + +int heap_testSetup(void); +int heap_testRun(void); +int heap_testTearDown(void); + +#endif /* STRUCT_HEAP_H */ diff --git a/2.5/bertos/struct/heap_test.c b/2.5/bertos/struct/heap_test.c new file mode 100644 index 00000000..2ce28cfc --- /dev/null +++ b/2.5/bertos/struct/heap_test.c @@ -0,0 +1,123 @@ +/** + * \file + * + * + * \brief Heap test. + * + * \author Francesco Sacchi + */ + + +#include +#include + +#include +#include +#include + +#define TEST_LEN 31 +#define ALLOC_SIZE 113 + +#define TEST_LEN2 32 +#define ALLOC_SIZE2 128 + +#define HEAP_SIZE 4096 + +HEAP_DEFINE_BUF(heap_buf, HEAP_SIZE); +STATIC_ASSERT(sizeof(heap_buf) % sizeof(heap_buf_t) == 0); + +Heap h; + +int heap_testSetup(void) +{ + kdbg_init(); + heap_init(&h, heap_buf, sizeof(heap_buf)); + return 0; +} + +static void alloc_test(size_t size, size_t test_len) +{ + //Simple test + uint8_t *a[test_len]; + + for (size_t i = 0; i < test_len; i++) + { + a[i] = heap_allocmem(&h, size); + ASSERT(a[i]); + for (size_t j = 0; j < size; j++) + a[i][j] = i; + } + + ASSERT(heap_freeSpace(&h) == HEAP_SIZE - test_len * ROUND_UP2(size, sizeof(MemChunk))); + + for (size_t i = 0; i < test_len; i++) + { + for (size_t j = 0; j < size; j++) + { + kprintf("a[%d][%d] = %d\n", i, j, a[i][j]); + ASSERT(a[i][j] == i); + } + heap_freemem(&h, a[i], size); + } + ASSERT(heap_freeSpace(&h) == HEAP_SIZE); +} + +int heap_testRun(void) +{ + alloc_test(ALLOC_SIZE, TEST_LEN); + alloc_test(ALLOC_SIZE2, TEST_LEN2); + /* Try to allocate the whole heap */ + uint8_t *b = heap_allocmem(&h, HEAP_SIZE); + ASSERT(b); + ASSERT(heap_freeSpace(&h) == 0); + + ASSERT(!heap_allocmem(&h, HEAP_SIZE)); + + for (int j = 0; j < HEAP_SIZE; j++) + b[j] = j; + + for (int j = 0; j < HEAP_SIZE; j++) + { + kprintf("b[%d] = %d\n", j, j); + ASSERT(b[j] == (j & 0xff)); + } + heap_freemem(&h, b, HEAP_SIZE); + ASSERT(heap_freeSpace(&h) == HEAP_SIZE); + + return 0; +} + +int heap_testTearDown(void) +{ + return 0; +} + +TEST_MAIN(heap); diff --git a/2.5/bertos/struct/kfile_fifo.c b/2.5/bertos/struct/kfile_fifo.c new file mode 100644 index 00000000..9ebc59df --- /dev/null +++ b/2.5/bertos/struct/kfile_fifo.c @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief KFile interface over a FIFO buffer. + * + * \version $Id: cfg_adc.h 2348 2009-02-16 13:43:44Z duplo $ + * \author Francesco Sacchi + */ + +#include "kfile_fifo.h" +#include "fifobuf.h" + +#include + +#include + +static size_t kfilefifo_read(struct KFile *_fd, void *_buf, size_t size) +{ + KFileFifo *fd = KFILEFIFO_CAST(_fd); + uint8_t *buf = (uint8_t *)_buf; + + while (size-- && !fifo_isempty_locked(fd->fifo)) + *buf++ = fifo_pop_locked(fd->fifo); + + return buf - (uint8_t *)_buf; +} + +static size_t kfilefifo_write(struct KFile *_fd, const void *_buf, size_t size) +{ + KFileFifo *fd = KFILEFIFO_CAST(_fd); + const uint8_t *buf = (const uint8_t *)_buf; + + while (size-- && !fifo_isfull_locked(fd->fifo)) + fifo_push_locked(fd->fifo, *buf++); + + return buf - (const uint8_t *)_buf; +} + +void kfilefifo_init(KFileFifo *kf, FIFOBuffer *fifo) +{ + memset(kf, 0, sizeof(*kf)); + + kf->fifo = fifo; + kf->fd.read = kfilefifo_read; + kf->fd.write = kfilefifo_write; + DB(kf->fd._type = KFT_KFILEFIFO); +} diff --git a/2.5/bertos/struct/kfile_fifo.h b/2.5/bertos/struct/kfile_fifo.h new file mode 100644 index 00000000..78c1f46d --- /dev/null +++ b/2.5/bertos/struct/kfile_fifo.h @@ -0,0 +1,100 @@ +/** + * \file + * + * + * \brief KFile interface over a FIFO buffer. + * + * Convenient way to push data into a FIFO using the KFile interface. + * For example, it's possible to read from a serial port and put the characters + * into a fifo: + * \code + * // serial reader process + * { + * // other stuff here... + * kfile_read(&ser_port.fd, buffer, sizeof(buffer)); + * kfile_write(&kfifo.fd, buffer, sizeof(buffer)); + * // ... + * } + * + * // controller process + * { + * //... + * kfile_read(&kfifo.fd, buffer2, sizeof(buffer2)); + * // use read data + * } + * \endcode + * + * + * \version $Id: cfg_adc.h 2348 2009-02-16 13:43:44Z duplo $ + * \author Francesco Sacchi + * + * $WIZ$ module_name = "kfilefifo" + * $WIZ$ module_depends = "kfile" + */ + +#ifndef STRUCT_KFILE_FIFO +#define STRUCT_KFILE_FIFO + +#include "fifobuf.h" +#include + +typedef struct KFileFifo +{ + KFile fd; + FIFOBuffer *fifo; +} KFileFifo; + +/** + * ID for KFile FIFO. + */ +#define KFT_KFILEFIFO MAKE_ID('F', 'I', 'F', '0') + +/** + * Convert + ASSERT from generic KFile to KFileFifo. + */ +INLINE KFileFifo * KFILEFIFO_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_KFILEFIFO); + return (KFileFifo *)fd; +} + +/** + * Initialize KFileFifo struct. + * + * \param kf Interface to initialize. + * \param fifo Fifo buffer to operate on. + */ +void kfilefifo_init(KFileFifo *kf, FIFOBuffer *fifo); + +int kfilefifo_testSetup(void); +int kfilefifo_testRun(void); +int kfilefifo_testTearDown(void); +#endif /* STRUCT_KFILE_FIFO */ diff --git a/2.5/bertos/struct/kfile_fifo_test.c b/2.5/bertos/struct/kfile_fifo_test.c new file mode 100644 index 00000000..8c2d04a3 --- /dev/null +++ b/2.5/bertos/struct/kfile_fifo_test.c @@ -0,0 +1,148 @@ +/** + * \file + * + * + * \brief FIFO and KFileFifo test. + * + * \version $Id: kfilefifo_test.c 1962 2008-12-02 15:37:17Z batt $ + * \author Bernie Innocenti + */ + + +#include +#include + +#include +#include +#include + + +int kfilefifo_testSetup(void) +{ + kdbg_init(); + return 0; +} + +int kfilefifo_testRun(void) +{ + #define FIFOBUF_LEN 256 + + uint8_t buf[FIFOBUF_LEN]; + + FIFOBuffer fifo; + fifo_init(&fifo, buf, sizeof(buf)); + + ASSERT(fifo_isempty(&fifo)); + ASSERT(!fifo_isfull(&fifo)); + + for (int i = 0; i < FIFOBUF_LEN - 1; i++) + { + ASSERT(!fifo_isfull(&fifo)); + fifo_push(&fifo, i); + } + + ASSERT(fifo_isfull(&fifo)); + + for (int i = 0; i < FIFOBUF_LEN - 1; i++) + { + ASSERT(!fifo_isempty(&fifo)); + ASSERT(fifo_pop(&fifo) == i); + } + + ASSERT(fifo_isempty(&fifo)); + + for (int i = 0; i < FIFOBUF_LEN - 1; i++) + { + ASSERT(!fifo_isfull(&fifo)); + fifo_push(&fifo, i); + } + ASSERT(fifo_isfull(&fifo)); + fifo_flush(&fifo); + ASSERT(!fifo_isfull(&fifo)); + ASSERT(fifo_isempty(&fifo)); + + KFileFifo kfifo; + kfilefifo_init(&kfifo, &fifo); + + for (int i = 0; i < FIFOBUF_LEN - 1; i++) + { + ASSERT(!fifo_isfull(&fifo)); + fifo_push(&fifo, i); + } + + for (int i = 0; i < FIFOBUF_LEN - 1; i++) + ASSERT(kfile_getc(&kfifo.fd) == i); + + ASSERT(kfile_getc(&kfifo.fd) == EOF); + ASSERT(fifo_isempty(&fifo)); + + for (int i = 0; i < FIFOBUF_LEN - 1; i++) + ASSERT(kfile_putc(i, &kfifo.fd) == i); + + ASSERT(fifo_isfull(&fifo)); + + for (int i = 0; i < FIFOBUF_LEN - 1; i++) + { + ASSERT(!fifo_isempty(&fifo)); + ASSERT(fifo_pop(&fifo) == i); + } + + ASSERT(fifo_isempty(&fifo)); + + for (int i = 0; i < FIFOBUF_LEN - 1; i++) + ASSERT(kfile_putc(i, &kfifo.fd) == i); + + ASSERT(fifo_isfull(&fifo)); + ASSERT(kfile_putc('a', &kfifo.fd) == EOF); + + fifo_flush(&fifo); + ASSERT(!fifo_isfull(&fifo)); + ASSERT(fifo_isempty(&fifo)); + ASSERT(kfile_getc(&kfifo.fd) == EOF); + + ASSERT(kfile_write(&kfifo.fd, "hello world", 11) == 11); + ASSERT(kfile_write(&kfifo.fd, "hello world", FIFOBUF_LEN) == FIFOBUF_LEN - 1 - 11); + + uint8_t test_buf[FIFOBUF_LEN]; + ASSERT(kfile_read(&kfifo.fd, test_buf, FIFOBUF_LEN + 20) == FIFOBUF_LEN - 1); + + ASSERT(!fifo_isfull(&fifo)); + ASSERT(fifo_isempty(&fifo)); + ASSERT(kfile_getc(&kfifo.fd) == EOF); + return 0; +} + +int kfilefifo_testTearDown(void) +{ + return 0; +} + +TEST_MAIN(kfilefifo); diff --git a/2.5/bertos/struct/kfile_mem.c b/2.5/bertos/struct/kfile_mem.c new file mode 100644 index 00000000..5560fdc6 --- /dev/null +++ b/2.5/bertos/struct/kfile_mem.c @@ -0,0 +1,83 @@ +/** + * \file + * + * + * \brief KFile interface over a memory buffer. + * + * \version $Id: cfg_adc.h 2348 2009-02-16 13:43:44Z duplo $ + * \author Francesco Sacchi + */ + +#include "kfile_mem.h" + +#include + +#include + +static size_t kfilemem_read(struct KFile *_fd, void *buf, size_t size) +{ + KFileMem *fd = KFILEMEM_CAST(_fd); + + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); + uint8_t *mem = (uint8_t *)fd->mem; + memcpy(buf, mem + fd->fd.seek_pos, size); + fd->fd.seek_pos += size; + + return size; +} + +static size_t kfilemem_write(struct KFile *_fd, const void *buf, size_t size) +{ + KFileMem *fd = KFILEMEM_CAST(_fd); + + size = MIN((kfile_off_t)size, fd->fd.size - fd->fd.seek_pos); + uint8_t *mem = (uint8_t *)fd->mem; + memcpy(mem + fd->fd.seek_pos, buf, size); + fd->fd.seek_pos += size; + + return size; +} + +void kfilemem_init(KFileMem *km, void *mem, size_t len) +{ + ASSERT(km); + ASSERT(mem); + ASSERT(len); + + memset(km, 0, sizeof(*km)); + + km->mem = mem; + kfile_init(&km->fd); + km->fd.read = kfilemem_read; + km->fd.write = kfilemem_write; + km->fd.size = len; + DB(km->fd._type = KFT_KFILEMEM); +} diff --git a/2.5/bertos/struct/kfile_mem.h b/2.5/bertos/struct/kfile_mem.h new file mode 100644 index 00000000..c723de2f --- /dev/null +++ b/2.5/bertos/struct/kfile_mem.h @@ -0,0 +1,82 @@ +/** + * \file + * + * + * \brief KFile interface over a memory buffer. + * + * Convenient way to access a memory region using the KFile interface. + * + * + * \version $Id: cfg_adc.h 2348 2009-02-16 13:43:44Z duplo $ + * \author Francesco Sacchi + * + * $WIZ$ module_name = "kfilemem" + * $WIZ$ module_depends = "kfile" + */ + +#ifndef STRUCT_KFILE_MEM +#define STRUCT_KFILE_MEM + +#include + +/** + * Context for KFile over memory buffer. + */ +typedef struct KFileMem +{ + KFile fd; ///< KFile base class + void *mem; ///< Pointer to the memory buffer used. +} KFileMem; + +/** + * ID for KFile Mem. + */ +#define KFT_KFILEMEM MAKE_ID('M', 'E', 'M', '0') + +/** + * Convert + ASSERT from generic KFile to KFileMem. + */ +INLINE KFileMem * KFILEMEM_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_KFILEMEM); + return (KFileMem *)fd; +} + +/** + * Initialize KFileMem struct. + * + * \param km Interface to initialize. + * \param mem Pointer to the memory buffer to operate on. + * \param len Size of the buffer + */ +void kfilemem_init(KFileMem *km, void *mem, size_t len); + +#endif /* STRUCT_KFILE_MEM */ diff --git a/2.5/bertos/struct/list.h b/2.5/bertos/struct/list.h new file mode 100644 index 00000000..b970b7cf --- /dev/null +++ b/2.5/bertos/struct/list.h @@ -0,0 +1,353 @@ +/** + * \file + * + * + * \brief General pourpose double-linked lists + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef STRUCT_LIST_H +#define STRUCT_LIST_H + +#include /* INLINE */ +#include /* ASSERT_VALID_PTR() */ + +/** + * This structure represents a node for bidirectional lists. + * + * Data is usually appended to nodes by making them the first + * field of another struture, as a poor-man's form of inheritance. + */ +typedef struct _Node +{ + struct _Node *succ; + struct _Node *pred; +} Node; + +/** + * Head of a doubly-linked list of \c Node structs. + * + * Lists must be initialized with LIST_INIT() prior to use. + * + * Nodes can be added and removed from either end of the list + * with O(1) performance. Iterating over these lists can be + * tricky: use the FOREACH_NODE() macro instead. + */ +typedef struct _List +{ + Node head; + Node tail; +} List; + +/** + * Extended node for priority queues. + */ +typedef struct _PriNode +{ + Node link; + int pri; +} PriNode; + + +/** + * Template for a naked node in a list of \a T structures. + * + * To be used as data member in other structures: + * + * \code + * struct Foo + * { + * DECLARE_NODE_ANON(struct Foo) + * int a; + * float b; + * } + * + * DECLARE_LIST_TYPE(Foo); + * + * void foo(void) + * { + * static LIST_TYPE(Foo) foo_list; + * static Foo foo1, foo2; + * Foo *fp; + * + * LIST_INIT(&foo_list); + * ADDHEAD(&foo_list, &foo1); + * INSERT_BEFORE(&foo_list, &foo2); + * FOREACH_NODE(fp, &foo_list) + * fp->a = 10; + * } + * + * \endcode + */ +#define DECLARE_NODE_ANON(T) \ + T *succ; T *pred; + +/** Declare a typesafe node for structures of type \a T. */ +#define DECLARE_NODE_TYPE(T) \ + typedef struct T##Node { T *succ; T *pred; } T##Node + +/** Template for a list of \a T structures. */ +#define DECLARE_LIST_TYPE(T) \ + DECLARE_NODE_TYPE(T); \ + typedef struct T##List { \ + T##Node head; \ + T##Node tail; \ + } T##List + +#define NODE_TYPE(T) T##Node +#define LIST_TYPE(T) T##List + +/** + * Get a pointer to the first node in a list. + * + * If \a l is empty, result points to l->tail. + */ +#define LIST_HEAD(l) ((l)->head.succ) + +/** + * Get a pointer to the last node in a list. + * + * If \a l is empty, result points to l->head. + */ +#define LIST_TAIL(l) ((l)->tail.pred) + +// TODO: move in compiler.h +#if COMPILER_TYPEOF + #define TYPEOF_OR_VOIDPTR(type) typeof(type) +#else + #define TYPEOF_OR_VOIDPTR(type) void * +#endif + +/** + * Iterate over all nodes in a list. + * + * This macro generates a "for" statement using the following parameters: + * \param n Node pointer to be used in each iteration. + * \param l Pointer to list. + */ +#define FOREACH_NODE(n, l) \ + for( \ + (n) = (TYPEOF_OR_VOIDPTR(n))LIST_HEAD(l); \ + ((Node *)(n))->succ; \ + (n) = (TYPEOF_OR_VOIDPTR(n))(((Node *)(n))->succ) \ + ) + +/** + * Iterate backwards over all nodes in a list. + * + * This macro generates a "for" statement using the following parameters: + * \param n Node pointer to be used in each iteration. + * \param l Pointer to list. + */ +#define REVERSE_FOREACH_NODE(n, l) \ + for( \ + (n) = (TYPEOF_OR_VOIDPTR(n))LIST_TAIL(l); \ + ((Node *)(n))->pred; \ + (n) = (TYPEOF_OR_VOIDPTR(n))(((Node *)(n))->pred) \ + ) + +/** Initialize a list. */ +#define LIST_INIT(l) \ + do { \ + (l)->head.succ = (TYPEOF_OR_VOIDPTR((l)->head.succ)) &(l)->tail; \ + (l)->head.pred = NULL; \ + (l)->tail.succ = NULL; \ + (l)->tail.pred = (TYPEOF_OR_VOIDPTR((l)->tail.pred)) &(l)->head; \ + } while (0) + +#ifdef _DEBUG + /** Make sure that a list is valid (it was initialized and is not corrupted). */ + #define LIST_ASSERT_VALID(l) \ + do { \ + Node *n, *pred; \ + ASSERT((l)->head.succ != NULL); \ + ASSERT((l)->head.pred == NULL); \ + ASSERT((l)->tail.succ == NULL); \ + ASSERT((l)->tail.pred != NULL); \ + pred = &(l)->head; \ + FOREACH_NODE(n, l) \ + { \ + ASSERT(n->pred == pred); \ + pred = n; \ + } \ + ASSERT(n == &(l)->tail); \ + } while (0) + + /// Checks that a node isn't part of a given list + #define LIST_ASSERT_NOT_CONTAINS(list,node) \ + do { \ + Node *ln; \ + ASSERT_VALID_PTR(list); \ + ASSERT_VALID_PTR(node); \ + FOREACH_NODE(ln, list) \ + ASSERT(ln != (Node *)(node)); \ + } while (0) + + #define INVALIDATE_NODE(n) ((n)->succ = (n)->pred = NULL) +#else + #define LIST_ASSERT_VALID(l) do {} while (0) + #define LIST_ASSERT_NOT_CONTAINS(list,node) do {} while (0) + #define INVALIDATE_NODE(n) do {} while (0) +#endif + +/** Tell whether a list is empty. */ +#define LIST_EMPTY(l) ( (void *)((l)->head.succ) == (void *)(&(l)->tail) ) + +/** Add node to list head. */ +#define ADDHEAD(l,n) \ + do { \ + LIST_ASSERT_NOT_CONTAINS((l),(n)); \ + (n)->succ = (l)->head.succ; \ + (n)->pred = (l)->head.succ->pred; \ + (n)->succ->pred = (n); \ + (n)->pred->succ = (n); \ + } while (0) + +/** Add node to list tail. */ +#define ADDTAIL(l,n) \ + do { \ + LIST_ASSERT_NOT_CONTAINS((l),(n)); \ + (n)->succ = &(l)->tail; \ + (n)->pred = (l)->tail.pred; \ + (n)->pred->succ = (n); \ + (l)->tail.pred = (n); \ + } while (0) + +/** + * Insert node \a n before node \a ln. + * + * \note You can't pass in a list header as \a ln, but + * it is safe to pass list-\>head of an empty list. + */ +#define INSERT_BEFORE(n,ln) \ + do { \ + ASSERT_VALID_PTR(n); \ + ASSERT_VALID_PTR(ln); \ + (n)->succ = (ln); \ + (n)->pred = (ln)->pred; \ + (ln)->pred->succ = (n); \ + (ln)->pred = (n); \ + } while (0) + +/** + * Remove \a n from whatever list it is in. + * + * \note Removing a node that has not previously been + * inserted into a list invokes undefined behavior. + */ +#define REMOVE(n) \ + do { \ + ASSERT_VALID_PTR(n); \ + (n)->pred->succ = (n)->succ; \ + (n)->succ->pred = (n)->pred; \ + INVALIDATE_NODE(n); \ + } while (0) + +/** + * Insert a priority node in a priority queue. + * + * The new node is inserted immediately before the first node with the same + * priority or appended to the tail if no such node exists. + */ +#define LIST_ENQUEUE_HEAD(list, node) \ + do { \ + PriNode *ln; \ + LIST_ASSERT_NOT_CONTAINS((list),(node)); \ + FOREACH_NODE(ln, (list)) \ + if (ln->pri <= (node)->pri) \ + break; \ + INSERT_BEFORE(&(node)->link, &ln->link); \ + } while (0) + +/** + * Insert a priority node in a priority queue. + * + * The new node is inserted immediately before the first node with lower + * priority or appended to the tail if no such node exists. + */ +#define LIST_ENQUEUE(list, node) \ + do { \ + PriNode *ln; \ + LIST_ASSERT_NOT_CONTAINS((list),(node)); \ + FOREACH_NODE(ln, (list)) \ + if (ln->pri < (node)->pri) \ + break; \ + INSERT_BEFORE(&(node)->link, &ln->link); \ + } while (0) + + +/** + * Unlink a node from the head of the list \a l. + * + * \return Pointer to node, or NULL if the list was empty. + */ +INLINE Node *list_remHead(List *l) +{ + Node *n; + + ASSERT_VALID_PTR(l); + + if (LIST_EMPTY(l)) + return (Node *)0; + + n = l->head.succ; /* Get first node. */ + l->head.succ = n->succ; /* Link list head to second node. */ + n->succ->pred = &l->head; /* Link second node to list head. */ + + INVALIDATE_NODE(n); + return n; +} + +/** + * Unlink a node from the tail of the list \a l. + * + * \return Pointer to node, or NULL if the list was empty. + */ +INLINE Node *list_remTail(List *l) +{ + Node *n; + + ASSERT_VALID_PTR(l); + + if (LIST_EMPTY(l)) + return NULL; + + n = l->tail.pred; /* Get last node. */ + l->tail.pred = n->pred; /* Link list tail to second last node. */ + n->pred->succ = &l->tail; /* Link second last node to list tail. */ + + INVALIDATE_NODE(n); + return n; +} + +#endif /* STRUCT_LIST_H */ diff --git a/2.5/bertos/struct/pool.h b/2.5/bertos/struct/pool.h new file mode 100644 index 00000000..37938c26 --- /dev/null +++ b/2.5/bertos/struct/pool.h @@ -0,0 +1,74 @@ +/** + * \file + * + * + * \brief Pool macros. + * + * \version $Id$ + * \author Giovanni Bajo + */ + +#ifndef STRUCT_POOL_H +#define STRUCT_POOL_H + +#include +#include + +#define EXTERN_POOL(name) \ + extern List name + +#define DECLARE_POOL_WITH_STORAGE(name, type, num, storage) \ + static type name##_items[num]; \ + storage name; \ + INLINE void name##_init(void (*init_func)(type*)) \ + { \ + int i; \ + LIST_INIT(&name); \ + for (i=0;i + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Define application version strings + */ +#include + +/* + * "buildrev.h" is auto-generated by the build infrastructure, + * incrementing VERS_BUILD each time the project is rebuilt. + */ +#include "buildrev.h" + +const char vers_tag[] = VERS_TAG; +const char vers_build_str[] = _STRINGIZE(VERS_BUILD); +const char vers_host[] = VERS_HOST; +const int vers_build_nr = VERS_BUILD; + diff --git a/2.5/bertos/verstag.h b/2.5/bertos/verstag.h new file mode 100644 index 00000000..057a6318 --- /dev/null +++ b/2.5/bertos/verstag.h @@ -0,0 +1,106 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Declare application version strings + */ + + +#ifndef BERTOS_VERSTAG_H +#define BERTOS_VERSTAG_H + +#ifndef CFG_ARCH_CONFIG_H + #include "cfg/cfg_arch.h" +#endif + +#define APP_NAME "Appname" +#define APP_DESCRIPTION "Long application name description" +#define APP_AUTHOR "Develer" +#define APP_COPYRIGHT "Copyright 2009 Develer (http://www.develer.com/)" + + +#if ARCH & ARCH_DEFAULT + #define VERS_MAJOR 0 + #define VERS_MINOR 1 + #define VERS_REV 0 + #define VERS_LETTER "" +#elif ARCH & ARCH_NIGHTTEST + #define VERS_MAJOR 0 + #define VERS_MINOR 1 + #define VERS_REV 0 + #define VERS_LETTER "" +#else + #error unknown architecture +#endif + +/** + * If _SNAPSHOT is defined, \c VERS_TAG contains the build date + * date instead of a numeric version string. + */ +#define _SNAPSHOT + +#ifdef _DEBUG + #define VERS_DBG "D" +#else + #define VERS_DBG "" +#endif + +#define __STRINGIZE(x) #x +#define _STRINGIZE(x) __STRINGIZE(x) + +/** Build application version string (i.e.: "1.7.0") */ +#define MAKE_VERS(maj,min,rev) _STRINGIZE(maj) "." _STRINGIZE(min) "." _STRINGIZE(rev) VERS_LETTER VERS_DBG +#ifdef _SNAPSHOT + #define VERS_TAG "snapshot" " " __DATE__ " " __TIME__ " " VERS_LETTER " " VERS_DBG +#else + #define VERS_TAG MAKE_VERS(VERS_MAJOR,VERS_MINOR,VERS_REV) +#endif + +/** Build application version string suitable for MS windows resource files (i.e.: "1, 7, 0, 1") */ +#define MAKE_RCVERS(maj,min,rev,bld) _STRINGIZE(maj) ", " _STRINGIZE(min) ", " _STRINGIZE(rev) ", " _STRINGIZE(bld) +#define RCVERSION_TAG MAKE_VERS(VERS_MAJOR,VERS_MINOR,VERS_REV) + +/** The revision string (contains VERS_TAG) */ +extern const char vers_tag[]; + +/** Sequential build number (contains VERS_BUILD) */ +extern const int vers_build_nr; +//extern const char vers_build_str[]; + +/** Hostname of the machine used to build this binary (contains VERS_HOST) */ +extern const char vers_host[]; + +#endif /* BERTOS_VERSTAG_H */ diff --git a/2.5/boards/.spec b/2.5/boards/.spec new file mode 100644 index 00000000..e69de29b diff --git a/2.5/boards/arduino/.image.png b/2.5/boards/arduino/.image.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd0b87ec59dc213e44c1ffa91c925ad03a296b2 GIT binary patch literal 54482 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 LNkvXXu0mjf$JArduino Duemilanove + +

+ + + + + + + + + + + + + + + + + + + +
CPUAVR ATmega328P
Clock16MHz
Memory32kB Flash, 2kB SRAM
Peripheralstimers, ADC, UART, SPI, I²C, PWM
+

+
+ +''' diff --git a/2.5/boards/arduino/benchmark/.spec b/2.5/boards/arduino/benchmark/.spec new file mode 100644 index 00000000..18c0580d --- /dev/null +++ b/2.5/boards/arduino/benchmark/.spec @@ -0,0 +1,3 @@ +name="Benchmarks" +ord=2 +description="Projects to measure different aspects of BeRTOS performance." diff --git a/2.5/boards/arduino/benchmark/context_switch/.spec b/2.5/boards/arduino/benchmark/context_switch/.spec new file mode 100644 index 00000000..3268cbf4 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/.spec @@ -0,0 +1,15 @@ +name = 'BeRTOS Context Switch' +description=""" +

+This benchmark measures the overhead (in us) required to deliver a +signal and switch from a low-priority process to a high-priority process. +

+

+The measure is made by the high-precision timer if supported by the +architecture. Alternatively, the time can also be measured using an external +oscilloscope connected to the board's status LED. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_adc.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_afsk.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ax25.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_battfs.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_context_switch.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_dataflash.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_dc_motor.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_debug.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_fat.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_flash25.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_formatwr.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_gfx.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_hashtable.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_heap.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_i2c.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_i2s.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ini_reader.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_kbd.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_keytag.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_kfile.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_lcd_32122a.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_lcd_hd44.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_lm75.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_md2.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_menu.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_monitor.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_nmea.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_parser.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_phase.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_pocketbus.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_proc.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_proc.h new file mode 100644 index 00000000..ef228257 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 0 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_pwm.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ramp.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_randpool.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_sem.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ser.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_signal.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_spi_bitbang.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_stepper.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_tas5706a.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_thermo.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_timer.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_wdt.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_xmodem.h b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/arduino/benchmark/context_switch/context_switch.mk b/2.5/boards/arduino/benchmark/context_switch/context_switch.mk new file mode 100644 index 00000000..207a3eab --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/context_switch.mk @@ -0,0 +1,89 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the context_switch_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += context_switch + +context_switch_PREFIX = "avr-" + +context_switch_SUFFIX = "" + +context_switch_SRC_PATH = boards/arduino/benchmark/context_switch + +context_switch_HW_PATH = boards/arduino + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CSRC INSTEAD! +context_switch_WIZARD_CSRC = \ + bertos/benchmark/context_switch.c \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/struct/heap.c \ + bertos/mware/formatwr.c \ + bertos/mware/event.c \ + bertos/drv/timer.c \ + bertos/cpu/avr/drv/timer_avr.c \ + bertos/kern/proc.c \ + bertos/cpu/avr/drv/ser_avr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_PCSRC INSTEAD! +context_switch_WIZARD_PCSRC = \ + bertos/mware/formatwr.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CPPASRC INSTEAD! +context_switch_WIZARD_CPPASRC = \ + bertos/cpu/avr/hw/switch_ctx_avr.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CXXSRC INSTEAD! +context_switch_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_ASRC INSTEAD! +context_switch_WIZARD_ASRC = \ + \ + # + +context_switch_CPPFLAGS = -D'CPU_FREQ=(16000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(context_switch_HW_PATH) -I$(context_switch_SRC_PATH) $(context_switch_CPU_CPPFLAGS) $(context_switch_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_LDFLAGS = $(context_switch_CPU_LDFLAGS) $(context_switch_WIZARD_LDFLAGS) $(context_switch_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPAFLAGS = $(context_switch_CPU_CPPAFLAGS) $(context_switch_WIZARD_CPPAFLAGS) $(context_switch_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CSRC = $(context_switch_CPU_CSRC) $(context_switch_WIZARD_CSRC) $(context_switch_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_PCSRC = $(context_switch_CPU_PCSRC) $(context_switch_WIZARD_PCSRC) $(context_switch_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPASRC = $(context_switch_CPU_CPPASRC) $(context_switch_WIZARD_CPPASRC) $(context_switch_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CXXSRC = $(context_switch_CPU_CXXSRC) $(context_switch_WIZARD_CXXSRC) $(context_switch_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_ASRC = $(context_switch_CPU_ASRC) $(context_switch_WIZARD_ASRC) $(context_switch_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_MCU = atmega328p +context_switch_CPU_CPPFLAGS = -Os -Ibertos/cpu/avr/ +context_switch_PROGRAMMER_CPU = atmega328p +context_switch_STOPFLASH_SCRIPT = bertos/prg_scripts/avr/stopflash.sh +context_switch_STOPDEBUG_SCRIPT = bertos/prg_scripts/none.sh +context_switch_DEBUG_SCRIPT = bertos/prg_scripts/nodebug.sh +context_switch_FLASH_SCRIPT = bertos/prg_scripts/avr/flash.sh + +include $(context_switch_SRC_PATH)/context_switch_user.mk diff --git a/2.5/boards/arduino/benchmark/context_switch/context_switch_user.mk b/2.5/boards/arduino/benchmark/context_switch/context_switch_user.mk new file mode 100644 index 00000000..4bc28c58 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/context_switch_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +context_switch_PROGRAMMER_TYPE = none +context_switch_PROGRAMMER_PORT = none + +# Files included by the user. +context_switch_USER_CSRC = \ + $(context_switch_SRC_PATH)/main.c \ + # + +# Files included by the user. +context_switch_USER_PCSRC = \ + # + +# Files included by the user. +context_switch_USER_CPPASRC = \ + # + +# Files included by the user. +context_switch_USER_CXXSRC = \ + # + +# Files included by the user. +context_switch_USER_ASRC = \ + # + +# Flags included by the user. +context_switch_USER_LDFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPFLAGS = \ + -O2 \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/arduino/benchmark/context_switch/main.c b/2.5/boards/arduino/benchmark/context_switch/main.c new file mode 100644 index 00000000..ef29fb02 --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/main.c @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel context switch benchmark. + * + * This benchmark measures the overhead (in µs) required to deliver a + * signal and switch from a low-priority process to a high-priority process. + * + * The measure is made by the high-precision timer if supported by the + * architecture. Alternatively, the time can also be measured using an external + * oscilloscope connected to the board's status LED. + */ + +#include + +int main(void) +{ + context_switch(); + while (1) + { + } + + return 0; +} + diff --git a/2.5/boards/arduino/benchmark/context_switch/project.bertos b/2.5/boards/arduino/benchmark/context_switch/project.bertos new file mode 100644 index 00000000..b7ccc0bd --- /dev/null +++ b/2.5/boards/arduino/benchmark/context_switch/project.bertos @@ -0,0 +1,63 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V16000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vcontext_switch +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vpath +p10 +V/opt/avr-4.3.2/bin/avr-gcc +p11 +ssS'ENABLED_MODULES' +p12 +(lp13 +S'ser' +p14 +aS'kernel' +p15 +aS'formatwr' +p16 +aS'kfile' +p17 +aS'context_switch' +p18 +aS'heap' +p19 +aS'signal' +p20 +aS'timer' +p21 +asS'CPU_NAME' +p22 +VATmega328P +p23 +sS'PROJECT_HW_PATH' +p24 +S'../..' +p25 +sS'PROJECT_SRC_PATH' +p26 +S'.' +p27 +sS'PRESET' +p28 +I01 +sS'OUTPUT' +p29 +(lp30 +S'codelite' +p31 +as. \ No newline at end of file diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/.spec b/2.5/boards/arduino/benchmark/kernel_footprint/.spec new file mode 100644 index 00000000..5a527bef --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/.spec @@ -0,0 +1,14 @@ +name = 'BeRTOS Kernel footprint' +description=""" +

+This benchmark measures the memory footprint of the BeRTOS kernel with a +simple minimalist user application. +

+

+The purpose of this test is to give a measure of the required space in a +generic flash memory to store a full-featured BeRTOS kernel. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_adc.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_afsk.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ax25.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_battfs.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_context_switch.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_dataflash.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_dc_motor.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_debug.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_fat.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_flash25.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_formatwr.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_gfx.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_hashtable.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_heap.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_i2c.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_i2s.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ini_reader.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_kbd.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_keytag.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_kfile.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_lm75.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_md2.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_monitor.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_nmea.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_parser.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_phase.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_pocketbus.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_proc.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_proc.h new file mode 100644 index 00000000..ab1a4680 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_pwm.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ramp.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_randpool.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_sem.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ser.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_signal.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_stepper.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_tas5706a.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_thermo.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_timer.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_wdt.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_xmodem.h b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/kernel_footprint.mk b/2.5/boards/arduino/benchmark/kernel_footprint/kernel_footprint.mk new file mode 100644 index 00000000..884abd34 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/kernel_footprint.mk @@ -0,0 +1,88 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_footprint_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += kernel_footprint + +kernel_footprint_PREFIX = "avr-" + +kernel_footprint_SUFFIX = "" + +kernel_footprint_SRC_PATH = boards/arduino/benchmark/kernel_footprint + +kernel_footprint_HW_PATH = boards/arduino + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CSRC INSTEAD! +kernel_footprint_WIZARD_CSRC = \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/kern/sem.c \ + bertos/struct/heap.c \ + bertos/mware/formatwr.c \ + bertos/cpu/avr/drv/timer_avr.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/benchmark/kernel_footprint.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_PCSRC INSTEAD! +kernel_footprint_WIZARD_PCSRC = \ + bertos/mware/formatwr.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CPPASRC INSTEAD! +kernel_footprint_WIZARD_CPPASRC = \ + bertos/cpu/avr/hw/switch_ctx_avr.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CXXSRC INSTEAD! +kernel_footprint_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_ASRC INSTEAD! +kernel_footprint_WIZARD_ASRC = \ + \ + # + +kernel_footprint_CPPFLAGS = -D'CPU_FREQ=(16000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_footprint_HW_PATH) -I$(kernel_footprint_SRC_PATH) $(kernel_footprint_CPU_CPPFLAGS) $(kernel_footprint_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_LDFLAGS = $(kernel_footprint_CPU_LDFLAGS) $(kernel_footprint_WIZARD_LDFLAGS) $(kernel_footprint_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPAFLAGS = $(kernel_footprint_CPU_CPPAFLAGS) $(kernel_footprint_WIZARD_CPPAFLAGS) $(kernel_footprint_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CSRC = $(kernel_footprint_CPU_CSRC) $(kernel_footprint_WIZARD_CSRC) $(kernel_footprint_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_PCSRC = $(kernel_footprint_CPU_PCSRC) $(kernel_footprint_WIZARD_PCSRC) $(kernel_footprint_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPASRC = $(kernel_footprint_CPU_CPPASRC) $(kernel_footprint_WIZARD_CPPASRC) $(kernel_footprint_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CXXSRC = $(kernel_footprint_CPU_CXXSRC) $(kernel_footprint_WIZARD_CXXSRC) $(kernel_footprint_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_ASRC = $(kernel_footprint_CPU_ASRC) $(kernel_footprint_WIZARD_ASRC) $(kernel_footprint_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_MCU = atmega328p +kernel_footprint_CPU_CPPFLAGS = -Os -Ibertos/cpu/avr/ +kernel_footprint_PROGRAMMER_CPU = atmega328p +kernel_footprint_STOPFLASH_SCRIPT = bertos/prg_scripts/avr/stopflash.sh +kernel_footprint_STOPDEBUG_SCRIPT = bertos/prg_scripts/none.sh +kernel_footprint_DEBUG_SCRIPT = bertos/prg_scripts/nodebug.sh +kernel_footprint_FLASH_SCRIPT = bertos/prg_scripts/avr/flash.sh + +include $(kernel_footprint_SRC_PATH)/kernel_footprint_user.mk diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/kernel_footprint_user.mk b/2.5/boards/arduino/benchmark/kernel_footprint/kernel_footprint_user.mk new file mode 100644 index 00000000..9e2bc5f6 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/kernel_footprint_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_footprint_PROGRAMMER_TYPE = none +kernel_footprint_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_footprint_USER_CSRC = \ + $(kernel_footprint_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_footprint_USER_PCSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_ASRC = \ + # + +# Flags included by the user. +kernel_footprint_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + -Os \ + # diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/main.c b/2.5/boards/arduino/benchmark/kernel_footprint/main.c new file mode 100644 index 00000000..a3f11e50 --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/main.c @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel footprint benchmark. + * + * This benchmark measures the memory footprint[1] of the BeRTOS kernel with a + * simple minimalist user application. + * + * The purpose of this test is to give a measure of the required space in a + * generic flash memory to store a full-featured BeRTOS kernel. + * + * [1] http://en.wikipedia.org/wiki/Memory_footprint + */ + +#include + +int main(void) +{ + kernel_footprint(); + while (1) + { + } + + return 0; +} + diff --git a/2.5/boards/arduino/benchmark/kernel_footprint/project.bertos b/2.5/boards/arduino/benchmark/kernel_footprint/project.bertos new file mode 100644 index 00000000..969186fa --- /dev/null +++ b/2.5/boards/arduino/benchmark/kernel_footprint/project.bertos @@ -0,0 +1,83 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V16000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel_footprint +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Vavr +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V../configure --prefix=/usr/local/avr-4.3.2/ --target=avr --enable-languages=c,c++ --disable-nls --disable-libssp --with-dwarf2 +p15 +sVversion +p16 +V4.3.2 +p17 +sVbuild +p18 +VGCC +p19 +sVpath +p20 +V/opt/avr-4.3.2/bin/avr-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'kernel' +p24 +aS'semaphores' +p25 +aS'formatwr' +p26 +aS'kfile' +p27 +aS'msg' +p28 +aS'kernel_footprint' +p29 +aS'heap' +p30 +aS'signal' +p31 +aS'timer' +p32 +asS'CPU_NAME' +p33 +VATmega328P +p34 +sS'PROJECT_HW_PATH' +p35 +S'../..' +p36 +sS'PROJECT_SRC_PATH' +p37 +S'.' +p38 +sS'PRESET' +p39 +I01 +sS'OUTPUT' +p40 +(lp41 +s. \ No newline at end of file diff --git a/2.5/boards/arduino/examples/.spec b/2.5/boards/arduino/examples/.spec new file mode 100644 index 00000000..d244bbf6 --- /dev/null +++ b/2.5/boards/arduino/examples/.spec @@ -0,0 +1,3 @@ +name="Examples" +ord=1 +description="Full working example projects." diff --git a/2.5/boards/arduino/examples/aprs/.spec b/2.5/boards/arduino/examples/aprs/.spec new file mode 100644 index 00000000..345ff098 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/.spec @@ -0,0 +1,21 @@ +name = 'APRS Radio demo' +description=""" +

APRS

+ +

Overview

+

+The purpose of this project is to implement an APRS tracker using an Arduino +Duemilanove. +

+ +

+This device can be used to periodically send a message through a radio AFSK +channel and log the received messages to a serial port (UART). +

+ +

+For schematics and up to date information on this project, +check the Arduino APRS +page on the BeRTOS site. +

+""" diff --git a/2.5/boards/arduino/examples/aprs/aprs.mk b/2.5/boards/arduino/examples/aprs/aprs.mk new file mode 100644 index 00000000..850dd90b --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/aprs.mk @@ -0,0 +1,89 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the aprs_user.mk file instead. +# + +# Constants automatically defined by the selected modules +aprs_DEBUG = 1 + +# Our target application +TRG += aprs + +aprs_PREFIX = "avr-" + +aprs_SUFFIX = "" + +aprs_SRC_PATH = boards/arduino/examples/aprs + +aprs_HW_PATH = boards/arduino + +# Files automatically generated by the wizard. DO NOT EDIT, USE aprs_USER_CSRC INSTEAD! +aprs_WIZARD_CSRC = \ + aprs/hw/hw_afsk.c \ + bertos/kern/kfile.c \ + bertos/cpu/avr/drv/timer_avr.c \ + bertos/net/afsk.c \ + bertos/net/ax25.c \ + bertos/mware/formatwr.c \ + bertos/algo/crc_ccitt.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/cpu/avr/drv/ser_avr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE aprs_USER_PCSRC INSTEAD! +aprs_WIZARD_PCSRC = \ + bertos/mware/formatwr.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE aprs_USER_CPPASRC INSTEAD! +aprs_WIZARD_CPPASRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE aprs_USER_CXXSRC INSTEAD! +aprs_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE aprs_USER_ASRC INSTEAD! +aprs_WIZARD_ASRC = \ + \ + # + +aprs_CPPFLAGS = -D'CPU_FREQ=(16000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(aprs_HW_PATH) -I$(aprs_SRC_PATH) $(aprs_CPU_CPPFLAGS) $(aprs_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +aprs_LDFLAGS = $(aprs_CPU_LDFLAGS) $(aprs_WIZARD_LDFLAGS) $(aprs_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +aprs_CPPAFLAGS = $(aprs_CPU_CPPAFLAGS) $(aprs_WIZARD_CPPAFLAGS) $(aprs_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +aprs_CSRC = $(aprs_CPU_CSRC) $(aprs_WIZARD_CSRC) $(aprs_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +aprs_PCSRC = $(aprs_CPU_PCSRC) $(aprs_WIZARD_PCSRC) $(aprs_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +aprs_CPPASRC = $(aprs_CPU_CPPASRC) $(aprs_WIZARD_CPPASRC) $(aprs_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +aprs_CXXSRC = $(aprs_CPU_CXXSRC) $(aprs_WIZARD_CXXSRC) $(aprs_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +aprs_ASRC = $(aprs_CPU_ASRC) $(aprs_WIZARD_ASRC) $(aprs_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +aprs_DEBUG_SCRIPT = bertos/prg_scripts/nodebug.sh +aprs_PROGRAMMER_CPU = atmega328p +aprs_STOPDEBUG_SCRIPT = bertos/prg_scripts/none.sh +aprs_MCU = atmega328p +aprs_FLASH_SCRIPT = bertos/prg_scripts/avr/flash.sh +aprs_STOPFLASH_SCRIPT = bertos/prg_scripts/avr/stopflash.sh +aprs_CPU_CPPFLAGS = -Os -Ibertos/cpu/avr/ + +include $(aprs_SRC_PATH)/aprs_user.mk diff --git a/2.5/boards/arduino/examples/aprs/aprs_user.mk b/2.5/boards/arduino/examples/aprs/aprs_user.mk new file mode 100644 index 00000000..5fb75d29 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/aprs_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +aprs_PROGRAMMER_TYPE = none +aprs_PROGRAMMER_PORT = none + +# Files included by the user. +aprs_USER_CSRC = \ + $(aprs_SRC_PATH)/main.c \ + $(aprs_SRC_PATH)/hw/hw_afsk.c \ + # + +# Files included by the user. +aprs_USER_PCSRC = \ + # + +# Files included by the user. +aprs_USER_CPPASRC = \ + # + +# Files included by the user. +aprs_USER_CXXSRC = \ + # + +# Files included by the user. +aprs_USER_ASRC = \ + # + +# Flags included by the user. +aprs_USER_LDFLAGS = \ + # + +# Flags included by the user. +aprs_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +aprs_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_adc.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_afsk.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_afsk.h new file mode 100644 index 00000000..c2ca2e32 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_afsk.h @@ -0,0 +1,114 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 64 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 64 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_ax25.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_battfs.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_context_switch.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_dataflash.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_dc_motor.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_debug.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_fat.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_flash25.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_formatwr.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_gfx.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_hashtable.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_hashtable.h new file mode 100644 index 00000000..7560617d --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_hashtable.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of + * the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_heap.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_i2c.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_i2c.h new file mode 100644 index 00000000..af36e6b6 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_i2c.h @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_i2s.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_ini_reader.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_kbd.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_keytag.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_kfile.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_lcd_32122a.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_lcd_hd44.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_lm75.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_md2.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_menu.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_monitor.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_nmea.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_parser.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_phase.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_pocketbus.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_proc.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_proc.h new file mode 100644 index 00000000..3c9439fb --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 0 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 0 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 0 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_pwm.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_ramp.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_randpool.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_sem.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_ser.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_signal.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_signal.h new file mode 100644 index 00000000..e78a4519 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 0 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_spi_bitbang.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_stepper.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_tas5706a.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_thermo.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_timer.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_wdt.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/arduino/examples/aprs/cfg/cfg_xmodem.h b/2.5/boards/arduino/examples/aprs/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/arduino/examples/aprs/main.c b/2.5/boards/arduino/examples/aprs/main.c new file mode 100644 index 00000000..a834597c --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/main.c @@ -0,0 +1,130 @@ +/** + * \file + * + * + * \author Francesco Sacchi + * \author Luca Ottaviano + * \author Daniele Basile + * + * \brief Arduino APRS radio demo. + * + * This example shows how to read and decode APRS radio packets. + * It uses the following modules: + * afsk + * ax25 + * ser + * + * You will see how to use a serial port to output messages, init the afsk demodulator and + * how to parse input messages using ax25 module. + */ + +#include +#include + +#include +#include + +#include +#include + +#include +#include + +static Afsk afsk; +static AX25Ctx ax25; +static Serial ser; + +#define ADC_CH 0 + +/* + * Print on console the message that we have received. + */ +static void message_callback(struct AX25Msg *msg) +{ + kfile_printf(&ser.fd, "\n\nSRC[%.6s-%d], DST[%.6s-%d]\r\n", msg->src.call, msg->src.ssid, msg->dst.call, msg->dst.ssid); + + for (int i = 0; i < msg->rpt_cnt; i++) + kfile_printf(&ser.fd, "via: [%.6s-%d]\r\n", msg->rpt_lst[i].call, msg->rpt_lst[i].ssid); + + kfile_printf(&ser.fd, "DATA: %.*s\r\n", msg->len, msg->info); +} + +static void init(void) +{ + IRQ_ENABLE; + kdbg_init(); + timer_init(); + + /* + * Init afsk demodulator. We need to implement the macros defined in hw_afsk.h, which + * is the hardware abstraction layer. + * We do not need transmission for now, so we set transmission DAC channel to 0. + */ + afsk_init(&afsk, ADC_CH, 0); + /* + * Here we initialize AX25 context, the channel (KFile) we are going to read messages + * from and the callback that will be called on incoming messages. + */ + ax25_init(&ax25, &afsk.fd, message_callback); + + /* Initialize serial port, we are going to use it to show APRS messages*/ + ser_init(&ser, SER_UART0); + ser_setbaudrate(&ser, 115200L); +} + +static AX25Call path[] = AX25_PATH(AX25_CALL("apzbrt", 0), AX25_CALL("nocall", 0), AX25_CALL("wide1", 1), AX25_CALL("wide2", 2)); + +#define APRS_MSG ">Test BeRTOS APRS http://www.bertos.org" + +int main(void) +{ + init(); + ticks_t start = timer_clock(); + + while (1) + { + /* + * This function will look for new messages from the AFSK channel. + * It will call the message_callback() function when a new message is received. + * If there's nothing to do, this function will call cpu_relax() + */ + ax25_poll(&ax25); + + + /* Send out message every 15sec */ + if (timer_clock() - start > ms_to_ticks(15000L)) + { + start = timer_clock(); + ax25_sendVia(&ax25, path, countof(path), APRS_MSG, sizeof(APRS_MSG)); + } + } + return 0; +} diff --git a/2.5/boards/arduino/examples/aprs/project.bertos b/2.5/boards/arduino/examples/aprs/project.bertos new file mode 100644 index 00000000..da73894b --- /dev/null +++ b/2.5/boards/arduino/examples/aprs/project.bertos @@ -0,0 +1,83 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V16000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vaprs +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Vavr +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V../configure --prefix=/usr/local/avr-4.1.2 --target=avr --enable-languages=c --disable-nls --disable-libssp --with-dwarf2 +p15 +sVversion +p16 +V4.1.2 +p17 +sVbuild +p18 +VDeveler s.r.l. 20070824 +p19 +sVpath +p20 +V/localhome/toolchain/avr/bin/avr-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'ax25' +p25 +aS'formatwr' +p26 +aS'kfile' +p27 +aS'afsk' +p28 +aS'crc-ccitt' +p29 +aS'timer' +p30 +aS'debug' +p31 +asS'CPU_NAME' +p32 +VATmega328P +p33 +sS'PROJECT_HW_PATH' +p34 +S'../..' +p35 +sS'PROJECT_SRC_PATH' +p36 +S'.' +p37 +sS'PRESET' +p38 +I01 +sS'OUTPUT' +p39 +(lp40 +S'codelite' +p41 +as. \ No newline at end of file diff --git a/2.5/boards/arduino/hw/hw_afsk.c b/2.5/boards/arduino/hw/hw_afsk.c new file mode 100644 index 00000000..892b2a37 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_afsk.c @@ -0,0 +1,97 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * + * \author Francesco Sacchi + */ + + +#include "hw_afsk.h" + +#include +#include + +#include +#include + + +/* + * Here we are using only one modem. If you need to receive + * from multiple modems, you need to define an array of contexts. + */ +static Afsk *ctx; + +void hw_afsk_adcInit(int ch, Afsk *_ctx) +{ + ctx = _ctx; + ASSERT(ch <= 5); + + AFSK_STROBE_INIT(); + AFSK_STROBE_OFF(); + /* Set prescaler to clk/8 (2 MHz), CTC, top = ICR1 */ + TCCR1A = 0; + TCCR1B = BV(CS11) | BV(WGM13) | BV(WGM12); + /* Set max value to obtain a 9600Hz freq */ + ICR1 = ((CPU_FREQ / 8) / 9600) - 1; + + /* Set reference to AVCC (5V), select CH */ + ADMUX = BV(REFS0) | ch; + + DDRC &= ~BV(ch); + PORTC &= ~BV(ch); + DIDR0 |= BV(ch); + + /* Set autotrigger on Timer1 Input capture flag */ + ADCSRB = BV(ADTS2) | BV(ADTS1) | BV(ADTS0); + /* Enable ADC, autotrigger, 1MHz, IRQ enabled */ + /* We are using the ADC a bit out of specifications otherwise it's not fast enough for our + * purposes */ + ADCSRA = BV(ADEN) | BV(ADSC) | BV(ADATE) | BV(ADIE) | BV(ADPS2); +} + + +bool hw_afsk_dac_isr; + +/* + * This is how you declare an ISR. + */ +DECLARE_ISR(ADC_vect) +{ + TIFR1 = BV(ICF1); + afsk_adc_isr(ctx, ((int16_t)((ADC) >> 2) - 128)); + if (hw_afsk_dac_isr) + PORTD = afsk_dac_isr(ctx) & 0xF0; + else + PORTD = 128; +} diff --git a/2.5/boards/arduino/hw/hw_afsk.h b/2.5/boards/arduino/hw/hw_afsk.h new file mode 100644 index 00000000..a2e075a4 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_afsk.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_AFSK_H +#define HW_AFSK_H + +#include "cfg/cfg_arch.h" + +#include + +struct Afsk; +void hw_afsk_adcInit(int ch, struct Afsk *_ctx); +void hw_afsk_dacInit(int ch, struct Afsk *_ctx); + +/** + * Initialize the specified channel of the ADC for AFSK needs. + * The adc should be configured to have a continuos stream of convertions. + * For every convertion there must be an ISR that read the sample + * and call afsk_adc_isr(), passing the context and the sample. + * + * \param ch channel to be used for AFSK demodulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_adc_isr() for every convertion. + */ + +/* + * This macro will be called for AFSK initialization. We could implement everything here as a macro, + * but since initialization is rather complicated we decided to split its own function. Such function + * is defined in hw_afsk.c. + * Remember: since this .c file is not created by the wizard, you must add it to your_project_name.mk. + * If you create the file using BeRTOS SDK, it will be added for you. + */ +#define AFSK_ADC_INIT(ch, ctx) hw_afsk_adcInit(ch, ctx) + +/* + * Activate strobe pin. We use it for debugging purposes. If you don't use it, simply + * leave empty the following macros + */ +#define AFSK_STROBE_INIT() do { DDRB |= BV(5); } while (0) + +/* + * Set the pin high. This macro is called at the beginning of the interrupt routine + */ +#define AFSK_STROBE_ON() do { PORTB |= BV(5); } while (0) + +/* + * Set the pin low. This macro is called at the end of the interrupt routine + */ +#define AFSK_STROBE_OFF() do { PORTB &= ~BV(5); } while (0) + +/** + * Initialize the specified channel of the DAC for AFSK needs. + * The DAC has to be configured in order to call an ISR for every sample sent. + * The DAC doesn't have to start the IRQ immediatly but have to wait + * the AFSK driver to call AFSK_DAC_IRQ_START(). + * The ISR must then call afsk_dac_isr() passing the AFSK context. + * \param ch DAC channel to be used for AFSK modulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_dac_isr() for every convertion. + */ +#define AFSK_DAC_INIT(ch, ctx) do { (void)ch, (void)ctx; DDRD |= 0xF0; DDRB |= BV(3); } while (0) + +/** + * Start DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_START(ch) do { (void)ch; extern bool hw_afsk_dac_isr; PORTB |= BV(3); hw_afsk_dac_isr = true; } while (0) + +/** + * Stop DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_STOP(ch) do { (void)ch; extern bool hw_afsk_dac_isr; PORTB &= ~BV(3); hw_afsk_dac_isr = false; } while (0) + +#endif /* HW_AFSK_H */ diff --git a/2.5/boards/arduino/hw/hw_buzzer.h b/2.5/boards/arduino/hw/hw_buzzer.h new file mode 100644 index 00000000..858ecbfb --- /dev/null +++ b/2.5/boards/arduino/hw/hw_buzzer.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Buzzer hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_BUZZER_H +#define HW_BUZZER_H + +#warning TODO:This is an example implementation, you must implement it! + +#define BUZZER_BIT 1 +#define IS_BUZZER_ON 0 +#define BUZZER_HW_INIT do { /* Implement me! */ } while (0) +#define BUZZER_ON do { /* Implement me! */ } while (0) +#define BUZZER_OFF do { /* Implement me! */ } while (0) + +#endif /* HW_BUZZER_H */ diff --git a/2.5/boards/arduino/hw/hw_dataflash.c b/2.5/boards/arduino/hw/hw_dataflash.c new file mode 100644 index 00000000..844dd922 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_dataflash.c @@ -0,0 +1,126 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_dataflash.h" + +#include +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +MOD_DEFINE(hw_dataflash); + +/** + * Data flash init function. + * + * This function provide to initialize all that + * needs to drive a dataflash memory. + * Generaly needs to init pins to drive a CS line + * and reset line. + */ +void dataflash_hw_init(void) +{ + + //Disable CS line (remove if not needed) + dataflash_hw_setCS(false); + + /* + * Put here your code! + * + * Note: + * - if you drive manualy CS line, here init a CS pin + * - if you use a dedicated reset line, here init a reset pin + */ + + MOD_INIT(hw_dataflash); +} + +/** + * Chip Select drive. + * + * This function enable or disable a CS line. + * You must implement this function comply to a dataflash + * memory datasheet to allow the drive to enable a memory + * when \p enable flag is true, and disable it when is false. + */ +void dataflash_hw_setCS(bool enable) +{ + if (enable) + { + /* + * Put here your code to enable + * dataflash memory + */ + } + else + { + /* + * Put here your code to disable + * dataflash memory + */ + } +} + +/** + * Reset data flash memory. + * + * This function provide to send reset signal to + * dataflash memory. You must impement it comly to a dataflash + * memory datasheet to allow the drive to set a reset pin + * when \p enable flag is true, and disable it when is false. + * + */ +void dataflash_hw_setReset(bool enable) +{ + if (enable) + { + /* + * Put here your code to set reset of + * dataflash memory + */ + } + else + { + /* + * Put here your code to clear reset of + * dataflash memory + */ + } +} + diff --git a/2.5/boards/arduino/hw/hw_dataflash.h b/2.5/boards/arduino/hw/hw_dataflash.h new file mode 100644 index 00000000..5254446b --- /dev/null +++ b/2.5/boards/arduino/hw/hw_dataflash.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines (interface). + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_DATAFLASH_H +#define HW_DATAFLASH_H + +#include + +void dataflash_hw_init(void); +void dataflash_hw_setCS(bool enable); +void dataflash_hw_setReset(bool enable); + +#endif /* HW_DATAFLASH_H */ diff --git a/2.5/boards/arduino/hw/hw_dc_motor.h b/2.5/boards/arduino/hw/hw_dc_motor.h new file mode 100644 index 00000000..8b8dd4b4 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_dc_motor.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief DC motor hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_DC_MOTOR_H +#define HW_DC_MOTOR_H + +typedef enum MotorDCMap +{ + + /* Put here motor dc declaration */ + MOTOR_DC_CNT + +} MotorDCMap; + +/* + * Init all pin and device to manage dc motor. + */ +#define MOTOR_DC_INIT() \ + do { \ + /* Implement me! */ \ + } while (0) + + +/* + * Enable DC motor. + */ +#define DC_MOTOR_ENABLE(dev) \ + do { \ + /* Implement me! */ \ + } while (0) + +/* + * Disable DC motor. + */ +#define DC_MOTOR_DISABLE(dev) \ + do { \ + /* Implement me! */ \ + } while (0) + +/* + * Set direction for DC motor. + */ +#define DC_MOTOR_SET_DIR(dev, dir) \ + do { \ + /* Implement me! */ \ + } while (0) + + +#endif /* HW_DC_MOTOR_H */ diff --git a/2.5/boards/arduino/hw/hw_ft245rl.h b/2.5/boards/arduino/hw/hw_ft245rl.h new file mode 100644 index 00000000..cc0c8193 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_ft245rl.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief FT245RL USB interface hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_FT245RL_H +#define HW_FT245RL_H + +#warning TODO:This is an example implementation, you must implement it! + +#define FT245RL_DATA_IN() /* Implement me! */ +#define FT245RL_DATA_OUT() /* Implement me! */ +#define WR_HI /* Implement me! */ +#define WR_LO /* Implement me! */ + +#define RD_HI /* Implement me! */ +#define RD_LO /* Implement me! */ + +#define FT245RL_INIT() \ +do \ +{ \ + /* Implement me! */ \ +} while(0) + +#define FT245RL_DATA_RDY() (/* Implement me! */ false) +#define FT245RL_GETDATA() ({/* Implement me! */ (0);}) +#define FT245RL_TX_ALLOWED() (/* Implement me! */ false) +#define FT245RL_SETDATA(data) do {/* Implement me! */ (void)((data)); } while(0) + +#endif /* HW_FT245RL_H */ + diff --git a/2.5/boards/arduino/hw/hw_i2c_bitbang.h b/2.5/boards/arduino/hw/hw_i2c_bitbang.h new file mode 100644 index 00000000..4822af7c --- /dev/null +++ b/2.5/boards/arduino/hw/hw_i2c_bitbang.h @@ -0,0 +1,66 @@ +/** + * \file + * + * + * \brief Macro for I2C bitbang operation. + * + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_I2C_BITBANG_H +#define HW_I2C_BITBANG_H + +#warning TODO:This is an example implementation, you must implement it! + +#define SDA_HI do { /* Implement me:Set SDA High by setting SDA pin as input */ } while (0) +#define SDA_LO do { /* Implement me:Set SDA Low by setting SDA pin as open collector output */ } while (0) +#define SCL_HI do { /* Implement me:Set SCL High by setting SCL pin as input */ } while (0) +#define SCL_LO do { /* Implement me:Set SCL Low by setting SCL pin as open collector output */ } while (0) + + +#define SCL_IN (true) /* Implement me: read SDA pin state */ +#define SDA_IN (true) /* Implement me: read SCL pin state */ + +/** + * This macro should set SDA and SCL lines as input. + */ +#define I2C_BITBANG_HW_INIT do { /* Implement me! */ } while (0) + +/** + * Half bit delay routine used to generate the correct timings. + */ +#define I2C_HALFBIT_DELAY() do { /* Implement me! */ } while (0) + +#endif /* HW_I2C_BITBANG_H */ diff --git a/2.5/boards/arduino/hw/hw_kbd.h b/2.5/boards/arduino/hw/hw_kbd.h new file mode 100644 index 00000000..9ca228cb --- /dev/null +++ b/2.5/boards/arduino/hw/hw_kbd.h @@ -0,0 +1,72 @@ +/** + * \file + * + * + * \brief Keyboard hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_H +#define HW_KBD_H + +#include "hw/kbd_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define K_RPT_MASK (K_UP | K_DOWN | K_OK | K_CANCEL) + +#define KBD_HW_INIT \ + do { \ + /* Put here code to init hw */ \ + } while (0) + +EXTERN_C int emul_kbdReadCols(void); + +/** + * Read the keyboard ports and return the mask of + * depressed keys. + */ +INLINE keymask_t kbd_readkeys(void) +{ + /* Implement me! */ + + //Only for test remove when implement this function + return 0; +} + +#endif /* HW_KBD_H */ diff --git a/2.5/boards/arduino/hw/hw_lcd_32122a.h b/2.5/boards/arduino/hw/hw_lcd_32122a.h new file mode 100644 index 00000000..6ec29c5c --- /dev/null +++ b/2.5/boards/arduino/hw/hw_lcd_32122a.h @@ -0,0 +1,155 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_32122A_H +#define HW_LCD_32122A_H + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Predefined LCD PWM contrast values + */ +#define LCD_DEF_PWM 145 +#define LCD_MAX_PWM 505 +#define LCD_MIN_PWM 130 +#define LCD_PWM_CH 0 + + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_PE_E1 /* Implement me! */ +#define LCD_PE_E2 /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +#define LCD_PF_DB0 /* Implment me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_A0 do { /* Implement me! */ } while (0) +#define LCD_SET_A0 do { /* Implement me! */ } while (0) +#define LCD_CLR_RD do { /* Implement me! */ } while (0) +#define LCD_SET_RD do { /* Implement me! */ } while (0) +#define LCD_CLR_E1 do { /* Implement me! */ } while (0) +#define LCD_SET_E1 do { /* Implement me! */ } while (0) +#define LCD_CLR_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E(x) do { (void)x; /* Implement me! */ } while (0) +#define LCD_CLR_E(x) do { (void)x; /* Implement me! */ } while (0) +/*@}*/ + +/** + * \name Chip select bits for LCD_SET_E() + * @{ + */ +#define LCDF_E1 ( 0/* Implement me! */) +#define LCDF_E2 ( 0/* Implement me! */) +/*@}*/ +/** Read from the LCD data bus (DB[0-7]) */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/** Write to the LCD data bus (DB[0-7]) */ +#define LCD_READ (0 /* Implement me! */ ) + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ + +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + +#define LCD_32122_RESET() do { /* Implement me! */ } while (0) + +INLINE void lcd_32122a_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_32122A_H */ + diff --git a/2.5/boards/arduino/hw/hw_lcd_hd44.h b/2.5/boards/arduino/hw/hw_lcd_hd44.h new file mode 100644 index 00000000..dfebbcab --- /dev/null +++ b/2.5/boards/arduino/hw/hw_lcd_hd44.h @@ -0,0 +1,157 @@ +/** + * \file + * + * + * \brief LCD low-level hardware macros + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_HD44_H +#define HW_LCD_HD44_H + +#include "cfg/cfg_lcd_hd44.h" /* CONFIG_LCD_4BIT */ + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_E /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +/*@}*/ + +/** + * \name DB high nibble (DB[4-7]) + * @{ + */ + +#if CONFIG_LCD_4BIT + #define LCD_MASK (LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4) + #define LCD_SHIFT 4 +#else + #define LCD_MASK (uint8_t)0xff + #define LCD_SHIFT 0 +#endif +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_RS /* Implement me! */ +#define LCD_SET_RS /* Implement me! */ +#define LCD_CLR_RD /* Implement me! */ +#define LCD_SET_RD /* Implement me! */ +#define LCD_CLR_E /* Implement me! */ +#define LCD_SET_E /* Implement me! */ + +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +#if CONFIG_LCD_4BIT + #define LCD_WRITE_H(x) ((void)x)/* Implement me! */ + #define LCD_WRITE_L(x) ((void)x)/* Implement me! */ + #define LCD_READ_H ( 0 /* Implement me! */ ) + #define LCD_READ_L ( 0 /* Implement me! */ ) +#else + #define LCD_WRITE(x) ((void)x)/* Implement me! */ + #define LCD_READ (0 /* Implement me! */ ) +#endif +/*@}*/ + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + + +INLINE void lcd_hd44_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_HD44_H */ diff --git a/2.5/boards/arduino/hw/hw_led.h b/2.5/boards/arduino/hw/hw_led.h new file mode 100644 index 00000000..2bd46ee5 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_led.h @@ -0,0 +1,47 @@ +/** + * \file + * + * + * \brief Led on/off macros. + * + * \author Daniele Basile + */ + +#ifndef HW_LED_H +#define HW_LED_H + +#include + +#define LED_ON() PORTB |= BV(5) +#define LED_OFF() PORTB &= ~BV(5) +#define LED_INIT() DDRB |= BV(5) + +#endif /* HW_LED_H */ diff --git a/2.5/boards/arduino/hw/hw_lm75.h b/2.5/boards/arduino/hw/hw_lm75.h new file mode 100644 index 00000000..290dae09 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_lm75.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_LM75_H +#define HW_LM75_H + +#warning TODO:This is an example implentation, you must implement it! + +#define LM75_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_LM75_H */ + diff --git a/2.5/boards/arduino/hw/hw_mcp41.c b/2.5/boards/arduino/hw/hw_mcp41.c new file mode 100644 index 00000000..dc2a051c --- /dev/null +++ b/2.5/boards/arduino/hw/hw_mcp41.c @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_mcp41.h" + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +const uint16_t mcp41_ports[MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; +const uint8_t mcp41_pins [MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; + diff --git a/2.5/boards/arduino/hw/hw_mcp41.h b/2.5/boards/arduino/hw/hw_mcp41.h new file mode 100644 index 00000000..645b6dac --- /dev/null +++ b/2.5/boards/arduino/hw/hw_mcp41.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_MCP41_H +#define HW_MCP41_H + +#include "hw/mcp41_map.h" + +#include + + +#warning TODO:This is an example implementation, you must implement it! + + +INLINE void SET_MCP41_DDR(Mcp41Dev dev) +{ + /* Implement me! */ + //Warning: this funtions is like avr target name, + //fix it to comply for all target. + + //Only for test remove when implement this function + (void)dev; +} + +INLINE void MCP41_ON(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void MCP41_OFF(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +#endif /* HW_MCP41_H */ diff --git a/2.5/boards/arduino/hw/hw_ntc.c b/2.5/boards/arduino/hw/hw_ntc.c new file mode 100644 index 00000000..3048725c --- /dev/null +++ b/2.5/boards/arduino/hw/hw_ntc.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id$ + * \author Lorenzo Berni + * + */ + +#include +#include "hw/ntc_map.h" + +const res_t NTC_RSER[NTC_CNT]; +const res_t NTC_RPAR[NTC_CNT]; +const amp_t NTC_AMP[NTC_CNT]; +const NtcHwInfo* NTC_INFO[NTC_CNT]; diff --git a/2.5/boards/arduino/hw/hw_ntc.h b/2.5/boards/arduino/hw/hw_ntc.h new file mode 100644 index 00000000..49152a45 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_ntc.h @@ -0,0 +1,136 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id$ + * \author Francesco Sacchi + * + * A NTC acts as a variable resistor, whose resistance changes as a + * function of the temperature it measures. To sample it correctly, it is + * usually parallelized and serialized with two fixed resistor. The following diagram shows + * what is the exact disposition of the components, as handled by this + * library: + * + *
+ *                 o Vref
+ *                 |
+ *                 |                               o Vref
+ *                 |                               |
+ *               -----                             |
+ *              |     |                        ---------
+ *              | Rser|                       |         |
+ *              |     |                       |         |
+ *               -----     -----              |   ADC   |
+ *                 | Vp   |     |             |         |
+ *      -----------|------| Amp |-------------|         |
+ *     |           |      |     |      Vadc   |         |
+ *   -----       -----     -----               ---------
+ *  |     |     |     |
+ *  | NTC |     | Rpar|
+ *  |     |     |     |
+ *   -----       -----
+ *     |           |
+ *     |           |
+ *   -----       -----
+ *    ---         ---
+ *
+ * Amp is an amplifier that amplify of AMP times the signal. + * If we indicate Rp as the parallel of NTC with Rpar, ADCBITS as the bits of the ad converter + * and ADCVAL as the result from the adc convertion (Not Vadc but just the value read + * from the adc register), after various calculation, the expression of Rp is: + * + *
+ *
+ *            ADCVAL * Rser
+ * Rp = ------------------------
+ *         ADCBITS
+ *	2         * AMP - ADCVAL
+ *
+ * + * And after that NTC obvisiously is: + *
+ *        Rpar * Rp
+ * NTC = ----------
+ *        Rpar - Rp
+ *
+ * + * + * The function ntc_hw_read() compute the resistence using these formulas above. + */ + +#ifndef HW_NTC_H +#define HW_NTC_H + +#include "ntc_map.h" + +#include + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +extern const res_t NTC_RSER[NTC_CNT]; +extern const res_t NTC_RPAR[NTC_CNT]; +extern const amp_t NTC_AMP[NTC_CNT]; +extern const NtcHwInfo* NTC_INFO[NTC_CNT]; + + +/*! + * Read the resistence of ntc device \a dev. + * Return the result in res_t type. + */ +INLINE res_t ntc_hw_read(NtcDev dev) +{ + ASSERT(dev < NTC_CNT); + // See above for formula explanation. + adcread_t adcval = adc_read((uint16_t)dev); + float rp = (adcval * NTC_RSER[dev] ) / ((1 << adc_bits()) * NTC_AMP[dev] - adcval); + + //kprintf("Rp[%f], Rntc[%f]\n", rp/100, ((NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp)) / 100.0); + + return ( (NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp) ); +} + + +/*! + * Return the info (aka the table) associated with ntc device \a dev. + */ +INLINE const NtcHwInfo* ntc_hw_getInfo(NtcDev dev) +{ + return NTC_INFO[dev]; +} + +#define NTC_HW_INIT do { /* Implement me! */ } while(0) + +#endif /* HW_NTC_H */ diff --git a/2.5/boards/arduino/hw/hw_phase.c b/2.5/boards/arduino/hw/hw_phase.c new file mode 100644 index 00000000..54509ef3 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_phase.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/hw_phase.h" + +#warning TODO:This is an example implementation, you must implement it! + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/arduino/hw/hw_phase.h b/2.5/boards/arduino/hw/hw_phase.h new file mode 100644 index 00000000..7649e702 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_phase.h @@ -0,0 +1,80 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/phase_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define PHASE_HW_INIT do { /* Implement me! */ }while (0) + +INLINE void TRIAC_OFF(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + + +INLINE void TRIAC_ON(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void SET_TRIAC_DDR(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +void zerocross_isr(void); +#define DEFINE_ZEROCROSS_ISR() void zerocross_isr(void) + + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/arduino/hw/hw_rit128x96.h b/2.5/boards/arduino/hw/hw_rit128x96.h new file mode 100644 index 00000000..c24d1a87 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_rit128x96.h @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \brief LM3S1986: OLED-RIT-128x96 (P14201) low-level hardware macros + * + * \author Andrea Righi + */ + +#ifndef HW_RIT128x96_H +#define HW_RIT128x96_H + +#include "cfg/macros.h" /* BV() */ +#include "cfg/debug.h" + +#include +#include +#include + +/** + * \name LCD I/O pins/ports + * @{ + */ +/* OLED Data/Command control pin */ +#define GPIO_OLEDDC_PIN 0 /* Implement me! */ + +/* OLED enable pin */ +#define GPIO_OLEDEN_PIN 0 /* Implement me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +/* Send data to the display */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/*@}*/ + +INLINE void lcd_rit128x96_hw_bus_init(void) +{ + /* Implement me! */ +} + +#endif /* HW_RIT128x96_H */ diff --git a/2.5/boards/arduino/hw/hw_sd.h b/2.5/boards/arduino/hw/hw_sd.h new file mode 100644 index 00000000..d15b5506 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_sd.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief SD driver hardware-specific definitions. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef HW_SD_H +#define HW_SD_H + +#warning FIXME: This is an example implementation, you must implement it + +#define SD_CS_INIT() do { /* implement me */} while(0) +#define SD_CS_ON() do { /* implement me */} while(0) +#define SD_CS_OFF() do { /* implement me */} while(0) + +#define SD_PIN_INIT() do { /* implement me */} while(0) +#define SD_CARD_PRESENT() true /* implement me */ +#define SD_WRITE_PROTECT() false /* implement me */ + +#endif /* HW_SD_H */ diff --git a/2.5/boards/arduino/hw/hw_ser.h b/2.5/boards/arduino/hw/hw_ser.h new file mode 100644 index 00000000..2489c433 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_ser.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Serial hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_SER_H +#define HW_SER_H + +#include "cfg/cfg_ser.h" + +#if CONFIG_SER_STROBE + #warning FIXME: this is an example implementation, you must implement it + + #define SER_STROBE_INIT do { /* implement me */ } while (0) + #define SER_STROBE_ON do { /* implement me */ } while (0) + #define SER_STROBE_OFF do { /* implement me */ } while (0) +#endif + +#endif /* HW_SER_H */ diff --git a/2.5/boards/arduino/hw/hw_sipo.h b/2.5/boards/arduino/hw/hw_sipo.h new file mode 100644 index 00000000..3371c2c0 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_sipo.h @@ -0,0 +1,109 @@ +/** + * \file + * + * + * \brief Macro for HW_SIPO_H + * + * + * \version $Id$ + * + * \author Andrea Grandi + * \author Daniele Basile + */ + +#ifndef HW_SIPO_H +#define HW_SIPO_H + +/** + * Map sipo connection on board. + */ +typedef enum SipoMap +{ + SIPO_CNT +} SipoMap; + +/** + * Define generic macro to set pins logic level + */ +#define SIPO_SET_LEVEL_LOW(dev) do { /* Implement me! */ } while (0) +#define SIPO_SET_LEVEL_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Generate one low pulse on select line. + */ +#define PULSE_LOW(dev) do { /* Implement me! */ } while (0) + +/** + * Generate one hight pulse on select line. + */ +#define PULSE_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Define the procedure to drive serial input in sipo device (SI). + */ +#define SIPO_SI_HIGH() do { /* Implement me! */ } while (0) +#define SIPO_SI_LOW() do { /* Implement me! */ } while (0) + +/** + * Drive clock to shift SI data into latch. + */ +#define SIPO_SI_CLOCK(clk_pol) \ + do { \ + (void)clk_pol; \ + /* Implement me! */ \ + } while (0) + +/** + * Do everything needed in order to load dato into sipo. + */ +#define SIPO_LOAD(device, load_pol) do { /* Implement me! */ } while (0) + +/** + * Enable the shift register output. + */ +#define SIPO_ENABLE() do { /* Implement me! */ } while (0) + +/** + * Set polarity for Load, Clk, SI signals. + */ +#define SIPO_SET_LD_LEVEL(device, load_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_CLK_LEVEL(clock_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_SI_LEVEL() do { /* Implement me! */ } while (0) + +/** + * Do anything that needed to init sipo pins. + */ +#define SIPO_INIT_PIN() do { /* Implement me! */ } while (0) + +#endif /* HW_SIPO_H */ diff --git a/2.5/boards/arduino/hw/hw_spi.h b/2.5/boards/arduino/hw/hw_spi.h new file mode 100644 index 00000000..04e4893a --- /dev/null +++ b/2.5/boards/arduino/hw/hw_spi.h @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef HW_SPI_H +#define HW_SPI_H + +#warning TODO:This is an example implentation, you must implement it! + +#include + +/** + * SPI pin definition. + * + * \note CS is assert when level + * is low. + * + * \{ + */ +#define CS /* pin */ ///Connect to CS pin of Flash memory. +#define SCK /* pin */ ///Connect to SCK pin of Flash memory. +#define MOSI /* pin */ ///Connect to SI pin of Flash memory. +#define MISO /* pin */ ///Connect to SO pin of Flash memory. +#define SPI_PORT /* pin */ ///Micro pin PORT register. +#define SPI_PIN /* pin */ ///Micro pin PIN register. +#define SPI_DDR /* pin */ ///Micro pin DDR register. +/*\}*/ + +/** + * Pin logic level. + * + * \{ + */ +#define MOSI_LOW() do { /* Implement me! */ } while(0) +#define MOSI_HIGH() do { /* Implement me! */ } while(0) +#define MISO_HIGH() do { /* Implement me! */ } while(0) +#define SCK_LOW() do { /* Implement me! */ } while(0) +#define SCK_HIGH() do { /* Implement me! */ } while(0) +#define CS_LOW() do { /* Implement me! */ } while(0) +#define CS_HIGH() do { /* Implement me! */ } while(0) +/*\}*/ + +/** + * SPI pin commands. + * + * \{ + */ +#define CS_ENABLE() CS_LOW() +#define CS_DISABLE() CS_HIGH() +#define SS_ACTIVE() CS_LOW() +#define SS_INACTIVE() CS_HIGH() +#define SCK_INACTIVE() SCK_LOW() +#define SCK_ACTIVE() SCK_HIGH() +#define CS_OUT() do { /* Implement me! */ } while(0) +#define MOSI_IN() do { /* Implement me! */ } while(0) +#define MOSI_OUT() do { /* Implement me! */ } while(0) +#define IS_MISO_HIGH() (false /* Implement me! */ ) +#define MISO_IN() do { /* Implement me! */ } while(0) +#define MISO_OUT() do { /* Implement me! */ } while(0) +#define SCK_OUT() do { /* Implement me! */ } while(0) + +#define SCK_PULSE()\ + do {\ + SCK_HIGH();\ + SCK_LOW();\ + } while (0) +/*\}*/ + + +#define SPI_HW_INIT() \ + CS_DISABLE();\ + MOSI_LOW();\ + SCK_LOW();\ + MISO_IN();\ + MOSI_OUT();\ + SCK_OUT();\ + CS_OUT(); + +#endif /* HW_SPI_H */ + diff --git a/2.5/boards/arduino/hw/hw_stepper.h b/2.5/boards/arduino/hw/hw_stepper.h new file mode 100644 index 00000000..13141124 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_stepper.h @@ -0,0 +1,309 @@ +/** + * \file + * + * + * \brief Stepper hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + + +#ifndef HW_STEPPER_H +#define HW_STEPPER_H + +#include + +#include + +#include + +#warning TODO:This is an example implentation, you must implement it! + +#define STEPPER_STROBE_INIT \ +do { \ + /* put init code for strobe */ \ +} while (0) + + +#define STEPPER_STROBE_ON do { /* Implement me! */ } while(0) +#define STEPPER_STROBE_OFF do { /* Implement me! */ } while(0) + +/** + * CPU clock frequency is divided by 2^STEPPER_PRESCALER_LOG2 to + * obtain stepper clock. + */ +#define STEPPER_PRESCALER_LOG2 1 + +/** + * Stepper timer clock frequency. + */ +#define STEPPER_CLOCK ((CPU_FREQ) >> STEPPER_PRESCALER_LOG2) + +/** + * us delay to reset a stepper motor. + * This is the time neccessary to reset + * the stepper controll chip. (see datasheet for more detail). + */ +#define STEPPER_RESET_DELAY 1 + +/* + * Pins define for each stepper + */ +#define STEPPER_1_CW_CCW_PIN 0 +#define STEPPER_1_HALF_FULL_PIN 0 +#define STEPPER_1_CONTROL_PIN 0 +#define STEPPER_1_ENABLE_PIN 0 +#define STEPPER_1_RESET_PIN 0 + +/* put here other stepper motor */ + +#define STEPPER_1_SET do { /* Implement me! */ } while(0) +/* add here the set for other stepper motor */ + +#define STEPPER_1_CLEAR do { /* Implement me! */ } while(0) +/* add here the clear for other stepper motor */ + +/* + * Generic macro definition + */ + +/* + * Stepper init macro + */ +#define STEPPER_PIN_INIT_MACRO(port, index) do { \ + /* Add here init pin code */ \ + } while (0) + +/* + * Stepper commands macros + */ +#define STEPPER_SET_CW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CCW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_HALF(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_FULL(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_LOW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_HIGHT(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_DISABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_DISABLE(index) do { /* Implement me! */ } while (0) + + +/* + * Reset stepper macro + */ + +#define STEPPER_RESET_MACRO(index) do { \ + STEPPER_SET_RESET_ENABLE(index); \ + timer_udelay(STEPPER_RESET_DELAY); \ + STEPPER_SET_RESET_DISABLE(index); \ + } while (0) + +/* + * Set half or full step macro + */ +#define STEPPER_SET_STEP_MODE_MACRO(index, flag) do { \ + if (flag) \ + STEPPER_SET_HALF(index); \ + else \ + STEPPER_SET_FULL(index); \ + } while (0) + +/* + * Set control status macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_CONTROL_BIT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macros not implemented */ \ + /* else */ \ + /* WARNING This macros not implemented */ \ + } while (0) + +/* + * Set current power macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_POWER_CURRENT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macrois not implemented */ \ + /* else */ \ + /* WARNING This macrois not implemented */ \ + } while (0) + +/* + * Set rotation of stepper motor + * - dir = 1: positive rotation + * - dir = 0: no motor moviment + * - dir = -1: negative rotation + * + */ +#define STEPPER_SET_DIRECTION_MACRO(index, dir) do { \ + switch (dir) \ + { \ + case 1: \ + STEPPER_SET_CW(index); \ + break; \ + case -1: \ + STEPPER_SET_CCW(index); \ + break; \ + case 0: \ + break; \ + } \ + } while (0) + + +/* + * Define macros for manage low level of stepper. + */ + +#define STEPPER_INIT() do { \ + STEPPER_PIN_INIT_MACRO(A, 1); \ + /* Add here code for other stepper motor */ \ + } while (0) + + +/* + * Enable select stepper motor + */ +#define STEPPER_ENABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_ENABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Enable all stepper connect to micro + */ +#define STEPPER_ENABLE_ALL() do { \ + STEPPER_SET_ENABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Disable select stepper motor + */ +#define STEPPER_DISABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DISABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Disable all stepper connect to micro + */ +#define STEPPER_DISABLE_ALL() do { \ + STEPPER_SET_DISABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Reset selected stepper motor + */ +#define STEPPER_RESET(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_RESET_MACRO(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Reset all stepper motor + */ +#define STEPPER_RESET_ALL() do { \ + STEPPER_RESET_MACRO(1) \ + /* Add here code for other stepper motor */ \ + } while (0) + +// Set half/full step macros +#define STEPPER_SET_HALF_STEP(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_STEP_MODE_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Control status +#define STEPPER_SET_CONTROL_BIT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_CONTROL_BIT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Set stepper power current +#define STEPPER_SET_POWER_CURRENT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_POWER_CURRENT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +// Set rotation dirction of stepper motor +#define STEPPER_SET_DIRECTION(index, dir) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DIRECTION_MACRO(1, dir); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +#endif /* HW_STEPPER_H */ + + diff --git a/2.5/boards/arduino/hw/hw_tas5706a.h b/2.5/boards/arduino/hw/hw_tas5706a.h new file mode 100644 index 00000000..d1e1a2e6 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_tas5706a.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief HW pin handling. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_TAS5706A_H +#define HW_TAS5706A_H + +#include + +#warning FIXME: This is an example implementation, you must implement it + +#define TAS5706A_SETPOWERDOWN(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETRESET(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETMUTE(val) do { (void) val; /* implement me */ } while (0) + +#define TAS5706A_PIN_INIT() \ + do { \ + TAS5706A_SETPOWERDOWN(true); \ + TAS5706A_SETRESET(true); \ + TAS5706A_SETMUTE(true); \ + /* complete me */ \ + } while (0) + +#define TAS5706A_MCLK_INIT() \ + do { \ + /* implement me */ \ + } while(0) + + +#endif /* HW_TAS5706A_H */ diff --git a/2.5/boards/arduino/hw/hw_thermo.h b/2.5/boards/arduino/hw/hw_thermo.h new file mode 100644 index 00000000..bbfc9dde --- /dev/null +++ b/2.5/boards/arduino/hw/hw_thermo.h @@ -0,0 +1,182 @@ +/** + * \file + * + * + * \brief thermo hardware-specific control functions. + * + * \version $Id$ + * \author Francesco Sacchi + * + */ + +#ifndef HW_THERMO_H +#define HW_THERMO_H + +#include "thermo_map.h" +#include "ntc_map.h" + +#include +#include + +#include +#include + +#warning TODO:This is an example implentation, you must implement it! + +/*! + * This function should return the temperature set tolerance. + */ +INLINE deg_t thermo_hw_tolerance(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + switch (dev) + { + case THERMO_TEST: + /* Put here convertion function to temperature size */ + break; + + /* Put here your thermo device */ + + default: + ASSERT(0); + } + + return 0; +} + + +/*! + * This function should return the timeout for reaching the + * target temperature. + */ +INLINE ticks_t thermo_hw_timeout(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + switch (dev) + { + case THERMO_TEST: + /* return ms_to_ticks(60000); */ + break; + + /* Put here a time out for select thermo device */ + + default: + ASSERT(0); + } + + return 0; +} + + + +/*! + * Read the temperature of the hw device \a dev. + */ +INLINE deg_t thermo_hw_read(ThermoDev dev) +{ + return ntc_read(dev); +} + + +/*! + * Turns off a specific device. + * This function is usefull to handle errors. + */ +INLINE void thermo_hw_off(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + switch (dev) + { + case THERMO_TEST: + phase_setPower(TRIAC_TEST, 0); + break; + + /* Put here a thermo device to turn off */ + + default: + ASSERT(0); + } + +} + + +/*! + * Based on the current temperature \a cur_temp and the target temperature \a target, this function turns on and off specific + * triac channel and handles the freezer alarm. + * It may use also PID control for thermo-regolations. + */ +INLINE void thermo_hw_set(ThermoDev dev, deg_t target, deg_t cur_temp) +{ + ASSERT(dev < THERMO_CNT); + + deg_t dist = target - cur_temp; + //kprintf("dev[%d], dist[%d]\n", dev, dist); + + switch(dev) + { + case THERMO_TEST: + if (dist > 0) + { + /* phase_setPower(TRIAC_TEST, dist * PID_TEST_K); */ + } + else + { + /* phase_setPower(TRIAC_TEST, 0); */ + } + break; + + /* Put here an other thermo device */ + + default: + ASSERT(0); + } +} + + +#define THERMO_HW_INIT _thermo_hw_init() + +/*! + * Init hw associated with thermo-control. + */ +INLINE void _thermo_hw_init(void) +{ + ASSERT(phase_initialized); + ASSERT(ntc_initialized); + + phase_setPower(TRIAC_TEST, 0); + + /* Add here the other thermo device */ +} + +#endif /* HW_THERMO_H */ diff --git a/2.5/boards/arduino/hw/hw_tlv5618.h b/2.5/boards/arduino/hw/hw_tlv5618.h new file mode 100644 index 00000000..4a2b4202 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_tlv5618.h @@ -0,0 +1,69 @@ +/** + * \file + * + * + * \brief TLV5816 DAC hardware-specific definitions + * + * + * \author Francesco Sacchi + */ + +#ifndef HW_TLV5816_H +#define HW_TLV5816_H + +#warning TODO:This is an example implementation, you must implement it! + +#define TLV5618_CSINIT(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ + TLV5618_CSHIGH(pin); \ +} while(0) + +#define TLV5618_CSLOW(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#define TLV5618_CSHIGH(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#endif /* HW_TLV5816_H */ + diff --git a/2.5/boards/arduino/hw/hw_tmp123.h b/2.5/boards/arduino/hw/hw_tmp123.h new file mode 100644 index 00000000..adb18588 --- /dev/null +++ b/2.5/boards/arduino/hw/hw_tmp123.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_TMP123_H +#define HW_TMP123_H + +#warning TODO:This is an example implentation, you must implement it! + +#define TMP123_HW_CS_EN() /* Implement me! */ +#define TMP123_HW_CS_DIS() /* Implement me! */ + +#define TMP123_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_TMP123_H */ + diff --git a/2.5/boards/arduino/hw/kbd_map.h b/2.5/boards/arduino/hw/kbd_map.h new file mode 100644 index 00000000..ffe14311 --- /dev/null +++ b/2.5/boards/arduino/hw/kbd_map.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Keyboard map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_MAP_H +#define HW_KBD_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + + +/** + * Type for keyboard mask. + */ +typedef uint16_t keymask_t; + +/** + * \name Keycodes. + */ +/*@{*/ +#define K_UP BV(0) +#define K_DOWN BV(1) +#define K_OK BV(2) +#define K_CANCEL BV(3) + +#define K_REPEAT BV(13) /**< This is a repeated keyevent. */ +#define K_TIMEOUT BV(14) /**< Fake key event for timeouts. */ +#define K_LONG BV(15) +/*@}*/ + +#define K_LNG_MASK 0 + +#endif /* HW_KBD_MAP_H */ diff --git a/2.5/boards/arduino/hw/mcp41_map.h b/2.5/boards/arduino/hw/mcp41_map.h new file mode 100644 index 00000000..6646391c --- /dev/null +++ b/2.5/boards/arduino/hw/mcp41_map.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief MCP41 digital potentiometer map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef MCP41_MAP_H +#define MCP41_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/** \name Enum for mcp41 pot evices. + * \{ + * + */ +typedef enum Mcp41Dev +{ + MCP41_LED, + + /* put here other mcp41 device */ + + MCP41_CNT, +} Mcp41Dev; +/* \} */ + +#endif /* MCP41_MAP_H */ diff --git a/2.5/boards/arduino/hw/ntc_map.h b/2.5/boards/arduino/hw/ntc_map.h new file mode 100644 index 00000000..505f1c31 --- /dev/null +++ b/2.5/boards/arduino/hw/ntc_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief NTC map definitions. + * + * \version $Id$ + * + * \author Giovanni Bajo + * \author Francesco Sacchi + */ + +#ifndef NTC_MAP_H +#define NTC_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for ntc devices. + * \{ + */ +typedef enum NtcDev +{ + NTC_TEST, + + /* Put here your thermo device */ + + NTC_CNT +} NtcDev; +/* \} */ + +#endif /* NTC_MAP_H */ diff --git a/2.5/boards/arduino/hw/phase_map.h b/2.5/boards/arduino/hw/phase_map.h new file mode 100644 index 00000000..7436e5e8 --- /dev/null +++ b/2.5/boards/arduino/hw/phase_map.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief Triac map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef PHASE_MAP_H +#define PHASE_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for triac devices. + * \{ + */ +typedef enum TriacDev +{ + TRIAC_TEST, + + /* Put here other triac device */ + + TRIAC_CNT +} TriacDev; +/* \} */ + +#endif /* PHASE_MAP_H */ diff --git a/2.5/boards/arduino/hw/pwm_map.h b/2.5/boards/arduino/hw/pwm_map.h new file mode 100644 index 00000000..723da2f1 --- /dev/null +++ b/2.5/boards/arduino/hw/pwm_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * + * \brief PWM map device. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_PWM_MAP_H +#define HW_PWM_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +typedef enum +{ + PWM_CH0 = 0, + PWM_CH1, + PWM_CH2, + PWM_CH3, + +/* + * add other PWM channel or + * change above. + */ + + PWM_CNT +} PwmDev; + +#endif /* HW_PWM_MAP_H */ diff --git a/2.5/boards/arduino/hw/thermo_map.h b/2.5/boards/arduino/hw/thermo_map.h new file mode 100644 index 00000000..4376076a --- /dev/null +++ b/2.5/boards/arduino/hw/thermo_map.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Thermo regulation control map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef THERMO_MAP_H +#define THERMO_MAP_H + +#include +#include + +#warning TODO:This is an example implentation, you must implement it! + +typedef uint8_t thermostatus_t; + +#define THERMO_OFF 0 +#define THERMO_HEATING BV(0) +#define THERMO_FREEZING BV(1) +#define THERMO_TGT_REACH BV(2) +#define THERMOERRF_NTCSHORT BV(3) +#define THERMOERRF_NTCOPEN BV(4) +#define THERMOERRF_TIMEOUT BV(5) +#define THERMO_ACTIVE BV(6) + +#define THERMO_ERRMASK (THERMOERRF_NTCSHORT | THERMOERRF_NTCOPEN | THERMOERRF_TIMEOUT) + +typedef enum ThermoDev +{ + THERMO_TEST, + + /* Put here your thermo device */ + + THERMO_CNT, +} ThermoDev; + +#endif /* THERMO_MAP_H */ diff --git a/2.5/boards/arduino/templates/.spec b/2.5/boards/arduino/templates/.spec new file mode 100644 index 00000000..07fb8eed --- /dev/null +++ b/2.5/boards/arduino/templates/.spec @@ -0,0 +1,3 @@ +name = "Templates" +ord = 0 +description = "Use these as a starting point for your BeRTOS project." diff --git a/2.5/boards/arduino/templates/empty/.spec b/2.5/boards/arduino/templates/empty/.spec new file mode 100644 index 00000000..f3edfbc2 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/.spec @@ -0,0 +1,8 @@ +name = 'empty preset' +advanced = True +description=""" +

+This is a minimalist project, it just initializes the hardware of the +supported board and proposes an empty main. +<\p> +""" diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_adc.h b/2.5/boards/arduino/templates/empty/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_afsk.h b/2.5/boards/arduino/templates/empty/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_ax25.h b/2.5/boards/arduino/templates/empty/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_battfs.h b/2.5/boards/arduino/templates/empty/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_context_switch.h b/2.5/boards/arduino/templates/empty/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_dataflash.h b/2.5/boards/arduino/templates/empty/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_dc_motor.h b/2.5/boards/arduino/templates/empty/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_debug.h b/2.5/boards/arduino/templates/empty/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_fat.h b/2.5/boards/arduino/templates/empty/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_flash25.h b/2.5/boards/arduino/templates/empty/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_formatwr.h b/2.5/boards/arduino/templates/empty/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_gfx.h b/2.5/boards/arduino/templates/empty/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_hashtable.h b/2.5/boards/arduino/templates/empty/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_heap.h b/2.5/boards/arduino/templates/empty/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_i2c.h b/2.5/boards/arduino/templates/empty/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_i2s.h b/2.5/boards/arduino/templates/empty/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_ini_reader.h b/2.5/boards/arduino/templates/empty/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_kbd.h b/2.5/boards/arduino/templates/empty/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_keytag.h b/2.5/boards/arduino/templates/empty/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_kfile.h b/2.5/boards/arduino/templates/empty/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_lcd_32122a.h b/2.5/boards/arduino/templates/empty/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_lcd_hd44.h b/2.5/boards/arduino/templates/empty/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_lm75.h b/2.5/boards/arduino/templates/empty/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_md2.h b/2.5/boards/arduino/templates/empty/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_monitor.h b/2.5/boards/arduino/templates/empty/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_nmea.h b/2.5/boards/arduino/templates/empty/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_parser.h b/2.5/boards/arduino/templates/empty/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_phase.h b/2.5/boards/arduino/templates/empty/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_pocketbus.h b/2.5/boards/arduino/templates/empty/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_proc.h b/2.5/boards/arduino/templates/empty/cfg/cfg_proc.h new file mode 100644 index 00000000..52b4e414 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 0 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 0 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_pwm.h b/2.5/boards/arduino/templates/empty/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_ramp.h b/2.5/boards/arduino/templates/empty/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_randpool.h b/2.5/boards/arduino/templates/empty/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_sem.h b/2.5/boards/arduino/templates/empty/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_ser.h b/2.5/boards/arduino/templates/empty/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_signal.h b/2.5/boards/arduino/templates/empty/cfg/cfg_signal.h new file mode 100644 index 00000000..e78a4519 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 0 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_spi_bitbang.h b/2.5/boards/arduino/templates/empty/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_stepper.h b/2.5/boards/arduino/templates/empty/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_tas5706a.h b/2.5/boards/arduino/templates/empty/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_thermo.h b/2.5/boards/arduino/templates/empty/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_timer.h b/2.5/boards/arduino/templates/empty/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_wdt.h b/2.5/boards/arduino/templates/empty/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/arduino/templates/empty/cfg/cfg_xmodem.h b/2.5/boards/arduino/templates/empty/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/arduino/templates/empty/empty.mk b/2.5/boards/arduino/templates/empty/empty.mk new file mode 100644 index 00000000..986e3f6c --- /dev/null +++ b/2.5/boards/arduino/templates/empty/empty.mk @@ -0,0 +1,89 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the empty_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += empty + +empty_PREFIX = "avr-" + +empty_SUFFIX = "" + +empty_SRC_PATH = boards/arduino/templates/empty + +empty_HW_PATH = boards/arduino + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CSRC INSTEAD! +empty_WIZARD_CSRC = \ + bertos/benchmark/context_switch.c \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/struct/heap.c \ + bertos/mware/formatwr.c \ + bertos/mware/event.c \ + bertos/drv/timer.c \ + bertos/cpu/avr/drv/timer_avr.c \ + bertos/kern/proc.c \ + bertos/cpu/avr/drv/ser_avr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_PCSRC INSTEAD! +empty_WIZARD_PCSRC = \ + bertos/mware/formatwr.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CPPASRC INSTEAD! +empty_WIZARD_CPPASRC = \ + bertos/cpu/avr/hw/switch_ctx_avr.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CXXSRC INSTEAD! +empty_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_ASRC INSTEAD! +empty_WIZARD_ASRC = \ + \ + # + +empty_CPPFLAGS = -D'CPU_FREQ=(16000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(empty_HW_PATH) -I$(empty_SRC_PATH) $(empty_CPU_CPPFLAGS) $(empty_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_LDFLAGS = $(empty_CPU_LDFLAGS) $(empty_WIZARD_LDFLAGS) $(empty_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPAFLAGS = $(empty_CPU_CPPAFLAGS) $(empty_WIZARD_CPPAFLAGS) $(empty_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CSRC = $(empty_CPU_CSRC) $(empty_WIZARD_CSRC) $(empty_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_PCSRC = $(empty_CPU_PCSRC) $(empty_WIZARD_PCSRC) $(empty_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPASRC = $(empty_CPU_CPPASRC) $(empty_WIZARD_CPPASRC) $(empty_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CXXSRC = $(empty_CPU_CXXSRC) $(empty_WIZARD_CXXSRC) $(empty_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_ASRC = $(empty_CPU_ASRC) $(empty_WIZARD_ASRC) $(empty_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_MCU = atmega328p +empty_CPU_CPPFLAGS = -Os -Ibertos/cpu/avr/ +empty_PROGRAMMER_CPU = atmega328p +empty_STOPFLASH_SCRIPT = bertos/prg_scripts/avr/stopflash.sh +empty_STOPDEBUG_SCRIPT = bertos/prg_scripts/none.sh +empty_DEBUG_SCRIPT = bertos/prg_scripts/nodebug.sh +empty_FLASH_SCRIPT = bertos/prg_scripts/avr/flash.sh + +include $(empty_SRC_PATH)/empty_user.mk diff --git a/2.5/boards/arduino/templates/empty/empty_user.mk b/2.5/boards/arduino/templates/empty/empty_user.mk new file mode 100644 index 00000000..4c8ed7ef --- /dev/null +++ b/2.5/boards/arduino/templates/empty/empty_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +empty_PROGRAMMER_TYPE = none +empty_PROGRAMMER_PORT = none + +# Files included by the user. +empty_USER_CSRC = \ + $(empty_SRC_PATH)/main.c \ + # + +# Files included by the user. +empty_USER_PCSRC = \ + # + +# Files included by the user. +empty_USER_CPPASRC = \ + # + +# Files included by the user. +empty_USER_CXXSRC = \ + # + +# Files included by the user. +empty_USER_ASRC = \ + # + +# Flags included by the user. +empty_USER_LDFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/arduino/templates/empty/main.c b/2.5/boards/arduino/templates/empty/main.c new file mode 100644 index 00000000..407efe20 --- /dev/null +++ b/2.5/boards/arduino/templates/empty/main.c @@ -0,0 +1,89 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Empty project. + * + * This is a minimalist project, it just initializes the hardware of the + * supported board and proposes an empty main. + */ + +#include "hw/hw_led.h" + +#include + +#include +#include + +#include +#include + +static Serial out; + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + + /* + * XXX: Arduino has a single UART port that was previously + * initialized for debugging purpose. + * In order to activate the serial driver you should disable + * the debugging module. + */ +#if 0 + /* Initialize UART0 */ + ser_init(&out, SER_UART0); + /* Configure UART0 to work at 115.200 bps */ + ser_setbaudrate(&out, 115200); +#else + (void)out; +#endif + /* Initialize LED driver */ + LED_INIT(); +} + +int main(void) +{ + init(); + + /* Put your code here... */ + while (1) + { + } +} diff --git a/2.5/boards/arduino/templates/empty/project.bertos b/2.5/boards/arduino/templates/empty/project.bertos new file mode 100644 index 00000000..3612dd1a --- /dev/null +++ b/2.5/boards/arduino/templates/empty/project.bertos @@ -0,0 +1,77 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V16000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vempty +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Vavr +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V../configure --prefix=/usr/local/avr-4.3.2/ --target=avr --enable-languages=c,c++ --disable-nls --disable-libssp --with-dwarf2 +p15 +sS'version' +p16 +V4.3.2 +p17 +sS'build' +p18 +VGCC +p19 +sS'path' +p20 +V/opt/avr-4.3.2/bin/avr-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'formatwr' +p25 +aS'debug' +p26 +aS'kfile' +p27 +aS'heap' +p28 +aS'timer' +p29 +asS'CPU_NAME' +p30 +VATmega328P +p31 +sS'PROJECT_HW_PATH' +p32 +S'../..' +p33 +sS'PROJECT_SRC_PATH' +p34 +S'.' +p35 +sS'PRESET' +p36 +I01 +sS'OUTPUT' +p37 +(lp38 +s. \ No newline at end of file diff --git a/2.5/boards/arduino/templates/kernel/.spec b/2.5/boards/arduino/templates/kernel/.spec new file mode 100644 index 00000000..04a79cff --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/.spec @@ -0,0 +1,9 @@ +name = 'kernel preset' +advanced = True +description=""" +

+This is a minimalist kernel project: it just initializes the hardware and +creates an independent process to blink an LED, while the main loop +continues to monitor the stack utilization of all the processes. +

+""" diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_adc.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_afsk.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_ax25.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_battfs.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_context_switch.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_dataflash.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_dc_motor.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_debug.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_fat.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_flash25.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_formatwr.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_gfx.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_hashtable.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_heap.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_i2c.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_i2s.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_ini_reader.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_kbd.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_keytag.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_kfile.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_lcd_32122a.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_lcd_hd44.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_lm75.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_md2.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_monitor.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_monitor.h new file mode 100644 index 00000000..6391b407 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 1 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_nmea.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_parser.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_phase.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_pocketbus.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_proc.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_proc.h new file mode 100644 index 00000000..e779ebe4 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 1024L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_pwm.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_ramp.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_randpool.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_sem.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_ser.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_signal.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_spi_bitbang.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_stepper.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_tas5706a.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_thermo.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_timer.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_wdt.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/arduino/templates/kernel/cfg/cfg_xmodem.h b/2.5/boards/arduino/templates/kernel/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/arduino/templates/kernel/kernel.mk b/2.5/boards/arduino/templates/kernel/kernel.mk new file mode 100644 index 00000000..487247c1 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/kernel.mk @@ -0,0 +1,90 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_user.mk file instead. +# + +# Constants automatically defined by the selected modules +kernel_DEBUG = 1 + +# Our target application +TRG += kernel + +kernel_PREFIX = "avr-" + +kernel_SUFFIX = "" + +kernel_SRC_PATH = boards/arduino/templates/kernel + +kernel_HW_PATH = boards/arduino + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CSRC INSTEAD! +kernel_WIZARD_CSRC = \ + bertos/kern/kfile.c \ + bertos/kern/signal.c \ + bertos/cpu/avr/drv/timer_avr.c \ + bertos/kern/sem.c \ + bertos/mware/formatwr.c \ + bertos/struct/heap.c \ + bertos/kern/monitor.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/cpu/avr/drv/ser_avr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_PCSRC INSTEAD! +kernel_WIZARD_PCSRC = \ + bertos/mware/formatwr.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CPPASRC INSTEAD! +kernel_WIZARD_CPPASRC = \ + bertos/cpu/avr/hw/switch_ctx_avr.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CXXSRC INSTEAD! +kernel_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_ASRC INSTEAD! +kernel_WIZARD_ASRC = \ + \ + # + +kernel_CPPFLAGS = -D'CPU_FREQ=(16000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_HW_PATH) -I$(kernel_SRC_PATH) $(kernel_CPU_CPPFLAGS) $(kernel_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_LDFLAGS = $(kernel_CPU_LDFLAGS) $(kernel_WIZARD_LDFLAGS) $(kernel_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPAFLAGS = $(kernel_CPU_CPPAFLAGS) $(kernel_WIZARD_CPPAFLAGS) $(kernel_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CSRC = $(kernel_CPU_CSRC) $(kernel_WIZARD_CSRC) $(kernel_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_PCSRC = $(kernel_CPU_PCSRC) $(kernel_WIZARD_PCSRC) $(kernel_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPASRC = $(kernel_CPU_CPPASRC) $(kernel_WIZARD_CPPASRC) $(kernel_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CXXSRC = $(kernel_CPU_CXXSRC) $(kernel_WIZARD_CXXSRC) $(kernel_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_ASRC = $(kernel_CPU_ASRC) $(kernel_WIZARD_ASRC) $(kernel_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_MCU = atmega328p +kernel_CPU_CPPFLAGS = -Os -Ibertos/cpu/avr/ +kernel_PROGRAMMER_CPU = atmega328p +kernel_STOPFLASH_SCRIPT = bertos/prg_scripts/avr/stopflash.sh +kernel_STOPDEBUG_SCRIPT = bertos/prg_scripts/none.sh +kernel_DEBUG_SCRIPT = bertos/prg_scripts/nodebug.sh +kernel_FLASH_SCRIPT = bertos/prg_scripts/avr/flash.sh + +include $(kernel_SRC_PATH)/kernel_user.mk diff --git a/2.5/boards/arduino/templates/kernel/kernel_user.mk b/2.5/boards/arduino/templates/kernel/kernel_user.mk new file mode 100644 index 00000000..6dfb4d8c --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/kernel_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_PROGRAMMER_TYPE = none +kernel_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_USER_CSRC = \ + $(kernel_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_USER_PCSRC = \ + # + +# Files included by the user. +kernel_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_USER_ASRC = \ + # + +# Flags included by the user. +kernel_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/arduino/templates/kernel/main.c b/2.5/boards/arduino/templates/kernel/main.c new file mode 100644 index 00000000..663386f4 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/main.c @@ -0,0 +1,122 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Kernel project. + * + * This is a minimalist kernel project: it just initializes the hardware and + * creates an independent process to blink an LED, while the main loop + * continues to monitor the stack utilization of all the processes. + */ + +#include "hw/hw_led.h" + +#include + +#include +#include + +#include +#include + +#include +#include + +static Serial out; + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* + * XXX: Arduino has a single UART port that was previously + * initialized for debugging purpose. + * In order to activate the serial driver you should disable + * the debugging module. + */ +#if 0 + /* Initialize UART0 */ + ser_init(&out, SER_UART0); + /* Configure UART0 to work at 115.200 bps */ + ser_setbaudrate(&out, 115200); +#else + (void)out; +#endif + /* Initialize LED driver */ + LED_INIT(); + + /* + * Kernel initialization: processes (allow to create and dispatch + * processes using proc_new()). + */ + proc_init(); +} + +static void NORETURN led_process(void) +{ + int i; + + /* Periodically blink the led (toggle each 100 ms) */ + for (i = 0; ; i = !i) + { + if (i) + LED_ON(); + else + LED_OFF(); + timer_delay(100); + } +} + +int main(void) +{ + /* Hardware initialization */ + init(); + + /* Create a new child process */ + proc_new(led_process, NULL, KERN_MINSTACKSIZE * 2, NULL); + + /* + * The main process is kept to periodically report the stack + * utilization of all the processes (1 probe per second). + */ + while (1) + { + monitor_report(); + timer_delay(1000); + } +} diff --git a/2.5/boards/arduino/templates/kernel/project.bertos b/2.5/boards/arduino/templates/kernel/project.bertos new file mode 100644 index 00000000..a35e4d70 --- /dev/null +++ b/2.5/boards/arduino/templates/kernel/project.bertos @@ -0,0 +1,85 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V16000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Vavr +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V../configure --prefix=/usr/local/avr-4.3.2/ --target=avr --enable-languages=c,c++ --disable-nls --disable-libssp --with-dwarf2 +p15 +sS'version' +p16 +V4.3.2 +p17 +sS'build' +p18 +VGCC +p19 +sS'path' +p20 +V/opt/avr-4.3.2/bin/avr-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'kernel' +p25 +aS'semaphores' +p26 +aS'monitor' +p27 +aS'formatwr' +p28 +aS'debug' +p29 +aS'kfile' +p30 +aS'heap' +p31 +aS'signal' +p32 +aS'timer' +p33 +asS'CPU_NAME' +p34 +VATmega328P +p35 +sS'PROJECT_HW_PATH' +p36 +S'../..' +p37 +sS'PROJECT_SRC_PATH' +p38 +S'.' +p39 +sS'PRESET' +p40 +I01 +sS'OUTPUT' +p41 +(lp42 +s. \ No newline at end of file diff --git a/2.5/boards/at91sam7s-ek/.image.png b/2.5/boards/at91sam7s-ek/.image.png new file mode 100644 index 0000000000000000000000000000000000000000..53586efac7b67b31a1b35b08b6d3f345bc17e5f7 GIT binary patch literal 59017 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 WC$-58D)8z60000Atmel AT91SAM7S-EK + +

+ + + + + + + + + + + + + + + + + + + +
CPUAtmel AT91SAM7S256
Clock48.023MHz
Memory256kB Flash, 64kB SRAM
Peripheralstimers, ADC, UART, SPI, I²C, PWM, USB, DMA, SSC
+

+

+AT91SAM7S-EK® is based on Atmel AT91SAM7S256 ARM7-TDMI CPU. Visit the AT91SAM7S-EK page for more information. +

+ +''' + diff --git a/2.5/boards/at91sam7s-ek/benchmark/.spec b/2.5/boards/at91sam7s-ek/benchmark/.spec new file mode 100644 index 00000000..18c0580d --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/.spec @@ -0,0 +1,3 @@ +name="Benchmarks" +ord=2 +description="Projects to measure different aspects of BeRTOS performance." diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/.spec b/2.5/boards/at91sam7s-ek/benchmark/context_switch/.spec new file mode 100644 index 00000000..3268cbf4 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/.spec @@ -0,0 +1,15 @@ +name = 'BeRTOS Context Switch' +description=""" +

+This benchmark measures the overhead (in us) required to deliver a +signal and switch from a low-priority process to a high-priority process. +

+

+The measure is made by the high-precision timer if supported by the +architecture. Alternatively, the time can also be measured using an external +oscilloscope connected to the board's status LED. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_adc.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_afsk.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ax25.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_battfs.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_context_switch.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_dataflash.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_dc_motor.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_debug.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_fat.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_flash25.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_formatwr.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_gfx.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_hashtable.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_heap.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_i2c.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_i2s.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ini_reader.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_kbd.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_keytag.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_kfile.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_lcd_32122a.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_lcd_hd44.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_lm75.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_md2.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_monitor.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_nmea.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_parser.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_phase.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_pocketbus.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_proc.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_proc.h new file mode 100644 index 00000000..ab1a4680 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_pwm.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ramp.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_randpool.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_sem.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ser.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_signal.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_spi_bitbang.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_stepper.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_tas5706a.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_thermo.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_timer.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_wdt.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_xmodem.h b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/context_switch.mk b/2.5/boards/at91sam7s-ek/benchmark/context_switch/context_switch.mk new file mode 100644 index 00000000..4579bded --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/context_switch.mk @@ -0,0 +1,96 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the context_switch_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += context_switch + +context_switch_PREFIX = "arm-none-eabi-" + +context_switch_SUFFIX = "" + +context_switch_SRC_PATH = boards/at91sam7s-ek/benchmark/context_switch + +context_switch_HW_PATH = boards/at91sam7s-ek + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CSRC INSTEAD! +context_switch_WIZARD_CSRC = \ + bertos/cpu/arm/drv/timer_at91.c \ + bertos/benchmark/context_switch.c \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/cpu/arm/drv/sysirq_at91.c \ + bertos/struct/heap.c \ + bertos/cpu/arm/drv/ser_arm.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/cpu/arm/drv/ser_at91.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/mware/formatwr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_PCSRC INSTEAD! +context_switch_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CPPASRC INSTEAD! +context_switch_WIZARD_CPPASRC = \ + bertos/cpu/arm/hw/switch_ctx_arm.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CXXSRC INSTEAD! +context_switch_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_ASRC INSTEAD! +context_switch_WIZARD_ASRC = \ + \ + # + +context_switch_CPPFLAGS = -D'CPU_FREQ=(48023000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(context_switch_HW_PATH) -I$(context_switch_SRC_PATH) $(context_switch_CPU_CPPFLAGS) $(context_switch_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_LDFLAGS = $(context_switch_CPU_LDFLAGS) $(context_switch_WIZARD_LDFLAGS) $(context_switch_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPAFLAGS = $(context_switch_CPU_CPPAFLAGS) $(context_switch_WIZARD_CPPAFLAGS) $(context_switch_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CSRC = $(context_switch_CPU_CSRC) $(context_switch_WIZARD_CSRC) $(context_switch_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_PCSRC = $(context_switch_CPU_PCSRC) $(context_switch_WIZARD_PCSRC) $(context_switch_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPASRC = $(context_switch_CPU_CPPASRC) $(context_switch_WIZARD_CPPASRC) $(context_switch_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CXXSRC = $(context_switch_CPU_CXXSRC) $(context_switch_WIZARD_CXXSRC) $(context_switch_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_ASRC = $(context_switch_CPU_ASRC) $(context_switch_WIZARD_ASRC) $(context_switch_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_at91.S +context_switch_CPU_CPPAFLAGS = -g -gdwarf-2 +context_switch_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_AT91SAM7S256__ +context_switch_CPU_CSRC = bertos/cpu/arm/hw/init_at91.c +context_switch_PROGRAMMER_CPU = at91sam7 +context_switch_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +context_switch_CPU = arm7tdmi +context_switch_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +context_switch_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +context_switch_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/at91sam7_256_rom.ld +context_switch_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(context_switch_SRC_PATH)/context_switch_user.mk diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/context_switch_user.mk b/2.5/boards/at91sam7s-ek/benchmark/context_switch/context_switch_user.mk new file mode 100644 index 00000000..932e591b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/context_switch_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +context_switch_PROGRAMMER_TYPE = none +context_switch_PROGRAMMER_PORT = none + +# Files included by the user. +context_switch_USER_CSRC = \ + $(context_switch_SRC_PATH)/main.c \ + # + +# Files included by the user. +context_switch_USER_PCSRC = \ + # + +# Files included by the user. +context_switch_USER_CPPASRC = \ + # + +# Files included by the user. +context_switch_USER_CXXSRC = \ + # + +# Files included by the user. +context_switch_USER_ASRC = \ + # + +# Flags included by the user. +context_switch_USER_LDFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + -O2 \ + # diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/main.c b/2.5/boards/at91sam7s-ek/benchmark/context_switch/main.c new file mode 100644 index 00000000..ef29fb02 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/main.c @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel context switch benchmark. + * + * This benchmark measures the overhead (in µs) required to deliver a + * signal and switch from a low-priority process to a high-priority process. + * + * The measure is made by the high-precision timer if supported by the + * architecture. Alternatively, the time can also be measured using an external + * oscilloscope connected to the board's status LED. + */ + +#include + +int main(void) +{ + context_switch(); + while (1) + { + } + + return 0; +} + diff --git a/2.5/boards/at91sam7s-ek/benchmark/context_switch/project.bertos b/2.5/boards/at91sam7s-ek/benchmark/context_switch/project.bertos new file mode 100644 index 00000000..47211f85 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/context_switch/project.bertos @@ -0,0 +1,81 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V48023000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vcontext_switch +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Varm-none-eabi +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V/scratch/julian/2009q3-respin-eabi-lite/src/gcc-4.4/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2009q3-68' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin +p15 +sVversion +p16 +V4.4.1 +p17 +sVbuild +p18 +VSourcery G++ Lite 2009q3-68 +p19 +sVpath +p20 +V/localhome/toolchain/arm/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'kernel' +p25 +aS'formatwr' +p26 +aS'kfile' +p27 +aS'context_switch' +p28 +aS'heap' +p29 +aS'timer' +p30 +aS'signal' +p31 +asS'CPU_NAME' +p32 +VAT91SAM7S256 +p33 +sS'PROJECT_HW_PATH' +p34 +S'../..' +p35 +sS'PROJECT_SRC_PATH' +p36 +S'.' +p37 +sS'PRESET' +p38 +I01 +sS'OUTPUT' +p39 +(lp40 +s. \ No newline at end of file diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/.spec b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/.spec new file mode 100644 index 00000000..5a527bef --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/.spec @@ -0,0 +1,14 @@ +name = 'BeRTOS Kernel footprint' +description=""" +

+This benchmark measures the memory footprint of the BeRTOS kernel with a +simple minimalist user application. +

+

+The purpose of this test is to give a measure of the required space in a +generic flash memory to store a full-featured BeRTOS kernel. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_adc.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_afsk.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ax25.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_battfs.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_context_switch.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_dataflash.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_dc_motor.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_debug.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_fat.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_flash25.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_formatwr.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_gfx.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_hashtable.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_heap.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_i2c.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_i2s.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ini_reader.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_kbd.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_keytag.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_kfile.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_lm75.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_md2.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_monitor.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_nmea.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_parser.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_phase.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_pocketbus.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_proc.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_proc.h new file mode 100644 index 00000000..ab1a4680 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_pwm.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ramp.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_randpool.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_sem.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ser.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_signal.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_stepper.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_tas5706a.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_thermo.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_timer.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_wdt.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_xmodem.h b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/kernel_footprint.mk b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/kernel_footprint.mk new file mode 100644 index 00000000..22b52340 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/kernel_footprint.mk @@ -0,0 +1,97 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_footprint_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += kernel_footprint + +kernel_footprint_PREFIX = "arm-none-eabi-" + +kernel_footprint_SUFFIX = "" + +kernel_footprint_SRC_PATH = boards/at91sam7s-ek/benchmark/kernel_footprint + +kernel_footprint_HW_PATH = boards/at91sam7s-ek + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CSRC INSTEAD! +kernel_footprint_WIZARD_CSRC = \ + bertos/cpu/arm/drv/timer_at91.c \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/kern/sem.c \ + bertos/cpu/arm/drv/sysirq_at91.c \ + bertos/struct/heap.c \ + bertos/cpu/arm/drv/ser_arm.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/cpu/arm/drv/ser_at91.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/mware/formatwr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + bertos/benchmark/kernel_footprint.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_PCSRC INSTEAD! +kernel_footprint_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CPPASRC INSTEAD! +kernel_footprint_WIZARD_CPPASRC = \ + bertos/cpu/arm/hw/switch_ctx_arm.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CXXSRC INSTEAD! +kernel_footprint_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_ASRC INSTEAD! +kernel_footprint_WIZARD_ASRC = \ + \ + # + +kernel_footprint_CPPFLAGS = -D'CPU_FREQ=(48023000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_footprint_HW_PATH) -I$(kernel_footprint_SRC_PATH) $(kernel_footprint_CPU_CPPFLAGS) $(kernel_footprint_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_LDFLAGS = $(kernel_footprint_CPU_LDFLAGS) $(kernel_footprint_WIZARD_LDFLAGS) $(kernel_footprint_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPAFLAGS = $(kernel_footprint_CPU_CPPAFLAGS) $(kernel_footprint_WIZARD_CPPAFLAGS) $(kernel_footprint_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CSRC = $(kernel_footprint_CPU_CSRC) $(kernel_footprint_WIZARD_CSRC) $(kernel_footprint_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_PCSRC = $(kernel_footprint_CPU_PCSRC) $(kernel_footprint_WIZARD_PCSRC) $(kernel_footprint_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPASRC = $(kernel_footprint_CPU_CPPASRC) $(kernel_footprint_WIZARD_CPPASRC) $(kernel_footprint_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CXXSRC = $(kernel_footprint_CPU_CXXSRC) $(kernel_footprint_WIZARD_CXXSRC) $(kernel_footprint_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_ASRC = $(kernel_footprint_CPU_ASRC) $(kernel_footprint_WIZARD_ASRC) $(kernel_footprint_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_at91.S +kernel_footprint_CPU_CPPAFLAGS = -g -gdwarf-2 +kernel_footprint_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_AT91SAM7S256__ +kernel_footprint_CPU_CSRC = bertos/cpu/arm/hw/init_at91.c +kernel_footprint_PROGRAMMER_CPU = at91sam7 +kernel_footprint_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_footprint_CPU = arm7tdmi +kernel_footprint_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_footprint_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +kernel_footprint_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/at91sam7_256_rom.ld +kernel_footprint_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(kernel_footprint_SRC_PATH)/kernel_footprint_user.mk diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/kernel_footprint_user.mk b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/kernel_footprint_user.mk new file mode 100644 index 00000000..9e2bc5f6 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/kernel_footprint_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_footprint_PROGRAMMER_TYPE = none +kernel_footprint_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_footprint_USER_CSRC = \ + $(kernel_footprint_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_footprint_USER_PCSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_ASRC = \ + # + +# Flags included by the user. +kernel_footprint_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + -Os \ + # diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/main.c b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/main.c new file mode 100644 index 00000000..a3f11e50 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/main.c @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel footprint benchmark. + * + * This benchmark measures the memory footprint[1] of the BeRTOS kernel with a + * simple minimalist user application. + * + * The purpose of this test is to give a measure of the required space in a + * generic flash memory to store a full-featured BeRTOS kernel. + * + * [1] http://en.wikipedia.org/wiki/Memory_footprint + */ + +#include + +int main(void) +{ + kernel_footprint(); + while (1) + { + } + + return 0; +} + diff --git a/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/project.bertos b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/project.bertos new file mode 100644 index 00000000..78af9c81 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/benchmark/kernel_footprint/project.bertos @@ -0,0 +1,85 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V48023000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel_footprint +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Varm-none-eabi +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V/scratch/julian/2009q3-respin-eabi-lite/src/gcc-4.4/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2009q3-68' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin +p15 +sVversion +p16 +V4.4.1 +p17 +sVbuild +p18 +VSourcery G++ Lite 2009q3-68 +p19 +sVpath +p20 +V/localhome/toolchain/arm/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'kernel' +p25 +aS'semaphores' +p26 +aS'formatwr' +p27 +aS'kfile' +p28 +aS'msg' +p29 +aS'kernel_footprint' +p30 +aS'heap' +p31 +aS'timer' +p32 +aS'signal' +p33 +asS'CPU_NAME' +p34 +VAT91SAM7S256 +p35 +sS'PROJECT_HW_PATH' +p36 +S'../..' +p37 +sS'PROJECT_SRC_PATH' +p38 +S'.' +p39 +sS'PRESET' +p40 +I01 +sS'OUTPUT' +p41 +(lp42 +s. \ No newline at end of file diff --git a/2.5/boards/at91sam7s-ek/hw/hw_afsk.c b/2.5/boards/at91sam7s-ek/hw/hw_afsk.c new file mode 100644 index 00000000..e2c19c2d --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_afsk.c @@ -0,0 +1,128 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + + +#include +#include + +#include +#include +#include +#include + + +#define CONFIG_ADC_CLOCK 4800000UL +#define CONFIG_ADC_STARTUP_TIME 20 +#define CONFIG_ADC_SHTIME 834 + +#define ADC_COMPUTED_PRESCALER ((CPU_FREQ/(2 * CONFIG_ADC_CLOCK)) - 1) +#define ADC_COMPUTED_STARTUPTIME (((CONFIG_ADC_STARTUP_TIME * CONFIG_ADC_CLOCK)/ 8000000UL) - 1) +#define ADC_COMPUTED_SHTIME (((CONFIG_ADC_SHTIME * CONFIG_ADC_CLOCK)/1000000000UL) - 1) + +static Afsk *afsk_ctx; +bool hw_afsk_dac_isr; + + +static void __attribute__((interrupt)) hw_afsk_adc_isr(void) +{ + afsk_adc_isr(afsk_ctx, ADC_LCDR - 128); + + /* Enable block writing */ + PIOA_OWER = DAC_PIN_MASK; + + if (hw_afsk_dac_isr) + PIOA_ODSR = (afsk_dac_isr(afsk_ctx) << 15) & DAC_PIN_MASK; + else + /* Vdac/2 = 128 */ + PIOA_ODSR = 0x4000000; + + PIOA_OWDR = DAC_PIN_MASK; + + AIC_EOICR = 0; +} + +void hw_afsk_adc_init(int ch, struct Afsk * ctx) +{ + afsk_ctx = ctx; + afsk_ctx->adc_ch = ch; + ADC_MR = 0; + ADC_MR |= BV(ADC_LOWRES); + + //Apply computed prescaler value + ADC_MR &= ~ADC_PRESCALER_MASK; + ADC_MR |= ((ADC_COMPUTED_PRESCALER << ADC_PRESCALER_SHIFT) & ADC_PRESCALER_MASK); + + //Apply computed start up time + ADC_MR &= ~ADC_STARTUP_MASK; + ADC_MR |= ((ADC_COMPUTED_STARTUPTIME << ADC_STARTUP_SHIFT) & ADC_STARTUP_MASK); + + //Apply computed sample and hold time + ADC_MR &= ~ADC_SHTIME_MASK; + ADC_MR |= ((ADC_COMPUTED_SHTIME << ADC_SHTIME_SHIFT) & ADC_SHTIME_MASK); + + // Disable all interrupt + ADC_IDR = 0xFFFFFFFF; + + //Register interrupt vector + AIC_SVR(ADC_ID) = hw_afsk_adc_isr; + AIC_SMR(ADC_ID) = AIC_SRCTYPE_INT_EDGE_TRIGGERED; + AIC_IECR = BV(ADC_ID); + + //Enable data ready irq + ADC_IER = BV(ADC_DRDY); + + /////// + PMC_PCER = BV(TC0_ID); + TC_BMR = TC_NONEXC0; + TC0_CCR = BV(TC_SWTRG) | BV(TC_CLKEN); + + TC0_CMR = BV(TC_WAVE); + TC0_CMR |= (TC_WAVSEL_UP_RC_TRG | TC_ACPC_CLEAR_OUTPUT | TC_ACPA_SET_OUTPUT); + TC0_RC = (CPU_FREQ / 2) / 9600; + TC0_RA = TC0_RC / 2; + /////// + + // Auto trigger enabled on TIOA channel 0 + ADC_MR |= BV(ADC_TRGEN); + + //Disable all channels + ADC_CHDR = ADC_CH_MASK; + //Enable channel + ADC_CHER = BV(ch); +} diff --git a/2.5/boards/at91sam7s-ek/hw/hw_afsk.h b/2.5/boards/at91sam7s-ek/hw/hw_afsk.h new file mode 100644 index 00000000..b8402b23 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_afsk.h @@ -0,0 +1,122 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * \author Francesco Sacchi + */ + +#ifndef HW_AFSK_H +#define HW_AFSK_H + +#include +struct Afsk; + +void hw_afsk_adc_init(int ch, struct Afsk * ctx); +void hw_afsk_dac_init(int ch, struct Afsk * ctx); +void hw_afsk_radioCtrl(int ch, bool en); + +/** + * Initialize the specified channel of the ADC for AFSK needs. + * The adc should be configured to have a continuos stream of convertions. + * For every convertion there must be an ISR that read the sample + * and call afsk_adc_isr(), passing the context and the sample. + * + * \param ch channel to be used for AFSK demodulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_adc_isr() for every convertion. + */ +#define AFSK_ADC_INIT(ch, ctx) hw_afsk_adc_init(ch, ctx) + +#define AFSK_STROBE_INIT() do { PIOA_PER = BV(0); PIOA_OER = BV(0); PIOA_CODR = BV(0); } while (0) +#define AFSK_STROBE_ON() do { PIOA_SODR = BV(0); } while (0) +#define AFSK_STROBE_OFF() do { PIOA_CODR = BV(0); } while (0) + +#define RADIO_PIN 15 +#define DAC_PIN_MASK (BV(19) | BV(20) | BV(21) | BV(22)) +#define PTT_PIN 14 +#define TX_LED_PIN 1 + + +/** + * Initialize the specified channel of the DAC for AFSK needs. + * The DAC has to be configured in order to call an ISR for every sample sent. + * The DAC doesn't have to start the IRQ immediatly but have to wait + * the AFSK driver to call AFSK_DAC_IRQ_START(). + * The ISR must then call afsk_dac_isr() passing the AFSK context. + * \param ch DAC channel to be used for AFSK modulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_dac_isr() for every convertion. + */ +#define AFSK_DAC_INIT(ch, ctx) \ + do { \ + (void)ch, (void)ctx; \ + /* Disable pullups */ \ + PIOA_PUDR = DAC_PIN_MASK | BV(PTT_PIN) | BV(TX_LED_PIN); \ + /* Set PIO to pin */ \ + PIOA_PER = DAC_PIN_MASK | BV(PTT_PIN) | BV(TX_LED_PIN); \ + /* Disable multidrive on pin */ \ + PIOA_MDDR = DAC_PIN_MASK | BV(PTT_PIN) | BV(TX_LED_PIN); \ + /* Enanble as autput */ \ + PIOA_OER = DAC_PIN_MASK | BV(PTT_PIN) | BV(TX_LED_PIN); \ + PIOA_CODR = BV(PTT_PIN); \ + PIOA_SODR = BV(TX_LED_PIN); \ + } while (0) + +/** + * Start DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_START(ch) \ + do { \ + (void)ch; \ + extern bool hw_afsk_dac_isr; \ + PIOA_SODR = BV(PTT_PIN); \ + PIOA_CODR = BV(TX_LED_PIN); \ + hw_afsk_dac_isr = true; \ + } while (0) + +/** + * Stop DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_STOP(ch) \ + do { \ + (void)ch; \ + extern bool hw_afsk_dac_isr; \ + PIOA_CODR = BV(PTT_PIN); \ + PIOA_SODR = BV(TX_LED_PIN); \ + hw_afsk_dac_isr = false; \ + } while (0) + + +#endif /* HW_AFSK_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_buzzer.h b/2.5/boards/at91sam7s-ek/hw/hw_buzzer.h new file mode 100644 index 00000000..858ecbfb --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_buzzer.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Buzzer hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_BUZZER_H +#define HW_BUZZER_H + +#warning TODO:This is an example implementation, you must implement it! + +#define BUZZER_BIT 1 +#define IS_BUZZER_ON 0 +#define BUZZER_HW_INIT do { /* Implement me! */ } while (0) +#define BUZZER_ON do { /* Implement me! */ } while (0) +#define BUZZER_OFF do { /* Implement me! */ } while (0) + +#endif /* HW_BUZZER_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_dataflash.c b/2.5/boards/at91sam7s-ek/hw/hw_dataflash.c new file mode 100644 index 00000000..844dd922 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_dataflash.c @@ -0,0 +1,126 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_dataflash.h" + +#include +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +MOD_DEFINE(hw_dataflash); + +/** + * Data flash init function. + * + * This function provide to initialize all that + * needs to drive a dataflash memory. + * Generaly needs to init pins to drive a CS line + * and reset line. + */ +void dataflash_hw_init(void) +{ + + //Disable CS line (remove if not needed) + dataflash_hw_setCS(false); + + /* + * Put here your code! + * + * Note: + * - if you drive manualy CS line, here init a CS pin + * - if you use a dedicated reset line, here init a reset pin + */ + + MOD_INIT(hw_dataflash); +} + +/** + * Chip Select drive. + * + * This function enable or disable a CS line. + * You must implement this function comply to a dataflash + * memory datasheet to allow the drive to enable a memory + * when \p enable flag is true, and disable it when is false. + */ +void dataflash_hw_setCS(bool enable) +{ + if (enable) + { + /* + * Put here your code to enable + * dataflash memory + */ + } + else + { + /* + * Put here your code to disable + * dataflash memory + */ + } +} + +/** + * Reset data flash memory. + * + * This function provide to send reset signal to + * dataflash memory. You must impement it comly to a dataflash + * memory datasheet to allow the drive to set a reset pin + * when \p enable flag is true, and disable it when is false. + * + */ +void dataflash_hw_setReset(bool enable) +{ + if (enable) + { + /* + * Put here your code to set reset of + * dataflash memory + */ + } + else + { + /* + * Put here your code to clear reset of + * dataflash memory + */ + } +} + diff --git a/2.5/boards/at91sam7s-ek/hw/hw_dataflash.h b/2.5/boards/at91sam7s-ek/hw/hw_dataflash.h new file mode 100644 index 00000000..5254446b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_dataflash.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines (interface). + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_DATAFLASH_H +#define HW_DATAFLASH_H + +#include + +void dataflash_hw_init(void); +void dataflash_hw_setCS(bool enable); +void dataflash_hw_setReset(bool enable); + +#endif /* HW_DATAFLASH_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_dc_motor.h b/2.5/boards/at91sam7s-ek/hw/hw_dc_motor.h new file mode 100644 index 00000000..8b8dd4b4 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_dc_motor.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief DC motor hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_DC_MOTOR_H +#define HW_DC_MOTOR_H + +typedef enum MotorDCMap +{ + + /* Put here motor dc declaration */ + MOTOR_DC_CNT + +} MotorDCMap; + +/* + * Init all pin and device to manage dc motor. + */ +#define MOTOR_DC_INIT() \ + do { \ + /* Implement me! */ \ + } while (0) + + +/* + * Enable DC motor. + */ +#define DC_MOTOR_ENABLE(dev) \ + do { \ + /* Implement me! */ \ + } while (0) + +/* + * Disable DC motor. + */ +#define DC_MOTOR_DISABLE(dev) \ + do { \ + /* Implement me! */ \ + } while (0) + +/* + * Set direction for DC motor. + */ +#define DC_MOTOR_SET_DIR(dev, dir) \ + do { \ + /* Implement me! */ \ + } while (0) + + +#endif /* HW_DC_MOTOR_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_ft245rl.h b/2.5/boards/at91sam7s-ek/hw/hw_ft245rl.h new file mode 100644 index 00000000..cc0c8193 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_ft245rl.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief FT245RL USB interface hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_FT245RL_H +#define HW_FT245RL_H + +#warning TODO:This is an example implementation, you must implement it! + +#define FT245RL_DATA_IN() /* Implement me! */ +#define FT245RL_DATA_OUT() /* Implement me! */ +#define WR_HI /* Implement me! */ +#define WR_LO /* Implement me! */ + +#define RD_HI /* Implement me! */ +#define RD_LO /* Implement me! */ + +#define FT245RL_INIT() \ +do \ +{ \ + /* Implement me! */ \ +} while(0) + +#define FT245RL_DATA_RDY() (/* Implement me! */ false) +#define FT245RL_GETDATA() ({/* Implement me! */ (0);}) +#define FT245RL_TX_ALLOWED() (/* Implement me! */ false) +#define FT245RL_SETDATA(data) do {/* Implement me! */ (void)((data)); } while(0) + +#endif /* HW_FT245RL_H */ + diff --git a/2.5/boards/at91sam7s-ek/hw/hw_i2c_bitbang.h b/2.5/boards/at91sam7s-ek/hw/hw_i2c_bitbang.h new file mode 100644 index 00000000..4822af7c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_i2c_bitbang.h @@ -0,0 +1,66 @@ +/** + * \file + * + * + * \brief Macro for I2C bitbang operation. + * + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_I2C_BITBANG_H +#define HW_I2C_BITBANG_H + +#warning TODO:This is an example implementation, you must implement it! + +#define SDA_HI do { /* Implement me:Set SDA High by setting SDA pin as input */ } while (0) +#define SDA_LO do { /* Implement me:Set SDA Low by setting SDA pin as open collector output */ } while (0) +#define SCL_HI do { /* Implement me:Set SCL High by setting SCL pin as input */ } while (0) +#define SCL_LO do { /* Implement me:Set SCL Low by setting SCL pin as open collector output */ } while (0) + + +#define SCL_IN (true) /* Implement me: read SDA pin state */ +#define SDA_IN (true) /* Implement me: read SCL pin state */ + +/** + * This macro should set SDA and SCL lines as input. + */ +#define I2C_BITBANG_HW_INIT do { /* Implement me! */ } while (0) + +/** + * Half bit delay routine used to generate the correct timings. + */ +#define I2C_HALFBIT_DELAY() do { /* Implement me! */ } while (0) + +#endif /* HW_I2C_BITBANG_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_kbd.h b/2.5/boards/at91sam7s-ek/hw/hw_kbd.h new file mode 100644 index 00000000..9ca228cb --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_kbd.h @@ -0,0 +1,72 @@ +/** + * \file + * + * + * \brief Keyboard hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_H +#define HW_KBD_H + +#include "hw/kbd_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define K_RPT_MASK (K_UP | K_DOWN | K_OK | K_CANCEL) + +#define KBD_HW_INIT \ + do { \ + /* Put here code to init hw */ \ + } while (0) + +EXTERN_C int emul_kbdReadCols(void); + +/** + * Read the keyboard ports and return the mask of + * depressed keys. + */ +INLINE keymask_t kbd_readkeys(void) +{ + /* Implement me! */ + + //Only for test remove when implement this function + return 0; +} + +#endif /* HW_KBD_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_lcd.h b/2.5/boards/at91sam7s-ek/hw/hw_lcd.h new file mode 100644 index 00000000..3a206a0f --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_lcd.h @@ -0,0 +1,156 @@ +/** + * \file + * + * + * \brief LCD low-level hardware macros + * + * \version $Id$ + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_H +#define HW_LCD_H + +#include "cfg/cfg_lcd.h" /* CONFIG_LCD_4BIT */ +#include /* BV() */ +#include + +#include +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_E /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +/*@}*/ + +/** + * \name DB high nibble (DB[4-7]) + * @{ + */ + +#if CONFIG_LCD_4BIT + #define LCD_MASK (LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4) + #define LCD_SHIFT 4 +#else + #define LCD_MASK (uint8_t)0xff + #define LCD_SHIFT 0 +#endif +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_RS /* Implement me! */ +#define LCD_SET_RS /* Implement me! */ +#define LCD_CLR_RD /* Implement me! */ +#define LCD_SET_RD /* Implement me! */ +#define LCD_CLR_E /* Implement me! */ +#define LCD_SET_E /* Implement me! */ + +#if CONFIG_LCD_4BIT + #define LCD_WRITE_H(x) ((void)x)/* Implement me! */ + #define LCD_WRITE_L(x) ((void)x)/* Implement me! */ + #define LCD_READ_H ( 0 /* Implement me! */ ) + #define LCD_READ_L ( 0 /* Implement me! */ ) +#else + #define LCD_WRITE(x) ((void)x)/* Implement me! */ + #define LCD_READ (0 /* Implement me! */ ) +#endif +/*@}*/ + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ + +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + +INLINE void lcd_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_lcd_32122a.h b/2.5/boards/at91sam7s-ek/hw/hw_lcd_32122a.h new file mode 100644 index 00000000..6ec29c5c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_lcd_32122a.h @@ -0,0 +1,155 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_32122A_H +#define HW_LCD_32122A_H + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Predefined LCD PWM contrast values + */ +#define LCD_DEF_PWM 145 +#define LCD_MAX_PWM 505 +#define LCD_MIN_PWM 130 +#define LCD_PWM_CH 0 + + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_PE_E1 /* Implement me! */ +#define LCD_PE_E2 /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +#define LCD_PF_DB0 /* Implment me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_A0 do { /* Implement me! */ } while (0) +#define LCD_SET_A0 do { /* Implement me! */ } while (0) +#define LCD_CLR_RD do { /* Implement me! */ } while (0) +#define LCD_SET_RD do { /* Implement me! */ } while (0) +#define LCD_CLR_E1 do { /* Implement me! */ } while (0) +#define LCD_SET_E1 do { /* Implement me! */ } while (0) +#define LCD_CLR_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E(x) do { (void)x; /* Implement me! */ } while (0) +#define LCD_CLR_E(x) do { (void)x; /* Implement me! */ } while (0) +/*@}*/ + +/** + * \name Chip select bits for LCD_SET_E() + * @{ + */ +#define LCDF_E1 ( 0/* Implement me! */) +#define LCDF_E2 ( 0/* Implement me! */) +/*@}*/ +/** Read from the LCD data bus (DB[0-7]) */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/** Write to the LCD data bus (DB[0-7]) */ +#define LCD_READ (0 /* Implement me! */ ) + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ + +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + +#define LCD_32122_RESET() do { /* Implement me! */ } while (0) + +INLINE void lcd_32122a_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_32122A_H */ + diff --git a/2.5/boards/at91sam7s-ek/hw/hw_lcd_hd44.h b/2.5/boards/at91sam7s-ek/hw/hw_lcd_hd44.h new file mode 100644 index 00000000..dfebbcab --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_lcd_hd44.h @@ -0,0 +1,157 @@ +/** + * \file + * + * + * \brief LCD low-level hardware macros + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_HD44_H +#define HW_LCD_HD44_H + +#include "cfg/cfg_lcd_hd44.h" /* CONFIG_LCD_4BIT */ + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_E /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +/*@}*/ + +/** + * \name DB high nibble (DB[4-7]) + * @{ + */ + +#if CONFIG_LCD_4BIT + #define LCD_MASK (LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4) + #define LCD_SHIFT 4 +#else + #define LCD_MASK (uint8_t)0xff + #define LCD_SHIFT 0 +#endif +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_RS /* Implement me! */ +#define LCD_SET_RS /* Implement me! */ +#define LCD_CLR_RD /* Implement me! */ +#define LCD_SET_RD /* Implement me! */ +#define LCD_CLR_E /* Implement me! */ +#define LCD_SET_E /* Implement me! */ + +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +#if CONFIG_LCD_4BIT + #define LCD_WRITE_H(x) ((void)x)/* Implement me! */ + #define LCD_WRITE_L(x) ((void)x)/* Implement me! */ + #define LCD_READ_H ( 0 /* Implement me! */ ) + #define LCD_READ_L ( 0 /* Implement me! */ ) +#else + #define LCD_WRITE(x) ((void)x)/* Implement me! */ + #define LCD_READ (0 /* Implement me! */ ) +#endif +/*@}*/ + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + + +INLINE void lcd_hd44_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_HD44_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_led.h b/2.5/boards/at91sam7s-ek/hw/hw_led.h new file mode 100644 index 00000000..360a8251 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_led.h @@ -0,0 +1,60 @@ +/** + * \file + * + * + * \brief Led on/off macros for AT91SAM7S. + * + * \author Daniele Basile + */ + +#ifndef HW_LED_H +#define HW_LED_H + +#include +#include + +#define LED_PIN BV(0) + +#define LED_ON() PIOA_SODR = LED_PIN; +#define LED_OFF() PIOA_CODR = LED_PIN; + +#define LED_INIT() \ + do { \ + PIOA_PER = LED_PIN; \ + /* Disable pullups */ \ + PIOA_PUDR = LED_PIN; \ + /* Set PIO stepper power supply as output */ \ + PIOA_OER = LED_PIN; \ + /* Disable multidrive on all pins */ \ + PIOA_MDDR = LED_PIN; \ + } while(0) + +#endif /* HW_LED_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_lm75.h b/2.5/boards/at91sam7s-ek/hw/hw_lm75.h new file mode 100644 index 00000000..290dae09 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_lm75.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_LM75_H +#define HW_LM75_H + +#warning TODO:This is an example implentation, you must implement it! + +#define LM75_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_LM75_H */ + diff --git a/2.5/boards/at91sam7s-ek/hw/hw_mcp41.c b/2.5/boards/at91sam7s-ek/hw/hw_mcp41.c new file mode 100644 index 00000000..dc2a051c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_mcp41.c @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_mcp41.h" + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +const uint16_t mcp41_ports[MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; +const uint8_t mcp41_pins [MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; + diff --git a/2.5/boards/at91sam7s-ek/hw/hw_mcp41.h b/2.5/boards/at91sam7s-ek/hw/hw_mcp41.h new file mode 100644 index 00000000..645b6dac --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_mcp41.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_MCP41_H +#define HW_MCP41_H + +#include "hw/mcp41_map.h" + +#include + + +#warning TODO:This is an example implementation, you must implement it! + + +INLINE void SET_MCP41_DDR(Mcp41Dev dev) +{ + /* Implement me! */ + //Warning: this funtions is like avr target name, + //fix it to comply for all target. + + //Only for test remove when implement this function + (void)dev; +} + +INLINE void MCP41_ON(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void MCP41_OFF(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +#endif /* HW_MCP41_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_ntc.c b/2.5/boards/at91sam7s-ek/hw/hw_ntc.c new file mode 100644 index 00000000..3048725c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_ntc.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id$ + * \author Lorenzo Berni + * + */ + +#include +#include "hw/ntc_map.h" + +const res_t NTC_RSER[NTC_CNT]; +const res_t NTC_RPAR[NTC_CNT]; +const amp_t NTC_AMP[NTC_CNT]; +const NtcHwInfo* NTC_INFO[NTC_CNT]; diff --git a/2.5/boards/at91sam7s-ek/hw/hw_ntc.h b/2.5/boards/at91sam7s-ek/hw/hw_ntc.h new file mode 100644 index 00000000..49152a45 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_ntc.h @@ -0,0 +1,136 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id$ + * \author Francesco Sacchi + * + * A NTC acts as a variable resistor, whose resistance changes as a + * function of the temperature it measures. To sample it correctly, it is + * usually parallelized and serialized with two fixed resistor. The following diagram shows + * what is the exact disposition of the components, as handled by this + * library: + * + *
+ *                 o Vref
+ *                 |
+ *                 |                               o Vref
+ *                 |                               |
+ *               -----                             |
+ *              |     |                        ---------
+ *              | Rser|                       |         |
+ *              |     |                       |         |
+ *               -----     -----              |   ADC   |
+ *                 | Vp   |     |             |         |
+ *      -----------|------| Amp |-------------|         |
+ *     |           |      |     |      Vadc   |         |
+ *   -----       -----     -----               ---------
+ *  |     |     |     |
+ *  | NTC |     | Rpar|
+ *  |     |     |     |
+ *   -----       -----
+ *     |           |
+ *     |           |
+ *   -----       -----
+ *    ---         ---
+ *
+ * Amp is an amplifier that amplify of AMP times the signal. + * If we indicate Rp as the parallel of NTC with Rpar, ADCBITS as the bits of the ad converter + * and ADCVAL as the result from the adc convertion (Not Vadc but just the value read + * from the adc register), after various calculation, the expression of Rp is: + * + *
+ *
+ *            ADCVAL * Rser
+ * Rp = ------------------------
+ *         ADCBITS
+ *	2         * AMP - ADCVAL
+ *
+ * + * And after that NTC obvisiously is: + *
+ *        Rpar * Rp
+ * NTC = ----------
+ *        Rpar - Rp
+ *
+ * + * + * The function ntc_hw_read() compute the resistence using these formulas above. + */ + +#ifndef HW_NTC_H +#define HW_NTC_H + +#include "ntc_map.h" + +#include + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +extern const res_t NTC_RSER[NTC_CNT]; +extern const res_t NTC_RPAR[NTC_CNT]; +extern const amp_t NTC_AMP[NTC_CNT]; +extern const NtcHwInfo* NTC_INFO[NTC_CNT]; + + +/*! + * Read the resistence of ntc device \a dev. + * Return the result in res_t type. + */ +INLINE res_t ntc_hw_read(NtcDev dev) +{ + ASSERT(dev < NTC_CNT); + // See above for formula explanation. + adcread_t adcval = adc_read((uint16_t)dev); + float rp = (adcval * NTC_RSER[dev] ) / ((1 << adc_bits()) * NTC_AMP[dev] - adcval); + + //kprintf("Rp[%f], Rntc[%f]\n", rp/100, ((NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp)) / 100.0); + + return ( (NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp) ); +} + + +/*! + * Return the info (aka the table) associated with ntc device \a dev. + */ +INLINE const NtcHwInfo* ntc_hw_getInfo(NtcDev dev) +{ + return NTC_INFO[dev]; +} + +#define NTC_HW_INIT do { /* Implement me! */ } while(0) + +#endif /* HW_NTC_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_phase.c b/2.5/boards/at91sam7s-ek/hw/hw_phase.c new file mode 100644 index 00000000..54509ef3 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_phase.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/hw_phase.h" + +#warning TODO:This is an example implementation, you must implement it! + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_phase.h b/2.5/boards/at91sam7s-ek/hw/hw_phase.h new file mode 100644 index 00000000..7649e702 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_phase.h @@ -0,0 +1,80 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/phase_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define PHASE_HW_INIT do { /* Implement me! */ }while (0) + +INLINE void TRIAC_OFF(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + + +INLINE void TRIAC_ON(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void SET_TRIAC_DDR(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +void zerocross_isr(void); +#define DEFINE_ZEROCROSS_ISR() void zerocross_isr(void) + + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_rit128x96.h b/2.5/boards/at91sam7s-ek/hw/hw_rit128x96.h new file mode 100644 index 00000000..c24d1a87 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_rit128x96.h @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \brief LM3S1986: OLED-RIT-128x96 (P14201) low-level hardware macros + * + * \author Andrea Righi + */ + +#ifndef HW_RIT128x96_H +#define HW_RIT128x96_H + +#include "cfg/macros.h" /* BV() */ +#include "cfg/debug.h" + +#include +#include +#include + +/** + * \name LCD I/O pins/ports + * @{ + */ +/* OLED Data/Command control pin */ +#define GPIO_OLEDDC_PIN 0 /* Implement me! */ + +/* OLED enable pin */ +#define GPIO_OLEDEN_PIN 0 /* Implement me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +/* Send data to the display */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/*@}*/ + +INLINE void lcd_rit128x96_hw_bus_init(void) +{ + /* Implement me! */ +} + +#endif /* HW_RIT128x96_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_sd.h b/2.5/boards/at91sam7s-ek/hw/hw_sd.h new file mode 100644 index 00000000..d15b5506 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_sd.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief SD driver hardware-specific definitions. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef HW_SD_H +#define HW_SD_H + +#warning FIXME: This is an example implementation, you must implement it + +#define SD_CS_INIT() do { /* implement me */} while(0) +#define SD_CS_ON() do { /* implement me */} while(0) +#define SD_CS_OFF() do { /* implement me */} while(0) + +#define SD_PIN_INIT() do { /* implement me */} while(0) +#define SD_CARD_PRESENT() true /* implement me */ +#define SD_WRITE_PROTECT() false /* implement me */ + +#endif /* HW_SD_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_ser.h b/2.5/boards/at91sam7s-ek/hw/hw_ser.h new file mode 100644 index 00000000..2489c433 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_ser.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Serial hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_SER_H +#define HW_SER_H + +#include "cfg/cfg_ser.h" + +#if CONFIG_SER_STROBE + #warning FIXME: this is an example implementation, you must implement it + + #define SER_STROBE_INIT do { /* implement me */ } while (0) + #define SER_STROBE_ON do { /* implement me */ } while (0) + #define SER_STROBE_OFF do { /* implement me */ } while (0) +#endif + +#endif /* HW_SER_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_sipo.h b/2.5/boards/at91sam7s-ek/hw/hw_sipo.h new file mode 100644 index 00000000..3371c2c0 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_sipo.h @@ -0,0 +1,109 @@ +/** + * \file + * + * + * \brief Macro for HW_SIPO_H + * + * + * \version $Id$ + * + * \author Andrea Grandi + * \author Daniele Basile + */ + +#ifndef HW_SIPO_H +#define HW_SIPO_H + +/** + * Map sipo connection on board. + */ +typedef enum SipoMap +{ + SIPO_CNT +} SipoMap; + +/** + * Define generic macro to set pins logic level + */ +#define SIPO_SET_LEVEL_LOW(dev) do { /* Implement me! */ } while (0) +#define SIPO_SET_LEVEL_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Generate one low pulse on select line. + */ +#define PULSE_LOW(dev) do { /* Implement me! */ } while (0) + +/** + * Generate one hight pulse on select line. + */ +#define PULSE_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Define the procedure to drive serial input in sipo device (SI). + */ +#define SIPO_SI_HIGH() do { /* Implement me! */ } while (0) +#define SIPO_SI_LOW() do { /* Implement me! */ } while (0) + +/** + * Drive clock to shift SI data into latch. + */ +#define SIPO_SI_CLOCK(clk_pol) \ + do { \ + (void)clk_pol; \ + /* Implement me! */ \ + } while (0) + +/** + * Do everything needed in order to load dato into sipo. + */ +#define SIPO_LOAD(device, load_pol) do { /* Implement me! */ } while (0) + +/** + * Enable the shift register output. + */ +#define SIPO_ENABLE() do { /* Implement me! */ } while (0) + +/** + * Set polarity for Load, Clk, SI signals. + */ +#define SIPO_SET_LD_LEVEL(device, load_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_CLK_LEVEL(clock_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_SI_LEVEL() do { /* Implement me! */ } while (0) + +/** + * Do anything that needed to init sipo pins. + */ +#define SIPO_INIT_PIN() do { /* Implement me! */ } while (0) + +#endif /* HW_SIPO_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_spi.h b/2.5/boards/at91sam7s-ek/hw/hw_spi.h new file mode 100644 index 00000000..04e4893a --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_spi.h @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef HW_SPI_H +#define HW_SPI_H + +#warning TODO:This is an example implentation, you must implement it! + +#include + +/** + * SPI pin definition. + * + * \note CS is assert when level + * is low. + * + * \{ + */ +#define CS /* pin */ ///Connect to CS pin of Flash memory. +#define SCK /* pin */ ///Connect to SCK pin of Flash memory. +#define MOSI /* pin */ ///Connect to SI pin of Flash memory. +#define MISO /* pin */ ///Connect to SO pin of Flash memory. +#define SPI_PORT /* pin */ ///Micro pin PORT register. +#define SPI_PIN /* pin */ ///Micro pin PIN register. +#define SPI_DDR /* pin */ ///Micro pin DDR register. +/*\}*/ + +/** + * Pin logic level. + * + * \{ + */ +#define MOSI_LOW() do { /* Implement me! */ } while(0) +#define MOSI_HIGH() do { /* Implement me! */ } while(0) +#define MISO_HIGH() do { /* Implement me! */ } while(0) +#define SCK_LOW() do { /* Implement me! */ } while(0) +#define SCK_HIGH() do { /* Implement me! */ } while(0) +#define CS_LOW() do { /* Implement me! */ } while(0) +#define CS_HIGH() do { /* Implement me! */ } while(0) +/*\}*/ + +/** + * SPI pin commands. + * + * \{ + */ +#define CS_ENABLE() CS_LOW() +#define CS_DISABLE() CS_HIGH() +#define SS_ACTIVE() CS_LOW() +#define SS_INACTIVE() CS_HIGH() +#define SCK_INACTIVE() SCK_LOW() +#define SCK_ACTIVE() SCK_HIGH() +#define CS_OUT() do { /* Implement me! */ } while(0) +#define MOSI_IN() do { /* Implement me! */ } while(0) +#define MOSI_OUT() do { /* Implement me! */ } while(0) +#define IS_MISO_HIGH() (false /* Implement me! */ ) +#define MISO_IN() do { /* Implement me! */ } while(0) +#define MISO_OUT() do { /* Implement me! */ } while(0) +#define SCK_OUT() do { /* Implement me! */ } while(0) + +#define SCK_PULSE()\ + do {\ + SCK_HIGH();\ + SCK_LOW();\ + } while (0) +/*\}*/ + + +#define SPI_HW_INIT() \ + CS_DISABLE();\ + MOSI_LOW();\ + SCK_LOW();\ + MISO_IN();\ + MOSI_OUT();\ + SCK_OUT();\ + CS_OUT(); + +#endif /* HW_SPI_H */ + diff --git a/2.5/boards/at91sam7s-ek/hw/hw_stepper.h b/2.5/boards/at91sam7s-ek/hw/hw_stepper.h new file mode 100644 index 00000000..13141124 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_stepper.h @@ -0,0 +1,309 @@ +/** + * \file + * + * + * \brief Stepper hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + + +#ifndef HW_STEPPER_H +#define HW_STEPPER_H + +#include + +#include + +#include + +#warning TODO:This is an example implentation, you must implement it! + +#define STEPPER_STROBE_INIT \ +do { \ + /* put init code for strobe */ \ +} while (0) + + +#define STEPPER_STROBE_ON do { /* Implement me! */ } while(0) +#define STEPPER_STROBE_OFF do { /* Implement me! */ } while(0) + +/** + * CPU clock frequency is divided by 2^STEPPER_PRESCALER_LOG2 to + * obtain stepper clock. + */ +#define STEPPER_PRESCALER_LOG2 1 + +/** + * Stepper timer clock frequency. + */ +#define STEPPER_CLOCK ((CPU_FREQ) >> STEPPER_PRESCALER_LOG2) + +/** + * us delay to reset a stepper motor. + * This is the time neccessary to reset + * the stepper controll chip. (see datasheet for more detail). + */ +#define STEPPER_RESET_DELAY 1 + +/* + * Pins define for each stepper + */ +#define STEPPER_1_CW_CCW_PIN 0 +#define STEPPER_1_HALF_FULL_PIN 0 +#define STEPPER_1_CONTROL_PIN 0 +#define STEPPER_1_ENABLE_PIN 0 +#define STEPPER_1_RESET_PIN 0 + +/* put here other stepper motor */ + +#define STEPPER_1_SET do { /* Implement me! */ } while(0) +/* add here the set for other stepper motor */ + +#define STEPPER_1_CLEAR do { /* Implement me! */ } while(0) +/* add here the clear for other stepper motor */ + +/* + * Generic macro definition + */ + +/* + * Stepper init macro + */ +#define STEPPER_PIN_INIT_MACRO(port, index) do { \ + /* Add here init pin code */ \ + } while (0) + +/* + * Stepper commands macros + */ +#define STEPPER_SET_CW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CCW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_HALF(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_FULL(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_LOW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_HIGHT(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_DISABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_DISABLE(index) do { /* Implement me! */ } while (0) + + +/* + * Reset stepper macro + */ + +#define STEPPER_RESET_MACRO(index) do { \ + STEPPER_SET_RESET_ENABLE(index); \ + timer_udelay(STEPPER_RESET_DELAY); \ + STEPPER_SET_RESET_DISABLE(index); \ + } while (0) + +/* + * Set half or full step macro + */ +#define STEPPER_SET_STEP_MODE_MACRO(index, flag) do { \ + if (flag) \ + STEPPER_SET_HALF(index); \ + else \ + STEPPER_SET_FULL(index); \ + } while (0) + +/* + * Set control status macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_CONTROL_BIT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macros not implemented */ \ + /* else */ \ + /* WARNING This macros not implemented */ \ + } while (0) + +/* + * Set current power macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_POWER_CURRENT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macrois not implemented */ \ + /* else */ \ + /* WARNING This macrois not implemented */ \ + } while (0) + +/* + * Set rotation of stepper motor + * - dir = 1: positive rotation + * - dir = 0: no motor moviment + * - dir = -1: negative rotation + * + */ +#define STEPPER_SET_DIRECTION_MACRO(index, dir) do { \ + switch (dir) \ + { \ + case 1: \ + STEPPER_SET_CW(index); \ + break; \ + case -1: \ + STEPPER_SET_CCW(index); \ + break; \ + case 0: \ + break; \ + } \ + } while (0) + + +/* + * Define macros for manage low level of stepper. + */ + +#define STEPPER_INIT() do { \ + STEPPER_PIN_INIT_MACRO(A, 1); \ + /* Add here code for other stepper motor */ \ + } while (0) + + +/* + * Enable select stepper motor + */ +#define STEPPER_ENABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_ENABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Enable all stepper connect to micro + */ +#define STEPPER_ENABLE_ALL() do { \ + STEPPER_SET_ENABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Disable select stepper motor + */ +#define STEPPER_DISABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DISABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Disable all stepper connect to micro + */ +#define STEPPER_DISABLE_ALL() do { \ + STEPPER_SET_DISABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Reset selected stepper motor + */ +#define STEPPER_RESET(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_RESET_MACRO(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Reset all stepper motor + */ +#define STEPPER_RESET_ALL() do { \ + STEPPER_RESET_MACRO(1) \ + /* Add here code for other stepper motor */ \ + } while (0) + +// Set half/full step macros +#define STEPPER_SET_HALF_STEP(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_STEP_MODE_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Control status +#define STEPPER_SET_CONTROL_BIT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_CONTROL_BIT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Set stepper power current +#define STEPPER_SET_POWER_CURRENT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_POWER_CURRENT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +// Set rotation dirction of stepper motor +#define STEPPER_SET_DIRECTION(index, dir) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DIRECTION_MACRO(1, dir); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +#endif /* HW_STEPPER_H */ + + diff --git a/2.5/boards/at91sam7s-ek/hw/hw_tas5706a.h b/2.5/boards/at91sam7s-ek/hw/hw_tas5706a.h new file mode 100644 index 00000000..d1e1a2e6 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_tas5706a.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief HW pin handling. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_TAS5706A_H +#define HW_TAS5706A_H + +#include + +#warning FIXME: This is an example implementation, you must implement it + +#define TAS5706A_SETPOWERDOWN(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETRESET(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETMUTE(val) do { (void) val; /* implement me */ } while (0) + +#define TAS5706A_PIN_INIT() \ + do { \ + TAS5706A_SETPOWERDOWN(true); \ + TAS5706A_SETRESET(true); \ + TAS5706A_SETMUTE(true); \ + /* complete me */ \ + } while (0) + +#define TAS5706A_MCLK_INIT() \ + do { \ + /* implement me */ \ + } while(0) + + +#endif /* HW_TAS5706A_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_thermo.h b/2.5/boards/at91sam7s-ek/hw/hw_thermo.h new file mode 100644 index 00000000..bbfc9dde --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_thermo.h @@ -0,0 +1,182 @@ +/** + * \file + * + * + * \brief thermo hardware-specific control functions. + * + * \version $Id$ + * \author Francesco Sacchi + * + */ + +#ifndef HW_THERMO_H +#define HW_THERMO_H + +#include "thermo_map.h" +#include "ntc_map.h" + +#include +#include + +#include +#include + +#warning TODO:This is an example implentation, you must implement it! + +/*! + * This function should return the temperature set tolerance. + */ +INLINE deg_t thermo_hw_tolerance(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + switch (dev) + { + case THERMO_TEST: + /* Put here convertion function to temperature size */ + break; + + /* Put here your thermo device */ + + default: + ASSERT(0); + } + + return 0; +} + + +/*! + * This function should return the timeout for reaching the + * target temperature. + */ +INLINE ticks_t thermo_hw_timeout(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + switch (dev) + { + case THERMO_TEST: + /* return ms_to_ticks(60000); */ + break; + + /* Put here a time out for select thermo device */ + + default: + ASSERT(0); + } + + return 0; +} + + + +/*! + * Read the temperature of the hw device \a dev. + */ +INLINE deg_t thermo_hw_read(ThermoDev dev) +{ + return ntc_read(dev); +} + + +/*! + * Turns off a specific device. + * This function is usefull to handle errors. + */ +INLINE void thermo_hw_off(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + switch (dev) + { + case THERMO_TEST: + phase_setPower(TRIAC_TEST, 0); + break; + + /* Put here a thermo device to turn off */ + + default: + ASSERT(0); + } + +} + + +/*! + * Based on the current temperature \a cur_temp and the target temperature \a target, this function turns on and off specific + * triac channel and handles the freezer alarm. + * It may use also PID control for thermo-regolations. + */ +INLINE void thermo_hw_set(ThermoDev dev, deg_t target, deg_t cur_temp) +{ + ASSERT(dev < THERMO_CNT); + + deg_t dist = target - cur_temp; + //kprintf("dev[%d], dist[%d]\n", dev, dist); + + switch(dev) + { + case THERMO_TEST: + if (dist > 0) + { + /* phase_setPower(TRIAC_TEST, dist * PID_TEST_K); */ + } + else + { + /* phase_setPower(TRIAC_TEST, 0); */ + } + break; + + /* Put here an other thermo device */ + + default: + ASSERT(0); + } +} + + +#define THERMO_HW_INIT _thermo_hw_init() + +/*! + * Init hw associated with thermo-control. + */ +INLINE void _thermo_hw_init(void) +{ + ASSERT(phase_initialized); + ASSERT(ntc_initialized); + + phase_setPower(TRIAC_TEST, 0); + + /* Add here the other thermo device */ +} + +#endif /* HW_THERMO_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/hw_tlv5618.h b/2.5/boards/at91sam7s-ek/hw/hw_tlv5618.h new file mode 100644 index 00000000..4a2b4202 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_tlv5618.h @@ -0,0 +1,69 @@ +/** + * \file + * + * + * \brief TLV5816 DAC hardware-specific definitions + * + * + * \author Francesco Sacchi + */ + +#ifndef HW_TLV5816_H +#define HW_TLV5816_H + +#warning TODO:This is an example implementation, you must implement it! + +#define TLV5618_CSINIT(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ + TLV5618_CSHIGH(pin); \ +} while(0) + +#define TLV5618_CSLOW(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#define TLV5618_CSHIGH(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#endif /* HW_TLV5816_H */ + diff --git a/2.5/boards/at91sam7s-ek/hw/hw_tmp123.h b/2.5/boards/at91sam7s-ek/hw/hw_tmp123.h new file mode 100644 index 00000000..adb18588 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/hw_tmp123.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_TMP123_H +#define HW_TMP123_H + +#warning TODO:This is an example implentation, you must implement it! + +#define TMP123_HW_CS_EN() /* Implement me! */ +#define TMP123_HW_CS_DIS() /* Implement me! */ + +#define TMP123_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_TMP123_H */ + diff --git a/2.5/boards/at91sam7s-ek/hw/kbd_map.h b/2.5/boards/at91sam7s-ek/hw/kbd_map.h new file mode 100644 index 00000000..ffe14311 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/kbd_map.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Keyboard map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_MAP_H +#define HW_KBD_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + + +/** + * Type for keyboard mask. + */ +typedef uint16_t keymask_t; + +/** + * \name Keycodes. + */ +/*@{*/ +#define K_UP BV(0) +#define K_DOWN BV(1) +#define K_OK BV(2) +#define K_CANCEL BV(3) + +#define K_REPEAT BV(13) /**< This is a repeated keyevent. */ +#define K_TIMEOUT BV(14) /**< Fake key event for timeouts. */ +#define K_LONG BV(15) +/*@}*/ + +#define K_LNG_MASK 0 + +#endif /* HW_KBD_MAP_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/mcp41_map.h b/2.5/boards/at91sam7s-ek/hw/mcp41_map.h new file mode 100644 index 00000000..6646391c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/mcp41_map.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief MCP41 digital potentiometer map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef MCP41_MAP_H +#define MCP41_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/** \name Enum for mcp41 pot evices. + * \{ + * + */ +typedef enum Mcp41Dev +{ + MCP41_LED, + + /* put here other mcp41 device */ + + MCP41_CNT, +} Mcp41Dev; +/* \} */ + +#endif /* MCP41_MAP_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/ntc_map.h b/2.5/boards/at91sam7s-ek/hw/ntc_map.h new file mode 100644 index 00000000..505f1c31 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/ntc_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief NTC map definitions. + * + * \version $Id$ + * + * \author Giovanni Bajo + * \author Francesco Sacchi + */ + +#ifndef NTC_MAP_H +#define NTC_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for ntc devices. + * \{ + */ +typedef enum NtcDev +{ + NTC_TEST, + + /* Put here your thermo device */ + + NTC_CNT +} NtcDev; +/* \} */ + +#endif /* NTC_MAP_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/phase_map.h b/2.5/boards/at91sam7s-ek/hw/phase_map.h new file mode 100644 index 00000000..7436e5e8 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/phase_map.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief Triac map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef PHASE_MAP_H +#define PHASE_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for triac devices. + * \{ + */ +typedef enum TriacDev +{ + TRIAC_TEST, + + /* Put here other triac device */ + + TRIAC_CNT +} TriacDev; +/* \} */ + +#endif /* PHASE_MAP_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/pwm_map.h b/2.5/boards/at91sam7s-ek/hw/pwm_map.h new file mode 100644 index 00000000..64fa5c2b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/pwm_map.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * + * \brief PWM map device. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_PWM_MAP_H +#define HW_PWM_MAP_H + +typedef enum +{ + PWM_CH0 = 0, + PWM_CH1, + PWM_CH2, + PWM_CH3, + +/* + * add other PWM channel or + * change above. + */ + + PWM_CNT +} PwmDev; + +#endif /* HW_PWM_MAP_H */ diff --git a/2.5/boards/at91sam7s-ek/hw/thermo_map.h b/2.5/boards/at91sam7s-ek/hw/thermo_map.h new file mode 100644 index 00000000..4376076a --- /dev/null +++ b/2.5/boards/at91sam7s-ek/hw/thermo_map.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Thermo regulation control map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef THERMO_MAP_H +#define THERMO_MAP_H + +#include +#include + +#warning TODO:This is an example implentation, you must implement it! + +typedef uint8_t thermostatus_t; + +#define THERMO_OFF 0 +#define THERMO_HEATING BV(0) +#define THERMO_FREEZING BV(1) +#define THERMO_TGT_REACH BV(2) +#define THERMOERRF_NTCSHORT BV(3) +#define THERMOERRF_NTCOPEN BV(4) +#define THERMOERRF_TIMEOUT BV(5) +#define THERMO_ACTIVE BV(6) + +#define THERMO_ERRMASK (THERMOERRF_NTCSHORT | THERMOERRF_NTCOPEN | THERMOERRF_TIMEOUT) + +typedef enum ThermoDev +{ + THERMO_TEST, + + /* Put here your thermo device */ + + THERMO_CNT, +} ThermoDev; + +#endif /* THERMO_MAP_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/.spec b/2.5/boards/at91sam7s-ek/templates/.spec new file mode 100644 index 00000000..07fb8eed --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/.spec @@ -0,0 +1,3 @@ +name = "Templates" +ord = 0 +description = "Use these as a starting point for your BeRTOS project." diff --git a/2.5/boards/at91sam7s-ek/templates/empty/.spec b/2.5/boards/at91sam7s-ek/templates/empty/.spec new file mode 100644 index 00000000..f3edfbc2 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/.spec @@ -0,0 +1,8 @@ +name = 'empty preset' +advanced = True +description=""" +

+This is a minimalist project, it just initializes the hardware of the +supported board and proposes an empty main. +<\p> +""" diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_adc.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_afsk.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ax25.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_battfs.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_context_switch.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_dataflash.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_dc_motor.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_debug.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_fat.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_flash25.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_formatwr.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_gfx.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_hashtable.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_heap.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_i2c.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_i2s.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ini_reader.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_kbd.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_keytag.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_kfile.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_lcd_32122a.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_lcd_hd44.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_lm75.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_md2.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_monitor.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_nmea.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_parser.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_phase.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_pocketbus.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_proc.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_proc.h new file mode 100644 index 00000000..b2c3a965 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 0 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_pwm.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ramp.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_randpool.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_sem.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ser.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_signal.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_signal.h new file mode 100644 index 00000000..e78a4519 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 0 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_spi_bitbang.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_stepper.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_tas5706a.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_thermo.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_timer.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_wdt.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_xmodem.h b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/empty/empty.mk b/2.5/boards/at91sam7s-ek/templates/empty/empty.mk new file mode 100644 index 00000000..690ba166 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/empty.mk @@ -0,0 +1,96 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the empty_user.mk file instead. +# + +# Constants automatically defined by the selected modules +empty_DEBUG = 1 + +# Our target application +TRG += empty + +empty_PREFIX = "arm-none-eabi-" + +empty_SUFFIX = "" + +empty_SRC_PATH = boards/at91sam7s-ek/templates/empty + +empty_HW_PATH = boards/at91sam7s-ek + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CSRC INSTEAD! +empty_WIZARD_CSRC = \ + bertos/cpu/arm/drv/timer_at91.c \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/kern/sem.c \ + bertos/cpu/arm/drv/sysirq_at91.c \ + bertos/struct/heap.c \ + bertos/cpu/arm/drv/ser_arm.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/cpu/arm/drv/ser_at91.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/mware/formatwr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_PCSRC INSTEAD! +empty_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CPPASRC INSTEAD! +empty_WIZARD_CPPASRC = \ + bertos/cpu/arm/hw/switch_ctx_arm.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CXXSRC INSTEAD! +empty_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_ASRC INSTEAD! +empty_WIZARD_ASRC = \ + \ + # + +empty_CPPFLAGS = -D'CPU_FREQ=(48023000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(empty_HW_PATH) -I$(empty_SRC_PATH) $(empty_CPU_CPPFLAGS) $(empty_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_LDFLAGS = $(empty_CPU_LDFLAGS) $(empty_WIZARD_LDFLAGS) $(empty_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPAFLAGS = $(empty_CPU_CPPAFLAGS) $(empty_WIZARD_CPPAFLAGS) $(empty_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CSRC = $(empty_CPU_CSRC) $(empty_WIZARD_CSRC) $(empty_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_PCSRC = $(empty_CPU_PCSRC) $(empty_WIZARD_PCSRC) $(empty_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPASRC = $(empty_CPU_CPPASRC) $(empty_WIZARD_CPPASRC) $(empty_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CXXSRC = $(empty_CPU_CXXSRC) $(empty_WIZARD_CXXSRC) $(empty_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_ASRC = $(empty_CPU_ASRC) $(empty_WIZARD_ASRC) $(empty_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_at91.S +empty_CPU_CPPAFLAGS = -g -gdwarf-2 +empty_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_AT91SAM7S256__ +empty_CPU_CSRC = bertos/cpu/arm/hw/init_at91.c +empty_PROGRAMMER_CPU = at91sam7 +empty_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/at91sam7_256_rom.ld +empty_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +empty_CPU = arm7tdmi +empty_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +empty_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +empty_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(empty_SRC_PATH)/empty_user.mk diff --git a/2.5/boards/at91sam7s-ek/templates/empty/empty_user.mk b/2.5/boards/at91sam7s-ek/templates/empty/empty_user.mk new file mode 100644 index 00000000..4c8ed7ef --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/empty_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +empty_PROGRAMMER_TYPE = none +empty_PROGRAMMER_PORT = none + +# Files included by the user. +empty_USER_CSRC = \ + $(empty_SRC_PATH)/main.c \ + # + +# Files included by the user. +empty_USER_PCSRC = \ + # + +# Files included by the user. +empty_USER_CPPASRC = \ + # + +# Files included by the user. +empty_USER_CXXSRC = \ + # + +# Files included by the user. +empty_USER_ASRC = \ + # + +# Flags included by the user. +empty_USER_LDFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/at91sam7s-ek/templates/empty/main.c b/2.5/boards/at91sam7s-ek/templates/empty/main.c new file mode 100644 index 00000000..516bfad0 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/main.c @@ -0,0 +1,77 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Empty project. + * + * This is a minimalist project, it just initializes the hardware of the + * supported board and proposes an empty main. + */ + +#include "hw/hw_led.h" + +#include + +#include + +#include +#include + +static Serial out; + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* Initialize UART0 */ + ser_init(&out, SER_UART0); + /* Configure UART0 to work at 115.200 bps */ + ser_setbaudrate(&out, 115200); + /* Initialize LED driver */ + LED_INIT(); +} + +int main(void) +{ + init(); + + /* Put your code here... */ + while (1) + { + } +} diff --git a/2.5/boards/at91sam7s-ek/templates/empty/project.bertos b/2.5/boards/at91sam7s-ek/templates/empty/project.bertos new file mode 100644 index 00000000..3effa2de --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/empty/project.bertos @@ -0,0 +1,77 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V48023000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vempty +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Varm-none-eabi +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V/scratch/julian/2010q1-release-eabi-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2010q1-188' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin +p15 +sS'version' +p16 +V4.4.1 +p17 +sS'build' +p18 +VSourcery G++ Lite 2010q1-188 +p19 +sS'path' +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'formatwr' +p25 +aS'kfile' +p26 +aS'heap' +p27 +aS'timer' +p28 +aS'debug' +p29 +asS'CPU_NAME' +p30 +VAT91SAM7S256 +p31 +sS'PROJECT_HW_PATH' +p32 +S'../..' +p33 +sS'PROJECT_SRC_PATH' +p34 +S'.' +p35 +sS'PRESET' +p36 +I01 +sS'OUTPUT' +p37 +(lp38 +s. \ No newline at end of file diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/.spec b/2.5/boards/at91sam7s-ek/templates/kernel/.spec new file mode 100644 index 00000000..04a79cff --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/.spec @@ -0,0 +1,9 @@ +name = 'kernel preset' +advanced = True +description=""" +

+This is a minimalist kernel project: it just initializes the hardware and +creates an independent process to blink an LED, while the main loop +continues to monitor the stack utilization of all the processes. +

+""" diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_adc.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_afsk.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ax25.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_battfs.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_context_switch.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_dataflash.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_dc_motor.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_debug.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_fat.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_flash25.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_formatwr.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_gfx.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_hashtable.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_heap.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_i2c.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_i2s.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ini_reader.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_kbd.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_keytag.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_kfile.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_lcd_32122a.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_lcd_hd44.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_lm75.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_md2.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_monitor.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_monitor.h new file mode 100644 index 00000000..6391b407 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 1 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_nmea.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_parser.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_phase.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_pocketbus.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_proc.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_proc.h new file mode 100644 index 00000000..7e64c498 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_pwm.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ramp.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_randpool.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_sem.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ser.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_signal.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_spi_bitbang.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_stepper.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_tas5706a.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_thermo.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_timer.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_wdt.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_xmodem.h b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/kernel.mk b/2.5/boards/at91sam7s-ek/templates/kernel/kernel.mk new file mode 100644 index 00000000..f6246c00 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/kernel.mk @@ -0,0 +1,97 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_user.mk file instead. +# + +# Constants automatically defined by the selected modules +kernel_DEBUG = 1 + +# Our target application +TRG += kernel + +kernel_PREFIX = "arm-none-eabi-" + +kernel_SUFFIX = "" + +kernel_SRC_PATH = boards/at91sam7s-ek/templates/kernel + +kernel_HW_PATH = boards/at91sam7s-ek + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CSRC INSTEAD! +kernel_WIZARD_CSRC = \ + bertos/cpu/arm/drv/timer_at91.c \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/kern/sem.c \ + bertos/kern/monitor.c \ + bertos/cpu/arm/drv/sysirq_at91.c \ + bertos/struct/heap.c \ + bertos/cpu/arm/drv/ser_arm.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/cpu/arm/drv/ser_at91.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/mware/formatwr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_PCSRC INSTEAD! +kernel_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CPPASRC INSTEAD! +kernel_WIZARD_CPPASRC = \ + bertos/cpu/arm/hw/switch_ctx_arm.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CXXSRC INSTEAD! +kernel_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_ASRC INSTEAD! +kernel_WIZARD_ASRC = \ + \ + # + +kernel_CPPFLAGS = -D'CPU_FREQ=(48023000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_HW_PATH) -I$(kernel_SRC_PATH) $(kernel_CPU_CPPFLAGS) $(kernel_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_LDFLAGS = $(kernel_CPU_LDFLAGS) $(kernel_WIZARD_LDFLAGS) $(kernel_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPAFLAGS = $(kernel_CPU_CPPAFLAGS) $(kernel_WIZARD_CPPAFLAGS) $(kernel_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CSRC = $(kernel_CPU_CSRC) $(kernel_WIZARD_CSRC) $(kernel_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_PCSRC = $(kernel_CPU_PCSRC) $(kernel_WIZARD_PCSRC) $(kernel_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPASRC = $(kernel_CPU_CPPASRC) $(kernel_WIZARD_CPPASRC) $(kernel_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CXXSRC = $(kernel_CPU_CXXSRC) $(kernel_WIZARD_CXXSRC) $(kernel_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_ASRC = $(kernel_CPU_ASRC) $(kernel_WIZARD_ASRC) $(kernel_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_at91.S +kernel_CPU_CPPAFLAGS = -g -gdwarf-2 +kernel_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_AT91SAM7S256__ +kernel_CPU_CSRC = bertos/cpu/arm/hw/init_at91.c +kernel_PROGRAMMER_CPU = at91sam7 +kernel_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/at91sam7_256_rom.ld +kernel_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_CPU = arm7tdmi +kernel_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +kernel_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(kernel_SRC_PATH)/kernel_user.mk diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/kernel_user.mk b/2.5/boards/at91sam7s-ek/templates/kernel/kernel_user.mk new file mode 100644 index 00000000..6dfb4d8c --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/kernel_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_PROGRAMMER_TYPE = none +kernel_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_USER_CSRC = \ + $(kernel_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_USER_PCSRC = \ + # + +# Files included by the user. +kernel_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_USER_ASRC = \ + # + +# Flags included by the user. +kernel_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/main.c b/2.5/boards/at91sam7s-ek/templates/kernel/main.c new file mode 100644 index 00000000..28035ddd --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/main.c @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Kernel project. + * + * This is a minimalist kernel project: it just initializes the hardware and + * creates an independent process to blink an LED, while the main loop + * continues to monitor the stack utilization of all the processes. + */ + +#include "hw/hw_led.h" + +#include + +#include + +#include +#include + +#include +#include + +static Serial out; + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* Initialize UART0 */ + ser_init(&out, SER_UART0); + /* Configure UART0 to work at 115.200 bps */ + ser_setbaudrate(&out, 115200); + /* Initialize LED driver */ + LED_INIT(); + + /* + * Kernel initialization: processes (allow to create and dispatch + * processes using proc_new()). + */ + proc_init(); +} + +static void NORETURN led_process(void) +{ + int i; + + /* Periodically blink the led (toggle each 100 ms) */ + for (i = 0; ; i = !i) + { + if (i) + { + LED_ON(); + } + else + { + LED_OFF(); + } + timer_delay(100); + } +} + +int main(void) +{ + /* Hardware initialization */ + init(); + + /* Create a new child process */ + proc_new(led_process, NULL, KERN_MINSTACKSIZE * 2, NULL); + + /* + * The main process is kept to periodically report the stack + * utilization of all the processes (1 probe per second). + */ + while (1) + { + monitor_report(); + timer_delay(1000); + } +} diff --git a/2.5/boards/at91sam7s-ek/templates/kernel/project.bertos b/2.5/boards/at91sam7s-ek/templates/kernel/project.bertos new file mode 100644 index 00000000..28acf459 --- /dev/null +++ b/2.5/boards/at91sam7s-ek/templates/kernel/project.bertos @@ -0,0 +1,85 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V48023000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Varm-none-eabi +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V/scratch/julian/2010q1-release-eabi-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2010q1-188' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin +p15 +sS'version' +p16 +V4.4.1 +p17 +sS'build' +p18 +VSourcery G++ Lite 2010q1-188 +p19 +sS'path' +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'kernel' +p25 +aS'semaphores' +p26 +aS'monitor' +p27 +aS'formatwr' +p28 +aS'debug' +p29 +aS'kfile' +p30 +aS'heap' +p31 +aS'signal' +p32 +aS'timer' +p33 +asS'CPU_NAME' +p34 +VAT91SAM7S256 +p35 +sS'PROJECT_HW_PATH' +p36 +S'../..' +p37 +sS'PROJECT_SRC_PATH' +p38 +S'.' +p39 +sS'PRESET' +p40 +I01 +sS'OUTPUT' +p41 +(lp42 +s. \ No newline at end of file diff --git a/2.5/boards/at91sam7x-ek/.image.png b/2.5/boards/at91sam7x-ek/.image.png new file mode 100644 index 0000000000000000000000000000000000000000..27a4f29060f2134db09b87fe8f5215f6217282bc GIT binary patch literal 59067 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 literal 0 HcmV?d00001 diff --git a/2.5/boards/at91sam7x-ek/.spec b/2.5/boards/at91sam7x-ek/.spec new file mode 100644 index 00000000..41c05732 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/.spec @@ -0,0 +1,31 @@ +name = "Atmel AT91SAM7X-EK" +description = ''' +

Atmel AT91SAM7X-EK

+ +

+ + + + + + + + + + + + + + + + + + + +
CPUAtmel AT91SAM7X256
Clock48.023MHz
Memory256kB Flash, 64kB SRAM
Peripheralstimers, ADC, UART, SPI, I²C, PWM, CAN, USB, DMA, SSC, ethernet, SD card connector
+

+

+AT91SAM7X-EK® is based on Atmel AT91SAM7X256 ARM7-TDMI CPU. Visit the AT91SAM7X-EK page for more information. +

+ +''' diff --git a/2.5/boards/at91sam7x-ek/benchmark/.spec b/2.5/boards/at91sam7x-ek/benchmark/.spec new file mode 100644 index 00000000..18c0580d --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/.spec @@ -0,0 +1,3 @@ +name="Benchmarks" +ord=2 +description="Projects to measure different aspects of BeRTOS performance." diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/.spec b/2.5/boards/at91sam7x-ek/benchmark/context_switch/.spec new file mode 100644 index 00000000..3268cbf4 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/.spec @@ -0,0 +1,15 @@ +name = 'BeRTOS Context Switch' +description=""" +

+This benchmark measures the overhead (in us) required to deliver a +signal and switch from a low-priority process to a high-priority process. +

+

+The measure is made by the high-precision timer if supported by the +architecture. Alternatively, the time can also be measured using an external +oscilloscope connected to the board's status LED. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_adc.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_afsk.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_afsk.h new file mode 100644 index 00000000..d8bc1d56 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_afsk.h @@ -0,0 +1,114 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ax25.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_battfs.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_context_switch.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_dataflash.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_dc_motor.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_debug.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_fat.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_flash25.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_formatwr.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_gfx.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_hashtable.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_heap.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_i2c.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_i2c.h new file mode 100644 index 00000000..af36e6b6 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_i2c.h @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_i2s.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ini_reader.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_kbd.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_keytag.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_kfile.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_lcd_32122a.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_lcd_hd44.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_lm75.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_md2.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_menu.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_monitor.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_nmea.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_parser.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_phase.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_pocketbus.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_proc.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_proc.h new file mode 100644 index 00000000..ab1a4680 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_pwm.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ramp.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_randpool.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_sem.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ser.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_signal.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_spi_bitbang.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_stepper.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_tas5706a.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_thermo.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_timer.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_wdt.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_xmodem.h b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/context_switch.mk b/2.5/boards/at91sam7x-ek/benchmark/context_switch/context_switch.mk new file mode 100644 index 00000000..99447836 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/context_switch.mk @@ -0,0 +1,96 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the context_switch_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += context_switch + +context_switch_PREFIX = "arm-none-eabi-" + +context_switch_SUFFIX = "" + +context_switch_SRC_PATH = boards/at91sam7x-ek/benchmark/context_switch + +context_switch_HW_PATH = boards/at91sam7x-ek + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CSRC INSTEAD! +context_switch_WIZARD_CSRC = \ + bertos/cpu/arm/drv/timer_at91.c \ + bertos/benchmark/context_switch.c \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/cpu/arm/drv/sysirq_at91.c \ + bertos/struct/heap.c \ + bertos/cpu/arm/drv/ser_arm.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/cpu/arm/drv/ser_at91.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/mware/formatwr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_PCSRC INSTEAD! +context_switch_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CPPASRC INSTEAD! +context_switch_WIZARD_CPPASRC = \ + bertos/cpu/arm/hw/switch_ctx_arm.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CXXSRC INSTEAD! +context_switch_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_ASRC INSTEAD! +context_switch_WIZARD_ASRC = \ + \ + # + +context_switch_CPPFLAGS = -D'CPU_FREQ=(48023000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(context_switch_HW_PATH) -I$(context_switch_SRC_PATH) $(context_switch_CPU_CPPFLAGS) $(context_switch_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_LDFLAGS = $(context_switch_CPU_LDFLAGS) $(context_switch_WIZARD_LDFLAGS) $(context_switch_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPAFLAGS = $(context_switch_CPU_CPPAFLAGS) $(context_switch_WIZARD_CPPAFLAGS) $(context_switch_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CSRC = $(context_switch_CPU_CSRC) $(context_switch_WIZARD_CSRC) $(context_switch_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_PCSRC = $(context_switch_CPU_PCSRC) $(context_switch_WIZARD_PCSRC) $(context_switch_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPASRC = $(context_switch_CPU_CPPASRC) $(context_switch_WIZARD_CPPASRC) $(context_switch_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CXXSRC = $(context_switch_CPU_CXXSRC) $(context_switch_WIZARD_CXXSRC) $(context_switch_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_ASRC = $(context_switch_CPU_ASRC) $(context_switch_WIZARD_ASRC) $(context_switch_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_at91.S +context_switch_CPU_CPPAFLAGS = -g -gdwarf-2 +context_switch_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_AT91SAM7X256__ +context_switch_CPU_CSRC = bertos/cpu/arm/hw/init_at91.c +context_switch_PROGRAMMER_CPU = at91sam7 +context_switch_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +context_switch_CPU = arm7tdmi +context_switch_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +context_switch_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +context_switch_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/at91sam7_256_rom.ld +context_switch_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(context_switch_SRC_PATH)/context_switch_user.mk diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/context_switch_user.mk b/2.5/boards/at91sam7x-ek/benchmark/context_switch/context_switch_user.mk new file mode 100644 index 00000000..932e591b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/context_switch_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +context_switch_PROGRAMMER_TYPE = none +context_switch_PROGRAMMER_PORT = none + +# Files included by the user. +context_switch_USER_CSRC = \ + $(context_switch_SRC_PATH)/main.c \ + # + +# Files included by the user. +context_switch_USER_PCSRC = \ + # + +# Files included by the user. +context_switch_USER_CPPASRC = \ + # + +# Files included by the user. +context_switch_USER_CXXSRC = \ + # + +# Files included by the user. +context_switch_USER_ASRC = \ + # + +# Flags included by the user. +context_switch_USER_LDFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + -O2 \ + # diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/main.c b/2.5/boards/at91sam7x-ek/benchmark/context_switch/main.c new file mode 100644 index 00000000..ef29fb02 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/main.c @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel context switch benchmark. + * + * This benchmark measures the overhead (in µs) required to deliver a + * signal and switch from a low-priority process to a high-priority process. + * + * The measure is made by the high-precision timer if supported by the + * architecture. Alternatively, the time can also be measured using an external + * oscilloscope connected to the board's status LED. + */ + +#include + +int main(void) +{ + context_switch(); + while (1) + { + } + + return 0; +} + diff --git a/2.5/boards/at91sam7x-ek/benchmark/context_switch/project.bertos b/2.5/boards/at91sam7x-ek/benchmark/context_switch/project.bertos new file mode 100644 index 00000000..75fb2885 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/context_switch/project.bertos @@ -0,0 +1,81 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V48023000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vcontext_switch +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Varm-none-eabi +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V/scratch/julian/2009q3-respin-eabi-lite/src/gcc-4.4/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2009q3-68' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin +p15 +sVversion +p16 +V4.4.1 +p17 +sVbuild +p18 +VSourcery G++ Lite 2009q3-68 +p19 +sVpath +p20 +V/localhome/toolchain/arm/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'kernel' +p25 +aS'formatwr' +p26 +aS'kfile' +p27 +aS'context_switch' +p28 +aS'heap' +p29 +aS'signal' +p30 +aS'timer' +p31 +asS'CPU_NAME' +p32 +VAT91SAM7X256 +p33 +sS'PROJECT_HW_PATH' +p34 +S'../..' +p35 +sS'PROJECT_SRC_PATH' +p36 +S'.' +p37 +sS'PRESET' +p38 +I01 +sS'OUTPUT' +p39 +(lp40 +s. \ No newline at end of file diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/.spec b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/.spec new file mode 100644 index 00000000..5a527bef --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/.spec @@ -0,0 +1,14 @@ +name = 'BeRTOS Kernel footprint' +description=""" +

+This benchmark measures the memory footprint of the BeRTOS kernel with a +simple minimalist user application. +

+

+The purpose of this test is to give a measure of the required space in a +generic flash memory to store a full-featured BeRTOS kernel. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_adc.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_afsk.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_afsk.h new file mode 100644 index 00000000..d8bc1d56 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_afsk.h @@ -0,0 +1,114 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ax25.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_battfs.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_context_switch.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_dataflash.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_dc_motor.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_debug.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_fat.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_flash25.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_formatwr.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_gfx.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_hashtable.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_heap.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_i2c.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_i2c.h new file mode 100644 index 00000000..af36e6b6 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_i2c.h @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_i2s.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ini_reader.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_kbd.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_keytag.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_kfile.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_lm75.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_md2.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_menu.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_monitor.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_nmea.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_parser.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_phase.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_pocketbus.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_proc.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_proc.h new file mode 100644 index 00000000..ab1a4680 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_pwm.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ramp.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_randpool.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_sem.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ser.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_signal.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_stepper.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_tas5706a.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_thermo.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_timer.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_wdt.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_xmodem.h b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/kernel_footprint.mk b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/kernel_footprint.mk new file mode 100644 index 00000000..4aa72137 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/kernel_footprint.mk @@ -0,0 +1,94 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_footprint_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += kernel_footprint + +kernel_footprint_PREFIX = "arm-none-eabi-" + +kernel_footprint_SUFFIX = "" + +kernel_footprint_SRC_PATH = boards/at91sam7x-ek/benchmark/kernel_footprint + +kernel_footprint_HW_PATH = boards/at91sam7x-ek + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CSRC INSTEAD! +kernel_footprint_WIZARD_CSRC = \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/kern/signal.c \ + bertos/mware/event.c \ + bertos/kern/sem.c \ + bertos/cpu/arm/drv/sysirq_at91.c \ + bertos/struct/heap.c \ + bertos/mware/formatwr.c \ + bertos/cpu/arm/drv/timer_at91.c \ + bertos/drv/timer.c \ + bertos/kern/kfile.c \ + bertos/kern/proc.c \ + bertos/benchmark/kernel_footprint.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_PCSRC INSTEAD! +kernel_footprint_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CPPASRC INSTEAD! +kernel_footprint_WIZARD_CPPASRC = \ + bertos/cpu/arm/hw/switch_ctx_arm.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CXXSRC INSTEAD! +kernel_footprint_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_ASRC INSTEAD! +kernel_footprint_WIZARD_ASRC = \ + \ + # + +kernel_footprint_CPPFLAGS = -D'CPU_FREQ=(48023000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_footprint_HW_PATH) -I$(kernel_footprint_SRC_PATH) $(kernel_footprint_CPU_CPPFLAGS) $(kernel_footprint_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_LDFLAGS = $(kernel_footprint_CPU_LDFLAGS) $(kernel_footprint_WIZARD_LDFLAGS) $(kernel_footprint_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPAFLAGS = $(kernel_footprint_CPU_CPPAFLAGS) $(kernel_footprint_WIZARD_CPPAFLAGS) $(kernel_footprint_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CSRC = $(kernel_footprint_CPU_CSRC) $(kernel_footprint_WIZARD_CSRC) $(kernel_footprint_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_PCSRC = $(kernel_footprint_CPU_PCSRC) $(kernel_footprint_WIZARD_PCSRC) $(kernel_footprint_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPASRC = $(kernel_footprint_CPU_CPPASRC) $(kernel_footprint_WIZARD_CPPASRC) $(kernel_footprint_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CXXSRC = $(kernel_footprint_CPU_CXXSRC) $(kernel_footprint_WIZARD_CXXSRC) $(kernel_footprint_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_ASRC = $(kernel_footprint_CPU_ASRC) $(kernel_footprint_WIZARD_ASRC) $(kernel_footprint_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_at91.S +kernel_footprint_CPU_CPPAFLAGS = -g -gdwarf-2 +kernel_footprint_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_AT91SAM7X256__ +kernel_footprint_CPU_CSRC = bertos/cpu/arm/hw/init_at91.c +kernel_footprint_PROGRAMMER_CPU = at91sam7 +kernel_footprint_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_footprint_CPU = arm7tdmi +kernel_footprint_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_footprint_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +kernel_footprint_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/at91sam7_256_rom.ld +kernel_footprint_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(kernel_footprint_SRC_PATH)/kernel_footprint_user.mk diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/kernel_footprint_user.mk b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/kernel_footprint_user.mk new file mode 100644 index 00000000..9e2bc5f6 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/kernel_footprint_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_footprint_PROGRAMMER_TYPE = none +kernel_footprint_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_footprint_USER_CSRC = \ + $(kernel_footprint_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_footprint_USER_PCSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_ASRC = \ + # + +# Flags included by the user. +kernel_footprint_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + -Os \ + # diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/main.c b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/main.c new file mode 100644 index 00000000..a3f11e50 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/main.c @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel footprint benchmark. + * + * This benchmark measures the memory footprint[1] of the BeRTOS kernel with a + * simple minimalist user application. + * + * The purpose of this test is to give a measure of the required space in a + * generic flash memory to store a full-featured BeRTOS kernel. + * + * [1] http://en.wikipedia.org/wiki/Memory_footprint + */ + +#include + +int main(void) +{ + kernel_footprint(); + while (1) + { + } + + return 0; +} + diff --git a/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/project.bertos b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/project.bertos new file mode 100644 index 00000000..9336ef95 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/benchmark/kernel_footprint/project.bertos @@ -0,0 +1,85 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V48023000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel_footprint +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Varm-none-eabi +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V/scratch/julian/2009q3-respin-eabi-lite/src/gcc-4.4/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2009q3-68' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin +p15 +sVversion +p16 +V4.4.1 +p17 +sVbuild +p18 +VSourcery G++ Lite 2009q3-68 +p19 +sVpath +p20 +V/localhome/toolchain/arm/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'kernel' +p24 +aS'formatwr' +p25 +aS'kfile' +p26 +aS'semaphores' +p27 +aS'msg' +p28 +aS'kernel_footprint' +p29 +aS'heap' +p30 +aS'signal' +p31 +aS'timer' +p32 +asS'CPU_NAME' +p33 +VAT91SAM7X256 +p34 +sS'PROJECT_HW_PATH' +p35 +S'../..' +p36 +sS'PROJECT_SRC_PATH' +p37 +S'.' +p38 +sS'PRESET' +p39 +I01 +sS'OUTPUT' +p40 +(lp41 +S'codelite' +p42 +as. \ No newline at end of file diff --git a/2.5/boards/at91sam7x-ek/examples/.spec b/2.5/boards/at91sam7x-ek/examples/.spec new file mode 100644 index 00000000..d244bbf6 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/.spec @@ -0,0 +1,3 @@ +name="Examples" +ord=1 +description="Full working example projects." diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/.spec b/2.5/boards/at91sam7x-ek/examples/sd_fat/.spec new file mode 100644 index 00000000..138e7b36 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/.spec @@ -0,0 +1,28 @@ +name = 'SD card datalogger' +description=""" +

SD card datalogger

+ +

Overview

+

+The purpose of this project is to create a temperature and pressure logger. +<\p> + +

+The logger measures and stores temperature and pressure readings on a SD card +using the FAT filesystem, so the user can easily download the stored data by +plugging the SD card straight into a PC. Data can then be graphed, printed or +exported to any other application. +<\p> + +

+The user can also easily setup different parameters (like the logging rate, the +filename that represents the log, etc.) without reporgramming the device, +using the "BeRTOS ini reader" module. +<\p> + +

+For schematics and up to date information on this project, +check the SD card datalogger +page on the BeRTOS site. +

+""" diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_adc.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_afsk.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_afsk.h new file mode 100644 index 00000000..d8bc1d56 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_afsk.h @@ -0,0 +1,114 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ax25.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_battfs.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_context_switch.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_dataflash.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_dc_motor.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_debug.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_fat.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_flash25.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_formatwr.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_gfx.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_heap.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_i2c.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_i2c.h new file mode 100644 index 00000000..af36e6b6 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_i2c.h @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_i2s.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ini_reader.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_kbd.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_kfile.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_kfile.h new file mode 100644 index 00000000..1b1989c9 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_kfile.h @@ -0,0 +1,62 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 1 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_lcd_32122a.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_lcd_hd44.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_lm75.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_md2.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_menu.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_monitor.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_nmea.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_phase.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_pocketbus.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_proc.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_proc.h new file mode 100644 index 00000000..4a1deb29 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_proc.h @@ -0,0 +1,108 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 0 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 0 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 0 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_pwm.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ramp.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_randpool.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_sem.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ser.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_signal.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_signal.h new file mode 100644 index 00000000..e78a4519 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 0 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_spi_bitbang.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_stepper.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_tas5706a.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_thermo.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_timer.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_wdt.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_xmodem.h b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_xmodem.h new file mode 100644 index 00000000..2d8f04cd --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/cfg/cfg_xmodem.h @@ -0,0 +1,81 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/main.c b/2.5/boards/at91sam7x-ek/examples/sd_fat/main.c new file mode 100644 index 00000000..892a6004 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/main.c @@ -0,0 +1,413 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Simple application that implement a log device, running on the AT91SAM7X-EK board. + * + * The main scope of this application is to show you how use the SD memory card and read and write + * settings and logs. Thanks the ini parser module we can read settings, stored on memory card, + * and change the application behaviour. + * Generally the application work in this way: + * - Try to access to SD memory card, if it is present we read the inifile + * - If we have read correctly from SD, we compute the value that we want log + * (temperature, pressure and supplay voltage) + * - If we have enable (from ini file) to log on the file we write the log on it. + * - If we have enable (from ini file) to log on the serial we write the log on it. + * - wait the sample_time (from ini file) + * - contine from beginning. + * + * Here we put the ini file that this example uses. To use it copy + * the folling configutation line into the file called sd_fat.ini (or see INI_FILE_NAME + * define if you want chande the name). + * \code + * + * # Bertos SD fat project example + * # + * # Basic configurarion + * # + * + * [log] + * # Name of log file + * name = test.log + * # Enable the logging on serial device (enable = 1, disable = 0) + * log_on_serial = 1 + * # Enable logging on sd file (enable = 1, disable = 0) + * log_on_file = 1 + * # Period between two log in millisecond + * sample_time = 1000 + * + * [serial_log] + * # Select serial port where log + * port = 0 + * # Serial port baudrate + * baud = 115200 + * + * [log_format] + * # Default text to insert on each log line + * line_header = BeRTOS Log: + * # Use this char to separate each log field + * field_sep = ; + * + * [temperature] + * unit_label = C + * + * [pressure] + * unit_label = hPa + * + * [voltage] + * unit_label = V + * + * \endcode + */ + +#include + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL 3 +#define LOG_VERBOSITY 0 +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include + +#include +#include +#include + +/* + * Setting structure define + */ +typedef struct INISetting +{ + // INI Log section + char name[80]; ///< Name of log file + bool log_on_serial; ///< Enable the logging on serial device + bool log_on_file; ///< Enable logging on sd file + mtime_t sample_time; ///< Period between two log (millisecond) + + //INI serial log section + int port; ///< Select serial port where log + int baud; ///< Serial port baudrate + + // INI log format section + char line_header[80]; ///< Default text to insert on each log line + char field_sep[10]; ///< Use this char to separate each log field + + // INI temperature section + char temp_unit_label[10]; ///< Default label for measure unit + + // INI pressure section + char press_unit_label[10]; ///< Default label for measure unit + + // INI voltage section + char voltage_unit_label[10]; ///< Default label for measure unit + + +} INISetting; + +/* + * Setting and various defines. + */ +#define INI_FILE_NAME "sd_fat.ini" ///< Default ini file name on SD card. + +// INI Log section +#define LOG_SECTION "log" ///< Log section +#define LOG_NAME_KEY "name" ///< Name of log file +#define LOG_ON_SERIAL "log_on_serial" ///< Enable the logging on serial device +#define LOG_ON_FILE "log_on_file" ///< Enable logging on sd file +#define LOG_SAMPLE_TIME "sample_time" ///< Period between two log + +//INI serial log section +#define SERIAL_LOG "serial_log" ///< Serial log section +#define SERIAL_PORT "port" ///< Select serial port where log +#define SERIAL_BAUD "baud" ///< Serial port baudrate + +// INI log format section +#define LOG_FORMAT_SEC "log_format" ///< log format section +#define FORMAT_LINE_HEADER "line_header" ///< Default text to insert on each log line +#define FORMAT_FIELD_SEP "field_sep" ///< Use this char to separate each log field + +// INI temperature section +#define TEMPERATURE "temperature" ///< temperarute section +#define TEMP_UNIT_LABEL "unit_label" ///< Default label for measure unit + +// INI pressure section +#define PRESSURE "pressure" ///< pressure section +#define PRESS_UNIT_LABEL "unit_label" ///< Default label for measure unit + +// INI voltsge section +#define VOLTAGE "voltage" ///< voltage section +#define VOLTAGE_UNIT_LABEL "unit_label" ///< Default label for measure unit + +/** + * Voltage reference in volts for ADC. + * \note This value should be complied to jumper J13 on AT91SAM7X-EK board, and + * the supply voltade for sensor. + * See schamatics for more info. + */ +#define ADC_VOLTAGE_REF 3300 +/** + * Channel where the sensor we connect it (AD6) + * See schamatics for more info. + */ +#define PRESSURE_SENSOR_CH 6 + +/** + * ADC channle to read voltage supplay + * \note we connect board power supplay (+3.3V) to AD3 port with wire. + */ +#define SUPPLAY_VOLTAGE_CH 3 +#define ADC_SUPPLAY_VOLTAGE 3300 + +/* + * Static definition for application devices. + */ +static SpiDmaAt91 spi_dma; +static Serial temp_sensor_bus; +static Serial log_port; + +static void init(void) +{ + IRQ_ENABLE; + kdbg_init(); + + timer_init(); + LOG_INFO("TIMER init..ok\n"); + + /* + * Init temperature sensor device. + * - init the temperature driver + * - init the spi communication channel + */ + tmp123_init(); + // Init SPI connected to sensor temperature + spimaster_init(&temp_sensor_bus, SER_SPI1); + ser_setbaudrate(&temp_sensor_bus, 1000000L); + LOG_INFO("TMP123 sensor init..ok\n"); + + // Init SPI bus to communicate to SD card + spi_dma_init(&spi_dma); + spi_dma_setclock(20000000L); + LOG_INFO("SD SPI init..ok\n"); + + adc_init(); + LOG_INFO("ADC init..ok\n"); + +} + +int main(void) +{ + // SD fat filesystem context + FATFS fs; + + // Context files that we would manage + FatFile ini_file; + FatFile log_file; + + init(); + + LOG_INFO("SD fat example project %s: %d times\n", VERS_HOST, VERS_BUILD); + + while (1) + { + bool sd_ok = true; + FRESULT result; + + // Setting info + INISetting ini_set; + memset(&ini_set, 0, sizeof(ini_set)); + + sd_ok = sd_init(&spi_dma.fd); + + if (sd_ok) + { + LOG_INFO("Mount FAT filesystem.\n"); + if ((result = f_mount(0, &fs)) != FR_OK) + { + LOG_ERR("Mounting FAT volumes error[%d]\n", result); + sd_ok = false; + } + + LOG_INFO("Read setting from ini file: %s\n", INI_FILE_NAME); + if (sd_ok && ((result = fatfile_open(&ini_file, INI_FILE_NAME, FA_READ)) != FR_OK)) + { + LOG_ERR("Could not open ini file: %s error[%d,]\n", INI_FILE_NAME, result); + sd_ok = false; + } + + if (sd_ok) + { + /* + * If sd is ok, we read all setting from INI file. + * NOTE: if one ini key or section was not found into INI + * file, the iniparser return the defaul value. + */ + ini_getString(&ini_file.fd, LOG_SECTION, LOG_NAME_KEY, "default.log", ini_set.name, sizeof(ini_set.name)); + LOG_INFO("Log file name [%s]\n", ini_set.name); + + char tmp[25]; + ini_getString(&ini_file.fd, LOG_SECTION, LOG_ON_SERIAL, "1", tmp, sizeof(tmp)); + ini_set.log_on_serial = atoi(tmp); + LOG_INFO("Log serial [%d]\n", ini_set.log_on_serial); + ini_getString(&ini_file.fd, LOG_SECTION, LOG_ON_FILE, "1", tmp, sizeof(tmp)); + ini_set.log_on_file = atoi(tmp); + LOG_INFO("Log sd [%d]\n", ini_set.log_on_file); + ini_getString(&ini_file.fd, LOG_SECTION, LOG_SAMPLE_TIME, "500", tmp, sizeof(tmp)); + ini_set.sample_time = atoi(tmp); + LOG_INFO("Sample time [%ld]\n", ini_set.sample_time); + + ini_getString(&ini_file.fd, SERIAL_LOG, SERIAL_PORT, "0", tmp, sizeof(tmp)); + ini_set.port = atoi(tmp); + LOG_INFO("Serial port [%d]\n", ini_set.port); + ini_getString(&ini_file.fd, SERIAL_LOG, SERIAL_BAUD, "115200", tmp, sizeof(tmp)); + ini_set.baud = atoi(tmp); + LOG_INFO("Serial buad [%d]\n", ini_set.baud); + + ini_getString(&ini_file.fd, LOG_FORMAT_SEC, FORMAT_LINE_HEADER, "BeRTOS: ", ini_set.line_header, sizeof(ini_set.line_header)); + LOG_INFO("Serial line header[%s]\n", ini_set.line_header); + + ini_getString(&ini_file.fd, LOG_FORMAT_SEC, FORMAT_FIELD_SEP, ",", ini_set.field_sep, sizeof(ini_set.field_sep)); + LOG_INFO("Serial char sep[%s]\n", ini_set.field_sep); + + ini_getString(&ini_file.fd, TEMPERATURE, TEMP_UNIT_LABEL, "C", ini_set.temp_unit_label, sizeof(ini_set.temp_unit_label)); + LOG_INFO("Temp unit label[%s]\n", ini_set.temp_unit_label); + + ini_getString(&ini_file.fd, PRESSURE, PRESS_UNIT_LABEL, "hPa", ini_set.press_unit_label, sizeof(ini_set.press_unit_label)); + LOG_INFO("Press unit label[%s]\n", ini_set.press_unit_label); + + ini_getString(&ini_file.fd, VOLTAGE, VOLTAGE_UNIT_LABEL, "V", ini_set.voltage_unit_label, sizeof(ini_set.voltage_unit_label)); + LOG_INFO("Press unit label[%s]\n", ini_set.voltage_unit_label); + + } + } + + if (ini_set.log_on_serial) + { + // Init serial log port + ser_init(&log_port, ini_set.port); + ser_setbaudrate(&log_port, ini_set.baud); + LOG_INFO("SERIAL init..port[%d] buad[%d]\n", ini_set.port, ini_set.baud); + } + + char log_string[160]; + memset(log_string, 0, sizeof(log_string)); + + // Supplay voltage + uint16_t vdd = ADC_RANGECONV(adc_read(SUPPLAY_VOLTAGE_CH), 0, ADC_SUPPLAY_VOLTAGE); + + // Read temperature + int16_t tmp = tmp123_read(&temp_sensor_bus.fd); + + // Read pressure + uint16_t vout = ADC_RANGECONV(adc_read(PRESSURE_SENSOR_CH), 0, vdd); + int16_t press = mpxx6115a_press(vout, vdd); + + /* + * Format string whit read data + * line_header + temp + temp_unit_label + field_sep + press + press_unit_label + field_sep + vdd + voltage_unit_label + */ + int wr_len = sprintf(log_string, "%s%d.%01d%s%s%d%s%s%d.%d%s\r\n", ini_set.line_header, + tmp / 10, ABS(tmp % 10), + ini_set.temp_unit_label, + ini_set.field_sep, + press, + ini_set.press_unit_label, + ini_set.field_sep, + vdd / 1000, ABS(vdd % 1000), + ini_set.voltage_unit_label); + + + /* + * if SD is ok, try to open log file and write our data and, only + * if by configuration we have enable the log on file + */ + if (sd_ok && ini_set.log_on_file) + { + // Open log file and do not overwrite the previous log file + result = fatfile_open(&log_file, ini_set.name, FA_OPEN_EXISTING | FA_WRITE); + + // If the log file there isn't we create the new one + if (result == FR_NO_FILE) + { + result = fatfile_open(&log_file, ini_set.name, FA_CREATE_NEW | FA_WRITE); + LOG_INFO("Create the log file: %s\n", ini_set.name); + } + + if ( result == FR_OK) + { + LOG_INFO("Opened log file '%s' size %ld\n", ini_set.name, log_file.fat_file.fsize); + + // To append data we should go to end of file before to start to write + kfile_seek(&log_file.fd, 0, KSM_SEEK_END); + + int len = kfile_write(&log_file.fd, log_string, wr_len); + + // Flush data and close the files. + kfile_flush(&log_file.fd); + kfile_close(&log_file.fd); + + // Unmount always to prevent accidental sd remove. + f_mount(0, NULL); + LOG_INFO("Wrote [%d]\n", len); + } + else + { + LOG_ERR("Unable to open file: '%s' error[%d]\n", ini_set.name, result); + } + } + + // If by configuration we have enable the log on serial, we log it + if (ini_set.log_on_serial) + kfile_write(&log_port.fd, log_string, wr_len); + + timer_delay(ini_set.sample_time); + } + + return 0; +} + diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/project.bertos b/2.5/boards/at91sam7x-ek/examples/sd_fat/project.bertos new file mode 100644 index 00000000..4834b572 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/project.bertos @@ -0,0 +1,91 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V48023000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vsd_fat +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Varm-none-eabi +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V/scratch/julian/lite-respin/eabi/src/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --disable-shared --with-newlib --with-pkgversion='Sourcery G++ Lite 2008q3-66' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/lite-respin/eabi/install/arm-none-eabi --with-gmp=/scratch/julian/lite-respin/eabi/obj/host-libs-2008q3-66-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/lite-respin/eabi/obj/host-libs-2008q3-66-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/lite-respin/eabi/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/lite-respin/eabi/install/arm-none-eabi/bin +p15 +sVversion +p16 +V4.3.2 +p17 +sVbuild +p18 +VSourcery G++ Lite 2008q3-66 +p19 +sVpath +p20 +V/localhome/toolchain/arm/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'tmp123' +p25 +aS'formatwr' +p26 +aS'sd' +p27 +aS'adc' +p28 +aS'sprintf' +p29 +aS'kfile' +p30 +aS'fat' +p31 +aS'timer' +p32 +aS'kfilefifo' +p33 +aS'ini_reader' +p34 +aS'debug' +p35 +asS'CPU_NAME' +p36 +VAT91SAM7X256 +p37 +sS'PROJECT_HW_PATH' +p38 +S'../..' +p39 +sS'PROJECT_SRC_PATH' +p40 +S'.' +p41 +sS'PRESET' +p42 +I01 +sS'OUTPUT' +p43 +(lp44 +S'codelite' +p45 +as. \ No newline at end of file diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/sd_fat.mk b/2.5/boards/at91sam7x-ek/examples/sd_fat/sd_fat.mk new file mode 100644 index 00000000..6a0cf557 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/sd_fat.mk @@ -0,0 +1,102 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the sd_fat_user.mk file instead. +# + +# Constants automatically defined by the selected modules +sd_fat_DEBUG = 1 + +# Our target application +TRG += sd_fat + +sd_fat_PREFIX = "arm-none-eabi-" + +sd_fat_SUFFIX = "" + +sd_fat_SRC_PATH = boards/at91sam7x-ek/examples/sd_fat + +sd_fat_HW_PATH = boards/at91sam7x-ek + +# Files automatically generated by the wizard. DO NOT EDIT, USE sd_fat_USER_CSRC INSTEAD! +sd_fat_WIZARD_CSRC = \ + bertos/cpu/arm/drv/timer_at91.c \ + bertos/struct/kfile_fifo.c \ + bertos/fs/fat.c \ + bertos/kern/kfile.c \ + bertos/drv/tmp123.c \ + bertos/mware/ini_reader.c \ + bertos/cpu/arm/drv/sysirq_at91.c \ + bertos/cpu/arm/drv/adc_arm.c \ + bertos/cpu/arm/drv/ser_arm.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/cpu/arm/drv/ser_at91.c \ + bertos/drv/adc.c \ + bertos/mware/sprintf.c \ + bertos/drv/timer.c \ + bertos/fs/fatfs/ff.c \ + bertos/mware/event.c \ + bertos/cpu/arm/drv/adc_at91.c \ + bertos/mware/formatwr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + bertos/drv/sd.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE sd_fat_USER_PCSRC INSTEAD! +sd_fat_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE sd_fat_USER_CPPASRC INSTEAD! +sd_fat_WIZARD_CPPASRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE sd_fat_USER_CXXSRC INSTEAD! +sd_fat_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE sd_fat_USER_ASRC INSTEAD! +sd_fat_WIZARD_ASRC = \ + \ + # + +sd_fat_CPPFLAGS = -D'CPU_FREQ=(48023000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(sd_fat_HW_PATH) -I$(sd_fat_SRC_PATH) $(sd_fat_CPU_CPPFLAGS) $(sd_fat_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +sd_fat_LDFLAGS = $(sd_fat_CPU_LDFLAGS) $(sd_fat_WIZARD_LDFLAGS) $(sd_fat_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +sd_fat_CPPAFLAGS = $(sd_fat_CPU_CPPAFLAGS) $(sd_fat_WIZARD_CPPAFLAGS) $(sd_fat_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +sd_fat_CSRC = $(sd_fat_CPU_CSRC) $(sd_fat_WIZARD_CSRC) $(sd_fat_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +sd_fat_PCSRC = $(sd_fat_CPU_PCSRC) $(sd_fat_WIZARD_PCSRC) $(sd_fat_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +sd_fat_CPPASRC = $(sd_fat_CPU_CPPASRC) $(sd_fat_WIZARD_CPPASRC) $(sd_fat_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +sd_fat_CXXSRC = $(sd_fat_CPU_CXXSRC) $(sd_fat_WIZARD_CXXSRC) $(sd_fat_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +sd_fat_ASRC = $(sd_fat_CPU_ASRC) $(sd_fat_WIZARD_ASRC) $(sd_fat_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +sd_fat_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_at91.S +sd_fat_CPU_CPPAFLAGS = -g -gdwarf-2 +sd_fat_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_AT91SAM7X256__ +sd_fat_CPU_CSRC = bertos/cpu/arm/hw/init_at91.c +sd_fat_PROGRAMMER_CPU = at91sam7 +sd_fat_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/at91sam7_256_rom.ld +sd_fat_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +sd_fat_CPU = arm7tdmi +sd_fat_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +sd_fat_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +sd_fat_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(sd_fat_SRC_PATH)/sd_fat_user.mk diff --git a/2.5/boards/at91sam7x-ek/examples/sd_fat/sd_fat_user.mk b/2.5/boards/at91sam7x-ek/examples/sd_fat/sd_fat_user.mk new file mode 100644 index 00000000..a007e43e --- /dev/null +++ b/2.5/boards/at91sam7x-ek/examples/sd_fat/sd_fat_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +sd_fat_PROGRAMMER_TYPE = none +sd_fat_PROGRAMMER_PORT = none + +# Files included by the user. +sd_fat_USER_CSRC = \ + $(sd_fat_SRC_PATH)/main.c \ + bertos/cpu/arm/drv/spi_dma_at91.c \ + # + +# Files included by the user. +sd_fat_USER_PCSRC = \ + # + +# Files included by the user. +sd_fat_USER_CPPASRC = \ + # + +# Files included by the user. +sd_fat_USER_CXXSRC = \ + # + +# Files included by the user. +sd_fat_USER_ASRC = \ + # + +# Flags included by the user. +sd_fat_USER_LDFLAGS = \ + # + +# Flags included by the user. +sd_fat_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +sd_fat_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/at91sam7x-ek/hw/hw_afsk.c b/2.5/boards/at91sam7x-ek/hw/hw_afsk.c new file mode 100644 index 00000000..8adb432d --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_afsk.c @@ -0,0 +1,41 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * + * \author Francesco Sacchi + */ + + +#include "hw_afsk.h" + diff --git a/2.5/boards/at91sam7x-ek/hw/hw_afsk.h b/2.5/boards/at91sam7x-ek/hw/hw_afsk.h new file mode 100644 index 00000000..ec9b8be2 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_afsk.h @@ -0,0 +1,87 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_AFSK_H +#define HW_AFSK_H + +#include "cfg/cfg_arch.h" + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Initialize the specified channel of the ADC for AFSK needs. + * The adc should be configured to have a continuos stream of convertions. + * For every convertion there must be an ISR that read the sample + * and call afsk_adc_isr(), passing the context and the sample. + * + * \param ch channel to be used for AFSK demodulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_adc_isr() for every convertion. + */ +#define AFSK_ADC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) + +#define AFSK_STROBE_INIT() do { /* Implement me */ } while (0) +#define AFSK_STROBE_ON() do { /* Implement me */ } while (0) +#define AFSK_STROBE_OFF() do { /* Implement me */ } while (0) + +/** + * Initialize the specified channel of the DAC for AFSK needs. + * The DAC has to be configured in order to call an ISR for every sample sent. + * The DAC doesn't have to start the IRQ immediatly but have to wait + * the AFSK driver to call AFSK_DAC_IRQ_START(). + * The ISR must then call afsk_dac_isr() passing the AFSK context. + * \param ch DAC channel to be used for AFSK modulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_dac_isr() for every convertion. + */ +#define AFSK_DAC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) + +/** + * Start DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_START(ch) do { (void)ch; /* Implement me */ } while (0) + +/** + * Stop DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_STOP(ch) do { (void)ch; /* Implement me */ } while (0) + +#endif /* HW_AFSK_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_buzzer.h b/2.5/boards/at91sam7x-ek/hw/hw_buzzer.h new file mode 100644 index 00000000..858ecbfb --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_buzzer.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Buzzer hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_BUZZER_H +#define HW_BUZZER_H + +#warning TODO:This is an example implementation, you must implement it! + +#define BUZZER_BIT 1 +#define IS_BUZZER_ON 0 +#define BUZZER_HW_INIT do { /* Implement me! */ } while (0) +#define BUZZER_ON do { /* Implement me! */ } while (0) +#define BUZZER_OFF do { /* Implement me! */ } while (0) + +#endif /* HW_BUZZER_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_dataflash.c b/2.5/boards/at91sam7x-ek/hw/hw_dataflash.c new file mode 100644 index 00000000..844dd922 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_dataflash.c @@ -0,0 +1,126 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_dataflash.h" + +#include +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +MOD_DEFINE(hw_dataflash); + +/** + * Data flash init function. + * + * This function provide to initialize all that + * needs to drive a dataflash memory. + * Generaly needs to init pins to drive a CS line + * and reset line. + */ +void dataflash_hw_init(void) +{ + + //Disable CS line (remove if not needed) + dataflash_hw_setCS(false); + + /* + * Put here your code! + * + * Note: + * - if you drive manualy CS line, here init a CS pin + * - if you use a dedicated reset line, here init a reset pin + */ + + MOD_INIT(hw_dataflash); +} + +/** + * Chip Select drive. + * + * This function enable or disable a CS line. + * You must implement this function comply to a dataflash + * memory datasheet to allow the drive to enable a memory + * when \p enable flag is true, and disable it when is false. + */ +void dataflash_hw_setCS(bool enable) +{ + if (enable) + { + /* + * Put here your code to enable + * dataflash memory + */ + } + else + { + /* + * Put here your code to disable + * dataflash memory + */ + } +} + +/** + * Reset data flash memory. + * + * This function provide to send reset signal to + * dataflash memory. You must impement it comly to a dataflash + * memory datasheet to allow the drive to set a reset pin + * when \p enable flag is true, and disable it when is false. + * + */ +void dataflash_hw_setReset(bool enable) +{ + if (enable) + { + /* + * Put here your code to set reset of + * dataflash memory + */ + } + else + { + /* + * Put here your code to clear reset of + * dataflash memory + */ + } +} + diff --git a/2.5/boards/at91sam7x-ek/hw/hw_dataflash.h b/2.5/boards/at91sam7x-ek/hw/hw_dataflash.h new file mode 100644 index 00000000..5254446b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_dataflash.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines (interface). + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_DATAFLASH_H +#define HW_DATAFLASH_H + +#include + +void dataflash_hw_init(void); +void dataflash_hw_setCS(bool enable); +void dataflash_hw_setReset(bool enable); + +#endif /* HW_DATAFLASH_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_dc_motor.h b/2.5/boards/at91sam7x-ek/hw/hw_dc_motor.h new file mode 100644 index 00000000..f39388df --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_dc_motor.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief DC motor hardware-specific definitions + * + * \author Daniele Basile + */ + +#ifndef HW_DC_MOTOR_H +#define HW_DC_MOTOR_H + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Define fuctions which read adc value from specific device + */ + #define HW_DC_MOTOR_READ_VALUE(dev, min, max) \ + ({ \ + /* Put here the fuction that read from ADC */ \ + (void)(dev); \ + (void)(min); \ + (void)(max); \ + (0); \ + }) + +// Macro that enable the select DC motor +#define DC_MOTOR_ENABLE(dev) /* Implement me! */ +// Macro that disable the select DC motor +#define DC_MOTOR_DISABLE(dev) /* Implement me! */ + +// Macro that left the DC motor rotor float +#define DC_MOTOR_STOP_FLOAT(dev) DC_MOTOR_DISABLE(dev) +// Macro that put in short circuit DC motor supply pins +#define DC_MOTOR_STOP_BRAKED(dev) do { /* Implement me! */ } while (0) + +// Macro that set motor direction +#define DC_MOTOR_SET_DIR(dev, dir) do { /* Implement me! */ } while (0) + +#define MOTOR_DC_INIT() do { /* Implement me! */ } while (0) + + +#endif /* HW_DC_MOTOR_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_ft245rl.h b/2.5/boards/at91sam7x-ek/hw/hw_ft245rl.h new file mode 100644 index 00000000..cc0c8193 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_ft245rl.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief FT245RL USB interface hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_FT245RL_H +#define HW_FT245RL_H + +#warning TODO:This is an example implementation, you must implement it! + +#define FT245RL_DATA_IN() /* Implement me! */ +#define FT245RL_DATA_OUT() /* Implement me! */ +#define WR_HI /* Implement me! */ +#define WR_LO /* Implement me! */ + +#define RD_HI /* Implement me! */ +#define RD_LO /* Implement me! */ + +#define FT245RL_INIT() \ +do \ +{ \ + /* Implement me! */ \ +} while(0) + +#define FT245RL_DATA_RDY() (/* Implement me! */ false) +#define FT245RL_GETDATA() ({/* Implement me! */ (0);}) +#define FT245RL_TX_ALLOWED() (/* Implement me! */ false) +#define FT245RL_SETDATA(data) do {/* Implement me! */ (void)((data)); } while(0) + +#endif /* HW_FT245RL_H */ + diff --git a/2.5/boards/at91sam7x-ek/hw/hw_i2c_bitbang.h b/2.5/boards/at91sam7x-ek/hw/hw_i2c_bitbang.h new file mode 100644 index 00000000..4822af7c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_i2c_bitbang.h @@ -0,0 +1,66 @@ +/** + * \file + * + * + * \brief Macro for I2C bitbang operation. + * + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_I2C_BITBANG_H +#define HW_I2C_BITBANG_H + +#warning TODO:This is an example implementation, you must implement it! + +#define SDA_HI do { /* Implement me:Set SDA High by setting SDA pin as input */ } while (0) +#define SDA_LO do { /* Implement me:Set SDA Low by setting SDA pin as open collector output */ } while (0) +#define SCL_HI do { /* Implement me:Set SCL High by setting SCL pin as input */ } while (0) +#define SCL_LO do { /* Implement me:Set SCL Low by setting SCL pin as open collector output */ } while (0) + + +#define SCL_IN (true) /* Implement me: read SDA pin state */ +#define SDA_IN (true) /* Implement me: read SCL pin state */ + +/** + * This macro should set SDA and SCL lines as input. + */ +#define I2C_BITBANG_HW_INIT do { /* Implement me! */ } while (0) + +/** + * Half bit delay routine used to generate the correct timings. + */ +#define I2C_HALFBIT_DELAY() do { /* Implement me! */ } while (0) + +#endif /* HW_I2C_BITBANG_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_kbd.h b/2.5/boards/at91sam7x-ek/hw/hw_kbd.h new file mode 100644 index 00000000..9ca228cb --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_kbd.h @@ -0,0 +1,72 @@ +/** + * \file + * + * + * \brief Keyboard hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_H +#define HW_KBD_H + +#include "hw/kbd_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define K_RPT_MASK (K_UP | K_DOWN | K_OK | K_CANCEL) + +#define KBD_HW_INIT \ + do { \ + /* Put here code to init hw */ \ + } while (0) + +EXTERN_C int emul_kbdReadCols(void); + +/** + * Read the keyboard ports and return the mask of + * depressed keys. + */ +INLINE keymask_t kbd_readkeys(void) +{ + /* Implement me! */ + + //Only for test remove when implement this function + return 0; +} + +#endif /* HW_KBD_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_lcd_32122a.h b/2.5/boards/at91sam7x-ek/hw/hw_lcd_32122a.h new file mode 100644 index 00000000..6ec29c5c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_lcd_32122a.h @@ -0,0 +1,155 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_32122A_H +#define HW_LCD_32122A_H + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Predefined LCD PWM contrast values + */ +#define LCD_DEF_PWM 145 +#define LCD_MAX_PWM 505 +#define LCD_MIN_PWM 130 +#define LCD_PWM_CH 0 + + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_PE_E1 /* Implement me! */ +#define LCD_PE_E2 /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +#define LCD_PF_DB0 /* Implment me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_A0 do { /* Implement me! */ } while (0) +#define LCD_SET_A0 do { /* Implement me! */ } while (0) +#define LCD_CLR_RD do { /* Implement me! */ } while (0) +#define LCD_SET_RD do { /* Implement me! */ } while (0) +#define LCD_CLR_E1 do { /* Implement me! */ } while (0) +#define LCD_SET_E1 do { /* Implement me! */ } while (0) +#define LCD_CLR_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E(x) do { (void)x; /* Implement me! */ } while (0) +#define LCD_CLR_E(x) do { (void)x; /* Implement me! */ } while (0) +/*@}*/ + +/** + * \name Chip select bits for LCD_SET_E() + * @{ + */ +#define LCDF_E1 ( 0/* Implement me! */) +#define LCDF_E2 ( 0/* Implement me! */) +/*@}*/ +/** Read from the LCD data bus (DB[0-7]) */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/** Write to the LCD data bus (DB[0-7]) */ +#define LCD_READ (0 /* Implement me! */ ) + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ + +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + +#define LCD_32122_RESET() do { /* Implement me! */ } while (0) + +INLINE void lcd_32122a_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_32122A_H */ + diff --git a/2.5/boards/at91sam7x-ek/hw/hw_lcd_hd44.h b/2.5/boards/at91sam7x-ek/hw/hw_lcd_hd44.h new file mode 100644 index 00000000..dfebbcab --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_lcd_hd44.h @@ -0,0 +1,157 @@ +/** + * \file + * + * + * \brief LCD low-level hardware macros + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_HD44_H +#define HW_LCD_HD44_H + +#include "cfg/cfg_lcd_hd44.h" /* CONFIG_LCD_4BIT */ + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_E /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +/*@}*/ + +/** + * \name DB high nibble (DB[4-7]) + * @{ + */ + +#if CONFIG_LCD_4BIT + #define LCD_MASK (LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4) + #define LCD_SHIFT 4 +#else + #define LCD_MASK (uint8_t)0xff + #define LCD_SHIFT 0 +#endif +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_RS /* Implement me! */ +#define LCD_SET_RS /* Implement me! */ +#define LCD_CLR_RD /* Implement me! */ +#define LCD_SET_RD /* Implement me! */ +#define LCD_CLR_E /* Implement me! */ +#define LCD_SET_E /* Implement me! */ + +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +#if CONFIG_LCD_4BIT + #define LCD_WRITE_H(x) ((void)x)/* Implement me! */ + #define LCD_WRITE_L(x) ((void)x)/* Implement me! */ + #define LCD_READ_H ( 0 /* Implement me! */ ) + #define LCD_READ_L ( 0 /* Implement me! */ ) +#else + #define LCD_WRITE(x) ((void)x)/* Implement me! */ + #define LCD_READ (0 /* Implement me! */ ) +#endif +/*@}*/ + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + + +INLINE void lcd_hd44_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_HD44_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_led.h b/2.5/boards/at91sam7x-ek/hw/hw_led.h new file mode 100644 index 00000000..a28f7404 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_led.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Led on/off macros. + * + * \author Daniele Basile + */ + +#ifndef HW_LED_H +#define HW_LED_H + +#include + +#define LED_ON() PIOB_SODR = BV(22) +#define LED_OFF() PIOB_CODR = BV(22) + +#define LED_INIT() \ + do { \ + PIOB_PER = BV(22);\ + /* Disable pullups */ \ + PIOB_PUDR = BV(22); \ + /* Set PIO stepper power supply as output */ \ + PIOB_OER = BV(22); \ + /* Disable multidrive on all pins */ \ + PIOB_MDDR = BV(22); \ + } while(0) + +#endif /* HW_LED_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_lm75.h b/2.5/boards/at91sam7x-ek/hw/hw_lm75.h new file mode 100644 index 00000000..290dae09 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_lm75.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_LM75_H +#define HW_LM75_H + +#warning TODO:This is an example implentation, you must implement it! + +#define LM75_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_LM75_H */ + diff --git a/2.5/boards/at91sam7x-ek/hw/hw_mcp41.c b/2.5/boards/at91sam7x-ek/hw/hw_mcp41.c new file mode 100644 index 00000000..dc2a051c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_mcp41.c @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_mcp41.h" + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +const uint16_t mcp41_ports[MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; +const uint8_t mcp41_pins [MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; + diff --git a/2.5/boards/at91sam7x-ek/hw/hw_mcp41.h b/2.5/boards/at91sam7x-ek/hw/hw_mcp41.h new file mode 100644 index 00000000..645b6dac --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_mcp41.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_MCP41_H +#define HW_MCP41_H + +#include "hw/mcp41_map.h" + +#include + + +#warning TODO:This is an example implementation, you must implement it! + + +INLINE void SET_MCP41_DDR(Mcp41Dev dev) +{ + /* Implement me! */ + //Warning: this funtions is like avr target name, + //fix it to comply for all target. + + //Only for test remove when implement this function + (void)dev; +} + +INLINE void MCP41_ON(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void MCP41_OFF(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +#endif /* HW_MCP41_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_ntc.c b/2.5/boards/at91sam7x-ek/hw/hw_ntc.c new file mode 100644 index 00000000..3048725c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_ntc.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id$ + * \author Lorenzo Berni + * + */ + +#include +#include "hw/ntc_map.h" + +const res_t NTC_RSER[NTC_CNT]; +const res_t NTC_RPAR[NTC_CNT]; +const amp_t NTC_AMP[NTC_CNT]; +const NtcHwInfo* NTC_INFO[NTC_CNT]; diff --git a/2.5/boards/at91sam7x-ek/hw/hw_ntc.h b/2.5/boards/at91sam7x-ek/hw/hw_ntc.h new file mode 100644 index 00000000..49152a45 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_ntc.h @@ -0,0 +1,136 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id$ + * \author Francesco Sacchi + * + * A NTC acts as a variable resistor, whose resistance changes as a + * function of the temperature it measures. To sample it correctly, it is + * usually parallelized and serialized with two fixed resistor. The following diagram shows + * what is the exact disposition of the components, as handled by this + * library: + * + *
+ *                 o Vref
+ *                 |
+ *                 |                               o Vref
+ *                 |                               |
+ *               -----                             |
+ *              |     |                        ---------
+ *              | Rser|                       |         |
+ *              |     |                       |         |
+ *               -----     -----              |   ADC   |
+ *                 | Vp   |     |             |         |
+ *      -----------|------| Amp |-------------|         |
+ *     |           |      |     |      Vadc   |         |
+ *   -----       -----     -----               ---------
+ *  |     |     |     |
+ *  | NTC |     | Rpar|
+ *  |     |     |     |
+ *   -----       -----
+ *     |           |
+ *     |           |
+ *   -----       -----
+ *    ---         ---
+ *
+ * Amp is an amplifier that amplify of AMP times the signal. + * If we indicate Rp as the parallel of NTC with Rpar, ADCBITS as the bits of the ad converter + * and ADCVAL as the result from the adc convertion (Not Vadc but just the value read + * from the adc register), after various calculation, the expression of Rp is: + * + *
+ *
+ *            ADCVAL * Rser
+ * Rp = ------------------------
+ *         ADCBITS
+ *	2         * AMP - ADCVAL
+ *
+ * + * And after that NTC obvisiously is: + *
+ *        Rpar * Rp
+ * NTC = ----------
+ *        Rpar - Rp
+ *
+ * + * + * The function ntc_hw_read() compute the resistence using these formulas above. + */ + +#ifndef HW_NTC_H +#define HW_NTC_H + +#include "ntc_map.h" + +#include + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +extern const res_t NTC_RSER[NTC_CNT]; +extern const res_t NTC_RPAR[NTC_CNT]; +extern const amp_t NTC_AMP[NTC_CNT]; +extern const NtcHwInfo* NTC_INFO[NTC_CNT]; + + +/*! + * Read the resistence of ntc device \a dev. + * Return the result in res_t type. + */ +INLINE res_t ntc_hw_read(NtcDev dev) +{ + ASSERT(dev < NTC_CNT); + // See above for formula explanation. + adcread_t adcval = adc_read((uint16_t)dev); + float rp = (adcval * NTC_RSER[dev] ) / ((1 << adc_bits()) * NTC_AMP[dev] - adcval); + + //kprintf("Rp[%f], Rntc[%f]\n", rp/100, ((NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp)) / 100.0); + + return ( (NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp) ); +} + + +/*! + * Return the info (aka the table) associated with ntc device \a dev. + */ +INLINE const NtcHwInfo* ntc_hw_getInfo(NtcDev dev) +{ + return NTC_INFO[dev]; +} + +#define NTC_HW_INIT do { /* Implement me! */ } while(0) + +#endif /* HW_NTC_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_phase.c b/2.5/boards/at91sam7x-ek/hw/hw_phase.c new file mode 100644 index 00000000..54509ef3 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_phase.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/hw_phase.h" + +#warning TODO:This is an example implementation, you must implement it! + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_phase.h b/2.5/boards/at91sam7x-ek/hw/hw_phase.h new file mode 100644 index 00000000..7649e702 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_phase.h @@ -0,0 +1,80 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/phase_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define PHASE_HW_INIT do { /* Implement me! */ }while (0) + +INLINE void TRIAC_OFF(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + + +INLINE void TRIAC_ON(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void SET_TRIAC_DDR(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +void zerocross_isr(void); +#define DEFINE_ZEROCROSS_ISR() void zerocross_isr(void) + + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_rit128x96.h b/2.5/boards/at91sam7x-ek/hw/hw_rit128x96.h new file mode 100644 index 00000000..c24d1a87 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_rit128x96.h @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \brief LM3S1986: OLED-RIT-128x96 (P14201) low-level hardware macros + * + * \author Andrea Righi + */ + +#ifndef HW_RIT128x96_H +#define HW_RIT128x96_H + +#include "cfg/macros.h" /* BV() */ +#include "cfg/debug.h" + +#include +#include +#include + +/** + * \name LCD I/O pins/ports + * @{ + */ +/* OLED Data/Command control pin */ +#define GPIO_OLEDDC_PIN 0 /* Implement me! */ + +/* OLED enable pin */ +#define GPIO_OLEDEN_PIN 0 /* Implement me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +/* Send data to the display */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/*@}*/ + +INLINE void lcd_rit128x96_hw_bus_init(void) +{ + /* Implement me! */ +} + +#endif /* HW_RIT128x96_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_sd.h b/2.5/boards/at91sam7x-ek/hw/hw_sd.h new file mode 100644 index 00000000..51d5c0f6 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_sd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief SD driver hardware-specific definitions. + * + * \author Luca Ottaviano + * \author Daniele Basile + */ + +#ifndef HW_SD_H +#define HW_SD_H + +/* + * Spi CS connected to PA13 + * (See AT91SAM7X-EK schematic) + */ +#define SD_CS_INIT() \ + do { \ + PIOA_PER = BV(13); \ + PIOA_OER = BV(13); \ + }while(0) + +#define SD_CS_ON() do { PIOA_CODR = BV(13); } while(0) +#define SD_CS_OFF() do { PIOA_SODR = BV(13); } while(0) + +#define SD_PIN_INIT() do { /* not presetn on card socket connector */ } while(0) +#define SD_CARD_PRESENT() /* not presetn on card socket connector */ +#define SD_WRITE_PROTECT() /* not presetn on card socket connector */ + +#endif /* HW_SD_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_ser.h b/2.5/boards/at91sam7x-ek/hw/hw_ser.h new file mode 100644 index 00000000..2489c433 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_ser.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Serial hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_SER_H +#define HW_SER_H + +#include "cfg/cfg_ser.h" + +#if CONFIG_SER_STROBE + #warning FIXME: this is an example implementation, you must implement it + + #define SER_STROBE_INIT do { /* implement me */ } while (0) + #define SER_STROBE_ON do { /* implement me */ } while (0) + #define SER_STROBE_OFF do { /* implement me */ } while (0) +#endif + +#endif /* HW_SER_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_sipo.h b/2.5/boards/at91sam7x-ek/hw/hw_sipo.h new file mode 100644 index 00000000..3371c2c0 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_sipo.h @@ -0,0 +1,109 @@ +/** + * \file + * + * + * \brief Macro for HW_SIPO_H + * + * + * \version $Id$ + * + * \author Andrea Grandi + * \author Daniele Basile + */ + +#ifndef HW_SIPO_H +#define HW_SIPO_H + +/** + * Map sipo connection on board. + */ +typedef enum SipoMap +{ + SIPO_CNT +} SipoMap; + +/** + * Define generic macro to set pins logic level + */ +#define SIPO_SET_LEVEL_LOW(dev) do { /* Implement me! */ } while (0) +#define SIPO_SET_LEVEL_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Generate one low pulse on select line. + */ +#define PULSE_LOW(dev) do { /* Implement me! */ } while (0) + +/** + * Generate one hight pulse on select line. + */ +#define PULSE_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Define the procedure to drive serial input in sipo device (SI). + */ +#define SIPO_SI_HIGH() do { /* Implement me! */ } while (0) +#define SIPO_SI_LOW() do { /* Implement me! */ } while (0) + +/** + * Drive clock to shift SI data into latch. + */ +#define SIPO_SI_CLOCK(clk_pol) \ + do { \ + (void)clk_pol; \ + /* Implement me! */ \ + } while (0) + +/** + * Do everything needed in order to load dato into sipo. + */ +#define SIPO_LOAD(device, load_pol) do { /* Implement me! */ } while (0) + +/** + * Enable the shift register output. + */ +#define SIPO_ENABLE() do { /* Implement me! */ } while (0) + +/** + * Set polarity for Load, Clk, SI signals. + */ +#define SIPO_SET_LD_LEVEL(device, load_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_CLK_LEVEL(clock_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_SI_LEVEL() do { /* Implement me! */ } while (0) + +/** + * Do anything that needed to init sipo pins. + */ +#define SIPO_INIT_PIN() do { /* Implement me! */ } while (0) + +#endif /* HW_SIPO_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_spi.h b/2.5/boards/at91sam7x-ek/hw/hw_spi.h new file mode 100644 index 00000000..04e4893a --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_spi.h @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef HW_SPI_H +#define HW_SPI_H + +#warning TODO:This is an example implentation, you must implement it! + +#include + +/** + * SPI pin definition. + * + * \note CS is assert when level + * is low. + * + * \{ + */ +#define CS /* pin */ ///Connect to CS pin of Flash memory. +#define SCK /* pin */ ///Connect to SCK pin of Flash memory. +#define MOSI /* pin */ ///Connect to SI pin of Flash memory. +#define MISO /* pin */ ///Connect to SO pin of Flash memory. +#define SPI_PORT /* pin */ ///Micro pin PORT register. +#define SPI_PIN /* pin */ ///Micro pin PIN register. +#define SPI_DDR /* pin */ ///Micro pin DDR register. +/*\}*/ + +/** + * Pin logic level. + * + * \{ + */ +#define MOSI_LOW() do { /* Implement me! */ } while(0) +#define MOSI_HIGH() do { /* Implement me! */ } while(0) +#define MISO_HIGH() do { /* Implement me! */ } while(0) +#define SCK_LOW() do { /* Implement me! */ } while(0) +#define SCK_HIGH() do { /* Implement me! */ } while(0) +#define CS_LOW() do { /* Implement me! */ } while(0) +#define CS_HIGH() do { /* Implement me! */ } while(0) +/*\}*/ + +/** + * SPI pin commands. + * + * \{ + */ +#define CS_ENABLE() CS_LOW() +#define CS_DISABLE() CS_HIGH() +#define SS_ACTIVE() CS_LOW() +#define SS_INACTIVE() CS_HIGH() +#define SCK_INACTIVE() SCK_LOW() +#define SCK_ACTIVE() SCK_HIGH() +#define CS_OUT() do { /* Implement me! */ } while(0) +#define MOSI_IN() do { /* Implement me! */ } while(0) +#define MOSI_OUT() do { /* Implement me! */ } while(0) +#define IS_MISO_HIGH() (false /* Implement me! */ ) +#define MISO_IN() do { /* Implement me! */ } while(0) +#define MISO_OUT() do { /* Implement me! */ } while(0) +#define SCK_OUT() do { /* Implement me! */ } while(0) + +#define SCK_PULSE()\ + do {\ + SCK_HIGH();\ + SCK_LOW();\ + } while (0) +/*\}*/ + + +#define SPI_HW_INIT() \ + CS_DISABLE();\ + MOSI_LOW();\ + SCK_LOW();\ + MISO_IN();\ + MOSI_OUT();\ + SCK_OUT();\ + CS_OUT(); + +#endif /* HW_SPI_H */ + diff --git a/2.5/boards/at91sam7x-ek/hw/hw_stepper.h b/2.5/boards/at91sam7x-ek/hw/hw_stepper.h new file mode 100644 index 00000000..13141124 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_stepper.h @@ -0,0 +1,309 @@ +/** + * \file + * + * + * \brief Stepper hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + + +#ifndef HW_STEPPER_H +#define HW_STEPPER_H + +#include + +#include + +#include + +#warning TODO:This is an example implentation, you must implement it! + +#define STEPPER_STROBE_INIT \ +do { \ + /* put init code for strobe */ \ +} while (0) + + +#define STEPPER_STROBE_ON do { /* Implement me! */ } while(0) +#define STEPPER_STROBE_OFF do { /* Implement me! */ } while(0) + +/** + * CPU clock frequency is divided by 2^STEPPER_PRESCALER_LOG2 to + * obtain stepper clock. + */ +#define STEPPER_PRESCALER_LOG2 1 + +/** + * Stepper timer clock frequency. + */ +#define STEPPER_CLOCK ((CPU_FREQ) >> STEPPER_PRESCALER_LOG2) + +/** + * us delay to reset a stepper motor. + * This is the time neccessary to reset + * the stepper controll chip. (see datasheet for more detail). + */ +#define STEPPER_RESET_DELAY 1 + +/* + * Pins define for each stepper + */ +#define STEPPER_1_CW_CCW_PIN 0 +#define STEPPER_1_HALF_FULL_PIN 0 +#define STEPPER_1_CONTROL_PIN 0 +#define STEPPER_1_ENABLE_PIN 0 +#define STEPPER_1_RESET_PIN 0 + +/* put here other stepper motor */ + +#define STEPPER_1_SET do { /* Implement me! */ } while(0) +/* add here the set for other stepper motor */ + +#define STEPPER_1_CLEAR do { /* Implement me! */ } while(0) +/* add here the clear for other stepper motor */ + +/* + * Generic macro definition + */ + +/* + * Stepper init macro + */ +#define STEPPER_PIN_INIT_MACRO(port, index) do { \ + /* Add here init pin code */ \ + } while (0) + +/* + * Stepper commands macros + */ +#define STEPPER_SET_CW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CCW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_HALF(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_FULL(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_LOW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_HIGHT(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_DISABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_DISABLE(index) do { /* Implement me! */ } while (0) + + +/* + * Reset stepper macro + */ + +#define STEPPER_RESET_MACRO(index) do { \ + STEPPER_SET_RESET_ENABLE(index); \ + timer_udelay(STEPPER_RESET_DELAY); \ + STEPPER_SET_RESET_DISABLE(index); \ + } while (0) + +/* + * Set half or full step macro + */ +#define STEPPER_SET_STEP_MODE_MACRO(index, flag) do { \ + if (flag) \ + STEPPER_SET_HALF(index); \ + else \ + STEPPER_SET_FULL(index); \ + } while (0) + +/* + * Set control status macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_CONTROL_BIT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macros not implemented */ \ + /* else */ \ + /* WARNING This macros not implemented */ \ + } while (0) + +/* + * Set current power macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_POWER_CURRENT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macrois not implemented */ \ + /* else */ \ + /* WARNING This macrois not implemented */ \ + } while (0) + +/* + * Set rotation of stepper motor + * - dir = 1: positive rotation + * - dir = 0: no motor moviment + * - dir = -1: negative rotation + * + */ +#define STEPPER_SET_DIRECTION_MACRO(index, dir) do { \ + switch (dir) \ + { \ + case 1: \ + STEPPER_SET_CW(index); \ + break; \ + case -1: \ + STEPPER_SET_CCW(index); \ + break; \ + case 0: \ + break; \ + } \ + } while (0) + + +/* + * Define macros for manage low level of stepper. + */ + +#define STEPPER_INIT() do { \ + STEPPER_PIN_INIT_MACRO(A, 1); \ + /* Add here code for other stepper motor */ \ + } while (0) + + +/* + * Enable select stepper motor + */ +#define STEPPER_ENABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_ENABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Enable all stepper connect to micro + */ +#define STEPPER_ENABLE_ALL() do { \ + STEPPER_SET_ENABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Disable select stepper motor + */ +#define STEPPER_DISABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DISABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Disable all stepper connect to micro + */ +#define STEPPER_DISABLE_ALL() do { \ + STEPPER_SET_DISABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Reset selected stepper motor + */ +#define STEPPER_RESET(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_RESET_MACRO(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Reset all stepper motor + */ +#define STEPPER_RESET_ALL() do { \ + STEPPER_RESET_MACRO(1) \ + /* Add here code for other stepper motor */ \ + } while (0) + +// Set half/full step macros +#define STEPPER_SET_HALF_STEP(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_STEP_MODE_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Control status +#define STEPPER_SET_CONTROL_BIT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_CONTROL_BIT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Set stepper power current +#define STEPPER_SET_POWER_CURRENT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_POWER_CURRENT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +// Set rotation dirction of stepper motor +#define STEPPER_SET_DIRECTION(index, dir) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DIRECTION_MACRO(1, dir); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +#endif /* HW_STEPPER_H */ + + diff --git a/2.5/boards/at91sam7x-ek/hw/hw_tas5706a.h b/2.5/boards/at91sam7x-ek/hw/hw_tas5706a.h new file mode 100644 index 00000000..d1e1a2e6 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_tas5706a.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief HW pin handling. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_TAS5706A_H +#define HW_TAS5706A_H + +#include + +#warning FIXME: This is an example implementation, you must implement it + +#define TAS5706A_SETPOWERDOWN(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETRESET(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETMUTE(val) do { (void) val; /* implement me */ } while (0) + +#define TAS5706A_PIN_INIT() \ + do { \ + TAS5706A_SETPOWERDOWN(true); \ + TAS5706A_SETRESET(true); \ + TAS5706A_SETMUTE(true); \ + /* complete me */ \ + } while (0) + +#define TAS5706A_MCLK_INIT() \ + do { \ + /* implement me */ \ + } while(0) + + +#endif /* HW_TAS5706A_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_thermo.h b/2.5/boards/at91sam7x-ek/hw/hw_thermo.h new file mode 100644 index 00000000..6f478068 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_thermo.h @@ -0,0 +1,121 @@ +/** + * \file + * + * + * \brief thermo hardware-specific control functions. + * + * \author Francesco Sacchi + * + */ + +#ifndef HW_THERMO_H +#define HW_THERMO_H + +#include "hw/thermo_map.h" + +#include + +#include + + +INLINE ticks_t thermo_hw_timeout(ThermoDev dev) +{ + (void)dev; + return 0; +} + +/** + * This function should return the temperature set tolerance. + */ +INLINE deg_t thermo_hw_tolerance(ThermoDev dev) +{ + (void)dev; + return 0; +} + +/** + * Read the temperature of the hw device \a dev. + */ +INLINE deg_t thermo_hw_read(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + /* Put here the code to read current temperature */ + return 0; +} + + +/** + * Turns off a specific device. + * This function is usefull to handle errors. + */ +INLINE void thermo_hw_off(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + /* Put here the code to turn off the thermo device */ +} + +/** + * Based on the current temperature \a cur_temp and the target temperature \a target, + * this function turns on and off specific thermo device. + * It may use also PID control for thermo-regolations. + */ +INLINE void thermo_hw_set(ThermoDev dev, deg_t target, deg_t cur_temp) +{ + ASSERT(dev < THERMO_CNT); + + if (target - cur_temp > 0) + { + /* + * We are leveaving the target temperature, so + * turn on the thermo device! + */ + } + else + { + /* + * Ok, we are near the target temperature, so + * turn off the thermo device! + */ + } + +} + +#define THERMO_HW_INIT _thermo_hw_init() + +/** + * Init hw associated with thermo-control. + */ +INLINE void _thermo_hw_init(void) +{ + /* Init your devices here! */ +} + +#endif /* HW_THERMO_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/hw_tlv5618.h b/2.5/boards/at91sam7x-ek/hw/hw_tlv5618.h new file mode 100644 index 00000000..4a2b4202 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_tlv5618.h @@ -0,0 +1,69 @@ +/** + * \file + * + * + * \brief TLV5816 DAC hardware-specific definitions + * + * + * \author Francesco Sacchi + */ + +#ifndef HW_TLV5816_H +#define HW_TLV5816_H + +#warning TODO:This is an example implementation, you must implement it! + +#define TLV5618_CSINIT(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ + TLV5618_CSHIGH(pin); \ +} while(0) + +#define TLV5618_CSLOW(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#define TLV5618_CSHIGH(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#endif /* HW_TLV5816_H */ + diff --git a/2.5/boards/at91sam7x-ek/hw/hw_tmp123.h b/2.5/boards/at91sam7x-ek/hw/hw_tmp123.h new file mode 100644 index 00000000..2abe0ce0 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/hw_tmp123.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_TMP123_H +#define HW_TMP123_H +#include + +#define TMP123_HW_CS_EN() PIOA_CODR = BV(21); +#define TMP123_HW_CS_DIS() PIOA_SODR = BV(21); + +#define TMP123_HW_INIT() \ + do { \ + PIOA_PER = BV(21); \ + PIOA_OER = BV(21); \ + PIOA_SODR = BV(21); \ + } while (0) + +#endif /* HW_TMP123_H */ + diff --git a/2.5/boards/at91sam7x-ek/hw/kbd_map.h b/2.5/boards/at91sam7x-ek/hw/kbd_map.h new file mode 100644 index 00000000..ffe14311 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/kbd_map.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Keyboard map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_MAP_H +#define HW_KBD_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + + +/** + * Type for keyboard mask. + */ +typedef uint16_t keymask_t; + +/** + * \name Keycodes. + */ +/*@{*/ +#define K_UP BV(0) +#define K_DOWN BV(1) +#define K_OK BV(2) +#define K_CANCEL BV(3) + +#define K_REPEAT BV(13) /**< This is a repeated keyevent. */ +#define K_TIMEOUT BV(14) /**< Fake key event for timeouts. */ +#define K_LONG BV(15) +/*@}*/ + +#define K_LNG_MASK 0 + +#endif /* HW_KBD_MAP_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/mcp41_map.h b/2.5/boards/at91sam7x-ek/hw/mcp41_map.h new file mode 100644 index 00000000..6646391c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/mcp41_map.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief MCP41 digital potentiometer map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef MCP41_MAP_H +#define MCP41_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/** \name Enum for mcp41 pot evices. + * \{ + * + */ +typedef enum Mcp41Dev +{ + MCP41_LED, + + /* put here other mcp41 device */ + + MCP41_CNT, +} Mcp41Dev; +/* \} */ + +#endif /* MCP41_MAP_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/ntc_map.h b/2.5/boards/at91sam7x-ek/hw/ntc_map.h new file mode 100644 index 00000000..505f1c31 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/ntc_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief NTC map definitions. + * + * \version $Id$ + * + * \author Giovanni Bajo + * \author Francesco Sacchi + */ + +#ifndef NTC_MAP_H +#define NTC_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for ntc devices. + * \{ + */ +typedef enum NtcDev +{ + NTC_TEST, + + /* Put here your thermo device */ + + NTC_CNT +} NtcDev; +/* \} */ + +#endif /* NTC_MAP_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/phase_map.h b/2.5/boards/at91sam7x-ek/hw/phase_map.h new file mode 100644 index 00000000..7436e5e8 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/phase_map.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief Triac map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef PHASE_MAP_H +#define PHASE_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for triac devices. + * \{ + */ +typedef enum TriacDev +{ + TRIAC_TEST, + + /* Put here other triac device */ + + TRIAC_CNT +} TriacDev; +/* \} */ + +#endif /* PHASE_MAP_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/pwm_map.h b/2.5/boards/at91sam7x-ek/hw/pwm_map.h new file mode 100644 index 00000000..723da2f1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/pwm_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * + * \brief PWM map device. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_PWM_MAP_H +#define HW_PWM_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +typedef enum +{ + PWM_CH0 = 0, + PWM_CH1, + PWM_CH2, + PWM_CH3, + +/* + * add other PWM channel or + * change above. + */ + + PWM_CNT +} PwmDev; + +#endif /* HW_PWM_MAP_H */ diff --git a/2.5/boards/at91sam7x-ek/hw/thermo_map.h b/2.5/boards/at91sam7x-ek/hw/thermo_map.h new file mode 100644 index 00000000..7dbe27bc --- /dev/null +++ b/2.5/boards/at91sam7x-ek/hw/thermo_map.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Thermo regulation control map definitions. + * + * \author Francesco Sacchi + */ + +#ifndef THERMO_MAP_H +#define THERMO_MAP_H + +#include +#include + + +#warning TODO:This is an example implentation, you must implement it! + +typedef enum ThermoDev +{ + THERMO_TEST, + + /* Put here your thermo device */ + + THERMO_CNT +} ThermoDev; + +#endif /* THERMO_MAP_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/.spec b/2.5/boards/at91sam7x-ek/templates/.spec new file mode 100644 index 00000000..07fb8eed --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/.spec @@ -0,0 +1,3 @@ +name = "Templates" +ord = 0 +description = "Use these as a starting point for your BeRTOS project." diff --git a/2.5/boards/at91sam7x-ek/templates/empty/.spec b/2.5/boards/at91sam7x-ek/templates/empty/.spec new file mode 100644 index 00000000..f3edfbc2 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/.spec @@ -0,0 +1,8 @@ +name = 'empty preset' +advanced = True +description=""" +

+This is a minimalist project, it just initializes the hardware of the +supported board and proposes an empty main. +<\p> +""" diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_adc.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_afsk.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ax25.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_battfs.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_context_switch.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_dataflash.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_dc_motor.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_debug.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_fat.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_flash25.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_formatwr.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_gfx.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_hashtable.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_heap.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_i2c.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_i2s.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ini_reader.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_kbd.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_keytag.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_kfile.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_lcd_32122a.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_lcd_hd44.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_lm75.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_md2.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_monitor.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_nmea.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_parser.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_phase.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_pocketbus.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_proc.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_proc.h new file mode 100644 index 00000000..b2c3a965 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 0 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_pwm.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ramp.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_randpool.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_sem.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ser.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_signal.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_signal.h new file mode 100644 index 00000000..e78a4519 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 0 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_spi_bitbang.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_stepper.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_tas5706a.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_thermo.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_timer.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_wdt.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_xmodem.h b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/empty/empty.mk b/2.5/boards/at91sam7x-ek/templates/empty/empty.mk new file mode 100644 index 00000000..db387a92 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/empty.mk @@ -0,0 +1,95 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the empty_user.mk file instead. +# + +# Constants automatically defined by the selected modules +empty_DEBUG = 1 + +# Our target application +TRG += empty + +empty_PREFIX = "arm-none-eabi-" + +empty_SUFFIX = "" + +empty_SRC_PATH = boards/at91sam7x-ek/templates/empty + +empty_HW_PATH = boards/at91sam7x-ek + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CSRC INSTEAD! +empty_WIZARD_CSRC = \ + bertos/cpu/arm/drv/timer_at91.c \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/cpu/arm/drv/sysirq_at91.c \ + bertos/struct/heap.c \ + bertos/cpu/arm/drv/ser_arm.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/cpu/arm/drv/ser_at91.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/mware/formatwr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_PCSRC INSTEAD! +empty_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CPPASRC INSTEAD! +empty_WIZARD_CPPASRC = \ + bertos/cpu/arm/hw/switch_ctx_arm.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CXXSRC INSTEAD! +empty_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_ASRC INSTEAD! +empty_WIZARD_ASRC = \ + \ + # + +empty_CPPFLAGS = -D'CPU_FREQ=(48023000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(empty_HW_PATH) -I$(empty_SRC_PATH) $(empty_CPU_CPPFLAGS) $(empty_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_LDFLAGS = $(empty_CPU_LDFLAGS) $(empty_WIZARD_LDFLAGS) $(empty_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPAFLAGS = $(empty_CPU_CPPAFLAGS) $(empty_WIZARD_CPPAFLAGS) $(empty_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CSRC = $(empty_CPU_CSRC) $(empty_WIZARD_CSRC) $(empty_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_PCSRC = $(empty_CPU_PCSRC) $(empty_WIZARD_PCSRC) $(empty_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPASRC = $(empty_CPU_CPPASRC) $(empty_WIZARD_CPPASRC) $(empty_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CXXSRC = $(empty_CPU_CXXSRC) $(empty_WIZARD_CXXSRC) $(empty_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_ASRC = $(empty_CPU_ASRC) $(empty_WIZARD_ASRC) $(empty_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_at91.S +empty_CPU_CPPAFLAGS = -g -gdwarf-2 +empty_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_AT91SAM7X256__ +empty_CPU_CSRC = bertos/cpu/arm/hw/init_at91.c +empty_PROGRAMMER_CPU = at91sam7 +empty_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/at91sam7_256_rom.ld +empty_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +empty_CPU = arm7tdmi +empty_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +empty_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +empty_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(empty_SRC_PATH)/empty_user.mk diff --git a/2.5/boards/at91sam7x-ek/templates/empty/empty_user.mk b/2.5/boards/at91sam7x-ek/templates/empty/empty_user.mk new file mode 100644 index 00000000..4c8ed7ef --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/empty_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +empty_PROGRAMMER_TYPE = none +empty_PROGRAMMER_PORT = none + +# Files included by the user. +empty_USER_CSRC = \ + $(empty_SRC_PATH)/main.c \ + # + +# Files included by the user. +empty_USER_PCSRC = \ + # + +# Files included by the user. +empty_USER_CPPASRC = \ + # + +# Files included by the user. +empty_USER_CXXSRC = \ + # + +# Files included by the user. +empty_USER_ASRC = \ + # + +# Flags included by the user. +empty_USER_LDFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/at91sam7x-ek/templates/empty/main.c b/2.5/boards/at91sam7x-ek/templates/empty/main.c new file mode 100644 index 00000000..1b6b79a6 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/main.c @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Empty project. + * + * This is a minimalist project, it just initializes the hardware of the + * supported board and proposes an empty main. + */ + +#include "hw/hw_led.h" + +#include + +#include +#include + +#include +#include + +static Serial out; + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* Initialize UART0 */ + ser_init(&out, SER_UART0); + /* Configure UART0 to work at 115.200 bps */ + ser_setbaudrate(&out, 115200); + /* Initialize LED driver */ + LED_INIT(); +} + +int main(void) +{ + init(); + + /* Put your code here... */ + while (1) + { + } +} diff --git a/2.5/boards/at91sam7x-ek/templates/empty/project.bertos b/2.5/boards/at91sam7x-ek/templates/empty/project.bertos new file mode 100644 index 00000000..15fbc7ff --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/empty/project.bertos @@ -0,0 +1,77 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V48023000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vempty +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Varm-none-eabi +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V/scratch/julian/2010q1-release-eabi-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2010q1-188' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin +p15 +sS'version' +p16 +V4.4.1 +p17 +sS'build' +p18 +VSourcery G++ Lite 2010q1-188 +p19 +sS'path' +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'formatwr' +p25 +aS'debug' +p26 +aS'kfile' +p27 +aS'heap' +p28 +aS'timer' +p29 +asS'CPU_NAME' +p30 +VAT91SAM7X256 +p31 +sS'PROJECT_HW_PATH' +p32 +S'../..' +p33 +sS'PROJECT_SRC_PATH' +p34 +S'.' +p35 +sS'PRESET' +p36 +I01 +sS'OUTPUT' +p37 +(lp38 +s. \ No newline at end of file diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/.spec b/2.5/boards/at91sam7x-ek/templates/kernel/.spec new file mode 100644 index 00000000..04a79cff --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/.spec @@ -0,0 +1,9 @@ +name = 'kernel preset' +advanced = True +description=""" +

+This is a minimalist kernel project: it just initializes the hardware and +creates an independent process to blink an LED, while the main loop +continues to monitor the stack utilization of all the processes. +

+""" diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_adc.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_afsk.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ax25.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_battfs.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_context_switch.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_dataflash.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_dc_motor.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_debug.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_fat.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_flash25.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_formatwr.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_gfx.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_hashtable.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_heap.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_i2c.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_i2s.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ini_reader.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_kbd.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_keytag.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_kfile.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_lcd_32122a.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_lcd_hd44.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_lm75.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_md2.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_monitor.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_monitor.h new file mode 100644 index 00000000..6391b407 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 1 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_nmea.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_parser.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_phase.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_pocketbus.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_proc.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_proc.h new file mode 100644 index 00000000..7e64c498 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_pwm.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ramp.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_randpool.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_sem.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ser.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_signal.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_spi_bitbang.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_stepper.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_tas5706a.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_thermo.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_timer.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_wdt.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_xmodem.h b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/kernel.mk b/2.5/boards/at91sam7x-ek/templates/kernel/kernel.mk new file mode 100644 index 00000000..5828c8a1 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/kernel.mk @@ -0,0 +1,97 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_user.mk file instead. +# + +# Constants automatically defined by the selected modules +kernel_DEBUG = 1 + +# Our target application +TRG += kernel + +kernel_PREFIX = "arm-none-eabi-" + +kernel_SUFFIX = "" + +kernel_SRC_PATH = boards/at91sam7x-ek/templates/kernel + +kernel_HW_PATH = boards/at91sam7x-ek + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CSRC INSTEAD! +kernel_WIZARD_CSRC = \ + bertos/cpu/arm/drv/timer_at91.c \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/kern/sem.c \ + bertos/kern/monitor.c \ + bertos/cpu/arm/drv/sysirq_at91.c \ + bertos/struct/heap.c \ + bertos/cpu/arm/drv/ser_arm.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/cpu/arm/drv/ser_at91.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/mware/formatwr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_PCSRC INSTEAD! +kernel_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CPPASRC INSTEAD! +kernel_WIZARD_CPPASRC = \ + bertos/cpu/arm/hw/switch_ctx_arm.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CXXSRC INSTEAD! +kernel_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_ASRC INSTEAD! +kernel_WIZARD_ASRC = \ + \ + # + +kernel_CPPFLAGS = -D'CPU_FREQ=(48023000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_HW_PATH) -I$(kernel_SRC_PATH) $(kernel_CPU_CPPFLAGS) $(kernel_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_LDFLAGS = $(kernel_CPU_LDFLAGS) $(kernel_WIZARD_LDFLAGS) $(kernel_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPAFLAGS = $(kernel_CPU_CPPAFLAGS) $(kernel_WIZARD_CPPAFLAGS) $(kernel_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CSRC = $(kernel_CPU_CSRC) $(kernel_WIZARD_CSRC) $(kernel_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_PCSRC = $(kernel_CPU_PCSRC) $(kernel_WIZARD_PCSRC) $(kernel_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPASRC = $(kernel_CPU_CPPASRC) $(kernel_WIZARD_CPPASRC) $(kernel_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CXXSRC = $(kernel_CPU_CXXSRC) $(kernel_WIZARD_CXXSRC) $(kernel_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_ASRC = $(kernel_CPU_ASRC) $(kernel_WIZARD_ASRC) $(kernel_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_at91.S +kernel_CPU_CPPAFLAGS = -g -gdwarf-2 +kernel_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_AT91SAM7X256__ +kernel_CPU_CSRC = bertos/cpu/arm/hw/init_at91.c +kernel_PROGRAMMER_CPU = at91sam7 +kernel_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/at91sam7_256_rom.ld +kernel_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_CPU = arm7tdmi +kernel_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +kernel_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(kernel_SRC_PATH)/kernel_user.mk diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/kernel_user.mk b/2.5/boards/at91sam7x-ek/templates/kernel/kernel_user.mk new file mode 100644 index 00000000..6dfb4d8c --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/kernel_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_PROGRAMMER_TYPE = none +kernel_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_USER_CSRC = \ + $(kernel_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_USER_PCSRC = \ + # + +# Files included by the user. +kernel_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_USER_ASRC = \ + # + +# Flags included by the user. +kernel_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/main.c b/2.5/boards/at91sam7x-ek/templates/kernel/main.c new file mode 100644 index 00000000..ff8b2f12 --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/main.c @@ -0,0 +1,112 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Kernel project. + * + * This is a minimalist kernel project: it just initializes the hardware and + * creates an independent process to blink an LED, while the main loop + * continues to monitor the stack utilization of all the processes. + */ + +#include "hw/hw_led.h" + +#include + +#include +#include + +#include +#include + +#include +#include + +static Serial out; + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* Initialize UART0 */ + ser_init(&out, SER_UART0); + /* Configure UART0 to work at 115.200 bps */ + ser_setbaudrate(&out, 115200); + /* Initialize LED driver */ + LED_INIT(); + + /* + * Kernel initialization: processes (allow to create and dispatch + * processes using proc_new()). + */ + proc_init(); +} + +static void NORETURN led_process(void) +{ + int i; + + /* Periodically blink the led (toggle each 100 ms) */ + for (i = 0; ; i = !i) + { + if (i) + LED_ON(); + else + LED_OFF(); + timer_delay(100); + } +} + +int main(void) +{ + /* Hardware initialization */ + init(); + + /* Create a new child process */ + proc_new(led_process, NULL, KERN_MINSTACKSIZE * 2, NULL); + + /* + * The main process is kept to periodically report the stack + * utilization of all the processes (1 probe per second). + */ + while (1) + { + monitor_report(); + timer_delay(1000); + } +} diff --git a/2.5/boards/at91sam7x-ek/templates/kernel/project.bertos b/2.5/boards/at91sam7x-ek/templates/kernel/project.bertos new file mode 100644 index 00000000..859cc5ad --- /dev/null +++ b/2.5/boards/at91sam7x-ek/templates/kernel/project.bertos @@ -0,0 +1,85 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V48023000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Varm-none-eabi +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V/scratch/julian/2010q1-release-eabi-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2010q1-188' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin +p15 +sS'version' +p16 +V4.4.1 +p17 +sS'build' +p18 +VSourcery G++ Lite 2010q1-188 +p19 +sS'path' +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'kernel' +p25 +aS'semaphores' +p26 +aS'monitor' +p27 +aS'formatwr' +p28 +aS'debug' +p29 +aS'kfile' +p30 +aS'heap' +p31 +aS'signal' +p32 +aS'timer' +p33 +asS'CPU_NAME' +p34 +VAT91SAM7X256 +p35 +sS'PROJECT_HW_PATH' +p36 +S'../..' +p37 +sS'PROJECT_SRC_PATH' +p38 +S'.' +p39 +sS'PRESET' +p40 +I01 +sS'OUTPUT' +p41 +(lp42 +s. \ No newline at end of file diff --git a/2.5/boards/ek-lm3s1968/.image.png b/2.5/boards/ek-lm3s1968/.image.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f185a737556df6fa9ba95c7821dcd84aae5bcc GIT binary patch literal 53490 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 Hu0mjfnEEmY literal 0 HcmV?d00001 diff --git a/2.5/boards/ek-lm3s1968/.spec b/2.5/boards/ek-lm3s1968/.spec new file mode 100644 index 00000000..f04760ac --- /dev/null +++ b/2.5/boards/ek-lm3s1968/.spec @@ -0,0 +1,32 @@ +name = "Luminary EK-LM3S1968" +description = ''' +

Luminary LM3S1968 Evaluation Board

+ +

+ + + + + + + + + + + + + + + + + + + +
CPULuminary Stellaris LM3S1968
Clock50MHz
Memory256kB Flash, 64kB SRAM
Peripheralstimers, ADC, UART, SSI, I²C, DMA, PWM, quadrature encoder input, OLED display, magnetic speaker
+

+

+LM3S1968 Evaluation Board® is based on Luminary LM3S1968 Cortex-M3 CPU. Visit the LM3S1968 Evaluation Kits page for more information. +

+ +''' + diff --git a/2.5/boards/ek-lm3s1968/benchmark/.spec b/2.5/boards/ek-lm3s1968/benchmark/.spec new file mode 100644 index 00000000..18c0580d --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/.spec @@ -0,0 +1,3 @@ +name="Benchmarks" +ord=2 +description="Projects to measure different aspects of BeRTOS performance." diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/.spec b/2.5/boards/ek-lm3s1968/benchmark/context_switch/.spec new file mode 100644 index 00000000..3268cbf4 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/.spec @@ -0,0 +1,15 @@ +name = 'BeRTOS Context Switch' +description=""" +

+This benchmark measures the overhead (in us) required to deliver a +signal and switch from a low-priority process to a high-priority process. +

+

+The measure is made by the high-precision timer if supported by the +architecture. Alternatively, the time can also be measured using an external +oscilloscope connected to the board's status LED. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_adc.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_afsk.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_afsk.h new file mode 100644 index 00000000..d8bc1d56 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_afsk.h @@ -0,0 +1,114 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ax25.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_battfs.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_context_switch.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_dataflash.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_dc_motor.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_debug.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_fat.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_flash25.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_formatwr.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_gfx.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_hashtable.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_heap.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_i2c.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_i2c.h new file mode 100644 index 00000000..af36e6b6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_i2c.h @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_i2s.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ini_reader.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_kbd.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_keytag.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_kfile.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_lcd_32122a.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_lcd_hd44.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_lm75.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_md2.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_menu.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_monitor.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_nmea.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_parser.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_phase.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_pocketbus.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_proc.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_proc.h new file mode 100644 index 00000000..ef228257 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 0 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_pwm.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ramp.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_randpool.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_sem.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ser.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_signal.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_spi_bitbang.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_stepper.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_tas5706a.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_thermo.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_timer.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_wdt.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_xmodem.h b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/context_switch.mk b/2.5/boards/ek-lm3s1968/benchmark/context_switch/context_switch.mk new file mode 100644 index 00000000..b77876c6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/context_switch.mk @@ -0,0 +1,93 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the context_switch_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += context_switch + +context_switch_PREFIX = "arm-none-eabi-" + +context_switch_SUFFIX = "" + +context_switch_SRC_PATH = boards/ek-lm3s1968/benchmarck/context_switch + +context_switch_HW_PATH = boards/ek-lm3s1968 + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CSRC INSTEAD! +context_switch_WIZARD_CSRC = \ + bertos/benchmark/context_switch.c \ + bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \ + bertos/kern/kfile.c \ + bertos/cpu/cortex-m3/drv/timer_cm3.c \ + bertos/drv/timer.c \ + bertos/mware/formatwr.c \ + bertos/cpu/cortex-m3/drv/ser_lm3s.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + bertos/kern/signal.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_PCSRC INSTEAD! +context_switch_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CPPASRC INSTEAD! +context_switch_WIZARD_CPPASRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CXXSRC INSTEAD! +context_switch_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_ASRC INSTEAD! +context_switch_WIZARD_ASRC = \ + \ + # + +context_switch_CPPFLAGS = -D'CPU_FREQ=(50000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(context_switch_HW_PATH) -I$(context_switch_SRC_PATH) $(context_switch_CPU_CPPFLAGS) $(context_switch_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_LDFLAGS = $(context_switch_CPU_LDFLAGS) $(context_switch_WIZARD_LDFLAGS) $(context_switch_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPAFLAGS = $(context_switch_CPU_CPPAFLAGS) $(context_switch_WIZARD_CPPAFLAGS) $(context_switch_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CSRC = $(context_switch_CPU_CSRC) $(context_switch_WIZARD_CSRC) $(context_switch_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_PCSRC = $(context_switch_CPU_PCSRC) $(context_switch_WIZARD_PCSRC) $(context_switch_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPASRC = $(context_switch_CPU_CPPASRC) $(context_switch_WIZARD_CPPASRC) $(context_switch_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CXXSRC = $(context_switch_CPU_CXXSRC) $(context_switch_WIZARD_CXXSRC) $(context_switch_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_ASRC = $(context_switch_CPU_ASRC) $(context_switch_WIZARD_ASRC) $(context_switch_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPU_CPPASRC = bertos/cpu/cortex-m3/hw/crt_cm3.S bertos/cpu/cortex-m3/hw/vectors_cm3.S +context_switch_CPU_CPPAFLAGS = -g -gdwarf-2 -mthumb -mno-thumb-interwork +context_switch_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -mthumb -mno-thumb-interwork -fno-strict-aliasing -fwrapv -fverbose-asm -Ibertos/cpu/cortex-m3/ -D__ARM_LM3S1968__ +context_switch_CPU_CSRC = bertos/cpu/cortex-m3/hw/init_cm3.c bertos/cpu/cortex-m3/drv/irq_cm3.c bertos/cpu/cortex-m3/drv/gpio_lm3s.c bertos/cpu/cortex-m3/drv/clock_lm3s.c +context_switch_PROGRAMMER_CPU = lm3s +context_switch_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +context_switch_CPU = cortex-m3 +context_switch_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +context_switch_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +context_switch_CPU_LDFLAGS = -mthumb -mno-thumb-interwork -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/cortex-m3/scripts/lm3s1968_rom.ld +context_switch_FLASH_SCRIPT = bertos/prg_scripts/arm/flash-lm3s.sh + +include $(context_switch_SRC_PATH)/context_switch_user.mk diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/context_switch_user.mk b/2.5/boards/ek-lm3s1968/benchmark/context_switch/context_switch_user.mk new file mode 100644 index 00000000..932e591b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/context_switch_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +context_switch_PROGRAMMER_TYPE = none +context_switch_PROGRAMMER_PORT = none + +# Files included by the user. +context_switch_USER_CSRC = \ + $(context_switch_SRC_PATH)/main.c \ + # + +# Files included by the user. +context_switch_USER_PCSRC = \ + # + +# Files included by the user. +context_switch_USER_CPPASRC = \ + # + +# Files included by the user. +context_switch_USER_CXXSRC = \ + # + +# Files included by the user. +context_switch_USER_ASRC = \ + # + +# Flags included by the user. +context_switch_USER_LDFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + -O2 \ + # diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/main.c b/2.5/boards/ek-lm3s1968/benchmark/context_switch/main.c new file mode 100644 index 00000000..ef29fb02 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/main.c @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel context switch benchmark. + * + * This benchmark measures the overhead (in µs) required to deliver a + * signal and switch from a low-priority process to a high-priority process. + * + * The measure is made by the high-precision timer if supported by the + * architecture. Alternatively, the time can also be measured using an external + * oscilloscope connected to the board's status LED. + */ + +#include + +int main(void) +{ + context_switch(); + while (1) + { + } + + return 0; +} + diff --git a/2.5/boards/ek-lm3s1968/benchmark/context_switch/project.bertos b/2.5/boards/ek-lm3s1968/benchmark/context_switch/project.bertos new file mode 100644 index 00000000..74604fa1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/context_switch/project.bertos @@ -0,0 +1,79 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V50000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vcontext_switch +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Varm-none-eabi +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V/scratch/julian/2009q3-respin-eabi-lite/src/gcc-4.4/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2009q3-68' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin +p15 +sVversion +p16 +V4.4.1 +p17 +sVbuild +p18 +VSourcery G++ Lite 2009q3-68 +p19 +sVpath +p20 +V/localhome/toolchain/arm/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'kernel' +p25 +aS'formatwr' +p26 +aS'kfile' +p27 +aS'context_switch' +p28 +aS'signal' +p29 +aS'timer' +p30 +asS'CPU_NAME' +p31 +VLM3S1968 +p32 +sS'PROJECT_HW_PATH' +p33 +S'../..' +p34 +sS'PROJECT_SRC_PATH' +p35 +S'.' +p36 +sS'PRESET' +p37 +I01 +sS'OUTPUT' +p38 +(lp39 +s. \ No newline at end of file diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/.spec b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/.spec new file mode 100644 index 00000000..5a527bef --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/.spec @@ -0,0 +1,14 @@ +name = 'BeRTOS Kernel footprint' +description=""" +

+This benchmark measures the memory footprint of the BeRTOS kernel with a +simple minimalist user application. +

+

+The purpose of this test is to give a measure of the required space in a +generic flash memory to store a full-featured BeRTOS kernel. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_adc.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_afsk.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_afsk.h new file mode 100644 index 00000000..d8bc1d56 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_afsk.h @@ -0,0 +1,114 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ax25.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_battfs.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_context_switch.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_dataflash.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_dc_motor.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_debug.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_fat.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_flash25.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_formatwr.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_gfx.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_hashtable.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_heap.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_i2c.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_i2c.h new file mode 100644 index 00000000..af36e6b6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_i2c.h @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_i2s.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ini_reader.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_kbd.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_keytag.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_kfile.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_lm75.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_md2.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_menu.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_monitor.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_nmea.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_parser.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_phase.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_pocketbus.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_proc.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_proc.h new file mode 100644 index 00000000..ab1a4680 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_pwm.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ramp.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_randpool.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_sem.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ser.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_signal.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_stepper.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_tas5706a.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_thermo.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_timer.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_wdt.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_xmodem.h b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/kernel_footprint.mk b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/kernel_footprint.mk new file mode 100644 index 00000000..ac890acc --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/kernel_footprint.mk @@ -0,0 +1,93 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_footprint_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += kernel_footprint + +kernel_footprint_PREFIX = "arm-none-eabi-" + +kernel_footprint_SUFFIX = "" + +kernel_footprint_SRC_PATH = boards/ek-lm3s1968/benchmark/kernel_footprint + +kernel_footprint_HW_PATH = boards/ek-lm3s1968 + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CSRC INSTEAD! +kernel_footprint_WIZARD_CSRC = \ + bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \ + bertos/mware/event.c \ + bertos/kern/sem.c \ + bertos/cpu/cortex-m3/drv/timer_cm3.c \ + bertos/struct/heap.c \ + bertos/mware/formatwr.c \ + bertos/drv/timer.c \ + bertos/kern/kfile.c \ + bertos/kern/proc.c \ + bertos/benchmark/kernel_footprint.c \ + bertos/mware/hex.c \ + bertos/kern/signal.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_PCSRC INSTEAD! +kernel_footprint_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CPPASRC INSTEAD! +kernel_footprint_WIZARD_CPPASRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CXXSRC INSTEAD! +kernel_footprint_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_ASRC INSTEAD! +kernel_footprint_WIZARD_ASRC = \ + \ + # + +kernel_footprint_CPPFLAGS = -D'CPU_FREQ=(50000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_footprint_HW_PATH) -I$(kernel_footprint_SRC_PATH) $(kernel_footprint_CPU_CPPFLAGS) $(kernel_footprint_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_LDFLAGS = $(kernel_footprint_CPU_LDFLAGS) $(kernel_footprint_WIZARD_LDFLAGS) $(kernel_footprint_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPAFLAGS = $(kernel_footprint_CPU_CPPAFLAGS) $(kernel_footprint_WIZARD_CPPAFLAGS) $(kernel_footprint_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CSRC = $(kernel_footprint_CPU_CSRC) $(kernel_footprint_WIZARD_CSRC) $(kernel_footprint_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_PCSRC = $(kernel_footprint_CPU_PCSRC) $(kernel_footprint_WIZARD_PCSRC) $(kernel_footprint_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPASRC = $(kernel_footprint_CPU_CPPASRC) $(kernel_footprint_WIZARD_CPPASRC) $(kernel_footprint_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CXXSRC = $(kernel_footprint_CPU_CXXSRC) $(kernel_footprint_WIZARD_CXXSRC) $(kernel_footprint_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_ASRC = $(kernel_footprint_CPU_ASRC) $(kernel_footprint_WIZARD_ASRC) $(kernel_footprint_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPU_CPPASRC = bertos/cpu/cortex-m3/hw/crt_cm3.S bertos/cpu/cortex-m3/hw/vectors_cm3.S +kernel_footprint_CPU_CPPAFLAGS = -g -gdwarf-2 -mthumb -mno-thumb-interwork +kernel_footprint_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -mthumb -mno-thumb-interwork -fno-strict-aliasing -fwrapv -fverbose-asm -Ibertos/cpu/cortex-m3/ -D__ARM_LM3S1968__ +kernel_footprint_CPU_CSRC = bertos/cpu/cortex-m3/hw/init_cm3.c bertos/cpu/cortex-m3/drv/irq_cm3.c bertos/cpu/cortex-m3/drv/gpio_lm3s.c bertos/cpu/cortex-m3/drv/clock_lm3s.c +kernel_footprint_PROGRAMMER_CPU = lm3s +kernel_footprint_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_footprint_CPU = cortex-m3 +kernel_footprint_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_footprint_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +kernel_footprint_CPU_LDFLAGS = -mthumb -mno-thumb-interwork -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/cortex-m3/scripts/lm3s1968_rom.ld +kernel_footprint_FLASH_SCRIPT = bertos/prg_scripts/arm/flash-lm3s.sh + +include $(kernel_footprint_SRC_PATH)/kernel_footprint_user.mk diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/kernel_footprint_user.mk b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/kernel_footprint_user.mk new file mode 100644 index 00000000..9e2bc5f6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/kernel_footprint_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_footprint_PROGRAMMER_TYPE = none +kernel_footprint_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_footprint_USER_CSRC = \ + $(kernel_footprint_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_footprint_USER_PCSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_ASRC = \ + # + +# Flags included by the user. +kernel_footprint_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + -Os \ + # diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/main.c b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/main.c new file mode 100644 index 00000000..a3f11e50 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/main.c @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel footprint benchmark. + * + * This benchmark measures the memory footprint[1] of the BeRTOS kernel with a + * simple minimalist user application. + * + * The purpose of this test is to give a measure of the required space in a + * generic flash memory to store a full-featured BeRTOS kernel. + * + * [1] http://en.wikipedia.org/wiki/Memory_footprint + */ + +#include + +int main(void) +{ + kernel_footprint(); + while (1) + { + } + + return 0; +} + diff --git a/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/project.bertos b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/project.bertos new file mode 100644 index 00000000..ae53f959 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/benchmark/kernel_footprint/project.bertos @@ -0,0 +1,83 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V50000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel_footprint +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Varm-none-eabi +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V/scratch/julian/2009q3-respin-eabi-lite/src/gcc-4.4/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2009q3-68' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin +p15 +sVversion +p16 +V4.4.1 +p17 +sVbuild +p18 +VSourcery G++ Lite 2009q3-68 +p19 +sVpath +p20 +V/localhome/toolchain/arm/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'kernel' +p24 +aS'formatwr' +p25 +aS'kfile' +p26 +aS'semaphores' +p27 +aS'msg' +p28 +aS'kernel_footprint' +p29 +aS'heap' +p30 +aS'signal' +p31 +aS'timer' +p32 +asS'CPU_NAME' +p33 +VLM3S1968 +p34 +sS'PROJECT_HW_PATH' +p35 +S'../..' +p36 +sS'PROJECT_SRC_PATH' +p37 +S'.' +p38 +sS'PRESET' +p39 +I01 +sS'OUTPUT' +p40 +(lp41 +s. \ No newline at end of file diff --git a/2.5/boards/ek-lm3s1968/examples/.spec b/2.5/boards/ek-lm3s1968/examples/.spec new file mode 100644 index 00000000..d244bbf6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/.spec @@ -0,0 +1,3 @@ +name="Examples" +ord=1 +description="Full working example projects." diff --git a/2.5/boards/ek-lm3s1968/examples/gps/.spec b/2.5/boards/ek-lm3s1968/examples/gps/.spec new file mode 100644 index 00000000..7ad25731 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/.spec @@ -0,0 +1,19 @@ +name = 'DevelGPS' +description=""" + + +

Overview

+ +

The purpose of this project is to implement a portable GPS locator / geocaching +finder with the Cortex-M3 based Luminary Micro LM3S1968 evaluation board.

+ +

The device proposes a user interface to configure the GPS coordinates of a +target location and shows on the OLED display the direction and distance to +reach the target.

+ +

+For schematics and up to date information on this project, +check the DevelGPS page +on the BeRTOS site. +

+""" diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_adc.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_afsk.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_afsk.h new file mode 100644 index 00000000..d8bc1d56 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_afsk.h @@ -0,0 +1,114 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ax25.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_battfs.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_context_switch.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_dataflash.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_dc_motor.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..409badda --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_dc_motor.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_debug.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_fat.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_flash25.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_formatwr.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_formatwr.h new file mode 100644 index 00000000..10d41b48 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_formatwr.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_gfx.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_hashtable.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_heap.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_i2c.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_i2c.h new file mode 100644 index 00000000..af36e6b6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_i2c.h @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_i2s.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ini_reader.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_kbd.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_keytag.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_kfile.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_kfile.h new file mode 100644 index 00000000..1b1989c9 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_kfile.h @@ -0,0 +1,62 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 1 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_lcd_32122a.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_lcd_hd44.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_lm75.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_md2.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_menu.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_monitor.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_nmea.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_parser.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_phase.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_pid.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_pid.h new file mode 100644 index 00000000..5a8375bb --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_pid.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PID_H +#define CFG_PID_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PID_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PID_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PID_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_pocketbus.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..687e535d --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_pocketbus.h @@ -0,0 +1,50 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_proc.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_proc.h new file mode 100644 index 00000000..eddd615c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_proc.h @@ -0,0 +1,108 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 8192L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_pwm.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ramp.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_randpool.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_sem.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ser.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ser.h new file mode 100644 index 00000000..d14b821e --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 128 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_signal.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_spi_bitbang.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_spi_dma.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_spi_dma.h new file mode 100644 index 00000000..0a69f757 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_spi_dma.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for spi dma module. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef CFG_SPI_DMA_H +#define CFG_SPI_DMA_H + +/** + * Size of the outbound FIFO buffer for SPI DMA [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_SPI_DMA_TXBUFSIZE 512 + + +/** + * Max size received for each DMA transfer [bytes]. + * Longer buffers will be split in two or more transfers of this size. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SPI_DMA_MAX_RX 512 + + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SPI_DMA_TX_TIMEOUT -1 + + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_stepper.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_tas5706a.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_thermo.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_thermo.h new file mode 100644 index 00000000..e68c6371 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_thermo.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_timer.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_wdt.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_xmodem.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_xmodem.h new file mode 100644 index 00000000..eb8897f4 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/cfg_xmodem.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/ek-lm3s1968/examples/gps/cfg/log.h b/2.5/boards/ek-lm3s1968/examples/gps/cfg/log.h new file mode 100644 index 00000000..b6649620 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/cfg/log.h @@ -0,0 +1,170 @@ +/** + * \file + * + * + * \brief Logging system module. + * + * This module implement a simple interface to use the multi level logging system. + * The log message have the priority order, like this: + * + * - error message (highest) + * - warning message + * - info message (lowest) + * + * With this priority system we can log only the message that have egual or major + * priority than log level that you has been configurate. Further you can have a + * differ log level for each module that you want. To do this you just need to + * define LOG_LEVEL in cfg of select module. + * When you set a log level, the system logs only the message that have priority + * egual or major that you have define, but the other logs function are not include + * at compile time, so all used logs function are linked, but the other no. + * + * To use logging system you should include this module in your drive and use + * a LOG_ERROR, LOG_WARNING and LOG_INFO macros to set the level log of the message. + * Then you should define a LOG_LEVEL and LOG_VERBOSE costant in your + * \c cfg/cfg_\.h using the follow policy: + * + * - in your file \c cfg/cfg_\.h, you define the logging + * level and verbosity mode for your specific module: + * + * \code + * /// Module logging level. + * #define _LOG_LEVEL LOG_LVL_INFO + * + * /// Module logging format. + * #define _LOG_FORMAT LOG_FMT_VERBOSE + * \endcode + * + * - then, in the module that you use a logging macros you should define + * a LOG_LEVEL and LOG_FORMAT using the previous value that you have define + * in cfg_.h header. After this you should include the cfg/log.h + * module: + * + * \code + * // Define log settings for cfg/log.h. + * #define LOG_LEVEL _LOG_LEVEL + * #define LOG_FORMAT _LOG_FORMAT + * #include + * \endcode + * + * if you include a log.h module without define the LOG_LEVEL and LOG_VERBOSE + * macros, the module use the default setting (see below). + * + * WARNING: when use the log.h module, and you want to set a your log level + * make sure to include this module after a \c cfg_.h, because the + * LOG_LEVEL and LOG_VERBOSE macros must be defined before to include log module, + * otherwise the log module use a default settings. + * + * \version $Id$ + * \author Daniele Basile + * + * $WIZ$ + */ + +#ifndef CFG_LOG_H +#define CFG_LOG_H + +#include + + +// Use a default setting if nobody defined a log level +#ifndef LOG_LEVEL +#define LOG_LEVEL LOG_LVL_WARN +#endif + +// Use a default setting if nobody defined a log format +#ifndef LOG_FORMAT +#define LOG_FORMAT LOG_FMT_TERSE +#endif + +/** + * \name Logging level definition + * + * When you choose a log level messages you choose + * also which print function are linked. + * If you choose a low level of log you link all log function (error, warning and info), + * but if choose a hight level you link only that have the priority egual or hight. + * The priority level go from error (highest) to info (lowest) (see cfg/debug.h + * for more detail). + * + * $WIZ$ log_level = "LOG_LVL_NONE", "LOG_LVL_ERR", "LOG_LVL_WARN", "LOG_LVL_INFO" + * } + */ +#define LOG_LVL_NONE 0 +#define LOG_LVL_ERR 1 +#define LOG_LVL_WARN 2 +#define LOG_LVL_INFO 3 + +/** + * \name Logging format + * + * There are two logging format: terse and verbose. The latter prepends + * function names and line number information to each log entry. + * + * $WIZ$ log_format = "LOG_FMT_VERBOSE", "LOG_FMT_TERSE" + */ +#define LOG_FMT_VERBOSE 1 +#define LOG_FMT_TERSE 0 + +#if LOG_FORMAT == LOG_FMT_VERBOSE + #define LOG_PRINT(str_level, str,...) kprintf("%s():%d:%s: " str, __func__, __LINE__, str_level, ## __VA_ARGS__) +#elif LOG_FORMAT == LOG_FMT_TERSE + #define LOG_PRINT(str_level, str,...) kprintf("%s: " str, str_level, ## __VA_ARGS__) +#else + #error No LOG_FORMAT defined +#endif + +#if LOG_LEVEL >= LOG_LVL_ERR + #define LOG_ERR(str,...) LOG_PRINT("ERR", str, ## __VA_ARGS__) + #define LOG_ERRB(x) x +#else + INLINE void LOG_ERR(UNUSED_ARG(const char *, fmt), ...) { /* nop */ } + #define LOG_ERRB(x) /* Nothing */ +#endif + +#if LOG_LEVEL >= LOG_LVL_WARN + #define LOG_WARN(str,...) LOG_PRINT("WARN", str, ## __VA_ARGS__) + #define LOG_WARNB(x) x +#else + INLINE void LOG_WARN(UNUSED_ARG(const char *, fmt), ...) { /* nop */ } + #define LOG_WARNB(x) /* Nothing */ +#endif + +#if LOG_LEVEL >= LOG_LVL_INFO + #define LOG_INFO(str,...) LOG_PRINT("INFO", str, ## __VA_ARGS__) + #define LOG_INFOB(x) x +#else + INLINE void LOG_INFO(UNUSED_ARG(const char *, fmt), ...) { /* nop */ } + #define LOG_INFOB(x) /* Nothing */ +#endif + + +#endif /* CFG_LOG_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/compass.c b/2.5/boards/ek-lm3s1968/examples/gps/compass.c new file mode 100644 index 00000000..7b3adefe --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/compass.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include "compass.h" + +static const char *_compass_heading[] = +{ + "N", "NNE", "NE", "ENE", + "E", "ESE", "SE", "SSE", + "S", "SSW", "SW", "WSW", + "W", "WNW", "NW", "NNW", +}; + +/** + * Use the Haversine formula to calculate great-circle distances between the + * two points. + * + * The Haversine formula remains particularly well-conditioned for numerical + * computation even at small distances, unlike calculations based on the + * spherical law of cosines. + */ +float distance(float lat1, float lon1, float lat2, float lon2) +{ + const float PLANET_RADIUS = 6371000; + float d_lat = deg2rad(lat2 - lat1); + float d_lon = deg2rad(lon2 - lon1); + + float a = sin(d_lat / 2) * sin(d_lat / 2) + + cos(deg2rad(lat1)) * cos(deg2rad(lat2)) * + sin(d_lon / 2) * sin(d_lon / 2); + float c = 2 * atan2(sqrt(a), sqrt(1 - a)); + + return PLANET_RADIUS * c; +} + +/** + * Evaluate the bearing (also known as forward azimuth) using spherical law + * coordinates. + * + * The bearing is a straight line along a great-circle arc from the start point + * to the destination point. + */ +int bearing(float lat1, float lon1, float lat2, float lon2) +{ + float res; + + res = rad2deg(atan2(sin(deg2rad(lon2 - lon1)) * + cos(deg2rad(lat2)), cos(deg2rad(lat1)) * + sin(deg2rad(lat2)) - sin(deg2rad(lat1)) * + cos(deg2rad(lat2)) * cos(deg2rad(lon2) - + deg2rad(lon1)))); + return ((int)res + 360) % 360; +} + +const char *compass_heading(int bearing) +{ + ASSERT(bearing >= 0 && bearing < 360); + /* + * bearing / 22.5 + */ + return _compass_heading[(bearing << 4) / 360]; +} diff --git a/2.5/boards/ek-lm3s1968/examples/gps/compass.h b/2.5/boards/ek-lm3s1968/examples/gps/compass.h new file mode 100644 index 00000000..f1f4c5f6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/compass.h @@ -0,0 +1,20 @@ +#ifndef COMPASS_H +#define COMPASS_H + +#define PI 3.14159265358979323846 + +INLINE float deg2rad(float deg) +{ + return deg * PI / 180; +} + +INLINE float rad2deg(float rad) +{ + return rad * 180 / PI; +} + +float distance(float lat1, float lon1, float lat2, float lon2); +int bearing(float lat1, float lon1, float lat2, float lon2); +const char *compass_heading(int bearing); + +#endif /* COMPASS_H */ diff --git a/2.5/boards/ek-lm3s1968/examples/gps/gps.mk b/2.5/boards/ek-lm3s1968/examples/gps/gps.mk new file mode 100644 index 00000000..99c68f36 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/gps.mk @@ -0,0 +1,103 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the gps_user.mk file instead. +# + +# Constants automatically defined by the selected modules +gps_DEBUG = 1 + +# Our target application +TRG += gps + +gps_PREFIX = "arm-none-eabi-" + +gps_SUFFIX = "" + +gps_SRC_PATH = boards/ek-lm3s1968/examples/gps + +gps_HW_PATH = boards/ek-lm3s1968 + +# Files automatically generated by the wizard. DO NOT EDIT, USE gps_USER_CSRC INSTEAD! +gps_WIZARD_CSRC = \ + bertos/kern/sem.c \ + bertos/mware/formatwr.c \ + bertos/net/nmea.c \ + bertos/drv/kbd.c \ + bertos/gfx/line.c \ + bertos/drv/lcd_rit128x96.c \ + bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \ + bertos/kern/kfile.c \ + bertos/gfx/text_format.c \ + bertos/struct/heap.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + bertos/net/nmeap/src/nmeap01.c \ + bertos/gfx/text.c \ + bertos/cpu/cortex-m3/drv/timer_cm3.c \ + bertos/drv/timer.c \ + bertos/kern/signal.c \ + bertos/kern/proc.c \ + bertos/mware/event.c \ + bertos/gfx/bitmap.c \ + bertos/cpu/cortex-m3/drv/ser_lm3s.c \ + bertos/mware/sprintf.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE gps_USER_PCSRC INSTEAD! +gps_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE gps_USER_CPPASRC INSTEAD! +gps_WIZARD_CPPASRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE gps_USER_CXXSRC INSTEAD! +gps_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE gps_USER_ASRC INSTEAD! +gps_WIZARD_ASRC = \ + \ + # + +gps_CPPFLAGS = -D'CPU_FREQ=(50000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(gps_HW_PATH) -I$(gps_SRC_PATH) $(gps_CPU_CPPFLAGS) $(gps_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +gps_LDFLAGS = $(gps_CPU_LDFLAGS) $(gps_WIZARD_LDFLAGS) $(gps_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +gps_CPPAFLAGS = $(gps_CPU_CPPAFLAGS) $(gps_WIZARD_CPPAFLAGS) $(gps_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +gps_CSRC = $(gps_CPU_CSRC) $(gps_WIZARD_CSRC) $(gps_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +gps_PCSRC = $(gps_CPU_PCSRC) $(gps_WIZARD_PCSRC) $(gps_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +gps_CPPASRC = $(gps_CPU_CPPASRC) $(gps_WIZARD_CPPASRC) $(gps_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +gps_CXXSRC = $(gps_CPU_CXXSRC) $(gps_WIZARD_CXXSRC) $(gps_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +gps_ASRC = $(gps_CPU_ASRC) $(gps_WIZARD_ASRC) $(gps_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +gps_CPU_CPPASRC = bertos/cpu/cortex-m3/hw/crt_cm3.S bertos/cpu/cortex-m3/hw/vectors_cm3.S +gps_CPU_CPPAFLAGS = -g -gdwarf-2 -mthumb -mno-thumb-interwork +gps_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -mthumb -mno-thumb-interwork -fno-strict-aliasing -fwrapv -fverbose-asm -Ibertos/cpu/cortex-m3/ -D__ARM_LM3S1968__ +gps_CPU_CSRC = bertos/cpu/cortex-m3/hw/init_lm3s.c bertos/cpu/cortex-m3/drv/irq_cm3.c bertos/cpu/cortex-m3/drv/gpio_lm3s.c bertos/cpu/cortex-m3/drv/clock_lm3s.c +gps_PROGRAMMER_CPU = lm3s +gps_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +gps_CPU = cortex-m3 +gps_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +gps_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +gps_CPU_LDFLAGS = -mthumb -mno-thumb-interwork -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/cortex-m3/scripts/lm3s1968_rom.ld +gps_FLASH_SCRIPT = bertos/prg_scripts/arm/flash-cortex.sh + +include $(gps_SRC_PATH)/gps_user.mk diff --git a/2.5/boards/ek-lm3s1968/examples/gps/gps_user.mk b/2.5/boards/ek-lm3s1968/examples/gps/gps_user.mk new file mode 100644 index 00000000..e605afb6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/gps_user.mk @@ -0,0 +1,55 @@ +# +# Copyright 2009 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Makefile template for BeRTOS wizard. +# +# Author: Lorenzo Berni +# +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +gps_PROGRAMMER_TYPE = none +gps_PROGRAMMER_PORT = none + +# Files included by the user. +gps_USER_CSRC = \ + bertos/cpu/cortex-m3/drv/flash_lm3s.c \ + bertos/cpu/cortex-m3/drv/ssi_lm3s.c \ + bertos/fonts/gohu.c \ + bertos/fonts/luBS14.c \ + bertos/gui/menu.c \ + $(gps_SRC_PATH)/compass.c \ + $(gps_SRC_PATH)/main.c \ + # + +# Files included by the user. +gps_USER_PCSRC = \ + # + +# Files included by the user. +gps_USER_CPPASRC = \ + # + +# Files included by the user. +gps_USER_CXXSRC = \ + # + +# Files included by the user. +gps_USER_ASRC = \ + # + +# Flags included by the user. +gps_USER_LDFLAGS = \ + # + +# Flags included by the user. +gps_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +gps_USER_CPPFLAGS = \ + -O2 -fomit-frame-pointer \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/ek-lm3s1968/examples/gps/logo.c b/2.5/boards/ek-lm3s1968/examples/gps/logo.c new file mode 100644 index 00000000..594ec471 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/logo.c @@ -0,0 +1,547 @@ +#define BITMAP_HEADER_SIZE 0x76 +#define BITMAP_WIDTH_OFFSET 0x12 +#define BITMAP_HEIGHT_OFFSET 0x16 + +/* BeRTOS logo */ +static const unsigned char logo[] = { + 0x42, 0x4d, 0xde, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x46, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x68, 0x10, 0x00, 0x00, 0x13, 0x0b, + 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x26, 0x26, + 0x26, 0x00, 0x32, 0x32, 0x32, 0x00, 0x3e, 0x3e, + 0x3e, 0x00, 0x4e, 0x4e, 0x4e, 0x00, 0x5c, 0x5c, + 0x5c, 0x00, 0x68, 0x68, 0x68, 0x00, 0x7d, 0x7d, + 0x7d, 0x00, 0x82, 0x82, 0x82, 0x00, 0x93, 0x93, + 0x93, 0x00, 0xa3, 0xa3, 0xa3, 0x00, 0xb3, 0xb3, + 0xb3, 0x00, 0xbf, 0xbf, 0xbf, 0x00, 0xce, 0xce, + 0xce, 0x00, 0xdd, 0xdd, 0xdd, 0x00, 0xeb, 0xeb, + 0xeb, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xeb, 0x98, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, + 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x82, 0x41, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x89, 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, + 0xed, 0xcb, 0x98, 0x98, 0x88, 0x26, 0x77, 0x18, + 0x88, 0x88, 0x99, 0xab, 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, 0x16, 0x68, 0x81, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0x45, 0x84, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 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, 0x15, 0x67, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x45, 0x97, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x15, 0x16, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x61, 0x31, 0x1a, 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, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x17, 0x64, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x15, 0x55, + 0x52, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x17, 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, 0x67, 0x77, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x25, 0x55, 0x55, 0x55, 0x54, 0x10, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x78, 0x62, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x17, 0x77, 0x71, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x11, 0x55, 0x66, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x21, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x69, 0x71, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 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, 0x66, 0x74, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x13, 0x55, + 0x66, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x31, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0x26, + 0x87, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 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, 0x37, 0x77, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0x71, 0x14, 0x56, 0x66, 0x66, 0x66, 0x66, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x52, 0x12, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x97, 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, 0xff, 0x17, 0x67, 0x0f, + 0xff, 0xff, 0xfe, 0x40, 0x35, 0x56, 0x77, 0x77, + 0x77, 0x66, 0x66, 0x66, 0x66, 0x66, 0x55, 0x55, + 0x55, 0x55, 0x53, 0x10, 0xcf, 0xff, 0xff, 0x26, + 0x96, 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, 0x17, 0x67, 0x1f, 0xff, 0xe1, 0x11, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x21, 0x11, 0xff, 0x36, 0x96, 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, 0x17, 0x77, 0x14, + 0x55, 0x61, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0xff, 0x27, + 0x86, 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, + 0xfc, 0x18, 0x77, 0x11, 0x11, 0x11, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x94, 0xfe, 0x07, 0x67, 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, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x68, 0x75, 0x31, + 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0x11, 0x16, + 0x78, 0x71, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0x27, 0x96, 0x60, 0xfa, 0x11, 0x11, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x83, 0x11, 0xe1, 0x76, 0x77, 0x01, 0x34, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x36, 0x79, 0x67, 0x29, 0xff, + 0x11, 0x11, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x82, 0x1a, 0xf4, + 0x77, 0x67, 0x77, 0x77, 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, 0x46, 0x89, + 0x86, 0x67, 0x5f, 0xff, 0xf1, 0x11, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x63, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x21, 0x11, + 0x78, 0x80, 0x4f, 0xff, 0x17, 0x77, 0x67, 0x77, + 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, 0x16, 0x66, 0x61, 0x1e, 0xff, 0xff, + 0xff, 0xf1, 0x88, 0x88, 0x88, 0x86, 0xbf, 0xff, + 0xff, 0xb1, 0x88, 0x88, 0x88, 0x88, 0xaa, 0xaa, + 0x88, 0x1f, 0xff, 0xdc, 0xfe, 0x11, 0xff, 0xff, + 0xfd, 0x11, 0x66, 0x63, 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, 0xf8, 0x32, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x88, 0x88, + 0x88, 0x59, 0xfb, 0x67, 0x77, 0x6d, 0x58, 0x88, + 0x88, 0x8a, 0xaa, 0xaa, 0x83, 0xff, 0x67, 0x77, + 0x76, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x86, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x88, 0x88, 0x88, 0x6f, 0x77, 0x76, + 0x88, 0x76, 0x78, 0x88, 0x88, 0x9a, 0xaa, 0xaa, + 0x1f, 0xf6, 0x66, 0x89, 0x97, 0x71, 0x77, 0x77, + 0x77, 0x6f, 0xf6, 0x77, 0x77, 0x77, 0x7f, 0xf8, + 0x88, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xf9, 0x88, + 0xef, 0xff, 0xfd, 0x88, 0x88, 0x88, 0x88, 0x8f, + 0xfc, 0x88, 0x88, 0x88, 0x88, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x88, 0x88, + 0x81, 0xff, 0x76, 0x89, 0x86, 0x89, 0x61, 0x88, + 0x88, 0xaa, 0xaa, 0xaa, 0xff, 0x97, 0x69, 0x95, + 0x37, 0x73, 0x77, 0x77, 0x77, 0x7e, 0xf7, 0x77, + 0x77, 0x77, 0x6f, 0xf8, 0x88, 0xff, 0xfc, 0x88, + 0x9f, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xf8, 0x88, + 0x88, 0x88, 0x88, 0x8b, 0xf8, 0x88, 0x88, 0x88, + 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x88, 0x88, 0x89, 0xf9, 0x78, 0x92, + 0x11, 0x11, 0x86, 0x88, 0x88, 0xaa, 0xaa, 0xaa, + 0xff, 0x67, 0x98, 0x11, 0x11, 0x16, 0x66, 0x66, + 0x77, 0x7e, 0xf7, 0x76, 0xee, 0x97, 0x6f, 0xf8, + 0x88, 0xff, 0xf8, 0x88, 0xff, 0xff, 0xf9, 0x88, + 0xef, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x8b, + 0xf8, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x88, + 0x7f, 0xf6, 0x69, 0x21, 0x11, 0x11, 0x36, 0x68, + 0x88, 0xaa, 0xaa, 0xa8, 0xfd, 0x66, 0x91, 0x11, + 0x11, 0x17, 0xff, 0xff, 0x77, 0x7e, 0xf7, 0x76, + 0xff, 0x97, 0x6f, 0xf8, 0x88, 0xff, 0xf8, 0x88, + 0xff, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xf8, 0x88, + 0xff, 0xff, 0x88, 0x8b, 0xf8, 0x88, 0xff, 0xff, + 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x28, 0x88, 0x5f, 0xf6, 0x79, 0x11, + 0x11, 0x11, 0x18, 0x48, 0x88, 0xaa, 0xaa, 0xa6, + 0xfb, 0x77, 0x21, 0x11, 0x11, 0x07, 0xff, 0xff, + 0x77, 0x7e, 0xf7, 0x76, 0xff, 0x96, 0x6f, 0xf8, + 0x88, 0xff, 0xd8, 0x88, 0xff, 0xff, 0xf9, 0x88, + 0xef, 0xff, 0xf8, 0x88, 0xff, 0xff, 0x88, 0x8b, + 0xf8, 0x88, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x88, + 0x7f, 0xf6, 0x77, 0x11, 0xf9, 0xa3, 0x16, 0x68, + 0x88, 0xaa, 0xaa, 0xaa, 0xfd, 0x67, 0x11, 0x1f, + 0xf6, 0x57, 0xff, 0xff, 0x77, 0x7e, 0xf7, 0x76, + 0xff, 0xff, 0xff, 0xf8, 0x88, 0xff, 0x88, 0x8c, + 0xff, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xf8, 0x88, + 0xff, 0xff, 0x88, 0x8b, 0xf8, 0x88, 0xff, 0xff, + 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x88, 0x89, 0xf8, 0x69, 0x11, + 0xcf, 0xff, 0x16, 0x88, 0x88, 0xaa, 0xaa, 0xaa, + 0xff, 0x66, 0x21, 0x1d, 0xf1, 0x77, 0xff, 0xff, + 0x77, 0x7e, 0xf7, 0x76, 0x66, 0x66, 0x7f, 0xf8, + 0x88, 0xff, 0x88, 0x8f, 0xff, 0xff, 0xf9, 0x88, + 0xef, 0xff, 0xf8, 0x88, 0xff, 0xff, 0x88, 0x8b, + 0xf8, 0x88, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x88, + 0x81, 0xff, 0x78, 0x11, 0xff, 0xff, 0x01, 0x88, + 0x88, 0xaa, 0xaa, 0xaa, 0x2f, 0x97, 0x91, 0x1f, + 0xe1, 0x67, 0xff, 0xff, 0x77, 0x7e, 0xf7, 0x77, + 0x66, 0x67, 0x6f, 0xf8, 0x88, 0xff, 0x88, 0x8f, + 0xff, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xf8, 0x88, + 0xff, 0xff, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xf9, + 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x88, 0x88, 0x6f, 0x66, 0x91, + 0xef, 0xff, 0x38, 0x88, 0x88, 0x9a, 0xaa, 0xaa, + 0x6c, 0xf6, 0x67, 0x1e, 0x36, 0x77, 0xff, 0xff, + 0x77, 0x7e, 0xf7, 0x76, 0xff, 0x97, 0x6f, 0xf8, + 0x88, 0xf9, 0x88, 0xef, 0xff, 0xff, 0xf9, 0x88, + 0xef, 0xff, 0xf8, 0x88, 0xff, 0xff, 0x88, 0x8b, + 0xff, 0xff, 0xff, 0x88, 0x88, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x28, + 0x88, 0x5a, 0xf7, 0x68, 0x1f, 0xff, 0x58, 0x88, + 0x88, 0x8a, 0xaa, 0xaa, 0xa3, 0xcf, 0x66, 0x83, + 0x17, 0x77, 0xff, 0xf8, 0x77, 0x6f, 0xf7, 0x76, + 0xff, 0x97, 0x6f, 0xf8, 0x88, 0xf8, 0x88, 0xff, + 0xff, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xf8, 0x88, + 0xff, 0xff, 0x88, 0x8b, 0xff, 0xff, 0xf8, 0x88, + 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x08, 0x88, 0x86, 0xaf, 0xfb, + 0x8c, 0x91, 0x88, 0x88, 0x88, 0x8a, 0xaa, 0xaa, + 0xaa, 0x82, 0xff, 0xdd, 0xc7, 0x77, 0x66, 0x67, + 0x76, 0xff, 0xf7, 0x76, 0xff, 0x97, 0x6f, 0xf8, + 0x88, 0xf8, 0x88, 0x88, 0xef, 0xff, 0xf9, 0x88, + 0xef, 0xff, 0xf8, 0x88, 0xff, 0xff, 0x88, 0x8b, + 0xff, 0xff, 0x88, 0x88, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x88, 0x88, 0x71, 0x15, 0x11, 0x78, 0x88, 0x88, + 0x88, 0x8a, 0xaa, 0xaa, 0xaa, 0xaa, 0x52, 0x11, + 0xf7, 0x77, 0x77, 0x77, 0x6e, 0xff, 0xf7, 0x76, + 0xdd, 0x97, 0x6f, 0xf8, 0x88, 0xf8, 0x88, 0x88, + 0x9f, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xf8, 0x88, + 0xff, 0xff, 0x88, 0x8b, 0xff, 0xfd, 0x88, 0x88, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x8a, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x38, 0xf7, 0x77, 0xff, 0xf8, + 0x77, 0x6f, 0xf7, 0x77, 0x77, 0x77, 0x6f, 0xf8, + 0x88, 0xff, 0xff, 0x88, 0x9f, 0xff, 0xf9, 0x88, + 0xef, 0xff, 0xf8, 0x88, 0xff, 0xff, 0x88, 0x8b, + 0xff, 0x88, 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, 0x0f, + 0xf7, 0x77, 0xff, 0xff, 0x77, 0x6e, 0xfe, 0x88, + 0x88, 0x88, 0xff, 0xf8, 0x88, 0xff, 0xff, 0x88, + 0x9f, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xf8, 0x88, + 0xff, 0xff, 0x88, 0x8b, 0xf8, 0x88, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x54, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0x91, 0xff, 0xf7, 0x77, 0xff, 0xff, + 0x77, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x88, 0xff, 0xff, 0x88, 0x9f, 0xff, 0xf9, 0x88, + 0xef, 0xff, 0xf8, 0x88, 0xff, 0xff, 0x88, 0x8b, + 0xf8, 0x88, 0xff, 0xff, 0xaa, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x89, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x1b, 0xff, + 0xf7, 0x77, 0xff, 0xff, 0x77, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x88, 0xff, 0xff, 0x88, + 0x9f, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xf8, 0x88, + 0xff, 0xff, 0x88, 0x8b, 0xf8, 0x88, 0xff, 0xff, + 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, + 0xaa, 0xa8, 0x6f, 0xff, 0xf7, 0x77, 0xff, 0xff, + 0x77, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x88, 0xff, 0xff, 0x88, 0x9f, 0xff, 0xf9, 0x88, + 0xef, 0xff, 0xf8, 0x88, 0xff, 0xff, 0x88, 0x8b, + 0xf8, 0x88, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x81, 0xff, 0xff, + 0xf7, 0x77, 0xff, 0xff, 0x77, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x88, 0xff, 0xff, 0x88, + 0x9f, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xf8, 0x88, + 0xff, 0xff, 0x88, 0x8b, 0xf8, 0x88, 0xff, 0xff, + 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x18, 0x88, + 0x88, 0x88, 0x88, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x87, 0x1f, 0xff, 0xff, 0xf7, 0x77, 0xff, 0xff, + 0x77, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x88, 0xee, 0xee, 0x88, 0x9f, 0xcc, 0xc9, 0x88, + 0xcc, 0xcc, 0xf8, 0x88, 0xee, 0xee, 0x88, 0x8b, + 0xf8, 0x88, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x28, 0x88, 0x9a, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa9, 0x88, 0x1c, 0xff, 0xff, 0xff, + 0xf7, 0x77, 0x77, 0x77, 0x77, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, + 0xaf, 0x88, 0x88, 0x88, 0x88, 0x88, 0xf8, 0x88, + 0x88, 0x88, 0x88, 0x8b, 0xf8, 0x88, 0x88, 0x88, + 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x88, 0x88, 0x99, 0xaa, 0x99, 0x98, 0x88, 0x50, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x66, 0x66, 0x66, + 0x66, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x88, 0x88, 0x88, 0x88, 0xff, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xfc, 0x88, 0x88, 0x88, 0x88, 0x8f, + 0xfb, 0x88, 0x88, 0x88, 0x88, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x11, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x31, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 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, 0x13, 0x55, 0x42, 0x10, 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, 0xfd, 0x19, + 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, 0xb6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x11, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0xec, + 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, 0xff, 0xff, + 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 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, 0x37, 0x15, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x11, + 0x23, 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, 0x48, 0x19, 0x19, 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, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x1a, + 0x1a, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x18, 0x1a, 0x1a, 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, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0xa9, + 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, 0xff, 0xff, 0xff, 0xff, 0xff, + 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, 0xf8, 0x11, 0x1f, 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, 0xae, 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, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 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, 0xfd, 0xaf, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xca, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 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, 0xfa, 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, 0xcc, 0xff, 0xfa, + 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, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 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, 0xfa, 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, 0xfe, 0x8f, 0xff, 0xfa, + 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, + 0xf8, 0xef, 0xff, 0xfa, 0xff, 0xff, 0xe7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 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, +}; diff --git a/2.5/boards/ek-lm3s1968/examples/gps/main.c b/2.5/boards/ek-lm3s1968/examples/gps/main.c new file mode 100644 index 00000000..5e32dc5e --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/main.c @@ -0,0 +1,567 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief DevelGPS demo application with gps. + */ + +#include "hw/hw_led.h" + +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include /* BM_PLOT() */ +#include +#include + +#include "compass.h" + +/* OLED/GUI stuff */ +#include "logo.c" +#define KEY_MASK (K_UP | K_DOWN | K_LEFT | K_RIGHT | K_OK) +extern Font font_gohu; +static uint8_t raster[RAST_SIZE(LCD_WIDTH, LCD_HEIGHT)]; +static Bitmap lcd_bitmap; + +#define SCRSVR_TIME 60000 +static ticks_t scrsvr_timestamp; +static bool is_lcd_off; + +/* Serial and NMEA stuff */ +static Serial ser_port; +static nmeap_context_t nmea; +static NmeaGga gga; +static NmeaRmc rmc; +static NmeaVtg vtg; +static bool nmea_update; + +static long prev_b; +static long lat, lon; +static long target_lat, target_lon; + +/* Storage stuff */ +#define GPS_POS_MAGIC 0xdeadbeef +static Flash flash; + +static void flash_load_target(void) +{ + uint32_t magic; + + kfile_seek(&flash.fd, -FLASH_PAGE_SIZE_BYTES, KSM_SEEK_END); + kfile_read(&flash.fd, &magic, sizeof(magic)); + if (magic == GPS_POS_MAGIC) + { + kfile_read(&flash.fd, &target_lat, sizeof(target_lat)); + kfile_read(&flash.fd, &target_lon, sizeof(target_lon)); + } +} + +static void flash_save_target(void) +{ + const uint32_t magic = GPS_POS_MAGIC; + + kfile_seek(&flash.fd, -FLASH_PAGE_SIZE_BYTES, KSM_SEEK_END); + kfile_write(&flash.fd, &magic, sizeof(magic)); + kfile_write(&flash.fd, &target_lat, sizeof(target_lat)); + kfile_write(&flash.fd, &target_lon, sizeof(target_lon)); + kfile_flush(&flash.fd); +} + + +/* Display management */ +INLINE void video_off(void) +{ + unsigned long delta = + (long)ticks_to_ms(timer_clock_unlocked()) - + (long)scrsvr_timestamp; + + if (!is_lcd_off && delta > SCRSVR_TIME) + { + rit128x96_off(); + is_lcd_off = true; + } +} + +INLINE void video_on(void) +{ + if (is_lcd_off) + { + rit128x96_on(); + is_lcd_off = false; + } + scrsvr_timestamp = ticks_to_ms(timer_clock_unlocked()); +} + +INLINE void repaint(Bitmap *bm) +{ + rit128x96_blitBitmap(bm); +} + +INLINE keymask_t keypad_peek(void) +{ + keymask_t key = kbd_peek(); + + if (key & KEY_MASK) + { + if (is_lcd_off) + key = 0; + video_on(); + } + return key; +} + +/* Status LED thread */ +static void NORETURN led_process(void) +{ + while (1) + { + video_off(); + if (!nmea_update) + { + timer_delay(1000); + continue; + } + LED_ON(); + timer_delay(100); + LED_OFF(); + nmea_update = false; + } +} + +/* NMEA parser */ +static void nmea_callback(nmeap_context_t *context, void *data, void *user_data) +{ + (void)context; + (void)data; + (void)user_data; + + lat = (long)gga.latitude; + lon = (long)gga.longitude; + + nmea_update = true; +} + +static void NORETURN ser_process(void) +{ + while (1) + { + nmea_poll(&nmea, &ser_port.fd); + kfile_clearerr(&ser_port.fd); + } +} + +/* Target position screen */ +static void target(Bitmap *bm) +{ + const long STEP = 10000000, + MAX_LAT = 90000000, MIN_LAT = -90000000, + MAX_LON = 180000000, MIN_LON = -180000000; + long step = STEP, target; + int row = 0, pos = 1; + keymask_t key; + + gfx_bitmapClear(bm); + video_on(); + text_xprintf(bm, 0, 0, + STYLEF_UNDERLINE | TEXT_CENTER | TEXT_FILL, + "Target position"); + while (1) + { + if (!is_lcd_off) + { + text_xprintf(bm, 3, 0, TEXT_FILL, + "Lat: %02ld.%06ld %c %s", + ABS(target_lat) / 1000000L, + ABS(target_lat) % 1000000, + target_lat >= 0 ? 'N' : 'S', + row == 0 ? "<-" : ""); + text_xprintf(bm, row ? 4 : 6, 0, + TEXT_FILL | TEXT_CENTER, " "); + text_xprintf(bm, row ? 6 : 4, 0, + TEXT_FILL, "%*c", + (step < 1000000L) ? + pos + 7 : pos + 6, '^'); + text_xprintf(bm, 5, 0, TEXT_FILL, + "Lon: %03ld.%06ld %c %s", + ABS(target_lon) / 1000000L, + ABS(target_lon) % 1000000L, + target_lon >= 0 ? 'E' : 'W', + row == 1 ? "<-" : ""); + repaint(bm); + } + key = keypad_peek(); + if (key & K_UP) + { + if (row == 0) + { + target = target_lat + step; + if (target <= MAX_LAT) + { + if (target_lat < 0 && target > 0) + target_lat = ABS(target_lat) + + step; + else + target_lat = target; + } + } + else + { + target = target_lon + step; + if (target <= MAX_LON) + { + if (target_lon < 0 && target > 0) + target_lon = ABS(target_lon) + + step; + else + target_lon = target; + } + } + } + else if (key & K_DOWN) + { + if (row == 0) + { + target = target_lat - step; + if (target >= MIN_LAT) + { + if (target_lat > 0 && target < 0) + target_lat = -ABS(target_lat) - + step; + else + target_lat = target; + } + } + else + { + target = target_lon - step; + if (target >= MIN_LON) + { + if (target_lon > 0 && target < 0) + target_lon = -ABS(target_lon) - + step; + else + target_lon = target; + } + } + } + else if (key & K_LEFT) + { + if (step < STEP) + { + step *= 10; + pos--; + } + } + else if (key & K_RIGHT) + { + if (step >= 10) + { + step /= 10; + pos++; + } + } + else if (key & K_OK) + { + if (row++ == 1) + break; + /* Move to longigude */ + } + cpu_relax(); + } + flash_save_target(); +} + +/* Compass management */ +static void draw_compass(Bitmap *bm) +{ + const int R = LCD_HEIGHT / 3, R_SMALL = 10; + long x, y, x1, y1, x2, y2, d; + int i; + + d = distance(lat / 1E6, lon / 1E6, target_lat / 1E6, target_lon / 1E6); + + x = (long)((float)R * (1 + sin(deg2rad((float)prev_b)))); + y = (long)((float)R * (1 - cos(deg2rad((float)prev_b)))); + + x1 = R - R_SMALL + (long)((float)R_SMALL * + (1 + sin(deg2rad((float)prev_b - 120.0)))); + y1 = R - R_SMALL + (long)((float)R_SMALL * + (1 - cos(deg2rad((float)prev_b - 120.0)))); + x2 = R - R_SMALL + (long)((float)R_SMALL * + (1 + sin(deg2rad((float)prev_b + 120.0)))); + y2 = R - R_SMALL + (long)((float)R_SMALL * + (1 - cos(deg2rad((float)prev_b + 120.0)))); + + gfx_bitmapClear(bm); + /* Print direction heading and degrees */ + text_xprintf(bm, 0, 5, 0, "%s", "N"); + text_xprintf(bm, 0, 0, TEXT_RIGHT, "%s", compass_heading(prev_b)); + text_xprintf(bm, 1, 0, TEXT_RIGHT, "%ld deg.", prev_b); + /* Print distance */ + text_xprintf(bm, 2, 0, TEXT_RIGHT, "%ld %s", + d >= 1000 ? d / 1000 : d, + d >= 1000 ? "Km" : "m"); + /* Print current and target position */ + text_xprintf(bm, 6, 0, TEXT_FILL, "%02ld.%06ld%c%03ld.%06ld%c", + ABS(lat) / 1000000L, + ABS(lat) % 1000000, + lat >= 0 ? 'N' : 'S', + ABS(lon) / 1000000L, + ABS(lon) % 1000000L, + lon >= 0 ? 'E' : 'W'); + text_xprintf(bm, 7, 0, TEXT_FILL, "%02ld.%06ld%c%03ld.%06ld%c", + ABS(target_lat) / 1000000L, + ABS(target_lat) % 1000000, + target_lat >= 0 ? 'N' : 'S', + ABS(target_lon) / 1000000L, + ABS(target_lon) % 1000000L, + target_lon >= 0 ? 'E' : 'W'); + /* Draw the circle */ + for (i = 0; i < 360; i++) + BM_PLOT(bm, + (long)((float)R * (1 + sin(deg2rad((float)i)))), + (long)((float)R * (1 - cos(deg2rad((float)i))))); + /* Draw the needle */ + gfx_rectFill(bm, R - 2, R - 2, R + 2, R + 2); + gfx_line(bm, R, R, x1, y1); + gfx_line(bm, R, R, x2, y2); + gfx_line(bm, x1, y1, x, y); + gfx_line(bm, x2, y2, x, y); + + repaint(bm); +} + +static void compass(Bitmap *bm) +{ + long b, inc; + + video_on(); + while (1) + { + if (!is_lcd_off) + { + b = bearing(lat / 1E6, lon / 1E6, + target_lat / 1E6, target_lon / 1E6); + inc = ABS(b - prev_b) < 360 - ABS(b - prev_b) ? 1 : -1; + /* Compass animation */ + if (b < prev_b) + inc = -inc; + while (prev_b != b) + { + prev_b = (prev_b + inc) % 360; + if (prev_b < 0) + prev_b = 359; + if (!(prev_b % 5)) + draw_compass(bm); + if (keypad_peek() & KEY_MASK) + return; + } + draw_compass(bm); + } + cpu_relax(); + if (keypad_peek() & KEY_MASK) + return; + } +} + +/* GPS receiver status */ +static const char *gps_fix[] = +{ + "invalid", + "GPS", + "DGPS", + "PPS", + "RTK", + "float-RTK", + "estimated", + "manual", + "simulation", +}; + +static void gps_data(Bitmap *bm) +{ + struct tm tm; + char buf[32]; + + video_on(); + gfx_bitmapClear(bm); + while (1) + { + if (!is_lcd_off) + { + if (!rmc.time) + { + text_xprintf(bm, 3, 0, + TEXT_CENTER | TEXT_FILL, "No GPS data"); + } + else + { + gmtime_r(&rmc.time, &tm); + + text_xprintf(bm, 0, 0, TEXT_FILL, + "Lat. %ld.%06ld%c", + ABS(lat) / 1000000L, + ABS(lat) % 1000000, + lat >= 0 ? 'N' : 'S'); + text_xprintf(bm, 1, 0, TEXT_FILL, + "Lon. %ld.%06ld%c", + ABS(lon) / 1000000L, + ABS(lon) % 1000000L, + lon >= 0 ? 'E' : 'W'); + text_xprintf(bm, 2, 0, TEXT_FILL, + "Alt. %d", gga.altitude); + text_xprintf(bm, 3, 0, TEXT_FILL, + "Speed: %d", vtg.km_speed); + if (gga.quality < countof(gps_fix)) + text_xprintf(bm, 4, 0, TEXT_FILL, + "Fix: %s", + gps_fix[gga.quality]); + else + text_xprintf(bm, 4, 0, TEXT_FILL, + "Fix: %d", gga.quality); + text_xprintf(bm, 5, 0, TEXT_FILL, + "Satellites: %d", + gga.satellites); + strftime(buf, sizeof(buf), + "Date: %Y-%m-%d %a", &tm); + text_xprintf(bm, 6, 0, TEXT_FILL, "%s", buf); + strftime(buf, sizeof(buf), + "Time: %H:%M:%S (UTC)", &tm); + text_xprintf(bm, 7, 0, TEXT_FILL, "%s", buf); + } + repaint(bm); + } + if (keypad_peek() & KEY_MASK) + break; + cpu_relax(); + } +} + +/* BeRTOS screen */ +static void about(Bitmap *bm) +{ + gfx_bitmapClear(bm); + video_on(); + text_xprintf(bm, 7, 0, + STYLEF_UNDERLINE | TEXT_CENTER | TEXT_FILL, + "http://www.bertos.org"); + repaint(bm); + if (!is_lcd_off) + { + const uint8_t *p = &logo[BITMAP_HEADER_SIZE]; + uint8_t h = logo[BITMAP_HEIGHT_OFFSET]; + uint8_t w = logo[BITMAP_WIDTH_OFFSET]; + uint8_t r; + + for (r = 0; r < h; r++) + { + rit128x96_blitRaw(p, + (128 - w) / 2, 70 - r, w, 1); + p += w / 2; + } + } + while (!(keypad_peek() & KEY_MASK)) + cpu_relax(); +} + +static struct MenuItem main_items[] = +{ + {(const_iptr_t)"Target", 0, (MenuHook)target, (iptr_t)&lcd_bitmap}, + {(const_iptr_t)"Compass", 0, (MenuHook)compass, (iptr_t)&lcd_bitmap}, + {(const_iptr_t)"GPS data", 0, (MenuHook)gps_data, (iptr_t)&lcd_bitmap}, + {(const_iptr_t)"About...", 0, (MenuHook)about, (iptr_t)&lcd_bitmap}, + {(const_iptr_t)0, 0, NULL, (iptr_t)NULL} +}; + +static struct Menu main_menu = +{ + main_items, "DevelGPS v0.1", MF_STICKY | MF_SAVESEL, &lcd_bitmap, 0, rit128x96_blitBitmap +}; + +static void init(void) +{ + IRQ_ENABLE; + + kdbg_init(); + timer_init(); + proc_init(); + + scrsvr_timestamp = ticks_to_ms(timer_clock_unlocked()); + LED_INIT(); + + flash_init(&flash); + flash_load_target(); + + ser_init(&ser_port, SER_UART1); + ser_setbaudrate(&ser_port, 38400); + + nmeap_init(&nmea, NULL); + nmeap_addParser(&nmea, "GPGGA", nmea_gpgga, nmea_callback, &gga); + nmeap_addParser(&nmea, "GPRMC", nmea_gprmc, nmea_callback, &rmc); + nmeap_addParser(&nmea, "GPVTG", nmea_gpvtg, nmea_callback, &vtg); + + rit128x96_init(); + gfx_bitmapInit(&lcd_bitmap, raster, LCD_WIDTH, LCD_HEIGHT); + gfx_setFont(&lcd_bitmap, &font_gohu); + repaint(&lcd_bitmap); + + kbd_init(); +} + +int main(void) +{ + init(); + + proc_new(led_process, NULL, KERN_MINSTACKSIZE * 2, NULL); + proc_new(ser_process, NULL, KERN_MINSTACKSIZE * 2, NULL); + + while (1) + { + iptr_t res = menu_handle(&main_menu); + if (res != MENU_TIMEOUT) + video_on(); + cpu_relax(); + } +} diff --git a/2.5/boards/ek-lm3s1968/examples/gps/project.bertos b/2.5/boards/ek-lm3s1968/examples/gps/project.bertos new file mode 100644 index 00000000..4e4b40a1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/examples/gps/project.bertos @@ -0,0 +1,94 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V50000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vgps +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Varm-none-eabi +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V/scratch/sandra/lite/src/gcc-4.2/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libgomp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --disable-shared --with-newlib --with-pkgversion=Sourcery G++ Lite 2008q1-126 --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/sandra/lite/eabi/install/arm-none-eabi --enable-poison-system-directories --with-build-time-tools=/scratch/sandra/lite/eabi/install/arm-none-eabi/bin --with-build-time-tools=/scratch/sandra/lite/eabi/install/arm-none-eabi/bin +p15 +sVversion +p16 +V4.2.3 +p17 +sVbuild +p18 +VSourcery G++ Lite 2008q1-126 +p19 +sVpath +p20 +V/usr/local/arm-2008q1/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'kernel' +p24 +aS'ser' +p25 +aS'text' +p26 +aS'kbd' +p27 +aS'formatwr' +p28 +aS'text_format' +p29 +aS'sprintf' +p30 +aS'semaphores' +p31 +aS'kfile' +p32 +aS'lcd_rit128x96' +p33 +aS'heap' +p34 +aS'timer' +p35 +aS'debug' +p36 +aS'nmea' +p37 +aS'signal' +p38 +asS'CPU_NAME' +p39 +VLM3S1968 +p40 +sS'PROJECT_HW_PATH' +p41 +S'../..' +p42 +sS'PROJECT_SRC_PATH' +p43 +S'.' +p44 +sS'PRESET' +p45 +NsS'OUTPUT' +p46 +(lp47 +s. \ No newline at end of file diff --git a/2.5/boards/ek-lm3s1968/hw/hw_afsk.c b/2.5/boards/ek-lm3s1968/hw/hw_afsk.c new file mode 100644 index 00000000..8adb432d --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_afsk.c @@ -0,0 +1,41 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * + * \author Francesco Sacchi + */ + + +#include "hw_afsk.h" + diff --git a/2.5/boards/ek-lm3s1968/hw/hw_afsk.h b/2.5/boards/ek-lm3s1968/hw/hw_afsk.h new file mode 100644 index 00000000..ec9b8be2 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_afsk.h @@ -0,0 +1,87 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_AFSK_H +#define HW_AFSK_H + +#include "cfg/cfg_arch.h" + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Initialize the specified channel of the ADC for AFSK needs. + * The adc should be configured to have a continuos stream of convertions. + * For every convertion there must be an ISR that read the sample + * and call afsk_adc_isr(), passing the context and the sample. + * + * \param ch channel to be used for AFSK demodulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_adc_isr() for every convertion. + */ +#define AFSK_ADC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) + +#define AFSK_STROBE_INIT() do { /* Implement me */ } while (0) +#define AFSK_STROBE_ON() do { /* Implement me */ } while (0) +#define AFSK_STROBE_OFF() do { /* Implement me */ } while (0) + +/** + * Initialize the specified channel of the DAC for AFSK needs. + * The DAC has to be configured in order to call an ISR for every sample sent. + * The DAC doesn't have to start the IRQ immediatly but have to wait + * the AFSK driver to call AFSK_DAC_IRQ_START(). + * The ISR must then call afsk_dac_isr() passing the AFSK context. + * \param ch DAC channel to be used for AFSK modulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_dac_isr() for every convertion. + */ +#define AFSK_DAC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) + +/** + * Start DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_START(ch) do { (void)ch; /* Implement me */ } while (0) + +/** + * Stop DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_STOP(ch) do { (void)ch; /* Implement me */ } while (0) + +#endif /* HW_AFSK_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_buzzer.h b/2.5/boards/ek-lm3s1968/hw/hw_buzzer.h new file mode 100644 index 00000000..858ecbfb --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_buzzer.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Buzzer hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_BUZZER_H +#define HW_BUZZER_H + +#warning TODO:This is an example implementation, you must implement it! + +#define BUZZER_BIT 1 +#define IS_BUZZER_ON 0 +#define BUZZER_HW_INIT do { /* Implement me! */ } while (0) +#define BUZZER_ON do { /* Implement me! */ } while (0) +#define BUZZER_OFF do { /* Implement me! */ } while (0) + +#endif /* HW_BUZZER_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_dataflash.c b/2.5/boards/ek-lm3s1968/hw/hw_dataflash.c new file mode 100644 index 00000000..844dd922 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_dataflash.c @@ -0,0 +1,126 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_dataflash.h" + +#include +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +MOD_DEFINE(hw_dataflash); + +/** + * Data flash init function. + * + * This function provide to initialize all that + * needs to drive a dataflash memory. + * Generaly needs to init pins to drive a CS line + * and reset line. + */ +void dataflash_hw_init(void) +{ + + //Disable CS line (remove if not needed) + dataflash_hw_setCS(false); + + /* + * Put here your code! + * + * Note: + * - if you drive manualy CS line, here init a CS pin + * - if you use a dedicated reset line, here init a reset pin + */ + + MOD_INIT(hw_dataflash); +} + +/** + * Chip Select drive. + * + * This function enable or disable a CS line. + * You must implement this function comply to a dataflash + * memory datasheet to allow the drive to enable a memory + * when \p enable flag is true, and disable it when is false. + */ +void dataflash_hw_setCS(bool enable) +{ + if (enable) + { + /* + * Put here your code to enable + * dataflash memory + */ + } + else + { + /* + * Put here your code to disable + * dataflash memory + */ + } +} + +/** + * Reset data flash memory. + * + * This function provide to send reset signal to + * dataflash memory. You must impement it comly to a dataflash + * memory datasheet to allow the drive to set a reset pin + * when \p enable flag is true, and disable it when is false. + * + */ +void dataflash_hw_setReset(bool enable) +{ + if (enable) + { + /* + * Put here your code to set reset of + * dataflash memory + */ + } + else + { + /* + * Put here your code to clear reset of + * dataflash memory + */ + } +} + diff --git a/2.5/boards/ek-lm3s1968/hw/hw_dataflash.h b/2.5/boards/ek-lm3s1968/hw/hw_dataflash.h new file mode 100644 index 00000000..5254446b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_dataflash.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines (interface). + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_DATAFLASH_H +#define HW_DATAFLASH_H + +#include + +void dataflash_hw_init(void); +void dataflash_hw_setCS(bool enable); +void dataflash_hw_setReset(bool enable); + +#endif /* HW_DATAFLASH_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_dc_motor.h b/2.5/boards/ek-lm3s1968/hw/hw_dc_motor.h new file mode 100644 index 00000000..8b8dd4b4 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_dc_motor.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief DC motor hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_DC_MOTOR_H +#define HW_DC_MOTOR_H + +typedef enum MotorDCMap +{ + + /* Put here motor dc declaration */ + MOTOR_DC_CNT + +} MotorDCMap; + +/* + * Init all pin and device to manage dc motor. + */ +#define MOTOR_DC_INIT() \ + do { \ + /* Implement me! */ \ + } while (0) + + +/* + * Enable DC motor. + */ +#define DC_MOTOR_ENABLE(dev) \ + do { \ + /* Implement me! */ \ + } while (0) + +/* + * Disable DC motor. + */ +#define DC_MOTOR_DISABLE(dev) \ + do { \ + /* Implement me! */ \ + } while (0) + +/* + * Set direction for DC motor. + */ +#define DC_MOTOR_SET_DIR(dev, dir) \ + do { \ + /* Implement me! */ \ + } while (0) + + +#endif /* HW_DC_MOTOR_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_ft245rl.h b/2.5/boards/ek-lm3s1968/hw/hw_ft245rl.h new file mode 100644 index 00000000..cc0c8193 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_ft245rl.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief FT245RL USB interface hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_FT245RL_H +#define HW_FT245RL_H + +#warning TODO:This is an example implementation, you must implement it! + +#define FT245RL_DATA_IN() /* Implement me! */ +#define FT245RL_DATA_OUT() /* Implement me! */ +#define WR_HI /* Implement me! */ +#define WR_LO /* Implement me! */ + +#define RD_HI /* Implement me! */ +#define RD_LO /* Implement me! */ + +#define FT245RL_INIT() \ +do \ +{ \ + /* Implement me! */ \ +} while(0) + +#define FT245RL_DATA_RDY() (/* Implement me! */ false) +#define FT245RL_GETDATA() ({/* Implement me! */ (0);}) +#define FT245RL_TX_ALLOWED() (/* Implement me! */ false) +#define FT245RL_SETDATA(data) do {/* Implement me! */ (void)((data)); } while(0) + +#endif /* HW_FT245RL_H */ + diff --git a/2.5/boards/ek-lm3s1968/hw/hw_i2c_bitbang.h b/2.5/boards/ek-lm3s1968/hw/hw_i2c_bitbang.h new file mode 100644 index 00000000..4822af7c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_i2c_bitbang.h @@ -0,0 +1,66 @@ +/** + * \file + * + * + * \brief Macro for I2C bitbang operation. + * + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_I2C_BITBANG_H +#define HW_I2C_BITBANG_H + +#warning TODO:This is an example implementation, you must implement it! + +#define SDA_HI do { /* Implement me:Set SDA High by setting SDA pin as input */ } while (0) +#define SDA_LO do { /* Implement me:Set SDA Low by setting SDA pin as open collector output */ } while (0) +#define SCL_HI do { /* Implement me:Set SCL High by setting SCL pin as input */ } while (0) +#define SCL_LO do { /* Implement me:Set SCL Low by setting SCL pin as open collector output */ } while (0) + + +#define SCL_IN (true) /* Implement me: read SDA pin state */ +#define SDA_IN (true) /* Implement me: read SCL pin state */ + +/** + * This macro should set SDA and SCL lines as input. + */ +#define I2C_BITBANG_HW_INIT do { /* Implement me! */ } while (0) + +/** + * Half bit delay routine used to generate the correct timings. + */ +#define I2C_HALFBIT_DELAY() do { /* Implement me! */ } while (0) + +#endif /* HW_I2C_BITBANG_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_kbd.h b/2.5/boards/ek-lm3s1968/hw/hw_kbd.h new file mode 100644 index 00000000..10562f79 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_kbd.h @@ -0,0 +1,66 @@ +/** + * \file + * + * + * \brief LM3S1968 keypad: hardware-specific definitions + * + * \author Andrea Righi + */ + +#ifndef HW_KBD_H +#define HW_KBD_H + +#include /* BV() */ +#include /* GPIO_PORTG_BASE */ +#include /* lm3s_gpioPinConfig() / lm3s_gpioPinRead() */ +#include "hw/kbd_map.h" + +#define K_RPT_MASK (K_UP | K_DOWN | K_LEFT | K_RIGHT | K_OK) + +#define KBD_HW_INIT \ + do { \ + lm3s_gpioPinConfig(GPIO_PORTG_BASE, \ + K_RPT_MASK, \ + GPIO_DIR_MODE_IN, \ + GPIO_STRENGTH_2MA, \ + GPIO_PIN_TYPE_STD_WPU); \ + } while (0) + +/** + * Read the keyboard ports and return the mask of depressed keys. + */ +INLINE keymask_t kbd_readkeys(void) +{ + return ~lm3s_gpioPinRead(GPIO_PORTG_BASE, + K_UP | K_DOWN | K_LEFT | K_RIGHT | K_OK); +} + +#endif /* HW_KBD_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_lcd_32122a.h b/2.5/boards/ek-lm3s1968/hw/hw_lcd_32122a.h new file mode 100644 index 00000000..6ec29c5c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_lcd_32122a.h @@ -0,0 +1,155 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_32122A_H +#define HW_LCD_32122A_H + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Predefined LCD PWM contrast values + */ +#define LCD_DEF_PWM 145 +#define LCD_MAX_PWM 505 +#define LCD_MIN_PWM 130 +#define LCD_PWM_CH 0 + + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_PE_E1 /* Implement me! */ +#define LCD_PE_E2 /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +#define LCD_PF_DB0 /* Implment me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_A0 do { /* Implement me! */ } while (0) +#define LCD_SET_A0 do { /* Implement me! */ } while (0) +#define LCD_CLR_RD do { /* Implement me! */ } while (0) +#define LCD_SET_RD do { /* Implement me! */ } while (0) +#define LCD_CLR_E1 do { /* Implement me! */ } while (0) +#define LCD_SET_E1 do { /* Implement me! */ } while (0) +#define LCD_CLR_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E(x) do { (void)x; /* Implement me! */ } while (0) +#define LCD_CLR_E(x) do { (void)x; /* Implement me! */ } while (0) +/*@}*/ + +/** + * \name Chip select bits for LCD_SET_E() + * @{ + */ +#define LCDF_E1 ( 0/* Implement me! */) +#define LCDF_E2 ( 0/* Implement me! */) +/*@}*/ +/** Read from the LCD data bus (DB[0-7]) */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/** Write to the LCD data bus (DB[0-7]) */ +#define LCD_READ (0 /* Implement me! */ ) + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ + +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + +#define LCD_32122_RESET() do { /* Implement me! */ } while (0) + +INLINE void lcd_32122a_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_32122A_H */ + diff --git a/2.5/boards/ek-lm3s1968/hw/hw_lcd_hd44.h b/2.5/boards/ek-lm3s1968/hw/hw_lcd_hd44.h new file mode 100644 index 00000000..dfebbcab --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_lcd_hd44.h @@ -0,0 +1,157 @@ +/** + * \file + * + * + * \brief LCD low-level hardware macros + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_HD44_H +#define HW_LCD_HD44_H + +#include "cfg/cfg_lcd_hd44.h" /* CONFIG_LCD_4BIT */ + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_E /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +/*@}*/ + +/** + * \name DB high nibble (DB[4-7]) + * @{ + */ + +#if CONFIG_LCD_4BIT + #define LCD_MASK (LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4) + #define LCD_SHIFT 4 +#else + #define LCD_MASK (uint8_t)0xff + #define LCD_SHIFT 0 +#endif +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_RS /* Implement me! */ +#define LCD_SET_RS /* Implement me! */ +#define LCD_CLR_RD /* Implement me! */ +#define LCD_SET_RD /* Implement me! */ +#define LCD_CLR_E /* Implement me! */ +#define LCD_SET_E /* Implement me! */ + +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +#if CONFIG_LCD_4BIT + #define LCD_WRITE_H(x) ((void)x)/* Implement me! */ + #define LCD_WRITE_L(x) ((void)x)/* Implement me! */ + #define LCD_READ_H ( 0 /* Implement me! */ ) + #define LCD_READ_L ( 0 /* Implement me! */ ) +#else + #define LCD_WRITE(x) ((void)x)/* Implement me! */ + #define LCD_READ (0 /* Implement me! */ ) +#endif +/*@}*/ + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + + +INLINE void lcd_hd44_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_HD44_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_led.h b/2.5/boards/ek-lm3s1968/hw/hw_led.h new file mode 100644 index 00000000..f203119a --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_led.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Led on/off macros. + * + * \author Daniele Basile + */ + +#ifndef HW_LED_H +#define HW_LED_H + +#include + +#include + +#define LED_ON() GPIO_PORTG_DATA_R |= BV(2) +#define LED_OFF() GPIO_PORTG_DATA_R &= ~BV(2) + +#define LED_INIT() \ + do { \ + SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOG; \ + (void)SYSCTL_RCGC2_R; \ + GPIO_PORTG_DIR_R = BV(2); \ + GPIO_PORTG_DEN_R = BV(2); \ + } while(0) + +#endif /* HW_LED_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_lm75.h b/2.5/boards/ek-lm3s1968/hw/hw_lm75.h new file mode 100644 index 00000000..290dae09 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_lm75.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_LM75_H +#define HW_LM75_H + +#warning TODO:This is an example implentation, you must implement it! + +#define LM75_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_LM75_H */ + diff --git a/2.5/boards/ek-lm3s1968/hw/hw_mcp41.c b/2.5/boards/ek-lm3s1968/hw/hw_mcp41.c new file mode 100644 index 00000000..dc2a051c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_mcp41.c @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_mcp41.h" + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +const uint16_t mcp41_ports[MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; +const uint8_t mcp41_pins [MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; + diff --git a/2.5/boards/ek-lm3s1968/hw/hw_mcp41.h b/2.5/boards/ek-lm3s1968/hw/hw_mcp41.h new file mode 100644 index 00000000..645b6dac --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_mcp41.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_MCP41_H +#define HW_MCP41_H + +#include "hw/mcp41_map.h" + +#include + + +#warning TODO:This is an example implementation, you must implement it! + + +INLINE void SET_MCP41_DDR(Mcp41Dev dev) +{ + /* Implement me! */ + //Warning: this funtions is like avr target name, + //fix it to comply for all target. + + //Only for test remove when implement this function + (void)dev; +} + +INLINE void MCP41_ON(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void MCP41_OFF(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +#endif /* HW_MCP41_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_ntc.c b/2.5/boards/ek-lm3s1968/hw/hw_ntc.c new file mode 100644 index 00000000..3048725c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_ntc.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id$ + * \author Lorenzo Berni + * + */ + +#include +#include "hw/ntc_map.h" + +const res_t NTC_RSER[NTC_CNT]; +const res_t NTC_RPAR[NTC_CNT]; +const amp_t NTC_AMP[NTC_CNT]; +const NtcHwInfo* NTC_INFO[NTC_CNT]; diff --git a/2.5/boards/ek-lm3s1968/hw/hw_ntc.h b/2.5/boards/ek-lm3s1968/hw/hw_ntc.h new file mode 100644 index 00000000..49152a45 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_ntc.h @@ -0,0 +1,136 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id$ + * \author Francesco Sacchi + * + * A NTC acts as a variable resistor, whose resistance changes as a + * function of the temperature it measures. To sample it correctly, it is + * usually parallelized and serialized with two fixed resistor. The following diagram shows + * what is the exact disposition of the components, as handled by this + * library: + * + *
+ *                 o Vref
+ *                 |
+ *                 |                               o Vref
+ *                 |                               |
+ *               -----                             |
+ *              |     |                        ---------
+ *              | Rser|                       |         |
+ *              |     |                       |         |
+ *               -----     -----              |   ADC   |
+ *                 | Vp   |     |             |         |
+ *      -----------|------| Amp |-------------|         |
+ *     |           |      |     |      Vadc   |         |
+ *   -----       -----     -----               ---------
+ *  |     |     |     |
+ *  | NTC |     | Rpar|
+ *  |     |     |     |
+ *   -----       -----
+ *     |           |
+ *     |           |
+ *   -----       -----
+ *    ---         ---
+ *
+ * Amp is an amplifier that amplify of AMP times the signal. + * If we indicate Rp as the parallel of NTC with Rpar, ADCBITS as the bits of the ad converter + * and ADCVAL as the result from the adc convertion (Not Vadc but just the value read + * from the adc register), after various calculation, the expression of Rp is: + * + *
+ *
+ *            ADCVAL * Rser
+ * Rp = ------------------------
+ *         ADCBITS
+ *	2         * AMP - ADCVAL
+ *
+ * + * And after that NTC obvisiously is: + *
+ *        Rpar * Rp
+ * NTC = ----------
+ *        Rpar - Rp
+ *
+ * + * + * The function ntc_hw_read() compute the resistence using these formulas above. + */ + +#ifndef HW_NTC_H +#define HW_NTC_H + +#include "ntc_map.h" + +#include + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +extern const res_t NTC_RSER[NTC_CNT]; +extern const res_t NTC_RPAR[NTC_CNT]; +extern const amp_t NTC_AMP[NTC_CNT]; +extern const NtcHwInfo* NTC_INFO[NTC_CNT]; + + +/*! + * Read the resistence of ntc device \a dev. + * Return the result in res_t type. + */ +INLINE res_t ntc_hw_read(NtcDev dev) +{ + ASSERT(dev < NTC_CNT); + // See above for formula explanation. + adcread_t adcval = adc_read((uint16_t)dev); + float rp = (adcval * NTC_RSER[dev] ) / ((1 << adc_bits()) * NTC_AMP[dev] - adcval); + + //kprintf("Rp[%f], Rntc[%f]\n", rp/100, ((NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp)) / 100.0); + + return ( (NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp) ); +} + + +/*! + * Return the info (aka the table) associated with ntc device \a dev. + */ +INLINE const NtcHwInfo* ntc_hw_getInfo(NtcDev dev) +{ + return NTC_INFO[dev]; +} + +#define NTC_HW_INIT do { /* Implement me! */ } while(0) + +#endif /* HW_NTC_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_phase.c b/2.5/boards/ek-lm3s1968/hw/hw_phase.c new file mode 100644 index 00000000..54509ef3 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_phase.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/hw_phase.h" + +#warning TODO:This is an example implementation, you must implement it! + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_phase.h b/2.5/boards/ek-lm3s1968/hw/hw_phase.h new file mode 100644 index 00000000..7649e702 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_phase.h @@ -0,0 +1,80 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/phase_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define PHASE_HW_INIT do { /* Implement me! */ }while (0) + +INLINE void TRIAC_OFF(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + + +INLINE void TRIAC_ON(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void SET_TRIAC_DDR(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +void zerocross_isr(void); +#define DEFINE_ZEROCROSS_ISR() void zerocross_isr(void) + + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_rit128x96.h b/2.5/boards/ek-lm3s1968/hw/hw_rit128x96.h new file mode 100644 index 00000000..a7cfcd01 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_rit128x96.h @@ -0,0 +1,127 @@ +/** + * \file + * + * + * \brief LM3S1986: OLED-RIT-128x96 (P14201) low-level hardware macros + * + * \author Andrea Righi + */ + +#ifndef HW_RIT128x96_H +#define HW_RIT128x96_H + +#include "cfg/macros.h" /* BV() */ +#include "cfg/debug.h" + +#include +#include +#include + +#include +#include +#include + +/** + * \name LCD I/O pins/ports + * @{ + */ +/* OLED Data/Command control pin */ +#define GPIO_OLEDDC_PIN BV(2) + +/* OLED enable pin */ +#define GPIO_OLEDEN_PIN BV(3) +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +/* Enter command mode */ +#define LCD_SET_COMMAND() \ + lm3s_gpioPinWrite(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN, 0) + +/* Enter data mode */ +#define LCD_SET_DATA() \ + lm3s_gpioPinWrite(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN, GPIO_OLEDDC_PIN) + +/* Send data to the display */ +#define LCD_WRITE(x) \ + { \ + uint32_t _x; \ + while (!lm3s_ssiWriteFrameNonBlocking(SSI0_BASE, x)); \ + /* Dummy read to drain the FIFO */ \ + while (!lm3s_ssiReadFrameNonBlocking(SSI0_BASE, &_x)); \ + } +/*@}*/ + +INLINE void lcd_rit128x96_hw_bus_init(void) +{ + uint32_t dummy; + + /* Enable the peripheral clock */ + SYSCTL_RCGC1_R |= SYSCTL_RCGC1_SSI0; + SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOA; + SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOH; + lm3s_busyWait(512); + + /* Configure the SSI0CLK and SSIOTX pins for SSI operation. */ + lm3s_gpioPinConfig(GPIO_PORTA_BASE, BV(2) | BV(3) | BV(5), + GPIO_DIR_MODE_HW, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + /* + * Configure the GPIO port pin used as a D/C# signal (data/command + * control) for OLED device, and the port pin used to enable power to + * the OLED panel. + */ + lm3s_gpioPinConfig(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN, + GPIO_DIR_MODE_OUT, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); + lm3s_gpioPinWrite(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN, + GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN); + + /* Configure the SSI0 port for master mode */ + lm3s_ssiOpen(SSI0_BASE, SSI_FRF_MOTO_MODE_2, + SSI_MODE_MASTER, CPU_FREQ / 2, 8); + /* + * Configure the GPIO port pin used as a D/Cn signal for OLED device, + * and the port pin used to enable power to the OLED panel. + */ + lm3s_gpioPinConfig(GPIO_PORTA_BASE, GPIO_OLEDEN_PIN, + GPIO_DIR_MODE_HW, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + + /* Drain the SSI RX FIFO */ + while (lm3s_ssiReadFrameNonBlocking(SSI0_BASE, &dummy)); +} + +/* + * XXX: menu stuff requires lcd_blitBimap() function to be defined. + * Find a better way to do this. + */ + +#endif /* HW_RIT128x96_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_sd.h b/2.5/boards/ek-lm3s1968/hw/hw_sd.h new file mode 100644 index 00000000..d15b5506 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_sd.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief SD driver hardware-specific definitions. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef HW_SD_H +#define HW_SD_H + +#warning FIXME: This is an example implementation, you must implement it + +#define SD_CS_INIT() do { /* implement me */} while(0) +#define SD_CS_ON() do { /* implement me */} while(0) +#define SD_CS_OFF() do { /* implement me */} while(0) + +#define SD_PIN_INIT() do { /* implement me */} while(0) +#define SD_CARD_PRESENT() true /* implement me */ +#define SD_WRITE_PROTECT() false /* implement me */ + +#endif /* HW_SD_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_ser.h b/2.5/boards/ek-lm3s1968/hw/hw_ser.h new file mode 100644 index 00000000..2489c433 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_ser.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Serial hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_SER_H +#define HW_SER_H + +#include "cfg/cfg_ser.h" + +#if CONFIG_SER_STROBE + #warning FIXME: this is an example implementation, you must implement it + + #define SER_STROBE_INIT do { /* implement me */ } while (0) + #define SER_STROBE_ON do { /* implement me */ } while (0) + #define SER_STROBE_OFF do { /* implement me */ } while (0) +#endif + +#endif /* HW_SER_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_sipo.h b/2.5/boards/ek-lm3s1968/hw/hw_sipo.h new file mode 100644 index 00000000..3371c2c0 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_sipo.h @@ -0,0 +1,109 @@ +/** + * \file + * + * + * \brief Macro for HW_SIPO_H + * + * + * \version $Id$ + * + * \author Andrea Grandi + * \author Daniele Basile + */ + +#ifndef HW_SIPO_H +#define HW_SIPO_H + +/** + * Map sipo connection on board. + */ +typedef enum SipoMap +{ + SIPO_CNT +} SipoMap; + +/** + * Define generic macro to set pins logic level + */ +#define SIPO_SET_LEVEL_LOW(dev) do { /* Implement me! */ } while (0) +#define SIPO_SET_LEVEL_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Generate one low pulse on select line. + */ +#define PULSE_LOW(dev) do { /* Implement me! */ } while (0) + +/** + * Generate one hight pulse on select line. + */ +#define PULSE_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Define the procedure to drive serial input in sipo device (SI). + */ +#define SIPO_SI_HIGH() do { /* Implement me! */ } while (0) +#define SIPO_SI_LOW() do { /* Implement me! */ } while (0) + +/** + * Drive clock to shift SI data into latch. + */ +#define SIPO_SI_CLOCK(clk_pol) \ + do { \ + (void)clk_pol; \ + /* Implement me! */ \ + } while (0) + +/** + * Do everything needed in order to load dato into sipo. + */ +#define SIPO_LOAD(device, load_pol) do { /* Implement me! */ } while (0) + +/** + * Enable the shift register output. + */ +#define SIPO_ENABLE() do { /* Implement me! */ } while (0) + +/** + * Set polarity for Load, Clk, SI signals. + */ +#define SIPO_SET_LD_LEVEL(device, load_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_CLK_LEVEL(clock_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_SI_LEVEL() do { /* Implement me! */ } while (0) + +/** + * Do anything that needed to init sipo pins. + */ +#define SIPO_INIT_PIN() do { /* Implement me! */ } while (0) + +#endif /* HW_SIPO_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_spi.h b/2.5/boards/ek-lm3s1968/hw/hw_spi.h new file mode 100644 index 00000000..04e4893a --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_spi.h @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef HW_SPI_H +#define HW_SPI_H + +#warning TODO:This is an example implentation, you must implement it! + +#include + +/** + * SPI pin definition. + * + * \note CS is assert when level + * is low. + * + * \{ + */ +#define CS /* pin */ ///Connect to CS pin of Flash memory. +#define SCK /* pin */ ///Connect to SCK pin of Flash memory. +#define MOSI /* pin */ ///Connect to SI pin of Flash memory. +#define MISO /* pin */ ///Connect to SO pin of Flash memory. +#define SPI_PORT /* pin */ ///Micro pin PORT register. +#define SPI_PIN /* pin */ ///Micro pin PIN register. +#define SPI_DDR /* pin */ ///Micro pin DDR register. +/*\}*/ + +/** + * Pin logic level. + * + * \{ + */ +#define MOSI_LOW() do { /* Implement me! */ } while(0) +#define MOSI_HIGH() do { /* Implement me! */ } while(0) +#define MISO_HIGH() do { /* Implement me! */ } while(0) +#define SCK_LOW() do { /* Implement me! */ } while(0) +#define SCK_HIGH() do { /* Implement me! */ } while(0) +#define CS_LOW() do { /* Implement me! */ } while(0) +#define CS_HIGH() do { /* Implement me! */ } while(0) +/*\}*/ + +/** + * SPI pin commands. + * + * \{ + */ +#define CS_ENABLE() CS_LOW() +#define CS_DISABLE() CS_HIGH() +#define SS_ACTIVE() CS_LOW() +#define SS_INACTIVE() CS_HIGH() +#define SCK_INACTIVE() SCK_LOW() +#define SCK_ACTIVE() SCK_HIGH() +#define CS_OUT() do { /* Implement me! */ } while(0) +#define MOSI_IN() do { /* Implement me! */ } while(0) +#define MOSI_OUT() do { /* Implement me! */ } while(0) +#define IS_MISO_HIGH() (false /* Implement me! */ ) +#define MISO_IN() do { /* Implement me! */ } while(0) +#define MISO_OUT() do { /* Implement me! */ } while(0) +#define SCK_OUT() do { /* Implement me! */ } while(0) + +#define SCK_PULSE()\ + do {\ + SCK_HIGH();\ + SCK_LOW();\ + } while (0) +/*\}*/ + + +#define SPI_HW_INIT() \ + CS_DISABLE();\ + MOSI_LOW();\ + SCK_LOW();\ + MISO_IN();\ + MOSI_OUT();\ + SCK_OUT();\ + CS_OUT(); + +#endif /* HW_SPI_H */ + diff --git a/2.5/boards/ek-lm3s1968/hw/hw_stepper.h b/2.5/boards/ek-lm3s1968/hw/hw_stepper.h new file mode 100644 index 00000000..13141124 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_stepper.h @@ -0,0 +1,309 @@ +/** + * \file + * + * + * \brief Stepper hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + + +#ifndef HW_STEPPER_H +#define HW_STEPPER_H + +#include + +#include + +#include + +#warning TODO:This is an example implentation, you must implement it! + +#define STEPPER_STROBE_INIT \ +do { \ + /* put init code for strobe */ \ +} while (0) + + +#define STEPPER_STROBE_ON do { /* Implement me! */ } while(0) +#define STEPPER_STROBE_OFF do { /* Implement me! */ } while(0) + +/** + * CPU clock frequency is divided by 2^STEPPER_PRESCALER_LOG2 to + * obtain stepper clock. + */ +#define STEPPER_PRESCALER_LOG2 1 + +/** + * Stepper timer clock frequency. + */ +#define STEPPER_CLOCK ((CPU_FREQ) >> STEPPER_PRESCALER_LOG2) + +/** + * us delay to reset a stepper motor. + * This is the time neccessary to reset + * the stepper controll chip. (see datasheet for more detail). + */ +#define STEPPER_RESET_DELAY 1 + +/* + * Pins define for each stepper + */ +#define STEPPER_1_CW_CCW_PIN 0 +#define STEPPER_1_HALF_FULL_PIN 0 +#define STEPPER_1_CONTROL_PIN 0 +#define STEPPER_1_ENABLE_PIN 0 +#define STEPPER_1_RESET_PIN 0 + +/* put here other stepper motor */ + +#define STEPPER_1_SET do { /* Implement me! */ } while(0) +/* add here the set for other stepper motor */ + +#define STEPPER_1_CLEAR do { /* Implement me! */ } while(0) +/* add here the clear for other stepper motor */ + +/* + * Generic macro definition + */ + +/* + * Stepper init macro + */ +#define STEPPER_PIN_INIT_MACRO(port, index) do { \ + /* Add here init pin code */ \ + } while (0) + +/* + * Stepper commands macros + */ +#define STEPPER_SET_CW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CCW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_HALF(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_FULL(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_LOW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_HIGHT(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_DISABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_DISABLE(index) do { /* Implement me! */ } while (0) + + +/* + * Reset stepper macro + */ + +#define STEPPER_RESET_MACRO(index) do { \ + STEPPER_SET_RESET_ENABLE(index); \ + timer_udelay(STEPPER_RESET_DELAY); \ + STEPPER_SET_RESET_DISABLE(index); \ + } while (0) + +/* + * Set half or full step macro + */ +#define STEPPER_SET_STEP_MODE_MACRO(index, flag) do { \ + if (flag) \ + STEPPER_SET_HALF(index); \ + else \ + STEPPER_SET_FULL(index); \ + } while (0) + +/* + * Set control status macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_CONTROL_BIT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macros not implemented */ \ + /* else */ \ + /* WARNING This macros not implemented */ \ + } while (0) + +/* + * Set current power macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_POWER_CURRENT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macrois not implemented */ \ + /* else */ \ + /* WARNING This macrois not implemented */ \ + } while (0) + +/* + * Set rotation of stepper motor + * - dir = 1: positive rotation + * - dir = 0: no motor moviment + * - dir = -1: negative rotation + * + */ +#define STEPPER_SET_DIRECTION_MACRO(index, dir) do { \ + switch (dir) \ + { \ + case 1: \ + STEPPER_SET_CW(index); \ + break; \ + case -1: \ + STEPPER_SET_CCW(index); \ + break; \ + case 0: \ + break; \ + } \ + } while (0) + + +/* + * Define macros for manage low level of stepper. + */ + +#define STEPPER_INIT() do { \ + STEPPER_PIN_INIT_MACRO(A, 1); \ + /* Add here code for other stepper motor */ \ + } while (0) + + +/* + * Enable select stepper motor + */ +#define STEPPER_ENABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_ENABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Enable all stepper connect to micro + */ +#define STEPPER_ENABLE_ALL() do { \ + STEPPER_SET_ENABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Disable select stepper motor + */ +#define STEPPER_DISABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DISABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Disable all stepper connect to micro + */ +#define STEPPER_DISABLE_ALL() do { \ + STEPPER_SET_DISABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Reset selected stepper motor + */ +#define STEPPER_RESET(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_RESET_MACRO(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Reset all stepper motor + */ +#define STEPPER_RESET_ALL() do { \ + STEPPER_RESET_MACRO(1) \ + /* Add here code for other stepper motor */ \ + } while (0) + +// Set half/full step macros +#define STEPPER_SET_HALF_STEP(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_STEP_MODE_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Control status +#define STEPPER_SET_CONTROL_BIT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_CONTROL_BIT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Set stepper power current +#define STEPPER_SET_POWER_CURRENT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_POWER_CURRENT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +// Set rotation dirction of stepper motor +#define STEPPER_SET_DIRECTION(index, dir) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DIRECTION_MACRO(1, dir); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +#endif /* HW_STEPPER_H */ + + diff --git a/2.5/boards/ek-lm3s1968/hw/hw_tas5706a.h b/2.5/boards/ek-lm3s1968/hw/hw_tas5706a.h new file mode 100644 index 00000000..d1e1a2e6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_tas5706a.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief HW pin handling. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_TAS5706A_H +#define HW_TAS5706A_H + +#include + +#warning FIXME: This is an example implementation, you must implement it + +#define TAS5706A_SETPOWERDOWN(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETRESET(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETMUTE(val) do { (void) val; /* implement me */ } while (0) + +#define TAS5706A_PIN_INIT() \ + do { \ + TAS5706A_SETPOWERDOWN(true); \ + TAS5706A_SETRESET(true); \ + TAS5706A_SETMUTE(true); \ + /* complete me */ \ + } while (0) + +#define TAS5706A_MCLK_INIT() \ + do { \ + /* implement me */ \ + } while(0) + + +#endif /* HW_TAS5706A_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_thermo.h b/2.5/boards/ek-lm3s1968/hw/hw_thermo.h new file mode 100644 index 00000000..bbfc9dde --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_thermo.h @@ -0,0 +1,182 @@ +/** + * \file + * + * + * \brief thermo hardware-specific control functions. + * + * \version $Id$ + * \author Francesco Sacchi + * + */ + +#ifndef HW_THERMO_H +#define HW_THERMO_H + +#include "thermo_map.h" +#include "ntc_map.h" + +#include +#include + +#include +#include + +#warning TODO:This is an example implentation, you must implement it! + +/*! + * This function should return the temperature set tolerance. + */ +INLINE deg_t thermo_hw_tolerance(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + switch (dev) + { + case THERMO_TEST: + /* Put here convertion function to temperature size */ + break; + + /* Put here your thermo device */ + + default: + ASSERT(0); + } + + return 0; +} + + +/*! + * This function should return the timeout for reaching the + * target temperature. + */ +INLINE ticks_t thermo_hw_timeout(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + switch (dev) + { + case THERMO_TEST: + /* return ms_to_ticks(60000); */ + break; + + /* Put here a time out for select thermo device */ + + default: + ASSERT(0); + } + + return 0; +} + + + +/*! + * Read the temperature of the hw device \a dev. + */ +INLINE deg_t thermo_hw_read(ThermoDev dev) +{ + return ntc_read(dev); +} + + +/*! + * Turns off a specific device. + * This function is usefull to handle errors. + */ +INLINE void thermo_hw_off(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + switch (dev) + { + case THERMO_TEST: + phase_setPower(TRIAC_TEST, 0); + break; + + /* Put here a thermo device to turn off */ + + default: + ASSERT(0); + } + +} + + +/*! + * Based on the current temperature \a cur_temp and the target temperature \a target, this function turns on and off specific + * triac channel and handles the freezer alarm. + * It may use also PID control for thermo-regolations. + */ +INLINE void thermo_hw_set(ThermoDev dev, deg_t target, deg_t cur_temp) +{ + ASSERT(dev < THERMO_CNT); + + deg_t dist = target - cur_temp; + //kprintf("dev[%d], dist[%d]\n", dev, dist); + + switch(dev) + { + case THERMO_TEST: + if (dist > 0) + { + /* phase_setPower(TRIAC_TEST, dist * PID_TEST_K); */ + } + else + { + /* phase_setPower(TRIAC_TEST, 0); */ + } + break; + + /* Put here an other thermo device */ + + default: + ASSERT(0); + } +} + + +#define THERMO_HW_INIT _thermo_hw_init() + +/*! + * Init hw associated with thermo-control. + */ +INLINE void _thermo_hw_init(void) +{ + ASSERT(phase_initialized); + ASSERT(ntc_initialized); + + phase_setPower(TRIAC_TEST, 0); + + /* Add here the other thermo device */ +} + +#endif /* HW_THERMO_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/hw_tlv5618.h b/2.5/boards/ek-lm3s1968/hw/hw_tlv5618.h new file mode 100644 index 00000000..4a2b4202 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_tlv5618.h @@ -0,0 +1,69 @@ +/** + * \file + * + * + * \brief TLV5816 DAC hardware-specific definitions + * + * + * \author Francesco Sacchi + */ + +#ifndef HW_TLV5816_H +#define HW_TLV5816_H + +#warning TODO:This is an example implementation, you must implement it! + +#define TLV5618_CSINIT(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ + TLV5618_CSHIGH(pin); \ +} while(0) + +#define TLV5618_CSLOW(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#define TLV5618_CSHIGH(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#endif /* HW_TLV5816_H */ + diff --git a/2.5/boards/ek-lm3s1968/hw/hw_tmp123.h b/2.5/boards/ek-lm3s1968/hw/hw_tmp123.h new file mode 100644 index 00000000..adb18588 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/hw_tmp123.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_TMP123_H +#define HW_TMP123_H + +#warning TODO:This is an example implentation, you must implement it! + +#define TMP123_HW_CS_EN() /* Implement me! */ +#define TMP123_HW_CS_DIS() /* Implement me! */ + +#define TMP123_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_TMP123_H */ + diff --git a/2.5/boards/ek-lm3s1968/hw/kbd_map.h b/2.5/boards/ek-lm3s1968/hw/kbd_map.h new file mode 100644 index 00000000..20b95ea0 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/kbd_map.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Keyboard map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_MAP_H +#define HW_KBD_MAP_H + +#include + +/** + * Type for keyboard mask. + */ +typedef uint16_t keymask_t; + +/** + * \name Keycodes. + */ +/*@{*/ +#define K_UP BV(3) +#define K_DOWN BV(4) +#define K_LEFT BV(5) +#define K_RIGHT BV(6) +#define K_OK BV(7) +#define K_CANCEL BV(8) + +#define K_REPEAT BV(13) /**< This is a repeated keyevent. */ +#define K_TIMEOUT BV(14) /**< Fake key event for timeouts. */ +#define K_LONG BV(15) +/*@}*/ + +#define K_LNG_MASK 0 + +#endif /* HW_KBD_MAP_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/mcp41_map.h b/2.5/boards/ek-lm3s1968/hw/mcp41_map.h new file mode 100644 index 00000000..6646391c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/mcp41_map.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief MCP41 digital potentiometer map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef MCP41_MAP_H +#define MCP41_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/** \name Enum for mcp41 pot evices. + * \{ + * + */ +typedef enum Mcp41Dev +{ + MCP41_LED, + + /* put here other mcp41 device */ + + MCP41_CNT, +} Mcp41Dev; +/* \} */ + +#endif /* MCP41_MAP_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/ntc_map.h b/2.5/boards/ek-lm3s1968/hw/ntc_map.h new file mode 100644 index 00000000..505f1c31 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/ntc_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief NTC map definitions. + * + * \version $Id$ + * + * \author Giovanni Bajo + * \author Francesco Sacchi + */ + +#ifndef NTC_MAP_H +#define NTC_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for ntc devices. + * \{ + */ +typedef enum NtcDev +{ + NTC_TEST, + + /* Put here your thermo device */ + + NTC_CNT +} NtcDev; +/* \} */ + +#endif /* NTC_MAP_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/phase_map.h b/2.5/boards/ek-lm3s1968/hw/phase_map.h new file mode 100644 index 00000000..7436e5e8 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/phase_map.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief Triac map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef PHASE_MAP_H +#define PHASE_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for triac devices. + * \{ + */ +typedef enum TriacDev +{ + TRIAC_TEST, + + /* Put here other triac device */ + + TRIAC_CNT +} TriacDev; +/* \} */ + +#endif /* PHASE_MAP_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/pwm_map.h b/2.5/boards/ek-lm3s1968/hw/pwm_map.h new file mode 100644 index 00000000..723da2f1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/pwm_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * + * \brief PWM map device. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_PWM_MAP_H +#define HW_PWM_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +typedef enum +{ + PWM_CH0 = 0, + PWM_CH1, + PWM_CH2, + PWM_CH3, + +/* + * add other PWM channel or + * change above. + */ + + PWM_CNT +} PwmDev; + +#endif /* HW_PWM_MAP_H */ diff --git a/2.5/boards/ek-lm3s1968/hw/thermo_map.h b/2.5/boards/ek-lm3s1968/hw/thermo_map.h new file mode 100644 index 00000000..4376076a --- /dev/null +++ b/2.5/boards/ek-lm3s1968/hw/thermo_map.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Thermo regulation control map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef THERMO_MAP_H +#define THERMO_MAP_H + +#include +#include + +#warning TODO:This is an example implentation, you must implement it! + +typedef uint8_t thermostatus_t; + +#define THERMO_OFF 0 +#define THERMO_HEATING BV(0) +#define THERMO_FREEZING BV(1) +#define THERMO_TGT_REACH BV(2) +#define THERMOERRF_NTCSHORT BV(3) +#define THERMOERRF_NTCOPEN BV(4) +#define THERMOERRF_TIMEOUT BV(5) +#define THERMO_ACTIVE BV(6) + +#define THERMO_ERRMASK (THERMOERRF_NTCSHORT | THERMOERRF_NTCOPEN | THERMOERRF_TIMEOUT) + +typedef enum ThermoDev +{ + THERMO_TEST, + + /* Put here your thermo device */ + + THERMO_CNT, +} ThermoDev; + +#endif /* THERMO_MAP_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/.spec b/2.5/boards/ek-lm3s1968/templates/.spec new file mode 100644 index 00000000..07fb8eed --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/.spec @@ -0,0 +1,3 @@ +name = "Templates" +ord = 0 +description = "Use these as a starting point for your BeRTOS project." diff --git a/2.5/boards/ek-lm3s1968/templates/empty/.spec b/2.5/boards/ek-lm3s1968/templates/empty/.spec new file mode 100644 index 00000000..f3edfbc2 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/.spec @@ -0,0 +1,8 @@ +name = 'empty preset' +advanced = True +description=""" +

+This is a minimalist project, it just initializes the hardware of the +supported board and proposes an empty main. +<\p> +""" diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_adc.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_afsk.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ax25.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_battfs.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_context_switch.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_dataflash.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_dc_motor.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_debug.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_fat.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_flash25.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_formatwr.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_gfx.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_hashtable.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_heap.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_i2c.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_i2s.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ini_reader.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_kbd.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_keytag.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_kfile.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_lcd_32122a.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_lcd_hd44.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_lm75.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_md2.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_monitor.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_nmea.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_parser.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_phase.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_pocketbus.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_proc.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_proc.h new file mode 100644 index 00000000..b2c3a965 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 0 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_pwm.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ramp.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_randpool.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_sem.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ser.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_signal.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_signal.h new file mode 100644 index 00000000..e78a4519 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 0 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_spi_bitbang.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_stepper.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_tas5706a.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_thermo.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_timer.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_wdt.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_xmodem.h b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/empty/empty.mk b/2.5/boards/ek-lm3s1968/templates/empty/empty.mk new file mode 100644 index 00000000..a1f5fca4 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/empty.mk @@ -0,0 +1,100 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the empty_user.mk file instead. +# + +# Constants automatically defined by the selected modules +empty_DEBUG = 1 + +# Our target application +TRG += empty + +empty_PREFIX = "arm-none-eabi-" + +empty_SUFFIX = "" + +empty_SRC_PATH = boards/ek-lm3s1968/templates/empty + +empty_HW_PATH = boards/ek-lm3s1968 + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CSRC INSTEAD! +empty_WIZARD_CSRC = \ + bertos/drv/kbd.c \ + bertos/struct/heap.c \ + bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \ + bertos/mware/event.c \ + bertos/gfx/bitmap.c \ + bertos/kern/sem.c \ + bertos/drv/lcd_rit128x96.c \ + bertos/cpu/cortex-m3/drv/timer_cm3.c \ + bertos/drv/timer.c \ + bertos/cpu/cortex-m3/drv/ssi_lm3s.c \ + bertos/mware/formatwr.c \ + bertos/gfx/line.c \ + bertos/cpu/cortex-m3/drv/ser_lm3s.c \ + bertos/fonts/luBS14.c \ + bertos/kern/kfile.c \ + bertos/kern/proc.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + bertos/kern/signal.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_PCSRC INSTEAD! +empty_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CPPASRC INSTEAD! +empty_WIZARD_CPPASRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CXXSRC INSTEAD! +empty_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_ASRC INSTEAD! +empty_WIZARD_ASRC = \ + \ + # + +empty_CPPFLAGS = -D'CPU_FREQ=(50000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(empty_HW_PATH) -I$(empty_SRC_PATH) $(empty_CPU_CPPFLAGS) $(empty_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_LDFLAGS = $(empty_CPU_LDFLAGS) $(empty_WIZARD_LDFLAGS) $(empty_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPAFLAGS = $(empty_CPU_CPPAFLAGS) $(empty_WIZARD_CPPAFLAGS) $(empty_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CSRC = $(empty_CPU_CSRC) $(empty_WIZARD_CSRC) $(empty_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_PCSRC = $(empty_CPU_PCSRC) $(empty_WIZARD_PCSRC) $(empty_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPASRC = $(empty_CPU_CPPASRC) $(empty_WIZARD_CPPASRC) $(empty_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CXXSRC = $(empty_CPU_CXXSRC) $(empty_WIZARD_CXXSRC) $(empty_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_ASRC = $(empty_CPU_ASRC) $(empty_WIZARD_ASRC) $(empty_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPU_CPPASRC = bertos/cpu/cortex-m3/hw/crt_cm3.S bertos/cpu/cortex-m3/hw/vectors_cm3.S +empty_CPU_CPPAFLAGS = -g -gdwarf-2 -mthumb -mno-thumb-interwork +empty_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -mthumb -mno-thumb-interwork -fno-strict-aliasing -fwrapv -fverbose-asm -Ibertos/cpu/cortex-m3/ -D__ARM_LM3S1968__ +empty_CPU_CSRC = bertos/cpu/cortex-m3/hw/init_cm3.c bertos/cpu/cortex-m3/drv/irq_cm3.c bertos/cpu/cortex-m3/drv/gpio_lm3s.c bertos/cpu/cortex-m3/drv/clock_lm3s.c +empty_PROGRAMMER_CPU = lm3s +empty_CPU_LDFLAGS = -mthumb -mno-thumb-interwork -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/cortex-m3/scripts/lm3s1968_rom.ld +empty_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +empty_CPU = cortex-m3 +empty_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +empty_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +empty_FLASH_SCRIPT = bertos/prg_scripts/arm/flash-lm3s.sh + +include $(empty_SRC_PATH)/empty_user.mk diff --git a/2.5/boards/ek-lm3s1968/templates/empty/empty_user.mk b/2.5/boards/ek-lm3s1968/templates/empty/empty_user.mk new file mode 100644 index 00000000..e068232f --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/empty_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +empty_PROGRAMMER_TYPE = none +empty_PROGRAMMER_PORT = none + +# Files included by the user. +empty_USER_CSRC = \ + bertos/cpu/cortex-m3/drv/ssi_lm3s.c \ + $(empty_SRC_PATH)/main.c \ + # + +# Files included by the user. +empty_USER_PCSRC = \ + # + +# Files included by the user. +empty_USER_CPPASRC = \ + # + +# Files included by the user. +empty_USER_CXXSRC = \ + # + +# Files included by the user. +empty_USER_ASRC = \ + # + +# Flags included by the user. +empty_USER_LDFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/ek-lm3s1968/templates/empty/main.c b/2.5/boards/ek-lm3s1968/templates/empty/main.c new file mode 100644 index 00000000..224e9335 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/main.c @@ -0,0 +1,97 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Empty project. + * + * This is a minimalist project, it just initializes the hardware of the + * supported board and proposes an empty main. + */ + +#include "hw/hw_led.h" + +#include + +#include + +#include +#include +#include +#include +#include + +/* Bitmap to display on the OLED display */ +static Bitmap lcd_bitmap; +/* Raster associated to the Bitmap image */ +static uint8_t raster[RAST_SIZE(LCD_WIDTH, LCD_HEIGHT)]; +/* Internal flash memory descriptor */ +static Flash flash; +/* UART port descriptor */ +static Serial out; + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* Initialize UART1 */ + ser_init(&out, SER_UART1); + /* Configure UART0 to work at 115.200 bps */ + ser_setbaudrate(&out, 115200); + /* Initialize LED driver */ + LED_INIT(); + /* Initialize the OLED display (RIT128x96) */ + rit128x96_init(); + /* Draw an empty Bitmap on the screen */ + gfx_bitmapInit(&lcd_bitmap, raster, LCD_WIDTH, LCD_HEIGHT); + /* Refresh the display */ + rit128x96_blitBitmap(&lcd_bitmap); + /* Initialize the keypad driver */ + kbd_init(); + /* Initialize the internal flash memory */ + flash_init(&flash); +} + +int main(void) +{ + init(); + + /* Put your code here... */ + while (1) + { + } +} diff --git a/2.5/boards/ek-lm3s1968/templates/empty/project.bertos b/2.5/boards/ek-lm3s1968/templates/empty/project.bertos new file mode 100644 index 00000000..e3b90efb --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/empty/project.bertos @@ -0,0 +1,87 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V50000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vempty +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Varm-none-eabi +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V/scratch/julian/2010q1-release-eabi-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2010q1-188' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin +p15 +sS'version' +p16 +V4.4.1 +p17 +sS'build' +p18 +VSourcery G++ Lite 2010q1-188 +p19 +sS'path' +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'gfx' +p24 +aS'ser' +p25 +aS'kbd' +p26 +aS'formatwr' +p27 +aS'flash' +p28 +aS'kfile' +p29 +aS'lcd_rit128x96' +p30 +aS'heap' +p31 +aS'timer' +p32 +aS'debug' +p33 +aS'lm3s_ssi' +p34 +asS'CPU_NAME' +p35 +VLM3S1968 +p36 +sS'PROJECT_HW_PATH' +p37 +S'../..' +p38 +sS'PROJECT_SRC_PATH' +p39 +S'.' +p40 +sS'PRESET' +p41 +I01 +sS'OUTPUT' +p42 +(lp43 +s. \ No newline at end of file diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/.spec b/2.5/boards/ek-lm3s1968/templates/kernel/.spec new file mode 100644 index 00000000..04a79cff --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/.spec @@ -0,0 +1,9 @@ +name = 'kernel preset' +advanced = True +description=""" +

+This is a minimalist kernel project: it just initializes the hardware and +creates an independent process to blink an LED, while the main loop +continues to monitor the stack utilization of all the processes. +

+""" diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_adc.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_afsk.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ax25.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_battfs.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_context_switch.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_dataflash.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_dc_motor.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_debug.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_fat.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_flash25.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_formatwr.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_gfx.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_hashtable.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_heap.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_i2c.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_i2s.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ini_reader.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_kbd.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_keytag.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_kfile.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_lcd_32122a.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_lcd_hd44.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_lm75.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_md2.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_monitor.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_monitor.h new file mode 100644 index 00000000..6391b407 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 1 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_nmea.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_parser.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_phase.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_pocketbus.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_proc.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_proc.h new file mode 100644 index 00000000..7e64c498 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_pwm.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ramp.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_randpool.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_sem.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ser.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_signal.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_spi_bitbang.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_stepper.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_tas5706a.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_thermo.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_timer.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_wdt.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_xmodem.h b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/kernel.mk b/2.5/boards/ek-lm3s1968/templates/kernel/kernel.mk new file mode 100644 index 00000000..48ec5351 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/kernel.mk @@ -0,0 +1,101 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_user.mk file instead. +# + +# Constants automatically defined by the selected modules +kernel_DEBUG = 1 + +# Our target application +TRG += kernel + +kernel_PREFIX = "arm-none-eabi-" + +kernel_SUFFIX = "" + +kernel_SRC_PATH = boards/ek-lm3s1968/templates/kernel + +kernel_HW_PATH = boards/ek-lm3s1968 + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CSRC INSTEAD! +kernel_WIZARD_CSRC = \ + bertos/drv/kbd.c \ + bertos/struct/heap.c \ + bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \ + bertos/mware/event.c \ + bertos/gfx/bitmap.c \ + bertos/kern/sem.c \ + bertos/drv/lcd_rit128x96.c \ + bertos/cpu/cortex-m3/drv/timer_cm3.c \ + bertos/drv/timer.c \ + bertos/cpu/cortex-m3/drv/ssi_lm3s.c \ + bertos/kern/monitor.c \ + bertos/gfx/line.c \ + bertos/cpu/cortex-m3/drv/ser_lm3s.c \ + bertos/fonts/luBS14.c \ + bertos/kern/kfile.c \ + bertos/kern/proc.c \ + bertos/mware/formatwr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + bertos/kern/signal.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_PCSRC INSTEAD! +kernel_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CPPASRC INSTEAD! +kernel_WIZARD_CPPASRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CXXSRC INSTEAD! +kernel_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_ASRC INSTEAD! +kernel_WIZARD_ASRC = \ + \ + # + +kernel_CPPFLAGS = -D'CPU_FREQ=(50000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_HW_PATH) -I$(kernel_SRC_PATH) $(kernel_CPU_CPPFLAGS) $(kernel_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_LDFLAGS = $(kernel_CPU_LDFLAGS) $(kernel_WIZARD_LDFLAGS) $(kernel_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPAFLAGS = $(kernel_CPU_CPPAFLAGS) $(kernel_WIZARD_CPPAFLAGS) $(kernel_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CSRC = $(kernel_CPU_CSRC) $(kernel_WIZARD_CSRC) $(kernel_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_PCSRC = $(kernel_CPU_PCSRC) $(kernel_WIZARD_PCSRC) $(kernel_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPASRC = $(kernel_CPU_CPPASRC) $(kernel_WIZARD_CPPASRC) $(kernel_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CXXSRC = $(kernel_CPU_CXXSRC) $(kernel_WIZARD_CXXSRC) $(kernel_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_ASRC = $(kernel_CPU_ASRC) $(kernel_WIZARD_ASRC) $(kernel_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPU_CPPASRC = bertos/cpu/cortex-m3/hw/crt_cm3.S bertos/cpu/cortex-m3/hw/vectors_cm3.S +kernel_CPU_CPPAFLAGS = -g -gdwarf-2 -mthumb -mno-thumb-interwork +kernel_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -mthumb -mno-thumb-interwork -fno-strict-aliasing -fwrapv -fverbose-asm -Ibertos/cpu/cortex-m3/ -D__ARM_LM3S1968__ +kernel_CPU_CSRC = bertos/cpu/cortex-m3/hw/init_cm3.c bertos/cpu/cortex-m3/drv/irq_cm3.c bertos/cpu/cortex-m3/drv/gpio_lm3s.c bertos/cpu/cortex-m3/drv/clock_lm3s.c +kernel_PROGRAMMER_CPU = lm3s +kernel_CPU_LDFLAGS = -mthumb -mno-thumb-interwork -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/cortex-m3/scripts/lm3s1968_rom.ld +kernel_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_CPU = cortex-m3 +kernel_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +kernel_FLASH_SCRIPT = bertos/prg_scripts/arm/flash-lm3s.sh + +include $(kernel_SRC_PATH)/kernel_user.mk diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/kernel_user.mk b/2.5/boards/ek-lm3s1968/templates/kernel/kernel_user.mk new file mode 100644 index 00000000..0bf6c0bc --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/kernel_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_PROGRAMMER_TYPE = none +kernel_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_USER_CSRC = \ + bertos/cpu/cortex-m3/drv/ssi_lm3s.c \ + $(kernel_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_USER_PCSRC = \ + # + +# Files included by the user. +kernel_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_USER_ASRC = \ + # + +# Flags included by the user. +kernel_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/main.c b/2.5/boards/ek-lm3s1968/templates/kernel/main.c new file mode 100644 index 00000000..34ad1c65 --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/main.c @@ -0,0 +1,131 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Kernel project. + * + * This is a minimalist kernel project: it just initializes the hardware and + * creates an independent process to blink an LED, while the main loop + * continues to monitor the stack utilization of all the processes. + */ + +#include "hw/hw_led.h" + +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include + +/* Bitmap to display on the OLED display */ +static Bitmap lcd_bitmap; +/* Raster associated to the Bitmap image */ +static uint8_t raster[RAST_SIZE(LCD_WIDTH, LCD_HEIGHT)]; +/* Internal flash memory descriptor */ +static Flash flash; +/* UART port descriptor */ +static Serial out; + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* Initialize UART1 */ + ser_init(&out, SER_UART1); + /* Configure UART1 to work at 115.200 bps */ + ser_setbaudrate(&out, 115200); + /* Initialize LED driver */ + LED_INIT(); + /* Initialize the OLED display (RIT128x96) */ + rit128x96_init(); + /* Draw an empty Bitmap on the screen */ + gfx_bitmapInit(&lcd_bitmap, raster, LCD_WIDTH, LCD_HEIGHT); + /* Refresh the display */ + rit128x96_blitBitmap(&lcd_bitmap); + /* Initialize the keypad driver */ + kbd_init(); + /* Initialize the internal flash memory */ + flash_init(&flash); + + /* + * Kernel initialization: processes (allow to create and dispatch + * processes using proc_new()). + */ + proc_init(); +} + +static void NORETURN led_process(void) +{ + int i; + + /* Periodically blink the led (toggle each 100 ms) */ + for (i = 0; ; i = !i) + { + if (i) + LED_ON(); + else + LED_OFF(); + timer_delay(100); + } +} + +int main(void) +{ + /* Hardware initialization */ + init(); + + /* Create a new child process */ + proc_new(led_process, NULL, KERN_MINSTACKSIZE * 2, NULL); + + /* + * The main process is kept to periodically report the stack + * utilization of all the processes (1 probe per second). + */ + while (1) + { + monitor_report(); + timer_delay(1000); + } +} diff --git a/2.5/boards/ek-lm3s1968/templates/kernel/project.bertos b/2.5/boards/ek-lm3s1968/templates/kernel/project.bertos new file mode 100644 index 00000000..b4e22a3f --- /dev/null +++ b/2.5/boards/ek-lm3s1968/templates/kernel/project.bertos @@ -0,0 +1,95 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V50000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Varm-none-eabi +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V/scratch/julian/2010q1-release-eabi-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2010q1-188' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin +p15 +sS'version' +p16 +V4.4.1 +p17 +sS'build' +p18 +VSourcery G++ Lite 2010q1-188 +p19 +sS'path' +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'gfx' +p24 +aS'ser' +p25 +aS'kernel' +p26 +aS'kbd' +p27 +aS'monitor' +p28 +aS'formatwr' +p29 +aS'flash' +p30 +aS'semaphores' +p31 +aS'kfile' +p32 +aS'lcd_rit128x96' +p33 +aS'heap' +p34 +aS'signal' +p35 +aS'timer' +p36 +aS'debug' +p37 +aS'lm3s_ssi' +p38 +asS'CPU_NAME' +p39 +VLM3S1968 +p40 +sS'PROJECT_HW_PATH' +p41 +S'../..' +p42 +sS'PROJECT_SRC_PATH' +p43 +S'.' +p44 +sS'PRESET' +p45 +I01 +sS'OUTPUT' +p46 +(lp47 +s. \ No newline at end of file diff --git a/2.5/boards/lpc-p2378/.image.png b/2.5/boards/lpc-p2378/.image.png new file mode 100644 index 0000000000000000000000000000000000000000..4a931f59647842c80fe4344a7a0c7a17577e6b69 GIT binary patch literal 51899 zcmV)RK(oJzP)c7BI0_J-j%OcubzKxUUzeP>~gqTaY=EP z#L7eadjUZhBS8AG*dKzRKl&v=&_4k*GhFtNOD;tYh8)feyT|u*Py6TJD{s@=n|Xa0 z{m81Utjw(H-oWdud*g;Van2X#oH!BpHrm|W1OOofLI`Fhgpd$o{B~xs(bHl1QI%2k z@rzM;Aq2*Fcrjg`b3RSLL<_^~@#>?thZ!^J93Ss=*B6a?I)`(92}35R8g+URw}<%? z?E37)Pf$3s*~`;}fG(^e#E`oJ0MOa(h!PGjgIEQIwN7MPE@)N?CC^><` zi9t@ZFswT<>}e2R-s3dEGlw>6XC$y`BFBL;kw1|+A+U=`8qTqC@J&p@@nKFhH7=&< z#wQ9-4|bdt;xwIA98OSi`fv0Xjh=%*02l!}!5AJ%Yn-NWZqB52rVhJg(#&MgMYj`$ zrwN46fzI$^*x(RSrzHglf#94OnxJFic49D>hzDSD5{w>ATY<6L8N(hQ z{B)1wvtlNOX4buAzK$-2%459BDM<(+GP9|1P+l~7gb)A%!THIIKmdme(gmt$hHr3* zu|rd7n*NdCCbXa!<1C0-Iz0nVv}^9bWGb^`$DRF87bhd2Yu-2GkPbY}bG({lXbOyx8_ zjVIbUCFY!go+vhA)I~rX>e@-pAOr}|iLw%a03jre^99D_1Y=I$w2*`l7~>Hi$F+qR zOA|y)qiU?Lli^Iu=JZ#LST|FpU!)|aZqY>7(}m$P;235JZ;D-F)E%5UBtmc@03n1x z@G$6n_`bLC2&&ca?#sE~`vZaSXpA#wCXB&%8W|H8Q)XDW+{H1+6&)iXL8&Jr}@|Kti+ptF&l0Bd}nO(+96FOrFzaV}5m=ad__(5ZF<5D4LMPR>+O7m+#w z!31qH;W$&`Vx;B78Q{g3u+Fdn=RhKj&%cWl)ihQnxH*9{m<8>Lx)YtE^8g($Hd;fC zdO=7C!Qph}F;mA}uF2s%7pBv+3Oui+1VS)A7lat*jI`+qnoefA5WtzU@uc3YvL0!h+!Gd!;FUgzll{ePDK?f)j_=T3ST=)_GpB}SYsE#W+}r_IRp z0B6GMA`Nt|S%d^Sk;54c{A5XZItj$c*aHCC+S(dt+&DFt*q2XLOVfqN=^h8)v|S%J zNkh^{9w$PGF)jqd7*9;)i!LVkIG!#C-*gMp10O4Sy4(|pgAhU>;2@9yA>y$8(Fg6f zzR!2I7>#2IP}-7i%suG0RwToD|43e$mvvP=s2ZN95TdN#x$?jMTV&Yd421KtA9^xV zrgruyrhSre9X2t*OVUJ{OR5MV(AL)0L?6?V9v|VvFfJO>OtUgW$4)&OZ(ocp5k>`u z!R~22dJ#R-Ae%V>X3p%1k-`Ps90E%SfdC0E#K{5)s5@xB{S)V{H+lV-u{bs)Y#Gr@ z%g2NMN+|j=a3{b{M0Z*;MlvBX7V=sV=aag;y#8Ma(l! z*pUGFl=p+^N+zPreAXb{(7HKKc|=R8HjNf)LGkWyE&Z4OJ;G#yhZAGJ1R~?NFy?7Y zH+8=JNc~cc7=km{IeKy3L6VF&v0D$n+N`A~owt_(gxNzOx+O?NJ2!yaWaW76=5Fn5coC87#5C?whNb&y8 zX7jCo2tNK00ypLylDc#yx2eT*ShfeW6UW_1V4pT@k}l-YVb{=Q{dy^G^_p1)5e+u0 zsg%LyleOpXXumAwzw%W;_{@8`fX}B30<$Ckw?ZLWmK&&jvjVHl83#2u9oYKW@MI{dnUE#56`6EEWC6 z>W3^IH!F;#=?yve!9)jlt-uGd5GSC`zW(A;!x%qLdlBJodTUS!KI633|U$%^581pkaGIGJf^YisKw8+?&o zz1(Y_xR`dyC)&ScB-80Xi4oJcoO42kc1;A4cmMtevTy|T0JA604!--ncmDPN@XwYP zvOjwB{jYrKMbp#(k=Q4%efeJ^ET01U#ElXH{7$p>)3@A>M=Fi*T+Zor3Gohfo@JOw zq!ENlFJeqYbEb?4Y7Dqe6hUGqfR&W*2Xft0Or2;F_nAm59%XW)k2u!m5}0#Ld1$JM zR$$W9&2RiK#7Y1VgwPOQ(?P$B6!}ckaY@cdYGd|ccsrx<@tHqrZFo(-@r`f5`FSuw z-|!b>JYHs|^_V`1riFY{2^!g@vt`zaK1L^?o77m- z(|aVQ(d{%F&-)l>RW8ygQ>;D()-)00buNO@c$tYRQ|2g*ls_Zp9B-W5gJR= zJ&aL~rd*<-_J&@sakT&7um9s;{N49|u)367T`oM^*jtz{5JC`w#rbTn=l=8;53XM; z${07ggF-GvFbaL=y`TN!>WvpQO=~`SwD;%V?)}ww(BZCn^U4utzXtZbt=hAew^QjA zb4L8EoLnz;G?01&T{nau(x#ifQhd~?<&(A%AvOr?gdr=^vsR_FSc zA$rp2eYl@6WVVoiAjX!?IOqF^tmma}-+|MeL>LVe&@e{;N2lkeF5%L+j3!QSOc$7F zX9SONoS{?q10#e^_t{_^SmT||#M6XE`79>s61vX;2mws(tB(*32ZPS@DD0GqiKkBw?myVReRHvxOYZKKi=`Yw7$bCbb$(~N@{4z#da>Bt zs@%D`D65jJ$hxlKcK_(x-(uU3c@zZA>H&dYIo?0)RiC%Kddune2Q(Hgk=O4Qqk0cx zLSl&Oj=Y|82(W4|Yuh}GMablmz1waZNHVz$ajfSpK%(jlEZy+88hTQbm$Pwa5X+cg zG9lz66M9EC4Veg>${YsRIfC z)247-X4CHWB^aNsKAk_a*d;_y4j6%eOQH;D3RT0_06+-N>(%{dPal?w86rtnuaw^Z zc;oT2!@GA@Ib|S_uB!-Pkl_0I!t>_`EQT+A?#6s6hcFggXqH+(+%_5=-s|nj%J=)h zuLH4BX|>xU!5Mbp(IL2OyeCE_R=Fe-Pp zA!i{>j23=FHjMtpEc)Ybee3G#a;MWwrYv38R+me^diU|O?MgnM+&io+FV7K706>z+ zi+8WQa&Nsfm%#)hgaH8;NKYjq+j{(X_ixM14i&9-FYG!u6$#6@8^%HijDTR&9>nT= zBCCQ%WY%?Mfh|jW*lf&Sou|hGDPoCyntDMK$95_0J*nsz8FMKX#Y~qe7XD64i8)zF z6IrrXB5Z#XH^c1QD0q&g^28GkU#ZMB(`s5FhT0is5=#fDpseZ842L{PjD% zzAF)IS(>8CmaP}E$@kvhI4HM!eTq3>Ue1FM0EiGmByw^r5{Z$^Omua>J9zMPkI0hj z1^;c%c-_`Ma9oFSLZDPgbh;j8qU*-XNdq;yiED-JZZ|0)Z`icws+z2(%}2*abIWt= zpe-|=Sk1?MufwU9FnSLTZ9^l=Y2io2P-#rVy^gIbVa||E9o!ItSP``M$hb+q;L-Q&YY+1w&RWQZ?K#sBd4|ClSLd);1XK8Lu-+HCE}YooK$*$^iJZ}%>`ZCS zSXaT>iUNr-V9g9NO(S}`%*n<1GddGX*^AnliQtPyGU1J$FAsuqCRnYuxB2Xsjibjj z>@w;P`khRE1po!UKNvW+f&cNx?<~ycJlDzQG6bRJ`NEC$`4?ZfVy6rcfCxbt1H!-s zV2lt!2y?*!5D1PDA_T9jmOgs_DHY%;(tZ#-GKm?BW9EBdHeO{(!^q^xCNjDAFcUfBNF-9v+5=q2TNj71vEY=#W!utB^3$HQi;k+tKdd#>K(r~An zx<1#Csp^ELt}(~ugAQ%D$=i2EsDP3E`!o%7d0g~zjWAwpqL-v z_43Ov9_(#y?KKj*q8o~38dyTQu3|y}027Q65?lb{7!!mD!hn$wNT8GVP5@(MTY5Ta ze{z4*#kkF&H}Du02}_L_mt-78jB#L;xiKFou)dg)1A*MgP8x`@J#Ua$$i~l`D#q4g zCiG*TvO?gj$5vl{vEOex^@@?qxIHJovR+tO?|Uth*Q0V*(Nz&J+Hmn&wkb1oa3EvD zTwVcm5?>U+#}~!pdVS(|{9h1UafDPKMr7H`PqJR)+7=#fBPF1e}03;Abf)6*G1qg%@2*D91#Zty|-JPvt zRo4gxMp-7Udwv|pJdWa0(dzX=#+VmFN|TduY%QkW-`QWtXY>I@VQejA0ik`zO)TWD zzV!J-Hq-Cd2$np@4co2O{hj>s!eMQX1%u4oVz1gj11b-~V8J9gjURRu!6gL`9zC-b zmep(yPDeZDL!WaV;7pOBncTiew_UCa&@2?5Mc%*u^{;<+RWvHVKUHU9tPo6vKnQ}6QO3AHtyrWNEvepFNM~uxBtmf3d|qpoR+ewR_66P28s#0tX?gz` z`vZTwZCX;4R)fQuYHD__h!t~gd2zdWV3?ZZbLNB!l4Jp`q=E{%^ON^-cV3dL^M8WTxJYDUx(baS?me@}LtuULo8O#JiR0x?#X3Vt3K)jWF9ZZSuU%%g ze>(URTE*!rk!NQJ#(l5R@eu$<={vvpo4`FnC_)IMQ>}KgCIl{!z#JH3TnHq1vr#VO z=C(GTKYp;0!(0ZOP^3YppIIoFmND!UApp(+VFVa~;QS;mbRsScczA*j0U#tviVoU0zxcYIPV`$Yo@ALxyLV-^DwUgR$)HqD63darS%uv`kL8o?b>cruA zXk@JZcxxB!H;sp>#@jg=hB&zvg43AQYGoGpr6CMBAdEo(V2n6If)D#+f@2N>gd)T4 zqbH=N@*dNLw3w1t2H1R#Mx0K%uo0Ra#I#;vZi zy<1il8DZjifdFI~GG!bg6j913P)0+BY7x7Av%t!Z60^iYMo(s+KYApn-}`XaLZB9t zfPu@B#~E#TsO`zi898VAm9CsjS?MhA2Wnbv;)pk$q;2y-gk!2N<(~K385<8i+0Nd( zComrRTeJ4T&O`y{P1q$E8VAEf;Y&hG=+yH$Zwk@bcHYd6C+HqW6*@h2e}<0JB+j=p zE6_5uaWiz=M8D!B0cDZvdi{ZeQA~zTAU^S71v=TA9YTbI03k4dov~VVhlg&t8xU1h zFd#_^UBB;o%WF#j7(ifz&s<F&pTPceF*coZXzX*}q+0c6j0WJw@GhCVksI}yi(;6rZHOze#9H#%J}P*gc@ zs}dC`jJu7FWEuHl25|(81A>!x%Me0<8jViR>B$7!riC%?yY9}$!Q=OzJbSdef86%{ zKroI84#U{AEzY^?g|aMZszfQsGV=V0Gr<|_#6rpFNk7gctkR7eZojP<`t#>o>5T0^ zZ<`5KSxk#=KT;H;%Fb42?&@MQ?lCX0Q(5=80fR^Z)U}CTO7f$g!nvkv-~@ir9#|54 z@>Ef6V|nGo7NXgDXts1NE;$p97byr3=fY{^o8SEAB`r>9yo=Q4#J0dCtxZpYX+Lay zIRgNJ?+t5n;H`FBRa5|o`ZWZM00YJnCKwYeD+*Fn zuhG+FYyqJiH;QQl;;`H(E$8i|0Vf7|Xy*k&NYxa}G?VGX!1XqtZa;tj@zK^1L1gL1 zb>DNF%}&f10Op(t#)u-T3TBKMh7yL%44stG6vPIk&VH zcH2hQ;*>UnSd$dgW_HdNB`Z;!kE7T~CN;@K;h-u!Q&Dxpirak!Nt!C{M_ytf%Xgb{ z5E`Xq@8gH|{IZhEkIdM#Af|bKN&ctCHDSURA9|vv(d5&;!t);AI8ZLf)h9itBB2n1(1~jV zV(6<14uE7rq~W__0suiWWe2|R@6}ne#~61A2o-}2m81HVYs<2%prK900?^4zv7R3u zJm25=_*rGUOf*AFr=pmOI071%t1ZS6V~j`=Wt3ooi4;YYQ809saV8LwWgLc-QbxHb zyYbDtrEs@dT3N}=XF@;pICbKHHT{HQs~KIMOPhuHcB7Td=F^#C81*Vgd#KV)EYGEu zSF(#sM&5q9zn?T!n_|`-7-TcvGR#Lqmy_0~}Yuc{Oba2O|Jn=hW zktQ6hbJ9Npl9;gxJ<;?fp4xcfX>upL$eDG=3y+sP`31okegC5m-gx8BfB1v%9~~dG z+s%#Vo3Fm|k|axmewPc7kZ2s&YvppGm=c1c6W*OHyD`Qm?ia#{pAeIq&z3h1Sl10O z2vfnDj0o|)*y#H%whmEzcuG>32ODe{;q2|i)fP@Big#}17gy`$y~^=HBAL}Vk6L~3n7*3bXg1Qi zVY?iAkuklQ zzwpJ^-Tt6kKK|+7e9!yj{&A(AC}k1}eF&(bI>h*F(g6YhKAcaIEaz7ib{=eV&OnnG zaKwd-(4gZGMJ_JnDTijO`{dzfZSw%djB7ehWxSBdo~Ij%Bq@}|AQNyStKC&B-H9j@ zAUHR4O(8_q6d_R0aWR%O88HE>N&=s9E*R&1in?LAk~j5`7q4H9W0wf@=%a^*A(d8c zWahHvgRRcP=RmNO%qB{!OE<4Qd-}lZHS=>T{lnwnu*_Nmw3PBS6qmbs!vx9@=cHus z4F(CB`w#Zg_g+CnLZ>GnU~I8AA*h+AZ6Z_fVUXo~=G3mvNoeLY=iFZ5sL|2&I06vN zhU&=$LTIca01!f^XTt=%CLlHZ3{Jh({O;fV{hxg6TOWV?eyvunmaFY%Hwt5fP#ncH zj$CgL_nr9RS6Q2QzxLAD|4B`T4o`;v-Ok+Zs>-4Sn2Op4GHR!uyZyv2P6hnm3iOy zOIBpa;ZD;6LJXC8ZCZ1ZH}9NEFXXJ= zz~fYK!7+lEigLA*?Dep%8HJ1_6R+zsKWKUW>Xms!FhPJY<|l?92>~F;2cPUdc>h^3 zrNE#wsJGa0$JaC-(cD}*QAmQRwFiMraQ(O@m?+K7CsWq&HU5OD8mdfzG0*cPiMD%b z8TAKFx7Nd6l(p^kTWej$!!Y)OP+$PSnnDh^pVGr>_a|q7vt#K%Ilce*(Hr0S^Y4E5Zx0W48qMbM zL8b2u6qztixe#24D58K6#@LXF%6NoOM@CDGgCZMqc}Ani_rvZ$=yGl@Go&2@#+bwu zHaE**x62R93#J_TelQ5TZlw89WGXao>j`bpbL%}f03Qb!!SR_0n~a){ zaC<(EAV5S>{PwTk`PR4p{m*{#=5hJ3R;!keYo6g0nv#SW7m6%@ z!7>iK0Ax*_%VXd339@r3(dw%KZ4LZXF=HnT4A_svClB_XJl^UzJN%#qLBMGo%ThpD zDDe6#cSJ%HcB0$rXo5%xshXTnB_dcNnULiKW!z_xhT?1?SuZ!eAPi_225e0uIE7^1cFjT(6nQ@g(#z@2KfIlO@kQB6!05d4P?SUUa$Yfw3lYxit&4Qn z`1Pqfbe2DRRX7R+%y@KhLgyEy6BpyRLU7l2fAr>0{_v0g=)(`*Y1Au6$K`6J5e5Ng z3?sO@mTz~wC}IHEGz~&Pl1NM$3^#){N$6@snHz>Ly?hg@O*C+!))5iqf*&`!t2bBt z2)*~q`!^Sp7)3$f10K7w)CpKb!OEv&Kd3jF+GaVoR1Eg(cFNWh1`gvmiV}(@V;K~} z-0pFw-*;n8k*&Gn*3-SErIqzkA*@#$oI4E9b1F1TN^0$L9U46g2_<1S+YVrX05B7A z6ibSNi9iUgE@wI&H;S0+MT(5$h%rVvl64^#v$}36AMcb?DdWby*DX`^{btl2_^L!C z(tmuMu}n5^5*eYGQ_3wPm04V_R`+|YswT9#D=U7pD+U2sNgeiGQ($8dLKxyX(|P+r z_SM(0tcdZb>6maY@pdLe2Ip5@Xew-Rw(W)hE&|pBa!(6?rgULY>g0i_H=E!6yTAX| zx4-@P(Z{W3)05 zci<&d`Spawp6xaPI$=l=$Wa{nQM21`RmvI-nIAA0o#W9PpkT?gT>UJKV2#) zOvp~NuPSoHR+bmKVd(j>f5RD%b7%Mh%zD~Au zX5!!?Wq46+Vm$aUf#_jGf(y2Lc<>+o@^8NL7k{?9^}ODwRVuYss}o1DZ78LJ-Rp;) zt_uPrMNt%KWhLwRJ|guRBQOlO&9mR`R7%E^j97C|!J-ul0z;Ag}*A1DOsimv~fo575Sa4kJZ6^Qy%tNtj`;!J7TltrrjiFRf0WD|M_3OEnXQRQi9 zpLKC*8b-M|h{w;K{rflm!*~DouaA#*TFqwlxYp_P1n0}8bhq!vOt@Zz0Lij!Tk^tu zItW?4(IrTcRY{U%41fhk5d}c1q4Ss{g6*U&M{$v|#=J4VzPL1>!Mf_YVJ2jrrgT*` z2x1yWYSKcXpRn}SVe7$WE!c17QYj^!vY%{ie!PuswGxD-ay>&(Km{_j%zV+D%kFO; zEiSHJxw3@%ovxwOkqa7P zN51C@;dmiC>{&>*ugu4q&{Ek>txAs@;Xx<0mhVa+T7%3&DY3YiD9vS;iw`!o@=FD% z4tUQ?%x7XR7^L*jmf1&-R5PtFFONPAdkKa{NE(mSqlwRiOckDPkbLcHUmJDxS)8h2 z87}y7rRsDYJ7JG^KMpt{L`3PkAAInwKl#%izx9u`>OrGcD<9R|fu|{iF$w~uOu6rd z2xC=~@7|d2xjyBn*>Fr#V;po{kuX63aS(9Iu!MmS86j0x5EVff=|OZILti0s(JUV~ z%ayJfgB8X-Lo53%m$6tJq|%n_v*-7B)v9x~kbCJXuiac*rZTBkkF8g3yH3BxNLWZ` zD^*ihUCz2bZC2Zhmf;+gQA$qErR1ZUl(H9A@-}CF!$~bI@9ys%_6PlD?}co#%1E1H zp)0b}Pnf!UP-e|;dTp`N>&vRjA{sEJ>4qdpoHJEXuC8QT?SVk3R_|kkI2VjkhGZPE z>udSA+y3CebHi4O^H&q8q)<5>xFMop7{mu{(dsMnNs?B>Mqf(XrR&$`)^0lO>h`mz zhHjM>=ey7LG)dBn_C~#yn=i1fx)R0eYN7kV{p8}RoXw0rz&;a0(`XywP>4wn=Mv}a zWK}ragcj$qITKPRpDh^lfBvg?{_KtK{Pq9$S0BIk(O16w1zA%Dj1ZZs>Ea=CI`^ZfvX;DRSCMV3)S1xUm;b=^<^kQ{~q2SSJdP!v^{WL=Sg zaYiZQT#{tLg&R}Km?}vafe3;^HoeYSX%K~jDE1<=7n^PbSM$w~_q}j+G4pt@`FN*F ztIj{oWUhbZwdGnPBK(NO&l~O9VMEQP?Oe+A2A})gFYSEte8G=luDD#t-~Pg@cmL^E zgI=e9SQe?Y#nHMZclM6ra!crXmoi|C^%-(lxSTSx$wYo_orZlL z#+$o`nWb#+qXSDn2#-lK% z0ssUC00ac%xlHzpx2}I)BUZ16KJ53>Z!?d7jpL@Zyp&&C>3s5ZIh{zA8+xZ_EEg)xUM7=Dl!~>-TWQ8>G36LX zLJXsNoH0TO#zHW(R5II6*lN3REHK6qjky3oYRM#~qHqO1e*a-6ZQpwBb77~a7c}Jb zI~)>=#dLacVg1Vf{ss+P&9uEr-Q6rh$egI#s#UZ31>7GnHxzEHt>zCM$B4Nd#5km6 z-s=78e)it0LndQ{CtfR`h*3==W@efQz>aE7o_U{G016Q8UiXLp_|_l)(Vza~4}Y+? zw-JRt7mRZOTm)gTx3mAdzx&ULBnc1)<>SBk?)U!U&)(SHdERW-4)>1QjZPSbNWhJ? zQmfksf&2YHk|kADG)>NB%z+8{kQef77$5`27L-Kwa$JYFi?`2GK^`($T9H=*k&)rKrf!gq_B9liT; z-*xz{YxS5tJ34xDPb{sd3;)JeIfrNmzY-R%vK3#KqS76}w9v!99nqx>34P_!*`GRgG*uZxchEh5`Xj_s* z0AtS3LbeBP;=$c3>u#iWeC%bf&w|&~KZza_1xOWBO|NmjnDC|L6bp z>tFuV88j)Q0GtWV8S{Lv*Xw%&kHz$>|KuxnD%tA~{@uU(-}iT(wma>^gQIS<8^>`j zYY_}#%)31gVWOxik;t_xxt`+@LXOKF(=uZKj|0Yt##E9BWt_(`0UR;T5JsHKG6pVm ziL8P6f+8;!G7*7i)!K40q1krZajdKJFTDK1uipIC;egsHz1Zoe?_4YQdV?^eAwz_O zH0VW9&+%`+ctskx$%SG(2!HX;L#yZVL4VHFGI#Ipzxj^8fBZCx%h`-sNSTtt8(q$s z_3FK&R%a^+w#u!ogC>!T{M=l>*Au`7uCJJSc5xojsM_)Q=JC2>xgF;|h$fP2T{lsw zEnZvPuePwFVnQ?tqae}@z3&I6sp}d}n2I0rN~JSAr5MLl0HzVYVoPDAwq2?CJj@kW z=C7=z7xGT06>)a7y^lJMsD)NqgMv;gZ8@c(NF)kN`PI^c_kOJ~Do2z$fl82I;Mgk4 zTJd(>qC(b{$ZfNxpS*GNqD9}h)tioB&Cpk)1Dog19!~-bjiGAjF@19XLHX!_0RzFq zAPT||1Sqm3OA-J|Cets!^m1XYC@azre)MLmRd3Xrj4>g&;35cO#sL#7$t0JtvneBt zXt~x!7@MXc$;8rCi8A0IFb0f+fJR}AxiCxv6GS9L5H>M>_3D+EXp~e5TwAHf!s$Em z(xT$Jb9ZmH-9cyPsOS5AQ^T&GK|-R8^!j^)&@Plf(pHq~Uwu8?*u_LvyWKisHH5nR<@Ka05Q_H7{iCwJw!C{-{`GcMHj-G9OA8Bu z=h=zmz!`AP2VP{BQZN`~D)mDw9h6oFu2;n3;r?;q+Eu69UF^HcT(;hJBvmpMDe@wW zK{j>H`M?R>fDZS^ElZg%B-&k%Gww3fW$eb)v`)$VjoYcT83pm?{U>1*;$DPXj+W4n z!e~glL8Nd9o;Nes3k`3e7#0!&bL8(fvn#nh&rRi$(jep=-%MH%gzcoxGD`f>W6ezJ zOG{{cNBO)$y6EDfG}K<>pZS{v*69BbG2Ef!AZqo-#>TU5r|We4l*Y0o5rPo{MU@R* zTUlL{h;;MzO(Deg?ryVDr!mQ-Dx4g~rsjG>n9V z5s#=xIgP2NDHvl#m32dt6-5riJ9EX~zjK54I^JBiYb09rPUhCNIp6)XN81$RaRX@`bXu3xy9WN9<~HZ zhJ4j`iEX+I+5GmgB&u8_en|H%{Tg7qUIDxKE1@o$xFV2CD zrBcG0Uv_$Z+fFWByX%KtN1-ax^UHJoVI2lRdNH@rY2_Ak;;2h{zOrETK742|UQx37 zQ6zq5U~<}3N2mX0f@}Ql1XyRL^xRgA00Fgn^WlSs^-5I;q3IerIYxJqf+%D{EEebN zWb)|f*y(nHC=7y7B9dyTvZ^42n(dxMh$LYEAVdZbfg1*XXVE1$o0J!sWh8MD)JcpRH+%ZbQ;;oc43534`?nR#5V(=dNnRqM@#)n!zz zS+W-P93J?oxngpzKtk4xB8)-8Si*=C6hzTptM8?<((@;O@Qr_?w0f_-c5CIo`5iQ; zmc7vJ4RSi}r&1eFjy*kRUAc;mkJBqlootq1QLfgx5SE=3AWYo|0>AI{5P<84nxGk7 z$rmyM#_IJJkEtc$j0W%sptxq=hi>vuyqpE{sT*>L#OwS7hA$EFh{_0x0 ze$Xr*Ceyh%3{p$Wh56+Wd)3${JvVJzakZx^l9DyH`(9!tIe7EE^b0RZriIWMCNA-} zK1E%j$(OZGfHjJM!D&lgxEf+#UNx^k`$S8$S#%Ef!+T6Euxa<#y-*6+;6N)3RV@ zO{EGSJlW;B#d@u=v$ylY`T{wsq?YD-91Kl5I<61HK&@7z-E6Qp76Mk5N?9Jo8M)8I zy_Kaz#(d?*ViB+sM*c583On8W%h$LUX^ON}X$CPxfVdDmiZxviVkXNNA-KMlYjuKl zcMwyK0OBZS0x(kYp%)xCVue0>ys7(sNi&5T+ocppe7D}wbmDC`);@Qy(Ks4xZO382 zg0TB=&sL3I=yd9p)cgW%_jxa1P1ky1{=gmR6jC6GR$ncco%bK+?!5}KGI6TqGva9) zUb8h8z~}?Rr@#ULA;K_t{PbxUc!`u9_`&dK#Bk-05CF!Ev7MdW4B-dwe(-c>+wpx( zRbs{nAqaz}XtFFDiVU2wIJT3PAB1rn3&B;1XqZR>VA;@?EdABrxSiAD&j zZf!j{t{fd#)0*_!)#XwUYPJDe`)sk~M>M8kyE9;nIh{7A^v1QTx2~;bllE&by~yMc7AxaIUxn(!VUWL|y=A%ad%(M<=d zF0zu-ndgA@wXc2cEO!_K1#x<63WN|`!2a%TwOY3=D+ql?xd1Ls-`Yli3Bh3;9&Yc< zq4;>UKqBx>la8p-_CiQv)8dFV{Oi8k2NdY1-S}YX4`pOG;6kMv- zbBlBI$8STW()!uk^x%m2zCo$~Warj@@z4FP0|?7pq;)G2{uh7m%hASm&ZCLf?$tYy zMPzYYi!se+3x2zoc=1M9ZRovzqucKil0)d9eePcKM64qfo@9v$IqOH2i12U zqiiXjFGXnOry9z7=&ST`^Ng!<#|I!h9;XV zD!IP4xik0b4O}iuy}=K6>-&}+^DvXJmEIs|Hls$DcyUg~uBo@(z(`oCq0%5iluCvc zcp;J{O~W$AltI7m#f%Hi8Dnn9Q-+!qpsI2im{Lse<8D$@6+*vA;j=K;nUtZ;~m#e z5JDIWIhd9%IO8n#g9vd>5HQ9KUEv%E6}G0EnyMKZ=j{5G)i12C+~hRBwN>i0wVc6{ zrm|l~wMv3gpL33pjEO>{)?vB$+Kat|W0bTDEAxgQut(3m<9bx75Z6!NybirSE6J69 zk9Yei*_6{srpU^JXG?-z`_e0a@UQ=+l#`9Mx!!R-nJ;83NAku#ZwGQJS-AItdToVL zk-fH_Os4zWdvw7HQc{m&$?*)q7!oLE_WFuUFxxq}Q7R}IGhaySag^BIDQ@n0`@1UT z&~!-8AK0q7RGbs^=JHber@xX09smI27@!~Xv~9Ghh!KQAD9JL5Vk|&1G+82y#izQP z+m@!Q(!dP_2qyx)WTzBJ8EV{dWkp5^s+^*X1qY5vh^om*0&YsRu9qqmmv6qH*;=i< zD`Tne3}~m*eOO6kO*g4X8j-yid@eCYJnGG-9gFbC8>*Ss7nUYqG<2IL)_P}W)&arE zS1e9yOaPI5?Q36~Jb!nZ`0$4_z$6ZX!%9U}r7(&prGlTF2t>n!g@9rj_W^De^Cd+> z2;3+dM6uu;A!HaD!o&}PD2x+HlTe{Wago4pzjS9Y^ozT@q}Rt8%Obp8(4BtQx^nGJ z2n&K|VvYr32vLNxVUW6U4G={2djDr{%Y9E>TDtmQ|BGs;KWMd)Dz$bGbv-pl%#={= z^(#cvgk>{LZAIRlfAvK*Yo;=3JDoKn!ryvZ52Nf0x9pqiW-{S58o}Nnv8-5Ay3JPK z#*W~v=Vd`uMS{fga{9(~En7$$iumz~hJlr9_rE!a)!*jtpG} zgczfY^O$lPGs?jY*;>Yk4xHlMr6;vcE^C>siAKpgfGd7T%GsMb?6CUd2(fPBD zp`lAO`EKc%DV#dD#RTV^3&vO~X&)aQ8-}*KvuoOB;DwCEf}b33rZJ7;NN`T6P=jzW zW49X}2O#D`Arb(@lyU)K%n1lvl3(WZcO>#cF<-p4R)4(lYsPh z*xl>7&i~KXd-lkdWmjVRoOAuXal^ax_IY1j)z!sfRa?55rZf^TfCkct9|TC~p5G(^ z5+FhPK+O;&XTTvjY{zn4?)jJRrO${Af8%;{oIXV6tJmG65=bDB_d`V7+;{J__gQyQ6TFef70@au&>Hs_R;<29w}D ze6~_@dsrPxrF&x=Ne*cSN2kf-rxbu7oD1GLpU5;#5Ku*BReQd>)-Sc!;^4MO6txlrx?ex~U_K307(q-Sc9i zC~3wVTc-u%OmK+`UF%$_6(^JCa*cTj^^(R;`_b8;yVfjQmGSV6V!>_*fyt!hSlomxn5yBvZu4^UN z;gl1MO;fc2tr@1QmV>Ow851Bu3M4^D*>LRlZ(sY)mG!n|H16H9m)f5{e*PC>G$aJ6 zL=x4xab4cKs_m}ulfF@@zNqU^gynz%T1YA&1QcVWX(nA;;c4#u;!_29X>A2}Iz}9c z)s=L!JB*@=Ym5E}he=~+GyL_}ay&B>t^XH4Gb}p{LrSpz)_r4Rb^iQi>Bdz|6x8b> zg^L#zw z3SD=brOlF6?=*GQB%=u*jzLppr#&7H)SQZWq?Amf*|1GB8x4``cwr)?bStGK&N-#J zX;RLED3=l;5SZXv%}(N!alsgmb3s(4jb+gfoNMj5N_5p+-raB-OK!J?75Sh4!{4|i z#nwv2>8Mmud6E>CLN(Q}s@=`4ERT&&iOw@HOq|i|`LKGuGck}F7q+g*Nu&@Ketl4X za33q$#c=C2CGeljSpO8~{Wk(@k+BwMiLYy-So}!AXx4xD@X7!C7r{sWIF3Vw^Fb70 zOo)O(NR09A+uPT#b&M>t4L!_Q*>%=emhvo{W@*AD}^i`DP7=&$^%Mb3M;V^ylOn5V02vt+*`AFv?JL}~%!}BQTqLi_CFpS%c%&O{! zQbq!TSYtx!ny(V1Yqaj3t#r-9A$ zhy=u>@Dtw;txjDhN;xY=LQn)@lrSMU7a)bAX^R`Xy6pNv5l2~3a8<{g}fzd9wfFiXnQ-l%(J)xg!x?k?7(6i^^kaMs-1 zZMK&S7D1hLTakGztmjAr3r7Fnjz zuDLqFEN9asZIzt2Zd`eAb%VWl(N{&SVbz4F+9h6b=vL=w@0Az^KIN*maOG2az2Vm8 zQrXhr)xK`n6C$bal@khXCBL=H*Vp56C1nhPFs8J2Wi#_bo3bQI>-TTW{_dCM%@wR@ zS`?MWQ_~MpA(nsq2aZ@ z>FT$V(?3}de^64EM5?J+^#!HKnh zvg#$<@7zKScQBl3Dv`kBsE`Mz*MI#&AJ0b)GIX=<7lSlK@4ZDpRfDj+(qci7&SyrF z&NI4l{Yr3jW|Z{lmrsl^LsI;7_TbUe@X5>e58f_!m*m-q4u)bjXF}u!&%FqD8nu>t zYqec&RHJ9d%Gs2)xfVXz zD^7axt9_Z~NC=}~E>XIx%j*wrlnpI;c0@S1yE~J^la`@3Z(W=3pVV&bsEyX-Z+}k0 z2qT4KK>;Ng6&g_`FAxg+2=YRavgR0h5SsOh7p4dU0U#I`S#G$tkkXq)MJ@=zfRJse zS2kP2NyG|D1s>0`6`f5#Kic{Bwc}SWlcQ7HF|=~6wRNSw+TDNn^>}pNURvuecL+A- zFZQ*i(vyQhr(5HLXyx|JBpw@1Y37GWC-I|m2M}!4h;6WWf(cgABzg4Q-QLy8waXQK zv?zR1%8OV3OxO5&xGJS2|L)&ifOiRU^757UfBx@EG&jHZp4O@!|6hLvkDpkEYPD*3 z?t!iv-@fzw(f&bioJ%>6iY(1;t&}$2>6&Zq{@E;=C%EA6E_c-^-T2e*H!X{e=2vdt z9*6$eGGv@;6AZ7g*M7o zqM|N91%M#J^$JaM=k5F9@hNuQ)oa_7^8RR8+FUof9c4J;n#u*|<0;bA*4DaKYj_VI zi>EKyXspu0M8E(Q0<|_as~^6X1xfwxl{{x;FkHw1A^?OWixONbHMl9RtUfV{|#Px<-KYS)v)Q({}t zs@o6lsszhnN_%9TK3(AS93&9Cdb~o$OX+#C| z&piMngk+2{z><(_w_EcU2bqElUGtBF-FI(4d;A#lyxMN3ry~|-jjgTY7mrgFi9yhC zEEZ?FqZIS$-eKR+$=bC$S$|?~)^jfaTa^ICtBJ;eZZ?Ywj(_o0{q|jK*%vwMHHx}; z@r~vg0<@57eO)~ld5Zk>r$1dVnxzy{MaPf7BA%C5OQ>85{^1ifoZA(b2rlCY34n^5 zV*2uA;@Xy`>$aiay5IFlU9YZAe3k_MeahcjZZ+3C=YRcQ(&w)l(^;uj<;$IE95$A! z-86T%mn%8b&W{@UL^{Q%vi#Y>c(`}`-(A_dwp8|TDo=(DFK?%^0zzHL>>&V*WVTCWENwPIS|FLTHpKq z>Yc0IKm2~-heY!8zx>ZiuTP{{$o9$0X$&S<(NzDVkJYKCanL9?BvQFFxul%V!f5S- zcSyAc5*5RtQ*!gebTmp`$-^0++11H3{x|$tUtpmr9qNuLD61bsco#r)1ld{og5rH zjZ*wY-?k03RcA@Anku6VPiN_illp_VkfK~>6F0CABQ3<0Q`@vr~Qzq$9| zgVl{C@9f#lu&}06(mTfpjyUT}*&9x*T8Yl5)upPNBd6RjHNVjrYb`X&iogAAzPW50 zz^{$Hd^Bzac~>GANkvMDF@gno79jx4g>R_5kaRN2hv$W+sj61JzB_w$kev-jy)$j% zCAN`{Cx(!5siYRvv2E?bnx3Airm1$@u)UU^ z_2achpXZ=yrE6RI_PSZCnT@8qv+g~6K@cWLnivztG{7iH>z(?M9|HnR5P)Qqs+vX_ zM+@exSV(~bR&cdeu2x-J#VrLbuebsUFqC;hEyLKjc~>(~j1%6Qnhhr(`i51nFE{sJ zz0zxTrQAV&Opwss$~>AM?;pvrr+5Vt(%G!DAWc+am(1X^(~@hZt7VaTY=2U{eH&qN zVF32e2nD|Ocm56VzL;Zi&KWBxqZ}2}@ucil6r|`3bPyQ$i+^?J#r?Hs?V7+&%qVVZ zx-V(Qn{Mgt-TJ%VSt+~LumAQh=|8@pNj^p>Z8tt@SC4Z3600Xt)CQwf+eOcgh#%NV zF`AC7E~lU*nexfwd4CXWZZ?^aD-5YRH*V-sp|pGA?&S{N~>c!B}G+qT_p<96#eAWhe8TLNRSs45e5Pz=y9et zs>3k3I4qL@jN2tgAW#&72*yNlN_L}B#Q?Sr6%+5atXaYIhMT>bw$_&1R(XEj$3!2V z4^#x$Y|t%%w%TtJ{@YLpP0LK2uuGAdF0m<;h&vu({h{ zW1p2wMZ?*{=LBoc&NiS+70B11>op3EPpFHk01fGtZ5qg1G_w`@_`_-ktUa)um3UT2UyAA3w$85dz^?jiie5 zB};tyTp7(+l4{+yDOmh$ZyflK{roJUW|FMlxDrk0h_eOb004xPKrWO_0WDM`F(ANz z0U=$2o)ytxT)ulV^?WuQ6{r0q^eIu0uBYAVP?2Gr=qnv}bJHzXR0XRF0Vxf`(Q^L$ zvoCoRL7H+2TtY%w4#+H-X;#z$V#f;OeDQ^a1VOoOnT&H?*Br;DlzHPB%Zp~sq?}(_ zZ=8*j=lioew^x$0{>Y!Flvdn&tx^{v)7qtcmgFiib;GtAM5ZrazT{KSwoJFZY?!8Q zXnRke;=0L>XAT2R(^Oj%rZP%1L)XNUp;5Ne4LAMjsa@;poep|KUF4ta2QOj!BJLJ} z1yXR%IHNS@QZNu+;D%Yn7-Z&u9ps=w^Gp%UJes|I{Oxl$W0D4f}!ITC1H;5~3Mn zFHf@gTUT{aNJW)2XJ+$ide$SHp>kO^YB-Js@PttWco-#a>_<;u)Hc`iC^px++0iN4 zdj+GBCV5e_!kg`EwM-F2`%{6;_O%_!Xtwtf`=LY7B;#i}Fu)}p8#BN3;8xK)Uqq3_ zNFrbo5>?FzQUzc@ASECH2w!+!Ai>5n)v+7z+zSK$bnhU}3QHwCNv3gxYK~nkSC_h` zsUay5!U*9K(SzPu1(jY6U2nJbB7iC8R2!R32l9Q#y zbTZG9lnJ3AOfWGW>*3M-)pFGGSe!a{3VS9JSF6$g*RODfn^Fg4@GOg_d@vPGB zW??APEbYauYfBG5`L(7ZCFgV$Sh}Gy>N_OTFr52lDimGSnx+&Y#8R~&{@EAh>o?U( z1;IDVHg6s|zj5+|UXLTlPk!~dMP!8V{}(=Z%ArY^;-`Lfr8mY0K`dx zs+Hu$ezj7T?Is#e2fz9xolZ=ZWUbQdMmt(97XZorSeqfY+$_>OeDSg}_mPlHB??A$ z2{n@}nR;_)owge4(W%y5D*Qk$%$ShG5)pzCMxtyh83iPyBo`z}f)-1G*<^}MJAAz7 zmL02J&xT`-(lE+$$0)6?xNcbrNr+l;T>t68?DTl``ihjQKTc*}Kec#nsH6ZeG=*Zs zsIWNaLTF5w2!=wiOPtIZ3*#hDGoljCB_OC&U1AzjKc3CPz>gT?921Mfa>K?v`RJ3! zZdvQBT_sVbS5-lCj%Ac*;od1bo|iUj&@7efZHbYA_4%Wd+IrAF^_IBA*(VT>^f zqGEY<{pQW9w{L8$Z?4((dgaEQD5fwx8V1QcWffID8Tk^Bt`f?{WR%w&t)Ie_w<}&@ z^hc;j!xB-jg39IbWU6zK3&Hb9tyB~R51;Ot^Etv8tyl9~OF`Qb2&FG4#!OZ#9g(Kl ztHUA+`x0D)OewJt4oAA8mN(byo2x~C!29P#wcP&j{V0gh+()n&)nFvKEhI_v3c@MI zk`Q^p$Ob?HFqV1FlBD&+5A|xL`S$JE;c1q{R3k;JMpCwW=YFkHOV7?vzxcX)V_S2a z7tc=SsiCa zkWI_Emi;Q-~P*c_jcQz>c)C^cXv4oV_}!aXM-U0GC+-rbvB6* zV8hS|CO6hsx#GU_M}OK`+5XwnJ+ow2W&Wv#I*e+iN~S8sbf$ugb1q(_HY7$GE)gppt>;3g(aA^6q}+-R6*=Vq^0US8pGBEl#) z6=k^{pPVUzAwYluAtZ!UFoD$-v(=V68{ufI$c5h=EcE1gl)Ag?q+X>tBbqw!W)YWo zwUZq8`k#Gq{`g64qqX(+TZb=?2M4F@(O!Axue^89dwCSiXHFq(4mQF_a7vKQ1r`#d zKm=D!J+lliE4UOGBZ)yFxLmF1h9XM<7dCc|vqhEd1 zZdSH$-7xKvs!5|-J?jnireoVJI`H(G=?!~&$xWi9xwC?n%Dh0rv^ z(9N=Ie)j2OqLK07EG=Y|(=6u*6J6H?h-;gx9ozci(aXR8)fdx(9;NyAQfKAL4!P2i zU%vF+s#dGu@x;<~qupkvRNmjQc3OcK2Vb5m6K1(};d%M-sYqfh;84f{3CyKYkc}{>XUoN*7dQ znfUstHk}wuQi6&`xw5%VFy>LLNEsK*Bq%~CV0>BEXCN}l8A2FgTU9ZVITx81yr&!0 zl5rNN^g?PC2_YHfOyF48x?5#*<~3W@@MxqeYCIc!^2y_B-CVnR!*;8R%2ZRIP9~I7 zx76%zZzka^F8oSoEsK-JmEG3r7MO50A8QIRspON~DjP(~xalS~;d`$X(CzI_w9xju z)MdU1DIwofIldS-EEo;)P0Jbq5-`*CbkG|qtXwV&kU#+$D2mg{NWb0Pm>zj#)kw0e zK{egbr^D$a$t>H#2ulzMw71{BzP7PSh{`Aj5M1y$&HnuV{_9b%S8y69g=LwDD4bHu zG<1X;l;Kk8;}^#q1HzIDA=Xwl-@T_aDn%4_h%q?nS-U&t?zYf%@#;8nH1E+sPc+jk z)5)wjITdjnNc2p~7Df$_Wk5*NsyD7{OYJ%LQR0{FD($pbt!gN$mgnrfyN5*r=aYVz z4$Vq=sbzZs))mYacL^sdey-z;(`YzdGff#LArrZji4f8>2uR7Oxwbt0yI&QK?ku(Z zhkJg16wSQ;Q9u0jvGL-SE||D^h2FYyp2q8GrU*H2*OVXp-rAr1pfC(n2$=bKK`n$5 zE**f72|{_dQaa0WA;B;;OVbL$9LF*M-N!IZvr{e%+mce;y0PR<1I8t1yr9A~^cs^W z&0*Ocd2`mEbvo7Lc!H70r^7G4dRA+?DmB%yr&RQ0>PPcwl2Xfd*RJ03CujYGS1MN& z+ag@yXVc1d<0MP0nhWQF9>i+RjvhaEnyW^;y+Bj)jY=rrkT?2`z`8Wfl0pb6IOhzw zl$uubCRUzJO;B}J3IKsLlPqbjt=L8#O?WhkL!*#ww?^_}6huj0-CkA7Xh{~&i96h_6D4^_c6qXKq09}e^0naq-xTxb~EQr0n;5@AJicDMAU zu1{ysRzyXML29R-v%6IUL2zTEpN22@U(vea*ro2!-~R5~yWjm_^!XQhPLZGl6s};I z(bC3}`|`XroTrppjAMdz*K%})F@^|9ynv0T&G+7EzV}uF!tz6FFfb>x;(XBJMbW6v z)|-iIMQ4L%n#G2he(?6zzx<)V-tsGbQR39FgzZPiNeCK&NL~BtA&#(Qj{==O3n7>jXO!|MTX?(L8(!uW1nPH zua{4ez#T3Bhc7EPt`oO%NlCuIR=?FMena$=LIMIIh2%m2AOT!Z&N;EHWPkryNjYP> zsdFxfN+vj*;Mu`+Fguy1apsd^C0ELhn}$)(k8fYwe*3+9!@+bG#-D%jlrs*1rnB%L ze(}}kpFIs`VEO+!~)9jy%kc6$kwq(5ON!`cttU;okj zMAyImyN^d-J?+#Sw_b~W^|_1_i~uPrFPE1-csm1>W|@}f)if`8VH(8yd0y`}Oii1O z{X$cisxT(JAm&o43XwwIx>g%cQqF~xa_rOPb~)cWuQlDkR*ag3C$VPgR<%~D)~3_m z!-p?wj-f?d1W9eDL!%_11(Ga&F>Y=wF`mti53|7t3=M@jKbSbz+fyAYapq{69EHS^ z(dRE~_wEwi_y)gUQXyW$dGgbr{uEs<6-p^DHYkK-oGt!>5N0_Q!?TGd?Q)3;EW;C}Ek={!%d;Yh3th3Oz#x4tk130SB%X$hav?ZT^}NUxqLfRz zZE0D~C)0ERZ#d%;q@VID@2tzAZ!}#|u;g@Z8d?O!csy(`Z;~j=$DRVxUadSm9ClV) z{MdseGrOg5?>Hp|N07Z7tA3(v)S&6)y_r#Sg_pwF+_~QF10W^i507gP?jfQqS{=CD zfOuUS-zbFuATH|QV)(E?T0#hHnDS^~A(-0=QZW<48~cb!1V~p1&8VbwnHWp$RkKp6 zdVcPQ-~CrVp83&m=Bb!)&Z96&;v`QK%yJbA4*V)XXL&xFPRgxvdeAE@_4<4FTQyVJ zUG-1T%V(p&Ff+E26LWFPq{}4 z(>kE4A?F!^}eW z>zhCR-r9E`*xQYBMS~<)6l^pqXE_U#Y@vljC6WN9Wk?J(FN%Um1X6;kk+tQDH&2BS z1((x#ac#E|e{oV@uF;Oo5?b3>W(>RKdi3%TEtOJ3ktg$Jqryj?W*b_=KA8rM^?Leb zpk&m!(kjw|*m{8x8z%TX(64ohhD8siO4)&V0^Ur_Gxx^z3p>9>wgUXx816H4zad2yUO{rCmdXpeZ zSdnW4XKBVb(=`RSC<=xUE_YnB?C5!FSSHSLOJ&#YuI5h=d5#Mi zxz-#Z&V*^GJ)(e4QcP?v@o*A6-YYS#WK=OtK`D`v2#6Wi3^h^}i%SHEDLAdwhdUe7 zcKzva^z3jvj|&EfD1-~ixtxb_wO!>*R&5o#&ggG`p0KQ#dL+xdFSV0C

*d&zi;vTSzTQ?4)7Z+3~Ul*{E-t6|33^lY5_q2}77I2QmJ z0AMTyFN%UJoL3MoITmLEV-y7mWrA}dq~rpt1h#IpxgUEHmseWdty|@)bMW{fVYw-> z9M8FZ~m zGZwqjt~VMFhqFktz2SK9Mp~wqe*RniqmMlwC?pDfcj?T)ZB%RxJ zxU!WR`JosLDYZ8Ks}IaldHnYu|LNNDeau_4xfS^l2{4?;1NtY zHvuaWAt|YfEkZy-P^pY|w}!> zXiJa+xD*m3HZ8Q@(-f3eNR-md%ajOK&3cPycdf?ihu=9LjHAQj{p5>A=%PsK5?w{%Fd`&eL5OH-5+{UE-yg@ zUfd=mrMxHvVO*Go(%N1XUp(6UlOJsS@pomE&@jfMF`kFT%VQTLFkYsTosU`D;SDP$ zS~*CO{5VO#ddA_-|;-3#^Po8;6 zFw1i{hxPH?TJ6jf5+?xOiQUU-2 zQiUuSQw2u?#Zu@Bp@e9vArZ$yvRp_h6)6b@gcT%#BFqs<8`a>-&a7U3Iv71W7u_+_Vwd@o=pGK&$96-1;{j{7lI&6F~+kQySmz= z!ao_e9W(I5wR<-J*B$@-AJr_zfJnQBA8hp)E|QF9Im!!%-~eGpDN+;( zm=I)HCg&0%&{TANt2Ue@aY3V`PzV-Wa3(mQ^PpH>cT1|Zw7Kfob}%@bPezj5T0)1lBkEVy}l?k}pOOi`mwNzL8I42UykDypTax}gz_gE%uW>@+N-5#!44 zw57dxIc?i~&`+|sSwLYSmZv#c;tDZBjEu6uoV<-_0O z`#n8L2;-U*)KFpMl`1vq8p73MmB`b99%b2JVr;KB-+wFf6Wz7(^{cJz4Vu&1)H@&h zY`t6371xhe8`Z-gDgc?bNehZFLPBDq0Lale1guDq0P@bw_1V;?Trj~oLL!H@%;Mf) zG@p3h98Y4s5Cnm>TE%e|Vxqfd^m(sdF~nw7Ac?Yq3yH#%c(HkFIYPi@kp+sJq*~1+ z;|PRAS5|8ueA{v>isN7ddw=z-^6l%0C>J!-g&g;9l)^XV8zhoQTu1>*v{;S?!yr#z zR28+m($=0IfrDQT<~;`UbiujAIbbOzP1A1E(WQ1g4QRnl%c4SHRZTNygZ%NW?fU8I z_^jXL+)iS;yfk~|S7c|2R;^}7W(*x4VR88YNGU-|&Or)98O(hmB_K#a8UixL)S0gX z;sP>LC5)>GIG_c&93#*WWD+tdWYYyMN|aZmw3$EzCm8gku&F>?7VYMEck8HRyqtN@ zj)v2q;1^a_7ta;~0EsSmS_|RLH%`kIeNmosj6`{JCH{JE>&8xWG{~OsSv#A>(J8`! zgh&VxIl~6gx7SCHkJhLJQz5on+ubg*bo$X(cD>4V!?CUL$6tz*zT9mUt$I9;WSUaS zc#_tZ+fzS8nqt~k5~l@YszNyD0zgybQrn3VJ{Wif-)h0|o2a6-3AdHTiX5y}1N-0ksf-0J#A4f&(l>B5*FH^7SMA(Myr0 zvw6BlF$GW*BJo0t7frnM-u2~4&vUTl8meKKG^Loc5+O#O{Ahc{DL6y06vbpZGlw(i zO&U(CYdU=9t5`9v?Zo>>DxLVC)+zVVns-c#%O6 zNWg$pf~BDwXZHNs!j>U6b{CwttK`*BCbu(!zucW~!z} z+pWaJVU*~-iAeI&)h(slQ8eBE=!@#@EAHLvd=f1Yh0lDi-qcqcisv_y6xS+4KhjMD zA)sjvlo3M{5=BYwM|6>1IhP0kW6Xshs*-cuFjRe>x!vlRbE9eUGv5TPX(}iL*X{l! zFl?Rf4J}hwcj|naD&-Od$$NpC=E}7Ws~X~Hrj;x?Ni$6YP8CY9(K3X99dGgg^w45P}x8 z+iu3aIrs%KR0rex^~&3CU0+wouB(0P+Log#wQJkt+QuOdXE!$>%DTH(BhxYs%PP5i z{}8QokY&R81YIb6U-Yr~;v`A}K!G4cz)d4iNriC?2m_FU0V1K4Du4<=5CQ}OBP1YF zagH%IG)6hI49a*8f?Jj;xgy}poIX0A&%&JjraG{c;u3Qr0URTY5R&qe009^fMo1#G zaLE%3R`F~W+OBR`R`L1coj?0;PX6*|Yd?7J{IjnK%@?&@f>a4kZ*OJ=$)2C?x^`Hy zQMs%awAeosprny)i^8O&DLGN%EMJJ%F+?O6x~>*E z)if1AAcPPmf(zZy-LliHSIP#td9z*UM0l}Nv5HxaDc21`8+M`yemc`6HUO(t3lr=! zX;k&}^HWVD+IEX2k)rAu2Qf-lhHvi<<;`}*?Hkqsx{Z01_nlj=Nnhn#aB<| z$th-Z;b8gtQ(cTpBuI=DfI0#dDA}v^35TW=zato~G7jH!oG*|F{4B>7W0{=4_f9 zX8G>T;H$^UvqNL4PY2ywOQA{x<+?zSa3T?=lx#MLu6pV;k{*C#u_gR$Ox zU@z501c*gJ5>i|oQY&f}1P04)zW@Hzqozn}?S`CrcXzvXMq7VGu3JIH`upFW#~A{F5Bsv>;OPvcSVR#5i2xCBSU!d;jzQG~YY?#ee*HSkas7OX}`Mbaoy+ecAc( z_X@xer_*12ijpGT?J!Hvj?Yv9T*d0dYpu1<#{S|>IYLZu%QPA11Yv}bWm}vU(LB%y zsZ~sh@OYX$J&V>>%Jxbn?M-pTLWRg*j@*@UR<=M#d=w~vP|kpI{pyOJaV$AIoT*&6 z*HtVh#_lMM1vVNPL3?_{RAn z20#}C2mw+GAqCY9C7Nrhxl}U6c*I7Njg8LAaw9n(HM-^DU}}~t-HnyarONzdG(0|Y zD(>FI`x@a#n%*Oby*lN~HFas3h9M9O8{bE0NTmF(6km8u=aij>4D zO>SMKjCw&JfGk2qyv|gB7QGCJ$ha zg)_F1TPzN!7E!6+J2oCQt)XvFCUZsD+0B3J+cR&y!3ssx^M;)xWU>pmgp19_r&j8f z_u+zTrMNd)GaD>^55kKVErrum0J6rBWQ|iN`7Wu@wq9I_*pT5b^U`&nr1B zZ*Qzu_N!f8@PevbTP~lR^-e-rSuSnwt_N+`uhmDt{*>{=6?_Od0?t7yNYmanKp=A5 zEGZEwVkilq9B8y)7=1<2;zS`#Sy@^5lRvN)DuX)@83=+B0U{2)m14Y7>GpeyX4#z~ zkpehRibaoura-mTQ&d%stCQu}HiAR|4uYgtSjvqNr5L9qCf^lFSZ`Zla^>Ir@yPT2JNrY<=f89lkE_LlBNMph$H8!DBH>9C zn#SU9f2Hy9=l=dvm2)?5**DkPPfnpdNHmp%@q8j0VH7Y*1dy2XM2Lj<2X5$xOkqiq z*p6l8vjZ>g_uX!%7e^5XY6)CjE=ZM7jrN0Bqr|^k%dZvWVlL{sOry~tREOaV2;Y zNB}~Lail1u6p5sYTRpej;p&ao5}?JoQeUAxD&ymZT^q~|JbkgeFXGRRI*Mbz{?^XU z-s0g=E1$OwOFwD5ncko_8fwdBBM4@KfPZ}7cyf?!wF%0AgO2DB%peNDp_D@@U4R%R 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 cf&;k!4Olimex LPC-P2378

+ +

+ + + + + + + + + + + + + + + + + + + +
CPUNXP LPC2378
Clock72MHz
Memory512kB Flash, 48kB SRAM
Peripheralstimers, ADC, UART, SPI, I²C, I²S, CAN, PWM, USB, DMA, SSP, ethernet, SD card connector
+

+

+LPC-P2378® is based on NXP LPC2378 ARM7-TDMI CPU. Visit the LPC-P2378 page for more information. +

+ +''' + diff --git a/2.5/boards/lpc-p2378/benchmark/.spec b/2.5/boards/lpc-p2378/benchmark/.spec new file mode 100644 index 00000000..18c0580d --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/.spec @@ -0,0 +1,3 @@ +name="Benchmarks" +ord=2 +description="Projects to measure different aspects of BeRTOS performance." diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/.spec b/2.5/boards/lpc-p2378/benchmark/context_switch/.spec new file mode 100644 index 00000000..3268cbf4 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/.spec @@ -0,0 +1,15 @@ +name = 'BeRTOS Context Switch' +description=""" +

+This benchmark measures the overhead (in us) required to deliver a +signal and switch from a low-priority process to a high-priority process. +

+

+The measure is made by the high-precision timer if supported by the +architecture. Alternatively, the time can also be measured using an external +oscilloscope connected to the board's status LED. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_adc.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_afsk.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_afsk.h new file mode 100644 index 00000000..d8bc1d56 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_afsk.h @@ -0,0 +1,114 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ax25.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_battfs.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_context_switch.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_dataflash.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_dc_motor.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_debug.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_fat.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_flash25.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_formatwr.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_gfx.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_hashtable.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_heap.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_i2c.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_i2c.h new file mode 100644 index 00000000..af36e6b6 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_i2c.h @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_i2s.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ini_reader.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_kbd.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_keytag.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_kfile.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_lcd_32122a.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_lcd_hd44.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_lm75.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_md2.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_menu.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_monitor.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_nmea.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_parser.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_phase.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_pocketbus.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_proc.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_proc.h new file mode 100644 index 00000000..ab1a4680 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_pwm.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ramp.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_randpool.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_sem.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ser.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_signal.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_spi_bitbang.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_stepper.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_tas5706a.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_thermo.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_timer.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_wdt.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_xmodem.h b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/context_switch.mk b/2.5/boards/lpc-p2378/benchmark/context_switch/context_switch.mk new file mode 100644 index 00000000..1d974e95 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/context_switch.mk @@ -0,0 +1,95 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the context_switch_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += context_switch + +context_switch_PREFIX = "arm-none-eabi-" + +context_switch_SUFFIX = "" + +context_switch_SRC_PATH = boards/ek-lpc-p2378/benchmark/context_switch + +context_switch_HW_PATH = boards/ek-lpc-p2378 + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CSRC INSTEAD! +context_switch_WIZARD_CSRC = \ + bertos/benchmark/context_switch.c \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/cpu/arm/drv/timer_lpc2.c \ + bertos/mware/formatwr.c \ + bertos/struct/heap.c \ + bertos/cpu/arm/drv/ser_arm.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/cpu/arm/drv/ser_lpc2.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_PCSRC INSTEAD! +context_switch_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CPPASRC INSTEAD! +context_switch_WIZARD_CPPASRC = \ + bertos/cpu/arm/hw/switch_ctx_arm.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CXXSRC INSTEAD! +context_switch_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_ASRC INSTEAD! +context_switch_WIZARD_ASRC = \ + \ + # + +context_switch_CPPFLAGS = -D'CPU_FREQ=(72000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(context_switch_HW_PATH) -I$(context_switch_SRC_PATH) $(context_switch_CPU_CPPFLAGS) $(context_switch_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_LDFLAGS = $(context_switch_CPU_LDFLAGS) $(context_switch_WIZARD_LDFLAGS) $(context_switch_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPAFLAGS = $(context_switch_CPU_CPPAFLAGS) $(context_switch_WIZARD_CPPAFLAGS) $(context_switch_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CSRC = $(context_switch_CPU_CSRC) $(context_switch_WIZARD_CSRC) $(context_switch_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_PCSRC = $(context_switch_CPU_PCSRC) $(context_switch_WIZARD_PCSRC) $(context_switch_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPASRC = $(context_switch_CPU_CPPASRC) $(context_switch_WIZARD_CPPASRC) $(context_switch_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CXXSRC = $(context_switch_CPU_CXXSRC) $(context_switch_WIZARD_CXXSRC) $(context_switch_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_ASRC = $(context_switch_CPU_ASRC) $(context_switch_WIZARD_ASRC) $(context_switch_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_lpc2.S +context_switch_CPU_CPPAFLAGS = -g -gdwarf-2 +context_switch_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_LPC2378__ +context_switch_CPU_CSRC = bertos/cpu/arm/hw/init_lpc2.c bertos/cpu/arm/drv/vic_lpc2.c +context_switch_PROGRAMMER_CPU = lpc2378 +context_switch_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +context_switch_CPU = arm7tdmi +context_switch_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +context_switch_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +context_switch_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/lpc2378.ld +context_switch_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(context_switch_SRC_PATH)/context_switch_user.mk diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/context_switch_user.mk b/2.5/boards/lpc-p2378/benchmark/context_switch/context_switch_user.mk new file mode 100644 index 00000000..4bc28c58 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/context_switch_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +context_switch_PROGRAMMER_TYPE = none +context_switch_PROGRAMMER_PORT = none + +# Files included by the user. +context_switch_USER_CSRC = \ + $(context_switch_SRC_PATH)/main.c \ + # + +# Files included by the user. +context_switch_USER_PCSRC = \ + # + +# Files included by the user. +context_switch_USER_CPPASRC = \ + # + +# Files included by the user. +context_switch_USER_CXXSRC = \ + # + +# Files included by the user. +context_switch_USER_ASRC = \ + # + +# Flags included by the user. +context_switch_USER_LDFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPFLAGS = \ + -O2 \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/main.c b/2.5/boards/lpc-p2378/benchmark/context_switch/main.c new file mode 100644 index 00000000..ef29fb02 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/main.c @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel context switch benchmark. + * + * This benchmark measures the overhead (in µs) required to deliver a + * signal and switch from a low-priority process to a high-priority process. + * + * The measure is made by the high-precision timer if supported by the + * architecture. Alternatively, the time can also be measured using an external + * oscilloscope connected to the board's status LED. + */ + +#include + +int main(void) +{ + context_switch(); + while (1) + { + } + + return 0; +} + diff --git a/2.5/boards/lpc-p2378/benchmark/context_switch/project.bertos b/2.5/boards/lpc-p2378/benchmark/context_switch/project.bertos new file mode 100644 index 00000000..ca5301e5 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/context_switch/project.bertos @@ -0,0 +1,81 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V72000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vcontext_switch +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Varm-none-eabi +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V/scratch/julian/2009q3-respin-eabi-lite/src/gcc-4.4/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2009q3-68' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin +p15 +sVversion +p16 +V4.4.1 +p17 +sVbuild +p18 +VSourcery G++ Lite 2009q3-68 +p19 +sVpath +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'kernel' +p25 +aS'formatwr' +p26 +aS'kfile' +p27 +aS'context_switch' +p28 +aS'heap' +p29 +aS'signal' +p30 +aS'timer' +p31 +asS'CPU_NAME' +p32 +VLPC2378 +p33 +sS'PROJECT_HW_PATH' +p34 +S'../..' +p35 +sS'PROJECT_SRC_PATH' +p36 +S'.' +p37 +sS'PRESET' +p38 +I01 +sS'OUTPUT' +p39 +(lp40 +s. \ No newline at end of file diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/.spec b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/.spec new file mode 100644 index 00000000..5a527bef --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/.spec @@ -0,0 +1,14 @@ +name = 'BeRTOS Kernel footprint' +description=""" +

+This benchmark measures the memory footprint of the BeRTOS kernel with a +simple minimalist user application. +

+

+The purpose of this test is to give a measure of the required space in a +generic flash memory to store a full-featured BeRTOS kernel. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_adc.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_afsk.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ax25.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_battfs.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_context_switch.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_dataflash.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_dc_motor.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_debug.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_fat.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_flash25.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_formatwr.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_gfx.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_hashtable.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_heap.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_i2c.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_i2s.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ini_reader.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_kbd.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_keytag.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_kfile.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_lm75.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_md2.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_menu.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_monitor.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_nmea.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_parser.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_phase.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_pocketbus.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_proc.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_proc.h new file mode 100644 index 00000000..ab1a4680 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_pwm.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ramp.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_randpool.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_sem.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ser.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_signal.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_stepper.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_tas5706a.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_thermo.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_timer.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_wdt.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_xmodem.h b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/kernel_footprint.mk b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/kernel_footprint.mk new file mode 100644 index 00000000..ee65537a --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/kernel_footprint.mk @@ -0,0 +1,92 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_footprint_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += kernel_footprint + +kernel_footprint_PREFIX = "arm-none-eabi-" + +kernel_footprint_SUFFIX = "" + +kernel_footprint_SRC_PATH = boards/ek-lpc-p2378/benchmark/kernel_footprint + +kernel_footprint_HW_PATH = boards/ek-lpc-p2378 + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CSRC INSTEAD! +kernel_footprint_WIZARD_CSRC = \ + bertos/kern/signal.c \ + bertos/cpu/arm/drv/timer_lpc2.c \ + bertos/kern/sem.c \ + bertos/drv/timer.c \ + bertos/mware/formatwr.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/kern/kfile.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/benchmark/kernel_footprint.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_PCSRC INSTEAD! +kernel_footprint_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CPPASRC INSTEAD! +kernel_footprint_WIZARD_CPPASRC = \ + bertos/cpu/arm/hw/switch_ctx_arm.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CXXSRC INSTEAD! +kernel_footprint_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_ASRC INSTEAD! +kernel_footprint_WIZARD_ASRC = \ + \ + # + +kernel_footprint_CPPFLAGS = -D'CPU_FREQ=(72000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_footprint_HW_PATH) -I$(kernel_footprint_SRC_PATH) $(kernel_footprint_CPU_CPPFLAGS) $(kernel_footprint_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_LDFLAGS = $(kernel_footprint_CPU_LDFLAGS) $(kernel_footprint_WIZARD_LDFLAGS) $(kernel_footprint_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPAFLAGS = $(kernel_footprint_CPU_CPPAFLAGS) $(kernel_footprint_WIZARD_CPPAFLAGS) $(kernel_footprint_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CSRC = $(kernel_footprint_CPU_CSRC) $(kernel_footprint_WIZARD_CSRC) $(kernel_footprint_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_PCSRC = $(kernel_footprint_CPU_PCSRC) $(kernel_footprint_WIZARD_PCSRC) $(kernel_footprint_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPASRC = $(kernel_footprint_CPU_CPPASRC) $(kernel_footprint_WIZARD_CPPASRC) $(kernel_footprint_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CXXSRC = $(kernel_footprint_CPU_CXXSRC) $(kernel_footprint_WIZARD_CXXSRC) $(kernel_footprint_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_ASRC = $(kernel_footprint_CPU_ASRC) $(kernel_footprint_WIZARD_ASRC) $(kernel_footprint_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_lpc2.S +kernel_footprint_CPU_CPPAFLAGS = -g -gdwarf-2 +kernel_footprint_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_LPC2378__ +kernel_footprint_CPU_CSRC = bertos/cpu/arm/hw/init_lpc2.c bertos/cpu/arm/drv/vic_lpc2.c +kernel_footprint_PROGRAMMER_CPU = lpc2378 +kernel_footprint_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/lpc2378.ld +kernel_footprint_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_footprint_CPU = arm7tdmi +kernel_footprint_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_footprint_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +kernel_footprint_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(kernel_footprint_SRC_PATH)/kernel_footprint_user.mk diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/kernel_footprint_user.mk b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/kernel_footprint_user.mk new file mode 100644 index 00000000..ef355827 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/kernel_footprint_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_footprint_PROGRAMMER_TYPE = none +kernel_footprint_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_footprint_USER_CSRC = \ + $(kernel_footprint_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_footprint_USER_PCSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_ASRC = \ + # + +# Flags included by the user. +kernel_footprint_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPFLAGS = \ + -Os \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/main.c b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/main.c new file mode 100644 index 00000000..a3f11e50 --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/main.c @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel footprint benchmark. + * + * This benchmark measures the memory footprint[1] of the BeRTOS kernel with a + * simple minimalist user application. + * + * The purpose of this test is to give a measure of the required space in a + * generic flash memory to store a full-featured BeRTOS kernel. + * + * [1] http://en.wikipedia.org/wiki/Memory_footprint + */ + +#include + +int main(void) +{ + kernel_footprint(); + while (1) + { + } + + return 0; +} + diff --git a/2.5/boards/lpc-p2378/benchmark/kernel_footprint/project.bertos b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/project.bertos new file mode 100644 index 00000000..3959bcaa --- /dev/null +++ b/2.5/boards/lpc-p2378/benchmark/kernel_footprint/project.bertos @@ -0,0 +1,83 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V72000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel_footprint +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Varm-none-eabi +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V/scratch/julian/2009q3-respin-eabi-lite/src/gcc-4.4/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2009q3-68' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2009q3-respin-eabi-lite/obj/host-libs-2009q3-68-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2009q3-respin-eabi-lite/install/arm-none-eabi/bin +p15 +sVversion +p16 +V4.4.1 +p17 +sVbuild +p18 +VSourcery G++ Lite 2009q3-68 +p19 +sVpath +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'kernel' +p24 +aS'formatwr' +p25 +aS'msg' +p26 +aS'semaphores' +p27 +aS'kfile' +p28 +aS'kernel_footprint' +p29 +aS'heap' +p30 +aS'signal' +p31 +aS'timer' +p32 +asS'CPU_NAME' +p33 +VLPC2378 +p34 +sS'PROJECT_HW_PATH' +p35 +S'../..' +p36 +sS'PROJECT_SRC_PATH' +p37 +S'.' +p38 +sS'PRESET' +p39 +I01 +sS'OUTPUT' +p40 +(lp41 +s. \ No newline at end of file diff --git a/2.5/boards/lpc-p2378/hw/hw_afsk.c b/2.5/boards/lpc-p2378/hw/hw_afsk.c new file mode 100644 index 00000000..8adb432d --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_afsk.c @@ -0,0 +1,41 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * + * \author Francesco Sacchi + */ + + +#include "hw_afsk.h" + diff --git a/2.5/boards/lpc-p2378/hw/hw_afsk.h b/2.5/boards/lpc-p2378/hw/hw_afsk.h new file mode 100644 index 00000000..a0a348d9 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_afsk.h @@ -0,0 +1,87 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * \version $Id: hw_afsk.h 3072 2009-10-10 13:01:56Z batt $ + * + * \author Francesco Sacchi + */ + +#ifndef HW_AFSK_H +#define HW_AFSK_H + +#include "cfg/cfg_arch.h" + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Initialize the specified channel of the ADC for AFSK needs. + * The adc should be configured to have a continuos stream of convertions. + * For every convertion there must be an ISR that read the sample + * and call afsk_adc_isr(), passing the context and the sample. + * + * \param ch channel to be used for AFSK demodulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_adc_isr() for every convertion. + */ +#define AFSK_ADC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) + +#define AFSK_STROBE_INIT() do { /* Implement me */ } while (0) +#define AFSK_STROBE_ON() do { /* Implement me */ } while (0) +#define AFSK_STROBE_OFF() do { /* Implement me */ } while (0) + +/** + * Initialize the specified channel of the DAC for AFSK needs. + * The DAC has to be configured in order to call an ISR for every sample sent. + * The DAC doesn't have to start the IRQ immediatly but have to wait + * the AFSK driver to call AFSK_DAC_IRQ_START(). + * The ISR must then call afsk_dac_isr() passing the AFSK context. + * \param ch DAC channel to be used for AFSK modulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_dac_isr() for every convertion. + */ +#define AFSK_DAC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) + +/** + * Start DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_START(ch) do { (void)ch; /* Implement me */ } while (0) + +/** + * Stop DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_STOP(ch) do { (void)ch; /* Implement me */ } while (0) + +#endif /* HW_AFSK_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_buzzer.h b/2.5/boards/lpc-p2378/hw/hw_buzzer.h new file mode 100644 index 00000000..01683c85 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_buzzer.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Buzzer hardware-specific definitions + * + * \version $Id: hw_buzzer.h 2506 2009-04-15 08:29:07Z duplo $ + * + * \author Francesco Sacchi + */ + +#ifndef HW_BUZZER_H +#define HW_BUZZER_H + +#warning TODO:This is an example implementation, you must implement it! + +#define BUZZER_BIT 1 +#define IS_BUZZER_ON 0 +#define BUZZER_HW_INIT do { /* Implement me! */ } while (0) +#define BUZZER_ON do { /* Implement me! */ } while (0) +#define BUZZER_OFF do { /* Implement me! */ } while (0) + +#endif /* HW_BUZZER_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_dataflash.c b/2.5/boards/lpc-p2378/hw/hw_dataflash.c new file mode 100644 index 00000000..b3944b37 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_dataflash.c @@ -0,0 +1,126 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines. + * + * \version $Id: hw_dataflash.c 1398 2008-05-27 16:36:05Z asterix $ + * \author Francesco Sacchi + */ + +#include "hw/hw_dataflash.h" + +#include +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +MOD_DEFINE(hw_dataflash); + +/** + * Data flash init function. + * + * This function provide to initialize all that + * needs to drive a dataflash memory. + * Generaly needs to init pins to drive a CS line + * and reset line. + */ +void dataflash_hw_init(void) +{ + + //Disable CS line (remove if not needed) + dataflash_hw_setCS(false); + + /* + * Put here your code! + * + * Note: + * - if you drive manualy CS line, here init a CS pin + * - if you use a dedicated reset line, here init a reset pin + */ + + MOD_INIT(hw_dataflash); +} + +/** + * Chip Select drive. + * + * This function enable or disable a CS line. + * You must implement this function comply to a dataflash + * memory datasheet to allow the drive to enable a memory + * when \p enable flag is true, and disable it when is false. + */ +void dataflash_hw_setCS(bool enable) +{ + if (enable) + { + /* + * Put here your code to enable + * dataflash memory + */ + } + else + { + /* + * Put here your code to disable + * dataflash memory + */ + } +} + +/** + * Reset data flash memory. + * + * This function provide to send reset signal to + * dataflash memory. You must impement it comly to a dataflash + * memory datasheet to allow the drive to set a reset pin + * when \p enable flag is true, and disable it when is false. + * + */ +void dataflash_hw_setReset(bool enable) +{ + if (enable) + { + /* + * Put here your code to set reset of + * dataflash memory + */ + } + else + { + /* + * Put here your code to clear reset of + * dataflash memory + */ + } +} + diff --git a/2.5/boards/lpc-p2378/hw/hw_dataflash.h b/2.5/boards/lpc-p2378/hw/hw_dataflash.h new file mode 100644 index 00000000..8c2f0b89 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_dataflash.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines (interface). + * + * \version $Id: hw_dataflash.h 1312 2008-05-20 16:54:52Z asterix $ + * \author Francesco Sacchi + */ + +#ifndef HW_DATAFLASH_H +#define HW_DATAFLASH_H + +#include + +void dataflash_hw_init(void); +void dataflash_hw_setCS(bool enable); +void dataflash_hw_setReset(bool enable); + +#endif /* HW_DATAFLASH_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_dc_motor.h b/2.5/boards/lpc-p2378/hw/hw_dc_motor.h new file mode 100644 index 00000000..913ead7d --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_dc_motor.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief DC motor hardware-specific definitions + * + * \version $Id: hw_dc_motor.h 2859 2009-09-02 09:30:18Z asterix $ + * + * \author Daniele Basile + */ + +#ifndef HW_DC_MOTOR_H +#define HW_DC_MOTOR_H + +typedef enum MotorDCMap +{ + + /* Put here motor dc declaration */ + MOTOR_DC_CNT + +} MotorDCMap; + +/* + * Init all pin and device to manage dc motor. + */ +#define MOTOR_DC_INIT() \ + do { \ + /* Implement me! */ \ + } while (0) + + +/* + * Enable DC motor. + */ +#define DC_MOTOR_ENABLE(dev) \ + do { \ + /* Implement me! */ \ + } while (0) + +/* + * Disable DC motor. + */ +#define DC_MOTOR_DISABLE(dev) \ + do { \ + /* Implement me! */ \ + } while (0) + +/* + * Set direction for DC motor. + */ +#define DC_MOTOR_SET_DIR(dev, dir) \ + do { \ + /* Implement me! */ \ + } while (0) + + +#endif /* HW_DC_MOTOR_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_ft245rl.h b/2.5/boards/lpc-p2378/hw/hw_ft245rl.h new file mode 100644 index 00000000..34b157f6 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_ft245rl.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief FT245RL USB interface hardware-specific definitions + * + * \version $Id: hw_ft245rl.h 1777 2008-09-04 15:19:48Z batt $ + * + * \author Francesco Sacchi + */ + +#ifndef HW_FT245RL_H +#define HW_FT245RL_H + +#warning TODO:This is an example implementation, you must implement it! + +#define FT245RL_DATA_IN() /* Implement me! */ +#define FT245RL_DATA_OUT() /* Implement me! */ +#define WR_HI /* Implement me! */ +#define WR_LO /* Implement me! */ + +#define RD_HI /* Implement me! */ +#define RD_LO /* Implement me! */ + +#define FT245RL_INIT() \ +do \ +{ \ + /* Implement me! */ \ +} while(0) + +#define FT245RL_DATA_RDY() (/* Implement me! */ false) +#define FT245RL_GETDATA() ({/* Implement me! */ (0);}) +#define FT245RL_TX_ALLOWED() (/* Implement me! */ false) +#define FT245RL_SETDATA(data) do {/* Implement me! */ (void)((data)); } while(0) + +#endif /* HW_FT245RL_H */ + diff --git a/2.5/boards/lpc-p2378/hw/hw_i2c_bitbang.h b/2.5/boards/lpc-p2378/hw/hw_i2c_bitbang.h new file mode 100644 index 00000000..743e28b7 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_i2c_bitbang.h @@ -0,0 +1,66 @@ +/** + * \file + * + * + * \brief Macro for I2C bitbang operation. + * + * + * \version $Id: hw_i2c_bitbang.h 2506 2009-04-15 08:29:07Z duplo $ + * + * \author Francesco Sacchi + */ + +#ifndef HW_I2C_BITBANG_H +#define HW_I2C_BITBANG_H + +#warning TODO:This is an example implementation, you must implement it! + +#define SDA_HI do { /* Implement me:Set SDA High by setting SDA pin as input */ } while (0) +#define SDA_LO do { /* Implement me:Set SDA Low by setting SDA pin as open collector output */ } while (0) +#define SCL_HI do { /* Implement me:Set SCL High by setting SCL pin as input */ } while (0) +#define SCL_LO do { /* Implement me:Set SCL Low by setting SCL pin as open collector output */ } while (0) + + +#define SCL_IN (true) /* Implement me: read SDA pin state */ +#define SDA_IN (true) /* Implement me: read SCL pin state */ + +/** + * This macro should set SDA and SCL lines as input. + */ +#define I2C_BITBANG_HW_INIT do { /* Implement me! */ } while (0) + +/** + * Half bit delay routine used to generate the correct timings. + */ +#define I2C_HALFBIT_DELAY() do { /* Implement me! */ } while (0) + +#endif /* HW_I2C_BITBANG_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_kbd.h b/2.5/boards/lpc-p2378/hw/hw_kbd.h new file mode 100644 index 00000000..2c59dd58 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_kbd.h @@ -0,0 +1,72 @@ +/** + * \file + * + * + * \brief Keyboard hardware-specific definitions + * + * \version $Id: hw_kbd.h 2649 2009-04-23 12:51:28Z duplo $ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_H +#define HW_KBD_H + +#include "hw/kbd_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define K_RPT_MASK (K_UP | K_DOWN | K_OK | K_CANCEL) + +#define KBD_HW_INIT \ + do { \ + /* Put here code to init hw */ \ + } while (0) + +EXTERN_C int emul_kbdReadCols(void); + +/** + * Read the keyboard ports and return the mask of + * depressed keys. + */ +INLINE keymask_t kbd_readkeys(void) +{ + /* Implement me! */ + + //Only for test remove when implement this function + return 0; +} + +#endif /* HW_KBD_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_lcd_32122a.h b/2.5/boards/lpc-p2378/hw/hw_lcd_32122a.h new file mode 100644 index 00000000..6ec29c5c --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_lcd_32122a.h @@ -0,0 +1,155 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_32122A_H +#define HW_LCD_32122A_H + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Predefined LCD PWM contrast values + */ +#define LCD_DEF_PWM 145 +#define LCD_MAX_PWM 505 +#define LCD_MIN_PWM 130 +#define LCD_PWM_CH 0 + + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_PE_E1 /* Implement me! */ +#define LCD_PE_E2 /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +#define LCD_PF_DB0 /* Implment me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_A0 do { /* Implement me! */ } while (0) +#define LCD_SET_A0 do { /* Implement me! */ } while (0) +#define LCD_CLR_RD do { /* Implement me! */ } while (0) +#define LCD_SET_RD do { /* Implement me! */ } while (0) +#define LCD_CLR_E1 do { /* Implement me! */ } while (0) +#define LCD_SET_E1 do { /* Implement me! */ } while (0) +#define LCD_CLR_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E(x) do { (void)x; /* Implement me! */ } while (0) +#define LCD_CLR_E(x) do { (void)x; /* Implement me! */ } while (0) +/*@}*/ + +/** + * \name Chip select bits for LCD_SET_E() + * @{ + */ +#define LCDF_E1 ( 0/* Implement me! */) +#define LCDF_E2 ( 0/* Implement me! */) +/*@}*/ +/** Read from the LCD data bus (DB[0-7]) */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/** Write to the LCD data bus (DB[0-7]) */ +#define LCD_READ (0 /* Implement me! */ ) + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ + +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + +#define LCD_32122_RESET() do { /* Implement me! */ } while (0) + +INLINE void lcd_32122a_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_32122A_H */ + diff --git a/2.5/boards/lpc-p2378/hw/hw_lcd_hd44.h b/2.5/boards/lpc-p2378/hw/hw_lcd_hd44.h new file mode 100644 index 00000000..dfebbcab --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_lcd_hd44.h @@ -0,0 +1,157 @@ +/** + * \file + * + * + * \brief LCD low-level hardware macros + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_HD44_H +#define HW_LCD_HD44_H + +#include "cfg/cfg_lcd_hd44.h" /* CONFIG_LCD_4BIT */ + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_E /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +/*@}*/ + +/** + * \name DB high nibble (DB[4-7]) + * @{ + */ + +#if CONFIG_LCD_4BIT + #define LCD_MASK (LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4) + #define LCD_SHIFT 4 +#else + #define LCD_MASK (uint8_t)0xff + #define LCD_SHIFT 0 +#endif +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_RS /* Implement me! */ +#define LCD_SET_RS /* Implement me! */ +#define LCD_CLR_RD /* Implement me! */ +#define LCD_SET_RD /* Implement me! */ +#define LCD_CLR_E /* Implement me! */ +#define LCD_SET_E /* Implement me! */ + +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +#if CONFIG_LCD_4BIT + #define LCD_WRITE_H(x) ((void)x)/* Implement me! */ + #define LCD_WRITE_L(x) ((void)x)/* Implement me! */ + #define LCD_READ_H ( 0 /* Implement me! */ ) + #define LCD_READ_L ( 0 /* Implement me! */ ) +#else + #define LCD_WRITE(x) ((void)x)/* Implement me! */ + #define LCD_READ (0 /* Implement me! */ ) +#endif +/*@}*/ + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + + +INLINE void lcd_hd44_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_HD44_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_led.h b/2.5/boards/lpc-p2378/hw/hw_led.h new file mode 100644 index 00000000..e8c055b3 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_led.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief LED on/off macros for LPC-P2378. + * + * \author Andrea Righi + */ + +#ifndef HW_LED_H +#define HW_LED_H + +#include + +#define STATUS_LED (1 << 19) + +#define LED_ON() do { IOCLR1 = STATUS_LED; } while (0) +#define LED_OFF() do { IOSET1 = STATUS_LED; } while (0) + +#define LED_INIT() do { IODIR1 |= STATUS_LED; } while (0) + +#endif /* HW_LED_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_lm75.h b/2.5/boards/lpc-p2378/hw/hw_lm75.h new file mode 100644 index 00000000..290dae09 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_lm75.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_LM75_H +#define HW_LM75_H + +#warning TODO:This is an example implentation, you must implement it! + +#define LM75_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_LM75_H */ + diff --git a/2.5/boards/lpc-p2378/hw/hw_mcp41.c b/2.5/boards/lpc-p2378/hw/hw_mcp41.c new file mode 100644 index 00000000..2a8415df --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_mcp41.c @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id: hw_mcp41.c 2506 2009-04-15 08:29:07Z duplo $ + * \author Francesco Sacchi + */ + +#include "hw/hw_mcp41.h" + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +const uint16_t mcp41_ports[MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; +const uint8_t mcp41_pins [MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; + diff --git a/2.5/boards/lpc-p2378/hw/hw_mcp41.h b/2.5/boards/lpc-p2378/hw/hw_mcp41.h new file mode 100644 index 00000000..b1b5cd03 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_mcp41.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id: hw_mcp41.h 2544 2009-04-17 14:21:09Z batt $ + * \author Francesco Sacchi + */ + +#ifndef HW_MCP41_H +#define HW_MCP41_H + +#include "hw/mcp41_map.h" + +#include + + +#warning TODO:This is an example implementation, you must implement it! + + +INLINE void SET_MCP41_DDR(Mcp41Dev dev) +{ + /* Implement me! */ + //Warning: this funtions is like avr target name, + //fix it to comply for all target. + + //Only for test remove when implement this function + (void)dev; +} + +INLINE void MCP41_ON(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void MCP41_OFF(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +#endif /* HW_MCP41_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_ntc.c b/2.5/boards/lpc-p2378/hw/hw_ntc.c new file mode 100644 index 00000000..b8c56914 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_ntc.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id: hw_ntc.h 1359 2008-05-26 09:42:37Z asterix $ + * \author Lorenzo Berni + * + */ + +#include +#include "hw/ntc_map.h" + +const res_t NTC_RSER[NTC_CNT]; +const res_t NTC_RPAR[NTC_CNT]; +const amp_t NTC_AMP[NTC_CNT]; +const NtcHwInfo* NTC_INFO[NTC_CNT]; diff --git a/2.5/boards/lpc-p2378/hw/hw_ntc.h b/2.5/boards/lpc-p2378/hw/hw_ntc.h new file mode 100644 index 00000000..d3976b02 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_ntc.h @@ -0,0 +1,136 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id: hw_ntc.h 1359 2008-05-26 09:42:37Z asterix $ + * \author Francesco Sacchi + * + * A NTC acts as a variable resistor, whose resistance changes as a + * function of the temperature it measures. To sample it correctly, it is + * usually parallelized and serialized with two fixed resistor. The following diagram shows + * what is the exact disposition of the components, as handled by this + * library: + * + *
+ *                 o Vref
+ *                 |
+ *                 |                               o Vref
+ *                 |                               |
+ *               -----                             |
+ *              |     |                        ---------
+ *              | Rser|                       |         |
+ *              |     |                       |         |
+ *               -----     -----              |   ADC   |
+ *                 | Vp   |     |             |         |
+ *      -----------|------| Amp |-------------|         |
+ *     |           |      |     |      Vadc   |         |
+ *   -----       -----     -----               ---------
+ *  |     |     |     |
+ *  | NTC |     | Rpar|
+ *  |     |     |     |
+ *   -----       -----
+ *     |           |
+ *     |           |
+ *   -----       -----
+ *    ---         ---
+ *
+ * Amp is an amplifier that amplify of AMP times the signal. + * If we indicate Rp as the parallel of NTC with Rpar, ADCBITS as the bits of the ad converter + * and ADCVAL as the result from the adc convertion (Not Vadc but just the value read + * from the adc register), after various calculation, the expression of Rp is: + * + *
+ *
+ *            ADCVAL * Rser
+ * Rp = ------------------------
+ *         ADCBITS
+ *	2         * AMP - ADCVAL
+ *
+ * + * And after that NTC obvisiously is: + *
+ *        Rpar * Rp
+ * NTC = ----------
+ *        Rpar - Rp
+ *
+ * + * + * The function ntc_hw_read() compute the resistence using these formulas above. + */ + +#ifndef HW_NTC_H +#define HW_NTC_H + +#include "ntc_map.h" + +#include + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +extern const res_t NTC_RSER[NTC_CNT]; +extern const res_t NTC_RPAR[NTC_CNT]; +extern const amp_t NTC_AMP[NTC_CNT]; +extern const NtcHwInfo* NTC_INFO[NTC_CNT]; + + +/*! + * Read the resistence of ntc device \a dev. + * Return the result in res_t type. + */ +INLINE res_t ntc_hw_read(NtcDev dev) +{ + ASSERT(dev < NTC_CNT); + // See above for formula explanation. + adcread_t adcval = adc_read((uint16_t)dev); + float rp = (adcval * NTC_RSER[dev] ) / ((1 << adc_bits()) * NTC_AMP[dev] - adcval); + + //kprintf("Rp[%f], Rntc[%f]\n", rp/100, ((NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp)) / 100.0); + + return ( (NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp) ); +} + + +/*! + * Return the info (aka the table) associated with ntc device \a dev. + */ +INLINE const NtcHwInfo* ntc_hw_getInfo(NtcDev dev) +{ + return NTC_INFO[dev]; +} + +#define NTC_HW_INIT do { /* Implement me! */ } while(0) + +#endif /* HW_NTC_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_phase.c b/2.5/boards/lpc-p2378/hw/hw_phase.c new file mode 100644 index 00000000..f58fe9a2 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_phase.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id: hw_phase.c 1398 2008-05-27 16:36:05Z asterix $ + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/hw_phase.h" + +#warning TODO:This is an example implementation, you must implement it! + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_phase.h b/2.5/boards/lpc-p2378/hw/hw_phase.h new file mode 100644 index 00000000..bb7d3c69 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_phase.h @@ -0,0 +1,80 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id: hw_phase.h 2564 2009-04-20 09:51:04Z batt $ + * + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/phase_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define PHASE_HW_INIT do { /* Implement me! */ }while (0) + +INLINE void TRIAC_OFF(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + + +INLINE void TRIAC_ON(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void SET_TRIAC_DDR(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +void zerocross_isr(void); +#define DEFINE_ZEROCROSS_ISR() void zerocross_isr(void) + + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_rit128x96.h b/2.5/boards/lpc-p2378/hw/hw_rit128x96.h new file mode 100644 index 00000000..ae930b97 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_rit128x96.h @@ -0,0 +1,128 @@ +/** + * \file + * + * + * \brief LM3S1986: OLED-RIT-128x96 (P14201) low-level hardware macros + * + * \author Andrea Righi + */ + +#ifndef HW_RIT128x96_H +#define HW_RIT128x96_H + +#include "cfg/macros.h" /* BV() */ +#include "cfg/debug.h" + +#include +#include +#include + +#include +#include +#include + +/** + * \name LCD I/O pins/ports + * @{ + */ +/* OLED Data/Command control pin */ +#define GPIO_OLEDDC_PIN BV(2) + +/* OLED enable pin */ +#define GPIO_OLEDEN_PIN BV(3) +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +/* Enter command mode */ +#define LCD_SET_COMMAND() \ + lm3s_gpioPinWrite(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN, 0) + +/* Enter data mode */ +#define LCD_SET_DATA() \ + lm3s_gpioPinWrite(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN, GPIO_OLEDDC_PIN) + +/* Send data to the display */ +#define LCD_WRITE(x) \ + { \ + uint32_t _x; \ + while (!lm3s_ssiWriteFrameNonBlocking(SSI0_BASE, x)); \ + /* Dummy read to drain the FIFO */ \ + while (!lm3s_ssiReadFrameNonBlocking(SSI0_BASE, &_x)); \ + } +/*@}*/ + +INLINE void lcd_rit128x96_hw_bus_init(void) +{ + uint32_t dummy; + + /* Enable the peripheral clock */ + SYSCTL_RCGC1_R |= SYSCTL_RCGC1_SSI0; + SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOA; + SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOH; + lm3s_busyWait(512); + + /* Configure the SSI0CLK and SSIOTX pins for SSI operation. */ + lm3s_gpioPinConfig(GPIO_PORTA_BASE, BV(2) | BV(3) | BV(5), + GPIO_DIR_MODE_HW, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + /* + * Configure the GPIO port pin used as a D/C# signal (data/command + * control) for OLED device, and the port pin used to enable power to + * the OLED panel. + */ + lm3s_gpioPinConfig(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN, + GPIO_DIR_MODE_OUT, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); + lm3s_gpioPinWrite(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN, + GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN); + + /* Configure the SSI0 port for master mode */ + lm3s_ssiOpen(SSI0_BASE, SSI_FRF_MOTO_MODE_2, + SSI_MODE_MASTER, CPU_FREQ / 2, 8); + /* + * Configure the GPIO port pin used as a D/Cn signal for OLED device, + * and the port pin used to enable power to the OLED panel. + */ + lm3s_gpioPinConfig(GPIO_PORTA_BASE, GPIO_OLEDEN_PIN, + GPIO_DIR_MODE_HW, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + + /* Drain the SSI RX FIFO */ + while (lm3s_ssiReadFrameNonBlocking(SSI0_BASE, &dummy)); +} + +/* + * XXX: menu stuff requires lcd_blitBimap() function to be defined. + * Find a better way to do this. + */ +#define rit128x96_blitBitmap lcd_blitBitmap + +#endif /* HW_RIT128x96_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_sd.h b/2.5/boards/lpc-p2378/hw/hw_sd.h new file mode 100644 index 00000000..79759ae9 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_sd.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief SD driver hardware-specific definitions. + * + * \version $Id: hw_sd.h 2834 2009-08-31 18:11:02Z batt $ + * + * \author Luca Ottaviano + */ + +#ifndef HW_SD_H +#define HW_SD_H + +#warning FIXME: This is an example implementation, you must implement it + +#define SD_CS_INIT() do { /* implement me */} while(0) +#define SD_CS_ON() do { /* implement me */} while(0) +#define SD_CS_OFF() do { /* implement me */} while(0) + +#define SD_PIN_INIT() do { /* implement me */} while(0) +#define SD_CARD_PRESENT() true /* implement me */ +#define SD_WRITE_PROTECT() false /* implement me */ + +#endif /* HW_SD_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_ser.h b/2.5/boards/lpc-p2378/hw/hw_ser.h new file mode 100644 index 00000000..634c44bc --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_ser.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Serial hardware-specific definitions + * + * \version $Id: hw_ser.h 2883 2009-09-04 19:46:02Z batt $ + * + * \author Daniele Basile + */ + +#ifndef HW_SER_H +#define HW_SER_H + +#include "cfg/cfg_ser.h" + +#if CONFIG_SER_STROBE + #warning FIXME: this is an example implementation, you must implement it + + #define SER_STROBE_INIT do { /* implement me */ } while (0) + #define SER_STROBE_ON do { /* implement me */ } while (0) + #define SER_STROBE_OFF do { /* implement me */ } while (0) +#endif + +#endif /* HW_SER_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_sipo.h b/2.5/boards/lpc-p2378/hw/hw_sipo.h new file mode 100644 index 00000000..b4fba473 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_sipo.h @@ -0,0 +1,109 @@ +/** + * \file + * + * + * \brief Macro for HW_SIPO_H + * + * + * \version $Id: hw_sipo.h 2882 2009-09-04 19:17:37Z batt $ + * + * \author Andrea Grandi + * \author Daniele Basile + */ + +#ifndef HW_SIPO_H +#define HW_SIPO_H + +/** + * Map sipo connection on board. + */ +typedef enum SipoMap +{ + SIPO_CNT +} SipoMap; + +/** + * Define generic macro to set pins logic level + */ +#define SIPO_SET_LEVEL_LOW(dev) do { /* Implement me! */ } while (0) +#define SIPO_SET_LEVEL_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Generate one low pulse on select line. + */ +#define PULSE_LOW(dev) do { /* Implement me! */ } while (0) + +/** + * Generate one hight pulse on select line. + */ +#define PULSE_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Define the procedure to drive serial input in sipo device (SI). + */ +#define SIPO_SI_HIGH() do { /* Implement me! */ } while (0) +#define SIPO_SI_LOW() do { /* Implement me! */ } while (0) + +/** + * Drive clock to shift SI data into latch. + */ +#define SIPO_SI_CLOCK(clk_pol) \ + do { \ + (void)clk_pol; \ + /* Implement me! */ \ + } while (0) + +/** + * Do everything needed in order to load dato into sipo. + */ +#define SIPO_LOAD(device, load_pol) do { /* Implement me! */ } while (0) + +/** + * Enable the shift register output. + */ +#define SIPO_ENABLE() do { /* Implement me! */ } while (0) + +/** + * Set polarity for Load, Clk, SI signals. + */ +#define SIPO_SET_LD_LEVEL(device, load_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_CLK_LEVEL(clock_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_SI_LEVEL() do { /* Implement me! */ } while (0) + +/** + * Do anything that needed to init sipo pins. + */ +#define SIPO_INIT_PIN() do { /* Implement me! */ } while (0) + +#endif /* HW_SIPO_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_spi.h b/2.5/boards/lpc-p2378/hw/hw_spi.h new file mode 100644 index 00000000..b9436620 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_spi.h @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * + * \version $Id: hw_spi.h 1357 2008-05-26 09:30:19Z asterix $ + * \author Daniele Basile + */ + +#ifndef HW_SPI_H +#define HW_SPI_H + +#warning TODO:This is an example implentation, you must implement it! + +#include + +/** + * SPI pin definition. + * + * \note CS is assert when level + * is low. + * + * \{ + */ +#define CS /* pin */ ///Connect to CS pin of Flash memory. +#define SCK /* pin */ ///Connect to SCK pin of Flash memory. +#define MOSI /* pin */ ///Connect to SI pin of Flash memory. +#define MISO /* pin */ ///Connect to SO pin of Flash memory. +#define SPI_PORT /* pin */ ///Micro pin PORT register. +#define SPI_PIN /* pin */ ///Micro pin PIN register. +#define SPI_DDR /* pin */ ///Micro pin DDR register. +/*\}*/ + +/** + * Pin logic level. + * + * \{ + */ +#define MOSI_LOW() do { /* Implement me! */ } while(0) +#define MOSI_HIGH() do { /* Implement me! */ } while(0) +#define MISO_HIGH() do { /* Implement me! */ } while(0) +#define SCK_LOW() do { /* Implement me! */ } while(0) +#define SCK_HIGH() do { /* Implement me! */ } while(0) +#define CS_LOW() do { /* Implement me! */ } while(0) +#define CS_HIGH() do { /* Implement me! */ } while(0) +/*\}*/ + +/** + * SPI pin commands. + * + * \{ + */ +#define CS_ENABLE() CS_LOW() +#define CS_DISABLE() CS_HIGH() +#define SS_ACTIVE() CS_LOW() +#define SS_INACTIVE() CS_HIGH() +#define SCK_INACTIVE() SCK_LOW() +#define SCK_ACTIVE() SCK_HIGH() +#define CS_OUT() do { /* Implement me! */ } while(0) +#define MOSI_IN() do { /* Implement me! */ } while(0) +#define MOSI_OUT() do { /* Implement me! */ } while(0) +#define IS_MISO_HIGH() (false /* Implement me! */ ) +#define MISO_IN() do { /* Implement me! */ } while(0) +#define MISO_OUT() do { /* Implement me! */ } while(0) +#define SCK_OUT() do { /* Implement me! */ } while(0) + +#define SCK_PULSE()\ + do {\ + SCK_HIGH();\ + SCK_LOW();\ + } while (0) +/*\}*/ + + +#define SPI_HW_INIT() \ + CS_DISABLE();\ + MOSI_LOW();\ + SCK_LOW();\ + MISO_IN();\ + MOSI_OUT();\ + SCK_OUT();\ + CS_OUT(); + +#endif /* HW_SPI_H */ + diff --git a/2.5/boards/lpc-p2378/hw/hw_stepper.h b/2.5/boards/lpc-p2378/hw/hw_stepper.h new file mode 100644 index 00000000..563a9aa1 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_stepper.h @@ -0,0 +1,309 @@ +/** + * \file + * + * + * \brief Stepper hardware-specific definitions + * + * \version $Id: hw_stepper.h 2488 2009-04-10 17:52:12Z batt $ + * + * \author Daniele Basile + */ + + +#ifndef HW_STEPPER_H +#define HW_STEPPER_H + +#include + +#include + +#include + +#warning TODO:This is an example implentation, you must implement it! + +#define STEPPER_STROBE_INIT \ +do { \ + /* put init code for strobe */ \ +} while (0) + + +#define STEPPER_STROBE_ON do { /* Implement me! */ } while(0) +#define STEPPER_STROBE_OFF do { /* Implement me! */ } while(0) + +/** + * CPU clock frequency is divided by 2^STEPPER_PRESCALER_LOG2 to + * obtain stepper clock. + */ +#define STEPPER_PRESCALER_LOG2 1 + +/** + * Stepper timer clock frequency. + */ +#define STEPPER_CLOCK ((CPU_FREQ) >> STEPPER_PRESCALER_LOG2) + +/** + * us delay to reset a stepper motor. + * This is the time neccessary to reset + * the stepper controll chip. (see datasheet for more detail). + */ +#define STEPPER_RESET_DELAY 1 + +/* + * Pins define for each stepper + */ +#define STEPPER_1_CW_CCW_PIN 0 +#define STEPPER_1_HALF_FULL_PIN 0 +#define STEPPER_1_CONTROL_PIN 0 +#define STEPPER_1_ENABLE_PIN 0 +#define STEPPER_1_RESET_PIN 0 + +/* put here other stepper motor */ + +#define STEPPER_1_SET do { /* Implement me! */ } while(0) +/* add here the set for other stepper motor */ + +#define STEPPER_1_CLEAR do { /* Implement me! */ } while(0) +/* add here the clear for other stepper motor */ + +/* + * Generic macro definition + */ + +/* + * Stepper init macro + */ +#define STEPPER_PIN_INIT_MACRO(port, index) do { \ + /* Add here init pin code */ \ + } while (0) + +/* + * Stepper commands macros + */ +#define STEPPER_SET_CW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CCW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_HALF(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_FULL(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_LOW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_HIGHT(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_DISABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_DISABLE(index) do { /* Implement me! */ } while (0) + + +/* + * Reset stepper macro + */ + +#define STEPPER_RESET_MACRO(index) do { \ + STEPPER_SET_RESET_ENABLE(index); \ + timer_udelay(STEPPER_RESET_DELAY); \ + STEPPER_SET_RESET_DISABLE(index); \ + } while (0) + +/* + * Set half or full step macro + */ +#define STEPPER_SET_STEP_MODE_MACRO(index, flag) do { \ + if (flag) \ + STEPPER_SET_HALF(index); \ + else \ + STEPPER_SET_FULL(index); \ + } while (0) + +/* + * Set control status macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_CONTROL_BIT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macros not implemented */ \ + /* else */ \ + /* WARNING This macros not implemented */ \ + } while (0) + +/* + * Set current power macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_POWER_CURRENT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macrois not implemented */ \ + /* else */ \ + /* WARNING This macrois not implemented */ \ + } while (0) + +/* + * Set rotation of stepper motor + * - dir = 1: positive rotation + * - dir = 0: no motor moviment + * - dir = -1: negative rotation + * + */ +#define STEPPER_SET_DIRECTION_MACRO(index, dir) do { \ + switch (dir) \ + { \ + case 1: \ + STEPPER_SET_CW(index); \ + break; \ + case -1: \ + STEPPER_SET_CCW(index); \ + break; \ + case 0: \ + break; \ + } \ + } while (0) + + +/* + * Define macros for manage low level of stepper. + */ + +#define STEPPER_INIT() do { \ + STEPPER_PIN_INIT_MACRO(A, 1); \ + /* Add here code for other stepper motor */ \ + } while (0) + + +/* + * Enable select stepper motor + */ +#define STEPPER_ENABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_ENABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Enable all stepper connect to micro + */ +#define STEPPER_ENABLE_ALL() do { \ + STEPPER_SET_ENABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Disable select stepper motor + */ +#define STEPPER_DISABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DISABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Disable all stepper connect to micro + */ +#define STEPPER_DISABLE_ALL() do { \ + STEPPER_SET_DISABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Reset selected stepper motor + */ +#define STEPPER_RESET(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_RESET_MACRO(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Reset all stepper motor + */ +#define STEPPER_RESET_ALL() do { \ + STEPPER_RESET_MACRO(1) \ + /* Add here code for other stepper motor */ \ + } while (0) + +// Set half/full step macros +#define STEPPER_SET_HALF_STEP(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_STEP_MODE_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Control status +#define STEPPER_SET_CONTROL_BIT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_CONTROL_BIT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Set stepper power current +#define STEPPER_SET_POWER_CURRENT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_POWER_CURRENT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +// Set rotation dirction of stepper motor +#define STEPPER_SET_DIRECTION(index, dir) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DIRECTION_MACRO(1, dir); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +#endif /* HW_STEPPER_H */ + + diff --git a/2.5/boards/lpc-p2378/hw/hw_tas5706a.h b/2.5/boards/lpc-p2378/hw/hw_tas5706a.h new file mode 100644 index 00000000..f8cbf353 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_tas5706a.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief HW pin handling. + * + * \version $Id: hw_tas5706a.h 2849 2009-09-01 15:46:14Z lottaviano $ + * + * \author Francesco Sacchi + */ + +#ifndef HW_TAS5706A_H +#define HW_TAS5706A_H + +#include + +#warning FIXME: This is an example implementation, you must implement it + +#define TAS5706A_SETPOWERDOWN(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETRESET(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETMUTE(val) do { (void) val; /* implement me */ } while (0) + +#define TAS5706A_PIN_INIT() \ + do { \ + TAS5706A_SETPOWERDOWN(true); \ + TAS5706A_SETRESET(true); \ + TAS5706A_SETMUTE(true); \ + /* complete me */ \ + } while (0) + +#define TAS5706A_MCLK_INIT() \ + do { \ + /* implement me */ \ + } while(0) + + +#endif /* HW_TAS5706A_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_thermo.h b/2.5/boards/lpc-p2378/hw/hw_thermo.h new file mode 100644 index 00000000..de5edcc7 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_thermo.h @@ -0,0 +1,182 @@ +/** + * \file + * + * + * \brief thermo hardware-specific control functions. + * + * \version $Id: hw_thermo.h 1440 2008-06-10 17:59:13Z asterix $ + * \author Francesco Sacchi + * + */ + +#ifndef HW_THERMO_H +#define HW_THERMO_H + +#include "thermo_map.h" +#include "ntc_map.h" + +#include +#include + +#include +#include + +#warning TODO:This is an example implentation, you must implement it! + +/*! + * This function should return the temperature set tolerance. + */ +INLINE deg_t thermo_hw_tolerance(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + switch (dev) + { + case THERMO_TEST: + /* Put here convertion function to temperature size */ + break; + + /* Put here your thermo device */ + + default: + ASSERT(0); + } + + return 0; +} + + +/*! + * This function should return the timeout for reaching the + * target temperature. + */ +INLINE ticks_t thermo_hw_timeout(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + switch (dev) + { + case THERMO_TEST: + /* return ms_to_ticks(60000); */ + break; + + /* Put here a time out for select thermo device */ + + default: + ASSERT(0); + } + + return 0; +} + + + +/*! + * Read the temperature of the hw device \a dev. + */ +INLINE deg_t thermo_hw_read(ThermoDev dev) +{ + return ntc_read(dev); +} + + +/*! + * Turns off a specific device. + * This function is usefull to handle errors. + */ +INLINE void thermo_hw_off(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + + switch (dev) + { + case THERMO_TEST: + phase_setPower(TRIAC_TEST, 0); + break; + + /* Put here a thermo device to turn off */ + + default: + ASSERT(0); + } + +} + + +/*! + * Based on the current temperature \a cur_temp and the target temperature \a target, this function turns on and off specific + * triac channel and handles the freezer alarm. + * It may use also PID control for thermo-regolations. + */ +INLINE void thermo_hw_set(ThermoDev dev, deg_t target, deg_t cur_temp) +{ + ASSERT(dev < THERMO_CNT); + + deg_t dist = target - cur_temp; + //kprintf("dev[%d], dist[%d]\n", dev, dist); + + switch(dev) + { + case THERMO_TEST: + if (dist > 0) + { + /* phase_setPower(TRIAC_TEST, dist * PID_TEST_K); */ + } + else + { + /* phase_setPower(TRIAC_TEST, 0); */ + } + break; + + /* Put here an other thermo device */ + + default: + ASSERT(0); + } +} + + +#define THERMO_HW_INIT _thermo_hw_init() + +/*! + * Init hw associated with thermo-control. + */ +INLINE void _thermo_hw_init(void) +{ + ASSERT(phase_initialized); + ASSERT(ntc_initialized); + + phase_setPower(TRIAC_TEST, 0); + + /* Add here the other thermo device */ +} + +#endif /* HW_THERMO_H */ diff --git a/2.5/boards/lpc-p2378/hw/hw_tlv5618.h b/2.5/boards/lpc-p2378/hw/hw_tlv5618.h new file mode 100644 index 00000000..4a2b4202 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_tlv5618.h @@ -0,0 +1,69 @@ +/** + * \file + * + * + * \brief TLV5816 DAC hardware-specific definitions + * + * + * \author Francesco Sacchi + */ + +#ifndef HW_TLV5816_H +#define HW_TLV5816_H + +#warning TODO:This is an example implementation, you must implement it! + +#define TLV5618_CSINIT(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ + TLV5618_CSHIGH(pin); \ +} while(0) + +#define TLV5618_CSLOW(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#define TLV5618_CSHIGH(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#endif /* HW_TLV5816_H */ + diff --git a/2.5/boards/lpc-p2378/hw/hw_tmp123.h b/2.5/boards/lpc-p2378/hw/hw_tmp123.h new file mode 100644 index 00000000..adb18588 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/hw_tmp123.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_TMP123_H +#define HW_TMP123_H + +#warning TODO:This is an example implentation, you must implement it! + +#define TMP123_HW_CS_EN() /* Implement me! */ +#define TMP123_HW_CS_DIS() /* Implement me! */ + +#define TMP123_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_TMP123_H */ + diff --git a/2.5/boards/lpc-p2378/hw/kbd_map.h b/2.5/boards/lpc-p2378/hw/kbd_map.h new file mode 100644 index 00000000..07515c0a --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/kbd_map.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Keyboard map definitions. + * + * \version $Id: kbd_map.h 2848 2009-09-01 15:23:57Z lottaviano $ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_MAP_H +#define HW_KBD_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + + +/** + * Type for keyboard mask. + */ +typedef uint16_t keymask_t; + +/** + * \name Keycodes. + */ +/*@{*/ +#define K_UP BV(0) +#define K_DOWN BV(1) +#define K_OK BV(2) +#define K_CANCEL BV(3) + +#define K_REPEAT BV(13) /**< This is a repeated keyevent. */ +#define K_TIMEOUT BV(14) /**< Fake key event for timeouts. */ +#define K_LONG BV(15) +/*@}*/ + +#define K_LNG_MASK 0 + +#endif /* HW_KBD_MAP_H */ diff --git a/2.5/boards/lpc-p2378/hw/mcp41_map.h b/2.5/boards/lpc-p2378/hw/mcp41_map.h new file mode 100644 index 00000000..544f5673 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/mcp41_map.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief MCP41 digital potentiometer map definitions. + * + * \version $Id: mcp41_map.h 2506 2009-04-15 08:29:07Z duplo $ + * + * \author Francesco Sacchi + */ + +#ifndef MCP41_MAP_H +#define MCP41_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/** \name Enum for mcp41 pot evices. + * \{ + * + */ +typedef enum Mcp41Dev +{ + MCP41_LED, + + /* put here other mcp41 device */ + + MCP41_CNT, +} Mcp41Dev; +/* \} */ + +#endif /* MCP41_MAP_H */ diff --git a/2.5/boards/lpc-p2378/hw/ntc_map.h b/2.5/boards/lpc-p2378/hw/ntc_map.h new file mode 100644 index 00000000..00997ce6 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/ntc_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief NTC map definitions. + * + * \version $Id: ntc_map.h 1312 2008-05-20 16:54:52Z asterix $ + * + * \author Giovanni Bajo + * \author Francesco Sacchi + */ + +#ifndef NTC_MAP_H +#define NTC_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for ntc devices. + * \{ + */ +typedef enum NtcDev +{ + NTC_TEST, + + /* Put here your thermo device */ + + NTC_CNT +} NtcDev; +/* \} */ + +#endif /* NTC_MAP_H */ diff --git a/2.5/boards/lpc-p2378/hw/phase_map.h b/2.5/boards/lpc-p2378/hw/phase_map.h new file mode 100644 index 00000000..2f338cdb --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/phase_map.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief Triac map definitions. + * + * \version $Id: phase_map.h 1357 2008-05-26 09:30:19Z asterix $ + * + * \author Francesco Sacchi + */ + +#ifndef PHASE_MAP_H +#define PHASE_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for triac devices. + * \{ + */ +typedef enum TriacDev +{ + TRIAC_TEST, + + /* Put here other triac device */ + + TRIAC_CNT +} TriacDev; +/* \} */ + +#endif /* PHASE_MAP_H */ diff --git a/2.5/boards/lpc-p2378/hw/pwm_map.h b/2.5/boards/lpc-p2378/hw/pwm_map.h new file mode 100644 index 00000000..8f9f8b65 --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/pwm_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * + * \brief PWM map device. + * + * \version $Id: pwm_map.h 1357 2008-05-26 09:30:19Z asterix $ + * + * \author Daniele Basile + */ + +#ifndef HW_PWM_MAP_H +#define HW_PWM_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +typedef enum +{ + PWM_CH0 = 0, + PWM_CH1, + PWM_CH2, + PWM_CH3, + +/* + * add other PWM channel or + * change above. + */ + + PWM_CNT +} PwmDev; + +#endif /* HW_PWM_MAP_H */ diff --git a/2.5/boards/lpc-p2378/hw/thermo_map.h b/2.5/boards/lpc-p2378/hw/thermo_map.h new file mode 100644 index 00000000..5973612b --- /dev/null +++ b/2.5/boards/lpc-p2378/hw/thermo_map.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Thermo regulation control map definitions. + * + * \version $Id: thermo_map.h 1312 2008-05-20 16:54:52Z asterix $ + * + * \author Francesco Sacchi + */ + +#ifndef THERMO_MAP_H +#define THERMO_MAP_H + +#include +#include + +#warning TODO:This is an example implentation, you must implement it! + +typedef uint8_t thermostatus_t; + +#define THERMO_OFF 0 +#define THERMO_HEATING BV(0) +#define THERMO_FREEZING BV(1) +#define THERMO_TGT_REACH BV(2) +#define THERMOERRF_NTCSHORT BV(3) +#define THERMOERRF_NTCOPEN BV(4) +#define THERMOERRF_TIMEOUT BV(5) +#define THERMO_ACTIVE BV(6) + +#define THERMO_ERRMASK (THERMOERRF_NTCSHORT | THERMOERRF_NTCOPEN | THERMOERRF_TIMEOUT) + +typedef enum ThermoDev +{ + THERMO_TEST, + + /* Put here your thermo device */ + + THERMO_CNT, +} ThermoDev; + +#endif /* THERMO_MAP_H */ diff --git a/2.5/boards/lpc-p2378/templates/.spec b/2.5/boards/lpc-p2378/templates/.spec new file mode 100644 index 00000000..07fb8eed --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/.spec @@ -0,0 +1,3 @@ +name = "Templates" +ord = 0 +description = "Use these as a starting point for your BeRTOS project." diff --git a/2.5/boards/lpc-p2378/templates/empty/.spec b/2.5/boards/lpc-p2378/templates/empty/.spec new file mode 100644 index 00000000..f3edfbc2 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/.spec @@ -0,0 +1,8 @@ +name = 'empty preset' +advanced = True +description=""" +

+This is a minimalist project, it just initializes the hardware of the +supported board and proposes an empty main. +<\p> +""" diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_adc.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_afsk.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ax25.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_battfs.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_context_switch.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_dataflash.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_dc_motor.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_debug.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_fat.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_flash25.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_formatwr.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_gfx.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_hashtable.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_heap.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_i2c.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_i2s.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ini_reader.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_kbd.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_keytag.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_kfile.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_lcd_32122a.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_lcd_hd44.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_lm75.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_md2.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_monitor.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_nmea.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_parser.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_phase.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_pocketbus.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_proc.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_proc.h new file mode 100644 index 00000000..b2c3a965 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 0 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_pwm.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ramp.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_randpool.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_sem.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ser.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_signal.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_signal.h new file mode 100644 index 00000000..e78a4519 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 0 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_spi_bitbang.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_stepper.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_tas5706a.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_thermo.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_timer.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_wdt.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_xmodem.h b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/lpc-p2378/templates/empty/empty.mk b/2.5/boards/lpc-p2378/templates/empty/empty.mk new file mode 100644 index 00000000..8ba73a20 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/empty.mk @@ -0,0 +1,95 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the empty_user.mk file instead. +# + +# Constants automatically defined by the selected modules +empty_DEBUG = 1 + +# Our target application +TRG += empty + +empty_PREFIX = "arm-none-eabi-" + +empty_SUFFIX = "" + +empty_SRC_PATH = boards/lpc-p2378/templates/empty + +empty_HW_PATH = boards/lpc-p2378 + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CSRC INSTEAD! +empty_WIZARD_CSRC = \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/cpu/arm/drv/timer_lpc2.c \ + bertos/kern/sem.c \ + bertos/mware/formatwr.c \ + bertos/struct/heap.c \ + bertos/cpu/arm/drv/ser_arm.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/cpu/arm/drv/ser_lpc2.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_PCSRC INSTEAD! +empty_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CPPASRC INSTEAD! +empty_WIZARD_CPPASRC = \ + bertos/cpu/arm/hw/switch_ctx_arm.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CXXSRC INSTEAD! +empty_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_ASRC INSTEAD! +empty_WIZARD_ASRC = \ + \ + # + +empty_CPPFLAGS = -D'CPU_FREQ=(72000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(empty_HW_PATH) -I$(empty_SRC_PATH) $(empty_CPU_CPPFLAGS) $(empty_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_LDFLAGS = $(empty_CPU_LDFLAGS) $(empty_WIZARD_LDFLAGS) $(empty_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPAFLAGS = $(empty_CPU_CPPAFLAGS) $(empty_WIZARD_CPPAFLAGS) $(empty_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CSRC = $(empty_CPU_CSRC) $(empty_WIZARD_CSRC) $(empty_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_PCSRC = $(empty_CPU_PCSRC) $(empty_WIZARD_PCSRC) $(empty_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPASRC = $(empty_CPU_CPPASRC) $(empty_WIZARD_CPPASRC) $(empty_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CXXSRC = $(empty_CPU_CXXSRC) $(empty_WIZARD_CXXSRC) $(empty_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_ASRC = $(empty_CPU_ASRC) $(empty_WIZARD_ASRC) $(empty_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_lpc2.S +empty_CPU_CPPAFLAGS = -g -gdwarf-2 +empty_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_LPC2378__ +empty_CPU_CSRC = bertos/cpu/arm/hw/init_lpc2.c bertos/cpu/arm/drv/vic_lpc2.c +empty_PROGRAMMER_CPU = lpc2378 +empty_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/lpc2378.ld +empty_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +empty_CPU = arm7tdmi +empty_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +empty_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +empty_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(empty_SRC_PATH)/empty_user.mk diff --git a/2.5/boards/lpc-p2378/templates/empty/empty_user.mk b/2.5/boards/lpc-p2378/templates/empty/empty_user.mk new file mode 100644 index 00000000..4c8ed7ef --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/empty_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +empty_PROGRAMMER_TYPE = none +empty_PROGRAMMER_PORT = none + +# Files included by the user. +empty_USER_CSRC = \ + $(empty_SRC_PATH)/main.c \ + # + +# Files included by the user. +empty_USER_PCSRC = \ + # + +# Files included by the user. +empty_USER_CPPASRC = \ + # + +# Files included by the user. +empty_USER_CXXSRC = \ + # + +# Files included by the user. +empty_USER_ASRC = \ + # + +# Flags included by the user. +empty_USER_LDFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/lpc-p2378/templates/empty/main.c b/2.5/boards/lpc-p2378/templates/empty/main.c new file mode 100644 index 00000000..9ed920e7 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/main.c @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Empty project. + * + * This is a minimalist project, it just initializes the hardware of the + * supported board and proposes an empty main. + */ + +#include "hw/hw_led.h" + +#include + +#include +#include + + +#include +#include + +static Serial out; + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* Initialize UART1 */ + ser_init(&out, SER_UART1); + /* Configure UART1 to work at 115.200 bps */ + ser_setbaudrate(&out, 115200); + /* Initialize LED driver */ + LED_INIT(); +} + +int main(void) +{ + init(); + + /* Put your code here... */ + while (1) + { + } +} diff --git a/2.5/boards/lpc-p2378/templates/empty/project.bertos b/2.5/boards/lpc-p2378/templates/empty/project.bertos new file mode 100644 index 00000000..beb71ade --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/empty/project.bertos @@ -0,0 +1,77 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V72000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vempty +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Varm-none-eabi +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V/scratch/julian/2010q1-release-eabi-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2010q1-188' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin +p15 +sS'version' +p16 +V4.4.1 +p17 +sS'build' +p18 +VSourcery G++ Lite 2010q1-188 +p19 +sS'path' +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'formatwr' +p25 +aS'debug' +p26 +aS'kfile' +p27 +aS'heap' +p28 +aS'timer' +p29 +asS'CPU_NAME' +p30 +VLPC2378 +p31 +sS'PROJECT_HW_PATH' +p32 +S'../..' +p33 +sS'PROJECT_SRC_PATH' +p34 +S'.' +p35 +sS'PRESET' +p36 +I01 +sS'OUTPUT' +p37 +(lp38 +s. \ No newline at end of file diff --git a/2.5/boards/lpc-p2378/templates/kernel/.spec b/2.5/boards/lpc-p2378/templates/kernel/.spec new file mode 100644 index 00000000..04a79cff --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/.spec @@ -0,0 +1,9 @@ +name = 'kernel preset' +advanced = True +description=""" +

+This is a minimalist kernel project: it just initializes the hardware and +creates an independent process to blink an LED, while the main loop +continues to monitor the stack utilization of all the processes. +

+""" diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_adc.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_afsk.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ax25.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_battfs.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_context_switch.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_dataflash.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_dc_motor.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_debug.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_fat.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_flash25.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_formatwr.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_gfx.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_hashtable.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_heap.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_i2c.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_i2s.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ini_reader.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_kbd.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_keytag.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_kfile.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_lcd_32122a.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_lcd_hd44.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_lm75.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_md2.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_monitor.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_monitor.h new file mode 100644 index 00000000..6391b407 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 1 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_nmea.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_parser.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_phase.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_pocketbus.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_proc.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_proc.h new file mode 100644 index 00000000..7e64c498 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_pwm.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ramp.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_randpool.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_sem.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ser.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_signal.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_spi_bitbang.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_stepper.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_tas5706a.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_thermo.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_timer.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_wdt.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_xmodem.h b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/lpc-p2378/templates/kernel/kernel.mk b/2.5/boards/lpc-p2378/templates/kernel/kernel.mk new file mode 100644 index 00000000..0d12f9b1 --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/kernel.mk @@ -0,0 +1,96 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_user.mk file instead. +# + +# Constants automatically defined by the selected modules +kernel_DEBUG = 1 + +# Our target application +TRG += kernel + +kernel_PREFIX = "arm-none-eabi-" + +kernel_SUFFIX = "" + +kernel_SRC_PATH = boards/lpc-p2378/templates/kernel + +kernel_HW_PATH = boards/lpc-p2378 + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CSRC INSTEAD! +kernel_WIZARD_CSRC = \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/cpu/arm/drv/timer_lpc2.c \ + bertos/kern/sem.c \ + bertos/kern/monitor.c \ + bertos/mware/formatwr.c \ + bertos/struct/heap.c \ + bertos/cpu/arm/drv/ser_arm.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/cpu/arm/drv/ser_lpc2.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_PCSRC INSTEAD! +kernel_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CPPASRC INSTEAD! +kernel_WIZARD_CPPASRC = \ + bertos/cpu/arm/hw/switch_ctx_arm.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CXXSRC INSTEAD! +kernel_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_ASRC INSTEAD! +kernel_WIZARD_ASRC = \ + \ + # + +kernel_CPPFLAGS = -D'CPU_FREQ=(72000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_HW_PATH) -I$(kernel_SRC_PATH) $(kernel_CPU_CPPFLAGS) $(kernel_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_LDFLAGS = $(kernel_CPU_LDFLAGS) $(kernel_WIZARD_LDFLAGS) $(kernel_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPAFLAGS = $(kernel_CPU_CPPAFLAGS) $(kernel_WIZARD_CPPAFLAGS) $(kernel_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CSRC = $(kernel_CPU_CSRC) $(kernel_WIZARD_CSRC) $(kernel_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_PCSRC = $(kernel_CPU_PCSRC) $(kernel_WIZARD_PCSRC) $(kernel_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPASRC = $(kernel_CPU_CPPASRC) $(kernel_WIZARD_CPPASRC) $(kernel_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CXXSRC = $(kernel_CPU_CXXSRC) $(kernel_WIZARD_CXXSRC) $(kernel_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_ASRC = $(kernel_CPU_ASRC) $(kernel_WIZARD_ASRC) $(kernel_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_lpc2.S +kernel_CPU_CPPAFLAGS = -g -gdwarf-2 +kernel_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_LPC2378__ +kernel_CPU_CSRC = bertos/cpu/arm/hw/init_lpc2.c bertos/cpu/arm/drv/vic_lpc2.c +kernel_PROGRAMMER_CPU = lpc2378 +kernel_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/lpc2378.ld +kernel_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_CPU = arm7tdmi +kernel_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +kernel_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh + +include $(kernel_SRC_PATH)/kernel_user.mk diff --git a/2.5/boards/lpc-p2378/templates/kernel/kernel_user.mk b/2.5/boards/lpc-p2378/templates/kernel/kernel_user.mk new file mode 100644 index 00000000..6dfb4d8c --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/kernel_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_PROGRAMMER_TYPE = none +kernel_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_USER_CSRC = \ + $(kernel_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_USER_PCSRC = \ + # + +# Files included by the user. +kernel_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_USER_ASRC = \ + # + +# Flags included by the user. +kernel_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/lpc-p2378/templates/kernel/main.c b/2.5/boards/lpc-p2378/templates/kernel/main.c new file mode 100644 index 00000000..ad5c7ada --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/main.c @@ -0,0 +1,112 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Kernel project. + * + * This is a minimalist kernel project: it just initializes the hardware and + * creates an independent process to blink an LED, while the main loop + * continues to monitor the stack utilization of all the processes. + */ + +#include "hw/hw_led.h" + +#include + +#include +#include + +#include +#include + +#include +#include + +static Serial out; + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* Initialize UART1 */ + ser_init(&out, SER_UART1); + /* Configure UART1 to work at 115.200 bps */ + ser_setbaudrate(&out, 115200); + /* Initialize LED driver */ + LED_INIT(); + + /* + * Kernel initialization: processes (allow to create and dispatch + * processes using proc_new()). + */ + proc_init(); +} + +static void NORETURN led_process(void) +{ + int i; + + /* Periodically blink the led (toggle each 100 ms) */ + for (i = 0; ; i = !i) + { + if (i) + LED_ON(); + else + LED_OFF(); + timer_delay(100); + } +} + +int main(void) +{ + /* Hardware initialization */ + init(); + + /* Create a new child process */ + proc_new(led_process, NULL, KERN_MINSTACKSIZE * 2, NULL); + + /* + * The main process is kept to periodically report the stack + * utilization of all the processes (1 probe per second). + */ + while (1) + { + monitor_report(); + timer_delay(1000); + } +} diff --git a/2.5/boards/lpc-p2378/templates/kernel/project.bertos b/2.5/boards/lpc-p2378/templates/kernel/project.bertos new file mode 100644 index 00000000..ba48643b --- /dev/null +++ b/2.5/boards/lpc-p2378/templates/kernel/project.bertos @@ -0,0 +1,85 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V72000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Varm-none-eabi +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V/scratch/julian/2010q1-release-eabi-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2010q1-188' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin +p15 +sS'version' +p16 +V4.4.1 +p17 +sS'build' +p18 +VSourcery G++ Lite 2010q1-188 +p19 +sS'path' +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'kernel' +p25 +aS'semaphores' +p26 +aS'monitor' +p27 +aS'formatwr' +p28 +aS'debug' +p29 +aS'kfile' +p30 +aS'heap' +p31 +aS'signal' +p32 +aS'timer' +p33 +asS'CPU_NAME' +p34 +VLPC2378 +p35 +sS'PROJECT_HW_PATH' +p36 +S'../..' +p37 +sS'PROJECT_SRC_PATH' +p38 +S'.' +p39 +sS'PRESET' +p40 +I01 +sS'OUTPUT' +p41 +(lp42 +s. \ No newline at end of file diff --git a/2.5/boards/stm32-p103/.image.png b/2.5/boards/stm32-p103/.image.png new file mode 100644 index 0000000000000000000000000000000000000000..c642ada5b5b5efa09d34adec351cd1db58d5a7ed GIT binary patch literal 55020 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 STM32-P103 + +

+ + + + + + + + + + + + + + + + + + +
CPUST Microelectronics STM32F103RB
Clock72MHz
Memory128kB Flash, 20kB SRAM
Peripheralstimers, ADC, UART, SPI, I²C, CAN, PWM, USB, DMA, SD card connector
+

+

+STM32-P103® is based on ST Microelectronics STM32F103RB Cortex-M3 CPU. Visit the STM32-P103 page for more information. +

+ +''' + + diff --git a/2.5/boards/stm32-p103/benchmark/.spec b/2.5/boards/stm32-p103/benchmark/.spec new file mode 100644 index 00000000..18c0580d --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/.spec @@ -0,0 +1,3 @@ +name="Benchmarks" +ord=2 +description="Projects to measure different aspects of BeRTOS performance." diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/.spec b/2.5/boards/stm32-p103/benchmark/context_switch/.spec new file mode 100644 index 00000000..3268cbf4 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/.spec @@ -0,0 +1,15 @@ +name = 'BeRTOS Context Switch' +description=""" +

+This benchmark measures the overhead (in us) required to deliver a +signal and switch from a low-priority process to a high-priority process. +

+

+The measure is made by the high-precision timer if supported by the +architecture. Alternatively, the time can also be measured using an external +oscilloscope connected to the board's status LED. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_adc.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_afsk.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ax25.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_battfs.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_context_switch.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_context_switch.h new file mode 100644 index 00000000..2607d50c --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 0 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_dataflash.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_dc_motor.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_debug.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_fat.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_flash25.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_formatwr.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_gfx.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_hashtable.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_heap.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_i2c.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_i2s.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ini_reader.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_kbd.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_keytag.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_kfile.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_lcd_32122a.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_lcd_hd44.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_lm75.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_md2.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_menu.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_monitor.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_nmea.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_parser.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_phase.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_pocketbus.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_proc.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_proc.h new file mode 100644 index 00000000..ab1a4680 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_pwm.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ramp.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_randpool.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_sem.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ser.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_signal.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_spi_bitbang.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_stepper.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_tas5706a.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_thermo.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_timer.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_wdt.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_xmodem.h b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/context_switch.mk b/2.5/boards/stm32-p103/benchmark/context_switch/context_switch.mk new file mode 100644 index 00000000..02d93cc4 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/context_switch.mk @@ -0,0 +1,92 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the context_switch_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += context_switch + +context_switch_PREFIX = "arm-none-eabi-" + +context_switch_SUFFIX = "" + +context_switch_SRC_PATH = boards/stm32-p103/benchmark/context_switch + +context_switch_HW_PATH = boards/stm32-p103 + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CSRC INSTEAD! +context_switch_WIZARD_CSRC = \ + bertos/benchmark/context_switch.c \ + bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \ + bertos/kern/kfile.c \ + bertos/cpu/cortex-m3/drv/timer_cm3.c \ + bertos/struct/heap.c \ + bertos/mware/formatwr.c \ + bertos/cpu/arm/drv/timer_arm.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/mware/hex.c \ + bertos/kern/signal.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_PCSRC INSTEAD! +context_switch_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CPPASRC INSTEAD! +context_switch_WIZARD_CPPASRC = \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CXXSRC INSTEAD! +context_switch_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_ASRC INSTEAD! +context_switch_WIZARD_ASRC = \ + \ + # + +context_switch_CPPFLAGS = -D'CPU_FREQ=(72000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(context_switch_HW_PATH) -I$(context_switch_SRC_PATH) $(context_switch_CPU_CPPFLAGS) $(context_switch_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_LDFLAGS = $(context_switch_CPU_LDFLAGS) $(context_switch_WIZARD_LDFLAGS) $(context_switch_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPAFLAGS = $(context_switch_CPU_CPPAFLAGS) $(context_switch_WIZARD_CPPAFLAGS) $(context_switch_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CSRC = $(context_switch_CPU_CSRC) $(context_switch_WIZARD_CSRC) $(context_switch_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_PCSRC = $(context_switch_CPU_PCSRC) $(context_switch_WIZARD_PCSRC) $(context_switch_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPASRC = $(context_switch_CPU_CPPASRC) $(context_switch_WIZARD_CPPASRC) $(context_switch_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CXXSRC = $(context_switch_CPU_CXXSRC) $(context_switch_WIZARD_CXXSRC) $(context_switch_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_ASRC = $(context_switch_CPU_ASRC) $(context_switch_WIZARD_ASRC) $(context_switch_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPU_CPPASRC = bertos/cpu/cortex-m3/hw/crt_cm3.S bertos/cpu/cortex-m3/hw/vectors_cm3.S +context_switch_CPU_CPPAFLAGS = -g -gdwarf-2 -mthumb -mno-thumb-interwork +context_switch_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -mthumb -mno-thumb-interwork -fno-strict-aliasing -fwrapv -fverbose-asm -Ibertos/cpu/cortex-m3/ -D__ARM_STM32P103__ +context_switch_CPU_CSRC = bertos/cpu/cortex-m3/hw/init_cm3.c bertos/cpu/cortex-m3/drv/irq_cm3.c bertos/cpu/cortex-m3/drv/gpio_stm32.c bertos/cpu/cortex-m3/drv/clock_stm32.c +context_switch_PROGRAMMER_CPU = stm32 +context_switch_CPU_LDFLAGS = -mthumb -mno-thumb-interwork -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/cortex-m3/scripts/stm32p103_rom.ld +context_switch_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +context_switch_CPU = cortex-m3 +context_switch_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +context_switch_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +context_switch_FLASH_SCRIPT = bertos/prg_scripts/arm/flash-stm32.sh + +include $(context_switch_SRC_PATH)/context_switch_user.mk diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/context_switch_user.mk b/2.5/boards/stm32-p103/benchmark/context_switch/context_switch_user.mk new file mode 100644 index 00000000..4bc28c58 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/context_switch_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +context_switch_PROGRAMMER_TYPE = none +context_switch_PROGRAMMER_PORT = none + +# Files included by the user. +context_switch_USER_CSRC = \ + $(context_switch_SRC_PATH)/main.c \ + # + +# Files included by the user. +context_switch_USER_PCSRC = \ + # + +# Files included by the user. +context_switch_USER_CPPASRC = \ + # + +# Files included by the user. +context_switch_USER_CXXSRC = \ + # + +# Files included by the user. +context_switch_USER_ASRC = \ + # + +# Flags included by the user. +context_switch_USER_LDFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPFLAGS = \ + -O2 \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/main.c b/2.5/boards/stm32-p103/benchmark/context_switch/main.c new file mode 100644 index 00000000..f190567f --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/main.c @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel context switch benchmark. + * + * This benchmark measures the overhead (in µs) required to deliver a + * signal and switch from a low-priority process to a high-priority process. + * + * The measure is made by the high-precision timer if supported by the + * architecture. Alternatively, the time can also be measured using an external + * oscilloscope connected to the board's status LED. + */ + +#include + +int main(void) +{ + context_switch(); + while (1) + { + } + + return 0; +} diff --git a/2.5/boards/stm32-p103/benchmark/context_switch/project.bertos b/2.5/boards/stm32-p103/benchmark/context_switch/project.bertos new file mode 100644 index 00000000..16feb574 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/context_switch/project.bertos @@ -0,0 +1,79 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V72000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vcontext_switch +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Varm-none-eabi +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V/scratch/julian/2010q1-release-eabi-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2010q1-188' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin +p15 +sVversion +p16 +V4.4.1 +p17 +sVbuild +p18 +VSourcery G++ Lite 2010q1-188 +p19 +sVpath +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'kernel' +p24 +aS'formatwr' +p25 +aS'kfile' +p26 +aS'context_switch' +p27 +aS'heap' +p28 +aS'signal' +p29 +aS'timer' +p30 +asS'CPU_NAME' +p31 +VSTM32F103RB +p32 +sS'PROJECT_HW_PATH' +p33 +S'../..' +p34 +sS'PROJECT_SRC_PATH' +p35 +S'.' +p36 +sS'PRESET' +p37 +I01 +sS'OUTPUT' +p38 +(lp39 +s. diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/.spec b/2.5/boards/stm32-p103/benchmark/kernel_footprint/.spec new file mode 100644 index 00000000..5a527bef --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/.spec @@ -0,0 +1,14 @@ +name = 'BeRTOS Kernel footprint' +description=""" +

+This benchmark measures the memory footprint of the BeRTOS kernel with a +simple minimalist user application. +

+

+The purpose of this test is to give a measure of the required space in a +generic flash memory to store a full-featured BeRTOS kernel. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_adc.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_afsk.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ax25.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_battfs.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_context_switch.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_dataflash.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_dc_motor.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_debug.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_fat.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_flash25.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_formatwr.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_gfx.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_hashtable.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_heap.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_i2c.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_i2s.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ini_reader.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_kbd.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_keytag.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_kfile.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_lm75.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_md2.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_menu.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_monitor.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_nmea.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_parser.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_phase.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_pocketbus.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_proc.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_proc.h new file mode 100644 index 00000000..ab1a4680 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_pwm.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ramp.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_randpool.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_sem.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ser.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_signal.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_stepper.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_tas5706a.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_thermo.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_timer.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_wdt.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_xmodem.h b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/kernel_footprint.mk b/2.5/boards/stm32-p103/benchmark/kernel_footprint/kernel_footprint.mk new file mode 100644 index 00000000..ec8fc92d --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/kernel_footprint.mk @@ -0,0 +1,93 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_footprint_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += kernel_footprint + +kernel_footprint_PREFIX = "arm-none-eabi-" + +kernel_footprint_SUFFIX = "" + +kernel_footprint_SRC_PATH = boards/stm32-p103/benchmark/kernel_footprint + +kernel_footprint_HW_PATH = boards/stm32-p103 + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CSRC INSTEAD! +kernel_footprint_WIZARD_CSRC = \ + bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \ + bertos/mware/event.c \ + bertos/kern/sem.c \ + bertos/cpu/cortex-m3/drv/timer_cm3.c \ + bertos/struct/heap.c \ + bertos/mware/formatwr.c \ + bertos/drv/timer.c \ + bertos/kern/kfile.c \ + bertos/kern/proc.c \ + bertos/benchmark/kernel_footprint.c \ + bertos/mware/hex.c \ + bertos/kern/signal.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_PCSRC INSTEAD! +kernel_footprint_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CPPASRC INSTEAD! +kernel_footprint_WIZARD_CPPASRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CXXSRC INSTEAD! +kernel_footprint_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_ASRC INSTEAD! +kernel_footprint_WIZARD_ASRC = \ + \ + # + +kernel_footprint_CPPFLAGS = -D'CPU_FREQ=(72000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_footprint_HW_PATH) -I$(kernel_footprint_SRC_PATH) $(kernel_footprint_CPU_CPPFLAGS) $(kernel_footprint_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_LDFLAGS = $(kernel_footprint_CPU_LDFLAGS) $(kernel_footprint_WIZARD_LDFLAGS) $(kernel_footprint_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPAFLAGS = $(kernel_footprint_CPU_CPPAFLAGS) $(kernel_footprint_WIZARD_CPPAFLAGS) $(kernel_footprint_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CSRC = $(kernel_footprint_CPU_CSRC) $(kernel_footprint_WIZARD_CSRC) $(kernel_footprint_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_PCSRC = $(kernel_footprint_CPU_PCSRC) $(kernel_footprint_WIZARD_PCSRC) $(kernel_footprint_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPASRC = $(kernel_footprint_CPU_CPPASRC) $(kernel_footprint_WIZARD_CPPASRC) $(kernel_footprint_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CXXSRC = $(kernel_footprint_CPU_CXXSRC) $(kernel_footprint_WIZARD_CXXSRC) $(kernel_footprint_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_ASRC = $(kernel_footprint_CPU_ASRC) $(kernel_footprint_WIZARD_ASRC) $(kernel_footprint_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPU_CPPASRC = bertos/cpu/cortex-m3/hw/crt_cm3.S bertos/cpu/cortex-m3/hw/vectors_cm3.S +kernel_footprint_CPU_CPPAFLAGS = -g -gdwarf-2 -mthumb -mno-thumb-interwork +kernel_footprint_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -mthumb -mno-thumb-interwork -fno-strict-aliasing -fwrapv -fverbose-asm -Ibertos/cpu/cortex-m3/ -D__ARM_STM32P103__ +kernel_footprint_CPU_CSRC = bertos/cpu/cortex-m3/hw/init_cm3.c bertos/cpu/cortex-m3/drv/irq_cm3.c bertos/cpu/cortex-m3/drv/gpio_stm32.c bertos/cpu/cortex-m3/drv/clock_stm32.c +kernel_footprint_PROGRAMMER_CPU = stm32 +kernel_footprint_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_footprint_CPU = cortex-m3 +kernel_footprint_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_footprint_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +kernel_footprint_CPU_LDFLAGS = -mthumb -mno-thumb-interwork -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/cortex-m3/scripts/stm32p103_rom.ld +kernel_footprint_FLASH_SCRIPT = bertos/prg_scripts/arm/flash-stm32.sh + +include $(kernel_footprint_SRC_PATH)/kernel_footprint_user.mk diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/kernel_footprint_user.mk b/2.5/boards/stm32-p103/benchmark/kernel_footprint/kernel_footprint_user.mk new file mode 100644 index 00000000..af8c4d6c --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/kernel_footprint_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_footprint_PROGRAMMER_TYPE = none +kernel_footprint_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_footprint_USER_CSRC = \ + $(kernel_footprint_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_footprint_USER_PCSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_ASRC = \ + # + +# Flags included by the user. +kernel_footprint_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/main.c b/2.5/boards/stm32-p103/benchmark/kernel_footprint/main.c new file mode 100644 index 00000000..78920ff5 --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/main.c @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel footprint benchmark. + * + * This benchmark measures the memory footprint[1] of the BeRTOS kernel with a + * simple minimalist user application. + * + * The purpose of this test is to give a measure of the required space in a + * generic flash memory to store a full-featured BeRTOS kernel. + * + * [1] http://en.wikipedia.org/wiki/Memory_footprint + */ + +#include + +int main(void) +{ + kernel_footprint(); + while (1) + { + } + + return 0; +} diff --git a/2.5/boards/stm32-p103/benchmark/kernel_footprint/project.bertos b/2.5/boards/stm32-p103/benchmark/kernel_footprint/project.bertos new file mode 100644 index 00000000..d7ba866a --- /dev/null +++ b/2.5/boards/stm32-p103/benchmark/kernel_footprint/project.bertos @@ -0,0 +1,83 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V72000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel_footprint +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Varm-none-eabi +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V/scratch/julian/2010q1-release-eabi-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2010q1-188' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin +p15 +sVversion +p16 +V4.4.1 +p17 +sVbuild +p18 +VSourcery G++ Lite 2010q1-188 +p19 +sVpath +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'kernel' +p24 +aS'semaphores' +p25 +aS'formatwr' +p26 +aS'kfile' +p27 +aS'msg' +p28 +aS'kernel_footprint' +p29 +aS'heap' +p30 +aS'signal' +p31 +aS'timer' +p32 +asS'CPU_NAME' +p33 +VSTM32F103RB +p34 +sS'PROJECT_HW_PATH' +p35 +S'../..' +p36 +sS'PROJECT_SRC_PATH' +p37 +S'.' +p38 +sS'PRESET' +p39 +I01 +sS'OUTPUT' +p40 +(lp41 +s. diff --git a/2.5/boards/stm32-p103/hw/hw_afsk.c b/2.5/boards/stm32-p103/hw/hw_afsk.c new file mode 100644 index 00000000..8adb432d --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_afsk.c @@ -0,0 +1,41 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * + * \author Francesco Sacchi + */ + + +#include "hw_afsk.h" + diff --git a/2.5/boards/stm32-p103/hw/hw_afsk.h b/2.5/boards/stm32-p103/hw/hw_afsk.h new file mode 100644 index 00000000..eae0ef73 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_afsk.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * \author Francesco Sacchi + */ + +#ifndef HW_AFSK_H +#define HW_AFSK_H + +#include "cfg/cfg_arch.h" + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Initialize the specified channel of the ADC for AFSK needs. + * The adc should be configured to have a continuos stream of convertions. + * For every convertion there must be an ISR that read the sample + * and call afsk_adc_isr(), passing the context and the sample. + * + * \param ch channel to be used for AFSK demodulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_adc_isr() for every convertion. + */ +#define AFSK_ADC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) + +#define AFSK_STROBE_INIT() do { /* Implement me */ } while (0) +#define AFSK_STROBE_ON() do { /* Implement me */ } while (0) +#define AFSK_STROBE_OFF() do { /* Implement me */ } while (0) + +/** + * Initialize the specified channel of the DAC for AFSK needs. + * The DAC has to be configured in order to call an ISR for every sample sent. + * The DAC doesn't have to start the IRQ immediatly but have to wait + * the AFSK driver to call AFSK_DAC_IRQ_START(). + * The ISR must then call afsk_dac_isr() passing the AFSK context. + * \param ch DAC channel to be used for AFSK modulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_dac_isr() for every convertion. + */ +#define AFSK_DAC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) + +/** + * Start DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_START(ch) do { (void)ch; /* Implement me */ } while (0) + +/** + * Stop DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_STOP(ch) do { (void)ch; /* Implement me */ } while (0) + +#endif /* HW_AFSK_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_blanker.h b/2.5/boards/stm32-p103/hw/hw_blanker.h new file mode 100644 index 00000000..442ce3f1 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_blanker.h @@ -0,0 +1,50 @@ +/** + * \file + * + * + * \brief Hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_BALNCKER_H +#define HW_BALNCKER_H + +#warning TODO:This is an example implementation, you must implement it! + +#define BLK_LCDON /* power_LcdOn() Implement me! */ +#define BLK_LCDOFF /* power_LcdOff() Implement me! */ + + +#endif /* HW_BLANCKER_H */ + diff --git a/2.5/boards/stm32-p103/hw/hw_boot.h b/2.5/boards/stm32-p103/hw/hw_boot.h new file mode 100644 index 00000000..34238102 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_boot.h @@ -0,0 +1,50 @@ +/** + * \file + * + * + * \brief Bootloader hardware specific definition. + * + * \author Daniele Basile + */ + +#ifndef HW_BOOT_H +#define HW_BOOT_H + +/** + * Define bootloader flash size. + * + * Note: Remember that this size should be comply + * to size defined in linker script, otherwise you + * could not find the main program application. + */ +#define FLASH_BOOT_SIZE 0x8000 // 32kbyte + +#endif /* HW_BOOT_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_buzzer.h b/2.5/boards/stm32-p103/hw/hw_buzzer.h new file mode 100644 index 00000000..858ecbfb --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_buzzer.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Buzzer hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_BUZZER_H +#define HW_BUZZER_H + +#warning TODO:This is an example implementation, you must implement it! + +#define BUZZER_BIT 1 +#define IS_BUZZER_ON 0 +#define BUZZER_HW_INIT do { /* Implement me! */ } while (0) +#define BUZZER_ON do { /* Implement me! */ } while (0) +#define BUZZER_OFF do { /* Implement me! */ } while (0) + +#endif /* HW_BUZZER_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_buzzerled.h b/2.5/boards/stm32-p103/hw/hw_buzzerled.h new file mode 100644 index 00000000..afa01544 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_buzzerled.h @@ -0,0 +1,47 @@ +/** + * \file + * + * + * \brief Buzzerled hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + + +#ifndef HW_BUZZERLED_H +#define HW_BUZZERLED_H + +#warning TODO:This is an example implementation, you must implement it! + + +#endif /* HW_BUZZERLED_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_cpufreq.h b/2.5/boards/stm32-p103/hw/hw_cpufreq.h new file mode 100644 index 00000000..41e3359d --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_cpufreq.h @@ -0,0 +1,64 @@ +/** + * \file + * + * + * \brief Hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_CPUFREQ_H +#define HW_CPUFREQ_H + +#ifndef CPU_FREQ + #warning CPU_FREQ is not defined, you should upgrade to the newer clock frequency defining method. + + /* + * This file is DEPRECATED, it will be removed in the next major release. + * We have set up a new cpu frequency definition method. + * The new macro CPU_FREQ should be defined as a compiler flag in the + * makefile instead of the old CLOCK_FREQ macro. With new projects you should only + * use the CPU_FREQ macro. + * + * With gcc you should add something like this: + * + * -D'CPU_FREQ=(12288000UL)' + * + * For backward compatibility the old method is still supported. + */ + #include "hw/hw_cpu.h" + + #define CPU_FREQ (CLOCK_FREQ) +#endif /* CPU_FREQ */ + +#endif /* HW_CPUFREQ_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_dataflash.c b/2.5/boards/stm32-p103/hw/hw_dataflash.c new file mode 100644 index 00000000..844dd922 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_dataflash.c @@ -0,0 +1,126 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_dataflash.h" + +#include +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +MOD_DEFINE(hw_dataflash); + +/** + * Data flash init function. + * + * This function provide to initialize all that + * needs to drive a dataflash memory. + * Generaly needs to init pins to drive a CS line + * and reset line. + */ +void dataflash_hw_init(void) +{ + + //Disable CS line (remove if not needed) + dataflash_hw_setCS(false); + + /* + * Put here your code! + * + * Note: + * - if you drive manualy CS line, here init a CS pin + * - if you use a dedicated reset line, here init a reset pin + */ + + MOD_INIT(hw_dataflash); +} + +/** + * Chip Select drive. + * + * This function enable or disable a CS line. + * You must implement this function comply to a dataflash + * memory datasheet to allow the drive to enable a memory + * when \p enable flag is true, and disable it when is false. + */ +void dataflash_hw_setCS(bool enable) +{ + if (enable) + { + /* + * Put here your code to enable + * dataflash memory + */ + } + else + { + /* + * Put here your code to disable + * dataflash memory + */ + } +} + +/** + * Reset data flash memory. + * + * This function provide to send reset signal to + * dataflash memory. You must impement it comly to a dataflash + * memory datasheet to allow the drive to set a reset pin + * when \p enable flag is true, and disable it when is false. + * + */ +void dataflash_hw_setReset(bool enable) +{ + if (enable) + { + /* + * Put here your code to set reset of + * dataflash memory + */ + } + else + { + /* + * Put here your code to clear reset of + * dataflash memory + */ + } +} + diff --git a/2.5/boards/stm32-p103/hw/hw_dataflash.h b/2.5/boards/stm32-p103/hw/hw_dataflash.h new file mode 100644 index 00000000..5254446b --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_dataflash.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines (interface). + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_DATAFLASH_H +#define HW_DATAFLASH_H + +#include + +void dataflash_hw_init(void); +void dataflash_hw_setCS(bool enable); +void dataflash_hw_setReset(bool enable); + +#endif /* HW_DATAFLASH_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_dc_motor.h b/2.5/boards/stm32-p103/hw/hw_dc_motor.h new file mode 100644 index 00000000..f39388df --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_dc_motor.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief DC motor hardware-specific definitions + * + * \author Daniele Basile + */ + +#ifndef HW_DC_MOTOR_H +#define HW_DC_MOTOR_H + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Define fuctions which read adc value from specific device + */ + #define HW_DC_MOTOR_READ_VALUE(dev, min, max) \ + ({ \ + /* Put here the fuction that read from ADC */ \ + (void)(dev); \ + (void)(min); \ + (void)(max); \ + (0); \ + }) + +// Macro that enable the select DC motor +#define DC_MOTOR_ENABLE(dev) /* Implement me! */ +// Macro that disable the select DC motor +#define DC_MOTOR_DISABLE(dev) /* Implement me! */ + +// Macro that left the DC motor rotor float +#define DC_MOTOR_STOP_FLOAT(dev) DC_MOTOR_DISABLE(dev) +// Macro that put in short circuit DC motor supply pins +#define DC_MOTOR_STOP_BRAKED(dev) do { /* Implement me! */ } while (0) + +// Macro that set motor direction +#define DC_MOTOR_SET_DIR(dev, dir) do { /* Implement me! */ } while (0) + +#define MOTOR_DC_INIT() do { /* Implement me! */ } while (0) + + +#endif /* HW_DC_MOTOR_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_ft245rl.h b/2.5/boards/stm32-p103/hw/hw_ft245rl.h new file mode 100644 index 00000000..cc0c8193 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_ft245rl.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief FT245RL USB interface hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_FT245RL_H +#define HW_FT245RL_H + +#warning TODO:This is an example implementation, you must implement it! + +#define FT245RL_DATA_IN() /* Implement me! */ +#define FT245RL_DATA_OUT() /* Implement me! */ +#define WR_HI /* Implement me! */ +#define WR_LO /* Implement me! */ + +#define RD_HI /* Implement me! */ +#define RD_LO /* Implement me! */ + +#define FT245RL_INIT() \ +do \ +{ \ + /* Implement me! */ \ +} while(0) + +#define FT245RL_DATA_RDY() (/* Implement me! */ false) +#define FT245RL_GETDATA() ({/* Implement me! */ (0);}) +#define FT245RL_TX_ALLOWED() (/* Implement me! */ false) +#define FT245RL_SETDATA(data) do {/* Implement me! */ (void)((data)); } while(0) + +#endif /* HW_FT245RL_H */ + diff --git a/2.5/boards/stm32-p103/hw/hw_i2c_bitbang.h b/2.5/boards/stm32-p103/hw/hw_i2c_bitbang.h new file mode 100644 index 00000000..4822af7c --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_i2c_bitbang.h @@ -0,0 +1,66 @@ +/** + * \file + * + * + * \brief Macro for I2C bitbang operation. + * + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_I2C_BITBANG_H +#define HW_I2C_BITBANG_H + +#warning TODO:This is an example implementation, you must implement it! + +#define SDA_HI do { /* Implement me:Set SDA High by setting SDA pin as input */ } while (0) +#define SDA_LO do { /* Implement me:Set SDA Low by setting SDA pin as open collector output */ } while (0) +#define SCL_HI do { /* Implement me:Set SCL High by setting SCL pin as input */ } while (0) +#define SCL_LO do { /* Implement me:Set SCL Low by setting SCL pin as open collector output */ } while (0) + + +#define SCL_IN (true) /* Implement me: read SDA pin state */ +#define SDA_IN (true) /* Implement me: read SCL pin state */ + +/** + * This macro should set SDA and SCL lines as input. + */ +#define I2C_BITBANG_HW_INIT do { /* Implement me! */ } while (0) + +/** + * Half bit delay routine used to generate the correct timings. + */ +#define I2C_HALFBIT_DELAY() do { /* Implement me! */ } while (0) + +#endif /* HW_I2C_BITBANG_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_input.h b/2.5/boards/stm32-p103/hw/hw_input.h new file mode 100644 index 00000000..dbf3bc50 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_input.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Macro for HW_INPUT_H + * + * \author Andrea Grandi + */ + +#ifndef HW_INPUT_H +#define HW_INPUT_H + +#warning FIXME: This is an example implementation, you must implement it + +#define INPUT_INIT() do { /* implement me */} while(0) + +#endif /* HW_INPUT_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_kbd.h b/2.5/boards/stm32-p103/hw/hw_kbd.h new file mode 100644 index 00000000..9ca228cb --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_kbd.h @@ -0,0 +1,72 @@ +/** + * \file + * + * + * \brief Keyboard hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_H +#define HW_KBD_H + +#include "hw/kbd_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define K_RPT_MASK (K_UP | K_DOWN | K_OK | K_CANCEL) + +#define KBD_HW_INIT \ + do { \ + /* Put here code to init hw */ \ + } while (0) + +EXTERN_C int emul_kbdReadCols(void); + +/** + * Read the keyboard ports and return the mask of + * depressed keys. + */ +INLINE keymask_t kbd_readkeys(void) +{ + /* Implement me! */ + + //Only for test remove when implement this function + return 0; +} + +#endif /* HW_KBD_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_lcd_32122a.h b/2.5/boards/stm32-p103/hw/hw_lcd_32122a.h new file mode 100644 index 00000000..6ec29c5c --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_lcd_32122a.h @@ -0,0 +1,155 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_32122A_H +#define HW_LCD_32122A_H + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Predefined LCD PWM contrast values + */ +#define LCD_DEF_PWM 145 +#define LCD_MAX_PWM 505 +#define LCD_MIN_PWM 130 +#define LCD_PWM_CH 0 + + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_PE_E1 /* Implement me! */ +#define LCD_PE_E2 /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +#define LCD_PF_DB0 /* Implment me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_A0 do { /* Implement me! */ } while (0) +#define LCD_SET_A0 do { /* Implement me! */ } while (0) +#define LCD_CLR_RD do { /* Implement me! */ } while (0) +#define LCD_SET_RD do { /* Implement me! */ } while (0) +#define LCD_CLR_E1 do { /* Implement me! */ } while (0) +#define LCD_SET_E1 do { /* Implement me! */ } while (0) +#define LCD_CLR_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E(x) do { (void)x; /* Implement me! */ } while (0) +#define LCD_CLR_E(x) do { (void)x; /* Implement me! */ } while (0) +/*@}*/ + +/** + * \name Chip select bits for LCD_SET_E() + * @{ + */ +#define LCDF_E1 ( 0/* Implement me! */) +#define LCDF_E2 ( 0/* Implement me! */) +/*@}*/ +/** Read from the LCD data bus (DB[0-7]) */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/** Write to the LCD data bus (DB[0-7]) */ +#define LCD_READ (0 /* Implement me! */ ) + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ + +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + +#define LCD_32122_RESET() do { /* Implement me! */ } while (0) + +INLINE void lcd_32122a_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_32122A_H */ + diff --git a/2.5/boards/stm32-p103/hw/hw_lcd_hd44.h b/2.5/boards/stm32-p103/hw/hw_lcd_hd44.h new file mode 100644 index 00000000..dfebbcab --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_lcd_hd44.h @@ -0,0 +1,157 @@ +/** + * \file + * + * + * \brief LCD low-level hardware macros + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_HD44_H +#define HW_LCD_HD44_H + +#include "cfg/cfg_lcd_hd44.h" /* CONFIG_LCD_4BIT */ + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_E /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +/*@}*/ + +/** + * \name DB high nibble (DB[4-7]) + * @{ + */ + +#if CONFIG_LCD_4BIT + #define LCD_MASK (LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4) + #define LCD_SHIFT 4 +#else + #define LCD_MASK (uint8_t)0xff + #define LCD_SHIFT 0 +#endif +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_RS /* Implement me! */ +#define LCD_SET_RS /* Implement me! */ +#define LCD_CLR_RD /* Implement me! */ +#define LCD_SET_RD /* Implement me! */ +#define LCD_CLR_E /* Implement me! */ +#define LCD_SET_E /* Implement me! */ + +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +#if CONFIG_LCD_4BIT + #define LCD_WRITE_H(x) ((void)x)/* Implement me! */ + #define LCD_WRITE_L(x) ((void)x)/* Implement me! */ + #define LCD_READ_H ( 0 /* Implement me! */ ) + #define LCD_READ_L ( 0 /* Implement me! */ ) +#else + #define LCD_WRITE(x) ((void)x)/* Implement me! */ + #define LCD_READ (0 /* Implement me! */ ) +#endif +/*@}*/ + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + + +INLINE void lcd_hd44_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_HD44_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_led.h b/2.5/boards/stm32-p103/hw/hw_led.h new file mode 100644 index 00000000..e230efb0 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_led.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Led on/off macros for STM32-P103 board. + * + * \author Andrea Righi + */ + +#ifndef HW_LED_H +#define HW_LED_H + +#include +#include +#include + +#define LED_PIN (1 << 12) +#define LED_GPIO_BASE ((struct stm32_gpio *)GPIOC_BASE) + +#define LED_ON() \ + do { \ + stm32_gpioPinWrite(LED_GPIO_BASE, LED_PIN, 1); \ + } while (0) + +#define LED_OFF() \ + do { \ + stm32_gpioPinWrite(LED_GPIO_BASE, LED_PIN, 0); \ + } while (0) + +#define LED_INIT() \ + do { \ + /* Enable clocking on GPIOA and GPIOC */ \ + RCC->APB2ENR |= RCC_APB2_GPIOC; \ + /* Configure the LED pin as GPIO */ \ + stm32_gpioPinConfig(LED_GPIO_BASE, \ + LED_PIN, GPIO_MODE_OUT_PP, \ + GPIO_SPEED_50MHZ); \ + } while(0) + +#endif /* HW_LED_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_lm75.h b/2.5/boards/stm32-p103/hw/hw_lm75.h new file mode 100644 index 00000000..290dae09 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_lm75.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_LM75_H +#define HW_LM75_H + +#warning TODO:This is an example implentation, you must implement it! + +#define LM75_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_LM75_H */ + diff --git a/2.5/boards/stm32-p103/hw/hw_mcp41.c b/2.5/boards/stm32-p103/hw/hw_mcp41.c new file mode 100644 index 00000000..dc2a051c --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_mcp41.c @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_mcp41.h" + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +const uint16_t mcp41_ports[MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; +const uint8_t mcp41_pins [MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; + diff --git a/2.5/boards/stm32-p103/hw/hw_mcp41.h b/2.5/boards/stm32-p103/hw/hw_mcp41.h new file mode 100644 index 00000000..645b6dac --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_mcp41.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_MCP41_H +#define HW_MCP41_H + +#include "hw/mcp41_map.h" + +#include + + +#warning TODO:This is an example implementation, you must implement it! + + +INLINE void SET_MCP41_DDR(Mcp41Dev dev) +{ + /* Implement me! */ + //Warning: this funtions is like avr target name, + //fix it to comply for all target. + + //Only for test remove when implement this function + (void)dev; +} + +INLINE void MCP41_ON(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void MCP41_OFF(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +#endif /* HW_MCP41_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_ntc.c b/2.5/boards/stm32-p103/hw/hw_ntc.c new file mode 100644 index 00000000..b8c56914 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_ntc.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id: hw_ntc.h 1359 2008-05-26 09:42:37Z asterix $ + * \author Lorenzo Berni + * + */ + +#include +#include "hw/ntc_map.h" + +const res_t NTC_RSER[NTC_CNT]; +const res_t NTC_RPAR[NTC_CNT]; +const amp_t NTC_AMP[NTC_CNT]; +const NtcHwInfo* NTC_INFO[NTC_CNT]; diff --git a/2.5/boards/stm32-p103/hw/hw_ntc.h b/2.5/boards/stm32-p103/hw/hw_ntc.h new file mode 100644 index 00000000..49152a45 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_ntc.h @@ -0,0 +1,136 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id$ + * \author Francesco Sacchi + * + * A NTC acts as a variable resistor, whose resistance changes as a + * function of the temperature it measures. To sample it correctly, it is + * usually parallelized and serialized with two fixed resistor. The following diagram shows + * what is the exact disposition of the components, as handled by this + * library: + * + *
+ *                 o Vref
+ *                 |
+ *                 |                               o Vref
+ *                 |                               |
+ *               -----                             |
+ *              |     |                        ---------
+ *              | Rser|                       |         |
+ *              |     |                       |         |
+ *               -----     -----              |   ADC   |
+ *                 | Vp   |     |             |         |
+ *      -----------|------| Amp |-------------|         |
+ *     |           |      |     |      Vadc   |         |
+ *   -----       -----     -----               ---------
+ *  |     |     |     |
+ *  | NTC |     | Rpar|
+ *  |     |     |     |
+ *   -----       -----
+ *     |           |
+ *     |           |
+ *   -----       -----
+ *    ---         ---
+ *
+ * Amp is an amplifier that amplify of AMP times the signal. + * If we indicate Rp as the parallel of NTC with Rpar, ADCBITS as the bits of the ad converter + * and ADCVAL as the result from the adc convertion (Not Vadc but just the value read + * from the adc register), after various calculation, the expression of Rp is: + * + *
+ *
+ *            ADCVAL * Rser
+ * Rp = ------------------------
+ *         ADCBITS
+ *	2         * AMP - ADCVAL
+ *
+ * + * And after that NTC obvisiously is: + *
+ *        Rpar * Rp
+ * NTC = ----------
+ *        Rpar - Rp
+ *
+ * + * + * The function ntc_hw_read() compute the resistence using these formulas above. + */ + +#ifndef HW_NTC_H +#define HW_NTC_H + +#include "ntc_map.h" + +#include + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +extern const res_t NTC_RSER[NTC_CNT]; +extern const res_t NTC_RPAR[NTC_CNT]; +extern const amp_t NTC_AMP[NTC_CNT]; +extern const NtcHwInfo* NTC_INFO[NTC_CNT]; + + +/*! + * Read the resistence of ntc device \a dev. + * Return the result in res_t type. + */ +INLINE res_t ntc_hw_read(NtcDev dev) +{ + ASSERT(dev < NTC_CNT); + // See above for formula explanation. + adcread_t adcval = adc_read((uint16_t)dev); + float rp = (adcval * NTC_RSER[dev] ) / ((1 << adc_bits()) * NTC_AMP[dev] - adcval); + + //kprintf("Rp[%f], Rntc[%f]\n", rp/100, ((NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp)) / 100.0); + + return ( (NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp) ); +} + + +/*! + * Return the info (aka the table) associated with ntc device \a dev. + */ +INLINE const NtcHwInfo* ntc_hw_getInfo(NtcDev dev) +{ + return NTC_INFO[dev]; +} + +#define NTC_HW_INIT do { /* Implement me! */ } while(0) + +#endif /* HW_NTC_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_phase.c b/2.5/boards/stm32-p103/hw/hw_phase.c new file mode 100644 index 00000000..54509ef3 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_phase.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/hw_phase.h" + +#warning TODO:This is an example implementation, you must implement it! + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_phase.h b/2.5/boards/stm32-p103/hw/hw_phase.h new file mode 100644 index 00000000..7649e702 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_phase.h @@ -0,0 +1,80 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/phase_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define PHASE_HW_INIT do { /* Implement me! */ }while (0) + +INLINE void TRIAC_OFF(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + + +INLINE void TRIAC_ON(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void SET_TRIAC_DDR(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +void zerocross_isr(void); +#define DEFINE_ZEROCROSS_ISR() void zerocross_isr(void) + + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_rit128x96.h b/2.5/boards/stm32-p103/hw/hw_rit128x96.h new file mode 100644 index 00000000..c24d1a87 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_rit128x96.h @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \brief LM3S1986: OLED-RIT-128x96 (P14201) low-level hardware macros + * + * \author Andrea Righi + */ + +#ifndef HW_RIT128x96_H +#define HW_RIT128x96_H + +#include "cfg/macros.h" /* BV() */ +#include "cfg/debug.h" + +#include +#include +#include + +/** + * \name LCD I/O pins/ports + * @{ + */ +/* OLED Data/Command control pin */ +#define GPIO_OLEDDC_PIN 0 /* Implement me! */ + +/* OLED enable pin */ +#define GPIO_OLEDEN_PIN 0 /* Implement me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +/* Send data to the display */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/*@}*/ + +INLINE void lcd_rit128x96_hw_bus_init(void) +{ + /* Implement me! */ +} + +#endif /* HW_RIT128x96_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_sd.h b/2.5/boards/stm32-p103/hw/hw_sd.h new file mode 100644 index 00000000..d15b5506 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_sd.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief SD driver hardware-specific definitions. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef HW_SD_H +#define HW_SD_H + +#warning FIXME: This is an example implementation, you must implement it + +#define SD_CS_INIT() do { /* implement me */} while(0) +#define SD_CS_ON() do { /* implement me */} while(0) +#define SD_CS_OFF() do { /* implement me */} while(0) + +#define SD_PIN_INIT() do { /* implement me */} while(0) +#define SD_CARD_PRESENT() true /* implement me */ +#define SD_WRITE_PROTECT() false /* implement me */ + +#endif /* HW_SD_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_sensor.h b/2.5/boards/stm32-p103/hw/hw_sensor.h new file mode 100644 index 00000000..113e468f --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_sensor.h @@ -0,0 +1,93 @@ +/** + * \file + * + * + * \brief Sensor hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_SENSOR_H +#define HW_SENSOR_H + +#warning TODO:This is an example implementation, you must implement it! + +#define NUM_HOME_SENSORS 1 + + +INLINE bool hw_home_sensor_read(int sensor) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)sensor; + return 0; +} + +INLINE void hw_home_sensor_set_inverted(int sensor, bool inverted) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)sensor; + (void)inverted; +} + +INLINE bool hw_level_sensor_read(int sensor) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)sensor; + return 0; +} + +INLINE void hw_level_sensor_set_inverted(int sensor, bool inverted) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)sensor; + (void)inverted; +} + +INLINE bool bld_hw_sensor_read(int sensor) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)sensor; + return 0; +} + +#endif /* HW_SENSOR_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_ser.h b/2.5/boards/stm32-p103/hw/hw_ser.h new file mode 100644 index 00000000..2489c433 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_ser.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Serial hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_SER_H +#define HW_SER_H + +#include "cfg/cfg_ser.h" + +#if CONFIG_SER_STROBE + #warning FIXME: this is an example implementation, you must implement it + + #define SER_STROBE_INIT do { /* implement me */ } while (0) + #define SER_STROBE_ON do { /* implement me */ } while (0) + #define SER_STROBE_OFF do { /* implement me */ } while (0) +#endif + +#endif /* HW_SER_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_sipo.h b/2.5/boards/stm32-p103/hw/hw_sipo.h new file mode 100644 index 00000000..3371c2c0 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_sipo.h @@ -0,0 +1,109 @@ +/** + * \file + * + * + * \brief Macro for HW_SIPO_H + * + * + * \version $Id$ + * + * \author Andrea Grandi + * \author Daniele Basile + */ + +#ifndef HW_SIPO_H +#define HW_SIPO_H + +/** + * Map sipo connection on board. + */ +typedef enum SipoMap +{ + SIPO_CNT +} SipoMap; + +/** + * Define generic macro to set pins logic level + */ +#define SIPO_SET_LEVEL_LOW(dev) do { /* Implement me! */ } while (0) +#define SIPO_SET_LEVEL_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Generate one low pulse on select line. + */ +#define PULSE_LOW(dev) do { /* Implement me! */ } while (0) + +/** + * Generate one hight pulse on select line. + */ +#define PULSE_HIGH(dev) do { /* Implement me! */ } while (0) + + +/** + * Define the procedure to drive serial input in sipo device (SI). + */ +#define SIPO_SI_HIGH() do { /* Implement me! */ } while (0) +#define SIPO_SI_LOW() do { /* Implement me! */ } while (0) + +/** + * Drive clock to shift SI data into latch. + */ +#define SIPO_SI_CLOCK(clk_pol) \ + do { \ + (void)clk_pol; \ + /* Implement me! */ \ + } while (0) + +/** + * Do everything needed in order to load dato into sipo. + */ +#define SIPO_LOAD(device, load_pol) do { /* Implement me! */ } while (0) + +/** + * Enable the shift register output. + */ +#define SIPO_ENABLE() do { /* Implement me! */ } while (0) + +/** + * Set polarity for Load, Clk, SI signals. + */ +#define SIPO_SET_LD_LEVEL(device, load_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_CLK_LEVEL(clock_pol) do { /* Implement me! */ } while (0) +#define SIPO_SET_SI_LEVEL() do { /* Implement me! */ } while (0) + +/** + * Do anything that needed to init sipo pins. + */ +#define SIPO_INIT_PIN() do { /* Implement me! */ } while (0) + +#endif /* HW_SIPO_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_spi.h b/2.5/boards/stm32-p103/hw/hw_spi.h new file mode 100644 index 00000000..04e4893a --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_spi.h @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef HW_SPI_H +#define HW_SPI_H + +#warning TODO:This is an example implentation, you must implement it! + +#include + +/** + * SPI pin definition. + * + * \note CS is assert when level + * is low. + * + * \{ + */ +#define CS /* pin */ ///Connect to CS pin of Flash memory. +#define SCK /* pin */ ///Connect to SCK pin of Flash memory. +#define MOSI /* pin */ ///Connect to SI pin of Flash memory. +#define MISO /* pin */ ///Connect to SO pin of Flash memory. +#define SPI_PORT /* pin */ ///Micro pin PORT register. +#define SPI_PIN /* pin */ ///Micro pin PIN register. +#define SPI_DDR /* pin */ ///Micro pin DDR register. +/*\}*/ + +/** + * Pin logic level. + * + * \{ + */ +#define MOSI_LOW() do { /* Implement me! */ } while(0) +#define MOSI_HIGH() do { /* Implement me! */ } while(0) +#define MISO_HIGH() do { /* Implement me! */ } while(0) +#define SCK_LOW() do { /* Implement me! */ } while(0) +#define SCK_HIGH() do { /* Implement me! */ } while(0) +#define CS_LOW() do { /* Implement me! */ } while(0) +#define CS_HIGH() do { /* Implement me! */ } while(0) +/*\}*/ + +/** + * SPI pin commands. + * + * \{ + */ +#define CS_ENABLE() CS_LOW() +#define CS_DISABLE() CS_HIGH() +#define SS_ACTIVE() CS_LOW() +#define SS_INACTIVE() CS_HIGH() +#define SCK_INACTIVE() SCK_LOW() +#define SCK_ACTIVE() SCK_HIGH() +#define CS_OUT() do { /* Implement me! */ } while(0) +#define MOSI_IN() do { /* Implement me! */ } while(0) +#define MOSI_OUT() do { /* Implement me! */ } while(0) +#define IS_MISO_HIGH() (false /* Implement me! */ ) +#define MISO_IN() do { /* Implement me! */ } while(0) +#define MISO_OUT() do { /* Implement me! */ } while(0) +#define SCK_OUT() do { /* Implement me! */ } while(0) + +#define SCK_PULSE()\ + do {\ + SCK_HIGH();\ + SCK_LOW();\ + } while (0) +/*\}*/ + + +#define SPI_HW_INIT() \ + CS_DISABLE();\ + MOSI_LOW();\ + SCK_LOW();\ + MISO_IN();\ + MOSI_OUT();\ + SCK_OUT();\ + CS_OUT(); + +#endif /* HW_SPI_H */ + diff --git a/2.5/boards/stm32-p103/hw/hw_spi_dma.h b/2.5/boards/stm32-p103/hw/hw_spi_dma.h new file mode 100644 index 00000000..e0714d43 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_spi_dma.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief SPI DMA driver hardware-specific definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_SPI_DMA_H +#define HW_SPI_DMA_H + +#define SPI_DMA_STROBE_INIT() do {/*PIOA_PER = BV(13); PIOA_OER = BV(13);*/} while(0) + +#define SPI_DMA_STROBE_ON() do {/*PIOA_CODR = BV(13);*/} while(0) +#define SPI_DMA_STROBE_OFF() do {/*PIOA_SODR = BV(13);*/} while(0) + +#endif /* HW_SPI_DMA_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_stepper.h b/2.5/boards/stm32-p103/hw/hw_stepper.h new file mode 100644 index 00000000..13141124 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_stepper.h @@ -0,0 +1,309 @@ +/** + * \file + * + * + * \brief Stepper hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + + +#ifndef HW_STEPPER_H +#define HW_STEPPER_H + +#include + +#include + +#include + +#warning TODO:This is an example implentation, you must implement it! + +#define STEPPER_STROBE_INIT \ +do { \ + /* put init code for strobe */ \ +} while (0) + + +#define STEPPER_STROBE_ON do { /* Implement me! */ } while(0) +#define STEPPER_STROBE_OFF do { /* Implement me! */ } while(0) + +/** + * CPU clock frequency is divided by 2^STEPPER_PRESCALER_LOG2 to + * obtain stepper clock. + */ +#define STEPPER_PRESCALER_LOG2 1 + +/** + * Stepper timer clock frequency. + */ +#define STEPPER_CLOCK ((CPU_FREQ) >> STEPPER_PRESCALER_LOG2) + +/** + * us delay to reset a stepper motor. + * This is the time neccessary to reset + * the stepper controll chip. (see datasheet for more detail). + */ +#define STEPPER_RESET_DELAY 1 + +/* + * Pins define for each stepper + */ +#define STEPPER_1_CW_CCW_PIN 0 +#define STEPPER_1_HALF_FULL_PIN 0 +#define STEPPER_1_CONTROL_PIN 0 +#define STEPPER_1_ENABLE_PIN 0 +#define STEPPER_1_RESET_PIN 0 + +/* put here other stepper motor */ + +#define STEPPER_1_SET do { /* Implement me! */ } while(0) +/* add here the set for other stepper motor */ + +#define STEPPER_1_CLEAR do { /* Implement me! */ } while(0) +/* add here the clear for other stepper motor */ + +/* + * Generic macro definition + */ + +/* + * Stepper init macro + */ +#define STEPPER_PIN_INIT_MACRO(port, index) do { \ + /* Add here init pin code */ \ + } while (0) + +/* + * Stepper commands macros + */ +#define STEPPER_SET_CW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CCW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_HALF(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_FULL(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_LOW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_HIGHT(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_DISABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_DISABLE(index) do { /* Implement me! */ } while (0) + + +/* + * Reset stepper macro + */ + +#define STEPPER_RESET_MACRO(index) do { \ + STEPPER_SET_RESET_ENABLE(index); \ + timer_udelay(STEPPER_RESET_DELAY); \ + STEPPER_SET_RESET_DISABLE(index); \ + } while (0) + +/* + * Set half or full step macro + */ +#define STEPPER_SET_STEP_MODE_MACRO(index, flag) do { \ + if (flag) \ + STEPPER_SET_HALF(index); \ + else \ + STEPPER_SET_FULL(index); \ + } while (0) + +/* + * Set control status macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_CONTROL_BIT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macros not implemented */ \ + /* else */ \ + /* WARNING This macros not implemented */ \ + } while (0) + +/* + * Set current power macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_POWER_CURRENT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macrois not implemented */ \ + /* else */ \ + /* WARNING This macrois not implemented */ \ + } while (0) + +/* + * Set rotation of stepper motor + * - dir = 1: positive rotation + * - dir = 0: no motor moviment + * - dir = -1: negative rotation + * + */ +#define STEPPER_SET_DIRECTION_MACRO(index, dir) do { \ + switch (dir) \ + { \ + case 1: \ + STEPPER_SET_CW(index); \ + break; \ + case -1: \ + STEPPER_SET_CCW(index); \ + break; \ + case 0: \ + break; \ + } \ + } while (0) + + +/* + * Define macros for manage low level of stepper. + */ + +#define STEPPER_INIT() do { \ + STEPPER_PIN_INIT_MACRO(A, 1); \ + /* Add here code for other stepper motor */ \ + } while (0) + + +/* + * Enable select stepper motor + */ +#define STEPPER_ENABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_ENABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Enable all stepper connect to micro + */ +#define STEPPER_ENABLE_ALL() do { \ + STEPPER_SET_ENABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Disable select stepper motor + */ +#define STEPPER_DISABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DISABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Disable all stepper connect to micro + */ +#define STEPPER_DISABLE_ALL() do { \ + STEPPER_SET_DISABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Reset selected stepper motor + */ +#define STEPPER_RESET(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_RESET_MACRO(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Reset all stepper motor + */ +#define STEPPER_RESET_ALL() do { \ + STEPPER_RESET_MACRO(1) \ + /* Add here code for other stepper motor */ \ + } while (0) + +// Set half/full step macros +#define STEPPER_SET_HALF_STEP(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_STEP_MODE_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Control status +#define STEPPER_SET_CONTROL_BIT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_CONTROL_BIT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Set stepper power current +#define STEPPER_SET_POWER_CURRENT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_POWER_CURRENT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +// Set rotation dirction of stepper motor +#define STEPPER_SET_DIRECTION(index, dir) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DIRECTION_MACRO(1, dir); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +#endif /* HW_STEPPER_H */ + + diff --git a/2.5/boards/stm32-p103/hw/hw_tas5706a.h b/2.5/boards/stm32-p103/hw/hw_tas5706a.h new file mode 100644 index 00000000..d1e1a2e6 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_tas5706a.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief HW pin handling. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_TAS5706A_H +#define HW_TAS5706A_H + +#include + +#warning FIXME: This is an example implementation, you must implement it + +#define TAS5706A_SETPOWERDOWN(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETRESET(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETMUTE(val) do { (void) val; /* implement me */ } while (0) + +#define TAS5706A_PIN_INIT() \ + do { \ + TAS5706A_SETPOWERDOWN(true); \ + TAS5706A_SETRESET(true); \ + TAS5706A_SETMUTE(true); \ + /* complete me */ \ + } while (0) + +#define TAS5706A_MCLK_INIT() \ + do { \ + /* implement me */ \ + } while(0) + + +#endif /* HW_TAS5706A_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_tc520.h b/2.5/boards/stm32-p103/hw/hw_tc520.h new file mode 100644 index 00000000..3ff492d5 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_tc520.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * + * \brief TC520 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_TC520_H +#define HW_TC520_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + +#define CE_PIN 0 +#define DV_PIN 0 +#define LOAD_PIN 0 +#define READ_PIN 0 + + +#define DV_HIGH() /* Implement me! */ +#define DV_LOW() /* Implement me! */ + +#define CE_HIGH() /* Implement me! */ +#define CE_LOW() /* Implement me! */ + +#define LOAD_HIGH() /* Implement me! */ +#define LOAD_LOW() /* Implement me! */ + +#define READ_HIGH() /* Implement me! */ +#define READ_LOW() /* Implement me! */ + +#define TC520_HW_INIT \ +do\ +{\ + /* Put here your code to init hardware */ \ +} while(0) + +#endif /* HW_TC520_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_thermo.h b/2.5/boards/stm32-p103/hw/hw_thermo.h new file mode 100644 index 00000000..6f478068 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_thermo.h @@ -0,0 +1,121 @@ +/** + * \file + * + * + * \brief thermo hardware-specific control functions. + * + * \author Francesco Sacchi + * + */ + +#ifndef HW_THERMO_H +#define HW_THERMO_H + +#include "hw/thermo_map.h" + +#include + +#include + + +INLINE ticks_t thermo_hw_timeout(ThermoDev dev) +{ + (void)dev; + return 0; +} + +/** + * This function should return the temperature set tolerance. + */ +INLINE deg_t thermo_hw_tolerance(ThermoDev dev) +{ + (void)dev; + return 0; +} + +/** + * Read the temperature of the hw device \a dev. + */ +INLINE deg_t thermo_hw_read(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + /* Put here the code to read current temperature */ + return 0; +} + + +/** + * Turns off a specific device. + * This function is usefull to handle errors. + */ +INLINE void thermo_hw_off(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + /* Put here the code to turn off the thermo device */ +} + +/** + * Based on the current temperature \a cur_temp and the target temperature \a target, + * this function turns on and off specific thermo device. + * It may use also PID control for thermo-regolations. + */ +INLINE void thermo_hw_set(ThermoDev dev, deg_t target, deg_t cur_temp) +{ + ASSERT(dev < THERMO_CNT); + + if (target - cur_temp > 0) + { + /* + * We are leveaving the target temperature, so + * turn on the thermo device! + */ + } + else + { + /* + * Ok, we are near the target temperature, so + * turn off the thermo device! + */ + } + +} + +#define THERMO_HW_INIT _thermo_hw_init() + +/** + * Init hw associated with thermo-control. + */ +INLINE void _thermo_hw_init(void) +{ + /* Init your devices here! */ +} + +#endif /* HW_THERMO_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_timer.h b/2.5/boards/stm32-p103/hw/hw_timer.h new file mode 100644 index 00000000..ce1b985c --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_timer.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Timer hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_TIMER_H +#define HW_TIMER_H + +#include "cfg/cfg_timer.h" + +#if CONFIG_TIMER_STROBE + #warning TODO:This is an example implementation, you must implement it! + #define TIMER_STROBE_INIT do { /* implement me */ } while (0) + #define TIMER_STROBE_ON do { /* implement me */ } while (0) + #define TIMER_STROBE_OFF do { /* implement me */ } while (0) +#endif + +#endif /* HW_TIMER_H */ diff --git a/2.5/boards/stm32-p103/hw/hw_tlv5618.h b/2.5/boards/stm32-p103/hw/hw_tlv5618.h new file mode 100644 index 00000000..4a2b4202 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_tlv5618.h @@ -0,0 +1,69 @@ +/** + * \file + * + * + * \brief TLV5816 DAC hardware-specific definitions + * + * + * \author Francesco Sacchi + */ + +#ifndef HW_TLV5816_H +#define HW_TLV5816_H + +#warning TODO:This is an example implementation, you must implement it! + +#define TLV5618_CSINIT(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ + TLV5618_CSHIGH(pin); \ +} while(0) + +#define TLV5618_CSLOW(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#define TLV5618_CSHIGH(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#endif /* HW_TLV5816_H */ + diff --git a/2.5/boards/stm32-p103/hw/hw_tmp123.h b/2.5/boards/stm32-p103/hw/hw_tmp123.h new file mode 100644 index 00000000..adb18588 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/hw_tmp123.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_TMP123_H +#define HW_TMP123_H + +#warning TODO:This is an example implentation, you must implement it! + +#define TMP123_HW_CS_EN() /* Implement me! */ +#define TMP123_HW_CS_DIS() /* Implement me! */ + +#define TMP123_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_TMP123_H */ + diff --git a/2.5/boards/stm32-p103/hw/kbd_map.h b/2.5/boards/stm32-p103/hw/kbd_map.h new file mode 100644 index 00000000..ffe14311 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/kbd_map.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Keyboard map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_MAP_H +#define HW_KBD_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + + +/** + * Type for keyboard mask. + */ +typedef uint16_t keymask_t; + +/** + * \name Keycodes. + */ +/*@{*/ +#define K_UP BV(0) +#define K_DOWN BV(1) +#define K_OK BV(2) +#define K_CANCEL BV(3) + +#define K_REPEAT BV(13) /**< This is a repeated keyevent. */ +#define K_TIMEOUT BV(14) /**< Fake key event for timeouts. */ +#define K_LONG BV(15) +/*@}*/ + +#define K_LNG_MASK 0 + +#endif /* HW_KBD_MAP_H */ diff --git a/2.5/boards/stm32-p103/hw/mcp41_map.h b/2.5/boards/stm32-p103/hw/mcp41_map.h new file mode 100644 index 00000000..6646391c --- /dev/null +++ b/2.5/boards/stm32-p103/hw/mcp41_map.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief MCP41 digital potentiometer map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef MCP41_MAP_H +#define MCP41_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/** \name Enum for mcp41 pot evices. + * \{ + * + */ +typedef enum Mcp41Dev +{ + MCP41_LED, + + /* put here other mcp41 device */ + + MCP41_CNT, +} Mcp41Dev; +/* \} */ + +#endif /* MCP41_MAP_H */ diff --git a/2.5/boards/stm32-p103/hw/ntc_map.h b/2.5/boards/stm32-p103/hw/ntc_map.h new file mode 100644 index 00000000..505f1c31 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/ntc_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief NTC map definitions. + * + * \version $Id$ + * + * \author Giovanni Bajo + * \author Francesco Sacchi + */ + +#ifndef NTC_MAP_H +#define NTC_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for ntc devices. + * \{ + */ +typedef enum NtcDev +{ + NTC_TEST, + + /* Put here your thermo device */ + + NTC_CNT +} NtcDev; +/* \} */ + +#endif /* NTC_MAP_H */ diff --git a/2.5/boards/stm32-p103/hw/phase_map.h b/2.5/boards/stm32-p103/hw/phase_map.h new file mode 100644 index 00000000..7436e5e8 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/phase_map.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief Triac map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef PHASE_MAP_H +#define PHASE_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for triac devices. + * \{ + */ +typedef enum TriacDev +{ + TRIAC_TEST, + + /* Put here other triac device */ + + TRIAC_CNT +} TriacDev; +/* \} */ + +#endif /* PHASE_MAP_H */ diff --git a/2.5/boards/stm32-p103/hw/pwm_map.h b/2.5/boards/stm32-p103/hw/pwm_map.h new file mode 100644 index 00000000..723da2f1 --- /dev/null +++ b/2.5/boards/stm32-p103/hw/pwm_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * + * \brief PWM map device. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_PWM_MAP_H +#define HW_PWM_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +typedef enum +{ + PWM_CH0 = 0, + PWM_CH1, + PWM_CH2, + PWM_CH3, + +/* + * add other PWM channel or + * change above. + */ + + PWM_CNT +} PwmDev; + +#endif /* HW_PWM_MAP_H */ diff --git a/2.5/boards/stm32-p103/hw/thermo_map.h b/2.5/boards/stm32-p103/hw/thermo_map.h new file mode 100644 index 00000000..7dbe27bc --- /dev/null +++ b/2.5/boards/stm32-p103/hw/thermo_map.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Thermo regulation control map definitions. + * + * \author Francesco Sacchi + */ + +#ifndef THERMO_MAP_H +#define THERMO_MAP_H + +#include +#include + + +#warning TODO:This is an example implentation, you must implement it! + +typedef enum ThermoDev +{ + THERMO_TEST, + + /* Put here your thermo device */ + + THERMO_CNT +} ThermoDev; + +#endif /* THERMO_MAP_H */ diff --git a/2.5/boards/stm32-p103/templates/.spec b/2.5/boards/stm32-p103/templates/.spec new file mode 100644 index 00000000..07fb8eed --- /dev/null +++ b/2.5/boards/stm32-p103/templates/.spec @@ -0,0 +1,3 @@ +name = "Templates" +ord = 0 +description = "Use these as a starting point for your BeRTOS project." diff --git a/2.5/boards/stm32-p103/templates/empty/.spec b/2.5/boards/stm32-p103/templates/empty/.spec new file mode 100644 index 00000000..f3edfbc2 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/.spec @@ -0,0 +1,8 @@ +name = 'empty preset' +advanced = True +description=""" +

+This is a minimalist project, it just initializes the hardware of the +supported board and proposes an empty main. +<\p> +""" diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_adc.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_afsk.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_ax25.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_battfs.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_context_switch.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_context_switch.h new file mode 100644 index 00000000..2607d50c --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 0 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_dataflash.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_dc_motor.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_debug.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_debug.h new file mode 100644 index 00000000..b0136259 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 1 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_fat.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_flash25.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_formatwr.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_gfx.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_hashtable.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_heap.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_i2c.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_i2s.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_ini_reader.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_kbd.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_keytag.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_kfile.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_lcd_32122a.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_lcd_hd44.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_lm75.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_md2.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_monitor.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_nmea.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_parser.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_phase.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_pocketbus.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_proc.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_proc.h new file mode 100644 index 00000000..b2c3a965 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 0 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_pwm.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_ramp.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_randpool.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_sem.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_ser.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_signal.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_signal.h new file mode 100644 index 00000000..e78a4519 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 0 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_spi_bitbang.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_stepper.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_tas5706a.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_thermo.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_timer.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_wdt.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/stm32-p103/templates/empty/cfg/cfg_xmodem.h b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/stm32-p103/templates/empty/empty.mk b/2.5/boards/stm32-p103/templates/empty/empty.mk new file mode 100644 index 00000000..b2e86f64 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/empty.mk @@ -0,0 +1,92 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the empty_user.mk file instead. +# + +# Constants automatically defined by the selected modules +empty_DEBUG = 1 + +# Our target application +TRG += empty + +empty_PREFIX = "arm-none-eabi-" + +empty_SUFFIX = "" + +empty_SRC_PATH = boards/stm32-p103/templates/empty + +empty_HW_PATH = boards/stm32-p103 + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CSRC INSTEAD! +empty_WIZARD_CSRC = \ + bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \ + bertos/mware/event.c \ + bertos/kern/sem.c \ + bertos/cpu/cortex-m3/drv/timer_cm3.c \ + bertos/struct/heap.c \ + bertos/mware/formatwr.c \ + bertos/drv/timer.c \ + bertos/kern/kfile.c \ + bertos/kern/proc.c \ + bertos/mware/hex.c \ + bertos/kern/signal.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_PCSRC INSTEAD! +empty_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CPPASRC INSTEAD! +empty_WIZARD_CPPASRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CXXSRC INSTEAD! +empty_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_ASRC INSTEAD! +empty_WIZARD_ASRC = \ + \ + # + +empty_CPPFLAGS = -D'CPU_FREQ=(72000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(empty_HW_PATH) -I$(empty_SRC_PATH) $(empty_CPU_CPPFLAGS) $(empty_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_LDFLAGS = $(empty_CPU_LDFLAGS) $(empty_WIZARD_LDFLAGS) $(empty_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPAFLAGS = $(empty_CPU_CPPAFLAGS) $(empty_WIZARD_CPPAFLAGS) $(empty_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CSRC = $(empty_CPU_CSRC) $(empty_WIZARD_CSRC) $(empty_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_PCSRC = $(empty_CPU_PCSRC) $(empty_WIZARD_PCSRC) $(empty_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPASRC = $(empty_CPU_CPPASRC) $(empty_WIZARD_CPPASRC) $(empty_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CXXSRC = $(empty_CPU_CXXSRC) $(empty_WIZARD_CXXSRC) $(empty_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_ASRC = $(empty_CPU_ASRC) $(empty_WIZARD_ASRC) $(empty_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPU_CPPASRC = bertos/cpu/cortex-m3/hw/crt_cm3.S bertos/cpu/cortex-m3/hw/vectors_cm3.S +empty_CPU_CPPAFLAGS = -g -gdwarf-2 -mthumb -mno-thumb-interwork +empty_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -mthumb -mno-thumb-interwork -fno-strict-aliasing -fwrapv -fverbose-asm -Ibertos/cpu/cortex-m3/ -D__ARM_STM32P103__ +empty_CPU_CSRC = bertos/cpu/cortex-m3/hw/init_cm3.c bertos/cpu/cortex-m3/drv/irq_cm3.c bertos/cpu/cortex-m3/drv/gpio_stm32.c bertos/cpu/cortex-m3/drv/clock_stm32.c +empty_PROGRAMMER_CPU = stm32 +empty_CPU_LDFLAGS = -mthumb -mno-thumb-interwork -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/cortex-m3/scripts/stm32p103_rom.ld +empty_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +empty_CPU = cortex-m3 +empty_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +empty_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +empty_FLASH_SCRIPT = bertos/prg_scripts/arm/flash-stm32.sh + +include $(empty_SRC_PATH)/empty_user.mk diff --git a/2.5/boards/stm32-p103/templates/empty/empty_user.mk b/2.5/boards/stm32-p103/templates/empty/empty_user.mk new file mode 100644 index 00000000..4c8ed7ef --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/empty_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +empty_PROGRAMMER_TYPE = none +empty_PROGRAMMER_PORT = none + +# Files included by the user. +empty_USER_CSRC = \ + $(empty_SRC_PATH)/main.c \ + # + +# Files included by the user. +empty_USER_PCSRC = \ + # + +# Files included by the user. +empty_USER_CPPASRC = \ + # + +# Files included by the user. +empty_USER_CXXSRC = \ + # + +# Files included by the user. +empty_USER_ASRC = \ + # + +# Flags included by the user. +empty_USER_LDFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/stm32-p103/templates/empty/main.c b/2.5/boards/stm32-p103/templates/empty/main.c new file mode 100644 index 00000000..251b987a --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/main.c @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Empty project. + * + * This is a minimalist project, it just initializes the hardware of the + * supported board and proposes an empty main. + */ + +#include "hw/hw_led.h" + +#include + +#include + +#include + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* Initialize LED driver */ + LED_INIT(); +} + +int main(void) +{ + init(); + + /* Put your code here... */ + while (1) + { + } +} diff --git a/2.5/boards/stm32-p103/templates/empty/project.bertos b/2.5/boards/stm32-p103/templates/empty/project.bertos new file mode 100644 index 00000000..d0083c6f --- /dev/null +++ b/2.5/boards/stm32-p103/templates/empty/project.bertos @@ -0,0 +1,75 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V72000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vempty +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Varm-none-eabi +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V/scratch/julian/2010q1-release-eabi-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2010q1-188' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin +p15 +sS'version' +p16 +V4.4.1 +p17 +sS'build' +p18 +VSourcery G++ Lite 2010q1-188 +p19 +sS'path' +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'formatwr' +p24 +aS'kfile' +p25 +aS'heap' +p26 +aS'timer' +p27 +aS'debug' +p28 +asS'CPU_NAME' +p29 +VSTM32F103RB +p30 +sS'PROJECT_HW_PATH' +p31 +S'../..' +p32 +sS'PROJECT_SRC_PATH' +p33 +S'.' +p34 +sS'PRESET' +p35 +I01 +sS'OUTPUT' +p36 +(lp37 +s. diff --git a/2.5/boards/stm32-p103/templates/kernel/.spec b/2.5/boards/stm32-p103/templates/kernel/.spec new file mode 100644 index 00000000..04a79cff --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/.spec @@ -0,0 +1,9 @@ +name = 'kernel preset' +advanced = True +description=""" +

+This is a minimalist kernel project: it just initializes the hardware and +creates an independent process to blink an LED, while the main loop +continues to monitor the stack utilization of all the processes. +

+""" diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_adc.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_afsk.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ax25.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_battfs.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_context_switch.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_context_switch.h new file mode 100644 index 00000000..2607d50c --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 0 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_dataflash.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_dc_motor.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_debug.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_debug.h new file mode 100644 index 00000000..b0136259 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 1 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_fat.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_flash25.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_formatwr.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_gfx.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_hashtable.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_heap.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_i2c.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_i2s.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ini_reader.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_kbd.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_keytag.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_kfile.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_lcd_32122a.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_lcd_hd44.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_lm75.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_md2.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_monitor.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_monitor.h new file mode 100644 index 00000000..6391b407 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 1 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_nmea.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_parser.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_phase.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_pocketbus.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_proc.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_proc.h new file mode 100644 index 00000000..7e64c498 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_pwm.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ramp.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_randpool.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_sem.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ser.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_signal.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_spi_bitbang.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_stepper.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_tas5706a.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_thermo.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_timer.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_wdt.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_xmodem.h b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/stm32-p103/templates/kernel/kernel.mk b/2.5/boards/stm32-p103/templates/kernel/kernel.mk new file mode 100644 index 00000000..2341d361 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/kernel.mk @@ -0,0 +1,93 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_user.mk file instead. +# + +# Constants automatically defined by the selected modules +kernel_DEBUG = 1 + +# Our target application +TRG += kernel + +kernel_PREFIX = "arm-none-eabi-" + +kernel_SUFFIX = "" + +kernel_SRC_PATH = boards/stm32-p103/templates/kernel + +kernel_HW_PATH = boards/stm32-p103 + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CSRC INSTEAD! +kernel_WIZARD_CSRC = \ + bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \ + bertos/mware/event.c \ + bertos/kern/sem.c \ + bertos/cpu/cortex-m3/drv/timer_cm3.c \ + bertos/struct/heap.c \ + bertos/kern/monitor.c \ + bertos/drv/timer.c \ + bertos/kern/kfile.c \ + bertos/kern/proc.c \ + bertos/mware/formatwr.c \ + bertos/mware/hex.c \ + bertos/kern/signal.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_PCSRC INSTEAD! +kernel_WIZARD_PCSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CPPASRC INSTEAD! +kernel_WIZARD_CPPASRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CXXSRC INSTEAD! +kernel_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_ASRC INSTEAD! +kernel_WIZARD_ASRC = \ + \ + # + +kernel_CPPFLAGS = -D'CPU_FREQ=(72000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_HW_PATH) -I$(kernel_SRC_PATH) $(kernel_CPU_CPPFLAGS) $(kernel_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_LDFLAGS = $(kernel_CPU_LDFLAGS) $(kernel_WIZARD_LDFLAGS) $(kernel_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPAFLAGS = $(kernel_CPU_CPPAFLAGS) $(kernel_WIZARD_CPPAFLAGS) $(kernel_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CSRC = $(kernel_CPU_CSRC) $(kernel_WIZARD_CSRC) $(kernel_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_PCSRC = $(kernel_CPU_PCSRC) $(kernel_WIZARD_PCSRC) $(kernel_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPASRC = $(kernel_CPU_CPPASRC) $(kernel_WIZARD_CPPASRC) $(kernel_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CXXSRC = $(kernel_CPU_CXXSRC) $(kernel_WIZARD_CXXSRC) $(kernel_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_ASRC = $(kernel_CPU_ASRC) $(kernel_WIZARD_ASRC) $(kernel_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPU_CPPASRC = bertos/cpu/cortex-m3/hw/crt_cm3.S bertos/cpu/cortex-m3/hw/vectors_cm3.S +kernel_CPU_CPPAFLAGS = -g -gdwarf-2 -mthumb -mno-thumb-interwork +kernel_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -mthumb -mno-thumb-interwork -fno-strict-aliasing -fwrapv -fverbose-asm -Ibertos/cpu/cortex-m3/ -D__ARM_STM32P103__ +kernel_CPU_CSRC = bertos/cpu/cortex-m3/hw/init_cm3.c bertos/cpu/cortex-m3/drv/irq_cm3.c bertos/cpu/cortex-m3/drv/gpio_stm32.c bertos/cpu/cortex-m3/drv/clock_stm32.c +kernel_PROGRAMMER_CPU = stm32 +kernel_CPU_LDFLAGS = -mthumb -mno-thumb-interwork -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/cortex-m3/scripts/stm32p103_rom.ld +kernel_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_CPU = cortex-m3 +kernel_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +kernel_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +kernel_FLASH_SCRIPT = bertos/prg_scripts/arm/flash-stm32.sh + +include $(kernel_SRC_PATH)/kernel_user.mk diff --git a/2.5/boards/stm32-p103/templates/kernel/kernel_user.mk b/2.5/boards/stm32-p103/templates/kernel/kernel_user.mk new file mode 100644 index 00000000..6dfb4d8c --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/kernel_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_PROGRAMMER_TYPE = none +kernel_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_USER_CSRC = \ + $(kernel_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_USER_PCSRC = \ + # + +# Files included by the user. +kernel_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_USER_ASRC = \ + # + +# Flags included by the user. +kernel_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/stm32-p103/templates/kernel/main.c b/2.5/boards/stm32-p103/templates/kernel/main.c new file mode 100644 index 00000000..2ccb10b1 --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/main.c @@ -0,0 +1,104 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Kernel project. + * + * This is a minimalist kernel project: it just initializes the hardware and + * creates an independent process to blink an LED, while the main loop + * continues to monitor the stack utilization of all the processes. + */ + +#include "hw/hw_led.h" + +#include + +#include + +#include + +#include +#include + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* Initialize LED driver */ + LED_INIT(); + + /* + * Kernel initialization: processes (allow to create and dispatch + * processes using proc_new()). + */ + proc_init(); +} + +static void NORETURN led_process(void) +{ + int i; + + /* Periodically blink the led (toggle each 100 ms) */ + for (i = 0; ; i = !i) + { + if (i) + LED_ON(); + else + LED_OFF(); + timer_delay(100); + } +} + +int main(void) +{ + /* Hardware initialization */ + init(); + + /* Create a new child process */ + proc_new(led_process, NULL, KERN_MINSTACKSIZE * 2, NULL); + + /* + * The main process is kept to periodically report the stack + * utilization of all the processes (1 probe per second). + */ + while (1) + { + monitor_report(); + timer_delay(1000); + } +} diff --git a/2.5/boards/stm32-p103/templates/kernel/project.bertos b/2.5/boards/stm32-p103/templates/kernel/project.bertos new file mode 100644 index 00000000..0d02a03e --- /dev/null +++ b/2.5/boards/stm32-p103/templates/kernel/project.bertos @@ -0,0 +1,83 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V72000000 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Varm-none-eabi +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V/scratch/julian/2010q1-release-eabi-lite/src/gcc-4.4-2010q1/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --disable-lto --with-newlib --with-pkgversion='Sourcery G++ Lite 2010q1-188' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi --with-gmp=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/julian/2010q1-release-eabi-lite/obj/host-libs-2010q1-188-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin --with-build-time-tools=/scratch/julian/2010q1-release-eabi-lite/install/arm-none-eabi/bin +p15 +sS'version' +p16 +V4.4.1 +p17 +sS'build' +p18 +VSourcery G++ Lite 2010q1-188 +p19 +sS'path' +p20 +V/opt/sourcery/bin/arm-none-eabi-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'kernel' +p24 +aS'semaphores' +p25 +aS'monitor' +p26 +aS'formatwr' +p27 +aS'debug' +p28 +aS'kfile' +p29 +aS'heap' +p30 +aS'signal' +p31 +aS'timer' +p32 +asS'CPU_NAME' +p33 +VSTM32F103RB +p34 +sS'PROJECT_HW_PATH' +p35 +S'../..' +p36 +sS'PROJECT_SRC_PATH' +p37 +S'.' +p38 +sS'PRESET' +p39 +I01 +sS'OUTPUT' +p40 +(lp41 +s. diff --git a/2.5/boards/triface/.image.png b/2.5/boards/triface/.image.png new file mode 100644 index 0000000000000000000000000000000000000000..27e58d43ec534f83dd1db4d86f5956a7b184e23a GIT binary patch literal 49658 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 Triface + +

+ + + + + + + + + + + + + + + + + + + +
CPUAVR ATmega128/ATmega1281
Clock14.7456MHz
Memory128kB Flash, 4/8kB SRAM
Peripheralstimers, ADC, UART, SPI, I²C, PWM, 8 relays output, 8 digital inputs, buzzer, interface for 125kHz RFID reader
+

+

+Triface is a board designed by Develer and is based on AVR ATmega128/ATmega1281 CPU. Visit the Triface page on BeRTOS site for more information. +

+ +''' diff --git a/2.5/boards/triface/benchmark/.spec b/2.5/boards/triface/benchmark/.spec new file mode 100644 index 00000000..18c0580d --- /dev/null +++ b/2.5/boards/triface/benchmark/.spec @@ -0,0 +1,3 @@ +name="Benchmarks" +ord=2 +description="Projects to measure different aspects of BeRTOS performance." diff --git a/2.5/boards/triface/benchmark/context_switch/.spec b/2.5/boards/triface/benchmark/context_switch/.spec new file mode 100644 index 00000000..3268cbf4 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/.spec @@ -0,0 +1,15 @@ +name = 'BeRTOS Context Switch' +description=""" +

+This benchmark measures the overhead (in us) required to deliver a +signal and switch from a low-priority process to a high-priority process. +

+

+The measure is made by the high-precision timer if supported by the +architecture. Alternatively, the time can also be measured using an external +oscilloscope connected to the board's status LED. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_adc.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_afsk.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_afsk.h new file mode 100644 index 00000000..d8bc1d56 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_afsk.h @@ -0,0 +1,114 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_ax25.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_battfs.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_context_switch.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_context_switch.h new file mode 100644 index 00000000..be15cf2f --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 1 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_dataflash.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_dc_motor.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_debug.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_fat.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_flash25.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_formatwr.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_gfx.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_hashtable.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_heap.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_i2c.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_i2c.h new file mode 100644 index 00000000..af36e6b6 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_i2c.h @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_i2s.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_ini_reader.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_kbd.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_keytag.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_kfile.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_lcd_32122a.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_lcd_hd44.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_lm75.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_md2.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_menu.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_monitor.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_nmea.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_parser.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_phase.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_pocketbus.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_proc.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_proc.h new file mode 100644 index 00000000..ab1a4680 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_pwm.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_ramp.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_randpool.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_sem.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_ser.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_signal.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_spi_bitbang.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_stepper.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_tas5706a.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_thermo.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_timer.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_wdt.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/triface/benchmark/context_switch/cfg/cfg_xmodem.h b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/triface/benchmark/context_switch/context_switch.mk b/2.5/boards/triface/benchmark/context_switch/context_switch.mk new file mode 100644 index 00000000..86571ec5 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/context_switch.mk @@ -0,0 +1,89 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the context_switch_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += context_switch + +context_switch_PREFIX = "avr-" + +context_switch_SUFFIX = "" + +context_switch_SRC_PATH = boards/triface/benchmark/context_switch + +context_switch_HW_PATH = boards/triface + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CSRC INSTEAD! +context_switch_WIZARD_CSRC = \ + bertos/benchmark/context_switch.c \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/struct/heap.c \ + bertos/mware/formatwr.c \ + bertos/mware/event.c \ + bertos/drv/timer.c \ + bertos/cpu/avr/drv/timer_avr.c \ + bertos/kern/proc.c \ + bertos/cpu/avr/drv/ser_avr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_PCSRC INSTEAD! +context_switch_WIZARD_PCSRC = \ + bertos/mware/formatwr.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CPPASRC INSTEAD! +context_switch_WIZARD_CPPASRC = \ + bertos/cpu/avr/hw/switch_ctx_avr.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_CXXSRC INSTEAD! +context_switch_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE context_switch_USER_ASRC INSTEAD! +context_switch_WIZARD_ASRC = \ + \ + # + +context_switch_CPPFLAGS = -D'CPU_FREQ=(14745600UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(context_switch_HW_PATH) -I$(context_switch_SRC_PATH) $(context_switch_CPU_CPPFLAGS) $(context_switch_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_LDFLAGS = $(context_switch_CPU_LDFLAGS) $(context_switch_WIZARD_LDFLAGS) $(context_switch_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPAFLAGS = $(context_switch_CPU_CPPAFLAGS) $(context_switch_WIZARD_CPPAFLAGS) $(context_switch_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CSRC = $(context_switch_CPU_CSRC) $(context_switch_WIZARD_CSRC) $(context_switch_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_PCSRC = $(context_switch_CPU_PCSRC) $(context_switch_WIZARD_PCSRC) $(context_switch_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CPPASRC = $(context_switch_CPU_CPPASRC) $(context_switch_WIZARD_CPPASRC) $(context_switch_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_CXXSRC = $(context_switch_CPU_CXXSRC) $(context_switch_WIZARD_CXXSRC) $(context_switch_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_ASRC = $(context_switch_CPU_ASRC) $(context_switch_WIZARD_ASRC) $(context_switch_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +context_switch_DEBUG_SCRIPT = bertos/prg_scripts/nodebug.sh +context_switch_PROGRAMMER_CPU = atmega1281 +context_switch_STOPDEBUG_SCRIPT = bertos/prg_scripts/none.sh +context_switch_MCU = atmega1281 +context_switch_FLASH_SCRIPT = bertos/prg_scripts/avr/flash.sh +context_switch_STOPFLASH_SCRIPT = bertos/prg_scripts/avr/stopflash.sh +context_switch_CPU_CPPFLAGS = -Os -Ibertos/cpu/avr/ + +include $(context_switch_SRC_PATH)/context_switch_user.mk diff --git a/2.5/boards/triface/benchmark/context_switch/context_switch_user.mk b/2.5/boards/triface/benchmark/context_switch/context_switch_user.mk new file mode 100644 index 00000000..932e591b --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/context_switch_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +context_switch_PROGRAMMER_TYPE = none +context_switch_PROGRAMMER_PORT = none + +# Files included by the user. +context_switch_USER_CSRC = \ + $(context_switch_SRC_PATH)/main.c \ + # + +# Files included by the user. +context_switch_USER_PCSRC = \ + # + +# Files included by the user. +context_switch_USER_CPPASRC = \ + # + +# Files included by the user. +context_switch_USER_CXXSRC = \ + # + +# Files included by the user. +context_switch_USER_ASRC = \ + # + +# Flags included by the user. +context_switch_USER_LDFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +context_switch_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + -O2 \ + # diff --git a/2.5/boards/triface/benchmark/context_switch/flash.log b/2.5/boards/triface/benchmark/context_switch/flash.log new file mode 100644 index 00000000..77ca57b3 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/flash.log @@ -0,0 +1,31 @@ + +avrdude: AVR device initialized and ready to accept instructions + +Reading | ################################################## | 100% 0.04s + +avrdude: Device signature = 0x1e9704 +avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed + To disable this feature, specify the -D option. +avrdude: erasing chip +avrdude: reading input file "images/context_switch.hex" +avrdude: input file images/context_switch.hex auto detected as Intel Hex +avrdude: writing flash (12988 bytes): + +Writing | ################################################## | 100% 4.11s + +avrdude: 12988 bytes of flash written +avrdude: verifying flash memory against images/context_switch.hex: +avrdude: load data flash data from input file images/context_switch.hex: +avrdude: input file images/context_switch.hex auto detected as Intel Hex +avrdude: input file images/context_switch.hex contains 12988 bytes +avrdude: reading on-chip flash data: + +Reading | ################################################## | 100% 3.07s + +avrdude: verifying ... +avrdude: 12988 bytes of flash verified + +avrdude: safemode: Fuses OK + +avrdude done. Thank you. + diff --git a/2.5/boards/triface/benchmark/context_switch/main.c b/2.5/boards/triface/benchmark/context_switch/main.c new file mode 100644 index 00000000..f190567f --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/main.c @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel context switch benchmark. + * + * This benchmark measures the overhead (in µs) required to deliver a + * signal and switch from a low-priority process to a high-priority process. + * + * The measure is made by the high-precision timer if supported by the + * architecture. Alternatively, the time can also be measured using an external + * oscilloscope connected to the board's status LED. + */ + +#include + +int main(void) +{ + context_switch(); + while (1) + { + } + + return 0; +} diff --git a/2.5/boards/triface/benchmark/context_switch/project.bertos b/2.5/boards/triface/benchmark/context_switch/project.bertos new file mode 100644 index 00000000..b5acf5c2 --- /dev/null +++ b/2.5/boards/triface/benchmark/context_switch/project.bertos @@ -0,0 +1,81 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V14745600 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vcontext_switch +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Vavr +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V../configure --prefix=/usr/local/avr-4.1.2 --target=avr --enable-languages=c --disable-nls --disable-libssp --with-dwarf2 +p15 +sVversion +p16 +V4.1.2 +p17 +sVbuild +p18 +VDeveler s.r.l. 20070824 +p19 +sVpath +p20 +V/localhome/toolchain/avr/bin/avr-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'kernel' +p25 +aS'formatwr' +p26 +aS'kfile' +p27 +aS'context_switch' +p28 +aS'heap' +p29 +aS'signal' +p30 +aS'timer' +p31 +asS'CPU_NAME' +p32 +VATmega1281 +p33 +sS'PROJECT_HW_PATH' +p34 +S'../..' +p35 +sS'PROJECT_SRC_PATH' +p36 +S'.' +p37 +sS'PRESET' +p38 +I01 +sS'OUTPUT' +p39 +(lp40 +s. \ No newline at end of file diff --git a/2.5/boards/triface/benchmark/kernel_footprint/.spec b/2.5/boards/triface/benchmark/kernel_footprint/.spec new file mode 100644 index 00000000..5a527bef --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/.spec @@ -0,0 +1,14 @@ +name = 'BeRTOS Kernel footprint' +description=""" +

+This benchmark measures the memory footprint of the BeRTOS kernel with a +simple minimalist user application. +

+

+The purpose of this test is to give a measure of the required space in a +generic flash memory to store a full-featured BeRTOS kernel. +

+

+For more information have a look at the BeRTOS benchmarks page. +

+""" diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_adc.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_afsk.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_afsk.h new file mode 100644 index 00000000..d8bc1d56 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_afsk.h @@ -0,0 +1,114 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ax25.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_battfs.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_context_switch.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_dataflash.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_dc_motor.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_debug.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_debug.h new file mode 100644 index 00000000..f7596ca1 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_fat.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_flash25.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_formatwr.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_gfx.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_hashtable.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_heap.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_i2c.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_i2c.h new file mode 100644 index 00000000..af36e6b6 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_i2c.h @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_i2s.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ini_reader.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_kbd.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_keytag.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_kfile.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_lm75.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_md2.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_menu.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_monitor.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_nmea.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_parser.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_phase.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_pocketbus.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_proc.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_proc.h new file mode 100644 index 00000000..ab1a4680 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_pwm.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ramp.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_randpool.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_sem.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ser.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_signal.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_stepper.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_tas5706a.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_thermo.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_timer.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_wdt.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_xmodem.h b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/kernel_footprint.mk b/2.5/boards/triface/benchmark/kernel_footprint/kernel_footprint.mk new file mode 100644 index 00000000..4ab89f76 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/kernel_footprint.mk @@ -0,0 +1,88 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_footprint_user.mk file instead. +# + +# Constants automatically defined by the selected modules + + +# Our target application +TRG += kernel_footprint + +kernel_footprint_PREFIX = "avr-" + +kernel_footprint_SUFFIX = "" + +kernel_footprint_SRC_PATH = boards/triface/benchmark/kernel_footprint + +kernel_footprint_HW_PATH = boards/triface + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CSRC INSTEAD! +kernel_footprint_WIZARD_CSRC = \ + bertos/kern/signal.c \ + bertos/kern/kfile.c \ + bertos/kern/sem.c \ + bertos/struct/heap.c \ + bertos/mware/formatwr.c \ + bertos/cpu/avr/drv/timer_avr.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/benchmark/kernel_footprint.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_PCSRC INSTEAD! +kernel_footprint_WIZARD_PCSRC = \ + bertos/mware/formatwr.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CPPASRC INSTEAD! +kernel_footprint_WIZARD_CPPASRC = \ + bertos/cpu/avr/hw/switch_ctx_avr.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_CXXSRC INSTEAD! +kernel_footprint_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_footprint_USER_ASRC INSTEAD! +kernel_footprint_WIZARD_ASRC = \ + \ + # + +kernel_footprint_CPPFLAGS = -D'CPU_FREQ=(14745600UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_footprint_HW_PATH) -I$(kernel_footprint_SRC_PATH) $(kernel_footprint_CPU_CPPFLAGS) $(kernel_footprint_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_LDFLAGS = $(kernel_footprint_CPU_LDFLAGS) $(kernel_footprint_WIZARD_LDFLAGS) $(kernel_footprint_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPAFLAGS = $(kernel_footprint_CPU_CPPAFLAGS) $(kernel_footprint_WIZARD_CPPAFLAGS) $(kernel_footprint_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CSRC = $(kernel_footprint_CPU_CSRC) $(kernel_footprint_WIZARD_CSRC) $(kernel_footprint_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_PCSRC = $(kernel_footprint_CPU_PCSRC) $(kernel_footprint_WIZARD_PCSRC) $(kernel_footprint_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CPPASRC = $(kernel_footprint_CPU_CPPASRC) $(kernel_footprint_WIZARD_CPPASRC) $(kernel_footprint_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_CXXSRC = $(kernel_footprint_CPU_CXXSRC) $(kernel_footprint_WIZARD_CXXSRC) $(kernel_footprint_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_ASRC = $(kernel_footprint_CPU_ASRC) $(kernel_footprint_WIZARD_ASRC) $(kernel_footprint_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_footprint_DEBUG_SCRIPT = bertos/prg_scripts/nodebug.sh +kernel_footprint_PROGRAMMER_CPU = atmega1281 +kernel_footprint_STOPDEBUG_SCRIPT = bertos/prg_scripts/none.sh +kernel_footprint_MCU = atmega1281 +kernel_footprint_FLASH_SCRIPT = bertos/prg_scripts/avr/flash.sh +kernel_footprint_STOPFLASH_SCRIPT = bertos/prg_scripts/avr/stopflash.sh +kernel_footprint_CPU_CPPFLAGS = -Os -Ibertos/cpu/avr/ + +include $(kernel_footprint_SRC_PATH)/kernel_footprint_user.mk diff --git a/2.5/boards/triface/benchmark/kernel_footprint/kernel_footprint_user.mk b/2.5/boards/triface/benchmark/kernel_footprint/kernel_footprint_user.mk new file mode 100644 index 00000000..af8c4d6c --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/kernel_footprint_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_footprint_PROGRAMMER_TYPE = none +kernel_footprint_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_footprint_USER_CSRC = \ + $(kernel_footprint_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_footprint_USER_PCSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_footprint_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_footprint_USER_ASRC = \ + # + +# Flags included by the user. +kernel_footprint_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_footprint_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/triface/benchmark/kernel_footprint/main.c b/2.5/boards/triface/benchmark/kernel_footprint/main.c new file mode 100644 index 00000000..a3f11e50 --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/main.c @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \author Daniele Basile + * + * \brief Kernel footprint benchmark. + * + * This benchmark measures the memory footprint[1] of the BeRTOS kernel with a + * simple minimalist user application. + * + * The purpose of this test is to give a measure of the required space in a + * generic flash memory to store a full-featured BeRTOS kernel. + * + * [1] http://en.wikipedia.org/wiki/Memory_footprint + */ + +#include + +int main(void) +{ + kernel_footprint(); + while (1) + { + } + + return 0; +} + diff --git a/2.5/boards/triface/benchmark/kernel_footprint/project.bertos b/2.5/boards/triface/benchmark/kernel_footprint/project.bertos new file mode 100644 index 00000000..970e6e2b --- /dev/null +++ b/2.5/boards/triface/benchmark/kernel_footprint/project.bertos @@ -0,0 +1,83 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V14745600 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel_footprint +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Vavr +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V../configure --prefix=/usr/local/avr-4.3.2/ --target=avr --enable-languages=c,c++ --disable-nls --disable-libssp --with-dwarf2 +p15 +sVversion +p16 +V4.3.2 +p17 +sVbuild +p18 +VGCC +p19 +sVpath +p20 +V/localhome/toolchain/avr/bin/avr-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'kernel' +p24 +aS'formatwr' +p25 +aS'kfile' +p26 +aS'semaphores' +p27 +aS'msg' +p28 +aS'kernel_footprint' +p29 +aS'heap' +p30 +aS'signal' +p31 +aS'timer' +p32 +asS'CPU_NAME' +p33 +VATmega1281 +p34 +sS'PROJECT_HW_PATH' +p35 +S'../..' +p36 +sS'PROJECT_SRC_PATH' +p37 +S'.' +p38 +sS'PRESET' +p39 +I01 +sS'OUTPUT' +p40 +(lp41 +s. \ No newline at end of file diff --git a/2.5/boards/triface/examples/.spec b/2.5/boards/triface/examples/.spec new file mode 100644 index 00000000..d244bbf6 --- /dev/null +++ b/2.5/boards/triface/examples/.spec @@ -0,0 +1,3 @@ +name="Examples" +ord=1 +description="Full working example projects." diff --git a/2.5/boards/triface/examples/triface/.spec b/2.5/boards/triface/examples/triface/.spec new file mode 100644 index 00000000..bf11e35e --- /dev/null +++ b/2.5/boards/triface/examples/triface/.spec @@ -0,0 +1,27 @@ +name = 'Generic I/O board' +description=""" +

Generic I/O board

+ +

Overview

+

+Triface is a generic development board designed by Develer. The board mounts an +AVR ATmega128/ATmega1281 processor and provides 8 digital input ports, 4 +analogic input ports, 8 output ports connected to relays (able to commutate a +current of 5A) and 2 RS232 UART port. +

+

+The purpose of this project is to implement an interactive shell on the UART +port to manage all the devices present on the board. +

+ +

+The user will be able to attach a terminal on the UART port and issue specific +commands to read and change the state of the various devices. +

+ +

+For schematics and up to date information on this project, +check the Triface project page +on the BeRTOS site. +

+""" diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_adc.h b/2.5/boards/triface/examples/triface/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_afsk.h b/2.5/boards/triface/examples/triface/cfg/cfg_afsk.h new file mode 100644 index 00000000..d8bc1d56 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_afsk.h @@ -0,0 +1,114 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_ax25.h b/2.5/boards/triface/examples/triface/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_battfs.h b/2.5/boards/triface/examples/triface/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_context_switch.h b/2.5/boards/triface/examples/triface/cfg/cfg_context_switch.h new file mode 100644 index 00000000..fe0b4f87 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_dataflash.h b/2.5/boards/triface/examples/triface/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_dc_motor.h b/2.5/boards/triface/examples/triface/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_debug.h b/2.5/boards/triface/examples/triface/cfg/cfg_debug.h new file mode 100644 index 00000000..20fec2d3 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_debug.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 1 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_fat.h b/2.5/boards/triface/examples/triface/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_flash25.h b/2.5/boards/triface/examples/triface/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_formatwr.h b/2.5/boards/triface/examples/triface/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_gfx.h b/2.5/boards/triface/examples/triface/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_hashtable.h b/2.5/boards/triface/examples/triface/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_heap.h b/2.5/boards/triface/examples/triface/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_i2c.h b/2.5/boards/triface/examples/triface/cfg/cfg_i2c.h new file mode 100644 index 00000000..af36e6b6 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_i2c.h @@ -0,0 +1,90 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_i2s.h b/2.5/boards/triface/examples/triface/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_ini_reader.h b/2.5/boards/triface/examples/triface/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_kbd.h b/2.5/boards/triface/examples/triface/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_keytag.h b/2.5/boards/triface/examples/triface/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_kfile.h b/2.5/boards/triface/examples/triface/cfg/cfg_kfile.h new file mode 100644 index 00000000..5f63a1ec --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 1 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_lcd_32122a.h b/2.5/boards/triface/examples/triface/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_lcd_hd44.h b/2.5/boards/triface/examples/triface/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_lm75.h b/2.5/boards/triface/examples/triface/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_md2.h b/2.5/boards/triface/examples/triface/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_menu.h b/2.5/boards/triface/examples/triface/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_monitor.h b/2.5/boards/triface/examples/triface/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_nmea.h b/2.5/boards/triface/examples/triface/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_parser.h b/2.5/boards/triface/examples/triface/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_phase.h b/2.5/boards/triface/examples/triface/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_pocketbus.h b/2.5/boards/triface/examples/triface/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_proc.h b/2.5/boards/triface/examples/triface/cfg/cfg_proc.h new file mode 100644 index 00000000..4a1deb29 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_proc.h @@ -0,0 +1,108 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 0 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 0 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 0 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_pwm.h b/2.5/boards/triface/examples/triface/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_ramp.h b/2.5/boards/triface/examples/triface/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_randpool.h b/2.5/boards/triface/examples/triface/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_sem.h b/2.5/boards/triface/examples/triface/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_ser.h b/2.5/boards/triface/examples/triface/cfg/cfg_ser.h new file mode 100644 index 00000000..2f6581c4 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT 0 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT 0 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_signal.h b/2.5/boards/triface/examples/triface/cfg/cfg_signal.h new file mode 100644 index 00000000..e78a4519 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 0 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_spi_bitbang.h b/2.5/boards/triface/examples/triface/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_stepper.h b/2.5/boards/triface/examples/triface/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_tas5706a.h b/2.5/boards/triface/examples/triface/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_thermo.h b/2.5/boards/triface/examples/triface/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_timer.h b/2.5/boards/triface/examples/triface/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_wdt.h b/2.5/boards/triface/examples/triface/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/triface/examples/triface/cfg/cfg_xmodem.h b/2.5/boards/triface/examples/triface/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/triface/examples/triface/cmd_ctor.h b/2.5/boards/triface/examples/triface/cmd_ctor.h new file mode 100644 index 00000000..0e38c836 --- /dev/null +++ b/2.5/boards/triface/examples/triface/cmd_ctor.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Macro for defining command for protocol. + * + * \author Marco Benelli + */ + +#ifndef CMD_CTOR_H +#define CMD_CTOR_H + +#include + +#define REGISTER_FUNCTION parser_register_cmd + +#define REGISTER_CMD(NAME) REGISTER_FUNCTION(&cmd_ ## NAME ## _template) + +#define MAKE_TEMPLATE(NAME, ARGS, RES, FLAGS) \ +const struct CmdTemplate cmd_ ## NAME ## _template = \ +{ \ + #NAME, ARGS, RES, cmd_ ## NAME, FLAGS \ +}; + +#define MAKE_CMD(NAME, ARGS, RES, BODY, FLAGS) \ +static ResultCode cmd_ ## NAME (parms *args) \ +{ \ + return (ResultCode)BODY; \ +} \ +MAKE_TEMPLATE(NAME, ARGS, RES, FLAGS) + +#endif // CMD_CTOR_H diff --git a/2.5/boards/triface/examples/triface/main.c b/2.5/boards/triface/examples/triface/main.c new file mode 100644 index 00000000..045e6522 --- /dev/null +++ b/2.5/boards/triface/examples/triface/main.c @@ -0,0 +1,116 @@ +/** + * \file + * + * + * \author Marco Benelli + * \author Bernie Innocenti + * \author Daniele Basile + * + * \brief Triface application. + * + * This application manage some devices, like buzzer, digital in/out or analogic input. + * To controll all devices the application provide the interactive shell + * that allow the user to send commands to the board. All commands are generate + * throuth the macro, that convert its parameters, at compile time, to C function. + * In this way is more simple to implement the new command. Other that, the application, + * automaticly, parse this new command from the shell and call the our function. + * Actually this application runs on custom hardware, that you can see the scheme on bertos + * site, this hardware is able to read the tags string that come from rfid reader and + * print this on another serial port. The main scope of this function is to create + * the automatic opendoor, reading the tag key that will pass on the rfid reader. + */ + +#include "protocol.h" + +#include "hw/hw_input.h" + +#include + +#include +#include +#include +#include +#include + +#include +#include + +static Serial fd_ser; +static Serial tag_ser; + +static void init(void) +{ + IRQ_ENABLE; + kdbg_init(); + timer_init(); + adc_init(); + buz_init(); + MCUSR = 0; + wdt_disable(); + + INPUT_INIT(); +} + +int main(void) +{ + init(); + + /* Initialize Tag serial port and data structure */ + TagPacket pkt; + + /* Open the main communication port */ + ser_init(&fd_ser, SER_UART1); + ser_setbaudrate(&fd_ser, 115200); + + /* Tag reader serial port */ + ser_init(&tag_ser, SER_UART0); + ser_setbaudrate(&tag_ser, 9600); + + /* Init the tag parser */ + keytag_init(&pkt, &fd_ser.fd, &tag_ser.fd); + + protocol_init(&fd_ser.fd); + + while (1) + { + protocol_run(&fd_ser.fd); + + uint8_t buf[CONFIG_TAG_MAX_LEN]; + int len; + /* Read the new tag, if this is avaible */ + if ((len = keytag_recv(&pkt, buf, sizeof(buf))) != EOF) + kfile_write(&fd_ser.fd, buf, len); + } + + return 0; +} + diff --git a/2.5/boards/triface/examples/triface/project.bertos b/2.5/boards/triface/examples/triface/project.bertos new file mode 100644 index 00000000..a063a203 --- /dev/null +++ b/2.5/boards/triface/examples/triface/project.bertos @@ -0,0 +1,93 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V14745600 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vtriface +p7 +sS'TOOLCHAIN' +p8 +(dp9 +Vtarget +p10 +Vavr +p11 +sVthread +p12 +Vsingle +p13 +sVconfigured +p14 +V../configure --prefix=/usr/local/avr-4.1.2 --target=avr --enable-languages=c --disable-nls --disable-libssp --with-dwarf2 +p15 +sVversion +p16 +V4.1.2 +p17 +sVbuild +p18 +VDeveler s.r.l. 20070824 +p19 +sVpath +p20 +V/localhome/toolchain/avr/bin/avr-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'buzzer' +p24 +aS'ser' +p25 +aS'parser' +p26 +aS'keytag' +p27 +aS'formatwr' +p28 +aS'readline' +p29 +aS'adc' +p30 +aS'sprintf' +p31 +aS'kfile' +p32 +aS'hashtable' +p33 +aS'timer' +p34 +aS'sipo' +p35 +aS'debug' +p36 +asS'CPU_NAME' +p37 +VATmega1281 +p38 +sS'PROJECT_HW_PATH' +p39 +S'../..' +p40 +sS'PROJECT_SRC_PATH' +p41 +S'.' +p42 +sS'PRESET' +p43 +I01 +sS'OUTPUT' +p44 +(lp45 +S'codelite' +p46 +as. \ No newline at end of file diff --git a/2.5/boards/triface/examples/triface/protocol.c b/2.5/boards/triface/examples/triface/protocol.c new file mode 100644 index 00000000..900531e6 --- /dev/null +++ b/2.5/boards/triface/examples/triface/protocol.c @@ -0,0 +1,383 @@ +/** + * \file + * + * + * \brief Implementation of the command protocol between the board and the host + * + * + * \author Giovanni Bajo + * \author Marco Benelli + * \author Bernie Innocenti + * \author Daniele Basile + */ + +#include "protocol.h" +#include "cmd_ctor.h" // MAKE_CMD, REGISTER_CMD +#include "verstag.h" + +#include "hw/hw_input.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include + +#include +#include + +// Define the format string for ADC +#define ADC_FORMAT_STR "dddd" +#define ADC_CHANNEL_NUM 4 + +// DEBUG: set to 1 to force interactive mode +#define FORCE_INTERACTIVE 1 + +/** + * True if we are in interactive mode, false if we are in protocol mode. + * In interactive mode, commands are read through readline() (prompt, + * completion, history) without IDs, and replies/errors are sent to the serial + * output. + * In protocol mode, we implement the default protocol + */ +static bool interactive; + +/// Readline context, used for interactive mode. +static struct RLContext rl_ctx; + +static Sipo fd_sipo; + +uint8_t reg_status_dout; +/** + * Send a NAK asking the host to send the current message again. + * + * \a fd kfile handler for serial. + * \a err human-readable description of the error for debug purposes. + */ +INLINE void NAK(KFile *fd, const char *err) +{ +#ifdef _DEBUG + kfile_printf(fd, "NAK \"%s\"\r\n", err); +#else + kfile_printf(fd, "NAK\r\n"); +#endif +} + +static void protocol_prompt(KFile *fd) +{ + kfile_print(fd, ">> "); +} + +/* + * Print args on s, with format specified in t->result_fmt. + * Return number of valid arguments or -1 in case of error. + */ +static bool protocol_reply(KFile *fd, const struct CmdTemplate *t, + const parms *args) +{ + unsigned short offset = strlen(t->arg_fmt) + 1; + unsigned short nres = strlen(t->result_fmt); + + for (unsigned short i = 0; i < nres; ++i) + { + if (t->result_fmt[i] == 'd') + { + kfile_printf(fd, " %ld", args[offset+i].l); + } + else if (t->result_fmt[i] == 's') + { + kfile_printf(fd, " %s", args[offset+i].s); + } + + else + { + abort(); + } + } + kfile_printf(fd, "\r\n"); + return true; +} + +static void protocol_parse(KFile *fd, const char *buf) +{ + const struct CmdTemplate *templ; + + /* Command check. */ + templ = parser_get_cmd_template(buf); + if (!templ) + { + kfile_print(fd, "-1 Invalid command.\r\n"); + protocol_prompt(fd); + return; + } + + parms args[PARSER_MAX_ARGS]; + + /* Args Check. TODO: Handle different case. see doc/PROTOCOL . */ + if (!parser_get_cmd_arguments(buf, templ, args)) + { + kfile_print(fd, "-2 Invalid arguments.\r\n"); + protocol_prompt(fd); + return; + } + + /* Execute. */ + if(!parser_execute_cmd(templ, args)) + { + NAK(fd, "Error in executing command."); + } + if (!protocol_reply(fd, templ, args)) + { + NAK(fd, "Invalid return format."); + } + + protocol_prompt(fd); + return; +} + +void protocol_run(KFile *fd) +{ + /** + * \todo to be removed, we could probably access the serial FIFO + * directly + */ + static char linebuf[80]; + + if (!interactive) + { + kfile_gets(fd, linebuf, sizeof(linebuf)); + + // reset serial port error anyway + kfile_clearerr(fd); + + // check message minimum length + if (linebuf[0]) + { + /* If we enter lines beginning with sharp(#) + they are stripped out from commands */ + if(linebuf[0] != '#') + { + if (linebuf[0] == 0x1B && linebuf[1] == 0x1B) // ESC + { + interactive = true; + kfile_printf(fd, "Entering interactive mode\r\n"); + } + else + { + protocol_parse(fd, linebuf); + } + } + } + } + else + { + const char *buf; + + /* + * Read a line from serial. We use a temporary buffer + * because otherwise we would have to extract a message + * from the port immediately: there might not be any + * available, and one might get free while we read + * the line. We also add a fake ID at the start to + * fool the parser. + */ + buf = rl_readline(&rl_ctx); + + /* If we enter lines beginning with sharp(#) + they are stripped out from commands */ + if(buf && buf[0] != '#') + { + if (buf[0] != '\0') + { + // exit special case to immediately change serial input + if (!strcmp(buf, "exit") || !strcmp(buf, "quit")) + { + rl_clear_history(&rl_ctx); + kfile_printf(fd, "Leaving interactive mode...\r\n"); + interactive = FORCE_INTERACTIVE; + } + else + { + //TODO: remove sequence numbers + linebuf[0] = '0'; + linebuf[1] = ' '; + + strncpy(linebuf + 2, buf, sizeof(linebuf) - 3); + linebuf[sizeof(linebuf) - 1] = '\0'; + protocol_parse(fd, linebuf); + } + } + } + } +} + +/* + * Commands. + * TODO: Command declarations and definitions should be in another file(s). + * Maybe we should use CMD_HUNK_TEMPLATE. + * + */ + +MAKE_CMD(ver, "", "ddd", +({ + args[1].l = VERS_MAJOR; + args[2].l = VERS_MINOR; + args[3].l = VERS_REV; + 0; +}), 0); + +/* Sleep. Example of declaring function body directly in macro call. */ +MAKE_CMD(sleep, "d", "", +({ + timer_delay((mtime_t)args[1].l); + 0; +}), 0) + +/* Ping. */ +MAKE_CMD(ping, "", "", +({ + //Silence "args not used" warning. + (void)args; + 0; +}), 0) + +/* Dout */ +MAKE_CMD(dout, "d", "", +({ + kfile_putc((uint8_t)args[1].l, &fd_sipo.fd); + + //Store status of dout ports. + reg_status_dout = (uint8_t)args[1].l; + 0; +}), 0) + +/* rdout read the status of out ports.*/ +MAKE_CMD(rdout, "", "d", +({ + args[1].l = reg_status_dout; + 0; +}), 0) + + +/* Reset */ +MAKE_CMD(reset, "", "", +({ + //Silence "args not used" warning. + (void)args; + wdt_enable(WDTO_2S); + + /*We want to have an infinite loop that lock access on watchdog timer. + This piece of code it's equivalent to a while(true), but we have done this because + gcc generate a warning message that suggest to use "noreturn" parameter in function reset.*/ + ASSERT(args); + while(args); + 0; + +}), 0) + +/* Din */ +MAKE_CMD(din, "", "d", +({ + args[1].l = INPUT_GET(); + 0; +}), 0) + + + +/* Ain */ +MAKE_CMD(ain, "", ADC_FORMAT_STR, +({ + STATIC_ASSERT((sizeof(ADC_FORMAT_STR) - 1) == ADC_CHANNEL_NUM); + for(int i = 0; i < ADC_CHANNEL_NUM; i++) + args[i+1].l = adc_read(i); + + 0; +}), 0) + +/* Beep */ +MAKE_CMD(beep, "d", "", +({ + buz_beep(args[1].l); + 0; +}), 0) + +/* Register commands. */ +static void protocol_registerCmds(void) +{ + REGISTER_CMD(ver); + REGISTER_CMD(sleep); + REGISTER_CMD(ping); + REGISTER_CMD(dout); + //Set off all dout ports. + reg_status_dout = 0; + REGISTER_CMD(rdout); + REGISTER_CMD(reset); + REGISTER_CMD(din); + REGISTER_CMD(ain); + REGISTER_CMD(beep); +} + +/* Initialization: readline context, parser and register commands. */ +void protocol_init(KFile *fd) +{ + /* SPI Port Initialization */ + fd_sipo.load_device = TRIFACE_DOUT; + fd_sipo.bit_order = SIPO_DATAORDER_LSB; + fd_sipo.clock_pol = SIPO_START_LOW; + fd_sipo.load_pol = SIPO_LOW_TO_HIGH; + + sipo_init(&fd_sipo); + + interactive = FORCE_INTERACTIVE; + + rl_init_ctx(&rl_ctx); + //rl_setprompt(&rl_ctx, ">> "); + rl_sethook_get(&rl_ctx, (getc_hook)kfile_getc, fd); + rl_sethook_put(&rl_ctx, (putc_hook)kfile_putc, fd); + rl_sethook_match(&rl_ctx, parser_rl_match, NULL); + rl_sethook_clear(&rl_ctx, (clear_hook)kfile_clearerr,fd); + + parser_init(); + + protocol_registerCmds(); + + protocol_prompt(fd); +} diff --git a/2.5/boards/triface/examples/triface/protocol.h b/2.5/boards/triface/examples/triface/protocol.h new file mode 100644 index 00000000..8075bc87 --- /dev/null +++ b/2.5/boards/triface/examples/triface/protocol.h @@ -0,0 +1,50 @@ +/** + * \file + * + * + * \brief Implementation of the command protocol between the board and the host + * + * \author Marco Benelli + */ + + +#ifndef PROTOCOL_H +#define PROTOCOL_H + +#include + +#include + +void protocol_init(KFile *fd); +void protocol_run(KFile *fd); + +#endif // PROTOOCOL_H diff --git a/2.5/boards/triface/examples/triface/triface.mk b/2.5/boards/triface/examples/triface/triface.mk new file mode 100644 index 00000000..095c4a60 --- /dev/null +++ b/2.5/boards/triface/examples/triface/triface.mk @@ -0,0 +1,108 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the triface_user.mk file instead. +# + +# Constants automatically defined by the selected modules +triface_DEBUG = 1 + +# Our target application +TRG += triface + +triface_PREFIX = "avr-" + +triface_SUFFIX = "" + +triface_SRC_PATH = boards/triface/examples/triface + +triface_HW_PATH = boards/triface + +ifeq ($(CPU), atmega1281) + triface_hfuse = 0x98 + triface_lfuse = 0x3d + triface_efuse = 0x7f + triface_lock = 0x2f +else + triface_hfuse = 0x88 + triface_lfuse = 0xff + triface_efuse = 0xff + triface_lock = 0x2f +endif + + +# Files automatically generated by the wizard. DO NOT EDIT, USE triface_USER_CSRC INSTEAD! +triface_WIZARD_CSRC = \ + bertos/kern/kfile.c \ + bertos/mware/readline.c \ + bertos/mware/event.c \ + bertos/net/keytag.c \ + bertos/drv/sipo.c \ + bertos/cpu/avr/drv/adc_avr.c \ + bertos/struct/hashtable.c \ + bertos/mware/formatwr.c \ + bertos/mware/sprintf.c \ + bertos/drv/buzzer.c \ + bertos/drv/adc.c \ + bertos/drv/timer.c \ + bertos/cpu/avr/drv/timer_avr.c \ + bertos/mware/parser.c \ + bertos/cpu/avr/drv/ser_avr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE triface_USER_PCSRC INSTEAD! +triface_WIZARD_PCSRC = \ + bertos/mware/sprintf.c \ + bertos/mware/formatwr.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE triface_USER_CPPASRC INSTEAD! +triface_WIZARD_CPPASRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE triface_USER_CXXSRC INSTEAD! +triface_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE triface_USER_ASRC INSTEAD! +triface_WIZARD_ASRC = \ + \ + # + +triface_CPPFLAGS = -D'CPU_FREQ=(14745600UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(triface_HW_PATH) -I$(triface_SRC_PATH) $(triface_CPU_CPPFLAGS) $(triface_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +triface_LDFLAGS = $(triface_CPU_LDFLAGS) $(triface_WIZARD_LDFLAGS) $(triface_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +triface_CPPAFLAGS = $(triface_CPU_CPPAFLAGS) $(triface_WIZARD_CPPAFLAGS) $(triface_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +triface_CSRC = $(triface_CPU_CSRC) $(triface_WIZARD_CSRC) $(triface_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +triface_PCSRC = $(triface_CPU_PCSRC) $(triface_WIZARD_PCSRC) $(triface_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +triface_CPPASRC = $(triface_CPU_CPPASRC) $(triface_WIZARD_CPPASRC) $(triface_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +triface_CXXSRC = $(triface_CPU_CXXSRC) $(triface_WIZARD_CXXSRC) $(triface_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +triface_ASRC = $(triface_CPU_ASRC) $(triface_WIZARD_ASRC) $(triface_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +triface_MCU = atmega1281 +triface_CPU_CPPFLAGS = -Os -Ibertos/cpu/avr/ +triface_PROGRAMMER_CPU = atmega1281 +triface_STOPFLASH_SCRIPT = bertos/prg_scripts/avr/stopflash.sh +triface_STOPDEBUG_SCRIPT = bertos/prg_scripts/none.sh +triface_DEBUG_SCRIPT = bertos/prg_scripts/nodebug.sh +triface_FLASH_SCRIPT = bertos/prg_scripts/avr/flash.sh + +include $(triface_SRC_PATH)/triface_user.mk diff --git a/2.5/boards/triface/examples/triface/triface_user.mk b/2.5/boards/triface/examples/triface/triface_user.mk new file mode 100644 index 00000000..2f52da95 --- /dev/null +++ b/2.5/boards/triface/examples/triface/triface_user.mk @@ -0,0 +1,44 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +triface_PROGRAMMER_TYPE = none +triface_PROGRAMMER_PORT = none + +# Files included by the user. +triface_USER_CSRC = \ + $(triface_SRC_PATH)/main.c \ + $(triface_SRC_PATH)/protocol.c \ + # + +# Files included by the user. +triface_USER_PCSRC = \ + # + +# Files included by the user. +triface_USER_CPPASRC = \ + # + +# Files included by the user. +triface_USER_CXXSRC = \ + # + +# Files included by the user. +triface_USER_ASRC = \ + # + +# Flags included by the user. +triface_USER_LDFLAGS = \ + # + +# Flags included by the user. +triface_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +triface_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/triface/hw/hw_afsk.c b/2.5/boards/triface/hw/hw_afsk.c new file mode 100644 index 00000000..8adb432d --- /dev/null +++ b/2.5/boards/triface/hw/hw_afsk.c @@ -0,0 +1,41 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * + * \author Francesco Sacchi + */ + + +#include "hw_afsk.h" + diff --git a/2.5/boards/triface/hw/hw_afsk.h b/2.5/boards/triface/hw/hw_afsk.h new file mode 100644 index 00000000..ec9b8be2 --- /dev/null +++ b/2.5/boards/triface/hw/hw_afsk.h @@ -0,0 +1,87 @@ +/** + * \file + * + * + * \brief AFSK modem hardware-specific definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_AFSK_H +#define HW_AFSK_H + +#include "cfg/cfg_arch.h" + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Initialize the specified channel of the ADC for AFSK needs. + * The adc should be configured to have a continuos stream of convertions. + * For every convertion there must be an ISR that read the sample + * and call afsk_adc_isr(), passing the context and the sample. + * + * \param ch channel to be used for AFSK demodulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_adc_isr() for every convertion. + */ +#define AFSK_ADC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) + +#define AFSK_STROBE_INIT() do { /* Implement me */ } while (0) +#define AFSK_STROBE_ON() do { /* Implement me */ } while (0) +#define AFSK_STROBE_OFF() do { /* Implement me */ } while (0) + +/** + * Initialize the specified channel of the DAC for AFSK needs. + * The DAC has to be configured in order to call an ISR for every sample sent. + * The DAC doesn't have to start the IRQ immediatly but have to wait + * the AFSK driver to call AFSK_DAC_IRQ_START(). + * The ISR must then call afsk_dac_isr() passing the AFSK context. + * \param ch DAC channel to be used for AFSK modulation. + * \param ctx AFSK context (\see Afsk). This parameter must be saved and + * passed back to afsk_dac_isr() for every convertion. + */ +#define AFSK_DAC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) + +/** + * Start DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_START(ch) do { (void)ch; /* Implement me */ } while (0) + +/** + * Stop DAC convertions on channel \a ch. + * \param ch DAC channel. + */ +#define AFSK_DAC_IRQ_STOP(ch) do { (void)ch; /* Implement me */ } while (0) + +#endif /* HW_AFSK_H */ diff --git a/2.5/boards/triface/hw/hw_buzzer.h b/2.5/boards/triface/hw/hw_buzzer.h new file mode 100644 index 00000000..a2b683ad --- /dev/null +++ b/2.5/boards/triface/hw/hw_buzzer.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Buzzer hardware-specific definitions + * + * \author Francesco Sacchi + * \author Andrea Grandi + */ + +#ifndef HW_BUZZER_H +#define HW_BUZZER_H + +#include +#include + +#define BUZZER_BIT BV(PE3) +#define IS_BUZZER_ON (PORTE & BUZZER_BIT) +#define BUZZER_HW_INIT do { DDRE |= BV(DDE3); } while (0) +#define BUZZER_ON do { PORTE |= BUZZER_BIT; } while (0) +#define BUZZER_OFF do { PORTE &= ~BUZZER_BIT; } while (0) + +#endif /* HW_BUZZER_H */ + diff --git a/2.5/boards/triface/hw/hw_dataflash.c b/2.5/boards/triface/hw/hw_dataflash.c new file mode 100644 index 00000000..844dd922 --- /dev/null +++ b/2.5/boards/triface/hw/hw_dataflash.c @@ -0,0 +1,126 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_dataflash.h" + +#include +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +MOD_DEFINE(hw_dataflash); + +/** + * Data flash init function. + * + * This function provide to initialize all that + * needs to drive a dataflash memory. + * Generaly needs to init pins to drive a CS line + * and reset line. + */ +void dataflash_hw_init(void) +{ + + //Disable CS line (remove if not needed) + dataflash_hw_setCS(false); + + /* + * Put here your code! + * + * Note: + * - if you drive manualy CS line, here init a CS pin + * - if you use a dedicated reset line, here init a reset pin + */ + + MOD_INIT(hw_dataflash); +} + +/** + * Chip Select drive. + * + * This function enable or disable a CS line. + * You must implement this function comply to a dataflash + * memory datasheet to allow the drive to enable a memory + * when \p enable flag is true, and disable it when is false. + */ +void dataflash_hw_setCS(bool enable) +{ + if (enable) + { + /* + * Put here your code to enable + * dataflash memory + */ + } + else + { + /* + * Put here your code to disable + * dataflash memory + */ + } +} + +/** + * Reset data flash memory. + * + * This function provide to send reset signal to + * dataflash memory. You must impement it comly to a dataflash + * memory datasheet to allow the drive to set a reset pin + * when \p enable flag is true, and disable it when is false. + * + */ +void dataflash_hw_setReset(bool enable) +{ + if (enable) + { + /* + * Put here your code to set reset of + * dataflash memory + */ + } + else + { + /* + * Put here your code to clear reset of + * dataflash memory + */ + } +} + diff --git a/2.5/boards/triface/hw/hw_dataflash.h b/2.5/boards/triface/hw/hw_dataflash.h new file mode 100644 index 00000000..5254446b --- /dev/null +++ b/2.5/boards/triface/hw/hw_dataflash.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Dataflash HW control routines (interface). + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_DATAFLASH_H +#define HW_DATAFLASH_H + +#include + +void dataflash_hw_init(void); +void dataflash_hw_setCS(bool enable); +void dataflash_hw_setReset(bool enable); + +#endif /* HW_DATAFLASH_H */ diff --git a/2.5/boards/triface/hw/hw_dc_motor.h b/2.5/boards/triface/hw/hw_dc_motor.h new file mode 100644 index 00000000..f39388df --- /dev/null +++ b/2.5/boards/triface/hw/hw_dc_motor.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief DC motor hardware-specific definitions + * + * \author Daniele Basile + */ + +#ifndef HW_DC_MOTOR_H +#define HW_DC_MOTOR_H + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Define fuctions which read adc value from specific device + */ + #define HW_DC_MOTOR_READ_VALUE(dev, min, max) \ + ({ \ + /* Put here the fuction that read from ADC */ \ + (void)(dev); \ + (void)(min); \ + (void)(max); \ + (0); \ + }) + +// Macro that enable the select DC motor +#define DC_MOTOR_ENABLE(dev) /* Implement me! */ +// Macro that disable the select DC motor +#define DC_MOTOR_DISABLE(dev) /* Implement me! */ + +// Macro that left the DC motor rotor float +#define DC_MOTOR_STOP_FLOAT(dev) DC_MOTOR_DISABLE(dev) +// Macro that put in short circuit DC motor supply pins +#define DC_MOTOR_STOP_BRAKED(dev) do { /* Implement me! */ } while (0) + +// Macro that set motor direction +#define DC_MOTOR_SET_DIR(dev, dir) do { /* Implement me! */ } while (0) + +#define MOTOR_DC_INIT() do { /* Implement me! */ } while (0) + + +#endif /* HW_DC_MOTOR_H */ diff --git a/2.5/boards/triface/hw/hw_ft245rl.h b/2.5/boards/triface/hw/hw_ft245rl.h new file mode 100644 index 00000000..cc0c8193 --- /dev/null +++ b/2.5/boards/triface/hw/hw_ft245rl.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief FT245RL USB interface hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_FT245RL_H +#define HW_FT245RL_H + +#warning TODO:This is an example implementation, you must implement it! + +#define FT245RL_DATA_IN() /* Implement me! */ +#define FT245RL_DATA_OUT() /* Implement me! */ +#define WR_HI /* Implement me! */ +#define WR_LO /* Implement me! */ + +#define RD_HI /* Implement me! */ +#define RD_LO /* Implement me! */ + +#define FT245RL_INIT() \ +do \ +{ \ + /* Implement me! */ \ +} while(0) + +#define FT245RL_DATA_RDY() (/* Implement me! */ false) +#define FT245RL_GETDATA() ({/* Implement me! */ (0);}) +#define FT245RL_TX_ALLOWED() (/* Implement me! */ false) +#define FT245RL_SETDATA(data) do {/* Implement me! */ (void)((data)); } while(0) + +#endif /* HW_FT245RL_H */ + diff --git a/2.5/boards/triface/hw/hw_i2c_bitbang.h b/2.5/boards/triface/hw/hw_i2c_bitbang.h new file mode 100644 index 00000000..4822af7c --- /dev/null +++ b/2.5/boards/triface/hw/hw_i2c_bitbang.h @@ -0,0 +1,66 @@ +/** + * \file + * + * + * \brief Macro for I2C bitbang operation. + * + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_I2C_BITBANG_H +#define HW_I2C_BITBANG_H + +#warning TODO:This is an example implementation, you must implement it! + +#define SDA_HI do { /* Implement me:Set SDA High by setting SDA pin as input */ } while (0) +#define SDA_LO do { /* Implement me:Set SDA Low by setting SDA pin as open collector output */ } while (0) +#define SCL_HI do { /* Implement me:Set SCL High by setting SCL pin as input */ } while (0) +#define SCL_LO do { /* Implement me:Set SCL Low by setting SCL pin as open collector output */ } while (0) + + +#define SCL_IN (true) /* Implement me: read SDA pin state */ +#define SDA_IN (true) /* Implement me: read SCL pin state */ + +/** + * This macro should set SDA and SCL lines as input. + */ +#define I2C_BITBANG_HW_INIT do { /* Implement me! */ } while (0) + +/** + * Half bit delay routine used to generate the correct timings. + */ +#define I2C_HALFBIT_DELAY() do { /* Implement me! */ } while (0) + +#endif /* HW_I2C_BITBANG_H */ diff --git a/2.5/boards/triface/hw/hw_input.h b/2.5/boards/triface/hw/hw_input.h new file mode 100644 index 00000000..2a56b89f --- /dev/null +++ b/2.5/boards/triface/hw/hw_input.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Macro for HW_INPUT_H + * + * \author Andrea Grandi + */ + +#ifndef HW_INPUT_H +#define HW_INPUT_H + +#include + +/* Set pins as input and enable pull-up */ +#define INPUT_INIT_D \ + do{ \ + DDRD &= ~(BV(PD4) | BV(PD5) | BV(PD6) | BV(PD7)); \ + PORTD |= (BV(PD4) | BV(PD5) | BV(PD6) | BV(PD7)); \ + } while(0) + +#define INPUT_INIT_E \ + do{ \ + DDRE &= ~(BV(PE4) | BV(PE5) | BV(PE6) | BV(PE7)); \ + PORTE |= (BV(PE4) | BV(PE5) | BV(PE6) | BV(PE7)); \ + } while(0) + +INLINE uint8_t INPUT_GET(void) +{ + uint8_t out_d, out_e; + out_d = PIND; + out_e = PINE; + + /* Select our input (see scheme) */ + out_d >>= 4; + out_e = out_e & 0xF0; + + return (out_e | out_d); +} + +#define INPUT_INIT() \ + do { \ + INPUT_INIT_D; \ + INPUT_INIT_E; \ + } while(0) + +#endif /* HW_INPUT_H */ diff --git a/2.5/boards/triface/hw/hw_kbd.h b/2.5/boards/triface/hw/hw_kbd.h new file mode 100644 index 00000000..9ca228cb --- /dev/null +++ b/2.5/boards/triface/hw/hw_kbd.h @@ -0,0 +1,72 @@ +/** + * \file + * + * + * \brief Keyboard hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_H +#define HW_KBD_H + +#include "hw/kbd_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define K_RPT_MASK (K_UP | K_DOWN | K_OK | K_CANCEL) + +#define KBD_HW_INIT \ + do { \ + /* Put here code to init hw */ \ + } while (0) + +EXTERN_C int emul_kbdReadCols(void); + +/** + * Read the keyboard ports and return the mask of + * depressed keys. + */ +INLINE keymask_t kbd_readkeys(void) +{ + /* Implement me! */ + + //Only for test remove when implement this function + return 0; +} + +#endif /* HW_KBD_H */ diff --git a/2.5/boards/triface/hw/hw_lcd_32122a.h b/2.5/boards/triface/hw/hw_lcd_32122a.h new file mode 100644 index 00000000..6ec29c5c --- /dev/null +++ b/2.5/boards/triface/hw/hw_lcd_32122a.h @@ -0,0 +1,155 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_32122A_H +#define HW_LCD_32122A_H + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * Predefined LCD PWM contrast values + */ +#define LCD_DEF_PWM 145 +#define LCD_MAX_PWM 505 +#define LCD_MIN_PWM 130 +#define LCD_PWM_CH 0 + + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_PE_E1 /* Implement me! */ +#define LCD_PE_E2 /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +#define LCD_PF_DB0 /* Implment me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_A0 do { /* Implement me! */ } while (0) +#define LCD_SET_A0 do { /* Implement me! */ } while (0) +#define LCD_CLR_RD do { /* Implement me! */ } while (0) +#define LCD_SET_RD do { /* Implement me! */ } while (0) +#define LCD_CLR_E1 do { /* Implement me! */ } while (0) +#define LCD_SET_E1 do { /* Implement me! */ } while (0) +#define LCD_CLR_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E2 do { /* Implement me! */ } while (0) +#define LCD_SET_E(x) do { (void)x; /* Implement me! */ } while (0) +#define LCD_CLR_E(x) do { (void)x; /* Implement me! */ } while (0) +/*@}*/ + +/** + * \name Chip select bits for LCD_SET_E() + * @{ + */ +#define LCDF_E1 ( 0/* Implement me! */) +#define LCDF_E2 ( 0/* Implement me! */) +/*@}*/ +/** Read from the LCD data bus (DB[0-7]) */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/** Write to the LCD data bus (DB[0-7]) */ +#define LCD_READ (0 /* Implement me! */ ) + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ + +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + +#define LCD_32122_RESET() do { /* Implement me! */ } while (0) + +INLINE void lcd_32122a_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_32122A_H */ + diff --git a/2.5/boards/triface/hw/hw_lcd_hd44.h b/2.5/boards/triface/hw/hw_lcd_hd44.h new file mode 100644 index 00000000..dfebbcab --- /dev/null +++ b/2.5/boards/triface/hw/hw_lcd_hd44.h @@ -0,0 +1,157 @@ +/** + * \file + * + * + * \brief LCD low-level hardware macros + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ + +#ifndef HW_LCD_HD44_H +#define HW_LCD_HD44_H + +#include "cfg/cfg_lcd_hd44.h" /* CONFIG_LCD_4BIT */ + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +/** + * \name LCD I/O pins/ports + * @{ + */ +#define LCD_RS /* Implement me! */ +#define LCD_RW /* Implement me! */ +#define LCD_E /* Implement me! */ +#define LCD_DB0 /* Implement me! */ +#define LCD_DB1 /* Implement me! */ +#define LCD_DB2 /* Implement me! */ +#define LCD_DB3 /* Implement me! */ +#define LCD_DB4 /* Implement me! */ +#define LCD_DB5 /* Implement me! */ +#define LCD_DB6 /* Implement me! */ +#define LCD_DB7 /* Implement me! */ +/*@}*/ + +/** + * \name DB high nibble (DB[4-7]) + * @{ + */ + +#if CONFIG_LCD_4BIT + #define LCD_MASK (LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4) + #define LCD_SHIFT 4 +#else + #define LCD_MASK (uint8_t)0xff + #define LCD_SHIFT 0 +#endif +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +#define LCD_CLR_RS /* Implement me! */ +#define LCD_SET_RS /* Implement me! */ +#define LCD_CLR_RD /* Implement me! */ +#define LCD_SET_RD /* Implement me! */ +#define LCD_CLR_E /* Implement me! */ +#define LCD_SET_E /* Implement me! */ + +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +#if CONFIG_LCD_4BIT + #define LCD_WRITE_H(x) ((void)x)/* Implement me! */ + #define LCD_WRITE_L(x) ((void)x)/* Implement me! */ + #define LCD_READ_H ( 0 /* Implement me! */ ) + #define LCD_READ_L ( 0 /* Implement me! */ ) +#else + #define LCD_WRITE(x) ((void)x)/* Implement me! */ + #define LCD_READ (0 /* Implement me! */ ) +#endif +/*@}*/ + +/** Set data bus direction to output (write to display) */ +#define LCD_DB_OUT /* Implement me! */ + +/** Set data bus direction to input (read from display) */ +#define LCD_DB_IN /* Implement me! */ +/** Delay for write (Enable pulse width, 220ns) */ +#define LCD_DELAY_WRITE \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + +/** Delay for read (Data ouput delay time, 120ns) */ +#define LCD_DELAY_READ \ + do { \ + NOP; \ + NOP; \ + NOP; \ + NOP; \ + } while (0) + + + +INLINE void lcd_hd44_hw_bus_init(void) +{ + cpu_flags_t flags; + IRQ_SAVE_DISABLE(flags); + + /* + * Here set bus pin! + * to init a lcd device. + * + */ + + /* + * Data bus is in output state most of the time: + * LCD r/w functions assume it is left in output state + */ + LCD_DB_OUT; + + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_HD44_H */ diff --git a/2.5/boards/triface/hw/hw_led.h b/2.5/boards/triface/hw/hw_led.h new file mode 100644 index 00000000..d1ced6b4 --- /dev/null +++ b/2.5/boards/triface/hw/hw_led.h @@ -0,0 +1,47 @@ +/** + * \file + * + * + * \brief Led on/off macros. + * + * \author Daniele Basile + */ + +#ifndef HW_LED_H +#define HW_LED_H + +#define LED_ON() PORTG &= ~BV(PG4) +#define LED_OFF() PORTG |= BV(PG4) + +/* set pin PG4 as out */ +#define LED_INIT() DDRG |= BV(PG4) + +#endif /* HW_LED_H */ diff --git a/2.5/boards/triface/hw/hw_lm75.h b/2.5/boards/triface/hw/hw_lm75.h new file mode 100644 index 00000000..290dae09 --- /dev/null +++ b/2.5/boards/triface/hw/hw_lm75.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_LM75_H +#define HW_LM75_H + +#warning TODO:This is an example implentation, you must implement it! + +#define LM75_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_LM75_H */ + diff --git a/2.5/boards/triface/hw/hw_mcp41.c b/2.5/boards/triface/hw/hw_mcp41.c new file mode 100644 index 00000000..dc2a051c --- /dev/null +++ b/2.5/boards/triface/hw/hw_mcp41.c @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#include "hw/hw_mcp41.h" + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +const uint16_t mcp41_ports[MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; +const uint8_t mcp41_pins [MCP41_CNT] = +{ + 0, /* add here mcp41 ports */ +}; + diff --git a/2.5/boards/triface/hw/hw_mcp41.h b/2.5/boards/triface/hw/hw_mcp41.h new file mode 100644 index 00000000..645b6dac --- /dev/null +++ b/2.5/boards/triface/hw/hw_mcp41.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief MCP41 hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_MCP41_H +#define HW_MCP41_H + +#include "hw/mcp41_map.h" + +#include + + +#warning TODO:This is an example implementation, you must implement it! + + +INLINE void SET_MCP41_DDR(Mcp41Dev dev) +{ + /* Implement me! */ + //Warning: this funtions is like avr target name, + //fix it to comply for all target. + + //Only for test remove when implement this function + (void)dev; +} + +INLINE void MCP41_ON(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void MCP41_OFF(Mcp41Dev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +#endif /* HW_MCP41_H */ diff --git a/2.5/boards/triface/hw/hw_ntc.c b/2.5/boards/triface/hw/hw_ntc.c new file mode 100644 index 00000000..3048725c --- /dev/null +++ b/2.5/boards/triface/hw/hw_ntc.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id$ + * \author Lorenzo Berni + * + */ + +#include +#include "hw/ntc_map.h" + +const res_t NTC_RSER[NTC_CNT]; +const res_t NTC_RPAR[NTC_CNT]; +const amp_t NTC_AMP[NTC_CNT]; +const NtcHwInfo* NTC_INFO[NTC_CNT]; diff --git a/2.5/boards/triface/hw/hw_ntc.h b/2.5/boards/triface/hw/hw_ntc.h new file mode 100644 index 00000000..49152a45 --- /dev/null +++ b/2.5/boards/triface/hw/hw_ntc.h @@ -0,0 +1,136 @@ +/** + * \file + * + * + * \brief NTC hardware-specific definition + * + * \version $Id$ + * \author Francesco Sacchi + * + * A NTC acts as a variable resistor, whose resistance changes as a + * function of the temperature it measures. To sample it correctly, it is + * usually parallelized and serialized with two fixed resistor. The following diagram shows + * what is the exact disposition of the components, as handled by this + * library: + * + *
+ *                 o Vref
+ *                 |
+ *                 |                               o Vref
+ *                 |                               |
+ *               -----                             |
+ *              |     |                        ---------
+ *              | Rser|                       |         |
+ *              |     |                       |         |
+ *               -----     -----              |   ADC   |
+ *                 | Vp   |     |             |         |
+ *      -----------|------| Amp |-------------|         |
+ *     |           |      |     |      Vadc   |         |
+ *   -----       -----     -----               ---------
+ *  |     |     |     |
+ *  | NTC |     | Rpar|
+ *  |     |     |     |
+ *   -----       -----
+ *     |           |
+ *     |           |
+ *   -----       -----
+ *    ---         ---
+ *
+ * Amp is an amplifier that amplify of AMP times the signal. + * If we indicate Rp as the parallel of NTC with Rpar, ADCBITS as the bits of the ad converter + * and ADCVAL as the result from the adc convertion (Not Vadc but just the value read + * from the adc register), after various calculation, the expression of Rp is: + * + *
+ *
+ *            ADCVAL * Rser
+ * Rp = ------------------------
+ *         ADCBITS
+ *	2         * AMP - ADCVAL
+ *
+ * + * And after that NTC obvisiously is: + *
+ *        Rpar * Rp
+ * NTC = ----------
+ *        Rpar - Rp
+ *
+ * + * + * The function ntc_hw_read() compute the resistence using these formulas above. + */ + +#ifndef HW_NTC_H +#define HW_NTC_H + +#include "ntc_map.h" + +#include + +#include +#include + +#warning TODO:This is an example implementation, you must implement it! + +extern const res_t NTC_RSER[NTC_CNT]; +extern const res_t NTC_RPAR[NTC_CNT]; +extern const amp_t NTC_AMP[NTC_CNT]; +extern const NtcHwInfo* NTC_INFO[NTC_CNT]; + + +/*! + * Read the resistence of ntc device \a dev. + * Return the result in res_t type. + */ +INLINE res_t ntc_hw_read(NtcDev dev) +{ + ASSERT(dev < NTC_CNT); + // See above for formula explanation. + adcread_t adcval = adc_read((uint16_t)dev); + float rp = (adcval * NTC_RSER[dev] ) / ((1 << adc_bits()) * NTC_AMP[dev] - adcval); + + //kprintf("Rp[%f], Rntc[%f]\n", rp/100, ((NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp)) / 100.0); + + return ( (NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp) ); +} + + +/*! + * Return the info (aka the table) associated with ntc device \a dev. + */ +INLINE const NtcHwInfo* ntc_hw_getInfo(NtcDev dev) +{ + return NTC_INFO[dev]; +} + +#define NTC_HW_INIT do { /* Implement me! */ } while(0) + +#endif /* HW_NTC_H */ diff --git a/2.5/boards/triface/hw/hw_phase.c b/2.5/boards/triface/hw/hw_phase.c new file mode 100644 index 00000000..54509ef3 --- /dev/null +++ b/2.5/boards/triface/hw/hw_phase.c @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/hw_phase.h" + +#warning TODO:This is an example implementation, you must implement it! + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/triface/hw/hw_phase.h b/2.5/boards/triface/hw/hw_phase.h new file mode 100644 index 00000000..7649e702 --- /dev/null +++ b/2.5/boards/triface/hw/hw_phase.h @@ -0,0 +1,80 @@ +/** + * \file + * + * + * \brief Phase control hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_PHASE_H +#define HW_PHASE_H + +#include "hw/phase_map.h" + +#include + +#warning TODO:This is an example implementation, you must implement it! + +#define PHASE_HW_INIT do { /* Implement me! */ }while (0) + +INLINE void TRIAC_OFF(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + + +INLINE void TRIAC_ON(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +INLINE void SET_TRIAC_DDR(TriacDev i) +{ + /* Implement me! */ + + //Only for test remove when implement this function + (void)i; +} + +void zerocross_isr(void); +#define DEFINE_ZEROCROSS_ISR() void zerocross_isr(void) + + +#endif /* HW_PHASE_H */ diff --git a/2.5/boards/triface/hw/hw_rit128x96.h b/2.5/boards/triface/hw/hw_rit128x96.h new file mode 100644 index 00000000..c24d1a87 --- /dev/null +++ b/2.5/boards/triface/hw/hw_rit128x96.h @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \brief LM3S1986: OLED-RIT-128x96 (P14201) low-level hardware macros + * + * \author Andrea Righi + */ + +#ifndef HW_RIT128x96_H +#define HW_RIT128x96_H + +#include "cfg/macros.h" /* BV() */ +#include "cfg/debug.h" + +#include +#include +#include + +/** + * \name LCD I/O pins/ports + * @{ + */ +/* OLED Data/Command control pin */ +#define GPIO_OLEDDC_PIN 0 /* Implement me! */ + +/* OLED enable pin */ +#define GPIO_OLEDEN_PIN 0 /* Implement me! */ +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +/* Enter command mode */ +#define LCD_SET_COMMAND() /* Implement me! */ + +/* Enter data mode */ +#define LCD_SET_DATA() /* Implement me! */ + +/* Send data to the display */ +#define LCD_WRITE(x) ((void)x)/* Implement me! */ +/*@}*/ + +INLINE void lcd_rit128x96_hw_bus_init(void) +{ + /* Implement me! */ +} + +#endif /* HW_RIT128x96_H */ diff --git a/2.5/boards/triface/hw/hw_sd.h b/2.5/boards/triface/hw/hw_sd.h new file mode 100644 index 00000000..d15b5506 --- /dev/null +++ b/2.5/boards/triface/hw/hw_sd.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief SD driver hardware-specific definitions. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef HW_SD_H +#define HW_SD_H + +#warning FIXME: This is an example implementation, you must implement it + +#define SD_CS_INIT() do { /* implement me */} while(0) +#define SD_CS_ON() do { /* implement me */} while(0) +#define SD_CS_OFF() do { /* implement me */} while(0) + +#define SD_PIN_INIT() do { /* implement me */} while(0) +#define SD_CARD_PRESENT() true /* implement me */ +#define SD_WRITE_PROTECT() false /* implement me */ + +#endif /* HW_SD_H */ diff --git a/2.5/boards/triface/hw/hw_ser.h b/2.5/boards/triface/hw/hw_ser.h new file mode 100644 index 00000000..2489c433 --- /dev/null +++ b/2.5/boards/triface/hw/hw_ser.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Serial hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_SER_H +#define HW_SER_H + +#include "cfg/cfg_ser.h" + +#if CONFIG_SER_STROBE + #warning FIXME: this is an example implementation, you must implement it + + #define SER_STROBE_INIT do { /* implement me */ } while (0) + #define SER_STROBE_ON do { /* implement me */ } while (0) + #define SER_STROBE_OFF do { /* implement me */ } while (0) +#endif + +#endif /* HW_SER_H */ diff --git a/2.5/boards/triface/hw/hw_sipo.h b/2.5/boards/triface/hw/hw_sipo.h new file mode 100644 index 00000000..9922c052 --- /dev/null +++ b/2.5/boards/triface/hw/hw_sipo.h @@ -0,0 +1,149 @@ +/** + * \file + * + * + * \brief Macro for HW_SIPO_H + * + * + * \author Andrea Grandi + * \author Daniele Basile + */ + +#ifndef HW_SIPO_H +#define HW_SIPO_H + +#include + +#include + +/** + * Mapping sipo connection on board. + * See schematics for more info. + */ +typedef enum SipoMap +{ + TRIFACE_DOUT = 0, + + SIPO_CNT +} SipoMap; + + + +//Set output pin for sipo +#define SCK_OUT (DDRB |= BV(PB1)) // Shift register clock input pin +#define SOUT_OUT (DDRB |= BV(PB2)) // Serial data input pin +#define SLOAD_OUT (DDRB |= BV(PB3)) // Storage register clock input pin +#define OE_OUT (DDRG |= BV(PG3)) // Output enable pin + +//Define output level +#define SCK_HIGH (PORTB |= BV(PB1)) +#define SCK_LOW (PORTB &= ~BV(PB1)) +#define SOUT_OUT_HIGH (PORTB |= BV(PB2)) +#define SOUT_OUT_LOW (PORTB &= ~BV(PB2)) +#define SLOAD_OUT_HIGH (PORTB |= BV(PB3)) +#define SLOAD_OUT_LOW (PORTB &= ~BV(PB3)) +#define OE_LOW (PORTG &= BV(PG3)) + +/** + * Define the macros needed to set the serial input bit of SIPO device + * low or high. + */ +#define SIPO_SI_HIGH() SOUT_OUT_HIGH +#define SIPO_SI_LOW() SOUT_OUT_LOW + +/** + * Drive pin to load the bit, presented in serial-in pin, + * into sipo shift register. + */ +#define SIPO_SI_CLOCK(clk_pol) \ + do{ \ + (void)clk_pol; \ + SCK_HIGH; \ + SCK_LOW; \ + }while(0) + +/** + * Clock the content of shift register to output. + */ +#define SIPO_LOAD(device, load_pol) \ + do { \ + (void)device; \ + (void)load_pol; \ + SLOAD_OUT_HIGH; \ + SLOAD_OUT_LOW; \ + }while(0) + +/** + * Enable the shift register output. + */ +#define SIPO_ENABLE() OE_LOW; + +/** + * Set logic level for load signal + */ +#define SIPO_SET_LD_LEVEL(device, load_pol) \ + do { \ + (void)device; \ + if(load_pol) \ + SLOAD_OUT_HIGH; \ + else \ + SLOAD_OUT_LOW; \ + } while (0) + + +/** + * Sel logic level for clock signal + */ +#define SIPO_SET_CLK_LEVEL(clock_pol) \ + do { \ + if(clock_pol) \ + SCK_HIGH; \ + else \ + SCK_LOW; \ + } while (0) + +#define SIPO_SET_SI_LEVEL() SIPO_SI_LOW() + +/** + * Do everything needed in order to init the SIPO pins. + */ +#define SIPO_INIT_PIN() \ + do { \ + OE_OUT; \ + SOUT_OUT; \ + SCK_OUT; \ + SLOAD_OUT; \ + SIPO_ENABLE(); \ + } while(0) + + +#endif /* HW_SIPO_H */ diff --git a/2.5/boards/triface/hw/hw_spi.h b/2.5/boards/triface/hw/hw_spi.h new file mode 100644 index 00000000..04e4893a --- /dev/null +++ b/2.5/boards/triface/hw/hw_spi.h @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef HW_SPI_H +#define HW_SPI_H + +#warning TODO:This is an example implentation, you must implement it! + +#include + +/** + * SPI pin definition. + * + * \note CS is assert when level + * is low. + * + * \{ + */ +#define CS /* pin */ ///Connect to CS pin of Flash memory. +#define SCK /* pin */ ///Connect to SCK pin of Flash memory. +#define MOSI /* pin */ ///Connect to SI pin of Flash memory. +#define MISO /* pin */ ///Connect to SO pin of Flash memory. +#define SPI_PORT /* pin */ ///Micro pin PORT register. +#define SPI_PIN /* pin */ ///Micro pin PIN register. +#define SPI_DDR /* pin */ ///Micro pin DDR register. +/*\}*/ + +/** + * Pin logic level. + * + * \{ + */ +#define MOSI_LOW() do { /* Implement me! */ } while(0) +#define MOSI_HIGH() do { /* Implement me! */ } while(0) +#define MISO_HIGH() do { /* Implement me! */ } while(0) +#define SCK_LOW() do { /* Implement me! */ } while(0) +#define SCK_HIGH() do { /* Implement me! */ } while(0) +#define CS_LOW() do { /* Implement me! */ } while(0) +#define CS_HIGH() do { /* Implement me! */ } while(0) +/*\}*/ + +/** + * SPI pin commands. + * + * \{ + */ +#define CS_ENABLE() CS_LOW() +#define CS_DISABLE() CS_HIGH() +#define SS_ACTIVE() CS_LOW() +#define SS_INACTIVE() CS_HIGH() +#define SCK_INACTIVE() SCK_LOW() +#define SCK_ACTIVE() SCK_HIGH() +#define CS_OUT() do { /* Implement me! */ } while(0) +#define MOSI_IN() do { /* Implement me! */ } while(0) +#define MOSI_OUT() do { /* Implement me! */ } while(0) +#define IS_MISO_HIGH() (false /* Implement me! */ ) +#define MISO_IN() do { /* Implement me! */ } while(0) +#define MISO_OUT() do { /* Implement me! */ } while(0) +#define SCK_OUT() do { /* Implement me! */ } while(0) + +#define SCK_PULSE()\ + do {\ + SCK_HIGH();\ + SCK_LOW();\ + } while (0) +/*\}*/ + + +#define SPI_HW_INIT() \ + CS_DISABLE();\ + MOSI_LOW();\ + SCK_LOW();\ + MISO_IN();\ + MOSI_OUT();\ + SCK_OUT();\ + CS_OUT(); + +#endif /* HW_SPI_H */ + diff --git a/2.5/boards/triface/hw/hw_stepper.h b/2.5/boards/triface/hw/hw_stepper.h new file mode 100644 index 00000000..13141124 --- /dev/null +++ b/2.5/boards/triface/hw/hw_stepper.h @@ -0,0 +1,309 @@ +/** + * \file + * + * + * \brief Stepper hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + + +#ifndef HW_STEPPER_H +#define HW_STEPPER_H + +#include + +#include + +#include + +#warning TODO:This is an example implentation, you must implement it! + +#define STEPPER_STROBE_INIT \ +do { \ + /* put init code for strobe */ \ +} while (0) + + +#define STEPPER_STROBE_ON do { /* Implement me! */ } while(0) +#define STEPPER_STROBE_OFF do { /* Implement me! */ } while(0) + +/** + * CPU clock frequency is divided by 2^STEPPER_PRESCALER_LOG2 to + * obtain stepper clock. + */ +#define STEPPER_PRESCALER_LOG2 1 + +/** + * Stepper timer clock frequency. + */ +#define STEPPER_CLOCK ((CPU_FREQ) >> STEPPER_PRESCALER_LOG2) + +/** + * us delay to reset a stepper motor. + * This is the time neccessary to reset + * the stepper controll chip. (see datasheet for more detail). + */ +#define STEPPER_RESET_DELAY 1 + +/* + * Pins define for each stepper + */ +#define STEPPER_1_CW_CCW_PIN 0 +#define STEPPER_1_HALF_FULL_PIN 0 +#define STEPPER_1_CONTROL_PIN 0 +#define STEPPER_1_ENABLE_PIN 0 +#define STEPPER_1_RESET_PIN 0 + +/* put here other stepper motor */ + +#define STEPPER_1_SET do { /* Implement me! */ } while(0) +/* add here the set for other stepper motor */ + +#define STEPPER_1_CLEAR do { /* Implement me! */ } while(0) +/* add here the clear for other stepper motor */ + +/* + * Generic macro definition + */ + +/* + * Stepper init macro + */ +#define STEPPER_PIN_INIT_MACRO(port, index) do { \ + /* Add here init pin code */ \ + } while (0) + +/* + * Stepper commands macros + */ +#define STEPPER_SET_CW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CCW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_HALF(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_FULL(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_LOW(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_CONTROL_HIGHT(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_DISABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_ENABLE(index) do { /* Implement me! */ } while (0) +#define STEPPER_SET_RESET_DISABLE(index) do { /* Implement me! */ } while (0) + + +/* + * Reset stepper macro + */ + +#define STEPPER_RESET_MACRO(index) do { \ + STEPPER_SET_RESET_ENABLE(index); \ + timer_udelay(STEPPER_RESET_DELAY); \ + STEPPER_SET_RESET_DISABLE(index); \ + } while (0) + +/* + * Set half or full step macro + */ +#define STEPPER_SET_STEP_MODE_MACRO(index, flag) do { \ + if (flag) \ + STEPPER_SET_HALF(index); \ + else \ + STEPPER_SET_FULL(index); \ + } while (0) + +/* + * Set control status macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_CONTROL_BIT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macros not implemented */ \ + /* else */ \ + /* WARNING This macros not implemented */ \ + } while (0) + +/* + * Set current power macro + */ +#warning TODO: This macro is not implemented (see below) + +#define STEPPER_SET_POWER_CURRENT_MACRO(index, flag) do { \ + /* if (flag) */ \ + /* WARNING This macrois not implemented */ \ + /* else */ \ + /* WARNING This macrois not implemented */ \ + } while (0) + +/* + * Set rotation of stepper motor + * - dir = 1: positive rotation + * - dir = 0: no motor moviment + * - dir = -1: negative rotation + * + */ +#define STEPPER_SET_DIRECTION_MACRO(index, dir) do { \ + switch (dir) \ + { \ + case 1: \ + STEPPER_SET_CW(index); \ + break; \ + case -1: \ + STEPPER_SET_CCW(index); \ + break; \ + case 0: \ + break; \ + } \ + } while (0) + + +/* + * Define macros for manage low level of stepper. + */ + +#define STEPPER_INIT() do { \ + STEPPER_PIN_INIT_MACRO(A, 1); \ + /* Add here code for other stepper motor */ \ + } while (0) + + +/* + * Enable select stepper motor + */ +#define STEPPER_ENABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_ENABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Enable all stepper connect to micro + */ +#define STEPPER_ENABLE_ALL() do { \ + STEPPER_SET_ENABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Disable select stepper motor + */ +#define STEPPER_DISABLE(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DISABLE(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Disable all stepper connect to micro + */ +#define STEPPER_DISABLE_ALL() do { \ + STEPPER_SET_DISABLE(1); \ + /* Add here code for other stepper motor */ \ + } while (0) + +/* + * Reset selected stepper motor + */ +#define STEPPER_RESET(index) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_RESET_MACRO(1); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +/* + * Reset all stepper motor + */ +#define STEPPER_RESET_ALL() do { \ + STEPPER_RESET_MACRO(1) \ + /* Add here code for other stepper motor */ \ + } while (0) + +// Set half/full step macros +#define STEPPER_SET_HALF_STEP(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_STEP_MODE_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Control status +#define STEPPER_SET_CONTROL_BIT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_CONTROL_BIT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + + +// Set stepper power current +#define STEPPER_SET_POWER_CURRENT(index, flag) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_POWER_CURRENT_MACRO(1, flag); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +// Set rotation dirction of stepper motor +#define STEPPER_SET_DIRECTION(index, dir) do { \ + switch (index) \ + { \ + case 1: \ + STEPPER_SET_DIRECTION_MACRO(1, dir); \ + break; \ + /* Add here code for other stepper motor */ \ + } \ + } while (0) + +#endif /* HW_STEPPER_H */ + + diff --git a/2.5/boards/triface/hw/hw_tas5706a.h b/2.5/boards/triface/hw/hw_tas5706a.h new file mode 100644 index 00000000..d1e1a2e6 --- /dev/null +++ b/2.5/boards/triface/hw/hw_tas5706a.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief HW pin handling. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef HW_TAS5706A_H +#define HW_TAS5706A_H + +#include + +#warning FIXME: This is an example implementation, you must implement it + +#define TAS5706A_SETPOWERDOWN(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETRESET(val) do { (void) val; /* implement me */ } while (0) +#define TAS5706A_SETMUTE(val) do { (void) val; /* implement me */ } while (0) + +#define TAS5706A_PIN_INIT() \ + do { \ + TAS5706A_SETPOWERDOWN(true); \ + TAS5706A_SETRESET(true); \ + TAS5706A_SETMUTE(true); \ + /* complete me */ \ + } while (0) + +#define TAS5706A_MCLK_INIT() \ + do { \ + /* implement me */ \ + } while(0) + + +#endif /* HW_TAS5706A_H */ diff --git a/2.5/boards/triface/hw/hw_thermo.h b/2.5/boards/triface/hw/hw_thermo.h new file mode 100644 index 00000000..6f478068 --- /dev/null +++ b/2.5/boards/triface/hw/hw_thermo.h @@ -0,0 +1,121 @@ +/** + * \file + * + * + * \brief thermo hardware-specific control functions. + * + * \author Francesco Sacchi + * + */ + +#ifndef HW_THERMO_H +#define HW_THERMO_H + +#include "hw/thermo_map.h" + +#include + +#include + + +INLINE ticks_t thermo_hw_timeout(ThermoDev dev) +{ + (void)dev; + return 0; +} + +/** + * This function should return the temperature set tolerance. + */ +INLINE deg_t thermo_hw_tolerance(ThermoDev dev) +{ + (void)dev; + return 0; +} + +/** + * Read the temperature of the hw device \a dev. + */ +INLINE deg_t thermo_hw_read(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + /* Put here the code to read current temperature */ + return 0; +} + + +/** + * Turns off a specific device. + * This function is usefull to handle errors. + */ +INLINE void thermo_hw_off(ThermoDev dev) +{ + ASSERT(dev < THERMO_CNT); + /* Put here the code to turn off the thermo device */ +} + +/** + * Based on the current temperature \a cur_temp and the target temperature \a target, + * this function turns on and off specific thermo device. + * It may use also PID control for thermo-regolations. + */ +INLINE void thermo_hw_set(ThermoDev dev, deg_t target, deg_t cur_temp) +{ + ASSERT(dev < THERMO_CNT); + + if (target - cur_temp > 0) + { + /* + * We are leveaving the target temperature, so + * turn on the thermo device! + */ + } + else + { + /* + * Ok, we are near the target temperature, so + * turn off the thermo device! + */ + } + +} + +#define THERMO_HW_INIT _thermo_hw_init() + +/** + * Init hw associated with thermo-control. + */ +INLINE void _thermo_hw_init(void) +{ + /* Init your devices here! */ +} + +#endif /* HW_THERMO_H */ diff --git a/2.5/boards/triface/hw/hw_tlv5618.h b/2.5/boards/triface/hw/hw_tlv5618.h new file mode 100644 index 00000000..4a2b4202 --- /dev/null +++ b/2.5/boards/triface/hw/hw_tlv5618.h @@ -0,0 +1,69 @@ +/** + * \file + * + * + * \brief TLV5816 DAC hardware-specific definitions + * + * + * \author Francesco Sacchi + */ + +#ifndef HW_TLV5816_H +#define HW_TLV5816_H + +#warning TODO:This is an example implementation, you must implement it! + +#define TLV5618_CSINIT(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ + TLV5618_CSHIGH(pin); \ +} while(0) + +#define TLV5618_CSLOW(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#define TLV5618_CSHIGH(pin) \ +do \ +{ \ + (void)pin; \ + /* Implement me! */ \ +} while(0) + + +#endif /* HW_TLV5816_H */ + diff --git a/2.5/boards/triface/hw/hw_tmp123.h b/2.5/boards/triface/hw/hw_tmp123.h new file mode 100644 index 00000000..adb18588 --- /dev/null +++ b/2.5/boards/triface/hw/hw_tmp123.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_TMP123_H +#define HW_TMP123_H + +#warning TODO:This is an example implentation, you must implement it! + +#define TMP123_HW_CS_EN() /* Implement me! */ +#define TMP123_HW_CS_DIS() /* Implement me! */ + +#define TMP123_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_TMP123_H */ + diff --git a/2.5/boards/triface/hw/kbd_map.h b/2.5/boards/triface/hw/kbd_map.h new file mode 100644 index 00000000..ffe14311 --- /dev/null +++ b/2.5/boards/triface/hw/kbd_map.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Keyboard map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_MAP_H +#define HW_KBD_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + + +/** + * Type for keyboard mask. + */ +typedef uint16_t keymask_t; + +/** + * \name Keycodes. + */ +/*@{*/ +#define K_UP BV(0) +#define K_DOWN BV(1) +#define K_OK BV(2) +#define K_CANCEL BV(3) + +#define K_REPEAT BV(13) /**< This is a repeated keyevent. */ +#define K_TIMEOUT BV(14) /**< Fake key event for timeouts. */ +#define K_LONG BV(15) +/*@}*/ + +#define K_LNG_MASK 0 + +#endif /* HW_KBD_MAP_H */ diff --git a/2.5/boards/triface/hw/mcp41_map.h b/2.5/boards/triface/hw/mcp41_map.h new file mode 100644 index 00000000..6646391c --- /dev/null +++ b/2.5/boards/triface/hw/mcp41_map.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief MCP41 digital potentiometer map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef MCP41_MAP_H +#define MCP41_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/** \name Enum for mcp41 pot evices. + * \{ + * + */ +typedef enum Mcp41Dev +{ + MCP41_LED, + + /* put here other mcp41 device */ + + MCP41_CNT, +} Mcp41Dev; +/* \} */ + +#endif /* MCP41_MAP_H */ diff --git a/2.5/boards/triface/hw/ntc_map.h b/2.5/boards/triface/hw/ntc_map.h new file mode 100644 index 00000000..505f1c31 --- /dev/null +++ b/2.5/boards/triface/hw/ntc_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief NTC map definitions. + * + * \version $Id$ + * + * \author Giovanni Bajo + * \author Francesco Sacchi + */ + +#ifndef NTC_MAP_H +#define NTC_MAP_H + +#include + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for ntc devices. + * \{ + */ +typedef enum NtcDev +{ + NTC_TEST, + + /* Put here your thermo device */ + + NTC_CNT +} NtcDev; +/* \} */ + +#endif /* NTC_MAP_H */ diff --git a/2.5/boards/triface/hw/phase_map.h b/2.5/boards/triface/hw/phase_map.h new file mode 100644 index 00000000..7436e5e8 --- /dev/null +++ b/2.5/boards/triface/hw/phase_map.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief Triac map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + */ + +#ifndef PHASE_MAP_H +#define PHASE_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +/*! \name Enum for triac devices. + * \{ + */ +typedef enum TriacDev +{ + TRIAC_TEST, + + /* Put here other triac device */ + + TRIAC_CNT +} TriacDev; +/* \} */ + +#endif /* PHASE_MAP_H */ diff --git a/2.5/boards/triface/hw/pwm_map.h b/2.5/boards/triface/hw/pwm_map.h new file mode 100644 index 00000000..723da2f1 --- /dev/null +++ b/2.5/boards/triface/hw/pwm_map.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * + * \brief PWM map device. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef HW_PWM_MAP_H +#define HW_PWM_MAP_H + +#warning TODO:This is an example implentation, you must implement it! + +typedef enum +{ + PWM_CH0 = 0, + PWM_CH1, + PWM_CH2, + PWM_CH3, + +/* + * add other PWM channel or + * change above. + */ + + PWM_CNT +} PwmDev; + +#endif /* HW_PWM_MAP_H */ diff --git a/2.5/boards/triface/hw/thermo_map.h b/2.5/boards/triface/hw/thermo_map.h new file mode 100644 index 00000000..7dbe27bc --- /dev/null +++ b/2.5/boards/triface/hw/thermo_map.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Thermo regulation control map definitions. + * + * \author Francesco Sacchi + */ + +#ifndef THERMO_MAP_H +#define THERMO_MAP_H + +#include +#include + + +#warning TODO:This is an example implentation, you must implement it! + +typedef enum ThermoDev +{ + THERMO_TEST, + + /* Put here your thermo device */ + + THERMO_CNT +} ThermoDev; + +#endif /* THERMO_MAP_H */ diff --git a/2.5/boards/triface/templates/.spec b/2.5/boards/triface/templates/.spec new file mode 100644 index 00000000..07fb8eed --- /dev/null +++ b/2.5/boards/triface/templates/.spec @@ -0,0 +1,3 @@ +name = "Templates" +ord = 0 +description = "Use these as a starting point for your BeRTOS project." diff --git a/2.5/boards/triface/templates/empty/.spec b/2.5/boards/triface/templates/empty/.spec new file mode 100644 index 00000000..f3edfbc2 --- /dev/null +++ b/2.5/boards/triface/templates/empty/.spec @@ -0,0 +1,8 @@ +name = 'empty preset' +advanced = True +description=""" +

+This is a minimalist project, it just initializes the hardware of the +supported board and proposes an empty main. +<\p> +""" diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_adc.h b/2.5/boards/triface/templates/empty/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_afsk.h b/2.5/boards/triface/templates/empty/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_ax25.h b/2.5/boards/triface/templates/empty/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_battfs.h b/2.5/boards/triface/templates/empty/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_context_switch.h b/2.5/boards/triface/templates/empty/cfg/cfg_context_switch.h new file mode 100644 index 00000000..be15cf2f --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 1 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_dataflash.h b/2.5/boards/triface/templates/empty/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_dc_motor.h b/2.5/boards/triface/templates/empty/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_debug.h b/2.5/boards/triface/templates/empty/cfg/cfg_debug.h new file mode 100644 index 00000000..b0136259 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 1 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_fat.h b/2.5/boards/triface/templates/empty/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_flash25.h b/2.5/boards/triface/templates/empty/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_formatwr.h b/2.5/boards/triface/templates/empty/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_gfx.h b/2.5/boards/triface/templates/empty/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_hashtable.h b/2.5/boards/triface/templates/empty/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_heap.h b/2.5/boards/triface/templates/empty/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_i2c.h b/2.5/boards/triface/templates/empty/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_i2s.h b/2.5/boards/triface/templates/empty/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_ini_reader.h b/2.5/boards/triface/templates/empty/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_kbd.h b/2.5/boards/triface/templates/empty/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_keytag.h b/2.5/boards/triface/templates/empty/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_kfile.h b/2.5/boards/triface/templates/empty/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_lcd_32122a.h b/2.5/boards/triface/templates/empty/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_lcd_hd44.h b/2.5/boards/triface/templates/empty/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_lm75.h b/2.5/boards/triface/templates/empty/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_md2.h b/2.5/boards/triface/templates/empty/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_monitor.h b/2.5/boards/triface/templates/empty/cfg/cfg_monitor.h new file mode 100644 index 00000000..ffe17c07 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 0 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_nmea.h b/2.5/boards/triface/templates/empty/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_parser.h b/2.5/boards/triface/templates/empty/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_phase.h b/2.5/boards/triface/templates/empty/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_pocketbus.h b/2.5/boards/triface/templates/empty/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_proc.h b/2.5/boards/triface/templates/empty/cfg/cfg_proc.h new file mode 100644 index 00000000..52b4e414 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 0 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 0 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_pwm.h b/2.5/boards/triface/templates/empty/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_ramp.h b/2.5/boards/triface/templates/empty/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_randpool.h b/2.5/boards/triface/templates/empty/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_sem.h b/2.5/boards/triface/templates/empty/cfg/cfg_sem.h new file mode 100644 index 00000000..2a6de7a9 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_ser.h b/2.5/boards/triface/templates/empty/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_signal.h b/2.5/boards/triface/templates/empty/cfg/cfg_signal.h new file mode 100644 index 00000000..e78a4519 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 0 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_spi_bitbang.h b/2.5/boards/triface/templates/empty/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_stepper.h b/2.5/boards/triface/templates/empty/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_tas5706a.h b/2.5/boards/triface/templates/empty/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_thermo.h b/2.5/boards/triface/templates/empty/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_timer.h b/2.5/boards/triface/templates/empty/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_wdt.h b/2.5/boards/triface/templates/empty/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/triface/templates/empty/cfg/cfg_xmodem.h b/2.5/boards/triface/templates/empty/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/triface/templates/empty/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/triface/templates/empty/empty.mk b/2.5/boards/triface/templates/empty/empty.mk new file mode 100644 index 00000000..eff89d9f --- /dev/null +++ b/2.5/boards/triface/templates/empty/empty.mk @@ -0,0 +1,89 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the empty_user.mk file instead. +# + +# Constants automatically defined by the selected modules +empty_DEBUG = 1 + +# Our target application +TRG += empty + +empty_PREFIX = "avr-" + +empty_SUFFIX = "" + +empty_SRC_PATH = boards/triface/templates/empty + +empty_HW_PATH = boards/triface + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CSRC INSTEAD! +empty_WIZARD_CSRC = \ + bertos/kern/kfile.c \ + bertos/kern/signal.c \ + bertos/cpu/avr/drv/timer_avr.c \ + bertos/kern/sem.c \ + bertos/struct/heap.c \ + bertos/mware/formatwr.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/cpu/avr/drv/ser_avr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_PCSRC INSTEAD! +empty_WIZARD_PCSRC = \ + bertos/mware/formatwr.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CPPASRC INSTEAD! +empty_WIZARD_CPPASRC = \ + bertos/cpu/avr/hw/switch_ctx_avr.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_CXXSRC INSTEAD! +empty_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE empty_USER_ASRC INSTEAD! +empty_WIZARD_ASRC = \ + \ + # + +empty_CPPFLAGS = -D'CPU_FREQ=(14745600UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(empty_HW_PATH) -I$(empty_SRC_PATH) $(empty_CPU_CPPFLAGS) $(empty_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_LDFLAGS = $(empty_CPU_LDFLAGS) $(empty_WIZARD_LDFLAGS) $(empty_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPAFLAGS = $(empty_CPU_CPPAFLAGS) $(empty_WIZARD_CPPAFLAGS) $(empty_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CSRC = $(empty_CPU_CSRC) $(empty_WIZARD_CSRC) $(empty_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_PCSRC = $(empty_CPU_PCSRC) $(empty_WIZARD_PCSRC) $(empty_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CPPASRC = $(empty_CPU_CPPASRC) $(empty_WIZARD_CPPASRC) $(empty_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_CXXSRC = $(empty_CPU_CXXSRC) $(empty_WIZARD_CXXSRC) $(empty_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_ASRC = $(empty_CPU_ASRC) $(empty_WIZARD_ASRC) $(empty_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +empty_MCU = atmega1281 +empty_CPU_CPPFLAGS = -Os -Ibertos/cpu/avr/ +empty_PROGRAMMER_CPU = atmega1281 +empty_STOPFLASH_SCRIPT = bertos/prg_scripts/avr/stopflash.sh +empty_STOPDEBUG_SCRIPT = bertos/prg_scripts/none.sh +empty_DEBUG_SCRIPT = bertos/prg_scripts/nodebug.sh +empty_FLASH_SCRIPT = bertos/prg_scripts/avr/flash.sh + +include $(empty_SRC_PATH)/empty_user.mk diff --git a/2.5/boards/triface/templates/empty/empty_user.mk b/2.5/boards/triface/templates/empty/empty_user.mk new file mode 100644 index 00000000..4c8ed7ef --- /dev/null +++ b/2.5/boards/triface/templates/empty/empty_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +empty_PROGRAMMER_TYPE = none +empty_PROGRAMMER_PORT = none + +# Files included by the user. +empty_USER_CSRC = \ + $(empty_SRC_PATH)/main.c \ + # + +# Files included by the user. +empty_USER_PCSRC = \ + # + +# Files included by the user. +empty_USER_CPPASRC = \ + # + +# Files included by the user. +empty_USER_CXXSRC = \ + # + +# Files included by the user. +empty_USER_ASRC = \ + # + +# Flags included by the user. +empty_USER_LDFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +empty_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/triface/templates/empty/main.c b/2.5/boards/triface/templates/empty/main.c new file mode 100644 index 00000000..1b6b79a6 --- /dev/null +++ b/2.5/boards/triface/templates/empty/main.c @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Empty project. + * + * This is a minimalist project, it just initializes the hardware of the + * supported board and proposes an empty main. + */ + +#include "hw/hw_led.h" + +#include + +#include +#include + +#include +#include + +static Serial out; + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* Initialize UART0 */ + ser_init(&out, SER_UART0); + /* Configure UART0 to work at 115.200 bps */ + ser_setbaudrate(&out, 115200); + /* Initialize LED driver */ + LED_INIT(); +} + +int main(void) +{ + init(); + + /* Put your code here... */ + while (1) + { + } +} diff --git a/2.5/boards/triface/templates/empty/project.bertos b/2.5/boards/triface/templates/empty/project.bertos new file mode 100644 index 00000000..68eb2f28 --- /dev/null +++ b/2.5/boards/triface/templates/empty/project.bertos @@ -0,0 +1,77 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V14745600 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vempty +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Vavr +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V../configure --prefix=/usr/local/avr-4.3.2/ --target=avr --enable-languages=c,c++ --disable-nls --disable-libssp --with-dwarf2 +p15 +sS'version' +p16 +V4.3.2 +p17 +sS'build' +p18 +VGCC +p19 +sS'path' +p20 +V/opt/avr-4.3.2/bin/avr-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'formatwr' +p25 +aS'debug' +p26 +aS'kfile' +p27 +aS'heap' +p28 +aS'timer' +p29 +asS'CPU_NAME' +p30 +VATmega1281 +p31 +sS'PROJECT_HW_PATH' +p32 +S'../..' +p33 +sS'PROJECT_SRC_PATH' +p34 +S'.' +p35 +sS'PRESET' +p36 +I01 +sS'OUTPUT' +p37 +(lp38 +s. \ No newline at end of file diff --git a/2.5/boards/triface/templates/kernel/.spec b/2.5/boards/triface/templates/kernel/.spec new file mode 100644 index 00000000..04a79cff --- /dev/null +++ b/2.5/boards/triface/templates/kernel/.spec @@ -0,0 +1,9 @@ +name = 'kernel preset' +advanced = True +description=""" +

+This is a minimalist kernel project: it just initializes the hardware and +creates an independent process to blink an LED, while the main loop +continues to monitor the stack utilization of all the processes. +

+""" diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_adc.h b/2.5/boards/triface/templates/kernel/cfg/cfg_adc.h new file mode 100644 index 00000000..dd65e134 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_adc.h @@ -0,0 +1,110 @@ +/** + * \file + * + * + * \brief Configuration file for the ADC module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_ADC_H +#define CFG_ADC_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define ADC_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define ADC_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Clock Frequency for ADC conversion. + * + * $WIZ$ type = "int" + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_CLOCK 4800000UL + +/** + * Minimum time for starting up a conversion [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_STARTUP_TIME 20 + +/** + * Minimum time for sample and hold [us]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ supports = "at91" + */ +#define CONFIG_ADC_SHTIME 834 + +/** + * ADC Voltage Reference. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "avr_adc_refs" + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC + +/** + * ADC clock divisor from main crystal. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ max = 128 + * $WIZ$ supports = "avr" + */ +#define CONFIG_ADC_AVR_DIVISOR 2 + +/** + * Enable ADC strobe for debugging ADC ISR. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_ADC_STROBE 0 + +#endif /* CFG_ADC_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_afsk.h b/2.5/boards/triface/templates/kernel/cfg/cfg_afsk.h new file mode 100644 index 00000000..cce47c1f --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_afsk.h @@ -0,0 +1,113 @@ +/** + * \file + * + * + * \brief Configuration file for AFSK1200 modem. + * + * \author Francesco Sacchi + */ + +#ifndef CFG_AFSK_H +#define CFG_AFSK_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AFSK_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AFSK_LOG_FORMAT LOG_FMT_TERSE + + +/** + * AFSK discriminator filter type. + * + * $WIZ$ type = "enum"; value_list = "afsk_filter_list" + */ +#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV + + +/** + * AFSK receiver buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_RX_BUFLEN 32 + +/** + * AFSK transimtter buffer length. + * + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_AFSK_TX_BUFLEN 32 + +/** + * AFSK DAC sample rate for modem outout. + * $WIZ$ type = "int" + * $WIZ$ min = 2400 + */ +#define CONFIG_AFSK_DAC_SAMPLERATE 9600 + +/** + * AFSK RX timeout in ms, set to -1 to disable. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_AFSK_RXTIMEOUT 0 + + +/** + * AFSK Preamble length in [ms], before starting transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_PREAMBLE_LEN 300UL + + + +/** + * AFSK Trailer length in [ms], before stopping transmissions. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_AFSK_TRAILER_LEN 50UL + +#endif /* CFG_AFSK_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_ax25.h b/2.5/boards/triface/templates/kernel/cfg/cfg_ax25.h new file mode 100644 index 00000000..64f862f1 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_ax25.h @@ -0,0 +1,76 @@ +/** + * \file + * + * + * \brief Configuration file for the AX25 protocol module. + * + * \version $Id$ + * \author Francesco Sacchi + */ + +#ifndef CFG_AX25_H +#define CFG_AX25_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define AX25_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define AX25_LOG_FORMAT LOG_FMT_TERSE + +/** + * AX25 frame buffer lenght. + * + * $WIZ$ type = "int" + * $WIZ$ min = 18 + */ +#define CONFIG_AX25_FRAME_BUF_LEN 330 + + +/** + * Enable repeaters listing in AX25 frames. + * If enabled use 56 addtional bytes of RAM + * for each message received. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_AX25_RPT_LST 1 + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_battfs.h b/2.5/boards/triface/templates/kernel/cfg/cfg_battfs.h new file mode 100644 index 00000000..fb438a08 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_battfs.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for BattFS module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_BATTFS_H +#define CFG_BATTFS_H + + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define BATTFS_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE + +/** + * Set to 1 to enable free page shuffling. + * This increase memories life but makes debugging + * more difficult due to its unrepeteable state. + * $WIZ$ type = "boolean" + */ +#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 + + +#endif /* BATTFS */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_context_switch.h b/2.5/boards/triface/templates/kernel/cfg/cfg_context_switch.h new file mode 100644 index 00000000..be15cf2f --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_context_switch.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for the context switch benchmark. + * + * \author Daniele Basile + */ + +#ifndef CFG_CONTEXT_SWITCH_H +#define CFG_CONTEXT_SWITCH_H + +/** + * Use hp timer for the bechmark. + * + * $WIZ$ type = "boolean" + * $WIZ$ module= "boolean" + * $WIZ$ conditional_deps = "ser" + */ +#define CONFIG_USE_HP_TIMER 1 + + +/** + * Use board led for benchmark. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_USE_LED 1 + + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_CTX_DEBUG_PORT 1 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_CTX_DEBUG_BAUDRATE 115200UL + +#endif /* CFG_CONTEXT_SWITCH_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_dataflash.h b/2.5/boards/triface/templates/kernel/cfg/cfg_dataflash.h new file mode 100644 index 00000000..8bd7828a --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_dataflash.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for data flash memory module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_DATAFLASH_H +#define CFG_DATAFLASH_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_DATAFLASH_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_dc_motor.h b/2.5/boards/triface/templates/kernel/cfg/cfg_dc_motor.h new file mode 100644 index 00000000..fd9bac73 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_dc_motor.h @@ -0,0 +1,111 @@ +/** + * \file + * + * + * \brief Configuration file for DC motor module. + * + * + * \author Daniele Basile + */ + +#ifndef CFG_DC_MOTOR_H +#define CFG_DC_MOTOR_H + +/** + * Number of the DC motors to manage. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_DC_MOTOR 4 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define DC_MOTOR_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define DC_MOTOR_LOG_FORMAT LOG_FMT_VERBOSE + + +/** + * Min value of DC motor speed. + * \note Generally this value is the min value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_MIN_SPEED 0 + + +/** + * Max value of DC motor speed. + * \note Generally this value is the max value of the ADC conversion, + * if you use it. + * + * $WIZ$ type = "int" + * $WIZ$ max = 65535 + */ +#define CONFIG_DC_MOTOR_MAX_SPEED 65535 + + +/** + * Sampling period in millisecond. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_PERIOD 40 + +/** + * Amount of millisecond before to read sample. + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_SAMPLE_DELAY 2 + +/** + * This control set which mode the driver use to lock share + * resources when we use the preempitive kernel. + * If we set to 1 we use the semaphore module otherwise the + * driver disable the switch context every time we need to access + * to shared sources. + * + * $WIZ$ type = "int" + */ +#define CONFIG_DC_MOTOR_USE_SEM 1 + +#endif /* CFG_DC_MOTOR_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_debug.h b/2.5/boards/triface/templates/kernel/cfg/cfg_debug.h new file mode 100644 index 00000000..b0136259 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_debug.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 1 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_fat.h b/2.5/boards/triface/templates/kernel/cfg/cfg_fat.h new file mode 100644 index 00000000..d418b783 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_fat.h @@ -0,0 +1,140 @@ +/** + * \file + * + * + * \brief Configuration file for Fat module. + * + * \version $Id$ + * + * \author Luca Ottaviano + * \author Francesco Sacchi + */ + +#ifndef CFG_FAT_H +#define CFG_FAT_H + +/** + * Use word alignment to access FAT structure. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_WORD_ACCESS 0 +#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS + +/** + * Enable read functions only. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_READONLY 0 +#define _FS_READONLY CONFIG_FAT_FS_READONLY + +/** + * Minimization level to remove some functions. + * $WIZ$ type = "int"; min = 0; max = 3 + */ +#define CONFIG_FAT_FS_MINIMIZE 0 +#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE + +/** + * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_FS_TINY 1 +#define _FS_TINY CONFIG_FAT_FS_TINY + +/** + * To enable string functions, set _USE_STRFUNC to 1 or 2. + * $WIZ$ type = "int" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_USE_STRFUNC 0 +#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC + +/** + * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_MKFS 0 +#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) + +/** + * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_FORWARD 0 +#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) + +/** + * Number of volumes (logical drives) to be used. + * $WIZ$ type = "int"; min = 1; max = 255 + */ +#define CONFIG_FAT_DRIVES 1 +#define _DRIVES CONFIG_FAT_DRIVES + +/** + * Maximum sector size to be handled. (512/1024/2048/4096). + * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk + * $WIZ$ type = "int"; min = 512; max = 4096 + */ +#define CONFIG_FAT_MAX_SS 512 +#define _MAX_SS CONFIG_FAT_MAX_SS + +/** + * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical + * drive number and can mount only first primaly partition. When it is set to 1, + * each volume is tied to the partitions listed in Drives[]. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_FAT_MULTI_PARTITION 0 +#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION + +/** + * Specifies the OEM code page to be used on the target system. + * $WIZ$ type = "int" + */ +#define CONFIG_FAT_CODE_PAGE 850 +#define _CODE_PAGE CONFIG_FAT_CODE_PAGE + +/** + * Support for long filenames. Enable only if you have a valid Microsoft license. + * $WIZ$ type = "boolean" + */ +#define CONFIG_FAT_USE_LFN 0 +#define _USE_LFN CONFIG_FAT_USE_LFN + +/** + * Maximum Long File Name length to handle. + * $WIZ$ type = "int"; min = 8; max = 255 + */ +#define CONFIG_FAT_MAX_LFN 255 +#define _MAX_LFN CONFIG_FAT_MAX_LFN + +#endif /* CFG_FAT_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_flash25.h b/2.5/boards/triface/templates/kernel/cfg/cfg_flash25.h new file mode 100644 index 00000000..f7ff219b --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_flash25.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for flash25 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_FLASH25_H +#define CFG_FLASH25_H + +/** + * Eeprom memory type. + * + *$WIZ$ type = "enum" + *$WIZ$ value_list = "flash25_list" + */ +#define CONFIG_FLASH25 FLASH25_AT25F2048 + +#endif /* CFG_FALSH25_H */ + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_formatwr.h b/2.5/boards/triface/templates/kernel/cfg/cfg_formatwr.h new file mode 100644 index 00000000..bac8aca7 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_formatwr.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Configuration file for formatted write module. + * + * \author Daniele Basile + */ + +#ifndef CFG_FORMATWR_H +#define CFG_FORMATWR_H + +/** + * printf()-style formatter configuration. + * $WIZ$ type = "enum"; value_list = "printf_list" + * + * \sa PRINTF_DISABLED + * \sa PRINTF_NOMODIFIERS + * \sa PRINTF_REDUCED + * \sa PRINTF_NOFLOAT + * \sa PRINTF_FULL + */ +#define CONFIG_PRINTF PRINTF_FULL + +/** + * Size of buffer to format "%" sequences in printf. + * + * Warning: no check on buffer size is done when formatting, be careful especially + * with big numbers and %f formatting. + * + * $WIZ$ type = "int" + * $WIZ$ min = 4 + */ +#define CONFIG_FRMWRI_BUFSIZE 134 + +#endif /* CFG_FORMATWR_H */ + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_gfx.h b/2.5/boards/triface/templates/kernel/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_hashtable.h b/2.5/boards/triface/templates/kernel/cfg/cfg_hashtable.h new file mode 100644 index 00000000..e4645f33 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_hashtable.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for hashtable module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HASHTABLE_H +#define CFG_HASHTABLE_H + +/** + * Enable/disable support to declare special hash tables which maintain a copy of the key internally instead of relying on the hook to extract it from the data. + * + * $WIZ$ type = "boolean" + */ +#define CONFIG_HT_OPTIONAL_INTERNAL_KEY 1 + +#endif /* CFG_HASHTABLE_H */ + + + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_heap.h b/2.5/boards/triface/templates/kernel/cfg/cfg_heap.h new file mode 100644 index 00000000..dc4b1fa3 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_heap.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_i2c.h b/2.5/boards/triface/templates/kernel/cfg/cfg_i2c.h new file mode 100644 index 00000000..7df0d097 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_i2c.h @@ -0,0 +1,88 @@ +/** + * \file + * + * + * \brief Configuration file for I2C module. + * + * \author Daniele Basile + */ + +#ifndef CFG_I2C_H +#define CFG_I2C_H + +/** +*Comunication frequency. +* +* $WIZ$ type = "int" +*/ +#define CONFIG_I2C_FREQ 100000UL + +/** + * I2C start timeout. + * For how many milliseconds the i2c_start + * should try to get an ACK before + * returning error. + * + * $WIZ$ type = "int" + */ +#define CONFIG_I2C_START_TIMEOUT 100 + +/** + * I2C backend the driver should use. + * + * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. + * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. + * \see drv/i2c.h for more information. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "i2c_backend" + */ +#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2C_LOG_LEVEL LOG_LVL_INFO + +/** + * module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2C_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2C_H */ + + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_i2s.h b/2.5/boards/triface/templates/kernel/cfg/cfg_i2s.h new file mode 100644 index 00000000..52fa8848 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_i2s.h @@ -0,0 +1,75 @@ +/** + * \file + * + * + * \brief Configuration file for I2S module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_I2S_H +#define CFG_I2S_H + +/** + * Length of each play buffer. + * + * $WIZ$ type = "int" + */ +#define CONFIG_PLAY_BUF_LEN 8192 + +/** + * Sampling frequency of the audio file. + * + * $WIZ$ type = "int" + * $WIZ$ min = 32000 + * $WIZ$ max = 192000 + */ +#define CONFIG_SAMPLE_FREQ 44100UL + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define I2S_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define I2S_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_I2S_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_ini_reader.h b/2.5/boards/triface/templates/kernel/cfg/cfg_ini_reader.h new file mode 100644 index 00000000..702c78ee --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_ini_reader.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for ini reader module. + * + * \version $Id$ + * + * \author Luca Ottaviano + */ + +#ifndef CFG_INI_READER_H +#define CFG_INI_READER_H + +/** + * Maximum ini file line length (chars). + * $WIZ$ type = "int"; min = 1 + */ +#define CONFIG_INI_MAX_LINE_LEN 64 + +#endif /* CFG_INI_READER_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_kbd.h b/2.5/boards/triface/templates/kernel/cfg/cfg_kbd.h new file mode 100644 index 00000000..116f3318 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method. $WIZ$ supports = "False" +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps. $WIZ$ type = "boolean" +#define CONFIG_KBD_BEEP 0 + +/// Enable long pression handler for keys. $WIZ$ type = "boolean" +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" +#define CONFIG_KBD_SCHED 0 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_keytag.h b/2.5/boards/triface/templates/kernel/cfg/cfg_keytag.h new file mode 100644 index 00000000..8bedadf6 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_keytag.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for keytag module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KEYTAG_H +#define CFG_KEYTAG_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_KEYTAG_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_KEYTAG_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max buffer lenght + * $WIZ$ type = "int" + */ +#define CONFIG_TAG_MAX_LEN 14U + +#endif /* CFG_KEYTAG_H */ + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_kfile.h b/2.5/boards/triface/templates/kernel/cfg/cfg_kfile.h new file mode 100644 index 00000000..0ebed7b1 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_kfile.h @@ -0,0 +1,61 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 0 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_lcd_32122a.h b/2.5/boards/triface/templates/kernel/cfg/cfg_lcd_32122a.h new file mode 100644 index 00000000..5a9b3ca7 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_lcd_32122a.h @@ -0,0 +1,63 @@ +/** + * \file + * + * + * \brief Displaytech 32122A LCD driver configuration file. + * + * \author Bernie Innocenti + * \author Stefano Fedrigo + * + */ +#ifndef CFG_LCD_32122A_H +#define CFG_LCD_32122A_H + +/** + * Enable soft interrupt to refresh the LCD. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * Enable wait macro when display is busy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_WAIT 0 + +/** + * Display refresh time 32122a. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_LCD_REFRESH 100 + +#endif /* CFG_LCD_32122A_H */ + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_lcd_hd44.h b/2.5/boards/triface/templates/kernel/cfg/cfg_lcd_hd44.h new file mode 100644 index 00000000..78f1f20b --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_lcd_hd44.h @@ -0,0 +1,55 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + * + * \author Daniele Basile + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 1 + +#endif /* CFG_LCD_H */ + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_lm75.h b/2.5/boards/triface/templates/kernel/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_md2.h b/2.5/boards/triface/templates/kernel/cfg/cfg_md2.h new file mode 100644 index 00000000..22ec7dbe --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_md2.h @@ -0,0 +1,54 @@ +/** + * \file + * + * + * \brief Configuration file for MD2 module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_MD2_H +#define CFG_MD2_H + +/** + * Size of block for MD2 algorithm. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_MD2_BLOCK_LEN 16 + +/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" +#define CONFIG_MD2_STD_PERM 0 + +#endif /* CFG_MD2_H */ + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_monitor.h b/2.5/boards/triface/templates/kernel/cfg/cfg_monitor.h new file mode 100644 index 00000000..6391b407 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 1 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_nmea.h b/2.5/boards/triface/templates/kernel/cfg/cfg_nmea.h new file mode 100644 index 00000000..9249a9af --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_nmea.h @@ -0,0 +1,85 @@ +/** + * \file + * + * + * \brief Configuration file for NMEA module. + * + * \author Daniele Basile + */ + +#ifndef CFG_NMEA_H +#define CFG_NMEA_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define NMEA_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define NMEA_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Maximum number of sentence parsers supported. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCES 8 + +/** + * Max length of a complete sentence. The standard says 82 bytes, but its probably + * better to go at least 128 since some units don't adhere to the 82 bytes + * especially for proprietary sentences. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 + +/** + * Max tokens in one sentence. 24 is enough for any standard sentence. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NMEAP_MAX_TOKENS 24 + +#endif /* CFG_NMEA_H */ + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_parser.h b/2.5/boards/triface/templates/kernel/cfg/cfg_parser.h new file mode 100644 index 00000000..572b4a24 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_parser.h @@ -0,0 +1,46 @@ +/** + * \file + * + * + * \brief Configuration file for parser module. + * + * \author Daniele Basile + */ + +#ifndef CFG_PARSER_H +#define CFG_PARSER_H + + + +#endif /* CFG_PARSER_H */ + + + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_phase.h b/2.5/boards/triface/templates/kernel/cfg/cfg_phase.h new file mode 100644 index 00000000..57202930 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_phase.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for phase module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PHASE_H +#define CFG_PHASE_H + +/** + * Max value of the duty cycle on triac. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_DUTY 100 + +/** + * Max value of the triac power. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TRIAC_MAX_POWER 100 + +#endif /* CFG_PHASE_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_pocketbus.h b/2.5/boards/triface/templates/kernel/cfg/cfg_pocketbus.h new file mode 100644 index 00000000..aa0b090b --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_pocketbus.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for pocketbus module. + * + * \author Daniele Basile + */ + +#ifndef CFG_POCKETBUS_H +#define CFG_POCKETBUS_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define POCKETBUS_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define POCKETBUS_LOG_FORMAT LOG_FMT_TERSE + + +/** + *Buffer len for pockebus protocol. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_POCKETBUS_BUFLEN 128 + +/** + * Command replay timeout in milliseconds. + * $WIZ$ type = "int" + */ +#define CONFIG_POCKETBUS_CMD_REPLY_TIMEOUT 50 + +#endif /* CFG_POCKETBUS_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_proc.h b/2.5/boards/triface/templates/kernel/cfg/cfg_proc.h new file mode 100644 index 00000000..7e64c498 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 0 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2048L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_pwm.h b/2.5/boards/triface/templates/kernel/cfg/cfg_pwm.h new file mode 100644 index 00000000..6627ee2d --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_pwm.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for PWM module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_PWM_H +#define CFG_PWM_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define PWM_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define PWM_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PWM_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_ramp.h b/2.5/boards/triface/templates/kernel/cfg/cfg_ramp.h new file mode 100644 index 00000000..1aeb8a89 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_ramp.h @@ -0,0 +1,116 @@ + /** + * \file + * + * + * \brief Configuration file Ramp algorithm module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_RAMP_H +#define CFG_RAMP_H + +/** + * Define whether the ramp will use floating point calculation within ramp_evaluate(). + * Otherwise, a less precise fixed point version will be used, which is faster on + * platforms which do no support floating point operations. + * + * \note Floating point operations will be always done within ramp_compute() to + * precalculate values, so there has to be at least a floating point emulation support. + * + * $WIZ$ type = "boolean" + */ +#define RAMP_USE_FLOATING_POINT 0 + + +#if !RAMP_USE_FLOATING_POINT + + /** + * Number of least-significant bits which are stripped away during ramp evaluation. + * This setting allows to specify larger ramps at the price of less precision. + * + * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. + * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum + * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 + * brings the maximum length to 13.4 secs, at the price of less precision. + * + * ramp_compute() will check that the length is below the maximum allowed through + * a runtime assertion. + * + * \note This macro is used only for the fixed-point version of the ramp. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + * $WIZ$ max = 32 + */ + #define RAMP_CLOCK_SHIFT_PRECISION 2 +#endif + + +/** +* Negative pulse width for ramp. +* $WIZ$ type = "int" +* $WIZ$ min = 1 +*/ +#define RAMP_PULSE_WIDTH 50 + +/** + * Default ramp time (microsecs). + * $WIZ$ type = "int" + * $WIZ$ min = 1000 + */ +#define RAMP_DEF_TIME 6000000UL +/** + * Default ramp maxfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MAXFREQ 5000 +/** + * Default ramp minfreq (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define RAMP_DEF_MINFREQ 200 +/** + * Default ramp powerrun (deciampere). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERRUN 10 +/** + * Default ramp poweridle (Hz). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define RAMP_DEF_POWERIDLE 1 + +#endif /* CFG_RAMP_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_randpool.h b/2.5/boards/triface/templates/kernel/cfg/cfg_randpool.h new file mode 100644 index 00000000..83285984 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_randpool.h @@ -0,0 +1,56 @@ +/** + * \file + * + * + * \brief Configuration file for randpool module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_RANDPOOL_H +#define CFG_RANDPOOL_H + + +/** + * Define a size, in byte, of entropy pool. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_SIZE_ENTROPY_POOL 64 + +/// Enable timer in randpool algo. $WIZ$ type = "boolean" +#define CONFIG_RANDPOOL_TIMER 1 + +#endif /* CFG_RANDPOOL_H */ + + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_sem.h b/2.5/boards/triface/templates/kernel/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_ser.h b/2.5/boards/triface/templates/kernel/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_signal.h b/2.5/boards/triface/templates/kernel/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_spi_bitbang.h b/2.5/boards/triface/templates/kernel/cfg/cfg_spi_bitbang.h new file mode 100644 index 00000000..6e9a96bc --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_spi_bitbang.h @@ -0,0 +1,52 @@ +/** + * \file + * + * + * \brief Configuration file for SPI bitbang module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_SPI_BITBANG_H +#define CFG_SPI_BITBANG_H + +/** + * Set data order for emulated SPI. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ordet_bit_list" + */ +#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST + +#endif /* CFG_SPI_BITBANG_H */ + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_stepper.h b/2.5/boards/triface/templates/kernel/cfg/cfg_stepper.h new file mode 100644 index 00000000..e086065c --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_stepper.h @@ -0,0 +1,70 @@ +/** + * \file + * + * + * \brief Configuration file for stepper motor module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_STEPPER_H +#define CFG_STEPPER_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define STEPPER_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define STEPPER_LOG_FORMAT LOG_FMT_TERSE + +/** + * Max number of the stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_NUM_STEPPER_MOTORS 6 + +/** + * Max number of the timer usable on target to drive stepper motor. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_TC_STEPPER_MAX_NUM 6 + +#endif /* CFG_STEPPER_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_tas5706a.h b/2.5/boards/triface/templates/kernel/cfg/cfg_tas5706a.h new file mode 100644 index 00000000..e1112c0f --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_tas5706a.h @@ -0,0 +1,51 @@ +/** + * \file + * + * + * \brief Configuration file for the TAS5706A module. + * + * \version $Id$ + * \author Luca Ottaviano + */ + +#ifndef CFG_TAS5706A_H +#define CFG_TAS5706A_H + +/** + * Maximum output volume for TAS chip [dB]. + * + * $WIZ$ type = "int" + * $WIZ$ min = -100 + * $WIZ$ max = 24 + */ +#define CONFIG_TAS_MAX_VOL -39 + +#endif /* CFG_TAS5706A_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_thermo.h b/2.5/boards/triface/templates/kernel/cfg/cfg_thermo.h new file mode 100644 index 00000000..2734f899 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_thermo.h @@ -0,0 +1,71 @@ +/** + * \file + * + * + * \brief Configuration file for thermo module. + * + * \author Daniele Basile + */ + +#ifndef CFG_THERMO_H +#define CFG_THERMO_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_THERMO_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_THERMO_LOG_FORMAT LOG_FMT_TERSE + + +/** + * Interval at which thermo control is performed [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_INTERVAL_MS 100 + +/** + * Number of different samples we interpolate over to get the hifi temperature. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 + +#endif /* CFG_THERMO_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_timer.h b/2.5/boards/triface/templates/kernel/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_wdt.h b/2.5/boards/triface/templates/kernel/cfg/cfg_wdt.h new file mode 100644 index 00000000..9f4caae9 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_wdt.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Configuration file for watchdog module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_WDT_H +#define CFG_WDT_H + +/// Enable watchdog timer. $WIZ$ type = "autoenabled" +#define CONFIG_WATCHDOG 0 + +#endif /* CFG_WDT_H */ + + diff --git a/2.5/boards/triface/templates/kernel/cfg/cfg_xmodem.h b/2.5/boards/triface/templates/kernel/cfg/cfg_xmodem.h new file mode 100644 index 00000000..38db7359 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/cfg/cfg_xmodem.h @@ -0,0 +1,79 @@ +/** + * \file + * + * + * \brief Configuration file for xmodem module. + * + * \author Daniele Basile + */ + +#ifndef CFG_XMODEM_H +#define CFG_XMODEM_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define CONFIG_XMODEM_LOG_LEVEL LOG_LVL_ERR +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define CONFIG_XMODEM_LOG_FORMAT LOG_FMT_TERSE + + +/// Enable Rx. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_RECV 1 + +/// Enable TX. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_SEND 1 + +/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" +#define CONFIG_XMODEM_1KCRC 1 + +/** + * Max retries before giving up. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXRETRIES 15 + +/** + * Max retries before switching to BCC. + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_XMODEM_MAXCRCRETRIES 7 + +#endif /* CFG_XMODEM_H */ + diff --git a/2.5/boards/triface/templates/kernel/kernel.mk b/2.5/boards/triface/templates/kernel/kernel.mk new file mode 100644 index 00000000..8169e703 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/kernel.mk @@ -0,0 +1,90 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the kernel_user.mk file instead. +# + +# Constants automatically defined by the selected modules +kernel_DEBUG = 1 + +# Our target application +TRG += kernel + +kernel_PREFIX = "avr-" + +kernel_SUFFIX = "" + +kernel_SRC_PATH = boards/triface/templates/kernel + +kernel_HW_PATH = boards/triface + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CSRC INSTEAD! +kernel_WIZARD_CSRC = \ + bertos/kern/kfile.c \ + bertos/kern/signal.c \ + bertos/cpu/avr/drv/timer_avr.c \ + bertos/kern/sem.c \ + bertos/mware/formatwr.c \ + bertos/struct/heap.c \ + bertos/kern/monitor.c \ + bertos/drv/timer.c \ + bertos/mware/event.c \ + bertos/kern/proc.c \ + bertos/cpu/avr/drv/ser_avr.c \ + bertos/drv/ser.c \ + bertos/mware/hex.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_PCSRC INSTEAD! +kernel_WIZARD_PCSRC = \ + bertos/mware/formatwr.c \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CPPASRC INSTEAD! +kernel_WIZARD_CPPASRC = \ + bertos/cpu/avr/hw/switch_ctx_avr.S \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_CXXSRC INSTEAD! +kernel_WIZARD_CXXSRC = \ + \ + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE kernel_USER_ASRC INSTEAD! +kernel_WIZARD_ASRC = \ + \ + # + +kernel_CPPFLAGS = -D'CPU_FREQ=(14745600UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$(kernel_HW_PATH) -I$(kernel_SRC_PATH) $(kernel_CPU_CPPFLAGS) $(kernel_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_LDFLAGS = $(kernel_CPU_LDFLAGS) $(kernel_WIZARD_LDFLAGS) $(kernel_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPAFLAGS = $(kernel_CPU_CPPAFLAGS) $(kernel_WIZARD_CPPAFLAGS) $(kernel_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CSRC = $(kernel_CPU_CSRC) $(kernel_WIZARD_CSRC) $(kernel_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_PCSRC = $(kernel_CPU_PCSRC) $(kernel_WIZARD_PCSRC) $(kernel_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CPPASRC = $(kernel_CPU_CPPASRC) $(kernel_WIZARD_CPPASRC) $(kernel_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_CXXSRC = $(kernel_CPU_CXXSRC) $(kernel_WIZARD_CXXSRC) $(kernel_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_ASRC = $(kernel_CPU_ASRC) $(kernel_WIZARD_ASRC) $(kernel_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +kernel_MCU = atmega1281 +kernel_CPU_CPPFLAGS = -Os -Ibertos/cpu/avr/ +kernel_PROGRAMMER_CPU = atmega1281 +kernel_STOPFLASH_SCRIPT = bertos/prg_scripts/avr/stopflash.sh +kernel_STOPDEBUG_SCRIPT = bertos/prg_scripts/none.sh +kernel_DEBUG_SCRIPT = bertos/prg_scripts/nodebug.sh +kernel_FLASH_SCRIPT = bertos/prg_scripts/avr/flash.sh + +include $(kernel_SRC_PATH)/kernel_user.mk diff --git a/2.5/boards/triface/templates/kernel/kernel_user.mk b/2.5/boards/triface/templates/kernel/kernel_user.mk new file mode 100644 index 00000000..6dfb4d8c --- /dev/null +++ b/2.5/boards/triface/templates/kernel/kernel_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +kernel_PROGRAMMER_TYPE = none +kernel_PROGRAMMER_PORT = none + +# Files included by the user. +kernel_USER_CSRC = \ + $(kernel_SRC_PATH)/main.c \ + # + +# Files included by the user. +kernel_USER_PCSRC = \ + # + +# Files included by the user. +kernel_USER_CPPASRC = \ + # + +# Files included by the user. +kernel_USER_CXXSRC = \ + # + +# Files included by the user. +kernel_USER_ASRC = \ + # + +# Flags included by the user. +kernel_USER_LDFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +kernel_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/boards/triface/templates/kernel/main.c b/2.5/boards/triface/templates/kernel/main.c new file mode 100644 index 00000000..ff8b2f12 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/main.c @@ -0,0 +1,112 @@ +/** + * \file + * + * + * \author Andrea Righi + * + * \brief Kernel project. + * + * This is a minimalist kernel project: it just initializes the hardware and + * creates an independent process to blink an LED, while the main loop + * continues to monitor the stack utilization of all the processes. + */ + +#include "hw/hw_led.h" + +#include + +#include +#include + +#include +#include + +#include +#include + +static Serial out; + +static void init(void) +{ + /* Enable all the interrupts */ + IRQ_ENABLE; + + /* Initialize debugging module (allow kprintf(), etc.) */ + kdbg_init(); + /* Initialize system timer */ + timer_init(); + /* Initialize UART0 */ + ser_init(&out, SER_UART0); + /* Configure UART0 to work at 115.200 bps */ + ser_setbaudrate(&out, 115200); + /* Initialize LED driver */ + LED_INIT(); + + /* + * Kernel initialization: processes (allow to create and dispatch + * processes using proc_new()). + */ + proc_init(); +} + +static void NORETURN led_process(void) +{ + int i; + + /* Periodically blink the led (toggle each 100 ms) */ + for (i = 0; ; i = !i) + { + if (i) + LED_ON(); + else + LED_OFF(); + timer_delay(100); + } +} + +int main(void) +{ + /* Hardware initialization */ + init(); + + /* Create a new child process */ + proc_new(led_process, NULL, KERN_MINSTACKSIZE * 2, NULL); + + /* + * The main process is kept to periodically report the stack + * utilization of all the processes (1 probe per second). + */ + while (1) + { + monitor_report(); + timer_delay(1000); + } +} diff --git a/2.5/boards/triface/templates/kernel/project.bertos b/2.5/boards/triface/templates/kernel/project.bertos new file mode 100644 index 00000000..472b7cb0 --- /dev/null +++ b/2.5/boards/triface/templates/kernel/project.bertos @@ -0,0 +1,85 @@ +(dp0 +S'BERTOS_PATH' +p1 +S'../../../..' +p2 +sS'SELECTED_FREQ' +p3 +V14745600 +p4 +sS'WIZARD_VERSION' +p5 +I3 +sS'PROJECT_NAME' +p6 +Vkernel +p7 +sS'TOOLCHAIN' +p8 +(dp9 +S'target' +p10 +Vavr +p11 +sS'thread' +p12 +Vsingle +p13 +sS'configured' +p14 +V../configure --prefix=/usr/local/avr-4.3.2/ --target=avr --enable-languages=c,c++ --disable-nls --disable-libssp --with-dwarf2 +p15 +sS'version' +p16 +V4.3.2 +p17 +sS'build' +p18 +VGCC +p19 +sS'path' +p20 +V/opt/avr-4.3.2/bin/avr-gcc +p21 +ssS'ENABLED_MODULES' +p22 +(lp23 +S'ser' +p24 +aS'kernel' +p25 +aS'monitor' +p26 +aS'formatwr' +p27 +aS'semaphores' +p28 +aS'kfile' +p29 +aS'heap' +p30 +aS'signal' +p31 +aS'timer' +p32 +aS'debug' +p33 +asS'CPU_NAME' +p34 +VATmega1281 +p35 +sS'PROJECT_HW_PATH' +p36 +S'../..' +p37 +sS'PROJECT_SRC_PATH' +p38 +S'.' +p39 +sS'PRESET' +p40 +I01 +sS'OUTPUT' +p41 +(lp42 +s. \ No newline at end of file diff --git a/2.5/doc/Mainpage.online b/2.5/doc/Mainpage.online new file mode 100644 index 00000000..07a36d88 --- /dev/null +++ b/2.5/doc/Mainpage.online @@ -0,0 +1,100 @@ +/*! + + + +\mainpage + +\section overview Overview + +BeRTOS is a real-time operating system designed for building applications +for embedded systems, like reference boards, test boards, or custom boards. + +It has a modular structure: its components can be used in very different +environments, from 8-bit processor to Linux and Win32 hosted application +(for debug purpose), using a wide range of compilers. + +\section history History and Motivation + +BeRTOS was born as a extremely modular, highly optimized and fine-tuned +operating system for embedded programming. +As a result, each module has its own scope and can be used alone or in +cooperation with other modules. +It's even possible to use most of the drivers without activating the kernel module. + +We have grown it following our guidelines: simplicity and beauty. +These guidelines made it possible to evolve it in a full-featured real +time operating system, with more modularity than many other embedded OSes, +without giving up reliability and performace. + +To achieve the highest possible reusability, most BeRTOS components are +designed for fine-grained modularity and minimal external dependencies. +Most non-essential features can be configured out for applications with small +memory footprint requirements. + +\section features Features + + - multitasking kernel with IPC, semaphores, priority levels; + - a comprehensive set of generic drivers for a wide range of devices, + which can be easily customized to the actual hardware: timer, serial, + adc, ntc, pwm, stepper motors, dc motors, lcd, keyboards, buzzer, eeprom; + - full graphic subsystem for simple displays, with font support, bitmaps, + clipping, text formatting, interactive menus; + - simple console with command parser; + - readline-like support for command history; + - entropy generator and random numbers generator optimized for embedded + systems; + - checksumming and hashing functions (CRC, MD2); + - full hash-table implementation with double-hashing collision resolution; + - XMODEM protocol implementation; + - RLE compression algorithm; + +\section structure Directory Structure + +The modules are sorted in subdirectories by their category: + + - app/ : demo applications; + - bertos/algo/ : algorithms; + - bertos/cfg/ : configuration stuff; + - bertos/drv/ : hardware drivers; + - bertos/dt/ : experimental object oriented gui toolkit; + - bertos/emul/ : Qt-based emulator framework for embedded applications; + - bertos/fonts/ : fonts; + - bertos/fs/ : file system related stuff; + - bertos/gfx/ : general purpose graphics routines; + - bertos/gui/ : widgets for simple displays; + - bertos/hw/ : hardware-specific declarations; + - bertos/icons/ : conversion tool from image TXT format to LCD bitmap; + - bertos/kern/ : multitasking kernel; + - bertos/mware/ : algorithms, other standalone code; + - bertos/struct/ : containers and other data structures; + - bertos/os/ : OS-abstraction layers for hosted environments; + - doc/ : documentation; + +The top-level directory contains a few support headers that are meant to be +usable by any C/C++ embedded or hosted application. + +\section license License + +BeRTOS is provided under the term of the GNU General Public License +(see LICENSE.GPL) with following exception: + +\verbatim + +As a special exception, you may use this file as part of a free software +library without restriction. Specifically, if other files instantiate +templates or use macros or inline functions from this file, or you compile +this file and link it with other files to produce an executable, this +file does not by itself cause the resulting executable to be covered by +the GNU General Public License. This exception does not however +invalidate any other reasons why the executable file might be covered by +the GNU General Public License. + +\endverbatim + +*/ diff --git a/2.5/doc/Mainpage.snapshot b/2.5/doc/Mainpage.snapshot new file mode 100644 index 00000000..5e50e27b --- /dev/null +++ b/2.5/doc/Mainpage.snapshot @@ -0,0 +1,103 @@ +/*! + + + +\mainpage + +This documentation is generated from BeRTOS SVN. As such, it may contain modules +and/or additional documentation not present in official releases. + +\section overview Overview + +BeRTOS is a real-time operating system designed for building applications +for embedded systems, like reference boards, test boards, or custom boards. + +It has a modular structure: its components can be used in very different +environments, from 8-bit processor to Linux and Win32 hosted application +(for debug purpose), using a wide range of compilers. + +\section history History and Motivation + +BeRTOS was born as a extremely modular, highly optimized and fine-tuned +operating system for embedded programming. +As a result, each module has its own scope and can be used alone or in +cooperation with other modules. +It's even possible to use most of the drivers without activating the kernel module. + +We have grown it following our guidelines: simplicity and beauty. +These guidelines made it possible to evolve it in a full-featured real +time operating system, with more modularity than many other embedded OSes, +without giving up reliability and performace. + +To achieve the highest possible reusability, most BeRTOS components are +designed for fine-grained modularity and minimal external dependencies. +Most non-essential features can be configured out for applications with small +memory footprint requirements. + +\section features Features + + - multitasking kernel with IPC, semaphores, priority levels; + - a comprehensive set of generic drivers for a wide range of devices, + which can be easily customized to the actual hardware: timer, serial, + adc, ntc, pwm, stepper motors, dc motors, lcd, keyboards, buzzer, eeprom; + - full graphic subsystem for simple displays, with font support, bitmaps, + clipping, text formatting, interactive menus; + - simple console with command parser; + - readline-like support for command history; + - entropy generator and random numbers generator optimized for embedded + systems; + - checksumming and hashing functions (CRC, MD2); + - full hash-table implementation with double-hashing collision resolution; + - XMODEM protocol implementation; + - RLE compression algorithm; + +\section structure Directory Structure + +The modules are sorted in subdirectories by their category: + + - app/ : demo applications; + - bertos/algo/ : algorithms; + - bertos/cfg/ : configuration stuff; + - bertos/drv/ : hardware drivers; + - bertos/dt/ : experimental object oriented gui toolkit; + - bertos/emul/ : Qt-based emulator framework for embedded applications; + - bertos/fonts/ : fonts; + - bertos/fs/ : file system related stuff; + - bertos/gfx/ : general purpose graphics routines; + - bertos/gui/ : widgets for simple displays; + - bertos/hw/ : hardware-specific declarations; + - bertos/icons/ : conversion tool from image TXT format to LCD bitmap; + - bertos/kern/ : multitasking kernel; + - bertos/mware/ : algorithms, other standalone code; + - bertos/struct/ : containers and other data structures; + - bertos/os/ : OS-abstraction layers for hosted environments; + - doc/ : documentation; + +The top-level directory contains a few support headers that are meant to be +usable by any C/C++ embedded or hosted application. + +\section license License + +BeRTOS is provided under the term of the GNU General Public License +(see LICENSE.GPL) with following exception: + +\verbatim + +As a special exception, you may use this file as part of a free software +library without restriction. Specifically, if other files instantiate +templates or use macros or inline functions from this file, or you compile +this file and link it with other files to produce an executable, this +file does not by itself cause the resulting executable to be covered by +the GNU General Public License. This exception does not however +invalidate any other reasons why the executable file might be covered by +the GNU General Public License. + +\endverbatim + +*/ diff --git a/2.5/doc/README.bertos b/2.5/doc/README.bertos new file mode 100644 index 00000000..65edccce --- /dev/null +++ b/2.5/doc/README.bertos @@ -0,0 +1,102 @@ +/*! + + + +\mainpage + +\section overview Overview + +BeRTOS is a real-time operating system designed for building applications +for embedded systems, like reference boards, test boards, or custom boards. + +It has a modular structure: its components can be used in very different +environments, from 8-bit processor to Linux and Win32 hosted application +(for debug purpose), using a wide range of compilers. + +\section history History and Motivation + +BeRTOS was born as a extremely modular, highly optimized and fine-tuned +operating system for embedded programming. +As a result, each module has its own scope and can be used alone or in +cooperation with other modules. +It's even possible to use most of the drivers without activating the kernel module. + +We have grown it following our guidelines: simplicity and beauty. +These guidelines made it possible to evolve it in a full-featured real +time operating system, with more modularity than many other embedded OSes, +without giving up reliability and performace. + +To achieve the highest possible reusability, most BeRTOS components are +designed for fine-grained modularity and minimal external dependencies. +Most non-essential features can be configured out for applications with small +memory footprint requirements. + +\section features Features + + - multitasking kernel with IPC, semaphores, priority levels; + - a comprehensive set of generic drivers for a wide range of devices, + which can be easily customized to the actual hardware: timer, serial, + adc, ntc, pwm, stepper motors, dc motors, lcd, keyboards, buzzer, eeprom; + - full graphic subsystem for simple displays, with font support, bitmaps, + clipping, text formatting, interactive menus; + - simple console with command parser; + - readline-like support for command history; + - entropy generator and random numbers generator optimized for embedded + systems; + - checksumming and hashing functions (CRC, MD2); + - full hash-table implementation with double-hashing collision resolution; + - XMODEM protocol implementation; + - RLE compression algorithm; + +\section structure Directory Structure + +The modules are sorted in subdirectories by their category: + + - app/ : demo applications; + - bertos/algo/ : algorithms; + - bertos/cfg/ : configuration stuff; + - bertos/drv/ : hardware drivers; + - bertos/dt/ : experimental object oriented gui toolkit; + - bertos/emul/ : Qt-based emulator framework for embedded applications; + - bertos/fonts/ : fonts; + - bertos/fs/ : file system related stuff; + - bertos/gfx/ : general purpose graphics routines; + - bertos/gui/ : widgets for simple displays; + - bertos/hw/ : hardware-specific declarations; + - bertos/icons/ : conversion tool from image TXT format to LCD bitmap; + - bertos/kern/ : multitasking kernel; + - bertos/mware/ : algorithms, other standalone code; + - bertos/struct/ : containers and other data structures; + - bertos/os/ : OS-abstraction layers for hosted environments; + - doc/ : documentation; + +The top-level directory contains a few support headers that are meant to be +usable by any C/C++ embedded or hosted application. + +See the \ref dev_status page for information about the various drivers. + +\section license License + +BeRTOS is provided under the term of the GNU General Public License +(see LICENSE.GPL) with following exception: + +\verbatim + +As a special exception, you may use this file as part of a free software +library without restriction. Specifically, if other files instantiate +templates or use macros or inline functions from this file, or you compile +this file and link it with other files to produce an executable, this +file does not by itself cause the resulting executable to be covered by +the GNU General Public License. This exception does not however +invalidate any other reasons why the executable file might be covered by +the GNU General Public License. + +\endverbatim + +*/ diff --git a/2.5/doc/STATUS b/2.5/doc/STATUS new file mode 100644 index 00000000..c437d00d --- /dev/null +++ b/2.5/doc/STATUS @@ -0,0 +1,321 @@ +/*! + + + + + + + + +\page dev_status BeRTOS Development Status + +If you are looking for the list of BeRTOS ports or a detailed overview of all modules completeness and stability this is the right place. + +BeRTOS is quite stable (it is used in production environments) but it is also a very large project, so all of its parts may not be at the same level. + +Table of contents: + + \li \ref kernel + \li \ref compilers + \li \ref core_drivers + \li \ref internal_peripherals + \li \ref independant_drivers + \li \ref emulator + \li \ref algorithms + \li \ref graphics + \li \ref networking + \li \ref fs + \li \ref data_structures + \li \ref mware + +\section kernel Kernel +BeRTOS features a cooperative kernel with synchronization primitives. + +Embedded systems are mostly I/O bound systems. In these systems the microprocessor/microcontroller spends the most part of its computing power doing... absolutely nothing :-) + +Since the system simply waits for external events to happen we decided to implement a strong and robust cooperative kernel with very low memory footprint and high modularity. This allows the kernel to be used on a variety of different CPUs, even the smaller ones. +Currently the kernel code is very stable. + + Kernel features : + \li \link preempt.c Cooperative and preemptive \endlink round-robin scheduling. + \li \link monitor.h Stack process monitor \endlink, useful to prevent stack overflows. + \li \link msg.h Inter-process messaging system \endlink (with very low overhead). + \li \link sem.h Binary semaphores \endlink. + \li \link signal.c Signals \endlink. + +We have plans to add, as soon as possible, a preemptive scheduler , browse kernel source code to see the latest additions. + +The kernel has a port layer (a single assembly function) that needs to be reimplemented each time a new CPU is added. +Here is a list of currently available CPU family ports: + + + + + + + + + + +
CPU Family Port status
ARM stable
Atmel AVR stable
Freescale DSP56800 unmantained
Intel i196 unmantained
PowerPC \ref emulator only
Intel/AMD x86 \ref emulator only
Intel/AMD x86-64 \ref emulator only
+ +\section compilers Compilers +BeRTOS is primarily intended to be used with open source tools such as GCC, although it supports other compilers too. It is possible to develop with BeRTOS on Linux, Windows and Mac. + +For every port we have indicated the current compiler used and were to find a suitable development suite: + + + + + + + + + + + +
CPU Family Compiler Linux/Mac Toolchain Windows Toolchain
ARM GCC Sourcery G++ toolchain (open source) BeRTOS ARM IDE (open source)
ARM IAR (unmantained) none http://www.iar.com (proprietary)
AVR GCC AVR Toolchain installer (open source) BeRTOS AVR IDE (open source)
DSP56800 CodeWarrior (unmantained) none CodeWarrior (proprietary)
i196 fillme fillme fillme
PowerPC GCC use your system GCC none
x86 GCC use your system GCC http://www.mingw.org/ (open source)
x86 MSVC (unmantained) none Visual Studio (proprietary)
x86-64 GCC use your system GCC none
+ + +\section core_drivers Core Drivers +BeRTOS is not only a kernel, it aims to supply full operating system services. +To achieve this we need at least some core drivers for every CPU port. + +These drivers are: system timer , debug system and serial comm driver . + +Here is the list of CPU whose internal core drivers are supported: + + + + + + + + + + + + + + + + + + + + + +
Family CPU Core driver status
ARM AT91SAM7S64 stable
ARM AT91SAM7S128 stable
ARM AT91SAM7S256 stable
ARM AT91SAM7S512 stable
ARM AT91SAM7X128 stable
ARM AT91SAM7X256 stable
ARM AT91SAM7X512 stable
AVR ATMega8 stable
AVR ATMega32 stable
AVR ATMega64 stable
AVR ATMega103 stable
AVR ATMega128 stable
AVR ATMega168 stable
AVR ATMega1281 stable
DSP56800 all unmantained
i196 all unmantained
PowerPC all see \ref emulator
x86 all see \ref emulator
x86-64 all see \ref emulator
+ +Adding CPU support for an already present CPU family is quite simple since hardware manufacturers share peripherals design between the same CPU cores. + +\section internal_peripherals MCU Internal peripheral drivers +Since BeRTOS aims to supply full operating system services, for every CPU port we try to implement as much drivers as possible. This section covers the current development status for MCU Internal peripheral drivers. + + \li MCU family: Atmel AVR + + + + + + + + + +
Driver Status
\link adc_avr.c ADC \endlink stable
\link flash_avr.c Internal Flash \endlink stable
UART stable
SPI stable
Timer stable
\link i2c_avr.c TWI \endlink stable
+ + To get up to date informations look at the AVR drivers source code. + + \li MCU family: Atmel AT91 ARM + + + + + + + + + + +
Driver Status
UART stable
SPI stable
Timers stable
TWI beta
ADC beta
PWM beta
\link i2s_at91.h I2S \endlink digital audio bus stable
+ + To get up to date informations look at the ARM drivers source code. + + \li MCU family: Freescale DSP56800 + + Only core drivers are supported. + + \li MCU family: Intel i196 + + Only core drivers are supported. + + \li MCU family: PowerPC + + See \ref emulator. + + \li MCU family: x86 + + See \ref emulator. + + \li MCU family: x86-64 + + See \ref emulator. + +\section independant_drivers Generic CPU independent drivers +BeRTOS supplies a full set of CPU independent generic hardware drivers. To achieve this all drivers are structured to have an hardware abstraction layer (HAL) that isolate CPU specific code and makes porting to new CPU easy. +Current driver list: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Driver Status
\link adc.h ADC API \endlink stable
\link buzzer.h Buzzer \endlink stable
\link dataflash.h Atmel Dataflash \endlink stable
\link eeprom.h I2C EEPROM \endlink stable
\link flash25.h AT25Fxxx Atmel flash memories \endlink beta
\link ft245rl.h FT245RL USB to parallel converter \endlink beta
\link kbd.h Keyboard \endlink stable
\link i2c.h I2C \endlink with bitbang support stable
Displaytech 32122A Graphic LCD stable
\link dc_motor.h DC Motor with PID \endlink stable
\link lcd_text.h Alphanumeric LCD \endlink stable
\link lm75.h LM75 temperature sensor \endlink stable
\link mcp41.h MPC41 digital potentiometer \endlink stable
\link mpxx6115a.h MPxx6115A pressure sensor \endlink stable
\link ntc.h NTC \endlink stable
\link phase.h TRIAC phase partialization \endlink stable
\link pwm.h PWM API \endlink beta
\link pcf8574.h PCF85974 I2C port expander \endlink beta
\link sd.h Secure Digital card API \endlink stable
\link ser.h Serial API \endlink stable
\link spi_bitbang.h Bitbanged SPI \endlink stable
\link tas5706a.h TAS5706A \endlink digital audio DSP stable
\link tc520.h TC520 ADC \endlink obsolete
\link thermo.h Thermostat \endlink stable
\link timer.h System timer API \endlink stable
\link tmp123.h TMP123 temperature sensor \endlink stable
\link stepper.h Stepper motor with ramps \endlink stable
Watchdog beta
+ +To get up to date informations look at the drivers source code. + +\section emulator Emulator +BeRTOS features can be emulated on a common PC, check DemoApp. + +The emulator uses Qt to display emulated I/O devices in a window. It supports task +scheduling and a number of other embedded peripherals. + + + + + + + + + + + + + + +
Emulator Status
timer stable
scheduler stable
keyboard stable
graphical LCD display stable
text LCD display unmaintained
buzzer unmaintained
serial port unmaintained
flash unmaintained
debug console stable
file read/write stable
+ +\section algorithms Algorithms +In embedded programming sometimes you have to cope with protocols, security systems and things like that. +BeRTOS comes in help with a set of optimized portable algorithms: + + + + + + + + + + +
Algorithm Status
\link crc.h CRC16 \endlink stable
\link md2.c MD2 \endlink beta
\link randpool.c Cryptographically secure Random Pool \endlink beta
\link rotating_hash.h Rotating hash checksum \endlink stable
\link tea.h TEA (Tiny Encryption Algorithm) \endlink stable
\link ramp.h Stepper motor ramp generator \endlink stable
\link pid_control.h PID Controller \endlink stable
\link rle.c RLE (Run lenght en/decondig) \endlink stable
+ +To get up to date informations look at the algorithms source code. + +\section graphics Graphic subsystem +BeRTOS also features a complete graphic subsystem, suitable for generating compact yet powerful GUI. +This system is composed of several modules ranging from simple graphic primitives to complex menu management functions. + + + + + + + + + + + +
Module Status
\link bitmap.c Bitmaps manipulation \endlink stable
\link line.c Lines drawing \endlink stable
\link line.c Rectangles drawing \endlink stable
\link win.h Simple windowing system \endlink stable
Proportional and fixed size fonts stable
\link text.h Text rendering \endlink stable
\link charts.h Simple Charts \endlink stable
\link menu.h Menus \endlink stable
+ +To get up to date informations look at the source code in the directories \b gfx, \b gui or \b fonts. + +\section networking Network protocols +Since BeRTOS can also be used in very tiny systems, some simple communication protocols has been developed. + +This is the current status: + + + + + + + + +
Protocol Status
\link pocketbus.c PocketBus \endlink stable
\link keytag.c Keytag (for 125KHz transponders) \endlink stable
\link xmodem.c XModem protocol \endlink stable
\link nmea.c NMEA GPS protocol parser \endlink stable
\link afsk.c AFSK1200 modem \endlink stable
\link ax25.h AX25 data link layer protocol \endlink beta
+ +For more information take a look at network directory. + + +\section fs File system +BeRTOS supports two file systems. The first one is the mainstream \link fat.h FAT \endlink filesystem, using the FatFs library. The module is highly configurable, for example it can be compiled in read-only mode for some space saving. + +The second is \link battfs.h BattFs\endlink, a file system specifically planned for embedded platforms. The goal is to have a filesystem suitable for little flash and eeprom memories (like dataflash), reliable, robust and capable of wear-levelling the memory pages to increase its life. +The code is in beta stage. Currently you can create files, append data to them but file deletion is still not supported. Wear-levelling is achieved by rotating a page every time it is written. Plans are to add even transactions (a whole write can be performed atomically). + +File system development takes place in the fs directory. + +\section data_structures Data Structures +BeRTOS supplies common data structures, implemented and optimized for low memory footprint and speed. + + + + + + + +
Module Status
\link fifobuf.h FIFO \endlink stable
\link hashtable.h Hash table \endlink stable
\link heap.h Embedded-optimized dynamic memory allocator \endlink stable
\link list.h Lists \endlink stable
+ +\section mware Middleware +This section covers all BeRTOS modules that provide general purpose utility functions. Most of them should be moved to \ref algorithms directory. + +In the meanwhile, here is the list: + + + + + + + + +
Module Status
\link cpu/byteorder.h Integers to/from host byte-order conversion \endlink stable
\link event.h Events \endlink stable
\link except.h C++ like exception handling in C \endlink stable
\link formatwr.c Embedded-optimized printf \endlink stable
\link readline.h Command shell with history \endlink stable
\link ini_reader.h Ini file reader \endlink stable
+ +As usual, check source code for detailed reference. +*/ diff --git a/2.5/doc/TracFooter.html b/2.5/doc/TracFooter.html new file mode 100644 index 00000000..139597f9 --- /dev/null +++ b/2.5/doc/TracFooter.html @@ -0,0 +1,2 @@ + + diff --git a/2.5/doc/TracHeader.html b/2.5/doc/TracHeader.html new file mode 100644 index 00000000..139597f9 --- /dev/null +++ b/2.5/doc/TracHeader.html @@ -0,0 +1,2 @@ + + diff --git a/2.5/doc/chm-builder.py b/2.5/doc/chm-builder.py new file mode 100644 index 00000000..e6900bd8 --- /dev/null +++ b/2.5/doc/chm-builder.py @@ -0,0 +1,40 @@ +""" +To be used on windows platform only to generate BeRTOS .chm documentation. +Requires doxygen.exe and hhc.exe to be in the system PATH. +""" +from __future__ import with_statement +import os, sys + +def move(old_path, new_path): + if os.path.exists(new_path): + os.unlink(new_path) + os.rename(old_path, new_path) + + +if sys.platform != 'win32': + print "This program can be run only on a Windows machine" + sys.exit(-1) + +if len(sys.argv) < 2: + print "Usage: " + sys.argv[0] + " [custom_doxyfile]" + sys.exit(-1) + +DOC_PATH = 'doc\\offline-reference\\html\\' +toc_modifier = r"doc\chm-toc-modifier.py" +toc_file = DOC_PATH + r"index.hhc" +bertos_toc = r"bertos-toc.hhc" + + +if os.system("doxygen " + sys.argv[1]): + print "doxygen error" +if os.system(toc_modifier + " " + toc_file + " " + bertos_toc): + print "toc-modifier error" +move(bertos_toc, toc_file) + +# compile CHM +os.system(r"hhc " + DOC_PATH + "index.hhp") + +chm_target = r"bertos\bertos-doc.chm" +move(DOC_PATH + r"bertos-doc.chm", chm_target) + + diff --git a/2.5/doc/chm-toc-modifier.py b/2.5/doc/chm-toc-modifier.py new file mode 100644 index 00000000..f6239c8c --- /dev/null +++ b/2.5/doc/chm-toc-modifier.py @@ -0,0 +1,44 @@ +from __future__ import with_statement +import sys, re + +if len(sys.argv) < 1: + print "Usage: " + sys.argv[0] + " [hhc index file] [output file]" + sys.exit(-1) + +outfile = "out.hhc" +if len(sys.argv) == 3: + outfile = sys.argv[2] + +data_structures = [] + +section_start = re.compile(r"
  • .*? value=\"((File List)|(Data Structures)|(Main Page)|(Directory Hierarchy))\".*$") + +data_section = False +file_section = False + +with open(sys.argv[1], "r") as f: + with open(outfile, "w+") as out: + for line in f: + if re.search(section_start, line): + if line.find("Data Structures") != -1: + data_section = True + file_section = False + elif line.find("File List") != -1: + data_section = False + file_section = True + else: + data_section = False + file_section = False + + if data_section: + data_structures.append(line) + elif file_section: + pass + elif re.search(r"^<\/UL>$", line): + for i in data_structures: + out.write(i) + out.write(line) + else: + out.write(line) + + diff --git a/2.5/doc/doxygen.css b/2.5/doc/doxygen.css new file mode 100644 index 00000000..c7db1a8a --- /dev/null +++ b/2.5/doc/doxygen.css @@ -0,0 +1,358 @@ +BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { + font-family: Geneva, Arial, Helvetica, sans-serif; +} +BODY,TD { + font-size: 90%; +} +H1 { + text-align: center; + font-size: 160%; +} +H2 { + font-size: 120%; +} +H3 { + font-size: 100%; +} +CAPTION { font-weight: bold } +DIV.qindex { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.nav { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.navtab { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +TD.navtab { + font-size: 70%; +} +A.qindex { + text-decoration: none; + font-weight: bold; + color: #1A419D; +} +A.qindex:visited { + text-decoration: none; + font-weight: bold; + color: #1A419D +} +A.qindex:hover { + text-decoration: none; + background-color: #ddddff; +} +A.qindexHL { + text-decoration: none; + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + border: 1px double #9295C2; +} +A.qindexHL:hover { + text-decoration: none; + background-color: #6666cc; + color: #ffffff; +} +A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } +A.el { text-decoration: none; font-weight: bold } +A.elRef { font-weight: bold } +A.code:link { text-decoration: none; font-weight: normal; color: #0000FF} +A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF} +A.codeRef:link { font-weight: normal; color: #0000FF} +A.codeRef:visited { font-weight: normal; color: #0000FF} +A:hover { text-decoration: none; background-color: #f2f2ff } +DL.el { margin-left: -1cm } +.fragment { + font-family: monospace, fixed; + font-size: 95%; +} +PRE.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + margin-top: 4px; + margin-bottom: 4px; + margin-left: 2px; + margin-right: 8px; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 4px; +} +DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } + +DIV.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} +DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% } +BODY { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +} +TD.indexkey { + background-color: #e8eef2; + font-weight: bold; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TD.indexvalue { + background-color: #e8eef2; + font-style: italic; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TR.memlist { + background-color: #f0f0f0; +} +P.formulaDsp { text-align: center; } +IMG.formulaDsp { } +IMG.formulaInl { vertical-align: middle; } +SPAN.keyword { color: #008000 } +SPAN.keywordtype { color: #604020 } +SPAN.keywordflow { color: #e08000 } +SPAN.comment { color: #800000 } +SPAN.preprocessor { color: #806020 } +SPAN.stringliteral { color: #002080 } +SPAN.charliteral { color: #008080 } +.mdescLeft { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.mdescRight { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.memItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplParams { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + color: #606060; + background-color: #FAFAFA; + font-size: 80%; +} +.search { color: #003399; + font-weight: bold; +} +FORM.search { + margin-bottom: 0px; + margin-top: 0px; +} +INPUT.search { font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +TD.tiny { font-size: 75%; +} +a { + color: #1A41A8; +} +a:visited { + color: #2A3798; +} +.dirtab { padding: 4px; + border-collapse: collapse; + border: 1px solid #84b0c7; +} +TH.dirtab { background: #e8eef2; + font-weight: bold; +} +HR { height: 1px; + border: none; + border-top: 1px solid black; +} + +/* Style for detailed member documentation */ +.memtemplate { + font-size: 80%; + color: #606060; + font-weight: normal; +} +.memnav { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +.memitem { + padding: 4px; + background-color: #eef3f5; + border-width: 1px; + border-style: solid; + border-color: #dedeee; + -moz-border-radius: 8px 8px 8px 8px; +} +.memname { + white-space: nowrap; + font-weight: bold; +} +.memdoc{ + padding-left: 10px; +} +.memproto { + background-color: #d5e1e8; + width: 100%; + border-width: 1px; + border-style: solid; + border-color: #84b0c7; + font-weight: bold; + -moz-border-radius: 8px 8px 8px 8px; +} +.paramkey { + text-align: right; +} +.paramtype { + white-space: nowrap; +} +.paramname { + color: #602020; + font-style: italic; + white-space: nowrap; +} +/* End Styling for detailed member documentation */ + +/* for the tree view */ +.ftvtree { + font-family: sans-serif; + margin:0.5em; +} +.directory { font-size: 9pt; font-weight: bold; } +.directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } +.directory > h3 { margin-top: 0; } +.directory p { margin: 0px; white-space: nowrap; } +.directory div { display: none; margin: 0px; } +.directory img { vertical-align: -30%; } diff --git a/2.5/doc/tag-filter.py b/2.5/doc/tag-filter.py new file mode 100644 index 00000000..059d0181 --- /dev/null +++ b/2.5/doc/tag-filter.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python +from __future__ import with_statement +import re, sys + +def remove_expr(regex, line): + new_line = re.sub(regex, "", line) + sys.stdout.write(new_line) + +if __name__ == "__main__": + wiz = re.compile(r"\$WIZ\$.*$") + notest = re.compile(r'notest:.*$') + with file(sys.argv[1]) as f: + for line in f: + if re.search(wiz, line) != None: + remove_expr(wiz, line) + elif re.search(notest, line) != None: + remove_expr(notest, line) + else: + sys.stdout.write(line) diff --git a/2.5/examples/demo/cfg/cfg_gfx.h b/2.5/examples/demo/cfg/cfg_gfx.h new file mode 100644 index 00000000..59dde04c --- /dev/null +++ b/2.5/examples/demo/cfg/cfg_gfx.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/** + * Enable line clipping algorithm. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_CLIPPING 1 + +/** + * Enable text rendering in bitmaps. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_TEXT 1 + +/** + * Enable virtual coordinate system. + * $WIZ$ type = "boolean" + */ +#define CONFIG_GFX_VCOORDS 1 + +/** + * Select bitmap pixel format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "bitmap_format" + */ +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + +#endif /* CFG_GFX_H */ + diff --git a/2.5/examples/demo/cfg/cfg_kbd.h b/2.5/examples/demo/cfg/cfg_kbd.h new file mode 100644 index 00000000..82f41d02 --- /dev/null +++ b/2.5/examples/demo/cfg/cfg_kbd.h @@ -0,0 +1,59 @@ +/** + * \file + * + * + * \brief Configuration file for keyboard module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_KBD_H +#define CFG_KBD_H + +/// Keyboard polling method +#define CONFIG_KBD_POLL KBD_POLL_SOFTINT + +/// Enable keyboard event delivery to observers +#define CONFIG_KBD_OBSERVER 0 + +/// Enable key beeps +#define CONFIG_KBD_BEEP 1 + +/// Enable long pression handler for keys +#define CONFIG_KBD_LONGPRESS 0 + +/// Enable calling poor man's scheduler to be called inside kbd_peek +#define CONFIG_KBD_SCHED 1 + +#endif /* CFG_KBD_H */ + diff --git a/2.5/examples/demo/cfg/cfg_menu.h b/2.5/examples/demo/cfg/cfg_menu.h new file mode 100644 index 00000000..bbfa1e76 --- /dev/null +++ b/2.5/examples/demo/cfg/cfg_menu.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Configuration file for Menu module. + * + * \author Daniele Basile + */ + +#ifndef CFG_MENU_H +#define CFG_MENU_H + +/** + * Enable button bar behind menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_MENUBAR 0 + +/** + * Level Edit Timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/** + * Menu timeout + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_TIMEOUT 0 + +/** + * Enable smooth scrolling in menus + * $WIZ$ type = "boolean" + */ +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_MENU_H */ + diff --git a/2.5/examples/demo/cfg/cfg_monitor.h b/2.5/examples/demo/cfg/cfg_monitor.h new file mode 100644 index 00000000..6391b407 --- /dev/null +++ b/2.5/examples/demo/cfg/cfg_monitor.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 1 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/examples/demo/cfg/cfg_proc.h b/2.5/examples/demo/cfg/cfg_proc.h new file mode 100644 index 00000000..cddfcb04 --- /dev/null +++ b/2.5/examples/demo/cfg/cfg_proc.h @@ -0,0 +1,108 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 2097152L + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/examples/demo/cfg/cfg_sem.h b/2.5/examples/demo/cfg/cfg_sem.h new file mode 100644 index 00000000..86ed110d --- /dev/null +++ b/2.5/examples/demo/cfg/cfg_sem.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 1 + +#endif /* CFG_SEM_H */ diff --git a/2.5/examples/demo/cfg/cfg_signal.h b/2.5/examples/demo/cfg/cfg_signal.h new file mode 100644 index 00000000..ed85119b --- /dev/null +++ b/2.5/examples/demo/cfg/cfg_signal.h @@ -0,0 +1,48 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \version $Id$ + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/examples/demo/cfg/cfg_timer.h b/2.5/examples/demo/cfg/cfg_timer.h new file mode 100644 index 00000000..1cff78b8 --- /dev/null +++ b/2.5/examples/demo/cfg/cfg_timer.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/examples/demo/demo.c b/2.5/examples/demo/demo.c new file mode 100644 index 00000000..e77eab90 --- /dev/null +++ b/2.5/examples/demo/demo.c @@ -0,0 +1,317 @@ +/** + * \file + * + * + * \brief Multifunction system test for BeRTOS modules. + * + * \author Bernie Innocenti + */ + +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +/** Default LCD bitmap */ +static Bitmap lcd_bitmap; + +/** + * Refresh the GUI. + */ +void schedule(void) +{ + lcd_gfx_qt_blitBitmap(&lcd_bitmap); + emul_idle(); +} + +/** + * Draw a pentacle in the provided bitmap. + */ +static void magic(struct Bitmap *bitmap, coord_t x, coord_t y) +{ + static const coord_t coords[] = { 120, 34, 90, 90, 30, 90, 0, 34, 60, 0, 90, 90, 0, 34, 120, 34, 30, 90, 60, 0 }; + unsigned int i; + + gfx_moveTo(bitmap, coords[countof(coords)-2]/2 + x, coords[countof(coords)-1]/3 + y); + for (i = 0; i < countof(coords); i += 2) + gfx_lineTo(bitmap, coords[i]/2 + x, coords[i+1]/3 + y); +} + +static void hello_world(Bitmap *bm) +{ + extern const Font font_ncenB18; + const Font *old_font; + + old_font = bm->font; + + gfx_bitmapClear(bm); + + /* Set big font */ + gfx_setFont(bm, &font_ncenB18); + + text_xprintf(bm, 0, 0, STYLEF_BOLD | TEXT_FILL | TEXT_CENTER, + "Hello, world!"); + schedule(); + while (1) + if (kbd_peek()) + break; + + /* Restore old font */ + gfx_setFont(bm, old_font); +} + +/** + * Show the splash screen + */ +static void bouncing_logo(Bitmap *bm) +{ + const long SPEED_SCALE = 1000; + const long GRAVITY_ACCEL = 10; + const long BOUNCE_ELASTICITY = 2; + long h = (long)(-bertos_logo.height) * SPEED_SCALE; + long speed = 1000; + + /* Repeat until logo stands still on the bottom edge */ + while (!((speed == 0) && (h == 0))) + { + /* Move */ + h += speed; + + /* Gravity acceleration */ + speed += GRAVITY_ACCEL; + + if (h > 0 && speed > 0) + { + /* Bounce */ + speed = - (speed / BOUNCE_ELASTICITY); + + } + + /* Update graphics */ + gfx_bitmapClear(bm); + gfx_blitImage(bm, + (bm->width - bertos_logo.width) / 2, + h / SPEED_SCALE, + &bertos_logo); + schedule(); + timer_delay(10); + } +} + +void win_demo(Bitmap *bm) +{ + const coord_t small_left = 45, small_top = 30, small_width = 50, small_height = 30; + const coord_t large_left = -10, large_top = 10, large_width = 85, large_height = 41; + + Window root_win, small_win, large_win; + Bitmap small_bm, large_bm; + uint8_t small_raster[RAST_SIZE(small_width, small_height)]; + uint8_t large_raster[RAST_SIZE(large_width, large_height)]; + + win_create(&root_win, bm); + + gfx_bitmapInit(&large_bm, large_raster, large_width, large_height); + win_create(&large_win, &large_bm); + win_open(&large_win, &root_win); + win_move(&large_win, large_left, large_top); + + gfx_bitmapInit(&small_bm, small_raster, small_width, small_height); + win_create(&small_win, &small_bm); + win_open(&small_win, &root_win); + win_move(&small_win, small_left, small_top); + + + coord_t x = 0, y = LCD_WIDTH / 2; + coord_t xdir = +1, ydir = -1; + coord_t xdir_large = +1; + coord_t ydir_small = +1; + int raise_counter = 0; + int i; + + for(;;) + { + /* Background animation */ + bm = root_win.bitmap; + gfx_bitmapClear(bm); + // gfx_setClipRect(bm, 0, 0, bm->width, bm->height); + // gfx_rectDraw(bm, 10, 10, bm->width-10, bm->height-10); + // gfx_setClipRect(bm, 11, 11, bm->width-11, bm->height-11); + magic(bm, x, y); + x += xdir; + y += ydir; + if (x >= bm->width) xdir = -1; + if (x <= -50) xdir = +1; + if (y >= bm->height) ydir = -1; + if (y <= -50) ydir = +1; + + bm = large_win.bitmap; + gfx_bitmapClear(bm); + for (i = 0; i < bm->height / 2; i += 2) + gfx_rectDraw(bm, 0 + i, 0 + i, bm->width - i, bm->height - i); + + /* Small window animation */ + bm = small_win.bitmap; + gfx_bitmapClear(bm); + gfx_rectDraw(bm, 0, 0, bm->width, bm->height); + gfx_line(bm, 0, 0, bm->width, bm->height); + gfx_line(bm, bm->width, 0, 0, bm->height); + + /* Move windows around */ + win_move(&large_win, large_win.geom.xmin + xdir_large, large_top); + if (large_win.geom.xmin < -20) xdir_large = +1; + if (large_win.geom.xmin > RECT_WIDTH(&root_win.geom) - 5) xdir_large = -1; + + win_move(&small_win, small_left, small_win.geom.ymin + ydir_small); + if (small_win.geom.ymin < -20) ydir_small = +1; + if (small_win.geom.ymin > RECT_HEIGHT(&root_win.geom) - 5) ydir_small = -1; + + ++raise_counter; + if (raise_counter % 997 == 0) + win_raise(&small_win); + else if (raise_counter % 731 == 0) + win_raise(&large_win); + + win_compose(&root_win); + /* Also does LCD refresh, etc. */ + if (kbd_peek()) + break; + } +} + +void proc_demo(void) +{ + proc_testRun(); +} + +void timer_demo(void) +{ + timer_testRun(); + timer_testTearDown(); +} + + +/* SETTINGS SUBMENU */ + +static struct MenuItem settings_items[] = +{ + { (const_iptr_t)"System", 0, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)"Language", 0, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)"Networking", 0, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)"Date & Time",0, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)"Power Saving", MIF_TOGGLE, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)0, 0, NULL, (iptr_t)0 } +}; +static struct Menu settings_menu = { settings_items, "Settings Menu", MF_STICKY | MF_SAVESEL, &lcd_bitmap, 0, lcd_gfx_qt_blitBitmap }; + + +/* MX SUBMENU */ + +static struct MenuItem mx_items[] = +{ + { (const_iptr_t)"Mouse", MIF_CHECKIT | MIF_EXCLUDE_1 | MIF_EXCLUDE_2, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)"Keyboard", MIF_CHECKED | MIF_CHECKIT | MIF_EXCLUDE_0 | MIF_EXCLUDE_2, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)"Joystick", MIF_CHECKIT | MIF_EXCLUDE_0 | MIF_EXCLUDE_1, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)"Autosave", MIF_CHECKED | MIF_CHECKIT | MIF_TOGGLE, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)0, 0, NULL, (iptr_t)0 } +}; + +static struct Menu mx_menu = { mx_items, (const_iptr_t)0, MF_STICKY | MF_SAVESEL, &lcd_bitmap, 0, lcd_gfx_qt_blitBitmap }; + + +/* DISPLAY SUBMENU */ + +static struct MenuItem display_items[] = +{ + { (const_iptr_t)"Background", 0, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)"Colors", 0, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)"Style", 0, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)"Icon Theme", 0, (MenuHook)0, (iptr_t)0 }, + { (const_iptr_t)0, 0, NULL, (iptr_t)0 } +}; +static struct Menu display_menu = { display_items, "Display Menu", MF_SAVESEL, &lcd_bitmap, 0, lcd_gfx_qt_blitBitmap }; + + +/* MAIN MENU */ + +static struct MenuItem main_items[] = +{ + { (const_iptr_t)"Win Fly", 0, (MenuHook)win_demo, (iptr_t)&lcd_bitmap }, + { (const_iptr_t)"Bounce!", 0, (MenuHook)bouncing_logo,(iptr_t)&lcd_bitmap }, + { (const_iptr_t)"Hello World", 0, (MenuHook)hello_world, (iptr_t)&lcd_bitmap }, + { (const_iptr_t)"Scheduling", 0, (MenuHook)proc_demo, (iptr_t)&lcd_bitmap }, + { (const_iptr_t)"Timer Test", 0, (MenuHook)timer_demo, (iptr_t)&lcd_bitmap }, + { (const_iptr_t)"Menu MX", 0, (MenuHook)menu_handle, (iptr_t)&mx_menu }, + { (const_iptr_t)"Display", 0, (MenuHook)menu_handle, (iptr_t)&display_menu }, + { (const_iptr_t)"Settings", 0, (MenuHook)menu_handle, (iptr_t)&settings_menu }, + { (const_iptr_t)0, 0, NULL, (iptr_t)0 } +}; +static struct Menu main_menu = { main_items, "Main Menu", MF_STICKY, &lcd_bitmap, 0, lcd_gfx_qt_blitBitmap }; + +#if CONFIG_KERN_HEAP +#define monitor_stack NULL +#else +static PROC_DEFINE_STACK(monitor_stack, KERN_MINSTACKSIZE); +#endif + +int main(int argc, char *argv[]) +{ + emul_init(&argc, argv); + + timer_init(); + buz_init(); + kbd_init(); + lcd_gfx_qt_init(&lcd_bitmap); + proc_init(); + monitor_start(KERN_MINSTACKSIZE, monitor_stack); + + menu_handle(&main_menu); + + timer_cleanup(); + emul_cleanup(); + return 0; +} diff --git a/2.5/examples/demo/demo.mk b/2.5/examples/demo/demo.mk new file mode 100644 index 00000000..1e687b5b --- /dev/null +++ b/2.5/examples/demo/demo.mk @@ -0,0 +1,90 @@ +# +# Copyright 2003, 2004, 2005, 2006 Develer S.r.l. (http://www.develer.com/) +# Copyright 2008 Bernie Innocenti +# +# Makefile fragment for DevLib demo application. +# +# Version: $Id: demo.mk 18234 2007-10-08 13:39:48Z rasky $ +# Author: Bernie Innocenti +# + +include bertos/fonts/fonts.mk +include bertos/emul/emul.mk + +# Set to 1 for debug builds +demo_DEBUG = 1 + +# This is an hosted application +demo_HOSTED = 1 + +# Our target application +TRG += demo + +#We want to use g++ for C source too +demo_CC=g++ + +demo_CXXSRC = \ + bertos/emul/emul.cpp \ + bertos/emul/emulwin.cpp \ + bertos/emul/emulkbd.cpp \ + bertos/drv/lcd_gfx_qt.cpp + +demo_CSRC = \ + examples/demo/demo.c \ + bertos/os/hptime.c \ + bertos/gfx/bitmap.c \ + bertos/gfx/line.c \ + bertos/gfx/win.c \ + bertos/gfx/text.c \ + bertos/gfx/text_format.c \ + bertos/gui/menu.c \ + bertos/fonts/helvB10.c \ + bertos/fonts/luBS14.c \ + bertos/fonts/ncenB18.c \ + bertos/icons/logo.c \ + bertos/drv/kbd.c \ + bertos/drv/timer.c \ + bertos/drv/timer_test.c \ + bertos/drv/buzzer.c \ + bertos/drv/ser.c \ + bertos/emul/ser_posix.c \ + bertos/emul/kfile_posix.c \ + bertos/mware/formatwr.c \ + bertos/mware/hex.c \ + bertos/mware/event.c \ + bertos/mware/observer.c \ + bertos/mware/resource.c \ + bertos/mware/sprintf.c \ + bertos/struct/heap.c \ + bertos/kern/irq.c \ + bertos/kern/proc.c \ + bertos/kern/proc_test.c \ + bertos/kern/sem.c \ + bertos/kern/signal.c \ + bertos/kern/monitor.c \ + bertos/verstag.c + +demo_CPPASRC = \ + bertos/emul/switch_ctx_emul.S + +# FIXME: maybe this junk should go in emul/emul.mk? +$(OBJDIR)/demo/bertos/emul/emulwin.o: bertos/emul/emulwin_moc.cpp +$(OBJDIR)/demo/bertos/drv/lcd_gfx_qt.o: bertos/drv/lcd_gfx_qt_moc.cpp +$(OBJDIR)/demo/bertos/drv/timer.o: bertos/emul/timer_qt_moc.cpp +$(OBJDIR)/demo/bertos/emul/emulkbd.o: bertos/emul/emulkbd_moc.cpp + +#FIXME: isn't there a way to avoid repeating the pattern rule? +bertos/emul/timer_qt_moc.cpp: bertos/emul/timer_qt.c + $(QT_MOC) -o $@ $< + + +demo_CPPAFLAGS = +demo_CFLAGS = -O0 -g3 -ggdb -Iexamples/demo $(EMUL_CFLAGS) +demo_CXXFLAGS = -O0 -g3 -ggdb -Iexamples/demo $(EMUL_CFLAGS) +demo_LDFLAGS = $(EMUL_LDFLAGS) + +# Debug stuff +ifeq ($(demo_DEBUG),0) + demo_CFLAGS += -Os + demo_CXXFLAGS += -Os +endif diff --git a/2.5/examples/demo/hw/hw_kbd.h b/2.5/examples/demo/hw/hw_kbd.h new file mode 100644 index 00000000..12f7ddd1 --- /dev/null +++ b/2.5/examples/demo/hw/hw_kbd.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Keyboard hardware-specific definitions + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_H +#define HW_KBD_H + +#include "hw/kbd_map.h" + +#include + +#define K_RPT_MASK (K_UP | K_DOWN | K_OK | K_CANCEL) + +#define KBD_HW_INIT \ + do { \ + /* Put here code to init hw */ \ + } while (0) + +EXTERN_C int emul_kbdReadCols(void); + +/** + * Read the keyboard ports and return the mask of + * depressed keys. + */ +INLINE keymask_t kbd_readkeys(void) +{ + // This is specific for the demo + return (keymask_t)emul_kbdReadCols(); +} + +#endif /* HW_KBD_H */ diff --git a/2.5/examples/demo/hw/kbd_map.h b/2.5/examples/demo/hw/kbd_map.h new file mode 100644 index 00000000..deb215ef --- /dev/null +++ b/2.5/examples/demo/hw/kbd_map.h @@ -0,0 +1,67 @@ +/** + * \file + * + * + * \brief Keyboard map definitions. + * + * \version $Id$ + * + * \author Francesco Sacchi + * \author Stefano Fedrigo + */ + +#ifndef HW_KBD_MAP_H +#define HW_KBD_MAP_H + +#include + + +/** + * Type for keyboard mask. + */ +typedef uint16_t keymask_t; + +/** + * \name Keycodes. + */ +/*@{*/ +#define K_UP BV(0) +#define K_DOWN BV(1) +#define K_OK BV(2) +#define K_CANCEL BV(3) + +#define K_REPEAT BV(14) /**< This is a repeated keyevent. */ +#define K_TIMEOUT BV(15) /**< Fake key event for timeouts. */ +/*@}*/ + + +#endif /* HW_KBD_MAP_H */ diff --git a/2.5/examples/demo/verstag.h b/2.5/examples/demo/verstag.h new file mode 100644 index 00000000..8fb51060 --- /dev/null +++ b/2.5/examples/demo/verstag.h @@ -0,0 +1,95 @@ +/** + * \file + * + * + * \version $Id$ + * + * \author Bernie Innocenti + * + * \brief Declare application version strings + */ + +#ifndef BERTOS_VERSTAG_H +#define BERTOS_VERSTAG_H + +#ifndef CFG_ARCH_CONFIG_H + #include "cfg/cfg_arch.h" +#endif + +#define APP_NAME "BeRTOS Demo" +#define APP_DESCRIPTION "BeRTOS Multidemo Application" +#define APP_AUTHOR "Develer" +#define APP_COPYRIGHT "Copyright 2006 Develer (http://www.develer.com/)" + +#define VERS_MAJOR 0 +#define VERS_MINOR 1 +#define VERS_REV 0 +#define VERS_LETTER "" + +/** + * If _SNAPSHOT is defined, \c VERS_TAG contains the build date + * date instead of a numeric version string. + */ +#define _SNAPSHOT + +#ifdef _DEBUG + #define VERS_DBG "D" +#else + #define VERS_DBG "" +#endif + +#define __STRINGIZE(x) #x +#define _STRINGIZE(x) __STRINGIZE(x) + +/** Build application version string (i.e.: "1.7.0") */ +#define MAKE_VERS(maj,min,rev) _STRINGIZE(maj) "." _STRINGIZE(min) "." _STRINGIZE(rev) VERS_LETTER VERS_DBG +#ifdef _SNAPSHOT + #define VERS_TAG "snapshot" " " __DATE__ " " __TIME__ " " VERS_LETTER " " VERS_DBG +#else + #define VERS_TAG MAKE_VERS(VERS_MAJOR,VERS_MINOR,VERS_REV) +#endif + +/** Build application version string suitable for MS windows resource files (i.e.: "1, 7, 0, 1") */ +#define MAKE_RCVERS(maj,min,rev,bld) _STRINGIZE(maj) ", " _STRINGIZE(min) ", " _STRINGIZE(rev) ", " _STRINGIZE(bld) +#define RCVERSION_TAG MAKE_VERS(VERS_MAJOR,VERS_MINOR,VERS_REV) + +/** The revision string (contains VERS_TAG) */ +extern const char vers_tag[]; + +/** Sequential build number (contains VERS_BUILD) */ +extern const int vers_build_nr; +//extern const char vers_build_str[]; + +/** Hostname of the machine used to build this binary (contains VERS_HOST) */ +extern const char vers_host[]; + +#endif /* BERTOS_VERSTAG_H */ diff --git a/2.5/examples/lm3s8962/cfg/cfg_debug.h b/2.5/examples/lm3s8962/cfg/cfg_debug.h new file mode 100644 index 00000000..ef7c4a75 --- /dev/null +++ b/2.5/examples/lm3s8962/cfg/cfg_debug.h @@ -0,0 +1,53 @@ +/** + * \file + * + * + * \brief Configuration file for Debug module. + * + * \author Daniele Basile + */ + +#ifndef CFG_DEBUG_H +#define CFG_DEBUG_H + +/** + * Debug console port. + * $WIZ$ type = "int"; min = 0 + */ +#define CONFIG_KDEBUG_PORT 0 + +/** + * Baudrate for the debug console. + * $WIZ$ type = "int"; min = 300 + */ +#define CONFIG_KDEBUG_BAUDRATE 115200UL + +#endif /* CFG_DEBUG_H */ diff --git a/2.5/examples/lm3s8962/cfg/cfg_gfx.h b/2.5/examples/lm3s8962/cfg/cfg_gfx.h new file mode 100644 index 00000000..8d8b6fa2 --- /dev/null +++ b/2.5/examples/lm3s8962/cfg/cfg_gfx.h @@ -0,0 +1,74 @@ +/** + * \file + * + * + * \brief Configuration file for GFX module. + * + * \version $Id$ + * + * \author Daniele Basile + */ + +#ifndef CFG_GFX_H +#define CFG_GFX_H + +/// Enable line clipping algorithm. +#define CONFIG_GFX_CLIPPING 1 + +/// Enable text rendering in bitmaps. +#define CONFIG_GFX_TEXT 1 + +/// Enable virtual coordinate system. +#define CONFIG_GFX_VCOORDS 1 + +/// Select bitmap pixel format. +#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB + + +#define CONFIG_CHART_TYPE_X uint8_t ///< Type for the chart dataset +#define CONFIG_CHART_TYPE_Y uint8_t ///< Type for the chart dataset + + +/// Enable button bar behind menus +#define CONFIG_MENU_MENUBAR 0 + +/// Level Edit Timeout +#define CONFIG_LEVELEDIT_TIMEOUT 0 + +/// Menu timeout +#define CONFIG_MENU_TIMEOUT 0 + +/// Enable smooth scrolling in menus +#define CONFIG_MENU_SMOOTH 1 + + +#endif /* CFG_GFX_H */ + diff --git a/2.5/examples/lm3s8962/cfg/cfg_heap.h b/2.5/examples/lm3s8962/cfg/cfg_heap.h new file mode 100644 index 00000000..7d080012 --- /dev/null +++ b/2.5/examples/lm3s8962/cfg/cfg_heap.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Configuration file for heap module. + * + * \author Daniele Basile + */ + +#ifndef CFG_HEAP_H +#define CFG_HEAP_H + +/** + * Enable malloc/free like API. + * $WIZ$ type = "boolean" + */ +#define CONFIG_HEAP_MALLOC 1 + +#endif /* CFG_HEAP_H */ + + diff --git a/2.5/examples/lm3s8962/cfg/cfg_kfile.h b/2.5/examples/lm3s8962/cfg/cfg_kfile.h new file mode 100644 index 00000000..1b1989c9 --- /dev/null +++ b/2.5/examples/lm3s8962/cfg/cfg_kfile.h @@ -0,0 +1,62 @@ +/** + * \file + * + * + * \brief Configuration file for KFile interface module. + * + * \version $Id$ + * \author Daniele Basile + */ + +#ifndef CFG_KFILE_H +#define CFG_KFILE_H + +/** + * Module logging level. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KFILE_LOG_LEVEL LOG_LVL_INFO + +/** + * Module logging format. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KFILE_LOG_FORMAT LOG_FMT_TERSE + +/** + * Enable the gets function with echo. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KFILE_GETS 1 + +#endif /* CFG_KFILE_H */ diff --git a/2.5/examples/lm3s8962/cfg/cfg_lcd.h b/2.5/examples/lm3s8962/cfg/cfg_lcd.h new file mode 100644 index 00000000..d48fa5df --- /dev/null +++ b/2.5/examples/lm3s8962/cfg/cfg_lcd.h @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief Configuration file for lcd display module. + */ + +#ifndef CFG_LCD_H +#define CFG_LCD_H + +/** + * Use 4 bit addressing mode. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_4BIT 0 + +/** + * Use a table to speed up LCD memory addressing. + * This will use about 100 bytes of RAM. + * $WIZ$ type = "boolean" + */ +#define CONFIG_LCD_ADDRESS_FAST 0 + +/** + * LCD setting for 32122A (AVR implementation). + * $WIZ$ type = "boolean" + * $WIZ$ supports = "avr and False" + */ +#define CONFIG_LCD_SOFTINT_REFRESH 0 + +/** + * LCD setting for 32122A (AVR implementation). + * $WIZ$ type = "boolean" + * $WIZ$ supports = "avr and False" + */ +#define CONFIG_LCD_WAIT 0 + + +#endif /* CFG_LCD_H */ + diff --git a/2.5/examples/lm3s8962/cfg/cfg_monitor.h b/2.5/examples/lm3s8962/cfg/cfg_monitor.h new file mode 100644 index 00000000..d0e24da4 --- /dev/null +++ b/2.5/examples/lm3s8962/cfg/cfg_monitor.h @@ -0,0 +1,47 @@ +/** + * \file + * + * + * \brief Kernel monitor configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_MONITOR_H +#define CFG_MONITOR_H + +/** + * Process monitor. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_MONITOR 1 + +#endif /* CFG_MONITOR_H */ diff --git a/2.5/examples/lm3s8962/cfg/cfg_proc.h b/2.5/examples/lm3s8962/cfg/cfg_proc.h new file mode 100644 index 00000000..eb5506b4 --- /dev/null +++ b/2.5/examples/lm3s8962/cfg/cfg_proc.h @@ -0,0 +1,107 @@ +/** + * \file + * + * + * \brief Kernel configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_PROC_H +#define CFG_PROC_H + +/** + * Enable the multithreading kernel. + * + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN 1 + +/** + * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_KERN_IRQ 0 + +/** + * Preemptive process scheduling. + * + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "timer" + */ +#define CONFIG_KERN_PREEMPT 1 + +/** + * Time sharing quantum (a prime number prevents interference effects) [ms]. + * + * $WIZ$ type = "int" + * $WIZ$ min = 1 + */ +#define CONFIG_KERN_QUANTUM 11 + +/** + * Priority-based scheduling policy. + * $WIZ$ type = "boolean" + */ +#define CONFIG_KERN_PRI 1 + +/** + * Dynamic memory allocation for processes. + * $WIZ$ type = "boolean" + * $WIZ$ conditional_deps = "heap" + */ +#define CONFIG_KERN_HEAP 1 + +/** + * Size of the dynamic memory pool used by processes. + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_KERN_HEAP_SIZE 16384L + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define KERN_LOG_LEVEL LOG_LVL_ERR + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define KERN_LOG_FORMAT LOG_FMT_VERBOSE + +#endif /* CFG_PROC_H */ diff --git a/2.5/examples/lm3s8962/cfg/cfg_sem.h b/2.5/examples/lm3s8962/cfg/cfg_sem.h new file mode 100644 index 00000000..51811da4 --- /dev/null +++ b/2.5/examples/lm3s8962/cfg/cfg_sem.h @@ -0,0 +1,47 @@ +/** + * \file + * + * + * \brief Kernel semaphores configuration parameters. + * + * \author Bernie Innocenti + */ + +#ifndef CFG_SEM_H +#define CFG_SEM_H + +/** + * Re-entrant mutual exclusion primitives. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SEMAPHORES 0 + +#endif /* CFG_SEM_H */ diff --git a/2.5/examples/lm3s8962/cfg/cfg_ser.h b/2.5/examples/lm3s8962/cfg/cfg_ser.h new file mode 100644 index 00000000..91a10e0b --- /dev/null +++ b/2.5/examples/lm3s8962/cfg/cfg_ser.h @@ -0,0 +1,222 @@ +/** + * \file + * + * + * \brief Configuration file for serial module. + * + * \author Daniele Basile + */ + +#ifndef CFG_SER_H +#define CFG_SER_H + +/** + * Example of setting for serial port and + * spi port. + * Edit these define for your project. + */ + +/** + * Size of the outbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + */ +#define CONFIG_UART0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" + */ +#define CONFIG_UART1_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 2 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lm3s or lpc2" + */ +#define CONFIG_UART2_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for port 3 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "lpc2" + */ +#define CONFIG_UART3_RXBUFSIZE 32 + + +/** + * Size of the outbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 0 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI0_RXBUFSIZE 32 + +/** + * Size of the outbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_TXBUFSIZE 32 + +/** + * Size of the inbound FIFO buffer for SPI port 1 [bytes]. + * $WIZ$ type = "int" + * $WIZ$ min = 2 + * $WIZ$ supports = "at91" + */ +#define CONFIG_SPI1_RXBUFSIZE 32 + +/** + * SPI data order. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_order_bit" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST + +/** + * SPI clock division factor. + * $WIZ$ type = "int" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_DIV 16 + +/** + * SPI clock polarity: normal low or normal high. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_pol" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW + +/** + * SPI clock phase you can choose sample on first edge or + * sample on second clock edge. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "ser_spi_phase" + * $WIZ$ supports = "avr" + */ +#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE + +/** + * Default transmit timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_TXTIMEOUT -1 + +/** + * Default receive timeout (ms). Set to -1 to disable timeout support. + * $WIZ$ type = "int" + * $WIZ$ min = -1 + */ +#define CONFIG_SER_RXTIMEOUT -1 + +/** + * Use RTS/CTS handshake. + * $WIZ$ type = "boolean" + * $WIZ$ supports = "False" + */ +#define CONFIG_SER_HWHANDSHAKE 0 + +/** + * Default baudrate for all serial ports (set to 0 to disable). + * $WIZ$ type = "int" + * $WIZ$ min = 0 + */ +#define CONFIG_SER_DEFBAUDRATE 0UL + +/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" +#define CONFIG_SER_STROBE 0 + +#endif /* CFG_SER_H */ diff --git a/2.5/examples/lm3s8962/cfg/cfg_signal.h b/2.5/examples/lm3s8962/cfg/cfg_signal.h new file mode 100644 index 00000000..ce5324ec --- /dev/null +++ b/2.5/examples/lm3s8962/cfg/cfg_signal.h @@ -0,0 +1,47 @@ +/** + * \file + * + * + * \brief Kernel signals configuration parameters + * + * \author Bernie Innocenti + */ + +#ifndef CFG_SIGNAL_H +#define CFG_SIGNAL_H + +/** + * Inter-process signals. + * $WIZ$ type = "autoenabled" + */ +#define CONFIG_KERN_SIGNALS 1 + +#endif /* CFG_SIGNAL_H */ diff --git a/2.5/examples/lm3s8962/cfg/cfg_timer.h b/2.5/examples/lm3s8962/cfg/cfg_timer.h new file mode 100644 index 00000000..ae1a60b9 --- /dev/null +++ b/2.5/examples/lm3s8962/cfg/cfg_timer.h @@ -0,0 +1,66 @@ +/** + * \file + * + * + * \brief Configuration file for timer module. + * + * \author Daniele Basile + */ + +#ifndef CFG_TIMER_H +#define CFG_TIMER_H + +/** + * Hardware timer selection for drv/timer.c. + * $WIZ$ type = "enum" + * $WIZ$ value_list = "timer_select" + */ +#define CONFIG_TIMER TIMER_DEFAULT + +/** + * Debug timer interrupt using a strobe pin. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_STROBE 0 + +/** + * Enable asynchronous timers. + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_EVENTS 1 + +/** + * Support hi-res timer_usleep(). + * $WIZ$ type = "boolean" + */ +#define CONFIG_TIMER_UDELAY 1 + +#endif /* CFG_TIMER_H */ diff --git a/2.5/examples/lm3s8962/hw/hw_kbd.h b/2.5/examples/lm3s8962/hw/hw_kbd.h new file mode 100644 index 00000000..d47d8863 --- /dev/null +++ b/2.5/examples/lm3s8962/hw/hw_kbd.h @@ -0,0 +1,78 @@ +/** + * \file + * + * + * \brief LM3S1968 keypad: hardware-specific definitions + * + * \author Andrea Righi + */ + +#ifndef HW_KBD_H +#define HW_KBD_H + +#include /* BV() */ +#include /* GPIO_PORTG_BASE */ +#include /* lm3s_busyWait() */ +#include /* lm3s_gpioPinConfig() / lm3s_gpioPinRead() */ +#include "hw/kbd_map.h" + +#define K_RPT_MASK (K_UP | K_DOWN | K_LEFT | K_RIGHT) + +#define KBD_HW_INIT \ + do { \ + /* Enable the peripheral clock */ \ + SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOE; \ + SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOF; \ + lm3s_busyWait(512); \ + lm3s_gpioPinConfig(GPIO_PORTE_BASE, \ + BV(3) | BV(2) | BV(1) | BV(0), \ + GPIO_DIR_MODE_IN, \ + GPIO_STRENGTH_2MA, \ + GPIO_PIN_TYPE_STD_WPU); \ + lm3s_gpioPinConfig(GPIO_PORTF_BASE, \ + BV(1), \ + GPIO_DIR_MODE_IN, \ + GPIO_STRENGTH_2MA, \ + GPIO_PIN_TYPE_STD_WPU); \ + } while (0) + +/** + * Read the keyboard ports and return the mask of depressed keys. + */ +INLINE keymask_t kbd_readkeys(void) +{ + return ~(lm3s_gpioPinRead(GPIO_PORTE_BASE, + BV(3) | BV(2) | BV(1) | BV(0)) | + lm3s_gpioPinRead(GPIO_PORTF_BASE, BV(1)) << 3); + +} + +#endif /* HW_KBD_H */ diff --git a/2.5/examples/lm3s8962/hw/hw_rit128x96.h b/2.5/examples/lm3s8962/hw/hw_rit128x96.h new file mode 100644 index 00000000..27306331 --- /dev/null +++ b/2.5/examples/lm3s8962/hw/hw_rit128x96.h @@ -0,0 +1,115 @@ +/** + * \file + * + * + * \brief LM3S1986: OLED-RIT-128x96 (P14201) low-level hardware macros + * + * \author Andrea Righi + */ + +#ifndef HW_RIT128x96_H +#define HW_RIT128x96_H + +#include "cfg/macros.h" /* BV() */ +#include "cfg/debug.h" + +#include +#include +#include + +#include +#include +#include + +/** + * \name LCD I/O pins/ports + * @{ + */ +/* OLED Data/Command control pin */ +#define GPIO_OLEDDC_PIN BV(6) + +/* OLED enable pin */ +#define GPIO_OLEDEN_PIN BV(7) +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +/* Enter command mode */ +#define LCD_SET_COMMAND() \ + lm3s_gpioPinWrite(GPIO_PORTA_BASE, GPIO_OLEDDC_PIN, 0) + +/* Enter data mode */ +#define LCD_SET_DATA() \ + lm3s_gpioPinWrite(GPIO_PORTA_BASE, GPIO_OLEDDC_PIN, GPIO_OLEDDC_PIN) + +/* Send data to the display */ +#define LCD_WRITE(x) \ + { \ + uint32_t _x; \ + while (!lm3s_ssiWriteFrameNonBlocking(SSI0_BASE, x)); \ + /* Dummy read to drain the FIFO */ \ + while (!lm3s_ssiReadFrameNonBlocking(SSI0_BASE, &_x)); \ + } +/*@}*/ + +INLINE void lcd_rit128x96_hw_bus_init(void) +{ + uint32_t dummy; + + /* Enable the peripheral clock */ + SYSCTL_RCGC1_R |= SYSCTL_RCGC1_SSI0; + SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOA; + lm3s_busyWait(512); + + /* Configure the SSI0CLK SSI0FS and SSI0TX pins for SSI operation. */ + lm3s_gpioPinConfig(GPIO_PORTA_BASE, BV(2) | BV(3) | BV(5), + GPIO_DIR_MODE_HW, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + /* + * Configure the GPIO port pin used as a D/C# signal (data/command + * control) for OLED device, and the port pin used to enable power to + * the OLED panel. + */ + lm3s_gpioPinConfig(GPIO_PORTA_BASE, GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN, + GPIO_DIR_MODE_OUT, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); + lm3s_gpioPinWrite(GPIO_PORTA_BASE, GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN, + GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN); + + /* Configure the SSI0 port for master mode */ + lm3s_ssiOpen(SSI0_BASE, SSI_FRF_MOTO_MODE_2, + SSI_MODE_MASTER, CPU_FREQ / 2, 8); + + /* Drain the SSI RX FIFO */ + while (lm3s_ssiReadFrameNonBlocking(SSI0_BASE, &dummy)); +} + +#endif /* HW_RIT128x96_H */ diff --git a/2.5/examples/lm3s8962/hw/kbd_map.h b/2.5/examples/lm3s8962/hw/kbd_map.h new file mode 100644 index 00000000..5493410c --- /dev/null +++ b/2.5/examples/lm3s8962/hw/kbd_map.h @@ -0,0 +1,65 @@ +/** + * \file + * + * + * \brief Keyboard map definitions. + * + * \author Andrea Righi + */ + +#ifndef HW_KBD_MAP_H +#define HW_KBD_MAP_H + +#include + +/** + * Type for keyboard mask. + */ +typedef uint16_t keymask_t; + +/** + * \name Keycodes. + */ +/*@{*/ +#define K_UP BV(0) +#define K_DOWN BV(1) +#define K_LEFT BV(2) +#define K_RIGHT BV(3) +#define K_OK BV(4) +#define K_CANCEL BV(8) + +#define K_REPEAT BV(13) /**< This is a repeated keyevent. */ +#define K_TIMEOUT BV(14) /**< Fake key event for timeouts. */ +#define K_LONG BV(15) +/*@}*/ + +#define K_LNG_MASK 0 + +#endif /* HW_KBD_MAP_H */ diff --git a/2.5/examples/lm3s8962/lm3s8962.c b/2.5/examples/lm3s8962/lm3s8962.c new file mode 100644 index 00000000..d9f0c49d --- /dev/null +++ b/2.5/examples/lm3s8962/lm3s8962.c @@ -0,0 +1,366 @@ +/** + * \file + * + * + * \brief LM3S8962 Cortex-M3 testcase + * + * \author Andrea Righi + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cfg/compiler.h" +#include "cfg/cfg_gfx.h" + +#include "hw/hw_rit128x96.h" + +#define PROC_STACK_SIZE KERN_MINSTACKSIZE * 2 + +#if CONFIG_KERN_HEAP +#define hp_stack NULL +#define lp_stack NULL +#define ser_stack NULL +#define led_stack NULL +#else +static PROC_DEFINE_STACK(hp_stack, PROC_STACK_SIZE); +static PROC_DEFINE_STACK(lp_stack, PROC_STACK_SIZE); +static PROC_DEFINE_STACK(ser_stack, PROC_STACK_SIZE); +static PROC_DEFINE_STACK(led_stack, PROC_STACK_SIZE); +#endif + +extern Font font_gohu; +static uint8_t raster[RAST_SIZE(LCD_WIDTH, LCD_HEIGHT)]; +static Bitmap lcd_bitmap; + +#define KEY_MASK (K_UP | K_DOWN | K_LEFT | K_RIGHT | K_OK) + +static Process *hp_proc, *lp_proc, *led_proc; +static hptime_t start, end; + +static Serial ser_port; + +static void led_init(void) +{ + /* Enable the GPIO port that is used for the on-board LED */ + SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOF; + /* + * Perform a dummy read to insert a few cycles delay before enabling + * the peripheral. + */ + (void)SYSCTL_RCGC2_R; + /* Enable the GPIO pin for the LED */ + GPIO_PORTF_DIR_R = 0x01; + GPIO_PORTF_DEN_R = 0x01; +} + +INLINE void led_on(void) +{ + GPIO_PORTF_DATA_R |= 0x01; +} + +INLINE void led_off(void) +{ + GPIO_PORTF_DATA_R &= ~0x01; +} + +static bool led_blinking; + +static void NORETURN led_process(void) +{ + int i; + + for (i = 0; ; i++) + { + if (!led_blinking) + { + led_off(); + sig_wait(SIG_USER0); + } + if (i & 1) + led_on(); + else + led_off(); + timer_delay(50); + } +} + +static void led_test(UNUSED_ARG(Bitmap *, bm)) +{ + led_blinking = !led_blinking; + sig_send(led_proc, SIG_USER0); +} + +static void bouncing_logo(Bitmap *bm) +{ + const long SPEED_SCALE = 1000; + const long GRAVITY_ACCEL = 100; + const long BOUNCE_ELASTICITY = 1; + long h = (long)(-bertos_logo.height) * SPEED_SCALE; + long speed = 0, i; + + for (i = 0; ; i++) + { + /* Move */ + h += speed; + + /* Gravity acceleration */ + speed += GRAVITY_ACCEL; + + if (h > 0 && speed > 0) + { + /* Bounce */ + speed = -(speed / BOUNCE_ELASTICITY); + + } + /* Update graphics */ + gfx_bitmapClear(bm); + gfx_blitImage(bm, + (LCD_WIDTH - bertos_logo.width) / 2, + (LCD_HEIGHT - bertos_logo.height) / 2 + h / SPEED_SCALE, + &bertos_logo); + text_xprintf(bm, 7, 0, TEXT_FILL | TEXT_CENTER, "Press SELECT to quit"); + rit128x96_blitBitmap(bm); + timer_delay(15); + if (kbd_peek() & KEY_MASK) + break; + } +} + +static void screen_saver(Bitmap *bm) +{ + int x1, y1, x2, y2; + int i; + + for (i = 0; ; i++) + { + x1 = i % LCD_WIDTH; + y1 = i % LCD_HEIGHT; + + x2 = LCD_WIDTH - i % LCD_WIDTH; + y2 = LCD_HEIGHT - i % LCD_HEIGHT; + + gfx_bitmapClear(bm); + gfx_rectDraw(bm, x1, y1, x2, y2); + rit128x96_blitBitmap(bm); + if (kbd_peek() & KEY_MASK) + break; + } +} + +INLINE hptime_t get_hp_ticks(void) +{ + return (TIMER_HW_CNT - timer_hw_hpread()) + + timer_clock_unlocked() * TIMER_HW_CNT; +} + +static void NORETURN hp_process(void) +{ + while (1) + { + sig_wait(SIG_USER0); + end = get_hp_ticks(); + timer_delay(100); + sig_send(lp_proc, SIG_USER0); + } +} + +static void NORETURN lp_process(void) +{ + while (1) + { + start = get_hp_ticks(); + sig_send(hp_proc, SIG_USER0); + sig_wait(SIG_USER0); + } +} + +static void res_process(void) +{ + const char spinner[] = {'/', '-', '\\', '|'}; + int i; + char c; + + for (i = 0; ; i++) + { + /* Show context switch (in clock cycles) */ + c = spinner[i % countof(spinner)]; + text_xprintf(&lcd_bitmap, 3, 0, TEXT_CENTER | TEXT_FILL, "%c Context switch %c", c, c); + text_xprintf(&lcd_bitmap, 5, 0, TEXT_FILL, " %lu clock cycles", end - start); + /* Show context switch (in usec) */ + text_xprintf(&lcd_bitmap, 6, 0, TEXT_FILL, + " %lu.%lu usec", + ((end - start) * 1000000) / CPU_FREQ, + ((end - start) * (100000000 / CPU_FREQ)) % 100); + rit128x96_blitBitmap(&lcd_bitmap); + timer_delay(5); + if (kbd_peek() & KEY_MASK) + break; + } +} + +static void context_switch_test(Bitmap *bm) +{ + gfx_bitmapClear(bm); + text_xprintf(bm, 0, 0, TEXT_FILL, + "CPU: Cortex-M3 %luMHz", CPU_FREQ / 1000000); + rit128x96_blitBitmap(bm); + text_xprintf(bm, 1, 0, TEXT_FILL, "Board: LM3S8962 EVB"); + rit128x96_blitBitmap(bm); + + res_process(); +} + +static void uptime(Bitmap *bm) +{ + extern const Font font_luBS14; + const Font *old_font; + + old_font = bm->font; + + /* Set big font */ + gfx_bitmapClear(bm); + gfx_setFont(bm, &font_luBS14); + text_xprintf(bm, 0, 0, TEXT_FILL | TEXT_CENTER, "Uptime"); + while (1) + { + ticks_t clock = ticks_to_ms(timer_clock_unlocked()); + + /* Display uptime (in ticks) */ + text_xprintf(&lcd_bitmap, 2, 0, TEXT_FILL | TEXT_CENTER, + "%lu", clock / 1000); + rit128x96_blitBitmap(bm); + timer_delay(5); + if (kbd_peek() & KEY_MASK) + break; + } + gfx_setFont(bm, old_font); +} + +static void NORETURN soft_reset(Bitmap * bm) +{ + extern const Font font_luBS14; + int i; + + /* Set big font */ + gfx_bitmapClear(bm); + gfx_setFont(bm, &font_luBS14); + for (i = 5; i; --i) + { + text_xprintf(bm, 2, 0, TEXT_FILL | TEXT_CENTER, "%d", i); + rit128x96_blitBitmap(bm); + timer_delay(1000); + } + text_xprintf(bm, 2, 0, TEXT_FILL | TEXT_CENTER, "REBOOT"); + rit128x96_blitBitmap(bm); + timer_delay(1000); + + /* Perform a software reset request */ + HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ; + UNREACHABLE(); +} + +static void NORETURN ser_process(void) +{ + char buf[32]; + int i; + + ser_init(&ser_port, SER_UART0); + ser_setbaudrate(&ser_port, 115200); + + /* BeRTOS terminal */ + for (i = 0; ; i++) + { + kfile_printf(&ser_port.fd, "\n\r[%03d] BeRTOS:~$ ", i); + kfile_gets_echo(&ser_port.fd, buf, sizeof(buf), true); + kfile_printf(&ser_port.fd, "%s", buf); + } +} + +static struct MenuItem main_items[] = +{ + { (const_iptr_t)"LED blinking", 0, (MenuHook)led_test, (iptr_t)&lcd_bitmap }, + { (const_iptr_t)"Bouncing logo", 0, (MenuHook)bouncing_logo, (iptr_t)&lcd_bitmap }, + { (const_iptr_t)"Screen saver demo", 0, (MenuHook)screen_saver, (iptr_t)&lcd_bitmap }, + { (const_iptr_t)"Scheduling test", 0, (MenuHook)context_switch_test, (iptr_t)&lcd_bitmap }, + { (const_iptr_t)"Show uptime", 0, (MenuHook)uptime, (iptr_t)&lcd_bitmap }, + { (const_iptr_t)"Reboot", 0, (MenuHook)soft_reset, (iptr_t)&lcd_bitmap }, + { (const_iptr_t)0, 0, NULL, (iptr_t)0 } +}; +static struct Menu main_menu = { main_items, "BeRTOS", MF_STICKY | MF_SAVESEL, &lcd_bitmap, 0, rit128x96_blitBitmap }; + +int main(void) +{ + IRQ_ENABLE; + kdbg_init(); + + kputs("Init LED.."); + led_init(); + kputs("Done.\n"); + kputs("Init Timer.."); + timer_init(); + kputs("Done.\n"); + kputs("Init Process.."); + proc_init(); + kputs("Done.\n"); + + kputs("Init OLED display.."); + rit128x96_init(); + gfx_bitmapInit(&lcd_bitmap, raster, LCD_WIDTH, LCD_HEIGHT); + gfx_setFont(&lcd_bitmap, &font_gohu); + rit128x96_blitBitmap(&lcd_bitmap); + kputs("Done.\n"); + kputs("Init Keypad.."); + kbd_init(); + kputs("Done.\n"); + hp_proc = proc_new(hp_process, NULL, PROC_STACK_SIZE, hp_stack); + lp_proc = proc_new(lp_process, NULL, PROC_STACK_SIZE, lp_stack); + led_proc = proc_new(led_process, NULL, PROC_STACK_SIZE, led_stack); + /* Open a dummy echo terminal on UART0 */ + proc_new(ser_process, NULL, PROC_STACK_SIZE, ser_stack); + + proc_setPri(hp_proc, 2); + proc_setPri(lp_proc, 1); + while (1) + { + menu_handle(&main_menu); + cpu_relax(); + } +} diff --git a/2.5/examples/lm3s8962/lm3s8962.mk b/2.5/examples/lm3s8962/lm3s8962.mk new file mode 100644 index 00000000..c01fcf9c --- /dev/null +++ b/2.5/examples/lm3s8962/lm3s8962.mk @@ -0,0 +1,79 @@ +# Copyright 2010 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Author: Andrea Righi +# + +# Set to 1 for debug builds +lm3s8962_DEBUG = 0 + +include bertos/fonts/fonts.mk + +# Our target application +TRG += lm3s8962 + +lm3s8962_CSRC = \ + examples/lm3s8962/lm3s8962.c \ + bertos/gfx/bitmap.c \ + bertos/gfx/line.c \ + bertos/gfx/win.c \ + bertos/gfx/text.c \ + bertos/gfx/text_format.c \ + bertos/gui/menu.c \ + bertos/fonts/gohu.c \ + bertos/fonts/luBS14.c \ + bertos/icons/logo.c \ + bertos/mware/formatwr.c \ + bertos/mware/hex.c \ + bertos/mware/sprintf.c \ + bertos/mware/event.c \ + bertos/struct/heap.c \ + bertos/drv/timer.c \ + bertos/drv/ser.c \ + bertos/drv/kbd.c \ + bertos/drv/lcd_rit128x96.c \ + bertos/kern/kfile.c \ + bertos/kern/monitor.c \ + bertos/kern/proc_test.c \ + bertos/kern/proc.c \ + bertos/kern/signal.c \ + bertos/cpu/cortex-m3/drv/gpio_lm3s.c \ + bertos/cpu/cortex-m3/drv/clock_lm3s.c \ + bertos/cpu/cortex-m3/drv/ser_lm3s.c \ + bertos/cpu/cortex-m3/drv/kdebug_lm3s.c \ + bertos/cpu/cortex-m3/drv/ssi_lm3s.c \ + bertos/cpu/cortex-m3/drv/timer_cm3.c \ + bertos/cpu/cortex-m3/drv/irq_cm3.c \ + bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \ + bertos/cpu/cortex-m3/hw/init_cm3.c + +lm3s8962_CPPASRC = \ + bertos/cpu/cortex-m3/hw/vectors_cm3.S \ + bertos/cpu/cortex-m3/hw/crt_cm3.S \ + # + +# This is an hosted application +lm3s8962_PREFIX = arm-none-eabi- + +lm3s8962_CPPAFLAGS = -mthumb -mno-thumb-interwork +lm3s8962_CPPFLAGS = -D'ARCH=0' -D__ARM_LM3S8962__ -D'CPU_FREQ=(50000000L)' -D'WIZ_AUTOGEN' -mthumb -mno-thumb-interwork -Iexamples/lm3s8962 -Ibertos/cpu/cortex-m3 -fno-strict-aliasing -fwrapv +lm3s8962_LDFLAGS = -nostartfiles -T bertos/cpu/cortex-m3/scripts/lm3s8962_rom.ld -Wl,--no-warn-mismatch -mthumb -mno-thumb-interwork + +lm3s8962_CPU = cortex-m3 + +lm3s8962_PROGRAMMER_CPU = lm3s +lm3s8962_PROGRAMMER_TYPE = luminary +lm3s8962_FLASH_SCRIPT = bertos/prg_scripts/arm/flash-lm3s.sh +lm3s8962_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh +lm3s8962_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh +lm3s8962_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh + +ifeq ($(lm3s8962_DEBUG),0) + # Production options + lm3s8962_CFLAGS += -O2 -fomit-frame-pointer + lm3s8962_CXXFLAGS += -O2 -fomit-frame-pointer +else + # Debug options + lm3s8962_CPPAFLAGS += -g -gdwarf-2 + lm3s8962_CPPFLAGS += -O0 -g3 -gdwarf-2 -fverbose-asm +endif diff --git a/2.5/examples/randpool/randpool_demo.c b/2.5/examples/randpool/randpool_demo.c new file mode 100644 index 00000000..3010cd10 --- /dev/null +++ b/2.5/examples/randpool/randpool_demo.c @@ -0,0 +1,251 @@ +/** + * \file + * + * + * \brief Test function for randpool API. + * + * This program return a rand number generate from randpool function. + * For use randpool function you need a souce of entropy. In this + * program you can choose from: + * - /dev/random + * - /dev/urandom + * - /dev/input/mouse0 + * + * There are 3 mode of output: + * - binmode: program generate a sequenze of random byte. + * - Matrix of random number for octave program. + * - Vector of random number for octave program. + * + * \version $Id$ + * \author Daniele Basile + */ + +/*#* + *#* $Log$ + *#* Revision 1.1 2007/02/15 18:17:51 asterix + *#* Add randpool test program. + *#* + *#*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define LEN 256 //Size of buffer containing a random number. +#define SAMPLE 1000 //Defoult number of byte that put in entropy pool. + +int main (int argc, char *argv[]) +{ + EntropyPool pool; + uint8_t ch; + uint8_t buff[LEN]; + FILE *pdev; + int opt = getopt (argc, argv, "murh"); + int samp = SAMPLE; + int round = 10; + int mode = 0; + int pass = 0; + + timer_init(); + + randpool_init(&pool, NULL, 0); //Init a entropy pool. + + /* + * Chose a source of entropy. + */ + switch(opt) + { + case 'm': + { + pdev = fopen("/dev/input/mouse0", "r"); + break; + } + case 'u': + { + pdev = fopen("/dev/urandom", "r"); + break; + } + case 'r': + { + pdev = fopen("/dev/random", "r"); + break; + } + case 'h': + { + } + default: + { + printf("\n"); + printf("\n"); + printf("randpool_demo [OPTION] [SAMPLE] [ROUND] [MODE]\n"); + printf("\n"); + printf("OPTION:\n"); + printf(" -r /dev/random\n"); + printf(" -u /dev/urandom\n"); + printf(" -m /dev/input/mouse0\n"); + printf("\n"); + printf("SAMPLE:\n"); + printf(" num number of entropy byte to put in etropy pool.\n"); + printf("\n"); + printf("ROUND:\n"); + printf(" num number call of randpool_get function.\n"); + printf("\n"); + printf("MODE:\n"); + printf(" 0 binmode\n"); + printf(" 1 vector mode\n"); + printf(" 2 matrix mode\n"); + printf("\n"); + printf("Test program of randpool API.\n"); + printf("This program create an entropy pool of 256byte, and fill it\n"); + printf("with entropy from a exsternal source. This source can be:\n"); + printf(" - /dev/random (option: -r)\n"); + printf(" - /dev/urandom (option: -u)\n"); + printf(" - /dev/input/mouse0 (option: -m)\n"); + printf("\n"); + printf("Once the pool is full, program call a randpool_get ROUND time,\n"); + printf("printing on STDOUT random value, in accord with a select mode.\n"); + printf("The mode are:\n"); + printf(" - binmode: program print on STDOUT random byte. (option: 0 (defaul mode)\n"); + printf(" - vector mode: program print on STDOUT a ROUND vector of random value.\n"); + printf(" The output is format for octave program. (option: 1)\n"); + printf(" - matrix mode: program print on STDOUT a matrix of random value.\n"); + printf(" The output is format for octave program. (option: 2)\n"); + printf("\n"); + exit(1); + } + + } + + /* + * + */ + if(argc > 2) + { + if(argv[2]) + samp = atoi(argv[2]); //Number of byte take from entropy source + if(argv[3]) + round = atoi(argv[3]); //Number of time we call randpool_get. + if(argv[4]) + { + switch(atoi(argv[4])) + { + case 1: + { + mode = 1; + printf("# Created by Asterix.\n"); + printf("# name: __nargin__\n"); + printf("# type: scalar\n"); + printf("0\n"); + break; + } + case 2: + { + mode = 2; + printf("# Created by Asterix.\n"); + printf("# name: __nargin__\n"); + printf("# type: scalar\n"); + printf("0\n"); + break; + } + default: + { + break; + } + + } + + } + + } + + /* + * Add byte to entropy pool from a source of entropy. + */ + for(int i = 0; i < samp; i++) + { + + ch = fgetc(pdev); + randpool_add(&pool, &ch, sizeof(ch)); + + } + + fclose(pdev); + + + for(int k = 0; k < round; k++) + { + switch(mode) + { + case 1: + { + printf("\n"); + printf("\n# name: vet%d",k); + printf("\n# type: matrix"); + printf("\n# rows: 1"); + printf("\n# columns: %d\n", LEN); + pass = 1; + break; + } + case 2: + { + printf("\n"); + printf("\n# name: randMatrix"); + printf("\n# type: matrix"); + printf("\n# rows: %d",round); + printf("\n# columns: %d\n", LEN); + pass = 1; + mode = 0; + break; + } + } + + randpool_get(&pool, buff, LEN); + + if(pass) + { + for(int j = 0; j < LEN; j++) + { + printf("%d ", buff[j]); + } + printf("\n"); + } + else + fwrite(buff, sizeof(uint8_t), LEN, stdout); + } + + +} + diff --git a/2.5/examples/randpool/randpool_demo.mk b/2.5/examples/randpool/randpool_demo.mk new file mode 100644 index 00000000..4c0d738d --- /dev/null +++ b/2.5/examples/randpool/randpool_demo.mk @@ -0,0 +1,39 @@ +# +# $Id$ +# Copyright 2006 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Makefile fragment for DevLib randpool_demo application. +# +# Author: Daniele Basile +# +# $Log$ +# Revision 1.1 2007/02/15 18:17:51 asterix +# Add randpool test program. +# +# + + +# Set to 1 for debug builds +randpool_demo_DEBUG = 0 + +randpool_demo_HOSTED = 1 + +# Our target application +TRG += randpool_demo + +randpool_demo_CSRC = \ + examples/randpool/randpool_demo.c \ + algos/randpool.c \ + algos/md2.c \ + drv/timer.c \ + os/hptime.c + +randpool_demo_CFLAGS = -O0 -D'ARCH=0' -Iexamples/randpool/ -Iexamples/randpool/hw + +# Debug stuff +ifeq ($(randpool_demo_DEBUG),1) + randpool_demo_CFLAGS += -D_DEBUG + randpool_demo_PCSRC += drv/kdebug.c +endif + diff --git a/2.5/examples/test/armtest.mk b/2.5/examples/test/armtest.mk new file mode 100644 index 00000000..d338aa55 --- /dev/null +++ b/2.5/examples/test/armtest.mk @@ -0,0 +1,32 @@ +# +# $Id: armtest.mk 18234 2007-10-08 13:39:48Z rasky $ +# Copyright 2006 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Makefile fragment for DevLib armtest application. +# +# Author: Bernie Innocenti +# +# + +# Set to 1 for debug builds +armtest_DEBUG = 1 + +# Our target application +TRG += armtest + +#include arm c and asm sources +include ./examples/test/arm_src.mk + +armtest_CSRC = $(arm_CSRC) examples/test/empty_main.c + +armtest_CPPASRC = $(arm_ASRC) + +armtest_PREFIX = arm-none-eabi- + +armtest_CPPAFLAGS = -O0 -g -gdwarf-2 -g +armtest_CPPFLAGS = -O0 -D'ARCH=ARCH_NIGHTTEST' -D__ARM_AT91SAM7S256__ -D'CPU_FREQ=(48023000UL)' -D'WIZ_AUTOGEN' -g3 -gdwarf-2 -fverbose-asm -Iexamples/test -Ibertos/cpu/arm +armtest_LDFLAGS = -nostartfiles -T bertos/cpu/arm/scripts/at91sam7_256_rom.ld -Wl,--no-warn-mismatch + +armtest_CPU = arm7tdmi + diff --git a/2.5/examples/test/avrtest.mk b/2.5/examples/test/avrtest.mk new file mode 100644 index 00000000..d1f93e60 --- /dev/null +++ b/2.5/examples/test/avrtest.mk @@ -0,0 +1,32 @@ +# +# $Id: avrtest.mk,v 1.3 2006/06/12 21:37:02 marco Exp $ +# Copyright 2006 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Makefile fragment for DevLib avrtest application. +# +# Author: Bernie Innocenti +# + + + +# Set to 1 for debug builds +avrtest_DEBUG = 1 + +# Our target application +TRG += avrtest + +avrtest_MCU = atmega64 + +#include avr c and asm sources +include examples/test/avr_src.mk + +avrtest_CSRC = $(avr_CSRC) examples/test/empty_main.c + +avrtest_CPPASRC = $(avr_ASRC) + +avrtest_PCSRC += bertos/mware/formatwr.c + +avrtest_PREFIX = avr- +avrtest_CPPFLAGS = -D'ARCH=ARCH_NIGHTTEST' -D'CPU_FREQ=(12288000UL)' -D'WIZ_AUTOGEN' -Iexamples/test -Ibertos/cpu/avr +avrtest_CFLAGS = -Os -mcall-prologues -fno-strict-aliasing diff --git a/2.5/examples/test/empty_main.c b/2.5/examples/test/empty_main.c new file mode 100644 index 00000000..66a8e4ad --- /dev/null +++ b/2.5/examples/test/empty_main.c @@ -0,0 +1,47 @@ +/** + * \file + * + * + * \brief Hardware-specific definitions + * + * \version $Id$ + * + * \author Daniele Basile + */ + +int main(void) +{ + for(;;) + { + } + + return 0; +} diff --git a/2.5/spec/at91sam7s-ek/at91sam7s-ek.bdef b/2.5/spec/at91sam7s-ek/at91sam7s-ek.bdef new file mode 100644 index 00000000..7ce27080 --- /dev/null +++ b/2.5/spec/at91sam7s-ek/at91sam7s-ek.bdef @@ -0,0 +1,48 @@ +# +#-*- coding: utf-8 -*- +# +# \file +# +# +# Settings and definitions for the AT91SAM7S-EK board. +# +# This file contain all info for the BeRTOS wizard. +# +# \author Daniele Basile +# +# + +# List of the BeRTOS's supported cpu. +BOARD_CPU_CORE = "at91sam7s256" + +# On this board the following drivers are supported. +BOARD_DRV = [ "adc", "kdebug", "pwm", "ser", "timer", "twi" ] + diff --git a/2.5/test/afsk_test.au b/2.5/test/afsk_test.au new file mode 100644 index 0000000000000000000000000000000000000000..7b12ce8d9841b4a0bd0c82a41627e3e429242bea GIT binary patch literal 167000 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%0AQl~-YrojTbHh%CSFH=BRVfT>^8X| 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 + +# This file scan a module configuration file (cfg_module.h) +# and tries to enable all configuration options. +# This is useful in nightly test to test all possible configurations. + +# A whitelist of options that should not be enabled is supplied. + +import sys +import re + +# Options that should be left disabled +whitelist = [ + 'CONFIG_BATTFS_SHUFFLE_FREE_PAGES', + 'CONFIG_FAT_FS_READONLY', + 'CONFIG_INTERNAL_COMMANDS', + 'CONFIG_KERN_IRQ', + 'CONFIG_KERN_HEAP', + 'CONFIG_KERN_PREEMPT', + 'RAMP_USE_FLOATING_POINT', + 'CONFIG_SER_HWHANDSHAKE', + 'CONFIG_KDEBUG_PORT', +] + +tests = [ + '#define T_0 0\n', + '#define T_1 0\n', + ' #define T_2 0 \n', + '#define T_3 0 /* */\n', + '#define T_4 0/* */\n', +] +no_tests = [ + '#define T_1 0A\n', + '#define T_1 0x0A/* */\n', + '#define T_1 0UL /* */\n', + '#define T_1 0UL/* */\n', +] +pattern = r'\s*#define\s+(\w+)\s+(0)(?:\s+|/|$)' + +def f(match): + if match.group(1) in whitelist: + return match.group(0) + else: + data = match.group(0) + sx = match.start(2) - match.start(0) + ex = match.end(2) - match.end(0) + return data[:sx] + '1' + data[ex:] + +if len(sys.argv) == 1: + for t in tests: + print t, re.subn(pattern, f, t)[0] + print '-' * 42 + for t in no_tests: + print t, re.subn(pattern, f, t)[0] +else: + data = file(sys.argv[1]).read() + data, count = re.subn(pattern, f, data) + if count: + file(sys.argv[1], 'w').write(data) diff --git a/2.5/test/gen_mk_src.sh b/2.5/test/gen_mk_src.sh new file mode 100755 index 00000000..820e3917 --- /dev/null +++ b/2.5/test/gen_mk_src.sh @@ -0,0 +1,60 @@ +#!/bin/bash +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# Nighlty test for BeRTOS. +# +# Author Daniele Basile + +#Bertos dir, write with escape char for sed regrepx +BERTOS_DIR_RE="\\.\\/bertos" + +#Test script dir, where are test script +TEST_SCRIPT_DIR="test" + +#Test directory, where are the test makefile +TEST_APP_DIR="examples/test/" + +if [ $# \< 1 ] ; then + printf "You must specify a cpu target!\n\n" + printf "EXAMPLE:\n $0 \n\n" + + exit 1 +fi + +#Get list of source for selected cpu target +CSRC=`${TEST_SCRIPT_DIR}/get_source_list.sh $1 c` +ASRC=`${TEST_SCRIPT_DIR}/get_source_list.sh $1 S` +#ASRC= + +#kdebug must added to skip list because it is compiled two times and the linker fail. +CSRC=`echo $CSRC | sed -e "s/${BERTOS_DIR_RE}\\/drv\\/kdebug\\.c//g"` + +printf "#This makefile was generate automatically.\n\n" > ${TEST_APP_DIR}/$1_src.mk +printf "${1}_CSRC = $CSRC\n\n" >> ${TEST_APP_DIR}/$1_src.mk +printf "${1}_ASRC = $ASRC\n\n" >> ${TEST_APP_DIR}/$1_src.mk + diff --git a/2.5/test/get_source_list.sh b/2.5/test/get_source_list.sh new file mode 100755 index 00000000..41f99ca6 --- /dev/null +++ b/2.5/test/get_source_list.sh @@ -0,0 +1,95 @@ +#!/bin/bash +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# Nighlty test for BeRTOS. +# +# Author Daniele Basile + +#Directories +BERTOS_DIR="./bertos" +COPY_DIR="./bertos.saved" +CPU_DIR="${BERTOS_DIR}/cpu" + +#Directory to exclude +OS_DIR="${BERTOS_DIR}/os" +EMUL_DIR="${BERTOS_DIR}/emul" +WIZARD_DIR="./wizard" +APP_DIR="./examples ./boards" +FAT_DIR="${BERTOS_DIR}/fs/fatfs" +NMEA_DIR="${BERTOS_DIR}/net/nmeap" + +if [ $# \< 2 ] ; then + printf "You must specify a cpu target, and source file type!\n" + printf "EXAMPLE:\n $0 \n\n" + + exit 1 +fi +CPU_TARGET=$1 +EXCLUDE_DIRS="$COPY_DIR $CPU_DIR $APP_DIR $OS_DIR $WIZARD_DIR $EMUL_DIR $FAT_DIR $NMEA_DIR" +EXCLUDE_CMD="\.svn -prune " +for i in $EXCLUDE_DIRS; do + EXCLUDE_CMD="$EXCLUDE_CMD -o -path $i -prune "; +done + +#Create a list of source file without a cpu specific source +GEN_SRC=`find . \( -name $EXCLUDE_CMD \) -o -name *.${2} -print | xargs` + +#Select c and asm sources for selected cpu target +TRG_SRC=`find ${CPU_DIR}/$CPU_TARGET -name \.svn -prune -o -name *.${2} -print | xargs` + +#Generate a list of all source for each cpu +SRC_ALL=${GEN_SRC}" "${TRG_SRC} + +# Find the files that contain the string +# NOTEST +# or +# NOTEST all +# and put them in a list + +NOTEST="notest:" +for src in $SRC_ALL ; +do + grep -P "$NOTEST\s*$CPU_TARGET" $src 2>&1 > /dev/null + if [ $? -eq 0 ] ; then + EXCLUDE_LIST="$EXCLUDE_LIST $src" + fi + grep -P "$NOTEST\s*all" $src 2>&1 > /dev/null + if [ $? -eq 0 ] ; then + EXCLUDE_LIST="$EXCLUDE_LIST $src" + fi +done + +# Remove the exclude list files from the sources to be +# compiled +for src in $EXCLUDE_LIST ; +do + SRC_ALL=`echo $SRC_ALL | sed -e "s;$src;;g"` +done + +printf "${SRC_ALL}" + diff --git a/2.5/test/ini_reader_file.ini b/2.5/test/ini_reader_file.ini new file mode 100644 index 00000000..606c439c --- /dev/null +++ b/2.5/test/ini_reader_file.ini @@ -0,0 +1,16 @@ +[First] +String=noot +Val=1 +Empty= +#comment + +[Second] +Val = 2 +String = mies +Long key = "long value" +comment = line with #comment +#comment=3 + +[Long section with spaces] +value = long value +no_new_line = value \ No newline at end of file diff --git a/2.5/test/log_nightly_test.sh b/2.5/test/log_nightly_test.sh new file mode 100755 index 00000000..fa3ffb10 --- /dev/null +++ b/2.5/test/log_nightly_test.sh @@ -0,0 +1,83 @@ +#!/bin/bash +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# Nighlty test for BeRTOS. +# +# Author Daniele Basile + +LOG_FILE="out" +DISPLAY_LINE="0" +HIDE_WARNING="TODO" +SHOW_MSG='warning|error' + + +if [ $# = 1 ] ; then + printf "Use the default settings.\n" +else + for i in "$@" ; + do + case $i in + "-file") + LOG_FILE=$2 + ;; + + "-hide") + HIDE_WARNING=$2 + ;; + "-show") + SHOW_MSG=$2 + shift + ;; + "-n") + echo "n" $2 + DISPLAY_LINE=$2 + ;; + esac + + #skip to next srgument + shift + done + +fi + +printf "Current settings:\n" +printf "Log file: "${LOG_FILE}"\n" +printf "Show message: "${SHOW_MSG}"\n" +printf "Hide warning message: "${HIDE_WARNING}"\n" +printf "Display line around to warning/error message: "${DISPLAY_LINE}"\n" + +if [ $DISPLAY_LINE = 0 ] ; then + GREP_ARGS="" +else + GREP_ARGS="-n"${DISPLAY_LINE} +fi + + +tail -f ${LOG_FILE} | grep -v ${HIDE_WARNING} | sed -e "s/^/vi /" | sed -e "s/:/ +/" | grep $GREP_ARGS -E ${SHOW_MSG} + + diff --git a/2.5/test/nightly_test.sh b/2.5/test/nightly_test.sh new file mode 100755 index 00000000..afe17321 --- /dev/null +++ b/2.5/test/nightly_test.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# Nighlty test for BeRTOS. +# +# Author Daniele Basile + +#Makefile test directory +MAKEFILE_TEST_DIR="." +TEST_DIR="test" +BERTOS_DIR="bertos/" +BERTOS_DIR_BAK="bertos.saved" +OPTS=1 +if [ $# = 1 ] ; then + if [ $1 = "-h" ] ; then + printf "Nightly test help.\n" + printf "\t--no-silent disable the silent of the TODO/FIXME warning messages.\n" + exit 1 + elif [ $1 = "--no-silent" ] ; then + OPTS=0 + fi +fi + +if [ $OPTS = 1 ] ; then +#Copy BeRTOS sources +printf "Starting nightlytest..\n" + printf "Silent mode enabled: removing the TODO/FIXME messages.\n" + cp -R $BERTOS_DIR $BERTOS_DIR_BAK || exit 1 + + #Strip away TODOs and FIXME + find $BERTOS_DIR -name "*.[ch]" | xargs perl -p -i -e 's/^\s*#warning\s*(TODO|FIXME).*//g;' + CFG_LIST=`find $BERTOS_DIR/cfg -name "cfg_*.h"` + for i in $CFG_LIST ; + do + $TEST_DIR/enablecfg.py $i + done +fi + +#Cpu targets that we want to test +TRG="avr arm" + +for i in $TRG ; +do + ${TEST_DIR}/gen_mk_src.sh $i +done + +#Clean and launch make on all +make -f ${MAKEFILE_TEST_DIR}/Makefile.test clean +make -f ${MAKEFILE_TEST_DIR}/Makefile.test +RET=$? +if [ $OPTS = 1 ] ; then + #Restore original sources + if [ -d $BERTOS_DIR_BAK ] ; then + printf "Exiting from nightly..\n" + rm -rf $BERTOS_DIR + mv $BERTOS_DIR_BAK $BERTOS_DIR + else + printf "Unable to restore backup copy\n" + exit 1 + fi +fi + +printf "Nightly test done.\n\n" +exit $RET + diff --git a/2.5/test/parselog.py b/2.5/test/parselog.py new file mode 100755 index 00000000..53506262 --- /dev/null +++ b/2.5/test/parselog.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# Author Francesco Sacchi + +import sys + +f = file(sys.argv[1]) +warn_suppress_cnt = 0 +for line in f: + if "__FILTER_NEXT_WARNING__" in line: + warn_suppress_cnt += 2 + + if "warning" in line: + if warn_suppress_cnt == 0: + print line, + else: + warn_suppress_cnt -= 1 + + if "error" in line: + print line, + diff --git a/2.5/test/parsetest.py b/2.5/test/parsetest.py new file mode 100755 index 00000000..326bd3ff --- /dev/null +++ b/2.5/test/parsetest.py @@ -0,0 +1,47 @@ +#!/usr/bin/python +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# Parser for unittest. +# +# Author Lorenzo "Mandingo" Mancini +# Author Francesco Sacchi + + +from __future__ import with_statement +import sys +import os + +TOKEN = "$test$:" +with open(sys.argv[1]) as f: + for line in f: + idx = line.find(TOKEN) + if idx != -1: + cmd = line[idx + len(TOKEN):].strip() + if os.system(cmd) != 0: + sys.exit(1) + sys.exit(0) diff --git a/2.5/test/run_tests.sh b/2.5/test/run_tests.sh new file mode 100755 index 00000000..916be6ba --- /dev/null +++ b/2.5/test/run_tests.sh @@ -0,0 +1,109 @@ +#!/bin/bash +# +# Copyright 2005 Develer S.r.l. (http://www.develer.com/) +# Copyright 2008 Bernie Innocenti +# +# Version: $Id$ +# Author: Bernie Innocenti +# + +# Testsuite output level: +# 0 - quiet +# 1 - progress output +# 2 - build warnings +# 3 - execution output +# 4 - build commands +VERBOSE=${VERBOSE:-1} + +CC=gcc +#FIXME: -Ibertos/emul should not be needed +CFLAGS="-W -Wall -Wextra -Wundef -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wsign-compare -Wmissing-noreturn \ +-O0 -g3 -ggdb -Ibertos -Ibertos/emul -std=gnu99 -fno-builtin -D_DEBUG -DARCH=(ARCH_EMUL|ARCH_UNITTEST) \ +-DCPU_FREQ=(12288000UL) -ffunction-sections -fdata-sections -Wl,--gc-sections" + +CXX=g++ +CXXFLAGS="$CFLAGS" + +TESTS=${TESTS:-`find . \ + \( -name .svn -prune -o -name .git -prune -o -name .hg -prune \) \ + -o -name "*_test.c" -print` } + +TESTOUT="testout" +SRC_LIST=" + bertos/algo/ramp.c + bertos/drv/kdebug.c + bertos/drv/timer.c + bertos/fs/battfs.c + bertos/kern/kfile.c + bertos/kern/monitor.c + bertos/kern/proc.c + bertos/kern/signal.c + bertos/kern/sem.c + bertos/kern/preempt.c + bertos/mware/event.c + bertos/mware/formatwr.c + bertos/mware/hex.c + bertos/mware/sprintf.c + bertos/os/hptime.c + bertos/struct/kfile_fifo.c + bertos/struct/heap.c + bertos/struct/hashtable.c + bertos/fs/fatfs/ff.c + bertos/emul/diskio_emul.c + bertos/fs/fat.c + bertos/emul/switch_ctx_emul.S + bertos/mware/ini_reader.c + bertos/emul/kfile_posix.c + bertos/algo/crc_ccitt.c + bertos/algo/crc.c + bertos/struct/kfile_mem.c + bertos/net/ax25.c + bertos/net/afsk.c + bertos/net/nmeap/src/nmeap01.c + bertos/net/nmea.c + bertos/cfg/kfile_debug.c +" + +buildout='/dev/null' +runout='/dev/null' +[ "$VERBOSE" -ge 2 ] && buildout='/dev/stdout' +[ "$VERBOSE" -ge 3 ] && runout='/dev/stdout' + +# Needed to get build/exec result code rather than tee's +set -o pipefail + +rm -rf "${TESTOUT}.old" +if [ -d "${TESTOUT}" ] ; then + mv -f "${TESTOUT}" "$TESTOUT.old" +fi +mkdir -p "$TESTOUT" + +for src in $TESTS; do + name="`basename $src | sed -e 's/\.cpp$//' -e 's/\.c$//'`" + testdir="./$TESTOUT/$name" + cfgdir="$testdir/cfg" + mkdir -p "$cfgdir" + exe="$testdir/$name" + + PREPARECMD="test/parsetest.py $src" + BUILDCMD="$CC -I$testdir $CFLAGS $src $SRC_LIST -o $exe" + export testdir name cfgdir + + [ $VERBOSE -gt 0 ] && echo "Preparing $name..." + [ $VERBOSE -gt 4 ] && echo " $PREPARECMD" + if $PREPARECMD 2>&1 | tee >$buildout $testdir/$name.prep; then + [ $VERBOSE -gt 0 ] && echo "Building $name..." + [ $VERBOSE -gt 4 ] && echo " $BUILDCMD" + if $BUILDCMD 2>&1 | tee >$buildout $testdir/$name.build; then + [ $VERBOSE -gt 0 ] && echo "Running $name..." + if ! $exe 2>&1 | tee >$runout $testdir/$name.out; then + echo "FAILED [RUN]: $name" + fi + else + echo "FAILED [BUILD]: $name" + fi + else + echo "FAILED [PREPARING]: $name" + fi +done + diff --git a/2.5/wizard/BBoardPage.py b/2.5/wizard/BBoardPage.py new file mode 100644 index 00000000..843562a7 --- /dev/null +++ b/2.5/wizard/BBoardPage.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of bertos. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2010 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os + +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +from BWizardPage import BWizardPage + +from BCpuPage import BCpuPage + +import const +import qvariant_converter +from bertos_utils import presetList, _cmp + +class BBoardPage(BWizardPage): + """ + Initial page of the alternative route. Permit to select one of the + predefined projects for supported board. + """ + + def __init__(self): + BWizardPage.__init__(self, const.UI_LOCATION + "/board_select.ui") + self.setTitle(self.tr("Select your development board")) + + ## Overloaded QWizardPage methods ## + + def isComplete(self): + """ + Overload of the QWizardPage isComplete method. + """ + if self.selected: + preset_path = qvariant_converter.getDict(self.selected.data(Qt.UserRole)) + preset_path = qvariant_converter.getStringDict(preset_path["info"]) + preset_path = preset_path["path"] + self.setProjectInfo("PROJECT_BOARD", preset_path) + self.setProjectInfo("PROJECT_FROM_PRESET", True) + self.setProjectInfo("PRESET_LOADED", False) + return True + else: + return False + + def nextId(self): + wizard = self.wizard() + if not self.projectInfo("PROJECT_FROM_PRESET"): + return wizard.pageIndex(BCpuPage) + else: + return QWizardPage.nextId(self) + + #### + + ## Overloaded BWizardPage methods ## + + def setupUi(self): + """ + Overload of the BWizardPage setupUi method. + """ + pass + + def connectSignals(self): + """ + Overload of the BWizardPage connectSignals method. + """ + self.connect(self.pageContent.boardList, SIGNAL("currentItemChanged(QListWidgetItem*,QListWidgetItem*)"), self.updateUi) + self.connect(self.pageContent.boardList, SIGNAL("currentItemChanged(QListWidgetItem*,QListWidgetItem*)"), self, SIGNAL("completeChanged()")) + self.connect(self.pageContent.customButton, SIGNAL("clicked()"), self.customButtonClicked) + + def reloadData(self, previous_id=None): + """ + Overload of the BWizardPage reloadData method. + """ + self.project.loadProjectPresets() + preset_list = self.projectInfo("PRESET_TREE") + preset_list = preset_list["children"] + preset_list = sorted(preset_list.values(), _cmp) + self.setItems(preset_list) + + #### + + ## Slots ## + + def updateUi(self): + if self.selected: + info_dict = qvariant_converter.getDict(self.selected.data(Qt.UserRole)) + info_dict = qvariant_converter.getStringDict(info_dict["info"]) + description = info_dict.get("description", "") + path = unicode(QUrl.fromLocalFile(info_dict["path"]).toString()) + description = description.replace("$path", path) + self.pageContent.descriptionArea.setHtml(description) + + def customButtonClicked(self): + self.setProjectInfo("PROJECT_FROM_PRESET", False) + self.wizard().next() + + #### + + def setItems(self, preset_list): + self.pageContent.boardList.clear() + selected_board = self.projectInfo("PROJECT_BOARD") + for item_data in preset_list: + item_name = item_data["info"].get("name", item_data["info"]["filename"]) + item_icon = os.path.join(item_data["info"]["path"], const.PREDEFINED_BOARD_ICON_FILE) + if not os.path.exists(item_icon): + item_icon = const.PREDEFINED_BOARD_DEFAULT_ICON + item = QListWidgetItem(QIcon(item_icon), item_name) + item.setData(Qt.UserRole, qvariant_converter.convertDict(item_data)) + self.pageContent.boardList.addItem(item) + if selected_board and selected_board == item_data["info"]["path"]: + self.pageContent.boardList.setCurrentItem(item) + + @property + def selected(self): + return self.pageContent.boardList.currentItem() diff --git a/2.5/wizard/BCpuPage.py b/2.5/wizard/BCpuPage.py new file mode 100644 index 00000000..001e5fc0 --- /dev/null +++ b/2.5/wizard/BCpuPage.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + + +from BWizardPage import * +import bertos_utils +import qvariant_converter + +from const import * + +class BCpuPage(BWizardPage): + """ + Page of the wizard that permits to choose the cpu from the supported ones. + """ + + def __init__(self): + BWizardPage.__init__(self, UI_LOCATION + "/cpu_select.ui") + self.setTitle(self.tr("Select the CPU on your board")) + self.freq_modified = False + + ## Overloaded QWizardPage methods ## + + def isComplete(self): + """ + Overload of the QWizardPage isComplete method. + """ + if self.pageContent.cpuList.currentRow() != -1: + self.pageContent.frequencyLabel.setVisible(True) + self.pageContent.frequencySpinBox.setVisible(True) + infos = qvariant_converter.getDict(self.pageContent.cpuList.currentItem().data(Qt.UserRole)) + for key, value in infos.items(): + if key in CPU_DEF: + if type(CPU_DEF[key]) == list: + infos[key] = qvariant_converter.getStringList(value) + if type(CPU_DEF[key]) == str or type(CPU_DEF) == unicode: + infos[key] = qvariant_converter.getString(value) + elif key.startswith(MK_PARAM_ID): + infos[key] = qvariant_converter.getString(value) + else: + del infos[key] + self.setProjectInfo("CPU_INFOS", infos) + self.setProjectInfo("CPU_NAME", unicode(self.pageContent.cpuList.currentItem().text())) + self.setProjectInfo("SELECTED_FREQ", unicode(long(self.pageContent.frequencySpinBox.value()))) + tag_dict = self.projectInfo("ALL_CPU_TAGS") + for tag in tag_dict: + if tag in infos["CPU_TAGS"] + [infos["CPU_NAME"], infos["TOOLCHAIN"]]: + tag_dict[tag] = True + else: + tag_dict[tag] = False + self.setProjectInfo("ALL_CPU_TAGS", tag_dict) + return True + else: + return False + + #### + + ## Overloaded BWizardPage methods ## + + def setupUi(self): + """ + Overload of the BWizardPage setupUi method. + """ + self.pageContent.cpuList.setSortingEnabled(True) + self.pageContent.frequencyLabel.setVisible(False) + self.pageContent.frequencySpinBox.setVisible(False) + preset_advanced = self.projectInfo("PRESET_ADVANCED_CONFIG") + if preset_advanced: + self.pageContent.cpuList.setEnabled(False) + + def connectSignals(self): + """ + Overload of the BWizardPage connectSignals method. + """ + self.connect(self.pageContent.cpuList, SIGNAL("currentItemChanged(QListWidgetItem *, QListWidgetItem*)"), self.rowChanged) + self.connect(self.pageContent.frequencySpinBox, SIGNAL("editingFinished()"), self.freqChanged) + + def reloadData(self, previous_id=None): + """ + Overload of the BWizardPage reloadData method. + """ + try: + QApplication.instance().setOverrideCursor(Qt.WaitCursor) + self.project.loadSourceTree() + self.populateCpuList() + cpu_name = self.projectInfo("CPU_NAME") + selected_freq = self.projectInfo("SELECTED_FREQ") + self.setupUi() + if cpu_name: + self.selectItem(cpu_name) + if selected_freq: + self.setFrequency(selected_freq) + self.freq_modified = True + finally: + QApplication.instance().restoreOverrideCursor() + self.emit(SIGNAL("completeChanged()")) + + #### + + ## Slots ## + + def rowChanged(self): + """ + Slot called when the user select an entry from the cpu list. + """ + if self.pageContent.cpuList.currentItem(): + description = qvariant_converter.getDict(self.pageContent.cpuList.currentItem().data(Qt.UserRole))["CPU_DESC"] + description = qvariant_converter.getStringList(description) + if not self.freq_modified: + # Retrieve the default cpu frequency when the value isn't already modified + current_freq = qvariant_converter.getDict(self.pageContent.cpuList.currentItem().data(Qt.UserRole))["CPU_DEFAULT_FREQ"] + current_freq = qvariant_converter.getString(current_freq) + current_freq = long(current_freq.replace("U", "").replace("L", "")) + self.pageContent.frequencySpinBox.setValue(long(current_freq)) + self.pageContent.descriptionLabel.setText("
    ".join(description)) + self.pageContent.descriptionLabel.setVisible(True) + self.emit(SIGNAL("completeChanged()")) + + def freqChanged(self): + """ + Slot called when the user change the frequency value. + """ + self.freq_modified = True + self.emit(SIGNAL("completeChanged()")) + + #### + + def populateCpuList(self): + """ + Fills the cpu list. + """ + self.pageContent.cpuList.clear() + self.pageContent.cpuList.setCurrentItem(None) + infos = self.project.getCpuInfos() + tag_list = bertos_utils.getTagSet(infos) + # Create, fill and store the dict with the tags + tag_dict = {} + for element in tag_list: + tag_dict[element] = False + self.setProjectInfo("ALL_CPU_TAGS", tag_dict) + for cpu in infos: + item = QListWidgetItem(cpu["CPU_NAME"]) + item.setData(Qt.UserRole, qvariant_converter.convertDict(cpu)) + self.pageContent.cpuList.addItem(item) + + def selectItem(self, cpu): + """ + Selects the given cpu from the list. + """ + elements = self.pageContent.cpuList.findItems(cpu, Qt.MatchCaseSensitive) + if len(elements) == 1: + self.pageContent.cpuList.setCurrentItem(elements[0]) + + def setFrequency(self, frequency): + self.pageContent.frequencySpinBox.setValue(long(frequency)) diff --git a/2.5/wizard/BCreationPage.py b/2.5/wizard/BCreationPage.py new file mode 100644 index 00000000..d91fbc61 --- /dev/null +++ b/2.5/wizard/BCreationPage.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os + +from PyQt4.QtGui import * + +from BWizardPage import * +import bertos_utils + +from const import * + +class BCreationPage(BWizardPage): + + def __init__(self): + BWizardPage.__init__(self, UI_LOCATION + "/project_creation.ui") + self.setTitle(self.tr("Project summary")) + self.setSubTitle(self.tr("Your project is ready to be created. Review your selections and press the \"Create\" button")) + self._completed = False + + ## Overloaded BWizardPage methods ## + + def connectSignals(self): + self.connect(self.pageContent.codeliteCheckBox, SIGNAL("stateChanged(int)"), self.codelitePluginChanged) + + def setupUi(self): + summary = self.pageContent.summaryTree + summary.setHeaderHidden(True) + summary.setColumnCount(1) + self.pageContent.codeliteCheckBox.setChecked("codelite" not in self.plugins()) + self.codelitePluginChanged() + self.setButtonText(QWizard.NextButton, self.tr("Create")) + + def reloadData(self, previous_id=None): + self.setupUi() + self.pageContent.summaryTree.clear() + top_level = [] + folder_title = QTreeWidgetItem(QStringList([self.tr("Project folder")])) + folder_item = QTreeWidgetItem(folder_title, QStringList([os.path.normpath(self.projectInfo("PROJECT_PATH"))])) + top_level.append(folder_title) + version_title = QTreeWidgetItem(QStringList([self.tr("BeRTOS version")])) + sources_path = self.projectInfo("BERTOS_PATH") + version = QTreeWidgetItem(version_title, QStringList([self.tr("version: ") + bertos_utils.bertosVersion(sources_path)])) + source_path = QTreeWidgetItem(version_title, QStringList([self.tr("path: ") + os.path.normpath(sources_path)])) + top_level.append(version_title) + cpu_title = QTreeWidgetItem(QStringList([self.tr("CPU")])) + cpu_name = QTreeWidgetItem(cpu_title, QStringList([self.tr("cpu name: ") + self.projectInfo("CPU_NAME")])) + cpu_freq = QTreeWidgetItem(cpu_title, QStringList([self.tr("frequency: ") + self.projectInfo("SELECTED_FREQ") + "Hz"])) + top_level.append(cpu_title) + toolchain_title = QTreeWidgetItem(QStringList([self.tr("Toolchain")])) + toolchain_info = self.projectInfo("TOOLCHAIN") + if "target" in toolchain_info: + toolchain_target = QTreeWidgetItem(toolchain_title, QStringList([self.tr("target: " + toolchain_info["target"].strip())])) + version = "" + if "version" in toolchain_info: + version += "version: " + "GCC " + toolchain_info["version"].strip() + " " + if "build" in toolchain_info: + version += "(" + toolchain_info["build"].strip() + ")" + if "version" in toolchain_info: + toolchain_target = QTreeWidgetItem(toolchain_title, QStringList([version])) + toolchain_path = QTreeWidgetItem(toolchain_title, QStringList([self.tr("path: " + os.path.normpath(toolchain_info["path"]))])) + top_level.append(toolchain_title) + module_title = QTreeWidgetItem(QStringList([self.tr("Selected modules")])) + configurations = self.projectInfo("CONFIGURATIONS") + module_categories = {} + for module, information in self.projectInfo("MODULES").items(): + if information["enabled"]: + if information["category"] not in module_categories: + module_categories[information["category"]] = [] + moduleItem = QTreeWidgetItem(QStringList([module + " - " + information["description"]])) + module_categories[information["category"]].append(moduleItem) + if len(information["configuration"]) > 0: + for start, property in configurations[information["configuration"]]["paramlist"]: + # If the final char of the brief is a dot (".") removes it. + brief = configurations[information["configuration"]][property]["brief"] + if brief[-1] == ".": + brief = brief[:-1] + configuration_item = QTreeWidgetItem(moduleItem, QStringList([brief + ": " + configurations[information["configuration"]][property]["value"]])) + for key, value in module_categories.items(): + category_item = QTreeWidgetItem(module_title, QStringList([key])) + category_item.addChildren(value) + top_level.append(module_title) + self.pageContent.summaryTree.insertTopLevelItems(0, top_level) + for item in top_level: + self.pageContent.summaryTree.expandItem(item) + + #### + + ## Slots ## + + def codelitePluginChanged(self): + if not self.pageContent.codeliteCheckBox.isChecked(): + output = ["codelite"] + else: + output= [] + self.setProjectInfo("OUTPUT", output) + + #### \ No newline at end of file diff --git a/2.5/wizard/BEditingDialog.py b/2.5/wizard/BEditingDialog.py new file mode 100644 index 00000000..cd468efd --- /dev/null +++ b/2.5/wizard/BEditingDialog.py @@ -0,0 +1,249 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import sys +import os + +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +from bertos_utils import bertosVersion, getToolchainName +from BToolchainPage import BToolchainPage +from BVersionPage import BVersionPage + +from BProject import BProject + +import qvariant_converter +from BModulePage import BModulePage +import bertos_utils + +class BEditingDialog(QDialog): + + def __init__(self, parent=None): + QDialog.__init__(self, parent) + self.setupUi() + self.connectSignals() + self.module_page.reloadData() + self.setFrequency() + + def setupUi(self): + layout = QVBoxLayout() + self.module_page = BModulePage() + layout.addWidget(self.module_page) + frequency_layout = QHBoxLayout() + frequency_layout.addWidget(QLabel(self.tr("CPU frequency"))) + self.cpu_frequency_spinbox = QDoubleSpinBox() + self.cpu_frequency_spinbox.setSuffix("Hz") + self.cpu_frequency_spinbox.setRange(1, 1000000000) + self.cpu_frequency_spinbox.setSingleStep(1000) + self.cpu_frequency_spinbox.setDecimals(0) + frequency_layout.addWidget(self.cpu_frequency_spinbox) + frequency_layout.addStretch() + layout.addLayout(frequency_layout) + button_layout = QHBoxLayout() + self.advanced_button = QToolButton() + self.setupMenu() + self.advanced_button.setMenu(self.menu) + self.advanced_button.setPopupMode(QToolButton.InstantPopup) + self.advanced_button.setText(self.tr("Advanced")) + button_layout.addWidget(self.advanced_button) + button_layout.addStretch() + self.cancel_button = QPushButton(self.tr("Cancel")) + button_layout.addWidget(self.cancel_button) + self.apply_button = QPushButton(self.tr("Apply")) + button_layout.addWidget(self.apply_button) + layout.addLayout(button_layout) + self.setLayout(layout) + self.setWindowTitle(self.tr("Edit \"%1\" project").arg(os.path.basename(self.module_page.projectInfo("PROJECT_PATH")))) + self.setWindowIcon(QIcon(":/images/appicon.png")) + + def setupMenu(self): + self.menu = QMenu(self.tr("Advanced options")) + self.change_toolchain = QAction(self.tr("Change toolchain"), self) + self.change_bertos_version = QAction(self.tr("Change BeRTOS version"), self) + self.menu.addAction(self.change_toolchain) + self.menu.addAction(self.change_bertos_version) + + def connectSignals(self): + self.connect(self.change_toolchain, SIGNAL("triggered(bool)"), self.changeToolchain) + self.connect(self.change_bertos_version, SIGNAL("triggered(bool)"), self.changeBertosVersion) + self.connect(self.apply_button, SIGNAL("clicked()"), self.apply) + self.connect(self.cancel_button, SIGNAL("clicked()"), self.reject) + self.connect(self.cpu_frequency_spinbox, SIGNAL("valueChanged(double)"), self.frequencyChanged) + + def setFrequency(self): + frequency = long(self.module_page.projectInfo("SELECTED_FREQ")) + self.cpu_frequency_spinbox.setValue(frequency) + + def frequencyChanged(self, frequency): + frequency = unicode(long(frequency)) + self.module_page.setProjectInfo("SELECTED_FREQ", frequency) + + def changeToolchain(self): + dialog = BToolchainDialog() + if dialog.exec_(): + toolchain = qvariant_converter.getStringDict(dialog.toolchain_page.currentItem().data(Qt.UserRole)) + dialog.toolchain_page.setProjectInfo("TOOLCHAIN", toolchain) + + def changeBertosVersion(self): + current_version = self.module_page.projectInfo("BERTOS_PATH") + dialog = BVersionDialog() + if dialog.exec_(): + version = qvariant_converter.getString(dialog.version_page.currentItem().data(Qt.UserRole)) + if QMessageBox.question( + dialog.version_page, + self.tr("BeRTOS version update"), + self.tr("Changing the BeRTOS version will destroy all the modification done on the BeRTOS sources"), + QMessageBox.Ok | QMessageBox.Cancel + ) == QMessageBox.Ok: + try: + qApp.setOverrideCursor(QCursor(Qt.WaitCursor)) + dialog.version_page.setProjectInfo("BERTOS_PATH", version) + dialog.version_page.setProjectInfo("OLD_BERTOS_PATH", current_version) + enabled_modules = bertos_utils.enabledModules(dialog.version_page.project) + old_configuration = dialog.version_page.projectInfo("CONFIGURATIONS") + dialog.version_page.project.loadSourceTree() + QApplication.instance().project.reloadCpuInfo() + QApplication.instance().project.loadModuleData() + new_configuration = dialog.version_page.projectInfo("CONFIGURATIONS") + merged_configuration = {} + for conf in new_configuration: + if conf in old_configuration: + configuration = bertos_utils.updateConfigurationValues(new_configuration[conf], old_configuration[conf]) + else: + configuration = new_configuration[conf] + merged_configuration[conf] = configuration + dialog.version_page.setProjectInfo("CONFIGURATIONS", merged_configuration) + dialog.version_page.project.setEnabledModules(enabled_modules) + self.module_page.fillModuleTree() + finally: + qApp.restoreOverrideCursor() + else: + # Rollback version to the previous selected one. + dialog.version_page.setProjectInfo("BERTOS_PATH", current_version) + + def apply(self): + try: + qApp.setOverrideCursor(QCursor(Qt.WaitCursor)) + QApplication.instance().project.createBertosProject() + finally: + qApp.restoreOverrideCursor() + self.accept() + + def toolchains(self): + return self.module_page.toolchains() + + def currentToolchain(self): + return self.module_page.projectInfo("TOOLCHAIN") + + def setCurrentToolchain(self, toolchain): + self.module_page.setProjectInfo("TOOLCHAIN", toolchain) + + def versions(self): + return self.module_page.versions() + + def currentVersion(self): + return self.module_page.projectInfo("BERTOS_PATH") + + def setCurrentVersion(self, version): + self.module_page.setProjectInfo("BERTOS_PATH", version) + +class BToolchainDialog(QDialog): + def __init__(self): + QDialog.__init__(self) + self.setWindowIcon(QIcon(":/images/appicon.png")) + layout = QVBoxLayout() + toolchain_page = BToolchainPage() + current_toolchain = toolchain_page.projectInfo("TOOLCHAIN") + toolchain_page.reloadData() + # TODO: to be moved in BToolchainPage + for toolchain_row in range(toolchain_page.pageContent.toolchainList.count()): + toolchain = qvariant_converter.getStringDict(toolchain_page.pageContent.toolchainList.item(toolchain_row).data(Qt.UserRole)) + if current_toolchain and toolchain["path"] == current_toolchain["path"]: + toolchain_page.pageContent.toolchainList.setCurrentRow(toolchain_row) + toolchain_page.selectionChanged() + break + self.toolchain_page = toolchain_page + layout.addWidget(toolchain_page) + button_layout = QHBoxLayout() + button_layout.addStretch() + cancel_button = QPushButton(self.tr("Cancel")) + button_layout.addWidget(cancel_button) + ok_button = QPushButton(self.tr("Ok")) + button_layout.addWidget(ok_button) + self.connect(cancel_button, SIGNAL("clicked()"), self.reject) + layout.addLayout(button_layout) + self.setLayout(layout) + self.connect(ok_button, SIGNAL("clicked()"), self.accept) + self.setWindowTitle(self.tr("Change toolchain")) + +class BVersionDialog(QDialog): + def __init__(self): + QDialog.__init__(self) + self.setWindowIcon(QIcon(":/images/appicon.png")) + layout = QVBoxLayout() + version_page = BVersionPage(edit=True) + version_page.reloadData() + self.version_page = version_page + layout.addWidget(version_page) + button_layout = QHBoxLayout() + button_layout.addStretch() + cancel_button = QPushButton(self.tr("Cancel")) + button_layout.addWidget(cancel_button) + ok_button = QPushButton(self.tr("Ok")) + button_layout.addWidget(ok_button) + self.connect(cancel_button, SIGNAL("clicked()"), self.reject) + layout.addLayout(button_layout) + self.setLayout(layout) + self.connect(ok_button, SIGNAL("clicked()"), self.accept) + current_version = version_page.projectInfo("BERTOS_PATH") + self.setWindowTitle(self.tr("Change BeRTOS version")) + + +def main(): + if len(sys.argv) > 1: + project_file = sys.argv[1] + else: + print "Invalid usage: use project_file" + sys.exit() + app = QApplication([]) + app.project = BProject(project_file) + app.settings = QSettings("Develer", "Bertos Configurator") + dialog = BEditingDialog() + dialog.show() + sys.exit(app.exec_()) + +if __name__ == "__main__": + main() diff --git a/2.5/wizard/BFinalPage.py b/2.5/wizard/BFinalPage.py new file mode 100644 index 00000000..66a300fa --- /dev/null +++ b/2.5/wizard/BFinalPage.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os + +from PyQt4.QtGui import * + +from BWizardPage import * +import bertos_utils + +from const import * + +class BFinalPage(BWizardPage): + """ + Last page of the wizard. It creates the project and show a success message. + """ + + def __init__(self): + BWizardPage.__init__(self, UI_LOCATION + "/final_page.ui") + self.setTitle(self.tr("Project created successfully!")) + + ## Overloaded BWizardPage methods ## + + def reloadData(self, previous_id=None): + self.setVisible(False) + """ + Overload of the BWizardPage reloadData method. + """ + try: + QApplication.instance().setOverrideCursor(Qt.WaitCursor) + try: + # This operation can throw WindowsError, if the directory is + # locked. + self.project.createBertosProject() + except OSError, e: + QMessageBox.critical( + self, + self.tr("Error removing destination directory"), + self.tr("Error removing the destination directory. This directory or a file in it is in use by another user or application.\nClose the application which is using the directory and retry.")) + self.wizard().back() + return + finally: + QApplication.instance().restoreOverrideCursor() + self.setVisible(True) + self._plugin_dict = {} + if os.name == "nt": + output = self.projectInfo("OUTPUT") + import winreg_importer + command_lines = winreg_importer.getCommandLines() + self.setProjectInfo("COMMAND_LINES", command_lines) + layout = QVBoxLayout() + for plugin in output: + if plugin in command_lines: + module = bertos_utils.loadPlugin(plugin) + check = QCheckBox(self.tr("Open project in %s" %module.PLUGIN_NAME)) + if len(output) == 1: + check.setCheckState(Qt.Checked) + else: + check.setCheckState(Qt.Unchecked) + layout.addWidget(check) + self._plugin_dict[check] = plugin + widget = QWidget() + widget.setLayout(layout) + if len(self._plugin_dict) > 0: + self.pageContent.scrollArea.setVisible(True) + self.pageContent.scrollArea.setWidget(widget) + for plugin in self._plugin_dict: + self.connect(plugin, SIGNAL("stateChanged(int)"), self.modeChecked) + self.modeChecked() + + def setupUi(self): + """ + Overload of the BWizardPage setupUi method. + """ + self.pageContent.scrollArea.setVisible(False) + + #### + + ## Slots ## + + def modeChecked(self): + to_be_opened = [] + for check, plugin in self._plugin_dict.items(): + if check.checkState() == Qt.Checked: + to_be_opened.append(plugin) + self.setProjectInfo("TO_BE_OPENED", to_be_opened) + + #### diff --git a/2.5/wizard/BFolderPage.py b/2.5/wizard/BFolderPage.py new file mode 100644 index 00000000..9944677c --- /dev/null +++ b/2.5/wizard/BFolderPage.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os + +from PyQt4.QtGui import * +from BWizardPage import * +import bertos_utils + +from BCpuPage import BCpuPage +from BBoardPage import BBoardPage + +from const import * + +class BFolderPage(BWizardPage): + """ + Initial page of the wizard. Permit to select the project name and the directory + where the project will be created. + """ + + def __init__(self): + BWizardPage.__init__(self, UI_LOCATION + "/dir_select.ui") + self.setTitle(self.tr("Select the project name")) + self.initializeAttributes() + + ## Overloaded QWizardPage methods ## + + def isComplete(self): + """ + Overload of the QWizardPage isComplete method. + """ + self.setDefaultFolder(self._destination_folder) + if self.pageContent.projectPath.text() != "None": + self.setProjectInfo("PROJECT_PATH", unicode(self.pageContent.projectPath.text())) + self.setProjectInfo("PROJECT_NAME", os.path.basename(unicode(self.pageContent.projectPath.text()))) + self.setProjectInfo("PROJECT_SRC_PATH", os.path.join(self.projectInfo("PROJECT_PATH"), self.projectInfo("PROJECT_NAME"))) + self.setProjectInfo("PROJECT_HW_PATH", os.path.join(self.projectInfo("PROJECT_PATH"), self.projectInfo("PROJECT_NAME"))) + return True + else: + return False + + #### + + ## Overloaded BWizardPage methods ## + + def setupUi(self): + """ + Overload of the BWizardPage setupUi method. + """ + self.pageContent.warningLabel.setVisible(False) + + def connectSignals(self): + """ + Overload of the BWizardPage connectSignals method. + """ + self.connect(self.pageContent.nameEdit, SIGNAL("textChanged(const QString)"), self.nameChanged) + self.connect(self.pageContent.directoryEdit, SIGNAL("textChanged(const QString)"), self.directoryChanged) + self.connect(self.pageContent.directoryButton, SIGNAL("clicked()"), self.selectDirectory) + # self.connect(self.pageContent.customButton, SIGNAL("toggled(bool)"), self.isComplete) + + #### + + ## Slots ## + + def nameChanged(self, name): + """ + Slot called when the project name is changed manually by the user. + """ + try: + name = unicode(name).encode("ascii") + except UnicodeEncodeError: + name = self._project_name + self.pageContent.nameEdit.setText(name) + self._project_name = unicode(name).replace(" ", "_") + self.setProjectPath() + + def directoryChanged(self, directory): + """ + Slot called when the project folder is changed manually by the user. + """ + try: + directory = unicode(directory).encode("ascii") + except UnicodeEncodeError: + directory = self._destination_folder + self.pageContent.directoryEdit.setText(directory) + self._destination_folder = directory + self.setProjectPath() + + def selectDirectory(self): + """ + Slot called when the project folder is changed using the file dialog. + """ + directory = unicode(QFileDialog.getExistingDirectory(self, self.tr("Open Directory"), self.pageContent.directoryEdit.text(), QFileDialog.ShowDirsOnly)) + if len(directory) > 0: + self.pageContent.directoryEdit.setText(QDir.toNativeSeparators(directory)) + + #### + + def initializeAttributes(self): + """ + Initializes the page attributes to the default values. + """ + self._project_name = "" + stored_folder = self.defaultFolder() + if stored_folder != "": + self._destination_folder = stored_folder + elif os.name == "nt": + from win32com.shell import shell, shellcon + self._destination_folder = shell.SHGetFolderPath(0, shellcon.CSIDL_PERSONAL, 0, 0) + del shell + del shellcon + else: + self._destination_folder = os.path.expanduser("~") + self.pageContent.directoryEdit.setText(self._destination_folder) + + def setProjectPath(self): + """ + Analyzes the page attributes and generates the path string. + """ + if self._destination_folder != "" and self._project_name <> "": + if not self._destination_folder.endswith(os.sep): + self._destination_folder += os.sep + self.pageContent.projectPath.setText(QDir.toNativeSeparators(self._destination_folder + self._project_name)) + if os.path.exists(self._destination_folder + self._project_name): + self.pageContent.warningLabel.setVisible(True) + self.pageContent.warningLabel.setText(self.tr("Warning: the selected directory exists, \ + it will be destroyed with all contained subdirectories and files...")) + else: + self.pageContent.warningLabel.setVisible(False) + self.pageContent.warningLabel.setText("") + else: + self.pageContent.projectPath.setText("None") + self.pageContent.warningLabel.setVisible(False) + self.pageContent.warningLabel.setText("") + self.emit(SIGNAL("completeChanged()")) diff --git a/2.5/wizard/BIntroPage.py b/2.5/wizard/BIntroPage.py new file mode 100644 index 00000000..02ca9469 --- /dev/null +++ b/2.5/wizard/BIntroPage.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id: BFolderPage.py 2669 2009-04-25 07:58:45Z duplo $ +# +# Author: Lorenzo Berni +# + +import os + +from PyQt4.QtGui import * +from BWizardPage import * + +from const import * + +class BIntroPage(BWizardPage): + """ + Initial page of the wizard. Permit to select the project name and the directory + where the project will be created. + """ + + def __init__(self): + BWizardPage.__init__(self, UI_LOCATION + "/intro_page.ui") + self.setTitle(self.tr("Welcome in BeRTOS Wizard!")) + pixmap = self.pageContent.imageLabel.pixmap() + self.pageContent.imageLabel.setPixmap(pixmap.scaled(300, 400, Qt.KeepAspectRatio)) + + ## Overloaded QWizardPage methods ## + + def isComplete(self): + """ + Overload of the QWizardPage isComplete method. + """ + return True + + #### \ No newline at end of file diff --git a/2.5/wizard/BModulePage.py b/2.5/wizard/BModulePage.py new file mode 100644 index 00000000..6e40c7f1 --- /dev/null +++ b/2.5/wizard/BModulePage.py @@ -0,0 +1,594 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os + +from PyQt4.QtCore import * +from PyQt4.QtGui import * +from BWizardPage import * +import bertos_utils + +from bertos_utils import SupportedException +from DefineException import * +from const import * + +class BModulePage(BWizardPage): + """ + Page of the wizard that permits to select and configurate the BeRTOS modules. + """ + + def __init__(self): + BWizardPage.__init__(self, UI_LOCATION + "/module_select.ui") + self.setTitle(self.tr("Configure the BeRTOS modules")) + self._control_group = QControlGroup() + ## special connection needed for the QControlGroup + self.connect(self._control_group, SIGNAL("stateChanged"), self.saveValue) + + ## Overloaded BWizardPage methods ## + + def setupUi(self): + """ + Overload of BWizardPage setupUi method. + """ + self.pageContent.moduleTree.clear() + self.pageContent.moduleTree.setHeaderHidden(True) + self.pageContent.propertyTable.horizontalHeader().setResizeMode(QHeaderView.Stretch) + self.pageContent.propertyTable.horizontalHeader().setVisible(False) + self.pageContent.propertyTable.verticalHeader().setResizeMode(QHeaderView.ResizeToContents) + self.pageContent.propertyTable.verticalHeader().setVisible(False) + self.pageContent.propertyTable.setColumnCount(2) + self.pageContent.propertyTable.setRowCount(0) + self.pageContent.moduleLabel.setVisible(False) + self.pageContent.warningLabel.setVisible(False) + + def connectSignals(self): + """ + Overload of the BWizardPage connectSignals method. + """ + self.connect(self.pageContent.moduleTree, SIGNAL("itemPressed(QTreeWidgetItem*, int)"), self.fillPropertyTable) + self.connect(self.pageContent.moduleTree, SIGNAL("itemPressed(QTreeWidgetItem*, int)"), self.moduleClicked) + self.connect(self.pageContent.moduleTree, SIGNAL("itemChanged(QTreeWidgetItem*, int)"), self.dependencyCheck) + + def reloadData(self, previous_id=None): + """ + Overload of the BWizardPage reloadData method. + """ + # Check if the user are approaching this page from the previous or the + # next one. + if previous_id is None or previous_id < self.wizard().currentId(): + try: + QApplication.instance().setOverrideCursor(Qt.WaitCursor) + self.setupUi() + self.loadModuleData() + self.fillModuleTree() + finally: + QApplication.instance().restoreOverrideCursor() + + #### + + ## Slots ## + + def moduleClicked(self, item, column): + self.setBold(item, False) + + def fillPropertyTable(self): + """ + Slot called when the user selects a module from the module tree. + Fills the property table using the configuration parameters defined in + the source tree. + """ + module = self.currentModule() + if module: + try: + supported = bertos_utils.isSupported(self.project, module=module) + except SupportedException, e: + self.exceptionOccurred(self.tr("Error evaluating \"%1\" for module %2").arg(e.support_string).arg(module)) + supported = True + self._control_group.clear() + configuration = self.projectInfo("MODULES")[module]["configuration"] + module_description = self.projectInfo("MODULES")[module]["description"] + self.pageContent.moduleLabel.setText(module_description) + self.pageContent.moduleLabel.setVisible(True) + if not supported: + self.pageContent.warningLabel.setVisible(True) + selected_cpu = self.projectInfo("CPU_NAME") + self.pageContent.warningLabel.setText(self.tr("Warning: the selected module, \ + is not completely supported by the %1.").arg(selected_cpu)) + else: + self.pageContent.warningLabel.setVisible(False) + self.pageContent.propertyTable.clear() + self.pageContent.propertyTable.setRowCount(0) + if configuration != "": + configurations = self.projectInfo("CONFIGURATIONS")[configuration] + param_list = sorted(configurations["paramlist"]) + index = 0 + for i, property in param_list: + if "type" in configurations[property]["informations"] and configurations[property]["informations"]["type"] == "autoenabled": + # Doesn't show the hidden fields + continue + try: + param_supported = bertos_utils.isSupported(self.project, property_id=(configuration, property)) + except SupportedException, e: + self.exceptionOccurred(self.tr("Error evaluating \"%1\" for parameter %2").arg(e.support_string).arg(property)) + param_supported = True + if not param_supported: + # Doesn't show the unsupported parameters + continue + # Set the row count to the current index + 1 + self.pageContent.propertyTable.setRowCount(index + 1) + item = QTableWidgetItem(configurations[property]["brief"]) + item.setFlags(item.flags() & ~Qt.ItemIsSelectable) + item.setToolTip(property) + item.setData(Qt.UserRole, qvariant_converter.convertString(property)) + self.pageContent.propertyTable.setItem(index, 0, item) + if "type" in configurations[property]["informations"] and configurations[property]["informations"]["type"] == "boolean": + self.insertCheckBox(index, configurations[property]["value"]) + elif "type" in configurations[property]["informations"] and configurations[property]["informations"]["type"] == "enum": + self.insertComboBox(index, configurations[property]["value"], configurations[property]["informations"]["value_list"]) + elif "type" in configurations[property]["informations"] and configurations[property]["informations"]["type"] == "int": + self.insertSpinBox(index, configurations[property]["value"], configurations[property]["informations"]) + else: + # Not defined type, rendered as a text field + self.pageContent.propertyTable.setItem(index, 1, QTableWidgetItem(configurations[property]["value"])) + index += 1 + if self.pageContent.propertyTable.rowCount() == 0: + module_label = self.pageContent.moduleLabel.text() + module_label += "\n\nNo configuration needed." + self.pageContent.moduleLabel.setText(module_label) + else: + self.pageContent.moduleLabel.setText("") + self.pageContent.moduleLabel.setVisible(False) + self.pageContent.propertyTable.clear() + self.pageContent.propertyTable.setRowCount(0) + + def dependencyCheck(self, item): + """ + Checks the dependencies of the module associated with the given item. + """ + checked = False + module = unicode(item.text(0)) + if item.checkState(0) == Qt.Checked: + self.moduleSelected(module) + else: + self.moduleUnselected(module) + self.removeFileDependencies(module) + + def showPropertyDescription(self): + """ + Slot called when the property selection changes. Shows the description + of the selected property. + """ + self.resetPropertyDescription() + configurations = self.currentModuleConfigurations() + if self.currentProperty() in configurations: + description = configurations[self.currentProperty()]["brief"] + name = self.currentProperty() + self.currentPropertyItem().setText(description + "\n" + name) + + def saveValue(self, index): + """ + Slot called when the user modifies one of the configuration parameters. + It stores the new value.""" + property = qvariant_converter.getString(self.pageContent.propertyTable.item(index, 0).data(Qt.UserRole)) + configuration = self.projectInfo("MODULES")[self.currentModule()]["configuration"] + configurations = self.projectInfo("CONFIGURATIONS") + if "type" not in configurations[configuration][property]["informations"] or configurations[configuration][property]["informations"]["type"] == "int": + configurations[configuration][property]["value"] = unicode(int(self.pageContent.propertyTable.cellWidget(index, 1).value())) + elif configurations[configuration][property]["informations"]["type"] == "enum": + configurations[configuration][property]["value"] = unicode(self.pageContent.propertyTable.cellWidget(index, 1).currentText()) + elif configurations[configuration][property]["informations"]["type"] == "boolean": + if self.pageContent.propertyTable.cellWidget(index, 1).isChecked(): + configurations[configuration][property]["value"] = "1" + else: + configurations[configuration][property]["value"] = "0" + self.setProjectInfo("CONFIGURATIONS", configurations) + if self.moduleItem(self.currentModule()).checkState(0) == Qt.Checked: + self.dependencyCheck(self.moduleItem(self.currentModule())) + + #### + + def loadModuleData(self): + """ + Loads the module data. + """ + # Do not load the module data again when the Wizard is in editing mode + # or when it's working on a preset. + if not self.project.edit and not self.project.from_preset: + # Load the module data every time so that if the user changed the cpu + # the right configurations are picked up. + try: + self.project.loadModuleData() + except ModuleDefineException, e: + self.exceptionOccurred(self.tr("Error parsing line '%2' in file %1").arg(e.path).arg(e.line)) + except EnumDefineException, e: + self.exceptionOccurred(self.tr("Error parsing line '%2' in file %1").arg(e.path).arg(e.line)) + except ConfigurationDefineException, e: + self.exceptionOccurred(self.tr("Error parsing line '%2' in file %1").arg(e.path).arg(e.line)) + + def fillModuleTree(self): + """ + Fills the module tree with the module entries separated in categories. + """ + self.pageContent.moduleTree.clear() + modules = self.projectInfo("MODULES") + if not modules: + return + categories = {} + for module, information in modules.items(): + if information["category"] not in categories: + categories[information["category"]] = [] + categories[information["category"]].append(module) + for category, module_list in categories.items(): + item = QTreeWidgetItem(QStringList([category])) + for module in module_list: + enabled = modules[module]["enabled"] + module_item = QTreeWidgetItem(item, QStringList([module])) + try: + supported = bertos_utils.isSupported(self.project, module=module) + except SupportedException, e: + self.exceptionOccurred(self.tr("Error evaluating \"%1\" for module %2").arg(e.support_string).arg(module)) + supported = True + if not supported: + module_item.setForeground(0, QBrush(QColor(Qt.red))) + if enabled: + module_item.setCheckState(0, Qt.Checked) + else: + module_item.setCheckState(0, Qt.Unchecked) + self.pageContent.moduleTree.addTopLevelItem(item) + self.pageContent.moduleTree.sortItems(0, Qt.AscendingOrder) + self.fillPropertyTable() + + def insertCheckBox(self, index, value): + """ + Inserts in the table at index a checkbox for a boolean property setted + to value. + """ + check_box = QCheckBox() + self.pageContent.propertyTable.setCellWidget(index, 1, check_box) + if value == "1": + check_box.setChecked(True) + else: + check_box.setChecked(False) + self._control_group.addControl(index, check_box) + + def insertComboBox(self, index, value, value_list): + """ + Inserts in the table at index a combobox for an enum property setted + to value. + """ + try: + enum = self.projectInfo("LISTS")[value_list] + combo_box = QComboBox() + self.pageContent.propertyTable.setCellWidget(index, 1, combo_box) + for i, element in enumerate(enum): + combo_box.addItem(element) + if element == value: + combo_box.setCurrentIndex(i) + self._control_group.addControl(index, combo_box) + except KeyError: + self.exceptionOccurred(self.tr("Define list \"%1\" not found. Check definition files.").arg(value_list)) + self.pageContent.propertyTable.setItem(index, 1, QTableWidgetItem(value)) + + def insertSpinBox(self, index, value, informations): + """ + Inserts in the table at index a spinbox for an int, a long or an unsigned + long property setted to value. + """ + # int, long or undefined type property + spin_box = None + if bertos_utils.isLong(informations) or bertos_utils.isUnsignedLong(informations): + spin_box = QDoubleSpinBox() + spin_box.setDecimals(0) + else: + spin_box = QSpinBox() + self.pageContent.propertyTable.setCellWidget(index, 1, spin_box) + minimum = -32768 + maximum = 32767 + suff = "" + if bertos_utils.isLong(informations): + minimum = -2147483648 + maximum = 2147483647 + suff = "L" + elif bertos_utils.isUnsigned(informations): + minimum = 0 + maximum = 65535 + suff = "U" + elif bertos_utils.isUnsignedLong(informations): + minimum = 0 + maximum = 4294967295 + suff = "UL" + if "min" in informations: + minimum = int(informations["min"]) + if "max" in informations: + maximum = int(informations["max"]) + spin_box.setRange(minimum, maximum) + spin_box.setSuffix(suff) + spin_box.setValue(int(value.replace("L", "").replace("U", ""))) + self._control_group.addControl(index, spin_box) + + + def currentModule(self): + """ + Retuns the current module name. + """ + current_module = self.pageContent.moduleTree.currentItem() + # return only the child items + if current_module and current_module.parent(): + return unicode(current_module.text(0)) + else: + return None + + def moduleItem(self, module): + for top_level_index in range(self.pageContent.moduleTree.topLevelItemCount()): + top_level_item = self.pageContent.moduleTree.topLevelItem(top_level_index) + for child_index in range(top_level_item.childCount()): + child_item = top_level_item.child(child_index) + if unicode(child_item.text(0)) == module: + return child_item + return None + + def currentModuleConfigurations(self): + """ + Returns the current module configuration. + """ + return self.configurations(self.currentModule()) + + def currentProperty(self): + """ + Rerturns the current property from the property table. + """ + return qvariant_converter.getString(self.pageContent.propertyTable.item(self.pageContent.propertyTable.currentRow(), 0).data(Qt.UserRole)) + + def currentPropertyItem(self): + """ + Returns the QTableWidgetItem of the current property. + """ + return self.pageContent.propertyTable.item(self.pageContent.propertyTable.currentRow(), 0) + + def configurations(self, module): + """ + Returns the configuration for the selected module. + """ + configuration = [] + if module: + # On linux platform it seems that the behaviour of the focus + # changing is a bit different from the mac one. So if module is + # None then no configurations should be returned. + configuration = self.projectInfo("MODULES")[module]["configuration"] + if len(configuration) > 0: + return self.projectInfo("CONFIGURATIONS")[configuration] + else: + return {} + + def resetPropertyDescription(self): + """ + Resets the label for each property table entry. + """ + for index in range(self.pageContent.propertyTable.rowCount()): + property_name = qvariant_converter.getString(self.pageContent.propertyTable.item(index, 0).data(Qt.UserRole)) + # Awful solution! Needed because if the user change the module, the selection changed... + if property_name not in self.currentModuleConfigurations(): + break + self.pageContent.propertyTable.item(index, 0).setText(self.currentModuleConfigurations()[property_name]['brief']) + + def setBold(self, item, bold): + self.pageContent.moduleTree.blockSignals(True) + font = item.font(0) + font.setBold(bold) + item.setFont(0, font) + self.pageContent.moduleTree.blockSignals(False) + + def moduleSelected(self, selectedModule): + """ + Resolves the selection dependencies. + """ + try: + qApp.setOverrideCursor(Qt.WaitCursor) + modules = self.projectInfo("MODULES") + modules[selectedModule]["enabled"] = True + self.setProjectInfo("MODULES", modules) + depends = self.projectInfo("MODULES")[selectedModule]["depends"] + unsatisfied = [] + if self.pageContent.automaticFix.isChecked(): + unsatisfied = self.selectDependencyCheck(selectedModule) + if len(unsatisfied) > 0: + for module in unsatisfied: + modules = self.projectInfo("MODULES") + modules[module]["enabled"] = True + for category in range(self.pageContent.moduleTree.topLevelItemCount()): + item = self.pageContent.moduleTree.topLevelItem(category) + for child in range(item.childCount()): + if unicode(item.child(child).text(0)) in unsatisfied: + self.setBold(item.child(child), True) + self.setBold(item, True) + item.child(child).setCheckState(0, Qt.Checked) + finally: + qApp.restoreOverrideCursor() + + def moduleUnselected(self, unselectedModule): + """ + Resolves the unselection dependencies. + """ + try: + qApp.setOverrideCursor(Qt.WaitCursor) + modules = self.projectInfo("MODULES") + modules[unselectedModule]["enabled"] = False + self.setProjectInfo("MODULES", modules) + unsatisfied = [] + unsatisfied_params = [] + if self.pageContent.automaticFix.isChecked(): + unsatisfied, unsatisfied_params = self.unselectDependencyCheck(unselectedModule) + if len(unsatisfied) > 0 or len(unsatisfied_params) > 0: + message = [] + heading = self.tr("The module %1 is needed by").arg(unselectedModule) + message.append(heading) + module_list = ", ".join(unsatisfied) + param_list = ", ".join(["%s (%s)" %(param_name, module) for module, param_name in unsatisfied_params]) + if module_list: + message.append(QString(module_list)) + if module_list and param_list: + message.append(self.tr("and by")) + if param_list: + message.append(QString(param_list)) + message_str = QStringList(message).join(" ") + message_str.append(self.tr("\n\nDo you want to automatically fix these conflicts?")) + qApp.restoreOverrideCursor() + choice = QMessageBox.warning(self, self.tr("Dependency error"), message_str, QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) + qApp.setOverrideCursor(Qt.WaitCursor) + if choice == QMessageBox.Yes: + for module in unsatisfied: + modules = self.projectInfo("MODULES") + modules[module]["enabled"] = False + for category in range(self.pageContent.moduleTree.topLevelItemCount()): + item = self.pageContent.moduleTree.topLevelItem(category) + for child in range(item.childCount()): + if unicode(item.child(child).text(0)) in unsatisfied: + item.child(child).setCheckState(0, Qt.Unchecked) + for module, param in unsatisfied_params: + configuration_file = self.projectInfo("MODULES")[module]["configuration"] + configurations = self.projectInfo("CONFIGURATIONS") + configurations[configuration_file][param]["value"] = "0" + self.setProjectInfo("CONFIGURATIONS", configurations) + finally: + qApp.restoreOverrideCursor() + + def selectDependencyCheck(self, module): + """ + Returns the list of unsatisfied dependencies after a selection. + """ + unsatisfied = set() + modules = self.projectInfo("MODULES") + files = self.projectInfo("FILES") + configurations = self.projectInfo("CONFIGURATIONS").get(modules[module]["configuration"], {"paramlist": ()}) + conditional_deps = () + for i, param_name in configurations["paramlist"]: + information = configurations[param_name] + if information["informations"]["type"] == "boolean" and \ + information["value"] != "0" and \ + "conditional_deps" in information["informations"]: + + conditional_deps += information["informations"]["conditional_deps"] + + for dependency in modules[module]["depends"] + conditional_deps: + if dependency in modules and not modules[dependency]["enabled"]: + unsatisfied |= set([dependency]) + if dependency not in unsatisfied: + unsatisfied |= self.selectDependencyCheck(dependency) + if dependency not in modules: + if dependency in files: + files[dependency] += 1 + else: + files[dependency] = 1 + self.setProjectInfo("FILES", files) + return unsatisfied + + def unselectDependencyCheck(self, dependency): + """ + Returns the list of unsatisfied dependencies after an unselection. + """ + unsatisfied = set() + unsatisfied_params = set() + modules = self.projectInfo("MODULES") + for module, informations in modules.items(): + configurations = self.projectInfo("CONFIGURATIONS").get(informations["configuration"], {"paramlist": ()}) + conditional_deps = {} + for i, param_name in configurations["paramlist"]: + information = configurations[param_name] + if information["informations"]["type"] == "boolean" and information["value"] != "0" and "conditional_deps" in information["informations"]: + for dep in information["informations"]["conditional_deps"]: + if not dep in conditional_deps: + conditional_deps[dep] = [] + conditional_deps[dep].append((module, param_name)) + if dependency in informations["depends"] and informations["enabled"]: + unsatisfied |= set([module]) + if dependency not in unsatisfied: + tmp = self.unselectDependencyCheck(module) + unsatisfied |= tmp[0] + unsatisfied_params |= tmp[1] + if dependency in conditional_deps: + unsatisfied_params |= set(conditional_deps[dependency]) + return unsatisfied, unsatisfied_params + + def removeFileDependencies(self, module): + """ + Removes the files dependencies of the given module. + """ + modules = self.projectInfo("MODULES") + files = self.projectInfo("FILES") + dependencies = modules[module]["depends"] + for dependency in dependencies: + if dependency in files: + files[dependency] -= 1 + if files[dependency] == 0: + del files[dependency] + self.setProjectInfo("FILES", files) + +class QControlGroup(QObject): + """ + Simple class that permit to connect different signals of different widgets + with a slot that emit a signal. Permits to group widget and to understand which of + them has sent the signal. + """ + + def __init__(self): + QObject.__init__(self) + self._controls = {} + + def addControl(self, id, control): + """ + Add a control. + """ + self._controls[id] = control + if type(control) == QCheckBox: + self.connect(control, SIGNAL("stateChanged(int)"), lambda: self.stateChanged(id)) + elif type(control) == QSpinBox: + self.connect(control, SIGNAL("valueChanged(int)"), lambda: self.stateChanged(id)) + elif type(control) == QComboBox: + self.connect(control, SIGNAL("currentIndexChanged(int)"), lambda: self.stateChanged(id)) + elif type(control) == QDoubleSpinBox: + self.connect(control, SIGNAL("valueChanged(double)"), lambda: self.stateChanged(id)) + + def clear(self): + """ + Remove all the controls. + """ + self._controls = {} + + def stateChanged(self, id): + """ + Slot called when the value of one of the stored widget changes. It emits + another signal. + """ + self.emit(SIGNAL("stateChanged"), id) diff --git a/2.5/wizard/BOpenPage.py b/2.5/wizard/BOpenPage.py new file mode 100644 index 00000000..50063c98 --- /dev/null +++ b/2.5/wizard/BOpenPage.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os +import pickle + +from PyQt4.QtGui import * +from PyQt4.QtCore import * + +from BWizardPage import * +import bertos_utils + +from const import * + +class BOpenPage(BWizardPage): + """ + Initial page of the wizard. Permit to select the project name and the directory + where the project will be created. + """ + + def __init__(self): + BWizardPage.__init__(self, UI_LOCATION + "/project_select.ui") + self.setTitle(self.tr("Open an existing BeRTOS project")) + + ## Overloaded BWizardPage methods ## + + def reloadData(self, previous_id=None): + """ + Overload of the BWizardPage reloadData method. + """ + project = unicode(QFileDialog.getOpenFileName(self, self.tr("Open project file"), os.path.expanduser("~"), self.tr("Project file (project.bertos)"))) + if project == "": + QApplication.instance().quit() + else: + QApplication.instance().project = pickle.loads(open(project, "r").read()) + self.pageContent.nameLabel.setText(os.path.basename(project.replace(os.sep + "project.bertos", ""))) + self.pageContent.dirLabel.setText(project) + + #### + diff --git a/2.5/wizard/BProject.py b/2.5/wizard/BProject.py new file mode 100644 index 00000000..366e9a75 --- /dev/null +++ b/2.5/wizard/BProject.py @@ -0,0 +1,635 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os +import fnmatch +import copy +import pickle +import shutil +import copytree + +import DefineException + +from LoadException import VersionException, ToolchainException + +import const + +from bertos_utils import ( + # Utility functions + isBertosDir, getTagSet, getInfos, updateConfigurationValues, + loadConfigurationInfos, loadDefineLists, loadModuleDefinition, + getCommentList, sub, + + # Project creation functions + projectFileGenerator, versionFileGenerator, loadPlugin, + mergeSources, + + # Custom exceptions + ParseError, SupportedException + ) +import bertos_utils + +from compatibility import updateProject + +class BProject(object): + """ + Simple class for store and retrieve project informations. + """ + + def __init__(self, project_file="", info_dict={}): + self.infos = {} + self._cached_queries = {} + self.edit = False + if project_file: + self.edit = True + self.loadBertosProject(project_file, info_dict) + + #--- Load methods (methods that loads data into project) ------------------# + + def loadBertosProject(self, project_file, info_dict): + project_dir = os.path.dirname(project_file) + project_data = pickle.loads(open(project_file, "r").read()) + updateProject(project_data) + # If PROJECT_NAME is not defined it use the directory name as PROJECT_NAME + # NOTE: this can throw an Exception if the user has changed the directory containing the project + self.infos["PROJECT_NAME"] = project_data.get("PROJECT_NAME", os.path.basename(project_dir)) + self.infos["PROJECT_PATH"] = os.path.dirname(project_file) + project_src_path = os.path.join(project_dir, project_data.get("PROJECT_SRC_PATH", project_data["PROJECT_NAME"])) + if project_src_path: + self.infos["PROJECT_SRC_PATH"] = project_src_path + + else: + # In projects created with older versions of the Wizard this metadata doesn't exist + self.infos["PROJECT_SRC_PATH"] = os.path.join(self.infos["PROJECT_PATH"], self.infos["PROJECT_NAME"]) + self.infos["PROJECT_HW_PATH"] = os.path.join(self.infos["PROJECT_PATH"], project_data.get("PROJECT_HW_PATH", self.infos["PROJECT_PATH"])) + + linked_sources_path = project_data["BERTOS_PATH"] + sources_abspath = os.path.abspath(os.path.join(project_dir, linked_sources_path)) + project_data["BERTOS_PATH"] = sources_abspath + + self._loadBertosSourceStuff(project_data["BERTOS_PATH"], info_dict.get("BERTOS_PATH", None)) + + self.infos["PRESET"] = project_data.get("PRESET", False) + + # For those projects that don't have a VERSION file create a dummy one. + if not isBertosDir(project_dir) and not self.is_preset: + version_file = open(os.path.join(const.DATA_DIR, "vtemplates/VERSION"), "r").read() + open(os.path.join(project_dir, "VERSION"), "w").write(version_file.replace("$version", "").strip()) + + self.loadSourceTree() + self._loadCpuStuff(project_data["CPU_NAME"], project_data["SELECTED_FREQ"]) + self._loadToolchainStuff(project_data["TOOLCHAIN"], info_dict.get("TOOLCHAIN", None)) + self.infos["OUTPUT"] = project_data["OUTPUT"] + self.loadModuleData(True) + self.setEnabledModules(project_data["ENABLED_MODULES"]) + + def _loadBertosSourceStuff(self, sources_path, forced_version=None): + if forced_version: + sources_path = forced_version + if os.path.exists(sources_path): + self.infos["BERTOS_PATH"] = sources_path + else: + raise VersionException(self) + + def _loadCpuStuff(self, cpu_name, cpu_frequency): + self.infos["CPU_NAME"] = cpu_name + cpu_info = self.getCpuInfos() + for cpu in cpu_info: + if cpu["CPU_NAME"] == cpu_name: + self.infos["CPU_INFOS"] = cpu + break + tag_list = getTagSet(cpu_info) + # Create, fill and store the dict with the tags + tag_dict = {} + for element in tag_list: + tag_dict[element] = False + infos = self.info("CPU_INFOS") + for tag in tag_dict: + if tag in infos["CPU_TAGS"] + [infos["CPU_NAME"], infos["TOOLCHAIN"]]: + tag_dict[tag] = True + else: + tag_dict[tag] = False + self.infos["ALL_CPU_TAGS"] = tag_dict + self.infos["SELECTED_FREQ"] = cpu_frequency + + def _loadToolchainStuff(self, toolchain, forced_toolchain=None): + toolchain = toolchain + if forced_toolchain: + toolchain = forced_toolchain + if os.path.exists(toolchain["path"]): + self.infos["TOOLCHAIN"] = toolchain + else: + raise ToolchainException(self) + + def loadProjectFromPreset(self, preset): + """ + Load a project from a preset. + NOTE: this is a stub. + """ + project_file = os.path.join(preset, "project.bertos") + project_data = pickle.loads(open(project_file, "r").read()) + self.loadSourceTree() + self._loadCpuStuff(project_data["CPU_NAME"], project_data["SELECTED_FREQ"]) + + # NOTE: this is a HACK!!! + # TODO: find a better way to reuse loadModuleData + preset_project_name = project_data.get("PROJECT_NAME", os.path.basename(preset)) + preset_prj_src_path = os.path.join(preset, project_data.get("PROJECT_SRC_PATH", os.path.join(preset, preset_project_name))) + preset_prj_hw_path = os.path.join(preset, project_data.get("PROJECT_HW_PATH", preset)) + + old_project_name = self.infos["PROJECT_NAME"] + old_project_path = self.infos["PROJECT_PATH"] + old_project_src_path = self.infos["PROJECT_SRC_PATH"] + old_project_hw_path = self.infos["PROJECT_HW_PATH"] + + self.infos["PROJECT_NAME"] = preset_project_name + self.infos["PROJECT_PATH"] = preset + self.infos["PROJECT_SRC_PATH"] = preset_prj_src_path + self.infos["PROJECT_HW_PATH"] = preset_prj_hw_path + + self.loadModuleData(True) + self.setEnabledModules(project_data["ENABLED_MODULES"]) + + self.infos["PROJECT_NAME"] = old_project_name + self.infos["PROJECT_PATH"] = old_project_path + self.infos["PROJECT_SRC_PATH"] = old_project_src_path + self.infos["PROJECT_HW_PATH"] = old_project_hw_path + # End of the ugly HACK! + + self.infos["PRESET_NAME"] = preset_project_name + self.infos["PRESET_PATH"] = preset + self.infos["PRESET_SRC_PATH"] = preset_prj_src_path + self.infos["PRESET_HW_PATH"] = preset_prj_hw_path + + def loadProjectPresets(self): + """ + Load the default presets (into the const.PREDEFINED_BOARDS_DIR). + """ + # NOTE: this method does nothing (for now). + preset_path = os.path.join(self.infos["BERTOS_PATH"], const.PREDEFINED_BOARDS_DIR) + preset_tree = {"children": []} + if os.path.exists(preset_path): + preset_tree = self._loadProjectPresetTree(preset_path) + self.infos["PRESET_TREE"] = preset_tree + + def _loadProjectPresetTree(self, path): + _tree = {} + _tree["info"] = self._loadPresetInfo(os.path.join(path, const.PREDEFINED_BOARD_SPEC_FILE)) + _tree["info"]["filename"] = os.path.basename(path) + _tree["info"]["path"] = path + _tree["children"] = {} + entries = set(os.listdir(path)) + for entry in entries: + _path = os.path.join(path, entry) + if os.path.isdir(_path): + sub_entries = set(os.listdir(_path)) + if const.PREDEFINED_BOARD_SPEC_FILE in sub_entries: + _tree["children"][_path] = self._loadProjectPresetTree(_path) + # Add into the info dict the dir type (dir/project) + if _tree["children"]: + _tree["info"]["type"] = "dir" + else: + _tree["info"]["type"] = "project" + return _tree + + def _loadPresetInfo(self, preset_spec_file): + D = {} + try: + execfile(preset_spec_file, {}, D) + except IOError, e: + pass + return D + + def loadModuleData(self, edit=False): + module_info_dict = {} + list_info_dict = {} + configuration_info_dict = {} + file_dict = {} + for filename, path in self.findDefinitions("*.h") + self.findDefinitions("*.c") + self.findDefinitions("*.s") + self.findDefinitions("*.S"): + comment_list = getCommentList(open(path + "/" + filename, "r").read()) + if len(comment_list) > 0: + module_info = {} + configuration_info = {} + try: + to_be_parsed, module_dict = loadModuleDefinition(comment_list[0]) + except ParseError, err: + raise DefineException.ModuleDefineException(path, err.line_number, err.line) + for module, information in module_dict.items(): + if "depends" not in information: + information["depends"] = () + information["depends"] += (filename.split(".")[0],) + information["category"] = os.path.basename(path) + + # Hack to remove 'bertos/' from the configuration file path. + # + # The new module information format substitute paths like 'bertos/cfg/config_file.h' + # with the relative path into the bertos directory ('cfg/config_file.h') + information["configuration"] = information["configuration"].replace("bertos/", "") + information["hw"] = [hw.replace("bertos/", "") for hw in information["hw"]] + + if "configuration" in information and len(information["configuration"]): + configuration = module_dict[module]["configuration"] + try: + cfg_file_path = os.path.join(self.bertos_srcdir, configuration) + configuration_info[configuration] = loadConfigurationInfos(cfg_file_path) + except ParseError, err: + raise DefineException.ConfigurationDefineException(cfg_file_path, err.line_number, err.line) + if edit: + try: + path = self.infos["PROJECT_SRC_PATH"] + cfg_file_path = os.path.join(path, configuration) + configuration_info[configuration] = updateConfigurationValues(configuration_info[configuration], loadConfigurationInfos(cfg_file_path)) + except ParseError, err: + raise DefineException.ConfigurationDefineException(cfg_file_path, err.line_number, err.line) + except IOError, err: + # The wizard can't find the file, use the default configuration + pass + module_info_dict.update(module_dict) + configuration_info_dict.update(configuration_info) + if to_be_parsed: + try: + list_dict = loadDefineLists(comment_list[1:]) + list_info_dict.update(list_dict) + except ParseError, err: + raise DefineException.EnumDefineException(path, err.line_number, err.line) + for tag in self.infos["CPU_INFOS"]["CPU_TAGS"]: + for filename, path in self.findDefinitions("*_" + tag + ".h"): + comment_list = getCommentList(open(path + "/" + filename, "r").read()) + list_info_dict.update(loadDefineLists(comment_list)) + self.infos["MODULES"] = module_info_dict + self.infos["LISTS"] = list_info_dict + self.infos["CONFIGURATIONS"] = configuration_info_dict + self.infos["FILES"] = file_dict + + def loadSourceTree(self): + """ + Index BeRTOS source and load it in memory. + """ + # Index only the BERTOS_PATH/bertos content + bertos_sources_dir = os.path.join(self.info("BERTOS_PATH"), "bertos") + file_dict = {} + if os.path.exists(bertos_sources_dir): + for element in os.walk(bertos_sources_dir): + for f in element[2]: + file_dict[f] = file_dict.get(f, []) + [element[0]] + self.infos["FILE_DICT"] = file_dict + + def reloadCpuInfo(self): + for cpu_info in self.getCpuInfos(): + if cpu_info["CPU_NAME"] == self.infos["CPU_NAME"]: + self.infos["CPU_INFOS"] = cpu_info + + #-------------------------------------------------------------------------# + + def createBertosProject(self): + # NOTE: Temporary hack. + if self.edit: + self._editBertosProject() + else: + if not self.from_preset: + self._newCustomBertosProject() + else: + self._newBertosProjectFromPreset() + + def _newBertosProject(self): + for directory in (self.maindir, self.srcdir, self.prjdir, self.cfgdir, self.hwdir): + self._createDirectory(directory) + # Write the project file + self._writeProjectFile(os.path.join(self.maindir, "project.bertos")) + # VERSION file + self._writeVersionFile(os.path.join(self.maindir, "VERSION")) + # Destination makefile + self._writeMakefile() + # Copy the sources + self._copySources(self.bertos_maindir, self.srcdir) + # Set properly the autoenabled parameters + self._setupAutoenabledParameters() + # Copy all the configuration files + self._writeCfgFiles(self.bertos_srcdir, self.cfgdir) + # Destination wizard mk file + self._writeWizardMkFile() + + def _newCustomBertosProject(self): + # Create/write/copy the common things + self._newBertosProject() + # Copy the clean hw files + self._createDirectory(self.hwdir) + # Copy all the hw files + self._writeHwFiles(self.bertos_srcdir, self.hwdir) + # Destination user mk file + self._writeUserMkFile() + # Destination main.c file + self._writeMainFile(self.prjdir + "/main.c") + # Create project files for selected plugins + self._createProjectFiles() + + def _newBertosProjectFromPreset(self): + # Create/write/copy the common things + self._newBertosProject() + + # Copy all the files and dirs except cfg/hw/*.mk + self._writeCustomSrcFiles() + + # Copy the hw files + self._writeAllPresetHwFiles(self.src_hwdir, self.hwdir) + + # Copyt the new *_user.mk file + self._writeUserMkFileFromPreset() + + # Create project files for selected plugins + self._createProjectFiles() + + def _editBertosProject(self): + # Write the project file + self._writeProjectFile(os.path.join(self.maindir, "project.bertos")) + if not self.is_preset: + # Generate this files only if the project isn't a preset + # VERSION file + self._writeVersionFile(os.path.join(self.maindir, "VERSION")) + # Destination makefile + self._writeMakefile() + # Merge sources + self._mergeSources(self.bertos_maindir, self.srcdir, self.old_srcdir) + # Copy all the hw files + self._writeHwFiles(self.bertos_srcdir, self.hwdir) + # Destination wizard mk file + self._writeWizardMkFile() + # Set properly the autoenabled parameters + self._setupAutoenabledParameters() + # Copy all the configuration files + self._writeCfgFiles(self.bertos_srcdir, self.cfgdir) + if not self.is_preset: + # Create project files for selected plugins only if the project isn't a preset + self._createProjectFiles() + + def _createProjectFiles(self): + # Files for selected plugins + relevants_files = {} + for plugin in self.infos["OUTPUT"]: + module = loadPlugin(plugin) + relevants_files[plugin] = module.createProject(self) + self.infos["RELEVANT_FILES"] = relevants_files + + def _writeVersionFile(self, filename): + if not self.edit or self.old_srcdir: + version_file = open(os.path.join(const.DATA_DIR, "vtemplates/VERSION"), "r").read() + open(filename, "w").write(versionFileGenerator(self, version_file)) + + def _writeProjectFile(self, filename): + f = open(filename, "w") + f.write(projectFileGenerator(self)) + f.close() + + def _writeMakefile(self): + bertos_utils.makefileGenerator(self) + + def _writeUserMkFile(self): + bertos_utils.userMkGenerator(self) + + def _writeUserMkFileFromPreset(self): + bertos_utils.userMkGeneratorFromPreset(self) + + def _writeWizardMkFile(self): + bertos_utils.mkGenerator(self) + + def _writeMainFile(self, filename): + main = open(os.path.join(const.DATA_DIR, "srctemplates/main.c"), "r").read() + open(filename, "w").write(main) + + def _writeHwFiles(self, source_dir, destination_dir): + for module, information in self.infos["MODULES"].items(): + for hwfile in information["hw"]: + if hwfile == "": + continue + string = open(source_dir + "/" + hwfile, "r").read() + hwfile_path = destination_dir + "/" + os.path.basename(hwfile) + if not self.edit or not os.path.exists(hwfile_path): + # If not in editing mode it copies all the hw files. If in + # editing mode it copies only the files that don't exist yet + open(os.path.join(destination_dir,os.path.basename(hwfile)), "w").write(string) + + def _writeAllPresetHwFiles(self, source_dir, destination_dir): + """ + Copy all but directories contained into the preset hw directory. + It's needed because some presets need custom hw files not defined with + Wizard directives into modules... + """ + source_dir = os.path.join(source_dir, "hw") + for f in os.listdir(source_dir): + abspath = os.path.join(source_dir, f) + if not os.path.isdir(abspath): + # Exlude directories from the copy! + hw_file = open(os.path.join(source_dir, f), 'r').read() + open(os.path.join(destination_dir, f), 'w').write(hw_file) + + def _writeCfgFiles(self, source_dir, destination_dir): + for configuration, information in self.infos["CONFIGURATIONS"].items(): + string = open(source_dir + "/" + configuration, "r").read() + for start, parameter in information["paramlist"]: + infos = information[parameter] + value = infos["value"] + if "unsigned" in infos["informations"] and infos["informations"]["unsigned"]: + value += "U" + if "long" in infos["informations"] and infos["informations"]["long"]: + value += "L" + string = sub(string, parameter, value) + f = open(os.path.join(destination_dir, os.path.basename(configuration)), "w") + f.write(string) + f.close() + + def _writeCustomSrcFiles(self): + origin = self.infos["PRESET_SRC_PATH"] + # Files to be ignored (all project files, cfg dir, wizard mk file, all global ignored dirs) + project_related_stuff = ( + "cfg", + "hw", + self.infos["PRESET_NAME"] + ".mk", + self.infos["PRESET_NAME"] + "_user.mk", + "project.bertos", + self.infos["PRESET_NAME"] + ".project", + self.infos["PRESET_NAME"] + ".workspace", + ) + const.IGNORE_LIST + for element in os.listdir(origin): + if element not in project_related_stuff: + full_path = os.path.join(origin, element) + if os.path.isdir(full_path): + copytree.copytree(full_path, os.path.join(self.prjdir, element), ignore_list=const.IGNORE_LIST) + else: + shutil.copy(full_path, self.prjdir) + + def _setupAutoenabledParameters(self): + for module, information in self.infos["MODULES"].items(): + if "configuration" in information and information["configuration"] != "": + configurations = self.infos["CONFIGURATIONS"] + configuration = configurations[information["configuration"]] + for start, parameter in configuration["paramlist"]: + if "type" in configuration[parameter]["informations"] and configuration[parameter]["informations"]["type"] == "autoenabled": + configuration[parameter]["value"] = "1" if information["enabled"] else "0" + self.infos["CONFIGURATIONS"] = configurations + + # Project related properties + @property + def maindir(self): + return self.infos.get("PROJECT_PATH", None) + + @property + def srcdir(self): + if self.maindir: + return os.path.join(self.maindir, "bertos") + else: + return None + + @property + def prjdir(self): + return self.infos.get("PROJECT_SRC_PATH", None) + + @property + def hwdir(self): + if self.prjdir: + return os.path.join(self.prjdir, "hw") + else: + return None + + @property + def cfgdir(self): + if self.prjdir: + return os.path.join(self.prjdir, "cfg") + else: + return None + + @property + def old_srcdir(self): + return self.infos.get("OLD_BERTOS_PATH", None) + + # BeRTOS sources related properties + @property + def bertos_maindir(self): + return self.infos.get("BERTOS_PATH", None) + + @property + def bertos_srcdir(self): + if self.bertos_maindir: + return os.path.join(self.bertos_maindir, "bertos") + else: + return None + + @property + def src_hwdir(self): + if self.from_preset: + return os.path.join(self.infos["PRESET_PATH"], self.infos["PRESET_HW_PATH"]) + else: + return self.bertos_maindir + + @property + def from_preset(self): + return self.infos.get("PROJECT_FROM_PRESET", False) + + @property + def is_preset(self): + return self.infos.get("PRESET", False) + + def _createDirectory(self, directory): + if not directory: + return + if os.path.isdir(directory): + shutil.rmtree(directory, True) + os.makedirs(directory) + + def _copySources(self, origin, destination): + # If not in editing mode it copies all the bertos sources in the /bertos subdirectory of the project + shutil.rmtree(destination, True) + copytree.copytree(origin + "/bertos", destination, ignore_list=const.IGNORE_LIST) + + def _mergeSources(self, origin, destination, old_sources_dir): + if old_sources_dir: + mergeSources(destination, origin, old_sources_dir) + + def setInfo(self, key, value): + """ + Store the given value with the name key. + """ + self.infos[key] = value + + def info(self, key, default=None): + """ + Retrieve the value associated with the name key. + """ + if key in self.infos: + return copy.deepcopy(self.infos[key]) + return default + + def getCpuInfos(self): + cpuInfos = [] + for definition in self.findDefinitions(const.CPU_DEFINITION): + cpuInfos.append(getInfos(definition)) + return cpuInfos + + def searchFiles(self, filename): + file_dict = self.infos["FILE_DICT"] + return [(filename, dirname) for dirname in file_dict.get(filename, [])] + + def findDefinitions(self, ftype): + # Maintain a cache for every scanned BERTOS_PATH + definitions_dict = self._cached_queries.get(self.infos["BERTOS_PATH"], {}) + definitions = definitions_dict.get(ftype, None) + if definitions is not None: + return definitions + file_dict = self.infos["FILE_DICT"] + definitions = [] + for filename in file_dict: + if fnmatch.fnmatch(filename, ftype): + definitions += [(filename, dirname) for dirname in file_dict.get(filename, [])] + + # If no cache for the current BERTOS_PATH create an empty one + if not definitions_dict: + self._cached_queries[self.infos["BERTOS_PATH"]] = {} + # Fill the empty cache with the result + self._cached_queries[self.infos["BERTOS_PATH"]][ftype] = definitions + return definitions + + def setEnabledModules(self, enabled_modules): + modules = self.infos["MODULES"] + files = {} + for module, information in modules.items(): + information["enabled"] = module in enabled_modules + if information["enabled"]: + for dependency in information["depends"]: + if not dependency in modules: + files[dependency] = files.get(dependency, 0) + 1 + self.infos["MODULES"] = modules + self.infos["FILES"] = files + + def __repr__(self): + return "%s" %(id(self), repr(self.infos)) diff --git a/2.5/wizard/BProjectPresets.py b/2.5/wizard/BProjectPresets.py new file mode 100644 index 00000000..9afed4f4 --- /dev/null +++ b/2.5/wizard/BProjectPresets.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of slimqc. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2010 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os + +from PyQt4 import uic + +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +from BWizardPage import BWizardPage + +from BCreationPage import BCreationPage +from BToolchainPage import BToolchainPage + +from bertos_utils import _cmp +from toolchain_manager import ToolchainManager + +import const +import qvariant_converter + +class BProjectPresetsPage(QWidget): + def __init__(self, preset_data, parent=None): + QWidget.__init__(self, parent) + self.pageContent = uic.loadUi(os.path.join(const.DATA_DIR, const.UI_LOCATION, "preset_page.ui"), None) + self.project = QApplication.instance().project + self.settings = QApplication.instance().settings + self.preset_data = preset_data + layout = QVBoxLayout() + layout.addWidget(self.pageContent) + self.setLayout(layout) + self.setupUi() + self.connectSignals() + + def setupUi(self): + self.pageContent.presetList.clear() + self.pageContent.categoryDescription.setText(self.preset_data["info"].get("description", "")) + for preset in sorted(self.preset_data["children"].values(), _cmp): + item_name = preset["info"].get("name", preset["info"]["filename"]) + item_icon = os.path.join(preset["info"]["path"], const.PREDEFINED_BOARD_ICON_FILE) + if not os.path.exists(item_icon): + item_icon = const.PREDEFINED_BOARD_DEFAULT_PROJECT_ICON + item_icon = QIcon(item_icon) + item = QListWidgetItem(item_icon, item_name) + item.setData(Qt.UserRole, qvariant_converter.convertString(preset["info"]["path"])) + self.pageContent.presetList.addItem(item) + self.pageContent.presetList.setCurrentRow(0) + self.updateUi() + + def connectSignals(self): + self.connect(self.pageContent.presetList, SIGNAL("currentItemChanged(QListWidgetItem *, QListWidgetItem*)"), self.updateUi) + self.connect(self.pageContent.presetList, SIGNAL("currentItemChanged(QListWidgetItem *, QListWidgetItem*)"), self, SIGNAL("completeChanged()")) + + def updateUi(self): + if self.selected: + preset_path = qvariant_converter.getString(self.selected.data(Qt.UserRole)) + preset = self.preset_data["children"][preset_path] + description = preset["info"].get("description", "") + path = unicode(QUrl.fromLocalFile(preset_path).toString()) + description = description.replace("$path", path) + self.pageContent.descriptionArea.setHtml(description) + + @property + def selected(self): + return self.pageContent.presetList.currentItem() + + +class BProjectPresets(BWizardPage): + def __init__(self): + BWizardPage.__init__(self, const.UI_LOCATION + "/project_presets.ui") + + ## Overloaded QWizardPage methods ## + + def isComplete(self): + preset_path = self.selected_path + if preset_path: + self.setProjectInfo("PROJECT_PRESET", preset_path) + self.setProjectInfo("BASE_MODE", not self.advanced) + return True + else: + self.setProjectInfo("PROJECT_PRESET", None) + return False + + def validatePage(self): + """ + This hack permits to load the preset once, when the user go press the + Next button. + """ + preset_path = self.selected_path + try: + QApplication.instance().setOverrideCursor(Qt.WaitCursor) + self.project.loadProjectFromPreset(preset_path) + self.setProjectInfo("PRESET_LOADED", True) + finally: + QApplication.instance().restoreOverrideCursor() + # Return always True, this is a fake validation. + return True + + def nextId(self): + """ + Overload of the QWizardPage nextId method. + """ + # Route to Toolchain page if the user select advanced + # or to Output page if the user select base + if self.advanced: + return self.wizard().pageIndex(BToolchainPage) + else: + cpu_info = self.projectInfo("CPU_INFOS") + if cpu_info: + target = cpu_info["TOOLCHAIN"] + # Try to find a suitable toolchain automatically + tm = ToolchainManager() + suitable_toolchains = tm.suitableToolchains(target) + if len(suitable_toolchains) == 1: + toolchain = suitable_toolchains.pop() + toolchain_info = tm._validateToolchain(toolchain) + toolchain_info["path"] = toolchain + self.setProjectInfo("TOOLCHAIN", toolchain_info) + return self.wizard().pageIndex(BCreationPage) + else: + return self.wizard().pageIndex(BToolchainPage) + else: + # It seems that the nextId method is called before the + # reloadData one (that is called after the page changing. + # + # TODO: fix this awful code lines + target = None + return self.wizard().pageIndex(BToolchainPage) + + #### + + ## Overloaded BWizardPage methods ## + + def reloadData(self, previous_id=None): + if not self.projectInfo("PRESET_LOADED"): + preset_path = self.projectInfo("PROJECT_BOARD") + preset_tree = self.projectInfo("PRESET_TREE") + preset_list = preset_tree["children"][preset_path]["children"] + preset_list = sorted(preset_list.values(), _cmp) + self.setTitle(self.tr("Select the project template for %1").arg(preset_tree["children"][preset_path]["info"].get("name", preset_tree["children"][preset_path]["info"]["filename"]))) + self.setupTabs(preset_list) + + def connectSignals(self): + self.connect(self.pageContent.boardTabWidget, SIGNAL("currentChanged(int)"), self, SIGNAL("completeChanged()")) + + #### + + ## Slots ## + #### + + def setupTabs(self, preset_list): + self.pageContent.boardTabWidget.clear() + for preset in preset_list: + icon = os.path.join(preset["info"]["path"], ".icon.png") + preset_page = BProjectPresetsPage(preset) + if os.path.exists(icon): + self.pageContent.boardTabWidget.addTab(preset_page, QIcon(icon), preset["info"].get("name", preset["info"]["filename"])) + else: + self.pageContent.boardTabWidget.addTab(preset_page, preset["info"].get("name", preset["info"]["filename"])) + self.connect(preset_page, SIGNAL("completeChanged()"), self, SIGNAL("completeChanged()")) + + @property + def advanced(self): + if self.selected_data: + return self.selected_data["info"].get("advanced", False) + else: + return None + + @property + def selected_path(self): + current_widget = self.pageContent.boardTabWidget.currentWidget() + preset_path = None + if current_widget: + current_item = current_widget.pageContent.presetList.currentItem() + if current_item: + preset_path = current_item.data(Qt.UserRole) + preset_path = qvariant_converter.getString(preset_path) + return preset_path + + @property + def selected_data(self): + if self.selected_path: + current_widget = self.pageContent.boardTabWidget.currentWidget() + return current_widget.preset_data["children"][self.selected_path] + else: + return None diff --git a/2.5/wizard/BStartPage.py b/2.5/wizard/BStartPage.py new file mode 100644 index 00000000..2d633f80 --- /dev/null +++ b/2.5/wizard/BStartPage.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +from PyQt4.QtCore import * +from PyQt4.QtGui import * +import PyQt4.uic as uic + +from const import * + +class BStartPage(QDialog): + + def __init__(self): + QDialog.__init__(self) + self.setupUi() + self.connectSignals() + self.setWindowTitle(self.tr("Create or edit a BeRTOS project")) + self.initializeButtons() + + def setupUi(self): + self.content = uic.loadUi(UI_LOCATION + "/start.ui", None) + self.setWindowIcon(QIcon(":/images/appicon.png")) + layout = QVBoxLayout() + layout.addWidget(self.content) + self.setLayout(layout) + + def connectSignals(self): + self.connect(self.content.newButton, SIGNAL("clicked()"), self.newProject) + self.connect(self.content.editButton, SIGNAL("clicked()"), self.editProject) + + def initializeButtons(self): + self.button_group = QButtonGroup() + self.button_group.addButton(self.content.newButton) + self.button_group.addButton(self.content.editButton) + self.button_group.setExclusive(True) + + def newProject(self): + self.close() + self.emit(SIGNAL("newProject")) + + def editProject(self): + self.close() + self.emit(SIGNAL("editProject")) diff --git a/2.5/wizard/BToolchainPage.py b/2.5/wizard/BToolchainPage.py new file mode 100644 index 00000000..914ebf80 --- /dev/null +++ b/2.5/wizard/BToolchainPage.py @@ -0,0 +1,281 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os +import collections + +from BWizardPage import * +from BCreationPage import BCreationPage + +import BToolchainSearch +import bertos_utils +import qvariant_converter + +from toolchain_manager import ToolchainManager + +from const import * + +class BToolchainPage(BWizardPage): + """ + Page of the wizard that permits to choose the toolchain to use for the + project. + """ + + def __init__(self): + BWizardPage.__init__(self, UI_LOCATION + "/toolchain_select.ui") + self.setTitle(self.tr("Select toolchain")) + self.setSubTitle(self.tr("You can look for more toolchains in your system by pressing the \"Search\" button, or manually add them with the \"+\" button")) + self._valid_items = [] + self._toolchain_manager = ToolchainManager() + + ## Overloaded QWizardPage methods. ## + + def isComplete(self): + """ + Overload of the QWizard isComplete method. + """ + if self.pageContent.toolchainList.currentRow() != -1: + self.setProjectInfo("TOOLCHAIN", + qvariant_converter.getStringDict(self.pageContent.toolchainList.currentItem().data(Qt.UserRole))) + return True + else: + return False + + def nextId(self): + """ + Overload of the QWizardPage nextId method. + """ + # Route to Output page if it's a predefined easy project. + if self.projectInfo("PROJECT_FROM_PRESET") and self.projectInfo("BASE_MODE"): + return self.wizard().pageIndex(BCreationPage) + else: + return QWizardPage.nextId(self) + + #### + + ## Overloaded BWizardPage methods. ## + + def setupUi(self): + """ + Sets up the user interface. + """ + self.pageContent.infoLabel.setVisible(False) + + def connectSignals(self): + """ + Connects the signals with the related slots. + """ + self.connect(self.pageContent.toolchainList, SIGNAL("currentItemChanged(QListWidgetItem *, QListWidgetItem*)"), self.selectionChanged) + self.connect(self.pageContent.addButton, SIGNAL("clicked()"), self.addToolchain) + self.connect(self.pageContent.removeButton, SIGNAL("clicked()"), self.removeToolchain) + self.connect(self.pageContent.searchButton, SIGNAL("clicked()"), self.searchToolchain) + self.connect(self.pageContent.checkButton, SIGNAL("clicked()"), self.validateAllToolchains) + + def reloadData(self, previous_id=None): + """ + Overload of the BWizard reloadData method. + """ + if previous_id is None or previous_id < self.wizard().currentId(): + self._clearList() + self.setupUi() + self._populateToolchainList() + if len(self._valid_items) >= 1: + self.pageContent.toolchainList.setCurrentItem(self._valid_items[0]) + + #### + + ## Slots ## + + def selectionChanged(self): + """ + Slot called when the user click on an entry of the toolchain list. + """ + if self.pageContent.toolchainList.currentRow() != -1: + infos = collections.defaultdict(lambda: unicode("not defined")) + infos.update(qvariant_converter.getStringDict(self.pageContent.toolchainList.currentItem().data(Qt.UserRole))) + self.pageContent.infoLabel.setText("GCC " + infos["version"] + " (" + infos["build"] + ")\nTarget: " + infos["target"] + "\nPath: " + os.path.normpath(infos["path"])) + self.pageContent.infoLabel.setVisible(True) + if self.isDefaultToolchain(infos): + self.disableRemoveButton() + else: + self.enableRemoveButton() + self.emit(SIGNAL("completeChanged()")) + + def addToolchain(self): + """ + Slot called when the user adds manually a toolchain. + """ + sel_toolchain = unicode(QFileDialog.getOpenFileName(self, self.tr("Choose the toolchain"), "")) + if sel_toolchain != "": + item = QListWidgetItem(sel_toolchain) + item.setData(Qt.UserRole, qvariant_converter.convertStringDict({"path": sel_toolchain})) + self.pageContent.toolchainList.addItem(item) + self._toolchain_manager.addToolchain(sel_toolchain) + + def removeToolchain(self): + """ + Slot called when the user removes manually a toolchain. + """ + if self.pageContent.toolchainList.currentRow() != -1: + item = self.pageContent.toolchainList.takeItem(self.pageContent.toolchainList.currentRow()) + toolchain = qvariant_converter.getStringDict(item.data(Qt.UserRole))["path"] + self._toolchain_manager.removeToolchain(toolchain) + + def searchToolchain(self): + """ + Slot called when the user clicks on the 'search' button. It opens the + toolchain search dialog. + """ + search = BToolchainSearch.BToolchainSearch() + self.connect(search, SIGNAL("accepted()"), self._search) + search.exec_() + + def validateAllToolchains(self): + """ + Slot called when the user clicks on the validate button. It starts the + toolchain validation procedure for all the toolchains. + """ + try: + QApplication.instance().setOverrideCursor(Qt.WaitCursor) + for i in range(self.pageContent.toolchainList.count()): + self.validateToolchain(i) + finally: + QApplication.instance().restoreOverrideCursor() + + #### + + def _populateToolchainList(self): + """ + Fills the toolchain list with the toolchains stored in the QSettings. + """ + self.pageContent.toolchainList.clear() + self._valid_items = [] + toolchains = self._toolchain_manager.predefined_toolchains + self._toolchain_manager.toolchains + sel_toolchain = self.projectInfo("TOOLCHAIN") + for key, value in toolchains: + if os.path.exists(key): + item = QListWidgetItem(key) + item_data = {"path":key} + if value: + item_data.update(value) + item.setData(Qt.UserRole, qvariant_converter.convertStringDict(item_data)) + self.pageContent.toolchainList.addItem(item) + if sel_toolchain and sel_toolchain["path"] == key: + self.pageContent.toolchainList.setCurrentItem(item) + if value is not None: + self.validateToolchain(self.pageContent.toolchainList.row(item)) + + def currentToolchain(self): + selected_toolchain = qvariant_converter.getStringDict(self.pageContent.toolchainList.currentItem().data(Qt.UserRole)) + return selected_toolchain + + def _clearList(self): + """ + Removes all the toolchain from the list. + """ + self.pageContent.toolchainList.clear() + + def _search(self): + """ + Searches for toolchains in the stored directories, and stores them in the + QSettings. + """ + dir_list = self.searchDirList() + if self.pathSearch(): + dir_list += [element for element in bertos_utils.getSystemPath()] + _toolchain_dict = self._toolchain_manager.storedToolchainDict() + toolchain_list = bertos_utils.findToolchains(dir_list) + for toolchain in toolchain_list: + self._toolchain_manager.addToolchain(toolchain, _toolchain_dict.get(toolchain, False)) + self._populateToolchainList() + self.showMessage(self.tr("Toolchain search result."), self.tr("%1 toolchains found").arg(len(toolchain_list))) + + def _validItem(self, index, infos): + """ + Sets the item at index as a valid item and associates the given info to it. + """ + item = self.pageContent.toolchainList.item(index) + new_data = qvariant_converter.getStringDict(self.pageContent.toolchainList.item(index).data(Qt.UserRole)) + new_data.update(infos) + item.setData(Qt.UserRole, qvariant_converter.convertStringDict(new_data)) + needed = self.projectInfo("CPU_INFOS") + if "target" in infos and infos["target"].find(needed["TOOLCHAIN"]) != -1: + item.setIcon(QIcon(":/images/ok.png")) + self._valid_items.append(item) + else: + item.setIcon(QIcon(":/images/warning.png")) + if "version" in infos and "target" in infos: + item.setText("GCC " + infos["version"] + " - " + infos["target"].strip()) + + def _invalidItem(self, index): + """ + Sets the item at index as an invalid item. + """ + item = self.pageContent.toolchainList.item(index) + item.setIcon(QIcon(":/images/error.png")) + + def validateToolchain(self, i): + """ + Toolchain validation procedure. + """ + filename = qvariant_converter.getStringDict(self.pageContent.toolchainList.item(i).data(Qt.UserRole))["path"] + info = self._toolchain_manager.validateToolchain(filename) + + # Add the item in the list with the appropriate associate data. + if info: + self._validItem(i, info) + else: + self._invalidItem(i) + + def isDefaultToolchain(self, toolchain): + """ + Returns True if the given toolchain is one of the default toolchains. + """ + return toolchain["path"] in self._toolchain_manager._predefined_toolchain_set + + def disableRemoveButton(self): + """ + Disable the remove button. + """ + self.pageContent.removeButton.setEnabled(False) + + def enableRemoveButton(self): + """ + Enable the remove button. + """ + self.pageContent.removeButton.setEnabled(True) + + def currentItem(self): + return self.pageContent.toolchainList.currentItem() diff --git a/2.5/wizard/BToolchainSearch.py b/2.5/wizard/BToolchainSearch.py new file mode 100644 index 00000000..e76157a8 --- /dev/null +++ b/2.5/wizard/BToolchainSearch.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os + +from PyQt4.QtCore import * +from PyQt4.QtGui import * +import PyQt4.uic as uic + +import qvariant_converter + +import const + +class BToolchainSearch(QDialog): + """ + Dialog that permits to choice the settings for the toolchain search procedure. + """ + + def __init__(self): + QDialog.__init__(self) + self._setupUi() + self._connectSignals() + self.setWindowTitle(self.tr("Toolchain search page")) + + def _setupUi(self): + """ + Sets up the user interface. + """ + self.content = uic.loadUi(os.path.join(const.DATA_DIR, const.UI_LOCATION, "toolchain_search.ui"), None) + layout = QVBoxLayout() + layout.addWidget(self.content) + self.setLayout(layout) + self._populateDirList() + self._setPathSearch() + self._setSearchButton() + + def _connectSignals(self): + """ + Connects the signals with the related slots. + """ + self.connect(self.content.pathBox, SIGNAL("stateChanged(int)"), self._stateChanged) + self.connect(self.content.addButton, SIGNAL("clicked()"), self._addDir) + self.connect(self.content.removeButton, SIGNAL("clicked()"), self._removeDir) + self.connect(self.content.cancelButton, SIGNAL("clicked()"), self.reject) + self.connect(self.content.searchButton, SIGNAL("clicked()"), self.accept) + + def _setSearchButton(self): + """ + Toggles the 'searchButton' evaluating the settings. + """ + self.content.searchButton.setDefault(True) + self.content.searchButton.setEnabled(self.content.pathBox.isChecked() or self.content.customDirList.count() != 0) + + def _populateDirList(self): + """ + Fills the dir list with the directories stored in the QSettings. + """ + search_dir_list = qvariant_converter.getStringList(QApplication.instance().settings.value("search_dir_list")) + for element in search_dir_list: + item = QListWidgetItem(element) + self.content.customDirList.addItem(item) + + def _setPathSearch(self): + """ + Sets the path search checkbox to the stored value. + """ + pathSearch = qvariant_converter.getBool(QApplication.instance().settings.value(QString("path_search"))) + self.content.pathBox.setChecked(pathSearch) + + def _stateChanged(self, state): + """ + Slot called when the path search checkbox state changes. Stores the value in the QSettings. + """ + QApplication.instance().settings.setValue(QString("path_search"), QVariant(state != 0)) + self._setSearchButton() + + def _addDir(self): + """ + Slot called when the user adds a dir. + """ + directory = QFileDialog.getExistingDirectory(self, self.tr("Open Directory"), "", QFileDialog.ShowDirsOnly) + if not directory.isEmpty(): + directory = unicode(directory) + item = QListWidgetItem(directory) + self.content.customDirList.addItem(item) + search_dir_list = qvariant_converter.getStringList(QApplication.instance().settings.value("search_dir_list")) + search_dir_list = set(search_dir_list + [directory]) + QApplication.instance().settings.setValue(QString("search_dir_list"), qvariant_converter.convertStringList(list(search_dir_list))) + self._setSearchButton() + + def _removeDir(self): + """ + Slot called when the user removes a dir. + """ + if self.content.customDirList.currentRow() != -1: + item = self.content.customDirList.takeItem(self.content.customDirList.currentRow()) + search_dir_list = qvariant_converter.getStringList(QApplication.instance().settings.value(QString("search_dir_list"))) + search_dir_list = set(search_dir_list) + search_dir_list.remove(unicode(item.text())) + QApplication.instance().settings.setValue(QString("search_dir_list"), qvariant_converter.convertStringList(list(search_dir_list))) + self._setSearchButton() + diff --git a/2.5/wizard/BVersionPage.py b/2.5/wizard/BVersionPage.py new file mode 100644 index 00000000..addc2960 --- /dev/null +++ b/2.5/wizard/BVersionPage.py @@ -0,0 +1,259 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os + +from PyQt4.QtGui import * +from BWizardPage import * +import bertos_utils +import qvariant_converter + +from const import * + +class BVersionPage(BWizardPage): + """ + Page of the wizard that permits to choose which BeRTOS version the user wants + to use. This page show some pieces of information about the version. + """ + + def __init__(self, edit=False): + self._edit = edit + BWizardPage.__init__(self, UI_LOCATION + "/bertos_versions.ui") + self.setTitle(self.tr("Select BeRTOS version")) + self.setSubTitle(self.tr("Your project will be created with the specified BeRTOS version")) + + ## Overloaded QWizardPage methods ## + + def isComplete(self): + """ + Overload of the QWizardPage isComplete method. + """ + if self.pageContent.versionList.currentRow() != -1: + sources_path = qvariant_converter.getString(self.pageContent.versionList.currentItem().data(Qt.UserRole)) + # Remove the trailing slash + if sources_path.endswith(os.sep): + sources_path = sources_path[:-1] + self.setProjectInfo("BERTOS_PATH", sources_path) + return True + else: + return False + + #### + + ## Overloaded BWizardPage methods ## + + def connectSignals(self): + """ + Overload of the BWizardPage connectSignals method. + """ + self.connect(self.pageContent.versionList, SIGNAL("currentItemChanged(QListWidgetItem *, QListWidgetItem*)"), self.rowChanged) + self.connect(self.pageContent.addButton, SIGNAL("clicked()"), self.addVersion) + self.connect(self.pageContent.removeButton, SIGNAL("clicked()"), self.removeVersion) + # Fake signal connection for the update button + self.connect(self.pageContent.updateButton, SIGNAL("clicked()"), self.updateClicked) + + def reloadData(self, previous_id=None): + """ + Overload of the BWizardPage reloadData method. + """ + self.resetVersionList() + self.pageContent.versionList.setCurrentRow(-1) + self.fillVersionList() + + def setupUi(self): + """ + Overload of the BWizardPage setupUi method. + """ + self.pageContent.updateButton.setVisible(False) + + #### + + ## Slots ## + + def addVersion(self): + """ + Slot called when the user add a BeRTOS version. + """ + directory = QFileDialog.getExistingDirectory(self, self.tr("Choose a directory"), "", QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks) + if not directory.isEmpty(): + self.storeVersion(unicode(directory)) + self.pageContent.versionList.clear() + self.fillVersionList() + self.emit(SIGNAL("completeChanged()")) + + def removeVersion(self): + """ + Slot called when the user remove a BeRTOS version. + """ + item = self.pageContent.versionList.takeItem(self.pageContent.versionList.currentRow()) + if item: + self.deleteVersion(qvariant_converter.getString(item.data(Qt.UserRole))) + self.emit(SIGNAL("completeChanged()")) + + def rowChanged(self): + """ + Slot called when the user select an entry from the version list. + """ + if self.isDefaultVersion(self.currentVersion()): + self.disableRemoveButton() + else: + self.enableRemoveButton() + self.emit(SIGNAL("completeChanged()")) + + def updateClicked(self): + """ + Slot called when the user clicks on the 'update' button. It checks for + update (TO BE IMPLEMENTED). + """ + pass + + #### + + def storeVersion(self, directory): + """ + Stores the directory selected by the user in the QSettings. + """ + versions = self.versions() + versions = set(versions + [directory]) + self.setVersions(list(versions)) + + def deleteVersion(self, directory): + """ + Removes the given directory from the QSettings. + """ + versions = [os.path.normpath(path) for path in self.versions()] + versions.remove(os.path.normpath(directory)) + self.setVersions(versions) + + def resetVersionList(self): + """ + Remove all the version entries from the list. + """ + self.pageContent.versionList.clear() + + def insertListElement(self, directory): + """ + Inserts the given directory in the version list and returns the + inserted item. + """ + if bertos_utils.isBertosDir(directory): + item = QListWidgetItem(QIcon(":/images/ok.png"), bertos_utils.bertosVersion(directory) + " (\"" + os.path.normpath(directory) + "\")") + item.setData(Qt.UserRole, qvariant_converter.convertString(directory)) + self.pageContent.versionList.addItem(item) + return item + elif len(directory) > 0: + item = QListWidgetItem(QIcon(":/images/warning.png"), "UNKNOWN" + " (\"" + os.path.normpath(directory) + "\")") + item.setData(Qt.UserRole, qvariant_converter.convertString(directory)) + self.pageContent.versionList.addItem(item) + return item + + def fillVersionList(self): + """ + Fills the version list with all the BeRTOS versions founded in the QSettings. + """ + versions = set([]) + if os.name == "nt": + import winreg_importer + versions |= set([os.path.normpath(dir) for dir in winreg_importer.getBertosDirs()]) + versions |= set([os.path.normpath(dir) for dir in self.versions()]) + selected = self.projectInfo("BERTOS_PATH") + for directory in versions: + item = self.insertListElement(directory) + if selected and selected == directory: + self.setCurrentItem(item) + if not selected: + latest_version_item = self.latestVersionItem() + if latest_version_item: + self.setCurrentItem(latest_version_item) + + def disableRemoveButton(self): + """ + Disable the Remove button. + """ + self.pageContent.removeButton.setEnabled(False) + + def enableRemoveButton(self): + """ + Enable the Remove button. + """ + self.pageContent.removeButton.setEnabled(True) + + def latestVersionItem(self): + """ + Returns the latest BeRTOS version founded. + """ + latest_version_item = None + for index in range(self.pageContent.versionList.count()): + item = self.pageContent.versionList.item(index) + if not latest_version_item: + latest_version_item = item + version = item.text().split(" (")[0] + latest = latest_version_item.text().split(" (")[0] + if version != "UNKNOWN" and version > latest: + latest_version_item = item + return latest_version_item + + def setCurrentItem(self, item): + """ + Select the given item in the version list. + """ + self.pageContent.versionList.setCurrentItem(item) + + def currentItem(self): + """ + Returns the current selected item. + """ + return self.pageContent.versionList.currentItem() + + def currentVersion(self): + """ + Return the path of the selected version. + """ + current = self.currentItem() + if current: + return qvariant_converter.getString(current.data(Qt.UserRole)) + else: + return None + + def isDefaultVersion(self, version): + """ + Returns True if the given version is one of the default versions. + """ + if os.name == "nt": + import winreg_importer + if version in winreg_importer.getBertosDirs(): + return True + return False + diff --git a/2.5/wizard/BWizard.py b/2.5/wizard/BWizard.py new file mode 100644 index 00000000..7e96ee49 --- /dev/null +++ b/2.5/wizard/BWizard.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import copy + +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +try: + from version import wizard_version +except ImportError: + wizard_version = "sandbox" + +class BWizard(QWizard): + """ + Main class of the wizard. It adds the pages automatically. + """ + + def __init__(self, page_list): + self._current = None + QWizard.__init__(self) + geometry = QApplication.instance().settings.value("geometry", QVariant()).toRect() + self.setGeometry(geometry) + self.setWindowTitle(self.tr("Create a BeRTOS project - rev.%1").arg(wizard_version)) + self.setWindowIcon(QIcon(":/images/appicon.png")) + self.setOption(QWizard.DisabledBackButtonOnLastPage, True) + self.addPages(page_list) + self.connectSignals() + + def addPages(self, page_list): + """ + Adds the pages in the wizard. + """ + self._page_dict = {} + for i, page in enumerate(page_list): + self._page_dict[page] = i + self.setPage(i, page()) + + def pageIndex(self, page_class): + return self._page_dict[page_class] + + def connectSignals(self): + """ + Connects the signals with the related slots. + """ + self.connect(self, SIGNAL("currentIdChanged(int)"), self.pageChanged) + + def pageChanged(self, pageId): + """ + Slot called when the user change the current page. It calls the reloadData + method of the next page. + """ + page = self.page(pageId) + if page: + page.reloadData(previous_id= self._current) + self._current = pageId + + def project(self): + """ + Returns the BProject associated with the wizard. + """ + return copy.deepcopy(QApplication.instance().project) + + def done(self, result): + geometry = self.geometry() + QApplication.instance().settings.setValue("geometry", QVariant(geometry)) + QWizard.done(self, result) diff --git a/2.5/wizard/BWizardPage.py b/2.5/wizard/BWizardPage.py new file mode 100644 index 00000000..f86e09c4 --- /dev/null +++ b/2.5/wizard/BWizardPage.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os + +from PyQt4.QtCore import * +from PyQt4.QtGui import * +from PyQt4 import uic + +import qvariant_converter + +import const + +class BWizardPage(QWizardPage): + """ + Base class for all the wizard pages. It has the utility method used in all + the pages. A wizard page class need to extend this class. + """ + + def __init__(self, wizardGui, parent = None): + QWizardPage.__init__(self, parent) + self.pageContent = uic.loadUi(os.path.join(const.DATA_DIR, wizardGui), None) + layout = QVBoxLayout() + layout.addWidget(self.pageContent) + self.setLayout(layout) + self.setupUi() + self.connectSignals() + + def exceptionOccurred(self, message): + """ + Simple message box showing method. + """ + QMessageBox.critical(self, self.tr("Error occurred"), message, QMessageBox.Ok, QMessageBox.NoButton) + + def showMessage(self, title, message): + """ + Show an information message box with title and message. + """ + QMessageBox.information(self, title, message) + + ## BProject interaction methods ## + + def setProjectInfo(self, key, value): + """ + Stores the given value in the BProject class associating it with the given + key. + """ + QApplication.instance().project.setInfo(key, value) + + def projectInfo(self, key): + """ + Retrieves the information associated with the given key. + """ + return QApplication.instance().project.info(key) + + @property + def project(self): + """ + Returns the BProject instance. + """ + return QApplication.instance().project + + #### + + ## QSettings interaction methods ## + + def settingsStore(self, key, value): + """ + Stores the given value in the QSettings associated with the given key. + """ + QApplication.instance().settings.setValue(QString(key), value) + + def settingsRetrieve(self, key): + """ + Retrieves the value associated to key in the QSettings. Note that this + Value is a QVariant and neet to be converted in a standard type. + """ + return QApplication.instance().settings.value(QString(key), QVariant()) + + def plugins(self): + """ + Returns the list of actived plugins. + """ + return qvariant_converter.getStringList(self.settingsRetrieve("plugins")) + + def setPlugins(self, plugins): + """ + Stores the given list of actived plugins. + """ + self.settingsStore("plugins", qvariant_converter.convertStringList(plugins)) + + def versions(self): + """ + Returns the version list from the QSettings. + """ + return qvariant_converter.getStringList(self.settingsRetrieve("versions")) + + def setVersions(self, versions): + """ + Stores the given versions in the QSettings. + """ + self.settingsStore("versions", qvariant_converter.convertStringList(versions)) + + def searchDirList(self): + """ + Returns the search dir list from the QSettings. + """ + return qvariant_converter.getStringList(self.settingsRetrieve("search_dir_list")) + + def setSearchDirList(self, search_dir_list): + """ + Stores the search dir list in the QSettings. + """ + self.settingsStore("search_dir_list", qvariant_converter.convertStringList(search_dir_list)) + + def pathSearch(self): + """ + Returns the value of path search from the QSettings. + """ + return qvariant_converter.getBool(self.settingsRetrieve("path_search")) + + def setPathSearch(self, path_search): + """ + Stores the path search value in the QSettings. + """ + self.settingsStore("path_search", qvariant_converter.convertBool(path_search)) + + def toolchains(self): + """ + Returns the toolchains stored in the QSettings. + """ + return qvariant_converter.getBoolDict(self.settingsRetrieve("toolchains")) + + def setToolchains(self, toolchains): + """ + Stores the toolchains in the QSettings. + """ + self.settingsStore("toolchains", qvariant_converter.convertBoolDict(toolchains)) + + def defaultFolder(self): + """ + Returns the default save folder stored in the QSettings. + """ + return qvariant_converter.getString(self.settingsRetrieve("folder")) + + def setDefaultFolder(self, folder): + """ + Stores the default save folder in the QSettings. + """ + self.settingsStore("folder", qvariant_converter.convertString(folder)) + + #### + + ## Methodo to be implemented in child classes when needed ## + + def reloadData(self, previous_id=None): + """ + Method called before the page is loaded. The pages that need to use this + method have to implement it. + """ + pass + + def setupUi(self): + """ + Method called automatically during the initialization of the wizard page. + It set up the interface. Pages that need to use this method have to + implement it. + """ + pass + + def connectSignals(self): + """ + Method called automatically during the initialization of the wizard page. + It connects the signals and the slots. The pages that need to use this + method have to implement it. + """ + pass + + #### diff --git a/2.5/wizard/DefineException.py b/2.5/wizard/DefineException.py new file mode 100644 index 00000000..7f4548f8 --- /dev/null +++ b/2.5/wizard/DefineException.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + + +class DefineException(Exception): + """ + Exception raised when an error occurs parsing the module informations. + """ + def __init__(self, path, line_number, line): + self.path = path + self.line_number = line_number + self.line = line + + def __str__(self): + return repr(self.path) + +class ModuleDefineException(DefineException): + """ + Exception raised when an error occurs parsing the module informations. + """ + def __init__(self, path, line_number, line): + super(ModuleDefineException, self).__init__(path, line_number, line) + +class EnumDefineException(DefineException): + """ + Exception raised when an error occurs parsing the enum informations. + """ + def __init__(self, path, line_number, line): + super(EnumDefineException, self).__init__(path, line_number, line) + +class ConfigurationDefineException(DefineException): + """ + Exception raised when an error occurs parsing the configuration parameter informations. + """ + def __init__(self, path, line_number, line): + super(ConfigurationDefineException, self).__init__(path, line_number, line) diff --git a/2.5/wizard/LoadException.py b/2.5/wizard/LoadException.py new file mode 100644 index 00000000..99b30c9f --- /dev/null +++ b/2.5/wizard/LoadException.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id: DefineException.py 2645 2009-04-23 09:28:13Z duplo $ +# +# Author: Lorenzo Berni +# + +class ToolchainException(Exception): + def __init__(self, partial_project): + self.partial_project = partial_project + +class VersionException(Exception): + def __init__(self, partial_project): + self.partial_project = partial_project diff --git a/2.5/wizard/_wizard_version.py b/2.5/wizard/_wizard_version.py new file mode 100644 index 00000000..57b67c8d --- /dev/null +++ b/2.5/wizard/_wizard_version.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2010 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + + +# This variable contains the wizard version. This will be stored into the +# project files to let the Wizard know how to use them. +# Previous versions: +# 0 - the project file doesn't contain the version number. +# When the current Wizard is opening project done with this version of +# the Wizard it has to change the original SOURCES_PATH to the local path +# 1 - SOURCES_PATH used instead of BERTOS_PATH +# 2 - Use the old makefile templates (into /mktemplates/old) and the old logic +# Instead of the new one. +# 3 - Current version. + + +# NOTE: Change this variable may cause the wizard to not work properly. +WIZARD_VERSION = 3 diff --git a/2.5/wizard/bertos.py b/2.5/wizard/bertos.py new file mode 100755 index 00000000..38b7224c --- /dev/null +++ b/2.5/wizard/bertos.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os +import sys +from distutils.dep_util import newer + +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +import exception_handler + +from BProject import BProject + +from BWizard import BWizard + +from BIntroPage import BIntroPage +from BFolderPage import BFolderPage +from BBoardPage import BBoardPage +from BProjectPresets import BProjectPresets +from BOpenPage import BOpenPage +from BVersionPage import BVersionPage +from BCpuPage import BCpuPage +from BToolchainPage import BToolchainPage +from BModulePage import BModulePage +from BCreationPage import BCreationPage +from BFinalPage import BFinalPage + +from BEditingDialog import BEditingDialog, BVersionDialog, BToolchainDialog + +from const import DATA_DIR + +from LoadException import VersionException, ToolchainException + +def newProject(): + QApplication.instance().project = BProject() + page_list = [BIntroPage, BFolderPage, BVersionPage, BBoardPage, BProjectPresets, BCpuPage, BToolchainPage, BModulePage, BCreationPage, BFinalPage] + wizard = BWizard(page_list) + wizard.show() + wizard.exec_() + project = QApplication.instance().project + to_be_opened = project.info("TO_BE_OPENED") + command_lines = project.info("COMMAND_LINES") + relevant_files = project.info("RELEVANT_FILES") + if to_be_opened: + for ide in to_be_opened: + command_line = command_lines[ide] + relevant_file = relevant_files[ide] + QProcess.startDetached(command_line, [relevant_file,]) + sys.exit() + +def editProject(project_file): + info_dict = {} + while(True): + # Empty project is the default fallback. + QApplication.instance().project = BProject() + try: + QApplication.instance().project = BProject(project_file, info_dict) + except VersionException: + QMessageBox.critical( + None, + QObject().tr("BeRTOS version not found!"), + QObject().tr("The selected BeRTOS version was not found, please select another one...") + ) + dialog = BVersionDialog() + if dialog.exec_(): + version = dialog.version_page.currentVersion() + info_dict["BERTOS_PATH"] = version + continue + except ToolchainException, exc: + QMessageBox.critical( + None, + QObject().tr("Toolchain not found!"), + QObject().tr("The selected toolchain was not found, please select another one...") + ) + QApplication.instance().project = exc.partial_project + dialog = BToolchainDialog() + if dialog.exec_(): + toolchain = dialog.toolchain_page.currentToolchain() + info_dict["TOOLCHAIN"] = toolchain + continue + break + dialog = BEditingDialog() + dialog.exec_() + +def main(): + app = QApplication(sys.argv) + app.settings = QSettings("Develer", "Bertos Configurator") + # Development utility lines, to be removed for production + datadir = DATA_DIR + qrc, rcc = os.path.join(datadir, 'bertos.qrc'), os.path.join(datadir, 'bertos.rcc') + if not (hasattr(sys, "frozen") and sys.frozen) and newer(qrc, rcc): + os.system("rcc -binary %s -o %s" %(qrc, rcc)) + QResource.registerResource(rcc) + if len(sys.argv) == 3 and sys.argv[1] == "--edit": + editProject(os.path.abspath(sys.argv[2])) + else: + newProject() + + +if __name__ == '__main__': + main() + diff --git a/2.5/wizard/bertos.qrc b/2.5/wizard/bertos.qrc new file mode 100644 index 00000000..e7376c7f --- /dev/null +++ b/2.5/wizard/bertos.qrc @@ -0,0 +1,18 @@ + + + images/filenew.png + images/fileopen.png + images/listremove.png + images/listadd.png + images/ok.png + images/warning.png + images/error.png + images/folderopen.png + images/appicon.png + images/logo.png + images/default_dir_icon.png + images/default_project_icon.png + images/default_board_image.png + images/default_board_icon.png + + diff --git a/2.5/wizard/bertos_utils.py b/2.5/wizard/bertos_utils.py new file mode 100644 index 00000000..dffa2ab8 --- /dev/null +++ b/2.5/wizard/bertos_utils.py @@ -0,0 +1,666 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os +import fnmatch +import glob +import re +import shutil +# Use custom copytree function +import copytree +import relpath +import pickle + +import const +import plugins +import DefineException + +from _wizard_version import WIZARD_VERSION + +from LoadException import VersionException, ToolchainException + +def _cmp(x, y): + result = cmp(x["info"].get('ord', 0), y["info"].get('ord', 0)) + if result == 0: + result = cmp( + x["info"].get("name", x["info"]["filename"]).lower(), + y["info"].get("name", y["info"]["filename"]).lower() + ) + return result + +def isBertosDir(directory): + return os.path.exists(directory + "/VERSION") + +def bertosVersion(directory): + return open(directory + "/VERSION").readline().strip() + +def enabledModules(project_info): + enabled_modules = [] + for name, module in project_info.info("MODULES").items(): + if module["enabled"]: + enabled_modules.append(name) + return enabled_modules + +def presetList(directory): + """ + Return the list of the preset found in the selected BeRTOS Version. + """ + abspath = os.path.join(directory, const.PREDEFINED_BOARDS_DIR) + preset_list = dict([ + (os.path.join(abspath, preset_dir), presetInfo(os.path.join(abspath, preset_dir))) + for preset_dir in os.listdir(os.path.join(directory, const.PREDEFINED_BOARDS_DIR)) + ]) + return preset_list + +def presetInfo(preset_dir): + """ + Return the preset-relevant info contined into the project_file. + """ + preset_info = pickle.loads(open(os.path.join(preset_dir, "project.bertos"), "r").read()) + try: + description = open(os.path.join(preset_dir, "description"), "r").read() + except IOError: + # No description file found. + description = "" + relevant_info = { + "CPU_NAME": preset_info.get("CPU_NAME"), + "SELECTED_FREQ": preset_info.get("SELECTED_FREQ"), + "WIZARD_VERSION": preset_info.get("WIZARD_VERSION", None), + "PRESET_NAME": preset_info.get("PROJECT_NAME"), + "PRESET_DESCRIPTION": description.decode("utf-8"), + } + return relevant_info + +def mergeSources(srcdir, new_sources, old_sources): + # The current mergeSources function provide only a raw copy of the sources in the + # created project. + # + # TODO: implement the three way merge algorithm + # + shutil.rmtree(srcdir, True) + copytree.copytree(os.path.join(new_sources, "bertos"), srcdir, ignore_list=const.IGNORE_LIST) + +def projectFileGenerator(project_info): + directory = project_info.info("PROJECT_PATH") + project_data = {} + enabled_modules = [] + for module, information in project_info.info("MODULES").items(): + if information["enabled"]: + enabled_modules.append(module) + project_data["ENABLED_MODULES"] = enabled_modules + if project_info.info("PRESET"): + # For presets save again the BERTOS_PATH into project file + project_data["PRESET"] = True + project_data["BERTOS_PATH"] = relpath.relpath(project_info.info("BERTOS_PATH"), directory) + elif project_info.edit: + # If in editing mode the BERTOS_PATH is maintained + project_data["BERTOS_PATH"] = relpath.relpath(project_info.info("BERTOS_PATH"), directory) + else: + # Use the local BeRTOS version instead of the original one + # project_data["BERTOS_PATH"] = project_info.info("BERTOS_PATH") + project_data["BERTOS_PATH"] = "." + project_data["PROJECT_NAME"] = project_info.info("PROJECT_NAME", os.path.basename(directory)) + project_src_relpath = relpath.relpath(project_info.info("PROJECT_SRC_PATH"), directory) + project_data["PROJECT_SRC_PATH"] = project_src_relpath + project_data["TOOLCHAIN"] = project_info.info("TOOLCHAIN") + project_data["CPU_NAME"] = project_info.info("CPU_NAME") + project_data["SELECTED_FREQ"] = project_info.info("SELECTED_FREQ") + project_data["OUTPUT"] = project_info.info("OUTPUT") + project_data["WIZARD_VERSION"] = WIZARD_VERSION + project_data["PRESET"] = project_info.info("PRESET") + project_data["PROJECT_HW_PATH"] = relpath.relpath(project_info.info("PROJECT_HW_PATH"), directory) + return pickle.dumps(project_data) + +def loadPlugin(plugin): + """ + Returns the given plugin module. + """ + return getattr(__import__("plugins", {}, {}, [plugin]), plugin) + +def versionFileGenerator(project_info, version_file): + version = bertosVersion(project_info.info("BERTOS_PATH")) + return version_file.replace('$version', version) + +def userMkGeneratorFromPreset(project_info): + project_name = project_info.info("PROJECT_NAME") + preset_path = project_info.info("PRESET_PATH") + preset_name = project_info.info("PRESET_NAME") + preset_src_dir = project_info.info("PRESET_SRC_PATH") + makefile = open(os.path.join(preset_path, preset_src_dir, "%s_user.mk" %preset_name), 'r').read() + destination = os.path.join(project_info.prjdir, "%s_user.mk" %project_info.info("PROJECT_NAME")) + # Temporary code. + # TODO: write it using regular expressions to secure this function + makefile = makefile.replace(preset_name + "_", project_name + "_") + open(destination, "w").write(makefile) + +def userMkGenerator(project_info): + makefile = open(os.path.join(const.DATA_DIR, "mktemplates/template_user.mk"), "r").read() + destination = os.path.join(project_info.prjdir, os.path.basename(project_info.prjdir) + "_user.mk") + # Deadly performances loss was here :( + mk_data = {} + mk_data["$pname"] = os.path.basename(project_info.info("PROJECT_PATH")) + mk_data["$ppath"] = relpath.relpath(project_info.info("PROJECT_SRC_PATH"), project_info.info("PROJECT_PATH")) + mk_data["$main"] = "/".join(["$(%s_SRC_PATH)" %project_info.info("PROJECT_NAME"), "main.c"]) + for key in mk_data: + makefile = makefile.replace(key, mk_data[key]) + open(destination, "w").write(makefile) + +def mkGenerator(project_info): + """ + Generates the mk file for the current project. + """ + makefile = open(os.path.join(const.DATA_DIR, "mktemplates/template.mk"), "r").read() + destination = os.path.join(project_info.prjdir, os.path.basename(project_info.prjdir) + ".mk") + mk_data = {} + mk_data["$pname"] = project_info.info("PROJECT_NAME") + mk_data["$ppath"] = relpath.relpath(project_info.info("PROJECT_SRC_PATH"), project_info.info("PROJECT_PATH")) + mk_data["$cpuclockfreq"] = project_info.info("SELECTED_FREQ") + cpu_mk_parameters = [] + for key, value in project_info.info("CPU_INFOS").items(): + if key.startswith(const.MK_PARAM_ID): + cpu_mk_parameters.append("%s = %s" %(key.replace("MK", mk_data["$pname"]), value)) + mk_data["$cpuparameters"] = "\n".join(cpu_mk_parameters) + mk_data["$csrc"], mk_data["$pcsrc"], mk_data["$cppasrc"], mk_data["$cxxsrc"], mk_data["$asrc"], mk_data["$constants"] = csrcGenerator(project_info) + mk_data["$prefix"] = replaceSeparators(project_info.info("TOOLCHAIN")["path"].split("gcc")[0]) + mk_data["$suffix"] = replaceSeparators(project_info.info("TOOLCHAIN")["path"].split("gcc")[1]) + mk_data["$hwpath"] = relpath.relpath(project_info.info("PROJECT_HW_PATH"), project_info.info("PROJECT_PATH")) + for key in mk_data: + makefile = makefile.replace(key, mk_data[key]) + open(destination, "w").write(makefile) + +def makefileGenerator(project_info): + """ + Generate the Makefile for the current project. + """ + makefile = open(os.path.join(const.DATA_DIR, "mktemplates/Makefile"), "r").read() + destination = os.path.join(project_info.maindir, "Makefile") + # TODO write a general function that works for both the mk file and the Makefile + mk_data = {} + mk_data["$pname"] = project_info.info("PROJECT_NAME") + mk_data["$ppath"] = relpath.relpath(project_info.info("PROJECT_SRC_PATH"), project_info.info("PROJECT_PATH")) + for key in mk_data: + makefile = makefile.replace(key, mk_data[key]) + open(destination, "w").write(makefile) + +def csrcGenerator(project_info): + modules = project_info.info("MODULES") + files = project_info.info("FILES") + if "harvard" in project_info.info("CPU_INFOS")["CPU_TAGS"]: + harvard = True + else: + harvard = False + # file to be included in CSRC variable + csrc = [] + # file to be included in PCSRC variable + pcsrc = [] + # files to be included in CPPASRC variable + cppasrc = [] + # files to be included in CXXSRC variable + cxxsrc = [] + # files to be included in ASRC variable + asrc = [] + # constants to be included at the beginning of the makefile + constants = {} + for module, information in modules.items(): + module_files = set([]) + dependency_files = set([]) + # assembly sources + asm_files = set([]) + hwdir = os.path.basename(project_info.info("PROJECT_PATH")) + "/hw" + if information["enabled"]: + if "constants" in information: + constants.update(information["constants"]) + cfiles, sfiles = findModuleFiles(module, project_info) + module_files |= set(cfiles) + asm_files |= set(sfiles) + for file in information["hw"]: + if file.endswith(".c"): + module_files |= set([hwdir + "/" + os.path.basename(file)]) + for file_dependency in information["depends"] + tuple(files.keys()): + dependencyCFiles, dependencySFiles = findModuleFiles(file_dependency, project_info) + dependency_files |= set(dependencyCFiles) + asm_files |= set(dependencySFiles) + for file in module_files: + if not harvard or information.get("harvard", "both") == "both": + csrc.append(file) + if harvard and "harvard" in information: + pcsrc.append(file) + for file in dependency_files: + csrc.append(file) + for file in project_info.info("CPU_INFOS")["C_SRC"]: + csrc.append(file) + for file in project_info.info("CPU_INFOS")["PC_SRC"]: + pcsrc.append(file) + for file in asm_files: + cppasrc.append(file) + for file in project_info.info("CPU_INFOS")["CPPA_SRC"]: + cppasrc.append(file) + for file in project_info.info("CPU_INFOS")["CXX_SRC"]: + cxxsrc.append(file) + for file in project_info.info("CPU_INFOS")["ASRC"]: + asrc.append(file) + csrc = set(csrc) + csrc = " \\\n\t".join(csrc) + " \\" + pcsrc = set(pcsrc) + pcsrc = " \\\n\t".join(pcsrc) + " \\" + cppasrc = set(cppasrc) + cppasrc = " \\\n\t".join(cppasrc) + " \\" + cxxsrc = set(cxxsrc) + cxxsrc = " \\\n\t".join(cxxsrc) + " \\" + asrc = set(asrc) + asrc = " \\\n\t".join(asrc) + " \\" + constants = "\n".join([os.path.basename(project_info.info("PROJECT_PATH")) + "_" + key + " = " + unicode(value) for key, value in constants.items()]) + return csrc, pcsrc, cppasrc, cxxsrc, asrc, constants + +def findModuleFiles(module, project_info): + # Find the files related to the selected module + cfiles = [] + sfiles = [] + # .c files related to the module and the cpu architecture + for filename, path in project_info.searchFiles(module + ".c"): + path = path.replace(project_info.info("BERTOS_PATH") + os.sep, "") + path = replaceSeparators(path) + cfiles.append(path + "/" + filename) + # .s files related to the module and the cpu architecture + for filename, path in project_info.searchFiles(module + ".s") + \ + project_info.searchFiles(module + ".S"): + path = path.replace(project_info.info("BERTOS_PATH") + os.sep, "") + path = replaceSeparators(path) + sfiles.append(path + "/" + filename) + # .c and .s files related to the module and the cpu tags + tags = project_info.info("CPU_INFOS")["CPU_TAGS"] + + # Awful, but secure check for version + # TODO: split me in a method/function + try: + version_string = bertosVersion(project_info.info("BERTOS_PATH")) + version_list = [int(i) for i in version_string.split()[1].split('.')] + except ValueError: + # If the version file hasn't a valid version number assume it's an older + # project. + version_list = [0, 0] + if version_list < [2, 5]: + # For older versions of BeRTOS add the toolchain to the tags + tags.append(project_info.info("CPU_INFOS")["TOOLCHAIN"]) + + for tag in tags: + for filename, path in project_info.searchFiles(module + "_" + tag + ".c"): + path = path.replace(project_info.info("BERTOS_PATH") + os.sep, "") + if os.sep != "/": + path = replaceSeparators(path) + cfiles.append(path + "/" + filename) + for filename, path in project_info.searchFiles(module + "_" + tag + ".s") + \ + project_info.searchFiles(module + "_" + tag + ".S"): + path = path.replace(project_info.info("BERTOS_PATH") + os.sep, "") + path = replaceSeparators(path) + sfiles.append(path + "/" + filename) + return cfiles, sfiles + +def replaceSeparators(path): + """ + Replace the separators in the given path with unix standard separator. + """ + if os.sep != "/": + path = path.replace(os.sep, "/") + return path + +def getSystemPath(): + path = os.environ["PATH"] + if os.name == "nt": + path = path.split(";") + else: + path = path.split(":") + return path + +def findToolchains(path_list): + toolchains = [] + for element in path_list: + for toolchain in glob.glob(element+ "/" + const.GCC_NAME): + toolchains.append(toolchain) + return list(set(toolchains)) + +def getToolchainInfo(output): + info = {} + expr = re.compile("Target: .*") + target = expr.findall(output) + if len(target) == 1: + info["target"] = target[0].split("Target: ")[1] + expr = re.compile("gcc version [0-9,.]*") + version = expr.findall(output) + if len(version) == 1: + info["version"] = version[0].split("gcc version ")[1] + expr = re.compile("gcc version [0-9,.]* \(.*\)") + build = expr.findall(output) + if len(build) == 1: + build = build[0].split("gcc version ")[1] + build = build[build.find("(") + 1 : build.find(")")] + info["build"] = build + expr = re.compile("Configured with: .*") + configured = expr.findall(output) + if len(configured) == 1: + info["configured"] = configured[0].split("Configured with: ")[1] + expr = re.compile("Thread model: .*") + thread = expr.findall(output) + if len(thread) == 1: + info["thread"] = thread[0].split("Thread model: ")[1] + return info + +def getToolchainName(toolchain_info): + name = "GCC " + toolchain_info["version"] + " - " + toolchain_info["target"].strip() + return name + +def getTagSet(cpu_info): + tag_set = set([]) + for cpu in cpu_info: + tag_set |= set([cpu["CPU_NAME"]]) + tag_set |= set(cpu["CPU_TAGS"]) + tag_set |= set([cpu["TOOLCHAIN"]]) + return tag_set + + +def getInfos(definition): + D = {} + D.update(const.CPU_DEF) + def include(filename, dict = D, directory=definition[1]): + execfile(directory + "/" + filename, {}, D) + D["include"] = include + include(definition[0], D) + D["CPU_NAME"] = definition[0].split(".")[0] + D["DEFINITION_PATH"] = definition[1] + "/" + definition[0] + del D["include"] + return D + +def getCommentList(string): + comment_list = re.findall(r"/\*{2}\s*([^*]*\*(?:[^/*][^*]*\*+)*)/", string) + comment_list = [re.findall(r"^\s*\* *(.*?)$", comment, re.MULTILINE) for comment in comment_list] + return comment_list + +def loadModuleDefinition(first_comment): + to_be_parsed = False + module_definition = {} + for num, line in enumerate(first_comment): + index = line.find("$WIZ$") + if index != -1: + to_be_parsed = True + try: + exec line[index + len("$WIZ$ "):] in {}, module_definition + except: + raise ParseError(num, line[index:]) + elif line.find("\\brief") != -1: + module_definition["module_description"] = line[line.find("\\brief") + len("\\brief "):] + module_dict = {} + if "module_name" in module_definition: + module_name = module_definition[const.MODULE_DEFINITION["module_name"]] + del module_definition[const.MODULE_DEFINITION["module_name"]] + module_dict[module_name] = {} + if const.MODULE_DEFINITION["module_depends"] in module_definition: + depends = module_definition[const.MODULE_DEFINITION["module_depends"]] + del module_definition[const.MODULE_DEFINITION["module_depends"]] + if type(depends) == str: + depends = (depends,) + module_dict[module_name]["depends"] = depends + else: + module_dict[module_name]["depends"] = () + if const.MODULE_DEFINITION["module_configuration"] in module_definition: + module_dict[module_name]["configuration"] = module_definition[const.MODULE_DEFINITION["module_configuration"]] + del module_definition[const.MODULE_DEFINITION["module_configuration"]] + else: + module_dict[module_name]["configuration"] = "" + if "module_description" in module_definition: + module_dict[module_name]["description"] = module_definition["module_description"] + del module_definition["module_description"] + if const.MODULE_DEFINITION["module_harvard"] in module_definition: + harvard = module_definition[const.MODULE_DEFINITION["module_harvard"]] + module_dict[module_name]["harvard"] = harvard + del module_definition[const.MODULE_DEFINITION["module_harvard"]] + if const.MODULE_DEFINITION["module_hw"] in module_definition: + hw = module_definition[const.MODULE_DEFINITION["module_hw"]] + del module_definition[const.MODULE_DEFINITION["module_hw"]] + if type(hw) == str: + hw = (hw, ) + module_dict[module_name]["hw"] = hw + else: + module_dict[module_name]["hw"] = () + if const.MODULE_DEFINITION["module_supports"] in module_definition: + supports = module_definition[const.MODULE_DEFINITION["module_supports"]] + del module_definition[const.MODULE_DEFINITION["module_supports"]] + module_dict[module_name]["supports"] = supports + module_dict[module_name]["constants"] = module_definition + module_dict[module_name]["enabled"] = False + return to_be_parsed, module_dict + +def isSupported(project, module=None, property_id=None): + if not module and property_id: + item = project.info("CONFIGURATIONS")[property_id[0]][property_id[1]]["informations"] + else: + item = project.info("MODULES")[module] + tag_dict = project.info("ALL_CPU_TAGS") + if "supports" in item: + support_string = item["supports"] + supported = {} + try: + exec "supported = " + support_string in tag_dict, supported + except: + raise SupportedException(support_string) + return supported["supported"] + else: + return True + +def loadDefineLists(comment_list): + define_list = {} + for comment in comment_list: + for num, line in enumerate(comment): + index = line.find("$WIZ$") + if index != -1: + try: + exec line[index + len("$WIZ$ "):] in {}, define_list + except: + raise ParseError(num, line[index:]) + for key, value in define_list.items(): + if type(value) == str: + define_list[key] = (value,) + return define_list + +def getDescriptionInformations(comment): + """ + Take the doxygen comment and strip the wizard informations, returning the tuple + (comment, wizard_information) + """ + brief = "" + description = "" + information = {} + for num, line in enumerate(comment): + index = line.find("$WIZ$") + if index != -1: + if len(brief) == 0: + brief += line[:index].strip() + else: + description += " " + line[:index] + try: + exec line[index + len("$WIZ$ "):] in {}, information + except: + raise ParseError(num, line[index:]) + else: + if len(brief) == 0: + brief += line.strip() + else: + description += " " + line + description = description.strip() + return brief.strip(), description.strip(), information + +def getDefinitionBlocks(text): + """ + Take a text and return a list of tuple (description, name-value). + """ + block = [] + block_tmp = re.finditer(r"/\*{2}\s*([^*]*\*(?:[^/*][^*]*\*+)*)/\s*#define\s+((?:[^/]*?/?)+)\s*?(?:/{2,3}[^<].*?)?$", text, re.MULTILINE) + for match in block_tmp: + # Only the first element is needed + comment = match.group(1) + define = match.group(2) + start = match.start() + block.append(([re.findall(r"^\s*\* *(.*?)$", line, re.MULTILINE)[0] for line in comment.splitlines()], define, start)) + for match in re.finditer(r"/{3}\s*([^<].*?)\s*#define\s+((?:[^/]*?/?)+)\s*?(?:/{2,3}[^<].*?)?$", text, re.MULTILINE): + comment = match.group(1) + define = match.group(2) + start = match.start() + block.append(([comment], define, start)) + for match in re.finditer(r"#define\s*(.*?)\s*/{3}<\s*(.+?)\s*?(?:/{2,3}[^<].*?)?$", text, re.MULTILINE): + comment = match.group(2) + define = match.group(1) + start = match.start() + block.append(([comment], define, start)) + return block + +def formatParamNameValue(text): + """ + Take the given string and return a tuple with the name of the parameter in the first position + and the value in the second. + """ + block = re.findall("\s*([^\s]+)\s*(.+?)\s*$", text, re.MULTILINE) + return block[0] + +def loadConfigurationInfos(path): + """ + Return the module configurations found in the given file as a dict with the + parameter name as key and a dict containig the fields above as value: + "value": the value of the parameter + "description": the description of the parameter + "informations": a dict containig optional informations: + "type": "int" | "boolean" | "enum" + "min": the minimum value for integer parameters + "max": the maximum value for integer parameters + "long": boolean indicating if the num is a long + "unsigned": boolean indicating if the num is an unsigned + "value_list": the name of the enum for enum parameters + "conditional_deps": the list of conditional dependencies for boolean parameters + """ + configuration_infos = {} + configuration_infos["paramlist"] = [] + for comment, define, start in getDefinitionBlocks(open(path, "r").read()): + name, value = formatParamNameValue(define) + brief, description, informations = getDescriptionInformations(comment) + configuration_infos["paramlist"].append((start, name)) + configuration_infos[name] = {} + configuration_infos[name]["value"] = value + configuration_infos[name]["informations"] = informations + if not "type" in configuration_infos[name]["informations"]: + configuration_infos[name]["informations"]["type"] = findParameterType(configuration_infos[name]) + if ("type" in configuration_infos[name]["informations"] and + configuration_infos[name]["informations"]["type"] == "int" and + configuration_infos[name]["value"].find("L") != -1): + configuration_infos[name]["informations"]["long"] = True + configuration_infos[name]["value"] = configuration_infos[name]["value"].replace("L", "") + if ("type" in configuration_infos[name]["informations"] and + configuration_infos[name]["informations"]["type"] == "int" and + configuration_infos[name]["value"].find("U") != -1): + configuration_infos[name]["informations"]["unsigned"] = True + configuration_infos[name]["value"] = configuration_infos[name]["value"].replace("U", "") + if "conditional_deps" in configuration_infos[name]["informations"]: + if (type(configuration_infos[name]["informations"]["conditional_deps"]) == str or + type(configuration_infos[name]["informations"]["conditional_deps"]) == unicode): + configuration_infos[name]["informations"]["conditional_deps"] = (configuration_infos[name]["informations"]["conditional_deps"], ) + elif type(configuration_infos[name]["informations"]["conditional_deps"]) == tuple: + pass + else: + configuration_infos[name]["informations"]["conditional_deps"] = () + configuration_infos[name]["description"] = description + configuration_infos[name]["brief"] = brief + return configuration_infos + +def updateConfigurationValues(def_conf, user_conf): + for param in def_conf["paramlist"]: + if param[1] in user_conf and "value" in user_conf[param[1]]: + def_conf[param[1]]["value"] = user_conf[param[1]]["value"] + return def_conf + +def findParameterType(parameter): + if "value_list" in parameter["informations"]: + return "enum" + if "min" in parameter["informations"] or "max" in parameter["informations"] or re.match(r"^\d+U?L?$", parameter["value"]) != None: + return "int" + +def sub(string, parameter, value): + """ + Substitute the given value at the given parameter define in the given string + """ + return re.sub(r"(?P#define\s+" + parameter + r"\s+)([^\s]+)", r"\g" + value, string) + +def isInt(informations): + """ + Return True if the value is a simple int. + """ + if ("long" not in informatios or not informations["long"]) and ("unsigned" not in informations or informations["unsigned"]): + return True + else: + return False + +def isLong(informations): + """ + Return True if the value is a long. + """ + if "long" in informations and informations["long"] and "unsigned" not in informations: + return True + else: + return False + +def isUnsigned(informations): + """ + Return True if the value is an unsigned. + """ + if "unsigned" in informations and informations["unsigned"] and "long" not in informations: + return True + else: + return False + +def isUnsignedLong(informations): + """ + Return True if the value is an unsigned long. + """ + if "unsigned" in informations and "long" in informations and informations["unsigned"] and informations["long"]: + return True + else: + return False + +class ParseError(Exception): + def __init__(self, line_number, line): + Exception.__init__(self) + self.line_number = line_number + self.line = line + +class SupportedException(Exception): + def __init__(self, support_string): + Exception.__init__(self) + self.support_string = support_string diff --git a/2.5/wizard/build_resources.sh b/2.5/wizard/build_resources.sh new file mode 100755 index 00000000..e988a1f8 --- /dev/null +++ b/2.5/wizard/build_resources.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env sh +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id:$ +# +# Author: Lorenzo Berni +# + +rcc -binary bertos.qrc -o bertos.rcc diff --git a/2.5/wizard/cltemplates/bertos.project b/2.5/wizard/cltemplates/bertos.project new file mode 100644 index 00000000..ae430531 --- /dev/null +++ b/2.5/wizard/cltemplates/bertos.project @@ -0,0 +1,66 @@ + + +$filelist + + + + + + + + + + + +source $initscript + + +shell sleep 2 + + + + + + + make clean + make + + + + None + $(WorkspacePath) + + + + + + + + + + + + + + + + + + + + + make clean + make + + + + None + $(WorkspacePath) + + + + + + + + diff --git a/2.5/wizard/cltemplates/bertos.workspace b/2.5/wizard/cltemplates/bertos.workspace new file mode 100644 index 00000000..4b9d7957 --- /dev/null +++ b/2.5/wizard/cltemplates/bertos.workspace @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/2.5/wizard/compatibility.py b/2.5/wizard/compatibility.py new file mode 100644 index 00000000..bf05c093 --- /dev/null +++ b/2.5/wizard/compatibility.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of slimqc. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2010 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import const +import os +from bertos_utils import replaceSeparators, csrcGenerator + +def _userMkGenerator(project_info): + makefile = open(os.path.join(const.DATA_DIR, "mktemplates/old/template.mk"), "r").read() + destination = os.path.join(project_info.prjdir, os.path.basename(project_info.prjdir) + ".mk") + # Deadly performances loss was here :( + mk_data = {} + mk_data["$pname"] = os.path.basename(project_info.info("PROJECT_PATH")) + mk_data["$main"] = os.path.basename(project_info.info("PROJECT_PATH")) + "/main.c" + for key in mk_data: + makefile = makefile.replace(key, mk_data[key]) + open(destination, "w").write(makefile) + +def _mkGenerator(project_info): + """ + Generates the mk file for the current project. + """ + makefile = open(os.path.join(const.DATA_DIR, "mktemplates/old/template_wiz.mk"), "r").read() + destination = os.path.join(project_info.prjdir, os.path.basename(project_info.prjdir) + "_wiz.mk") + mk_data = {} + mk_data["$pname"] = project_info.info("PROJECT_NAME") + mk_data["$cpuclockfreq"] = project_info.info("SELECTED_FREQ") + cpu_mk_parameters = [] + for key, value in project_info.info("CPU_INFOS").items(): + if key.startswith(const.MK_PARAM_ID): + cpu_mk_parameters.append("%s = %s" %(key.replace("MK", mk_data["$pname"]), value)) + mk_data["$cpuparameters"] = "\n".join(cpu_mk_parameters) + mk_data["$csrc"], mk_data["$pcsrc"], mk_data["$cppasrc"], mk_data["$cxxsrc"], mk_data["$asrc"], mk_data["$constants"] = csrcGenerator(project_info) + mk_data["$prefix"] = replaceSeparators(project_info.info("TOOLCHAIN")["path"].split("gcc")[0]) + mk_data["$suffix"] = replaceSeparators(project_info.info("TOOLCHAIN")["path"].split("gcc")[1]) + mk_data["$main"] = os.path.basename(project_info.info("PROJECT_PATH")) + "/main.c" + for key in mk_data: + makefile = makefile.replace(key, mk_data[key]) + open(destination, "w").write(makefile) + +def _makefileGenerator(project_info): + """ + Generate the Makefile for the current project. + """ + makefile = open(os.path.join(const.DATA_DIR, "mktemplates/old/Makefile"), "r").read() + destination = os.path.join(project_info.maindir, "Makefile") + # TODO write a general function that works for both the mk file and the Makefile + makefile = makefile.replace("$pname", project_info.info("PROJECT_NAME")) + open(destination, "w").write(makefile) + +def updateProject(project_data): + """ + Update incrementally the project_data loaded from a BeRTOS Wizard project + file. + """ + wizard_version = project_data.get("WIZARD_VERSION", 0) + if wizard_version < 1: + # Ignore the BERTOS_PATH inside the project file for older project + project_data["SOURCES_PATH"] = project_dir + if wizard_version < 2: + # Use SOURCES_PATH instead of BERTOS_PATH for backward compatibility + project_data["BERTOS_PATH"] = project_data["SOURCES_PATH"] + if wizard_version < 3: + # Use older makefile templates and generators using monkey patching + import bertos_utils + bertos_utils.mkGenerator = _mkGenerator + bertos_utils.userMkGenerator = _userMkGenerator + bertos_utils.makefileGenerator = _makefileGenerator + return project_data + diff --git a/2.5/wizard/const.py b/2.5/wizard/const.py new file mode 100644 index 00000000..863f45da --- /dev/null +++ b/2.5/wizard/const.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os, sys + +_tmp = sys.argv[0] +if os.path.islink(_tmp): + _tmp = os.readlink(_tmp) +DATA_DIR = os.path.dirname(os.path.abspath(_tmp)) +del _tmp + +PREDEFINED_BOARDS_DIR = 'boards' +PREDEFINED_BOARD_SPEC_FILE = '.spec' +PREDEFINED_BOARD_ICON_FILE = '.icon.png' +PREDEFINED_BOARD_IMAGE_FILE = '.image.png' + +# Predefined icons in resouces +PREDEFINED_BOARD_DEFAULT_DIR_ICON = ':images/default_dir_icon.png' +PREDEFINED_BOARD_DEFAULT_PROJECT_ICON = ':images/default_project_icon.png' +PREDEFINED_BOARD_DEFAULT_ICON = ':images/default_board_icon.png' +PREDEFINED_BOARD_DEFAULT_IMAGE = ':images/default_board_image.png' +# PREDEFINED_BOARD_SPEC_INFO = { +# 'name': , +# 'description': , +# } + +CPU_DEF = { + "CPU_NAME": "", + "CPU_DIR": "", + "DEFINITION_PATH": "", + "TOOLCHAIN": "", + "CPU_TAGS": [], + "CPPA_SRC" : [], + "CXX_SRC": [], + "ASRC": [], + "C_SRC": [], + "PC_SRC" : [], + "CPU_DESC" : [], + "CPU_DEFAULT_FREQ": "1000000", + "GDB_INIT_SCRIPT": "", +} + +TOOLCHAIN_ITEMS = ("ld", "as") + +CPU_DEFINITION = "*.cdef" + +GCC_NAME = "*gcc*" + +MODULE_CONFIGURATION = "cfg_*.h" + +UI_LOCATION = "ui" + +EXTENSION_FILTER = ( + ".c", + ".cpp", + ".cxx", + ".h", + ".c++", + ".ld", + ".S", + ".mk", + "Makefile", +) + +IGNORE_LIST = ( + ".svn", + "CVS", + ".git", +) + +MODULE_DEFINITION = { + "module_name": "module_name", + "module_configuration": "module_configuration", + "module_depends": "module_depends", + "module_harvard": "module_harvard", + "module_hw": "module_hw", + "module_supports": "module_supports", +} + +MK_PARAM_ID = "MK_" diff --git a/2.5/wizard/copytree.py b/2.5/wizard/copytree.py new file mode 100644 index 00000000..7ca8b7ea --- /dev/null +++ b/2.5/wizard/copytree.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os +import sys +import fnmatch +from shutil import * + +del copytree + +def copytree(src, dst, symlinks=False, ignore_list=[]): + """ + Reimplementation of the shutil.copytree function that use ignore_list. + ignore_list is a list containing patterns to ignore during the copy. + """ + names = os.listdir(src) + os.makedirs(dst) + errors = [] + for name in names: + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + ignored = False + for ignore in ignore_list: + if fnmatch.fnmatch(name, ignore): + ignored = True + break + if ignored: + continue + if symlinks and os.path.islink(srcname): + linkto = os.readlink(srcname) + os.symlink(linkto, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore_list) + else: + copy2(srcname, dstname) + # XXX What about devices, sockets etc.? + except (IOError, os.error), why: + errors.append((srcname, dstname, str(why))) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error, err: + errors.extend(err.args[0]) + try: + copystat(src, dst) + except WindowsError: + # can't copy file access times on Windows + pass + except OSError, why: + errors.extend((src, dst, str(why))) + if errors: + raise Error, errors diff --git a/2.5/wizard/create_preset.py b/2.5/wizard/create_preset.py new file mode 100755 index 00000000..8cdd662b --- /dev/null +++ b/2.5/wizard/create_preset.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of slimqc. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2010 Develer S.r.l. (http://www.develer.com/) +# +# Author: Francesco Sacchi +# + +import pickle +import sys +import os +import shutil +import pprint +import glob +import re + +def remove(path): + if os.path.isdir(path): + shutil.rmtree(path, ignore_errors=True) + else: + try: + os.remove(path) + except OSError: + pass + +def findPath(start, target): + pa = start + while pa != "/": + pa = os.path.abspath(pa + "/..") + if os.path.exists(pa + "/" + target): + return os.path.relpath(pa, start) + +if len(sys.argv) < 3: + print "Usage: %s " % sys.argv[0] + exit(0) + +prj_dir = sys.argv[1] +preset_dir = sys.argv[2] + +if not os.path.exists(prj_dir + "/project.bertos"): + print "%s does not seem a Wizard created project." % prj_dir + exit(1) + +p = open(prj_dir + "/project.bertos") +s = pickle.load(p) +if s["WIZARD_VERSION"] < 3: + print "Project version too old." + exit(1) +pname = s["PROJECT_NAME"] +preset_dir += pname + +#find hw/ path for the board +hw_path = findPath(preset_dir, "hw") +if not hw_path: + print "hw/ path not found in parent directories of %s" % preset_dir + exit(1) + +#find bertos/ path +bertos_path = findPath(preset_dir, "bertos") +if not bertos_path: + print "bertos/ path not found in parent directories of %s" % preset_dir + exit(1) + +#Copy the project and remove unneeded files. +shutil.copytree(prj_dir, preset_dir) +remove(preset_dir + "/bertos") +remove(preset_dir + "/images") +remove(preset_dir + "/obj") +remove(preset_dir + "/Makefile") +remove(preset_dir + "/buildrev.h") +remove(preset_dir + "/VERSION") +remove(preset_dir + "/" + pname + ".project") +remove(preset_dir + "/" + pname + ".workspace") + +#Flatten project sources. +#A wizard created project called pname +#usually has the following structure: +# +#pname +# | +# +- +# | +# +-bertos +# | +# +-pname +# | +# + +# +#This has been done in order to have the chance to +#add multiple projects sharing the same bertos version. +#After the copy and after removing the bertos tree inside the +#project, the double pname directory is redundant, so we move +#all pname sources into the parent directory +l = glob.glob(preset_dir + "/" + pname + "/*") +for f in l: + shutil.move(f, preset_dir) + +#Remove the now empty project src dir and the hw/ dir. +#hw files are located in parent directories and are common +#for all projects on the same board. +remove(preset_dir + "/" + pname) +remove(preset_dir + "/hw") + +assert(os.path.exists(preset_dir + "/" + hw_path + "/hw")) +assert(os.path.exists(preset_dir + "/" + bertos_path + "/bertos")) + +#Update wizard project info. +#A preset is still a Wizard-editable project +#but has its bertos/ and hw/ dirs shared with +#others. +s["BERTOS_PATH"] = bertos_path +s["PROJECT_HW_PATH"] = hw_path +s["PROJECT_SRC_PATH"] = "." +s["PRESET"] = True +pprint.pprint(s) +p = open(preset_dir + "/project.bertos", "w") +pickle.dump(s, p) + +#Create a .spec file in order to make this preset visible in the Wizard +open(preset_dir + "/.spec", "w").write("name = '%s preset'" % pname) + +bertos_path = os.path.abspath(preset_dir + "/" + bertos_path) +hw_path = os.path.abspath(preset_dir + "/" + hw_path) + +src_path = os.path.relpath(preset_dir, bertos_path) +hw_path = os.path.relpath(hw_path, bertos_path) + +#Update project makefiles adapting them to the new directory layout +mk = open(preset_dir + "/" + pname + ".mk").read() +mk = re.sub(r"(%s_SRC_PATH\s*=\s*).*" % pname, r"\1%s" % src_path, mk) +mk = re.sub(r"(%s_HW_PATH\s*=\s*).*" % pname, r"\1%s" % hw_path, mk) + +#remove absolute path from toolchain +mk = re.sub(r'(%s_PREFIX\s*=\s*").*?([^/]*")' % pname, r'\1\2', mk) +open(preset_dir + "/" + pname + ".mk", "w").write(mk) diff --git a/2.5/wizard/exception_handler.py b/2.5/wizard/exception_handler.py new file mode 100644 index 00000000..9e54fa69 --- /dev/null +++ b/2.5/wizard/exception_handler.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id: const.py 2907 2009-09-08 14:02:04Z duplo $ +# +# Author: Lorenzo Berni +# + +import sys +import os +import traceback + +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +def _excepthook(exc_type, exc_value, exc_traceback): + project_dir = QApplication.instance().project.info("PROJECT_PATH") + if not project_dir: + project_dir = os.getcwd() + file_name = os.path.join(project_dir, "wizard_error.log") + if os.path.exists(file_name): + content = open(file_name, "r").read() + else: + content = "" + if not os.path.exists(os.path.dirname(file_name)): + os.makedirs(os.path.dirname(file_name)) + f = open(file_name, "w") + message = "\n".join(traceback.format_exception(exc_type, exc_value, exc_traceback)) + f.write(message) + f.write(">"*80 + "\n") + f.write(content) + f.close() + print>>sys.stderr, message + QMessageBox.critical( + None, + "Exception occurred", + "An exception is occurred. Please attach the '%s' file to the support request." %os.path.abspath(file_name), + ) + QApplication.instance().quit() + +sys.excepthook = _excepthook + diff --git a/2.5/wizard/images/appicon.png b/2.5/wizard/images/appicon.png new file mode 100755 index 0000000000000000000000000000000000000000..eaeed5e8ac245133af447dcea745aa6a02f38478 GIT binary patch literal 908 zcmV;719SX|P)_Fye2+Od&)qj`rk&k6FLUbC&bxD)Ip2HFIrrRYEzk2*n9V8)C<*w_1=u;ybgRAa z@4(w~PYv(1!YSaB<*C7*72X{n0Uz);E=z=+ljA)-ix)s)^V%0a`dMrUQMGaITYs%I zIjwWR9M|(j<$$g>{*{jN%E!I#{I7^p95t0>n19dv#On*rjh`6|L7<^6vO%4Phz8V z@(z$KL)f&@3piia-_GaPO8hy*nn(k^fb(To`RBE>=f~ju&`1%AQ+~ZrW+(Ph{By#d z!phgf`DQqO2;<}A3ZPO+)k&!|oZkuOlM7BfS`X)2;d~XwSM%;viEZYPu*xWv+u;0B z-xT_=b6^AbT4-m3%BY>s2L#ml7Z|?dUl862`lf08EF^@2OXU?%$D#AxH?iE zAWNP92#$e!#`HPhB$y~hKo52P8Q2KUgAN^WpdKW^SP=sLQRg3n&ETdnUITW3VMP~^ zgHbpg1kJv&fnW{iOO12^U7!Wb14-k(>AXWx$pW->f=2FG{k9lf0#ge0-F6=qhzFnn zob@GkIamk|fC}jX$XUufX9a%^-gEF zfD^lp@7UGZuBTE2kUarw+2IafE53v-gJ6_&0s3Y~m!I1KCw61t zB}>V(_bT(_8Rf@ZUSx-VC=kB`WIs6<7V+JItQ|}a%MNJ!#$iJ(_X-vfDgnB8S_;zH iCY1iwpxE|HfB^sk$}Ku{jq!s30000z2x literal 0 HcmV?d00001 diff --git a/2.5/wizard/images/default_board_icon.png b/2.5/wizard/images/default_board_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..6f4cd0619b61d65a75cb728f4b1d8f2103baef73 GIT binary patch literal 18806 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 literal 0 HcmV?d00001 diff --git a/2.5/wizard/images/error.png b/2.5/wizard/images/error.png new file mode 100755 index 0000000000000000000000000000000000000000..6e0ea6e382a9d8d257f02e1ad608aa1a8e87e764 GIT binary patch literal 9176 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 X4|BP=TKLek00000NkvXXu0mjf@jqNA literal 0 HcmV?d00001 diff --git a/2.5/wizard/images/fileopen.png b/2.5/wizard/images/fileopen.png new file mode 100755 index 0000000000000000000000000000000000000000..cb852e22b75961796b091376b94f0812f2efced3 GIT binary patch literal 5956 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

    ;5J2TX4;U{XA# zph3y;i=Gw}$w?D+UyN4d!eiv4rPBzL%AZ{i;t`{htROkGg-KAf*w0WmD#(Ugo@5JZ zB_tE-&VOgM`$8b_*jC<=8IigMXqciTI>(YFyt4x3C5n?TJ}E6l5`GER5;Jq>@L_>R z)#?wNZUifnz1m<#7>DWF zM+{|j?dl|yfw9~HX6yzD#saUR^6$(eSz-&sr6a{#*5g?WHcl=Rop>!mhcU^Ng^k8! z9P#j(*PT2&VfO~?Tg_#U-Or2bwGG=1OJ%o>n@HO^YO4nZk@1L?A_Zy085M_2Ob5Gw zyJt)K47;$HBq=K_Um<2uC#kFCHZ9G)Dmp(U=n~U;+`9M{hY^QBc50$R@9(w-smq|< z8H34oVbgP&4ci*QpItk?U1!~3m5|0_!ZRWs1nnOkM9sA3@YKtG88COw9Ms#c?BF?O YCbN@yd;2}-Pd);`K*xkoq2(0wFJOtm=Kufz literal 0 HcmV?d00001 diff --git a/2.5/wizard/images/listadd.png b/2.5/wizard/images/listadd.png new file mode 100755 index 0000000000000000000000000000000000000000..ca0217aacf988188d78209eb45f2abff507cfd31 GIT binary patch literal 11073 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 Hu0mjfaG#qo literal 0 HcmV?d00001 diff --git a/2.5/wizard/images/listremove.png b/2.5/wizard/images/listremove.png new file mode 100755 index 0000000000000000000000000000000000000000..25e08a594072c06b8a200bf5e2e7d6046e7fe152 GIT binary patch literal 5301 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 +# + +# Set to 1 for verbose build output, 0 for terse output +V := 0 + +default: all + +include bertos/config.mk + +include $ppath/$pname.mk + +include bertos/rules.mk diff --git a/2.5/wizard/mktemplates/old/Makefile b/2.5/wizard/mktemplates/old/Makefile new file mode 100644 index 00000000..d266fc9f --- /dev/null +++ b/2.5/wizard/mktemplates/old/Makefile @@ -0,0 +1,17 @@ +# +# Copyright 2009 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Author: Lorenzo Berni +# + +# Set to 1 for verbose build output, 0 for terse output +V := 0 + +default: all + +include bertos/config.mk + +include $pname/$pname.mk + +include bertos/rules.mk diff --git a/2.5/wizard/mktemplates/old/template.mk b/2.5/wizard/mktemplates/old/template.mk new file mode 100644 index 00000000..4e1b8440 --- /dev/null +++ b/2.5/wizard/mktemplates/old/template.mk @@ -0,0 +1,51 @@ +# +# Copyright 2009 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Makefile template for BeRTOS wizard. +# +# Author: Lorenzo Berni +# +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +$pname_PROGRAMMER_TYPE = none +$pname_PROGRAMMER_PORT = none + +# Files included by the user. +$pname_USER_CSRC = \ + $main \ + # + +# Files included by the user. +$pname_USER_PCSRC = \ + # + +# Files included by the user. +$pname_USER_CPPASRC = \ + # + +# Files included by the user. +$pname_USER_CXXSRC = \ + # + +# Files included by the user. +$pname_USER_ASRC = \ + # + +# Flags included by the user. +$pname_USER_LDFLAGS = \ + # + +# Flags included by the user. +$pname_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +$pname_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # + +# Include the mk file generated by the wizard +include $pname/$pname_wiz.mk diff --git a/2.5/wizard/mktemplates/old/template_wiz.mk b/2.5/wizard/mktemplates/old/template_wiz.mk new file mode 100644 index 00000000..8edc07c5 --- /dev/null +++ b/2.5/wizard/mktemplates/old/template_wiz.mk @@ -0,0 +1,71 @@ +# +# Copyright 2009 Develer S.r.l. (http://www.develer.com/) +# All rights reserved. +# +# Makefile template for BeRTOS wizard. +# +# Author: Lorenzo Berni +# +# + +# Constants automatically defined by the selected modules +$constants + +# Our target application +TRG += $pname + +$pname_PREFIX = "$prefix" + +$pname_SUFFIX = "$suffix" + +# Files automatically generated by the wizard. DO NOT EDIT, USE $pname_USER_CSRC INSTEAD! +$pname_WIZARD_CSRC = \ + $csrc + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE $pname_USER_PCSRC INSTEAD! +$pname_WIZARD_PCSRC = \ + $pcsrc + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE $pname_USER_CPPASRC INSTEAD! +$pname_WIZARD_CPPASRC = \ + $cppasrc + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE $pname_USER_CXXSRC INSTEAD! +$pname_WIZARD_CXXSRC = \ + $cxxsrc + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE $pname_USER_ASRC INSTEAD! +$pname_WIZARD_ASRC = \ + $asrc + # + +$pname_CPPFLAGS = -D'CPU_FREQ=($cpuclockfreqUL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$pname/ $($pname_CPU_CPPFLAGS) $($pname_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_LDFLAGS = $($pname_CPU_LDFLAGS) $($pname_WIZARD_LDFLAGS) $($pname_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_CPPAFLAGS = $($pname_CPU_CPPAFLAGS) $($pname_WIZARD_CPPAFLAGS) $($pname_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_CSRC = $($pname_CPU_CSRC) $($pname_WIZARD_CSRC) $($pname_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_PCSRC = $($pname_CPU_PCSRC) $($pname_WIZARD_PCSRC) $($pname_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_CPPASRC = $($pname_CPU_CPPASRC) $($pname_WIZARD_CPPASRC) $($pname_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_CXXSRC = $($pname_CPU_CXXSRC) $($pname_WIZARD_CXXSRC) $($pname_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_ASRC = $($pname_CPU_ASRC) $($pname_WIZARD_ASRC) $($pname_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$cpuparameters diff --git a/2.5/wizard/mktemplates/template.mk b/2.5/wizard/mktemplates/template.mk new file mode 100644 index 00000000..ef9d934d --- /dev/null +++ b/2.5/wizard/mktemplates/template.mk @@ -0,0 +1,72 @@ +# +# Wizard autogenerated makefile. +# DO NOT EDIT, use the $pname_user.mk file instead. +# + +# Constants automatically defined by the selected modules +$constants + +# Our target application +TRG += $pname + +$pname_PREFIX = "$prefix" + +$pname_SUFFIX = "$suffix" + +$pname_SRC_PATH = $ppath + +$pname_HW_PATH = $hwpath + +# Files automatically generated by the wizard. DO NOT EDIT, USE $pname_USER_CSRC INSTEAD! +$pname_WIZARD_CSRC = \ + $csrc + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE $pname_USER_PCSRC INSTEAD! +$pname_WIZARD_PCSRC = \ + $pcsrc + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE $pname_USER_CPPASRC INSTEAD! +$pname_WIZARD_CPPASRC = \ + $cppasrc + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE $pname_USER_CXXSRC INSTEAD! +$pname_WIZARD_CXXSRC = \ + $cxxsrc + # + +# Files automatically generated by the wizard. DO NOT EDIT, USE $pname_USER_ASRC INSTEAD! +$pname_WIZARD_ASRC = \ + $asrc + # + +$pname_CPPFLAGS = -D'CPU_FREQ=($cpuclockfreqUL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -I$($pname_HW_PATH) -I$($pname_SRC_PATH) $($pname_CPU_CPPFLAGS) $($pname_USER_CPPFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_LDFLAGS = $($pname_CPU_LDFLAGS) $($pname_WIZARD_LDFLAGS) $($pname_USER_LDFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_CPPAFLAGS = $($pname_CPU_CPPAFLAGS) $($pname_WIZARD_CPPAFLAGS) $($pname_USER_CPPAFLAGS) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_CSRC = $($pname_CPU_CSRC) $($pname_WIZARD_CSRC) $($pname_USER_CSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_PCSRC = $($pname_CPU_PCSRC) $($pname_WIZARD_PCSRC) $($pname_USER_PCSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_CPPASRC = $($pname_CPU_CPPASRC) $($pname_WIZARD_CPPASRC) $($pname_USER_CPPASRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_CXXSRC = $($pname_CPU_CXXSRC) $($pname_WIZARD_CXXSRC) $($pname_USER_CXXSRC) + +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$pname_ASRC = $($pname_CPU_ASRC) $($pname_WIZARD_ASRC) $($pname_USER_ASRC) + +# CPU specific flags and options, defined in the CPU definition files. +# Automatically generated by the wizard. PLEASE DO NOT EDIT! +$cpuparameters + +include $($pname_SRC_PATH)/$pname_user.mk diff --git a/2.5/wizard/mktemplates/template_user.mk b/2.5/wizard/mktemplates/template_user.mk new file mode 100644 index 00000000..d0a87242 --- /dev/null +++ b/2.5/wizard/mktemplates/template_user.mk @@ -0,0 +1,43 @@ +# +# User makefile. +# Edit this file to change compiler options and related stuff. +# + +# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help +$pname_PROGRAMMER_TYPE = none +$pname_PROGRAMMER_PORT = none + +# Files included by the user. +$pname_USER_CSRC = \ + $main \ + # + +# Files included by the user. +$pname_USER_PCSRC = \ + # + +# Files included by the user. +$pname_USER_CPPASRC = \ + # + +# Files included by the user. +$pname_USER_CXXSRC = \ + # + +# Files included by the user. +$pname_USER_ASRC = \ + # + +# Flags included by the user. +$pname_USER_LDFLAGS = \ + # + +# Flags included by the user. +$pname_USER_CPPAFLAGS = \ + # + +# Flags included by the user. +$pname_USER_CPPFLAGS = \ + -fno-strict-aliasing \ + -fwrapv \ + # diff --git a/2.5/wizard/plugins/__init__.py b/2.5/wizard/plugins/__init__.py new file mode 100644 index 00000000..7a95eaf4 --- /dev/null +++ b/2.5/wizard/plugins/__init__.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# +import codelite + +__all__ = ["codelite"] + +plugin_list = ["codelite"] diff --git a/2.5/wizard/plugins/codelite.py b/2.5/wizard/plugins/codelite.py new file mode 100644 index 00000000..16388233 --- /dev/null +++ b/2.5/wizard/plugins/codelite.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os + +import const + +## Plugin interface ## + +PLUGIN_NAME = "CodeLite" + +PLUGIN_DESCRIPTION = "Create CodeLite project files" + +def createProject(project_info): + """ + Function that creates codelite projects and return the project relevant file. + """ + directory = project_info.info("PROJECT_PATH") + prjdir = directory + os.sep + os.path.basename(directory) + workspace = codeliteWorkspaceGenerator(project_info) + open(directory + os.sep + os.path.basename(prjdir) + ".workspace", "w").write(workspace) + project = codeliteProjectGenerator(project_info) + open(directory + os.sep + os.path.basename(prjdir) + ".project", "w").write(project) + return directory + os.sep + os.path.basename(prjdir) + ".workspace" + +#### + +def clFiles(file_dict, directory): + """ + Creates the list of the lines for the files founded in file_dict, using + directory as the base folder. + """ + filelist = [] + # Do not create an empty VDir. + # TODO: this is *really* ugly, but an empty VDir is worse + if directory: + filelist.append("" %os.path.basename(directory)) + for f in file_dict[directory]["files"]: + filelist.append("" %os.path.join(directory, f)) + for d in file_dict[directory]["dirs"]: + filelist += clFiles(file_dict, os.path.join(directory, d)) + if directory: + filelist.append("") + return filelist + +def findSources(path): + """ + Analyzes the directory tree from path and return a dict with filename and + path. + """ + if not path.endswith(os.sep): + path += os.sep + file_dict = {} + for root, dirs, files in os.walk(path): + if root.find("svn") == -1: + file_dict[root.replace(path, "")] = {"dirs": [], "files": []} + for dir in dirs: + # TODO: place the directory name in a constant file. + if dir.find("svn") == -1 and dir != "images" and dir != "obj" and dir != "doc": + file_dict[root.replace(path, "")]["dirs"].append(dir) + for file in files: + if file.endswith(const.EXTENSION_FILTER) and file != "buildrev.h": + file_dict[root.replace(path, "")]["files"].append(file) + return file_dict + +def codeliteProjectGenerator(project_info): + """ + Returns the string rapresenting the codelite project. + """ + template = open(os.path.join(const.DATA_DIR, "cltemplates/bertos.project"), "r").read() + filelist = "\n".join(clFiles(findSources(project_info.info("PROJECT_PATH")), "")) + debugger_path = project_info.info("TOOLCHAIN")["path"].replace("gcc", "gdb") + init_script = project_info.info("CPU_INFOS")["GDB_INIT_SCRIPT"] + template = template.replace("$filelist", filelist) + project_name = os.path.basename(project_info.info("PROJECT_PATH")) + template = template.replace("$project", project_name) + template = template.replace("$debuggerpath", debugger_path) + template = template.replace("$initscript", init_script) + return template + +def codeliteWorkspaceGenerator(project_info): + """ + Returns the string rapresentig the codelite workspace. + """ + template = open(os.path.join(const.DATA_DIR, "cltemplates/bertos.workspace"), "r").read() + project_name = os.path.basename(project_info.info("PROJECT_PATH")) + template = template.replace("$project", project_name) + return template diff --git a/2.5/wizard/qvariant_converter.py b/2.5/wizard/qvariant_converter.py new file mode 100644 index 00000000..8ff5be3c --- /dev/null +++ b/2.5/wizard/qvariant_converter.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +from PyQt4.QtCore import PYQT_VERSION_STR + +# Choose the right version of the qvariant_converter module. It's awful, +# I know, but this is the only solution in order to mantain compatibility +# with older PyQt4 version. +if PYQT_VERSION_STR <= "4.4.3": + from qvariant_converter_old import * +elif "4.4.3" < PYQT_VERSION_STR < "4.5": + from qvariant_converter_4_4 import * +elif "4.5" <= PYQT_VERSION_STR < "4.6": + from qvariant_converter_4_5 import * +else: + from qvariant_converter_4_6 import * diff --git a/2.5/wizard/qvariant_converter_4_4.py b/2.5/wizard/qvariant_converter_4_4.py new file mode 100644 index 00000000..fc7c93cd --- /dev/null +++ b/2.5/wizard/qvariant_converter_4_4.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +from PyQt4.QtCore import * + +def getString(qvariant): + string = unicode(qvariant.toString()) + return string + +def convertString(string): + return QVariant(string) + +def getStringList(qvariant): + string_list = [unicode(string) for string in qvariant.toStringList()] + return string_list + +def convertStringList(string_list): + return QVariant(QStringList(string_list)) + +def getStringDict(qvariant): + dict_str_str = {} + for key, value in qvariant.toMap().items(): + dict_str_str[unicode(key)] = unicode(value.toString()) + return dict_str_str + +def convertStringDict(string_dict): + result_dict = {} + for key, value in string_dict.items(): + result_dict[QString(key)] = QString(value) + return QVariant(result_dict) + +def getBool(qvariant): + return qvariant.toBool() + +def convertBool(boolean): + return QVariant(boolean) + +def getBoolDict(qvariant): + dict_str_bool = {} + for key, value in qvariant.toMap().items(): + dict_str_bool[unicode(key)] = value.toBool() + return dict_str_bool + +def convertBoolDict(dict_str_bool): + result_dict = {} + for key, value in dict_str_bool.items(): + result_dict[QString(key)] = value + return QVariant(result_dict) + +def getDict(qvariant): + dict_str_variant = {} + for key, value in qvariant.toMap().items(): + dict_str_variant[unicode(key)] = value + return dict_str_variant + +def convertDict(dict_str_variant): + result_dict = {} + for key, value in dict_str_variant.items(): + result_dict[QString(key)] = value + return QVariant(result_dict) diff --git a/2.5/wizard/qvariant_converter_4_5.py b/2.5/wizard/qvariant_converter_4_5.py new file mode 100644 index 00000000..99c1474f --- /dev/null +++ b/2.5/wizard/qvariant_converter_4_5.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of bertos. +# +# Slimqc is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2009 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +from PyQt4.QtCore import * + +def getString(qvariant): + if type(qvariant) != QVariant: + return qvariant + string = unicode(qvariant.toString()) + return string + +def convertString(string): + return QVariant(string) + +def getStringList(qvariant): + if type(qvariant) != QVariant: + return qvariant + string_list = [unicode(string) for string in qvariant.toStringList()] + return string_list + +def convertStringList(string_list): + return QVariant(QStringList(string_list)) + +def getStringDict(qvariant): + dict_str_str = {} + try: + for key, value in qvariant.toPyObject().items(): + dict_str_str[unicode(key)] = unicode(value) + except: + pass + return dict_str_str + +def convertStringDict(string_dict): + result_dict = {} + for key, value in string_dict.items(): + result_dict[QString(key)] = QString(value) + return QVariant(result_dict) + +def getBool(qvariant): + return qvariant.toBool() + +def convertBool(boolean): + return QVariant(boolean) + +def getBoolDict(qvariant): + dict_str_bool = {} + try: + for key, value in qvariant.toPyObject().items(): + dict_str_bool[unicode(key)] = value.toBool() + except: + pass + return dict_str_bool + +def convertBoolDict(dict_str_bool): + result_dict = {} + for key, value in dict_str_bool.items(): + result_dict[QString(key)] = QVariant(value) + return QVariant(result_dict) + +def getDict(qvariant): + dict_str_variant = {} + try: + for key, value in qvariant.toPyObject().items(): + dict_str_variant[unicode(key)] = value + except: + pass + return dict_str_variant + +def convertDict(dict_str_variant): + result_dict = {} + for key, value in dict_str_variant.items(): + result_dict[QString(key)] = value + return QVariant(result_dict) diff --git a/2.5/wizard/qvariant_converter_4_6.py b/2.5/wizard/qvariant_converter_4_6.py new file mode 100644 index 00000000..b67d2058 --- /dev/null +++ b/2.5/wizard/qvariant_converter_4_6.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of bertos. +# +# Slimqc is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2009 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +from PyQt4.QtCore import * + +def getString(qvariant): + if type(qvariant) != QVariant: + return qvariant + string = unicode(qvariant.toString()) + return string + +def convertString(string): + return QVariant(string) + +def getStringList(qvariant): + if type(qvariant) == QVariant: + tmp = qvariant.toPyObject() + else: + tmp = qvariant + string_list = [] + if tmp: + string_list = [unicode(string) for string in tmp] + return string_list + +def convertStringList(string_list): + return QVariant(string_list) + +def getStringDict(qvariant): + dict_str_str = {} + try: + for key, value in qvariant.toPyObject().items(): + dict_str_str[unicode(key)] = unicode(value) + except: + pass + return dict_str_str + +def convertStringDict(string_dict): + return QVariant(string_dict) + +def getBool(qvariant): + return qvariant.toBool() + +def convertBool(boolean): + return QVariant(boolean) + +def getBoolDict(qvariant): + dict_str_bool = {} + try: + for key, value in qvariant.toPyObject().items(): + dict_str_bool[unicode(key)] = value + except: + pass + return dict_str_bool + +def convertBoolDict(dict_str_bool): + return QVariant(dict_str_bool) + +def getDict(qvariant): + dict_str_variant = {} + try: + for key, value in qvariant.toMap().items(): + dict_str_variant[unicode(key)] = value + except: + pass + return dict_str_variant + +def convertDict(dict_str_variant): + result_dict = {} + for key, value in dict_str_variant.items(): + result_dict[QString(key)] = QVariant(value) + return QVariant(result_dict) diff --git a/2.5/wizard/qvariant_converter_old.py b/2.5/wizard/qvariant_converter_old.py new file mode 100644 index 00000000..1b3b9d9c --- /dev/null +++ b/2.5/wizard/qvariant_converter_old.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +""" +Awful module for the conversion from python types to qvariant, for make the wizard compatible with older version of pyqt (<= 4.4.3) +""" + +from PyQt4.QtCore import * +import pickle + +def getString(qvariant): + if type(qvariant) == str or type(qvariant) == unicode: + string = qvariant + else: + string = unicode(qvariant.toString()) + return string + +def convertString(string): + return QVariant(string) + +def getStringList(qvariant): + string_list = [] + if type(qvariant) == list: + string_list = qvariant + else: + for element in qvariant.toStringList(): + string_list.append(unicode(element)) + return string_list + +def convertStringList(string_list): + result = [] + for element in string_list: + result.append(QString(element)) + return QVariant(QStringList(result)) + +def getStringDict(qvariant): + a = str(qvariant.toByteArray()) + if len(a) == 0: + dict_str_str = {} + else: + dict_str_str = pickle.loads(a) + return dict_str_str + +def convertStringDict(dict_str_str): + a = pickle.dumps(dict_str_str) + return QVariant(QByteArray(a)) + +def getBool(qvariant): + return qvariant.toBool() + +def convertBool(boolean): + return QVariant(boolean) + +def getBoolDict(qvariant): + a = str(qvariant.toByteArray()) + if len(a) == 0: + dict_str_bool = {} + else: + dict_str_bool = pickle.loads(a) + return dict_str_bool + +def convertBoolDict(dict_str_bool): + a = pickle.dumps(dict_str_bool) + return QVariant(QByteArray(a)) + +def getDict(qvariant): + a = str(qvariant.toByteArray()) + if len(a) == 0: + dict_str_bool = {} + else: + dict_str_bool = pickle.loads(a) + return dict_str_bool + +def convertDict(dict_str_variant): + a = pickle.dumps(dict_str_variant) + return QVariant(QByteArray(a)) diff --git a/2.5/wizard/relpath.py b/2.5/wizard/relpath.py new file mode 100644 index 00000000..045f6173 --- /dev/null +++ b/2.5/wizard/relpath.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import sys + +if sys.version_info < (2, 6, 0): + from os.path import * + def _posix_relpath(path, start="."): + """Return a relative version of a path""" + + if not path: + raise ValueError("no path specified") + + start_list = abspath(start).split(sep) + path_list = abspath(path).split(sep) + + # Work out how much of the filepath is shared by start and path. + i = len(commonprefix([start_list, path_list])) + + rel_list = [pardir] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return curdir + return join(*rel_list) + + def _nt_relpath(path, start="."): + """Return a relative version of a path""" + + if not path: + raise ValueError("no path specified") + start_list = abspath(start).split(sep) + path_list = abspath(path).split(sep) + if start_list[0].lower() != path_list[0].lower(): + unc_path, rest = splitunc(path) + unc_start, rest = splitunc(start) + if bool(unc_path) ^ bool(unc_start): + raise ValueError("Cannot mix UNC and non-UNC paths (%s and %s)" + % (path, start)) + else: + raise ValueError("path is on drive %s, start on drive %s" + % (path_list[0], start_list[0])) + # Work out how much of the filepath is shared by start and path. + for i in range(min(len(start_list), len(path_list))): + if start_list[i].lower() != path_list[i].lower(): + break + else: + i += 1 + + rel_list = [pardir] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return curdir + return join(*rel_list) + + import posixpath + posixpath.relpath = _posix_relpath + import ntpath + ntpath.relpath = _nt_relpath +from os.path import relpath diff --git a/2.5/wizard/srctemplates/main.c b/2.5/wizard/srctemplates/main.c new file mode 100644 index 00000000..7ecafb86 --- /dev/null +++ b/2.5/wizard/srctemplates/main.c @@ -0,0 +1,20 @@ +// Emtpy main.c file generated by the wizard +#include + +static void init(void) +{ + IRQ_ENABLE; + // insert initialization calls here +} + +int main(void) +{ + init(); + while (1) + { + // your code goes here + } + + return 0; +} + diff --git a/2.5/wizard/test/testCpuTagsImport.py b/2.5/wizard/test/testCpuTagsImport.py new file mode 100644 index 00000000..df7491a1 --- /dev/null +++ b/2.5/wizard/test/testCpuTagsImport.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import sys +import os + + +sys.path.append("../") + +import BProject +from bertos_utils import * + +def main(): + p = BProject.BProject() + p.setInfo("BERTOS_PATH", "../../") + p.loadSourceTree() + info = p.getCpuInfos() + tags = getTagSet(info) + print tags + + +if __name__ == '__main__': + main() + diff --git a/2.5/wizard/test/testLoadProjectPresets.py b/2.5/wizard/test/testLoadProjectPresets.py new file mode 100644 index 00000000..7167f39d --- /dev/null +++ b/2.5/wizard/test/testLoadProjectPresets.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import sys +import os + + +sys.path.append("../") + +import BProject +from bertos_utils import * + +def main(): + p = BProject.BProject() + p.setInfo("BERTOS_PATH", "../../") + p.loadProjectPresets() + + +if __name__ == '__main__': + main() + diff --git a/2.5/wizard/test/testModulePage.py b/2.5/wizard/test/testModulePage.py new file mode 100644 index 00000000..6b355984 --- /dev/null +++ b/2.5/wizard/test/testModulePage.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import sys +import os + +from PyQt4.QtGui import * + +# Add the wizard class path in the path for the testing module +sys.path.append("../") + +import BProject +import BModulePage +import bertos_utils + +# Add a custom UI_LOCATION constant +BModulePage.UI_LOCATION = "../ui" + +def main(): + app = QApplication([]) + app.project = BProject.BProject() + page = BModulePage.BModulePage() + page.setProjectInfo("BERTOS_PATH", "../../") + page.setProjectInfo("CPU_INFOS", {"TOOLCHAIN": "avr", "CPU_TAGS": []}) + page.project().loadSourceTree() + page.reloadData() + page.show() + app.exec_() + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/2.5/wizard/toolchain_manager.py b/2.5/wizard/toolchain_manager.py new file mode 100755 index 00000000..6b6f359e --- /dev/null +++ b/2.5/wizard/toolchain_manager.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os + +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +import qvariant_converter +from toolchain_validation import validateToolchain + + +class ToolchainManager(object): + def __init__(self): + self._app_settings = QApplication.instance().settings + + def validateToolchain(self, toolchain): + toolchains = self.storedToolchainDict() + if toolchain in toolchains: + toolchains[toolchain] = True + self.setStoredToolchainDict(toolchains) + return self._validateToolchain(toolchain) + elif toolchain in self._predefined_toolchain_set: + return self._validateToolchain(toolchain) + else: + return None + + def _validateToolchain(self, toolchain): + """ + Returns information about the toolchain located in path + "toolchain". If the toolchain is not recognized, or it doesn't + exists anymore a empty dict is returned. + + Example of toolchain information dict: + { + "target": "arm", + "version": "4.0.6", + "build": None, + "configured": None, + "thread": None, + } + """ + return validateToolchain(toolchain) + + def addToolchain(self, toolchain, validated=False): + if toolchain not in self.predefined_toolchains: + toolchains = self.storedToolchainDict() + toolchains[toolchain] = validated + self.setStoredToolchainDict(toolchains) + + def removeToolchain(self, toolchain): + toolchains = self.storedToolchainDict() + if toolchain in toolchains: + del toolchains[toolchain] + self.setStoredToolchainDict(toolchains) + + def storedToolchainDict(self): + toolchains = self._app_settings.value("toolchains", QVariant()) + toolchains = qvariant_converter.getBoolDict(toolchains) + return toolchains + + def setStoredToolchainDict(self, toolchain_dict): + toolchains = qvariant_converter.convertBoolDict(toolchain_dict) + self._app_settings.setValue("toolchains", toolchains) + + @property + def toolchains(self): + toolchains = [] + toolchain_dict = self.storedToolchainDict() + for toolchain, validated in toolchain_dict.items(): + if validated: + information = self._validateToolchain(toolchain) + else: + information = None + toolchains.append((toolchain, information)) + return toolchains + + @property + def predefined_toolchains(self): + toolchains = [] + stored_toolchains = self._predefined_toolchain_set + for toolchain in stored_toolchains: + toolchains.append((toolchain, self._validateToolchain(toolchain))) + return toolchains + + @property + def _predefined_toolchain_set(self): + stored_toolchains = set() + if os.name == "nt": + import winreg_importer + stored_toolchains |= set(winreg_importer.getBertosToolchains()) + return stored_toolchains + + def suitableToolchains(self, target): + toolchains = self.toolchains + suitable_toolchains = [] + for name, info in toolchains: + t = info.get("target", None) + if t and t.find(target) != -1: + suitable_toolchains.append(name) + return suitable_toolchains + diff --git a/2.5/wizard/toolchain_validation.py b/2.5/wizard/toolchain_validation.py new file mode 100644 index 00000000..e6386ee6 --- /dev/null +++ b/2.5/wizard/toolchain_validation.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id$ +# +# Author: Lorenzo Berni +# + +import os + +from PyQt4.QtCore import * + +import bertos_utils + +from const import TOOLCHAIN_ITEMS + +def validateToolchain(toolchain): + if not os.path.exists(toolchain): + return {} + for tool in TOOLCHAIN_ITEMS: + if not os.path.exists(toolchain.replace("gcc", tool)): + return {} + validation_process = QProcess() + validation_process.start(toolchain, ["-v"]) + validation_process.waitForStarted(1000) + if validation_process.waitForFinished(200): + description = unicode(validation_process.readAllStandardError()) + info = bertos_utils.getToolchainInfo(description) + if len(info) >= 4: + return info + else: + return {} + else: + validation_process.kill() + return {} diff --git a/2.5/wizard/ui/bertos_versions.ui b/2.5/wizard/ui/bertos_versions.ui new file mode 100644 index 00000000..59a10373 --- /dev/null +++ b/2.5/wizard/ui/bertos_versions.ui @@ -0,0 +1,137 @@ + + + Form + + + + 0 + 0 + 445 + 371 + + + + + 0 + 0 + + + + Form + + + + + + + + + 300 + 100 + + + + + + + + + + + 26 + 26 + + + + + 26 + 26 + + + + + + + + + :/images/listadd.png:/images/listadd.png + + + + 16 + 16 + + + + + + + + + 26 + 26 + + + + + 26 + 26 + + + + - + + + + :/images/listremove.png:/images/listremove.png + + + + 16 + 16 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 26 + + + + + 16777215 + 26 + + + + Update + + + + + + + + + + + + + + diff --git a/2.5/wizard/ui/board_select.ui b/2.5/wizard/ui/board_select.ui new file mode 100644 index 00000000..fd1e48f0 --- /dev/null +++ b/2.5/wizard/ui/board_select.ui @@ -0,0 +1,72 @@ + + + Form + + + + 0 + 0 + 558 + 364 + + + + Form + + + + + + + + + + + 0 + 0 + + + + + 200 + 0 + + + + + 200 + 16777215 + + + + + + + + + + + + <p><strong>Custom board project </strong>- select me when your board is not present into the list above.</p> + + + I have a custom board... + + + + + + + + + + + true + + + + + + + + diff --git a/2.5/wizard/ui/cpu_select.ui b/2.5/wizard/ui/cpu_select.ui new file mode 100644 index 00000000..a6cbce36 --- /dev/null +++ b/2.5/wizard/ui/cpu_select.ui @@ -0,0 +1,119 @@ + + + Form + + + + 0 + 0 + 579 + 452 + + + + + 0 + 0 + + + + Form + + + + + + + + + 200 + 0 + + + + + 200 + 16777215 + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Select a CPU from the list... + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + + + + + + + + + CPU frequency: + + + frequencySpinBox + + + + + + + Hz + + + 0 + + + 1.000000000000000 + + + 1000000000.000000000000000 + + + 1000.000000000000000 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + diff --git a/2.5/wizard/ui/dir_select.ui b/2.5/wizard/ui/dir_select.ui new file mode 100644 index 00000000..030ef286 --- /dev/null +++ b/2.5/wizard/ui/dir_select.ui @@ -0,0 +1,175 @@ + + + Form + + + + 0 + 0 + 558 + 314 + + + + + 0 + 0 + + + + Form + + + + + + + + Project Name + + + + + + + + 300 + 0 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Destination directory + + + + + + + + 300 + 0 + + + + + + + + + 26 + 26 + + + + + 26 + 26 + + + + + 26 + 26 + + + + + + + + :/images/folderopen.png:/images/folderopen.png + + + + 26 + 26 + + + + + + + + + + + + + 110 + 16777215 + + + + Project directory: + + + + + + + None + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 159 + + + + + + + + + + + true + + + + + + + + + + diff --git a/2.5/wizard/ui/final_page.ui b/2.5/wizard/ui/final_page.ui new file mode 100644 index 00000000..e004b08e --- /dev/null +++ b/2.5/wizard/ui/final_page.ui @@ -0,0 +1,87 @@ + + + Form + + + + 0 + 0 + 584 + 321 + + + + Form + + + + + + + + + 0 + 0 + + + + + + + :/images/ok.png + + + + + + + QFrame::Plain + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Project created successfully!</span></p> +<p align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can now start developing your application.</p></body></html> + + + Qt::RichText + + + true + + + + + + + + + + 0 + 0 + + + + true + + + + + 0 + 0 + 556 + 76 + + + + + + + + + + + + diff --git a/2.5/wizard/ui/intro_page.ui b/2.5/wizard/ui/intro_page.ui new file mode 100644 index 00000000..28e22426 --- /dev/null +++ b/2.5/wizard/ui/intro_page.ui @@ -0,0 +1,100 @@ + + + Form + + + + 0 + 0 + 455 + 345 + + + + Form + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + :/images/logo.png + + + false + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 429 + 200 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body> +<p>Quickly <span style="font-weight:600;">create and modify</span> your projects with the graphical wizard, with a step-by-step procedure:</p> +<ol><li><span style=" font-weight:600;">Select</span> which BeRTOS version you want to use in your project;</li> +<li><span style=" font-weight:600;">Choose</span> Toolchain or microcontroller you want to use;</li> +<li><span style=" font-weight:600;">Insert</span> the modules needed by your application directly from the graphical interface;</li> +<li><span style=" font-weight:600;">Generate</span> a project ready for CodeLite o GNU Make!</li></ol></body></html> + + + true + + + + + + + Qt::Vertical + + + + 20 + 10 + + + + + + + + + + + diff --git a/2.5/wizard/ui/module_select.ui b/2.5/wizard/ui/module_select.ui new file mode 100644 index 00000000..be0fb92d --- /dev/null +++ b/2.5/wizard/ui/module_select.ui @@ -0,0 +1,133 @@ + + + Form + + + + 0 + 0 + 572 + 409 + + + + + 0 + 0 + + + + Form + + + + + + + + + 200 + 0 + + + + + 200 + 16777215 + + + + + + + + + 175 + 0 + + + + + 175 + 16777215 + + + + Automatically fix +dependecies + + + true + + + + + + + + + + + Qt::Vertical + + + + + + + + + + + + + + + + + + + 200 + 0 + + + + QAbstractItemView::NoEditTriggers + + + true + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + false + + + true + + + false + + + + + + + + + + true + + + + + + + + + + diff --git a/2.5/wizard/ui/preset_page.ui b/2.5/wizard/ui/preset_page.ui new file mode 100644 index 00000000..0da7fc65 --- /dev/null +++ b/2.5/wizard/ui/preset_page.ui @@ -0,0 +1,55 @@ + + + Form + + + + 0 + 0 + 551 + 485 + + + + Form + + + + + + + + + + + + + + + + 200 + 0 + + + + + 200 + 16777215 + + + + + + + + true + + + + + + + + + + diff --git a/2.5/wizard/ui/project_creation.ui b/2.5/wizard/ui/project_creation.ui new file mode 100644 index 00000000..23f45a3d --- /dev/null +++ b/2.5/wizard/ui/project_creation.ui @@ -0,0 +1,33 @@ + + + Form + + + + 0 + 0 + 402 + 336 + + + + Form + + + + + + + + + Do not create Codelite project files + + + + + + + + + + diff --git a/2.5/wizard/ui/project_presets.ui b/2.5/wizard/ui/project_presets.ui new file mode 100644 index 00000000..2925c82c --- /dev/null +++ b/2.5/wizard/ui/project_presets.ui @@ -0,0 +1,28 @@ + + + Form + + + + 0 + 0 + 501 + 403 + + + + Form + + + + + + -1 + + + + + + + + diff --git a/2.5/wizard/ui/project_select.ui b/2.5/wizard/ui/project_select.ui new file mode 100644 index 00000000..36995c61 --- /dev/null +++ b/2.5/wizard/ui/project_select.ui @@ -0,0 +1,72 @@ + + + Form + + + + 0 + 0 + 397 + 143 + + + + Form + + + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + Project name: + + + + + + + + 0 + 0 + + + + Project folder: + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2.5/wizard/ui/start.ui b/2.5/wizard/ui/start.ui new file mode 100644 index 00000000..844c6ba6 --- /dev/null +++ b/2.5/wizard/ui/start.ui @@ -0,0 +1,131 @@ + + + Form + + + + 0 + 0 + 358 + 311 + + + + Form + + + + + + + + + + + 128 + 128 + + + + + 128 + 128 + + + + + + + + :/images/filenew.png:/images/filenew.png + + + + 128 + 128 + + + + false + + + false + + + + + + + + + Create a new BeRTOS project + + + + + + + + + + + Qt::Horizontal + + + + + + + + + + 128 + 128 + + + + + 128 + 128 + + + + + + + + :/images/fileopen.png:/images/fileopen.png + + + + 128 + 128 + + + + false + + + + + + + + + Edit an existent BeRTOS project + + + + + + + + + + + + + + + + diff --git a/2.5/wizard/ui/toolchain_search.ui b/2.5/wizard/ui/toolchain_search.ui new file mode 100644 index 00000000..b0e038c7 --- /dev/null +++ b/2.5/wizard/ui/toolchain_search.ui @@ -0,0 +1,149 @@ + + + Form + + + + 0 + 0 + 618 + 372 + + + + Form + + + + + + + 0 + 0 + + + + Search in the system PATH + + + + + + + Additional search directories: + + + + + + + 200 + 0 + + + + + + + + + + + 26 + 26 + + + + + 26 + 26 + + + + + + + + :/images/listadd.png:/images/listadd.png + + + + + + + + 26 + 26 + + + + + 26 + 26 + + + + + + + + :/images/listremove.png:/images/listremove.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Cancel + + + + + + + Search + + + + + + + + + + + + diff --git a/2.5/wizard/ui/toolchain_select.ui b/2.5/wizard/ui/toolchain_select.ui new file mode 100644 index 00000000..b9223fee --- /dev/null +++ b/2.5/wizard/ui/toolchain_select.ui @@ -0,0 +1,135 @@ + + + Form + + + + 0 + 0 + 643 + 459 + + + + Form + + + + + + + 200 + 0 + + + + + + + + + + + true + + + + + + + + + + 26 + 26 + + + + + 26 + 26 + + + + + + + + :/images/listadd.png:/images/listadd.png + + + + 16 + 16 + + + + + + + + + 26 + 26 + + + + + 26 + 26 + + + + + + + + :/images/listremove.png:/images/listremove.png + + + + 16 + 16 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Get information on toolchains + + + Validate + + + + + + + Search... + + + + + + + + + + + + diff --git a/2.5/wizard/vtemplates/VERSION b/2.5/wizard/vtemplates/VERSION new file mode 100644 index 00000000..a767b192 --- /dev/null +++ b/2.5/wizard/vtemplates/VERSION @@ -0,0 +1 @@ +$version [local copy] diff --git a/2.5/wizard/winreg_importer.py b/2.5/wizard/winreg_importer.py new file mode 100644 index 00000000..b7981cc4 --- /dev/null +++ b/2.5/wizard/winreg_importer.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# This file is part of BeRTOS. +# +# Bertos is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# As a special exception, you may use this file as part of a free software +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. +# +# Copyright 2008 Develer S.r.l. (http://www.develer.com/) +# +# $Id: qvariant_converter.py 2506 2009-04-15 08:29:07Z duplo $ +# +# Author: Lorenzo Berni +# + +from _winreg import * + +# Open the registry keys. When the keys don't exist it do nothing +try: + DIR_KEY = OpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Develer\BeRTOS SDK\BeRTOS Dirs") +except WindowsError: + DIR_KEY = None + +try: + TOOLCHAIN_KEY = OpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Develer\BeRTOS SDK\Toolchain Executables") +except WindowsError: + TOOLCHAIN_KEY = None + +try: + CLI_KEY = OpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Develer\BeRTOS SDK\Ide Command Lines") +except WindowsError: + CLI_KEY = None + +def getBertosDirs(): + """ + Returns the path of the BeRTOS versions installed by the BeRTOS SDK installer. + """ + return getFromRegistry(DIR_KEY).values() + +def getBertosToolchains(): + """ + Returns the path of the executables of the toolchains installed by the BeRTOS + SDK installer. + """ + return getFromRegistry(TOOLCHAIN_KEY).values() + +def getCommandLines(): + """ + Returns the command lines to launch in order to open the selected IDE. + """ + return getFromRegistry(CLI_KEY) + +def getFromRegistry(key): + """ + Returns the value of all the named values of the given key. + """ + index = 0 + items = {} + if key: + while True: + try: + item = EnumValue(key, index) + items[item[0]] = item[1] + index += 1 + except WindowsError: + break + return items \ No newline at end of file -- 2.25.1

  • +Arduino Duemilanove® is an AVR based board. Visit http://www.arduino.cc for more information. +